Index: tags/2.4.0RC3/about.php
===================================================================
--- tags/2.4.0RC3/about.php	(revision 14585)
+++ tags/2.4.0RC3/about.php	(revision 14585)
@@ -0,0 +1,62 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//----------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+//----------------------------------------------------- template initialization
+//
+// Start output of page
+//
+$title= l10n('About Piwigo');
+$page['body_id'] = 'theAboutPage';
+
+trigger_action('loc_begin_about');
+
+$template->set_filename('about', 'about.tpl');
+
+$template->assign('ABOUT_MESSAGE', load_language('about.html','', array('return'=>true)) );
+
+$theme_about = load_language('about.html', PHPWG_THEMES_PATH.$user['theme'].'/', array('return' => true));
+if ( $theme_about !== false )
+{
+  $template->assign('THEME_ABOUT', $theme_about);
+}
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theAboutPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('about');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/action.php
===================================================================
--- tags/2.4.0RC3/action.php	(revision 14585)
+++ tags/2.4.0RC3/action.php	(revision 14585)
@@ -0,0 +1,200 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+session_cache_limiter('public');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+
+// Check Access and exit when user status is not ok
+check_status(ACCESS_GUEST);
+
+function guess_mime_type($ext)
+{
+  switch ( strtolower($ext) )
+  {
+    case "jpe": case "jpeg":
+    case "jpg": $ctype="image/jpeg"; break;
+    case "png": $ctype="image/png"; break;
+    case "gif": $ctype="image/gif"; break;
+    case "tiff":
+    case "tif": $ctype="image/tiff"; break;
+    case "txt": $ctype="text/plain"; break;
+    case "html":
+    case "htm": $ctype="text/html"; break;
+    case "xml": $ctype="text/xml"; break;
+    case "pdf": $ctype="application/pdf"; break;
+    case "zip": $ctype="application/zip"; break;
+    case "ogg": $ctype="application/ogg"; break;
+    default: $ctype="application/octet-stream";
+  }
+  return $ctype;
+}
+
+function do_error( $code, $str )
+{
+  set_status_header( $code );
+  echo $str ;
+  exit();
+}
+
+
+if (!isset($_GET['id'])
+    or !is_numeric($_GET['id'])
+    or !isset($_GET['part'])
+    or !in_array($_GET['part'], array('e','r') ) )
+{
+  do_error(400, 'Invalid request - id/part');
+}
+
+$query = '
+SELECT * FROM '. IMAGES_TABLE.'
+  WHERE id='.$_GET['id'].'
+;';
+
+$element_info = pwg_db_fetch_assoc(pwg_query($query));
+if ( empty($element_info) )
+{
+  do_error(404, 'Requested id not found');
+}
+
+// $filter['visible_categories'] and $filter['visible_images']
+// are not used because it's not necessary (filter <> restriction)
+$query='
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON category_id = id
+  WHERE image_id = '.$_GET['id'].'
+'.get_sql_condition_FandF(
+  array(
+      'forbidden_categories' => 'category_id',
+      'forbidden_images' => 'image_id',
+    ),
+  '    AND'
+  ).'
+  LIMIT 1
+;';
+if ( pwg_db_num_rows(pwg_query($query))<1 )
+{
+  do_error(401, 'Access denied');
+}
+
+include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+$file='';
+switch ($_GET['part'])
+{
+  case 'e':
+    if ( !$user['enabled_high'] )
+    {
+      $deriv = new DerivativeImage(IMG_XXLARGE, new SrcImage($element_info));
+      if ( !$deriv->same_as_source() )
+      {
+        do_error(401, 'Access denied e');
+      }
+    }
+    $file = get_element_path($element_info);
+    break;
+  case 'r':
+    $file = original_to_representative( get_element_path($element_info), $element_info['representative_ext'] );
+    break;
+}
+
+if ( empty($file) )
+{
+  do_error(404, 'Requested file not found');
+}
+
+if ($_GET['part'] == 'e') {
+  pwg_log($_GET['id'], 'high');
+}
+else if ($_GET['part'] == 'e')
+{
+  pwg_log($_GET['id'], 'other');
+}
+
+$http_headers = array();
+
+$ctype = null;
+if (!url_is_remote($file))
+{
+  if ( !@is_readable($file) )
+  {
+    do_error(404, "Requested file not found - $file");
+  }
+  $http_headers[] = 'Content-Length: '.@filesize($file);
+  if ( function_exists('mime_content_type') )
+  {
+    $ctype = mime_content_type($file);
+  }
+
+  $gmt_mtime = gmdate('D, d M Y H:i:s', filemtime($file)).' GMT';
+  $http_headers[] = 'Last-Modified: '.$gmt_mtime;
+
+  // following lines would indicate how the client should handle the cache
+  /* $max_age=300;
+  $http_headers[] = 'Expires: '.gmdate('D, d M Y H:i:s', time()+$max_age).' GMT';
+  // HTTP/1.1 only
+  $http_headers[] = 'Cache-Control: private, must-revalidate, max-age='.$max_age;*/
+
+  if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) )
+  {
+    set_status_header(304);
+    foreach ($http_headers as $header)
+    {
+      header( $header );
+    }
+    exit();
+  }
+}
+
+if (!isset($ctype))
+{ // give it a guess
+  $ctype = guess_mime_type( get_extension($file) );
+}
+
+$http_headers[] = 'Content-Type: '.$ctype;
+
+if (isset($_GET['download']))
+{
+  $http_headers[] = 'Content-Disposition: attachment; filename="'.$element_info['file'].'";';
+  $http_headers[] = 'Content-Transfer-Encoding: binary';
+}
+else
+{
+  $http_headers[] = 'Content-Disposition: inline; filename="'
+            .basename($file).'";';
+}
+
+foreach ($http_headers as $header)
+{
+  header( $header );
+}
+
+// Looking at the safe_mode configuration for execution time
+if (ini_get('safe_mode') == 0)
+{
+  @set_time_limit(0);
+}
+
+@readfile($file);
+
+?>
Index: tags/2.4.0RC3/admin.php
===================================================================
--- tags/2.4.0RC3/admin.php	(revision 14585)
+++ tags/2.4.0RC3/admin.php	(revision 14585)
@@ -0,0 +1,310 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// | Basic constants and includes                                          |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+define('IN_ADMIN', true);
+
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_plugins.inc.php');
+
+trigger_action('loc_begin_admin');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// | Direct actions                                                        |
+// +-----------------------------------------------------------------------+
+
+// save plugins_new display order (AJAX action)
+if (isset($_GET['plugins_new_order']))
+{
+  pwg_set_session_var('plugins_new_order', $_GET['plugins_new_order']);
+  exit;
+}
+
+// theme changer
+if (isset($_GET['change_theme']))
+{
+  $admin_themes = array('roma', 'clear');
+
+  $new_admin_theme = array_pop(
+    array_diff(
+      $admin_themes,
+      array($conf['admin_theme'])
+      )
+    );
+
+  conf_update_param('admin_theme', $new_admin_theme);
+
+  $url_params = array();
+  foreach (array('page', 'tab', 'section') as $url_param)
+  {
+    if (isset($_GET[$url_param]))
+    {
+      $url_params[] = $url_param.'='.$_GET[$url_param];
+    }
+  }
+  
+  $redirect_url = 'admin.php';
+  if (count($url_params) > 0)
+  {
+    $redirect_url.= '?'.implode('&amp;', $url_params);
+  }
+
+  redirect($redirect_url);
+}
+
+// +-----------------------------------------------------------------------+
+// | Synchronize user informations                                         |
+// +-----------------------------------------------------------------------+
+
+// sync_user() is only useful when external authentication is activated
+if ($conf['external_authentification'])
+{
+  sync_users();
+}
+
+// +-----------------------------------------------------------------------+
+// | Variables init                                                        |
+// +-----------------------------------------------------------------------+
+
+$change_theme_url = PHPWG_ROOT_PATH.'admin.php?';
+$test_get = $_GET;
+unset($test_get['page']);
+unset($test_get['section']);
+unset($test_get['tag']);
+if (count($test_get) == 0)
+{
+  $change_theme_url.= str_replace('&', '&amp;', $_SERVER['QUERY_STRING']).'&amp;';
+}
+$change_theme_url.= 'change_theme=1';
+
+// ?page=plugin-community-pendings is an clean alias of
+// ?page=plugin&section=community/admin.php&tab=pendings
+if (isset($_GET['page']) and preg_match('/^plugin-([^-]*)(?:-(.*))?$/', $_GET['page'], $matches))
+{
+  $_GET['page'] = 'plugin';
+  $_GET['section'] = $matches[1].'/admin.php';
+  if (isset($matches[2]))
+  {
+    $_GET['tab'] = $matches[2];
+  }
+}
+
+// ?page=album-134-properties is an clean alias of
+// ?page=album&cat_id=134&tab=properties
+if (isset($_GET['page']) and preg_match('/^album-(\d+)(?:-(.*))?$/', $_GET['page'], $matches))
+{
+  $_GET['page'] = 'album';
+  $_GET['cat_id'] = $matches[1];
+  if (isset($matches[2]))
+  {
+    $_GET['tab'] = $matches[2];
+  }
+}
+
+// ?page=photo-1234-properties is an clean alias of
+// ?page=photo&image_id=1234&tab=properties
+if (isset($_GET['page']) and preg_match('/^photo-(\d+)(?:-(.*))?$/', $_GET['page'], $matches))
+{
+  $_GET['page'] = 'photo';
+  $_GET['image_id'] = $matches[1];
+  if (isset($matches[2]))
+  {
+    $_GET['tab'] = $matches[2];
+  }
+}
+
+if (isset($_GET['page'])
+    and preg_match('/^[a-z_]*$/', $_GET['page'])
+    and is_file(PHPWG_ROOT_PATH.'admin/'.$_GET['page'].'.php'))
+{
+  $page['page'] = $_GET['page'];
+}
+else
+{
+  $page['page'] = 'intro';
+}
+
+$page['errors'] = array();
+$page['infos']  = array();
+$page['warnings']  = array();
+
+if (isset($_SESSION['page_infos']))
+{
+  $page['infos'] = array_merge($page['infos'], $_SESSION['page_infos']);
+  unset($_SESSION['page_infos']);
+}
+
+$link_start = PHPWG_ROOT_PATH.'admin.php?page=';
+$conf_link = $link_start.'configuration&amp;section=';
+
+// +-----------------------------------------------------------------------+
+// | Template init                                                         |
+// +-----------------------------------------------------------------------+
+
+$title = l10n('Piwigo Administration'); // for include/page_header.php
+$page['page_banner'] = '<h1>'.l10n('Piwigo Administration').'</h1>';
+$page['body_id'] = 'theAdminPage';
+
+$template->set_filenames(array('admin' => 'admin.tpl'));
+
+$template->assign(
+  array(
+    'USERNAME' => $user['username'],
+    'ENABLE_SYNCHRONIZATION' => $conf['enable_synchronization'],
+    'U_SITE_MANAGER'=> $link_start.'site_manager',
+    'U_HISTORY_STAT'=> $link_start.'stats',
+    'U_FAQ'=> $link_start.'help',
+    'U_SITES'=> $link_start.'remote_site',
+    'U_MAINTENANCE'=> $link_start.'maintenance',
+    'U_NOTIFICATION_BY_MAIL'=> $link_start.'notification_by_mail',
+    'U_CONFIG_GENERAL'=> $link_start.'configuration',
+    'U_CONFIG_DERIVATIVES'=> $link_start.'derivatives',
+    'U_CONFIG_DISPLAY'=> $conf_link.'default',
+    'U_CONFIG_EXTENTS'=> $link_start.'extend_for_templates',
+    'U_CONFIG_MENUBAR'=> $link_start.'menubar',
+    'U_CONFIG_LANGUAGES' => $link_start.'languages',
+    'U_CONFIG_THEMES'=> $link_start.'themes',
+    'U_CATEGORIES'=> $link_start.'cat_list',
+    'U_CAT_OPTIONS'=> $link_start.'cat_options',
+    'U_CAT_UPDATE'=> $link_start.'site_update&amp;site=1',
+    'U_RATING'=> $link_start.'rating',
+    'U_RECENT_SET'=> $link_start.'batch_manager&amp;cat=recent',
+    'U_BATCH'=> $link_start.'batch_manager',
+    'U_TAGS'=> $link_start.'tags',
+    'U_USERS'=> $link_start.'user_list',
+    'U_GROUPS'=> $link_start.'group_list',
+    'U_RETURN'=> get_gallery_home_url(),
+    'U_ADMIN'=> PHPWG_ROOT_PATH.'admin.php',
+    'U_LOGOUT'=> PHPWG_ROOT_PATH.'index.php?act=logout',
+    'U_PLUGINS'=> $link_start.'plugins',
+    'U_ADD_PHOTOS' => $link_start.'photos_add',
+    'U_CHANGE_THEME' => $change_theme_url,
+    'U_UPDATES' => $link_start.'updates',
+    )
+  );
+  
+if ($conf['activate_comments'])
+{
+  $template->assign('U_PENDING_COMMENTS', $link_start.'comments');
+}
+
+// +-----------------------------------------------------------------------+
+// | Plugin menu                                                           |
+// +-----------------------------------------------------------------------+
+
+$plugin_menu_links = trigger_event('get_admin_plugin_menu_links', array() );
+
+function UC_name_compare($a, $b)
+{
+  return strcmp(strtolower($a['NAME']), strtolower($b['NAME']));
+}
+usort($plugin_menu_links, 'UC_name_compare');
+$template->assign('plugin_menu_items', $plugin_menu_links);
+
+// +-----------------------------------------------------------------------+
+// | Refresh permissions                                                   |
+// +-----------------------------------------------------------------------+
+
+// Only for pages witch change permissions
+if (
+    in_array($page['page'],
+      array(
+        'site_manager', // delete site
+        'site_update',  // ?only POST
+        'cat_list',     // delete cat
+        'cat_move',     // ?only POST
+        'cat_options',  // ?only POST; public/private; lock/unlock
+        'picture_modify', // ?only POST; associate/dissociate
+        'user_perm',
+        'group_perm',
+        'group_list',   // delete group
+      )
+    )
+    or ( !empty($_POST) and in_array($page['page'],
+        array(
+          'photo',
+          'album',        // public/private; lock/unlock, permissions
+          'batch_manager',  // associate/dissociate; delete; set level
+          'user_list',    // group assoc; user level
+        )
+      )
+    )
+  )
+{
+  invalidate_user_cache();
+}
+
+// +-----------------------------------------------------------------------+
+// | Include specific page                                                 |
+// +-----------------------------------------------------------------------+
+
+trigger_action('loc_begin_admin_page');
+include(PHPWG_ROOT_PATH.'admin/'.$page['page'].'.php');
+
+// +-----------------------------------------------------------------------+
+// | Errors, Infos & Warnings                                              |
+// +-----------------------------------------------------------------------+
+
+$template->assign('ACTIVE_MENU', get_active_menu($page['page']));
+
+if (count($page['errors']) != 0)
+{
+  $template->assign('errors', $page['errors']);
+}
+
+if (count($page['infos']) != 0)
+{
+  $template->assign('infos', $page['infos']);
+}
+
+if (count($page['warnings']) != 0)
+{
+  $template->assign('warnings', $page['warnings']);
+}
+
+// +-----------------------------------------------------------------------+
+// | Sending html code                                                     |
+// +-----------------------------------------------------------------------+
+
+// Add the Piwigo Official menu
+$template->assign( 'pwgmenu', pwg_URL() );
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+
+trigger_action('loc_end_admin');
+
+$template->pparse('admin');
+
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/admin/album.php
===================================================================
--- tags/2.4.0RC3/admin/album.php	(revision 14585)
+++ tags/2.4.0RC3/admin/album.php	(revision 14585)
@@ -0,0 +1,93 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+// +-----------------------------------------------------------------------+
+// | Basic checks                                                          |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+check_input_parameter('cat_id', $_GET, false, PATTERN_ID);
+
+$admin_album_base_url = get_root_url().'admin.php?page=album-'.$_GET['cat_id'];
+
+$query = '
+SELECT *
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$_GET['cat_id'].'
+;';
+$category = pwg_db_fetch_assoc(pwg_query($query));
+
+if (!isset($category['id']))
+{
+  die("unknown album");
+}
+
+// +-----------------------------------------------------------------------+
+// | Tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$page['tab'] = 'properties';
+
+if (isset($_GET['tab']))
+{
+  $page['tab'] = $_GET['tab'];
+}
+
+$tabsheet = new tabsheet();
+$tabsheet->add('properties', l10n('Properties'), $admin_album_base_url.'-properties');
+$tabsheet->add('sort_order', l10n('Manage photo ranks'), $admin_album_base_url.'-sort_order');
+$tabsheet->add('permissions', l10n('Permissions'), $admin_album_base_url.'-permissions');
+$tabsheet->add('notification', l10n('Notification'), $admin_album_base_url.'-notification');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// | Load the tab                                                          |
+// +-----------------------------------------------------------------------+
+
+if ('properties' == $page['tab'])
+{
+  include(PHPWG_ROOT_PATH.'admin/cat_modify.php');
+}
+elseif ('sort_order' == $page['tab'])
+{
+  include(PHPWG_ROOT_PATH.'admin/element_set_ranks.php');
+}
+elseif ('permissions' == $page['tab'])
+{
+  $_GET['cat'] = $_GET['cat_id'];
+  include(PHPWG_ROOT_PATH.'admin/cat_perm.php');
+}
+else
+{
+  include(PHPWG_ROOT_PATH.'admin/album_'.$page['tab'].'.php');
+}
+?>
Index: tags/2.4.0RC3/admin/album_notification.php
===================================================================
--- tags/2.4.0RC3/admin/album_notification.php	(revision 14585)
+++ tags/2.4.0RC3/admin/album_notification.php	(revision 14585)
@@ -0,0 +1,202 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                       variable initialization                         |
+// +-----------------------------------------------------------------------+
+
+$page['cat'] = $category['id'];
+
+// +-----------------------------------------------------------------------+
+// |                           form submission                             |
+// +-----------------------------------------------------------------------+
+
+// info by email to an access granted group of category informations
+if (isset($_POST['submitEmail']) and !empty($_POST['group']))
+{
+  set_make_full_url();
+
+  /* TODO: if $category['representative_picture_id']
+    is empty find child representative_picture_id */
+  if (!empty($category['representative_picture_id']))
+  {
+    $query = '
+SELECT id, file, path, tn_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$category['representative_picture_id'].'
+;';
+
+    $result = pwg_query($query);
+    if (pwg_db_num_rows($result) > 0)
+    {
+      $element = pwg_db_fetch_assoc($result);
+
+      $img_url  = '<a href="'.
+                      make_picture_url(array(
+                          'image_id' => $element['id'],
+                          'image_file' => $element['file'],
+                          'category' => $category
+                        ))
+                      .'" class="thumblnk"><img src="'.get_thumbnail_url($element).'"></a>';
+    }
+  }
+
+  if (!isset($img_url))
+  {
+    $img_url = '';
+  }
+
+  // TODO Mettre un array pour traduction subjet
+  pwg_mail_group(
+    $_POST['group'],
+    get_str_email_format(true), /* TODO add a checkbox in order to choose format*/
+    get_l10n_args('[%s] Visit album %s',
+      array($conf['gallery_title'], $category['name'])),
+    'cat_group_info',
+    array
+    (
+      'IMG_URL' => $img_url,
+      'CAT_NAME' => $category['name'],
+      'LINK' => make_index_url(
+          array(
+            'category' => array(
+              'id' => $category['id'],
+              'name' => $category['name'],
+              'permalink' => $category['permalink']
+              ))),
+      'CPL_CONTENT' => empty($_POST['mail_content'])
+                          ? '' : stripslashes($_POST['mail_content'])
+    ),
+    '' /* TODO Add listbox in order to choose Language selected */);
+
+  unset_make_full_url();
+
+  $query = '
+SELECT
+    name
+  FROM '.GROUPS_TABLE.'
+  WHERE id = '.$_POST['group'].'
+;';
+  list($group_name) = pwg_db_fetch_row(pwg_query($query));
+
+  array_push(
+    $page['infos'],
+    sprintf(
+      l10n('An information email was sent to group "%s"'),
+      $group_name
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                       template initialization                         |
+// +-----------------------------------------------------------------------+
+
+$template->set_filename('album_notification', 'album_notification.tpl');
+
+$template->assign(
+  array(
+    'CATEGORIES_NAV' =>
+      get_cat_display_name_from_id(
+        $page['cat'],
+        'admin.php?page=album-'
+        ),
+    'F_ACTION' => $admin_album_base_url.'-notification',
+    'PWG_TOKEN' => get_pwg_token(),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                          form construction                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT
+    id AS group_id
+  FROM '.GROUPS_TABLE.'
+;';
+$all_group_ids = array_from_query($query, 'group_id');
+
+if (count($all_group_ids) == 0)
+{
+  $template->assign('no_group_in_gallery', true);
+}
+else
+{
+  if ('private' == $category['status'])
+  {
+    $query = '
+SELECT
+    group_id
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE cat_id = '.$category['id'].'
+;';
+    $group_ids = array_from_query($query, 'group_id');
+
+    if (count($group_ids) == 0)
+    {
+      $template->assign('permission_url', $admin_album_base_url.'-permissions');
+    }
+  }
+  else
+  {
+    $group_ids = $all_group_ids;
+  }
+
+  if (count($group_ids) > 0)
+  {
+    $query = '
+SELECT
+    id,
+    name
+  FROM '.GROUPS_TABLE.'
+  WHERE id IN ('.implode(',', $group_ids).')
+  ORDER BY name ASC
+;';
+    $template->assign(
+      'group_mail_options',
+      simple_hash_from_query($query, 'id', 'name')
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'album_notification');
+?>
Index: tags/2.4.0RC3/admin/batch_manager.php
===================================================================
--- tags/2.4.0RC3/admin/batch_manager.php	(revision 14585)
+++ tags/2.4.0RC3/admin/batch_manager.php	(revision 14585)
@@ -0,0 +1,414 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Management of elements set. Elements can belong to a category or to the
+ * user caddie.
+ *
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+check_input_parameter('selection', $_POST, true, PATTERN_ID);
+
+// +-----------------------------------------------------------------------+
+// |                      initialize current set                           |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submitFilter']))
+{
+  // echo '<pre>'; print_r($_POST); echo '</pre>';
+
+  $_SESSION['bulk_manager_filter'] = array();
+
+  if (isset($_POST['filter_prefilter_use']))
+  {
+    $_SESSION['bulk_manager_filter']['prefilter'] = $_POST['filter_prefilter'];
+  }
+
+  if (isset($_POST['filter_category_use']))
+  {
+    $_SESSION['bulk_manager_filter']['category'] = $_POST['filter_category'];
+
+    if (isset($_POST['filter_category_recursive']))
+    {
+      $_SESSION['bulk_manager_filter']['category_recursive'] = true;
+    }
+  }
+
+  if (isset($_POST['filter_tags_use']))
+  {
+    $_SESSION['bulk_manager_filter']['tags'] = get_tag_ids($_POST['filter_tags'], false);
+
+    if (isset($_POST['tag_mode']) and in_array($_POST['tag_mode'], array('AND', 'OR')))
+    {
+      $_SESSION['bulk_manager_filter']['tag_mode'] = $_POST['tag_mode'];
+    }
+  }
+
+  if (isset($_POST['filter_level_use']))
+  {
+    if (in_array($_POST['filter_level'], $conf['available_permission_levels']))
+    {
+      $_SESSION['bulk_manager_filter']['level'] = $_POST['filter_level'];
+      
+      if (isset($_POST['filter_level_include_lower']))
+      {
+        $_SESSION['bulk_manager_filter']['level_include_lower'] = true;
+      }
+    }
+  }
+}
+
+if (isset($_GET['cat']))
+{
+  if ('caddie' == $_GET['cat'])
+  {
+    $_SESSION['bulk_manager_filter'] = array(
+      'prefilter' => 'caddie'
+      );
+  }
+
+  if ('recent' == $_GET['cat'])
+  {
+    $_SESSION['bulk_manager_filter'] = array(
+      'prefilter' => 'last import'
+      );
+  }
+
+  if (is_numeric($_GET['cat']))
+  {
+    $_SESSION['bulk_manager_filter'] = array(
+      'category' => $_GET['cat']
+      );
+  }
+}
+
+if (!isset($_SESSION['bulk_manager_filter']))
+{
+  $_SESSION['bulk_manager_filter'] = array(
+    'prefilter' => 'caddie'
+    );
+}
+
+// echo '<pre>'; print_r($_SESSION['bulk_manager_filter']); echo '</pre>';
+
+// depending on the current filter (in session), we find the appropriate
+// photos
+$filter_sets = array();
+if (isset($_SESSION['bulk_manager_filter']['prefilter']))
+{
+  if ('caddie' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $query = '
+SELECT element_id
+  FROM '.CADDIE_TABLE.'
+  WHERE user_id = '.$user['id'].'
+;';
+    array_push(
+      $filter_sets,
+      array_from_query($query, 'element_id')
+      );
+  }
+
+  if ('last import'== $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $query = '
+SELECT MAX(date_available) AS date
+  FROM '.IMAGES_TABLE.'
+;';
+    $row = pwg_db_fetch_assoc(pwg_query($query));
+    if (!empty($row['date']))
+    {
+      $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+  WHERE date_available BETWEEN '.pwg_db_get_recent_period_expression(1, $row['date']).' AND \''.$row['date'].'\'
+;';
+      array_push(
+        $filter_sets,
+        array_from_query($query, 'id')
+        );
+    }
+  }
+
+  if ('with no virtual album' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    // we are searching elements not linked to any virtual category
+    $query = '
+ SELECT id
+   FROM '.IMAGES_TABLE.'
+ ;';
+    $all_elements = array_from_query($query, 'id');
+
+    $query = '
+ SELECT id
+   FROM '.CATEGORIES_TABLE.'
+   WHERE dir IS NULL
+ ;';
+    $virtual_categories = array_from_query($query, 'id');
+    if (!empty($virtual_categories))
+    {
+      $query = '
+ SELECT DISTINCT(image_id)
+   FROM '.IMAGE_CATEGORY_TABLE.'
+   WHERE category_id IN ('.implode(',', $virtual_categories).')
+ ;';
+      $linked_to_virtual = array_from_query($query, 'image_id');
+    }
+
+    array_push(
+      $filter_sets,
+      array_diff($all_elements, $linked_to_virtual)
+      );
+  }
+
+  if ('with no album' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $query = '
+SELECT
+    id
+  FROM '.IMAGES_TABLE.'
+    LEFT JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id
+  WHERE category_id is null
+;';
+    array_push(
+      $filter_sets,
+      array_from_query($query, 'id')
+      );
+  }
+
+  if ('with no tag' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $query = '
+SELECT
+    id
+  FROM '.IMAGES_TABLE.'
+    LEFT JOIN '.IMAGE_TAG_TABLE.' ON id = image_id
+  WHERE tag_id is null
+;';
+    array_push(
+      $filter_sets,
+      array_from_query($query, 'id')
+      );
+  }
+
+
+  if ('duplicates' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    // we could use the group_concat MySQL function to retrieve the list of
+    // image_ids but it would not be compatible with PostgreSQL, so let's
+    // perform 2 queries instead. We hope there are not too many duplicates.
+
+    $query = '
+SELECT file
+  FROM '.IMAGES_TABLE.'
+  GROUP BY file
+  HAVING COUNT(*) > 1
+;';
+    $duplicate_files = array_from_query($query, 'file');
+
+    $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+  WHERE file IN (\''.implode("','", $duplicate_files).'\')
+;';
+
+    array_push(
+      $filter_sets,
+      array_from_query($query, 'id')
+      );
+  }
+
+  if ('all photos' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+;';
+
+    array_push(
+      $filter_sets,
+      array_from_query($query, 'id')
+      );
+  }
+
+  $filter_sets = trigger_event('perform_batch_manager_prefilters', $filter_sets, $_SESSION['bulk_manager_filter']['prefilter']);
+}
+
+if (isset($_SESSION['bulk_manager_filter']['category']))
+{
+  $categories = array();
+
+  if (isset($_SESSION['bulk_manager_filter']['category_recursive']))
+  {
+    $categories = get_subcat_ids(array($_SESSION['bulk_manager_filter']['category']));
+  }
+  else
+  {
+    $categories = array($_SESSION['bulk_manager_filter']['category']);
+  }
+
+  $query = '
+ SELECT DISTINCT(image_id)
+   FROM '.IMAGE_CATEGORY_TABLE.'
+   WHERE category_id IN ('.implode(',', $categories).')
+ ;';
+  array_push(
+    $filter_sets,
+    array_from_query($query, 'image_id')
+    );
+}
+
+if (isset($_SESSION['bulk_manager_filter']['level']))
+{
+  $operator = '=';
+  if (isset($_SESSION['bulk_manager_filter']['level_include_lower']))
+  {
+    $operator = '<=';
+  }
+  
+  $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+  WHERE level '.$operator.' '.$_SESSION['bulk_manager_filter']['level'].'
+;';
+  array_push(
+    $filter_sets,
+    array_from_query($query, 'id')
+    );
+}
+
+if (!empty($_SESSION['bulk_manager_filter']['tags']))
+{
+  array_push(
+    $filter_sets,
+    get_image_ids_for_tags(
+      $_SESSION['bulk_manager_filter']['tags'],
+      $_SESSION['bulk_manager_filter']['tag_mode'],
+      null,
+      null,
+      false // we don't apply permissions in administration screens
+      )
+    );
+}
+
+$current_set = array_shift($filter_sets);
+foreach ($filter_sets as $set)
+{
+  $current_set = array_intersect($current_set, $set);
+}
+$page['cat_elements_id'] = $current_set;
+
+// +-----------------------------------------------------------------------+
+// |                       first element to display                        |
+// +-----------------------------------------------------------------------+
+
+// $page['start'] contains the number of the first element in its
+// category. For exampe, $page['start'] = 12 means we must show elements #12
+// and $page['nb_images'] next elements
+
+if (!isset($_GET['start'])
+    or !is_numeric($_GET['start'])
+    or $_GET['start'] < 0
+    or (isset($_GET['display']) and 'all' == $_GET['display']))
+{
+  $page['start'] = 0;
+}
+else
+{
+  $page['start'] = $_GET['start'];
+}
+
+// +-----------------------------------------------------------------------+
+// |                                 Tabs                                  |
+// +-----------------------------------------------------------------------+
+
+$tabs = array(
+  array(
+    'code' => 'global',
+    'label' => l10n('global mode'),
+    ),
+  array(
+    'code' => 'unit',
+    'label' => l10n('unit mode'),
+    ),
+  );
+
+$tab_codes = array_map(
+  create_function('$a', 'return $a["code"];'),
+  $tabs
+  );
+
+if (isset($_GET['mode']))
+{
+  $page['tab'] = $_GET['mode'];
+}
+else
+{
+  $page['tab'] = $tabs[0]['code'];
+}
+
+if (in_array($page['tab'], $tab_codes))
+{
+  $tabsheet = new tabsheet();
+  foreach ($tabs as $tab)
+  {
+    $tabsheet->add(
+      $tab['code'],
+      $tab['label'],
+      get_root_url().'admin.php?page='.$_GET['page'].'&amp;mode='.$tab['code']
+      );
+  }
+  $tabsheet->select($page['tab']);
+  $tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// |                              tags                                     |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT id, name
+  FROM '.TAGS_TABLE.'
+;';
+$template->assign('tags', get_taglist($query, false));
+
+// +-----------------------------------------------------------------------+
+// |                         open specific mode                            |
+// +-----------------------------------------------------------------------+
+
+  include(PHPWG_ROOT_PATH.'admin/batch_manager_'.$page['tab'].'.php');
+}
+?>
Index: tags/2.4.0RC3/admin/batch_manager_global.php
===================================================================
--- tags/2.4.0RC3/admin/batch_manager_global.php	(revision 14585)
+++ tags/2.4.0RC3/admin/batch_manager_global.php	(revision 14585)
@@ -0,0 +1,807 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Management of elements set. Elements can belong to a category or to the
+ * user caddie.
+ *
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+trigger_action('loc_begin_element_set_global');
+
+check_input_parameter('del_tags', $_POST, true, PATTERN_ID);
+check_input_parameter('associate', $_POST, false, PATTERN_ID);
+check_input_parameter('move', $_POST, false, PATTERN_ID);
+check_input_parameter('dissociate', $_POST, false, PATTERN_ID);
+
+// +-----------------------------------------------------------------------+
+// |                            current selection                          |
+// +-----------------------------------------------------------------------+
+
+$collection = array();
+if (isset($_POST['setSelected']))
+{
+  $collection = $page['cat_elements_id'];
+}
+else if (isset($_POST['selection']))
+{
+  $collection = $_POST['selection'];
+}
+
+// +-----------------------------------------------------------------------+
+// |                       global mode form submission                     |
+// +-----------------------------------------------------------------------+
+
+// $page['prefilter'] is a shortcut to test if the current filter contains a
+// given prefilter. The idea is to make conditions simpler to write in the
+// code.
+$page['prefilter'] = 'none';
+if (isset($_SESSION['bulk_manager_filter']['prefilter']))
+{
+  $page['prefilter'] = $_SESSION['bulk_manager_filter']['prefilter'];
+}
+
+// $page['category'] is a shortcut to test if the current filter contains a
+// given category. The idea is the same as for prefilter
+$page['category'] = -1;
+if (isset($_SESSION['bulk_manager_filter']['category']))
+{
+  $page['category'] = $_SESSION['bulk_manager_filter']['category'];
+}
+
+$redirect_url = get_root_url().'admin.php?page='.$_GET['page'];
+
+if (isset($_POST['submit']))
+{
+  // if the user tries to apply an action, it means that there is at least 1
+  // photo in the selection
+  if (count($collection) == 0)
+  {
+    array_push($page['errors'], l10n('Select at least one photo'));
+  }
+
+  $action = $_POST['selectAction'];
+  
+  if ('remove_from_caddie' == $action)
+  {
+    $query = '
+DELETE
+  FROM '.CADDIE_TABLE.'
+  WHERE element_id IN ('.implode(',', $collection).')
+    AND user_id = '.$user['id'].'
+;';
+    pwg_query($query);
+
+    if ('caddie' == $page['prefilter'])
+    {
+      redirect($redirect_url);
+    }
+    
+    // if we are here in the code, it means that the user is currently
+    // displaying the caddie content, so we have to remove the current
+    // selection from the current set
+    $page['cat_elements_id'] = array_diff($page['cat_elements_id'], $collection);
+  }
+
+  if ('add_tags' == $action)
+  {
+    if (empty($_POST['add_tags']))
+    {
+      array_push($page['errors'], l10n('Select at least one tag'));
+    }
+    else
+    {
+      $tag_ids = get_tag_ids($_POST['add_tags']);
+      add_tags($tag_ids, $collection);
+
+      if ('with no tag' == $page['prefilter'])
+      {
+        redirect(get_root_url().'admin.php?page='.$_GET['page']);
+      }
+    }
+  }
+
+  if ('del_tags' == $action)
+  {
+    if (count($_POST['del_tags']) == 0)
+    {
+      array_push($page['errors'], l10n('Select at least one tag'));
+    }
+    
+    $query = '
+DELETE
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE image_id IN ('.implode(',', $collection).')
+    AND tag_id IN ('.implode(',', $_POST['del_tags']).')
+;';
+    pwg_query($query);
+  }
+
+  if ('associate' == $action)
+  {
+    associate_images_to_categories(
+      $collection,
+      array($_POST['associate'])
+      );
+
+    $_SESSION['page_infos'] = array(
+      l10n('Information data registered in database')
+      );
+    
+    // let's refresh the page because we the current set might be modified
+    if ('with no album' == $page['prefilter'])
+    {
+      redirect($redirect_url);
+    }
+
+    if ('with no virtual album' == $page['prefilter'])
+    {
+      $category_info = get_cat_info($_POST['associate']);
+      if (empty($category_info['dir']))
+      {
+        redirect($redirect_url);
+      }
+    }
+  }
+
+  if ('move' == $action)
+  {
+    move_images_to_categories($collection, array($_POST['move']));
+
+    $_SESSION['page_infos'] = array(
+      l10n('Information data registered in database')
+      );
+    
+    // let's refresh the page because we the current set might be modified
+    if ('with no album' == $page['prefilter'])
+    {
+      redirect($redirect_url);
+    }
+
+    if ('with no virtual album' == $page['prefilter'])
+    {
+      $category_info = get_cat_info($_POST['move']);
+      if (empty($category_info['dir']))
+      {
+        redirect($redirect_url);
+      }
+    }
+
+    if (isset($_SESSION['bulk_manager_filter']['category'])
+        and $_POST['move'] != $_SESSION['bulk_manager_filter']['category'])
+    {
+      redirect($redirect_url);
+    }
+  }
+
+  if ('dissociate' == $action)
+  {
+    // physical links must not be broken, so we must first retrieve image_id
+    // which create virtual links with the category to "dissociate from".
+    $query = '
+SELECT id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    INNER JOIN '.IMAGES_TABLE.' ON image_id = id
+  WHERE category_id = '.$_POST['dissociate'].'
+    AND id IN ('.implode(',', $collection).')
+    AND (
+      category_id != storage_category_id
+      OR storage_category_id IS NULL
+    )
+;';
+    $dissociables = array_from_query($query, 'id');
+
+    if (!empty($dissociables))
+    {
+      $query = '
+DELETE
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id = '.$_POST['dissociate'].'
+    AND image_id IN ('.implode(',', $dissociables).')
+';
+      pwg_query($query);
+
+      $_SESSION['page_infos'] = array(
+        l10n('Information data registered in database')
+        );
+      
+      // let's refresh the page because the current set might be modified
+      redirect($redirect_url);
+    }
+  }
+
+  // author
+  if ('author' == $action)
+  {
+    if (isset($_POST['remove_author']))
+    {
+      $_POST['author'] = null;
+    }
+    
+    $datas = array();
+    foreach ($collection as $image_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'id' => $image_id,
+          'author' => $_POST['author']
+          )
+        );
+    }
+
+    mass_updates(
+      IMAGES_TABLE,
+      array('primary' => array('id'), 'update' => array('author')),
+      $datas
+      );
+  }
+
+  // title
+  if ('title' == $action)
+  {
+    if (isset($_POST['remove_title']))
+    {
+      $_POST['title'] = null;
+    }
+    
+    $datas = array();
+    foreach ($collection as $image_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'id' => $image_id,
+          'name' => $_POST['title']
+          )
+        );
+    }
+
+    mass_updates(
+      IMAGES_TABLE,
+      array('primary' => array('id'), 'update' => array('name')),
+      $datas
+      );
+  }
+  
+  // date_creation
+  if ('date_creation' == $action)
+  {
+    $date_creation = sprintf(
+      '%u-%u-%u',
+      $_POST['date_creation_year'],
+      $_POST['date_creation_month'],
+      $_POST['date_creation_day']
+      );
+
+    if (isset($_POST['remove_date_creation']))
+    {
+      $date_creation = null;
+    }
+
+    $datas = array();
+    foreach ($collection as $image_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'id' => $image_id,
+          'date_creation' => $date_creation
+          )
+        );
+    }
+
+    mass_updates(
+      IMAGES_TABLE,
+      array('primary' => array('id'), 'update' => array('date_creation')),
+      $datas
+      );
+  }
+  
+  // privacy_level
+  if ('level' == $action)
+  {
+    $datas = array();
+    foreach ($collection as $image_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'id' => $image_id,
+          'level' => $_POST['level']
+          )
+        );
+    }
+
+    mass_updates(
+      IMAGES_TABLE,
+      array('primary' => array('id'), 'update' => array('level')),
+      $datas
+      );
+
+    if (isset($_SESSION['bulk_manager_filter']['level']))
+    {
+      if ($_POST['level'] < $_SESSION['bulk_manager_filter']['level'])
+      {
+        redirect($redirect_url);
+      }
+    }
+  }
+  
+  // add_to_caddie
+  if ('add_to_caddie' == $action)
+  {
+    fill_caddie($collection);
+  }
+  
+  // delete
+  if ('delete' == $action)
+  {
+    if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])
+    {
+      $deleted_count = delete_elements($collection, true);
+      if ($deleted_count > 0)
+      {
+        $_SESSION['page_infos'] = array(
+          sprintf(
+            l10n_dec(
+              '%d photo was deleted',
+              '%d photos were deleted',
+              $deleted_count
+              ),
+            $deleted_count
+            )
+          );
+
+        $redirect_url = get_root_url().'admin.php?page='.$_GET['page'];
+        redirect($redirect_url);
+      }
+      else
+      {
+        array_push($page['errors'], l10n('No photo can be deleted'));
+      }
+    }
+    else
+    {
+      array_push($page['errors'], l10n('You need to confirm deletion'));
+    }
+  }
+
+  // synchronize metadata
+  if ('metadata' == $action)
+  {
+    sync_metadata($collection);
+
+    array_push(
+      $page['infos'],
+      l10n('Metadata synchronized from file')
+      );
+  }
+
+  if ('delete_derivatives' == $action)
+  {
+    $query='SELECT path,representative_ext FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $collection).')';
+    $result = pwg_query($query);
+    while ($info = pwg_db_fetch_assoc($result))
+    {
+      foreach( $_POST['del_derivatives_type'] as $type)
+      {
+        delete_element_derivatives($info, $type);
+      }
+    }
+  }
+
+  if ('generate_derivatives' == $action)
+  {
+    if ($_POST['regenerateSuccess'] != '0')
+      array_push($page['infos'], sprintf(l10n('%s photos were generated'), $_POST['regenerateSuccess']));
+
+    if ($_POST['regenerateError'] != '0')
+      array_push($page['warnings'], sprintf(l10n('%s photos were not generated'), $_POST['regenerateError']));
+
+  }
+
+  trigger_action('element_set_global_action', $action, $collection);
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+$template->set_filenames(array('batch_manager_global' => 'batch_manager_global.tpl'));
+
+$base_url = get_root_url().'admin.php';
+
+$prefilters = array();
+
+array_push($prefilters,
+  array('ID' => 'caddie', 'NAME' => l10n('Caddie')),
+  array('ID' => 'last import', 'NAME' => l10n('Last import')),
+  array('ID' => 'with no album', 'NAME' => l10n('With no album')),
+  array('ID' => 'with no tag', 'NAME' => l10n('With no tag')),
+  array('ID' => 'duplicates', 'NAME' => l10n('Duplicates')),
+  array('ID' => 'all photos', 'NAME' => l10n('All'))
+);
+
+if ($conf['enable_synchronization'])
+{
+  array_push($prefilters,
+    array('ID' => 'with no virtual album', 'NAME' => l10n('With no virtual album'))
+  );
+}
+
+$prefilters = trigger_event('get_batch_manager_prefilters', $prefilters);
+usort($prefilters, 'UC_name_compare');
+
+$template->assign(
+  array(
+    'prefilters' => $prefilters,
+    'filter' => $_SESSION['bulk_manager_filter'],
+    'selection' => $collection,
+    'all_elements' => $page['cat_elements_id'],
+    'U_DISPLAY'=>$base_url.get_query_string_diff(array('display')),
+    'F_ACTION'=>$base_url.get_query_string_diff(array('cat')),
+   )
+ );
+
+// +-----------------------------------------------------------------------+
+// |                            caddie options                             |
+// +-----------------------------------------------------------------------+
+
+$in_caddie = false;
+if (isset($_SESSION['bulk_manager_filter']['prefilter'])
+    and 'caddie' == $_SESSION['bulk_manager_filter']['prefilter'])
+{
+  $in_caddie = true;
+}
+$template->assign('IN_CADDIE', $in_caddie);
+
+// +-----------------------------------------------------------------------+
+// |                            deletion form                              |
+// +-----------------------------------------------------------------------+
+
+// we can only remove photos that have no storage_category_id, in other
+// word, it currently (Butterfly) means that the photo was added with
+// pLoader
+if (count($page['cat_elements_id']) > 0)
+{
+  $query = '
+SELECT
+    id
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $page['cat_elements_id']).')
+    AND file NOT LIKE \'http%\'
+  LIMIT 1
+;';
+  ;
+
+  if ( pwg_db_fetch_row(pwg_query($query)) )
+  {
+    $template->assign('show_delete_form', true);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                           global mode form                            |
+// +-----------------------------------------------------------------------+
+
+// privacy level
+foreach ($conf['available_permission_levels'] as $level)
+{
+  $level_options[$level] = l10n(sprintf('Level %d', $level));
+
+  if (0 == $level)
+  {
+    $level_options[$level] = l10n('Everybody');
+  }
+}
+$template->assign(
+  array(
+    'filter_level_options'=> $level_options,
+    'filter_level_options_selected' => isset($_SESSION['bulk_manager_filter']['level'])
+    ? $_SESSION['bulk_manager_filter']['level']
+    : 0,
+    )
+  );
+
+// tags
+if (!empty($_SESSION['bulk_manager_filter']['tags']))
+{
+  $query = '
+SELECT
+    id,
+    name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $_SESSION['bulk_manager_filter']['tags']).')
+;';
+  $template->assign('filter_tags', get_taglist($query));
+}
+
+// Virtualy associate a picture to a category
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+display_select_cat_wrapper($query, array(), 'associate_options', true);
+display_select_cat_wrapper($query, array(), 'move_options', true);
+display_select_cat_wrapper($query, array(), 'category_parent_options');
+
+// in the filter box, which category to select by default
+$selected_category = array();
+
+if (isset($_SESSION['bulk_manager_filter']['category']))
+{
+  $selected_category = array($_SESSION['bulk_manager_filter']['category']);
+}
+else
+{
+  // we need to know the category in which the last photo was added
+  $selected_category = array();
+
+  $query = '
+SELECT
+    category_id,
+    id_uppercat
+  FROM '.IMAGES_TABLE.' AS i
+    JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = i.id
+    JOIN '.CATEGORIES_TABLE.' AS c ON category_id = c.id
+  ORDER BY i.id DESC
+  LIMIT 1
+;';
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) > 0)
+  {
+    $row = pwg_db_fetch_assoc($result);
+  
+    $selected_category = array($row['category_id']);
+  }
+}
+
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+display_select_cat_wrapper($query, $selected_category, 'filter_category_options', true);
+
+// Dissociate from a category : categories listed for dissociation can only
+// represent virtual links. We can't create orphans. Links to physical
+// categories can't be broken.
+if (count($page['cat_elements_id']) > 0)
+{
+  $query = '
+SELECT
+    DISTINCT(category_id) AS id,
+    c.name,
+    c.uppercats,
+    c.global_rank
+  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
+    JOIN '.CATEGORIES_TABLE.' AS c ON c.id = ic.category_id
+    JOIN '.IMAGES_TABLE.' AS i ON i.id = ic.image_id
+  WHERE ic.image_id IN ('.implode(',', $page['cat_elements_id']).')
+    AND (
+      ic.category_id != i.storage_category_id
+      OR i.storage_category_id IS NULL
+    )
+;';
+  display_select_cat_wrapper($query, array(), 'dissociate_options', true);
+}
+
+if (count($page['cat_elements_id']) > 0)
+{
+  // remove tags
+  $tags = get_common_tags($page['cat_elements_id'], -1);
+
+  $template->assign(
+    array(
+      'DEL_TAG_SELECTION' => get_html_tag_selection($tags, 'del_tags'),
+      )
+    );
+}
+
+// creation date
+$day =
+empty($_POST['date_creation_day']) ? date('j') : $_POST['date_creation_day'];
+
+$month =
+empty($_POST['date_creation_month']) ? date('n') : $_POST['date_creation_month'];
+
+$year =
+empty($_POST['date_creation_year']) ? date('Y') : $_POST['date_creation_year'];
+
+$month_list = $lang['month'];
+$month_list[0]='------------';
+ksort($month_list);
+$template->assign( array(
+      'month_list'         => $month_list,
+      'DATE_CREATION_DAY'  => (int)$day,
+      'DATE_CREATION_MONTH'=> (int)$month,
+      'DATE_CREATION_YEAR' => (int)$year,
+    )
+  );
+
+// image level options
+$template->assign(
+    array(
+      'level_options'=> get_privacy_level_options(),
+      'level_options_selected' => 0,
+    )
+  );
+
+// metadata
+include_once( PHPWG_ROOT_PATH.'admin/site_reader_local.php');
+$site_reader = new LocalSiteReader('./');
+$used_metadata = implode( ', ', $site_reader->get_metadata_attributes());
+
+$template->assign(
+    array(
+      'used_metadata' => $used_metadata,
+    )
+  );
+
+//derivatives
+$del_deriv_map = array();
+foreach(ImageStdParams::get_defined_type_map() as $params)
+{
+  $del_deriv_map[$params->type] = l10n($params->type);
+}
+$gen_deriv_map = $del_deriv_map;
+$del_deriv_map[IMG_CUSTOM] = l10n(IMG_CUSTOM);
+$template->assign(
+    array(
+      'del_derivatives_types' => $del_deriv_map,
+      'generate_derivatives_types' => $gen_deriv_map,
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                        global mode thumbnails                         |
+// +-----------------------------------------------------------------------+
+
+// how many items to display on this page
+if (!empty($_GET['display']))
+{
+  if ('all' == $_GET['display'])
+  {
+    $page['nb_images'] = count($page['cat_elements_id']);
+  }
+  else
+  {
+    $page['nb_images'] = intval($_GET['display']);
+  }
+}
+else
+{
+  $page['nb_images'] = 20;
+}
+
+$nb_thumbs_page = 0;
+
+if (count($page['cat_elements_id']) > 0)
+{
+  $nav_bar = create_navigation_bar(
+    $base_url.get_query_string_diff(array('start')),
+    count($page['cat_elements_id']),
+    $page['start'],
+    $page['nb_images']
+    );
+  $template->assign('navbar', $nav_bar);
+
+  $is_category = false;
+  if (isset($_SESSION['bulk_manager_filter']['category'])
+      and !isset($_SESSION['bulk_manager_filter']['category_recursive']))
+  {
+    $is_category = true;
+  }
+
+  if (isset($_SESSION['bulk_manager_filter']['prefilter'])
+      and 'duplicates' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $conf['order_by'] = ' ORDER BY file, id';
+  }
+
+
+  $query = '
+SELECT id,path,representative_ext,file,filesize,level,name,width,height,rotation
+  FROM '.IMAGES_TABLE;
+  
+  if ($is_category)
+  {
+    $category_info = get_cat_info($_SESSION['bulk_manager_filter']['category']);
+    
+    $conf['order_by'] = $conf['order_by_inside_category'];
+    if (!empty($category_info['image_order']))
+    {
+      $conf['order_by'] = ' ORDER BY '.$category_info['image_order'];
+    }
+
+    $query.= '
+    JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id';
+  }
+
+  $query.= '
+  WHERE id IN ('.implode(',', $page['cat_elements_id']).')';
+
+  if ($is_category)
+  {
+    $query.= '
+    AND category_id = '.$_SESSION['bulk_manager_filter']['category'];
+  }
+
+  $query.= '
+  '.$conf['order_by'].'
+  LIMIT '.$page['nb_images'].' OFFSET '.$page['start'].'
+;';
+  $result = pwg_query($query);
+
+  // template thumbnail initialization
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $nb_thumbs_page++;
+    $src_image = new SrcImage($row);
+
+    $title = render_element_name($row);
+    if ($title != get_name_from_file($row['file']))
+    {
+      $title.= ' ('.$row['file'].')';
+    }
+
+    $template->append(
+      'thumbnails',
+      array(
+        'ID' => $row['id'],
+        'TN_SRC' => DerivativeImage::url(IMG_THUMB, $src_image),
+        'FILE' => $row['file'],
+        'TITLE' => $title,
+        'LEVEL' => $row['level'],
+        'FILE_SRC' => DerivativeImage::url(IMG_LARGE, $src_image),
+        'U_EDIT' => get_root_url().'admin.php?page=photo-'.$row['id'],
+        )
+      );
+  }
+}
+
+$template->assign(
+  array(
+    'nb_thumbs_page' => $nb_thumbs_page,
+    'nb_thumbs_set' => count($page['cat_elements_id']),
+    )
+  );
+
+trigger_action('loc_end_element_set_global');
+
+//----------------------------------------------------------- sending html code
+$template->assign_var_from_handle('ADMIN_CONTENT', 'batch_manager_global');
+?>
Index: tags/2.4.0RC3/admin/batch_manager_unit.php
===================================================================
--- tags/2.4.0RC3/admin/batch_manager_unit.php	(revision 14585)
+++ tags/2.4.0RC3/admin/batch_manager_unit.php	(revision 14585)
@@ -0,0 +1,298 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Management of elements set. Elements can belong to a category or to the
+ * user caddie.
+ *
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+trigger_action('loc_begin_element_set_unit');
+
+// +-----------------------------------------------------------------------+
+// |                        unit mode form submission                      |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submit']))
+{
+  $collection = explode(',', $_POST['element_ids']);
+
+  $datas = array();
+
+  $query = '
+SELECT id, date_creation
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $collection).')
+;';
+  $result = pwg_query($query);
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $data = array();
+
+    $data['id'] = $row['id'];
+    $data['name'] = $_POST['name-'.$row['id']];
+    $data['author'] = $_POST['author-'.$row['id']];
+    $data['level'] = $_POST['level-'.$row['id']];
+
+    foreach (array('name', 'level') as $field)
+    {
+      if (!empty($_POST[$field.'-'.$row['id']]))
+      {
+        $data[$field] = strip_tags($_POST[$field.'-'.$row['id']]);
+      }
+    }
+
+    if ($conf['allow_html_descriptions'])
+    {
+      $data['comment'] = @$_POST['description-'.$row['id']];
+    }
+    else
+    {
+      $data['comment'] = strip_tags(@$_POST['description-'.$row['id']]);
+    }
+
+    if (isset($_POST['date_creation_action-'.$row['id']]))
+    {
+      if ('set' == $_POST['date_creation_action-'.$row['id']])
+      {
+        $data['date_creation'] =
+          $_POST['date_creation_year-'.$row['id']]
+            .'-'.$_POST['date_creation_month-'.$row['id']]
+            .'-'.$_POST['date_creation_day-'.$row['id']];
+      }
+      else if ('unset' == $_POST['date_creation_action-'.$row['id']])
+      {
+        $data['date_creation'] = '';
+      }
+    }
+    else
+    {
+      $data['date_creation'] = $row['date_creation'];
+    }
+
+    array_push($datas, $data);
+
+    // tags management
+    $tag_ids = array();
+    if (!empty($_POST[ 'tags-'.$row['id'] ]))
+    {
+      $tag_ids = get_tag_ids($_POST[ 'tags-'.$row['id'] ]);
+    }
+    set_tags($tag_ids, $row['id']);
+  }
+
+  mass_updates(
+    IMAGES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array('name','author','level','comment','date_creation')
+      ),
+    $datas
+    );
+
+  array_push($page['infos'], l10n('Photo informations updated'));
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array('batch_manager_unit' => 'batch_manager_unit.tpl'));
+
+$base_url = PHPWG_ROOT_PATH.'admin.php';
+
+$month_list = $lang['month'];
+$month_list[0]='------------';
+ksort($month_list);
+
+$template->assign(
+  array(
+    'U_ELEMENTS_PAGE' => $base_url.get_query_string_diff(array('display','start')),
+    'F_ACTION'=>$base_url.get_query_string_diff(array()),    
+    'month_list' => $month_list,
+    'level_options' => get_privacy_level_options(),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                        global mode thumbnails                         |
+// +-----------------------------------------------------------------------+
+
+// how many items to display on this page
+if (!empty($_GET['display']))
+{
+  if ('all' == $_GET['display'])
+  {
+    $page['nb_images'] = count($page['cat_elements_id']);
+  }
+  else
+  {
+    $page['nb_images'] = intval($_GET['display']);
+  }
+}
+else
+{
+  $page['nb_images'] = 5;
+}
+
+
+
+if (count($page['cat_elements_id']) > 0)
+{
+  $nav_bar = create_navigation_bar(
+    $base_url.get_query_string_diff(array('start')),
+    count($page['cat_elements_id']),
+    $page['start'],
+    $page['nb_images']
+    );
+  $template->assign(array('navbar' => $nav_bar));
+
+  // tags
+  $all_tags = get_all_tags();
+
+  $element_ids = array();
+
+  $is_category = false;
+  if (isset($_SESSION['bulk_manager_filter']['category'])
+      and !isset($_SESSION['bulk_manager_filter']['category_recursive']))
+  {
+    $is_category = true;
+  }
+
+  if (isset($_SESSION['bulk_manager_filter']['prefilter'])
+      and 'duplicates' == $_SESSION['bulk_manager_filter']['prefilter'])
+  {
+    $conf['order_by'] = ' ORDER BY file, id';
+  }
+
+
+  $query = '
+SELECT id,path,representative_ext,name,date_creation,comment,author,level,file
+  FROM '.IMAGES_TABLE;
+  
+  if ($is_category)
+  {
+    $category_info = get_cat_info($_SESSION['bulk_manager_filter']['category']);
+    
+    $conf['order_by'] = $conf['order_by_inside_category'];
+    if (!empty($category_info['image_order']))
+    {
+      $conf['order_by'] = ' ORDER BY '.$category_info['image_order'];
+    }
+
+    $query.= '
+    JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id';
+  }
+
+  $query.= '
+  WHERE id IN ('.implode(',', $page['cat_elements_id']).')';
+
+  if ($is_category)
+  {
+    $query.= '
+    AND category_id = '.$_SESSION['bulk_manager_filter']['category'];
+  }
+
+  $query.= '
+  '.$conf['order_by'].'
+  LIMIT '.$page['nb_images'].' OFFSET '.$page['start'].'
+;';
+  $result = pwg_query($query);
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($element_ids, $row['id']);
+
+    $src = DerivativeImage::thumb_url($row);
+
+    // creation date
+    if (!empty($row['date_creation']))
+    {
+      list($year,$month,$day) = explode('-', $row['date_creation']);
+    }
+    else
+    {
+      list($year,$month,$day) = array('',0,0);
+    }
+
+    $query = '
+SELECT
+    id,
+    name
+  FROM '.IMAGE_TAG_TABLE.' AS it
+    JOIN '.TAGS_TABLE.' AS t ON t.id = it.tag_id
+  WHERE image_id = '.$row['id'].'
+;';
+    $tag_selection = get_taglist($query);
+
+    $legend = render_element_name($row);
+    if ($legend != get_name_from_file($row['file']))
+    {
+      $legend.= ' ('.$row['file'].')';
+    }
+
+    $template->append(
+      'elements',
+      array(
+        'ID' => $row['id'],
+        'TN_SRC' => $src,
+        'FILE_SRC' => $row['path'],
+        'LEGEND' => $legend,
+        'U_EDIT' => get_root_url().'admin.php?page=photo-'.$row['id'],
+        'NAME' => !empty($row['name'])?$row['name']:'',
+        'AUTHOR' => !empty($row['author'])?htmlspecialchars($row['author']):'',
+        'LEVEL' => !empty($row['level'])?$row['level']:'0',
+        'DESCRIPTION' => !empty($row['comment'])?$row['comment']:'',
+        'DATE_CREATION_YEAR' => $year,
+        'DATE_CREATION_MONTH' => (int)$month,
+        'DATE_CREATION_DAY' => (int)$day,
+        'TAGS' => $tag_selection,
+        )
+      );
+  }
+
+  $template->assign('ELEMENT_IDS', implode(',', $element_ids));
+}
+
+trigger_action('loc_end_element_set_unit');
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'batch_manager_unit');
+?>
Index: tags/2.4.0RC3/admin/cat_list.php
===================================================================
--- tags/2.4.0RC3/admin/cat_list.php	(revision 14585)
+++ tags/2.4.0RC3/admin/cat_list.php	(revision 14585)
@@ -0,0 +1,337 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+trigger_action('loc_begin_cat_list');
+
+if (!empty($_POST) or isset($_GET['delete']))
+{
+  check_pwg_token();
+}
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+/**
+ * save the rank depending on given categories order
+ *
+ * The list of ordered categories id is supposed to be in the same parent
+ * category
+ *
+ * @param array categories
+ * @return void
+ */
+function save_categories_order($categories)
+{
+  $current_rank_for_id_uppercat = array();
+  $current_rank = 0;
+  
+  $datas = array();
+  foreach ($categories as $category)
+  {
+    if (is_array($category))
+    {
+      $id = $category['id'];
+      $id_uppercat = $category['id_uppercat'];
+
+      if (!isset($current_rank_for_id_uppercat[$id_uppercat]))
+      {
+        $current_rank_for_id_uppercat[$id_uppercat] = 0;
+      }
+      $current_rank = ++$current_rank_for_id_uppercat[$id_uppercat];
+    }
+    else
+    {
+      $id = $category;
+      $current_rank++;
+    }
+    
+    array_push($datas, array('id' => $id, 'rank' => $current_rank));
+  }
+  $fields = array('primary' => array('id'), 'update' => array('rank'));
+  mass_updates(CATEGORIES_TABLE, $fields, $datas);
+
+  update_global_rank();
+}
+
+// +-----------------------------------------------------------------------+
+// |                            initialization                             |
+// +-----------------------------------------------------------------------+
+
+check_input_parameter('parent_id', $_GET, false, PATTERN_ID);
+
+$categories = array();
+
+$base_url = get_root_url().'admin.php?page=cat_list';
+$navigation = '<a href="'.$base_url.'">';
+$navigation.= l10n('Home');
+$navigation.= '</a>';
+
+// +-----------------------------------------------------------------------+
+// | tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+$page['tab'] = 'list';
+include(PHPWG_ROOT_PATH.'admin/include/albums_tab.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                    virtual categories management                      |
+// +-----------------------------------------------------------------------+
+// request to delete a virtual category
+if (isset($_GET['delete']) and is_numeric($_GET['delete']))
+{
+  delete_categories(array($_GET['delete']));
+  $_SESSION['page_infos'] = array(l10n('Virtual album deleted'));
+  update_global_rank();
+
+  $redirect_url = get_root_url().'admin.php?page=cat_list';
+  if (isset($_GET['parent_id']))
+  {
+    $redirect_url.= '&parent_id='.$_GET['parent_id'];
+  }  
+  redirect($redirect_url);
+}
+// request to add a virtual category
+else if (isset($_POST['submitAdd']))
+{
+  $output_create = create_virtual_category(
+    $_POST['virtual_name'],
+    @$_GET['parent_id']
+    );
+
+  if (isset($output_create['error']))
+  {
+    array_push($page['errors'], $output_create['error']);
+  }
+  else
+  {
+    array_push($page['infos'], $output_create['info']);
+  }
+}
+// save manual category ordering
+else if (isset($_POST['submitManualOrder']))
+{
+  asort($_POST['catOrd'], SORT_NUMERIC);
+  save_categories_order(array_keys($_POST['catOrd']));
+
+  array_push(
+    $page['infos'],
+    l10n('Album manual order was saved')
+    );
+}
+else if (isset($_POST['submitAutoOrder']))
+{
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id_uppercat '.
+    (!isset($_GET['parent_id']) ? 'IS NULL' : '= '.$_GET['parent_id']).'
+;';
+  $category_ids = array_from_query($query, 'id');
+
+  if (isset($_POST['recursive']))
+  {
+    $category_ids = get_subcat_ids($category_ids);
+  }
+  
+  $categories = array();
+  $names = array();
+  $id_uppercats = array();
+  
+  $query = '
+SELECT id, name, id_uppercat
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $category_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push(
+      $categories,
+      array(
+        'id' => $row['id'],
+        'id_uppercat' => $row['id_uppercat'],
+        )
+      );
+    array_push(
+      $names,
+      $row['name']
+      );
+  }
+
+  array_multisort(
+    $names,
+    SORT_REGULAR,
+    'asc' == $_POST['ascdesc'] ? SORT_ASC : SORT_DESC,
+    $categories
+    );
+  save_categories_order($categories);
+
+  array_push(
+    $page['infos'],
+    l10n('Albums automatically sorted')
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                            Navigation path                            |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['parent_id']))
+{
+  $navigation.= $conf['level_separator'];
+
+  $navigation.= get_cat_display_name_from_id(
+    $_GET['parent_id'],
+    $base_url.'&amp;parent_id=',
+    false
+    );
+}
+// +-----------------------------------------------------------------------+
+// |                       template initialization                         |
+// +-----------------------------------------------------------------------+
+$template->set_filename('categories', 'cat_list.tpl');
+
+$form_action = PHPWG_ROOT_PATH.'admin.php?page=cat_list';
+if (isset($_GET['parent_id']))
+{
+  $form_action.= '&amp;parent_id='.$_GET['parent_id'];
+}
+
+$template->assign(array(
+  'CATEGORIES_NAV'=>$navigation,
+  'F_ACTION'=>$form_action,
+  'PWG_TOKEN' => get_pwg_token(),
+ ));
+
+// +-----------------------------------------------------------------------+
+// |                          Categories display                           |
+// +-----------------------------------------------------------------------+
+
+$categories = array();
+
+$query = '
+SELECT id, name, permalink, dir, rank, status
+  FROM '.CATEGORIES_TABLE;
+if (!isset($_GET['parent_id']))
+{
+  $query.= '
+  WHERE id_uppercat IS NULL';
+}
+else
+{
+  $query.= '
+  WHERE id_uppercat = '.$_GET['parent_id'];
+}
+$query.= '
+  ORDER BY rank ASC
+;';
+$categories = hash_from_query($query, 'id');
+
+// get the categories containing images directly 
+$categories_with_images = array();
+if ( count($categories) )
+{
+  $query = '
+SELECT DISTINCT category_id 
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id IN ('.implode(',', array_keys($categories)).')';
+  $categories_with_images = array_flip( array_from_query($query, 'category_id') );
+}
+
+$template->assign('categories', array());
+$base_url = get_root_url().'admin.php?page=';
+foreach ($categories as $category)
+{
+  $cat_list_url = $base_url.'cat_list';
+
+  $self_url = $cat_list_url;
+  if (isset($_GET['parent_id']))
+  {
+    $self_url.= '&amp;parent_id='.$_GET['parent_id'];
+  }
+
+  $tpl_cat =
+    array(
+      'NAME'       => 
+        trigger_event(
+          'render_category_name',
+          $category['name'],
+          'admin_cat_list'
+          ),
+      'ID'         => $category['id'],
+      'RANK'       => $category['rank']*10,
+
+      'U_JUMPTO'   => make_index_url(
+        array(
+          'category' => $category
+          )
+        ),
+
+      'U_CHILDREN' => $cat_list_url.'&amp;parent_id='.$category['id'],
+      'U_EDIT'     => $base_url.'album-'.$category['id'],
+
+      'IS_VIRTUAL' => empty($category['dir'])
+    );
+
+  if (empty($category['dir']))
+  {
+    $tpl_cat['U_DELETE'] = $self_url.'&amp;delete='.$category['id'];
+    $tpl_cat['U_DELETE'].= '&amp;pwg_token='.get_pwg_token();
+  }
+  else
+  {
+    if ($conf['enable_synchronization'])
+    {
+      $tpl_cat['U_SYNC'] = $base_url.'site_update&amp;site=1&amp;cat_id='.$category['id'];
+    }
+  }
+
+  if ( array_key_exists($category['id'], $categories_with_images) )
+  {
+    $tpl_cat['U_MANAGE_ELEMENTS']=
+      $base_url.'batch_manager&amp;cat='.$category['id'];
+  }
+
+  $template->append('categories', $tpl_cat);
+}
+
+trigger_action('loc_end_cat_list');
+
+// +-----------------------------------------------------------------------+
+// |                          sending html code                            |
+// +-----------------------------------------------------------------------+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'categories');
+?>
Index: tags/2.4.0RC3/admin/cat_modify.php
===================================================================
--- tags/2.4.0RC3/admin/cat_modify.php	(revision 14585)
+++ tags/2.4.0RC3/admin/cat_modify.php	(revision 14585)
@@ -0,0 +1,391 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+
+// get_complete_dir returns the concatenation of get_site_url and
+// get_local_dir
+// Example : "pets > rex > 1_year_old" is on the the same site as the
+// Piwigo files and this category has 22 for identifier
+// get_complete_dir(22) returns "./galleries/pets/rex/1_year_old/"
+function get_complete_dir( $category_id )
+{
+  return get_site_url($category_id).get_local_dir($category_id);
+}
+
+// get_local_dir returns an array with complete path without the site url
+// Example : "pets > rex > 1_year_old" is on the the same site as the
+// Piwigo files and this category has 22 for identifier
+// get_local_dir(22) returns "pets/rex/1_year_old/"
+function get_local_dir( $category_id )
+{
+  global $page;
+
+  $uppercats = '';
+  $local_dir = '';
+
+  if ( isset( $page['plain_structure'][$category_id]['uppercats'] ) )
+  {
+    $uppercats = $page['plain_structure'][$category_id]['uppercats'];
+  }
+  else
+  {
+    $query = 'SELECT uppercats';
+    $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id = '.$category_id;
+    $query.= ';';
+    $row = pwg_db_fetch_assoc( pwg_query( $query ) );
+    $uppercats = $row['uppercats'];
+  }
+
+  $upper_array = explode( ',', $uppercats );
+
+  $database_dirs = array();
+  $query = 'SELECT id,dir';
+  $query.= ' FROM '.CATEGORIES_TABLE.' WHERE id IN ('.$uppercats.')';
+  $query.= ';';
+  $result = pwg_query( $query );
+  while( $row = pwg_db_fetch_assoc( $result ) )
+  {
+    $database_dirs[$row['id']] = $row['dir'];
+  }
+  foreach ($upper_array as $id)
+  {
+    $local_dir.= $database_dirs[$id].'/';
+  }
+
+  return $local_dir;
+}
+
+// retrieving the site url : "http://domain.com/gallery/" or
+// simply "./galleries/"
+function get_site_url($category_id)
+{
+  global $page;
+
+  $query = '
+SELECT galleries_url
+  FROM '.SITES_TABLE.' AS s,'.CATEGORIES_TABLE.' AS c
+  WHERE s.id = c.site_id
+    AND c.id = '.$category_id.'
+;';
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+  return $row['galleries_url'];
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+trigger_action('loc_begin_cat_modify');
+
+//---------------------------------------------------------------- verification
+if ( !isset( $_GET['cat_id'] ) || !is_numeric( $_GET['cat_id'] ) )
+{
+  trigger_error( 'missing cat_id param', E_USER_ERROR);
+}
+
+//--------------------------------------------------------- form criteria check
+if (isset($_POST['submit']))
+{
+  $data =
+    array(
+      'id' => $_GET['cat_id'],
+      'name' => @$_POST['name'],
+      'comment' =>
+        $conf['allow_html_descriptions'] ?
+          @$_POST['comment'] : strip_tags(@$_POST['comment']),
+      );
+     
+  if ($conf['activate_comments'])
+  {
+    $data['commentable'] = isset($_POST['commentable'])?$_POST['commentable']:'false';
+  }
+
+  mass_updates(
+    CATEGORIES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array_diff(array_keys($data), array('id'))
+      ),
+    array($data)
+    );
+
+  // retrieve cat infos before continuing (following updates are expensive)
+  $cat_info = get_cat_info($_GET['cat_id']);
+
+  if ($cat_info['visible'] != get_boolean( $_POST['visible'] ) )
+  {
+    set_cat_visible(array($_GET['cat_id']), $_POST['visible']);
+  }
+
+  // in case the use moves his album to the gallery root, we force
+  // $_POST['parent'] from 0 to null to be compared with
+  // $cat_info['id_uppercat']
+  if (empty($_POST['parent']))
+  {
+    $_POST['parent'] = null;
+  }
+
+  // only move virtual albums
+  if (empty($cat_info['dir']) and $cat_info['id_uppercat'] != $_POST['parent'])
+  {
+    move_categories( array($_GET['cat_id']), $_POST['parent'] );
+  }
+
+  $_SESSION['page_infos'][] = l10n('Album updated successfully');
+  $redirect = true;
+}
+elseif (isset($_POST['set_random_representant']))
+{
+  set_random_representant(array($_GET['cat_id']));
+  $redirect = true;
+}
+elseif (isset($_POST['delete_representant']))
+{
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = NULL
+  WHERE id = '.$_GET['cat_id'].'
+;';
+  pwg_query($query);
+  $redirect = true;
+}
+
+if (isset($redirect))
+{
+  redirect($admin_album_base_url.'-properties');
+}
+
+// nullable fields
+foreach (array('comment','dir','site_id', 'id_uppercat') as $nullable)
+{
+  if (!isset($category[$nullable]))
+  {
+    $category[$nullable] = '';
+  }
+}
+
+$category['is_virtual'] = empty($category['dir']) ? true : false;
+
+$query = 'SELECT DISTINCT category_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id = '.$_GET['cat_id'].'
+  LIMIT 1';
+$result = pwg_query($query);
+$category['has_images'] = pwg_db_num_rows($result)>0 ? true : false;
+
+// Navigation path
+$navigation = get_cat_display_name_cache(
+  $category['uppercats'],
+  get_root_url().'admin.php?page=album-'
+  );
+
+$form_action = $admin_album_base_url.'-properties';
+
+//----------------------------------------------------- template initialization
+$template->set_filename( 'album_properties', 'cat_modify.tpl');
+
+$base_url = get_root_url().'admin.php?page=';
+$cat_list_url = $base_url.'cat_list';
+
+$self_url = $cat_list_url;
+if (!empty($category['id_uppercat']))
+{
+  $self_url.= '&amp;parent_id='.$category['id_uppercat'];
+}
+
+$template->assign(
+  array(
+    'CATEGORIES_NAV'     => $navigation,
+    'CAT_ID'             => $category['id'],
+    'CAT_NAME'           => @htmlspecialchars($category['name']),
+    'CAT_COMMENT'        => @htmlspecialchars($category['comment']),
+    'CAT_VISIBLE'       => boolean_to_string($category['visible']),
+
+    'U_JUMPTO' => make_index_url(
+      array(
+        'category' => $category
+        )
+      ),
+
+    'U_CHILDREN' => $cat_list_url.'&amp;parent_id='.$category['id'],
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=cat_modify',
+
+    'F_ACTION' => $form_action,
+    )
+  );
+ 
+if ($conf['activate_comments'])
+{
+  $template->assign('CAT_COMMENTABLE', boolean_to_string($category['commentable']));
+}
+
+// manage album elements link
+if ($category['has_images'])
+{
+  $template->assign(
+    'U_MANAGE_ELEMENTS',
+    $base_url.'batch_manager&amp;cat='.$category['id']
+    );
+
+  $query = '
+SELECT
+    COUNT(image_id),
+    MIN(DATE(date_available)),
+    MAX(DATE(date_available))
+  FROM '.IMAGES_TABLE.'
+    JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id
+  WHERE category_id = '.$category['id'].'
+;';
+  list($image_count, $min_date, $max_date) = pwg_db_fetch_row(pwg_query($query));
+
+  if ($min_date == $max_date)
+  {
+    $intro = sprintf(
+      l10n('This album contains %d photos, added on %s.'),
+      $image_count,
+      format_date($min_date)
+      );
+  }
+  else
+  {
+    $intro = sprintf(
+      l10n('This album contains %d photos, added between %s and %s.'),
+      $image_count,
+      format_date($min_date),
+      format_date($max_date)
+      );
+  }
+}
+else
+{
+  $intro = l10n('This album contains no photo.');
+}
+
+$template->assign('INTRO', $intro);
+
+$template->assign(
+  'U_MANAGE_RANKS',
+  $base_url.'element_set_ranks&amp;cat_id='.$category['id']
+  );
+
+if ($category['is_virtual'])
+{
+  $template->assign(
+    array(
+      'U_DELETE' => $self_url.'&amp;delete='.$category['id'].'&amp;pwg_token='.get_pwg_token(),
+      )
+    );
+}
+else
+{
+  $category['cat_full_dir'] = get_complete_dir($_GET['cat_id']);
+  $template->assign(
+    array(
+      'CAT_FULL_DIR' => preg_replace('/\/$/', '', $category['cat_full_dir'])
+      )
+    );
+
+  if ($conf['enable_synchronization'])
+  {
+    $template->assign(
+      'U_SYNC',
+      $base_url.'site_update&amp;site=1&amp;cat_id='.$category['id']
+      );
+  }
+
+}
+
+// representant management
+if ($category['has_images']
+    or !empty($category['representative_picture_id']))
+{
+  $tpl_representant = array();
+
+  // picture to display : the identified representant or the generic random
+  // representant ?
+  if (!empty($category['representative_picture_id']))
+  {
+    $query = '
+SELECT id,representative_ext,path
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$category['representative_picture_id'].'
+;';
+    $row = pwg_db_fetch_assoc(pwg_query($query));
+    $src = DerivativeImage::thumb_url($row);
+    $url = get_root_url().'admin.php?page=photo-'.$category['representative_picture_id'];
+
+    $tpl_representant['picture'] =
+      array(
+        'SRC' => $src,
+        'URL' => $url
+      );
+  }
+
+  // can the admin choose to set a new random representant ?
+  $tpl_representant['ALLOW_SET_RANDOM'] = ($category['has_images']) ? true : false;
+
+  // can the admin delete the current representant ?
+  if (
+    ($category['has_images']
+     and $conf['allow_random_representative'])
+    or
+    (!$category['has_images']
+     and !empty($category['representative_picture_id'])))
+  {
+    $tpl_representant['ALLOW_DELETE'] = true;
+  }
+  $template->assign('representant', $tpl_representant);
+}
+
+if ($category['is_virtual'])
+{
+  // the category can be moved in any category but in itself, in any
+  // sub-category
+  $unmovables = get_subcat_ids(array($category['id']));
+
+  $query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id NOT IN ('.implode(',', $unmovables).')
+;';
+
+  display_select_cat_wrapper(
+    $query,
+    empty($category['id_uppercat']) ? array() : array($category['id_uppercat']),
+    'move_cat_options'
+    );
+}
+
+trigger_action('loc_end_cat_modify');
+
+//----------------------------------------------------------- sending html code
+$template->assign_var_from_handle('ADMIN_CONTENT', 'album_properties');
+?>
Index: tags/2.4.0RC3/admin/cat_move.php
===================================================================
--- tags/2.4.0RC3/admin/cat_move.php	(revision 14585)
+++ tags/2.4.0RC3/admin/cat_move.php	(revision 14585)
@@ -0,0 +1,111 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+
+// +-----------------------------------------------------------------------+
+// |                          categories movement                          |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submit']))
+{
+  if (count($_POST['selection']) > 0)
+  {
+    // TODO: tests
+    move_categories($_POST['selection'], $_POST['parent']);
+  }
+  else
+  {
+    array_push(
+      $page['errors'],
+      l10n('Select at least one album')
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                       template initialization                         |
+// +-----------------------------------------------------------------------+
+$template->set_filename('cat_move', 'cat_move.tpl');
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=cat_move',
+    'F_ACTION' => get_root_url().'admin.php?page=cat_move',
+    )
+  );
+  
+// +-----------------------------------------------------------------------+
+// | tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+$page['tab'] = 'move';
+include(PHPWG_ROOT_PATH.'admin/include/albums_tab.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                          Categories display                           |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NULL
+;';
+display_select_cat_wrapper(
+  $query,
+  array(),
+  'category_to_move_options'
+  );
+
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+
+display_select_cat_wrapper(
+  $query,
+  array(),
+  'category_parent_options'
+  );
+
+// +-----------------------------------------------------------------------+
+// |                          sending html code                            |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_move');
+?>
Index: tags/2.4.0RC3/admin/cat_options.php
===================================================================
--- tags/2.4.0RC3/admin/cat_options.php	(revision 14585)
+++ tags/2.4.0RC3/admin/cat_options.php	(revision 14585)
@@ -0,0 +1,269 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                       modification registration                       |
+// +-----------------------------------------------------------------------+
+
+// print '<pre>';
+// print_r($_POST);
+// print '</pre>';
+if (isset($_POST['falsify'])
+    and isset($_POST['cat_true'])
+    and count($_POST['cat_true']) > 0)
+{
+  switch ($_GET['section'])
+  {
+    case 'comments' :
+    {
+      $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET commentable = \'false\'
+  WHERE id IN ('.implode(',', $_POST['cat_true']).')
+;';
+      pwg_query($query);
+      break;
+    }
+    case 'visible' :
+    {
+      set_cat_visible($_POST['cat_true'], 'false');
+      break;
+    }
+    case 'status' :
+    {
+      set_cat_status($_POST['cat_true'], 'private');
+      break;
+    }
+    case 'representative' :
+    {
+      $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = NULL
+  WHERE id IN ('.implode(',', $_POST['cat_true']).')
+;';
+      pwg_query($query);
+      break;
+    }
+  }
+}
+else if (isset($_POST['trueify'])
+         and isset($_POST['cat_false'])
+         and count($_POST['cat_false']) > 0)
+{
+  switch ($_GET['section'])
+  {
+    case 'comments' :
+    {
+      $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET commentable = \'true\'
+  WHERE id IN ('.implode(',', $_POST['cat_false']).')
+;';
+      pwg_query($query);
+      break;
+    }
+    case 'visible' :
+    {
+      set_cat_visible($_POST['cat_false'], 'true');
+      break;
+    }
+    case 'status' :
+    {
+      set_cat_status($_POST['cat_false'], 'public');
+      break;
+    }
+    case 'representative' :
+    {
+      // theoretically, all categories in $_POST['cat_false'] contain at
+      // least one element, so Piwigo can find a representant.
+      set_random_representant($_POST['cat_false']);
+      break;
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array(
+    'cat_options' => 'cat_options.tpl',
+    'double_select' => 'double_select.tpl'
+    )
+  );
+
+$page['section'] = isset($_GET['section']) ? $_GET['section'] : 'status';
+$base_url = PHPWG_ROOT_PATH.'admin.php?page=cat_options&amp;section=';
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=cat_options',
+    'F_ACTION'=>$base_url.$page['section']
+   )
+ );
+
+// TabSheet
+$tabsheet = new tabsheet();
+// TabSheet initialization
+$opt_link = $link_start.'cat_options&amp;section=';
+$tabsheet->add('status', l10n('Public / Private'), $opt_link.'status');
+$tabsheet->add('visible', l10n('Lock'), $opt_link.'visible');
+if ($conf['activate_comments'])
+{
+  $tabsheet->add('comments', l10n('Comments'), $opt_link.'comments');
+}
+if ($conf['allow_random_representative'])
+{
+  $tabsheet->add('representative', l10n('Representative'), $opt_link.'representative');
+}
+// TabSheet selection
+$tabsheet->select($page['section']);
+// Assign tabsheet to template
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// |                              form display                             |
+// +-----------------------------------------------------------------------+
+
+// for each section, categories in the multiselect field can be :
+//
+// - true : commentable for comment section
+// - false : un-commentable for comment section
+// - NA : (not applicable) for virtual categories
+//
+// for true and false status, we associates an array of category ids,
+// function display_select_categories will use the given CSS class for each
+// option
+$cats_true = array();
+$cats_false = array();
+switch ($page['section'])
+{
+  case 'comments' :
+  {
+    $query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE commentable = \'true\'
+;';
+    $query_false = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE commentable = \'false\'
+;';
+    $template->assign(
+      array(
+        'L_SECTION' => l10n('Authorize users to add comments on selected albums'),
+        'L_CAT_OPTIONS_TRUE' => l10n('Authorized'),
+        'L_CAT_OPTIONS_FALSE' => l10n('Forbidden'),
+        )
+      );
+    break;
+  }
+  case 'visible' :
+  {
+    $query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE visible = \'true\'
+;';
+    $query_false = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE visible = \'false\'
+;';
+    $template->assign(
+      array(
+        'L_SECTION' => l10n('Lock albums'),
+        'L_CAT_OPTIONS_TRUE' => l10n('Unlocked'),
+        'L_CAT_OPTIONS_FALSE' => l10n('Locked'),
+        )
+      );
+    break;
+  }
+  case 'status' :
+  {
+    $query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'public\'
+;';
+    $query_false = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'private\'
+;';
+    $template->assign(
+      array(
+        'L_SECTION' => l10n('Manage authorizations for selected albums'),
+        'L_CAT_OPTIONS_TRUE' => l10n('Public'),
+        'L_CAT_OPTIONS_FALSE' => l10n('Private'),
+        )
+      );
+    break;
+  }
+  case 'representative' :
+  {
+    $query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE representative_picture_id IS NOT NULL
+;';
+    $query_false = '
+SELECT DISTINCT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=category_id
+  WHERE representative_picture_id IS NULL
+;';
+    $template->assign(
+      array(
+        'L_SECTION' => l10n('Representative'),
+        'L_CAT_OPTIONS_TRUE' => l10n('singly represented'),
+        'L_CAT_OPTIONS_FALSE' => l10n('randomly represented')
+        )
+      );
+    break;
+  }
+}
+display_select_cat_wrapper($query_true,array(),'category_option_true');
+display_select_cat_wrapper($query_false,array(),'category_option_false');
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('DOUBLE_SELECT', 'double_select');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_options');
+?>
Index: tags/2.4.0RC3/admin/cat_perm.php
===================================================================
--- tags/2.4.0RC3/admin/cat_perm.php	(revision 14585)
+++ tags/2.4.0RC3/admin/cat_perm.php	(revision 14585)
@@ -0,0 +1,325 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                       variable initialization                         |
+// +-----------------------------------------------------------------------+
+
+$page['cat'] = $category['id'];
+
+// +-----------------------------------------------------------------------+
+// |                           form submission                             |
+// +-----------------------------------------------------------------------+
+
+if (!empty($_POST))
+{
+  check_pwg_token();
+
+  if ($category['status'] != $_POST['status'])
+  {
+    set_cat_status(array($page['cat']), $_POST['status']);
+    $category['status'] = $_POST['status'];
+  }
+
+  if ('private' == $_POST['status'])
+  {
+    //
+    // manage groups
+    //
+    $query = '
+SELECT group_id
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE cat_id = '.$page['cat'].'
+;';
+    $groups_granted = array_from_query($query, 'group_id');
+
+    if (!isset($_POST['groups']))
+    {
+      $_POST['groups'] = array();
+    }
+    
+    //
+    // remove permissions to groups
+    //
+    $deny_groups = array_diff($groups_granted, $_POST['groups']);
+    if (count($deny_groups) > 0)
+    {
+      // if you forbid access to an album, all sub-albums become
+      // automatically forbidden
+      $query = '
+DELETE
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE group_id IN ('.implode(',', $deny_groups).')
+    AND cat_id IN ('.implode(',', get_subcat_ids(array($page['cat']))).')
+;';
+      pwg_query($query);
+    }
+
+    //
+    // add permissions to groups
+    //
+    $grant_groups = array_diff($_POST['groups'], $groups_granted);
+    if (count($grant_groups) > 0)
+    {
+      $cat_ids = get_uppercat_ids(array($page['cat']));
+      if (isset($_POST['apply_on_sub']))
+      {
+        $cat_ids = array_merge($cat_ids, get_subcat_ids(array($page['cat'])));
+      }
+      
+      $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $cat_ids).')
+    AND status = \'private\'
+;';
+      $private_cats = array_from_query($query, 'id');
+
+      // We must not reinsert already existing lines in group_access table
+      $granteds = array();
+      foreach ($private_cats as $cat_id)
+      {
+        $granteds[$cat_id] = array();
+      }
+  
+      $query = '
+SELECT
+    group_id,
+    cat_id
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE cat_id IN ('.implode(',', $private_cats).')
+    AND group_id IN ('.implode(',', $grant_groups).')
+;';
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+        array_push($granteds[$row['cat_id']], $row['group_id']);
+      }
+
+      $inserts = array();
+      
+      foreach ($private_cats as $cat_id)
+      {
+        $group_ids = array_diff($grant_groups, $granteds[$cat_id]);
+        foreach ($group_ids as $group_id)
+        {
+          array_push(
+            $inserts,
+            array(
+              'group_id' => $group_id,
+              'cat_id' => $cat_id
+              )
+            );
+        }
+      }
+
+      mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $inserts);
+    }
+
+    //
+    // users
+    //
+    $query = '
+SELECT user_id
+  FROM '.USER_ACCESS_TABLE.'
+  WHERE cat_id = '.$page['cat'].'
+;';
+    $users_granted = array_from_query($query, 'user_id');
+
+    if (!isset($_POST['users']))
+    {
+      $_POST['users'] = array();
+    }
+    
+    //
+    // remove permissions to users
+    //
+    $deny_users = array_diff($users_granted, $_POST['users']);
+    if (count($deny_users) > 0)
+    {
+      // if you forbid access to an album, all sub-album become automatically
+      // forbidden
+      $query = '
+DELETE
+  FROM '.USER_ACCESS_TABLE.'
+  WHERE user_id IN ('.implode(',', $deny_users).')
+    AND cat_id IN ('.implode(',', get_subcat_ids(array($page['cat']))).')
+;';
+      pwg_query($query);
+    }
+
+    //
+    // add permissions to users
+    //
+    $grant_users = array_diff($_POST['users'], $users_granted);
+    if (count($grant_users) > 0)
+    {
+      add_permission_on_category($page['cat'], $grant_users);
+    }
+  }
+
+  array_push($page['infos'], l10n('Album updated successfully'));
+}
+
+// +-----------------------------------------------------------------------+
+// |                       template initialization                         |
+// +-----------------------------------------------------------------------+
+
+$template->set_filename('cat_perm', 'cat_perm.tpl');
+
+$template->assign(
+  array(
+    'CATEGORIES_NAV' =>
+      get_cat_display_name_from_id(
+        $page['cat'],
+        'admin.php?page=album-'
+        ),
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=cat_perm',
+    'F_ACTION' => $admin_album_base_url.'-permissions',
+    'private' => ('private' == $category['status']),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                          form construction                            |
+// +-----------------------------------------------------------------------+
+
+// groups denied are the groups not granted. So we need to find all groups
+// minus groups granted to find groups denied.
+
+$groups = array();
+
+$query = '
+SELECT id, name
+  FROM '.GROUPS_TABLE.'
+  ORDER BY name ASC
+;';
+$groups = simple_hash_from_query($query, 'id', 'name');
+$template->assign('groups', $groups);
+
+// groups granted to access the category
+$query = '
+SELECT group_id
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE cat_id = '.$page['cat'].'
+;';
+$group_granted_ids = array_from_query($query, 'group_id');
+$template->assign('groups_selected', $group_granted_ids);
+
+// users...
+$users = array();
+
+$query = '
+SELECT '.$conf['user_fields']['id'].' AS id,
+       '.$conf['user_fields']['username'].' AS username
+  FROM '.USERS_TABLE.'
+;';
+$users = simple_hash_from_query($query, 'id', 'username');
+$template->assign('users', $users);
+
+
+$query = '
+SELECT user_id
+  FROM '.USER_ACCESS_TABLE.'
+  WHERE cat_id = '.$page['cat'].'
+;';
+$user_granted_direct_ids = array_from_query($query, 'user_id');
+$template->assign('users_selected', $user_granted_direct_ids);
+
+
+$user_granted_indirect_ids = array();
+if (count($group_granted_ids) > 0)
+{
+  $granted_groups = array();
+
+  $query = '
+SELECT user_id, group_id
+  FROM '.USER_GROUP_TABLE.'
+  WHERE group_id IN ('.implode(',', $group_granted_ids).') 
+';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if (!isset($granted_groups[$row['group_id']]))
+    {
+      $granted_groups[$row['group_id']] = array();
+    }
+    array_push($granted_groups[$row['group_id']], $row['user_id']);
+  }
+
+  $user_granted_by_group_ids = array();
+  
+  foreach ($granted_groups as $group_users)
+  {
+    $user_granted_by_group_ids = array_merge($user_granted_by_group_ids, $group_users);
+  }
+  
+  $user_granted_by_group_ids = array_unique($user_granted_by_group_ids);
+  
+  $user_granted_indirect_ids = array_diff(
+    $user_granted_by_group_ids,
+    $user_granted_direct_ids
+    );
+
+  $template->assign('nb_users_granted_indirect', count($user_granted_indirect_ids));
+
+  foreach ($granted_groups as $group_id => $group_users)
+  {
+    $group_usernames = array();
+    foreach ($group_users as $user_id)
+    {
+      if (in_array($user_id, $user_granted_indirect_ids))
+      {
+        array_push($group_usernames, $users[$user_id]);
+      }
+    }
+
+    $template->append(
+      'user_granted_indirect_groups',
+      array(
+        'group_name' => $groups[$group_id],
+        'group_users' => implode(', ', $group_usernames),
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+$template->assign(array('PWG_TOKEN' => get_pwg_token()));
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'cat_perm');
+?>
Index: tags/2.4.0RC3/admin/comments.php
===================================================================
--- tags/2.4.0RC3/admin/comments.php	(revision 14585)
+++ tags/2.4.0RC3/admin/comments.php	(revision 14585)
@@ -0,0 +1,162 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                                actions                                |
+// +-----------------------------------------------------------------------+
+
+if (!empty($_POST))
+{
+  if (empty($_POST['comments']))
+  {
+    array_push(
+      $page['errors'],
+      l10n('Select at least one comment')
+      );
+  }
+  else
+  {
+    include_once( PHPWG_ROOT_PATH .'include/functions_comment.inc.php' );
+    check_input_parameter('comments', $_POST, true, PATTERN_ID);
+    
+    if (isset($_POST['validate']))
+    {
+      validate_user_comment($_POST['comments']);
+
+      array_push(
+        $page['infos'],
+        l10n_dec(
+          '%d user comment validated', '%d user comments validated',
+          count($_POST['comments'])
+          )
+        );
+    }
+
+    if (isset($_POST['reject']))
+    {
+      delete_user_comment($_POST['comments']);
+
+      array_push(
+        $page['infos'],
+        l10n_dec(
+          '%d user comment rejected', '%d user comments rejected',
+          count($_POST['comments'])
+          )
+        );
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('comments'=>'comments.tpl'));
+
+$template->assign(
+  array(
+    'F_ACTION' => get_root_url().'admin.php?page=comments'
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// | Tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$tabsheet = new tabsheet();
+$tabsheet->add('', l10n('User comments validation'), '');
+$tabsheet->select('');
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// |                           comments display                            |
+// +-----------------------------------------------------------------------+
+
+$list = array();
+
+$query = '
+SELECT c.id, c.image_id, c.date, c.author, '.
+$conf['user_fields']['username'].' AS username, c.content, i.path, i.representative_ext
+  FROM '.COMMENTS_TABLE.' AS c
+    INNER JOIN '.IMAGES_TABLE.' AS i
+      ON i.id = c.image_id
+    LEFT JOIN '.USERS_TABLE.' AS u
+      ON u.'.$conf['user_fields']['id'].' = c.author_id
+  WHERE validated = \'false\'
+  ORDER BY c.date DESC
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $thumb = DerivativeImage::thumb_url(
+      array(
+        'id'=>$row['image_id'],
+        'path'=>$row['path'],
+        )
+     );
+  if (empty($row['author_id'])) 
+  {
+    $author_name = $row['author'];
+  }
+  else
+  {
+    $author_name = stripslashes($row['username']);
+  }
+  $template->append(
+    'comments',
+    array(
+      'U_PICTURE' => get_root_url().'admin.php?page=photo-'.$row['image_id'],
+      'ID' => $row['id'],
+      'TN_SRC' => $thumb,
+      'AUTHOR' => trigger_event('render_comment_author', $author_name),
+      'DATE' => format_date($row['date'], true),
+      'CONTENT' => trigger_event('render_comment_content',$row['content'])
+      )
+    );
+
+  array_push($list, $row['id']);
+}
+
+$template->assign('LIST', implode(',', $list) );
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'comments');
+
+?>
Index: tags/2.4.0RC3/admin/configuration.php
===================================================================
--- tags/2.4.0RC3/admin/configuration.php	(revision 14585)
+++ tags/2.4.0RC3/admin/configuration.php	(revision 14585)
@@ -0,0 +1,575 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+//-------------------------------------------------------- sections definitions
+
+check_input_parameter('section', $_GET, false, '/^[a-z]+$/i');
+
+if (!isset($_GET['section']))
+{
+  $page['section'] = 'main';
+}
+else
+{
+  $page['section'] = $_GET['section'];
+}
+
+$main_checkboxes = array(
+    'allow_user_registration',
+    'obligatory_user_mail_address',
+    'rate',
+    'rate_anonymous',
+    'email_admin_on_new_user',
+    'allow_user_customization',
+    'log',
+    'history_admin',
+    'history_guest',
+   );
+
+$sizes_checkboxes = array(
+    'original_resize',
+  );
+
+$comments_checkboxes = array(
+    'activate_comments',
+    'comments_forall',
+    'comments_validation',
+    'email_admin_on_comment',
+    'email_admin_on_comment_validation',
+    'user_can_delete_comment',
+    'user_can_edit_comment',
+    'email_admin_on_comment_edition',
+    'email_admin_on_comment_deletion'
+  );
+
+$display_checkboxes = array(
+    'menubar_filter_icon',
+    'index_sort_order_input',
+    'index_flat_icon',
+    'index_posted_date_icon',
+    'index_created_date_icon',
+    'index_slideshow_icon',
+    'index_new_icon',
+    'picture_metadata_icon',
+    'picture_slideshow_icon',
+    'picture_favorite_icon',
+    'picture_download_icon',
+    'picture_navigation_icons',
+    'picture_navigation_thumb',
+    'picture_menu',
+  );
+
+$display_info_checkboxes = array(
+    'author',
+    'created_on',
+    'posted_on',
+    'dimensions',
+    'file',
+    'filesize',
+    'tags',
+    'categories',
+    'visits',
+    'rating_score',
+    'privacy_level',
+  );
+  
+// image order management
+$sort_fields = array(
+  ''                    => '',
+  'file ASC'            => l10n('File name, A &rarr; Z'),
+  'file DESC'           => l10n('File name, Z &rarr; A'),
+  'name ASC'            => l10n('Photo title, A &rarr; Z'),
+  'name DESC'           => l10n('Photo title, Z &rarr; A'),
+  'date_creation DESC'  => l10n('Date created, new &rarr; old'),
+  'date_creation ASC'   => l10n('Date created, old &rarr; new'),
+  'date_available DESC' => l10n('Date posted, new &rarr; old'),
+  'date_available ASC'  => l10n('Date posted, old &rarr; new'),
+  'rating_score DESC'   => l10n('Rating score, high &rarr; low'),
+  'rating_score ASC'    => l10n('Rating score, low &rarr; high'),
+  'hit DESC'            => l10n('Visits, high &rarr; low'),
+  'hit ASC'             => l10n('Visits, low &rarr; high'),
+  'id ASC'              => l10n('Numeric identifier, 1 &rarr; 9'),
+  'id DESC'             => l10n('Numeric identifier, 9 &rarr; 1'),
+  'rank ASC'            => l10n('Manual sort order'),
+  );
+  
+$comments_order = array(
+  'ASC' => l10n('Show oldest comments first'),
+  'DESC' => l10n('Show latest comments first'),
+  );
+
+
+//------------------------------ verification and registration of modifications
+if (isset($_POST['submit']))
+{
+  $int_pattern = '/^\d+$/';
+
+  switch ($page['section'])
+  {
+    case 'main' :
+    {      
+      if ( !isset($conf['order_by_custom']) and !isset($conf['order_by_inside_category_custom']) )
+      {
+        if ( !empty($_POST['order_by']) )
+        {         
+          // limit to the number of available parameters
+          $order_by = $order_by_inside_category = array_slice($_POST['order_by'], 0, ceil(count($sort_fields)/2));
+          
+          // there is no rank outside categories
+          unset($order_by[ array_search('rank ASC', $order_by) ]);
+          
+          // must define a default order_by if user want to order by rank only
+          if ( count($order_by) == 0 )
+          {
+            $order_by = array('id ASC');
+          }
+          
+          $_POST['order_by'] = 'ORDER BY '.implode(', ', $order_by);
+          $_POST['order_by_inside_category'] = 'ORDER BY '.implode(', ', $order_by_inside_category);
+        }
+        else
+        {
+          array_push($page['errors'], l10n('No field selected'));
+        }
+      }
+      
+      foreach( $main_checkboxes as $checkbox)
+      {
+        $_POST[$checkbox] = empty($_POST[$checkbox])?'false':'true';
+      }
+      break;
+    }
+    case 'watermark' :
+    {
+      include(PHPWG_ROOT_PATH.'admin/include/configuration_watermark_process.inc.php');        
+      break;
+    }
+    case 'sizes' :
+    {
+      include(PHPWG_ROOT_PATH.'admin/include/configuration_sizes_process.inc.php');        
+      break;
+    }
+    case 'comments' :
+    {
+      // the number of comments per page must be an integer between 5 and 50
+      // included
+      if (!preg_match($int_pattern, $_POST['nb_comment_page'])
+           or $_POST['nb_comment_page'] < 5
+           or $_POST['nb_comment_page'] > 50)
+      {
+        array_push($page['errors'], l10n('The number of comments a page must be between 5 and 50 included.'));
+      }
+      foreach( $comments_checkboxes as $checkbox)
+      {
+        $_POST[$checkbox] = empty($_POST[$checkbox])?'false':'true';
+      }
+      break;
+    }
+    case 'default' :
+    {
+      // Never go here
+      break;
+    }
+    case 'display' :
+    {
+      foreach( $display_checkboxes as $checkbox)
+      {
+        $_POST[$checkbox] = empty($_POST[$checkbox])?'false':'true';
+      }
+      foreach( $display_info_checkboxes as $checkbox)
+      {
+        $_POST['picture_informations'][$checkbox] =
+          empty($_POST['picture_informations'][$checkbox])? false : true;
+      }
+      $_POST['picture_informations'] = addslashes(serialize($_POST['picture_informations']));
+      break;
+    }
+  }
+
+  // updating configuration if no error found
+  if (!in_array($page['section'], array('sizes', 'watermark')) and count($page['errors']) == 0)
+  {
+    //echo '<pre>'; print_r($_POST); echo '</pre>';
+    $result = pwg_query('SELECT param FROM '.CONFIG_TABLE);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      if (isset($_POST[$row['param']]))
+      {
+        $value = $_POST[$row['param']];
+
+        if ('gallery_title' == $row['param'])
+        {
+          if (!$conf['allow_html_descriptions'])
+          {
+            $value = strip_tags($value);
+          }
+        }
+
+        $query = '
+UPDATE '.CONFIG_TABLE.'
+SET value = \''. str_replace("\'", "''", $value).'\'
+WHERE param = \''.$row['param'].'\'
+;';
+        pwg_query($query);
+      }
+    }
+    array_push($page['infos'], l10n('Information data registered in database'));
+  }
+
+  //------------------------------------------------------ $conf reinitialization
+  load_conf_from_db();
+}
+
+// restore default derivatives settings
+if ('sizes' == $page['section'] and isset($_GET['action']) and 'restore_settings' == $_GET['action'])
+{
+  ImageStdParams::set_and_save( ImageStdParams::get_default_sizes() );
+  pwg_query('DELETE FROM '.CONFIG_TABLE.' WHERE param = \'disabled_derivatives\'');
+  clear_derivative_cache();
+
+  array_push(
+    $page['infos'],
+    l10n('Your configuration settings are saved')
+    );
+}
+
+//----------------------------------------------------- template initialization
+$template->set_filename('config', 'configuration.tpl');
+
+// TabSheet
+$tabsheet = new tabsheet();
+// TabSheet initialization
+$tabsheet->add('main', l10n('Main'), $conf_link.'main');
+$tabsheet->add('sizes', l10n('Photo sizes'), $conf_link.'sizes');
+$tabsheet->add('watermark', l10n('Watermark'), $conf_link.'watermark');
+$tabsheet->add('display', l10n('Display'), $conf_link.'display');
+$tabsheet->add('comments', l10n('Comments'), $conf_link.'comments');
+$tabsheet->add('default', l10n('Guest Settings'), $conf_link.'default');
+// TabSheet selection
+$tabsheet->select($page['section']);
+// Assign tabsheet to template
+$tabsheet->assign();
+
+$action = get_root_url().'admin.php?page=configuration';
+$action.= '&amp;section='.$page['section'];
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=configuration',
+    'F_ACTION'=>$action
+    ));
+
+switch ($page['section'])
+{
+  case 'main' :
+  {   
+    
+    function order_by_is_local()
+    {
+      @include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+      if (isset($conf['local_dir_site']))
+      {
+        @include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR. 'config/config.inc.php');
+      }
+      
+      return isset($conf['order_by']) or isset($conf['order_by_inside_category']);
+    }
+    
+    if (order_by_is_local())
+    {
+      array_push($page['warnings'], l10n('You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'));
+    }
+    
+    if ( isset($conf['order_by_custom']) or isset($conf['order_by_inside_category_custom']) )
+    {
+      $order_by = array('');
+      $template->assign('ORDER_BY_IS_CUSTOM', true);
+    }
+    else
+    {
+      $out = array();
+      $order_by = trim($conf['order_by_inside_category']);
+      $order_by = str_replace('ORDER BY ', null, $order_by);
+      $order_by = explode(', ', $order_by);
+    }
+  
+    $template->assign(
+      'main',
+      array(
+        'CONF_GALLERY_TITLE' => htmlspecialchars($conf['gallery_title']),
+        'CONF_PAGE_BANNER' => htmlspecialchars($conf['page_banner']),
+        'week_starts_on_options' => array(
+          'sunday' => $lang['day'][0],
+          'monday' => $lang['day'][1],
+          ),
+        'week_starts_on_options_selected' => $conf['week_starts_on'],
+        'order_by' => $order_by,
+        'order_by_options' => $sort_fields,
+        )
+      );
+
+    foreach ($main_checkboxes as $checkbox)
+    {
+      $template->append(
+          'main',
+          array(
+            $checkbox => $conf[$checkbox]
+            ),
+          true
+        );
+    }
+    break;
+  }
+  case 'comments' :
+  {
+    $template->assign(
+      'comments',
+      array(
+        'NB_COMMENTS_PAGE'=>$conf['nb_comment_page'],
+        'comments_order'=>$conf['comments_order'],
+        'comments_order_options'=> $comments_order
+        )
+      );
+
+    foreach ($comments_checkboxes as $checkbox)
+    {
+      $template->append(
+          'comments',
+          array(
+            $checkbox => $conf[$checkbox]
+            ),
+          true
+        );
+    }
+    break;
+  }
+  case 'default' :
+  {
+    $edit_user = build_user($conf['guest_id'], false);
+    include_once(PHPWG_ROOT_PATH.'profile.php');
+
+    $errors = array();
+    if (save_profile_from_post($edit_user, $errors))
+    {
+      // Reload user
+      $edit_user = build_user($conf['guest_id'], false);
+      array_push($page['infos'], l10n('Information data registered in database'));
+    }
+    $page['errors'] = array_merge($page['errors'], $errors);
+
+    load_profile_in_template(
+      $action,
+      '',
+      $edit_user
+      );
+    $template->assign('default', array());
+    break;
+  }
+  case 'display' :
+  {
+    foreach ($display_checkboxes as $checkbox)
+    {
+      $template->append(
+          'display',
+          array(
+            $checkbox => $conf[$checkbox]
+            ),
+          true
+        );
+    }
+    $template->append(
+        'display',
+        array(
+          'picture_informations' => unserialize($conf['picture_informations'])
+          ),
+        true
+      );
+    break;
+  }
+  case 'sizes' :
+  {
+    // we only load the derivatives if it was not already loaded: it occurs
+    // when submitting the form and an error remains
+    if (!isset($page['sizes_loaded_in_tpl']))
+    {
+      $template->assign(
+        'sizes',
+        array(
+          'original_resize_maxwidth' => $conf['original_resize_maxwidth'],
+          'original_resize_maxheight' => $conf['original_resize_maxheight'],
+          'original_resize_quality' => $conf['original_resize_quality'],
+          )
+        );
+      
+      foreach ($sizes_checkboxes as $checkbox)
+      {
+        $template->append(
+          'sizes',
+          array(
+            $checkbox => $conf[$checkbox]
+            ),
+          true
+          );
+      }
+      
+      // derivatives = multiple size
+      $enabled = ImageStdParams::get_defined_type_map();
+      $disabled = @unserialize(@$conf['disabled_derivatives']);
+      if ($disabled === false)
+      {
+        $disabled = array();
+      }
+
+      $common_quality = 50;
+
+      $tpl_vars = array();
+      foreach(ImageStdParams::get_all_types() as $type)
+      {
+        $tpl_var = array();
+        
+        $tpl_var['must_square'] = ($type==IMG_SQUARE ? true : false);
+        $tpl_var['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
+        
+        if ($params = @$enabled[$type])
+        {
+          $tpl_var['enabled'] = true;
+        }
+        else
+        {
+          $tpl_var['enabled']=false;
+          $params=@$disabled[$type];
+        }
+        
+        if ($params)
+        {
+          list($tpl_var['w'],$tpl_var['h']) = $params->sizing->ideal_size;
+          if ( ($tpl_var['crop'] = round(100*$params->sizing->max_crop)) > 0)
+          {
+            list($tpl_var['minw'],$tpl_var['minh']) = $params->sizing->min_size;
+          }
+          else
+          {
+            $tpl_var['minw'] = $tpl_var['minh'] = "";
+          }
+          $tpl_var['sharpen'] = $params->sharpen;
+          $tpl_var['quality'] = $params->quality;
+          
+          if ($params->quality > $common_quality and $tpl_var['enabled'])
+          {
+            $common_quality = $params->quality;
+          }
+        }
+        $tpl_vars[$type]=$tpl_var;
+      }
+      $template->assign('derivatives', $tpl_vars);
+      $template->assign('resize_quality', $common_quality);
+    }
+
+    break;
+  }
+  case 'watermark' :
+  {
+    $watermark_files = array();
+    foreach (glob(PHPWG_ROOT_PATH.'themes/default/watermarks/*.png') as $file)
+    {
+      $watermark_files[] = substr($file, strlen(PHPWG_ROOT_PATH));
+    }
+    foreach (glob(PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'watermarks/*.png') as $file)
+    {
+      $watermark_files[] = substr($file, strlen(PHPWG_ROOT_PATH));
+    }
+    $watermark_filemap = array( '' => '---' );
+    foreach( $watermark_files as $file)
+    {
+      $display = basename($file);
+      $watermark_filemap[$file] = $display;
+    }
+    $template->assign('watermark_files', $watermark_filemap);
+
+    if ($template->get_template_vars('watermark') === null)
+    {
+      $wm = ImageStdParams::get_watermark();
+
+      $position = 'custom';
+      if ($wm->xpos == 0 and $wm->ypos == 0)
+      {
+        $position = 'topleft';
+      }
+      if ($wm->xpos == 100 and $wm->ypos == 0)
+      {
+        $position = 'topright';
+      }
+      if ($wm->xpos == 50 and $wm->ypos == 50)
+      {
+        $position = 'middle';
+      }
+      if ($wm->xpos == 0 and $wm->ypos == 100)
+      {
+        $position = 'bottomleft';
+      }
+      if ($wm->xpos == 100 and $wm->ypos == 100)
+      {
+        $position = 'bottomright';
+      }
+      
+      if ($wm->xrepeat != 0)
+      {
+        $position = 'custom';
+      }
+    
+      $template->assign(
+        'watermark',
+        array(
+          'file' => $wm->file,
+          'minw' => $wm->min_size[0],
+          'minh' => $wm->min_size[1],
+          'xpos' => $wm->xpos,
+          'ypos' => $wm->ypos,
+          'xrepeat' => $wm->xrepeat,
+          'opacity' => $wm->opacity,
+          'position' => $position,
+          )
+        );
+    }
+    
+    break;
+  }
+}
+
+//----------------------------------------------------------- sending html code
+$template->assign_var_from_handle('ADMIN_CONTENT', 'config');
+?>
Index: tags/2.4.0RC3/admin/derivatives.php
===================================================================
--- tags/2.4.0RC3/admin/derivatives.php	(revision 14585)
+++ tags/2.4.0RC3/admin/derivatives.php	(revision 14585)
@@ -0,0 +1,353 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or trigger_error('Hacking attempt!', E_USER_ERROR);
+
+$errors = array();
+
+if ( isset($_POST['d']) )
+{
+  $pderivatives = $_POST['d'];
+  $pwatermark = $_POST['w'];
+
+  // step 1 - sanitize HTML input
+  foreach($pderivatives as $type => &$pderivative)
+  {
+    if ($pderivative['must_square'] = ($type==IMG_SQUARE ? true : false))
+    {
+      $pderivative['h'] = $pderivative['w'];
+      $pderivative['minh'] = $pderivative['minw'] = $pderivative['w'];
+      $pderivative['crop'] = 100;
+    }
+    $pderivative['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
+    $pderivative['enabled'] = isset($pderivative['enabled']) || $pderivative['must_enable'] ? true : false;
+  }
+  unset($pderivative);
+
+  // step 2 - check validity
+  $prev_w = $prev_h = 0;
+  foreach(ImageStdParams::get_all_types() as $type)
+  {
+    $pderivative = $pderivatives[$type];
+    if (!$pderivative['enabled'])
+      continue;
+
+    if ($type==IMG_THUMB)
+    {
+      $w = intval($pderivative['w']);
+      if ($w<=0)
+      {
+        $errors[$type]['w'] = '>0';
+      }
+      $h = intval($pderivative['h']);
+      if ($h<=0)
+      {
+        $errors[$type]['h'] = '>0';
+      }
+      if (max($w,$h) <= $prev_w)
+      {
+        $errors[$type]['w'] = $errors[$type]['h'] = '>'.$prev_w;
+      }
+    }
+    else
+    {
+      $v = intval($pderivative['w']);
+      if ($v<=0 || $v<=$prev_w)
+      {
+        $errors[$type]['w'] = '>'.$prev_w;
+      }
+      $v = intval($pderivative['h']);
+      if ($v<=0 || $v<=$prev_h)
+      {
+        $errors[$type]['h'] = '>'.$prev_h;
+      }
+    }
+    $v = intval($pderivative['crop']);
+    if ($v<0 || $v>100)
+    {
+      $errors[$type]['crop'] = '[0..100]';
+    }
+
+    if ($v!=0)
+    {
+      $v = intval($pderivative['minw']);
+      if ($v<0 || $v>intval($pderivative['w']))
+      {
+        $errors[$type]['minw'] = '[0..'.intval($pderivative['w']).']';
+      }
+      $v = intval($pderivative['minh']);
+      if ($v<0 || $v>intval($pderivative['h']))
+      {
+        $errors[$type]['minh'] = '[0..'.intval($pderivative['h']).']';
+      }
+    }
+
+    if (count($errors)==0)
+    {
+      $prev_w = intval($pderivative['w']);
+      $prev_h = intval($pderivative['h']);
+    }
+
+    $v = intval($pderivative['sharpen']);
+    if ($v<0 || $v>100)
+    {
+      $errors[$type]['sharpen'] = '[0..100]';
+    }
+    $v = intval($pderivative['quality']);
+    if ($v<=0 || $v>100)
+    {
+      $errors[$type]['quality'] = '(0..100]';
+    }
+  }
+  $v = intval($pwatermark['xpos']);
+  if ($v<0 || $v>100)
+  {
+    $errors['watermark']['xpos'] = '[0..100]';
+  }
+  $v = intval($pwatermark['ypos']);
+  if ($v<0 || $v>100)
+  {
+    $errors['watermark']['ypos'] = '[0..100]';
+  }
+  $v = intval($pwatermark['opacity']);
+  if ($v<=0 || $v>100)
+  {
+    $errors['watermark']['opacity'] = '(0..100]';
+  }
+
+
+  // step 3 - save data
+  if (count($errors)==0)
+  {
+    $watermark = new WatermarkParams();
+    $watermark->file = $pwatermark['file'];
+    $watermark->xpos = intval($pwatermark['xpos']);
+    $watermark->ypos = intval($pwatermark['ypos']);
+    $watermark->xrepeat = intval($pwatermark['xrepeat']);
+    $watermark->opacity = intval($pwatermark['opacity']);
+    $watermark->min_size = array(intval($pwatermark['minw']),intval($pwatermark['minh']));
+
+    $old_watermark = ImageStdParams::get_watermark();
+    $watermark_changed =
+      $watermark->file != $old_watermark->file
+      || $watermark->xpos != $old_watermark->xpos
+      || $watermark->ypos != $old_watermark->ypos
+      || $watermark->xrepeat != $old_watermark->xrepeat
+      || $watermark->opacity != $old_watermark->opacity;
+    ImageStdParams::set_watermark($watermark);
+
+    $enabled = ImageStdParams::get_defined_type_map();
+    $disabled = @unserialize( @$conf['disabled_derivatives'] );
+    if ($disabled===false)
+    {
+      $disabled = array();
+    }
+    $changed_types = array();
+
+    foreach(ImageStdParams::get_all_types() as $type)
+    {
+      $pderivative = $pderivatives[$type];
+
+      if ($pderivative['enabled'])
+      {
+        $new_params = new DerivativeParams(
+            new SizingParams(
+              array(intval($pderivative['w']), intval($pderivative['h'])),
+              round($pderivative['crop'] / 100, 2),
+              array(intval($pderivative['minw']), intval($pderivative['minh']))
+              )
+          );
+        $new_params->sharpen = intval($pderivative['sharpen']);
+        $new_params->quality = intval($pderivative['quality']);
+        ImageStdParams::apply_global($new_params);
+
+        if (isset($enabled[$type]))
+        {
+          $old_params = $enabled[$type];
+          $same = true;
+          if ( !size_equals($old_params->sizing->ideal_size, $new_params->sizing->ideal_size)
+            or $old_params->sizing->max_crop != $new_params->sizing->max_crop)
+          {
+            $same = false;
+          }
+
+          if ( $same && $new_params->sizing->max_crop != 0
+              && !size_equals($old_params->sizing->min_size, $new_params->sizing->min_size) )
+          {
+            $same = false;
+          }
+
+          if ( $same &&
+              ( $new_params->sharpen != $old_params->sharpen
+              || $new_params->quality > $old_params->quality)
+             )
+          {
+            $same = false;
+          }
+
+          if ($same &&
+            ( $new_params->use_watermark != $old_params->use_watermark
+             || $new_params->use_watermark && $watermark_changed )
+            )
+          {
+            $same = false;
+          }
+
+          if (!$same)
+          {
+            $new_params->last_mod_time = time();
+            $changed_types[] = $type;
+          }
+          else
+          {
+            $new_params->last_mod_time = $old_params->last_mod_time;
+          }
+          $enabled[$type] = $new_params;
+        }
+        else
+        {// now enabled, before was disabled
+          $enabled[$type] = $new_params;
+          unset($disabled[$type]);
+        }
+      }
+      else
+      {// disabled
+        if (isset($enabled[$type]))
+        {// now disabled, before was enabled
+          $changed_types[] = $type;
+          $disabled[$type] = $enabled[$type];
+          unset($enabled[$type]);
+        }
+      }
+    }
+
+    $enabled_by = array(); // keys ordered by all types
+    foreach(ImageStdParams::get_all_types() as $type)
+    {
+      if (isset($enabled[$type]))
+      {
+        $enabled_by[$type] = $enabled[$type];
+      }
+    }
+    ImageStdParams::set_and_save($enabled_by);
+    if (count($disabled)==0)
+    {
+      $query='DELETE FROM '.CONFIG_TABLE.' WHERE param = \'disabled_derivatives\'';
+      pwg_query($query);
+    }
+    else
+    {
+      conf_update_param('disabled_derivatives', addslashes(serialize($disabled)) );
+    }
+    $conf['disabled_derivatives']=serialize($disabled);
+
+    if (count($changed_types))
+    {
+      clear_derivative_cache($changed_types);
+    }
+  }
+  else
+  {
+    $template->assign('derivatives', $pderivatives);
+    $template->assign('watermark', $pwatermark);
+    $template->assign('ferrors', $errors);
+  }
+}
+
+if (count($errors)==0)
+{
+  $enabled = ImageStdParams::get_defined_type_map();
+  $disabled = @unserialize( @$conf['disabled_derivatives'] );
+  if ($disabled===false)
+  {
+    $disabled = array();
+  }
+
+  $tpl_vars = array();
+  foreach(ImageStdParams::get_all_types() as $type)
+  {
+    $tpl_var = array();
+
+    $tpl_var['must_square'] = ($type==IMG_SQUARE ? true : false);
+    $tpl_var['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
+
+    if ($params=@$enabled[$type])
+    {
+      $tpl_var['enabled']=true;
+    }
+    else
+    {
+      $tpl_var['enabled']=false;
+      $params=@$disabled[$type];
+    }
+
+    if ($params)
+    {
+      list($tpl_var['w'],$tpl_var['h']) = $params->sizing->ideal_size;
+      if ( ($tpl_var['crop'] = round(100*$params->sizing->max_crop)) > 0)
+      {
+        list($tpl_var['minw'],$tpl_var['minh']) = $params->sizing->min_size;
+      }
+      else
+      {
+        $tpl_var['minw'] = $tpl_var['minh'] = "";
+      }
+      $tpl_var['sharpen'] = $params->sharpen;
+      $tpl_var['quality'] = $params->quality;
+    }
+    $tpl_vars[$type]=$tpl_var;
+  }
+  $template->assign('derivatives', $tpl_vars);
+
+  $wm = ImageStdParams::get_watermark();
+  $template->assign('watermark', array(
+      'file' => $wm->file,
+      'minw' => $wm->min_size[0],
+      'minh' => $wm->min_size[1],
+      'xpos' => $wm->xpos,
+      'ypos' => $wm->ypos,
+      'xrepeat' => $wm->xrepeat,
+      'opacity' => $wm->opacity,
+    ));
+}
+
+$watermark_files = array();
+foreach (glob(PHPWG_ROOT_PATH.'themes/default/watermarks/*.png') as $file)
+{
+  $watermark_files[] = substr($file, strlen(PHPWG_ROOT_PATH));
+}
+foreach (glob(PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'watermarks/*.png') as $file)
+{
+  $watermark_files[] = substr($file, strlen(PHPWG_ROOT_PATH));
+}
+$watermark_filemap = array( '' => '---' );
+foreach( $watermark_files as $file)
+{
+  $display = basename($file);
+  $watermark_filemap[$file] = $display;
+}
+$template->assign('watermark_files', $watermark_filemap);
+
+$template->set_filename('derivatives', 'derivatives.tpl');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'derivatives');
+?>
Index: tags/2.4.0RC3/admin/element_set_ranks.php
===================================================================
--- tags/2.4.0RC3/admin/element_set_ranks.php	(revision 14585)
+++ tags/2.4.0RC3/admin/element_set_ranks.php	(revision 14585)
@@ -0,0 +1,283 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Change rank of images inside a category
+ *
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!isset($_GET['cat_id']) or !is_numeric($_GET['cat_id']))
+{
+  trigger_error('missing cat_id param', E_USER_ERROR);
+}
+
+$page['category_id'] = $_GET['cat_id'];
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+/**
+ * save the rank depending on given images order
+ *
+ * The list of ordered images id is supposed to be in the same parent
+ * category
+ *
+ * @param array categories
+ * @return void
+ */
+function save_images_order($category_id, $images)
+{
+  $current_rank = 0;
+  $datas = array();
+  foreach ($images as $id)
+  {
+    array_push(
+      $datas,
+      array(
+        'category_id' => $category_id,
+        'image_id' => $id,
+        'rank' => ++$current_rank,
+        )
+      );
+  }
+  $fields = array(
+    'primary' => array('image_id', 'category_id'),
+    'update' => array('rank')
+    );
+  mass_updates(IMAGE_CATEGORY_TABLE, $fields, $datas);
+}
+
+// +-----------------------------------------------------------------------+
+// |                       global mode form submission                     |
+// +-----------------------------------------------------------------------+
+
+$image_order_choices = array('default', 'rank', 'user_define');
+$image_order_choice = 'default';
+
+if (isset($_POST['submit']))
+{
+  if (isset($_POST['rank_of_image']))
+  {
+    asort($_POST['rank_of_image'], SORT_NUMERIC);
+
+    save_images_order(
+      $page['category_id'],
+      array_keys($_POST['rank_of_image'])
+      );
+
+    array_push(
+      $page['infos'],
+      l10n('Images manual order was saved')
+      );
+  }
+
+  if (!empty($_POST['image_order_choice'])
+      && in_array($_POST['image_order_choice'], $image_order_choices))
+  {
+    $image_order_choice = $_POST['image_order_choice'];
+  }
+
+  $image_order = null;
+  if ($image_order_choice=='user_define')
+  {
+    for ($i=0; $i<3; $i++)
+    {
+      if (!empty($_POST['image_order'][$i]))
+      {
+        if (!empty($image_order)) $image_order.= ',';
+        $image_order.= $_POST['image_order'][$i];
+      }
+    }
+  }
+  elseif ($image_order_choice=='rank')
+  {
+    $image_order = 'rank';
+  }
+  $query = '
+UPDATE '.CATEGORIES_TABLE.' 
+  SET image_order=\''.$image_order.'\'
+  WHERE id='.$page['category_id'];
+  pwg_query($query);
+
+  if (isset($_POST['image_order_subcats']))
+  {
+    $cat_info = get_cat_info($page['category_id']);
+
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET image_order = '.(isset($image_order) ? '\''.$image_order.'\'' : 'NULL').'
+  WHERE uppercats LIKE \''.$cat_info['uppercats'].',%\'';
+    pwg_query($query);
+  }
+
+  array_push($page['infos'], l10n('Your configuration settings are saved'));
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+$template->set_filenames(
+  array('element_set_ranks' => 'element_set_ranks.tpl')
+  );
+
+$base_url = get_root_url().'admin.php';
+
+$query = '
+SELECT *
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$page['category_id'].'
+;';
+$category = pwg_db_fetch_assoc(pwg_query($query));
+
+if ($category['image_order']=='rank')
+{
+  $image_order_choice = 'rank';
+}
+elseif ($category['image_order']!='')
+{
+  $image_order_choice = 'user_define';
+}
+
+// Navigation path
+$navigation = get_cat_display_name_cache(
+  $category['uppercats'],
+  get_root_url().'admin.php?page=album-'
+  );
+
+$template->assign(
+  array(
+    'CATEGORIES_NAV' => $navigation,
+    'F_ACTION' => $base_url.get_query_string_diff(array()),
+   )
+ );
+
+// +-----------------------------------------------------------------------+
+// |                              thumbnails                               |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT
+    id,
+    file,
+    path,
+    representative_ext,
+    width, height, rotation,
+    name,
+    rank
+  FROM '.IMAGES_TABLE.'
+    JOIN '.IMAGE_CATEGORY_TABLE.' ON image_id = id
+  WHERE category_id = '.$page['category_id'].'
+  ORDER BY rank
+;';
+$result = pwg_query($query);
+if (pwg_db_num_rows($result) > 0)
+{
+	// template thumbnail initialization
+	$current_rank = 1;
+	$thumbnail_info=array();
+	$clipping=array();
+  $derivativeParams = ImageStdParams::get_by_type(IMG_SQUARE);
+	while ($row = pwg_db_fetch_assoc($result))
+	{
+    $derivative = new DerivativeImage($derivativeParams, new SrcImage($row));
+
+		if ( !empty( $row['name'] ) )
+		{
+			$thumbnail_name = $row['name'];
+		}
+		else
+		{
+			$file_wo_ext = get_filename_wo_extension($row['file']);
+			$thumbnail_name = str_replace('_', ' ', $file_wo_ext);
+		}
+		$current_rank++;
+		$template->append(
+			'thumbnails',
+			array(
+				'ID' => $row['id'],
+				'NAME' => $thumbnail_name,
+				'TN_SRC' => $derivative->get_url(),
+				'RANK' => $current_rank * 10,
+				'SIZE' => $derivative->get_size(),
+				)
+			);
+	}
+}
+// image order management
+$sort_fields = array(
+  ''                    => '',
+  'file'                => l10n('file name, A &rarr; Z'),
+  'file DESC'           => l10n('file name, Z &rarr; A'),
+  'name'                => l10n('photo title, A &rarr; Z'),
+  'name DESC'           => l10n('photo title, Z &rarr; A'),
+  'date_creation DESC'  => l10n('date created, new &rarr; old'),
+  'date_creation'       => l10n('date created, old &rarr; new'),
+  'date_available DESC' => l10n('date posted, new &rarr; old'),
+  'date_available'      => l10n('date posted, old &rarr; new'),
+  'rating_score DESC'   => l10n('rating score, high &rarr; low'),
+  'rating_score'        => l10n('rating score, low &rarr; high'),
+  'hit DESC'            => l10n('visits, high &rarr; low'),
+  'hit'                 => l10n('visits, low &rarr; high'),
+  'id'                  => l10n('numeric identifier, 1 &rarr; 9'),
+  'id DESC'             => l10n('numeric identifier, 9 &rarr; 1'),
+  'rank'                => l10n('manual sort order'),
+  );
+
+$template->assign('image_order_options', $sort_fields);
+
+$image_order = explode(',', $category['image_order']);
+
+for ($i=0; $i<3; $i++) // 3 fields
+{
+  if ( isset($image_order[$i]) )
+  {
+    $template->append('image_order', $image_order[$i]);
+  }
+  else
+  {
+    $template->append('image_order', '');
+  }
+}
+
+$template->assign('image_order_choice', $image_order_choice);
+
+
+// +-----------------------------------------------------------------------+
+// |                          sending html code                            |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'element_set_ranks');
+?>
Index: tags/2.4.0RC3/admin/extend_for_templates.php
===================================================================
--- tags/2.4.0RC3/admin/extend_for_templates.php	(revision 14585)
+++ tags/2.4.0RC3/admin/extend_for_templates.php	(revision 14585)
@@ -0,0 +1,205 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Define replacement conditions for each template from template-extension
+ * (template called "replacer").
+ *
+ * "original template" from ./template/yoga (or any other than yoga)
+ * will be replaced by a "replacer" if the replacer is linked to this "original template"
+ * (and optionally, when the requested URL contains an "optional URL keyword").
+ *
+ * "Optional URL keywords" are those you can find after the module name in URLs.
+ *
+ * Therefore "Optional URL keywords" can be an active "permalink" 
+ * (see permalinks in our documentation for further explanation).
+ */
+
+// +-----------------------------------------------------------------------+
+//                            initialization                              |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH')) { die('Hacking attempt!'); }
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+check_status(ACCESS_ADMINISTRATOR);
+
+$tpl_extension = isset($conf['extents_for_templates']) ?
+      unserialize($conf['extents_for_templates']) : array();
+$new_extensions = get_extents(); 
+
+/* Selective URLs keyword */
+$relevant_parameters = array(
+    '----------',
+    'category',
+    'favorites',
+    'most_visited',
+    'best_rated',
+    'recent_pics',
+    'recent_cats',
+    'created-monthly-calendar',
+    'posted-monthly-calendar',
+    'search',
+    'flat',
+    'list', /* <=> Random */
+    'tags',
+    ); 
+  $query = '
+SELECT permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE permalink IS NOT NULL
+';
+
+/* Add active permalinks */ 
+$permalinks = array_from_query($query, 'permalink');
+$relevant_parameters = array_merge($relevant_parameters, $permalinks);
+
+/* Link all supported templates to their respective handle */
+$eligible_templates = array(
+    '----------'                 => 'N/A',
+    'about.tpl'                  => 'about',
+    'comments.tpl'               => 'comments',
+    'comment_list.tpl'           => 'comment_list',
+    'footer.tpl'                 => 'tail',
+    'header.tpl'                 => 'header',
+    'identification.tpl'         => 'identification',
+    'index.tpl'                  => 'index',
+    'mainpage_categories.tpl'    => 'index_category_thumbnails',
+    'menubar.tpl'                => 'menubar',
+    'menubar_categories.tpl'     => 'mbCategories',
+    'menubar_identification.tpl' => 'mbIdentification',
+    'menubar_links.tpl'          => 'mbLinks',
+    'menubar_menu.tpl'           => 'mbMenu',
+    'menubar_specials.tpl'       => 'mbSpecials',
+    'menubar_tags.tpl'           => 'mbTags',
+	'month_calendar.tpl'         => 'month_calendar',
+    'navigation_bar.tpl'         => 'navbar',
+    'nbm.tpl'                    => 'nbm',
+    'notification.tpl'           => 'notification',
+	'password.tpl'               => 'password',   
+    'picture.tpl'                => 'picture',
+    'picture_content.tpl'        => 'default_content',
+    'picture_nav_buttons.tpl'    => 'picture_nav_buttons',
+    'popuphelp.tpl'              => 'popuphelp',
+    'profile.tpl'                => 'profile',
+    'profile_content.tpl'        => 'profile_content',
+    'redirect.tpl'               => 'redirect',
+    'register.tpl'               => 'register',
+    'search.tpl'                 => 'search',
+    'search_rules.tpl'           => 'search_rules',
+    'slideshow.tpl'              => 'slideshow',
+    'tags.tpl'                   => 'tags',
+    'thumbnails.tpl'             => 'index_thumbnails',
+);
+
+$flip_templates = array_flip($eligible_templates);
+
+$available_templates = array_merge(
+  array('N/A' => '----------'),
+  get_dirs(PHPWG_ROOT_PATH.'themes'));
+
+// +-----------------------------------------------------------------------+
+// |                            selected templates                         |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submit']))
+{
+  $replacements = array();
+  $i = 0;
+  while (isset($_POST['reptpl'][$i]))
+  {
+    $newtpl = $_POST['reptpl'][$i];
+    $original = $_POST['original'][$i];
+    $handle = $eligible_templates[$original];
+    $url_keyword = $_POST['url'][$i];
+    if ($url_keyword == '----------') $url_keyword = 'N/A';
+    $bound_tpl = $_POST['bound'][$i];
+    if ($bound_tpl == '----------') $bound_tpl = 'N/A';
+    if ($handle != 'N/A')
+    {
+      $replacements[$newtpl] = array($handle, $url_keyword, $bound_tpl);
+    }
+    $i++;
+  }
+  $conf['extents_for_templates'] = serialize($replacements);
+  $tpl_extension = $replacements;
+  /* ecrire la nouvelle conf */
+  $query = '
+UPDATE '.CONFIG_TABLE.'
+  SET value = \''. $conf['extents_for_templates'] .'\'
+WHERE param = \'extents_for_templates\';';
+  if (pwg_query($query))
+  {
+    array_push($page['infos'], 
+      l10n('Templates configuration has been recorded.'));
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+/* Clearing (remove old extents, add new ones) */
+foreach ($tpl_extension as $file => $conditions)
+{
+  if ( !in_array($file,$new_extensions) ) unset($tpl_extension[$file]);
+  else $new_extensions = array_diff($new_extensions,array($file)); 
+}
+foreach ($new_extensions as $file)
+{
+  $tpl_extension[$file] = array('N/A', 'N/A', 'N/A');
+}
+
+$template->set_filenames(array('extend_for_templates'
+     => 'extend_for_templates.tpl'));
+
+$base_url = PHPWG_ROOT_PATH.'admin.php?page=extend_for_templates';
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=extend_for_templates',
+    ));
+ksort($tpl_extension);
+foreach ($tpl_extension as $file => $conditions)    
+{
+  $handle = $conditions[0];
+  $url_keyword = $conditions[1];
+  $bound_tpl = $conditions[2];
+  {  
+  $template->append('extents',
+    array(
+      'replacer'       => $file,
+      'url_parameter'  => $relevant_parameters,
+      'original_tpl'   => array_keys($eligible_templates),
+      'bound_tpl'          => $available_templates,
+      'selected_tpl'   => $flip_templates[$handle],
+      'selected_url'   => $url_keyword,
+      'selected_bound' => $bound_tpl,)
+      );
+  }
+}
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'extend_for_templates');
+?>
Index: tags/2.4.0RC3/admin/group_list.php
===================================================================
--- tags/2.4.0RC3/admin/group_list.php	(revision 14585)
+++ tags/2.4.0RC3/admin/group_list.php	(revision 14585)
@@ -0,0 +1,213 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!empty($_POST) or isset($_GET['delete']) or isset($_GET['toggle_is_default']))
+{
+  check_pwg_token();
+}
+
+// +-----------------------------------------------------------------------+
+// |                             delete a group                            |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['delete']) and is_numeric($_GET['delete']))
+{
+  // destruction of the access linked to the group
+  $query = '
+DELETE
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE group_id = '.$_GET['delete'].'
+;';
+  pwg_query($query);
+  
+  // destruction of the users links for this group
+  $query = '
+DELETE
+  FROM '.USER_GROUP_TABLE.'
+  WHERE group_id = '.$_GET['delete'].'
+;';
+  pwg_query($query);
+
+  $query = '
+SELECT name
+  FROM '.GROUPS_TABLE.'
+  WHERE id = '.$_GET['delete'].'
+;';
+  list($groupname) = pwg_db_fetch_row(pwg_query($query));
+  
+  // destruction of the group
+  $query = '
+DELETE
+  FROM '.GROUPS_TABLE.'
+  WHERE id = '.$_GET['delete'].'
+;';
+  pwg_query($query);
+
+  array_push(
+    $page['infos'],
+    sprintf(l10n('group "%s" deleted'), $groupname)
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                              add a group                              |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submit_add']))
+{
+  if (empty($_POST['groupname']))
+  {
+    array_push($page['errors'], l10n('The name of a group must not contain " or \' or be empty.'));
+  }
+  if (count($page['errors']) == 0)
+  {
+    // is the group not already existing ?
+    $query = '
+SELECT COUNT(*)
+  FROM '.GROUPS_TABLE.'
+  WHERE name = \''.$_POST['groupname'].'\'
+;';
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    if ($count != 0)
+    {
+      array_push($page['errors'], l10n('This name is already used by another group.'));
+    }
+  }
+  if (count($page['errors']) == 0)
+  {
+    // creating the group
+    $query = '
+INSERT INTO '.GROUPS_TABLE.'
+  (name)
+  VALUES
+  (\''.pwg_db_real_escape_string($_POST['groupname']).'\')
+;';
+    pwg_query($query);
+
+    array_push(
+      $page['infos'],
+      sprintf(l10n('group "%s" added'), $_POST['groupname'])
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | toggle is default group property                                      |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['toggle_is_default']) and is_numeric($_GET['toggle_is_default']))
+{
+  $query = '
+SELECT name, is_default
+  FROM '.GROUPS_TABLE.'
+  WHERE id = '.$_GET['toggle_is_default'].'
+;';
+  list($groupname, $is_default) = pwg_db_fetch_row(pwg_query($query));
+  
+  // update of the group
+  $query = '
+UPDATE '.GROUPS_TABLE.'
+  SET is_default = \''.boolean_to_string(!get_boolean($is_default)).'\'
+  WHERE id = '.$_GET['toggle_is_default'].'
+;';
+  pwg_query($query);
+
+  array_push(
+    $page['infos'],
+    sprintf(l10n('group "%s" updated'), $groupname)
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('group_list' => 'group_list.tpl'));
+
+$template->assign(
+  array(
+    'F_ADD_ACTION' => get_root_url().'admin.php?page=group_list',
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=group_list',
+    'PWG_TOKEN' => get_pwg_token(),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                              group list                               |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT id, name, is_default
+  FROM '.GROUPS_TABLE.'
+  ORDER BY name ASC
+;';
+$result = pwg_query($query);
+
+$admin_url = get_root_url().'admin.php?page=';
+$perm_url    = $admin_url.'group_perm&amp;group_id=';
+$del_url     = $admin_url.'group_list&amp;delete=';
+$members_url = $admin_url.'user_list&amp;group=';
+$toggle_is_default_url     = $admin_url.'group_list&amp;toggle_is_default=';
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $query = '
+SELECT COUNT(*)
+  FROM '.USER_GROUP_TABLE.'
+  WHERE group_id = '.$row['id'].'
+;';
+  list($counter) = pwg_db_fetch_row(pwg_query($query));
+  
+  $template->append(
+    'groups',
+    array(
+      'NAME' => $row['name'],
+      'IS_DEFAULT' => (get_boolean($row['is_default']) ? ' ['.l10n('default').']' : ''),
+      'MEMBERS' => l10n_dec('%d member', '%d members', $counter),
+      'U_MEMBERS' => $members_url.$row['id'],
+      'U_DELETE' => $del_url.$row['id'].'&amp;pwg_token='.get_pwg_token(),
+      'U_PERM' => $perm_url.$row['id'],
+      'U_ISDEFAULT' => $toggle_is_default_url.$row['id'].'&amp;pwg_token='.get_pwg_token(),
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'group_list');
+
+?>
Index: tags/2.4.0RC3/admin/group_perm.php
===================================================================
--- tags/2.4.0RC3/admin/group_perm.php	(revision 14585)
+++ tags/2.4.0RC3/admin/group_perm.php	(revision 14585)
@@ -0,0 +1,185 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                            variables init                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['group_id']) and is_numeric($_GET['group_id']))
+{
+  $page['group'] = $_GET['group_id'];
+}
+else
+{
+  die('group_id URL parameter is missing');
+}
+
+// +-----------------------------------------------------------------------+
+// |                                updates                                |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['falsify'])
+    and isset($_POST['cat_true'])
+    and count($_POST['cat_true']) > 0)
+{
+  // if you forbid access to a category, all sub-categories become
+  // automatically forbidden
+  $subcats = get_subcat_ids($_POST['cat_true']);
+  $query = '
+DELETE
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE group_id = '.$page['group'].'
+  AND cat_id IN ('.implode(',', $subcats).')
+;';
+  pwg_query($query);
+}
+else if (isset($_POST['trueify'])
+         and isset($_POST['cat_false'])
+         and count($_POST['cat_false']) > 0)
+{
+  $uppercats = get_uppercat_ids($_POST['cat_false']);
+  $private_uppercats = array();
+
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $uppercats).')
+  AND status = \'private\'
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($private_uppercats, $row['id']);
+  }
+
+  // retrying to authorize a category which is already authorized may cause
+  // an error (in SQL statement), so we need to know which categories are
+  // accesible
+  $authorized_ids = array();
+
+  $query = '
+SELECT cat_id
+  FROM '.GROUP_ACCESS_TABLE.'
+  WHERE group_id = '.$page['group'].'
+;';
+  $result = pwg_query($query);
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($authorized_ids, $row['cat_id']);
+  }
+
+  $inserts = array();
+  $to_autorize_ids = array_diff($private_uppercats, $authorized_ids);
+  foreach ($to_autorize_ids as $to_autorize_id)
+  {
+    array_push(
+      $inserts,
+      array(
+        'group_id' => $page['group'],
+        'cat_id' => $to_autorize_id
+        )
+      );
+  }
+
+  mass_inserts(GROUP_ACCESS_TABLE, array('group_id','cat_id'), $inserts);
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array(
+    'group_perm' => 'group_perm.tpl',
+    'double_select' => 'double_select.tpl'
+    )
+  );
+
+$template->assign(
+  array(
+    'TITLE' =>
+      sprintf(
+        l10n('Manage permissions for group "%s"'),
+        get_groupname($page['group']
+          )
+        ),
+    'L_CAT_OPTIONS_TRUE'=>l10n('Authorized'),
+    'L_CAT_OPTIONS_FALSE'=>l10n('Forbidden'),
+
+    'F_ACTION' =>
+        get_root_url().
+        'admin.php?page=group_perm&amp;group_id='.
+        $page['group']
+    )
+  );
+
+// only private categories are listed
+$query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.' INNER JOIN '.GROUP_ACCESS_TABLE.' ON cat_id = id
+  WHERE status = \'private\'
+    AND group_id = '.$page['group'].'
+;';
+display_select_cat_wrapper($query_true,array(),'category_option_true');
+
+$result = pwg_query($query_true);
+$authorized_ids = array();
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($authorized_ids, $row['id']);
+}
+
+$query_false = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'private\'';
+if (count($authorized_ids) > 0)
+{
+  $query_false.= '
+    AND id NOT IN ('.implode(',', $authorized_ids).')';
+}
+$query_false.= '
+;';
+display_select_cat_wrapper($query_false,array(),'category_option_false');
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('DOUBLE_SELECT', 'double_select');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'group_perm');
+
+?>
Index: tags/2.4.0RC3/admin/help.php
===================================================================
--- tags/2.4.0RC3/admin/help.php	(revision 14585)
+++ tags/2.4.0RC3/admin/help.php	(revision 14585)
@@ -0,0 +1,99 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+$link = get_root_url().'admin.php?page=help&section=';
+$selected = null;
+$help_section_title = null;
+
+$tabs = array();
+$tabs[] = array(
+  'code' => 'add_photos',
+  'label' => l10n('Add Photos'),
+  );
+$tabs[] = array(
+  'code' => 'permissions',
+  'label' => l10n('Permissions'),
+  );
+$tabs[] = array(
+  'code' => 'groups',
+  'label' => l10n('Groups'),
+  );
+$tabs[] = array(
+  'code' => 'virtual_links',
+  'label' => l10n('Virtual Links'),
+  );
+$tabs[] = array(
+  'code' => 'misc',
+  'label' => l10n('Miscellaneous'),
+  );
+
+if (!isset($_GET['section']))
+{
+  $section = $tabs[0]['code'];
+}
+else
+{
+  $section = $_GET['section'];
+}
+
+$tabsheet = new tabsheet();
+foreach ($tabs as $tab)
+{
+  if ($tab['code'] == $section)
+  {
+    $selected_tab = $tab['code'];
+    $help_section_title = $tab['label'];
+  }
+  
+  $tabsheet->add($tab['code'], $tab['label'], $link.$tab['code']);
+}
+$tabsheet->select($selected_tab);
+$tabsheet->assign();
+
+$template->set_filenames(array('help' => 'help.tpl'));
+
+$template->assign(
+  array(
+    'HELP_CONTENT' => load_language(
+      'help/help_'.$selected_tab.'.html',
+      '',
+      array('return'=>true)
+      ),
+    'HELP_SECTION_TITLE' => $help_section_title,
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'help');
+?>
Index: tags/2.4.0RC3/admin/history.php
===================================================================
--- tags/2.4.0RC3/admin/history.php	(revision 14585)
+++ tags/2.4.0RC3/admin/history.php	(revision 14585)
@@ -0,0 +1,701 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Display filtered history lines
+ */
+
+// +-----------------------------------------------------------------------+
+// |                              functions                                |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_history.inc.php');
+
+if (isset($_GET['start']) and is_numeric($_GET['start']))
+{
+  $page['start'] = $_GET['start'];
+}
+else
+{
+  $page['start'] = 0;
+}
+
+$types = array('none', 'picture', 'high', 'other');
+
+$display_thumbnails = array('no_display_thumbnail' => l10n('No display'),
+                            'display_thumbnail_classic' => l10n('Classic display'),
+                            'display_thumbnail_hoverbox' => l10n('Hoverbox display')
+  );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// | Build search criteria and redirect to results                         |
+// +-----------------------------------------------------------------------+
+
+$page['errors'] = array();
+$search = array();
+
+if (isset($_POST['submit']))
+{
+  // dates
+  if (!empty($_POST['start_year']))
+  {
+    $search['fields']['date-after'] = sprintf(
+      '%d-%02d-%02d',
+      $_POST['start_year'],
+      $_POST['start_month'],
+      $_POST['start_day']
+      );
+  }
+
+  if (!empty($_POST['end_year']))
+  {
+    $search['fields']['date-before'] = sprintf(
+      '%d-%02d-%02d',
+      $_POST['end_year'],
+      $_POST['end_month'],
+      $_POST['end_day']
+      );
+  }
+
+  if (empty($_POST['types']))
+  {
+    $search['fields']['types'] = $types;
+  }
+  else
+  {
+    $search['fields']['types'] = $_POST['types'];
+  }
+
+  $search['fields']['user'] = $_POST['user'];
+
+  if (!empty($_POST['image_id']))
+  {
+    $search['fields']['image_id'] = intval($_POST['image_id']);
+  }
+
+  if (!empty($_POST['filename']))
+  {
+    $search['fields']['filename'] = str_replace(
+      '*',
+      '%',
+      pwg_db_real_escape_string($_POST['filename'])
+      );
+  }
+
+  $search['fields']['display_thumbnail'] = $_POST['display_thumbnail'];
+  // Display choise are also save to one cookie
+  if (!empty($_POST['display_thumbnail'])
+      and isset($display_thumbnails[$_POST['display_thumbnail']]))
+  {
+    $cookie_val = $_POST['display_thumbnail'];
+  }
+  else
+  {
+    $cookie_val = null;
+  }
+  
+  pwg_set_cookie_var('display_thumbnail', $cookie_val, strtotime('+1 month') );
+
+  // TODO manage inconsistency of having $_POST['image_id'] and
+  // $_POST['filename'] simultaneously
+
+  if (!empty($search))
+  {
+    // register search rules in database, then they will be available on
+    // thumbnails page and picture page.
+    $query ='
+INSERT INTO '.SEARCH_TABLE.'
+  (rules)
+  VALUES
+  (\''.serialize($search).'\')
+;';
+    pwg_query($query);
+
+    $search_id = pwg_db_insert_id(SEARCH_TABLE);
+
+    redirect(
+      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
+      );
+  }
+  else
+  {
+    array_push($page['errors'], l10n('Empty query. No criteria has been entered.'));
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filename('history', 'history.tpl');
+
+// TabSheet initialization
+history_tabsheet();
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=history',
+    'F_ACTION' => get_root_url().'admin.php?page=history'
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                             history lines                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['search_id'])
+    and $page['search_id'] = (int)$_GET['search_id'])
+{
+  // what are the lines to display in reality ?
+  $query = '
+SELECT rules
+  FROM '.SEARCH_TABLE.'
+  WHERE id = '.$page['search_id'].'
+;';
+  list($serialized_rules) = pwg_db_fetch_row(pwg_query($query));
+
+  $page['search'] = unserialize($serialized_rules);
+
+  if (isset($_GET['user_id']))
+  {
+    if (!is_numeric($_GET['user_id']))
+    {
+      die('user_id GET parameter must be an integer value');
+    }
+
+    $page['search']['fields']['user'] = $_GET['user_id'];
+
+    $query ='
+INSERT INTO '.SEARCH_TABLE.'
+  (rules)
+  VALUES
+  (\''.serialize($page['search']).'\')
+;';
+    pwg_query($query);
+
+    $search_id = pwg_db_insert_id(SEARCH_TABLE);
+
+    redirect(
+      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
+      );
+  }
+
+  $data = trigger_event('get_history', array(), $page['search'], $types);
+  usort($data, 'history_compare');
+
+  $page['nb_lines'] = count($data);
+
+  $history_lines = array();
+  $user_ids = array();
+  $username_of = array();
+  $category_ids = array();
+  $image_ids = array();
+  $tag_ids = array();
+
+  foreach ($data as $row)
+  {
+    $user_ids[$row['user_id']] = 1;
+
+    if (isset($row['category_id']))
+    {
+      $category_ids[$row['category_id']] = 1;
+    }
+
+    if (isset($row['image_id']))
+    {
+      $image_ids[$row['image_id']] = 1;
+    }
+
+    if (isset($row['tag_ids']))
+    {
+      foreach (explode(',', $row['tag_ids']) as $tag_id)
+      {
+        array_push($tag_ids, $tag_id);
+      }
+    }
+
+    array_push(
+      $history_lines,
+      $row
+      );
+  }
+
+  // prepare reference data (users, tags, categories...)
+  if (count($user_ids) > 0)
+  {
+    $query = '
+SELECT '.$conf['user_fields']['id'].' AS id
+     , '.$conf['user_fields']['username'].' AS username
+  FROM '.USERS_TABLE.'
+  WHERE id IN ('.implode(',', array_keys($user_ids)).')
+;';
+    $result = pwg_query($query);
+
+    $username_of = array();
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $username_of[$row['id']] = stripslashes($row['username']);
+    }
+  }
+
+  if (count($category_ids) > 0)
+  {
+    $query = '
+SELECT id, uppercats
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', array_keys($category_ids)).')
+;';
+    $uppercats_of = simple_hash_from_query($query, 'id', 'uppercats');
+
+    $name_of_category = array();
+
+    foreach ($uppercats_of as $category_id => $uppercats)
+    {
+      $name_of_category[$category_id] = get_cat_display_name_cache(
+        $uppercats
+        );
+    }
+  }
+
+  if (count($image_ids) > 0)
+  {
+    $query = '
+SELECT
+    id,
+    IF(name IS NULL, file, name) AS label,
+    filesize,
+    high_filesize,
+    file,
+    path,
+    representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', array_keys($image_ids)).')
+;';
+    // $label_of_image = simple_hash_from_query($query, 'id', 'label');
+    $label_of_image = array();
+    $filesize_of_image = array();
+    $high_filesize_of_image = array();
+    $file_of_image = array();
+    $path_of_image = array();
+    $representative_ext_of_image = array();
+
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $label_of_image[ $row['id'] ] = $row['label'];
+
+      if (isset($row['filesize']))
+      {
+        $filesize_of_image[ $row['id'] ] = $row['filesize'];
+      }
+
+      if (isset($row['high_filesize']))
+      {
+        $high_filesize_of_image[ $row['id'] ] = $row['high_filesize'];
+      }
+
+      $file_of_image[ $row['id'] ] = $row['file'];
+      $path_of_image[ $row['id'] ] = $row['path'];
+      $representative_ext_of_image[ $row['id'] ] = $row['representative_ext'];
+    }
+
+    // echo '<pre>'; print_r($high_filesize_of_image); echo '</pre>';
+  }
+
+  if (count($tag_ids) > 0)
+  {
+    $tag_ids = array_unique($tag_ids);
+
+    $query = '
+SELECT
+    id,
+    name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(', ', $tag_ids).')
+;';
+    $name_of_tag = array();
+
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $name_of_tag[ $row['id'] ] = $row['name'];
+    }
+  }
+
+  $i = 0;
+  $first_line = $page['start'] + 1;
+  $last_line = $page['start'] + $conf['nb_logs_page'];
+
+  $summary['total_filesize'] = 0;
+  $summary['guests_IP'] = array();
+
+  foreach ($history_lines as $line)
+  {
+    // FIXME when we watch the representative of a non image element, it is
+    // the not the representative filesize that is counted (as it is
+    // unknown) but the non image element filesize. Proposed solution: add
+    // #images.representative_filesize and add 'representative' in the
+    // choices of #history.image_type.
+
+    if (isset($line['image_type']))
+    {
+      if ($line['image_type'] == 'high')
+      {
+        if (isset($high_filesize_of_image[$line['image_id']]))
+        {
+          $summary['total_filesize']+=
+            $high_filesize_of_image[$line['image_id']];
+        }
+      }
+      else
+      {
+        if (isset($filesize_of_image[$line['image_id']]))
+        {
+          $summary['total_filesize']+=
+            $filesize_of_image[$line['image_id']];
+        }
+      }
+    }
+
+    if ($line['user_id'] == $conf['guest_id'])
+    {
+      if (!isset($summary['guests_IP'][ $line['IP'] ]))
+      {
+        $summary['guests_IP'][ $line['IP'] ] = 0;
+      }
+
+      $summary['guests_IP'][ $line['IP'] ]++;
+    }
+
+    $i++;
+
+    if ($i < $first_line or $i > $last_line)
+    {
+      continue;
+    }
+
+    $user_string = '';
+    if (isset($username_of[$line['user_id']]))
+    {
+      $user_string.= $username_of[$line['user_id']];
+    }
+    else
+    {
+      $user_string.= $line['user_id'];
+    }
+    $user_string.= '&nbsp;<a href="';
+    $user_string.= PHPWG_ROOT_PATH.'admin.php?page=history';
+    $user_string.= '&amp;search_id='.$page['search_id'];
+    $user_string.= '&amp;user_id='.$line['user_id'];
+    $user_string.= '">+</a>';
+
+    $tags_string = '';
+    if (isset($line['tag_ids']))
+    {
+      $tags_string = preg_replace(
+        '/(\d+)/e',
+        '$name_of_tag["$1"]',
+        str_replace(
+          ',',
+          ', ',
+          $line['tag_ids']
+          )
+        );
+    }
+
+    $image_string = '';
+    if (isset($line['image_id']))
+    {
+      $picture_url = make_picture_url(
+        array(
+          'image_id' => $line['image_id'],
+          )
+        );
+
+      if (isset($file_of_image[$line['image_id']]))
+      {
+        $element = array(
+          'id' => $line['image_id'],
+          'file' => $file_of_image[$line['image_id']],
+          'path' => $path_of_image[$line['image_id']],
+          'representative_ext' => $representative_ext_of_image[$line['image_id']],
+          );
+        $thumbnail_display = $page['search']['fields']['display_thumbnail'];
+      }
+      else
+      {
+        $thumbnail_display = 'no_display_thumbnail';
+      }
+
+      $image_title = '('.$line['image_id'].')';
+
+      if (isset($label_of_image[$line['image_id']]))
+      {
+        $image_title.= ' '.$label_of_image[$line['image_id']];
+      }
+      else
+      {
+        $image_title.= ' unknown filename';
+      }
+
+      $image_string = '';
+
+      switch ($thumbnail_display)
+      {
+        case 'no_display_thumbnail':
+        {
+          $image_string= '<a href="'.$picture_url.'">'.$image_title.'</a>';
+          break;
+        }
+        case 'display_thumbnail_classic':
+        {
+          $image_string =
+            '<a class="thumbnail" href="'.$picture_url.'">'
+            .'<span><img src="'.DerivativeImage::thumb_url($element)
+            .'" alt="'.$image_title.'" title="'.$image_title.'">'
+            .'</span></a>';
+          break;
+        }
+        case 'display_thumbnail_hoverbox':
+        {
+          $image_string =
+            '<a class="over" href="'.$picture_url.'">'
+            .'<span><img src="'.DerivativeImage::thumb_url($element)
+            .'" alt="'.$image_title.'" title="'.$image_title.'">'
+            .'</span>'.$image_title.'</a>';
+          break;
+        }
+      }
+    }
+
+    $template->append(
+      'search_results',
+      array(
+        'DATE'      => $line['date'],
+        'TIME'      => $line['time'],
+        'USER'      => $user_string,
+        'IP'        => $line['IP'],
+        'IMAGE'     => $image_string,
+        'TYPE'      => $line['image_type'],
+        'SECTION'   => $line['section'],
+        'CATEGORY'  => isset($line['category_id'])
+          ? ( isset($name_of_category[$line['category_id']])
+                ? $name_of_category[$line['category_id']]
+                : 'deleted '.$line['category_id'] )
+          : '',
+        'TAGS'       => $tags_string,
+        )
+      );
+  }
+
+  $summary['nb_guests'] = 0;
+  if (count(array_keys($summary['guests_IP'])) > 0)
+  {
+    $summary['nb_guests'] = count(array_keys($summary['guests_IP']));
+
+    // we delete the "guest" from the $username_of hash so that it is
+    // avoided in next steps
+    unset($username_of[ $conf['guest_id'] ]);
+  }
+
+  $summary['nb_members'] = count($username_of);
+
+  $member_strings = array();
+  foreach ($username_of as $user_id => $user_name)
+  {
+    $member_string = $user_name.'&nbsp;<a href="';
+    $member_string.= get_root_url().'admin.php?page=history';
+    $member_string.= '&amp;search_id='.$page['search_id'];
+    $member_string.= '&amp;user_id='.$user_id;
+    $member_string.= '">+</a>';
+
+    $member_strings[] = $member_string;
+  }
+
+  $template->assign(
+    'search_summary',
+    array(
+      'NB_LINES' => l10n_dec(
+        '%d line filtered', '%d lines filtered',
+        $page['nb_lines']
+        ),
+      'FILESIZE' => $summary['total_filesize'].' KB',
+      'USERS' => l10n_dec(
+        '%d user', '%d users',
+        $summary['nb_members'] + $summary['nb_guests']
+        ),
+      'MEMBERS' => sprintf(
+        l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
+        implode(
+          ', ',
+          $member_strings
+          )
+        ),
+      'GUESTS' => l10n_dec(
+        '%d guest', '%d guests',
+        $summary['nb_guests']
+        ),
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                            navigation bar                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($page['search_id']))
+{
+  $navbar = create_navigation_bar(
+    get_root_url().'admin.php'.get_query_string_diff(array('start')),
+    $page['nb_lines'],
+    $page['start'],
+    $conf['nb_logs_page']
+    );
+
+  $template->assign('navbar', $navbar);
+}
+
+// +-----------------------------------------------------------------------+
+// |                             filter form                               |
+// +-----------------------------------------------------------------------+
+
+$form = array();
+
+if (isset($page['search']))
+{
+  if (isset($page['search']['fields']['date-after']))
+  {
+    $tokens = explode('-', $page['search']['fields']['date-after']);
+
+    $form['start_year']  = (int)$tokens[0];
+    $form['start_month'] = (int)$tokens[1];
+    $form['start_day']   = (int)$tokens[2];
+  }
+
+  if (isset($page['search']['fields']['date-before']))
+  {
+    $tokens = explode('-', $page['search']['fields']['date-before']);
+
+    $form['end_year']  = (int)$tokens[0];
+    $form['end_month'] = (int)$tokens[1];
+    $form['end_day']   = (int)$tokens[2];
+  }
+
+  $form['types'] = $page['search']['fields']['types'];
+
+  if (isset($page['search']['fields']['user']))
+  {
+    $form['user'] = $page['search']['fields']['user'];
+  }
+  else
+  {
+    $form['user'] = null;
+  }
+
+  $form['image_id'] = @$page['search']['fields']['image_id'];
+  $form['filename'] = @$page['search']['fields']['filename'];
+
+  $form['display_thumbnail'] = @$page['search']['fields']['display_thumbnail'];
+}
+else
+{
+  // by default, at page load, we want the selected date to be the current
+  // date
+  $form['start_year']  = $form['end_year']  = date('Y');
+  $form['start_month'] = $form['end_month'] = date('n');
+  $form['start_day']   = $form['end_day']   = date('j');
+  $form['types'] = $types;
+  // Hoverbox by default
+  $form['display_thumbnail'] =
+    pwg_get_cookie_var('display_thumbnail', 'no_display_thumbnail');
+}
+
+
+$month_list = $lang['month'];
+$month_list[0]='------------';
+ksort($month_list);
+
+$template->assign(
+  array(
+    'IMAGE_ID' => @$form['image_id'],
+    'FILENAME' => @$form['filename'],
+
+    'month_list' => $month_list,
+
+    'START_DAY_SELECTED' => @$form['start_day'],
+    'START_MONTH_SELECTED' => @$form['start_month'],
+    'START_YEAR' => @$form['start_year'],
+
+    'END_DAY_SELECTED' => @$form['end_day'],
+    'END_MONTH_SELECTED' => @$form['end_month'],
+    'END_YEAR'   => @$form['end_year'],
+    )
+  );
+
+$template->assign(
+    array(
+      'type_option_values' => $types,
+      'type_option_selected' => $form['types']
+    )
+  );
+
+
+$query = '
+SELECT
+    '.$conf['user_fields']['id'].' AS id,
+    '.$conf['user_fields']['username'].' AS username
+  FROM '.USERS_TABLE.'
+  ORDER BY username ASC
+;';
+$template->assign(
+  array(
+    'user_options' => simple_hash_from_query($query, 'id','username'),
+    'user_options_selected' => array(@$form['user'])
+  )
+);
+
+$template->assign('display_thumbnails', $display_thumbnails);
+$template->assign('display_thumbnail_selected', $form['display_thumbnail']);
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
+?>
Index: tags/2.4.0RC3/admin/include/albums_tab.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/albums_tab.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/albums_tab.inc.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=';
+
+$tabsheet = new tabsheet();
+$tabsheet->add('list', l10n('List'), $my_base_url.'cat_list');
+$tabsheet->add('move', l10n('Move'), $my_base_url.'cat_move');
+$tabsheet->add('permalinks', l10n('Permalinks'), $my_base_url.'permalinks');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+?>
Index: tags/2.4.0RC3/admin/include/c13y_internal.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/c13y_internal.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/c13y_internal.class.php	(revision 14585)
@@ -0,0 +1,254 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class c13y_internal
+{
+  function c13y_internal()
+  {
+    add_event_handler('list_check_integrity', array(&$this, 'c13y_version'));
+    add_event_handler('list_check_integrity', array(&$this, 'c13y_exif'));
+    add_event_handler('list_check_integrity', array(&$this, 'c13y_user'));
+  }
+
+  /**
+   * Check version
+   *
+   * @param c13y object
+   * @return void
+   */
+  function c13y_version($c13y)
+  {
+    global $conf;
+
+    $check_list = array();
+
+    $check_list[] = array('type' => 'PHP', 'current' => phpversion(), 'required' => REQUIRED_PHP_VERSION);
+
+    $db_version = pwg_get_db_version();
+    $check_list[] = array('type' => $conf['dblayer'],
+			  'current' => $db_version, 
+			  'required' => constant('REQUIRED_'.str_replace('-', '_', strtoupper($conf['dblayer'])).'_VERSION')
+			  );
+
+    foreach ($check_list as $elem)
+    {
+      if (version_compare($elem['current'], $elem['required'], '<'))
+      {
+        $c13y->add_anomaly(
+          sprintf(l10n('The version of %s [%s] installed is not compatible with the version required [%s]'), $elem['type'], $elem['current'], $elem['required']),
+          null,
+          null,
+          l10n('You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all')
+          .'<br>'.
+          $c13y->get_htlm_links_more_info());
+      }
+    }
+  }
+
+  /**
+   * Check exif
+   *
+   * @param c13y object
+   * @return void
+   */
+  function c13y_exif($c13y)
+  {
+    global $conf;
+
+    foreach (array('show_exif', 'use_exif') as $value)
+    {
+      if (($conf[$value]) and (!function_exists('read_exif_data')))
+      {
+        $c13y->add_anomaly(
+          sprintf(l10n('%s value is not correct file because exif are not supported'), '$conf[\''.$value.'\']'),
+          null,
+          null,
+          sprintf(l10n('%s must be to set to false in your local/config/config.inc.php file'), '$conf[\''.$value.'\']')
+          .'<br>'.
+          $c13y->get_htlm_links_more_info());
+      }
+    }
+  }
+
+  /**
+   * Check user
+   *
+   * @param c13y object
+   * @return void
+   */
+  function c13y_user($c13y)
+  {
+    global $conf;
+
+    $c13y_users = array();
+    $c13y_users[$conf['guest_id']] = array(
+      'status' => 'guest',
+      'l10n_non_existent' => 'Main "guest" user does not exist',
+      'l10n_bad_status' => 'Main "guest" user status is incorrect');
+
+    if ($conf['guest_id'] != $conf['default_user_id'])
+    {
+      $c13y_users[$conf['default_user_id']] = array(
+        'password' => null,
+        'l10n_non_existent' => 'Default user does not exist');
+    }
+
+    $c13y_users[$conf['webmaster_id']] = array(
+      'status' => 'webmaster',
+      'l10n_non_existent' => 'Main "webmaster" user does not exist',
+      'l10n_bad_status' => 'Main "webmaster" user status is incorrect');
+
+      $query = '
+  select u.'.$conf['user_fields']['id'].' as id, ui.status
+  from '.USERS_TABLE.' as u
+    left join '.USER_INFOS_TABLE.' as ui
+        on u.'.$conf['user_fields']['id'].' = ui.user_id
+  where
+    u.'.$conf['user_fields']['id'].' in ('.implode(',', array_keys($c13y_users)).')
+  ;';
+
+
+    $status = array();
+
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $status[$row['id']] = $row['status'];
+    }
+
+    foreach ($c13y_users as $id => $data)
+    {
+      if (!array_key_exists($id, $status))
+      {
+        $c13y->add_anomaly(l10n($data['l10n_non_existent']), 'c13y_correction_user',
+          array('id' => $id, 'action' => 'creation'));
+      }
+      else
+      if (!empty($data['status']) and $status[$id] != $data['status'])
+      {
+        $c13y->add_anomaly(l10n($data['l10n_bad_status']), 'c13y_correction_user',
+          array('id' => $id, 'action' => 'status'));
+      }
+    }
+  }
+
+  /**
+   * Do correction user
+   *
+   * @param user_id, action
+   * @return boolean true if ok else false
+   */
+  function c13y_correction_user($id, $action)
+  {
+    global $conf, $page;
+
+    $result = false;
+
+    if (!empty($id))
+    {
+      switch ($action)
+      {
+        case 'creation':
+          if ($id == $conf['guest_id'])
+          {
+            $name = 'guest';
+            $password = null;
+          }
+          else if  ($id == $conf['default_user_id'])
+          {
+            $name = 'guest';
+            $password = null;
+          }
+          else if  ($id == $conf['webmaster_id'])
+          {
+            $name = 'webmaster';
+            $password = generate_key(6);
+          }
+
+          if (isset($name))
+          {
+            $name_ok = false;
+            while (!$name_ok)
+            {
+              $name_ok = (get_userid($name) === false);
+              if (!$name_ok)
+              {
+                $name .= generate_key(1);
+              }
+            }
+
+            $inserts = array(
+              array(
+                'id'       => $id,
+                'username' => addslashes($name),
+                'password' => $password
+                ),
+              );
+            mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
+
+            create_user_infos($id);
+
+            $page['infos'][] = sprintf(l10n('User "%s" created with "%s" like password'), $name, $password);
+
+            $result = true;
+          }
+          break;
+        case 'status':
+          if ($id == $conf['guest_id'])
+          {
+            $status = 'guest';
+          }
+          else if  ($id == $conf['default_user_id'])
+          {
+            $status = 'guest';
+          }
+          else if  ($id == $conf['webmaster_id'])
+          {
+            $status = 'webmaster';
+          }
+
+          if (isset($status))
+          {
+            $updates = array(
+              array(
+                'user_id' => $id,
+                'status'  => $status
+                ),
+              );
+            mass_updates(USER_INFOS_TABLE,
+              array('primary' => array('user_id'),'update' => array('status')),
+              $updates);
+
+            $page['infos'][] = sprintf(l10n('Status of user "%s" updated'), get_username($id));
+
+            $result = true;
+          }
+          break;
+      }
+    }
+
+    return $result;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/check_integrity.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/check_integrity.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/check_integrity.class.php	(revision 14585)
@@ -0,0 +1,342 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class check_integrity
+{
+  var $ignore_list;
+  var $retrieve_list;
+  var $build_ignore_list;
+
+  function check_integrity()
+  {
+    $this->ignore_list = array();
+    $this->retrieve_list = array();
+    $this->build_ignore_list = array();
+  }
+
+  /**
+   * Check integrities
+   *
+   * @param void
+   * @return void
+   */
+  function check()
+  {
+    global $page, $header_notes, $conf;
+
+    // Ignore list
+    $conf_c13y_ignore = unserialize($conf['c13y_ignore']);
+    if (
+          is_array($conf_c13y_ignore) and
+          isset($conf_c13y_ignore['version']) and
+          ($conf_c13y_ignore['version'] == PHPWG_VERSION) and
+          is_array($conf_c13y_ignore['list'])
+        )
+    {
+      $ignore_list_changed = false;
+      $this->ignore_list = $conf_c13y_ignore['list'];
+    }
+    else
+    {
+      $ignore_list_changed = true;
+      $this->ignore_list = array();
+    }
+
+    // Retrieve list
+    $this->retrieve_list = array();
+    $this->build_ignore_list = array();
+
+    trigger_action('list_check_integrity', $this);
+
+    // Information
+    if (count($this->retrieve_list) > 0)
+    {
+      $header_notes[] =
+        l10n_dec('%d anomaly has been detected.', '%d anomalies have been detected.',
+          count($this->retrieve_list));
+    }
+
+    // Treatments
+    if (isset($_POST['c13y_submit_correction']) and isset($_POST['c13y_selection']))
+    {
+      $corrected_count = 0;
+      $not_corrected_count = 0;
+
+      foreach ($this->retrieve_list as $i => $c13y)
+      {
+        if (!empty($c13y['correction_fct']) and
+            $c13y['is_callable'] and
+            in_array($c13y['id'], $_POST['c13y_selection']))
+        {
+          if (is_array($c13y['correction_fct_args']))
+          {
+            $args = $c13y['correction_fct_args'];
+          }
+          else
+          if (!is_null($c13y['correction_fct_args']))
+          {
+            $args = array($c13y['correction_fct_args']);
+          }
+          else
+          {
+            $args = array();
+          }
+          $this->retrieve_list[$i]['corrected'] = call_user_func_array($c13y['correction_fct'], $args);
+
+          if ($this->retrieve_list[$i]['corrected'])
+          {
+            $corrected_count += 1;
+          }
+          else
+          {
+            $not_corrected_count += 1;
+          }
+        }
+      }
+
+      if ($corrected_count > 0)
+      {
+        $page['infos'][] =
+          l10n_dec('%d anomaly has been corrected.', '%d anomalies have been detected corrected.',
+            $corrected_count);
+      }
+      if ($not_corrected_count > 0)
+      {
+        $page['errors'][] =
+          l10n_dec('%d anomaly has not been corrected.', '%d anomalies have not been corrected.',
+            $not_corrected_count);
+      }
+    }
+    else
+    {
+      if (isset($_POST['c13y_submit_ignore']) and isset($_POST['c13y_selection']))
+      {
+        $ignored_count = 0;
+
+        foreach ($this->retrieve_list as $i => $c13y)
+        {
+          if (in_array($c13y['id'], $_POST['c13y_selection']))
+          {
+            $this->build_ignore_list[] = $c13y['id'];
+            $this->retrieve_list[$i]['ignored'] = true;
+            $ignored_count += 1;
+          }
+        }
+
+        if ($ignored_count > 0)
+        {
+          $page['infos'][] =
+            l10n_dec('%d anomaly has been ignored.', '%d anomalies have been ignored.',
+              $ignored_count);
+        }
+      }
+    }
+
+    $ignore_list_changed =
+      (
+        ($ignore_list_changed) or
+        (count(array_diff($this->ignore_list, $this->build_ignore_list)) > 0) or
+        (count(array_diff($this->build_ignore_list, $this->ignore_list)) > 0)
+        );
+
+    if ($ignore_list_changed)
+    {
+      $this->update_conf($this->build_ignore_list);
+    }
+  }
+
+  /**
+   * Display anomalies list
+   *
+   * @param void
+   * @return void
+   */
+  function display()
+  {
+    global $template;
+
+    $check_automatic_correction = false;
+    $submit_automatic_correction = false;
+    $submit_ignore = false;
+
+    if (isset($this->retrieve_list) and count($this->retrieve_list) > 0)
+    {
+      $template->set_filenames(array('check_integrity' => 'check_integrity.tpl'));
+
+      foreach ($this->retrieve_list as $i => $c13y)
+      {
+        $can_select = false;
+        $c13y_display = array(
+           'id' => $c13y['id'],
+           'anomaly' => $c13y['anomaly'],
+           'show_ignore_msg' => false,
+           'show_correction_success_fct' => false,
+           'correction_error_fct' => '',
+           'show_correction_fct' => false,
+           'correction_error_fct' => '',
+           'show_correction_bad_fct' => false,
+           'correction_msg' => ''
+          );
+
+        if (isset($c13y['ignored']))
+        {
+          if ($c13y['ignored'])
+          {
+            $c13y_display['show_ignore_msg'] = true;
+          }
+          else
+          {
+            die('$c13y[\'ignored\'] cannot be false');
+          }
+        }
+        else
+        {
+          if (!empty($c13y['correction_fct']))
+          {
+            if (isset($c13y['corrected']))
+            {
+              if ($c13y['corrected'])
+              {
+                $c13y_display['show_correction_success_fct'] = true;
+              }
+              else
+              {
+                $c13y_display['correction_error_fct'] = $this->get_htlm_links_more_info();
+              }
+            }
+            else if ($c13y['is_callable'])
+            {
+              $c13y_display['show_correction_fct'] = true;
+              $template->append('c13y_do_check', $c13y['id']);
+              $submit_automatic_correction = true;
+              $can_select = true;
+            }
+            else
+            {
+              $c13y_display['show_correction_bad_fct'] = true;
+              $can_select = true;
+            }
+          }
+          else
+          {
+            $can_select = true;
+          }
+
+          if (!empty($c13y['correction_msg']) and !isset($c13y['corrected']))
+          {
+            $c13y_display['correction_msg'] = $c13y['correction_msg'];
+          }
+        }
+
+        $c13y_display['can_select'] = $can_select;
+        if ($can_select)
+        {
+          $submit_ignore = true;
+        }
+
+        $template->append('c13y_list', $c13y_display);
+      }
+
+      $template->assign('c13y_show_submit_automatic_correction', $submit_automatic_correction);
+      $template->assign('c13y_show_submit_ignore', $submit_ignore);
+
+      $template->concat('ADMIN_CONTENT', $template->parse('check_integrity', true));
+
+    }
+  }
+
+  /**
+   * Add anomaly data
+   *
+   * @param anomaly arguments
+   * @return void
+   */
+  function add_anomaly($anomaly, $correction_fct = null, $correction_fct_args = null, $correction_msg = null)
+  {
+    $id = md5($anomaly.$correction_fct.serialize($correction_fct_args).$correction_msg);
+
+    if (in_array($id, $this->ignore_list))
+    {
+      $this->build_ignore_list[] = $id;
+    }
+    else
+    {
+      $this->retrieve_list[] =
+        array(
+          'id' => $id,
+          'anomaly' => $anomaly,
+          'correction_fct' => $correction_fct,
+          'correction_fct_args' => $correction_fct_args,
+          'correction_msg' => $correction_msg,
+          'is_callable' => is_callable($correction_fct));
+    }
+  }
+
+  /**
+   * Update table config
+   *
+   * @param ignore list array
+   * @return void
+   */
+  function update_conf($conf_ignore_list = array())
+  {
+    $conf_c13y_ignore =  array();
+    $conf_c13y_ignore['version'] = PHPWG_VERSION;
+    $conf_c13y_ignore['list'] = $conf_ignore_list;
+    $query = 'update '.CONFIG_TABLE.' set value =\''.serialize($conf_c13y_ignore).'\'where param = \'c13y_ignore\';';
+    pwg_query($query);
+  }
+
+  /**
+   * Apply maintenance
+   *
+   * @param void
+   * @return void
+   */
+  function maintenance()
+  {
+    $this->update_conf();
+  }
+
+  /**
+   * Returns links more informations
+   *
+   * @param void
+   * @return html links
+   */
+  function get_htlm_links_more_info()
+  {
+    $pwg_links = pwg_URL();
+    $link_fmt = '<a href="%s" onclick="window.open(this.href, \'\'); return false;">%s</a>';
+    return
+      sprintf
+      (
+        l10n('Go to %s or %s for more informations'),
+        sprintf($link_fmt, $pwg_links['FORUM'], l10n('the forum')),
+        sprintf($link_fmt, $pwg_links['WIKI'], l10n('the wiki'))
+      );
+  }
+
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/configuration_sizes_process.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/configuration_sizes_process.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/configuration_sizes_process.inc.php	(revision 14585)
@@ -0,0 +1,265 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+$errors = array();
+
+// original resize
+$original_fields = array(
+  'original_resize',
+  'original_resize_maxwidth',
+  'original_resize_maxheight',
+  'original_resize_quality',
+  );
+
+$updates = array();
+
+foreach ($original_fields as $field)
+{
+  $value = !empty($_POST[$field]) ? $_POST[$field] : null;
+  $updates[$field] = $value;
+}
+
+save_upload_form_config($updates, $page['errors'], $errors);
+
+if ($_POST['resize_quality'] < 50 or $_POST['resize_quality'] > 98)
+{
+  $errors['resize_quality'] = '[50..98]';
+}
+
+$pderivatives = $_POST['d'];
+
+// step 1 - sanitize HTML input
+foreach ($pderivatives as $type => &$pderivative)
+{
+  if ($pderivative['must_square'] = ($type==IMG_SQUARE ? true : false))
+  {
+    $pderivative['h'] = $pderivative['w'];
+    $pderivative['minh'] = $pderivative['minw'] = $pderivative['w'];
+    $pderivative['crop'] = 100;
+  }
+  $pderivative['must_enable'] = ($type==IMG_SQUARE || $type==IMG_THUMB)? true : false;
+  $pderivative['enabled'] = isset($pderivative['enabled']) || $pderivative['must_enable'] ? true : false;
+
+  if (isset($pderivative['crop']))
+  {
+    $pderivative['crop'] = 100;
+    $pderivative['minw'] = $pderivative['w'];
+    $pderivative['minh'] = $pderivative['h'];
+  }
+  else
+  {
+    $pderivative['crop'] = 0;
+    $pderivative['minw'] = null;
+    $pderivative['minh'] = null;
+  }
+}
+unset($pderivative);
+
+// step 2 - check validity
+$prev_w = $prev_h = 0;
+foreach(ImageStdParams::get_all_types() as $type)
+{
+  $pderivative = $pderivatives[$type];
+  if (!$pderivative['enabled'])
+  {
+    continue;
+  }
+
+  if ($type == IMG_THUMB)
+  {
+    $w = intval($pderivative['w']);
+    if ($w <= 0)
+    {
+      $errors[$type]['w'] = '>0';
+    }
+    
+    $h = intval($pderivative['h']);
+    if ($h <= 0)
+    {
+      $errors[$type]['h'] = '>0';
+    }
+    
+    if (max($w,$h) <= $prev_w)
+    {
+      $errors[$type]['w'] = $errors[$type]['h'] = '>'.$prev_w;
+    }
+  }
+  else
+  {
+    $v = intval($pderivative['w']);
+    if ($v <= 0 or $v <= $prev_w)
+    {
+      $errors[$type]['w'] = '>'.$prev_w;
+    }
+    
+    $v = intval($pderivative['h']);
+    if ($v <= 0 or $v <= $prev_h)
+    {
+      $errors[$type]['h'] = '>'.$prev_h;
+    }
+  }
+  
+  if (count($errors) == 0)
+  {
+    $prev_w = intval($pderivative['w']);
+    $prev_h = intval($pderivative['h']);
+  }
+}
+
+// step 3 - save data
+if (count($errors) == 0)
+{
+  $enabled = ImageStdParams::get_defined_type_map();
+  $disabled = @unserialize( @$conf['disabled_derivatives'] );
+  if ($disabled === false)
+  {
+    $disabled = array();
+  }
+  $changed_types = array();
+
+  foreach (ImageStdParams::get_all_types() as $type)
+  {
+    $pderivative = $pderivatives[$type];
+    
+    if ($pderivative['enabled'])
+    {
+      $new_params = new DerivativeParams(
+        new SizingParams(
+          array(intval($pderivative['w']), intval($pderivative['h'])),
+          round($pderivative['crop'] / 100, 2),
+          array(intval($pderivative['minw']), intval($pderivative['minh']))
+          )
+        );
+      
+      $new_params->quality = intval($_POST['resize_quality']);
+      
+      ImageStdParams::apply_global($new_params);
+      
+      if (isset($enabled[$type]))
+      {
+        $old_params = $enabled[$type];
+        $same = true;
+        if (!size_equals($old_params->sizing->ideal_size, $new_params->sizing->ideal_size)
+            or $old_params->sizing->max_crop != $new_params->sizing->max_crop)
+        {
+          $same = false;
+        }
+        
+        if ($same
+            and $new_params->sizing->max_crop != 0
+            and !size_equals($old_params->sizing->min_size, $new_params->sizing->min_size))
+        {
+          $same = false;
+        }
+        
+        if ($new_params->quality != $old_params->quality)
+        {
+          $same = false;
+        }
+        
+        if (!$same)
+        {
+          $new_params->last_mod_time = time();
+          $changed_types[] = $type;
+        }
+        else
+        {
+          $new_params->last_mod_time = $old_params->last_mod_time;
+        }
+        $enabled[$type] = $new_params;
+      }
+      else
+      {// now enabled, before was disabled
+        $enabled[$type] = $new_params;
+        unset($disabled[$type]);
+      }
+    }
+    else
+    {// disabled
+      if (isset($enabled[$type]))
+      {// now disabled, before was enabled
+        $changed_types[] = $type;
+        $disabled[$type] = $enabled[$type];
+        unset($enabled[$type]);
+      }
+    }
+  }
+  
+  $enabled_by = array(); // keys ordered by all types
+  foreach(ImageStdParams::get_all_types() as $type)
+  {
+    if (isset($enabled[$type]))
+    {
+      $enabled_by[$type] = $enabled[$type];
+    }
+  }
+  
+  ImageStdParams::set_and_save($enabled_by);
+  if (count($disabled) == 0)
+  {
+    $query='DELETE FROM '.CONFIG_TABLE.' WHERE param = \'disabled_derivatives\'';
+    pwg_query($query);
+  }
+  else
+  {
+    conf_update_param('disabled_derivatives', addslashes(serialize($disabled)) );
+  }
+  $conf['disabled_derivatives'] = serialize($disabled);
+  
+  if (count($changed_types))
+  {
+    clear_derivative_cache($changed_types);
+  }
+  
+  array_push(
+    $page['infos'],
+    l10n('Your configuration settings are saved')
+    );
+}
+else
+{
+  foreach ($original_fields as $field)
+  {
+    if (isset($_POST[$field]))
+    {
+      $template->append(
+        'sizes',
+        array(
+          $field => $_POST[$field]
+          ),
+        true
+        );
+    }
+  }
+  
+  $template->assign('derivatives', $pderivatives);
+  $template->assign('ferrors', $errors);
+  $template->assign('resize_quality', $_POST['resize_quality']);
+  $page['sizes_loaded_in_tpl'] = true;
+}
+?>
Index: tags/2.4.0RC3/admin/include/configuration_watermark_process.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/configuration_watermark_process.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/configuration_watermark_process.inc.php	(revision 14585)
@@ -0,0 +1,168 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+$errors = array();
+$pwatermark = $_POST['w'];
+
+// step 0 - manage upload if any
+if (isset($_FILES['watermarkImage']) and !empty($_FILES['watermarkImage']['tmp_name']))
+{
+  list($width, $height, $type) = getimagesize($_FILES['watermarkImage']['tmp_name']);
+  if (IMAGETYPE_PNG != $type)
+  {
+    $errors['watermarkImage'] = sprintf(
+      l10n('Allowed file types: %s.'),
+      'PNG'
+      );
+  }
+  else
+  {
+    $upload_dir = PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'watermarks';
+
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+    prepare_directory($upload_dir);
+
+    $new_name = get_filename_wo_extension($_FILES['watermarkImage']['name']).'.png';
+    $file_path = $upload_dir.'/'.$new_name; 
+  
+    move_uploaded_file($_FILES['watermarkImage']['tmp_name'], $file_path);
+    
+    $pwatermark['file'] = substr($file_path, strlen(PHPWG_ROOT_PATH));
+  }
+}
+
+// step 1 - sanitize HTML input
+switch ($pwatermark['position'])
+{
+  case 'topleft':
+  {
+    $pwatermark['xpos'] = 0;
+    $pwatermark['ypos'] = 0;
+    break;
+  }
+  case 'topright':
+  {
+    $pwatermark['xpos'] = 100;
+    $pwatermark['ypos'] = 0;
+    break;
+  }
+  case 'middle':
+  {
+    $pwatermark['xpos'] = 50;
+    $pwatermark['ypos'] = 50;
+    break;
+  }
+  case 'bottomleft':
+  {
+    $pwatermark['xpos'] = 0;
+    $pwatermark['ypos'] = 100;
+    break;
+  }
+  case 'bottomright':
+  {
+    $pwatermark['xpos'] = 100;
+    $pwatermark['ypos'] = 100;
+    break;
+  }
+}
+
+// step 2 - check validity
+$v = intval($pwatermark['xpos']);
+if ($v < 0 or $v > 100)
+{
+  $errors['watermark']['xpos'] = '[0..100]';
+}
+
+$v = intval($pwatermark['ypos']);
+if ($v < 0 or $v > 100)
+{
+  $errors['watermark']['ypos'] = '[0..100]';
+}
+
+$v = intval($pwatermark['opacity']);
+if ($v <= 0 or $v > 100)
+{
+  $errors['watermark']['opacity'] = '(0..100]';
+}
+
+// step 3 - save data
+if (count($errors) == 0)
+{
+  $watermark = new WatermarkParams();
+  $watermark->file = $pwatermark['file'];
+  $watermark->xpos = intval($pwatermark['xpos']);
+  $watermark->ypos = intval($pwatermark['ypos']);
+  $watermark->xrepeat = intval($pwatermark['xrepeat']);
+  $watermark->opacity = intval($pwatermark['opacity']);
+  $watermark->min_size = array(intval($pwatermark['minw']),intval($pwatermark['minh']));
+
+  $old_watermark = ImageStdParams::get_watermark();
+  $watermark_changed =
+    $watermark->file != $old_watermark->file
+    || $watermark->xpos != $old_watermark->xpos
+    || $watermark->ypos != $old_watermark->ypos
+    || $watermark->xrepeat != $old_watermark->xrepeat
+    || $watermark->opacity != $old_watermark->opacity;
+
+  // save the new watermark configuration
+  ImageStdParams::set_watermark($watermark);
+
+  // do we have to regenerate the derivatives (and which types)?
+  $changed_types = array();
+  
+  foreach (ImageStdParams::get_defined_type_map() as $type => $params)
+  {
+    $old_use_watermark = $params->use_watermark;
+    ImageStdParams::apply_global($params);
+
+    if ($params->use_watermark != $old_use_watermark
+        or $params->use_watermark and $watermark_changed)
+    {
+      $params->last_mod_time = time();
+      $changed_types[] = $type;
+    }
+  }
+
+  ImageStdParams::save();
+
+  if (count($changed_types))
+  {
+    clear_derivative_cache($changed_types);
+  }
+
+  array_push(
+    $page['infos'],
+    l10n('Your configuration settings are saved')
+    );
+}
+else
+{
+  $template->assign('watermark', $pwatermark);
+  $template->assign('ferrors', $errors);
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions.php	(revision 14585)
@@ -0,0 +1,2368 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
+
+// The function delete_site deletes a site and call the function
+// delete_categories for each primary category of the site
+function delete_site( $id )
+{
+  // destruction of the categories of the site
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE site_id = '.$id.'
+;';
+  $result = pwg_query($query);
+  $category_ids = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($category_ids, $row['id']);
+  }
+  delete_categories($category_ids);
+
+  // destruction of the site
+  $query = '
+DELETE FROM '.SITES_TABLE.'
+  WHERE id = '.$id.'
+;';
+  pwg_query($query);
+}
+
+
+// The function delete_categories deletes the categories identified by the
+// (numeric) key of the array $ids. It also deletes (in the database) :
+//    - all the elements physically linked to the category (delete_elements, see further)
+//    - all the links between elements and this category
+//    - all the restrictions linked to the category
+// The function works recursively.
+//
+// the $photo_deletion_mode is for photos virtually linked to the categorty
+//   * no_delete : delete no photo, may create orphans
+//   * delete_orphans : delete photos that are no longer linked to any category
+//   * force_delete : delete photos even if they are linked to another category
+function delete_categories($ids, $photo_deletion_mode='no_delete')
+{
+  if (count($ids) == 0)
+  {
+    return;
+  }
+
+  // add sub-category ids to the given ids : if a category is deleted, all
+  // sub-categories must be so
+  $ids = get_subcat_ids($ids);
+
+  // destruction of all photos physically linked to the category
+  $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+  WHERE storage_category_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  $result = pwg_query($query);
+  $element_ids = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($element_ids, $row['id']);
+  }
+  delete_elements($element_ids);
+
+  // now, should we delete photos that are virtually linked to the category?
+  if ('delete_orphans' == $photo_deletion_mode or 'force_delete' == $photo_deletion_mode)
+  {
+    $query = '
+SELECT
+    DISTINCT(image_id)
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id IN ('.implode(',', $ids).')
+;';
+    $image_ids_linked = array_from_query($query, 'image_id');
+
+    if (count($image_ids_linked) > 0)
+    {
+      if ('delete_orphans' == $photo_deletion_mode)
+      {
+        $query = '
+SELECT
+    DISTINCT(image_id)
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id IN ('.implode(',', $image_ids_linked).')
+    AND category_id NOT IN ('.implode(',', $ids).')
+;';
+        $image_ids_not_orphans = array_from_query($query, 'image_id');
+        $image_ids_to_delete = array_diff($image_ids_linked, $image_ids_not_orphans);
+      }
+
+      if ('force_delete' == $photo_deletion_mode)
+      {
+        $image_ids_to_delete = $image_ids_linked;
+      }
+
+      delete_elements($image_ids_to_delete, true);
+    }
+  }
+
+  // destruction of the links between images and this category
+  $query = '
+DELETE FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the access linked to the category
+  $query = '
+DELETE FROM '.USER_ACCESS_TABLE.'
+  WHERE cat_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  $query = '
+DELETE FROM '.GROUP_ACCESS_TABLE.'
+  WHERE cat_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the category
+  $query = '
+DELETE FROM '.CATEGORIES_TABLE.'
+  WHERE id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  $query='
+DELETE FROM '.OLD_PERMALINKS_TABLE.'
+  WHERE cat_id IN ('.implode(',',$ids).')';
+  pwg_query($query);
+
+  $query='
+DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
+  WHERE cat_id IN ('.implode(',',$ids).')';
+  pwg_query($query);
+
+  trigger_action('delete_categories', $ids);
+}
+
+// Deletes all files (on disk) related to given image ids
+// @return image ids where files are deleted successfully
+function delete_element_files($ids)
+{
+  global $conf;
+  if (count($ids) == 0)
+  {
+    return 0;
+  }
+
+  $new_ids = array();
+
+  $query = '
+SELECT
+    id,
+    path,
+    representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if (url_is_remote($row['path']))
+    {
+      continue;
+    }
+
+    $files = array();
+    $files[] = get_element_path($row);
+
+    if (!empty($row['representative_ext']))
+    {
+      $files[] = original_to_representative( $files[0], $row['representative_ext']);
+    }
+
+    $ok = true;
+    if (!isset($conf['never_delete_originals']))
+    {
+      foreach ($files as $path)
+      {
+        if (is_file($path) and !unlink($path))
+        {
+          $ok = false;
+          trigger_error('"'.$path.'" cannot be removed', E_USER_WARNING);
+          break;
+        }
+      }
+    }
+
+    if ($ok)
+    {
+      delete_element_derivatives($row);
+      $new_ids[] += $row['id'];
+    }
+    else
+    {
+      break;
+    }
+  }
+  return $new_ids;
+}
+
+// The function delete_elements deletes the elements identified by the
+// (numeric) values of the array $ids. It also deletes (in the database) :
+//    - all the comments related to elements
+//    - all the links between categories and elements
+//    - all the favorites associated to elements
+// @return number of deleted elements
+function delete_elements($ids, $physical_deletion=false)
+{
+  if (count($ids) == 0)
+  {
+    return 0;
+  }
+  trigger_action('begin_delete_elements', $ids);
+
+  if ($physical_deletion)
+  {
+    $ids = delete_element_files($ids);
+    if (count($ids)==0)
+    {
+      return 0;
+    }
+  }
+
+  // destruction of the comments on the image
+  $query = '
+DELETE FROM '.COMMENTS_TABLE.'
+  WHERE image_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the links between images and this category
+  $query = '
+DELETE FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the links between images and tags
+  $query = '
+DELETE FROM '.IMAGE_TAG_TABLE.'
+  WHERE image_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the favorites associated with the picture
+  $query = '
+DELETE FROM '.FAVORITES_TABLE.'
+  WHERE image_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the rates associated to this element
+  $query = '
+DELETE FROM '.RATE_TABLE.'
+  WHERE element_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the rates associated to this element
+  $query = '
+DELETE FROM '.CADDIE_TABLE.'
+  WHERE element_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // destruction of the image
+  $query = '
+DELETE FROM '.IMAGES_TABLE.'
+  WHERE id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  pwg_query($query);
+
+  // are the photo used as category representant?
+  $query = '
+SELECT
+    id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE representative_picture_id IN (
+'.wordwrap(implode(', ', $ids), 80, "\n").')
+;';
+  $category_ids = array_from_query($query, 'id');
+  if (count($category_ids) > 0)
+  {
+    update_category($category_ids);
+  }
+
+  trigger_action('delete_elements', $ids);
+  return count($ids);
+}
+
+// The delete_user function delete a user identified by the $user_id
+// It also deletes :
+//     - all the access linked to this user
+//     - all the links to any group
+//     - all the favorites linked to this user
+//     - calculated permissions linked to the user
+//     - all datas about notifications for the user
+function delete_user($user_id)
+{
+  global $conf;
+  $tables = array(
+    // destruction of the access linked to the user
+    USER_ACCESS_TABLE,
+    // destruction of data notification by mail for this user
+    USER_MAIL_NOTIFICATION_TABLE,
+    // destruction of data RSS notification for this user
+    USER_FEED_TABLE,
+    // deletion of calculated permissions linked to the user
+    USER_CACHE_TABLE,
+    // deletion of computed cache data linked to the user
+    USER_CACHE_CATEGORIES_TABLE,
+    // destruction of the group links for this user
+    USER_GROUP_TABLE,
+    // destruction of the favorites associated with the user
+    FAVORITES_TABLE,
+    // destruction of the caddie associated with the user
+    CADDIE_TABLE,
+    // deletion of piwigo specific informations
+    USER_INFOS_TABLE,
+    );
+
+  foreach ($tables as $table)
+  {
+    $query = '
+DELETE FROM '.$table.'
+  WHERE user_id = '.$user_id.'
+;';
+    pwg_query($query);
+  }
+
+  // destruction of the user
+  $query = '
+DELETE FROM '.SESSIONS_TABLE.'
+  WHERE data LIKE \'pwg_uid|i:'.(int)$user_id.';%\'
+;';
+  pwg_query($query);
+
+  // destruction of the user
+  $query = '
+DELETE FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['id'].' = '.$user_id.'
+;';
+  pwg_query($query);
+
+  trigger_action('delete_user', $user_id);
+}
+
+/**
+ * Deletes all tags linked to no photo
+ */
+function delete_orphan_tags()
+{
+  $orphan_tags = get_orphan_tags();
+
+  if (count($orphan_tags) > 0)
+  {
+    $orphan_tag_ids = array();
+    foreach ($orphan_tags as $tag)
+    {
+      array_push($orphan_tag_ids, $tag['id']);
+    }
+
+    $query = '
+DELETE
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $orphan_tag_ids).')
+;';
+    pwg_query($query);
+  }
+}
+
+/**
+ * Get all tags (id + name) linked to no photo
+ */
+function get_orphan_tags()
+{
+  $orphan_tags = array();
+
+  $query = '
+SELECT
+    id,
+    name
+  FROM '.TAGS_TABLE.'
+    LEFT JOIN '.IMAGE_TAG_TABLE.' ON id = tag_id
+  WHERE tag_id IS NULL
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($orphan_tags, $row);
+  }
+
+  return $orphan_tags;
+}
+
+/**
+ * Verifies that the representative picture really exists in the db and
+ * picks up a random represantive if possible and based on config.
+ *
+ * @param mixed category id
+ * @returns void
+ */
+function update_category($ids = 'all')
+{
+  global $conf;
+
+  if ($ids=='all')
+  {
+    $where_cats = '1=1';
+  }
+  elseif ( !is_array($ids) )
+  {
+    $where_cats = '%s='.$ids;
+  }
+  else
+  {
+    if (count($ids) == 0)
+    {
+      return false;
+    }
+    $where_cats = '%s IN('.wordwrap(implode(', ', $ids), 120, "\n").')';
+  }
+
+  // find all categories where the setted representative is not possible :
+  // the picture does not exist
+  $query = '
+SELECT DISTINCT c.id
+  FROM '.CATEGORIES_TABLE.' AS c LEFT JOIN '.IMAGES_TABLE.' AS i
+    ON c.representative_picture_id = i.id
+  WHERE representative_picture_id IS NOT NULL
+    AND '.sprintf($where_cats, 'c.id').'
+    AND i.id IS NULL
+;';
+  $wrong_representant = array_from_query($query, 'id');
+
+  if (count($wrong_representant) > 0)
+  {
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = NULL
+  WHERE id IN ('.wordwrap(implode(', ', $wrong_representant), 120, "\n").')
+;';
+    pwg_query($query);
+  }
+
+  if (!$conf['allow_random_representative'])
+  {
+    // If the random representant is not allowed, we need to find
+    // categories with elements and with no representant. Those categories
+    // must be added to the list of categories to set to a random
+    // representant.
+    $query = '
+SELECT DISTINCT id
+  FROM '.CATEGORIES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.'
+    ON id = category_id
+  WHERE representative_picture_id IS NULL
+    AND '.sprintf($where_cats, 'category_id').'
+;';
+    $to_rand = array_from_query($query, 'id');
+    if (count($to_rand) > 0)
+    {
+      set_random_representant($to_rand);
+    }
+  }
+}
+
+/**
+ * returns an array containing sub-directories which can be a category,
+ * recursive by default
+ *
+ * directories nammed "thumbnail", "pwg_high" or "pwg_representative" are
+ * omitted
+ *
+ * @param string $basedir
+ * @return array
+ */
+function get_fs_directories($path, $recursive = true)
+{
+  $dirs = array();
+
+  if (is_dir($path))
+  {
+    if ($contents = opendir($path))
+    {
+      while (($node = readdir($contents)) !== false)
+      {
+        if ($node != '.'
+            and $node != '..'
+            and $node != '.svn'
+            and $node != 'thumbnail'
+            and $node != 'pwg_high'
+            and $node != 'pwg_representative'
+            and is_dir($path.'/'.$node))
+        {
+          array_push($dirs, $path.'/'.$node);
+          if ($recursive)
+          {
+            $dirs = array_merge($dirs, get_fs_directories($path.'/'.$node));
+          }
+        }
+      }
+      closedir($contents);
+    }
+  }
+
+  return $dirs;
+}
+
+/**
+ * order categories (update categories.rank and global_rank database fields)
+ * so that rank field are consecutive integers starting at 1 for each child
+ * @return void
+ */
+function update_global_rank()
+{
+  $query = '
+SELECT id, id_uppercat, uppercats, rank, global_rank
+  FROM '.CATEGORIES_TABLE.'
+  ORDER BY id_uppercat,rank,name';
+
+  $cat_map = array();
+
+  $current_rank = 0;
+  $current_uppercat = '';
+
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if ($row['id_uppercat'] != $current_uppercat)
+    {
+      $current_rank = 0;
+      $current_uppercat = $row['id_uppercat'];
+    }
+    ++$current_rank;
+    $cat =
+      array(
+        'rank' =>        $current_rank,
+        'rank_changed' =>$current_rank!=$row['rank'],
+        'global_rank' => $row['global_rank'],
+        'uppercats' =>   $row['uppercats'],
+        );
+    $cat_map[ $row['id'] ] = $cat;
+  }
+
+  $datas = array();
+
+  foreach( $cat_map as $id=>$cat )
+  {
+    $new_global_rank = preg_replace(
+          '/(\d+)/e',
+          "\$cat_map['$1']['rank']",
+          str_replace(',', '.', $cat['uppercats'] )
+          );
+    if ( $cat['rank_changed']
+      or $new_global_rank!=$cat['global_rank']
+      )
+    {
+      $datas[] = array(
+          'id' => $id,
+          'rank' => $cat['rank'],
+          'global_rank' => $new_global_rank,
+        );
+    }
+  }
+
+  mass_updates(
+    CATEGORIES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update'  => array('rank', 'global_rank')
+      ),
+    $datas
+    );
+  return count($datas);
+}
+
+/**
+ * change the visible property on a set of categories
+ *
+ * @param array categories
+ * @param string value
+ * @return void
+ */
+function set_cat_visible($categories, $value)
+{
+  if (!in_array($value, array('true', 'false')))
+  {
+    trigger_error("set_cat_visible invalid param $value", E_USER_WARNING);
+    return false;
+  }
+
+  // unlocking a category => all its parent categories become unlocked
+  if ($value == 'true')
+  {
+    $uppercats = get_uppercat_ids($categories);
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET visible = \'true\'
+  WHERE id IN ('.implode(',', $uppercats).')';
+    pwg_query($query);
+  }
+  // locking a category   => all its child categories become locked
+  if ($value == 'false')
+  {
+    $subcats = get_subcat_ids($categories);
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET visible = \'false\'
+  WHERE id IN ('.implode(',', $subcats).')';
+    pwg_query($query);
+  }
+}
+
+/**
+ * change the status property on a set of categories : private or public
+ *
+ * @param array categories
+ * @param string value
+ * @return void
+ */
+function set_cat_status($categories, $value)
+{
+  if (!in_array($value, array('public', 'private')))
+  {
+    trigger_error("set_cat_status invalid param $value", E_USER_WARNING);
+    return false;
+  }
+
+  // make public a category => all its parent categories become public
+  if ($value == 'public')
+  {
+    $uppercats = get_uppercat_ids($categories);
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET status = \'public\'
+  WHERE id IN ('.implode(',', $uppercats).')
+;';
+    pwg_query($query);
+  }
+  // make a category private => all its child categories become private
+  if ($value == 'private')
+  {
+    $subcats = get_subcat_ids($categories);
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET status = \'private\'
+  WHERE id IN ('.implode(',', $subcats).')';
+    pwg_query($query);
+  }
+}
+
+/**
+ * returns all uppercats category ids of the given category ids
+ *
+ * @param array cat_ids
+ * @return array
+ */
+function get_uppercat_ids($cat_ids)
+{
+  if (!is_array($cat_ids) or count($cat_ids) < 1)
+  {
+    return array();
+  }
+
+  $uppercats = array();
+
+  $query = '
+SELECT uppercats
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $cat_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $uppercats = array_merge($uppercats,
+                             explode(',', $row['uppercats']));
+  }
+  $uppercats = array_unique($uppercats);
+
+  return $uppercats;
+}
+
+/**
+ * set a new random representant to the categories
+ *
+ * @param array categories
+ */
+function set_random_representant($categories)
+{
+  $datas = array();
+  foreach ($categories as $category_id)
+  {
+    $query = '
+SELECT image_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id = '.$category_id.'
+  ORDER BY '.DB_RANDOM_FUNCTION.'()
+  LIMIT 1
+;';
+    list($representative) = pwg_db_fetch_row(pwg_query($query));
+
+    array_push(
+      $datas,
+      array(
+        'id' => $category_id,
+        'representative_picture_id' => $representative,
+        )
+      );
+  }
+
+  mass_updates(
+    CATEGORIES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array('representative_picture_id')
+      ),
+    $datas
+    );
+}
+
+/**
+ * returns the fulldir for each given category id
+ *
+ * @param array cat_ids
+ * @return array
+ */
+function get_fulldirs($cat_ids)
+{
+  if (count($cat_ids) == 0)
+  {
+    return array();
+  }
+
+  // caching directories of existing categories
+  $query = '
+SELECT id, dir
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NOT NULL
+;';
+  $cat_dirs = simple_hash_from_query($query, 'id', 'dir');
+
+  // caching galleries_url
+  $query = '
+SELECT id, galleries_url
+  FROM '.SITES_TABLE.'
+;';
+  $galleries_url = simple_hash_from_query($query, 'id', 'galleries_url');
+
+  // categories : id, site_id, uppercats
+  $categories = array();
+
+  $query = '
+SELECT id, uppercats, site_id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NOT NULL
+    AND id IN (
+'.wordwrap(implode(', ', $cat_ids), 80, "\n").')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($categories, $row);
+  }
+
+  // filling $cat_fulldirs
+  $cat_fulldirs = array();
+  foreach ($categories as $category)
+  {
+    $uppercats = str_replace(',', '/', $category['uppercats']);
+    $cat_fulldirs[$category['id']] = $galleries_url[$category['site_id']];
+    $cat_fulldirs[$category['id']].= preg_replace('/(\d+)/e',
+                                                  "\$cat_dirs['$1']",
+                                                  $uppercats);
+  }
+
+  return $cat_fulldirs;
+}
+
+/**
+ * returns an array with all file system files according to
+ * $conf['file_ext']
+ *
+ * @param string $path
+ * @param bool recursive
+ * @return array
+ */
+function get_fs($path, $recursive = true)
+{
+  global $conf;
+
+  // because isset is faster than in_array...
+  if (!isset($conf['flip_picture_ext']))
+  {
+    $conf['flip_picture_ext'] = array_flip($conf['picture_ext']);
+  }
+  if (!isset($conf['flip_file_ext']))
+  {
+    $conf['flip_file_ext'] = array_flip($conf['file_ext']);
+  }
+
+  $fs['elements'] = array();
+  $fs['thumbnails'] = array();
+  $fs['representatives'] = array();
+  $subdirs = array();
+
+  if (is_dir($path))
+  {
+    if ($contents = opendir($path))
+    {
+      while (($node = readdir($contents)) !== false)
+      {
+        if ($node == '.' or $node == '..') continue;
+
+        if (is_file($path.'/'.$node))
+        {
+          $extension = get_extension($node);
+
+//          if (in_array($extension, $conf['picture_ext']))
+          if (isset($conf['flip_picture_ext'][$extension]))
+          {
+            if (basename($path) == 'thumbnail')
+            {
+              array_push($fs['thumbnails'], $path.'/'.$node);
+            }
+            else if (basename($path) == 'pwg_representative')
+            {
+              array_push($fs['representatives'], $path.'/'.$node);
+            }
+            else
+            {
+              array_push($fs['elements'], $path.'/'.$node);
+            }
+          }
+//          else if (in_array($extension, $conf['file_ext']))
+          else if (isset($conf['flip_file_ext'][$extension]))
+          {
+            array_push($fs['elements'], $path.'/'.$node);
+          }
+        }
+        else if (is_dir($path.'/'.$node) and $node != 'pwg_high' and $recursive)
+        {
+          array_push($subdirs, $node);
+        }
+      }
+    }
+    closedir($contents);
+
+    foreach ($subdirs as $subdir)
+    {
+      $tmp_fs = get_fs($path.'/'.$subdir);
+
+      $fs['elements']        = array_merge($fs['elements'],
+                                           $tmp_fs['elements']);
+
+      $fs['thumbnails']      = array_merge($fs['thumbnails'],
+                                           $tmp_fs['thumbnails']);
+
+      $fs['representatives'] = array_merge($fs['representatives'],
+                                           $tmp_fs['representatives']);
+    }
+  }
+  return $fs;
+}
+
+/**
+ * synchronize base users list and related users list
+ *
+ * compares and synchronizes base users table (USERS_TABLE) with its child
+ * tables (USER_INFOS_TABLE, USER_ACCESS, USER_CACHE, USER_GROUP) : each
+ * base user must be present in child tables, users in child tables not
+ * present in base table must be deleted.
+ *
+ * @return void
+ */
+function sync_users()
+{
+  global $conf;
+
+  $query = '
+SELECT '.$conf['user_fields']['id'].' AS id
+  FROM '.USERS_TABLE.'
+;';
+  $base_users = array_from_query($query, 'id');
+
+  $query = '
+SELECT user_id
+  FROM '.USER_INFOS_TABLE.'
+;';
+  $infos_users = array_from_query($query, 'user_id');
+
+  // users present in $base_users and not in $infos_users must be added
+  $to_create = array_diff($base_users, $infos_users);
+
+  if (count($to_create) > 0)
+  {
+    create_user_infos($to_create);
+  }
+
+  // users present in user related tables must be present in the base user
+  // table
+  $tables = array(
+    USER_MAIL_NOTIFICATION_TABLE,
+    USER_FEED_TABLE,
+    USER_INFOS_TABLE,
+    USER_ACCESS_TABLE,
+    USER_CACHE_TABLE,
+    USER_CACHE_CATEGORIES_TABLE,
+    USER_GROUP_TABLE
+    );
+
+  foreach ($tables as $table)
+  {
+    $query = '
+SELECT DISTINCT user_id
+  FROM '.$table.'
+;';
+    $to_delete = array_diff(
+      array_from_query($query, 'user_id'),
+      $base_users
+      );
+
+    if (count($to_delete) > 0)
+    {
+      $query = '
+DELETE
+  FROM '.$table.'
+  WHERE user_id in ('.implode(',', $to_delete).')
+;';
+      pwg_query($query);
+    }
+  }
+}
+
+/**
+ * updates categories.uppercats field based on categories.id +
+ * categories.id_uppercat
+ *
+ * @return void
+ */
+function update_uppercats()
+{
+  $query = '
+SELECT id, id_uppercat, uppercats
+  FROM '.CATEGORIES_TABLE.'
+;';
+  $cat_map = hash_from_query($query, 'id');
+
+  $datas = array();
+  foreach ($cat_map as $id => $cat)
+  {
+    $upper_list = array();
+
+    $uppercat = $id;
+    while ($uppercat)
+    {
+      array_push($upper_list, $uppercat);
+      $uppercat = $cat_map[$uppercat]['id_uppercat'];
+    }
+
+    $new_uppercats = implode(',', array_reverse($upper_list));
+    if ($new_uppercats != $cat['uppercats'])
+    {
+      array_push(
+        $datas,
+        array(
+          'id' => $id,
+          'uppercats' => $new_uppercats
+          )
+        );
+    }
+  }
+  $fields = array('primary' => array('id'), 'update' => array('uppercats'));
+  mass_updates(CATEGORIES_TABLE, $fields, $datas);
+}
+
+/**
+ * update images.path field
+ *
+ * @return void
+ */
+function update_path()
+{
+  $query = '
+SELECT DISTINCT(storage_category_id)
+  FROM '.IMAGES_TABLE.'
+  WHERE storage_category_id IS NOT NULL
+;';
+  $cat_ids = array_from_query($query, 'storage_category_id');
+  $fulldirs = get_fulldirs($cat_ids);
+
+  foreach ($cat_ids as $cat_id)
+  {
+    $query = '
+UPDATE '.IMAGES_TABLE.'
+  SET path = '.pwg_db_concat(array("'".$fulldirs[$cat_id]."/'",'file')).'
+  WHERE storage_category_id = '.$cat_id.'
+;';
+    pwg_query($query);
+  }
+}
+
+/**
+ * change the parent category of the given categories. The categories are
+ * supposed virtual.
+ *
+ * @param array category identifiers
+ * @param int parent category identifier
+ * @return void
+ */
+function move_categories($category_ids, $new_parent = -1)
+{
+  global $page;
+
+  if (count($category_ids) == 0)
+  {
+    return;
+  }
+
+  $new_parent = $new_parent < 1 ? 'NULL' : $new_parent;
+
+  $categories = array();
+
+  $query = '
+SELECT id, id_uppercat, status, uppercats
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $category_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $categories[$row['id']] =
+      array(
+        'parent' => empty($row['id_uppercat']) ? 'NULL' : $row['id_uppercat'],
+        'status' => $row['status'],
+        'uppercats' => $row['uppercats']
+        );
+  }
+
+  // is the movement possible? The movement is impossible if you try to move
+  // a category in a sub-category or itself
+  if ('NULL' != $new_parent)
+  {
+    $query = '
+SELECT uppercats
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$new_parent.'
+;';
+    list($new_parent_uppercats) = pwg_db_fetch_row(pwg_query($query));
+
+    foreach ($categories as $category)
+    {
+      // technically, you can't move a category with uppercats 12,125,13,14
+      // into a new parent category with uppercats 12,125,13,14,24
+      if (preg_match('/^'.$category['uppercats'].'(,|$)/', $new_parent_uppercats))
+      {
+        array_push(
+          $page['errors'],
+          l10n('You cannot move an album in its own sub album')
+          );
+        return;
+      }
+    }
+  }
+
+  $tables =
+    array(
+      USER_ACCESS_TABLE => 'user_id',
+      GROUP_ACCESS_TABLE => 'group_id'
+      );
+
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET id_uppercat = '.$new_parent.'
+  WHERE id IN ('.implode(',', $category_ids).')
+;';
+  pwg_query($query);
+
+  update_uppercats();
+  update_global_rank();
+
+  // status and related permissions management
+  if ('NULL' == $new_parent)
+  {
+    $parent_status = 'public';
+  }
+  else
+  {
+    $query = '
+SELECT status
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$new_parent.'
+;';
+    list($parent_status) = pwg_db_fetch_row(pwg_query($query));
+  }
+
+  if ('private' == $parent_status)
+  {
+    foreach ($categories as $cat_id => $category)
+    {
+      switch ($category['status'])
+      {
+        case 'public' :
+        {
+          set_cat_status(array($cat_id), 'private');
+          break;
+        }
+        case 'private' :
+        {
+          $subcats = get_subcat_ids(array($cat_id));
+
+          foreach ($tables as $table => $field)
+          {
+            $query = '
+SELECT '.$field.'
+  FROM '.$table.'
+  WHERE cat_id = '.$cat_id.'
+;';
+            $category_access = array_from_query($query, $field);
+
+            $query = '
+SELECT '.$field.'
+  FROM '.$table.'
+  WHERE cat_id = '.$new_parent.'
+;';
+            $parent_access = array_from_query($query, $field);
+
+            $to_delete = array_diff($parent_access, $category_access);
+
+            if (count($to_delete) > 0)
+            {
+              $query = '
+DELETE FROM '.$table.'
+  WHERE '.$field.' IN ('.implode(',', $to_delete).')
+    AND cat_id IN ('.implode(',', $subcats).')
+;';
+              pwg_query($query);
+            }
+          }
+          break;
+        }
+      }
+    }
+  }
+
+  array_push(
+    $page['infos'],
+    l10n_dec(
+      '%d album moved', '%d albums moved',
+      count($categories)
+      )
+    );
+}
+
+/**
+ * create a virtual category
+ *
+ * @param string category name
+ * @param int parent category id
+ * @return array with ('info' and 'id') or ('error') key
+ */
+function create_virtual_category($category_name, $parent_id=null)
+{
+  global $conf, $user;
+
+  // is the given category name only containing blank spaces ?
+  if (preg_match('/^\s*$/', $category_name))
+  {
+    return array('error' => l10n('The name of an album must not be empty'));
+  }
+
+  $parent_id = !empty($parent_id) ? $parent_id : 'NULL';
+
+  $insert = array(
+    'name' => $category_name,
+    'rank' => 0,
+    'commentable' => boolean_to_string($conf['newcat_default_commentable']),
+    );
+
+  if ($parent_id != 'NULL')
+  {
+    $query = '
+SELECT id, uppercats, global_rank, visible, status
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$parent_id.'
+;';
+    $parent = pwg_db_fetch_assoc(pwg_query($query));
+
+    $insert['id_uppercat'] = $parent['id'];
+    $insert['global_rank'] = $parent['global_rank'].'.'.$insert['rank'];
+
+    // at creation, must a category be visible or not ? Warning : if the
+    // parent category is invisible, the category is automatically create
+    // invisible. (invisible = locked)
+    if ('false' == $parent['visible'])
+    {
+      $insert['visible'] = 'false';
+    }
+    else
+    {
+      $insert['visible'] = boolean_to_string($conf['newcat_default_visible']);
+    }
+
+    // at creation, must a category be public or private ? Warning : if the
+    // parent category is private, the category is automatically create
+    // private.
+    if ('private' == $parent['status'])
+    {
+      $insert['status'] = 'private';
+    }
+    else
+    {
+      $insert['status'] = $conf['newcat_default_status'];
+    }
+  }
+  else
+  {
+    $insert['visible'] = boolean_to_string($conf['newcat_default_visible']);
+    $insert['status'] = $conf['newcat_default_status'];
+    $insert['global_rank'] = $insert['rank'];
+  }
+
+  // we have then to add the virtual category
+  mass_inserts(
+    CATEGORIES_TABLE,
+    array(
+      'site_id', 'name', 'id_uppercat', 'rank', 'commentable',
+      'visible', 'status', 'global_rank',
+      ),
+    array($insert)
+    );
+
+  $inserted_id = pwg_db_insert_id(CATEGORIES_TABLE);
+
+  $query = '
+UPDATE
+  '.CATEGORIES_TABLE.'
+  SET uppercats = \''.
+    (isset($parent) ? $parent{'uppercats'}.',' : '').
+    $inserted_id.
+    '\'
+  WHERE id = '.$inserted_id.'
+;';
+  pwg_query($query);
+
+  update_global_rank();
+
+  if ('private' == $insert['status'])
+  {
+    add_permission_on_category($inserted_id, array_unique(array_merge(get_admins(), array($user['id']))));
+  }
+
+  return array(
+    'info' => l10n('Virtual album added'),
+    'id'   => $inserted_id,
+    );
+}
+
+/**
+ * Set tags to an image. Warning: given tags are all tags associated to the
+ * image, not additionnal tags.
+ *
+ * @param array tag ids
+ * @param int image id
+ * @return void
+ */
+function set_tags($tags, $image_id)
+{
+  $query = '
+DELETE
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE image_id = '.$image_id.'
+;';
+  pwg_query($query);
+
+  if (count($tags) > 0)
+  {
+    $inserts = array();
+    foreach ($tags as $tag_id)
+    {
+      array_push(
+        $inserts,
+        array(
+          'tag_id' => $tag_id,
+          'image_id' => $image_id
+          )
+        );
+    }
+    mass_inserts(
+      IMAGE_TAG_TABLE,
+      array_keys($inserts[0]),
+      $inserts
+      );
+  }
+}
+
+/**
+ * Add new tags to a set of images.
+ *
+ * @param array tag ids
+ * @param array image ids
+ * @return void
+ */
+function add_tags($tags, $images)
+{
+  if (count($tags) == 0 or count($images) == 0)
+  {
+    return;
+  }
+
+  // we can't insert twice the same {image_id,tag_id} so we must first
+  // delete lines we'll insert later
+  $query = '
+DELETE
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE image_id IN ('.implode(',', $images).')
+    AND tag_id IN ('.implode(',', $tags).')
+;';
+  pwg_query($query);
+
+  $inserts = array();
+  foreach ($images as $image_id)
+  {
+    foreach ($tags as $tag_id)
+    {
+      array_push(
+        $inserts,
+        array(
+          'image_id' => $image_id,
+          'tag_id' => $tag_id,
+          )
+        );
+    }
+  }
+  mass_inserts(
+    IMAGE_TAG_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+/**
+ *
+ */
+function delete_tags($tag_ids)
+{
+  if (is_numeric($tag_ids))
+  {
+    $tag_ids = array($tag_ids);
+  }
+
+  if (!is_array($tag_ids))
+  {
+    return false;
+  }
+
+  $query = '
+DELETE
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE tag_id IN ('.implode(',', $tag_ids).')
+;';
+  pwg_query($query);
+
+  $query = '
+DELETE
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $tag_ids).')
+;';
+  pwg_query($query);
+}
+
+function tag_id_from_tag_name($tag_name)
+{
+  global $page;
+
+  $tag_name = trim($tag_name);
+  if (isset($page['tag_id_from_tag_name_cache'][$tag_name]))
+  {
+    return $page['tag_id_from_tag_name_cache'][$tag_name];
+  }
+
+  // does the tag already exists?
+  $query = '
+SELECT id
+  FROM '.TAGS_TABLE.'
+  WHERE name = \''.$tag_name.'\'
+;';
+  $existing_tags = array_from_query($query, 'id');
+
+  if (count($existing_tags) == 0)
+  {
+    mass_inserts(
+      TAGS_TABLE,
+      array('name', 'url_name'),
+      array(
+        array(
+          'name' => $tag_name,
+          'url_name' => trigger_event('render_tag_url', $tag_name),
+          )
+        )
+      );
+
+    $page['tag_id_from_tag_name_cache'][$tag_name] = pwg_db_insert_id(TAGS_TABLE);
+  }
+  else
+  {
+    $page['tag_id_from_tag_name_cache'][$tag_name] = $existing_tags[0];
+  }
+
+  return $page['tag_id_from_tag_name_cache'][$tag_name];
+}
+
+function set_tags_of($tags_of)
+{
+  if (count($tags_of) > 0)
+  {
+    $query = '
+DELETE
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE image_id IN ('.implode(',', array_keys($tags_of)).')
+;';
+    pwg_query($query);
+
+    $inserts = array();
+
+    foreach ($tags_of as $image_id => $tag_ids)
+    {
+      foreach ($tag_ids as $tag_id)
+      {
+        array_push(
+          $inserts,
+          array(
+            'image_id' => $image_id,
+            'tag_id' => $tag_id,
+            )
+          );
+      }
+    }
+
+    mass_inserts(
+      IMAGE_TAG_TABLE,
+      array_keys($inserts[0]),
+      $inserts
+      );
+  }
+}
+
+/**
+ * Associate a list of images to a list of categories.
+ *
+ * The function will not duplicate links
+ *
+ * @param array images
+ * @param array categories
+ * @return void
+ */
+function associate_images_to_categories($images, $categories)
+{
+  if (count($images) == 0
+      or count($categories) == 0)
+  {
+    return false;
+  }
+
+  $query = '
+DELETE
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id IN ('.implode(',', $images).')
+    AND category_id IN ('.implode(',', $categories).')
+;';
+  pwg_query($query);
+
+  $inserts = array();
+  foreach ($categories as $category_id)
+  {
+    foreach ($images as $image_id)
+    {
+      array_push(
+        $inserts,
+        array(
+          'image_id' => $image_id,
+          'category_id' => $category_id,
+          )
+        );
+    }
+  }
+
+  mass_inserts(
+    IMAGE_CATEGORY_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+
+  update_category($categories);
+}
+
+/**
+ * Disssociate images from all categories except their storage category and
+ * associate to new categories.
+ *
+ * @param array images
+ * @param array categories
+ * @return void
+ */
+function move_images_to_categories($images, $categories)
+{
+  if (count($images) == 0)
+  {
+    return false;
+  }
+  
+  // let's first break links with all albums but their "storage album"
+  $query = '
+DELETE '.IMAGE_CATEGORY_TABLE.'.*
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    JOIN '.IMAGES_TABLE.' ON image_id=id
+  WHERE id IN ('.implode(',', $images).')
+    AND (storage_category_id IS NULL OR storage_category_id != category_id)
+;';
+  pwg_query($query);
+    
+  if (is_array($categories) and count($categories) > 0)
+  {
+    associate_images_to_categories($images, $categories);
+  }
+}
+
+/**
+ * Associate images associated to a list of source categories to a list of
+ * destination categories.
+ *
+ * @param array sources
+ * @param array destinations
+ * @return void
+ */
+function associate_categories_to_categories($sources, $destinations)
+{
+  if (count($sources) == 0)
+  {
+    return false;
+  }
+
+  $query = '
+SELECT image_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id IN ('.implode(',', $sources).')
+;';
+  $images = array_from_query($query, 'image_id');
+
+  associate_images_to_categories($images, $destinations);
+}
+
+/**
+ * Refer main Piwigo URLs (currently PHPWG_DOMAIN domain)
+ *
+ * @param void
+ * @return array like $conf['links']
+ */
+function pwg_URL()
+{
+  $urls = array(
+    'HOME'       => PHPWG_URL,
+    'WIKI'       => PHPWG_URL.'/doc',
+    'DEMO'       => PHPWG_URL.'/demo',
+    'FORUM'      => PHPWG_URL.'/forum',
+    'BUGS'       => PHPWG_URL.'/bugs',
+    'EXTENSIONS' => PHPWG_URL.'/ext',
+    );
+  return $urls;
+}
+
+/**
+ * Invalidates cahed data (permissions and category counts) for all users.
+ */
+function invalidate_user_cache($full = true)
+{
+  if ($full)
+  {
+    $query = '
+TRUNCATE TABLE '.USER_CACHE_CATEGORIES_TABLE.';';
+    pwg_query($query);
+    $query = '
+TRUNCATE TABLE '.USER_CACHE_TABLE.';';
+    pwg_query($query);
+  }
+  else
+  {
+    $query = '
+UPDATE '.USER_CACHE_TABLE.'
+  SET need_update = \'true\';';
+    pwg_query($query);
+  }
+  trigger_action('invalidate_user_cache', $full);
+}
+
+/**
+ * adds the caracter set to a create table sql query.
+ * all CREATE TABLE queries must call this function
+ * @param string query - the sql query
+ */
+function create_table_add_character_set($query)
+{
+  defined('DB_CHARSET') or fatal_error('create_table_add_character_set DB_CHARSET undefined');
+  if ('DB_CHARSET'!='')
+  {
+    if ( version_compare(mysql_get_server_info(), '4.1.0', '<') )
+    {
+      return $query;
+    }
+    $charset_collate = " DEFAULT CHARACTER SET ".DB_CHARSET;
+    if (DB_COLLATE!='')
+    {
+      $charset_collate .= " COLLATE ".DB_COLLATE;
+    }
+    if ( is_array($query) )
+    {
+      foreach( $query as $id=>$q)
+      {
+        $q=trim($q);
+        $q=trim($q, ';');
+        if (preg_match('/^CREATE\s+TABLE/i',$q))
+        {
+          $q.=$charset_collate;
+        }
+        $q .= ';';
+        $query[$id] = $q;
+      }
+    }
+    else
+    {
+      $query=trim($query);
+      $query=trim($query, ';');
+      if (preg_match('/^CREATE\s+TABLE/i',$query))
+      {
+        $query.=$charset_collate;
+      }
+      $query .= ';';
+    }
+  }
+  return $query;
+}
+
+/**
+ * Returns array use on template with html_options method
+ * @param Min and Max access to use
+ * @return array of user access level
+ */
+function get_user_access_level_html_options($MinLevelAccess = ACCESS_FREE, $MaxLevelAccess = ACCESS_CLOSED)
+{
+  $tpl_options = array();
+  for ($level = $MinLevelAccess; $level <= $MaxLevelAccess; $level++)
+  {
+    $tpl_options[$level] = l10n(sprintf('ACCESS_%d', $level));
+  }
+  return $tpl_options;
+}
+
+/**
+ * returns a list of templates currently available in template-extension
+ * Each .tpl file is extracted from template-extension.
+ * @return array
+ */
+function get_extents($start='')
+{
+  if ($start == '') { $start = './template-extension'; }
+  $dir = opendir($start);
+  $extents = array();
+
+  while (($file = readdir($dir)) !== false)
+  {
+    if ( $file == '.' or $file == '..' or $file == '.svn') continue;
+    $path = $start . '/' . $file;
+    if (is_dir($path))
+    {
+      $extents = array_merge($extents, get_extents($path));
+    }
+    elseif ( !is_link($path) and file_exists($path)
+            and get_extension($path) == 'tpl' )
+    {
+      $extents[] = substr($path, 21);
+    }
+  }
+  return $extents;
+}
+
+function create_tag($tag_name)
+{
+  // does the tag already exists?
+  $query = '
+SELECT id
+  FROM '.TAGS_TABLE.'
+  WHERE name = \''.$tag_name.'\'
+;';
+  $existing_tags = array_from_query($query, 'id');
+
+  if (count($existing_tags) == 0)
+  {
+    mass_inserts(
+      TAGS_TABLE,
+      array('name', 'url_name'),
+      array(
+        array(
+          'name' => $tag_name,
+          'url_name' => trigger_event('render_tag_url', $tag_name),
+          )
+        )
+      );
+
+    $inserted_id = pwg_db_insert_id(TAGS_TABLE);
+
+    return array(
+      'info' => sprintf(
+        l10n('Tag "%s" was added'),
+        stripslashes($tag_name)
+        ),
+      'id' => $inserted_id,
+      );
+  }
+  else
+  {
+    return array(
+      'error' => sprintf(
+        l10n('Tag "%s" already exists'),
+        stripslashes($tag_name)
+        )
+      );
+  }
+}
+
+/**
+ * Is the category accessible to the (Admin) user ?
+ *
+ * Note : if the user is not authorized to see this category, category jump
+ * will be replaced by admin cat_modify page
+ *
+ * @param int category id to verify
+ * @return bool
+ */
+function cat_admin_access($category_id)
+{
+  global $user;
+
+  // $filter['visible_categories'] and $filter['visible_images']
+  // are not used because it's not necessary (filter <> restriction)
+  if (in_array($category_id, explode(',', $user['forbidden_categories'])))
+  {
+    return false;
+  }
+  return true;
+}
+
+/**
+ * Retrieve data from external URL
+ *
+ * @param string $src: URL
+ * @param global $dest: can be a file ressource or string
+ * @return bool
+ */
+function fetchRemote($src, &$dest, $get_data=array(), $post_data=array(), $user_agent='Piwigo', $step=0)
+{
+  // Try to retrieve data from local file?
+  if (!url_is_remote($src))
+  {
+    $content = @file_get_contents($src);
+    if ($content !== false)
+    {
+      is_resource($dest) ? @fwrite($dest, $content) : $dest = $content;
+      return true;
+    }
+    else
+    {
+      return false;
+    }
+  }
+
+  // After 3 redirections, return false
+  if ($step > 3) return false;
+
+  // Initialization
+  $method  = empty($post_data) ? 'GET' : 'POST';
+  $request = empty($post_data) ? '' : http_build_query($post_data, '', '&');
+  if (!empty($get_data))
+  {
+    $src .= strpos($src, '?') === false ? '?' : '&';
+    $src .= http_build_query($get_data, '', '&');
+  }
+
+  // Initialize $dest
+  is_resource($dest) or $dest = '';
+
+  // Try curl to read remote file
+  if (function_exists('curl_init'))
+  {
+    $ch = @curl_init();
+    @curl_setopt($ch, CURLOPT_URL, $src);
+    @curl_setopt($ch, CURLOPT_HEADER, 1);
+    @curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
+    @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+    if ($method == 'POST')
+    {
+      @curl_setopt($ch, CURLOPT_POST, 1);
+      @curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
+    }
+    $content = @curl_exec($ch);
+    $header_length = @curl_getinfo($ch, CURLINFO_HEADER_SIZE);
+    $status = @curl_getinfo($ch, CURLINFO_HTTP_CODE);
+    @curl_close($ch);
+    if ($content !== false and $status >= 200 and $status < 400)
+    {
+      if (preg_match('/Location:\s+?(.+)/', substr($content, 0, $header_length), $m))
+      {
+        return fetchRemote($m[1], $dest, array(), array(), $user_agent, $step+1);
+      }
+      $content = substr($content, $header_length);
+      is_resource($dest) ? @fwrite($dest, $content) : $dest = $content;
+      return true;
+    }
+  }
+
+  // Try file_get_contents to read remote file
+  if (ini_get('allow_url_fopen'))
+  {
+    $opts = array(
+      'http' => array(
+        'method' => $method,
+        'user_agent' => $user_agent,
+      )
+    );
+    if ($method == 'POST')
+    {
+      $opts['http']['content'] = $request;
+    }
+    $context = @stream_context_create($opts);
+    $content = @file_get_contents($src, false, $context);
+    if ($content !== false)
+    {
+      is_resource($dest) ? @fwrite($dest, $content) : $dest = $content;
+      return true;
+    }
+  }
+
+  // Try fsockopen to read remote file
+  $src = parse_url($src);
+  $host = $src['host'];
+  $path = isset($src['path']) ? $src['path'] : '/';
+  $path .= isset($src['query']) ? '?'.$src['query'] : '';
+
+  if (($s = @fsockopen($host,80,$errno,$errstr,5)) === false)
+  {
+    return false;
+  }
+
+  $http_request  = $method." ".$path." HTTP/1.0\r\n";
+  $http_request .= "Host: ".$host."\r\n";
+  if ($method == 'POST')
+  {
+    $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n";
+    $http_request .= "Content-Length: ".strlen($request)."\r\n";
+  }
+  $http_request .= "User-Agent: ".$user_agent."\r\n";
+  $http_request .= "Accept: */*\r\n";
+  $http_request .= "\r\n";
+  $http_request .= $request;
+
+  fwrite($s, $http_request);
+
+  $i = 0;
+  $in_content = false;
+  while (!feof($s))
+  {
+    $line = fgets($s);
+
+    if (rtrim($line,"\r\n") == '' && !$in_content)
+    {
+      $in_content = true;
+      $i++;
+      continue;
+    }
+    if ($i == 0)
+    {
+      if (!preg_match('/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/',rtrim($line,"\r\n"), $m))
+      {
+        fclose($s);
+        return false;
+      }
+      $status = (integer) $m[2];
+      if ($status < 200 || $status >= 400)
+      {
+        fclose($s);
+        return false;
+      }
+    }
+    if (!$in_content)
+    {
+      if (preg_match('/Location:\s+?(.+)$/',rtrim($line,"\r\n"),$m))
+      {
+        fclose($s);
+        return fetchRemote(trim($m[1]),$dest,array(),array(),$user_agent,$step+1);
+      }
+      $i++;
+      continue;
+    }
+    is_resource($dest) ? @fwrite($dest, $line) : $dest .= $line;
+    $i++;
+  }
+  fclose($s);
+  return true;
+}
+
+
+/**
+ * returns the groupname corresponding to the given group identifier if
+ * exists
+ *
+ * @param int group_id
+ * @return mixed
+ */
+function get_groupname($group_id)
+{
+  $query = '
+SELECT name
+  FROM '.GROUPS_TABLE.'
+  WHERE id = '.intval($group_id).'
+;';
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) > 0)
+  {
+    list($groupname) = pwg_db_fetch_row($result);
+  }
+  else
+  {
+    return false;
+  }
+
+  return $groupname;
+}
+
+/**
+ * returns the username corresponding to the given user identifier if exists
+ *
+ * @param int user_id
+ * @return mixed
+ */
+function get_username($user_id)
+{
+  global $conf;
+
+  $query = '
+SELECT '.$conf['user_fields']['username'].'
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['id'].' = '.intval($user_id).'
+;';
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) > 0)
+  {
+    list($username) = pwg_db_fetch_row($result);
+  }
+  else
+  {
+    return false;
+  }
+
+  return stripslashes($username);
+}
+
+function get_newsletter_subscribe_base_url($language) {
+  return PHPWG_URL.'/announcement/subscribe/';
+}
+
+/**
+ * Accordion menus need to know which section to open by default when
+ * loading the page
+ */
+function get_active_menu($menu_page)
+{
+  global $page;
+
+  if (isset($page['active_menu']))
+  {
+    return $page['active_menu'];
+  }
+
+  switch ($menu_page)
+  {
+    case 'photo':
+    case 'photos_add':
+    case 'rating':
+    case 'tags':
+    case 'picture_modify':
+    case 'batch_manager':
+      return 0;
+
+    case 'album':
+    case 'cat_list':
+    case 'cat_move':
+    case 'cat_options':
+    case 'permalinks':
+      return 1;
+
+    case 'user_list':
+    case 'user_perm':
+    case 'group_list':
+    case 'group_perm':
+    case 'notification_by_mail':
+      return 2;
+
+    case 'plugins':
+    case 'plugin':
+      return 3;
+
+    case 'site_manager':
+    case 'site_update':
+    case 'stats':
+    case 'history':
+    case 'maintenance':
+    case 'comments':
+    case 'updates':
+      return 4;
+
+    case 'configuration':
+    case 'derivatives':
+    case 'extend_for_templates':
+    case 'menubar':
+    case 'themes':
+    case 'theme':
+    case 'languages':
+      return 5;
+  }
+  return 0;
+}
+
+function get_taglist($query, $only_user_language=true)
+{
+  $result = pwg_query($query);
+
+  $taglist = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if (!$only_user_language and preg_match_all('#\[lang=(.*?)\](.*?)\[/lang\]#is', $row['name'], $matches))
+    {
+      foreach ($matches[2] as $tag_name)
+      {
+        array_push(
+          $taglist,
+          array(
+            'name' => trigger_event('render_tag_name', $tag_name),
+            'id' => '~~'.$row['id'].'~~',
+            )
+          );
+      }
+
+      $row['name'] = preg_replace('#\[lang=(.*?)\](.*?)\[/lang\]#is', null, $row['name']);
+    }
+
+    if (strlen($row['name']) > 0)
+    {
+      array_push(
+        $taglist,
+        array(
+          'name' => trigger_event('render_tag_name', $row['name']),
+          'id' => '~~'.$row['id'].'~~',
+          )
+        );
+    }
+  }
+
+  $cmp = create_function('$a,$b', 'return strcasecmp($a["name"], $b["name"]);');
+  usort($taglist, $cmp);
+
+  return $taglist;
+}
+
+function get_tag_ids($raw_tags, $allow_create=true)
+{
+  // In $raw_tags we receive something like array('~~6~~', '~~59~~', 'New
+  // tag', 'Another new tag') The ~~34~~ means that it is an existing
+  // tag. I've added the surrounding ~~ to permit creation of tags like "10"
+  // or "1234" (numeric characters only)
+
+  $tag_ids = array();
+  $raw_tags = explode(',',$raw_tags);
+
+  foreach ($raw_tags as $raw_tag)
+  {
+    if (preg_match('/^~~(\d+)~~$/', $raw_tag, $matches))
+    {
+      array_push($tag_ids, $matches[1]);
+    }
+    elseif ($allow_create)
+    {
+      // we have to create a new tag
+      $tag_ids[] = tag_id_from_tag_name($raw_tag);
+    }
+  }
+
+  return $tag_ids;
+}
+
+/** returns the argument_ids array with new sequenced keys based on related
+ * names. Sequence is not case sensitive.
+ * Warning: By definition, this function breaks original keys
+ */
+function order_by_name($element_ids,$name)
+{
+  $ordered_element_ids = array();
+  foreach ($element_ids as $k_id => $element_id)
+  {
+    $key = strtolower($name[$element_id]) .'-'. $name[$element_id] .'-'. $k_id;
+    $ordered_element_ids[$key] = $element_id;
+  }
+  ksort($ordered_element_ids);
+  return $ordered_element_ids;
+}
+
+function add_permission_on_category($category_ids, $user_ids)
+{
+  // array-ify categories and users
+  if (!is_array($category_ids))
+  {
+    $category_ids = array($category_ids);
+  }
+
+  if (!is_array($user_ids))
+  {
+    $user_ids = array($user_ids);
+  }
+
+  // check for emptiness
+  if (count($category_ids) == 0 or count($user_ids) == 0)
+  {
+    return;
+  }
+
+  // make sure categories are private and select uppercats or subcats
+  $cat_ids = (isset($_POST['apply_on_sub'])) ? implode(',', get_subcat_ids($category_ids)).",".implode(',', get_uppercat_ids($category_ids)) : implode(',', get_uppercat_ids($category_ids));
+  $query = '
+SELECT
+    id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.$cat_ids.')
+    AND status = \'private\'
+;';
+  $private_cats = array_from_query($query, 'id');
+
+  if (count($private_cats) == 0)
+  {
+    return;
+  }
+
+  // We must not reinsert already existing lines in user_access table
+  $granteds = array();
+  foreach ($private_cats as $cat_id)
+  {
+    $granteds[$cat_id] = array();
+  }
+
+  $query = '
+SELECT
+    user_id,
+    cat_id
+  FROM '.USER_ACCESS_TABLE.'
+  WHERE cat_id IN ('.implode(',', $private_cats).')
+    AND user_id IN ('.implode(',', $user_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($granteds[$row['cat_id']], $row['user_id']);
+  }
+
+  $inserts = array();
+
+  foreach ($private_cats as $cat_id)
+  {
+    $grant_to_users = array_diff($user_ids, $granteds[$cat_id]);
+
+    foreach ($grant_to_users as $user_id)
+    {
+      array_push(
+        $inserts,
+        array(
+          'user_id' => $user_id,
+          'cat_id' => $cat_id
+          )
+        );
+    }
+  }
+
+  if (count($inserts) > 0)
+  {
+    mass_inserts(USER_ACCESS_TABLE, array_keys($inserts[0]), $inserts);
+  }
+}
+
+
+function get_admins($include_webmaster=true)
+{
+  $status_list = array('admin');
+
+  if ($include_webmaster)
+  {
+    $status_list[] = 'webmaster';
+  }
+
+  $query = '
+SELECT
+    user_id
+  FROM '.USER_INFOS_TABLE.'
+  WHERE status in (\''.implode("','", $status_list).'\')
+;';
+
+  return array_from_query($query, 'user_id');
+}
+
+/** delete all derivative files for one or several types */
+function clear_derivative_cache($types='all')
+{
+  $pattern='#.*-';
+  if ($types == 'all')
+  {
+    $types = ImageStdParams::get_all_types();
+    $types[] = IMG_CUSTOM;
+  }
+  elseif (!is_array($types))
+  {
+    $types = array($types);
+  }
+
+  if (count($types)>1)
+  {
+    $type_urls = array();
+    foreach($types as $dtype)
+    {
+      $type_urls[] = derivative_to_url($dtype);
+    }
+    $pattern .= '(' . implode('|',$type_urls) . ')';
+  }
+  else
+  {
+    $pattern .= derivative_to_url($types[0]);
+  }
+
+  $pattern.='(_[a-zA-Z0-9]+)*\.[a-zA-Z0-9]{3,4}$#';
+  if ($contents = @opendir(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR))
+  {
+    while (($node = readdir($contents)) !== false)
+    {
+      if ($node != '.'
+          and $node != '..'
+          and is_dir(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$node))
+      {
+        clear_derivative_cache_rec(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$node, $pattern);
+      }
+    }
+    closedir($contents);
+  }
+}
+
+function clear_derivative_cache_rec($path, $pattern)
+{
+  $rmdir = true;
+  $rm_index = false;
+
+  if ($contents = opendir($path))
+  {
+    while (($node = readdir($contents)) !== false)
+    {
+      if ($node == '.' or $node == '..')
+        continue;
+      if (is_dir($path.'/'.$node))
+      {
+        $rmdir &= clear_derivative_cache_rec($path.'/'.$node, $pattern);
+      }
+      else
+      {
+        if (preg_match($pattern, $node))
+        {
+          unlink($path.'/'.$node);
+        }
+        elseif ($node=='index.htm')
+        {
+          $rm_index = true;
+        }
+        else
+        {
+          $rmdir = false;
+        }
+      }
+    }
+    closedir($contents);
+
+    if ($rmdir)
+    {
+      if ($rm_index)
+      {
+        unlink($path.'/index.htm');
+      }
+      clearstatcache();
+      @rmdir($path);
+    }
+    return $rmdir;
+  }
+}
+
+function delete_element_derivatives($infos, $type='all')
+{
+  $path = $infos['path'];
+  if (!empty($infos['representative_ext']))
+  {
+    $path = original_to_representative( $path, $infos['representative_ext']);
+  }
+  if (substr_compare($path, '../', 0, 3)==0)
+  {
+    $path = substr($path, 3);
+  }
+  $dot = strrpos($path, '.');
+  if ($type=='all')
+  {
+    $pattern = '-*';
+  }
+  else
+  {
+    $pattern = '-'.derivative_to_url($type).'*';
+  }
+  $path = substr_replace($path, $pattern, $dot, 0);
+  foreach( glob(PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$path) as $file)
+  {
+    @unlink($file);
+  }
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions_history.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_history.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_history.inc.php	(revision 14585)
@@ -0,0 +1,179 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+function history_tabsheet()
+{
+  global $page, $link_start;
+
+  // TabSheet
+  $tabsheet = new tabsheet();
+  // TabSheet initialization
+  $tabsheet->add('stats', l10n('Statistics'), $link_start.'stats');
+  $tabsheet->add('history', l10n('Search'), $link_start.'history');
+  // TabSheet selection
+  $tabsheet->select($page['page']);
+  // Assign tabsheet to template
+  $tabsheet->assign();
+}
+
+function history_compare($a, $b)
+{
+  return strcmp($a['date'].$a['time'], $b['date'].$b['time']);
+}
+
+function get_history($data, $search, $types)
+{
+  if (isset($search['fields']['filename']))
+  {
+    $query = '
+SELECT
+    id
+  FROM '.IMAGES_TABLE.'
+  WHERE file LIKE \''.$search['fields']['filename'].'\'
+;';
+    $search['image_ids'] = array_from_query($query, 'id');
+  }
+  
+  // echo '<pre>'; print_r($search); echo '</pre>';
+  
+  $clauses = array();
+
+  if (isset($search['fields']['date-after']))
+  {
+    array_push(
+      $clauses,
+      "date >= '".$search['fields']['date-after']."'"
+      );
+  }
+
+  if (isset($search['fields']['date-before']))
+  {
+    array_push(
+      $clauses,
+      "date <= '".$search['fields']['date-before']."'"
+      );
+  }
+
+  if (isset($search['fields']['types']))
+  {
+    $local_clauses = array();
+    
+    foreach ($types as $type) {
+      if (in_array($type, $search['fields']['types'])) {
+        $clause = 'image_type ';
+        if ($type == 'none')
+        {
+          $clause.= 'IS NULL';
+        }
+        else
+        {
+          $clause.= "= '".$type."'";
+        }
+        
+        array_push($local_clauses, $clause);
+      }
+    }
+    
+    if (count($local_clauses) > 0)
+    {
+      array_push(
+        $clauses,
+        implode(' OR ', $local_clauses)
+        );
+    }
+  }
+
+  if (isset($search['fields']['user'])
+      and $search['fields']['user'] != -1)
+  {
+    array_push(
+      $clauses,
+      'user_id = '.$search['fields']['user']
+      );
+  }
+
+  if (isset($search['fields']['image_id']))
+  {
+    array_push(
+      $clauses,
+      'image_id = '.$search['fields']['image_id']
+      );
+  }
+  
+  if (isset($search['fields']['filename']))
+  {
+    if (count($search['image_ids']) == 0)
+    {
+      // a clause that is always false
+      array_push($clauses, '1 = 2 ');
+    }
+    else
+    {
+      array_push(
+        $clauses,
+        'image_id IN ('.implode(', ', $search['image_ids']).')'
+        );
+    }
+  }
+  
+  $clauses = prepend_append_array_items($clauses, '(', ')');
+
+  $where_separator =
+    implode(
+      "\n    AND ",
+      $clauses
+      );
+  
+  $query = '
+SELECT
+    date,
+    time,
+    user_id,
+    IP,
+    section,
+    category_id,
+    tag_ids,
+    image_id,
+    image_type
+  FROM '.HISTORY_TABLE.'
+  WHERE '.$where_separator.'
+;';
+
+  // LIMIT '.$conf['nb_logs_page'].' OFFSET '.$page['start'].'
+
+  $result = pwg_query($query);
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($data, $row);
+  }
+
+  return $data;
+}
+
+add_event_handler('get_history', 'get_history', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
+trigger_action('functions_history_included');
+
+?>
Index: tags/2.4.0RC3/admin/include/functions_install.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_install.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_install.inc.php	(revision 14585)
@@ -0,0 +1,161 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * loads an sql file and executes all queries
+ *
+ * Before executing a query, $replaced is... replaced by $replacing. This is
+ * useful when the SQL file contains generic words. Drop table queries are
+ * not executed.
+ *
+ * @param string filepath
+ * @param string replaced
+ * @param string replacing
+ * @return void
+ */
+function execute_sqlfile($filepath, $replaced, $replacing, $dblayer)
+{
+  $sql_lines = file($filepath);
+  $query = '';
+  foreach ($sql_lines as $sql_line)
+  {
+    $sql_line = trim($sql_line);
+    if (preg_match('/(^--|^$)/', $sql_line))
+    {
+      continue;
+    }
+    $query.= ' '.$sql_line;
+    // if we reached the end of query, we execute it and reinitialize the
+    // variable "query"
+    if (preg_match('/;$/', $sql_line))
+    {
+      $query = trim($query);
+      $query = str_replace($replaced, $replacing, $query);
+      // we don't execute "DROP TABLE" queries
+      if (!preg_match('/^DROP TABLE/i', $query))
+      {
+        if ('mysql' == $dblayer)
+        {
+          if ( preg_match('/^(CREATE TABLE .*)[\s]*;[\s]*/im', $query, $matches) )
+          {
+            $query = $matches[1].' DEFAULT CHARACTER SET utf8'.';';
+          }
+        }
+        pwg_query($query);
+      }
+      $query = '';
+    }
+  }
+}
+
+/**
+ * Search for database engines available
+ *
+ * We search for functions_DATABASE_ENGINE.inc.php 
+ * and we check if the connect function for that database exists 
+ *
+ * @return array
+ */
+function available_engines()
+{
+  $engines = array();
+
+  $pattern = PHPWG_ROOT_PATH. 'include/dblayer/functions_%s.inc.php';
+  include_once PHPWG_ROOT_PATH. 'include/dblayer/dblayers.inc.php';
+
+  foreach ($dblayers as $engine_name => $engine)
+  {
+    if (file_exists(sprintf($pattern, $engine_name))) 
+    {
+      $engines[$engine_name]['label'] = $engine['engine'];
+      $engines[$engine_name]['available'] = false;
+
+      if (isset($engine['function_available'])
+	  && function_exists($engine['function_available']))
+      {
+	$engines[$engine_name]['available'] = true;
+      }
+      elseif (isset($engine['class_available']) 
+	      && class_exists($engine['class_available']))
+      {
+	$engines[$engine_name]['available'] = true;
+      } 
+    }
+  }
+
+  if ($engines['sqlite']['available'] and !$engines['pdo-sqlite']['available'])
+  {
+    unset($engines['pdo-sqlite']);
+  }
+  elseif ($engines['pdo-sqlite']['available'] and !$engines['sqlite']['available'])
+  {
+    unset($engines['sqlite']);
+  }
+  elseif (DEFAULT_DB_SQLITE=='native')
+  {
+    unset($engines['pdo-sqlite']);
+  }
+  else
+  {
+    unset($engines['sqlite']);
+  }
+
+  return $engines;
+}
+
+/**
+ * Automatically activate all core themes in the "themes" directory.
+ *
+ * @return void
+ */
+function activate_core_themes()
+{
+  include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+  $themes = new themes();
+  foreach ($themes->fs_themes as $theme_id => $fs_theme)
+  {
+    if (in_array($theme_id, array('elegant', 'Sylvia', 'clear', 'dark', 'smartpocket')))
+    {
+      $themes->perform_action('activate', $theme_id);
+    }
+  }
+}
+
+function install_db_connect(&$infos, &$errors)
+{
+  global $pwg_db_link;
+  
+  try
+  {
+    $pwg_db_link = pwg_db_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpasswd'], $_POST['dbname']);
+    if ($pwg_db_link)
+    {
+      pwg_db_check_version();
+    }
+  }
+  catch (Exception $e)
+  {
+    array_push( $errors, l10n($e->getMessage()));
+  }
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions_metadata.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_metadata.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_metadata.php	(revision 14585)
@@ -0,0 +1,322 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
+
+
+function get_sync_iptc_data($file)
+{
+  global $conf;
+
+  $map = $conf['use_iptc_mapping'];
+
+  $iptc = get_iptc_data($file, $map);
+
+  foreach ($iptc as $pwg_key => $value)
+  {
+    if (in_array($pwg_key, array('date_creation', 'date_available')))
+    {
+      if (preg_match('/(\d{4})(\d{2})(\d{2})/', $value, $matches))
+      {
+        $year = $matches[1];
+        $month = $matches[2];
+        $day = $matches[3];
+
+        if (!checkdate($month, $day, $year))
+        {
+          // we suppose the year is correct
+          $month = 1;
+          $day = 1;
+        }
+
+        $iptc[$pwg_key] = $year.'-'.$month.'-'.$day;
+      }
+    }
+  }
+
+  if (isset($iptc['keywords']))
+  {
+    // official keywords separator is the comma
+    $iptc['keywords'] = preg_replace('/[.;]/', ',', $iptc['keywords']);
+    $iptc['keywords'] = preg_replace('/,+/', ',', $iptc['keywords']);
+    $iptc['keywords'] = preg_replace('/^,+|,+$/', '', $iptc['keywords']);
+
+    $iptc['keywords'] = implode(
+      ',',
+      array_unique(
+        explode(
+          ',',
+          $iptc['keywords']
+          )
+        )
+      );
+  }
+
+  foreach ($iptc as $pwg_key => $value)
+  {
+    $iptc[$pwg_key] = addslashes($iptc[$pwg_key]);
+  }
+
+  return $iptc;
+}
+
+function get_sync_exif_data($file)
+{
+  global $conf;
+
+  $exif = get_exif_data($file, $conf['use_exif_mapping']);
+
+  foreach ($exif as $pwg_key => $value)
+  {
+    if (in_array($pwg_key, array('date_creation', 'date_available')))
+    {
+      if (preg_match('/^(\d{4}).(\d{2}).(\d{2}) (\d{2}).(\d{2}).(\d{2})/', $value, $matches))
+      {
+        $exif[$pwg_key] = $matches[1].'-'.$matches[2].'-'.$matches[3].' '.$matches[4].':'.$matches[5].':'.$matches[6];
+      }
+      elseif (preg_match('/^(\d{4}).(\d{2}).(\d{2})/', $value, $matches))
+      {
+        $exif[$pwg_key] = $matches[1].'-'.$matches[2].'-'.$matches[3];
+      }
+      else
+      {
+        unset($exif[$pwg_key]);
+        continue;
+      }
+    }
+    $exif[$pwg_key] = addslashes($exif[$pwg_key]);
+  }
+
+  return $exif;
+}
+
+
+function get_sync_metadata_attributes()
+{
+  global $conf;
+
+  $update_fields = array('filesize', 'width', 'height');
+
+  if ($conf['use_exif'])
+  {
+    $update_fields =
+      array_merge(
+        $update_fields,
+        array_keys($conf['use_exif_mapping'])
+        );
+  }
+
+  if ($conf['use_iptc'])
+  {
+    $update_fields =
+      array_merge(
+        $update_fields,
+        array_keys($conf['use_iptc_mapping'])
+        );
+  }
+
+  return array_unique($update_fields);
+}
+
+function get_sync_metadata($infos)
+{
+  global $conf;
+  $file = PHPWG_ROOT_PATH.$infos['path'];
+  $fs = @filesize($file);
+
+  if ($fs===false)
+  {
+    return false;
+  }
+
+  $infos['filesize'] = floor($fs/1024);
+
+  if (isset($infos['representative_ext']))
+  {
+    $file = original_to_representative($file, $infos['representative_ext']);
+  }
+
+  if ($image_size = @getimagesize($file))
+  {
+    $infos['width'] = $image_size[0];
+    $infos['height'] = $image_size[1];
+  }
+
+  if ($conf['use_exif'])
+  {
+    $exif = get_sync_exif_data($file);
+    $infos = array_merge($infos, $exif);
+  }
+
+  if ($conf['use_iptc'])
+  {
+    $iptc = get_sync_iptc_data($file);
+    $infos = array_merge($infos, $iptc);
+  }
+
+  return $infos;
+}
+
+
+function sync_metadata($ids)
+{
+  global $conf;
+
+  if (!defined('CURRENT_DATE'))
+  {
+    define('CURRENT_DATE', date('Y-m-d'));
+  }
+
+  $datas = array();
+  $tags_of = array();
+
+  $query = '
+SELECT id, path, representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN (
+'.wordwrap(implode(', ', $ids), 160, "\n").'
+)
+;';
+
+  $result = pwg_query($query);
+  while ($data = pwg_db_fetch_assoc($result))
+  {
+    $data = get_sync_metadata($data);
+    if ($data === false)
+    {
+      continue;
+    }
+
+    $id = $data['id'];
+    foreach (array('keywords', 'tags') as $key)
+    {
+      if (isset($data[$key]))
+      {
+        if (!isset($tags_of[$id]))
+        {
+          $tags_of[$id] = array();
+        }
+
+        foreach (explode(',', $data[$key]) as $tag_name)
+        {
+          array_push(
+            $tags_of[$id],
+            tag_id_from_tag_name($tag_name)
+            );
+        }
+      }
+    }
+
+    $data['date_metadata_update'] = CURRENT_DATE;
+
+    array_push($datas, $data);
+  }
+
+  if (count($datas) > 0)
+  {
+    $update_fields = get_sync_metadata_attributes();
+    array_push($update_fields, 'date_metadata_update');
+
+    $update_fields = array_diff(
+      $update_fields,
+      array('tags', 'keywords')
+            );
+
+    mass_updates(
+      IMAGES_TABLE,
+      array(
+        'primary' => array('id'),
+        'update'  => $update_fields
+        ),
+      $datas,
+      MASS_UPDATES_SKIP_EMPTY
+      );
+  }
+
+  set_tags_of($tags_of);
+}
+
+/**
+ * returns an array associating element id (images.id) with its complete
+ * path in the filesystem
+ *
+ * @param int id_uppercat
+ * @param int site_id
+ * @param boolean recursive ?
+ * @param boolean only newly added files ?
+ * @return array
+ */
+function get_filelist($category_id = '', $site_id=1, $recursive = false,
+                      $only_new = false)
+{
+  // filling $cat_ids : all categories required
+  $cat_ids = array();
+
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE site_id = '.$site_id.'
+    AND dir IS NOT NULL';
+  if (is_numeric($category_id))
+  {
+    if ($recursive)
+    {
+      $query.= '
+    AND uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$category_id.'(,|$)\'
+';
+    }
+    else
+    {
+      $query.= '
+    AND id = '.$category_id.'
+';
+    }
+  }
+  $query.= '
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($cat_ids, $row['id']);
+  }
+
+  if (count($cat_ids) == 0)
+  {
+    return array();
+  }
+
+  $query = '
+SELECT id, path, representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE storage_category_id IN ('.implode(',', $cat_ids).')';
+  if ($only_new)
+  {
+    $query.= '
+    AND date_metadata_update IS NULL
+';
+  }
+  $query.= '
+;';
+  return hash_from_query($query, 'id');
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions_notification_by_mail.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_notification_by_mail.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_notification_by_mail.inc.php	(revision 14585)
@@ -0,0 +1,530 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/* nbm_global_var */
+$env_nbm = array
+          (
+            'start_time' => get_moment(),
+            'sendmail_timeout' => (intval(ini_get('max_execution_time')) * $conf['nbm_max_treatment_timeout_percent']),
+            'is_sendmail_timeout' => false
+          );
+
+if
+  (
+    (!isset($env_nbm['sendmail_timeout'])) or
+    (!is_numeric($env_nbm['sendmail_timeout'])) or
+    ($env_nbm['sendmail_timeout'] <= 0)
+  )
+{
+  $env_nbm['sendmail_timeout'] = $conf['nbm_treatment_timeout_default'];
+}
+
+/*
+ * Search an available check_key
+ *
+ * It's a copy of function find_available_feed_id
+ *
+ * @return string nbm identifier
+ */
+function find_available_check_key()
+{
+  while (true)
+  {
+    $key = generate_key(16);
+    $query = '
+select
+  count(*)
+from
+  '.USER_MAIL_NOTIFICATION_TABLE.'
+where
+  check_key = \''.$key.'\';';
+
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    if ($count == 0)
+    {
+      return $key;
+    }
+  }
+}
+
+/*
+ * Check sendmail timeout state
+ *
+ * @return true, if it's timeout
+ */
+function check_sendmail_timeout()
+{
+  global $env_nbm;
+
+  $env_nbm['is_sendmail_timeout'] = ((get_moment() - $env_nbm['start_time']) > $env_nbm['sendmail_timeout']);
+
+  return $env_nbm['is_sendmail_timeout'];
+}
+
+
+/*
+ * Add quote to all elements of check_key_list
+ *
+ * @return quoted check key list
+ */
+function quote_check_key_list($check_key_list = array())
+{
+  return array_map(create_function('$s', 'return \'\\\'\'.$s.\'\\\'\';'), $check_key_list);
+}
+
+/*
+ * Execute all main queries to get list of user
+ *
+ * Type are the type of list 'subscribe', 'send'
+ *
+ * return array of users
+ */
+function get_user_notifications($action, $check_key_list = array(), $enabled_filter_value = '')
+{
+  global $conf;
+
+  $data_users = array();
+
+  if (in_array($action, array('subscribe', 'send')))
+  {
+    $quoted_check_key_list = quote_check_key_list($check_key_list);
+    if (count($quoted_check_key_list) != 0 )
+    {
+      $query_and_check_key = ' and
+    check_key in ('.implode(",", $quoted_check_key_list).') ';
+    }
+    else
+    {
+      $query_and_check_key = '';
+    }
+
+    $query = '
+select
+  N.user_id,
+  N.check_key,
+  U.'.$conf['user_fields']['username'].' as username,
+  U.'.$conf['user_fields']['email'].' as mail_address,
+  N.enabled,
+  N.last_send
+from
+  '.USER_MAIL_NOTIFICATION_TABLE.' as N,
+  '.USERS_TABLE.' as U
+where
+  N.user_id =  U.'.$conf['user_fields']['id'];
+
+    if ($action == 'send')
+    {
+      // No mail empty and all users enabled
+      $query .= ' and
+  N.enabled = \'true\' and
+  U.'.$conf['user_fields']['email'].' is not null';
+    }
+
+    $query .= $query_and_check_key;
+
+    if (isset($enabled_filter_value) and ($enabled_filter_value != ''))
+    {
+      $query .= ' and
+        N.enabled = \''.boolean_to_string($enabled_filter_value).'\'';
+    }
+
+    $query .= '
+order by';
+
+    if ($action == 'send')
+    {
+      $query .= '
+  last_send, username;';
+    }
+    else
+    {
+      $query .= '
+  username;';
+    }
+
+    $query .= ';';
+
+    $result = pwg_query($query);
+    if (!empty($result))
+    {
+      while ($nbm_user = pwg_db_fetch_assoc($result))
+      {
+        array_push($data_users, $nbm_user);
+      }
+    }
+  }
+  return $data_users;
+}
+
+/*
+ * Begin of use nbm environment
+ * Prepare and save current environment and initialize data in order to send mail
+ *
+ * Return none
+ */
+function begin_users_env_nbm($is_to_send_mail = false)
+{
+  global $user, $lang, $lang_info, $conf, $env_nbm;
+
+  // Save $user, $lang_info and $lang arrays (include/user.inc.php has been executed)
+  $env_nbm['save_user'] = $user;
+  // Save current language to stack, necessary because $user change during NBM
+  switch_lang_to($user['language']);
+
+  $env_nbm['is_to_send_mail'] = $is_to_send_mail;
+
+  if ($is_to_send_mail)
+  {
+    // Init mail configuration
+    $env_nbm['email_format'] = get_str_email_format($conf['nbm_send_html_mail']);
+    $env_nbm['send_as_name'] = ((isset($conf['nbm_send_mail_as']) and !empty($conf['nbm_send_mail_as'])) ? $conf['nbm_send_mail_as'] : get_mail_sender_name());
+    $env_nbm['send_as_mail_address'] = get_webmaster_mail_address();
+    $env_nbm['send_as_mail_formated'] = format_email($env_nbm['send_as_name'], $env_nbm['send_as_mail_address']);
+    // Init mail counter
+    $env_nbm['error_on_mail_count'] = 0;
+    $env_nbm['sent_mail_count'] = 0;
+    // Save sendmail message info and error in the original language
+    $env_nbm['msg_info'] = l10n('Mail sent to %s [%s].');
+    $env_nbm['msg_error'] = l10n('Error when sending email to %s [%s].');
+  }
+}
+
+/*
+ * End of use nbm environment
+ * Restore environment
+ *
+ * Return none
+ */
+function end_users_env_nbm()
+{
+  global $user, $lang, $lang_info, $env_nbm;
+
+  // Restore $user, $lang_info and $lang arrays (include/user.inc.php has been executed)
+  $user = $env_nbm['save_user'];
+  // Restore current language to stack, necessary because $user change during NBM
+  switch_lang_back();
+
+  if ($env_nbm['is_to_send_mail'])
+  {
+    unset($env_nbm['email_format']);
+    unset($env_nbm['send_as_name']);
+    unset($env_nbm['send_as_mail_address']);
+    unset($env_nbm['send_as_mail_formated']);
+    // Don t unset counter
+    //unset($env_nbm['error_on_mail_count']);
+    //unset($env_nbm['sent_mail_count']);
+    unset($env_nbm['msg_info']);
+    unset($env_nbm['msg_error']);
+  }
+
+  unset($env_nbm['save_user']);
+  unset($env_nbm['is_to_send_mail']);
+}
+
+/*
+ * Set user on nbm enviromnent
+ *
+ * Return none
+ */
+function set_user_on_env_nbm(&$nbm_user, $is_action_send)
+{
+  global $user, $lang, $lang_info, $env_nbm;
+
+  $user = build_user( $nbm_user['user_id'], true );
+
+  switch_lang_to($user['language']);
+
+  if ($is_action_send)
+  {
+    $nbm_user['theme'] = $user['theme'];
+    $env_nbm['mail_template'] = get_mail_template($env_nbm['email_format'], $nbm_user['theme']);
+    $env_nbm['mail_template']->set_filename('notification_by_mail', 'notification_by_mail.tpl');
+  }
+}
+
+/*
+ * Unset user on nbm enviromnent
+ *
+ * Return none
+ */
+function unset_user_on_env_nbm()
+{
+  global $env_nbm;
+
+  switch_lang_back();
+  unset($env_nbm['mail_template']);
+}
+
+/*
+ * Inc Counter success
+ *
+ * Return none
+ */
+function inc_mail_sent_success($nbm_user)
+{
+  global $page, $env_nbm;
+
+  $env_nbm['sent_mail_count'] += 1;
+  array_push($page['infos'], sprintf($env_nbm['msg_info'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+}
+
+/*
+ * Inc Counter failed
+ *
+ * Return none
+ */
+function inc_mail_sent_failed($nbm_user)
+{
+  global $page, $env_nbm;
+
+  $env_nbm['error_on_mail_count'] += 1;
+  array_push($page['errors'], sprintf($env_nbm['msg_error'], stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+}
+
+/*
+ * Display Counter Info
+ *
+ * Return none
+ */
+function display_counter_info()
+{
+  global $page, $env_nbm;
+
+  if ($env_nbm['error_on_mail_count'] != 0)
+  {
+    array_push($page['errors'], l10n_dec('%d mail was not sent.', '%d mails were not sent.', $env_nbm['error_on_mail_count']));
+    if ($env_nbm['sent_mail_count'] != 0)
+      array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
+  }
+  else
+  {
+    if ($env_nbm['sent_mail_count'] == 0)
+      array_push($page['infos'], l10n('No mail to send.'));
+    else
+      array_push($page['infos'], l10n_dec('%d mail was sent.', '%d mails were sent.', $env_nbm['sent_mail_count']));
+  }
+}
+
+function assign_vars_nbm_mail_content($nbm_user)
+{
+  global $env_nbm;
+
+  set_make_full_url();
+
+  $env_nbm['mail_template']->assign
+  (
+    array
+    (
+      'USERNAME' => stripslashes($nbm_user['username']),
+
+      'SEND_AS_NAME' => $env_nbm['send_as_name'],
+
+      'UNSUBSCRIBE_LINK' => add_url_params(get_gallery_home_url().'/nbm.php', array('unsubscribe' => $nbm_user['check_key'])),
+      'SUBSCRIBE_LINK' => add_url_params(get_gallery_home_url().'/nbm.php', array('subscribe' => $nbm_user['check_key'])),
+      'CONTACT_EMAIL' => $env_nbm['send_as_mail_address']
+    )
+  );
+
+  unset_make_full_url();
+}
+
+/*
+ * Subscribe or unsubscribe notification by mail
+ *
+ * is_subscribe define if action=subscribe or unsubscribe
+ * check_key list where action will be done
+ *
+ * @return check_key list treated
+ */
+function do_subscribe_unsubscribe_notification_by_mail($is_admin_request, $is_subscribe = false, $check_key_list = array())
+{
+  global $conf, $page, $env_nbm, $conf;
+
+  set_make_full_url();
+
+  $check_key_treated = array();
+  $updated_data_count = 0;
+  $error_on_updated_data_count = 0;
+
+  if ($is_subscribe)
+  {
+    $msg_info = l10n('User %s [%s] was added to the subscription list.');
+    $msg_error = l10n('User %s [%s] was not added to the subscription list.');
+  }
+  else
+  {
+    $msg_info = l10n('User %s [%s] was removed from the subscription list.');
+    $msg_error = l10n('User %s [%s] was not removed from the subscription list.');
+  }
+
+  if (count($check_key_list) != 0)
+  {
+    $updates = array();
+    $enabled_value = boolean_to_string($is_subscribe);
+    $data_users = get_user_notifications('subscribe', $check_key_list, !$is_subscribe);
+
+    // Prepare message after change language
+    $msg_break_timeout = l10n('Time to send mail is limited. Others mails are skipped.');
+
+    // Begin nbm users environment
+    begin_users_env_nbm(true);
+
+    foreach ($data_users as $nbm_user)
+    {
+      if (check_sendmail_timeout())
+      {
+        // Stop fill list on 'send', if the quota is override
+        array_push($page['errors'], $msg_break_timeout);
+        break;
+      }
+
+      // Fill return list
+      array_push($check_key_treated, $nbm_user['check_key']);
+
+      $do_update = true;
+      if ($nbm_user['mail_address'] != '')
+      {
+        // set env nbm user
+        set_user_on_env_nbm($nbm_user, true);
+
+        $subject = '['.$conf['gallery_title'].']: '.($is_subscribe ? l10n('Subscribe to notification by mail'): l10n('Unsubscribe from notification by mail'));
+
+        // Assign current var for nbm mail
+        assign_vars_nbm_mail_content($nbm_user);
+
+        $section_action_by = ($is_subscribe ? 'subscribe_by_' : 'unsubscribe_by_');
+        $section_action_by .= ($is_admin_request ? 'admin' : 'himself');
+        $env_nbm['mail_template']->assign
+        (
+          array
+          (
+            $section_action_by => true,
+            'GOTO_GALLERY_TITLE' => $conf['gallery_title'],
+            'GOTO_GALLERY_URL' => get_gallery_home_url(),
+          )
+        );
+
+        if (pwg_mail
+            (
+              format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
+              array
+              (
+                'from' => $env_nbm['send_as_mail_formated'],
+                'subject' => $subject,
+                'email_format' => $env_nbm['email_format'],
+                'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
+                'content_format' => $env_nbm['email_format'],
+                'theme' => $nbm_user['theme']
+              )
+            ))
+        {
+          inc_mail_sent_success($nbm_user);
+        }
+        else
+        {
+          inc_mail_sent_failed($nbm_user);
+          $do_update = false;
+        }
+
+        // unset env nbm user
+        unset_user_on_env_nbm();
+
+      }
+
+      if ($do_update)
+      {
+        array_push
+        (
+          $updates,
+          array
+          (
+            'check_key' => $nbm_user['check_key'],
+            'enabled' => $enabled_value
+          )
+        );
+        $updated_data_count += 1;
+        array_push($page['infos'], sprintf($msg_info, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+      }
+      else
+      {
+        $error_on_updated_data_count += 1;
+        array_push($page['errors'], sprintf($msg_error, stripslashes($nbm_user['username']), $nbm_user['mail_address']));
+      }
+
+    }
+
+    // Restore nbm environment
+    end_users_env_nbm();
+
+    display_counter_info();
+
+    mass_updates(
+      USER_MAIL_NOTIFICATION_TABLE,
+      array(
+        'primary' => array('check_key'),
+        'update' => array('enabled')
+      ),
+      $updates
+    );
+
+  }
+
+  array_push($page['infos'], l10n_dec('%d user was updated.', '%d users were updated.', $updated_data_count));
+  if ($error_on_updated_data_count != 0)
+  {
+    array_push($page['errors'],
+      l10n_dec('%d user was not updated.',
+               '%d users were not updated.',
+               $error_on_updated_data_count));
+  }
+
+  unset_make_full_url();
+
+  return $check_key_treated;
+}
+
+/*
+ * Unsubscribe notification by mail
+ *
+ * check_key list where action will be done
+ *
+ * @return check_key list treated
+ */
+function unsubscribe_notification_by_mail($is_admin_request, $check_key_list = array())
+{
+  return do_subscribe_unsubscribe_notification_by_mail($is_admin_request, false, $check_key_list);
+}
+
+/*
+ * Subscribe notification by mail
+ *
+ * check_key list where action will be done
+ *
+ * @return check_key list treated
+ */
+function subscribe_notification_by_mail($is_admin_request, $check_key_list = array())
+{
+  return do_subscribe_unsubscribe_notification_by_mail($is_admin_request, true, $check_key_list);
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/functions_permalinks.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_permalinks.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_permalinks.php	(revision 14585)
@@ -0,0 +1,204 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/** returns a category id that corresponds to the given permalink (or null)
+ * @param string permalink
+ */
+function get_cat_id_from_permalink( $permalink )
+{
+  $query ='
+SELECT id FROM '.CATEGORIES_TABLE.'
+  WHERE permalink=\''.$permalink.'\'';
+  $ids = array_from_query($query, 'id');
+  if (!empty($ids))
+  {
+    return $ids[0];
+  }
+  return null;
+}
+
+/** returns a category id that has used before this permalink (or null)
+ * @param string permalink
+ * @param boolean is_hit if true update the usage counters on the old permalinks
+ */
+function get_cat_id_from_old_permalink($permalink)
+{
+  $query='
+SELECT c.id
+  FROM '.OLD_PERMALINKS_TABLE.' op INNER JOIN '.CATEGORIES_TABLE.' c
+    ON op.cat_id=c.id
+  WHERE op.permalink=\''.$permalink.'\'
+  LIMIT 1';
+  $result = pwg_query($query);
+  $cat_id = null;
+  if ( pwg_db_num_rows($result) )
+    list( $cat_id ) = pwg_db_fetch_row($result);
+  return $cat_id;
+}
+
+
+/** deletes the permalink associated with a category
+ * returns true on success
+ * @param int cat_id the target category id
+ * @param boolean save if true, the current category-permalink association
+ * is saved in the old permalinks table in case external links hit it
+ */
+function delete_cat_permalink( $cat_id, $save )
+{
+  global $page, $cache;
+  $query = '
+SELECT permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id=\''.$cat_id.'\'
+;';
+  $result = pwg_query($query);
+  if ( pwg_db_num_rows($result) )
+  {
+    list($permalink) = pwg_db_fetch_row($result);
+  }
+  if ( !isset($permalink) )
+  {// no permalink; nothing to do
+    return true;
+  }
+  if ($save)
+  {
+    $old_cat_id = get_cat_id_from_old_permalink($permalink);
+    if ( isset($old_cat_id) and $old_cat_id!=$cat_id )
+    {
+      $page['errors'][] = 
+        sprintf( 
+          l10n('Permalink %s has been previously used by album %s. Delete from the permalink history first'),
+          $permalink, $old_cat_id
+        );
+      return false;
+    }
+  }
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET permalink=NULL
+  WHERE id='.$cat_id.'
+  LIMIT 1';
+  pwg_query($query);
+  
+  unset( $cache['cat_names'] ); //force regeneration
+  if ($save)
+  {
+    if ( isset($old_cat_id) )
+    {
+      $query = '
+UPDATE '.OLD_PERMALINKS_TABLE.'
+  SET date_deleted=NOW()
+  WHERE cat_id='.$cat_id.' AND permalink=\''.$permalink.'\'';
+    }
+    else
+    {
+      $query = '
+INSERT INTO '.OLD_PERMALINKS_TABLE.'
+  (permalink, cat_id, date_deleted)
+VALUES
+  ( \''.$permalink.'\','.$cat_id.',NOW() )';
+    }
+    pwg_query( $query );
+  }
+  return true;
+}
+
+/** sets a new permalink for a category
+ * returns true on success
+ * @param int cat_id the target category id
+ * @param string permalink the new permalink
+ * @param boolean save if true, the current category-permalink association
+ * is saved in the old permalinks table in case external links hit it
+ */
+function set_cat_permalink( $cat_id, $permalink, $save )
+{
+  global $page, $cache;
+  
+  $sanitized_permalink = preg_replace( '#[^a-zA-Z0-9_/-]#', '' ,$permalink);
+  $sanitized_permalink = trim($sanitized_permalink, '/');
+  $sanitized_permalink = str_replace('//', '/', $sanitized_permalink);
+  if ( $sanitized_permalink != $permalink 
+      or preg_match( '#^(\d)+(-.*)?$#', $permalink) )
+  {
+    $page['errors'][] = l10n('The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"');
+    return false;
+  }
+  
+  // check if the new permalink is actively used
+  $existing_cat_id = get_cat_id_from_permalink( $permalink );
+  if ( isset($existing_cat_id) )
+  {
+    if ( $existing_cat_id==$cat_id )
+    {// no change required
+      return true;
+    }
+    else
+    {
+      $page['errors'][] = 
+        sprintf( 
+          l10n('Permalink %s is already used by album %s'),
+          $permalink, $existing_cat_id 
+        );
+      return false;
+    }
+  }
+
+  // check if the new permalink was historically used
+  $old_cat_id = get_cat_id_from_old_permalink($permalink);
+  if ( isset($old_cat_id) and $old_cat_id!=$cat_id )
+  {
+    $page['errors'][] = 
+      sprintf( 
+        l10n('Permalink %s has been previously used by album %s. Delete from the permalink history first'),
+        $permalink, $old_cat_id
+      );
+    return false;
+  }
+
+  if ( !delete_cat_permalink($cat_id, $save ) )
+  {
+    return false;
+  }
+
+  if ( isset($old_cat_id) )
+  {// the new permalink must not be active and old at the same time
+    assert( $old_cat_id==$cat_id );
+    $query = '
+DELETE FROM '.OLD_PERMALINKS_TABLE.'
+  WHERE cat_id='.$old_cat_id.' AND permalink=\''.$permalink.'\'';
+    pwg_query($query);
+  }
+  
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET permalink=\''.$permalink.'\'
+  WHERE id='.$cat_id;
+  //  LIMIT 1';
+  pwg_query($query);
+
+  unset( $cache['cat_names'] ); //force regeneration
+  
+  return true;
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/functions_plugins.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_plugins.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_plugins.inc.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Retrieves an url for a plugin page.
+ * @param string file - php script full name
+ */
+function get_admin_plugin_menu_link($file)
+{
+  global $page;
+  $real_file = realpath($file);
+  $url = get_root_url().'admin.php?page=plugin';
+  if (false!==$real_file)
+  {
+    $real_plugin_path = rtrim(realpath(PHPWG_PLUGINS_PATH), '\\/');
+    $file = substr($real_file, strlen($real_plugin_path)+1);
+    $file = str_replace('\\', '/', $file);//Windows
+    $url .= '&amp;section='.urlencode($file);
+  }
+  else if (isset($page['errors']))
+  {
+    array_push($page['errors'], 'PLUGIN ERROR: "'.$file.'" is not a valid file');
+  }
+  return $url;
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions_upgrade.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_upgrade.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_upgrade.php	(revision 14585)
@@ -0,0 +1,332 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function check_upgrade()
+{
+  if (defined('PHPWG_IN_UPGRADE'))
+  {
+    return PHPWG_IN_UPGRADE;
+  }
+  return false;
+}
+
+// concerning upgrade, we use the default tables
+function prepare_conf_upgrade()
+{
+  global $prefixeTable;
+
+  // $conf is not used for users tables
+  // define cannot be re-defined
+  define('CATEGORIES_TABLE', $prefixeTable.'categories');
+  define('COMMENTS_TABLE', $prefixeTable.'comments');
+  define('CONFIG_TABLE', $prefixeTable.'config');
+  define('FAVORITES_TABLE', $prefixeTable.'favorites');
+  define('GROUP_ACCESS_TABLE', $prefixeTable.'group_access');
+  define('GROUPS_TABLE', $prefixeTable.'groups');
+  define('HISTORY_TABLE', $prefixeTable.'history');
+  define('HISTORY_SUMMARY_TABLE', $prefixeTable.'history_summary');
+  define('IMAGE_CATEGORY_TABLE', $prefixeTable.'image_category');
+  define('IMAGES_TABLE', $prefixeTable.'images');
+  define('SESSIONS_TABLE', $prefixeTable.'sessions');
+  define('SITES_TABLE', $prefixeTable.'sites');
+  define('USER_ACCESS_TABLE', $prefixeTable.'user_access');
+  define('USER_GROUP_TABLE', $prefixeTable.'user_group');
+  define('USERS_TABLE', $prefixeTable.'users');
+  define('USER_INFOS_TABLE', $prefixeTable.'user_infos');
+  define('USER_FEED_TABLE', $prefixeTable.'user_feed');
+  define('RATE_TABLE', $prefixeTable.'rate');
+  define('USER_CACHE_TABLE', $prefixeTable.'user_cache');
+  define('USER_CACHE_CATEGORIES_TABLE', $prefixeTable.'user_cache_categories');
+  define('CADDIE_TABLE', $prefixeTable.'caddie');
+  define('UPGRADE_TABLE', $prefixeTable.'upgrade');
+  define('SEARCH_TABLE', $prefixeTable.'search');
+  define('USER_MAIL_NOTIFICATION_TABLE', $prefixeTable.'user_mail_notification');
+  define('TAGS_TABLE', $prefixeTable.'tags');
+  define('IMAGE_TAG_TABLE', $prefixeTable.'image_tag');
+  define('PLUGINS_TABLE', $prefixeTable.'plugins');
+  define('OLD_PERMALINKS_TABLE', $prefixeTable.'old_permalinks');
+  define('THEMES_TABLE', $prefixeTable.'themes');
+  define('LANGUAGES_TABLE', $prefixeTable.'languages');
+}
+
+// Deactivate all non-standard plugins
+function deactivate_non_standard_plugins()
+{
+  global $page;
+
+  $standard_plugins = array(
+    'admin_multi_view',
+    'c13y_upgrade',
+    'event_tracer',
+    'language_switch',
+    'LocalFilesEditor'
+    );
+
+  $query = '
+SELECT id
+FROM '.PREFIX_TABLE.'plugins
+WHERE state = \'active\'
+AND id NOT IN (\'' . implode('\',\'', $standard_plugins) . '\')
+;';
+
+  $result = pwg_query($query);
+  $plugins = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($plugins, $row['id']);
+  }
+
+  if (!empty($plugins))
+  {
+    $query = '
+UPDATE '.PREFIX_TABLE.'plugins
+SET state=\'inactive\'
+WHERE id IN (\'' . implode('\',\'', $plugins) . '\')
+;';
+    pwg_query($query);
+
+    array_push($page['infos'],
+      l10n('As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:').'<p><i>'.implode(', ', $plugins).'</i></p>');
+  }
+}
+
+// Deactivate all non-standard themes
+function deactivate_non_standard_themes()
+{
+  global $page, $conf;
+
+  $standard_themes = array(
+    'clear',
+    'Sylvia',
+    'dark',
+    'elegant',
+    );
+
+  $query = '
+SELECT
+    id,
+    name
+  FROM '.PREFIX_TABLE.'themes
+  WHERE id NOT IN (\''.implode("','", $standard_themes).'\')
+;';
+  $result = pwg_query($query);
+  $theme_ids = array();
+  $theme_names = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($theme_ids, $row['id']);
+    array_push($theme_names, $row['name']);
+  }
+
+  if (!empty($theme_ids))
+  {
+    $query = '
+DELETE
+  FROM '.PREFIX_TABLE.'themes
+  WHERE id IN (\''.implode("','", $theme_ids).'\')
+;';
+    pwg_query($query);
+
+    array_push($page['infos'],
+      l10n('As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:').'<p><i>'.implode(', ', $theme_names).'</i></p>');
+
+    // what is the default theme?
+    $query = '
+SELECT theme
+  FROM '.PREFIX_TABLE.'user_infos
+  WHERE user_id = '.$conf['default_user_id'].'
+;';
+    list($default_theme) = pwg_db_fetch_row(pwg_query($query));
+
+    // if the default theme has just been deactivated, let's set another core theme as default
+    if (in_array($default_theme, $theme_ids))
+    {
+      $query = '
+UPDATE '.PREFIX_TABLE.'user_infos
+  SET theme = \'elegant\'
+  WHERE user_id = '.$conf['default_user_id'].'
+;';
+      pwg_query($query);
+    }
+  }
+}
+
+// Deactivate all templates
+function deactivate_templates()
+{
+  $query = '
+  UPDATE '.PREFIX_TABLE.'config
+    SET value = \''. array() .'\'
+  WHERE param = \'extents_for_templates\';';
+}
+
+// Check access rights
+function check_upgrade_access_rights()
+{
+  global $conf, $page, $current_release;
+
+  if (version_compare($current_release, '2.0', '>=') and isset($_COOKIE[session_name()]))
+  {
+    // Check if user is already connected as webmaster
+    session_start();
+    if (!empty($_SESSION['pwg_uid']))
+    {
+      $query = '
+SELECT status
+  FROM '.USER_INFOS_TABLE.'
+  WHERE user_id = '.$_SESSION['pwg_uid'].'
+;';
+      pwg_query($query);
+
+      $row = pwg_db_fetch_assoc(pwg_query($query));
+      if (isset($row['status']) and $row['status'] == 'webmaster')
+      {
+        define('PHPWG_IN_UPGRADE', true);
+        return;
+      }
+    }
+  }
+
+  if (!isset($_POST['username']) or !isset($_POST['password']))
+  {
+    return;
+  }
+
+  $username = $_POST['username'];
+  $password = $_POST['password'];
+
+  if(!@get_magic_quotes_gpc())
+  {
+    $username = pwg_db_real_escape_string($username);
+  }
+
+  if (version_compare($current_release, '2.0', '<'))
+  {
+    $username = utf8_decode($username);
+    $password = utf8_decode($password);
+  }
+
+  if (version_compare($current_release, '1.5', '<'))
+  {
+    $query = '
+SELECT password, status
+FROM '.USERS_TABLE.'
+WHERE username = \''.$username.'\'
+;';
+  }
+  else
+  {
+    $query = '
+SELECT u.password, ui.status
+FROM '.USERS_TABLE.' AS u
+INNER JOIN '.USER_INFOS_TABLE.' AS ui
+ON u.'.$conf['user_fields']['id'].'=ui.user_id
+WHERE '.$conf['user_fields']['username'].'=\''.$username.'\'
+;';
+  }
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+
+  if (!isset($conf['pass_convert']))
+  {
+    $conf['pass_convert'] = create_function('$s', 'return md5($s);');
+  }
+
+  if ($row['password'] != $conf['pass_convert']($password))
+  {
+    array_push($page['errors'], l10n('Invalid password!'));
+  }
+  elseif ($row['status'] != 'admin' and $row['status'] != 'webmaster')
+  {
+    array_push($page['errors'], l10n('You do not have access rights to run upgrade'));
+  }
+  else
+  {
+    define('PHPWG_IN_UPGRADE', true);
+  }
+}
+
+/**
+ * which upgrades are available ?
+ *
+ * @return array
+ */
+function get_available_upgrade_ids()
+{
+  $upgrades_path = PHPWG_ROOT_PATH.'install/db';
+
+  $available_upgrade_ids = array();
+
+  if ($contents = opendir($upgrades_path))
+  {
+    while (($node = readdir($contents)) !== false)
+    {
+      if (is_file($upgrades_path.'/'.$node)
+          and preg_match('/^(.*?)-database\.php$/', $node, $match))
+      {
+        array_push($available_upgrade_ids, $match[1]);
+      }
+    }
+  }
+  natcasesort($available_upgrade_ids);
+
+  return $available_upgrade_ids;
+}
+
+
+/**
+ * returns true if there are available upgrade files
+ */
+function check_upgrade_feed()
+{
+  // retrieve already applied upgrades
+  $query = '
+SELECT id
+  FROM '.UPGRADE_TABLE.'
+;';
+  $applied = array_from_query($query, 'id');
+
+  // retrieve existing upgrades
+  $existing = get_available_upgrade_ids();
+
+  // which upgrades need to be applied?
+  return (count(array_diff($existing, $applied)) > 0);
+}
+
+function upgrade_db_connect()
+{
+  global $conf;
+
+  try
+  {
+    $pwg_db_link = pwg_db_connect($conf['db_host'], $conf['db_user'], $conf['db_password'], $conf['db_base']);
+    if ($pwg_db_link)
+    {
+      pwg_db_check_version();
+    }
+  }
+  catch (Exception $e)
+  {
+    my_error(l10n($e->getMessage()), true); 
+  }
+}
+?>
Index: tags/2.4.0RC3/admin/include/functions_upload.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/functions_upload.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/functions_upload.inc.php	(revision 14585)
@@ -0,0 +1,568 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
+
+// add default event handler for image and thumbnail resize
+add_event_handler('upload_image_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 7);
+add_event_handler('upload_thumbnail_resize', 'pwg_image_resize', EVENT_HANDLER_PRIORITY_NEUTRAL, 9);
+
+function get_upload_form_config()
+{
+  // default configuration for upload
+  $upload_form_config = array(
+    'original_resize' => array(
+      'default' => false,
+      'can_be_null' => false,
+      ),
+
+    'original_resize_maxwidth' => array(
+      'default' => 2000,
+      'min' => 500,
+      'max' => 20000,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The original maximum width must be a number between %d and %d'),
+      ),
+
+    'original_resize_maxheight' => array(
+      'default' => 2000,
+      'min' => 300,
+      'max' => 20000,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The original maximum height must be a number between %d and %d'),
+      ),
+
+    'original_resize_quality' => array(
+      'default' => 95,
+      'min' => 50,
+      'max' => 98,
+      'pattern' => '/^\d+$/',
+      'can_be_null' => false,
+      'error_message' => l10n('The original image quality must be a number between %d and %d'),
+      ),
+    );
+
+  return $upload_form_config;
+}
+
+function save_upload_form_config($data, &$errors=array(), &$form_errors=array())
+{
+  if (!is_array($data) or empty($data))
+  {
+    return false;
+  }
+
+  $upload_form_config = get_upload_form_config();
+  $updates = array();
+
+  foreach ($data as $field => $value)
+  {
+    if (!isset($upload_form_config[$field]))
+    {
+      continue;
+    }
+    if (is_bool($upload_form_config[$field]['default']))
+    {
+      if (isset($value))
+      {
+        $value = true;
+      }
+      else
+      {
+        $value = false;
+      }
+
+      $updates[] = array(
+        'param' => $field,
+        'value' => boolean_to_string($value)
+        );
+    }
+    elseif ($upload_form_config[$field]['can_be_null'] and empty($value))
+    {
+      $updates[] = array(
+        'param' => $field,
+        'value' => 'false'
+        );
+    }
+    else
+    {
+      $min = $upload_form_config[$field]['min'];
+      $max = $upload_form_config[$field]['max'];
+      $pattern = $upload_form_config[$field]['pattern'];
+
+      if (preg_match($pattern, $value) and $value >= $min and $value <= $max)
+      {
+         $updates[] = array(
+          'param' => $field,
+          'value' => $value
+          );
+      }
+      else
+      {
+        array_push(
+          $errors,
+          sprintf(
+            $upload_form_config[$field]['error_message'],
+            $min,
+            $max
+            )
+          );
+        
+        $form_errors[$field] = '['.$min.' .. '.$max.']';
+      }
+    }
+  }
+
+  if (count($errors) == 0)
+  {
+    mass_updates(
+      CONFIG_TABLE,
+      array(
+        'primary' => array('param'),
+        'update' => array('value')
+        ),
+      $updates
+      );
+    return true;
+  }
+
+  return false;
+}
+
+function add_uploaded_file($source_filepath, $original_filename=null, $categories=null, $level=null, $image_id=null, $original_md5sum=null)
+{
+  // 1) move uploaded file to upload/2010/01/22/20100122003814-449ada00.jpg
+  //
+  // 2) keep/resize original
+  //
+  // 3) register in database
+
+  // TODO
+  // * check md5sum (already exists?)
+
+  global $conf, $user;
+
+  if (isset($original_md5sum))
+  {
+    $md5sum = $original_md5sum;
+  }
+  else
+  {
+    $md5sum = md5_file($source_filepath);
+  }
+
+  $file_path = null;
+
+  if (isset($image_id))
+  {
+    // this photo already exists, we update it
+    $query = '
+SELECT
+    path
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$image_id.'
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $file_path = $row['path'];
+    }
+
+    if (!isset($file_path))
+    {
+      die('['.__FUNCTION__.'] this photo does not exist in the database');
+    }
+
+    // delete all physical files related to the photo (thumbnail, web site, HD)
+    delete_element_files(array($image_id));
+  }
+  else
+  {
+    // this photo is new
+
+    // current date
+    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+    list($year, $month, $day) = preg_split('/[^\d]/', $dbnow, 4);
+
+    // upload directory hierarchy
+    $upload_dir = sprintf(
+      PHPWG_ROOT_PATH.$conf['upload_dir'].'/%s/%s/%s',
+      $year,
+      $month,
+      $day
+      );
+
+    // compute file path
+    $date_string = preg_replace('/[^\d]/', '', $dbnow);
+    $random_string = substr($md5sum, 0, 8);
+    $filename_wo_ext = $date_string.'-'.$random_string;
+    $file_path = $upload_dir.'/'.$filename_wo_ext.'.';
+
+    list($width, $height, $type) = getimagesize($source_filepath);
+    if (IMAGETYPE_PNG == $type)
+    {
+      $file_path.= 'png';
+    }
+    elseif (IMAGETYPE_GIF == $type)
+    {
+      $file_path.= 'gif';
+    }
+    else
+    {
+      $file_path.= 'jpg';
+    }
+
+    prepare_directory($upload_dir);
+  }
+
+  if (is_uploaded_file($source_filepath))
+  {
+    move_uploaded_file($source_filepath, $file_path);
+  }
+  else
+  {
+    rename($source_filepath, $file_path);
+  }
+
+  if (pwg_image::get_library() != 'gd')
+  {
+    if ($conf['original_resize'])
+    {
+      $need_resize = need_resize($file_path, $conf['original_resize_maxwidth'], $conf['original_resize_maxheight']);
+
+      if ($need_resize)
+      {
+        $img = new pwg_image($file_path);
+
+        $img->pwg_resize(
+          $file_path,
+          $conf['original_resize_maxwidth'],
+          $conf['original_resize_maxheight'],
+          $conf['original_resize_quality'],
+          $conf['upload_form_automatic_rotation'],
+          false
+          );
+
+        $img->destroy();
+      }
+    }
+  }
+
+  // we need to save the rotation angle in the database to compute
+  // width/height of "multisizes"
+  $rotation_angle = pwg_image::get_rotation_angle($file_path);
+  $rotation = pwg_image::get_rotation_code_from_angle($rotation_angle);
+  
+  $file_infos = pwg_image_infos($file_path);
+
+  if (isset($image_id))
+  {
+    $update = array(
+      'file' => pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path)),
+      'filesize' => $file_infos['filesize'],
+      'width' => $file_infos['width'],
+      'height' => $file_infos['height'],
+      'md5sum' => $md5sum,
+      'added_by' => $user['id'],
+      'rotation' => $rotation,
+      );
+
+    if (isset($level))
+    {
+      $update['level'] = $level;
+    }
+
+    single_update(
+      IMAGES_TABLE,
+      $update,
+      array('id' => $image_id)
+      );
+  }
+  else
+  {
+    // database registration
+    $file = pwg_db_real_escape_string(isset($original_filename) ? $original_filename : basename($file_path));
+    $insert = array(
+      'file' => $file,
+      'name' => get_name_from_file($file),
+      'date_available' => $dbnow,
+      'path' => preg_replace('#^'.preg_quote(PHPWG_ROOT_PATH).'#', '', $file_path),
+      'filesize' => $file_infos['filesize'],
+      'width' => $file_infos['width'],
+      'height' => $file_infos['height'],
+      'md5sum' => $md5sum,
+      'added_by' => $user['id'],
+      'rotation' => $rotation,
+      );
+
+    if (isset($level))
+    {
+      $insert['level'] = $level;
+    }
+
+    single_insert(IMAGES_TABLE, $insert);
+
+    $image_id = pwg_db_insert_id(IMAGES_TABLE);
+  }
+
+  if (isset($categories) and count($categories) > 0)
+  {
+    associate_images_to_categories(
+      array($image_id),
+      $categories
+      );
+  }
+
+  // update metadata from the uploaded file (exif/iptc)
+  if ($conf['use_exif'] and !function_exists('read_exif_data'))
+  {
+    $conf['use_exif'] = false;
+  }
+  sync_metadata(array($image_id));
+
+  invalidate_user_cache();
+
+  // cache thumbnail
+  $query = '
+SELECT
+    id,
+    path
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$image_id.'
+;';
+  $image_infos = pwg_db_fetch_assoc(pwg_query($query));
+
+  set_make_full_url();
+  // in case we are on uploadify.php, we have to replace the false path
+  $thumb_url = preg_replace('#admin/include/i#', 'i', DerivativeImage::thumb_url($image_infos));
+  unset_make_full_url();
+  
+  fetchRemote($thumb_url, $dest);
+  
+
+  return $image_id;
+}
+
+function prepare_directory($directory)
+{
+  if (!is_dir($directory)) {
+    if (substr(PHP_OS, 0, 3) == 'WIN')
+    {
+      $directory = str_replace('/', DIRECTORY_SEPARATOR, $directory);
+    }
+    umask(0000);
+    $recursive = true;
+    if (!@mkdir($directory, 0777, $recursive))
+    {
+      die('[prepare_directory] cannot create directory "'.$directory.'"');
+    }
+  }
+
+  if (!is_writable($directory))
+  {
+    // last chance to make the directory writable
+    @chmod($directory, 0777);
+
+    if (!is_writable($directory))
+    {
+      die('[prepare_directory] directory "'.$directory.'" has no write access');
+    }
+  }
+
+  secure_directory($directory);
+}
+
+function need_resize($image_filepath, $max_width, $max_height)
+{
+  // TODO : the resize check should take the orientation into account. If a
+  // rotation must be applied to the resized photo, then we should test
+  // invert width and height.
+  list($width, $height) = getimagesize($image_filepath);
+
+  if ($width > $max_width or $height > $max_height)
+  {
+    return true;
+  }
+
+  return false;
+}
+
+function pwg_image_infos($path)
+{
+  list($width, $height) = getimagesize($path);
+  $filesize = floor(filesize($path)/1024);
+
+  return array(
+    'width'  => $width,
+    'height' => $height,
+    'filesize' => $filesize,
+    );
+}
+
+function is_valid_image_extension($extension)
+{
+  return in_array(strtolower($extension), array('jpg', 'jpeg', 'png', 'gif'));
+}
+
+function file_upload_error_message($error_code)
+{
+  switch ($error_code) {
+    case UPLOAD_ERR_INI_SIZE:
+      return sprintf(
+        l10n('The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'),
+        get_ini_size('upload_max_filesize', false)
+        );
+    case UPLOAD_ERR_FORM_SIZE:
+      return l10n('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form');
+    case UPLOAD_ERR_PARTIAL:
+      return l10n('The uploaded file was only partially uploaded');
+    case UPLOAD_ERR_NO_FILE:
+      return l10n('No file was uploaded');
+    case UPLOAD_ERR_NO_TMP_DIR:
+      return l10n('Missing a temporary folder');
+    case UPLOAD_ERR_CANT_WRITE:
+      return l10n('Failed to write file to disk');
+    case UPLOAD_ERR_EXTENSION:
+      return l10n('File upload stopped by extension');
+    default:
+      return l10n('Unknown upload error');
+  }
+}
+
+function get_ini_size($ini_key, $in_bytes=true)
+{
+  $size = ini_get($ini_key);
+
+  if ($in_bytes)
+  {
+    $size = convert_shorthand_notation_to_bytes($size);
+  }
+
+  return $size;
+}
+
+function convert_shorthand_notation_to_bytes($value)
+{
+  $suffix = substr($value, -1);
+  $multiply_by = null;
+
+  if ('K' == $suffix)
+  {
+    $multiply_by = 1024;
+  }
+  else if ('M' == $suffix)
+  {
+    $multiply_by = 1024*1024;
+  }
+  else if ('G' == $suffix)
+  {
+    $multiply_by = 1024*1024*1024;
+  }
+
+  if (isset($multiply_by))
+  {
+    $value = substr($value, 0, -1);
+    $value*= $multiply_by;
+  }
+
+  return $value;
+}
+
+function add_upload_error($upload_id, $error_message)
+{
+  if (!isset($_SESSION['uploads_error']))
+  {
+    $_SESSION['uploads_error'] = array();
+  }
+  if (!isset($_SESSION['uploads_error'][$upload_id]))
+  {
+    $_SESSION['uploads_error'][$upload_id] = array();
+  }
+
+  array_push($_SESSION['uploads_error'][$upload_id], $error_message);
+}
+
+function ready_for_upload_message()
+{
+  global $conf;
+
+  $relative_dir = preg_replace('#^'.PHPWG_ROOT_PATH.'#', '', $conf['upload_dir']);
+
+  if (!is_dir($conf['upload_dir']))
+  {
+    if (!is_writable(dirname($conf['upload_dir'])))
+    {
+      return sprintf(
+        l10n('Create the "%s" directory at the root of your Piwigo installation'),
+        $relative_dir
+        );
+    }
+  }
+  else
+  {
+    if (!is_writable($conf['upload_dir']))
+    {
+      @chmod($conf['upload_dir'], 0777);
+
+      if (!is_writable($conf['upload_dir']))
+      {
+        return sprintf(
+          l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
+          $relative_dir
+          );
+      }
+    }
+  }
+
+  return null;
+}
+
+function file_path_for_type($file_path, $type='thumb')
+{
+  // resolve the $file_path depending on the $type
+  if ('thumb' == $type) {
+    $file_path = get_thumbnail_location(
+      array(
+        'path' => $file_path,
+        'tn_ext' => 'jpg',
+        )
+      );
+  }
+
+  if ('high' == $type) {
+    @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+    $file_path = get_high_location(
+      array(
+        'path' => $file_path,
+        'has_high' => 'true'
+        )
+      );
+  }
+
+  return $file_path;
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/image.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/image.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/image.class.php	(revision 14585)
@@ -0,0 +1,782 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           Image Interface                             |
+// +-----------------------------------------------------------------------+
+
+// Define all needed methods for image class
+interface imageInterface
+{
+  function get_width();
+
+  function get_height();
+
+  function set_compression_quality($quality);
+
+  function crop($width, $height, $x, $y);
+
+  function strip();
+
+  function rotate($rotation);
+
+  function resize($width, $height);
+
+  function sharpen($amount);
+
+  function compose($overlay, $x, $y, $opacity);
+
+  function write($destination_filepath);
+}
+
+// +-----------------------------------------------------------------------+
+// |                          Main Image Class                             |
+// +-----------------------------------------------------------------------+
+
+class pwg_image
+{
+  var $image;
+  var $library = '';
+  var $source_filepath = '';
+
+  function __construct($source_filepath, $library=null)
+  {
+    $this->source_filepath = $source_filepath;
+
+    trigger_action('load_image_library', array(&$this) );
+
+    if (is_object($this->image))
+    {
+      return; // A plugin may have load its own library
+    }
+
+    $extension = strtolower(get_extension($source_filepath));
+
+    if (!in_array($extension, array('jpg', 'jpeg', 'png', 'gif')))
+    {
+      die('[Image] unsupported file extension');
+    }
+
+    if (!($this->library = self::get_library($library, $extension)))
+    {
+      die('No image library available on your server.');
+    }
+
+    $class = 'image_'.$this->library;
+    $this->image = new $class($source_filepath);
+  }
+
+  // Unknow methods will be redirected to image object
+  function __call($method, $arguments)
+  {
+    return call_user_func_array(array($this->image, $method), $arguments);
+  }
+
+  // Piwigo resize function
+  function pwg_resize($destination_filepath, $max_width, $max_height, $quality, $automatic_rotation=true, $strip_metadata=false, $crop=false, $follow_orientation=true)
+  {
+    $starttime = get_moment();
+
+    // width/height
+    $source_width  = $this->image->get_width();
+    $source_height = $this->image->get_height();
+
+    $rotation = null;
+    if ($automatic_rotation)
+    {
+      $rotation = self::get_rotation_angle($this->source_filepath);
+    }
+    $resize_dimensions = self::get_resize_dimensions($source_width, $source_height, $max_width, $max_height, $rotation, $crop, $follow_orientation);
+
+    // testing on height is useless in theory: if width is unchanged, there
+    // should be no resize, because width/height ratio is not modified.
+    if ($resize_dimensions['width'] == $source_width and $resize_dimensions['height'] == $source_height)
+    {
+      // the image doesn't need any resize! We just copy it to the destination
+      copy($this->source_filepath, $destination_filepath);
+      return $this->get_resize_result($destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime);
+    }
+
+    $this->image->set_compression_quality($quality);
+
+    if ($strip_metadata)
+    {
+      // we save a few kilobytes. For example a thumbnail with metadata weights 25KB, without metadata 7KB.
+      $this->image->strip();
+    }
+
+    if (isset($resize_dimensions['crop']))
+    {
+      $this->image->crop($resize_dimensions['crop']['width'], $resize_dimensions['crop']['height'], $resize_dimensions['crop']['x'], $resize_dimensions['crop']['y']);
+    }
+
+    $this->image->resize($resize_dimensions['width'], $resize_dimensions['height']);
+
+    if (isset($rotation))
+    {
+      $this->image->rotate($rotation);
+    }
+
+    $this->image->write($destination_filepath);
+
+    // everything should be OK if we are here!
+    return $this->get_resize_result($destination_filepath, $resize_dimensions['width'], $resize_dimensions['height'], $starttime);
+  }
+
+  static function get_resize_dimensions($width, $height, $max_width, $max_height, $rotation=null, $crop=false, $follow_orientation=true)
+  {
+    $rotate_for_dimensions = false;
+    if (isset($rotation) and in_array(abs($rotation), array(90, 270)))
+    {
+      $rotate_for_dimensions = true;
+    }
+
+    if ($rotate_for_dimensions)
+    {
+      list($width, $height) = array($height, $width);
+    }
+
+    if ($crop)
+    {
+      $x = 0;
+      $y = 0;
+
+      if ($width < $height and $follow_orientation)
+      {
+        list($max_width, $max_height) = array($max_height, $max_width);
+      }
+
+      $img_ratio = $width / $height;
+      $dest_ratio = $max_width / $max_height;
+
+      if($dest_ratio > $img_ratio)
+      {
+        $destHeight = round($width * $max_height / $max_width);
+        $y = round(($height - $destHeight) / 2 );
+        $height = $destHeight;
+      }
+      elseif ($dest_ratio < $img_ratio)
+      {
+        $destWidth = round($height * $max_width / $max_height);
+        $x = round(($width - $destWidth) / 2 );
+        $width = $destWidth;
+      }
+    }
+
+    $ratio_width  = $width / $max_width;
+    $ratio_height = $height / $max_height;
+    $destination_width = $width;
+    $destination_height = $height;
+
+    // maximal size exceeded ?
+    if ($ratio_width > 1 or $ratio_height > 1)
+    {
+      if ($ratio_width < $ratio_height)
+      {
+        $destination_width = round($width / $ratio_height);
+        $destination_height = $max_height;
+      }
+      else
+      {
+        $destination_width = $max_width;
+        $destination_height = round($height / $ratio_width);
+      }
+    }
+
+    if ($rotate_for_dimensions)
+    {
+      list($destination_width, $destination_height) = array($destination_height, $destination_width);
+    }
+
+    $result = array(
+      'width' => $destination_width,
+      'height'=> $destination_height,
+      );
+
+    if ($crop and ($x or $y))
+    {
+      $result['crop'] = array(
+        'width' => $width,
+        'height' => $height,
+        'x' => $x,
+        'y' => $y,
+        );
+    }
+    return $result;
+  }
+
+  static function get_rotation_angle($source_filepath)
+  {
+    list($width, $height, $type) = getimagesize($source_filepath);
+    if (IMAGETYPE_JPEG != $type)
+    {
+      return null;
+    }
+
+    if (!function_exists('exif_read_data'))
+    {
+      return null;
+    }
+
+    $rotation = 0;
+
+    $exif = exif_read_data($source_filepath);
+
+    if (isset($exif['Orientation']) and preg_match('/^\s*(\d)/', $exif['Orientation'], $matches))
+    {
+      $orientation = $matches[1];
+      if (in_array($orientation, array(3, 4)))
+      {
+        $rotation = 180;
+      }
+      elseif (in_array($orientation, array(5, 6)))
+      {
+        $rotation = 270;
+      }
+      elseif (in_array($orientation, array(7, 8)))
+      {
+        $rotation = 90;
+      }
+    }
+
+    return $rotation;
+  }
+
+  static function get_rotation_code_from_angle($rotation_angle)
+  {
+    switch($rotation_angle)
+    {
+      case 0:   return 0;
+      case 90:  return 1;
+      case 180: return 2;
+      case 270: return 3;
+    }
+  }
+
+  static function get_rotation_angle_from_code($rotation_code)
+  {
+    switch($rotation_code)
+    {
+      case 0: return 0;
+      case 1: return 90;
+      case 2: return 180;
+      case 3: return 270;
+    }
+  }
+
+  /** Returns a normalized convolution kernel for sharpening*/
+  static function get_sharpen_matrix($amount)
+  {
+    // Amount should be in the range of 28-10
+    $amount = round(abs(-28 + ($amount * 0.18)), 2);
+
+    $matrix = array(
+      array(-1,   -1,    -1),
+      array(-1, $amount, -1),
+      array(-1,   -1,    -1),
+      );
+
+    $norm = array_sum(array_map('array_sum', $matrix));
+
+    for ($i=0; $i<3; $i++)
+    {
+      $line = & $matrix[$i];
+      for ($j=0; $j<3; $j++)
+      {
+        $line[$j] /= $norm;
+      }
+    }
+
+    return $matrix;
+  }
+
+  private function get_resize_result($destination_filepath, $width, $height, $time=null)
+  {
+    return array(
+      'source'      => $this->source_filepath,
+      'destination' => $destination_filepath,
+      'width'       => $width,
+      'height'      => $height,
+      'size'        => floor(filesize($destination_filepath) / 1024).' KB',
+      'time'        => $time ? number_format((get_moment() - $time) * 1000, 2, '.', ' ').' ms' : null,
+      'library'     => $this->library,
+    );
+  }
+
+  static function is_imagick()
+  {
+    return (extension_loaded('imagick') and class_exists('Imagick'));
+  }
+
+  static function is_ext_imagick()
+  {
+    global $conf;
+
+    if (!function_exists('exec'))
+    {
+      return false;
+    }
+    @exec($conf['ext_imagick_dir'].'convert -version', $returnarray);
+    if (is_array($returnarray) and !empty($returnarray[0]) and preg_match('/ImageMagick/i', $returnarray[0]))
+    {
+      return true;
+    }
+    return false;
+  }
+
+  static function is_gd()
+  {
+    return function_exists('gd_info');
+  }
+
+  static function get_library($library=null, $extension=null)
+  {
+    global $conf;
+
+    if (is_null($library))
+    {
+      $library = $conf['graphics_library'];
+    }
+
+    // Choose image library
+    switch (strtolower($library))
+    {
+      case 'auto':
+      case 'imagick':
+        if ($extension != 'gif' and self::is_imagick())
+        {
+          return 'imagick';
+        }
+      case 'ext_imagick':
+        if ($extension != 'gif' and self::is_ext_imagick())
+        {
+          return 'ext_imagick';
+        }
+      case 'gd':
+        if (self::is_gd())
+        {
+          return 'gd';
+        }
+      default:
+        if ($library != 'auto')
+        {
+          // Requested library not available. Try another library
+          return self::get_library('auto', $extension);
+        }
+    }
+    return false;
+  }
+
+  function destroy()
+  {
+    if (method_exists($this->image, 'destroy'))
+    {
+      return $this->image->destroy();
+    }
+    return true;
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                   Class for Imagick extension                         |
+// +-----------------------------------------------------------------------+
+
+class image_imagick implements imageInterface
+{
+  var $image;
+
+  function __construct($source_filepath)
+  {
+    // A bug cause that Imagick class can not be extended
+    $this->image = new Imagick($source_filepath);
+  }
+
+  function get_width()
+  {
+    return $this->image->getImageWidth();
+  }
+
+  function get_height()
+  {
+    return $this->image->getImageHeight();
+  }
+
+  function set_compression_quality($quality)
+  {
+    return $this->image->setImageCompressionQuality($quality);
+  }
+
+  function crop($width, $height, $x, $y)
+  {
+    return $this->image->cropImage($width, $height, $x, $y);
+  }
+
+  function strip()
+  {
+    return $this->image->stripImage();
+  }
+
+  function rotate($rotation)
+  {
+    $this->image->rotateImage(new ImagickPixel(), -$rotation);
+    $this->image->setImageOrientation(Imagick::ORIENTATION_TOPLEFT);
+    return true;
+  }
+
+  function resize($width, $height)
+  {
+    $this->image->setInterlaceScheme(Imagick::INTERLACE_LINE);
+    
+    // TODO need to explain this condition
+    if ($this->get_width()%2 == 0
+        && $this->get_height()%2 == 0
+        && $this->get_width() > 3*$width)
+    {
+      $this->image->scaleImage($this->get_width()/2, $this->get_height()/2);
+    }
+
+    return $this->image->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 0.9);
+  }
+
+  function sharpen($amount)
+  {
+    $m = pwg_image::get_sharpen_matrix($amount);
+    return  $this->image->convolveImage($m);
+  }
+
+  function compose($overlay, $x, $y, $opacity)
+  {
+    $ioverlay = $overlay->image->image;
+    /*if ($ioverlay->getImageAlphaChannel() !== Imagick::ALPHACHANNEL_OPAQUE)
+    {
+      // Force the image to have an alpha channel
+      $ioverlay->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE);
+    }*/
+
+    global $dirty_trick_xrepeat;
+    if ( !isset($dirty_trick_xrepeat) && $opacity < 100)
+    {// NOTE: Using setImageOpacity will destroy current alpha channels!
+      $ioverlay->evaluateImage(Imagick::EVALUATE_MULTIPLY, $opacity / 100, Imagick::CHANNEL_ALPHA);
+      $dirty_trick_xrepeat = true;
+    }
+
+    return $this->image->compositeImage($ioverlay, Imagick::COMPOSITE_DISSOLVE, $x, $y);
+  }
+
+  function write($destination_filepath)
+  {
+    // use 4:2:2 chroma subsampling (reduce file size by 20-30% with "almost" no human perception)
+    $this->image->setSamplingFactors( array(2,1) );
+    return $this->image->writeImage($destination_filepath);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |            Class for ImageMagick external installation                |
+// +-----------------------------------------------------------------------+
+
+class image_ext_imagick implements imageInterface
+{
+  var $imagickdir = '';
+  var $source_filepath = '';
+  var $width = '';
+  var $height = '';
+  var $commands = array();
+
+  function __construct($source_filepath)
+  {
+    global $conf;
+    $this->source_filepath = $source_filepath;
+    $this->imagickdir = $conf['ext_imagick_dir'];
+
+    $command = $this->imagickdir.'identify -format "%wx%h" "'.realpath($source_filepath).'"';
+    @exec($command, $returnarray);
+    if(!is_array($returnarray) or empty($returnarray[0]) or !preg_match('/^(\d+)x(\d+)$/', $returnarray[0], $match))
+    {
+      die("[External ImageMagick] Corrupt image\n" . var_export($returnarray, true));
+    }
+
+    $this->width = $match[1];
+    $this->height = $match[2];
+  }
+
+  function add_command($command, $params=null)
+  {
+    $this->commands[$command] = $params;
+  }
+
+  function get_width()
+  {
+    return $this->width;
+  }
+
+  function get_height()
+  {
+    return $this->height;
+  }
+
+  function crop($width, $height, $x, $y)
+  {
+    $this->add_command('crop', $width.'x'.$height.'+'.$x.'+'.$y);
+    return true;
+  }
+
+  function strip()
+  {
+    $this->add_command('strip');
+    return true;
+  }
+
+  function rotate($rotation)
+  {
+    $this->add_command('rotate', -$rotation);
+    $this->add_command('orient', 'top-left');
+    return true;
+  }
+
+  function set_compression_quality($quality)
+  {
+    $this->add_command('quality', $quality);
+    return true;
+  }
+
+  function resize($width, $height)
+  {
+    $this->add_command('interlace', 'line');
+    $this->add_command('filter', 'Lanczos');
+    $this->add_command('resize', $width.'x'.$height.'!');
+    return true;
+  }
+
+  function sharpen($amount)
+  {
+    $m = pwg_image::get_sharpen_matrix($amount);
+
+    $param ='convolve "'.count($m).':';
+    foreach ($m as $line)
+    {
+      $param .= ' ';
+      $param .= implode(',', $line);
+    }
+    $param .= '"';
+    $this->add_command('morphology', $param);
+    return true;
+  }
+
+  function compose($overlay, $x, $y, $opacity)
+  {
+    $param = 'compose dissolve -define compose:args='.$opacity;
+    $param .= ' '.escapeshellarg(realpath($overlay->image->source_filepath));
+    $param .= ' -gravity NorthWest -geometry +'.$x.'+'.$y;
+    $param .= ' -composite';
+    $this->add_command($param);
+    return true;
+  }
+
+  function write($destination_filepath)
+  {
+    $exec = $this->imagickdir.'convert';
+    $exec .= ' "'.realpath($this->source_filepath).'"';
+
+    foreach ($this->commands as $command => $params)
+    {
+      $exec .= ' -'.$command;
+      if (!empty($params))
+      {
+        $exec .= ' '.$params;
+      }
+    }
+
+    $dest = pathinfo($destination_filepath);
+    $exec .= ' "'.realpath($dest['dirname']).'/'.$dest['basename'].'"';
+    @exec($exec, $returnarray);
+
+    //echo($exec);
+    return is_array($returnarray);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                       Class for GD library                            |
+// +-----------------------------------------------------------------------+
+
+class image_gd implements imageInterface
+{
+  var $image;
+  var $quality = 95;
+
+  function __construct($source_filepath)
+  {
+    $gd_info = gd_info();
+    $extension = strtolower(get_extension($source_filepath));
+
+    if (in_array($extension, array('jpg', 'jpeg')))
+    {
+      $this->image = imagecreatefromjpeg($source_filepath);
+    }
+    else if ($extension == 'png')
+    {
+      $this->image = imagecreatefrompng($source_filepath);
+    }
+    elseif ($extension == 'gif' and $gd_info['GIF Read Support'] and $gd_info['GIF Create Support'])
+    {
+      $this->image = imagecreatefromgif($source_filepath);
+    }
+    else
+    {
+      die('[Image GD] unsupported file extension');
+    }
+  }
+
+  function get_width()
+  {
+    return imagesx($this->image);
+  }
+
+  function get_height()
+  {
+    return imagesy($this->image);
+  }
+
+  function crop($width, $height, $x, $y)
+  {
+    $dest = imagecreatetruecolor($width, $height);
+
+    imagealphablending($dest, false);
+    imagesavealpha($dest, true);
+    if (function_exists('imageantialias'))
+    {
+      imageantialias($dest, true);
+    }
+
+    $result = imagecopymerge($dest, $this->image, 0, 0, $x, $y, $width, $height, 100);
+
+    if ($result !== false)
+    {
+      imagedestroy($this->image);
+      $this->image = $dest;
+    }
+    else
+    {
+      imagedestroy($dest);
+    }
+    return $result;
+  }
+
+  function strip()
+  {
+    return true;
+  }
+
+  function rotate($rotation)
+  {
+    $dest = imagerotate($this->image, $rotation, 0);
+    imagedestroy($this->image);
+    $this->image = $dest;
+    return true;
+  }
+
+  function set_compression_quality($quality)
+  {
+    $this->quality = $quality;
+    return true;
+  }
+
+  function resize($width, $height)
+  {
+    $dest = imagecreatetruecolor($width, $height);
+
+    imagealphablending($dest, false);
+    imagesavealpha($dest, true);
+    if (function_exists('imageantialias'))
+    {
+      imageantialias($dest, true);
+    }
+
+    $result = imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $width, $height, $this->get_width(), $this->get_height());
+
+    if ($result !== false)
+    {
+      imagedestroy($this->image);
+      $this->image = $dest;
+    }
+    else
+    {
+      imagedestroy($dest);
+    }
+    return $result;
+  }
+
+  function sharpen($amount)
+  {
+    $m = pwg_image::get_sharpen_matrix($amount);
+    return imageconvolution($this->image, $m, 1, 0);
+  }
+
+  function compose($overlay, $x, $y, $opacity)
+  {
+    $ioverlay = $overlay->image->image;
+    /* A replacement for php's imagecopymerge() function that supports the alpha channel
+    See php bug #23815:  http://bugs.php.net/bug.php?id=23815 */
+
+    $ow = imagesx($ioverlay);
+    $oh = imagesy($ioverlay);
+
+		// Create a new blank image the site of our source image
+		$cut = imagecreatetruecolor($ow, $oh);
+
+		// Copy the blank image into the destination image where the source goes
+		imagecopy($cut, $this->image, 0, 0, $x, $y, $ow, $oh);
+
+		// Place the source image in the destination image
+		imagecopy($cut, $ioverlay, 0, 0, 0, 0, $ow, $oh);
+		imagecopymerge($this->image, $cut, $x, $y, 0, 0, $ow, $oh, $opacity);
+    imagedestroy($cut);
+    return true;
+  }
+
+  function write($destination_filepath)
+  {
+    $extension = strtolower(get_extension($destination_filepath));
+
+    if ($extension == 'png')
+    {
+      imagepng($this->image, $destination_filepath);
+    }
+    elseif ($extension == 'gif')
+    {
+      imagegif($this->image, $destination_filepath);
+    }
+    else
+    {
+      imagejpeg($this->image, $destination_filepath, $this->quality);
+    }
+  }
+
+  function destroy()
+  {
+    imagedestroy($this->image);
+  }
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/index.php
===================================================================
--- tags/2.4.0RC3/admin/include/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/include/languages.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/languages.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/languages.class.php	(revision 14585)
@@ -0,0 +1,479 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class languages
+{
+  var $fs_languages = array();
+  var $db_languages = array();
+  var $server_languages = array();
+
+  /**
+   * Initialize $fs_languages and $db_languages
+  */
+  function languages($target_charset = null)
+  {
+    $this->get_fs_languages($target_charset);
+  }
+
+  /**
+   * Perform requested actions
+   * @param string - action
+   * @param string - language id
+   * @param array - errors
+   */
+  function perform_action($action, $language_id)
+  {
+    global $conf;
+
+    if (isset($this->db_languages[$language_id]))
+    {
+      $crt_db_language = $this->db_languages[$language_id];
+    }
+
+    $errors = array();
+
+    switch ($action)
+    {
+      case 'activate':
+        if (isset($crt_db_language))
+        {
+          array_push($errors, 'CANNOT ACTIVATE - LANGUAGE IS ALREADY ACTIVATED');
+          break;
+        }
+
+        $query = '
+INSERT INTO '.LANGUAGES_TABLE.'
+  (id, version, name)
+  VALUES(\''.$language_id.'\',
+         \''.$this->fs_languages[$language_id]['version'].'\',
+         \''.$this->fs_languages[$language_id]['name'].'\')
+;';
+        pwg_query($query);
+        break;
+
+      case 'deactivate':
+        if (!isset($crt_db_language))
+        {
+          array_push($errors, 'CANNOT DEACTIVATE - LANGUAGE IS ALREADY DEACTIVATED');
+          break;
+        }
+
+        if ($language_id == get_default_language())
+        {
+          array_push($errors, 'CANNOT DEACTIVATE - LANGUAGE IS DEFAULT LANGUAGE');
+          break;
+        }
+
+        $query = '
+DELETE
+  FROM '.LANGUAGES_TABLE.'
+  WHERE id= \''.$language_id.'\'
+;';
+        pwg_query($query);
+        break;
+
+      case 'delete':
+        if (!empty($crt_db_language))
+        {
+          array_push($errors, 'CANNOT DELETE - LANGUAGE IS ACTIVATED');
+          break;
+        }
+        if (!isset($this->fs_languages[$language_id]))
+        {
+          array_push($errors, 'CANNOT DELETE - LANGUAGE DOES NOT EXIST');
+          break;
+        }
+
+        // Set default language to user who are using this language
+        $query = '
+UPDATE '.USER_INFOS_TABLE.'
+  SET language = \''.get_default_language().'\'
+  WHERE language = \''.$language_id.'\'
+;';
+        pwg_query($query);
+
+        if (!$this->deltree(PHPWG_ROOT_PATH.'language/'.$language_id))
+        {
+          $this->send_to_trash(PHPWG_ROOT_PATH.'language/'.$language_id);
+        }
+        break;
+
+      case 'set_default':
+        $query = '
+UPDATE '.USER_INFOS_TABLE.'
+  SET language = \''.$language_id.'\'
+  WHERE user_id IN ('.$conf['default_user_id'].', '.$conf['guest_id'].')
+;';
+        pwg_query($query);
+        break;
+    }
+    return $errors;
+  }
+
+  /**
+  *  Get languages defined in the language directory
+  */
+  function get_fs_languages($target_charset = null)
+  {
+    if ( empty($target_charset) )
+    {
+      $target_charset = get_pwg_charset();
+    }
+    $target_charset = strtolower($target_charset);
+
+    $dir = opendir(PHPWG_ROOT_PATH.'language');
+    while ($file = readdir($dir))
+    {
+      if ($file!='.' and $file!='..')
+      {
+        $path = PHPWG_ROOT_PATH.'language/'.$file;
+        if (is_dir($path) and !is_link($path)
+            and preg_match('/^[a-zA-Z0-9-_]+$/', $file )
+            and file_exists($path.'/common.lang.php')
+            )
+        {
+          $language = array(
+              'name'=>$file,
+              'code'=>$file,
+              'version'=>'0',
+              'uri'=>'',
+              'author'=>'',
+            );
+          $plg_data = implode( '', file($path.'/common.lang.php') );
+
+          if ( preg_match("|Language Name: (.*)|", $plg_data, $val) )
+          {
+            $language['name'] = trim( $val[1] );
+            $language['name'] = convert_charset($language['name'], 'utf-8', $target_charset);
+          }
+          if (preg_match("|Version: (.*)|", $plg_data, $val))
+          {
+            $language['version'] = trim($val[1]);
+          }
+          if ( preg_match("|Language URI: (.*)|", $plg_data, $val) )
+          {
+            $language['uri'] = trim($val[1]);
+          }
+          if ( preg_match("|Author: (.*)|", $plg_data, $val) )
+          {
+            $language['author'] = trim($val[1]);
+          }
+          if ( preg_match("|Author URI: (.*)|", $plg_data, $val) )
+          {
+            $language['author uri'] = trim($val[1]);
+          }
+          if (!empty($language['uri']) and strpos($language['uri'] , 'extension_view.php?eid='))
+          {
+            list( , $extension) = explode('extension_view.php?eid=', $language['uri']);
+            if (is_numeric($extension)) $language['extension'] = $extension;
+          }
+          // IMPORTANT SECURITY !
+          $language = array_map('htmlspecialchars', $language);
+          $this->fs_languages[$file] = $language;
+        }
+      }
+    }
+    closedir($dir);
+    @uasort($this->fs_languages, 'name_compare');
+  }
+
+  function get_db_languages()
+  {
+    $query = '
+  SELECT id, name
+    FROM '.LANGUAGES_TABLE.'
+    ORDER BY name ASC
+  ;';
+    $result = pwg_query($query);
+
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $this->db_languages[ $row['id'] ] = $row['name'];
+    }
+  }
+
+  /**
+   * Retrieve PEM server datas to $server_languages
+   */
+  function get_server_languages($new=false)
+  {
+    global $user;
+
+    $get_data = array(
+      'category_id' => 8,
+      'format' => 'php',
+    );
+
+    // Retrieve PEM versions
+    $version = PHPWG_VERSION;
+    $versions_to_check = array();
+    $url = PEM_URL . '/api/get_version_list.php';
+    if (fetchRemote($url, $result, $get_data) and $pem_versions = @unserialize($result))
+    {
+      if (!preg_match('/^\d+\.\d+\.\d+$/', $version))
+      {
+        $version = $pem_versions[0]['name'];
+      }
+      $branch = substr($version, 0, strrpos($version, '.'));
+      foreach ($pem_versions as $pem_version)
+      {
+        if (strpos($pem_version['name'], $branch) === 0)
+        {
+          $versions_to_check[] = $pem_version['id'];
+        }
+      }
+    }
+    if (empty($versions_to_check))
+    {
+      return false;
+    }
+
+    // Languages to check
+    $languages_to_check = array();
+    foreach($this->fs_languages as $fs_language)
+    {
+      if (isset($fs_language['extension']))
+      {
+        $languages_to_check[] = $fs_language['extension'];
+      }
+    }
+
+    // Retrieve PEM languages infos
+    $url = PEM_URL . '/api/get_revision_list.php';
+    $get_data = array_merge($get_data, array(
+      'last_revision_only' => 'true',
+      'version' => implode(',', $versions_to_check),
+      'lang' => $user['language'],
+      'get_nb_downloads' => 'true',
+      )
+    );
+    if (!empty($languages_to_check))
+    {
+      if ($new)
+      {
+        $get_data['extension_exclude'] = implode(',', $languages_to_check);
+      }
+      else
+      {
+        $get_data['extension_include'] = implode(',', $languages_to_check);
+      }
+    }
+
+    if (fetchRemote($url, $result, $get_data))
+    {
+      $pem_languages = @unserialize($result);
+      if (!is_array($pem_languages))
+      {
+        return false;
+      }
+      foreach ($pem_languages as $language)
+      {
+        if (preg_match('/^.*? \[[A-Z]{2}\]$/', $language['extension_name']))
+        {
+          $this->server_languages[$language['extension_id']] = $language;
+        }
+      }
+      @uasort($this->server_languages, array($this, 'extension_name_compare'));
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Extract language files from archive
+   *
+   * @param string - install or upgrade
+   * @param string - remote revision identifier (numeric)
+   * @param string - language id or extension id
+   */
+  function extract_language_files($action, $revision, $dest='')
+  {
+    if ($archive = tempnam( PHPWG_ROOT_PATH.'language', 'zip'))
+    {
+      $url = PEM_URL . '/download.php';
+      $get_data = array(
+        'rid' => $revision,
+        'origin' => 'piwigo_'.$action,
+      );
+
+      if ($handle = @fopen($archive, 'wb') and fetchRemote($url, $handle, $get_data))
+      {
+        fclose($handle);
+        include(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
+        $zip = new PclZip($archive);
+        if ($list = $zip->listContent())
+        {
+          foreach ($list as $file)
+          {
+            // we search common.lang.php in archive
+            if (basename($file['filename']) == 'common.lang.php'
+              and (!isset($main_filepath)
+              or strlen($file['filename']) < strlen($main_filepath)))
+            {
+              $main_filepath = $file['filename'];
+            }
+          }
+          if (isset($main_filepath))
+          {
+            $root = basename(dirname($main_filepath)); // common.lang.php path in archive
+            if (preg_match('/^[a-z]{2}_[A-Z]{2}$/', $root))
+            {
+              if ($action == 'install')
+              {
+                $dest = $root;
+              }
+              $extract_path = PHPWG_ROOT_PATH.'language/'.$dest;
+              if (
+                $result = $zip->extract(
+                  PCLZIP_OPT_PATH, $extract_path,
+                  PCLZIP_OPT_REMOVE_PATH, $root,
+                  PCLZIP_OPT_REPLACE_NEWER
+                  )
+                )
+              {
+                foreach ($result as $file)
+                {
+                  if ($file['stored_filename'] == $main_filepath)
+                  {
+                    $status = $file['status'];
+                    break;
+                  }
+                }
+                if ($status == 'ok')
+                {
+                  $this->get_fs_languages();
+                  if ($action == 'install')
+                  {
+                    $this->perform_action('activate', $dest);
+                  }
+                }
+                if (file_exists($extract_path.'/obsolete.list')
+                  and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
+                  and !empty($old_files))
+                {
+                  array_push($old_files, 'obsolete.list');
+                  foreach($old_files as $old_file)
+                  {
+                    $path = $extract_path.'/'.$old_file;
+                    if (is_file($path))
+                    {
+                      @unlink($path);
+                    }
+                    elseif (is_dir($path))
+                    {
+                      if (!$this->deltree($path))
+                      {
+                        $this->send_to_trash($path);
+                      }
+                    }
+                  }
+                }
+              }
+              else $status = 'extract_error';
+            }
+            else $status = 'archive_error';
+          }
+          else $status = 'archive_error';
+        }
+        else $status = 'archive_error';
+      }
+      else $status = 'dl_archive_error';
+    }
+    else $status = 'temp_path_error';
+
+    @unlink($archive);
+    return $status;
+  }
+
+  /**
+   * delete $path directory
+   * @param string - path
+   */
+  function deltree($path)
+  {
+    if (is_dir($path))
+    {
+      $fh = opendir($path);
+      while ($file = readdir($fh))
+      {
+        if ($file != '.' and $file != '..')
+        {
+          $pathfile = $path . '/' . $file;
+          if (is_dir($pathfile))
+          {
+            $this->deltree($pathfile);
+          }
+          else
+          {
+            @unlink($pathfile);
+          }
+        }
+      }
+      closedir($fh);
+      return @rmdir($path);
+    }
+  }
+
+  /**
+   * send $path to trash directory
+   * @param string - path
+   */
+  function send_to_trash($path)
+  {
+    $trash_path = PHPWG_ROOT_PATH . 'language/trash';
+    if (!is_dir($trash_path))
+    {
+      @mkdir($trash_path);
+      $file = @fopen($trash_path . '/.htaccess', 'w');
+      @fwrite($file, 'deny from all');
+      @fclose($file);
+    }
+    while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
+    {
+      if (!is_dir($r))
+      {
+        @rename($path, $r);
+        break;
+      }
+    }
+  }
+
+  /**
+   * Sort functions
+   */
+  function language_version_compare($a, $b)
+  {
+    $pattern = array('/([a-z])/ei', '/\.+/', '/\.\Z|\A\./');
+    $replacement = array( "'.'.intval('\\1', 36).'.'", '.', '');
+
+    $array = preg_replace($pattern, $replacement, array($a, $b));
+
+    return version_compare($array[0], $array[1], '>=');
+  }
+
+  function extension_name_compare($a, $b)
+  {
+    return strcmp(strtolower($a['extension_name']), strtolower($b['extension_name']));
+  }
+}
+?>
Index: tags/2.4.0RC3/admin/include/mysqldump.php
===================================================================
--- tags/2.4.0RC3/admin/include/mysqldump.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/mysqldump.php	(revision 14585)
@@ -0,0 +1,421 @@
+<?php
+/**
+* Dump MySQL database
+*
+* Here is an inline example:
+* <code>
+* $connection = @mysql_connect($dbhost,$dbuser,$dbpsw);
+* $dumper = new MySQLDump($dbname,'filename.sql',false,false);
+* $dumper->doDump();
+* </code>
+*
+* Special thanks to:
+* - Andrea Ingaglio <andrea@coders4fun.com> helping in development of all class code
+* - Dylan Pugh for precious advices halfing the size of the output file and for helping in debug
+*
+* @name    MySQLDump
+* @author  Daniele Viganò - CreativeFactory.it <daniele.vigano@creativefactory.it>
+* @version 2.20 - 02/11/2007
+* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+*/
+
+class MySQLDump {
+	/**
+	* @access private
+	*/
+	var $database = null;
+
+	/**
+	* @access private
+	*/
+	var $compress = false;
+
+	/**
+	* @access private
+	*/
+	var $hexValue = false;
+
+  /**
+	* The output filename
+	* @access private
+	*/
+	var $filename = null;
+
+	/**
+	* The pointer of the output file
+	* @access private
+	*/
+	var $file = null;
+
+	/**
+	* @access private
+	*/
+	var $isWritten = false;
+
+	/**
+	* Class constructor
+	* @param string $db The database name
+	* @param string $filepath The file where the dump will be written
+	* @param boolean $compress It defines if the output file is compress (gzip) or not
+	* @param boolean $hexValue It defines if the outup values are base-16 or not
+	*/
+	function MYSQLDump($db = null, $filepath = 'dump.sql', $compress = false, $hexValue = false){
+		$this->compress = $compress;
+		if ( !$this->setOutputFile($filepath) )
+			return false;
+		return $this->setDatabase($db);
+	}
+
+	/**
+	* Sets the database to work on
+	* @param string $db The database name
+	*/
+	function setDatabase($db){
+		$this->database = $db;
+		if ( !@mysql_select_db($this->database) )
+			return false;
+		return true;
+  }
+
+	/**
+	* Returns the database where the class is working on
+	* @return string
+	*/
+  function getDatabase(){
+		return $this->database;
+	}
+
+	/**
+	* Sets the output file type (It can be made only if the file hasn't been already written)
+	* @param boolean $compress If it's true, the output file will be compressed
+	*/
+	function setCompress($compress){
+		if ( $this->isWritten )
+			return false;
+		$this->compress = $compress;
+		$this->openFile($this->filename);
+		return true;
+  }
+
+	/**
+	* Returns if the output file is or not compressed
+	* @return boolean
+	*/
+  function getCompress(){
+		return $this->compress;
+	}
+
+	/**
+	* Sets the output file
+	* @param string $filepath The file where the dump will be written
+	*/
+	function setOutputFile($filepath){
+		if ( $this->isWritten )
+			return false;
+		$this->filename = $filepath;
+		$this->file = $this->openFile($this->filename);
+		return $this->file;
+  }
+
+  /**
+	* Returns the output filename
+	* @return string
+	*/
+  function getOutputFile(){
+		return $this->filename;
+	}
+
+	/**
+	* Writes to file the $table's structure
+	* @param string $table The table name
+	*/
+  function getTableStructure($table){
+		if ( !$this->setDatabase($this->database) )
+			return false;
+		// Structure Header
+		$structure = "-- \n";
+		$structure .= "-- Table structure for table `{$table}` \n";
+		$structure .= "-- \n\n";
+		// Dump Structure
+		$structure .= 'DROP TABLE IF EXISTS `'.$table.'`;'."\n";
+		$structure .= "CREATE TABLE `".$table."` (\n";
+		$records = @mysql_query('SHOW FIELDS FROM `'.$table.'`');
+		if ( @mysql_num_rows($records) == 0 )
+			return false;
+		while ( $record = mysql_fetch_assoc($records) ) {
+			$structure .= '`'.$record['Field'].'` '.$record['Type'];
+			if ( isset($record['Default']) )
+				$structure .= ' DEFAULT \''.$record['Default'].'\'';
+			if ( @strcmp($record['Null'],'YES') != 0 )
+				$structure .= ' NOT NULL';
+			elseif ( is_null($record['Default']) )
+				$structure .= ' DEFAULT NULL';
+			if ( !empty($record['Extra']) )
+				$structure .= ' '.$record['Extra'];
+			$structure .= ",\n";
+		}
+		$structure = @ereg_replace(",\n$", null, $structure);
+
+		// Save all Column Indexes
+		$structure .= $this->getSqlKeysTable($table);
+		$structure .= "\n)";
+
+		//Save table engine
+		$records = @mysql_query("SHOW TABLE STATUS LIKE '".$table."'");
+
+		if ( $record = @mysql_fetch_assoc($records) ) {
+			if ( !empty($record['Engine']) )
+				$structure .= ' ENGINE='.$record['Engine'];
+			if ( !empty($record['Auto_increment']) )
+				$structure .= ' AUTO_INCREMENT='.$record['Auto_increment'];
+		}
+
+		$structure .= ";\n\n-- --------------------------------------------------------\n\n";
+		$this->saveToFile($this->file,$structure);
+	}
+
+	/**
+	* Writes to file the $table's data
+	* @param string $table The table name
+	* @param boolean $hexValue It defines if the output is base 16 or not
+	*/
+	function getTableData($table,$hexValue = true) {
+		if ( !$this->setDatabase($this->database) )
+			return false;
+		// Header
+		$data = "-- \n";
+		$data .= "-- Dumping data for table `$table` \n";
+		$data .= "-- \n\n";
+
+		$records = mysql_query('SHOW FIELDS FROM `'.$table.'`');
+		$num_fields = @mysql_num_rows($records);
+		if ( $num_fields == 0 )
+			return false;
+		// Field names
+		$selectStatement = "SELECT ";
+		$insertStatement = "INSERT INTO `$table` (";
+		$hexField = array();
+		for ($x = 0; $x < $num_fields; $x++) {
+			$record = @mysql_fetch_assoc($records);
+			if ( ($hexValue) && ($this->isTextValue($record['Type'])) ) {
+				$selectStatement .= 'HEX(`'.$record['Field'].'`)';
+				$hexField [$x] = true;
+			}
+			else
+				$selectStatement .= '`'.$record['Field'].'`';
+			$insertStatement .= '`'.$record['Field'].'`';
+			$insertStatement .= ", ";
+			$selectStatement .= ", ";
+		}
+		$insertStatement = @substr($insertStatement,0,-2).') VALUES'."\n";
+		$selectStatement = @substr($selectStatement,0,-2).' FROM `'.$table.'`';
+
+		$records = @mysql_query($selectStatement);
+		$num_rows = @mysql_num_rows($records);
+		$num_fields = @mysql_num_fields($records);
+		// Dump data
+		if ( $num_rows > 0 ) {
+			$data .= $insertStatement;
+			for ($i = 0; $i < $num_rows; $i++) {
+				$record = @mysql_fetch_assoc($records);
+				$data .= ' (';
+				for ($j = 0; $j < $num_fields; $j++) {
+					$field_name = @mysql_field_name($records, $j);
+					if ( @$hexField[$j] && (@strlen($record[$field_name]) > 0) )
+						$data .= "0x".$record[$field_name];
+					elseif (is_null($record[$field_name]))
+						$data .= "NULL";
+					else
+						$data .= "'".@str_replace('\"','"',@mysql_real_escape_string($record[$field_name]))."'";
+					$data .= ',';
+				}
+				$data = @substr($data,0,-1).")";
+				$data .= ( $i < ($num_rows-1) ) ? ',' : ';';
+				$data .= "\n";
+				//if data in greather than 1MB save
+				if (strlen($data) > 1048576) {
+					$this->saveToFile($this->file,$data);
+					$data = '';
+				}
+			}
+			$data .= "\n-- --------------------------------------------------------\n\n";
+			$this->saveToFile($this->file,$data);
+		}
+	}
+
+  /**
+	* Writes to file all the selected database tables structure
+	* @return boolean
+	*/
+	function getDatabaseStructure(){
+		$records = @mysql_query('SHOW TABLES');
+		if ( @mysql_num_rows($records) == 0 )
+			return false;
+    $structure = '';
+		while ( $record = @mysql_fetch_row($records) ) {
+			$structure .= $this->getTableStructure($record[0]);
+		}
+		return true;
+  }
+
+	/**
+	* Writes to file all the selected database tables data
+	* @param boolean $hexValue It defines if the output is base-16 or not
+	*/
+	function getDatabaseData($hexValue = true){
+		$records = @mysql_query('SHOW TABLES');
+		if ( @mysql_num_rows($records) == 0 )
+			return false;
+		while ( $record = @mysql_fetch_row($records) ) {
+			$this->getTableData($record[0],$hexValue);
+		}
+  }
+
+	/**
+	* Writes to file the selected database dump
+	*/
+	function doDump() {
+		$this->saveToFile($this->file,"SET FOREIGN_KEY_CHECKS = 0;\n\n");
+		$this->getDatabaseStructure();
+		$this->getDatabaseData($this->hexValue);
+		$this->saveToFile($this->file,"SET FOREIGN_KEY_CHECKS = 1;\n\n");
+		$this->closeFile($this->file);
+		return true;
+	}
+	
+	/**
+	* @deprecated Look at the doDump() method
+	*/
+	function writeDump($filename) {
+		if ( !$this->setOutputFile($filename) )
+			return false;
+		$this->doDump();
+    $this->closeFile($this->file);
+    return true;
+	}
+
+	/**
+	* @access private
+	*/
+	function getSqlKeysTable ($table) {
+		$primary = "";
+		$unique = array();
+		$index = array();
+		$fulltext = array();
+		$results = mysql_query("SHOW KEYS FROM `{$table}`");
+		if ( @mysql_num_rows($results) == 0 )
+			return false;
+		while($row = mysql_fetch_object($results)) {
+			if (($row->Key_name == 'PRIMARY') AND ($row->Index_type == 'BTREE')) {
+				if ( $primary == "" )
+					$primary = "  PRIMARY KEY  (`{$row->Column_name}`";
+				else
+					$primary .= ", `{$row->Column_name}`";
+			}
+			if (($row->Key_name != 'PRIMARY') AND ($row->Non_unique == '0') AND ($row->Index_type == 'BTREE')) {
+				if ( (empty($unique)) OR (empty($unique[$row->Key_name])) )
+					$unique[$row->Key_name] = "  UNIQUE KEY `{$row->Key_name}` (`{$row->Column_name}`";
+				else
+					$unique[$row->Key_name] .= ", `{$row->Column_name}`";
+			}
+			if (($row->Key_name != 'PRIMARY') AND ($row->Non_unique == '1') AND ($row->Index_type == 'BTREE')) {
+				if ( (empty($index)) OR (empty($index[$row->Key_name])) )
+					$index[$row->Key_name] = "  KEY `{$row->Key_name}` (`{$row->Column_name}`";
+				else
+					$index[$row->Key_name] .= ", `{$row->Column_name}`";
+			}
+			if (($row->Key_name != 'PRIMARY') AND ($row->Non_unique == '1') AND ($row->Index_type == 'FULLTEXT')) {
+				if ( (empty($fulltext)) OR (empty($fulltext[$row->Key_name])) )
+					$fulltext[$row->Key_name] = "  FULLTEXT `{$row->Key_name}` (`{$row->Column_name}`";
+				else
+					$fulltext[$row->Key_name] .= ", `{$row->Column_name}`";
+			}
+		}
+		$sqlKeyStatement = '';
+		// generate primary, unique, key and fulltext
+		if ( $primary != "" ) {
+			$sqlKeyStatement .= ",\n";
+			$primary .= ")";
+			$sqlKeyStatement .= $primary;
+		}
+		if (!empty($unique)) {
+			foreach ($unique as $keyName => $keyDef) {
+				$sqlKeyStatement .= ",\n";
+				$keyDef .= ")";
+				$sqlKeyStatement .= $keyDef;
+
+			}
+		}
+		if (!empty($index)) {
+			foreach ($index as $keyName => $keyDef) {
+				$sqlKeyStatement .= ",\n";
+				$keyDef .= ")";
+				$sqlKeyStatement .= $keyDef;
+			}
+		}
+		if (!empty($fulltext)) {
+			foreach ($fulltext as $keyName => $keyDef) {
+				$sqlKeyStatement .= ",\n";
+				$keyDef .= ")";
+				$sqlKeyStatement .= $keyDef;
+			}
+		}
+		return $sqlKeyStatement;
+	}
+
+  /**
+	* @access private
+	*/
+	function isTextValue($field_type) {
+		switch ($field_type) {
+			case "tinytext":
+			case "text":
+			case "mediumtext":
+			case "longtext":
+			case "binary":
+			case "varbinary":
+			case "tinyblob":
+			case "blob":
+			case "mediumblob":
+			case "longblob":
+				return True;
+				break;
+			default:
+				return False;
+		}
+	}
+	
+	/**
+	* @access private
+	*/
+	function openFile($filename) {
+		$file = false;
+		if ( $this->compress )
+			$file = @gzopen($filename, "w9");
+		else
+			$file = @fopen($filename, "w");
+		return $file;
+	}
+
+  /**
+	* @access private
+	*/
+	function saveToFile($file, $data) {
+		if ( $this->compress )
+			@gzwrite($file, $data);
+		else
+			@fwrite($file, $data);
+		$this->isWritten = true;
+	}
+
+  /**
+	* @access private
+	*/
+	function closeFile($file) {
+		if ( $this->compress )
+			@gzclose($file);
+		else
+			@fclose($file);
+	}
+}
+?>
Index: tags/2.4.0RC3/admin/include/pclzip.lib.php
===================================================================
--- tags/2.4.0RC3/admin/include/pclzip.lib.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/pclzip.lib.php	(revision 14585)
@@ -0,0 +1,5694 @@
+<?php
+// --------------------------------------------------------------------------------
+// PhpConcept Library - Zip Module 2.8.2
+// --------------------------------------------------------------------------------
+// License GNU/LGPL - Vincent Blavet - August 2009
+// http://www.phpconcept.net
+// --------------------------------------------------------------------------------
+//
+// Presentation :
+//   PclZip is a PHP library that manage ZIP archives.
+//   So far tests show that archives generated by PclZip are readable by
+//   WinZip application and other tools.
+//
+// Description :
+//   See readme.txt and http://www.phpconcept.net
+//
+// Warning :
+//   This library and the associated files are non commercial, non professional
+//   work.
+//   It should not have unexpected results. However if any damage is caused by
+//   this software the author can not be responsible.
+//   The use of this software is at the risk of the user.
+//
+// --------------------------------------------------------------------------------
+// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $
+// --------------------------------------------------------------------------------
+
+  // ----- Constants
+  if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
+    define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
+  }
+  
+  // ----- File list separator
+  // In version 1.x of PclZip, the separator for file list is a space
+  // (which is not a very smart choice, specifically for windows paths !).
+  // A better separator should be a comma (,). This constant gives you the
+  // abilty to change that.
+  // However notice that changing this value, may have impact on existing
+  // scripts, using space separated filenames.
+  // Recommanded values for compatibility with older versions :
+  //define( 'PCLZIP_SEPARATOR', ' ' );
+  // Recommanded values for smart separation of filenames.
+  if (!defined('PCLZIP_SEPARATOR')) {
+    define( 'PCLZIP_SEPARATOR', ',' );
+  }
+
+  // ----- Error configuration
+  // 0 : PclZip Class integrated error handling
+  // 1 : PclError external library error handling. By enabling this
+  //     you must ensure that you have included PclError library.
+  // [2,...] : reserved for futur use
+  if (!defined('PCLZIP_ERROR_EXTERNAL')) {
+    define( 'PCLZIP_ERROR_EXTERNAL', 0 );
+  }
+
+  // ----- Optional static temporary directory
+  //       By default temporary files are generated in the script current
+  //       path.
+  //       If defined :
+  //       - MUST BE terminated by a '/'.
+  //       - MUST be a valid, already created directory
+  //       Samples :
+  // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
+  // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
+  if (!defined('PCLZIP_TEMPORARY_DIR')) {
+    define( 'PCLZIP_TEMPORARY_DIR', '' );
+  }
+
+  // ----- Optional threshold ratio for use of temporary files
+  //       Pclzip sense the size of the file to add/extract and decide to
+  //       use or not temporary file. The algorythm is looking for 
+  //       memory_limit of PHP and apply a ratio.
+  //       threshold = memory_limit * ratio.
+  //       Recommended values are under 0.5. Default 0.47.
+  //       Samples :
+  // define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 );
+  if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) {
+    define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 );
+  }
+
+// --------------------------------------------------------------------------------
+// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED *****
+// --------------------------------------------------------------------------------
+
+  // ----- Global variables
+  $g_pclzip_version = "2.8.2";
+
+  // ----- Error codes
+  //   -1 : Unable to open file in binary write mode
+  //   -2 : Unable to open file in binary read mode
+  //   -3 : Invalid parameters
+  //   -4 : File does not exist
+  //   -5 : Filename is too long (max. 255)
+  //   -6 : Not a valid zip file
+  //   -7 : Invalid extracted file size
+  //   -8 : Unable to create directory
+  //   -9 : Invalid archive extension
+  //  -10 : Invalid archive format
+  //  -11 : Unable to delete file (unlink)
+  //  -12 : Unable to rename file (rename)
+  //  -13 : Invalid header checksum
+  //  -14 : Invalid archive size
+  define( 'PCLZIP_ERR_USER_ABORTED', 2 );
+  define( 'PCLZIP_ERR_NO_ERROR', 0 );
+  define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 );
+  define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 );
+  define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 );
+  define( 'PCLZIP_ERR_MISSING_FILE', -4 );
+  define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 );
+  define( 'PCLZIP_ERR_INVALID_ZIP', -6 );
+  define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 );
+  define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 );
+  define( 'PCLZIP_ERR_BAD_EXTENSION', -9 );
+  define( 'PCLZIP_ERR_BAD_FORMAT', -10 );
+  define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 );
+  define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 );
+  define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 );
+  define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 );
+  define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 );
+  define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 );
+  define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 );
+  define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 );
+  define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 );
+  define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 );
+  define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 );
+
+  // ----- Options values
+  define( 'PCLZIP_OPT_PATH', 77001 );
+  define( 'PCLZIP_OPT_ADD_PATH', 77002 );
+  define( 'PCLZIP_OPT_REMOVE_PATH', 77003 );
+  define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 );
+  define( 'PCLZIP_OPT_SET_CHMOD', 77005 );
+  define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 );
+  define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 );
+  define( 'PCLZIP_OPT_BY_NAME', 77008 );
+  define( 'PCLZIP_OPT_BY_INDEX', 77009 );
+  define( 'PCLZIP_OPT_BY_EREG', 77010 );
+  define( 'PCLZIP_OPT_BY_PREG', 77011 );
+  define( 'PCLZIP_OPT_COMMENT', 77012 );
+  define( 'PCLZIP_OPT_ADD_COMMENT', 77013 );
+  define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 );
+  define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 );
+  define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 );
+  define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 );
+  // Having big trouble with crypt. Need to multiply 2 long int
+  // which is not correctly supported by PHP ...
+  //define( 'PCLZIP_OPT_CRYPT', 77018 );
+  define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 );
+  define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 );
+  define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); // alias
+  define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 );
+  define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias
+  define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );
+  define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias
+  
+  // ----- File description attributes
+  define( 'PCLZIP_ATT_FILE_NAME', 79001 );
+  define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
+  define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 );
+  define( 'PCLZIP_ATT_FILE_MTIME', 79004 );
+  define( 'PCLZIP_ATT_FILE_CONTENT', 79005 );
+  define( 'PCLZIP_ATT_FILE_COMMENT', 79006 );
+
+  // ----- Call backs values
+  define( 'PCLZIP_CB_PRE_EXTRACT', 78001 );
+  define( 'PCLZIP_CB_POST_EXTRACT', 78002 );
+  define( 'PCLZIP_CB_PRE_ADD', 78003 );
+  define( 'PCLZIP_CB_POST_ADD', 78004 );
+  /* For futur use
+  define( 'PCLZIP_CB_PRE_LIST', 78005 );
+  define( 'PCLZIP_CB_POST_LIST', 78006 );
+  define( 'PCLZIP_CB_PRE_DELETE', 78007 );
+  define( 'PCLZIP_CB_POST_DELETE', 78008 );
+  */
+
+  // --------------------------------------------------------------------------------
+  // Class : PclZip
+  // Description :
+  //   PclZip is the class that represent a Zip archive.
+  //   The public methods allow the manipulation of the archive.
+  // Attributes :
+  //   Attributes must not be accessed directly.
+  // Methods :
+  //   PclZip() : Object creator
+  //   create() : Creates the Zip archive
+  //   listContent() : List the content of the Zip archive
+  //   extract() : Extract the content of the archive
+  //   properties() : List the properties of the archive
+  // --------------------------------------------------------------------------------
+  class PclZip
+  {
+    // ----- Filename of the zip file
+    var $zipname = '';
+
+    // ----- File descriptor of the zip file
+    var $zip_fd = 0;
+
+    // ----- Internal error handling
+    var $error_code = 1;
+    var $error_string = '';
+    
+    // ----- Current status of the magic_quotes_runtime
+    // This value store the php configuration for magic_quotes
+    // The class can then disable the magic_quotes and reset it after
+    var $magic_quotes_status;
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZip()
+  // Description :
+  //   Creates a PclZip object and set the name of the associated Zip archive
+  //   filename.
+  //   Note that no real action is taken, if the archive does not exist it is not
+  //   created. Use create() for that.
+  // --------------------------------------------------------------------------------
+  function PclZip($p_zipname)
+  {
+
+    // ----- Tests the zlib
+    if (!function_exists('gzopen'))
+    {
+      die('Abort '.basename(__FILE__).' : Missing zlib extensions');
+    }
+
+    // ----- Set the attributes
+    $this->zipname = $p_zipname;
+    $this->zip_fd = 0;
+    $this->magic_quotes_status = -1;
+
+    // ----- Return
+    return;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   create($p_filelist, $p_add_dir="", $p_remove_dir="")
+  //   create($p_filelist, $p_option, $p_option_value, ...)
+  // Description :
+  //   This method supports two different synopsis. The first one is historical.
+  //   This method creates a Zip Archive. The Zip file is created in the
+  //   filesystem. The files and directories indicated in $p_filelist
+  //   are added in the archive. See the parameters description for the
+  //   supported format of $p_filelist.
+  //   When a directory is in the list, the directory and its content is added
+  //   in the archive.
+  //   In this synopsis, the function takes an optional variable list of
+  //   options. See bellow the supported options.
+  // Parameters :
+  //   $p_filelist : An array containing file or directory names, or
+  //                 a string containing one filename or one directory name, or
+  //                 a string containing a list of filenames and/or directory
+  //                 names separated by spaces.
+  //   $p_add_dir : A path to add before the real path of the archived file,
+  //                in order to have it memorized in the archive.
+  //   $p_remove_dir : A path to remove from the real path of the file to archive,
+  //                   in order to have a shorter path memorized in the archive.
+  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
+  //                   is removed first, before $p_add_dir is added.
+  // Options :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_COMMENT :
+  //   PCLZIP_CB_PRE_ADD :
+  //   PCLZIP_CB_POST_ADD :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the added files, with a status of the add action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function create($p_filelist)
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Set default values
+    $v_options = array();
+    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove from the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_ADD => 'optional',
+                                                   PCLZIP_CB_POST_ADD => 'optional',
+                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
+                                                   PCLZIP_OPT_COMMENT => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
+                                                   //, PCLZIP_OPT_CRYPT => 'optional'
+                                             ));
+        if ($v_result != 1) {
+          return 0;
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+
+        // ----- Get the first argument
+        $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                       "Invalid number / type of arguments");
+          return 0;
+        }
+      }
+    }
+    
+    // ----- Look for default option values
+    $this->privOptionDefaultThreshold($v_options);
+
+    // ----- Init
+    $v_string_list = array();
+    $v_att_list = array();
+    $v_filedescr_list = array();
+    $p_result_list = array();
+    
+    // ----- Look if the $p_filelist is really an array
+    if (is_array($p_filelist)) {
+    
+      // ----- Look if the first element is also an array
+      //       This will mean that this is a file description entry
+      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
+        $v_att_list = $p_filelist;
+      }
+      
+      // ----- The list is a list of string names
+      else {
+        $v_string_list = $p_filelist;
+      }
+    }
+
+    // ----- Look if the $p_filelist is a string
+    else if (is_string($p_filelist)) {
+      // ----- Create a list from the string
+      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
+    }
+
+    // ----- Invalid variable type for $p_filelist
+    else {
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
+      return 0;
+    }
+    
+    // ----- Reformat the string list
+    if (sizeof($v_string_list) != 0) {
+      foreach ($v_string_list as $v_string) {
+        if ($v_string != '') {
+          $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
+        }
+        else {
+        }
+      }
+    }
+    
+    // ----- For each file in the list check the attributes
+    $v_supported_attributes
+    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
+             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_MTIME => 'optional'
+             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
+             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
+						);
+    foreach ($v_att_list as $v_entry) {
+      $v_result = $this->privFileDescrParseAtt($v_entry,
+                                               $v_filedescr_list[],
+                                               $v_options,
+                                               $v_supported_attributes);
+      if ($v_result != 1) {
+        return 0;
+      }
+    }
+
+    // ----- Expand the filelist (expand directories)
+    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
+    if ($v_result != 1) {
+      return 0;
+    }
+
+    // ----- Call the create fct
+    $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options);
+    if ($v_result != 1) {
+      return 0;
+    }
+
+    // ----- Return
+    return $p_result_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   add($p_filelist, $p_add_dir="", $p_remove_dir="")
+  //   add($p_filelist, $p_option, $p_option_value, ...)
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This methods add the list of files in an existing archive.
+  //   If a file with the same name already exists, it is added at the end of the
+  //   archive, the first one is still present.
+  //   If the archive does not exist, it is created.
+  // Parameters :
+  //   $p_filelist : An array containing file or directory names, or
+  //                 a string containing one filename or one directory name, or
+  //                 a string containing a list of filenames and/or directory
+  //                 names separated by spaces.
+  //   $p_add_dir : A path to add before the real path of the archived file,
+  //                in order to have it memorized in the archive.
+  //   $p_remove_dir : A path to remove from the real path of the file to archive,
+  //                   in order to have a shorter path memorized in the archive.
+  //                   When $p_add_dir and $p_remove_dir are set, $p_remove_dir
+  //                   is removed first, before $p_add_dir is added.
+  // Options :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_COMMENT :
+  //   PCLZIP_OPT_ADD_COMMENT :
+  //   PCLZIP_OPT_PREPEND_COMMENT :
+  //   PCLZIP_CB_PRE_ADD :
+  //   PCLZIP_CB_POST_ADD :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the added files, with a status of the add action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function add($p_filelist)
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Set default values
+    $v_options = array();
+    $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove form the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_ADD => 'optional',
+                                                   PCLZIP_CB_POST_ADD => 'optional',
+                                                   PCLZIP_OPT_NO_COMPRESSION => 'optional',
+                                                   PCLZIP_OPT_COMMENT => 'optional',
+                                                   PCLZIP_OPT_ADD_COMMENT => 'optional',
+                                                   PCLZIP_OPT_PREPEND_COMMENT => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
+                                                   //, PCLZIP_OPT_CRYPT => 'optional'
+												   ));
+        if ($v_result != 1) {
+          return 0;
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+
+        // ----- Get the first argument
+        $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          return 0;
+        }
+      }
+    }
+
+    // ----- Look for default option values
+    $this->privOptionDefaultThreshold($v_options);
+
+    // ----- Init
+    $v_string_list = array();
+    $v_att_list = array();
+    $v_filedescr_list = array();
+    $p_result_list = array();
+    
+    // ----- Look if the $p_filelist is really an array
+    if (is_array($p_filelist)) {
+    
+      // ----- Look if the first element is also an array
+      //       This will mean that this is a file description entry
+      if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
+        $v_att_list = $p_filelist;
+      }
+      
+      // ----- The list is a list of string names
+      else {
+        $v_string_list = $p_filelist;
+      }
+    }
+
+    // ----- Look if the $p_filelist is a string
+    else if (is_string($p_filelist)) {
+      // ----- Create a list from the string
+      $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist);
+    }
+
+    // ----- Invalid variable type for $p_filelist
+    else {
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
+      return 0;
+    }
+    
+    // ----- Reformat the string list
+    if (sizeof($v_string_list) != 0) {
+      foreach ($v_string_list as $v_string) {
+        $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
+      }
+    }
+    
+    // ----- For each file in the list check the attributes
+    $v_supported_attributes
+    = array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
+             ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional'
+             ,PCLZIP_ATT_FILE_MTIME => 'optional'
+             ,PCLZIP_ATT_FILE_CONTENT => 'optional'
+             ,PCLZIP_ATT_FILE_COMMENT => 'optional'
+						);
+    foreach ($v_att_list as $v_entry) {
+      $v_result = $this->privFileDescrParseAtt($v_entry,
+                                               $v_filedescr_list[],
+                                               $v_options,
+                                               $v_supported_attributes);
+      if ($v_result != 1) {
+        return 0;
+      }
+    }
+
+    // ----- Expand the filelist (expand directories)
+    $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options);
+    if ($v_result != 1) {
+      return 0;
+    }
+
+    // ----- Call the create fct
+    $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options);
+    if ($v_result != 1) {
+      return 0;
+    }
+
+    // ----- Return
+    return $p_result_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : listContent()
+  // Description :
+  //   This public method, gives the list of the files and directories, with their
+  //   properties.
+  //   The properties of each entries in the list are (used also in other functions) :
+  //     filename : Name of the file. For a create or add action it is the filename
+  //                given by the user. For an extract function it is the filename
+  //                of the extracted file.
+  //     stored_filename : Name of the file / directory stored in the archive.
+  //     size : Size of the stored file.
+  //     compressed_size : Size of the file's data compressed in the archive
+  //                       (without the headers overhead)
+  //     mtime : Last known modification date of the file (UNIX timestamp)
+  //     comment : Comment associated with the file
+  //     folder : true | false
+  //     index : index of the file in the archive
+  //     status : status of the action (depending of the action) :
+  //              Values are :
+  //                ok : OK !
+  //                filtered : the file / dir is not extracted (filtered by user)
+  //                already_a_directory : the file can not be extracted because a
+  //                                      directory with the same name already exists
+  //                write_protected : the file can not be extracted because a file
+  //                                  with the same name already exists and is
+  //                                  write protected
+  //                newer_exist : the file was not extracted because a newer file exists
+  //                path_creation_fail : the file is not extracted because the folder
+  //                                     does not exist and can not be created
+  //                write_error : the file was not extracted because there was a
+  //                              error while writing the file
+  //                read_error : the file was not extracted because there was a error
+  //                             while reading the file
+  //                invalid_header : the file was not extracted because of an archive
+  //                                 format error (bad file header)
+  //   Note that each time a method can continue operating when there
+  //   is an action error on a file, the error is only logged in the file status.
+  // Return Values :
+  //   0 on an unrecoverable failure,
+  //   The list of the files in the archive.
+  // --------------------------------------------------------------------------------
+  function listContent()
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      return(0);
+    }
+
+    // ----- Call the extracting fct
+    $p_list = array();
+    if (($v_result = $this->privList($p_list)) != 1)
+    {
+      unset($p_list);
+      return(0);
+    }
+
+    // ----- Return
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   extract($p_path="./", $p_remove_path="")
+  //   extract([$p_option, $p_option_value, ...])
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This method extract all the files / directories from the archive to the
+  //   folder indicated in $p_path.
+  //   If you want to ignore the 'root' part of path of the memorized files
+  //   you can indicate this in the optional $p_remove_path parameter.
+  //   By default, if a newer file with the same name already exists, the
+  //   file is not extracted.
+  //
+  //   If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions
+  //   are used, the path indicated in PCLZIP_OPT_ADD_PATH is append
+  //   at the end of the path value of PCLZIP_OPT_PATH.
+  // Parameters :
+  //   $p_path : Path where the files and directories are to be extracted
+  //   $p_remove_path : First part ('root' part) of the memorized path
+  //                    (if any similar) to remove while extracting.
+  // Options :
+  //   PCLZIP_OPT_PATH :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_CB_PRE_EXTRACT :
+  //   PCLZIP_CB_POST_EXTRACT :
+  // Return Values :
+  //   0 or a negative value on failure,
+  //   The list of the extracted files, with a status of the action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function extract()
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+//    $v_path = "./";
+    $v_path = '';
+    $v_remove_path = "";
+    $v_remove_all_path = false;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+
+    // ----- Default values for option
+    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+
+    // ----- Look for arguments
+    if ($v_size > 0) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
+                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
+                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
+                                                   PCLZIP_OPT_BY_NAME => 'optional',
+                                                   PCLZIP_OPT_BY_EREG => 'optional',
+                                                   PCLZIP_OPT_BY_PREG => 'optional',
+                                                   PCLZIP_OPT_BY_INDEX => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional',
+                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
+                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
+                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
+												    ));
+        if ($v_result != 1) {
+          return 0;
+        }
+
+        // ----- Set the arguments
+        if (isset($v_options[PCLZIP_OPT_PATH])) {
+          $v_path = $v_options[PCLZIP_OPT_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
+          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
+          // ----- Check for '/' in last path char
+          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
+            $v_path .= '/';
+          }
+          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+
+        // ----- Get the first argument
+        $v_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_remove_path = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          return 0;
+        }
+      }
+    }
+
+    // ----- Look for default option values
+    $this->privOptionDefaultThreshold($v_options);
+
+    // ----- Trace
+
+    // ----- Call the extracting fct
+    $p_list = array();
+    $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path,
+	                                     $v_remove_all_path, $v_options);
+    if ($v_result < 1) {
+      unset($p_list);
+      return(0);
+    }
+
+    // ----- Return
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   extractByIndex($p_index, $p_path="./", $p_remove_path="")
+  //   extractByIndex($p_index, [$p_option, $p_option_value, ...])
+  // Description :
+  //   This method supports two synopsis. The first one is historical.
+  //   This method is doing a partial extract of the archive.
+  //   The extracted files or folders are identified by their index in the
+  //   archive (from 0 to n).
+  //   Note that if the index identify a folder, only the folder entry is
+  //   extracted, not all the files included in the archive.
+  // Parameters :
+  //   $p_index : A single index (integer) or a string of indexes of files to
+  //              extract. The form of the string is "0,4-6,8-12" with only numbers
+  //              and '-' for range or ',' to separate ranges. No spaces or ';'
+  //              are allowed.
+  //   $p_path : Path where the files and directories are to be extracted
+  //   $p_remove_path : First part ('root' part) of the memorized path
+  //                    (if any similar) to remove while extracting.
+  // Options :
+  //   PCLZIP_OPT_PATH :
+  //   PCLZIP_OPT_ADD_PATH :
+  //   PCLZIP_OPT_REMOVE_PATH :
+  //   PCLZIP_OPT_REMOVE_ALL_PATH :
+  //   PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and
+  //     not as files.
+  //     The resulting content is in a new field 'content' in the file
+  //     structure.
+  //     This option must be used alone (any other options are ignored).
+  //   PCLZIP_CB_PRE_EXTRACT :
+  //   PCLZIP_CB_POST_EXTRACT :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the extracted files, with a status of the action.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  //function extractByIndex($p_index, options...)
+  function extractByIndex($p_index)
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+//    $v_path = "./";
+    $v_path = '';
+    $v_remove_path = "";
+    $v_remove_all_path = false;
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+
+    // ----- Default values for option
+    $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+
+    // ----- Look for arguments
+    if ($v_size > 1) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Remove form the options list the first argument
+      array_shift($v_arg_list);
+      $v_size--;
+
+      // ----- Look for first arg
+      if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) {
+
+        // ----- Parse the options
+        $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                            array (PCLZIP_OPT_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_PATH => 'optional',
+                                                   PCLZIP_OPT_REMOVE_ALL_PATH => 'optional',
+                                                   PCLZIP_OPT_EXTRACT_AS_STRING => 'optional',
+                                                   PCLZIP_OPT_ADD_PATH => 'optional',
+                                                   PCLZIP_CB_PRE_EXTRACT => 'optional',
+                                                   PCLZIP_CB_POST_EXTRACT => 'optional',
+                                                   PCLZIP_OPT_SET_CHMOD => 'optional',
+                                                   PCLZIP_OPT_REPLACE_NEWER => 'optional'
+                                                   ,PCLZIP_OPT_STOP_ON_ERROR => 'optional'
+                                                   ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_ON => 'optional',
+                                                   PCLZIP_OPT_TEMP_FILE_OFF => 'optional'
+												   ));
+        if ($v_result != 1) {
+          return 0;
+        }
+
+        // ----- Set the arguments
+        if (isset($v_options[PCLZIP_OPT_PATH])) {
+          $v_path = $v_options[PCLZIP_OPT_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) {
+          $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+          $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+        }
+        if (isset($v_options[PCLZIP_OPT_ADD_PATH])) {
+          // ----- Check for '/' in last path char
+          if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) {
+            $v_path .= '/';
+          }
+          $v_path .= $v_options[PCLZIP_OPT_ADD_PATH];
+        }
+        if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) {
+          $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE;
+        }
+        else {
+        }
+      }
+
+      // ----- Look for 2 args
+      // Here we need to support the first historic synopsis of the
+      // method.
+      else {
+
+        // ----- Get the first argument
+        $v_path = $v_arg_list[0];
+
+        // ----- Look for the optional second argument
+        if ($v_size == 2) {
+          $v_remove_path = $v_arg_list[1];
+        }
+        else if ($v_size > 2) {
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments");
+
+          // ----- Return
+          return 0;
+        }
+      }
+    }
+
+    // ----- Trace
+
+    // ----- Trick
+    // Here I want to reuse extractByRule(), so I need to parse the $p_index
+    // with privParseOptions()
+    $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index);
+    $v_options_trick = array();
+    $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick,
+                                        array (PCLZIP_OPT_BY_INDEX => 'optional' ));
+    if ($v_result != 1) {
+        return 0;
+    }
+    $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX];
+
+    // ----- Look for default option values
+    $this->privOptionDefaultThreshold($v_options);
+
+    // ----- Call the extracting fct
+    if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) {
+        return(0);
+    }
+
+    // ----- Return
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function :
+  //   delete([$p_option, $p_option_value, ...])
+  // Description :
+  //   This method removes files from the archive.
+  //   If no parameters are given, then all the archive is emptied.
+  // Parameters :
+  //   None or optional arguments.
+  // Options :
+  //   PCLZIP_OPT_BY_INDEX :
+  //   PCLZIP_OPT_BY_NAME :
+  //   PCLZIP_OPT_BY_EREG : 
+  //   PCLZIP_OPT_BY_PREG :
+  // Return Values :
+  //   0 on failure,
+  //   The list of the files which are still present in the archive.
+  //   (see PclZip::listContent() for list entry format)
+  // --------------------------------------------------------------------------------
+  function delete()
+  {
+    $v_result=1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      return(0);
+    }
+
+    // ----- Set default values
+    $v_options = array();
+
+    // ----- Look for variable options arguments
+    $v_size = func_num_args();
+
+    // ----- Look for arguments
+    if ($v_size > 0) {
+      // ----- Get the arguments
+      $v_arg_list = func_get_args();
+
+      // ----- Parse the options
+      $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options,
+                                        array (PCLZIP_OPT_BY_NAME => 'optional',
+                                               PCLZIP_OPT_BY_EREG => 'optional',
+                                               PCLZIP_OPT_BY_PREG => 'optional',
+                                               PCLZIP_OPT_BY_INDEX => 'optional' ));
+      if ($v_result != 1) {
+          return 0;
+      }
+    }
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Call the delete fct
+    $v_list = array();
+    if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) {
+      $this->privSwapBackMagicQuotes();
+      unset($v_list);
+      return(0);
+    }
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    return $v_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : deleteByIndex()
+  // Description :
+  //   ***** Deprecated *****
+  //   delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered.
+  // --------------------------------------------------------------------------------
+  function deleteByIndex($p_index)
+  {
+    
+    $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
+
+    // ----- Return
+    return $p_list;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : properties()
+  // Description :
+  //   This method gives the properties of the archive.
+  //   The properties are :
+  //     nb : Number of files in the archive
+  //     comment : Comment associated with the archive file
+  //     status : not_exist, ok
+  // Parameters :
+  //   None
+  // Return Values :
+  //   0 on failure,
+  //   An array with the archive properties.
+  // --------------------------------------------------------------------------------
+  function properties()
+  {
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      $this->privSwapBackMagicQuotes();
+      return(0);
+    }
+
+    // ----- Default properties
+    $v_prop = array();
+    $v_prop['comment'] = '';
+    $v_prop['nb'] = 0;
+    $v_prop['status'] = 'not_exist';
+
+    // ----- Look if file exists
+    if (@is_file($this->zipname))
+    {
+      // ----- Open the zip file
+      if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
+      {
+        $this->privSwapBackMagicQuotes();
+        
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
+
+        // ----- Return
+        return 0;
+      }
+
+      // ----- Read the central directory informations
+      $v_central_dir = array();
+      if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+      {
+        $this->privSwapBackMagicQuotes();
+        return 0;
+      }
+
+      // ----- Close the zip file
+      $this->privCloseFd();
+
+      // ----- Set the user attributes
+      $v_prop['comment'] = $v_central_dir['comment'];
+      $v_prop['nb'] = $v_central_dir['entries'];
+      $v_prop['status'] = 'ok';
+    }
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    return $v_prop;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : duplicate()
+  // Description :
+  //   This method creates an archive by copying the content of an other one. If
+  //   the archive already exist, it is replaced by the new one without any warning.
+  // Parameters :
+  //   $p_archive : The filename of a valid archive, or
+  //                a valid PclZip object.
+  // Return Values :
+  //   1 on success.
+  //   0 or a negative value on error (error code).
+  // --------------------------------------------------------------------------------
+  function duplicate($p_archive)
+  {
+    $v_result = 1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Look if the $p_archive is a PclZip object
+    if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip'))
+    {
+
+      // ----- Duplicate the archive
+      $v_result = $this->privDuplicate($p_archive->zipname);
+    }
+
+    // ----- Look if the $p_archive is a string (so a filename)
+    else if (is_string($p_archive))
+    {
+
+      // ----- Check that $p_archive is a valid zip file
+      // TBC : Should also check the archive format
+      if (!is_file($p_archive)) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'");
+        $v_result = PCLZIP_ERR_MISSING_FILE;
+      }
+      else {
+        // ----- Duplicate the archive
+        $v_result = $this->privDuplicate($p_archive);
+      }
+    }
+
+    // ----- Invalid variable
+    else
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
+      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : merge()
+  // Description :
+  //   This method merge the $p_archive_to_add archive at the end of the current
+  //   one ($this).
+  //   If the archive ($this) does not exist, the merge becomes a duplicate.
+  //   If the $p_archive_to_add archive does not exist, the merge is a success.
+  // Parameters :
+  //   $p_archive_to_add : It can be directly the filename of a valid zip archive,
+  //                       or a PclZip object archive.
+  // Return Values :
+  //   1 on success,
+  //   0 or negative values on error (see below).
+  // --------------------------------------------------------------------------------
+  function merge($p_archive_to_add)
+  {
+    $v_result = 1;
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Check archive
+    if (!$this->privCheckFormat()) {
+      return(0);
+    }
+
+    // ----- Look if the $p_archive_to_add is a PclZip object
+    if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip'))
+    {
+
+      // ----- Merge the archive
+      $v_result = $this->privMerge($p_archive_to_add);
+    }
+
+    // ----- Look if the $p_archive_to_add is a string (so a filename)
+    else if (is_string($p_archive_to_add))
+    {
+
+      // ----- Create a temporary archive
+      $v_object_archive = new PclZip($p_archive_to_add);
+
+      // ----- Merge the archive
+      $v_result = $this->privMerge($v_object_archive);
+    }
+
+    // ----- Invalid variable
+    else
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add");
+      $v_result = PCLZIP_ERR_INVALID_PARAMETER;
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+
+
+  // --------------------------------------------------------------------------------
+  // Function : errorCode()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorCode()
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      return(PclErrorCode());
+    }
+    else {
+      return($this->error_code);
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : errorName()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorName($p_with_code=false)
+  {
+    $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR',
+                      PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL',
+                      PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL',
+                      PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER',
+                      PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE',
+                      PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG',
+                      PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP',
+                      PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE',
+                      PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL',
+                      PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION',
+                      PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT',
+                      PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL',
+                      PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL',
+                      PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM',
+                      PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP',
+                      PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE',
+                      PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE',
+                      PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION',
+                      PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION'
+                      ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE'
+                      ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION'
+                    );
+
+    if (isset($v_name[$this->error_code])) {
+      $v_value = $v_name[$this->error_code];
+    }
+    else {
+      $v_value = 'NoName';
+    }
+
+    if ($p_with_code) {
+      return($v_value.' ('.$this->error_code.')');
+    }
+    else {
+      return($v_value);
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : errorInfo()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function errorInfo($p_full=false)
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      return(PclErrorString());
+    }
+    else {
+      if ($p_full) {
+        return($this->errorName(true)." : ".$this->error_string);
+      }
+      else {
+        return($this->error_string." [code ".$this->error_code."]");
+      }
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+
+// --------------------------------------------------------------------------------
+// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS *****
+// *****                                                        *****
+// *****       THESES FUNCTIONS MUST NOT BE USED DIRECTLY       *****
+// --------------------------------------------------------------------------------
+
+
+
+  // --------------------------------------------------------------------------------
+  // Function : privCheckFormat()
+  // Description :
+  //   This method check that the archive exists and is a valid zip archive.
+  //   Several level of check exists. (futur)
+  // Parameters :
+  //   $p_level : Level of check. Default 0.
+  //              0 : Check the first bytes (magic codes) (default value))
+  //              1 : 0 + Check the central directory (futur)
+  //              2 : 1 + Check each file header (futur)
+  // Return Values :
+  //   true on success,
+  //   false on error, the error code is set.
+  // --------------------------------------------------------------------------------
+  function privCheckFormat($p_level=0)
+  {
+    $v_result = true;
+
+	// ----- Reset the file system cache
+    clearstatcache();
+
+    // ----- Reset the error handler
+    $this->privErrorReset();
+
+    // ----- Look if the file exits
+    if (!is_file($this->zipname)) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'");
+      return(false);
+    }
+
+    // ----- Check that the file is readeable
+    if (!is_readable($this->zipname)) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'");
+      return(false);
+    }
+
+    // ----- Check the magic code
+    // TBC
+
+    // ----- Check the central header
+    // TBC
+
+    // ----- Check each file header
+    // TBC
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privParseOptions()
+  // Description :
+  //   This internal methods reads the variable list of arguments ($p_options_list,
+  //   $p_size) and generate an array with the options and values ($v_result_list).
+  //   $v_requested_options contains the options that can be present and those that
+  //   must be present.
+  //   $v_requested_options is an array, with the option value as key, and 'optional',
+  //   or 'mandatory' as value.
+  // Parameters :
+  //   See above.
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
+  {
+    $v_result=1;
+    
+    // ----- Read the options
+    $i=0;
+    while ($i<$p_size) {
+
+      // ----- Check if the option is supported
+      if (!isset($v_requested_options[$p_options_list[$i]])) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method");
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+
+      // ----- Look for next option
+      switch ($p_options_list[$i]) {
+        // ----- Look for options that request a path value
+        case PCLZIP_OPT_PATH :
+        case PCLZIP_OPT_REMOVE_PATH :
+        case PCLZIP_OPT_ADD_PATH :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
+          $i++;
+        break;
+
+        case PCLZIP_OPT_TEMP_FILE_THRESHOLD :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+            return PclZip::errorCode();
+          }
+          
+          // ----- Check for incompatible options
+          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
+            return PclZip::errorCode();
+          }
+          
+          // ----- Check the value
+          $v_value = $p_options_list[$i+1];
+          if ((!is_integer($v_value)) || ($v_value<0)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value (and convert it in bytes)
+          $v_result_list[$p_options_list[$i]] = $v_value*1048576;
+          $i++;
+        break;
+
+        case PCLZIP_OPT_TEMP_FILE_ON :
+          // ----- Check for incompatible options
+          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
+            return PclZip::errorCode();
+          }
+          
+          $v_result_list[$p_options_list[$i]] = true;
+        break;
+
+        case PCLZIP_OPT_TEMP_FILE_OFF :
+          // ----- Check for incompatible options
+          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'");
+            return PclZip::errorCode();
+          }
+          // ----- Check for incompatible options
+          if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'");
+            return PclZip::errorCode();
+          }
+          
+          $v_result_list[$p_options_list[$i]] = true;
+        break;
+
+        case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (   is_string($p_options_list[$i+1])
+              && ($p_options_list[$i+1] != '')) {
+            $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE);
+            $i++;
+          }
+          else {
+          }
+        break;
+
+        // ----- Look for options that request an array of string for value
+        case PCLZIP_OPT_BY_NAME :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1];
+          }
+          else if (is_array($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+          $i++;
+        break;
+
+        // ----- Look for options that request an EREG or PREG expression
+        case PCLZIP_OPT_BY_EREG :
+          // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG
+          // to PCLZIP_OPT_BY_PREG
+          $p_options_list[$i] = PCLZIP_OPT_BY_PREG;
+        case PCLZIP_OPT_BY_PREG :
+        //case PCLZIP_OPT_CRYPT :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+          $i++;
+        break;
+
+        // ----- Look for options that takes a string
+        case PCLZIP_OPT_COMMENT :
+        case PCLZIP_OPT_ADD_COMMENT :
+        case PCLZIP_OPT_PREPEND_COMMENT :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE,
+			                     "Missing parameter value for option '"
+								 .PclZipUtilOptionText($p_options_list[$i])
+								 ."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          if (is_string($p_options_list[$i+1])) {
+              $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE,
+			                     "Wrong parameter value for option '"
+								 .PclZipUtilOptionText($p_options_list[$i])
+								 ."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+          $i++;
+        break;
+
+        // ----- Look for options that request an array of index
+        case PCLZIP_OPT_BY_INDEX :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_work_list = array();
+          if (is_string($p_options_list[$i+1])) {
+
+              // ----- Remove spaces
+              $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', '');
+
+              // ----- Parse items
+              $v_work_list = explode(",", $p_options_list[$i+1]);
+          }
+          else if (is_integer($p_options_list[$i+1])) {
+              $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1];
+          }
+          else if (is_array($p_options_list[$i+1])) {
+              $v_work_list = $p_options_list[$i+1];
+          }
+          else {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+          
+          // ----- Reduce the index list
+          // each index item in the list must be a couple with a start and
+          // an end value : [0,3], [5-5], [8-10], ...
+          // ----- Check the format of each item
+          $v_sort_flag=false;
+          $v_sort_value=0;
+          for ($j=0; $j<sizeof($v_work_list); $j++) {
+              // ----- Explode the item
+              $v_item_list = explode("-", $v_work_list[$j]);
+              $v_size_item_list = sizeof($v_item_list);
+              
+              // ----- TBC : Here we might check that each item is a
+              // real integer ...
+              
+              // ----- Look for single value
+              if ($v_size_item_list == 1) {
+                  // ----- Set the option value
+                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
+                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0];
+              }
+              elseif ($v_size_item_list == 2) {
+                  // ----- Set the option value
+                  $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0];
+                  $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1];
+              }
+              else {
+                  // ----- Error log
+                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+                  // ----- Return
+                  return PclZip::errorCode();
+              }
+
+
+              // ----- Look for list sort
+              if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) {
+                  $v_sort_flag=true;
+
+                  // ----- TBC : An automatic sort should be writen ...
+                  // ----- Error log
+                  PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+                  // ----- Return
+                  return PclZip::errorCode();
+              }
+              $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
+          }
+          
+          // ----- Sort the items
+          if ($v_sort_flag) {
+              // TBC : To Be Completed
+          }
+
+          // ----- Next option
+          $i++;
+        break;
+
+        // ----- Look for options that request no value
+        case PCLZIP_OPT_REMOVE_ALL_PATH :
+        case PCLZIP_OPT_EXTRACT_AS_STRING :
+        case PCLZIP_OPT_NO_COMPRESSION :
+        case PCLZIP_OPT_EXTRACT_IN_OUTPUT :
+        case PCLZIP_OPT_REPLACE_NEWER :
+        case PCLZIP_OPT_STOP_ON_ERROR :
+          $v_result_list[$p_options_list[$i]] = true;
+        break;
+
+        // ----- Look for options that request an octal value
+        case PCLZIP_OPT_SET_CHMOD :
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1];
+          $i++;
+        break;
+
+        // ----- Look for options that request a call-back
+        case PCLZIP_CB_PRE_EXTRACT :
+        case PCLZIP_CB_POST_EXTRACT :
+        case PCLZIP_CB_PRE_ADD :
+        case PCLZIP_CB_POST_ADD :
+        /* for futur use
+        case PCLZIP_CB_PRE_DELETE :
+        case PCLZIP_CB_POST_DELETE :
+        case PCLZIP_CB_PRE_LIST :
+        case PCLZIP_CB_POST_LIST :
+        */
+          // ----- Check the number of parameters
+          if (($i+1) >= $p_size) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Get the value
+          $v_function_name = $p_options_list[$i+1];
+
+          // ----- Check that the value is a valid existing function
+          if (!function_exists($v_function_name)) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+
+          // ----- Set the attribute
+          $v_result_list[$p_options_list[$i]] = $v_function_name;
+          $i++;
+        break;
+
+        default :
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                       "Unknown parameter '"
+							   .$p_options_list[$i]."'");
+
+          // ----- Return
+          return PclZip::errorCode();
+      }
+
+      // ----- Next options
+      $i++;
+    }
+
+    // ----- Look for mandatory options
+    if ($v_requested_options !== false) {
+      for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
+        // ----- Look for mandatory option
+        if ($v_requested_options[$key] == 'mandatory') {
+          // ----- Look if present
+          if (!isset($v_result_list[$key])) {
+            // ----- Error log
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
+
+            // ----- Return
+            return PclZip::errorCode();
+          }
+        }
+      }
+    }
+    
+    // ----- Look for default values
+    if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
+      
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privOptionDefaultThreshold()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privOptionDefaultThreshold(&$p_options)
+  {
+    $v_result=1;
+    
+    if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
+        || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {
+      return $v_result;
+    }
+    
+    // ----- Get 'memory_limit' configuration value
+    $v_memory_limit = ini_get('memory_limit');
+    $v_memory_limit = trim($v_memory_limit);
+    $last = strtolower(substr($v_memory_limit, -1));
+ 
+    if($last == 'g')
+        //$v_memory_limit = $v_memory_limit*1024*1024*1024;
+        $v_memory_limit = $v_memory_limit*1073741824;
+    if($last == 'm')
+        //$v_memory_limit = $v_memory_limit*1024*1024;
+        $v_memory_limit = $v_memory_limit*1048576;
+    if($last == 'k')
+        $v_memory_limit = $v_memory_limit*1024;
+            
+    $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);
+    
+
+    // ----- Sanity check : No threshold if value lower than 1M
+    if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {
+      unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);
+    }
+          
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privFileDescrParseAtt()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
+  {
+    $v_result=1;
+    
+    // ----- For each file in the list check the attributes
+    foreach ($p_file_list as $v_key => $v_value) {
+    
+      // ----- Check if the option is supported
+      if (!isset($v_requested_options[$v_key])) {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file");
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+
+      // ----- Look for attribute
+      switch ($v_key) {
+        case PCLZIP_ATT_FILE_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
+          
+          if ($p_filedescr['filename'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+        break;
+
+        case PCLZIP_ATT_FILE_NEW_SHORT_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value);
+
+          if ($p_filedescr['new_short_name'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+        break;
+
+        case PCLZIP_ATT_FILE_NEW_FULL_NAME :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value);
+
+          if ($p_filedescr['new_full_name'] == '') {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+        break;
+
+        // ----- Look for options that takes a string
+        case PCLZIP_ATT_FILE_COMMENT :
+          if (!is_string($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['comment'] = $v_value;
+        break;
+
+        case PCLZIP_ATT_FILE_MTIME :
+          if (!is_integer($v_value)) {
+            PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'");
+            return PclZip::errorCode();
+          }
+
+          $p_filedescr['mtime'] = $v_value;
+        break;
+
+        case PCLZIP_ATT_FILE_CONTENT :
+          $p_filedescr['content'] = $v_value;
+        break;
+
+        default :
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER,
+		                           "Unknown parameter '".$v_key."'");
+
+          // ----- Return
+          return PclZip::errorCode();
+      }
+
+      // ----- Look for mandatory options
+      if ($v_requested_options !== false) {
+        for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) {
+          // ----- Look for mandatory option
+          if ($v_requested_options[$key] == 'mandatory') {
+            // ----- Look if present
+            if (!isset($p_file_list[$key])) {
+              PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")");
+              return PclZip::errorCode();
+            }
+          }
+        }
+      }
+    
+    // end foreach
+    }
+    
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privFileDescrExpand()
+  // Description :
+  //   This method look for each item of the list to see if its a file, a folder
+  //   or a string to be added as file. For any other type of files (link, other)
+  //   just ignore the item.
+  //   Then prepare the information that will be stored for that file.
+  //   When its a folder, expand the folder with all the files that are in that 
+  //   folder (recursively).
+  // Parameters :
+  // Return Values :
+  //   1 on success.
+  //   0 on failure.
+  // --------------------------------------------------------------------------------
+  function privFileDescrExpand(&$p_filedescr_list, &$p_options)
+  {
+    $v_result=1;
+    
+    // ----- Create a result list
+    $v_result_list = array();
+    
+    // ----- Look each entry
+    for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
+      
+      // ----- Get filedescr
+      $v_descr = $p_filedescr_list[$i];
+      
+      // ----- Reduce the filename
+      $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);
+      $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
+      
+      // ----- Look for real file or folder
+      if (file_exists($v_descr['filename'])) {
+        if (@is_file($v_descr['filename'])) {
+          $v_descr['type'] = 'file';
+        }
+        else if (@is_dir($v_descr['filename'])) {
+          $v_descr['type'] = 'folder';
+        }
+        else if (@is_link($v_descr['filename'])) {
+          // skip
+          continue;
+        }
+        else {
+          // skip
+          continue;
+        }
+      }
+      
+      // ----- Look for string added as file
+      else if (isset($v_descr['content'])) {
+        $v_descr['type'] = 'virtual_file';
+      }
+      
+      // ----- Missing file
+      else {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist");
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+      
+      // ----- Calculate the stored filename
+      $this->privCalculateStoredFilename($v_descr, $p_options);
+      
+      // ----- Add the descriptor in result list
+      $v_result_list[sizeof($v_result_list)] = $v_descr;
+      
+      // ----- Look for folder
+      if ($v_descr['type'] == 'folder') {
+        // ----- List of items in folder
+        $v_dirlist_descr = array();
+        $v_dirlist_nb = 0;
+        if ($v_folder_handler = @opendir($v_descr['filename'])) {
+          while (($v_item_handler = @readdir($v_folder_handler)) !== false) {
+
+            // ----- Skip '.' and '..'
+            if (($v_item_handler == '.') || ($v_item_handler == '..')) {
+                continue;
+            }
+            
+            // ----- Compose the full filename
+            $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
+            
+            // ----- Look for different stored filename
+            // Because the name of the folder was changed, the name of the
+            // files/sub-folders also change
+            if (($v_descr['stored_filename'] != $v_descr['filename'])
+                 && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) {
+              if ($v_descr['stored_filename'] != '') {
+                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler;
+              }
+              else {
+                $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
+              }
+            }
+      
+            $v_dirlist_nb++;
+          }
+          
+          @closedir($v_folder_handler);
+        }
+        else {
+          // TBC : unable to open folder in read mode
+        }
+        
+        // ----- Expand each element of the list
+        if ($v_dirlist_nb != 0) {
+          // ----- Expand
+          if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
+            return $v_result;
+          }
+          
+          // ----- Concat the resulting list
+          $v_result_list = array_merge($v_result_list, $v_dirlist_descr);
+        }
+        else {
+        }
+          
+        // ----- Free local array
+        unset($v_dirlist_descr);
+      }
+    }
+    
+    // ----- Get the result list
+    $p_filedescr_list = $v_result_list;
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCreate()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privCreate($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+    
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the file in write mode
+    if (($v_result = $this->privOpenFd('wb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Add the list of files
+    $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options);
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAdd()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAdd($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Look if the archive exists or is empty
+    if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0))
+    {
+
+      // ----- Do a create
+      $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options);
+
+      // ----- Return
+      return $v_result;
+    }
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the zip file
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Magic quotes trick
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->zip_fd);
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
+    {
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
+    // the following methods on the temporary fil and not the real archive
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
+    {
+      fclose($v_zip_temp_fd);
+      $this->privCloseFd();
+      @unlink($v_zip_temp_name);
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->zip_fd);
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Create the Central Dir files header
+    for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+          fclose($v_zip_temp_fd);
+          $this->privCloseFd();
+          @unlink($v_zip_temp_name);
+          $this->privSwapBackMagicQuotes();
+
+          // ----- Return
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = $v_central_dir['comment'];
+    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+    }
+    if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) {
+      $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT];
+    }
+    if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment;
+    }
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1)
+    {
+      // ----- Reset the file list
+      unset($v_header_list);
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->zipname);
+    PclZipUtilRename($v_zip_temp_name, $this->zipname);
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privOpenFd()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privOpenFd($p_mode)
+  {
+    $v_result=1;
+
+    // ----- Look if already open
+    if ($this->zip_fd != 0)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Open the zip file
+    if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCloseFd()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privCloseFd()
+  {
+    $v_result=1;
+
+    if ($this->zip_fd != 0)
+      @fclose($this->zip_fd);
+    $this->zip_fd = 0;
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddList()
+  // Description :
+  //   $p_add_dir and $p_remove_dir will give the ability to memorize a path which is
+  //   different from the real path of the file. This is usefull if you want to have PclTar
+  //   running in any directory, and memorize relative path from an other directory.
+  // Parameters :
+  //   $p_list : An array containing the file or directory names to add in the tar
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  //   $p_add_dir : Path to add in the filename path archived
+  //   $p_remove_dir : Path to remove in the filename path archived
+  // Return Values :
+  // --------------------------------------------------------------------------------
+//  function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options)
+  function privAddList($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    $v_result=1;
+
+    // ----- Add the files
+    $v_header_list = array();
+    if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($this->zip_fd);
+
+    // ----- Create the Central Dir files header
+    for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++)
+    {
+      // ----- Create the file header
+      if ($v_header_list[$i]['status'] == 'ok') {
+        if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+          // ----- Return
+          return $v_result;
+        }
+        $v_count++;
+      }
+
+      // ----- Transform the header to a 'usable' info
+      $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+    }
+
+    // ----- Zip file comment
+    $v_comment = '';
+    if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+      $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+    }
+
+    // ----- Calculate the size of the central header
+    $v_size = @ftell($this->zip_fd)-$v_offset;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1)
+    {
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddFileList()
+  // Description :
+  // Parameters :
+  //   $p_filedescr_list : An array containing the file description 
+  //                      or directory names to add in the zip
+  //   $p_result_list : list of added files with their properties (specially the status field)
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options)
+  {
+    $v_result=1;
+    $v_header = array();
+
+    // ----- Recuperate the current number of elt in list
+    $v_nb = sizeof($p_result_list);
+
+    // ----- Loop on the files
+    for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) {
+      // ----- Format the filename
+      $p_filedescr_list[$j]['filename']
+      = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
+      
+
+      // ----- Skip empty file names
+      // TBC : Can this be possible ? not checked in DescrParseAtt ?
+      if ($p_filedescr_list[$j]['filename'] == "") {
+        continue;
+      }
+
+      // ----- Check the filename
+      if (   ($p_filedescr_list[$j]['type'] != 'virtual_file')
+          && (!file_exists($p_filedescr_list[$j]['filename']))) {
+        PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist");
+        return PclZip::errorCode();
+      }
+
+      // ----- Look if it is a file or a dir with no all path remove option
+      // or a dir with all its path removed
+//      if (   (is_file($p_filedescr_list[$j]['filename']))
+//          || (   is_dir($p_filedescr_list[$j]['filename'])
+      if (   ($p_filedescr_list[$j]['type'] == 'file')
+          || ($p_filedescr_list[$j]['type'] == 'virtual_file')
+          || (   ($p_filedescr_list[$j]['type'] == 'folder')
+              && (   !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])
+                  || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))
+          ) {
+
+        // ----- Add the file
+        $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header,
+                                       $p_options);
+        if ($v_result != 1) {
+          return $v_result;
+        }
+
+        // ----- Store the file infos
+        $p_result_list[$v_nb++] = $v_header;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAddFile($p_filedescr, &$p_header, &$p_options)
+  {
+    $v_result=1;
+    
+    // ----- Working variable
+    $p_filename = $p_filedescr['filename'];
+
+    // TBC : Already done in the fileAtt check ... ?
+    if ($p_filename == "") {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)");
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+  
+    // ----- Look for a stored different filename 
+    /* TBC : Removed
+    if (isset($p_filedescr['stored_filename'])) {
+      $v_stored_filename = $p_filedescr['stored_filename'];
+    }
+    else {
+      $v_stored_filename = $p_filedescr['stored_filename'];
+    }
+    */
+
+    // ----- Set the file properties
+    clearstatcache();
+    $p_header['version'] = 20;
+    $p_header['version_extracted'] = 10;
+    $p_header['flag'] = 0;
+    $p_header['compression'] = 0;
+    $p_header['crc'] = 0;
+    $p_header['compressed_size'] = 0;
+    $p_header['filename_len'] = strlen($p_filename);
+    $p_header['extra_len'] = 0;
+    $p_header['disk'] = 0;
+    $p_header['internal'] = 0;
+    $p_header['offset'] = 0;
+    $p_header['filename'] = $p_filename;
+// TBC : Removed    $p_header['stored_filename'] = $v_stored_filename;
+    $p_header['stored_filename'] = $p_filedescr['stored_filename'];
+    $p_header['extra'] = '';
+    $p_header['status'] = 'ok';
+    $p_header['index'] = -1;
+
+    // ----- Look for regular file
+    if ($p_filedescr['type']=='file') {
+      $p_header['external'] = 0x00000000;
+      $p_header['size'] = filesize($p_filename);
+    }
+    
+    // ----- Look for regular folder
+    else if ($p_filedescr['type']=='folder') {
+      $p_header['external'] = 0x00000010;
+      $p_header['mtime'] = filemtime($p_filename);
+      $p_header['size'] = filesize($p_filename);
+    }
+    
+    // ----- Look for virtual file
+    else if ($p_filedescr['type'] == 'virtual_file') {
+      $p_header['external'] = 0x00000000;
+      $p_header['size'] = strlen($p_filedescr['content']);
+    }
+    
+
+    // ----- Look for filetime
+    if (isset($p_filedescr['mtime'])) {
+      $p_header['mtime'] = $p_filedescr['mtime'];
+    }
+    else if ($p_filedescr['type'] == 'virtual_file') {
+      $p_header['mtime'] = time();
+    }
+    else {
+      $p_header['mtime'] = filemtime($p_filename);
+    }
+
+    // ------ Look for file comment
+    if (isset($p_filedescr['comment'])) {
+      $p_header['comment_len'] = strlen($p_filedescr['comment']);
+      $p_header['comment'] = $p_filedescr['comment'];
+    }
+    else {
+      $p_header['comment_len'] = 0;
+      $p_header['comment'] = '';
+    }
+
+    // ----- Look for pre-add callback
+    if (isset($p_options[PCLZIP_CB_PRE_ADD])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header);
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_header['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      if ($p_header['stored_filename'] != $v_local_header['stored_filename']) {
+        $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']);
+      }
+    }
+
+    // ----- Look for empty stored filename
+    if ($p_header['stored_filename'] == "") {
+      $p_header['status'] = "filtered";
+    }
+    
+    // ----- Check the path length
+    if (strlen($p_header['stored_filename']) > 0xFF) {
+      $p_header['status'] = 'filename_too_long';
+    }
+
+    // ----- Look if no error, or file not skipped
+    if ($p_header['status'] == 'ok') {
+
+      // ----- Look for a file
+      if ($p_filedescr['type'] == 'file') {
+        // ----- Look for using temporary file to zip
+        if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) 
+            && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
+                || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
+                    && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {
+          $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options);
+          if ($v_result < PCLZIP_ERR_NO_ERROR) {
+            return $v_result;
+          }
+        }
+        
+        // ----- Use "in memory" zip algo
+        else {
+
+        // ----- Open the source file
+        if (($v_file = @fopen($p_filename, "rb")) == 0) {
+          PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
+          return PclZip::errorCode();
+        }
+
+        // ----- Read the file content
+        $v_content = @fread($v_file, $p_header['size']);
+
+        // ----- Close the file
+        @fclose($v_file);
+
+        // ----- Calculate the CRC
+        $p_header['crc'] = @crc32($v_content);
+        
+        // ----- Look for no compression
+        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
+          // ----- Set header parameters
+          $p_header['compressed_size'] = $p_header['size'];
+          $p_header['compression'] = 0;
+        }
+        
+        // ----- Look for normal compression
+        else {
+          // ----- Compress the content
+          $v_content = @gzdeflate($v_content);
+
+          // ----- Set header parameters
+          $p_header['compressed_size'] = strlen($v_content);
+          $p_header['compression'] = 8;
+        }
+        
+        // ----- Call the header generation
+        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
+          @fclose($v_file);
+          return $v_result;
+        }
+
+        // ----- Write the compressed (or not) content
+        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
+
+        }
+
+      }
+
+      // ----- Look for a virtual file (a file from string)
+      else if ($p_filedescr['type'] == 'virtual_file') {
+          
+        $v_content = $p_filedescr['content'];
+
+        // ----- Calculate the CRC
+        $p_header['crc'] = @crc32($v_content);
+        
+        // ----- Look for no compression
+        if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
+          // ----- Set header parameters
+          $p_header['compressed_size'] = $p_header['size'];
+          $p_header['compression'] = 0;
+        }
+        
+        // ----- Look for normal compression
+        else {
+          // ----- Compress the content
+          $v_content = @gzdeflate($v_content);
+
+          // ----- Set header parameters
+          $p_header['compressed_size'] = strlen($v_content);
+          $p_header['compression'] = 8;
+        }
+        
+        // ----- Call the header generation
+        if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
+          @fclose($v_file);
+          return $v_result;
+        }
+
+        // ----- Write the compressed (or not) content
+        @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']);
+      }
+
+      // ----- Look for a directory
+      else if ($p_filedescr['type'] == 'folder') {
+        // ----- Look for directory last '/'
+        if (@substr($p_header['stored_filename'], -1) != '/') {
+          $p_header['stored_filename'] .= '/';
+        }
+
+        // ----- Set the file properties
+        $p_header['size'] = 0;
+        //$p_header['external'] = 0x41FF0010;   // Value for a folder : to be checked
+        $p_header['external'] = 0x00000010;   // Value for a folder : to be checked
+
+        // ----- Call the header generation
+        if (($v_result = $this->privWriteFileHeader($p_header)) != 1)
+        {
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Look for post-add callback
+    if (isset($p_options[PCLZIP_CB_POST_ADD])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_header, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header);
+      if ($v_result == 0) {
+        // ----- Ignored
+        $v_result = 1;
+      }
+
+      // ----- Update the informations
+      // Nothing can be modified
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privAddFileUsingTempFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)
+  {
+    $v_result=PCLZIP_ERR_NO_ERROR;
+    
+    // ----- Working variable
+    $p_filename = $p_filedescr['filename'];
+
+
+    // ----- Open the source file
+    if (($v_file = @fopen($p_filename, "rb")) == 0) {
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode");
+      return PclZip::errorCode();
+    }
+
+    // ----- Creates a compressed temporary file
+    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
+    if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) {
+      fclose($v_file);
+      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+    $v_size = filesize($p_filename);
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($v_file, $v_read_size);
+      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
+      @gzputs($v_file_compressed, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Close the file
+    @fclose($v_file);
+    @gzclose($v_file_compressed);
+
+    // ----- Check the minimum file size
+    if (filesize($v_gzip_temp_name) < 18) {
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes');
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the compressed attributes
+    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) {
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the gzip file header
+    $v_binary_data = @fread($v_file_compressed, 10);
+    $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data);
+
+    // ----- Check some parameters
+    $v_data_header['os'] = bin2hex($v_data_header['os']);
+
+    // ----- Read the gzip file footer
+    @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8);
+    $v_binary_data = @fread($v_file_compressed, 8);
+    $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data);
+
+    // ----- Set the attributes
+    $p_header['compression'] = ord($v_data_header['cm']);
+    //$p_header['mtime'] = $v_data_header['mtime'];
+    $p_header['crc'] = $v_data_footer['crc'];
+    $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18;
+
+    // ----- Close the file
+    @fclose($v_file_compressed);
+
+    // ----- Call the header generation
+    if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
+      return $v_result;
+    }
+
+    // ----- Add the compressed data
+    if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0)
+    {
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+    fseek($v_file_compressed, 10);
+    $v_size = $p_header['compressed_size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($v_file_compressed, $v_read_size);
+      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
+      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Close the file
+    @fclose($v_file_compressed);
+
+    // ----- Unlink the temporary file
+    @unlink($v_gzip_temp_name);
+    
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCalculateStoredFilename()
+  // Description :
+  //   Based on file descriptor properties and global options, this method
+  //   calculate the filename that will be stored in the archive.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privCalculateStoredFilename(&$p_filedescr, &$p_options)
+  {
+    $v_result=1;
+    
+    // ----- Working variables
+    $p_filename = $p_filedescr['filename'];
+    if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
+      $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH];
+    }
+    else {
+      $p_add_dir = '';
+    }
+    if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) {
+      $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH];
+    }
+    else {
+      $p_remove_dir = '';
+    }
+    if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) {
+      $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH];
+    }
+    else {
+      $p_remove_all_dir = 0;
+    }
+
+
+    // ----- Look for full name change
+    if (isset($p_filedescr['new_full_name'])) {
+      // ----- Remove drive letter if any
+      $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);
+    }
+    
+    // ----- Look for path and/or short name change
+    else {
+
+      // ----- Look for short name change
+      // Its when we cahnge just the filename but not the path
+      if (isset($p_filedescr['new_short_name'])) {
+        $v_path_info = pathinfo($p_filename);
+        $v_dir = '';
+        if ($v_path_info['dirname'] != '') {
+          $v_dir = $v_path_info['dirname'].'/';
+        }
+        $v_stored_filename = $v_dir.$p_filedescr['new_short_name'];
+      }
+      else {
+        // ----- Calculate the stored filename
+        $v_stored_filename = $p_filename;
+      }
+
+      // ----- Look for all path to remove
+      if ($p_remove_all_dir) {
+        $v_stored_filename = basename($p_filename);
+      }
+      // ----- Look for partial path remove
+      else if ($p_remove_dir != "") {
+        if (substr($p_remove_dir, -1) != '/')
+          $p_remove_dir .= "/";
+
+        if (   (substr($p_filename, 0, 2) == "./")
+            || (substr($p_remove_dir, 0, 2) == "./")) {
+            
+          if (   (substr($p_filename, 0, 2) == "./")
+              && (substr($p_remove_dir, 0, 2) != "./")) {
+            $p_remove_dir = "./".$p_remove_dir;
+          }
+          if (   (substr($p_filename, 0, 2) != "./")
+              && (substr($p_remove_dir, 0, 2) == "./")) {
+            $p_remove_dir = substr($p_remove_dir, 2);
+          }
+        }
+
+        $v_compare = PclZipUtilPathInclusion($p_remove_dir,
+                                             $v_stored_filename);
+        if ($v_compare > 0) {
+          if ($v_compare == 2) {
+            $v_stored_filename = "";
+          }
+          else {
+            $v_stored_filename = substr($v_stored_filename,
+                                        strlen($p_remove_dir));
+          }
+        }
+      }
+      
+      // ----- Remove drive letter if any
+      $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);
+      
+      // ----- Look for path to add
+      if ($p_add_dir != "") {
+        if (substr($p_add_dir, -1) == "/")
+          $v_stored_filename = $p_add_dir.$v_stored_filename;
+        else
+          $v_stored_filename = $p_add_dir."/".$v_stored_filename;
+      }
+    }
+
+    // ----- Filename (reduce the path of stored name)
+    $v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
+    $p_filedescr['stored_filename'] = $v_stored_filename;
+    
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // ----- Store the offset position of the file
+    $p_header['offset'] = ftell($this->zip_fd);
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50,
+	                      $p_header['version_extracted'], $p_header['flag'],
+                          $p_header['compression'], $v_mtime, $v_mdate,
+                          $p_header['crc'], $p_header['compressed_size'],
+						  $p_header['size'],
+                          strlen($p_header['stored_filename']),
+						  $p_header['extra_len']);
+
+    // ----- Write the first 148 bytes of the header in the archive
+    fputs($this->zip_fd, $v_binary_data, 30);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteCentralFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // TBC
+    //for(reset($p_header); $key = key($p_header); next($p_header)) {
+    //}
+
+    // ----- Transform UNIX mtime to DOS format mdate/mtime
+    $v_date = getdate($p_header['mtime']);
+    $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2;
+    $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday'];
+
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50,
+	                      $p_header['version'], $p_header['version_extracted'],
+                          $p_header['flag'], $p_header['compression'],
+						  $v_mtime, $v_mdate, $p_header['crc'],
+                          $p_header['compressed_size'], $p_header['size'],
+                          strlen($p_header['stored_filename']),
+						  $p_header['extra_len'], $p_header['comment_len'],
+                          $p_header['disk'], $p_header['internal'],
+						  $p_header['external'], $p_header['offset']);
+
+    // ----- Write the 42 bytes of the header in the zip file
+    fputs($this->zip_fd, $v_binary_data, 46);
+
+    // ----- Write the variable fields
+    if (strlen($p_header['stored_filename']) != 0)
+    {
+      fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename']));
+    }
+    if ($p_header['extra_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']);
+    }
+    if ($p_header['comment_len'] != 0)
+    {
+      fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']);
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privWriteCentralHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment)
+  {
+    $v_result=1;
+
+    // ----- Packed data
+    $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries,
+	                      $p_nb_entries, $p_size,
+						  $p_offset, strlen($p_comment));
+
+    // ----- Write the 22 bytes of the header in the zip file
+    fputs($this->zip_fd, $v_binary_data, 22);
+
+    // ----- Write the variable fields
+    if (strlen($p_comment) != 0)
+    {
+      fputs($this->zip_fd, $p_comment, strlen($p_comment));
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privList()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privList(&$p_list)
+  {
+    $v_result=1;
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Open the zip file
+    if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
+    {
+      // ----- Magic quotes trick
+      $this->privSwapBackMagicQuotes();
+      
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privSwapBackMagicQuotes();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of Central Dir
+    @rewind($this->zip_fd);
+    if (@fseek($this->zip_fd, $v_central_dir['offset']))
+    {
+      $this->privSwapBackMagicQuotes();
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Read each entry
+    for ($i=0; $i<$v_central_dir['entries']; $i++)
+    {
+      // ----- Read the file header
+      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
+      {
+        $this->privSwapBackMagicQuotes();
+        return $v_result;
+      }
+      $v_header['index'] = $i;
+
+      // ----- Get the only interesting attributes
+      $this->privConvertHeader2FileInfo($v_header, $p_list[$i]);
+      unset($v_header);
+    }
+
+    // ----- Close the zip file
+    $this->privCloseFd();
+
+    // ----- Magic quotes trick
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privConvertHeader2FileInfo()
+  // Description :
+  //   This function takes the file informations from the central directory
+  //   entries and extract the interesting parameters that will be given back.
+  //   The resulting file infos are set in the array $p_info
+  //     $p_info['filename'] : Filename with full path. Given by user (add),
+  //                           extracted in the filesystem (extract).
+  //     $p_info['stored_filename'] : Stored filename in the archive.
+  //     $p_info['size'] = Size of the file.
+  //     $p_info['compressed_size'] = Compressed size of the file.
+  //     $p_info['mtime'] = Last modification date of the file.
+  //     $p_info['comment'] = Comment associated with the file.
+  //     $p_info['folder'] = true/false : indicates if the entry is a folder or not.
+  //     $p_info['status'] = status of the action on the file.
+  //     $p_info['crc'] = CRC of the file content.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privConvertHeader2FileInfo($p_header, &$p_info)
+  {
+    $v_result=1;
+
+    // ----- Get the interesting attributes
+    $v_temp_path = PclZipUtilPathReduction($p_header['filename']);
+    $p_info['filename'] = $v_temp_path;
+    $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']);
+    $p_info['stored_filename'] = $v_temp_path;
+    $p_info['size'] = $p_header['size'];
+    $p_info['compressed_size'] = $p_header['compressed_size'];
+    $p_info['mtime'] = $p_header['mtime'];
+    $p_info['comment'] = $p_header['comment'];
+    $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010);
+    $p_info['index'] = $p_header['index'];
+    $p_info['status'] = $p_header['status'];
+    $p_info['crc'] = $p_header['crc'];
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractByRule()
+  // Description :
+  //   Extract a file or directory depending of rules (by index, by name, ...)
+  // Parameters :
+  //   $p_file_list : An array where will be placed the properties of each
+  //                  extracted file
+  //   $p_path : Path to add while writing the extracted files
+  //   $p_remove_path : Path to remove (from the file memorized path) while writing the
+  //                    extracted files. If the path does not match the file path,
+  //                    the file is extracted with its memorized path.
+  //                    $p_remove_path does not apply to 'list' mode.
+  //                    $p_path and $p_remove_path are commulative.
+  // Return Values :
+  //   1 on success,0 or less on error (see error code list)
+  // --------------------------------------------------------------------------------
+  function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
+  {
+    $v_result=1;
+
+    // ----- Magic quotes trick
+    $this->privDisableMagicQuotes();
+
+    // ----- Check the path
+    if (   ($p_path == "")
+	    || (   (substr($p_path, 0, 1) != "/")
+		    && (substr($p_path, 0, 3) != "../")
+			&& (substr($p_path,1,2)!=":/")))
+      $p_path = "./".$p_path;
+
+    // ----- Reduce the path last (and duplicated) '/'
+    if (($p_path != "./") && ($p_path != "/"))
+    {
+      // ----- Look for the path end '/'
+      while (substr($p_path, -1) == "/")
+      {
+        $p_path = substr($p_path, 0, strlen($p_path)-1);
+      }
+    }
+
+    // ----- Look for path to remove format (should end by /)
+    if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/'))
+    {
+      $p_remove_path .= '/';
+    }
+    $p_remove_path_size = strlen($p_remove_path);
+
+    // ----- Open the zip file
+    if (($v_result = $this->privOpenFd('rb')) != 1)
+    {
+      $this->privSwapBackMagicQuotes();
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      // ----- Close the zip file
+      $this->privCloseFd();
+      $this->privSwapBackMagicQuotes();
+
+      return $v_result;
+    }
+
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+
+    // ----- Read each entry
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
+    {
+
+      // ----- Read next Central dir entry
+      @rewind($this->zip_fd);
+      if (@fseek($this->zip_fd, $v_pos_entry))
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+        $this->privSwapBackMagicQuotes();
+
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+
+      // ----- Read the file header
+      $v_header = array();
+      if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1)
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+        $this->privSwapBackMagicQuotes();
+
+        return $v_result;
+      }
+
+      // ----- Store the index
+      $v_header['index'] = $i;
+
+      // ----- Store the file position
+      $v_pos_entry = ftell($this->zip_fd);
+
+      // ----- Look for the specific extract rules
+      $v_extract = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
+          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
+
+          // ----- Look if the filename is in the list
+          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) {
+
+              // ----- Look for a directory
+              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
+                      && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      $v_extract = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
+                  $v_extract = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      // ereg() is deprecated with PHP 5.3
+      /* 
+      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
+               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
+
+          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) {
+              $v_extract = true;
+          }
+      }
+      */
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
+               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
+
+          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) {
+              $v_extract = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
+               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
+          
+          // ----- Look if the index is in the list
+          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
+
+              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
+                  $v_extract = true;
+              }
+              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
+                  $j_start = $j+1;
+              }
+
+              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
+                  break;
+              }
+          }
+      }
+
+      // ----- Look for no rule, which means extract all the archive
+      else {
+          $v_extract = true;
+      }
+
+	  // ----- Check compression method
+	  if (   ($v_extract)
+	      && (   ($v_header['compression'] != 8)
+		      && ($v_header['compression'] != 0))) {
+          $v_header['status'] = 'unsupported_compression';
+
+          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+
+              $this->privSwapBackMagicQuotes();
+              
+              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
+			                       "Filename '".$v_header['stored_filename']."' is "
+				  	    	  	   ."compressed by an unsupported compression "
+				  	    	  	   ."method (".$v_header['compression'].") ");
+
+              return PclZip::errorCode();
+		  }
+	  }
+	  
+	  // ----- Check encrypted files
+	  if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
+          $v_header['status'] = 'unsupported_encryption';
+
+          // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+          if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		      && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+
+              $this->privSwapBackMagicQuotes();
+
+              PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION,
+			                       "Unsupported encryption for "
+				  	    	  	   ." filename '".$v_header['stored_filename']
+								   ."'");
+
+              return PclZip::errorCode();
+		  }
+    }
+
+      // ----- Look for real extraction
+      if (($v_extract) && ($v_header['status'] != 'ok')) {
+          $v_result = $this->privConvertHeader2FileInfo($v_header,
+		                                        $p_file_list[$v_nb_extracted++]);
+          if ($v_result != 1) {
+              $this->privCloseFd();
+              $this->privSwapBackMagicQuotes();
+              return $v_result;
+          }
+
+          $v_extract = false;
+      }
+      
+      // ----- Look for real extraction
+      if ($v_extract)
+      {
+
+        // ----- Go to the file position
+        @rewind($this->zip_fd);
+        if (@fseek($this->zip_fd, $v_header['offset']))
+        {
+          // ----- Close the zip file
+          $this->privCloseFd();
+
+          $this->privSwapBackMagicQuotes();
+
+          // ----- Error log
+          PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+          // ----- Return
+          return PclZip::errorCode();
+        }
+
+        // ----- Look for extraction as string
+        if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) {
+
+          $v_string = '';
+
+          // ----- Extracting the file
+          $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1)
+          {
+            // ----- Close the zip file
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+
+            return $v_result;
+          }
+
+          // ----- Set the file content
+          $p_file_list[$v_nb_extracted]['content'] = $v_string;
+
+          // ----- Next extracted file
+          $v_nb_extracted++;
+          
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+        // ----- Look for extraction in standard output
+        elseif (   (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]))
+		        && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) {
+          // ----- Extracting the file in standard output
+          $v_result1 = $this->privExtractFileInOutput($v_header, $p_options);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            return $v_result;
+          }
+
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+        // ----- Look for normal extraction
+        else {
+          // ----- Extracting the file
+          $v_result1 = $this->privExtractFile($v_header,
+		                                      $p_path, $p_remove_path,
+											  $p_remove_all_path,
+											  $p_options);
+          if ($v_result1 < 1) {
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+            return $v_result1;
+          }
+
+          // ----- Get the only interesting attributes
+          if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1)
+          {
+            // ----- Close the zip file
+            $this->privCloseFd();
+            $this->privSwapBackMagicQuotes();
+
+            return $v_result;
+          }
+
+          // ----- Look for user callback abort
+          if ($v_result1 == 2) {
+          	break;
+          }
+        }
+      }
+    }
+
+    // ----- Close the zip file
+    $this->privCloseFd();
+    $this->privSwapBackMagicQuotes();
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //
+  // 1 : ... ?
+  // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback
+  // --------------------------------------------------------------------------------
+  function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options)
+  {
+    $v_result=1;
+
+    // ----- Read the file header
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    // ----- Look for all path to remove
+    if ($p_remove_all_path == true) {
+        // ----- Look for folder entry that not need to be extracted
+        if (($p_entry['external']&0x00000010)==0x00000010) {
+
+            $p_entry['status'] = "filtered";
+
+            return $v_result;
+        }
+
+        // ----- Get the basename of the path
+        $p_entry['filename'] = basename($p_entry['filename']);
+    }
+
+    // ----- Look for path to remove
+    else if ($p_remove_path != "")
+    {
+      if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2)
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "filtered";
+
+        // ----- Return
+        return $v_result;
+      }
+
+      $p_remove_path_size = strlen($p_remove_path);
+      if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path)
+      {
+
+        // ----- Remove the path
+        $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size);
+
+      }
+    }
+
+    // ----- Add the path
+    if ($p_path != '') {
+      $p_entry['filename'] = $p_path."/".$p_entry['filename'];
+    }
+    
+    // ----- Check a base_dir_restriction
+    if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
+      $v_inclusion
+      = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
+                                $p_entry['filename']); 
+      if ($v_inclusion == 0) {
+
+        PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
+			                     "Filename '".$p_entry['filename']."' is "
+								 ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION");
+
+        return PclZip::errorCode();
+      }
+    }
+
+    // ----- Look for pre-extract callback
+    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+      
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        // ----- This status is internal and will be changed in 'skipped'
+        $p_entry['status'] = "aborted";
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+    }
+
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+    // ----- Look for specific actions while the file exist
+    if (file_exists($p_entry['filename']))
+    {
+
+      // ----- Look if file is a directory
+      if (is_dir($p_entry['filename']))
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "already_a_directory";
+        
+        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+        // For historical reason first PclZip implementation does not stop
+        // when this kind of error occurs.
+        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+
+            PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY,
+			                     "Filename '".$p_entry['filename']."' is "
+								 ."already used by an existing directory");
+
+            return PclZip::errorCode();
+		    }
+      }
+      // ----- Look if file is write protected
+      else if (!is_writeable($p_entry['filename']))
+      {
+
+        // ----- Change the file status
+        $p_entry['status'] = "write_protected";
+
+        // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+        // For historical reason first PclZip implementation does not stop
+        // when this kind of error occurs.
+        if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		    && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+
+            PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
+			                     "Filename '".$p_entry['filename']."' exists "
+								 ."and is write protected");
+
+            return PclZip::errorCode();
+		    }
+      }
+
+      // ----- Look if the extracted file is older
+      else if (filemtime($p_entry['filename']) > $p_entry['mtime'])
+      {
+        // ----- Change the file status
+        if (   (isset($p_options[PCLZIP_OPT_REPLACE_NEWER]))
+		    && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) {
+	  	  }
+		    else {
+            $p_entry['status'] = "newer_exist";
+
+            // ----- Look for PCLZIP_OPT_STOP_ON_ERROR
+            // For historical reason first PclZip implementation does not stop
+            // when this kind of error occurs.
+            if (   (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR]))
+		        && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
+
+                PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL,
+			             "Newer version of '".$p_entry['filename']."' exists "
+					    ."and option PCLZIP_OPT_REPLACE_NEWER is not selected");
+
+                return PclZip::errorCode();
+		      }
+		    }
+      }
+      else {
+      }
+    }
+
+    // ----- Check the directory availability and create it if necessary
+    else {
+      if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/'))
+        $v_dir_to_check = $p_entry['filename'];
+      else if (!strstr($p_entry['filename'], "/"))
+        $v_dir_to_check = "";
+      else
+        $v_dir_to_check = dirname($p_entry['filename']);
+
+        if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
+  
+          // ----- Change the file status
+          $p_entry['status'] = "path_creation_fail";
+  
+          // ----- Return
+          //return $v_result;
+          $v_result = 1;
+        }
+      }
+    }
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010))
+      {
+        // ----- Look for not compressed file
+        if ($p_entry['compression'] == 0) {
+
+    		  // ----- Opening destination file
+          if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0)
+          {
+
+            // ----- Change the file status
+            $p_entry['status'] = "write_error";
+
+            // ----- Return
+            return $v_result;
+          }
+
+
+          // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+          $v_size = $p_entry['compressed_size'];
+          while ($v_size != 0)
+          {
+            $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+            $v_buffer = @fread($this->zip_fd, $v_read_size);
+            /* Try to speed up the code
+            $v_binary_data = pack('a'.$v_read_size, $v_buffer);
+            @fwrite($v_dest_file, $v_binary_data, $v_read_size);
+            */
+            @fwrite($v_dest_file, $v_buffer, $v_read_size);            
+            $v_size -= $v_read_size;
+          }
+
+          // ----- Closing the destination file
+          fclose($v_dest_file);
+
+          // ----- Change the file mtime
+          touch($p_entry['filename'], $p_entry['mtime']);
+          
+
+        }
+        else {
+          // ----- TBC
+          // Need to be finished
+          if (($p_entry['flag'] & 1) == 1) {
+            PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.');
+            return PclZip::errorCode();
+          }
+
+
+          // ----- Look for using temporary file to unzip
+          if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) 
+              && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
+                  || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
+                      && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {
+            $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options);
+            if ($v_result < PCLZIP_ERR_NO_ERROR) {
+              return $v_result;
+            }
+          }
+          
+          // ----- Look for extract in memory
+          else {
+
+          
+            // ----- Read the compressed file in a buffer (one shot)
+            $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+            
+            // ----- Decompress the file
+            $v_file_content = @gzinflate($v_buffer);
+            unset($v_buffer);
+            if ($v_file_content === FALSE) {
+  
+              // ----- Change the file status
+              // TBC
+              $p_entry['status'] = "error";
+              
+              return $v_result;
+            }
+            
+            // ----- Opening destination file
+            if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
+  
+              // ----- Change the file status
+              $p_entry['status'] = "write_error";
+  
+              return $v_result;
+            }
+  
+            // ----- Write the uncompressed data
+            @fwrite($v_dest_file, $v_file_content, $p_entry['size']);
+            unset($v_file_content);
+  
+            // ----- Closing the destination file
+            @fclose($v_dest_file);
+            
+          }
+
+          // ----- Change the file mtime
+          @touch($p_entry['filename'], $p_entry['mtime']);
+        }
+
+        // ----- Look for chmod option
+        if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) {
+
+          // ----- Change the mode of the file
+          @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]);
+        }
+
+      }
+    }
+
+  	// ----- Change abort status
+  	if ($p_entry['status'] == "aborted") {
+        $p_entry['status'] = "skipped";
+  	}
+	
+    // ----- Look for post-extract callback
+    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFileUsingTempFile()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privExtractFileUsingTempFile(&$p_entry, &$p_options)
+  {
+    $v_result=1;
+        
+    // ----- Creates a temporary file
+    $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
+    if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) {
+      fclose($v_file);
+      PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode');
+      return PclZip::errorCode();
+    }
+
+
+    // ----- Write gz file format header
+    $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3));
+    @fwrite($v_dest_file, $v_binary_data, 10);
+
+    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+    $v_size = $p_entry['compressed_size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($this->zip_fd, $v_read_size);
+      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
+      @fwrite($v_dest_file, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Write gz file format footer
+    $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']);
+    @fwrite($v_dest_file, $v_binary_data, 8);
+
+    // ----- Close the temporary file
+    @fclose($v_dest_file);
+
+    // ----- Opening destination file
+    if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
+      $p_entry['status'] = "write_error";
+      return $v_result;
+    }
+
+    // ----- Open the temporary gz file
+    if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) {
+      @fclose($v_dest_file);
+      $p_entry['status'] = "read_error";
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode');
+      return PclZip::errorCode();
+    }
+
+
+    // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks
+    $v_size = $p_entry['size'];
+    while ($v_size != 0) {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @gzread($v_src_file, $v_read_size);
+      //$v_binary_data = pack('a'.$v_read_size, $v_buffer);
+      @fwrite($v_dest_file, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+    @fclose($v_dest_file);
+    @gzclose($v_src_file);
+
+    // ----- Delete the temporary file
+    @unlink($v_gzip_temp_name);
+    
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFileInOutput()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privExtractFileInOutput(&$p_entry, &$p_options)
+  {
+    $v_result=1;
+
+    // ----- Read the file header
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1) {
+      return $v_result;
+    }
+
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    // ----- Look for pre-extract callback
+    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        // ----- This status is internal and will be changed in 'skipped'
+        $p_entry['status'] = "aborted";
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+    }
+
+    // ----- Trace
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
+        // ----- Look for not compressed file
+        if ($p_entry['compressed_size'] == $p_entry['size']) {
+
+          // ----- Read the file in a buffer (one shot)
+          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+
+          // ----- Send the file to the output
+          echo $v_buffer;
+          unset($v_buffer);
+        }
+        else {
+
+          // ----- Read the compressed file in a buffer (one shot)
+          $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
+          
+          // ----- Decompress the file
+          $v_file_content = gzinflate($v_buffer);
+          unset($v_buffer);
+
+          // ----- Send the file to the output
+          echo $v_file_content;
+          unset($v_file_content);
+        }
+      }
+    }
+
+	// ----- Change abort status
+	if ($p_entry['status'] == "aborted") {
+      $p_entry['status'] = "skipped";
+	}
+
+    // ----- Look for post-extract callback
+    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+    }
+
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privExtractFileAsString()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privExtractFileAsString(&$p_entry, &$p_string, &$p_options)
+  {
+    $v_result=1;
+
+    // ----- Read the file header
+    $v_header = array();
+    if (($v_result = $this->privReadFileHeader($v_header)) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+
+    // ----- Check that the file header is coherent with $p_entry info
+    if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) {
+        // TBC
+    }
+
+    // ----- Look for pre-extract callback
+    if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header);
+      if ($v_result == 0) {
+        // ----- Change the file status
+        $p_entry['status'] = "skipped";
+        $v_result = 1;
+      }
+      
+      // ----- Look for abort result
+      if ($v_result == 2) {
+        // ----- This status is internal and will be changed in 'skipped'
+        $p_entry['status'] = "aborted";
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+
+      // ----- Update the informations
+      // Only some fields can be modified
+      $p_entry['filename'] = $v_local_header['filename'];
+    }
+
+
+    // ----- Look if extraction should be done
+    if ($p_entry['status'] == 'ok') {
+
+      // ----- Do the extraction (if not a folder)
+      if (!(($p_entry['external']&0x00000010)==0x00000010)) {
+        // ----- Look for not compressed file
+  //      if ($p_entry['compressed_size'] == $p_entry['size'])
+        if ($p_entry['compression'] == 0) {
+  
+          // ----- Reading the file
+          $p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
+        }
+        else {
+  
+          // ----- Reading the file
+          $v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
+          
+          // ----- Decompress the file
+          if (($p_string = @gzinflate($v_data)) === FALSE) {
+              // TBC
+          }
+        }
+  
+        // ----- Trace
+      }
+      else {
+          // TBC : error : can not extract a folder in a string
+      }
+      
+    }
+
+  	// ----- Change abort status
+  	if ($p_entry['status'] == "aborted") {
+        $p_entry['status'] = "skipped";
+  	}
+	
+    // ----- Look for post-extract callback
+    elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
+
+      // ----- Generate a local information
+      $v_local_header = array();
+      $this->privConvertHeader2FileInfo($p_entry, $v_local_header);
+      
+      // ----- Swap the content to header
+      $v_local_header['content'] = $p_string;
+      $p_string = '';
+
+      // ----- Call the callback
+      // Here I do not use call_user_func() because I need to send a reference to the
+      // header.
+//      eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);');
+      $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header);
+
+      // ----- Swap back the content to header
+      $p_string = $v_local_header['content'];
+      unset($v_local_header['content']);
+
+      // ----- Look for abort result
+      if ($v_result == 2) {
+      	$v_result = PCLZIP_ERR_USER_ABORTED;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->zip_fd, 4);
+    $v_data = unpack('Vid', $v_binary_data);
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x04034b50)
+    {
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 26);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 26)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data);
+
+    // ----- Get filename
+    $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']);
+
+    // ----- Get extra_fields
+    if ($v_data['extra_len'] != 0) {
+      $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']);
+    }
+    else {
+      $p_header['extra'] = '';
+    }
+
+    // ----- Extract properties
+    $p_header['version_extracted'] = $v_data['version'];
+    $p_header['compression'] = $v_data['compression'];
+    $p_header['size'] = $v_data['size'];
+    $p_header['compressed_size'] = $v_data['compressed_size'];
+    $p_header['crc'] = $v_data['crc'];
+    $p_header['flag'] = $v_data['flag'];
+    $p_header['filename_len'] = $v_data['filename_len'];
+
+    // ----- Recuperate date in UNIX format
+    $p_header['mdate'] = $v_data['mdate'];
+    $p_header['mtime'] = $v_data['mtime'];
+    if ($p_header['mdate'] && $p_header['mtime'])
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+    }
+
+    // TBC
+    //for(reset($v_data); $key = key($v_data); next($v_data)) {
+    //}
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set the status field
+    $p_header['status'] = "ok";
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadCentralFileHeader()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadCentralFileHeader(&$p_header)
+  {
+    $v_result=1;
+
+    // ----- Read the 4 bytes signature
+    $v_binary_data = @fread($this->zip_fd, 4);
+    $v_data = unpack('Vid', $v_binary_data);
+
+    // ----- Check signature
+    if ($v_data['id'] != 0x02014b50)
+    {
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Read the first 42 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 42);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 42)
+    {
+      $p_header['filename'] = "";
+      $p_header['status'] = "invalid_header";
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data);
+
+    // ----- Get filename
+    if ($p_header['filename_len'] != 0)
+      $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']);
+    else
+      $p_header['filename'] = '';
+
+    // ----- Get extra
+    if ($p_header['extra_len'] != 0)
+      $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']);
+    else
+      $p_header['extra'] = '';
+
+    // ----- Get comment
+    if ($p_header['comment_len'] != 0)
+      $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']);
+    else
+      $p_header['comment'] = '';
+
+    // ----- Extract properties
+
+    // ----- Recuperate date in UNIX format
+    //if ($p_header['mdate'] && $p_header['mtime'])
+    // TBC : bug : this was ignoring time with 0/0/0
+    if (1)
+    {
+      // ----- Extract time
+      $v_hour = ($p_header['mtime'] & 0xF800) >> 11;
+      $v_minute = ($p_header['mtime'] & 0x07E0) >> 5;
+      $v_seconde = ($p_header['mtime'] & 0x001F)*2;
+
+      // ----- Extract date
+      $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980;
+      $v_month = ($p_header['mdate'] & 0x01E0) >> 5;
+      $v_day = $p_header['mdate'] & 0x001F;
+
+      // ----- Get UNIX date format
+      $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year);
+
+    }
+    else
+    {
+      $p_header['mtime'] = time();
+    }
+
+    // ----- Set the stored filename
+    $p_header['stored_filename'] = $p_header['filename'];
+
+    // ----- Set default status to ok
+    $p_header['status'] = 'ok';
+
+    // ----- Look if it is a directory
+    if (substr($p_header['filename'], -1) == '/') {
+      //$p_header['external'] = 0x41FF0010;
+      $p_header['external'] = 0x00000010;
+    }
+
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privCheckFileHeaders()
+  // Description :
+  // Parameters :
+  // Return Values :
+  //   1 on success,
+  //   0 on error;
+  // --------------------------------------------------------------------------------
+  function privCheckFileHeaders(&$p_local_header, &$p_central_header)
+  {
+    $v_result=1;
+
+  	// ----- Check the static values
+  	// TBC
+  	if ($p_local_header['filename'] != $p_central_header['filename']) {
+  	}
+  	if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) {
+  	}
+  	if ($p_local_header['flag'] != $p_central_header['flag']) {
+  	}
+  	if ($p_local_header['compression'] != $p_central_header['compression']) {
+  	}
+  	if ($p_local_header['mtime'] != $p_central_header['mtime']) {
+  	}
+  	if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
+  	}
+  
+  	// ----- Look for flag bit 3
+  	if (($p_local_header['flag'] & 8) == 8) {
+          $p_local_header['size'] = $p_central_header['size'];
+          $p_local_header['compressed_size'] = $p_central_header['compressed_size'];
+          $p_local_header['crc'] = $p_central_header['crc'];
+  	}
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privReadEndCentralDir()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privReadEndCentralDir(&$p_central_dir)
+  {
+    $v_result=1;
+
+    // ----- Go to the end of the zip file
+    $v_size = filesize($this->zipname);
+    @fseek($this->zip_fd, $v_size);
+    if (@ftell($this->zip_fd) != $v_size)
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\'');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- First try : look if this is an archive with no commentaries (most of the time)
+    // in this case the end of central dir is at 22 bytes of the file end
+    $v_found = 0;
+    if ($v_size > 26) {
+      @fseek($this->zip_fd, $v_size-22);
+      if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22))
+      {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+
+      // ----- Read for bytes
+      $v_binary_data = @fread($this->zip_fd, 4);
+      $v_data = @unpack('Vid', $v_binary_data);
+
+      // ----- Check signature
+      if ($v_data['id'] == 0x06054b50) {
+        $v_found = 1;
+      }
+
+      $v_pos = ftell($this->zip_fd);
+    }
+
+    // ----- Go back to the maximum possible size of the Central Dir End Record
+    if (!$v_found) {
+      $v_maximum_size = 65557; // 0xFFFF + 22;
+      if ($v_maximum_size > $v_size)
+        $v_maximum_size = $v_size;
+      @fseek($this->zip_fd, $v_size-$v_maximum_size);
+      if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size))
+      {
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\'');
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+
+      // ----- Read byte per byte in order to find the signature
+      $v_pos = ftell($this->zip_fd);
+      $v_bytes = 0x00000000;
+      while ($v_pos < $v_size)
+      {
+        // ----- Read a byte
+        $v_byte = @fread($this->zip_fd, 1);
+
+        // -----  Add the byte
+        //$v_bytes = ($v_bytes << 8) | Ord($v_byte);
+        // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number 
+        // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. 
+        $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); 
+
+        // ----- Compare the bytes
+        if ($v_bytes == 0x504b0506)
+        {
+          $v_pos++;
+          break;
+        }
+
+        $v_pos++;
+      }
+
+      // ----- Look if not found end of central dir
+      if ($v_pos == $v_size)
+      {
+
+        // ----- Error log
+        PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature");
+
+        // ----- Return
+        return PclZip::errorCode();
+      }
+    }
+
+    // ----- Read the first 18 bytes of the header
+    $v_binary_data = fread($this->zip_fd, 18);
+
+    // ----- Look for invalid block size
+    if (strlen($v_binary_data) != 18)
+    {
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data));
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Extract the values
+    $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
+
+    // ----- Check the global size
+    if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
+
+	  // ----- Removed in release 2.2 see readme file
+	  // The check of the file size is a little too strict.
+	  // Some bugs where found when a zip is encrypted/decrypted with 'crypt'.
+	  // While decrypted, zip has training 0 bytes
+	  if (0) {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT,
+	                       'The central dir is not at the end of the archive.'
+						   .' Some trailing bytes exists after the archive.');
+
+      // ----- Return
+      return PclZip::errorCode();
+	  }
+    }
+
+    // ----- Get comment
+    if ($v_data['comment_size'] != 0) {
+      $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
+    }
+    else
+      $p_central_dir['comment'] = '';
+
+    $p_central_dir['entries'] = $v_data['entries'];
+    $p_central_dir['disk_entries'] = $v_data['disk_entries'];
+    $p_central_dir['offset'] = $v_data['offset'];
+    $p_central_dir['size'] = $v_data['size'];
+    $p_central_dir['disk'] = $v_data['disk'];
+    $p_central_dir['disk_start'] = $v_data['disk_start'];
+
+    // TBC
+    //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
+    //}
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDeleteByRule()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDeleteByRule(&$p_result_list, &$p_options)
+  {
+    $v_result=1;
+    $v_list_detail = array();
+
+    // ----- Open the zip file
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->zip_fd);
+
+    // ----- Scan all the files
+    // ----- Start at beginning of Central Dir
+    $v_pos_entry = $v_central_dir['offset'];
+    @rewind($this->zip_fd);
+    if (@fseek($this->zip_fd, $v_pos_entry))
+    {
+      // ----- Close the zip file
+      $this->privCloseFd();
+
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Read each entry
+    $v_header_list = array();
+    $j_start = 0;
+    for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++)
+    {
+
+      // ----- Read the file header
+      $v_header_list[$v_nb_extracted] = array();
+      if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1)
+      {
+        // ----- Close the zip file
+        $this->privCloseFd();
+
+        return $v_result;
+      }
+
+
+      // ----- Store the index
+      $v_header_list[$v_nb_extracted]['index'] = $i;
+
+      // ----- Look for the specific extract rules
+      $v_found = false;
+
+      // ----- Look for extract by name rule
+      if (   (isset($p_options[PCLZIP_OPT_BY_NAME]))
+          && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) {
+
+          // ----- Look if the filename is in the list
+          for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) {
+
+              // ----- Look for a directory
+              if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") {
+
+                  // ----- Look if the directory is in the filename path
+                  if (   (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j]))
+                      && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      $v_found = true;
+                  }
+                  elseif (   (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */
+                          && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) {
+                      $v_found = true;
+                  }
+              }
+              // ----- Look for a filename
+              elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) {
+                  $v_found = true;
+              }
+          }
+      }
+
+      // ----- Look for extract by ereg rule
+      // ereg() is deprecated with PHP 5.3
+      /*
+      else if (   (isset($p_options[PCLZIP_OPT_BY_EREG]))
+               && ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
+
+          if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              $v_found = true;
+          }
+      }
+      */
+
+      // ----- Look for extract by preg rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_PREG]))
+               && ($p_options[PCLZIP_OPT_BY_PREG] != "")) {
+
+          if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) {
+              $v_found = true;
+          }
+      }
+
+      // ----- Look for extract by index rule
+      else if (   (isset($p_options[PCLZIP_OPT_BY_INDEX]))
+               && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
+
+          // ----- Look if the index is in the list
+          for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) {
+
+              if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) {
+                  $v_found = true;
+              }
+              if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) {
+                  $j_start = $j+1;
+              }
+
+              if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) {
+                  break;
+              }
+          }
+      }
+      else {
+      	$v_found = true;
+      }
+
+      // ----- Look for deletion
+      if ($v_found)
+      {
+        unset($v_header_list[$v_nb_extracted]);
+      }
+      else
+      {
+        $v_nb_extracted++;
+      }
+    }
+
+    // ----- Look if something need to be deleted
+    if ($v_nb_extracted > 0) {
+
+        // ----- Creates a temporay file
+        $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+        // ----- Creates a temporary zip archive
+        $v_temp_zip = new PclZip($v_zip_temp_name);
+
+        // ----- Open the temporary zip file in write mode
+        if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) {
+            $this->privCloseFd();
+
+            // ----- Return
+            return $v_result;
+        }
+
+        // ----- Look which file need to be kept
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+
+            // ----- Calculate the position of the header
+            @rewind($this->zip_fd);
+            if (@fseek($this->zip_fd,  $v_header_list[$i]['offset'])) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Error log
+                PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size');
+
+                // ----- Return
+                return PclZip::errorCode();
+            }
+
+            // ----- Read the file header
+            $v_local_header = array();
+            if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                return $v_result;
+            }
+            
+            // ----- Check that local file header is same as central file header
+            if ($this->privCheckFileHeaders($v_local_header,
+			                                $v_header_list[$i]) != 1) {
+                // TBC
+            }
+            unset($v_local_header);
+
+            // ----- Write the file header
+            if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                return $v_result;
+            }
+
+            // ----- Read/write the data block
+            if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) {
+                // ----- Close the zip file
+                $this->privCloseFd();
+                $v_temp_zip->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                return $v_result;
+            }
+        }
+
+        // ----- Store the offset of the central dir
+        $v_offset = @ftell($v_temp_zip->zip_fd);
+
+        // ----- Re-Create the Central Dir files header
+        for ($i=0; $i<sizeof($v_header_list); $i++) {
+            // ----- Create the file header
+            if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) {
+                $v_temp_zip->privCloseFd();
+                $this->privCloseFd();
+                @unlink($v_zip_temp_name);
+
+                // ----- Return
+                return $v_result;
+            }
+
+            // ----- Transform the header to a 'usable' info
+            $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]);
+        }
+
+
+        // ----- Zip file comment
+        $v_comment = '';
+        if (isset($p_options[PCLZIP_OPT_COMMENT])) {
+          $v_comment = $p_options[PCLZIP_OPT_COMMENT];
+        }
+
+        // ----- Calculate the size of the central header
+        $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset;
+
+        // ----- Create the central dir footer
+        if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) {
+            // ----- Reset the file list
+            unset($v_header_list);
+            $v_temp_zip->privCloseFd();
+            $this->privCloseFd();
+            @unlink($v_zip_temp_name);
+
+            // ----- Return
+            return $v_result;
+        }
+
+        // ----- Close
+        $v_temp_zip->privCloseFd();
+        $this->privCloseFd();
+
+        // ----- Delete the zip file
+        // TBC : I should test the result ...
+        @unlink($this->zipname);
+
+        // ----- Rename the temporary file
+        // TBC : I should test the result ...
+        //@rename($v_zip_temp_name, $this->zipname);
+        PclZipUtilRename($v_zip_temp_name, $this->zipname);
+    
+        // ----- Destroy the temporary archive
+        unset($v_temp_zip);
+    }
+    
+    // ----- Remove every files : reset the file
+    else if ($v_central_dir['entries'] != 0) {
+        $this->privCloseFd();
+
+        if (($v_result = $this->privOpenFd('wb')) != 1) {
+          return $v_result;
+        }
+
+        if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) {
+          return $v_result;
+        }
+
+        $this->privCloseFd();
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDirCheck()
+  // Description :
+  //   Check if a directory exists, if not it creates it and all the parents directory
+  //   which may be useful.
+  // Parameters :
+  //   $p_dir : Directory path to check.
+  // Return Values :
+  //    1 : OK
+  //   -1 : Unable to create directory
+  // --------------------------------------------------------------------------------
+  function privDirCheck($p_dir, $p_is_dir=false)
+  {
+    $v_result = 1;
+
+
+    // ----- Remove the final '/'
+    if (($p_is_dir) && (substr($p_dir, -1)=='/'))
+    {
+      $p_dir = substr($p_dir, 0, strlen($p_dir)-1);
+    }
+
+    // ----- Check the directory availability
+    if ((is_dir($p_dir)) || ($p_dir == ""))
+    {
+      return 1;
+    }
+
+    // ----- Extract parent directory
+    $p_parent_dir = dirname($p_dir);
+
+    // ----- Just a check
+    if ($p_parent_dir != $p_dir)
+    {
+      // ----- Look for parent directory
+      if ($p_parent_dir != "")
+      {
+        if (($v_result = $this->privDirCheck($p_parent_dir)) != 1)
+        {
+          return $v_result;
+        }
+      }
+    }
+
+    // ----- Create the directory
+    if (!@mkdir($p_dir, 0777))
+    {
+      // ----- Error log
+      PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'");
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privMerge()
+  // Description :
+  //   If $p_archive_to_add does not exist, the function exit with a success result.
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privMerge(&$p_archive_to_add)
+  {
+    $v_result=1;
+
+    // ----- Look if the archive_to_add exists
+    if (!is_file($p_archive_to_add->zipname))
+    {
+
+      // ----- Nothing to merge, so merge is a success
+      $v_result = 1;
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Look if the archive exists
+    if (!is_file($this->zipname))
+    {
+
+      // ----- Do a duplicate
+      $v_result = $this->privDuplicate($p_archive_to_add->zipname);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    if (($v_result=$this->privOpenFd('rb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir = array();
+    if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1)
+    {
+      $this->privCloseFd();
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($this->zip_fd);
+
+    // ----- Open the archive_to_add file
+    if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1)
+    {
+      $this->privCloseFd();
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Read the central directory informations
+    $v_central_dir_to_add = array();
+    if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+
+      return $v_result;
+    }
+
+    // ----- Go to beginning of File
+    @rewind($p_archive_to_add->zip_fd);
+
+    // ----- Creates a temporay file
+    $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp';
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = $v_central_dir['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the files from the archive_to_add into the temporary file
+    $v_size = $v_central_dir_to_add['offset'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Store the offset of the central dir
+    $v_offset = @ftell($v_zip_temp_fd);
+
+    // ----- Copy the block of file headers from the old archive
+    $v_size = $v_central_dir['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($this->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Copy the block of file headers from the archive_to_add
+    $v_size = $v_central_dir_to_add['size'];
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size);
+      @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Merge the file comments
+    $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment'];
+
+    // ----- Calculate the size of the (new) central header
+    $v_size = @ftell($v_zip_temp_fd)-$v_offset;
+
+    // ----- Swap the file descriptor
+    // Here is a trick : I swap the temporary fd with the zip fd, in order to use
+    // the following methods on the temporary fil and not the real archive fd
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Create the central dir footer
+    if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1)
+    {
+      $this->privCloseFd();
+      $p_archive_to_add->privCloseFd();
+      @fclose($v_zip_temp_fd);
+      $this->zip_fd = null;
+
+      // ----- Reset the file list
+      unset($v_header_list);
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Swap back the file descriptor
+    $v_swap = $this->zip_fd;
+    $this->zip_fd = $v_zip_temp_fd;
+    $v_zip_temp_fd = $v_swap;
+
+    // ----- Close
+    $this->privCloseFd();
+    $p_archive_to_add->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Delete the zip file
+    // TBC : I should test the result ...
+    @unlink($this->zipname);
+
+    // ----- Rename the temporary file
+    // TBC : I should test the result ...
+    //@rename($v_zip_temp_name, $this->zipname);
+    PclZipUtilRename($v_zip_temp_name, $this->zipname);
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDuplicate()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDuplicate($p_archive_filename)
+  {
+    $v_result=1;
+
+    // ----- Look if the $p_archive_filename exists
+    if (!is_file($p_archive_filename))
+    {
+
+      // ----- Nothing to duplicate, so duplicate is a success.
+      $v_result = 1;
+
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Open the zip file
+    if (($v_result=$this->privOpenFd('wb')) != 1)
+    {
+      // ----- Return
+      return $v_result;
+    }
+
+    // ----- Open the temporary file in write mode
+    if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0)
+    {
+      $this->privCloseFd();
+
+      PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode');
+
+      // ----- Return
+      return PclZip::errorCode();
+    }
+
+    // ----- Copy the files from the archive to the temporary file
+    // TBC : Here I should better append the file and go back to erase the central dir
+    $v_size = filesize($p_archive_filename);
+    while ($v_size != 0)
+    {
+      $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE);
+      $v_buffer = fread($v_zip_temp_fd, $v_read_size);
+      @fwrite($this->zip_fd, $v_buffer, $v_read_size);
+      $v_size -= $v_read_size;
+    }
+
+    // ----- Close
+    $this->privCloseFd();
+
+    // ----- Close the temporary file
+    @fclose($v_zip_temp_fd);
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privErrorLog()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privErrorLog($p_error_code=0, $p_error_string='')
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      PclError($p_error_code, $p_error_string);
+    }
+    else {
+      $this->error_code = $p_error_code;
+      $this->error_string = $p_error_string;
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privErrorReset()
+  // Description :
+  // Parameters :
+  // --------------------------------------------------------------------------------
+  function privErrorReset()
+  {
+    if (PCLZIP_ERROR_EXTERNAL == 1) {
+      PclErrorReset();
+    }
+    else {
+      $this->error_code = 0;
+      $this->error_string = '';
+    }
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privDisableMagicQuotes()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privDisableMagicQuotes()
+  {
+    $v_result=1;
+
+    // ----- Look if function exists
+    if (   (!function_exists("get_magic_quotes_runtime"))
+	    || (!function_exists("set_magic_quotes_runtime"))) {
+      return $v_result;
+	}
+
+    // ----- Look if already done
+    if ($this->magic_quotes_status != -1) {
+      return $v_result;
+	}
+
+	// ----- Get and memorize the magic_quote value
+	$this->magic_quotes_status = @get_magic_quotes_runtime();
+
+	// ----- Disable magic_quotes
+	if ($this->magic_quotes_status == 1) {
+	  @set_magic_quotes_runtime(0);
+	}
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : privSwapBackMagicQuotes()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function privSwapBackMagicQuotes()
+  {
+    $v_result=1;
+
+    // ----- Look if function exists
+    if (   (!function_exists("get_magic_quotes_runtime"))
+	    || (!function_exists("set_magic_quotes_runtime"))) {
+      return $v_result;
+	}
+
+    // ----- Look if something to do
+    if ($this->magic_quotes_status != -1) {
+      return $v_result;
+	}
+
+	// ----- Swap back magic_quotes
+	if ($this->magic_quotes_status == 1) {
+  	  @set_magic_quotes_runtime($this->magic_quotes_status);
+	}
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  }
+  // End of class
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilPathReduction()
+  // Description :
+  // Parameters :
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function PclZipUtilPathReduction($p_dir)
+  {
+    $v_result = "";
+
+    // ----- Look for not empty path
+    if ($p_dir != "") {
+      // ----- Explode path by directory names
+      $v_list = explode("/", $p_dir);
+
+      // ----- Study directories from last to first
+      $v_skip = 0;
+      for ($i=sizeof($v_list)-1; $i>=0; $i--) {
+        // ----- Look for current path
+        if ($v_list[$i] == ".") {
+          // ----- Ignore this directory
+          // Should be the first $i=0, but no check is done
+        }
+        else if ($v_list[$i] == "..") {
+		  $v_skip++;
+        }
+        else if ($v_list[$i] == "") {
+		  // ----- First '/' i.e. root slash
+		  if ($i == 0) {
+            $v_result = "/".$v_result;
+		    if ($v_skip > 0) {
+		        // ----- It is an invalid path, so the path is not modified
+		        // TBC
+		        $v_result = $p_dir;
+                $v_skip = 0;
+		    }
+		  }
+		  // ----- Last '/' i.e. indicates a directory
+		  else if ($i == (sizeof($v_list)-1)) {
+            $v_result = $v_list[$i];
+		  }
+		  // ----- Double '/' inside the path
+		  else {
+            // ----- Ignore only the double '//' in path,
+            // but not the first and last '/'
+		  }
+        }
+        else {
+		  // ----- Look for item to skip
+		  if ($v_skip > 0) {
+		    $v_skip--;
+		  }
+		  else {
+            $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:"");
+		  }
+        }
+      }
+      
+      // ----- Look for skip
+      if ($v_skip > 0) {
+        while ($v_skip > 0) {
+            $v_result = '../'.$v_result;
+            $v_skip--;
+        }
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilPathInclusion()
+  // Description :
+  //   This function indicates if the path $p_path is under the $p_dir tree. Or,
+  //   said in an other way, if the file or sub-dir $p_path is inside the dir
+  //   $p_dir.
+  //   The function indicates also if the path is exactly the same as the dir.
+  //   This function supports path with duplicated '/' like '//', but does not
+  //   support '.' or '..' statements.
+  // Parameters :
+  // Return Values :
+  //   0 if $p_path is not inside directory $p_dir
+  //   1 if $p_path is inside directory $p_dir
+  //   2 if $p_path is exactly the same as $p_dir
+  // --------------------------------------------------------------------------------
+  function PclZipUtilPathInclusion($p_dir, $p_path)
+  {
+    $v_result = 1;
+    
+    // ----- Look for path beginning by ./
+    if (   ($p_dir == '.')
+        || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
+      $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1);
+    }
+    if (   ($p_path == '.')
+        || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) {
+      $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1);
+    }
+
+    // ----- Explode dir and path by directory separator
+    $v_list_dir = explode("/", $p_dir);
+    $v_list_dir_size = sizeof($v_list_dir);
+    $v_list_path = explode("/", $p_path);
+    $v_list_path_size = sizeof($v_list_path);
+
+    // ----- Study directories paths
+    $i = 0;
+    $j = 0;
+    while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) {
+
+      // ----- Look for empty dir (path reduction)
+      if ($v_list_dir[$i] == '') {
+        $i++;
+        continue;
+      }
+      if ($v_list_path[$j] == '') {
+        $j++;
+        continue;
+      }
+
+      // ----- Compare the items
+      if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != ''))  {
+        $v_result = 0;
+      }
+
+      // ----- Next items
+      $i++;
+      $j++;
+    }
+
+    // ----- Look if everything seems to be the same
+    if ($v_result) {
+      // ----- Skip all the empty items
+      while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++;
+      while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++;
+
+      if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) {
+        // ----- There are exactly the same
+        $v_result = 2;
+      }
+      else if ($i < $v_list_dir_size) {
+        // ----- The path is shorter than the dir
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilCopyBlock()
+  // Description :
+  // Parameters :
+  //   $p_mode : read/write compression mode
+  //             0 : src & dest normal
+  //             1 : src gzip, dest normal
+  //             2 : src normal, dest gzip
+  //             3 : src & dest gzip
+  // Return Values :
+  // --------------------------------------------------------------------------------
+  function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0)
+  {
+    $v_result = 1;
+
+    if ($p_mode==0)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        $v_buffer = @fread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==1)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @fwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==2)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        $v_buffer = @fread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+    else if ($p_mode==3)
+    {
+      while ($p_size != 0)
+      {
+        $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE);
+        $v_buffer = @gzread($p_src, $v_read_size);
+        @gzwrite($p_dest, $v_buffer, $v_read_size);
+        $p_size -= $v_read_size;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilRename()
+  // Description :
+  //   This function tries to do a simple rename() function. If it fails, it
+  //   tries to copy the $p_src file in a new $p_dest file and then unlink the
+  //   first one.
+  // Parameters :
+  //   $p_src : Old filename
+  //   $p_dest : New filename
+  // Return Values :
+  //   1 on success, 0 on failure.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilRename($p_src, $p_dest)
+  {
+    $v_result = 1;
+
+    // ----- Try to rename the files
+    if (!@rename($p_src, $p_dest)) {
+
+      // ----- Try to copy & unlink the src
+      if (!@copy($p_src, $p_dest)) {
+        $v_result = 0;
+      }
+      else if (!@unlink($p_src)) {
+        $v_result = 0;
+      }
+    }
+
+    // ----- Return
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilOptionText()
+  // Description :
+  //   Translate option value in text. Mainly for debug purpose.
+  // Parameters :
+  //   $p_option : the option value.
+  // Return Values :
+  //   The option text value.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilOptionText($p_option)
+  {
+    
+    $v_list = get_defined_constants();
+    for (reset($v_list); $v_key = key($v_list); next($v_list)) {
+	    $v_prefix = substr($v_key, 0, 10);
+	    if ((   ($v_prefix == 'PCLZIP_OPT')
+           || ($v_prefix == 'PCLZIP_CB_')
+           || ($v_prefix == 'PCLZIP_ATT'))
+	        && ($v_list[$v_key] == $p_option)) {
+        return $v_key;
+	    }
+    }
+    
+    $v_result = 'Unknown';
+
+    return $v_result;
+  }
+  // --------------------------------------------------------------------------------
+
+  // --------------------------------------------------------------------------------
+  // Function : PclZipUtilTranslateWinPath()
+  // Description :
+  //   Translate windows path by replacing '\' by '/' and optionally removing
+  //   drive letter.
+  // Parameters :
+  //   $p_path : path to translate.
+  //   $p_remove_disk_letter : true | false
+  // Return Values :
+  //   The path translated.
+  // --------------------------------------------------------------------------------
+  function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true)
+  {
+    if (stristr(php_uname(), 'windows')) {
+      // ----- Look for potential disk letter
+      if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) {
+          $p_path = substr($p_path, $v_position+1);
+      }
+      // ----- Change potential windows directory separator
+      if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) {
+          $p_path = strtr($p_path, '\\', '/');
+      }
+    }
+    return $p_path;
+  }
+  // --------------------------------------------------------------------------------
+
+
+?>
Index: tags/2.4.0RC3/admin/include/photos_add_direct_prepare.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/photos_add_direct_prepare.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/photos_add_direct_prepare.inc.php	(revision 14585)
@@ -0,0 +1,267 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+// +-----------------------------------------------------------------------+
+// | Uploaded photos                                                       |
+// +-----------------------------------------------------------------------+
+
+if (isset($page['thumbnails']))
+{
+  $template->assign(
+    array(
+      'thumbnails' => $page['thumbnails'],
+      )
+    );
+
+  // only display the batch link if we have more than 1 photo
+  if (count($page['thumbnails']) > 1)
+  {
+    $template->assign(
+      array(
+        'batch_link' => $page['batch_link'],
+        'batch_label' => sprintf(
+          l10n('Manage this set of %d photos'),
+          count($page['thumbnails'])
+          ),
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | Photo selection                                                       |
+// +-----------------------------------------------------------------------+
+
+$uploadify_path = PHPWG_ROOT_PATH.'admin/include/uploadify';
+
+$upload_max_filesize = min(
+  get_ini_size('upload_max_filesize'),
+  get_ini_size('post_max_size')
+  );
+
+if ($upload_max_filesize == get_ini_size('upload_max_filesize'))
+{
+  $upload_max_filesize_shorthand = get_ini_size('upload_max_filesize', false);
+}
+else
+{
+  $upload_max_filesize_shorthand = get_ini_size('post_max_filesize', false);
+}
+
+$template->assign(
+    array(
+      'F_ADD_ACTION'=> PHOTOS_ADD_BASE_URL,
+      'uploadify_path' => $uploadify_path,
+      'upload_max_filesize' => $upload_max_filesize,
+      'upload_max_filesize_shorthand' => $upload_max_filesize_shorthand,
+    )
+  );
+
+// what is the maximum number of pixels permitted by the memory_limit?
+if (pwg_image::get_library() == 'gd')
+{
+  $fudge_factor = 1.7;
+  $available_memory = get_ini_size('memory_limit') - memory_get_usage();
+  $max_upload_width = round(sqrt($available_memory/(2 * $fudge_factor)));
+  $max_upload_height = round(2 * $max_upload_width / 3);
+  
+  // we don't want dimensions like 2995x1992 but 3000x2000
+  $max_upload_width = round($max_upload_width/100)*100;
+  $max_upload_height = round($max_upload_height/100)*100;
+  
+  $max_upload_resolution = floor($max_upload_width * $max_upload_height / (1000000));
+
+  // no need to display a limitation warning if the limitation is huge like 20MP
+  if ($max_upload_resolution < 25)
+  {
+    $template->assign(
+      array(
+        'max_upload_width' => $max_upload_width,
+        'max_upload_height' => $max_upload_height,
+        'max_upload_resolution' => $max_upload_resolution,
+        )
+      );
+  }
+}
+
+$upload_modes = array('html', 'multiple');
+$upload_mode = isset($conf['upload_mode']) ? $conf['upload_mode'] : 'multiple';
+
+if (isset($_GET['upload_mode']) and in_array($_GET['upload_mode'], $upload_modes))
+{
+  $upload_mode = $_GET['upload_mode'];
+  conf_update_param('upload_mode', $upload_mode);
+}
+
+// what is the upload switch mode
+$index_of_upload_mode = array_flip($upload_modes);
+$upload_mode_index = $index_of_upload_mode[$upload_mode];
+$upload_switch = $upload_modes[ ($upload_mode_index + 1) % 2 ];
+
+$template->assign(
+    array(
+      'upload_mode' => $upload_mode,
+      'form_action' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode.'&amp;processed=1',
+      'switch_url' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_switch,
+      'upload_id' => md5(rand()),
+      'session_id' => session_id(),
+      'pwg_token' => get_pwg_token(),
+      'another_upload_link' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode,
+    )
+  );
+
+$upload_file_types = 'jpeg, png, gif';
+if ('html' == $upload_mode)
+{
+  $upload_file_types.= ', zip';
+}
+$template->assign(
+  array(
+    'upload_file_types' => $upload_file_types,
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// | Categories                                                            |
+// +-----------------------------------------------------------------------+
+
+// we need to know the category in which the last photo was added
+$selected_category = array();
+$selected_parent = array();
+
+$query = '
+SELECT
+    category_id,
+    id_uppercat
+  FROM '.IMAGES_TABLE.' AS i
+    JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = i.id
+    JOIN '.CATEGORIES_TABLE.' AS c ON category_id = c.id
+  ORDER BY i.id DESC
+  LIMIT 1
+;';
+$result = pwg_query($query);
+if (pwg_db_num_rows($result) > 0)
+{
+  $row = pwg_db_fetch_assoc($result);
+  
+  $selected_category = array($row['category_id']);
+
+  if (!empty($row['id_uppercat']))
+  {
+    $selected_parent = array($row['id_uppercat']);
+  }
+}
+
+// existing album
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+
+display_select_cat_wrapper(
+  $query,
+  $selected_category,
+  'category_options'
+  );
+
+// new category
+display_select_cat_wrapper(
+  $query,
+  $selected_parent,
+  'category_parent_options'
+  );
+
+
+// image level options
+$selected_level = isset($_POST['level']) ? $_POST['level'] : 0;
+$template->assign(
+    array(
+      'level_options'=> get_privacy_level_options(),
+      'level_options_selected' => array($selected_level)
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// | Setup errors/warnings                                                 |
+// +-----------------------------------------------------------------------+
+
+// Errors
+$setup_errors = array();
+
+$error_message = ready_for_upload_message();
+if (!empty($error_message))
+{
+  array_push($setup_errors, $error_message);
+}
+
+if (!function_exists('gd_info'))
+{
+  array_push($setup_errors, l10n('GD library is missing'));
+}
+
+$template->assign(
+  array(
+    'setup_errors'=> $setup_errors,
+    )
+  );
+
+// Warnings
+if (isset($_GET['hide_warnings']))
+{
+  $_SESSION['upload_hide_warnings'] = true;
+}
+
+if (!isset($_SESSION['upload_hide_warnings']))
+{
+  $setup_warnings = array();
+  
+  if ($conf['use_exif'] and !function_exists('read_exif_data'))
+  {
+    array_push(
+      $setup_warnings,
+      l10n('Exif extension not available, admin should disable exif use')
+      );
+  }
+
+  if (get_ini_size('upload_max_filesize') > get_ini_size('post_max_size'))
+  {
+    array_push(
+      $setup_warnings,
+      sprintf(
+        l10n('In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'),
+        get_ini_size('upload_max_filesize', false),
+        get_ini_size('post_max_size', false)
+        )
+      );
+  }
+
+  $template->assign(
+    array(
+      'setup_warnings' => $setup_warnings,
+      'hide_warnings_link' => PHOTOS_ADD_BASE_URL.'&amp;upload_mode='.$upload_mode.'&amp;hide_warnings=1'
+      )
+    );
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/photos_add_direct_process.inc.php
===================================================================
--- tags/2.4.0RC3/admin/include/photos_add_direct_process.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/photos_add_direct_process.inc.php	(revision 14585)
@@ -0,0 +1,269 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+if (isset($_GET['processed']))
+{
+//   echo '<pre>POST'."\n"; print_r($_POST); echo '</pre>';
+//   echo '<pre>FILES'."\n"; print_r($_FILES); echo '</pre>';
+//   echo '<pre>SESSION'."\n"; print_r($_SESSION); echo '</pre>';
+//   exit();
+
+  // sometimes, you have submitted the form but you have nothing in $_POST
+  // and $_FILES. This may happen when you have an HTML upload and you
+  // exceeded the post_max_size (but not the upload_max_size)
+  if (!isset($_POST['submit_upload']))
+  {
+    array_push(
+      $page['errors'],
+      sprintf(
+        l10n('The uploaded files exceed the post_max_size directive in php.ini: %sB'),
+        ini_get('post_max_size')
+        )
+      );
+  }
+  else
+  {
+    $category_id = $_POST['category'];
+  }
+
+  if (isset($_POST['onUploadError']) and is_array($_POST['onUploadError']) and count($_POST['onUploadError']) > 0)
+  {
+    foreach ($_POST['onUploadError'] as $error)
+    {
+      array_push($page['errors'], $error);
+    }
+  }
+    
+  $image_ids = array();
+        
+  if (isset($_FILES) and !empty($_FILES['image_upload']))
+  {
+    $starttime = get_moment();
+
+  foreach ($_FILES['image_upload']['error'] as $idx => $error)
+  {
+    if (UPLOAD_ERR_OK == $error)
+    {
+      $images_to_add = array();
+      
+      $extension = pathinfo($_FILES['image_upload']['name'][$idx], PATHINFO_EXTENSION);
+      if ('zip' == strtolower($extension))
+      {
+        $upload_dir = $conf['upload_dir'].'/buffer';
+        prepare_directory($upload_dir);
+        
+        $temporary_archive_name = date('YmdHis').'-'.generate_key(10);
+        $archive_path = $upload_dir.'/'.$temporary_archive_name.'.zip';
+        
+        move_uploaded_file(
+          $_FILES['image_upload']['tmp_name'][$idx],
+          $archive_path
+          );
+
+        define('PCLZIP_TEMPORARY_DIR', $upload_dir.'/');
+        include(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
+        $zip = new PclZip($archive_path);
+        if ($list = $zip->listContent())
+        {
+          $indexes_to_extract = array();
+          
+          foreach ($list as $node)
+          {
+            if (1 == $node['folder'])
+            {
+              continue;
+            }
+
+            if (is_valid_image_extension(pathinfo($node['filename'], PATHINFO_EXTENSION)))
+            {
+              array_push($indexes_to_extract, $node['index']);
+              
+              array_push(
+                $images_to_add,
+                array(
+                  'source_filepath' => $upload_dir.'/'.$temporary_archive_name.'/'.$node['filename'],
+                  'original_filename' => basename($node['filename']),
+                  )
+                );
+            }
+          }
+      
+          if (count($indexes_to_extract) > 0)
+          {
+            $zip->extract(
+              PCLZIP_OPT_PATH, $upload_dir.'/'.$temporary_archive_name,
+              PCLZIP_OPT_BY_INDEX, $indexes_to_extract,
+              PCLZIP_OPT_ADD_TEMP_FILE_ON
+              );
+          }
+        }
+      }
+      elseif (is_valid_image_extension($extension))
+      {
+        array_push(
+          $images_to_add,
+          array(
+            'source_filepath' => $_FILES['image_upload']['tmp_name'][$idx],
+            'original_filename' => $_FILES['image_upload']['name'][$idx],
+            )
+          );
+      }
+
+      foreach ($images_to_add as $image_to_add)
+      {
+        $image_id = add_uploaded_file(
+          $image_to_add['source_filepath'],
+          $image_to_add['original_filename'],
+          array($category_id),
+          $_POST['level']
+          );
+
+        array_push($image_ids, $image_id);
+
+        // TODO: if $image_id is not an integer, something went wrong
+      }
+    }
+    else
+    {
+      $error_message = file_upload_error_message($error);
+      
+      array_push(
+        $page['errors'],
+        sprintf(
+          l10n('Error on file "%s" : %s'),
+          $_FILES['image_upload']['name'][$idx],
+          $error_message
+          )
+        );
+    }
+  }
+  
+  $endtime = get_moment();
+  $elapsed = ($endtime - $starttime) * 1000;
+  // printf('%.2f ms', $elapsed);
+
+  } // if (!empty($_FILES))
+
+  if (isset($_POST['upload_id']))
+  {
+    // we're on a multiple upload, with uploadify and so on
+    if (isset($_SESSION['uploads_error'][ $_POST['upload_id'] ]))
+    {
+      foreach ($_SESSION['uploads_error'][ $_POST['upload_id'] ] as $error)
+      {
+        array_push($page['errors'], $error);
+      }
+    }
+
+    if (isset($_SESSION['uploads'][ $_POST['upload_id'] ]))
+    {
+      $image_ids = $_SESSION['uploads'][ $_POST['upload_id'] ];
+    }
+  }
+  
+  $page['thumbnails'] = array();
+  foreach ($image_ids as $image_id)
+  {
+    // we could return the list of properties from the add_uploaded_file
+    // function, but I like the "double check". And it costs nothing
+    // compared to the upload process.
+    $thumbnail = array();
+      
+    $query = '
+SELECT
+    id,
+    file,
+    path,
+    tn_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$image_id.'
+;';
+    $image_infos = pwg_db_fetch_assoc(pwg_query($query));
+
+    $thumbnail['file'] = $image_infos['file'];
+    
+    $thumbnail['src'] = DerivativeImage::thumb_url($image_infos);
+
+    // TODO: when implementing this plugin in Piwigo core, we should have
+    // a function get_image_name($name, $file) (if name is null, then
+    // compute a temporary name from filename) that would be also used in
+    // picture.php. UPDATE: in fact, "get_name_from_file($file)" already
+    // exists and is used twice (batch_manager_unit + comments, but not in
+    // picture.php I don't know why) with the same pattern if
+    // (empty($name)) {$name = get_name_from_file($file)}, a clean
+    // function get_image_name($name, $file) would be better
+    $thumbnail['title'] = get_name_from_file($image_infos['file']);
+
+    $thumbnail['link'] = get_root_url().'admin.php?page=photo-'.$image_id.'&amp;cat_id='.$category_id;
+
+    array_push($page['thumbnails'], $thumbnail);
+  }
+  
+  if (!empty($page['thumbnails']))
+  {
+    array_push(
+      $page['infos'],
+      sprintf(
+        l10n('%d photos uploaded'),
+        count($page['thumbnails'])
+        )
+      );
+    
+    if (0 != $_POST['level'])
+    {
+      array_push(
+        $page['infos'],
+        sprintf(
+          l10n('Privacy level set to "%s"'),
+          l10n(
+            sprintf('Level %d', $_POST['level'])
+            )
+          )
+        );
+    }
+
+    $query = '
+SELECT
+    COUNT(*)
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id = '.$category_id.'
+;';
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    $category_name = get_cat_display_name_from_id($category_id, 'admin.php?page=album-');
+    
+    // information
+    array_push(
+      $page['infos'],
+      sprintf(
+        l10n('Album "%s" now contains %d photos'),
+        '<em>'.$category_name.'</em>',
+        $count
+        )
+      );
+    
+    $page['batch_link'] = PHOTOS_ADD_BASE_URL.'&batch='.implode(',', $image_ids);
+  }
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/plugins.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/plugins.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/plugins.class.php	(revision 14585)
@@ -0,0 +1,677 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class plugins
+{
+  var $fs_plugins = array();
+  var $db_plugins_by_id = array();
+  var $server_plugins = array();
+  var $default_plugins = array('LocalFilesEditor', 'language_switch', 'c13y_upgrade', 'admin_multi_view');
+
+  /**
+   * Initialize $fs_plugins and $db_plugins_by_id
+  */
+  function plugins()
+  {
+    $this->get_fs_plugins();
+
+    foreach (get_db_plugins() as $db_plugin)
+    {
+      $this->db_plugins_by_id[$db_plugin['id']] = $db_plugin;
+    }
+  }
+
+ /**
+   * Perform requested actions
+  *  @param string - action
+  * @param string - plugin id
+  * @param array - errors
+  */
+  function perform_action($action, $plugin_id)
+  {
+    if (isset($this->db_plugins_by_id[$plugin_id]))
+    {
+      $crt_db_plugin = $this->db_plugins_by_id[$plugin_id];
+    }
+    $file_to_include = PHPWG_PLUGINS_PATH . $plugin_id . '/maintain.inc.php';
+
+    $errors = array();
+
+    switch ($action)
+    {
+      case 'install':
+        if (!empty($crt_db_plugin) or !isset($this->fs_plugins[$plugin_id]))
+        {
+          break;
+        }
+        if (file_exists($file_to_include))
+        {
+          include_once($file_to_include);
+          if (function_exists('plugin_install'))
+          {
+            plugin_install($plugin_id, $this->fs_plugins[$plugin_id]['version'], $errors);
+          }
+        }
+        if (empty($errors))
+        {
+          $query = '
+INSERT INTO ' . PLUGINS_TABLE . ' (id,version) VALUES (\''
+. $plugin_id . '\',\'' . $this->fs_plugins[$plugin_id]['version'] . '\'
+)';
+          pwg_query($query);
+        }
+        break;
+
+      case 'activate':
+        if (!isset($crt_db_plugin))
+        {
+          $errors = $this->perform_action('install', $plugin_id);
+          list($crt_db_plugin) = get_db_plugins(null, $plugin_id);
+          load_conf_from_db();
+        }
+        elseif ($crt_db_plugin['state'] == 'active')
+        {
+          break;
+        }
+        if (empty($errors) and file_exists($file_to_include))
+        {
+          include_once($file_to_include);
+          if (function_exists('plugin_activate'))
+          {
+            plugin_activate($plugin_id, $crt_db_plugin['version'], $errors);
+          }
+        }
+        if (empty($errors))
+        {
+          $query = '
+UPDATE ' . PLUGINS_TABLE . '
+SET state=\'active\', version=\''.$this->fs_plugins[$plugin_id]['version'].'\'
+WHERE id=\'' . $plugin_id . '\'';
+          pwg_query($query);
+        }
+        break;
+
+      case 'deactivate':
+        if (!isset($crt_db_plugin) or $crt_db_plugin['state'] != 'active')
+        {
+          break;
+        }
+        $query = '
+UPDATE ' . PLUGINS_TABLE . ' SET state=\'inactive\' WHERE id=\'' . $plugin_id . '\'';
+        pwg_query($query);
+        if (file_exists($file_to_include))
+        {
+          include_once($file_to_include);
+          if (function_exists('plugin_deactivate'))
+          {
+            plugin_deactivate($plugin_id);
+          }
+        }
+        break;
+
+      case 'uninstall':
+        if (!isset($crt_db_plugin))
+        {
+          break;
+        }
+        if ($crt_db_plugin['state'] == 'active')
+        {
+          $this->perform_action('deactivate', $plugin_id);
+        }
+        $query = '
+DELETE FROM ' . PLUGINS_TABLE . ' WHERE id=\'' . $plugin_id . '\'';
+        pwg_query($query);
+        if (file_exists($file_to_include))
+        {
+          include_once($file_to_include);
+          if (function_exists('plugin_uninstall'))
+          {
+            plugin_uninstall($plugin_id);
+          }
+        }
+        break;
+
+      case 'restore':
+        $this->perform_action('uninstall', $plugin_id);
+        unset($this->db_plugins_by_id[$plugin_id]);
+        $errors = $this->perform_action('activate', $plugin_id);
+        break;
+
+      case 'delete':
+        if (!empty($crt_db_plugin))
+        {
+          $this->perform_action('uninstall', $plugin_id);
+        }
+        if (!isset($this->fs_plugins[$plugin_id]))
+        {
+          break;
+        }
+        if (!$this->deltree(PHPWG_PLUGINS_PATH . $plugin_id))
+        {
+          $this->send_to_trash(PHPWG_PLUGINS_PATH . $plugin_id);
+        }
+        break;
+    }
+    return $errors;
+  }
+
+  /**
+  *  Get plugins defined in the plugin directory
+  */  
+  function get_fs_plugins()
+  {
+    $dir = opendir(PHPWG_PLUGINS_PATH);
+    while ($file = readdir($dir))
+    {
+      if ($file!='.' and $file!='..')
+      {
+        $path = PHPWG_PLUGINS_PATH.$file;
+        if (is_dir($path) and !is_link($path)
+            and preg_match('/^[a-zA-Z0-9-_]+$/', $file )
+            and file_exists($path.'/main.inc.php')
+            )
+        {
+          $plugin = array(
+              'name'=>$file,
+              'version'=>'0',
+              'uri'=>'',
+              'description'=>'',
+              'author'=>'',
+            );
+          $plg_data = implode( '', file($path.'/main.inc.php') );
+
+          if ( preg_match("|Plugin Name: (.*)|", $plg_data, $val) )
+          {
+            $plugin['name'] = trim( $val[1] );
+          }
+          if (preg_match("|Version: (.*)|", $plg_data, $val))
+          {
+            $plugin['version'] = trim($val[1]);
+          }
+          if ( preg_match("|Plugin URI: (.*)|", $plg_data, $val) )
+          {
+            $plugin['uri'] = trim($val[1]);
+          }
+          if ($desc = load_language('description.txt', $path.'/', array('return' => true)))
+          {
+            $plugin['description'] = trim($desc);
+          }
+          elseif ( preg_match("|Description: (.*)|", $plg_data, $val) )
+          {
+            $plugin['description'] = trim($val[1]);
+          }
+          if ( preg_match("|Author: (.*)|", $plg_data, $val) )
+          {
+            $plugin['author'] = trim($val[1]);
+          }
+          if ( preg_match("|Author URI: (.*)|", $plg_data, $val) )
+          {
+            $plugin['author uri'] = trim($val[1]);
+          }
+          if (!empty($plugin['uri']) and strpos($plugin['uri'] , 'extension_view.php?eid='))
+          {
+            list( , $extension) = explode('extension_view.php?eid=', $plugin['uri']);
+            if (is_numeric($extension)) $plugin['extension'] = $extension;
+          }
+          // IMPORTANT SECURITY !
+          $plugin = array_map('htmlspecialchars', $plugin);
+          $this->fs_plugins[$file] = $plugin;
+        }
+      }
+    }
+    closedir($dir);
+  }
+
+  /**
+   * Sort fs_plugins
+   */
+  function sort_fs_plugins($order='name')
+  {
+    switch ($order)
+    {
+      case 'name':
+        uasort($this->fs_plugins, 'name_compare');
+        break;
+      case 'status':
+        $this->sort_plugins_by_state();
+        break;
+      case 'author':
+        uasort($this->fs_plugins, array($this, 'plugin_author_compare'));
+        break;
+      case 'id':
+        uksort($this->fs_plugins, 'strcasecmp');
+        break;
+    }
+  }
+
+  // Retrieve PEM versions
+  function get_versions_to_check($version=PHPWG_VERSION)
+  {
+    $versions_to_check = array();
+    $url = PEM_URL . '/api/get_version_list.php?category=12&format=php';
+    if (fetchRemote($url, $result) and $pem_versions = @unserialize($result))
+    {
+      if (!preg_match('/^\d+\.\d+\.\d+$/', $version))
+      {
+        $version = $pem_versions[0]['name'];
+      }
+      $branch = substr($version, 0, strrpos($version, '.'));
+      foreach ($pem_versions as $pem_version)
+      {
+        if (strpos($pem_version['name'], $branch) === 0)
+        {
+          $versions_to_check[] = $pem_version['id'];
+        }
+      }
+    }
+    return $versions_to_check;
+  }
+
+  /**
+   * Retrieve PEM server datas to $server_plugins
+   */
+  function get_server_plugins($new=false)
+  {
+    global $user;
+
+    $versions_to_check = $this->get_versions_to_check();
+    if (empty($versions_to_check))
+    {
+      return false;
+    }
+
+    // Plugins to check
+    $plugins_to_check = array();
+    foreach($this->fs_plugins as $fs_plugin)
+    {
+      if (isset($fs_plugin['extension']))
+      {
+        $plugins_to_check[] = $fs_plugin['extension'];
+      }
+    }
+
+    // Retrieve PEM plugins infos
+    $url = PEM_URL . '/api/get_revision_list.php';
+    $get_data = array(
+      'category_id' => 12,
+      'format' => 'php',
+      'last_revision_only' => 'true',
+      'version' => implode(',', $versions_to_check),
+      'lang' => substr($user['language'], 0, 2),
+      'get_nb_downloads' => 'true',
+    );
+
+    if (!empty($plugins_to_check))
+    {
+      if ($new)
+      {
+        $get_data['extension_exclude'] = implode(',', $plugins_to_check);
+      }
+      else
+      {
+        $get_data['extension_include'] = implode(',', $plugins_to_check);
+      }
+    }
+    if (fetchRemote($url, $result, $get_data))
+    {
+      $pem_plugins = @unserialize($result);
+      if (!is_array($pem_plugins))
+      {
+        return false;
+      }
+      foreach ($pem_plugins as $plugin)
+      {
+        $this->server_plugins[$plugin['extension_id']] = $plugin;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  function get_incompatible_plugins($actualize=false)
+  {
+    if (isset($_SESSION['incompatible_plugins']) and !$actualize
+      and $_SESSION['incompatible_plugins']['~~expire~~'] > time())
+    {
+      return $_SESSION['incompatible_plugins'];
+    }
+
+    $_SESSION['incompatible_plugins'] = array('~~expire~~' => time() + 300);
+
+    $versions_to_check = $this->get_versions_to_check();
+    if (empty($versions_to_check))
+    {
+      return false;
+    }
+
+    // Plugins to check
+    $plugins_to_check = array();
+    foreach($this->fs_plugins as $fs_plugin)
+    {
+      if (isset($fs_plugin['extension']))
+      {
+        $plugins_to_check[] = $fs_plugin['extension'];
+      }
+    }
+
+    // Retrieve PEM plugins infos
+    $url = PEM_URL . '/api/get_revision_list.php';
+    $get_data = array(
+      'category_id' => 12,
+      'format' => 'php',
+      'version' => implode(',', $versions_to_check),
+      'extension_include' => implode(',', $plugins_to_check),
+    );
+
+    if (fetchRemote($url, $result, $get_data))
+    {
+      $pem_plugins = @unserialize($result);
+      if (!is_array($pem_plugins))
+      {
+        return false;
+      }
+
+      $server_plugins = array();
+      foreach ($pem_plugins as $plugin)
+      {
+        if (!isset($server_plugins[$plugin['extension_id']]))
+        {
+          $server_plugins[$plugin['extension_id']] = array();
+        }
+        array_push($server_plugins[$plugin['extension_id']], $plugin['revision_name']);
+      }
+
+      foreach ($this->fs_plugins as $plugin_id => $fs_plugin)
+      {
+        if (isset($fs_plugin['extension'])
+          and !in_array($plugin_id, $this->default_plugins)
+          and $fs_plugin['version'] != 'auto'
+          and (!isset($server_plugins[$fs_plugin['extension']]) or !in_array($fs_plugin['version'], $server_plugins[$fs_plugin['extension']])))
+        {
+          $_SESSION['incompatible_plugins'][$plugin_id] = $fs_plugin['version'];
+        }
+      }
+      return $_SESSION['incompatible_plugins'];
+    }
+    return false;
+  }
+  
+  /**
+   * Sort $server_plugins
+   */
+  function sort_server_plugins($order='date')
+  {
+    switch ($order)
+    {
+      case 'date':
+        krsort($this->server_plugins);
+        break;
+      case 'revision':
+        usort($this->server_plugins, array($this, 'extension_revision_compare'));
+        break;
+      case 'name':
+        uasort($this->server_plugins, array($this, 'extension_name_compare'));
+        break;
+      case 'author':
+        uasort($this->server_plugins, array($this, 'extension_author_compare'));
+        break;
+      case 'downloads':
+        usort($this->server_plugins, array($this, 'extension_downloads_compare'));
+        break;
+    }
+  }
+
+  /**
+   * Extract plugin files from archive
+   * @param string - install or upgrade
+   *  @param string - archive URL
+    * @param string - plugin id or extension id
+   */
+  function extract_plugin_files($action, $revision, $dest)
+  {
+    if ($archive = tempnam( PHPWG_PLUGINS_PATH, 'zip'))
+    {
+      $url = PEM_URL . '/download.php';
+      $get_data = array(
+        'rid' => $revision,
+        'origin' => 'piwigo_'.$action,
+      );
+
+      if ($handle = @fopen($archive, 'wb') and fetchRemote($url, $handle, $get_data))
+      {
+        fclose($handle);
+        include(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
+        $zip = new PclZip($archive);
+        if ($list = $zip->listContent())
+        {
+          foreach ($list as $file)
+          {
+            // we search main.inc.php in archive
+            if (basename($file['filename']) == 'main.inc.php'
+              and (!isset($main_filepath)
+              or strlen($file['filename']) < strlen($main_filepath)))
+            {
+              $main_filepath = $file['filename'];
+            }
+          }
+          if (isset($main_filepath))
+          {
+            $root = dirname($main_filepath); // main.inc.php path in archive
+            if ($action == 'upgrade')
+            {
+              $extract_path = PHPWG_PLUGINS_PATH . $dest;
+            }
+            else
+            {
+              $extract_path = PHPWG_PLUGINS_PATH
+                  . ($root == '.' ? 'extension_' . $dest : basename($root));
+            }
+            if($result = $zip->extract(PCLZIP_OPT_PATH, $extract_path,
+                                       PCLZIP_OPT_REMOVE_PATH, $root,
+                                       PCLZIP_OPT_REPLACE_NEWER))
+            {
+              foreach ($result as $file)
+              {
+                if ($file['stored_filename'] == $main_filepath)
+                {
+                  $status = $file['status'];
+                  break;
+                }
+              }
+              if (file_exists($extract_path.'/obsolete.list')
+                and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
+                and !empty($old_files))
+              {
+                array_push($old_files, 'obsolete.list');
+                foreach($old_files as $old_file)
+                {
+                  $path = $extract_path.'/'.$old_file;
+                  if (is_file($path))
+                  {
+                    @unlink($path);
+                  }
+                  elseif (is_dir($path))
+                  {
+                    if (!$this->deltree($path))
+                    {
+                      $this->send_to_trash($path);
+                    }
+                  }
+                }
+              }
+            }
+            else $status = 'extract_error';
+          }
+          else $status = 'archive_error';
+        }
+        else $status = 'archive_error';
+      }
+      else $status = 'dl_archive_error';
+    }
+    else $status = 'temp_path_error';
+
+    @unlink($archive);
+    return $status;
+  }
+
+  function get_merged_extensions($version=PHPWG_VERSION)
+  {
+    $file = PHPWG_ROOT_PATH.'install/obsolete_extensions.list';
+    $merged_extensions = array();
+
+    if (file_exists($file) and $obsolete_ext = file($file, FILE_IGNORE_NEW_LINES) and !empty($obsolete_ext))
+    {
+      foreach ($obsolete_ext as $ext)
+      {
+        if (preg_match('/^(\d+) ?: ?(.*?)$/', $ext, $matches))
+        {
+          $merged_extensions[$matches[1]] = $matches[2];
+        }
+      }
+    }
+    return $merged_extensions;
+  }
+  
+  /**
+   * delete $path directory
+   * @param string - path
+   */
+  function deltree($path)
+  {
+    if (is_dir($path))
+    {
+      $fh = opendir($path);
+      while ($file = readdir($fh))
+      {
+        if ($file != '.' and $file != '..')
+        {
+          $pathfile = $path . '/' . $file;
+          if (is_dir($pathfile))
+          {
+            $this->deltree($pathfile);
+          }
+          else
+          {
+            @unlink($pathfile);
+          }
+        }
+      }
+      closedir($fh);
+      return @rmdir($path);
+    }
+  }
+
+  /**
+   * send $path to trash directory
+   * @param string - path
+   */
+  function send_to_trash($path)
+  {
+    $trash_path = PHPWG_PLUGINS_PATH . 'trash';
+    if (!is_dir($trash_path))
+    {
+      @mkdir($trash_path);
+      $file = @fopen($trash_path . '/.htaccess', 'w');
+      @fwrite($file, 'deny from all');
+      @fclose($file);
+    }
+    while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
+    {
+      if (!is_dir($r))
+      {
+        @rename($path, $r);
+        break;
+      }
+    }
+  }
+
+  /**
+   * Sort functions
+   */
+  function plugin_version_compare($a, $b)
+  {
+    if (strtolower($a) == 'auto') return false;
+
+    $pattern = array('/([a-z])/ei', '/\.+/', '/\.\Z|\A\./');
+    $replacement = array( "'.'.intval('\\1', 36).'.'", '.', '');
+
+    $array = preg_replace($pattern, $replacement, array($a, $b));
+
+    return version_compare($array[0], $array[1], '>=');
+  }
+
+  function extension_revision_compare($a, $b)
+  {
+    if ($a['revision_date'] < $b['revision_date']) return 1;
+    else return -1;
+  }
+
+  function extension_name_compare($a, $b)
+  {
+    return strcmp(strtolower($a['extension_name']), strtolower($b['extension_name']));
+  }
+
+  function extension_author_compare($a, $b)
+  {
+    $r = strcasecmp($a['author_name'], $b['author_name']);
+    if ($r == 0) return $this->extension_name_compare($a, $b);
+    else return $r;
+  }
+
+  function plugin_author_compare($a, $b)
+  {
+    $r = strcasecmp($a['author'], $b['author']);
+    if ($r == 0) return name_compare($a, $b);
+    else return $r;
+  }
+
+  function extension_downloads_compare($a, $b)
+  {
+    if ($a['extension_nb_downloads'] < $b['extension_nb_downloads']) return 1;
+    else return -1;
+  }
+
+  function sort_plugins_by_state()
+  {
+    uasort($this->fs_plugins, 'name_compare');
+
+    $active_plugins = array();
+    $inactive_plugins = array();
+    $not_installed = array();
+
+    foreach($this->fs_plugins as $plugin_id => $plugin)
+    {
+      if (isset($this->db_plugins_by_id[$plugin_id]))
+      {
+        $this->db_plugins_by_id[$plugin_id]['state'] == 'active' ?
+          $active_plugins[$plugin_id] = $plugin : $inactive_plugins[$plugin_id] = $plugin;
+      }
+      else
+      {
+        $not_installed[$plugin_id] = $plugin;
+      }
+    }
+    $this->fs_plugins = $active_plugins + $inactive_plugins + $not_installed;
+  }
+}
+?>
Index: tags/2.4.0RC3/admin/include/tabsheet.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/tabsheet.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/tabsheet.class.php	(revision 14585)
@@ -0,0 +1,146 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class tabsheet
+{
+  var $sheets;
+  var $name;
+  var $titlename;
+  var $selected;
+
+  /*
+    $name is the tabsheet's name inside the template .tpl file
+    $titlename in the template is affected by $titlename value
+  */
+  function tabsheet($name = 'TABSHEET', $titlename = 'TABSHEET_TITLE')
+  {
+    $this->sheets = array();
+    $this->name = $name;
+    $this->titlename = $titlename;
+    $this->selected = "";
+  }
+
+  /*
+     add a tab
+  */
+  function add($name, $caption, $url, $selected = false)
+  {
+    if (!isset($this->sheets[$name]))
+    {
+      $this->sheets[$name] = array('caption' => $caption,
+                                   'url' => $url);
+      if($selected)
+      {
+        $this->selected=$name;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /*
+     remove a tab
+  */
+  function delete($name)
+  {
+    if (isset($this->sheets[$name]))
+    {
+      array_splice($this->sheets, $name, 1);
+
+      if ($this->selected == $name)
+      {
+        $this->selected = "";
+      }
+      return true;
+    }
+    return false;
+  }
+
+  /*
+     select a tab to be active
+  */
+  function select($name)
+  {
+    $this->selected = $name;
+  }
+
+  /*
+    set $titlename value
+  */
+  function set_titlename($titlename)
+  {
+    $this->titlename = $titlename;
+    return $this->titlename;
+  }
+
+  /*
+    returns $titlename value
+  */
+  function get_titlename()
+  {
+    return $this->titlename;
+  }
+
+  /*
+    returns properties of selected tab
+  */
+  function get_selected()
+  {
+    if (!empty($this->selected))
+    {
+      return $this->sheets[$this->selected];
+    }
+    else
+    {
+      return null;
+    }
+  }
+
+  /*
+   * Build TabSheet and assign this content to current page
+   *
+   * Fill $this->$name {default value = TABSHEET} with HTML code for tabsheet
+   * Fill $this->titlename {default value = TABSHEET_TITLE} with formated caption of the selected tab
+   */
+  function assign()
+  {
+    global $template;
+
+    $template->set_filename('tabsheet', 'tabsheet.tpl');
+    $template->assign('tabsheet', $this->sheets);
+    $template->assign('tabsheet_selected', $this->selected);
+
+    $selected_tab = $this->get_selected();
+
+    if (isset($selected_tab))
+    {
+      $template->assign(
+        array($this->titlename => '['.$selected_tab['caption'].']'));
+    }
+
+    $template->assign_var_from_handle($this->name, 'tabsheet');
+    $template->clear_assign('tabsheet');
+  }
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/themes.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/themes.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/themes.class.php	(revision 14585)
@@ -0,0 +1,812 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class themes
+{
+  var $fs_themes = array();
+  var $db_themes_by_id = array();
+  var $server_themes = array();
+
+  /**
+   * Initialize $fs_themes and $db_themes_by_id
+  */
+  function themes()
+  {
+    $this->get_fs_themes();
+
+    foreach ($this->get_db_themes() as $db_theme)
+    {
+      $this->db_themes_by_id[$db_theme['id']] = $db_theme;
+    }
+  }
+
+  /**
+   * Perform requested actions
+   * @param string - action
+   * @param string - theme id
+   * @param array - errors
+   */
+  function perform_action($action, $theme_id)
+  {
+    global $conf;
+
+    if (isset($this->db_themes_by_id[$theme_id]))
+    {
+      $crt_db_theme = $this->db_themes_by_id[$theme_id];
+    }
+
+    $file_to_include = PHPWG_THEMES_PATH.'/'.$theme_id.'/admin/maintain.inc.php';
+
+    $errors = array();
+
+    switch ($action)
+    {
+      case 'activate':
+        if (isset($crt_db_theme))
+        {
+          // the theme is already active
+          break;
+        }
+
+        if ('default' == $theme_id)
+        {
+          // you can't activate the "default" theme
+          break;
+        }
+
+        $missing_parent = $this->missing_parent_theme($theme_id);
+        if (isset($missing_parent))
+        {
+          array_push(
+            $errors, 
+            sprintf(
+              l10n('Impossible to activate this theme, the parent theme is missing: %s'),
+              $missing_parent
+              )
+            );
+          
+          break;
+        }
+
+
+        if ($this->fs_themes[$theme_id]['mobile']
+            and !empty($conf['mobile_theme'])
+            and $conf['mobile_theme'] != $theme_id)
+        {
+          array_push($errors, l10n('You can activate only one mobile theme.'));
+          break;
+        }
+
+        if (file_exists($file_to_include))
+        {
+          include($file_to_include);
+          if (function_exists('theme_activate'))
+          {
+            theme_activate($theme_id, $this->fs_themes[$theme_id]['version'], $errors);
+          }
+        }
+
+        if (empty($errors))
+        {
+          $query = '
+INSERT INTO '.THEMES_TABLE.'
+  (id, version, name)
+  VALUES(\''.$theme_id.'\',
+         \''.$this->fs_themes[$theme_id]['version'].'\',
+         \''.$this->fs_themes[$theme_id]['name'].'\')
+;';
+          pwg_query($query);
+
+          if ($this->fs_themes[$theme_id]['mobile'])
+          {
+            conf_update_param('mobile_theme', $theme_id);
+          }
+        }
+        break;
+
+      case 'deactivate':
+        if (!isset($crt_db_theme))
+        {
+          // the theme is already inactive
+          break;
+        }
+
+        // you can't deactivate the last theme
+        if (count($this->db_themes_by_id) <= 1)
+        {
+          array_push(
+            $errors,
+            l10n('Impossible to deactivate this theme, you need at least one theme.')
+            );
+          break;
+        }
+
+        if ($theme_id == get_default_theme())
+        {
+          // find a random theme to replace
+          $new_theme = null;
+
+          $query = '
+SELECT
+    id
+  FROM '.THEMES_TABLE.'
+  WHERE id != \''.$theme_id.'\'
+;';
+          $result = pwg_query($query);
+          if (pwg_db_num_rows($result) == 0)
+          {
+            $new_theme = 'default';
+          }
+          else
+          {
+            list($new_theme) = pwg_db_fetch_row($result);
+          }
+
+          $this->set_default_theme($new_theme);
+        }
+
+        if (file_exists($file_to_include))
+        {
+          include($file_to_include);
+          if (function_exists('theme_deactivate'))
+          {
+            theme_deactivate($theme_id);
+          }
+        }
+
+        $query = '
+DELETE
+  FROM '.THEMES_TABLE.'
+  WHERE id= \''.$theme_id.'\'
+;';
+        pwg_query($query);
+
+        if ($this->fs_themes[$theme_id]['mobile'])
+        {
+          conf_update_param('mobile_theme', '');
+        }
+        break;
+
+      case 'delete':
+        if (!empty($crt_db_theme))
+        {
+          array_push($errors, 'CANNOT DELETE - THEME IS INSTALLED');
+          break;
+        }
+        if (!isset($this->fs_themes[$theme_id]))
+        {
+          // nothing to do here
+          break;
+        }
+
+        $children = $this->get_children_themes($theme_id);
+        if (count($children) > 0)
+        {
+          array_push(
+            $errors,
+            sprintf(
+              l10n('Impossible to delete this theme. Other themes depends on it: %s'),
+              implode(', ', $children)
+              )
+            );
+          break;
+        }
+        
+        if (!$this->deltree(PHPWG_THEMES_PATH.$theme_id))
+        {
+          $this->send_to_trash(PHPWG_THEMES_PATH.$theme_id);
+        }
+        break;
+
+      case 'set_default':
+        // first we need to know which users are using the current default theme
+        $this->set_default_theme($theme_id);        
+        break;
+    }
+    return $errors;
+  }
+
+  function missing_parent_theme($theme_id)
+  {
+    if (!isset($this->fs_themes[$theme_id]['parent']))
+    {
+      return null;
+    }
+    
+    $parent = $this->fs_themes[$theme_id]['parent'];
+      
+    if ('default' == $parent)
+    {
+      return null;
+    }
+      
+    if (!isset($this->fs_themes[$parent]))
+    {
+      return $parent;
+    }
+
+    return $this->missing_parent_theme($parent);
+  }
+
+  function get_children_themes($theme_id)
+  {
+    $children = array();
+    
+    foreach ($this->fs_themes as $test_child)
+    {
+      if (isset($test_child['parent']) and $test_child['parent'] == $theme_id)
+      {
+        array_push($children, $test_child['name']);
+      }
+    }
+
+    return $children;
+  } 
+
+  function set_default_theme($theme_id)
+  {
+    global $conf;
+    
+    // first we need to know which users are using the current default theme
+    $default_theme = get_default_theme();
+    
+    $query = '
+SELECT
+    user_id
+  FROM '.USER_INFOS_TABLE.'
+  WHERE theme = \''.$default_theme.'\'
+;';
+    $user_ids = array_unique(
+      array_merge(
+        array_from_query($query, 'user_id'),
+        array($conf['guest_id'], $conf['default_user_id'])
+        )
+      );
+
+    // $user_ids can't be empty, at least the default user has the default
+    // theme
+
+    $query = '
+UPDATE '.USER_INFOS_TABLE.'
+  SET theme = \''.$theme_id.'\'
+  WHERE user_id IN ('.implode(',', $user_ids).')
+;';
+    pwg_query($query);
+  }
+
+  function get_db_themes($id='')
+  {
+    $query = '
+SELECT
+    *
+  FROM '.THEMES_TABLE;
+    
+    $clauses = array();
+    if (!empty($id))
+    {
+      $clauses[] = 'id = \''.$id.'\'';
+    }
+    if (count($clauses) > 0)
+    {
+      $query .= '
+  WHERE '. implode(' AND ', $clauses);
+    }
+
+    $result = pwg_query($query);
+    $themes = array();
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      array_push($themes, $row);
+    }
+    return $themes;
+  }
+
+  
+  /**
+  *  Get themes defined in the theme directory
+  */  
+  function get_fs_themes()
+  {
+    $dir = opendir(PHPWG_THEMES_PATH);
+    
+    while ($file = readdir($dir))
+    {
+      if ($file!='.' and $file!='..')
+      {
+        $path = PHPWG_THEMES_PATH.$file;
+        if (is_dir($path)
+            and preg_match('/^[a-zA-Z0-9-_]+$/', $file)
+            and file_exists($path.'/themeconf.inc.php')
+            )
+        {
+          $theme = array(
+            'id' => $file,
+            'name' => $file,
+            'version' => '0',
+            'uri' => '',
+            'description' => '',
+            'author' => '',
+            'mobile' => false,
+            );
+          $theme_data = implode( '', file($path.'/themeconf.inc.php') );
+
+          if ( preg_match("|Theme Name: (.*)|", $theme_data, $val) )
+          {
+            $theme['name'] = trim( $val[1] );
+          }
+          if (preg_match("|Version: (.*)|", $theme_data, $val))
+          {
+            $theme['version'] = trim($val[1]);
+          }
+          if ( preg_match("|Theme URI: (.*)|", $theme_data, $val) )
+          {
+            $theme['uri'] = trim($val[1]);
+          }
+          if ($desc = load_language('description.txt', $path.'/', array('return' => true)))
+          {
+            $theme['description'] = trim($desc);
+          }
+          elseif ( preg_match("|Description: (.*)|", $theme_data, $val) )
+          {
+            $theme['description'] = trim($val[1]);
+          }
+          if ( preg_match("|Author: (.*)|", $theme_data, $val) )
+          {
+            $theme['author'] = trim($val[1]);
+          }
+          if ( preg_match("|Author URI: (.*)|", $theme_data, $val) )
+          {
+            $theme['author uri'] = trim($val[1]);
+          }
+          if (!empty($theme['uri']) and strpos($theme['uri'] , 'extension_view.php?eid='))
+          {
+            list( , $extension) = explode('extension_view.php?eid=', $theme['uri']);
+            if (is_numeric($extension)) $theme['extension'] = $extension;
+          }
+          if (preg_match('/["\']parent["\'][^"\']+["\']([^"\']+)["\']/', $theme_data, $val))
+          {
+            $theme['parent'] = $val[1];
+          }
+          if (preg_match('/["\']activable["\'].*?(true|false)/i', $theme_data, $val))
+          {
+            $theme['activable'] = get_boolean($val[1]);
+          }
+          if (preg_match('/["\']mobile["\'].*?(true|false)/i', $theme_data, $val))
+          {
+            $theme['mobile'] = get_boolean($val[1]);
+          }
+
+          // screenshot
+          $screenshot_path = $path.'/screenshot.png';
+          if (file_exists($screenshot_path))
+          {
+            $theme['screenshot'] = $screenshot_path;
+          }
+          else
+          {
+            global $conf;
+            $theme['screenshot'] =
+              PHPWG_ROOT_PATH.'admin/themes/'
+              .$conf['admin_theme']
+              .'/images/missing_screenshot.png'
+              ;
+          }
+
+          $admin_file = $path.'/admin/admin.inc.php';
+          if (file_exists($admin_file))
+          {
+            $theme['admin_uri'] = get_root_url().'admin.php?page=theme&theme='.$file;
+          }
+
+          // IMPORTANT SECURITY !
+          $theme = array_map('htmlspecialchars', $theme);
+          $this->fs_themes[$file] = $theme;
+        }
+      }
+    }
+    closedir($dir);
+  }
+
+  /**
+   * Sort fs_themes
+   */
+  function sort_fs_themes($order='name')
+  {
+    switch ($order)
+    {
+      case 'name':
+        uasort($this->fs_themes, 'name_compare');
+        break;
+      case 'status':
+        $this->sort_themes_by_state();
+        break;
+      case 'author':
+        uasort($this->fs_themes, array($this, 'theme_author_compare'));
+        break;
+      case 'id':
+        uksort($this->fs_themes, 'strcasecmp');
+        break;
+    }
+  }
+
+  /**
+   * Retrieve PEM server datas to $server_themes
+   */
+  function get_server_themes($new=false)
+  {
+    global $user;
+
+    $get_data = array(
+      'category_id' => 10,
+      'format' => 'php',
+    );
+
+    // Retrieve PEM versions
+    $version = PHPWG_VERSION;
+    $versions_to_check = array();
+    $url = PEM_URL . '/api/get_version_list.php';
+    if (fetchRemote($url, $result, $get_data) and $pem_versions = @unserialize($result))
+    {
+      if (!preg_match('/^\d+\.\d+\.\d+$/', $version))
+      {
+        $version = $pem_versions[0]['name'];
+      }
+      $branch = substr($version, 0, strrpos($version, '.'));
+      foreach ($pem_versions as $pem_version)
+      {
+        if (strpos($pem_version['name'], $branch) === 0)
+        {
+          $versions_to_check[] = $pem_version['id'];
+        }
+      }
+    }
+    if (empty($versions_to_check))
+    {
+      return false;
+    }
+
+    // Themes to check
+    $themes_to_check = array();
+    foreach($this->fs_themes as $fs_theme)
+    {
+      if (isset($fs_theme['extension']))
+      {
+        $themes_to_check[] = $fs_theme['extension'];
+      }
+    }
+
+    // Retrieve PEM themes infos
+    $url = PEM_URL . '/api/get_revision_list.php';
+    $get_data = array_merge($get_data, array(
+      'last_revision_only' => 'true',
+      'version' => implode(',', $versions_to_check),
+      'lang' => substr($user['language'], 0, 2),
+      'get_nb_downloads' => 'true',
+      )
+    );
+
+    if (!empty($themes_to_check))
+    {
+      if ($new)
+      {
+        $get_data['extension_exclude'] = implode(',', $themes_to_check);
+      }
+      else
+      {
+        $get_data['extension_include'] = implode(',', $themes_to_check);
+      }
+    }
+    if (fetchRemote($url, $result, $get_data))
+    {
+      $pem_themes = @unserialize($result);
+      if (!is_array($pem_themes))
+      {
+        return false;
+      }
+      foreach ($pem_themes as $theme)
+      {
+        $this->server_themes[$theme['extension_id']] = $theme;
+      }
+      return true;
+    }
+    return false;
+  }
+  
+  /**
+   * Sort $server_themes
+   */
+  function sort_server_themes($order='date')
+  {
+    switch ($order)
+    {
+      case 'date':
+        krsort($this->server_themes);
+        break;
+      case 'revision':
+        usort($this->server_themes, array($this, 'extension_revision_compare'));
+        break;
+      case 'name':
+        uasort($this->server_themes, array($this, 'extension_name_compare'));
+        break;
+      case 'author':
+        uasort($this->server_themes, array($this, 'extension_author_compare'));
+        break;
+      case 'downloads':
+        usort($this->server_themes, array($this, 'extension_downloads_compare'));
+        break;
+    }
+  }
+
+  /**
+   * Extract theme files from archive
+   *
+   * @param string - install or upgrade
+   * @param string - remote revision identifier (numeric)
+   * @param string - theme id or extension id
+   */
+  function extract_theme_files($action, $revision, $dest)
+  {
+    if ($archive = tempnam( PHPWG_THEMES_PATH, 'zip'))
+    {
+      $url = PEM_URL . '/download.php';
+      $get_data = array(
+        'rid' => $revision,
+        'origin' => 'piwigo_'.$action,
+      );
+
+      if ($handle = @fopen($archive, 'wb') and fetchRemote($url, $handle, $get_data))
+      {
+        fclose($handle);
+        include(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
+        $zip = new PclZip($archive);
+        if ($list = $zip->listContent())
+        {
+          foreach ($list as $file)
+          {
+            // we search main.inc.php in archive
+            if (basename($file['filename']) == 'themeconf.inc.php'
+              and (!isset($main_filepath)
+              or strlen($file['filename']) < strlen($main_filepath)))
+            {
+              $main_filepath = $file['filename'];
+            }
+          }
+          if (isset($main_filepath))
+          {
+            $root = dirname($main_filepath); // main.inc.php path in archive
+            if ($action == 'upgrade')
+            {
+              $extract_path = PHPWG_THEMES_PATH . $dest;
+            }
+            else
+            {
+              $extract_path = PHPWG_THEMES_PATH . ($root == '.' ? 'extension_' . $dest : basename($root));
+            }
+            if (
+              $result = $zip->extract(
+                PCLZIP_OPT_PATH, $extract_path,
+                PCLZIP_OPT_REMOVE_PATH, $root,
+                PCLZIP_OPT_REPLACE_NEWER
+                )
+              )
+            {
+              foreach ($result as $file)
+              {
+                if ($file['stored_filename'] == $main_filepath)
+                {
+                  $status = $file['status'];
+                  break;
+                }
+              }
+              if (file_exists($extract_path.'/obsolete.list')
+                and $old_files = file($extract_path.'/obsolete.list', FILE_IGNORE_NEW_LINES)
+                and !empty($old_files))
+              {
+                array_push($old_files, 'obsolete.list');
+                foreach($old_files as $old_file)
+                {
+                  $path = $extract_path.'/'.$old_file;
+                  if (is_file($path))
+                  {
+                    @unlink($path);
+                  }
+                  elseif (is_dir($path))
+                  {
+                    if (!$this->deltree($path))
+                    {
+                      $this->send_to_trash($path);
+                    }
+                  }
+                }
+              }
+            }
+            else $status = 'extract_error';
+          }
+          else $status = 'archive_error';
+        }
+        else $status = 'archive_error';
+      }
+      else $status = 'dl_archive_error';
+    }
+    else $status = 'temp_path_error';
+
+    @unlink($archive);
+    return $status;
+  }
+  
+  /**
+   * delete $path directory
+   * @param string - path
+   */
+  function deltree($path)
+  {
+    if (is_dir($path))
+    {
+      $fh = opendir($path);
+      while ($file = readdir($fh))
+      {
+        if ($file != '.' and $file != '..')
+        {
+          $pathfile = $path . '/' . $file;
+          if (is_dir($pathfile))
+          {
+            $this->deltree($pathfile);
+          }
+          else
+          {
+            @unlink($pathfile);
+          }
+        }
+      }
+      closedir($fh);
+      return @rmdir($path);
+    }
+  }
+
+  /**
+   * send $path to trash directory
+   * @param string - path
+   */
+  function send_to_trash($path)
+  {
+    $trash_path = PHPWG_THEMES_PATH . 'trash';
+    if (!is_dir($trash_path))
+    {
+      @mkdir($trash_path);
+      $file = @fopen($trash_path . '/.htaccess', 'w');
+      @fwrite($file, 'deny from all');
+      @fclose($file);
+    }
+    while ($r = $trash_path . '/' . md5(uniqid(rand(), true)))
+    {
+      if (!is_dir($r))
+      {
+        @rename($path, $r);
+        break;
+      }
+    }
+  }
+
+  /**
+   * Sort functions
+   */
+  function theme_version_compare($a, $b)
+  {
+    $pattern = array('/([a-z])/ei', '/\.+/', '/\.\Z|\A\./');
+    $replacement = array( "'.'.intval('\\1', 36).'.'", '.', '');
+
+    $array = preg_replace($pattern, $replacement, array($a, $b));
+
+    return version_compare($array[0], $array[1], '>=');
+  }
+
+  function extension_revision_compare($a, $b)
+  {
+    if ($a['revision_date'] < $b['revision_date']) return 1;
+    else return -1;
+  }
+
+  function extension_name_compare($a, $b)
+  {
+    return strcmp(strtolower($a['extension_name']), strtolower($b['extension_name']));
+  }
+
+  function extension_author_compare($a, $b)
+  {
+    $r = strcasecmp($a['author_name'], $b['author_name']);
+    if ($r == 0) return $this->extension_name_compare($a, $b);
+    else return $r;
+  }
+
+  function theme_author_compare($a, $b)
+  {
+    $r = strcasecmp($a['author'], $b['author']);
+    if ($r == 0) return name_compare($a, $b);
+    else return $r;
+  }
+
+  function extension_downloads_compare($a, $b)
+  {
+    if ($a['extension_nb_downloads'] < $b['extension_nb_downloads']) return 1;
+    else return -1;
+  }
+
+  function sort_themes_by_state()
+  {
+    uasort($this->fs_themes, 'name_compare');
+
+    $active_themes = array();
+    $inactive_themes = array();
+    $not_installed = array();
+
+    foreach($this->fs_themes as $theme_id => $theme)
+    {
+      if (isset($this->db_themes_by_id[$theme_id]))
+      {
+        $this->db_themes_by_id[$theme_id]['state'] == 'active' ?
+          $active_themes[$theme_id] = $theme : $inactive_themes[$theme_id] = $theme;
+      }
+      else
+      {
+        $not_installed[$theme_id] = $theme;
+      }
+    }
+    $this->fs_themes = $active_themes + $inactive_themes + $not_installed;
+  }
+
+  // themes specific methods
+  function get_fs_themes_with_ini()
+  {
+    $themes_dir = PHPWG_ROOT_PATH.'themes';
+
+    $fs_themes = array();
+
+    foreach (get_dirs($themes_dir) as $theme)
+    {
+      $conf_file = $themes_dir.'/'.$theme.'/themeconf.inc.php';
+      if (file_exists($conf_file))
+      {
+        $theme_data = array(
+          'name' => $theme,
+          );
+        
+        $ini_file = $themes_dir.'/'.$theme.'/theme.ini';
+        if (file_exists($ini_file))
+        {
+          $theme_ini = parse_ini_file($ini_file);
+          if (isset($theme_ini['extension_id']))
+          {
+            $theme_data['extension_id'] = $theme_ini['extension_id'];
+          }
+        }
+
+        array_push($fs_themes, $theme_data);
+      }
+    }
+
+    echo '<pre>'; print_r($fs_themes); echo '</pre>';
+  }
+
+  
+}
+?>
Index: tags/2.4.0RC3/admin/include/updates.class.php
===================================================================
--- tags/2.4.0RC3/admin/include/updates.class.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/updates.class.php	(revision 14585)
@@ -0,0 +1,492 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+class updates
+{
+  var $types = array();
+  var $plugins;
+  var $themes;
+  var $languages;
+  var $missing = array();
+  var $default_plugins = array();
+  var $default_themes = array();
+  var $default_languages = array();
+  var $merged_extensions = array();
+  var $merged_extension_url = 'http://piwigo.org/download/merged_extensions.txt';
+
+  function __construct($page='updates')
+  {
+    $this->types = array('plugins', 'themes', 'languages');
+
+    if (in_array($page, $this->types))
+    {
+      $this->types = array($page);
+    }
+    $this->default_themes = array('clear', 'dark', 'Sylvia', 'elegant');
+    $this->default_plugins = array('admin_multi_view', 'c13y_upgrade', 'language_switch', 'LocalFilesEditor');
+
+    foreach ($this->types as $type)
+    {
+      include_once(PHPWG_ROOT_PATH.'admin/include/'.$type.'.class.php');
+      $this->$type = new $type();
+    }
+  }
+
+  function check_piwigo_upgrade()
+  {
+    $_SESSION['need_update'] = null;
+
+    if (preg_match('/(\d+\.\d+)\.(\d+)/', PHPWG_VERSION, $matches)
+      and @fetchRemote(PHPWG_URL.'/download/all_versions.php?rand='.md5(uniqid(rand(), true)), $result))
+    {
+      $all_versions = @explode("\n", $result);
+      $new_version = trim($all_versions[0]);
+      $_SESSION['need_update'] = version_compare(PHPWG_VERSION, $new_version, '<');
+    }
+  }
+
+  function get_server_extensions($version=PHPWG_VERSION)
+  {
+    global $user;
+
+    $get_data = array(
+      'format' => 'php',
+    );
+
+    // Retrieve PEM versions
+    $versions_to_check = array();
+    $url = PEM_URL . '/api/get_version_list.php';
+    if (fetchRemote($url, $result, $get_data) and $pem_versions = @unserialize($result))
+    {
+      if (!preg_match('/^\d+\.\d+\.\d+$/', $version))
+      {
+        $version = $pem_versions[0]['name'];
+      }
+      $branch = substr($version, 0, strrpos($version, '.'));
+      foreach ($pem_versions as $pem_version)
+      {
+        if (strpos($pem_version['name'], $branch) === 0)
+        {
+          $versions_to_check[] = $pem_version['id'];
+        }
+      }
+    }
+    if (empty($versions_to_check))
+    {
+      return false;
+    }
+
+    // Extensions to check
+    $ext_to_check = array();
+    foreach ($this->types as $type)
+    {
+      $fs = 'fs_'.$type;
+      foreach ($this->$type->$fs as $ext)
+      {
+        if (isset($ext['extension']))
+        {
+          $ext_to_check[$ext['extension']] = $type;
+        }
+      }
+    }
+
+    // Retrieve PEM plugins infos
+    $url = PEM_URL . '/api/get_revision_list.php';
+    $get_data = array_merge($get_data, array(
+      'last_revision_only' => 'true',
+      'version' => implode(',', $versions_to_check),
+      'lang' => substr($user['language'], 0, 2),
+      'get_nb_downloads' => 'true',
+      )
+    );
+
+    $post_data = array();
+    if (!empty($ext_to_check))
+    {
+      $post_data['extension_include'] = implode(',', array_keys($ext_to_check));
+    }
+
+    if (fetchRemote($url, $result, $get_data, $post_data))
+    {
+      $pem_exts = @unserialize($result);
+      if (!is_array($pem_exts))
+      {
+        return false;
+      }
+      foreach ($pem_exts as $ext)
+      {
+        if (isset($ext_to_check[$ext['extension_id']]))
+        {
+          $server = 'server_'.$ext_to_check[$ext['extension_id']];
+          $this->$ext_to_check[$ext['extension_id']]->$server += array($ext['extension_id'] => $ext);
+          unset($ext_to_check[$ext['extension_id']]);
+        }
+      }
+      $this->check_missing_extensions($ext_to_check);
+      return true;
+    }
+    return false;
+  }
+
+  // Check all extensions upgrades
+  function check_extensions()
+  {
+    global $conf;
+
+    if (!$this->get_server_extensions())
+    {
+      return false;
+    }
+
+    $_SESSION['extensions_need_update'] = array();
+
+    foreach ($this->types as $type)
+    {
+      $fs = 'fs_'.$type;
+      $server = 'server_'.$type;
+      $server_ext = $this->$type->$server;
+      $fs_ext = $this->$type->$fs;
+
+      $ignore_list = array();
+      $need_upgrade = array();
+
+      foreach($fs_ext as $ext_id => $fs_ext)
+      {
+        if (isset($fs_ext['extension']) and isset($server_ext[$fs_ext['extension']]))
+        {
+          $ext_info = $server_ext[$fs_ext['extension']];
+
+          if (!$this->version_compare($fs_ext['version'], $ext_info['revision_name'], $type))
+          {
+            if (in_array($ext_id, $conf['updates_ignored'][$type]))
+            {
+              array_push($ignore_list, $ext_id);
+            }
+            else
+            {
+              $_SESSION['extensions_need_update'][$type][$ext_id] = $ext_info['revision_name'];
+            }
+          }
+        }
+      }
+      $conf['updates_ignored'][$type] = $ignore_list;
+    }
+    conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
+  }
+
+  // Check if extension have been upgraded since last check
+  function check_updated_extensions()
+  {
+    foreach ($this->types as $type)
+    {
+      if (!empty($_SESSION['extensions_need_update'][$type]))
+      {
+        $fs = 'fs_'.$type;
+        foreach($this->$type->$fs as $ext_id => $fs_ext)
+        {
+          if (isset($_SESSION['extensions_need_update'][$type][$ext_id])
+            and $this->version_compare($fs_ext['version'], $_SESSION['extensions_need_update'][$type][$ext_id], $type))
+          {
+            // Extension have been upgraded
+            $this->check_extensions();
+            break;
+          }
+        }
+      }
+    }
+  }
+
+  function check_missing_extensions($missing)
+  {
+    foreach ($missing as $id => $type)
+    {
+      $fs = 'fs_'.$type;
+      $default = 'default_'.$type;
+      foreach ($this->$type->$fs as $ext_id => $ext)
+      {
+        if (isset($ext['extension']) and $id == $ext['extension']
+          and !in_array($ext_id, $this->$default)
+          and !in_array($ext['extension'], $this->merged_extensions))
+        {
+          $this->missing[$type][] = $ext;
+          break;
+        }
+      }
+    }
+  }
+
+  function get_merged_extensions($version)
+  {
+    if (fetchRemote($this->merged_extension_url, $result))
+    {
+      $rows = explode("\n", $result);
+      foreach ($rows as $row)
+      {
+        if (preg_match('/^(\d+\.\d+): *(.*)$/', $row, $match))
+        {
+          if (version_compare($version, $match[1], '>='))
+          {
+            $extensions = explode(',', trim($match[2]));
+            $this->merged_extensions = array_merge($this->merged_extensions, $extensions);
+          }
+        }
+      }
+    }
+  }
+
+  function version_compare($a, $b, $type)
+  {
+    $version_compare = rtrim($type, 's').'_version_compare';
+
+    return $this->$type->$version_compare($a, $b);
+  }
+
+  function deltree($path, $move_to_trash=false)
+  {
+    if (is_dir($path))
+    {
+      $fh = opendir($path);
+      while ($file = readdir($fh))
+      {
+        if ($file != '.' and $file != '..')
+        {
+          $pathfile = $path . '/' . $file;
+          if (is_dir($pathfile))
+          {
+            self::deltree($pathfile, $move_to_trash);
+          }
+          else
+          {
+            @unlink($pathfile);
+          }
+        }
+      }
+      closedir($fh);
+      if (@rmdir($path))
+      {
+        return true;
+      }
+      elseif ($move_to_trash)
+      {
+        $trash = PHPWG_ROOT_PATH.'_trash';
+        if (!is_dir($trash))
+        {
+          @mkgetdir($trash);
+        }
+        return @rename($path, $trash . '/'.md5(uniqid(rand(), true)));
+      }
+      else
+      {
+        return false;
+      }
+    }
+  }
+
+  function process_obsolete_list($file)
+  {
+    if (file_exists(PHPWG_ROOT_PATH.$file)
+      and $old_files = file(PHPWG_ROOT_PATH.$file, FILE_IGNORE_NEW_LINES)
+      and !empty($old_files))
+    {
+      array_push($old_files, $file);
+      foreach($old_files as $old_file)
+      {
+        $path = PHPWG_ROOT_PATH.$old_file;
+        if (is_file($path))
+        {
+          @unlink($path);
+        }
+        elseif (is_dir($path))
+        {
+          self::deltree($path, true);
+        }
+      }
+    }
+  }
+
+  function dump_database($include_history=false)
+  {
+    global $page, $conf, $cfgBase;
+
+    if (version_compare(PHPWG_VERSION, '2.1', '<'))
+    {
+      $conf['db_base'] = $cfgBase;
+    }
+
+    include(PHPWG_ROOT_PATH.'admin/include/mysqldump.php');
+
+    $path = PHPWG_ROOT_PATH.$conf['data_location'].'update';
+
+    if (@mkgetdir($path)
+      and ($backupFile = tempnam($path, 'sql'))
+      and ($dumper = new MySQLDump($conf['db_base'],$backupFile,false,false)))
+    {
+      foreach (get_defined_constants() as $constant => $value)
+      {
+        if (preg_match('/_TABLE$/', $constant))
+        {
+          $dumper->getTableStructure($value);
+          if ($constant == 'HISTORY_TABLE' and !$include_history)
+          {
+            continue;
+          }
+          $dumper->getTableData($value);
+        }
+      }
+    }
+
+    if (@filesize($backupFile))
+    {
+      $http_headers = array(
+        'Content-Length: '.@filesize($backupFile),
+        'Content-Type: text/x-sql',
+        'Content-Disposition: attachment; filename="database.sql";',
+        'Content-Transfer-Encoding: binary',
+        );
+
+      foreach ($http_headers as $header) {
+        header($header);
+      }
+
+      @readfile($backupFile);
+      self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+      exit();
+    }
+    else
+    {
+      array_push($page['errors'], l10n('Unable to dump database.'));
+    }
+  }
+
+  function upgrade_to($upgrade_to, &$step)
+  {
+    global $page, $conf, $template;
+
+    if (!version_compare($_POST['upgrade_to'], PHPWG_VERSION, '>'))
+    {
+      redirect(get_root_url().'admin.php?page=plugin-'.basename(dirname(__FILE__)));
+    }
+
+    if ($step == 2)
+    {
+      preg_match('/(\d+\.\d+)\.(\d+)/', PHPWG_VERSION, $matches);
+      $code =  $matches[1].'.x_to_'.$_POST['upgrade_to'];
+      $dl_code = str_replace(array('.', '_'), '', $code);
+      $remove_path = $code;
+      $obsolete_list = 'obsolete.list';
+    }
+    else
+    {
+      $code = $_POST['upgrade_to'];
+      $dl_code = $code;
+      $remove_path = version_compare($code, '2.0.8', '>=') ? 'piwigo' : 'piwigo-'.$code;
+      $obsolete_list = PHPWG_ROOT_PATH.'install/obsolete.list';
+    }
+
+    if (empty($page['errors']))
+    {
+      $path = PHPWG_ROOT_PATH.$conf['data_location'].'update';
+      $filename = $path.'/'.$code.'.zip';
+      @mkgetdir($path);
+
+      $chunk_num = 0;
+      $end = false;
+      $zip = @fopen($filename, 'w');
+
+      while (!$end)
+      {
+        $chunk_num++;
+        if (@fetchRemote(PHPWG_URL.'/download/dlcounter.php?code='.$dl_code.'&chunk_num='.$chunk_num, $result)
+          and $input = @unserialize($result))
+        {
+          if (0 == $input['remaining'])
+          {
+            $end = true;
+          }
+          @fwrite($zip, base64_decode($input['data']));
+        }
+        else
+        {
+          $end = true;
+        }
+      }
+      @fclose($zip);
+
+      if (@filesize($filename))
+      {
+        $zip = new PclZip($filename);
+        if ($result = $zip->extract(PCLZIP_OPT_PATH, PHPWG_ROOT_PATH,
+                                    PCLZIP_OPT_REMOVE_PATH, $remove_path,
+                                    PCLZIP_OPT_SET_CHMOD, 0755,
+                                    PCLZIP_OPT_REPLACE_NEWER))
+        {
+          //Check if all files were extracted
+          $error = '';
+          foreach($result as $extract)
+          {
+            if (!in_array($extract['status'], array('ok', 'filtered', 'already_a_directory')))
+            {
+              // Try to change chmod and extract
+              if (@chmod(PHPWG_ROOT_PATH.$extract['filename'], 0777)
+                and ($res = $zip->extract(PCLZIP_OPT_BY_NAME, $remove_path.'/'.$extract['filename'],
+                                          PCLZIP_OPT_PATH, PHPWG_ROOT_PATH,
+                                          PCLZIP_OPT_REMOVE_PATH, $remove_path,
+                                          PCLZIP_OPT_SET_CHMOD, 0755,
+                                          PCLZIP_OPT_REPLACE_NEWER))
+                and isset($res[0]['status'])
+                and $res[0]['status'] == 'ok')
+              {
+                continue;
+              }
+              else
+              {
+                $error .= $extract['filename'].': '.$extract['status']."\n";
+              }
+            }
+          }
+
+          if (empty($error))
+          {
+            self::process_obsolete_list($obsolete_list);
+            self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+            invalidate_user_cache(true);
+            $template->delete_compiled_templates();
+            unset($_SESSION['need_update']);
+            if ($step == 2)
+            {
+              array_push($page['infos'], l10n('Update Complete'), $upgrade_to);
+              $step = -1;
+            }
+            else
+            {
+              redirect(PHPWG_ROOT_PATH.'upgrade.php?now=');
+            }
+          }
+          else
+          {
+            file_put_contents(PHPWG_ROOT_PATH.$conf['data_location'].'update/log_error.txt', $error);
+            array_push(
+              $page['errors'],
+              sprintf(
+                l10n('An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'),
+                get_root_url().$conf['data_location'].'update/log_error.txt'
+              )
+            );
+          }
+        }
+        else
+        {
+          self::deltree(PHPWG_ROOT_PATH.$conf['data_location'].'update');
+          array_push($page['errors'], l10n('An error has occured during upgrade.'));
+        }
+      }
+      else
+      {
+        array_push($page['errors'], l10n('Piwigo cannot retrieve upgrade file from server'));
+      }
+    }
+  }
+}
+
+?>
Index: tags/2.4.0RC3/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js
===================================================================
--- tags/2.4.0RC3/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js	(revision 14585)
+++ tags/2.4.0RC3/admin/include/uploadify/jquery.uploadify.v3.0.0.min.js	(revision 14585)
@@ -0,0 +1,38 @@
+/*
+SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com
+
+mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/,  http://www.vinterwebb.se/
+
+SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License:
+http://www.opensource.org/licenses/mit-license.php
+
+SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License:
+http://www.opensource.org/licenses/mit-license.php
+*/
+
+var SWFUpload;if(SWFUpload==undefined){SWFUpload=function(a){this.initSWFUpload(a)}}SWFUpload.prototype.initSWFUpload=function(b){try{this.customSettings={};this.settings=b;this.eventQueue=[];this.movieName="SWFUpload_"+SWFUpload.movieCount++;this.movieElement=null;SWFUpload.instances[this.movieName]=this;this.initSettings();this.loadFlash();this.displayDebugInfo()}catch(a){delete SWFUpload.instances[this.movieName];throw a}};SWFUpload.instances={};SWFUpload.movieCount=0;SWFUpload.version="2.2.0 2009-03-25";SWFUpload.QUEUE_ERROR={QUEUE_LIMIT_EXCEEDED:-100,FILE_EXCEEDS_SIZE_LIMIT:-110,ZERO_BYTE_FILE:-120,INVALID_FILETYPE:-130};SWFUpload.UPLOAD_ERROR={HTTP_ERROR:-200,MISSING_UPLOAD_URL:-210,IO_ERROR:-220,SECURITY_ERROR:-230,UPLOAD_LIMIT_EXCEEDED:-240,UPLOAD_FAILED:-250,SPECIFIED_FILE_ID_NOT_FOUND:-260,FILE_VALIDATION_FAILED:-270,FILE_CANCELLED:-280,UPLOAD_STOPPED:-290};SWFUpload.FILE_STATUS={QUEUED:-1,IN_PROGRESS:-2,ERROR:-3,COMPLETE:-4,CANCELLED:-5};SWFUpload.BUTTON_ACTION={SELECT_FILE:-100,SELECT_FILES:-110,START_UPLOAD:-120};SWFUpload.CURSOR={ARROW:-1,HAND:-2};SWFUpload.WINDOW_MODE={WINDOW:"window",TRANSPARENT:"transparent",OPAQUE:"opaque"};SWFUpload.completeURL=function(a){if(typeof(a)!=="string"||a.match(/^https?:\/\//i)||a.match(/^\//)){return a}var c=window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:"");var b=window.location.pathname.lastIndexOf("/");if(b<=0){path="/"}else{path=window.location.pathname.substr(0,b)+"/"}return path+a};SWFUpload.prototype.initSettings=function(){this.ensureDefault=function(b,a){this.settings[b]=(this.settings[b]==undefined)?a:this.settings[b]};this.ensureDefault("upload_url","");this.ensureDefault("preserve_relative_urls",false);this.ensureDefault("file_post_name","Filedata");this.ensureDefault("post_params",{});this.ensureDefault("use_query_string",false);this.ensureDefault("requeue_on_error",false);this.ensureDefault("http_success",[]);this.ensureDefault("assume_success_timeout",0);this.ensureDefault("file_types","*.*");this.ensureDefault("file_types_description","All Files");this.ensureDefault("file_size_limit",0);this.ensureDefault("file_upload_limit",0);this.ensureDefault("file_queue_limit",0);this.ensureDefault("flash_url","swfupload.swf");this.ensureDefault("prevent_swf_caching",true);this.ensureDefault("button_image_url","");this.ensureDefault("button_width",1);this.ensureDefault("button_height",1);this.ensureDefault("button_text","");this.ensureDefault("button_text_style","color: #000000; font-size: 16pt;");this.ensureDefault("button_text_top_padding",0);this.ensureDefault("button_text_left_padding",0);this.ensureDefault("button_action",SWFUpload.BUTTON_ACTION.SELECT_FILES);this.ensureDefault("button_disabled",false);this.ensureDefault("button_placeholder_id","");this.ensureDefault("button_placeholder",null);this.ensureDefault("button_cursor",SWFUpload.CURSOR.ARROW);this.ensureDefault("button_window_mode",SWFUpload.WINDOW_MODE.WINDOW);this.ensureDefault("debug",false);this.settings.debug_enabled=this.settings.debug;this.settings.return_upload_start_handler=this.returnUploadStart;this.ensureDefault("swfupload_loaded_handler",null);this.ensureDefault("file_dialog_start_handler",null);this.ensureDefault("file_queued_handler",null);this.ensureDefault("file_queue_error_handler",null);this.ensureDefault("file_dialog_complete_handler",null);this.ensureDefault("upload_start_handler",null);this.ensureDefault("upload_progress_handler",null);this.ensureDefault("upload_error_handler",null);this.ensureDefault("upload_success_handler",null);this.ensureDefault("upload_complete_handler",null);this.ensureDefault("debug_handler",this.debugMessage);this.ensureDefault("custom_settings",{});this.customSettings=this.settings.custom_settings;if(!!this.settings.prevent_swf_caching){this.settings.flash_url=this.settings.flash_url+(this.settings.flash_url.indexOf("?")<0?"?":"&")+"preventswfcaching="+new Date().getTime()}if(!this.settings.preserve_relative_urls){this.settings.upload_url=SWFUpload.completeURL(this.settings.upload_url);this.settings.button_image_url=SWFUpload.completeURL(this.settings.button_image_url)}delete this.ensureDefault};SWFUpload.prototype.loadFlash=function(){var a,b;if(document.getElementById(this.movieName)!==null){throw"ID "+this.movieName+" is already in use. The Flash Object could not be added"}a=document.getElementById(this.settings.button_placeholder_id)||this.settings.button_placeholder;if(a==undefined){throw"Could not find the placeholder element: "+this.settings.button_placeholder_id}b=document.createElement("div");b.innerHTML=this.getFlashHTML();a.parentNode.replaceChild(b.firstChild,a);if(window[this.movieName]==undefined){window[this.movieName]=this.getMovieElement()}};SWFUpload.prototype.getFlashHTML=function(){return['<object id="',this.movieName,'" type="application/x-shockwave-flash" data="',this.settings.flash_url,'" width="',this.settings.button_width,'" height="',this.settings.button_height,'" class="swfupload">','<param name="wmode" value="',this.settings.button_window_mode,'" />','<param name="movie" value="',this.settings.flash_url,'" />','<param name="quality" value="high" />','<param name="menu" value="false" />','<param name="allowScriptAccess" value="always" />','<param name="flashvars" value="'+this.getFlashVars()+'" />',"</object>"].join("")};SWFUpload.prototype.getFlashVars=function(){var b=this.buildParamString();var a=this.settings.http_success.join(",");return["movieName=",encodeURIComponent(this.movieName),"&amp;uploadURL=",encodeURIComponent(this.settings.upload_url),"&amp;useQueryString=",encodeURIComponent(this.settings.use_query_string),"&amp;requeueOnError=",encodeURIComponent(this.settings.requeue_on_error),"&amp;httpSuccess=",encodeURIComponent(a),"&amp;assumeSuccessTimeout=",encodeURIComponent(this.settings.assume_success_timeout),"&amp;params=",encodeURIComponent(b),"&amp;filePostName=",encodeURIComponent(this.settings.file_post_name),"&amp;fileTypes=",encodeURIComponent(this.settings.file_types),"&amp;fileTypesDescription=",encodeURIComponent(this.settings.file_types_description),"&amp;fileSizeLimit=",encodeURIComponent(this.settings.file_size_limit),"&amp;fileUploadLimit=",encodeURIComponent(this.settings.file_upload_limit),"&amp;fileQueueLimit=",encodeURIComponent(this.settings.file_queue_limit),"&amp;debugEnabled=",encodeURIComponent(this.settings.debug_enabled),"&amp;buttonImageURL=",encodeURIComponent(this.settings.button_image_url),"&amp;buttonWidth=",encodeURIComponent(this.settings.button_width),"&amp;buttonHeight=",encodeURIComponent(this.settings.button_height),"&amp;buttonText=",encodeURIComponent(this.settings.button_text),"&amp;buttonTextTopPadding=",encodeURIComponent(this.settings.button_text_top_padding),"&amp;buttonTextLeftPadding=",encodeURIComponent(this.settings.button_text_left_padding),"&amp;buttonTextStyle=",encodeURIComponent(this.settings.button_text_style),"&amp;buttonAction=",encodeURIComponent(this.settings.button_action),"&amp;buttonDisabled=",encodeURIComponent(this.settings.button_disabled),"&amp;buttonCursor=",encodeURIComponent(this.settings.button_cursor)].join("")};SWFUpload.prototype.getMovieElement=function(){if(this.movieElement==undefined){this.movieElement=document.getElementById(this.movieName)}if(this.movieElement===null){throw"Could not find Flash element"}return this.movieElement};SWFUpload.prototype.buildParamString=function(){var c=this.settings.post_params;var b=[];if(typeof(c)==="object"){for(var a in c){if(c.hasOwnProperty(a)){b.push(encodeURIComponent(a.toString())+"="+encodeURIComponent(c[a].toString()))}}}return b.join("&amp;")};SWFUpload.prototype.destroy=function(){try{this.cancelUpload(null,false);var a=null;a=this.getMovieElement();if(a&&typeof(a.CallFunction)==="unknown"){for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(e){}}try{a.parentNode.removeChild(a)}catch(b){}}window[this.movieName]=null;SWFUpload.instances[this.movieName]=null;delete SWFUpload.instances[this.movieName];this.movieElement=null;this.settings=null;this.customSettings=null;this.eventQueue=null;this.movieName=null;return true}catch(d){return false}};SWFUpload.prototype.displayDebugInfo=function(){this.debug(["---SWFUpload Instance Info---\n","Version: ",SWFUpload.version,"\n","Movie Name: ",this.movieName,"\n","Settings:\n","\t","upload_url:               ",this.settings.upload_url,"\n","\t","flash_url:                ",this.settings.flash_url,"\n","\t","use_query_string:         ",this.settings.use_query_string.toString(),"\n","\t","requeue_on_error:         ",this.settings.requeue_on_error.toString(),"\n","\t","http_success:             ",this.settings.http_success.join(", "),"\n","\t","assume_success_timeout:   ",this.settings.assume_success_timeout,"\n","\t","file_post_name:           ",this.settings.file_post_name,"\n","\t","post_params:              ",this.settings.post_params.toString(),"\n","\t","file_types:               ",this.settings.file_types,"\n","\t","file_types_description:   ",this.settings.file_types_description,"\n","\t","file_size_limit:          ",this.settings.file_size_limit,"\n","\t","file_upload_limit:        ",this.settings.file_upload_limit,"\n","\t","file_queue_limit:         ",this.settings.file_queue_limit,"\n","\t","debug:                    ",this.settings.debug.toString(),"\n","\t","prevent_swf_caching:      ",this.settings.prevent_swf_caching.toString(),"\n","\t","button_placeholder_id:    ",this.settings.button_placeholder_id.toString(),"\n","\t","button_placeholder:       ",(this.settings.button_placeholder?"Set":"Not Set"),"\n","\t","button_image_url:         ",this.settings.button_image_url.toString(),"\n","\t","button_width:             ",this.settings.button_width.toString(),"\n","\t","button_height:            ",this.settings.button_height.toString(),"\n","\t","button_text:              ",this.settings.button_text.toString(),"\n","\t","button_text_style:        ",this.settings.button_text_style.toString(),"\n","\t","button_text_top_padding:  ",this.settings.button_text_top_padding.toString(),"\n","\t","button_text_left_padding: ",this.settings.button_text_left_padding.toString(),"\n","\t","button_action:            ",this.settings.button_action.toString(),"\n","\t","button_disabled:          ",this.settings.button_disabled.toString(),"\n","\t","custom_settings:          ",this.settings.custom_settings.toString(),"\n","Event Handlers:\n","\t","swfupload_loaded_handler assigned:  ",(typeof this.settings.swfupload_loaded_handler==="function").toString(),"\n","\t","file_dialog_start_handler assigned: ",(typeof this.settings.file_dialog_start_handler==="function").toString(),"\n","\t","file_queued_handler assigned:       ",(typeof this.settings.file_queued_handler==="function").toString(),"\n","\t","file_queue_error_handler assigned:  ",(typeof this.settings.file_queue_error_handler==="function").toString(),"\n","\t","upload_start_handler assigned:      ",(typeof this.settings.upload_start_handler==="function").toString(),"\n","\t","upload_progress_handler assigned:   ",(typeof this.settings.upload_progress_handler==="function").toString(),"\n","\t","upload_error_handler assigned:      ",(typeof this.settings.upload_error_handler==="function").toString(),"\n","\t","upload_success_handler assigned:    ",(typeof this.settings.upload_success_handler==="function").toString(),"\n","\t","upload_complete_handler assigned:   ",(typeof this.settings.upload_complete_handler==="function").toString(),"\n","\t","debug_handler assigned:             ",(typeof this.settings.debug_handler==="function").toString(),"\n"].join(""))};SWFUpload.prototype.addSetting=function(b,c,a){if(c==undefined){return(this.settings[b]=a)}else{return(this.settings[b]=c)}};SWFUpload.prototype.getSetting=function(a){if(this.settings[a]!=undefined){return this.settings[a]}return""};SWFUpload.prototype.callFlash=function(functionName,argumentArray){argumentArray=argumentArray||[];var movieElement=this.getMovieElement();var returnValue,returnString;try{returnString=movieElement.CallFunction('<invoke name="'+functionName+'" returntype="javascript">'+__flash__argumentsToXML(argumentArray,0)+"</invoke>");returnValue=eval(returnString)}catch(ex){throw"Call to "+functionName+" failed"}if(returnValue!=undefined&&typeof returnValue.post==="object"){returnValue=this.unescapeFilePostParams(returnValue)}return returnValue};SWFUpload.prototype.selectFile=function(){this.callFlash("SelectFile")};SWFUpload.prototype.selectFiles=function(){this.callFlash("SelectFiles")};SWFUpload.prototype.startUpload=function(a){this.callFlash("StartUpload",[a])};SWFUpload.prototype.cancelUpload=function(a,b){if(b!==false){b=true}this.callFlash("CancelUpload",[a,b])};SWFUpload.prototype.stopUpload=function(){this.callFlash("StopUpload")};SWFUpload.prototype.getStats=function(){return this.callFlash("GetStats")};SWFUpload.prototype.setStats=function(a){this.callFlash("SetStats",[a])};SWFUpload.prototype.getFile=function(a){if(typeof(a)==="number"){return this.callFlash("GetFileByIndex",[a])}else{return this.callFlash("GetFile",[a])}};SWFUpload.prototype.addFileParam=function(a,b,c){return this.callFlash("AddFileParam",[a,b,c])};SWFUpload.prototype.removeFileParam=function(a,b){this.callFlash("RemoveFileParam",[a,b])};SWFUpload.prototype.setUploadURL=function(a){this.settings.upload_url=a.toString();this.callFlash("SetUploadURL",[a])};SWFUpload.prototype.setPostParams=function(a){this.settings.post_params=a;this.callFlash("SetPostParams",[a])};SWFUpload.prototype.addPostParam=function(a,b){this.settings.post_params[a]=b;this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.removePostParam=function(a){delete this.settings.post_params[a];this.callFlash("SetPostParams",[this.settings.post_params])};SWFUpload.prototype.setFileTypes=function(a,b){this.settings.file_types=a;this.settings.file_types_description=b;this.callFlash("SetFileTypes",[a,b])};SWFUpload.prototype.setFileSizeLimit=function(a){this.settings.file_size_limit=a;this.callFlash("SetFileSizeLimit",[a])};SWFUpload.prototype.setFileUploadLimit=function(a){this.settings.file_upload_limit=a;this.callFlash("SetFileUploadLimit",[a])};SWFUpload.prototype.setFileQueueLimit=function(a){this.settings.file_queue_limit=a;this.callFlash("SetFileQueueLimit",[a])};SWFUpload.prototype.setFilePostName=function(a){this.settings.file_post_name=a;this.callFlash("SetFilePostName",[a])};SWFUpload.prototype.setUseQueryString=function(a){this.settings.use_query_string=a;this.callFlash("SetUseQueryString",[a])};SWFUpload.prototype.setRequeueOnError=function(a){this.settings.requeue_on_error=a;this.callFlash("SetRequeueOnError",[a])};SWFUpload.prototype.setHTTPSuccess=function(a){if(typeof a==="string"){a=a.replace(" ","").split(",")}this.settings.http_success=a;this.callFlash("SetHTTPSuccess",[a])};SWFUpload.prototype.setAssumeSuccessTimeout=function(a){this.settings.assume_success_timeout=a;this.callFlash("SetAssumeSuccessTimeout",[a])};SWFUpload.prototype.setDebugEnabled=function(a){this.settings.debug_enabled=a;this.callFlash("SetDebugEnabled",[a])};SWFUpload.prototype.setButtonImageURL=function(a){if(a==undefined){a=""}this.settings.button_image_url=a;this.callFlash("SetButtonImageURL",[a])};SWFUpload.prototype.setButtonDimensions=function(c,a){this.settings.button_width=c;this.settings.button_height=a;var b=this.getMovieElement();if(b!=undefined){b.style.width=c+"px";b.style.height=a+"px"}this.callFlash("SetButtonDimensions",[c,a])};SWFUpload.prototype.setButtonText=function(a){this.settings.button_text=a;this.callFlash("SetButtonText",[a])};SWFUpload.prototype.setButtonTextPadding=function(b,a){this.settings.button_text_top_padding=a;this.settings.button_text_left_padding=b;this.callFlash("SetButtonTextPadding",[b,a])};SWFUpload.prototype.setButtonTextStyle=function(a){this.settings.button_text_style=a;this.callFlash("SetButtonTextStyle",[a])};SWFUpload.prototype.setButtonDisabled=function(a){this.settings.button_disabled=a;this.callFlash("SetButtonDisabled",[a])};SWFUpload.prototype.setButtonAction=function(a){this.settings.button_action=a;this.callFlash("SetButtonAction",[a])};SWFUpload.prototype.setButtonCursor=function(a){this.settings.button_cursor=a;this.callFlash("SetButtonCursor",[a])};SWFUpload.prototype.queueEvent=function(b,c){if(c==undefined){c=[]}else{if(!(c instanceof Array)){c=[c]}}var a=this;if(typeof this.settings[b]==="function"){this.eventQueue.push(function(){this.settings[b].apply(this,c)});setTimeout(function(){a.executeNextEvent()},0)}else{if(this.settings[b]!==null){throw"Event handler "+b+" is unknown or is not a function"}}};SWFUpload.prototype.executeNextEvent=function(){var a=this.eventQueue?this.eventQueue.shift():null;if(typeof(a)==="function"){a.apply(this)}};SWFUpload.prototype.unescapeFilePostParams=function(c){var e=/[$]([0-9a-f]{4})/i;var f={};var d;if(c!=undefined){for(var a in c.post){if(c.post.hasOwnProperty(a)){d=a;var b;while((b=e.exec(d))!==null){d=d.replace(b[0],String.fromCharCode(parseInt("0x"+b[1],16)))}f[d]=c.post[a]}}c.post=f}return c};SWFUpload.prototype.testExternalInterface=function(){try{return this.callFlash("TestExternalInterface")}catch(a){return false}};SWFUpload.prototype.flashReady=function(){var a=this.getMovieElement();if(!a){this.debug("Flash called back ready but the flash movie can't be found.");return}this.cleanUp(a);this.queueEvent("swfupload_loaded_handler")};SWFUpload.prototype.cleanUp=function(a){try{if(this.movieElement&&typeof(a.CallFunction)==="unknown"){this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)");for(var c in a){try{if(typeof(a[c])==="function"){a[c]=null}}catch(b){}}}}catch(d){}window.__flash__removeCallback=function(e,f){try{if(e){e[f]=null}}catch(g){}}};SWFUpload.prototype.fileDialogStart=function(){this.queueEvent("file_dialog_start_handler")};SWFUpload.prototype.fileQueued=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("file_queued_handler",a)};SWFUpload.prototype.fileQueueError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("file_queue_error_handler",[a,c,b])};SWFUpload.prototype.fileDialogComplete=function(b,c,a){this.queueEvent("file_dialog_complete_handler",[b,c,a])};SWFUpload.prototype.uploadStart=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("return_upload_start_handler",a)};SWFUpload.prototype.returnUploadStart=function(a){var b;if(typeof this.settings.upload_start_handler==="function"){a=this.unescapeFilePostParams(a);b=this.settings.upload_start_handler.call(this,a)}else{if(this.settings.upload_start_handler!=undefined){throw"upload_start_handler must be a function"}}if(b===undefined){b=true}b=!!b;this.callFlash("ReturnUploadStart",[b])};SWFUpload.prototype.uploadProgress=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_progress_handler",[a,c,b])};SWFUpload.prototype.uploadError=function(a,c,b){a=this.unescapeFilePostParams(a);this.queueEvent("upload_error_handler",[a,c,b])};SWFUpload.prototype.uploadSuccess=function(b,a,c){b=this.unescapeFilePostParams(b);this.queueEvent("upload_success_handler",[b,a,c])};SWFUpload.prototype.uploadComplete=function(a){a=this.unescapeFilePostParams(a);this.queueEvent("upload_complete_handler",a)};SWFUpload.prototype.debug=function(a){this.queueEvent("debug_handler",a)};SWFUpload.prototype.debugMessage=function(c){if(this.settings.debug){var a,d=[];if(typeof c==="object"&&typeof c.name==="string"&&typeof c.message==="string"){for(var b in c){if(c.hasOwnProperty(b)){d.push(b+": "+c[b])}}a=d.join("\n")||"";d=a.split("\n");a="EXCEPTION: "+d.join("\nEXCEPTION: ");SWFUpload.Console.writeLine(a)}else{SWFUpload.Console.writeLine(c)}}};SWFUpload.Console={};SWFUpload.Console.writeLine=function(d){var b,a;try{b=document.getElementById("SWFUpload_Console");if(!b){a=document.createElement("form");document.getElementsByTagName("body")[0].appendChild(a);b=document.createElement("textarea");b.id="SWFUpload_Console";b.style.fontFamily="monospace";b.setAttribute("wrap","off");b.wrap="off";b.style.overflow="auto";b.style.width="700px";b.style.height="350px";b.style.margin="5px";a.appendChild(b)}b.value+=d+"\n";b.scrollTop=b.scrollHeight-b.clientHeight}catch(c){alert("Exception: "+c.name+" Message: "+c.message)}};
+
+/*
+Uploadify v3.0.0
+Copyright (c) 2010 Ronnie Garcia
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+if(jQuery)(function(a){a.extend(a.fn,{uploadify:function(b,c){a(this).each(function(){function t(b,c,d){g.queue.queueBytesUploaded+=b.size;a("#"+b.id).find(".data").html(" - "+uploadifyLang["uploadComplete"]);if(g.settings.onUploadSuccess)g.settings.onUploadSuccess(b,c,d)}function s(b){var c=new Date;g.timer=c.getTime();g.bytesLoaded=0;if(g.queue.uploadQueue.length==0){g.queue.uploadSize=b.size}if(g.settings.checkExisting!==false){a.ajax({type:"POST",async:false,url:g.settings.checkExisting,data:{filename:b.name},success:function(c){if(c==1){var d=confirm(uploadifyLang["existsMsg1"]+' "'+b.name+'" '+uploadifyLang["existsMsg2"]+".\n"+uploadifyLang["existsMsg3"]);if(!d){g.cancelUpload(b.id);a("#"+b.id).remove();if(g.queue.uploadQueue.length>0&&g.queue.queueLength>0){if(g.queue.uploadQueue[0]=="*"){g.startUpload()}else{g.startUpload(g.queue.uploadQueue.shift())}}}}}})}if(g.settings.onUploadStart)g.settings.onUploadStart(b)}function r(b,c,d){var e=new Date;var f=e.getTime();var h=f-g.timer;g.timer=f;var i=c-g.bytesLoaded;g.bytesLoaded=c;var j=g.queue.queueBytesUploaded+c;var k=Math.round(c/d*100);var l=0;var m=i/1024/(h/1e3);m=Math.floor(m*10)/10;if(g.queue.averageSpeed>0){g.queue.averageSpeed=(g.queue.averageSpeed+m)/2}else{g.queue.averageSpeed=m}if(m>1e3){l=m*.001;g.queue.averageSpeed=l}var n="KB/s";if(l>0){n="MB/s"}if(a.inArray("onUploadProgress",g.settings.skipDefault)<0){if(g.settings.progressData=="percentage"){a("#"+b.id).find(".data").html(" - "+k+"%")}else if(g.settings.progressData=="speed"){a("#"+b.id).find(".data").html(" - "+g.queue.averageSpeed.toFixed(2)+" "+n)}else if(g.settings.progressData=="all"){a("#"+b.id).find(".data").html(" - "+k+"% - "+g.queue.averageSpeed.toFixed(2)+" "+n)}a("#"+b.id).find(".uploadifyProgressBar").css("width",k+"%")}if(g.settings.onUploadProgress)g.settings.onUploadProgress(b,c,d,j,g.queue.uploadSize)}function q(b,c,d){var e=uploadifyLang["errorString1"];if(c!=SWFUpload.UPLOAD_ERROR.FILE_CANCELLED&&c!=SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED){a("#"+b.id).addClass("uploadifyError")}a("#"+b.id).find(".uploadifyProgressBar").css("width","1px");switch(c){case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:e=uploadifyLang["errorString2"]+" ("+d+")";break;case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:e=uploadifyLang["errorString3"];break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:e=uploadifyLang["errorString4"];break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:e=uploadifyLang["errorString5"];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:alert(uploadifyLang["errorString6"]+" ("+d+").");e=uploadifyLang["errorString7"];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:e=uploadifyLang["errorString8"];break;case SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND:e=uploadifyLang["errorString9"];break;case SWFUpload.UPLOAD_ERROR.FILE_VALIDATION_FAILED:e=uploadifyLang["errorString10"];break;case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:e=uploadifyLang["errorString11"];g.queue.queueSize-=b.size;if(b.status==SWFUpload.FILE_STATUS.IN_PROGRESS||a.inArray(b.id,g.queue.uploadQueue)>=0){g.queue.uploadSize-=b.size}delete g.queue.files[b.id];break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:e=uploadifyLang["errorString12"];break}if(c!=SWFUpload.UPLOAD_ERROR.SPECIFIED_FILE_ID_NOT_FOUND&&b.status!=SWFUpload.FILE_STATUS.COMPLETE){a("#"+b.id).find(".data").html(" - "+e)}if(g.settings.onUploadError)g.settings.onUploadError(b,c,d,e,g.queue)}function p(b){var c=g.getStats();g.queue.queueLength=c.files_queued;if(g.queue.uploadQueue[0]=="*"){if(g.queue.queueLength>0){g.startUpload()}else{g.queue.uploadQueue=[];if(g.settings.onQueueComplete)g.settings.onQueueComplete(c)}}else{if(g.settings.onUploadComplete)g.settings.onUploadComplete(b,g.queue);if(g.queue.queueLength>0){g.startUpload(g.queue.uploadQueue.shift())}else{g.queue.uploadQueue=[];if(g.settings.onQueueComplete)g.settings.onQueueComplete(c)}}if(a.inArray("onUploadComplete",g.settings.skipDefault)<0){if(g.settings.removeCompleted){switch(b.filestatus){case SWFUpload.FILE_STATUS.COMPLETE:setTimeout(function(){if(a("#"+b.id)){g.queue.queueSize-=b.size;delete g.queue.files[b.id];a("#"+b.id).fadeOut(500,function(){a(this).remove()})}},g.settings.removeTimeout*1e3);break;case SWFUpload.FILE_STATUS.ERROR:if(!g.settings.requeueErrors){setTimeout(function(){if(a("#"+b.id)){g.queue.queueSize-=b.size;delete g.queue.files[b.id];a("#"+b.id).fadeOut(500,function(){a(this).remove()})}},g.settings.removeTimeout*1e3)}break}}}}function o(){var a=g.getStats();if(g.settings.onQueueComplete)g.settings.onQueueComplete(a)}function n(b,c,d){if(a.inArray("onSelectError",g.settings.skipDefault)<0){switch(c){case SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED:if(g.settings.queueSizeLimit>d){g.queue.errorMsg+="\n"+uploadifyLang["errorMsg2"]+" ("+d+")."}else{g.queue.errorMsg+="\n"+uploadifyLang["errorMsg3"]+" ("+g.settings.queueSizeLimit+")."}break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg5"]+" ("+g.settings.fileSizeLimit+").";break;case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg6"]+".";break;case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:g.queue.errorMsg+="\n"+uploadifyLang["errorMsg4"]+' "'+b.name+'" '+uploadifyLang["errorMsg7"]+" ("+g.settings.fileTypeDesc+").";break}}if(c!=SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){delete g.queue.files[b.id]}if(g.settings.onSelectError)g.settings.onSelectError(b,c,d)}function m(b){if(a.inArray("onSelect",g.settings.skipDefault)<0){var c={};for(var d in g.queue.files){c=g.queue.files[d];if(c.name==b.name){var e=confirm(uploadifyLang["replaceMsg1"]+' "'+b.name+'" '+uploadifyLang["replaceMsg2"]+".\n"+uploadifyLang["replaceMsg3"]);if(!e){g.cancelUpload(b.id);g.queue.filesCancelled++;return false}else{a("#"+c.id).remove();g.cancelUpload(c.id);g.queue.filesReplaced++}}}var f=Math.round(b.size/1024);var h="KB";if(f>1e3){f=Math.round(f/1e3);h="MB"}var i=f.toString().split(".");f=i[0];if(i.length>1){f+="."+i[1].substr(0,2)}f+=h;var j=b.name;if(j.length>18){j=j.substr(0,15)+"..."}a("#"+g.settings.queueID).append('<div id="'+b.id+'" class="uploadifyQueueItem">\n\t\t\t\t\t\t\t\t<div class="cancel">\n\t\t\t\t\t\t\t\t\t<a href="javascript:jQuery(\'#'+g.settings.id+"').uploadifyCancel('"+b.id+'\')"><img src="'+g.settings.cancelImage+'" border="0" /></a>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<span class="fileName">'+j+" ("+f+')</span><span class="data"></span>\n\t\t\t\t\t\t\t\t<div class="uploadifyProgress">\n\t\t\t\t\t\t\t\t\t<div class="uploadifyProgressBar"><!--Progress Bar--></div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>');g.queue.queueSize+=b.size}g.queue.files[b.id]=b;if(g.settings.onSelect)g.settings.onSelect(b)}function l(){g.queue.errorMsg=uploadifyLang["errorMsg1"];g.queue.filesReplaced=0;g.queue.filesCancelled=0;if(g.settings.onDialogOpen)g.settings.onDialogOpen()}function k(b,c,d){var e=g.getStats();g.queue.filesErrored=b-c;g.queue.filesSelected=b;g.queue.filesQueued=c-g.queue.filesCancelled;g.queue.queueLength=d;if(a.inArray("onDialogClose",g.settings.skipDefault)<0){if(g.queue.filesErrored>0){alert(g.queue.errorMsg)}}if(g.settings.onDialogClose)g.settings.onDialogClose(g.queue);if(g.settings.auto)a("#"+g.settings.id).uploadifyUpload("*")}var d=a(this).clone();var e=a.extend({id:a(this).attr("id"),langFile:"uploadifyLang_en.js",swf:"uploadify.swf",uploader:"uploadify.php",auto:false,buttonCursor:"pointer",buttonText:"",cancelImage:"uploadify-cancel.png",checkExisting:"uploadify-check-existing.php",debug:false,fileObjName:"Filedata",fileSizeLimit:0,fileTypeDesc:"",fileTypeExts:"*.*",height:30,method:"post",multi:false,queueID:false,queueSizeLimit:999,removeCompleted:true,removeTimeout:3,requeueErrors:true,postData:{},preventCaching:true,progressData:"all",successTimeout:30,transparent:true,uploadLimit:999,width:120,skipDefault:[],onDialogClose:function(){},onDialogOpen:function(){},onSelect:function(){},onSelectError:function(){},onQueueComplete:function(){},onUploadComplete:function(){},onUploadError:function(){},onUploadProgress:function(){},onUploadStart:function(){},onUploadSuccess:function(){}},b);var f={assume_success_timeout:e.successTimeout,button_placeholder_id:e.id,button_width:e.width,button_height:e.height,button_text:null,button_text_style:null,button_text_top_padding:0,button_text_left_padding:0,button_action:e.multi?SWFUpload.BUTTON_ACTION.SELECT_FILES:SWFUpload.BUTTON_ACTION.SELECT_FILE,button_disabled:false,button_cursor:e.buttonCursor=="arrow"?SWFUpload.CURSOR.ARROW:SWFUpload.CURSOR.HAND,button_window_mode:e.transparent?SWFUpload.WINDOW_MODE.TRANSPARENT:SWFUpload.WINDOW_MODE.OPAQUE,debug:e.debug,requeue_on_error:e.requeueErrors,file_post_name:e.fileObjName,file_size_limit:e.fileSizeLimit,file_types:e.fileTypeExts,file_types_description:e.fileTypeDesc,file_queue_limit:e.queueSizeLimit,file_upload_limit:e.uploadLimit,flash_url:e.swf,prevent_swf_caching:e.preventCaching,post_params:e.postData,upload_url:e.uploader,use_query_string:e.method=="get",file_dialog_complete_handler:k,file_dialog_start_handler:l,file_queued_handler:m,file_queue_error_handler:n,upload_complete_handler:p,upload_error_handler:q,upload_progress_handler:r,upload_start_handler:s,upload_success_handler:t};if(c){f=a.extend(f,c)}f=a.extend(f,e);a.ajaxSetup({async:false});a.getScript(e.langFile);a.ajaxSetup({async:true});if(e.buttonText=="")e.buttonText=uploadifyLang["buttonText"];if(e.fileTypeDesc=="")e.fileTypeDesc=uploadifyLang["fileTypeDesc"];window["uploadify_"+e.id]=new SWFUpload(f);var g=window["uploadify_"+e.id];g.original=d;var h=a("<div />",{id:e.id,"class":"uploadify",css:{height:e.height+"px",position:"relative",width:e.width+"px"}});a("#"+g.movieName).wrap(h);if(!e.queueID){var i=a("<div />",{id:e.id+"_queue","class":"uploadifyQueue"});a("#"+e.id).after(i);g.settings.queueID=e.queueID=e.id+"_queue"}g.queue={files:{},filesSelected:0,filesQueued:0,filesReplaced:0,filesCancelled:0,filesErrored:0,averageSpeed:0,queueLength:0,queueSize:0,uploadSize:0,queueBytesUploaded:0,uploadQueue:[],errorMsg:uploadifyLang["errorMsg1"]};var j=a("<div />",{id:e.id+"_button","class":"uploadifyButton",html:'<span class="uploadifyButtonText">'+e.buttonText+"</span>"});a("#"+e.id).append(j);a("#"+g.movieName).css({position:"absolute","z-index":1,left:"0px"})})},uploadifyCancel:function(b){var c=a(this).selector.replace("#","");var d=window["uploadify_"+c];var e=-1;if(arguments[0]){if(arguments[0]=="*"){a("#"+d.settings.queueID).find(".uploadifyQueueItem").each(function(){e++;d.cancelUpload(a(this).attr("id"));a(this).delay(100*e).fadeOut(500,function(){a(this).remove()})});d.queue.queueSize=0}else{for(var f=0;f<arguments.length;f++){d.cancelUpload(arguments[f]);a("#"+arguments[f]).delay(100*f).fadeOut(500,function(){a(this).remove()})}}}else{a("#"+d.settings.queueID).find(".uploadifyQueueItem").eq(0).fadeOut(500,function(){a(this).remove();d.cancelUpload(a(this).attr("id"))})}},uploadifyDestroy:function(){var b=a(this).selector.replace("#","");var c=window["uploadify_"+b];c.destroy();a("#"+b+"_queue").remove();a("#"+b).replaceWith(c.original);delete window["uploadify_"+b]},uploadifyDisable:function(b){var c=a(this).selector.replace("#","");var d=window["uploadify_"+c];d.setButtonDisabled(b)},uploadifySettings:function(b,c,d){function i(b,d,e){switch(b){case"uploader":f.setUploadURL(d);break;case"postData":if(!e){c=a.extend(f.settings.postData,d)}f.setPostParams(d);break;case"method":if(d=="get"){f.setUseQueryString(true)}else{f.setUseQueryString(false)}break;case"fileObjName":f.setFilePostName(d);break;case"fileTypeExts":f.setFileTypes(d,f.settings.fileTypeDesc);break;case"fileTypeDesc":f.setFileTypes(f.settings.fileTypeExts,d);break;case"fileSizeLimit":f.setFileSizeLimit(d);break;case"uploadLimit":f.setFileUploadLimit(d);break;case"queueSizeLimit":f.setFileQueueLimit(d);break;case"buttonImage":a("#"+f.settings.id+"_button").remove();f.setButtonImageURL(d);break;case"buttonCursor":if(d=="arrow"){f.setButtonCursor(SWFUpload.CURSOR.ARROW)}else{f.setButtonCursor(SWFUpload.CURSOR.HAND)}break;case"buttonText":a("#"+f.settings.id+"_button").find(".uploadifyButtonText").html(d);break;case"width":f.setButtonDimensions(d,f.settings.height);break;case"height":f.setButtonDimensions(f.settings.width,d);break;case"multi":if(d){f.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILES)}else{f.setButtonAction(SWFUpload.BUTTON_ACTION.SELECT_FILE)}break}f.settings[b]=c}var e=a(this).selector.replace("#","");var f=window["uploadify_"+e];var g=f.getStats();if(typeof arguments[0]=="object"){for(var h in c){i(h,c[h])}}if(arguments.length==1){if(b=="queueLength"){return g.files_queued}else{return f.settings[b]}}else{i(b,c,d)}},uploadifyStop:function(){var b=a(this).selector.replace("#","");var c=window["uploadify_"+b];c.stopUpload()},uploadifyUpload:function(){var b=a(this).selector.replace("#","");var c=window["uploadify_"+b];c.queue.averageSpeed=0;c.queue.uploadSize=0;c.queue.bytesUploaded=0;c.queue.uploadQueue=[];if(arguments[0]){if(arguments[0]=="*"){c.queue.uploadSize=c.queue.queueSize;c.queue.uploadQueue.push("*");c.startUpload()}else{for(var d=0;d<arguments.length;d++){c.queue.uploadSize+=c.queue.files[arguments[d]].size;c.queue.uploadQueue.push(arguments[d])}c.startUpload(c.queue.uploadQueue.shift())}}else{c.startUpload()}}})})(jQuery)
Index: tags/2.4.0RC3/admin/include/uploadify/uploadify.css
===================================================================
--- tags/2.4.0RC3/admin/include/uploadify/uploadify.css	(revision 14585)
+++ tags/2.4.0RC3/admin/include/uploadify/uploadify.css	(revision 14585)
@@ -0,0 +1,119 @@
+/*
+Uploadify v3.0.0
+Copyright (c) 2010 Ronnie Garcia
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+.uploadify {margin:0 auto 10px auto}
+
+.uploadifyButton {
+	display: block;
+	cursor: pointer;
+	font-size: 11px;
+	font-weight: bold;
+	color: #eeeeee;
+	padding: 8px 0;
+	text-align: center;
+	height: 14px;
+	width: 100%;
+	background-color: #464646;
+-webkit-border-radius:5px;
+-moz-border-radius:5px;
+border-radius:5px;
+letter-spacing:2px;
+}
+.uploadify:hover .uploadifyButton {
+	color:#fff;
+        background-color: #333;
+        cursor:pointer;
+}
+.uploadifyQueueItem {
+	background-color: #F5F5F5;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	border-radius: 3px;
+	font: 11px Verdana, Geneva, sans-serif;
+	margin-top: 5px;
+	max-width: 350px;
+	padding: 10px;
+}
+.uploadifyQueueItem .cancel {
+	float: right;
+}
+.uploadifyQueueItem .fileName, .uploadifyQueueItem .data {
+	float: left;
+}
+.uploadifyQueue .completed {
+	background-color: #E5E5E5;
+}
+.uploadifyProgress {
+	background-color: #E5E5E5;
+	margin-top: 25px;
+	height: 3px;
+	width: 100%;
+	position: relative;
+}
+.uploadifyProgressBar {
+	background-color: #0099FF;
+	height: 3px;
+	width: 1px;
+	position: absolute;
+	left: 0px;
+}
+.uploadifyError {
+	background-color: #FDE5DD !important;
+}
+
+
+/* Piwigo specific */
+#fileQueue {
+        width: 420px;
+        max-height: 300px;
+        overflow: auto;
+        margin: 0 auto 10px auto;
+        padding: 5px 0 10px 0;
+}
+
+.uploadifyQueueItem {
+	border: 1px solid #666;
+	background-color: #444;
+        color:#999;
+	margin: 5px auto 0 auto;
+	padding: 10px;
+	width: 350px;
+
+}
+.uploadifyError {
+	border: 2px solid #FBCBBC !important;
+	background-color: #FDE5DD !important;
+}
+.uploadifyQueueItem .cancel {
+	float: right;
+}
+.uploadifyProgress {
+	background-color: #333;
+	border: 1px solid #666;
+	width: 100%;
+}
+.uploadifyProgressBar {
+	background-color: #FF3363;
+	width: 1px;
+	height: 3px;
+}
Index: tags/2.4.0RC3/admin/include/uploadify/uploadify.php
===================================================================
--- tags/2.4.0RC3/admin/include/uploadify/uploadify.php	(revision 14585)
+++ tags/2.4.0RC3/admin/include/uploadify/uploadify.php	(revision 14585)
@@ -0,0 +1,92 @@
+<?php
+define('PHPWG_ROOT_PATH','../../../');
+define('IN_ADMIN', true);
+
+$_COOKIE['pwg_id'] = $_POST['session_id'];
+
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+check_pwg_token();
+
+ob_start();
+echo '$_FILES'."\n";
+print_r($_FILES);
+echo '$_POST'."\n";
+print_r($_POST);
+echo '$user'."\n";
+print_r($user);
+$tmp = ob_get_contents(); 
+ob_end_clean();
+// error_log($tmp, 3, "/tmp/php-".date('YmdHis').'-'.sprintf('%020u', rand()).".log");
+
+if ($_FILES['Filedata']['error'] !== UPLOAD_ERR_OK)
+{
+  $error_message = file_upload_error_message($_FILES['Filedata']['error']);
+  
+  add_upload_error(
+    $_POST['upload_id'],
+    sprintf(
+      l10n('Error on file "%s" : %s'),
+      $_FILES['Filedata']['name'],
+      $error_message
+      )
+    );
+
+  echo "File Size Error";
+  exit();
+}
+
+ob_start();
+
+$image_id = add_uploaded_file(
+  $_FILES['Filedata']['tmp_name'],
+  $_FILES['Filedata']['name'],
+  array($_POST['category_id']),
+  $_POST['level']
+  );
+
+if (!isset($_SESSION['uploads']))
+{
+  $_SESSION['uploads'] = array();
+}
+
+if (!isset($_SESSION['uploads'][ $_POST['upload_id'] ]))
+{
+  $_SESSION['uploads'][ $_POST['upload_id'] ] = array();
+}
+
+array_push(
+  $_SESSION['uploads'][ $_POST['upload_id'] ],
+  $image_id
+  );
+
+$query = '
+SELECT
+    id,
+    path,
+    tn_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$image_id.'
+;';
+$image_infos = pwg_db_fetch_assoc(pwg_query($query));
+
+$thumbnail_url = preg_replace('#^'.PHPWG_ROOT_PATH.'#', './', DerivativeImage::thumb_url($image_infos));
+
+$return = array(
+  'image_id' => $image_id,
+  'category_id' => $_POST['category_id'],
+  'thumbnail_url' => $thumbnail_url,
+  );
+
+$output = ob_get_contents(); 
+ob_end_clean();
+if (!empty($output))
+{
+  add_upload_error($_POST['upload_id'], $output);
+  $return['error_message'] = $output;
+}
+
+echo json_encode($return);
+?>
Index: tags/2.4.0RC3/admin/include/uploadify/uploadifyLang_en.js
===================================================================
--- tags/2.4.0RC3/admin/include/uploadify/uploadifyLang_en.js	(revision 14585)
+++ tags/2.4.0RC3/admin/include/uploadify/uploadifyLang_en.js	(revision 14585)
@@ -0,0 +1,32 @@
+// this file must be in UTF-8 format
+
+var uploadifyLang = new Array();
+
+uploadifyLang['buttonText']     = 'SELECT FILES';
+uploadifyLang['fileTypeDesc']   = 'All Files (*.*)';
+uploadifyLang['replaceMsg1']    = 'The file named';
+uploadifyLang['replaceMsg2']    = 'is already in the queue';
+uploadifyLang['replaceMsg3']    = 'Do you want to replace the existing item in the queue?';
+uploadifyLang['existsMsg1']     = 'A file with the name';
+uploadifyLang['existsMsg2']     = 'already exists on the server';
+uploadifyLang['existsMsg3']     = 'Would you like to replace the existing file?';
+uploadifyLang['errorMsg1']      = 'Some files were not added to the queue:';
+uploadifyLang['errorMsg2']      = 'The number of files selected exceeds the remaining upload limit';
+uploadifyLang['errorMsg3']      = 'The number of files selected exceeds the queue size limit';
+uploadifyLang['errorMsg4']      = 'The file';
+uploadifyLang['errorMsg5']      = 'exceeds the size limit';
+uploadifyLang['errorMsg6']      = 'is empty';
+uploadifyLang['errorMsg7']      = 'is not an accepted file type';
+uploadifyLang['errorString1']   = 'Error';
+uploadifyLang['errorString2']   = 'HTTP Error';
+uploadifyLang['errorString3']   = 'Missing Upload URL';
+uploadifyLang['errorString4']   = 'IO Error';
+uploadifyLang['errorString5']   = 'Security Error';
+uploadifyLang['errorString6']   = 'The upload limit has been reached';
+uploadifyLang['errorString7']   = 'Exceeds Upload Limit';
+uploadifyLang['errorString8']   = 'Failed';
+uploadifyLang['errorString9']   = 'File ID Not Found';
+uploadifyLang['errorString10']  = 'Validation Error';
+uploadifyLang['errorString11']  = 'Cancelled';
+uploadifyLang['errorString12']  = 'Stopped';
+uploadifyLang['uploadComplete'] = 'Complete';
Index: tags/2.4.0RC3/admin/index.php
===================================================================
--- tags/2.4.0RC3/admin/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/intro.php
===================================================================
--- tags/2.4.0RC3/admin/intro.php	(revision 14585)
+++ tags/2.4.0RC3/admin/intro.php	(revision 14585)
@@ -0,0 +1,316 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/check_integrity.class.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/c13y_internal.class.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                                actions                                |
+// +-----------------------------------------------------------------------+
+
+// Check for upgrade : code inspired from punbb
+if (isset($_GET['action']) and 'check_upgrade' == $_GET['action'])
+{
+  if (!fetchRemote(PHPWG_URL.'/download/latest_version', $result))
+  {
+    array_push($page['errors'], l10n('Unable to check for upgrade.'));
+  }
+  else
+  {
+    $versions = array('current' => PHPWG_VERSION);
+    $lines = @explode("\r\n", $result);
+
+    // if the current version is a BSF (development branch) build, we check
+    // the first line, for stable versions, we check the second line
+    if (preg_match('/^BSF/', $versions['current']))
+    {
+      $versions['latest'] = trim($lines[0]);
+
+      // because integer are limited to 4,294,967,296 we need to split BSF
+      // versions in date.time
+      foreach ($versions as $key => $value)
+      {
+        $versions[$key] =
+          preg_replace('/BSF_(\d{8})(\d{4})/', '$1.$2', $value);
+      }
+    }
+    else
+    {
+      $versions['latest'] = trim($lines[1]);
+    }
+
+    if ('' == $versions['latest'])
+    {
+      array_push(
+        $page['errors'],
+        l10n('Check for upgrade failed for unknown reasons.')
+        );
+    }
+    // concatenation needed to avoid automatic transformation by release
+    // script generator
+    else if ('%'.'PWGVERSION'.'%' == $versions['current'])
+    {
+      array_push(
+        $page['infos'],
+        l10n('You are running on development sources, no check possible.')
+        );
+    }
+    else if (version_compare($versions['current'], $versions['latest']) < 0)
+    {
+      array_push(
+        $page['infos'],
+        l10n('A new version of Piwigo is available.')
+        );
+    }
+    else
+    {
+      array_push(
+        $page['infos'],
+        l10n('You are running the latest version of Piwigo.')
+        );
+    }
+  }
+}
+// Show phpinfo() output
+else if (isset($_GET['action']) and 'phpinfo' == $_GET['action'])
+{
+  phpinfo();
+  exit();
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('intro' => 'intro.tpl'));
+
+if ($conf['show_newsletter_subscription']) {
+  $template->assign(
+    array(
+      'EMAIL' => $user['email'],
+      'SUBSCRIBE_BASE_URL' => get_newsletter_subscribe_base_url($user['language']),
+      )
+    );
+}
+
+$php_current_timestamp = date("Y-m-d H:i:s");
+$db_version = pwg_get_db_version();
+list($db_current_date) = pwg_db_fetch_row(pwg_query('SELECT now();'));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.IMAGES_TABLE.'
+;';
+list($nb_elements) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.CATEGORIES_TABLE.'
+;';
+list($nb_categories) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NULL
+;';
+list($nb_virtual) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NOT NULL
+;';
+list($nb_physical) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.IMAGE_CATEGORY_TABLE.'
+;';
+list($nb_image_category) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.TAGS_TABLE.'
+;';
+list($nb_tags) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.IMAGE_TAG_TABLE.'
+;';
+list($nb_image_tag) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.USERS_TABLE.'
+;';
+list($nb_users) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.GROUPS_TABLE.'
+;';
+list($nb_groups) = pwg_db_fetch_row(pwg_query($query));
+
+$query = '
+SELECT COUNT(*)
+  FROM '.RATE_TABLE.'
+;';
+list($nb_rates) = pwg_db_fetch_row(pwg_query($query));
+
+$template->assign(
+  array(
+    'PHPWG_URL' => PHPWG_URL,
+    'PWG_VERSION' => PHPWG_VERSION,
+    'OS' => PHP_OS,
+    'PHP_VERSION' => phpversion(),
+    'DB_ENGINE' => $conf['dblayer'],
+    'DB_VERSION' => $db_version,
+    'DB_ELEMENTS' => l10n_dec('%d photo', '%d photos', $nb_elements),
+    'DB_CATEGORIES' =>
+      l10n_dec('%d album including', '%d albums including',
+        $nb_categories).
+      l10n_dec('%d physical', '%d physical',
+        $nb_physical).
+      l10n_dec(' and %d virtual', ' and %d virtual',
+        $nb_virtual),
+    'DB_IMAGE_CATEGORY' => l10n_dec('%d association', '%d associations', $nb_image_category),
+    'DB_TAGS' => l10n_dec('%d tag', '%d tags', $nb_tags),
+    'DB_IMAGE_TAG' => l10n_dec('%d association', '%d associations', $nb_image_tag),
+    'DB_USERS' => l10n_dec('%d user', '%d users', $nb_users),
+    'DB_GROUPS' => l10n_dec('%d group', '%d groups', $nb_groups),
+		'DB_RATES' => sprintf('%d rates', $nb_rates),
+    'U_CHECK_UPGRADE' => PHPWG_ROOT_PATH.'admin.php?action=check_upgrade',
+    'U_PHPINFO' => PHPWG_ROOT_PATH.'admin.php?action=phpinfo',
+    'PHP_DATATIME' => $php_current_timestamp,
+    'DB_DATATIME' => $db_current_date,
+    )
+  );
+  
+if ($conf['activate_comments'])
+{
+  $query = '
+SELECT COUNT(*)
+  FROM '.COMMENTS_TABLE.'
+;';
+  list($nb_comments) = pwg_db_fetch_row(pwg_query($query));
+  $template->assign('DB_COMMENTS', l10n_dec('%d comment', '%d comments', $nb_comments));
+  
+  // unvalidated comments
+  $query = '
+SELECT COUNT(*)
+  FROM '.COMMENTS_TABLE.'
+  WHERE validated=\'false\'
+;';
+  list($nb_comments) = pwg_db_fetch_row(pwg_query($query));
+
+  if ($nb_comments > 0)
+  {
+    $template->assign(
+      'unvalidated',
+      array(
+        'URL' => PHPWG_ROOT_PATH.'admin.php?page=comments',
+        'INFO' => sprintf(l10n('%d waiting for validation'), $nb_comments)
+        )
+      );
+  }
+}
+
+if ($nb_elements > 0)
+{
+  $query = '
+SELECT MIN(date_available)
+  FROM '.IMAGES_TABLE.'
+;';
+  list($first_date) = pwg_db_fetch_row(pwg_query($query));
+
+  $template->assign(
+    'first_added',
+    array(
+      'DB_DATE' =>
+      sprintf(
+        l10n('first photo added on %s'),
+        format_date($first_date)
+        )
+      )
+    );
+}
+
+// graphics library
+switch (pwg_image::get_library())
+{
+  case 'imagick':
+    $library = 'ImageMagick';
+    $img = new Imagick();
+    $version = $img->getVersion();
+    if (preg_match('/ImageMagick \d+\.\d+\.\d+-?\d*/', $version['versionString'], $match))
+    {
+      $library = $match[0];
+    }
+    $template->assign('GRAPHICS_LIBRARY', $library);
+    break;
+
+  case 'ext_imagick':
+    $library = 'External ImageMagick';
+    exec($conf['ext_imagick_dir'].'convert -version', $returnarray);
+    if (preg_match('/Version: ImageMagick (\d+\.\d+\.\d+-?\d*)/', $returnarray[0], $match))
+    {
+      $library .= ' ' . $match[1];
+    }
+    $template->assign('GRAPHICS_LIBRARY', $library);
+    break;
+
+  case 'gd':
+    $gd_info = gd_info();
+    $template->assign('GRAPHICS_LIBRARY', 'GD '.@$gd_info['GD Version']);
+    break;
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'intro');
+
+// Check integrity
+$c13y = new check_integrity();
+// add internal checks
+new c13y_internal();
+// check and display
+$c13y->check();
+$c13y->display();
+
+?>
Index: tags/2.4.0RC3/admin/languages.php
===================================================================
--- tags/2.4.0RC3/admin/languages.php	(revision 14585)
+++ tags/2.4.0RC3/admin/languages.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=languages';
+
+if (isset($_GET['tab']))
+  $page['tab'] = $_GET['tab'];
+else
+  $page['tab'] = 'installed';
+
+$tabsheet = new tabsheet();
+$tabsheet->add('installed', l10n('Installed Languages'), $my_base_url.'&amp;tab=installed');
+$tabsheet->add('update', l10n('Check for updates'), $my_base_url.'&amp;tab=update');
+$tabsheet->add('new', l10n('Add New Language'), $my_base_url.'&amp;tab=new');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+if ($page['tab'] == 'update')
+  include(PHPWG_ROOT_PATH.'admin/updates_ext.php');
+else
+  include(PHPWG_ROOT_PATH.'admin/languages_'.$page['tab'].'.php');
+
+?>
Index: tags/2.4.0RC3/admin/languages_installed.php
===================================================================
--- tags/2.4.0RC3/admin/languages_installed.php	(revision 14585)
+++ tags/2.4.0RC3/admin/languages_installed.php	(revision 14585)
@@ -0,0 +1,126 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/languages.class.php');
+
+$template->set_filenames(array('languages' => 'languages_installed.tpl'));
+
+$base_url = get_root_url().'admin.php?page='.$page['page'];
+
+$languages = new languages();
+$languages->get_db_languages();
+
+//--------------------------------------------------perform requested actions
+if (isset($_GET['action']) and isset($_GET['language']))
+{
+  $page['errors'] = $languages->perform_action($_GET['action'], $_GET['language']);
+
+  if (empty($page['errors']))
+  {
+    redirect($base_url);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                     start template output                             |
+// +-----------------------------------------------------------------------+
+$default_language = get_default_language();
+
+$tpl_languages = array();
+
+foreach($languages->fs_languages as $language_id => $language)
+{
+  $language['u_action'] = add_url_params($base_url, array('language' => $language_id));
+
+  if (in_array($language_id, array_keys($languages->db_languages)))
+  {
+    $language['state'] = 'active';
+    $language['deactivable'] = true;
+
+    if (count($languages->db_languages) <= 1)
+    {
+      $language['deactivable'] = false;
+      $language['deactivate_tooltip'] = l10n('Impossible to deactivate this language, you need at least one language.');
+    }
+
+    if ($language_id == $default_language)
+    {
+      $language['deactivable'] = false;
+      $language['deactivate_tooltip'] = l10n('Impossible to deactivate this language, first set another language as default.');
+    }
+  }
+  else
+  {
+    $language['state'] = 'inactive';
+  }
+
+  if ($language_id == $default_language)
+  {
+    $language['is_default'] = true;
+    array_unshift($tpl_languages, $language);
+  }
+  else
+  {
+    $language['is_default'] = false;
+    array_push($tpl_languages, $language);
+  }
+}
+
+$template->assign(
+  array(
+    'languages' => $tpl_languages,
+    )
+  );
+$template->append('language_states', 'active');
+$template->append('language_states', 'inactive');
+
+
+$missing_language_ids = array_diff(
+    array_keys($languages->db_languages),
+    array_keys($languages->fs_languages)
+  );
+
+foreach($missing_language_ids as $language_id)
+{
+  $query = '
+UPDATE '.USER_INFOS_TABLE.'
+  SET language = \''.get_default_language().'\'
+  WHERE language = \''.$language_id.'\'
+;';
+  pwg_query($query);
+
+  $query = '
+DELETE
+  FROM '.LANGUAGES_TABLE.'
+  WHERE id= \''.$language_id.'\'
+;';
+  pwg_query($query);
+}
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'languages');
+?>
Index: tags/2.4.0RC3/admin/languages_new.php
===================================================================
--- tags/2.4.0RC3/admin/languages_new.php	(revision 14585)
+++ tags/2.4.0RC3/admin/languages_new.php	(revision 14585)
@@ -0,0 +1,139 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/languages.class.php');
+
+$template->set_filenames(array('languages' => 'languages_new.tpl'));
+
+$base_url = get_root_url().'admin.php?page='.$page['page'].'&tab='.$page['tab'];
+
+$languages = new languages();
+$languages->get_db_languages();
+
+// +-----------------------------------------------------------------------+
+// |                           setup check                                 |
+// +-----------------------------------------------------------------------+
+
+$languages_dir = PHPWG_ROOT_PATH.'language';
+if (!is_writable($languages_dir))
+{
+  array_push(
+    $page['errors'],
+    sprintf(
+      l10n('Add write access to the "%s" directory'),
+      'language'
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                       perform installation                            |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['revision']))
+{
+  if (!is_webmaster())
+  {
+    array_push($page['errors'], l10n('Webmaster status is required.'));
+  }
+  else
+  {
+    check_pwg_token();
+
+    $install_status = $languages->extract_language_files('install', $_GET['revision']);
+
+    redirect($base_url.'&installstatus='.$install_status);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                        installation result                            |
+// +-----------------------------------------------------------------------+
+if (isset($_GET['installstatus']))
+{
+  switch ($_GET['installstatus'])
+  {
+    case 'ok':
+      array_push($page['infos'],
+        l10n('Language has been successfully installed')
+      );
+      break;
+
+    case 'temp_path_error':
+      array_push($page['errors'], l10n('Can\'t create temporary file.'));
+      break;
+
+    case 'dl_archive_error':
+      array_push($page['errors'], l10n('Can\'t download archive.'));
+      break;
+
+    case 'archive_error':
+      array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+      break;
+
+    default:
+      array_push(
+        $page['errors'],
+        sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus']))
+      );
+  }  
+}
+
+// +-----------------------------------------------------------------------+
+// |                     start template output                             |
+// +-----------------------------------------------------------------------+
+if ($languages->get_server_languages(true))
+{
+  foreach($languages->server_languages as $language)
+  {
+    list($date, ) = explode(' ', $language['revision_date']);
+
+    $url_auto_install = htmlentities($base_url)
+      . '&amp;revision=' . $language['revision_id']
+      . '&amp;pwg_token='.get_pwg_token()
+    ;
+
+    $template->append('languages', array(
+      'EXT_NAME' => $language['extension_name'],
+      'EXT_DESC' => $language['extension_description'],
+      'EXT_URL' => PEM_URL.'/extension_view.php?eid='.$language['extension_id'],
+      'VERSION' => $language['revision_name'],
+      'VER_DESC' => $language['revision_description'],
+      'DATE' => $date,
+      'AUTHOR' => $language['author_name'],
+      'URL_INSTALL' => $url_auto_install,
+      'URL_DOWNLOAD' => $language['download_url'] . '&amp;origin=piwigo_download'));
+  }
+}
+else
+{
+  array_push($page['errors'], l10n('Can\'t connect to server.'));
+}
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'languages');
+?>
Index: tags/2.4.0RC3/admin/maintenance.php
===================================================================
--- tags/2.4.0RC3/admin/maintenance.php	(revision 14585)
+++ tags/2.4.0RC3/admin/maintenance.php	(revision 14585)
@@ -0,0 +1,225 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (isset($_GET['action']))
+{
+  check_pwg_token();
+}
+
+// +-----------------------------------------------------------------------+
+// |                                actions                                |
+// +-----------------------------------------------------------------------+
+
+$action = isset($_GET['action']) ? $_GET['action'] : '';
+
+switch ($action)
+{
+  case 'lock_gallery' :
+  {
+    conf_update_param('gallery_locked', 'true');
+    redirect(get_root_url().'admin.php?page=maintenance');
+    break;
+  }
+  case 'unlock_gallery' :
+  {
+    conf_update_param('gallery_locked', 'false');
+    $_SESSION['page_infos'] = array(l10n('Gallery unlocked'));
+    redirect(get_root_url().'admin.php?page=maintenance');
+    break;
+  }
+  case 'categories' :
+  {
+    update_uppercats();
+    update_category('all');
+    update_global_rank();
+    invalidate_user_cache(true);
+    break;
+  }
+  case 'images' :
+  {
+    update_path();
+		include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+    update_rating_score();
+    break;
+  }
+  case 'delete_orphan_tags' :
+  {
+    delete_orphan_tags();
+    break;
+  }
+  case 'history_detail' :
+  {
+    $query = '
+DELETE
+  FROM '.HISTORY_TABLE.'
+;';
+    pwg_query($query);
+    break;
+  }
+  case 'history_summary' :
+  {
+    $query = '
+DELETE
+  FROM '.HISTORY_SUMMARY_TABLE.'
+;';
+    pwg_query($query);
+    break;
+  }
+  case 'sessions' :
+  {
+    pwg_session_gc();
+    break;
+  }
+  case 'feeds' :
+  {
+    $query = '
+DELETE
+  FROM '.USER_FEED_TABLE.'
+  WHERE last_check IS NULL
+;';
+    pwg_query($query);
+    break;
+  }
+  case 'database' :
+  {
+    do_maintenance_all_tables();
+    break;
+  }
+  case 'c13y' :
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/check_integrity.class.php');
+    $c13y = new check_integrity();
+    $c13y->maintenance();
+    break;
+  }
+  case 'search' :
+  {
+    $query = '
+DELETE
+  FROM '.SEARCH_TABLE.'
+;';
+    pwg_query($query);
+    break;
+  }
+  case 'compiled-templates':
+  {
+    $template->delete_compiled_templates();
+    FileCombiner::clear_combined_files();
+    break;
+  }
+  case 'derivatives':
+  {
+    clear_derivative_cache($_GET['type']);
+    break;
+  }
+  default :
+  {
+    break;
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('maintenance'=>'maintenance.tpl'));
+
+$url_format = get_root_url().'admin.php?page=maintenance&amp;action=%s&amp;pwg_token='.get_pwg_token();
+
+$purge_urls[l10n('All')] = sprintf($url_format, 'derivatives').'&amp;type=all';
+foreach(ImageStdParams::get_defined_type_map() as $params)
+{
+  $purge_urls[ l10n($params->type) ] = sprintf($url_format, 'derivatives').'&amp;type='.$params->type;
+}
+$purge_urls[ l10n(IMG_CUSTOM) ] = sprintf($url_format, 'derivatives').'&amp;type='.IMG_CUSTOM;
+
+$template->assign(
+  array(
+    'U_MAINT_CATEGORIES' => sprintf($url_format, 'categories'),
+    'U_MAINT_IMAGES' => sprintf($url_format, 'images'),
+    'U_MAINT_ORPHAN_TAGS' => sprintf($url_format, 'delete_orphan_tags'),
+    'U_MAINT_HISTORY_DETAIL' => sprintf($url_format, 'history_detail'),
+    'U_MAINT_HISTORY_SUMMARY' => sprintf($url_format, 'history_summary'),
+    'U_MAINT_SESSIONS' => sprintf($url_format, 'sessions'),
+    'U_MAINT_FEEDS' => sprintf($url_format, 'feeds'),
+    'U_MAINT_DATABASE' => sprintf($url_format, 'database'),
+    'U_MAINT_C13Y' => sprintf($url_format, 'c13y'),
+    'U_MAINT_SEARCH' => sprintf($url_format, 'search'),
+    'U_MAINT_COMPILED_TEMPLATES' => sprintf($url_format, 'compiled-templates'),
+    'U_MAINT_DERIVATIVES' => sprintf($url_format, 'derivatives'),
+    'purge_derivatives' => $purge_urls,
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=maintenance',
+    )
+  );
+
+
+if ($conf['gallery_locked'])
+{
+  $template->assign(
+    array(
+      'U_MAINT_UNLOCK_GALLERY' => sprintf($url_format, 'unlock_gallery'),
+      )
+    );
+}
+else
+{
+  $template->assign(
+    array(
+      'U_MAINT_LOCK_GALLERY' => sprintf($url_format, 'lock_gallery'),
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// | Define advanced features                                              |
+// +-----------------------------------------------------------------------+
+
+$advanced_features = array();
+
+//$advanced_features is array of array composed of CAPTION & URL
+$advanced_features = trigger_event(
+  'get_admin_advanced_features_links',
+  $advanced_features
+  );
+
+$template->assign('advanced_features', $advanced_features);
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'maintenance');
+?>
Index: tags/2.4.0RC3/admin/menubar.php
===================================================================
--- tags/2.4.0RC3/admin/menubar.php	(revision 14585)
+++ tags/2.4.0RC3/admin/menubar.php	(revision 14585)
@@ -0,0 +1,171 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+
+function abs_fn_cmp($a, $b)
+{
+  return abs($a)-abs($b);
+}
+
+function make_consecutive( &$orders, $step=50 )
+{
+  uasort( $orders, 'abs_fn_cmp' );
+  $crt = 1;
+  foreach( $orders as $id=>$pos)
+  {
+    $orders[$id] = $step * ($pos<0 ? -$crt : $crt);
+    $crt++;
+  }
+}
+
+
+global $template;
+
+include_once(PHPWG_ROOT_PATH.'include/block.class.php');
+
+$menu = new BlockManager('menubar');
+$menu->load_registered_blocks();
+$reg_blocks = $menu->get_registered_blocks();
+
+$mb_conf = @$conf[ 'blk_'.$menu->get_id() ];
+if ( is_string($mb_conf) )
+  $mb_conf = unserialize( $mb_conf );
+if ( !is_array($mb_conf) )
+  $mb_conf=array();
+
+foreach ($mb_conf as $id => $pos)
+{
+  if (!isset($reg_blocks[$id]))
+    unset($mb_conf[$id]);
+}
+
+if ( isset($_POST['reset']))
+{
+  $mb_conf = array();
+  $query = '
+UPDATE '.CONFIG_TABLE.'
+  SET value=\'\'
+  WHERE param=\'blk_'.addslashes($menu->get_id()).'\'
+  LIMIT 1';
+  pwg_query($query);
+}
+
+
+$idx=1;
+foreach ($reg_blocks as $id => $block)
+{
+  if ( !isset($mb_conf[$id]) )
+    $mb_conf[$id] = $idx*50;
+  $idx++;
+}
+
+
+if ( isset($_POST['submit']) )
+{
+  foreach ( $mb_conf as $id => $pos )
+  {
+    $hide = isset($_POST['hide_'.$id]);
+    $mb_conf[$id] = ($hide ? -1 : +1)*abs($pos);
+
+    $pos = (int)@$_POST['pos_'.$id];
+    if ($pos>0)
+      $mb_conf[$id] = $mb_conf[$id] > 0 ? $pos : -$pos;
+  }
+  make_consecutive( $mb_conf );
+
+  // BEGIN OPTIM - DONT ASK ABOUT THIS ALGO - but optimizes the size of the array we save in DB
+  /* !!! OPTIM DISABLED UNTIL IT HAS BEEN FIXED !!!
+  $reg_keys = array_keys($reg_blocks);
+  $cnf_keys = array_keys($mb_conf);
+  $best_slice = array( 'len'=>0 );
+  for ($i=0; $i<count($reg_keys); $i++)
+  {
+    for ($j=0; $j<count($cnf_keys); $j++)
+    {
+      for ($k=0; max($i,$j)+$k<count($cnf_keys); $k++)
+      {
+        if ($cnf_keys[$j+$k] == $reg_keys[$i+$k] )
+        {
+          if ( 1+$k>$best_slice['len'])
+          {
+            $best_slice['len'] = 1+$k;
+            $best_slice['start_cnf'] = $j;
+          }
+        }
+        else
+          break;
+      }
+    }
+  }
+  */
+  $mb_conf_db = $mb_conf;
+  /*
+  if ($best_slice['len'])
+  {
+    for ($j=0; $j<$best_slice['start_cnf']; $j++ )
+    {
+      $sign = $mb_conf_db[ $cnf_keys[$j] ] > 0 ? 1 : -1;
+      $mb_conf_db[ $cnf_keys[$j] ] = $sign * ( ($best_slice['start_cnf'])*50 - ($best_slice['start_cnf']-$j) );
+    }
+    for ($j=$best_slice['start_cnf']; $j<$best_slice['start_cnf']+$best_slice['len']; $j++ )
+    {
+      if ($mb_conf_db[ $cnf_keys[$j] ] > 0)
+        unset( $mb_conf_db[ $cnf_keys[$j] ] );
+    }
+  }
+  //var_export( $best_slice ); var_export($mb_conf);  var_export($mb_conf_db);
+  // END OPTIM
+  */
+  $query = '
+UPDATE '.CONFIG_TABLE.'
+  SET value=\''.addslashes(serialize($mb_conf_db)).'\'
+  WHERE param=\'blk_'.addslashes($menu->get_id()).'\'
+  ';
+  pwg_query($query);
+
+  array_push($page['infos'], l10n('Order of menubar items has been updated successfully.'));
+}
+
+make_consecutive( $mb_conf );
+
+foreach ($mb_conf as $id => $pos )
+{
+  $template->append( 'blocks',
+      array(
+        'pos' => $pos/5,
+        'reg' => $reg_blocks[$id]
+      )
+     );
+}
+
+$action = get_root_url().'admin.php?page=menubar';
+$template->assign(array('F_ACTION'=>$action));
+
+$template->set_filename( 'menubar_admin_content', 'menubar.tpl' );
+$template->assign_var_from_handle( 'ADMIN_CONTENT', 'menubar_admin_content');
+?>
Index: tags/2.4.0RC3/admin/notification_by_mail.php
===================================================================
--- tags/2.4.0RC3/admin/notification_by_mail.php	(revision 14585)
+++ tags/2.4.0RC3/admin/notification_by_mail.php	(revision 14585)
@@ -0,0 +1,734 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// | include                                                               |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_notification_by_mail.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// | Initialization                                                        |
+// +-----------------------------------------------------------------------+
+$base_url = get_root_url().'admin.php';
+$must_repost = false;
+
+// +-----------------------------------------------------------------------+
+// | functions                                                             |
+// +-----------------------------------------------------------------------+
+
+/*
+ * Do timeout treatment in order to finish to send mails
+ *
+ * @param $post_keyname: key of check_key post array
+ * @param check_key_treated: array of check_key treated
+ * @return none
+ */
+function do_timeout_treatment($post_keyname, $check_key_treated = array())
+{
+  global $env_nbm, $base_url, $page, $must_repost;
+
+  if ($env_nbm['is_sendmail_timeout'])
+  {
+    if (isset($_POST[$post_keyname]))
+    {
+      $post_count = count($_POST[$post_keyname]);
+      $treated_count = count($check_key_treated);
+      if ($treated_count != 0)
+      {
+        $time_refresh = ceil((get_moment() - $env_nbm['start_time']) * $post_count / $treated_count);
+      }
+      else
+      {
+        $time_refresh = 0;
+      }
+      $_POST[$post_keyname] = array_diff($_POST[$post_keyname], $check_key_treated);
+
+      $must_repost = true;
+      array_push($page['errors'],
+        l10n_dec('Execution time is out, treatment must be continue [Estimated time: %d second].',
+                 'Execution time is out, treatment must be continue [Estimated time: %d seconds].',
+                  $time_refresh));
+    }
+  }
+
+}
+
+/*
+ * Get the authorized_status for each tab
+ * return corresponding status
+ */
+function get_tab_status($mode)
+{
+  $result = ACCESS_WEBMASTER;
+  switch ($mode)
+  {
+    case 'param':
+    case 'subscribe':
+      $result = ACCESS_WEBMASTER;
+      break;
+    case 'send':
+      $result = ACCESS_ADMINISTRATOR;
+      break;
+    default:
+      $result = ACCESS_WEBMASTER;
+      break;
+  }
+  return $result;
+}
+
+/*
+ * Inserting News users
+ */
+function insert_new_data_user_mail_notification()
+{
+  global $conf, $page, $env_nbm;
+
+  // Set null mail_address empty
+  $query = '
+update
+  '.USERS_TABLE.'
+set
+  '.$conf['user_fields']['email'].' = null
+where
+  trim('.$conf['user_fields']['email'].') = \'\';';
+  pwg_query($query);
+
+  // null mail_address are not selected in the list
+  $query = '
+select
+  u.'.$conf['user_fields']['id'].' as user_id,
+  u.'.$conf['user_fields']['username'].' as username,
+  u.'.$conf['user_fields']['email'].' as mail_address
+from
+  '.USERS_TABLE.' as u left join '.USER_MAIL_NOTIFICATION_TABLE.' as m on u.'.$conf['user_fields']['id'].' = m.user_id
+where
+  u.'.$conf['user_fields']['email'].' is not null and
+  m.user_id is null
+order by
+  user_id;';
+
+  $result = pwg_query($query);
+
+  if (pwg_db_num_rows($result) > 0)
+  {
+    $inserts = array();
+    $check_key_list = array();
+
+    while ($nbm_user = pwg_db_fetch_assoc($result))
+    {
+      // Calculate key
+      $nbm_user['check_key'] = find_available_check_key();
+
+      // Save key
+      array_push($check_key_list, $nbm_user['check_key']);
+
+      // Insert new nbm_users
+      array_push
+      (
+        $inserts,
+        array
+        (
+          'user_id' => $nbm_user['user_id'],
+          'check_key' => $nbm_user['check_key'],
+          'enabled' => 'false' // By default if false, set to true with specific functions
+        )
+      );
+
+      array_push
+      (
+        $page['infos'],
+        sprintf(
+          l10n('User %s [%s] added.'),
+          stripslashes($nbm_user['username']),
+          get_email_address_as_display_text($nbm_user['mail_address'])
+        )
+      );
+    }
+
+    // Insert new nbm_users
+    mass_inserts(USER_MAIL_NOTIFICATION_TABLE, array('user_id', 'check_key', 'enabled'), $inserts);
+    // Update field enabled with specific function
+    $check_key_treated = do_subscribe_unsubscribe_notification_by_mail
+    (
+      true,
+      $conf['nbm_default_value_user_enabled'],
+      $check_key_list
+    );
+
+     // On timeout simulate like tabsheet send
+    if ($env_nbm['is_sendmail_timeout'])
+    {
+      $quoted_check_key_list = quote_check_key_list(array_diff($check_key_list, $check_key_treated));
+      if (count($quoted_check_key_list) != 0 )
+      {
+        $query = 'delete from '.USER_MAIL_NOTIFICATION_TABLE.' where check_key in ('.implode(",", $quoted_check_key_list).');';
+        $result = pwg_query($query);
+
+        redirect($base_url.get_query_string_diff(array(), false), l10n('Operation in progress')."\n".l10n('Please wait...'));
+      }
+    }
+  }
+}
+
+/*
+ * Apply global functions to mail content
+ * return customize mail content rendered
+ */
+function render_global_customize_mail_content($customize_mail_content)
+{
+  global $conf;
+
+  if ($conf['nbm_send_html_mail'] and !(strpos($customize_mail_content, '<') === 0))
+  {
+    // On HTML mail, detects if the content are HTML format.
+    // If it's plain text format, convert content to readable HTML
+    return nl2br(htmlspecialchars($customize_mail_content));
+  }
+  else
+  {
+    return $customize_mail_content;
+  }
+}
+
+/*
+ * Send mail for notification to all users
+ * Return list of "selected" users for 'list_to_send'
+ * Return list of "treated" check_key for 'send'
+ */
+function do_action_send_mail_notification($action = 'list_to_send', $check_key_list = array(), $customize_mail_content = '')
+{
+  global $conf, $page, $user, $lang_info, $lang, $env_nbm;
+  $return_list = array();
+
+  if (in_array($action, array('list_to_send', 'send')))
+  {
+    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+
+    $is_action_send = ($action == 'send');
+
+    // disabled and null mail_address are not selected in the list
+    $data_users = get_user_notifications('send', $check_key_list);
+
+    // List all if it's define on options or on timeout
+    $is_list_all_without_test = ($env_nbm['is_sendmail_timeout'] or $conf['nbm_list_all_enabled_users_to_send']);
+
+    // Check if exist news to list user or send mails
+    if ((!$is_list_all_without_test) or ($is_action_send))
+    {
+      if (count($data_users) > 0)
+      {
+        $datas = array();
+
+        if (!isset($customize_mail_content))
+        {
+          $customize_mail_content = $conf['nbm_complementary_mail_content'];
+        }
+
+        $customize_mail_content = 
+          trigger_event('nbm_render_global_customize_mail_content', $customize_mail_content);
+
+
+        // Prepare message after change language
+        if ($is_action_send)
+        {
+          $msg_break_timeout = l10n('Time to send mail is limited. Others mails are skipped.');
+        }
+        else
+        {
+          $msg_break_timeout = l10n('Prepared time for list of users to send mail is limited. Others users are not listed.');
+        }
+
+        // Begin nbm users environment
+        begin_users_env_nbm($is_action_send);
+
+        foreach ($data_users as $nbm_user)
+        {
+          if ((!$is_action_send) and check_sendmail_timeout())
+          {
+            // Stop fill list on 'list_to_send', if the quota is override
+            array_push($page['infos'], $msg_break_timeout);
+            break;
+          }
+          if (($is_action_send) and check_sendmail_timeout())
+          {
+            // Stop fill list on 'send', if the quota is override
+            array_push($page['errors'], $msg_break_timeout);
+            break;
+          }
+
+          // set env nbm user
+          set_user_on_env_nbm($nbm_user, $is_action_send);
+
+          if ($is_action_send)
+          {
+            set_make_full_url();
+            // Fill return list of "treated" check_key for 'send'
+            array_push($return_list, $nbm_user['check_key']);
+
+            if ($conf['nbm_send_detailed_content'])
+            {
+               $news = news($nbm_user['last_send'], $dbnow, false, $conf['nbm_send_html_mail']);
+               $exist_data = count($news) > 0;
+            }
+            else
+            {
+              $exist_data = news_exists($nbm_user['last_send'], $dbnow);
+            }
+
+            if ($exist_data)
+            {
+              $subject = '['.$conf['gallery_title'].']: '.l10n('New photos added');
+
+              // Assign current var for nbm mail
+              assign_vars_nbm_mail_content($nbm_user);
+
+              if (!is_null($nbm_user['last_send']))
+              {
+                $env_nbm['mail_template']->assign
+                (
+                  'content_new_elements_between',
+                  array
+                  (
+                    'DATE_BETWEEN_1' => $nbm_user['last_send'],
+                    'DATE_BETWEEN_2' => $dbnow,
+                  )
+                );
+              }
+              else
+              {
+                $env_nbm['mail_template']->assign
+                (
+                  'content_new_elements_single',
+                  array
+                  (
+                    'DATE_SINGLE' => $dbnow,
+                  )
+                );
+              }
+
+              if ($conf['nbm_send_detailed_content'])
+              {
+                $env_nbm['mail_template']->assign('global_new_lines', $news);
+              }
+
+              $nbm_user_customize_mail_content = 
+                trigger_event('nbm_render_user_customize_mail_content',
+                  $customize_mail_content, $nbm_user);
+              if (!empty($nbm_user_customize_mail_content))
+              {
+                $env_nbm['mail_template']->assign
+                (
+                  'custom_mail_content', $nbm_user_customize_mail_content
+                );
+              }
+
+              if ($conf['nbm_send_html_mail'] and $conf['nbm_send_recent_post_dates'])
+              {
+                $recent_post_dates = get_recent_post_dates_array(
+                  $conf['recent_post_dates']['NBM']);
+                foreach ($recent_post_dates as $date_detail)
+                {
+                  $env_nbm['mail_template']->append
+                  (
+                    'recent_posts',
+                    array
+                    (
+                      'TITLE' => get_title_recent_post_date($date_detail),
+                      'HTML_DATA' => get_html_description_recent_post_date($date_detail)
+                    )
+                  );
+                }
+              }
+
+              $env_nbm['mail_template']->assign
+              (
+                array
+                (
+                  'GOTO_GALLERY_TITLE' => $conf['gallery_title'],
+                  'GOTO_GALLERY_URL' => get_gallery_home_url(),
+                  'SEND_AS_NAME'      => $env_nbm['send_as_name'],
+                )
+              );
+
+              if (pwg_mail
+                  (
+                    format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
+                    array
+                    (
+                      'from' => $env_nbm['send_as_mail_formated'],
+                      'subject' => $subject,
+                      'email_format' => $env_nbm['email_format'],
+                      'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
+                      'content_format' => $env_nbm['email_format'],
+                      'theme' => $nbm_user['theme']
+                    )
+                  ))
+              {
+                inc_mail_sent_success($nbm_user);
+
+                $data = array('user_id' => $nbm_user['user_id'],
+                              'last_send' => $dbnow);
+                array_push($datas, $data);
+              }
+              else
+              {
+                inc_mail_sent_failed($nbm_user);
+              }
+
+              unset_make_full_url();
+            }
+          }
+          else
+          {
+            if (news_exists($nbm_user['last_send'], $dbnow))
+            {
+              // Fill return list of "selected" users for 'list_to_send'
+              array_push($return_list, $nbm_user);
+            }
+          }
+
+          // unset env nbm user
+          unset_user_on_env_nbm();
+        }
+
+        // Restore nbm environment
+        end_users_env_nbm();
+
+        if ($is_action_send)
+        {
+          mass_updates(
+            USER_MAIL_NOTIFICATION_TABLE,
+            array(
+              'primary' => array('user_id'),
+              'update' => array('last_send')
+             ),
+             $datas
+             );
+
+          display_counter_info();
+        }
+      }
+      else
+      {
+        if ($is_action_send)
+        {
+          array_push($page['errors'], l10n('No user to send notifications by mail.'));
+        }
+      }
+    }
+    else
+    {
+      // Quick List, don't check news
+      // Fill return list of "selected" users for 'list_to_send'
+      $return_list = $data_users;
+    }
+  }
+
+  // Return list of "selected" users for 'list_to_send'
+  // Return list of "treated" check_key for 'send'
+  return $return_list;
+}
+
+// +-----------------------------------------------------------------------+
+// | Main                                                                  |
+// +-----------------------------------------------------------------------+
+if (!isset($_GET['mode']))
+{
+  $page['mode'] = 'send';
+}
+else
+{
+  $page['mode'] = $_GET['mode'];
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(get_tab_status($page['mode']));
+
+
+// +-----------------------------------------------------------------------+
+// | Add event handler                                                     |
+// +-----------------------------------------------------------------------+
+add_event_handler('nbm_render_global_customize_mail_content', 'render_global_customize_mail_content');
+trigger_action('nbm_event_handler_added');
+
+
+// +-----------------------------------------------------------------------+
+// | Insert new users with mails                                           |
+// +-----------------------------------------------------------------------+
+if (!isset($_POST) or (count($_POST) ==0))
+{
+  // No insert data in post mode
+  insert_new_data_user_mail_notification();
+}
+
+// +-----------------------------------------------------------------------+
+// | Treatment of tab post                                                 |
+// +-----------------------------------------------------------------------+
+switch ($page['mode'])
+{
+  case 'param' :
+  {
+    if (isset($_POST['param_submit']))
+    {
+      $updated_param_count = 0;
+      // Update param
+      $result = pwg_query('select param, value from '.CONFIG_TABLE.' where param like \'nbm\\_%\'');
+      while ($nbm_user = pwg_db_fetch_assoc($result))
+      {
+        if (isset($_POST[$nbm_user['param']]))
+        {
+          $value = $_POST[$nbm_user['param']];
+
+          $query = '
+update
+'.CONFIG_TABLE.'
+set
+  value = \''. str_replace("\'", "''", $value).'\'
+where
+  param = \''.$nbm_user['param'].'\';';
+          pwg_query($query);
+          $updated_param_count += 1;
+        }
+      }
+
+      array_push($page['infos'],
+        l10n_dec('%d parameter was updated.', '%d parameters were updated.',
+          $updated_param_count));
+
+      // Reload conf with new values
+      load_conf_from_db('param like \'nbm\\_%\'');
+    }
+  }
+  case 'subscribe' :
+  {
+    if (isset($_POST['falsify']) and isset($_POST['cat_true']))
+    {
+      $check_key_treated = unsubscribe_notification_by_mail(true, $_POST['cat_true']);
+      do_timeout_treatment('cat_true', $check_key_treated);
+    }
+    else
+    if (isset($_POST['trueify']) and isset($_POST['cat_false']))
+    {
+      $check_key_treated = subscribe_notification_by_mail(true, $_POST['cat_false']);
+      do_timeout_treatment('cat_false', $check_key_treated);
+    }
+    break;
+  }
+
+  case 'send' :
+  {
+    if (isset($_POST['send_submit']) and isset($_POST['send_selection']) and isset($_POST['send_customize_mail_content']))
+    {
+      $check_key_treated = do_action_send_mail_notification('send', $_POST['send_selection'], stripslashes($_POST['send_customize_mail_content']));
+      do_timeout_treatment('send_selection', $check_key_treated);
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | template initialization                                               |
+// +-----------------------------------------------------------------------+
+$template->set_filenames
+(
+  array
+  (
+    'double_select' => 'double_select.tpl',
+    'notification_by_mail'=>'notification_by_mail.tpl'
+  )
+);
+
+$template->assign
+(
+  array
+  (
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=notification_by_mail',
+    'F_ACTION'=> $base_url.get_query_string_diff(array())
+  )
+);
+
+if (is_autorize_status(ACCESS_WEBMASTER))
+{
+  // TabSheet
+  $tabsheet = new tabsheet();
+  // TabSheet initialization
+  $tabsheet->add('param', l10n('Parameter'),
+    add_url_params($base_url.get_query_string_diff(array('mode', 'select')),
+        array('mode' => 'param')));
+  $tabsheet->add('subscribe', l10n('Subscribe'),
+    add_url_params($base_url.get_query_string_diff(array('mode', 'select')),
+      array('mode' => 'subscribe')));
+  $tabsheet->add('send', l10n('Send'),
+    add_url_params($base_url.get_query_string_diff(array('mode', 'select')),
+      array('mode' => 'send')));
+  // TabSheet selection
+  $tabsheet->select($page['mode']);
+  // Assign tabsheet to template
+  $tabsheet->assign();
+}
+
+if ($must_repost)
+{
+  // Get name of submit button
+  $repost_submit_name = '';
+  if (isset($_POST['falsify']))
+  {
+    $repost_submit_name = 'falsify';
+  }
+  elseif (isset($_POST['trueify']))
+  {
+    $repost_submit_name = 'trueify';
+  }
+  elseif (isset($_POST['send_submit']))
+  {
+    $repost_submit_name = 'send_submit';
+  }
+
+  $template->assign('REPOST_SUBMIT_NAME', $repost_submit_name);
+}
+
+switch ($page['mode'])
+{
+  case 'param' :
+  {
+    $template->assign(
+      $page['mode'],
+      array(
+        'SEND_HTML_MAIL' => $conf['nbm_send_html_mail'],
+        'SEND_MAIL_AS' => $conf['nbm_send_mail_as'],
+        'SEND_DETAILED_CONTENT' => $conf['nbm_send_detailed_content'],
+        'COMPLEMENTARY_MAIL_CONTENT' => $conf['nbm_complementary_mail_content'],
+        'SEND_RECENT_POST_DATES' => $conf['nbm_send_recent_post_dates'],
+        ));
+    break;
+  }
+
+  case 'subscribe' :
+  {
+    $template->assign( $page['mode'], true );
+
+    $template->assign(
+      array(
+        'L_CAT_OPTIONS_TRUE' => l10n('Subscribed'),
+        'L_CAT_OPTIONS_FALSE' => l10n('Unsubscribed')
+        )
+      );
+
+    $data_users = get_user_notifications('subscribe');
+    
+    $opt_true = array();
+    $opt_true_selected = array();
+    $opt_false = array();
+    $opt_false_selected = array();
+    foreach ($data_users as $nbm_user)
+    {
+      if (get_boolean($nbm_user['enabled']))
+      {
+        $opt_true[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
+        if ((isset($_POST['falsify']) and isset($_POST['cat_true']) and in_array($nbm_user['check_key'], $_POST['cat_true'])))
+        {
+          $opt_true_selected[] = $nbm_user['check_key'];
+        }
+      }
+      else
+      {
+        $opt_false[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
+        if (isset($_POST['trueify']) and isset($_POST['cat_false']) and in_array($nbm_user['check_key'], $_POST['cat_false']))
+        {
+          $opt_false_selected[] = $nbm_user['check_key'];
+        }
+      }
+    }
+    $template->assign( array(
+        'category_option_true'          => $opt_true,
+        'category_option_true_selected' => $opt_true_selected,
+        'category_option_false'         => $opt_false,
+        'category_option_false_selected' => $opt_false_selected,
+        )
+    );
+    $template->assign_var_from_handle('DOUBLE_SELECT', 'double_select');
+    break;
+  }
+
+  case 'send' :
+  {
+    $tpl_var = array('users'=> array() );
+
+    $data_users = do_action_send_mail_notification('list_to_send');
+
+    $tpl_var['CUSTOMIZE_MAIL_CONTENT'] = 
+      isset($_POST['send_customize_mail_content']) 
+        ? stripslashes($_POST['send_customize_mail_content']) 
+        : $conf['nbm_complementary_mail_content'];
+
+    if  (count($data_users))
+    {
+      foreach ($data_users as $nbm_user)
+      {
+        if (
+            (!$must_repost) or // Not timeout, normal treatment
+            (($must_repost) and in_array($nbm_user['check_key'], $_POST['send_selection']))  // Must be repost, show only user to send
+            )
+        {
+          $tpl_var['users'][] = 
+            array(
+              'ID' => $nbm_user['check_key'],
+              'CHECKED' =>  ( // not check if not selected,  on init select<all
+                              isset($_POST['send_selection']) and // not init
+                              !in_array($nbm_user['check_key'], $_POST['send_selection']) // not selected
+                            )   ? '' : 'checked="checked"',
+              'USERNAME'=> stripslashes($nbm_user['username']),
+              'EMAIL' => get_email_address_as_display_text($nbm_user['mail_address']),
+              'LAST_SEND'=> $nbm_user['last_send']
+              );
+        }
+      }
+    }
+    $template->assign($page['mode'], $tpl_var);
+    break;
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | Sending html code                                                     |
+// +-----------------------------------------------------------------------+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'notification_by_mail');
+
+?>
Index: tags/2.4.0RC3/admin/permalinks.php
===================================================================
--- tags/2.4.0RC3/admin/permalinks.php	(revision 14585)
+++ tags/2.4.0RC3/admin/permalinks.php	(revision 14585)
@@ -0,0 +1,187 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function parse_sort_variables(
+    $sortable_by, $default_field,
+    $get_param, $get_rejects,
+    $template_var,
+    $anchor = '' )
+{
+  global $template;
+
+  $url_components = parse_url( $_SERVER['REQUEST_URI'] );
+
+  $base_url = $url_components['path'];
+
+  parse_str($url_components['query'], $vars);
+  $is_first = true;
+  foreach ($vars as $key => $value)
+  {
+    if (!in_array($key, $get_rejects) and $key!=$get_param)
+    {
+      $base_url .= $is_first ? '?' : '&amp;';
+      $is_first = false;
+      $base_url .= $key.'='.urlencode($value);
+    }
+  }
+
+  $ret = array();
+  foreach( $sortable_by as $field)
+  {
+    $url = $base_url;
+    $disp = '↓'; // TODO: an small image is better
+
+    if ( $field !== @$_GET[$get_param] )
+    {
+      if ( !isset($default_field) or $default_field!=$field )
+      { // the first should be the default
+        $url = add_url_params($url, array($get_param=>$field) );
+      }
+      elseif (isset($default_field) and !isset($_GET[$get_param]) )
+      {
+        array_push($ret, $field);
+        $disp = '<em>'.$disp.'</em>';
+      }
+    }
+    else
+    {
+      array_push($ret, $field);
+      $disp = '<em>'.$disp.'</em>';
+    }
+    if ( isset($template_var) )
+    {
+      $template->assign( $template_var.strtoupper($field),
+            '<a href="'.$url.$anchor.'" title="'.l10n('Sort order').'">'.$disp.'</a>'
+         );
+    }
+  }
+  return $ret;
+}
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_permalinks.php');
+
+$selected_cat = array();
+if ( isset($_POST['set_permalink']) and $_POST['cat_id']>0 )
+{
+  $permalink = $_POST['permalink'];
+  if ( empty($permalink) )
+    delete_cat_permalink($_POST['cat_id'], isset($_POST['save']) );
+  else
+    set_cat_permalink($_POST['cat_id'], $permalink, isset($_POST['save']) );
+  $selected_cat = array( $_POST['cat_id'] );
+}
+elseif ( isset($_GET['delete_permanent']) )
+{
+  $query = '
+DELETE FROM '.OLD_PERMALINKS_TABLE.'
+  WHERE permalink=\''.$_GET['delete_permanent'].'\'
+  LIMIT 1';
+  $result = pwg_query($query);
+  if (pwg_db_changes($result)==0)
+    array_push($page['errors'], l10n('Cannot delete the old permalink !'));
+}
+
+
+$template->set_filename('permalinks', 'permalinks.tpl' );
+
+// +-----------------------------------------------------------------------+
+// | tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+$page['tab'] = 'permalinks';
+include(PHPWG_ROOT_PATH.'admin/include/albums_tab.inc.php');
+
+
+$query = '
+SELECT
+  id, permalink,
+  '.pwg_db_concat(array('id', '\' - \'', 'name')).' AS name,
+  uppercats, global_rank
+FROM '.CATEGORIES_TABLE;
+
+display_select_cat_wrapper( $query, $selected_cat, 'categories', false );
+
+
+// --- generate display of active permalinks -----------------------------------
+$sort_by = parse_sort_variables(
+    array('id', 'name', 'permalink'), 'name',
+    'psf',
+    array('delete_permanent'),
+    'SORT_' );
+
+$query = '
+SELECT id, permalink, uppercats, global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE permalink IS NOT NULL
+';
+if ( $sort_by[0]=='id' or $sort_by[0]=='permalink' )
+{
+  $query .= ' ORDER BY '.$sort_by[0];
+}
+$categories=array();
+$result=pwg_query($query);
+while ( $row = pwg_db_fetch_assoc($result) )
+{
+  $row['name'] = get_cat_display_name_cache( $row['uppercats'] );
+  $categories[] = $row;
+}
+
+if ( $sort_by[0]=='name')
+{
+  usort($categories, 'global_rank_compare');
+}
+$template->assign( 'permalinks', $categories );
+
+// --- generate display of old permalinks --------------------------------------
+
+$sort_by = parse_sort_variables(
+    array('cat_id','permalink','date_deleted','last_hit','hit'), null,
+    'dpsf',
+    array('delete_permanent'),
+    'SORT_OLD_', '#old_permalinks' );
+
+$url_del_base = get_root_url().'admin.php?page=permalinks';
+$query = 'SELECT * FROM '.OLD_PERMALINKS_TABLE;
+if ( count($sort_by) )
+{
+  $query .= ' ORDER BY '.$sort_by[0];
+}
+$result = pwg_query($query);
+$deleted_permalinks=array();
+while ( $row = pwg_db_fetch_assoc($result) )
+{
+  $row['name'] = get_cat_display_name_cache($row['cat_id']);
+  $row['U_DELETE'] =
+      add_url_params(
+        $url_del_base,
+        array( 'delete_permanent'=> $row['permalink'] )
+      );
+  $deleted_permalinks[] = $row;
+}
+$template->assign('deleted_permalinks', $deleted_permalinks);
+$template->assign('U_HELP', get_root_url().'admin/popuphelp.php?page=permalinks');
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'permalinks');
+?>
Index: tags/2.4.0RC3/admin/photo.php
===================================================================
--- tags/2.4.0RC3/admin/photo.php	(revision 14585)
+++ tags/2.4.0RC3/admin/photo.php	(revision 14585)
@@ -0,0 +1,86 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+// +-----------------------------------------------------------------------+
+// | Basic checks                                                          |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+check_input_parameter('cat_id', $_GET, false, PATTERN_ID);
+check_input_parameter('image_id', $_GET, false, PATTERN_ID);
+
+$admin_photo_base_url = get_root_url().'admin.php?page=photo-'.$_GET['image_id'];
+
+if (isset($_GET['cat_id']))
+{
+  $query = '
+SELECT *
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$_GET['cat_id'].'
+;';
+  $category = pwg_db_fetch_assoc(pwg_query($query));
+}
+
+// +-----------------------------------------------------------------------+
+// | Tabs                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$page['tab'] = 'properties';
+
+if (isset($_GET['tab']))
+{
+  $page['tab'] = $_GET['tab'];
+}
+
+$tabsheet = new tabsheet();
+$tabsheet->add('properties', l10n('Properties'), $admin_photo_base_url.'-properties');
+$tabsheet->add('coi', l10n('Center of interest'), $admin_photo_base_url.'-coi');
+
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// | Load the tab                                                          |
+// +-----------------------------------------------------------------------+
+
+if ('properties' == $page['tab'])
+{
+  include(PHPWG_ROOT_PATH.'admin/picture_modify.php');
+}
+elseif ('coi' == $page['tab'])
+{
+  include(PHPWG_ROOT_PATH.'admin/picture_coi.php');
+}
+else
+{
+  include(PHPWG_ROOT_PATH.'admin/photo_'.$page['tab'].'.php');
+}
+?>
Index: tags/2.4.0RC3/admin/photos_add.php
===================================================================
--- tags/2.4.0RC3/admin/photos_add.php	(revision 14585)
+++ tags/2.4.0RC3/admin/photos_add.php	(revision 14585)
@@ -0,0 +1,116 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/image.class.php');
+
+define(
+  'PHOTOS_ADD_BASE_URL',
+  get_root_url().'admin.php?page=photos_add'
+  );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                          Load configuration                           |
+// +-----------------------------------------------------------------------+
+
+$upload_form_config = get_upload_form_config();
+
+// +-----------------------------------------------------------------------+
+// |                                 Tabs                                  |
+// +-----------------------------------------------------------------------+
+
+$tabs = array(
+  array(
+    'code' => 'direct',
+    'label' => l10n('Web Form'),
+    ),
+  array(
+    'code' => 'applications',
+    'label' => l10n('Applications'),
+    ),
+  );
+
+if ($conf['enable_synchronization'])
+{
+  array_push(
+    $tabs,
+    array(
+      'code' => 'ftp',
+      'label' => l10n('FTP + Synchronization'),
+      )
+    );
+}
+
+$tab_codes = array_map(
+  create_function('$a', 'return $a["code"];'),
+  $tabs
+  );
+
+if (isset($_GET['section']) and in_array($_GET['section'], $tab_codes))
+{
+  $page['tab'] = $_GET['section'];
+}
+else
+{
+  $page['tab'] = $tabs[0]['code'];
+}
+
+$tabsheet = new tabsheet();
+foreach ($tabs as $tab)
+{
+  $tabsheet->add(
+    $tab['code'],
+    $tab['label'],
+    PHOTOS_ADD_BASE_URL.'&amp;section='.$tab['code']
+    );
+}
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array(
+    'photos_add' => 'photos_add_'.$page['tab'].'.tpl'
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                             Load the tab                              |
+// +-----------------------------------------------------------------------+
+
+include(PHPWG_ROOT_PATH.'admin/photos_add_'.$page['tab'].'.php');
+?>
Index: tags/2.4.0RC3/admin/photos_add_applications.php
===================================================================
--- tags/2.4.0RC3/admin/photos_add_applications.php	(revision 14585)
+++ tags/2.4.0RC3/admin/photos_add_applications.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHOTOS_ADD_BASE_URL'))
+{
+  die ("Hacking attempt!");
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->assign(
+    array(
+      'URL_DOWNLOAD_WINDOWS' => $conf['ploader_download_windows'],
+      'URL_DOWNLOAD_MAC' => $conf['ploader_download_mac'],
+      'URL_DOWNLOAD_LINUX' => $conf['ploader_download_linux'],
+    )
+  );
+
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'photos_add');
+?>
Index: tags/2.4.0RC3/admin/photos_add_direct.php
===================================================================
--- tags/2.4.0RC3/admin/photos_add_direct.php	(revision 14585)
+++ tags/2.4.0RC3/admin/photos_add_direct.php	(revision 14585)
@@ -0,0 +1,80 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHOTOS_ADD_BASE_URL'))
+{
+  die ("Hacking attempt!");
+}
+
+// +-----------------------------------------------------------------------+
+// |                        batch management request                       |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['batch']))
+{
+  check_input_parameter('batch', $_GET, false, '/^\d+(,\d+)*$/');
+
+  $query = '
+DELETE FROM '.CADDIE_TABLE.'
+  WHERE user_id = '.$user['id'].'
+;';
+  pwg_query($query);
+
+  $inserts = array();
+  foreach (explode(',', $_GET['batch']) as $image_id)
+  {
+    array_push(
+      $inserts,
+      array(
+        'user_id' => $user['id'],
+        'element_id' => $image_id,
+        )
+      );
+  }
+  mass_inserts(
+    CADDIE_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+
+  redirect(get_root_url().'admin.php?page=batch_manager&cat=caddie');
+}
+
+// +-----------------------------------------------------------------------+
+// |                             process form                              |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/photos_add_direct_process.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                             prepare form                              |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/photos_add_direct_prepare.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'photos_add');
+?>
Index: tags/2.4.0RC3/admin/photos_add_ftp.php
===================================================================
--- tags/2.4.0RC3/admin/photos_add_ftp.php	(revision 14585)
+++ tags/2.4.0RC3/admin/photos_add_ftp.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHOTOS_ADD_BASE_URL'))
+{
+  die ("Hacking attempt!");
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->assign(
+  'FTP_HELP_CONTENT',
+  load_language(
+    'help/photos_add_ftp.html',
+    '',
+    array('return'=>true)
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'photos_add');
+?>
Index: tags/2.4.0RC3/admin/picture_coi.php
===================================================================
--- tags/2.4.0RC3/admin/picture_coi.php	(revision 14585)
+++ tags/2.4.0RC3/admin/picture_coi.php	(revision 14585)
@@ -0,0 +1,113 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if(!defined("PHPWG_ROOT_PATH"))
+{
+  die('Hacking attempt!');
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+check_input_parameter('image_id', $_GET, false, PATTERN_ID);
+
+if (isset($_POST['submit']))
+{
+  $query = 'UPDATE '.IMAGES_TABLE;
+  if (strlen($_POST['l'])==0)
+  {
+    $query .= ' SET coi=NULL';
+  }
+  else
+  {
+    $coi = fraction_to_char($_POST['l'])
+      .fraction_to_char($_POST['t'])
+      .fraction_to_char($_POST['r'])
+      .fraction_to_char($_POST['b']);
+    $query .= ' SET coi=\''.$coi.'\'';
+  }
+  $query .= ' WHERE id='.$_GET['image_id'];
+  pwg_query($query);
+}
+
+$query = 'SELECT * FROM '.IMAGES_TABLE.' WHERE id='.$_GET['image_id'];
+$row = pwg_db_fetch_assoc( pwg_query($query) );
+
+if (isset($_POST['submit']))
+{
+  foreach(ImageStdParams::get_defined_type_map() as $params)
+  {
+    if ($params->sizing->max_crop != 0)
+    {
+      delete_element_derivatives($row, $params->type);
+    }
+  }
+  delete_element_derivatives($row, IMG_CUSTOM);
+  $uid = '&b='.time();
+  $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
+  if ($conf['derivative_url_style']==1)
+  {
+    $conf['derivative_url_style']=0; //auto
+  }
+}
+else
+{
+  $uid = '';
+}
+
+$tpl_var = array(
+  'TITLE' => render_element_name($row),
+  'ALT' => $row['file'],
+  'U_IMG' => DerivativeImage::url(IMG_LARGE, $row),
+  );
+
+if (!empty($row['coi']))
+{
+  $tpl_var['coi'] = array(
+    'l'=> char_to_fraction($row['coi'][0]),
+    't'=> char_to_fraction($row['coi'][1]),
+    'r'=> char_to_fraction($row['coi'][2]),
+    'b'=> char_to_fraction($row['coi'][3]),
+  );
+}
+
+foreach(ImageStdParams::get_defined_type_map() as $params)
+{
+  if ($params->sizing->max_crop != 0)
+  {
+    $derivative = new DerivativeImage($params, new SrcImage($row) );
+    $template->append( 'cropped_derivatives', array( 
+      'U_IMG' => $derivative->get_url().$uid,
+      'HTM_SIZE' => $derivative->get_size_htm(),
+    ) );
+  }
+}
+
+
+$template->assign($tpl_var);
+$template->set_filename('picture_coi', 'picture_coi.tpl');
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'picture_coi');
+?>
Index: tags/2.4.0RC3/admin/picture_modify.php
===================================================================
--- tags/2.4.0RC3/admin/picture_modify.php	(revision 14585)
+++ tags/2.4.0RC3/admin/picture_modify.php	(revision 14585)
@@ -0,0 +1,475 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if(!defined("PHPWG_ROOT_PATH"))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+check_input_parameter('image_id', $_GET, false, PATTERN_ID);
+check_input_parameter('cat_id', $_GET, false, PATTERN_ID);
+
+// represent
+$query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE representative_picture_id = '.$_GET['image_id'].'
+;';
+$represent_options_selected = array_from_query($query, 'id');
+
+// +-----------------------------------------------------------------------+
+// |                             delete photo                              |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['delete']))
+{
+  check_pwg_token();
+
+  delete_elements(array($_GET['image_id']), true);
+
+  // where to redirect the user now?
+  //
+  // 1. if a category is available in the URL, use it
+  // 2. else use the first reachable linked category
+  // 3. redirect to gallery root
+
+  if (isset($_GET['cat_id']) and !empty($_GET['cat_id']))
+  {
+    redirect(
+      make_index_url(
+        array(
+          'category' => get_cat_info($_GET['cat_id'])
+          )
+        )
+      );
+  }
+
+  $query = '
+SELECT category_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id = '.$_GET['image_id'].'
+;';
+
+  $authorizeds = array_diff(
+    array_from_query($query, 'category_id'),
+    explode(',', calculate_permissions($user['id'], $user['status']))
+    );
+  
+  foreach ($authorizeds as $category_id)
+  {
+    redirect(
+      make_index_url(
+        array(
+          'category' => get_cat_info($category_id)
+          )
+        )
+      );
+  }
+
+  redirect(make_index_url());
+}
+
+// +-----------------------------------------------------------------------+
+// |                          synchronize metadata                         |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['sync_metadata']))
+{
+  sync_metadata(array( intval($_GET['image_id'])));
+  array_push($page['infos'], l10n('Metadata synchronized from file'));
+}
+
+//--------------------------------------------------------- update informations
+
+// first, we verify whether there is a mistake on the given creation date
+if (isset($_POST['date_creation_action'])
+    and 'set' == $_POST['date_creation_action'])
+{
+  if (!is_numeric($_POST['date_creation_year'])
+    or !checkdate(
+          $_POST['date_creation_month'],
+          $_POST['date_creation_day'],
+          $_POST['date_creation_year'])
+    )
+  {
+    array_push($page['errors'], l10n('wrong date'));
+  }
+}
+
+if (isset($_POST['submit']) and count($page['errors']) == 0)
+{
+  $data = array();
+  $data{'id'} = $_GET['image_id'];
+  $data{'name'} = $_POST['name'];
+  $data{'author'} = $_POST['author'];
+  $data['level'] = $_POST['level'];
+
+  if ($conf['allow_html_descriptions'])
+  {
+    $data{'comment'} = @$_POST['description'];
+  }
+  else
+  {
+    $data{'comment'} = strip_tags(@$_POST['description']);
+  }
+
+  if (!empty($_POST['date_creation_year']))
+  {
+    $data{'date_creation'} =
+      $_POST['date_creation_year']
+      .'-'.$_POST['date_creation_month']
+      .'-'.$_POST['date_creation_day'];
+  }
+  else
+  {
+    $data{'date_creation'} = null;
+  }
+
+  mass_updates(
+    IMAGES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array_diff(array_keys($data), array('id'))
+      ),
+    array($data)
+    );
+
+  // time to deal with tags
+  $tag_ids = array();
+  if (!empty($_POST['tags']))
+  {
+    $tag_ids = get_tag_ids($_POST['tags']);
+  }
+  set_tags($tag_ids, $_GET['image_id']);
+
+  // association to albums
+  move_images_to_categories(array($_GET['image_id']), $_POST['associate']);
+
+  // thumbnail for albums
+  if (!isset($_POST['represent']))
+  {
+    $_POST['represent'] = array();
+  }
+  
+  $no_longer_thumbnail_for = array_diff($represent_options_selected, $_POST['represent']);
+  if (count($no_longer_thumbnail_for) > 0)
+  {
+    set_random_representant($no_longer_thumbnail_for);
+  }
+
+  $new_thumbnail_for = array_diff($_POST['represent'], $represent_options_selected);
+  if (count($new_thumbnail_for) > 0)
+  {
+    $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = '.$_GET['image_id'].'
+  WHERE id IN ('.implode(',', $new_thumbnail_for).')
+;';
+    pwg_query($query);
+  }
+
+  $represent_options_selected = $_POST['represent'];
+  
+  array_push($page['infos'], l10n('Photo informations updated'));
+}
+
+// tags
+$query = '
+SELECT
+    id,
+    name
+  FROM '.IMAGE_TAG_TABLE.' AS it
+    JOIN '.TAGS_TABLE.' AS t ON t.id = it.tag_id
+  WHERE image_id = '.$_GET['image_id'].'
+;';
+$tag_selection = get_taglist($query);
+
+$query = '
+SELECT
+    id,
+    name
+  FROM '.TAGS_TABLE.'
+;';
+$tags = get_taglist($query, false);
+
+// retrieving direct information about picture
+$query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$_GET['image_id'].'
+;';
+$row = pwg_db_fetch_assoc(pwg_query($query));
+
+$storage_category_id = null;
+if (!empty($row['storage_category_id']))
+{
+  $storage_category_id = $row['storage_category_id'];
+}
+
+$image_file = $row['file'];
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array(
+    'picture_modify' => 'picture_modify.tpl'
+    )
+  );
+
+$admin_url_start = $admin_photo_base_url.'-properties';
+$admin_url_start.= isset($_GET['cat_id']) ? '&amp;cat_id='.$_GET['cat_id'] : '';
+
+$template->assign(
+  array(
+    'tag_selection' => $tag_selection,
+    'tags' => $tags,
+    'U_SYNC' => $admin_url_start.'&amp;sync_metadata=1',
+    'U_DELETE' => $admin_url_start.'&amp;delete=1&amp;pwg_token='.get_pwg_token(),
+
+    'PATH'=>$row['path'],
+
+    'TN_SRC' => DerivativeImage::thumb_url($row),
+
+    'NAME' =>
+      isset($_POST['name']) ?
+        stripslashes($_POST['name']) : @$row['name'],
+
+    'TITLE' => render_element_name($row),
+
+    'DIMENSIONS' => @$row['width'].' * '.@$row['height'],
+
+    'FILESIZE' => @$row['filesize'].' KB',
+
+    'REGISTRATION_DATE' => format_date($row['date_available']),
+
+    'AUTHOR' => htmlspecialchars(
+      isset($_POST['author'])
+        ? stripslashes($_POST['author'])
+        : @$row['author']
+      ),
+
+    'DESCRIPTION' =>
+      htmlspecialchars( isset($_POST['description']) ?
+        stripslashes($_POST['description']) : @$row['comment'] ),
+
+    'F_ACTION' =>
+        get_root_url().'admin.php'
+        .get_query_string_diff(array('sync_metadata'))
+    )
+  );
+
+$added_by = 'N/A';
+$query = '
+SELECT '.$conf['user_fields']['username'].' AS username
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['id'].' = '.$row['added_by'].'
+;';
+$result = pwg_query($query);
+while ($user_row = pwg_db_fetch_assoc($result))
+{
+  $row['added_by'] = $user_row['username'];
+}
+
+$intro_vars = array(
+  'file' => sprintf(l10n('Original file : %s'), $row['file']),
+  'add_date' => sprintf(l10n('Posted %s on %s'), time_since($row['date_available'], 'year'), format_date($row['date_available'], false, false)),
+  'added_by' => sprintf(l10n('Added by %s'), $row['added_by']),
+  'size' => $row['width'].'&times;'.$row['height'].' pixels, '.sprintf('%.2f', $row['filesize']/1024).'MB',
+  'stats' => sprintf(l10n('Visited %d times'), $row['hit']),
+  'id' => sprintf(l10n('Numeric identifier : %d'), $row['id']),
+  );
+
+if ($conf['rate'] and !empty($row['rating_score']))
+{
+  $query = '
+SELECT
+    COUNT(*)
+  FROM '.RATE_TABLE.'
+  WHERE element_id = '.$_GET['image_id'].'
+;';
+  list($row['nb_rates']) = pwg_db_fetch_row(pwg_query($query));
+  
+  $intro_vars['stats'].= ', '.sprintf(l10n('Rated %d times, score : %.2f'), $row['nb_rates'], $row['rating_score']);
+}
+
+$template->assign('INTRO', $intro_vars);
+ 
+
+if (in_array(get_extension($row['path']),$conf['picture_ext']))
+{
+  $template->assign('U_COI', get_root_url().'admin.php?page=picture_coi&amp;image_id='.$_GET['image_id']);
+}
+
+// image level options
+$selected_level = isset($_POST['level']) ? $_POST['level'] : $row['level'];
+$template->assign(
+    array(
+      'level_options'=> get_privacy_level_options(),
+      'level_options_selected' => array($selected_level)
+    )
+  );
+
+// creation date
+unset($day, $month, $year);
+
+if (isset($_POST['date_creation_action'])
+    and 'set' == $_POST['date_creation_action'])
+{
+  foreach (array('day', 'month', 'year') as $varname)
+  {
+    $$varname = $_POST['date_creation_'.$varname];
+  }
+}
+else if (isset($row['date_creation']) and !empty($row['date_creation']))
+{
+  list($year, $month, $day) = explode('-', $row['date_creation']);
+}
+else
+{
+  list($year, $month, $day) = array('', 0, 0);
+}
+
+
+$month_list = $lang['month'];
+$month_list[0]='------------';
+ksort($month_list);
+
+$template->assign(
+    array(
+      'DATE_CREATION_DAY_VALUE' => $day,
+      'DATE_CREATION_MONTH_VALUE' => $month,
+      'DATE_CREATION_YEAR_VALUE' => $year,
+      'month_list' => $month_list,
+      )
+    );
+
+$query = '
+SELECT category_id, uppercats
+  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
+    INNER JOIN '.CATEGORIES_TABLE.' AS c
+      ON c.id = ic.category_id
+  WHERE image_id = '.$_GET['image_id'].'
+;';
+$result = pwg_query($query);
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $name =
+    get_cat_display_name_cache(
+      $row['uppercats'],
+      get_root_url().'admin.php?page=album-',
+      false
+      );
+
+  if ($row['category_id'] == $storage_category_id)
+  {
+    $template->assign('STORAGE_CATEGORY', $name);
+  }
+  else
+  {
+    $template->append('related_categories', $name);
+  }
+}
+
+// jump to link
+//
+// 1. find all linked categories that are reachable for the current user.
+// 2. if a category is available in the URL, use it if reachable
+// 3. if URL category not available or reachable, use the first reachable
+//    linked category
+// 4. if no category reachable, no jumpto link
+
+$query = '
+SELECT category_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id = '.$_GET['image_id'].'
+;';
+
+$authorizeds = array_diff(
+  array_from_query($query, 'category_id'),
+  explode(
+    ',',
+    calculate_permissions($user['id'], $user['status'])
+    )
+  );
+
+if (isset($_GET['cat_id'])
+    and in_array($_GET['cat_id'], $authorizeds))
+{
+  $url_img = make_picture_url(
+    array(
+      'image_id' => $_GET['image_id'],
+      'image_file' => $image_file,
+      'category' => $cache['cat_names'][ $_GET['cat_id'] ],
+      )
+    );
+}
+else
+{
+  foreach ($authorizeds as $category)
+  {
+    $url_img = make_picture_url(
+      array(
+        'image_id' => $_GET['image_id'],
+        'image_file' => $image_file,
+        'category' => $cache['cat_names'][ $category ],
+        )
+      );
+    break;
+  }
+}
+
+if (isset($url_img))
+{
+  $template->assign( 'U_JUMPTO', $url_img );
+}
+
+// associate to albums
+$query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = category_id
+  WHERE image_id = '.$_GET['image_id'].'
+;';
+$associate_options_selected = array_from_query($query, 'id');
+
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+display_select_cat_wrapper($query, $associate_options_selected, 'associate_options');
+display_select_cat_wrapper($query, $represent_options_selected, 'represent_options');
+
+//----------------------------------------------------------- sending html code
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'picture_modify');
+?>
Index: tags/2.4.0RC3/admin/plugin.php
===================================================================
--- tags/2.4.0RC3/admin/plugin.php	(revision 14585)
+++ tags/2.4.0RC3/admin/plugin.php	(revision 14585)
@@ -0,0 +1,62 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+check_status(ACCESS_ADMINISTRATOR);
+
+$sections = explode('/', $_GET['section'] );
+for ($i=0; $i<count($sections); $i++)
+{
+  if (empty($sections[$i]) or $sections[$i]=='..')
+  {
+    unset($sections[$i]);
+    $i--;
+  }
+}
+
+if (count($sections)<2)
+{
+  die('Invalid plugin URL');
+}
+
+$plugin_id = $sections[0];
+if ( !isset($pwg_loaded_plugins[$plugin_id]) )
+{
+  die('Invalid URL - plugin '.$plugin_id.' not active');
+}
+
+$filename = PHPWG_PLUGINS_PATH.implode('/', $sections);
+if (is_file($filename))
+{
+  include_once($filename);
+}
+else
+{
+  die('Missing file '.$filename);
+}
+?>
Index: tags/2.4.0RC3/admin/plugins.php
===================================================================
--- tags/2.4.0RC3/admin/plugins.php	(revision 14585)
+++ tags/2.4.0RC3/admin/plugins.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=plugins';
+
+if (isset($_GET['tab']))
+  $page['tab'] = $_GET['tab'];
+else
+  $page['tab'] = 'installed';
+
+$tabsheet = new tabsheet();
+$tabsheet->add('installed', l10n('Plugin list'), $my_base_url.'&amp;tab=installed');
+$tabsheet->add('update', l10n('Check for updates'), $my_base_url.'&amp;tab=update');
+$tabsheet->add('new', l10n('Other plugins'), $my_base_url.'&amp;tab=new');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+if ($page['tab'] == 'update')
+  include(PHPWG_ROOT_PATH.'admin/updates_ext.php');
+else
+  include(PHPWG_ROOT_PATH.'admin/plugins_'.$page['tab'].'.php');
+
+?>
Index: tags/2.4.0RC3/admin/plugins_installed.php
===================================================================
--- tags/2.4.0RC3/admin/plugins_installed.php	(revision 14585)
+++ tags/2.4.0RC3/admin/plugins_installed.php	(revision 14585)
@@ -0,0 +1,212 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+
+$template->set_filenames(array('plugins' => 'plugins_installed.tpl'));
+
+// should we display details on plugins?
+if (isset($_GET['show_details']))
+{
+  if (1 == $_GET['show_details'])
+  {
+    $show_details = true;
+  }
+  else
+  {
+    $show_details = false;
+  }
+
+  pwg_set_session_var('plugins_show_details', $show_details);
+}
+elseif (null != pwg_get_session_var('plugins_show_details'))
+{
+  $show_details = pwg_get_session_var('plugins_show_details');
+}
+else
+{
+  $show_details = false;
+}
+
+$base_url = get_root_url().'admin.php?page='.$page['page'];
+$pwg_token = get_pwg_token();
+$action_url = $base_url.'&amp;plugin='.'%s'.'&amp;pwg_token='.$pwg_token;
+
+$plugins = new plugins();
+
+//--------------------------------------------------perform requested actions
+if (isset($_GET['action']) and isset($_GET['plugin']))
+{
+  if (!is_webmaster())
+  {
+    array_push($page['errors'], l10n('Webmaster status is required.'));
+  }
+  else
+  {
+    check_pwg_token();
+
+    $page['errors'] = $plugins->perform_action($_GET['action'], $_GET['plugin']);
+
+    if (empty($page['errors']))
+    {
+      if ($_GET['action'] == 'activate' or $_GET['action'] == 'deactivate')
+      {
+        $template->delete_compiled_templates();
+      }
+      redirect($base_url);
+    }
+  }
+}
+
+//--------------------------------------------------------Incompatible Plugins
+if (isset($_GET['incompatible_plugins']))
+{
+  $incompatible_plugins = array();
+  foreach ($plugins->get_incompatible_plugins() as $plugin => $version)
+  {
+    if ($plugin == '~~expire~~') continue;
+    array_push($incompatible_plugins, $plugin);
+    
+  }
+  echo json_encode($incompatible_plugins);
+  exit;
+}
+
+// +-----------------------------------------------------------------------+
+// |                     start template output                             |
+// +-----------------------------------------------------------------------+
+
+$plugins->sort_fs_plugins('name');
+$merged_extensions = $plugins->get_merged_extensions();
+$merged_plugins = false;
+$tpl_plugins = array();
+$active_plugins = 0;
+
+foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
+{
+  if (isset($_SESSION['incompatible_plugins'][$plugin_id])
+    and $fs_plugin['version'] != $_SESSION['incompatible_plugins'][$plugin_id])
+  {
+    // Incompatible plugins must be reinitilized
+    unset($_SESSION['incompatible_plugins']);
+  }
+
+  $tpl_plugin = array(
+    'ID' => $plugin_id,
+    'NAME' => $fs_plugin['name'],
+    'VISIT_URL' => $fs_plugin['uri'],
+    'VERSION' => $fs_plugin['version'],
+    'DESC' => $fs_plugin['description'],
+    'AUTHOR' => $fs_plugin['author'],
+    'AUTHOR_URL' => @$fs_plugin['author uri'],
+    'U_ACTION' => sprintf($action_url, $plugin_id),
+    );
+
+  if (isset($plugins->db_plugins_by_id[$plugin_id]))
+  {
+    $tpl_plugin['STATE'] = $plugins->db_plugins_by_id[$plugin_id]['state'];
+  }
+  else
+  {
+    $tpl_plugin['STATE'] = 'inactive';
+  }
+
+  if (isset($fs_plugin['extension']) and isset($merged_extensions[$fs_plugin['extension']]))
+  {
+    // Deactivate manually plugin from database
+    $query = 'UPDATE '.PLUGINS_TABLE.' SET state=\'inactive\' WHERE id=\''.$plugin_id.'\'';
+    pwg_query($query);
+
+    $tpl_plugin['STATE'] = 'merged';
+    $tpl_plugin['DESC'] = l10n('THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.');
+    $merged_plugins = true;
+  }
+  
+  if ($tpl_plugin['STATE'] == 'active')
+  {
+    $active_plugins++;
+  }
+
+  array_push($tpl_plugins, $tpl_plugin);
+}
+
+$template->append('plugin_states', 'active');
+$template->append('plugin_states', 'inactive');
+
+if ($merged_plugins)
+{
+  $template->append('plugin_states', 'merged');
+}
+
+$missing_plugin_ids = array_diff(
+  array_keys($plugins->db_plugins_by_id),
+  array_keys($plugins->fs_plugins)
+  );
+
+if (count($missing_plugin_ids) > 0)
+{
+  foreach($missing_plugin_ids as $plugin_id)
+  {
+    array_push(
+      $tpl_plugins,
+      array(
+        'NAME' => $plugin_id,
+        'VERSION' => $plugins->db_plugins_by_id[$plugin_id]['version'],
+        'DESC' => l10n('ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'),
+        'U_ACTION' => sprintf($action_url, $plugin_id),
+        'STATE' => 'missing',
+        )
+      );
+  }
+  $template->append('plugin_states', 'missing');
+}
+
+// sort plugins by state then by name
+function cmp($a, $b)
+{ 
+  $s = array('merged' => 0, 'missing' => 1, 'active' => 2, 'inactive' => 3);
+  
+  if($a['STATE'] == $b['STATE'])
+    return strcasecmp($a['NAME'], $b['NAME']); 
+  else
+    return $s[$a['STATE']] >= $s[$b['STATE']]; 
+}
+usort($tpl_plugins, 'cmp');
+
+$template->assign(
+  array(
+    'plugins' => $tpl_plugins,
+    'active_plugins' => $active_plugins,
+    'PWG_TOKEN' => $pwg_token,
+    'base_url' => $base_url,
+    'show_details' => $show_details,
+    )
+  );
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'plugins');
+?>
Index: tags/2.4.0RC3/admin/plugins_new.php
===================================================================
--- tags/2.4.0RC3/admin/plugins_new.php	(revision 14585)
+++ tags/2.4.0RC3/admin/plugins_new.php	(revision 14585)
@@ -0,0 +1,142 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+
+$template->set_filenames(array('plugins' => 'plugins_new.tpl'));
+
+$base_url = get_root_url().'admin.php?page='.$page['page'].'&tab='.$page['tab'];
+
+$plugins = new plugins();
+
+//------------------------------------------------------automatic installation
+if (isset($_GET['revision']) and isset($_GET['extension']))
+{
+  if (!is_webmaster())
+  {
+    array_push($page['errors'], l10n('Webmaster status is required.'));
+  }
+  else
+  {
+    check_pwg_token();
+    
+    $install_status = $plugins->extract_plugin_files('install', $_GET['revision'], $_GET['extension']);
+
+    redirect($base_url.'&installstatus='.$install_status);
+  }
+}
+
+//--------------------------------------------------------------install result
+if (isset($_GET['installstatus']))
+{
+  switch ($_GET['installstatus'])
+  {
+    case 'ok':
+      array_push($page['infos'],
+        l10n('Plugin has been successfully copied'),
+        l10n('You might go to plugin list to install and activate it.'));
+      break;
+
+    case 'temp_path_error':
+      array_push($page['errors'], l10n('Can\'t create temporary file.'));
+      break;
+
+    case 'dl_archive_error':
+      array_push($page['errors'], l10n('Can\'t download archive.'));
+      break;
+
+    case 'archive_error':
+      array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+      break;
+
+    default:
+      array_push($page['errors'],
+        sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus'])),
+        l10n('Please check "plugins" folder and sub-folders permissions (CHMOD).'));
+  }  
+}
+
+//---------------------------------------------------------------Order options
+$template->assign('order_options',
+  array(
+    'date' => l10n('Post date'),
+    'revision' => l10n('Last revisions'),
+    'name' => l10n('Name'),
+    'author' => l10n('Author'),
+    'downloads' => l10n('Number of downloads')));
+
+// +-----------------------------------------------------------------------+
+// |                     start template output                             |
+// +-----------------------------------------------------------------------+
+if ($plugins->get_server_plugins(true))
+{
+  /* order plugins */
+  if (pwg_get_session_var('plugins_new_order') != null)
+  {
+    $order_selected = pwg_get_session_var('plugins_new_order');
+    $plugins->sort_server_plugins($order_selected);
+    $template->assign('order_selected', $order_selected);
+  }
+  else
+  {
+    $plugins->sort_server_plugins('date');
+    $template->assign('order_selected', 'date');
+  }
+
+  foreach($plugins->server_plugins as $plugin)
+  {
+    $ext_desc = trim($plugin['extension_description'], " \n\r");
+    list($small_desc) = explode("\n", wordwrap($ext_desc, 200));
+
+    $url_auto_install = htmlentities($base_url)
+      . '&amp;revision=' . $plugin['revision_id']
+      . '&amp;extension=' . $plugin['extension_id']
+      . '&amp;pwg_token='.get_pwg_token()
+    ;
+
+    $template->append('plugins', array(
+      'ID' => $plugin['extension_id'],
+      'EXT_NAME' => $plugin['extension_name'],
+      'EXT_URL' => PEM_URL.'/extension_view.php?eid='.$plugin['extension_id'],
+      'SMALL_DESC' => trim($small_desc, " \r\n"),
+      'BIG_DESC' => $ext_desc,
+      'VERSION' => $plugin['revision_name'],
+      'REVISION_DATE' => preg_replace('/[^0-9]/', '', $plugin['revision_date']),
+      'AUTHOR' => $plugin['author_name'],
+      'DOWNLOADS' => $plugin['extension_nb_downloads'],
+      'URL_INSTALL' => $url_auto_install,
+      'URL_DOWNLOAD' => $plugin['download_url'] . '&amp;origin=piwigo_download'));
+  }
+}
+else
+{
+  array_push($page['errors'], l10n('Can\'t connect to server.'));
+}
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'plugins');
+?>
Index: tags/2.4.0RC3/admin/popuphelp.php
===================================================================
--- tags/2.4.0RC3/admin/popuphelp.php	(revision 14585)
+++ tags/2.4.0RC3/admin/popuphelp.php	(revision 14585)
@@ -0,0 +1,82 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH', '../');
+define('PWG_HELP', true);
+define('IN_ADMIN', true);
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+$page['body_id'] = 'thePopuphelpPage';
+$title = l10n('Piwigo Help');
+$page['page_banner'] = '<h1>'.$title.'</h1>';
+$page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+
+if
+  (
+    isset($_GET['page'])
+    and preg_match('/^[a-z_]*$/', $_GET['page'])
+  )
+{
+  $help_content =
+    load_language('help/'.$_GET['page'].'.html', '', array('return'=>true) );
+
+  if ($help_content == false)
+  {
+    $help_content = '';
+  }
+
+  $help_content = trigger_event(
+    'get_popup_help_content', $help_content, $_GET['page']);
+}
+else
+{
+  die('Hacking attempt!');
+}
+
+$template->set_filename('popuphelp','popuphelp.tpl');
+
+$template->assign(
+  array
+  (
+    'HELP_CONTENT' => $help_content
+  ));
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->pparse('popuphelp');
+
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+
+?>
Index: tags/2.4.0RC3/admin/profile.php
===================================================================
--- tags/2.4.0RC3/admin/profile.php	(revision 14585)
+++ tags/2.4.0RC3/admin/profile.php	(revision 14585)
@@ -0,0 +1,47 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") ) die ("Hacking attempt!");
+
+$edit_user = build_user( $_GET['user_id'], false );
+
+if (!empty($_POST))
+{
+  check_pwg_token();
+}
+
+include_once(PHPWG_ROOT_PATH.'profile.php');
+
+$errors = array();
+save_profile_from_post($edit_user, $errors);
+
+load_profile_in_template(
+  get_root_url().'admin.php?page=profile&amp;user_id='.$edit_user['id'],
+  get_root_url().'admin.php?page=user_list',
+  $edit_user
+  );
+$page['errors'] = array_merge($page['errors'], $errors);
+
+$template->set_filename('profile', 'profile.tpl');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'profile');
+?>
Index: tags/2.4.0RC3/admin/rating.php
===================================================================
--- tags/2.4.0RC3/admin/rating.php	(revision 14585)
+++ tags/2.4.0RC3/admin/rating.php	(revision 14585)
@@ -0,0 +1,268 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+$tabsheet = new tabsheet();
+$tabsheet->add('rating', l10n('Photos'), get_root_url().'admin.php?page=rating');
+$tabsheet->add('rating_user', l10n('Users'), get_root_url().'admin.php?page=rating_user');
+$tabsheet->select('rating');
+$tabsheet->assign();
+
+// +-----------------------------------------------------------------------+
+// |                            initialization                             |
+// +-----------------------------------------------------------------------+
+if (isset($_GET['start']) and is_numeric($_GET['start']))
+{
+  $start = $_GET['start'];
+}
+else
+{
+  $start = 0;
+}
+
+$elements_per_page=10;
+if (isset($_GET['display']) and is_numeric($_GET['display']))
+{
+  $elements_per_page = $_GET['display'];
+}
+
+$order_by_index=0;
+if (isset($_GET['order_by']) and is_numeric($_GET['order_by']))
+{
+  $order_by_index = $_GET['order_by'];
+}
+
+$page['user_filter'] = '';
+if (isset($_GET['users']))
+{
+  if ($_GET['users'] == 'user')
+  {
+    $page['user_filter'] = ' AND r.user_id <> '.$conf['guest_id'];
+  }
+  elseif ($_GET['users'] == 'guest')
+  {
+    $page['user_filter'] = ' AND r.user_id = '.$conf['guest_id'];
+  }
+}
+
+if (isset($_GET['del']))
+{
+  include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+  $del_params = urldecode( $_GET['del'] );
+  parse_str($del_params, $vars);
+  if ( !is_numeric($vars['e']) or !is_numeric($vars['u']) )
+  {
+    die('Hacking attempt');
+  }
+  $query = '
+DELETE FROM '. RATE_TABLE .'
+WHERE element_id=' . $vars['e'] . '
+AND user_id=' . $vars['u'] . '
+AND anonymous_id=\'' . $vars['a'] . '\'
+;';
+  pwg_query($query);
+  update_rating_score( $vars['e'] );
+}
+
+$users = array();
+$query = '
+SELECT '.$conf['user_fields']['username'].' as username, '.$conf['user_fields']['id'].' as id
+  FROM '.USERS_TABLE.'
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $users[$row['id']]=stripslashes($row['username']);
+}
+
+
+$query = 'SELECT COUNT(DISTINCT(r.element_id))
+FROM '.RATE_TABLE.' AS r
+WHERE 1=1'. $page['user_filter'];
+list($nb_images) = pwg_db_fetch_row(pwg_query($query));
+
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filename('rating', 'rating.tpl');
+
+$template->assign(
+  array(
+    'navbar' => create_navigation_bar(
+      PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start','del')),
+      $nb_images,
+      $start,
+      $elements_per_page
+      ),
+    'F_ACTION' => PHPWG_ROOT_PATH.'admin.php',
+    'DISPLAY' => $elements_per_page,
+    'NB_ELEMENTS' => $nb_images,
+    )
+  );
+
+
+
+$available_order_by= array(
+    array(l10n('Rate date'), 'recently_rated DESC'),
+    array(l10n('Rating score'), 'score DESC'),
+    array(l10n('Average rate'), 'avg_rates DESC'),
+    array(l10n('Number of rates'), 'nb_rates DESC'),
+    array(l10n('Sum of rates'), 'sum_rates DESC'),
+    array(l10n('File name'), 'file DESC'),
+    array(l10n('Creation date'), 'date_creation DESC'),
+    array(l10n('Post date'), 'date_available DESC'),
+  );
+
+for ($i=0; $i<count($available_order_by); $i++)
+{
+  $template->append(
+    'order_by_options',
+    $available_order_by[$i][0]
+    );
+}
+$template->assign('order_by_options_selected', array($order_by_index) );
+
+
+$user_options = array(
+  'all'   => l10n('all'),
+  'user'  => l10n('Users'),
+  'guest' => l10n('Guests'),
+  );
+
+$template->assign('user_options', $user_options );
+$template->assign('user_options_selected', array(@$_GET['users']) );
+
+
+$query = '
+SELECT i.id,
+    i.path,
+    i.file,
+    i.representative_ext,
+    i.rating_score       AS score,
+    MAX(r.date)          AS recently_rated,
+    ROUND(AVG(r.rate),2) AS avg_rates,
+    COUNT(r.rate)        AS nb_rates,
+    SUM(r.rate)          AS sum_rates
+  FROM '.RATE_TABLE.' AS r
+    LEFT JOIN '.IMAGES_TABLE.' AS i ON r.element_id = i.id
+  WHERE 1 = 1 ' . $page['user_filter'] . '
+  GROUP BY i.id,
+        i.path,
+        i.file,
+        i.representative_ext,
+        i.rating_score,
+        r.element_id
+  ORDER BY ' . $available_order_by[$order_by_index][1] .'
+  LIMIT '.$elements_per_page.' OFFSET '.$start.'
+;';
+
+$images = array();
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($images, $row);
+}
+
+$template->assign( 'images', array() );
+foreach ($images as $image)
+{
+  $thumbnail_src = DerivativeImage::thumb_url($image);
+
+  $image_url = get_root_url().'admin.php?page=photo-'.$image['id'];
+
+  $query = 'SELECT *
+FROM '.RATE_TABLE.' AS r
+WHERE r.element_id='.$image['id'] . '
+ORDER BY date DESC;';
+  $result = pwg_query($query);
+  $nb_rates = pwg_db_num_rows($result);
+
+  $tpl_image = 
+     array(
+       'U_THUMB' => $thumbnail_src,
+       'U_URL' => $image_url,
+			 'SCORE_RATE' => $image['score'],
+       'AVG_RATE' => $image['avg_rates'],
+       'SUM_RATE' => $image['sum_rates'],
+       'NB_RATES' => (int)$image['nb_rates'],
+       'NB_RATES_TOTAL' => (int)$nb_rates,
+       'FILE' => $image['file'],
+       'rates'  => array()
+   );
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+
+    $url_del = PHPWG_ROOT_PATH.'admin.php'.
+                get_query_string_diff(array('del'));
+
+    $del_param = 'e='.$image['id'].
+                 '&u='.$row['user_id'].
+                 '&a='.$row['anonymous_id'];
+
+    $url_del .= '&amp;del='.urlencode(urlencode($del_param));
+
+    if ( isset($users[$row['user_id']]) )
+    {
+      $user_rate = $users[$row['user_id']];
+    }
+    else
+    {
+      $user_rate = '? '. $row['user_id'];
+    }
+    if ( strlen($row['anonymous_id'])>0 )
+    {
+      $user_rate .= '('.$row['anonymous_id'].')';
+    }
+
+    $tpl_image['rates'][] =
+       array(
+         'DATE' => /*format_date*/($row['date']),
+         'RATE' => $row['rate'],
+         'USER' => $user_rate,
+         'U_DELETE' => $url_del
+     );
+  }
+  $template->append( 'images', $tpl_image );
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'rating');
+?>
Index: tags/2.4.0RC3/admin/rating_user.php
===================================================================
--- tags/2.4.0RC3/admin/rating_user.php	(revision 14585)
+++ tags/2.4.0RC3/admin/rating_user.php	(revision 14585)
@@ -0,0 +1,225 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die ("Hacking attempt!");
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+$tabsheet = new tabsheet();
+$tabsheet->add('rating', l10n('Photos'), get_root_url().'admin.php?page=rating');
+$tabsheet->add('rating_user', l10n('Users'), get_root_url().'admin.php?page=rating_user');
+$tabsheet->select('rating_user');
+$tabsheet->assign();
+
+$filter_min_rates = 2;
+if (isset($_GET['f_min_rates']))
+{
+  $filter_min_rates = (int)$_GET['f_min_rates'];
+}
+
+// build users
+global $conf;
+$query = 'SELECT DISTINCT
+  u.'.$conf['user_fields']['id'].' AS id,
+  u.'.$conf['user_fields']['username'].' AS name,
+  ui.status
+  FROM '.USERS_TABLE.' AS u INNER JOIN '.USER_INFOS_TABLE.' AS ui
+    ON u.'.$conf['user_fields']['id'].' = ui.user_id';
+
+$users_by_id = array();
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $users_by_id[(int)$row['id']] = array(
+    'name' => $row['name'],
+    'anon' => is_autorize_status(ACCESS_CLASSIC, $row['status']) ? false : true
+  );
+}
+
+$by_user_rating_model = array( 'rates' => array() );
+foreach($conf['rate_items'] as $rate)
+{
+  $by_user_rating_model['rates'][$rate] = array();
+}
+
+
+$image_ids = array();
+$by_user_ratings = array();
+$query = '
+SELECT * FROM '.RATE_TABLE.' ORDER by date DESC';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  if (!isset($users_by_id[$row['user_id']]))
+  {
+    $users_by_id[$row['user_id']] = array('name' => '???'.$row['user_id'], 'anon' => false);
+  }
+  $usr = $users_by_id[$row['user_id']];
+  if ($usr['anon'])
+  {
+    $user_key = $usr['name'].'('.$row['anonymous_id'].')';
+  }
+  else
+  {
+    $user_key = $usr['name'];
+  }
+  $rating = & $by_user_ratings[$user_key];
+  if ( is_null($rating) )
+  {
+    $rating = $by_user_rating_model;
+    $rating['uid'] = (int)$row['user_id'];
+    $rating['aid'] = $usr['anon'] ? $row['anonymous_id'] : '';
+  }
+  $rating['rates'][$row['rate']][] = array(
+    'id' => $row['element_id'],
+    'date' => $row['date'],
+  );
+  $image_ids[$row['element_id']] = 1;
+  unset($rating);
+}
+
+// get image tn urls
+$image_urls = array();
+if (count($image_ids) > 0 )
+{
+  $query = 'SELECT id, name, file, path, representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', array_keys($image_ids)).')';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $image_urls[ $row['id'] ] = array(
+      'tn' => DerivativeImage::thumb_url($row),
+      'page' => make_picture_url( array('image_id'=>$row['id'], 'image_file'=>$row['file']) ),
+    );
+  }
+}
+
+$query='SELECT element_id,
+    AVG(rate) AS avg
+  FROM '.RATE_TABLE.'
+  GROUP BY element_id';
+$all_img_sum = array();
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $all_img_sum[(int)$row['element_id']] = array( 'avg'=>(float)$row['avg'] );
+}
+
+foreach($by_user_ratings as $id => &$rating)
+{
+  $c=0; $s=0; $ss=0; $consensus_dev=0;
+  foreach($rating['rates'] as $rate => $rates)
+  {
+    $ct = count($rates);
+    $c += $ct;
+    $s += $ct * $rate;
+    $ss += $ct * $rate * $rate;
+    foreach($rates as $id_date)
+    {
+      $consensus_dev += abs($rate - $all_img_sum[$id_date['id']]['avg']);
+    }
+  }
+
+  $consensus_dev /= $c;
+
+  $var = ($ss - $s*$s/$c)/$c;
+  $rating += array(
+    'id' => $id,
+    'count' => $c,
+    'avg' => $s/$c,
+    'cv'  => $s==0 ? -1 : sqrt($var)/($s/$c), // http://en.wikipedia.org/wiki/Coefficient_of_variation
+    'cd'  => $consensus_dev
+  );
+}
+unset($rating);
+
+// filter
+foreach($by_user_ratings as $id => $rating)
+{
+  if ($rating['count'] <= $filter_min_rates)
+  {
+    unset($by_user_ratings[$id]);
+  }
+}
+
+
+function avg_compare($a, $b)
+{
+  $d = $a['avg'] - $b['avg'];
+  return ($d==0) ? 0 : ($d<0 ? -1 : 1);
+}
+
+function count_compare($a, $b)
+{
+  $d = $a['count'] - $b['count'];
+  return ($d==0) ? 0 : ($d<0 ? -1 : 1);
+}
+
+function cv_compare($a, $b)
+{
+  $d = $b['cv'] - $a['cv']; //desc
+  return ($d==0) ? 0 : ($d<0 ? -1 : 1);
+}
+
+function consensus_dev_compare($a, $b)
+{
+  $d = $b['cd'] - $a['cd']; //desc
+  return ($d==0) ? 0 : ($d<0 ? -1 : 1);
+}
+
+$order_by_index=3;
+if (isset($_GET['order_by']) and is_numeric($_GET['order_by']))
+{
+  $order_by_index = $_GET['order_by'];
+}
+
+$available_order_by= array(
+    array(l10n('Average rate'), 'avg_compare'),
+    array(l10n('Number of rates'), 'count_compare'),
+    array(l10n('Variation'), 'cv_compare'),
+    array(l10n('Consensus deviation'), 'consensus_dev_compare'),
+  );
+
+for ($i=0; $i<count($available_order_by); $i++)
+{
+  $template->append(
+    'order_by_options',
+    $available_order_by[$i][0]
+    );
+}
+$template->assign('order_by_options_selected', array($order_by_index) );
+
+$x = uasort($by_user_ratings, $available_order_by[$order_by_index][1] );
+
+$template->assign( array(
+  'F_ACTION' => get_root_url().'admin.php',
+  'F_MIN_RATES' => $filter_min_rates,
+  'available_rates' => $conf['rate_items'],
+  'ratings' => $by_user_ratings,
+  'image_urls' => $image_urls,
+  'TN_WIDTH' => 28+2*ImageStdParams::get_by_type(IMG_THUMB)->sizing->ideal_size[0],
+  ) );
+$template->set_filename('rating', 'rating_user.tpl');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'rating');
+
+?>
Index: tags/2.4.0RC3/admin/site_manager.php
===================================================================
--- tags/2.4.0RC3/admin/site_manager.php	(revision 14585)
+++ tags/2.4.0RC3/admin/site_manager.php	(revision 14585)
@@ -0,0 +1,186 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!empty($_POST) or isset($_GET['action']))
+{
+  check_pwg_token();
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+$template->set_filenames(array('site_manager'=>'site_manager.tpl'));
+
+// +-----------------------------------------------------------------------+
+// |                        new site creation form                         |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']) and !empty($_POST['galleries_url']))
+{
+  $is_remote = url_is_remote( $_POST['galleries_url'] );
+  if ($is_remote)
+  {
+    fatal_error('remote sites not supported');
+  }
+  $url = preg_replace('/[\/]*$/', '', $_POST['galleries_url']);
+  $url.= '/';
+  if ( ! (strpos($url, '.') === 0 ) )
+  {
+    $url = './' . $url;
+  }
+
+  // site must not exists
+  $query = '
+SELECT COUNT(id) AS count
+  FROM '.SITES_TABLE.'
+  WHERE galleries_url = \''.$url.'\'
+;';
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($row['count'] > 0)
+  {
+    array_push($page['errors'],
+      l10n('This site already exists').' ['.$url.']');
+  }
+  if (count($page['errors']) == 0)
+  {
+    if ( ! file_exists($url) )
+    {
+      array_push($page['errors'],
+        l10n('Directory does not exist').' ['.$url.']');
+    }
+  }
+
+  if (count($page['errors']) == 0)
+  {
+    $query = '
+INSERT INTO '.SITES_TABLE.'
+  (galleries_url)
+  VALUES
+  (\''.$url.'\')
+;';
+    pwg_query($query);
+    array_push($page['infos'],
+               $url.' '.l10n('created'));
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                            actions on site                            |
+// +-----------------------------------------------------------------------+
+if (isset($_GET['site']) and is_numeric($_GET['site']))
+{
+  $page['site'] = $_GET['site'];
+}
+if (isset($_GET['action']) and isset($page['site']))
+{
+  $query = '
+SELECT galleries_url
+  FROM '.SITES_TABLE.'
+  WHERE id = '.$page['site'].'
+;';
+  list($galleries_url) = pwg_db_fetch_row(pwg_query($query));
+  switch($_GET['action'])
+  {
+    case 'delete' :
+    {
+      delete_site($page['site']);
+      array_push($page['infos'],
+                 $galleries_url.' '.l10n('deleted'));
+      break;
+    }
+  }
+}
+
+$template->assign(
+  array(
+    'U_HELP'    => get_root_url().'admin/popuphelp.php?page=site_manager',
+    'F_ACTION'  => get_root_url().'admin.php'.get_query_string_diff(array('action','site','pwg_token')),
+    'PWG_TOKEN' => get_pwg_token(),
+    )
+  );
+
+$query = '
+SELECT c.site_id, COUNT(DISTINCT c.id) AS nb_categories, COUNT(i.id) AS nb_images
+  FROM '.CATEGORIES_TABLE.' AS c LEFT JOIN '.IMAGES_TABLE.' AS i
+  ON c.id=i.storage_category_id 
+  WHERE c.site_id IS NOT NULL
+  GROUP BY c.site_id
+;';
+$sites_detail = hash_from_query($query, 'site_id'); 
+
+$query = '
+SELECT *
+  FROM '.SITES_TABLE.'
+;';
+$result = pwg_query($query);
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $is_remote = url_is_remote($row['galleries_url']);
+  $base_url = PHPWG_ROOT_PATH.'admin.php';
+  $base_url.= '?page=site_manager';
+  $base_url.= '&amp;site='.$row['id'];
+  $base_url.= '&amp;pwg_token='.get_pwg_token();
+  $base_url.= '&amp;action=';
+
+  $update_url = PHPWG_ROOT_PATH.'admin.php';
+  $update_url.= '?page=site_update';
+  $update_url.= '&amp;site='.$row['id'];
+  
+  $tpl_var =
+    array(
+      'NAME' => $row['galleries_url'],
+      'TYPE' => l10n( $is_remote ? 'Remote' : 'Local' ),
+      'CATEGORIES' => (int)@$sites_detail[$row['id']]['nb_categories'],
+      'IMAGES' => (int)@$sites_detail[$row['id']]['nb_images'],
+      'U_SYNCHRONIZE' => $update_url
+     );
+     
+  if ($row['id'] != 1)
+  {
+    $tpl_var['U_DELETE'] = $base_url.'delete';
+  }
+
+  $plugin_links = array();
+  //$plugin_links is array of array composed of U_HREF, U_HINT & U_CAPTION
+  $plugin_links =
+    trigger_event('get_admins_site_links',
+      $plugin_links, $row['id'], $is_remote);
+  $tpl_var['plugin_links'] = $plugin_links;
+
+  $template->append('sites', $tpl_var);
+}
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'site_manager');
+?>
Index: tags/2.4.0RC3/admin/site_reader_local.php
===================================================================
--- tags/2.4.0RC3/admin/site_reader_local.php	(revision 14585)
+++ tags/2.4.0RC3/admin/site_reader_local.php	(revision 14585)
@@ -0,0 +1,190 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// provides data for site synchronization from the local file system
+class LocalSiteReader
+{
+
+var $site_url;
+
+function LocalSiteReader($url)
+{
+  $this->site_url = $url;
+  global $conf;
+  if (!isset($conf['flip_file_ext']))
+  {
+    $conf['flip_file_ext'] = array_flip($conf['file_ext']);
+  }
+  if (!isset($conf['flip_picture_ext']))
+  {
+    $conf['flip_picture_ext'] = array_flip($conf['picture_ext']);
+  }
+}
+
+/**
+ * Is this local site ok ?
+ *
+ * @return true on success, false otherwise
+ */
+function open()
+{
+  global $errors;
+
+  if (!is_dir($this->site_url))
+  {
+    array_push(
+      $errors,
+      array(
+        'path' => $this->site_url,
+        'type' => 'PWG-ERROR-NO-FS'
+        )
+      );
+
+    return false;
+  }
+
+  return true;
+}
+
+// retrieve file system sub-directories fulldirs
+function get_full_directories($basedir)
+{
+  $fs_fulldirs = get_fs_directories($basedir);
+  return $fs_fulldirs;
+}
+
+/**
+ * Returns an array with all file system files according to $conf['file_ext']
+ * and $conf['picture_ext']
+ * @param string $path recurse in this directory
+ * @return array like "pic.jpg"=>array('representative_ext'=>'jpg' ... )
+ */
+function get_elements($path)
+{
+  global $conf;
+
+  $subdirs = array();
+  $fs = array();
+  if (is_dir($path) && $contents = opendir($path) )
+  {
+    while (($node = readdir($contents)) !== false)
+    {
+      if ($node == '.' or $node == '..') continue;
+
+      if (is_file($path.'/'.$node))
+      {
+        $extension = get_extension($node);
+        $filename_wo_ext = get_filename_wo_extension($node);
+
+        if ( isset($conf['flip_file_ext'][$extension]) )
+        {
+          $representative_ext = null;
+          if (! isset($conf['flip_picture_ext'][$extension]) )
+          {
+            $representative_ext = $this->get_representative_ext($path, $filename_wo_ext);
+          }
+          $fs[ $path.'/'.$node ] = array(
+            'representative_ext' => $representative_ext,
+            );
+        }
+      }
+      elseif (is_dir($path.'/'.$node)
+               and $node != 'pwg_high'
+               and $node != 'pwg_representative'
+               and $node != 'thumbnail' )
+      {
+        array_push($subdirs, $node);
+      }
+    } //end while readdir
+    closedir($contents);
+
+    foreach ($subdirs as $subdir)
+    {
+      $tmp_fs = $this->get_elements($path.'/'.$subdir);
+      $fs = array_merge($fs, $tmp_fs);
+    }
+    ksort($fs);
+  } //end if is_dir
+  return $fs;
+}
+
+// returns the name of the attributes that are supported for
+// files update/synchronization
+function get_update_attributes()
+{
+  return array('representative_ext');
+}
+
+function get_element_update_attributes($file)
+{
+  global $conf;
+  $data = array();
+
+  $filename = basename($file);
+  $extension = get_extension($filename);
+
+  $representative_ext = null;
+  if (! isset($conf['flip_picture_ext'][$extension]) )
+  {
+    $dirname = dirname($file);
+    $filename_wo_ext = get_filename_wo_extension($filename);
+    $representative_ext = $this->get_representative_ext($dirname, $filename_wo_ext);
+  }
+
+  $data['representative_ext'] = $representative_ext;
+  return $data;
+}
+
+// returns the name of the attributes that are supported for
+// metadata update/synchronization according to configuration
+function get_metadata_attributes()
+{
+  return get_sync_metadata_attributes();
+}
+
+// returns a hash of attributes (metadata+filesize+width,...) for file
+function get_element_metadata($infos)
+{
+  return get_sync_metadata($infos);
+}
+
+
+//-------------------------------------------------- private functions --------
+function get_representative_ext($path, $filename_wo_ext)
+{
+  global $conf;
+  $base_test = $path.'/pwg_representative/'.$filename_wo_ext.'.';
+  foreach ($conf['picture_ext'] as $ext)
+  {
+    $test = $base_test.$ext;
+    if (is_file($test))
+    {
+      return $ext;
+    }
+  }
+  return null;
+}
+
+
+}
+?>
Index: tags/2.4.0RC3/admin/site_update.php
===================================================================
--- tags/2.4.0RC3/admin/site_update.php	(revision 14585)
+++ tags/2.4.0RC3/admin/site_update.php	(revision 14585)
@@ -0,0 +1,812 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!is_numeric($_GET['site']))
+{
+  die ('site param missing or invalid');
+}
+$site_id = $_GET['site'];
+
+$query='
+SELECT galleries_url
+  FROM '.SITES_TABLE.'
+  WHERE id = '.$site_id;
+list($site_url) = pwg_db_fetch_row(pwg_query($query));
+if (!isset($site_url))
+{
+  die('site '.$site_id.' does not exist');
+}
+$site_is_remote = url_is_remote($site_url);
+
+list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+define('CURRENT_DATE', $dbnow);
+
+$error_labels = array(
+  'PWG-UPDATE-1' => array(
+    l10n('wrong filename'),
+    l10n('The name of directories and files must be composed of letters, numbers, "-", "_" or "."')
+    ),
+  'PWG-ERROR-NO-FS' => array(
+    l10n('File/directory read error'),
+    l10n('The file or directory cannot be accessed (either it does not exist or the access is denied)')
+    ),
+  );
+$errors = array();
+$infos = array();
+
+if ($site_is_remote)
+{
+  fatal_error('remote sites not supported');
+}
+else
+{
+  include_once( PHPWG_ROOT_PATH.'admin/site_reader_local.php');
+  $site_reader = new LocalSiteReader($site_url);
+}
+
+$general_failure = true;
+if (isset($_POST['submit']))
+{
+  if ($site_reader->open())
+  {
+    $general_failure = false;
+  }
+
+  // shall we simulate only
+  if (isset($_POST['simulate']) and $_POST['simulate'] == 1)
+  {
+    $simulate = true;
+  }
+  else
+  {
+    $simulate = false;
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                      directories / categories                         |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit'])
+    and ($_POST['sync'] == 'dirs' or $_POST['sync'] == 'files'))
+{
+  $counts['new_categories'] = 0;
+  $counts['del_categories'] = 0;
+  $counts['del_elements'] = 0;
+  $counts['new_elements'] = 0;
+  $counts['upd_elements'] = 0;
+}
+
+
+if (isset($_POST['submit'])
+    and ($_POST['sync'] == 'dirs' or $_POST['sync'] == 'files')
+    and !$general_failure)
+{
+  $start = get_moment();
+  // which categories to update ?
+  $query = '
+SELECT id, uppercats, global_rank, status, visible
+  FROM '.CATEGORIES_TABLE.'
+  WHERE dir IS NOT NULL
+    AND site_id = '.$site_id;
+  if (isset($_POST['cat']) and is_numeric($_POST['cat']))
+  {
+    if (isset($_POST['subcats-included']) and $_POST['subcats-included'] == 1)
+    {
+      $query.= '
+    AND uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$_POST['cat'].'(,|$)\'
+';
+    }
+    else
+    {
+      $query.= '
+    AND id = '.$_POST['cat'].'
+';
+    }
+  }
+  $db_categories = hash_from_query($query, 'id');
+
+  // get categort full directories in an array for comparison with file
+  // system directory tree
+  $db_fulldirs = get_fulldirs(array_keys($db_categories));
+
+  // what is the base directory to search file system sub-directories ?
+  if (isset($_POST['cat']) and is_numeric($_POST['cat']))
+  {
+    $basedir = $db_fulldirs[$_POST['cat']];
+  }
+  else
+  {
+    $basedir = preg_replace('#/*$#', '', $site_url);
+  }
+
+  // we need to have fulldirs as keys to make efficient comparison
+  $db_fulldirs = array_flip($db_fulldirs);
+
+  // finding next rank for each id_uppercat. By default, each category id
+  // has 1 for next rank on its sub-categories to create
+  $next_rank['NULL'] = 1;
+
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE;
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $next_rank[$row['id']] = 1;
+  }
+
+  // let's see if some categories already have some sub-categories...
+  $query = '
+SELECT id_uppercat, MAX(rank)+1 AS next_rank
+  FROM '.CATEGORIES_TABLE.'
+  GROUP BY id_uppercat';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    // for the id_uppercat NULL, we write 'NULL' and not the empty string
+    if (!isset($row['id_uppercat']) or $row['id_uppercat'] == '')
+    {
+      $row['id_uppercat'] = 'NULL';
+    }
+    $next_rank[$row['id_uppercat']] = $row['next_rank'];
+  }
+
+  // next category id available
+  $next_id = pwg_db_nextval('id', CATEGORIES_TABLE);
+
+  // retrieve sub-directories fulldirs from the site reader
+  $fs_fulldirs = $site_reader->get_full_directories($basedir);
+
+  // get_full_directories doesn't include the base directory, so if it's a
+  // category directory, we need to include it in our array
+  if (isset($_POST['cat']))
+  {
+    array_push($fs_fulldirs, $basedir);
+  }
+  // If $_POST['subcats-included'] != 1 ("Search in sub-albums" is unchecked)
+  // $db_fulldirs doesn't include any subdirectories and $fs_fulldirs does
+  // So $fs_fulldirs will be limited to the selected basedir
+  // (if that one is in $fs_fulldirs)
+  if (!isset($_POST['subcats-included']) or $_POST['subcats-included'] != 1)
+  {
+    $fs_fulldirs = array_intersect($fs_fulldirs, array_keys($db_fulldirs));
+  }
+  $inserts = array();
+  // new categories are the directories not present yet in the database
+  foreach (array_diff($fs_fulldirs, array_keys($db_fulldirs)) as $fulldir)
+  {
+    $dir = basename($fulldir);
+    if (preg_match($conf['sync_chars_regex'], $dir))
+    {
+      $insert = array(
+        'id'          => $next_id++,
+        'dir'         => $dir,
+        'name'        => str_replace('_', ' ', $dir),
+        'site_id'     => $site_id,
+        'commentable' =>
+          boolean_to_string($conf['newcat_default_commentable']),
+        'status'      => $conf['newcat_default_status'],
+        'visible'     => boolean_to_string($conf['newcat_default_visible']),
+        );
+
+      if (isset($db_fulldirs[dirname($fulldir)]))
+      {
+        $parent = $db_fulldirs[dirname($fulldir)];
+
+        $insert['id_uppercat'] = $parent;
+        $insert['uppercats'] =
+          $db_categories[$parent]['uppercats'].','.$insert['id'];
+        $insert['rank'] = $next_rank[$parent]++;
+        $insert['global_rank'] =
+          $db_categories[$parent]['global_rank'].'.'.$insert['rank'];
+        if ('private' == $db_categories[$parent]['status'])
+        {
+          $insert['status'] = 'private';
+        }
+        if ('false' == $db_categories[$parent]['visible'])
+        {
+          $insert['visible'] = 'false';
+        }
+      }
+      else
+      {
+        $insert['uppercats'] = $insert['id'];
+        $insert{'rank'} = $next_rank['NULL']++;
+        $insert['global_rank'] = $insert['rank'];
+      }
+
+      array_push($inserts, $insert);
+      array_push(
+        $infos,
+        array(
+          'path' => $fulldir,
+          'info' => l10n('added')
+          )
+        );
+
+      // add the new category to $db_categories and $db_fulldirs array
+      $db_categories[$insert{'id'}] =
+        array(
+          'id' => $insert['id'],
+          'status' => $insert['status'],
+          'visible' => $insert['visible'],
+          'uppercats' => $insert['uppercats'],
+          'global_rank' => $insert['global_rank']
+          );
+      $db_fulldirs[$fulldir] = $insert['id'];
+      $next_rank[$insert{'id'}] = 1;
+    }
+    else
+    {
+      array_push(
+        $errors,
+        array(
+          'path' => $fulldir,
+          'type' => 'PWG-UPDATE-1'
+          )
+        );
+    }
+  }
+
+  if (count($inserts) > 0)
+  {
+    if (!$simulate)
+    {
+      $dbfields = array(
+        'id','dir','name','site_id','id_uppercat','uppercats','commentable',
+        'visible','status','rank','global_rank'
+        );
+      mass_inserts(CATEGORIES_TABLE, $dbfields, $inserts);
+
+      // add default permissions to categories
+      $category_ids = array();
+      foreach ($inserts as $category)
+      {
+        $category_ids[] = $category['id'];
+      }
+      add_permission_on_category($category_ids, get_admins());
+    }
+
+    $counts['new_categories'] = count($inserts);
+  }
+
+  // to delete categories
+  $to_delete = array();
+  foreach (array_diff(array_keys($db_fulldirs), $fs_fulldirs) as $fulldir)
+  {
+    array_push($to_delete, $db_fulldirs[$fulldir]);
+    unset($db_fulldirs[$fulldir]);
+    array_push($infos, array('path' => $fulldir,
+                             'info' => l10n('deleted')));
+  }
+  if (count($to_delete) > 0)
+  {
+    if (!$simulate)
+    {
+      delete_categories($to_delete);
+    }
+    $counts['del_categories'] = count($to_delete);
+  }
+
+  $template->append('footer_elements', '<!-- scanning dirs : '
+    . get_elapsed_time($start, get_moment())
+    . ' -->' );
+}
+// +-----------------------------------------------------------------------+
+// |                           files / elements                            |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']) and $_POST['sync'] == 'files'
+      and !$general_failure)
+{
+  $start_files = get_moment();
+  $start= $start_files;
+
+  $fs = $site_reader->get_elements($basedir);
+  $template->append('footer_elements', '<!-- get_elements: '
+    . get_elapsed_time($start, get_moment())
+    . ' -->' );
+
+  $cat_ids = array_diff(array_keys($db_categories), $to_delete);
+
+  $db_elements = array();
+
+  if (count($cat_ids) > 0)
+  {
+    $query = '
+SELECT id, path
+  FROM '.IMAGES_TABLE.'
+  WHERE storage_category_id IN ('
+      .wordwrap(
+        implode(', ', $cat_ids),
+        160,
+        "\n"
+        ).')';
+    $db_elements = simple_hash_from_query($query, 'id', 'path');
+  }
+
+  // next element id available
+  $next_element_id = pwg_db_nextval('id', IMAGES_TABLE);
+
+  $start = get_moment();
+
+  $inserts = array();
+  $insert_links = array();
+
+  foreach (array_diff(array_keys($fs), $db_elements) as $path)
+  {
+    $insert = array();
+    // storage category must exist
+    $dirname = dirname($path);
+    if (!isset($db_fulldirs[$dirname]))
+    {
+      continue;
+    }
+    $filename = basename($path);
+    if (!preg_match($conf['sync_chars_regex'], $filename))
+    {
+      array_push(
+        $errors,
+        array(
+          'path' => $path,
+          'type' => 'PWG-UPDATE-1'
+          )
+        );
+
+      continue;
+    }
+
+    $insert = array(
+      'id'             => $next_element_id++,
+      'file'           => $filename,
+      'name'           => get_name_from_file($filename),
+      'date_available' => CURRENT_DATE,
+      'path'           => $path,
+      'representative_ext'  => $fs[$path]['representative_ext'],
+      'storage_category_id' => $db_fulldirs[$dirname],
+      'added_by'       => $user['id'],
+      );
+
+    if ( $_POST['privacy_level']!=0 )
+    {
+      $insert['level'] = $_POST['privacy_level'];
+    }
+
+    array_push(
+      $inserts,
+      $insert
+      );
+
+    array_push(
+      $insert_links,
+      array(
+        'image_id'    => $insert['id'],
+        'category_id' => $insert['storage_category_id'],
+        )
+      );
+
+    array_push(
+      $infos,
+      array(
+        'path' => $insert['path'],
+        'info' => l10n('added')
+        )
+      );
+
+    $caddiables[] = $insert['id'];
+  }
+
+  if (count($inserts) > 0)
+  {
+    if (!$simulate)
+    {
+      // inserts all new elements
+      mass_inserts(
+        IMAGES_TABLE,
+        array_keys($inserts[0]),
+        $inserts
+        );
+
+      // inserts all links between new elements and their storage category
+      mass_inserts(
+        IMAGE_CATEGORY_TABLE,
+        array_keys($insert_links[0]),
+        $insert_links
+        );
+
+      // add new photos to caddie
+      if (isset($_POST['add_to_caddie']) and $_POST['add_to_caddie'] == 1)
+      {
+        fill_caddie($caddiables);
+      }
+    }
+    $counts['new_elements'] = count($inserts);
+  }
+
+  // delete elements that are in database but not in the filesystem
+  $to_delete_elements = array();
+  foreach (array_diff($db_elements, array_keys($fs)) as $path)
+  {
+    array_push($to_delete_elements, array_search($path, $db_elements));
+    array_push($infos, array('path' => $path,
+                             'info' => l10n('deleted')));
+  }
+  if (count($to_delete_elements) > 0)
+  {
+    if (!$simulate)
+    {
+      delete_elements($to_delete_elements);
+    }
+    $counts['del_elements'] = count($to_delete_elements);
+  }
+
+  $template->append('footer_elements', '<!-- scanning files : '
+    . get_elapsed_time($start_files, get_moment())
+    . ' -->' );
+}
+
+// +-----------------------------------------------------------------------+
+// |                          synchronize files                            |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit'])
+    and ($_POST['sync'] == 'dirs' or $_POST['sync'] == 'files')
+    and !$general_failure )
+{
+  if (!$simulate)
+  {
+    $start = get_moment();
+    update_category('all');
+    $template->append('footer_elements', '<!-- update_category(all) : '
+      . get_elapsed_time($start,get_moment())
+      . ' -->' );
+    $start = get_moment();
+    update_global_rank();
+    $template->append('footer_elements', '<!-- ordering categories : '
+      . get_elapsed_time($start, get_moment())
+      . ' -->');
+  }
+
+  if ($_POST['sync'] == 'files')
+  {
+    $start = get_moment();
+    $opts['category_id'] = '';
+    $opts['recursive'] = true;
+    if (isset($_POST['cat']))
+    {
+      $opts['category_id'] = $_POST['cat'];
+      if (!isset($_POST['subcats-included']) or $_POST['subcats-included'] != 1)
+      {
+        $opts['recursive'] = false;
+      }
+    }
+    $files = get_filelist($opts['category_id'], $site_id,
+                          $opts['recursive'],
+                          false);
+    $template->append('footer_elements', '<!-- get_filelist : '
+      . get_elapsed_time($start, get_moment())
+      . ' -->');
+    $start = get_moment();
+
+    $datas = array();
+    foreach ( $files as $id=>$file )
+    {
+      $file = $file['path'];
+      $data = $site_reader->get_element_update_attributes($file);
+      if ( !is_array($data) )
+      {
+        continue;
+      }
+
+      $data['id']=$id;
+      array_push($datas, $data);
+    } // end foreach file
+
+    $counts['upd_elements'] = count($datas);
+    if (!$simulate and count($datas)>0 )
+    {
+      mass_updates(
+        IMAGES_TABLE,
+        // fields
+        array(
+          'primary' => array('id'),
+          'update'  => $site_reader->get_update_attributes(),
+          ),
+        $datas
+        );
+    }
+    $template->append('footer_elements', '<!-- update files : '
+      . get_elapsed_time($start,get_moment())
+      . ' -->');
+  }// end if sync files
+}
+
+// +-----------------------------------------------------------------------+
+// |                          synchronize files                            |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit'])
+    and ($_POST['sync'] == 'dirs' or $_POST['sync'] == 'files'))
+{
+  $template->assign(
+    'update_result',
+    array(
+      'NB_NEW_CATEGORIES'=>$counts['new_categories'],
+      'NB_DEL_CATEGORIES'=>$counts['del_categories'],
+      'NB_NEW_ELEMENTS'=>$counts['new_elements'],
+      'NB_DEL_ELEMENTS'=>$counts['del_elements'],
+      'NB_UPD_ELEMENTS'=>$counts['upd_elements'],
+      'NB_ERRORS'=>count($errors),
+      ));
+}
+
+// +-----------------------------------------------------------------------+
+// |                          synchronize metadata                         |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']) and isset($_POST['sync_meta'])
+         and !$general_failure)
+{
+  // sync only never synchronized files ?
+  $opts['only_new'] = isset($_POST['meta_all']) ? false : true;
+  $opts['category_id'] = '';
+  $opts['recursive'] = true;
+
+  if (isset($_POST['cat']))
+  {
+    $opts['category_id'] = $_POST['cat'];
+    // recursive ?
+    if (!isset($_POST['subcats-included']) or $_POST['subcats-included'] != 1)
+    {
+      $opts['recursive'] = false;
+    }
+  }
+  $start = get_moment();
+  $files = get_filelist($opts['category_id'], $site_id,
+                        $opts['recursive'],
+                        $opts['only_new']);
+
+  $template->append('footer_elements', '<!-- get_filelist : '
+    . get_elapsed_time($start, get_moment())
+    . ' -->');
+
+  $start = get_moment();
+  $datas = array();
+  $tags_of = array();
+
+  foreach ( $files as $id => $element_infos )
+  {
+    $data = $site_reader->get_element_metadata($element_infos);
+
+    if ( is_array($data) )
+    {
+      $data['date_metadata_update'] = CURRENT_DATE;
+      $data['id']=$id;
+      array_push($datas, $data);
+
+      foreach (array('keywords', 'tags') as $key)
+      {
+        if (isset($data[$key]))
+        {
+          if (!isset($tags_of[$id]))
+          {
+            $tags_of[$id] = array();
+          }
+
+          foreach (explode(',', $data[$key]) as $tag_name)
+          {
+            array_push(
+              $tags_of[$id],
+              tag_id_from_tag_name($tag_name)
+              );
+          }
+        }
+      }
+    }
+    else
+    {
+      array_push($errors, array('path' => $element_infos['path'], 'type' => 'PWG-ERROR-NO-FS'));
+    }
+  }
+
+  if (!$simulate)
+  {
+    if (count($datas) > 0)
+    {
+      mass_updates(
+        IMAGES_TABLE,
+        // fields
+        array(
+          'primary' => array('id'),
+          'update'  => array_unique(
+            array_merge(
+              array_diff(
+                $site_reader->get_metadata_attributes(),
+                // keywords and tags fields are managed separately
+                array('keywords', 'tags')
+                ),
+              array('date_metadata_update'))
+            )
+          ),
+        $datas,
+        isset($_POST['meta_empty_overrides']) ? 0 : MASS_UPDATES_SKIP_EMPTY
+        );
+    }
+    set_tags_of($tags_of);
+  }
+
+  $template->append('footer_elements', '<!-- metadata update : '
+    . get_elapsed_time($start, get_moment())
+    . ' -->');
+
+  $template->assign(
+    'metadata_result',
+    array(
+      'NB_ELEMENTS_DONE' => count($datas),
+      'NB_ELEMENTS_CANDIDATES' => count($files),
+      'NB_ERRORS' => count($errors),
+      ));
+}
+
+// +-----------------------------------------------------------------------+
+// |                        template initialization                        |
+// +-----------------------------------------------------------------------+
+$template->set_filenames(array('update'=>'site_update.tpl'));
+$result_title = '';
+if (isset($simulate) and $simulate)
+{
+  $result_title.= '['.l10n('Simulation').'] ';
+}
+
+// used_metadata string is displayed to inform admin which metadata will be
+// used from files for synchronization
+$used_metadata = implode( ', ', $site_reader->get_metadata_attributes());
+if ($site_is_remote and !isset($_POST['submit']) )
+{
+  $used_metadata.= ' + ...';
+}
+
+$template->assign(
+  array(
+    'SITE_URL'=>$site_url,
+    'U_SITE_MANAGER'=> get_root_url().'admin.php?page=site_manager',
+    'L_RESULT_UPDATE'=>$result_title.l10n('Search for new images in the directories'),
+    'L_RESULT_METADATA'=>$result_title.l10n('Metadata synchronization results'),
+    'METADATA_LIST' => $used_metadata,
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=synchronize',
+    ));
+
+// +-----------------------------------------------------------------------+
+// |                        introduction : choices                         |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']))
+{
+  $tpl_introduction = array(
+      'sync'  => $_POST['sync'],
+      'sync_meta'  => isset($_POST['sync_meta']) ? true : false,
+      'display_info' => isset($_POST['display_info']) and $_POST['display_info']==1,
+      'add_to_caddie' => isset($_POST['add_to_caddie']) and $_POST['add_to_caddie']==1,
+      'subcats_included' => isset($_POST['subcats-included']) and $_POST['subcats-included']==1,
+      'privacy_level_selected' => (int)@$_POST['privacy_level'],
+      'meta_all'  => isset($_POST['meta_all']) ? true : false,
+      'meta_empty_overrides'  => isset($_POST['meta_empty_overrides']) ? true : false,
+    );
+
+  if (isset($_POST['cat']) and is_numeric($_POST['cat']))
+  {
+    $cat_selected = array($_POST['cat']);
+  }
+  else
+  {
+    $cat_selected = array();
+  }
+}
+else
+{
+  $tpl_introduction = array(
+      'sync'  => 'dirs',
+      'sync_meta'  => true,
+      'display_info' => false,
+      'add_to_caddie' => false,
+      'subcats_included' => true,
+      'privacy_level_selected' => 0,
+      'meta_all'  => false,
+      'meta_empty_overrides'  => false,
+    );
+
+  $cat_selected = array();
+
+  if (isset($_GET['cat_id']))
+  {
+    check_input_parameter('cat_id', $_GET, false, PATTERN_ID);
+
+    $cat_selected = array($_GET['cat_id']);
+    $tpl_introduction['sync'] = 'files';
+  }
+}
+
+$tpl_introduction['privacy_level_options'] = get_privacy_level_options();
+
+$template->assign('introduction', $tpl_introduction);
+
+$query = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE site_id = '.$site_id;
+display_select_cat_wrapper($query,
+                           $cat_selected,
+                           'category_options',
+                           false);
+
+
+if (count($errors) > 0)
+{
+  foreach ($errors as $error)
+  {
+    $template->append(
+      'sync_errors',
+      array(
+        'ELEMENT' => $error['path'],
+        'LABEL' => $error['type'].' ('.$error_labels[$error['type']][0].')'
+        ));
+  }
+
+  foreach ($error_labels as $error_type=>$error_description)
+  {
+    $template->append(
+      'sync_error_captions',
+      array(
+        'TYPE' => $error_type,
+        'LABEL' => $error_description[1]
+        ));
+  }
+}
+
+if (count($infos) > 0
+    and isset($_POST['display_info'])
+    and $_POST['display_info'] == 1)
+{
+  foreach ($infos as $info)
+  {
+    $template->append(
+      'sync_infos',
+      array(
+        'ELEMENT' => $info['path'],
+        'LABEL' => $info['info']
+        ));
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                          sending html code                            |
+// +-----------------------------------------------------------------------+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'update');
+?>
Index: tags/2.4.0RC3/admin/stats.php
===================================================================
--- tags/2.4.0RC3/admin/stats.php	(revision 14585)
+++ tags/2.4.0RC3/admin/stats.php	(revision 14585)
@@ -0,0 +1,517 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined("PHPWG_ROOT_PATH"))
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_history.inc.php');
+
+// +-----------------------------------------------------------------------+
+// | Functions                                                             |
+// +-----------------------------------------------------------------------+
+
+function get_summary($year = null, $month = null, $day = null)
+{
+  $query = '
+SELECT
+    year,
+    month,
+    day,
+    hour,
+    nb_pages
+  FROM '.HISTORY_SUMMARY_TABLE;
+
+  if (isset($day))
+  {
+    $query.= '
+  WHERE year = '.$year.'
+    AND month = '.$month.'
+    AND day = '.$day.'
+    AND hour IS NOT NULL
+  ORDER BY
+    year ASC,
+    month ASC,
+    day ASC,
+    hour ASC
+;';
+  }
+  elseif (isset($month))
+  {
+    $query.= '
+  WHERE year = '.$year.'
+    AND month = '.$month.'
+    AND day IS NOT NULL
+    AND hour IS NULL
+  ORDER BY
+    year ASC,
+    month ASC,
+    day ASC
+;';
+  }
+  elseif (isset($year))
+  {
+    $query.= '
+  WHERE year = '.$year.'
+    AND month IS NOT NULL
+    AND day IS NULL
+  ORDER BY
+    year ASC,
+    month ASC
+;';
+  }
+  else
+  {
+    $query.= '
+  WHERE year IS NOT NULL
+    AND month IS NULL
+  ORDER BY
+    year ASC
+;';
+  }
+
+  $result = pwg_query($query);
+
+  $output = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($output, $row);
+  }
+
+  return $output;
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// | Refresh summary from details                                          |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT
+    date,
+    '.pwg_db_get_hour('time').' AS hour,
+    MAX(id) AS max_id,
+    COUNT(*) AS nb_pages
+  FROM '.HISTORY_TABLE.'
+  WHERE summarized = \'false\'
+  GROUP BY
+    date,
+    hour
+  ORDER BY
+    date ASC,
+    hour ASC
+;';
+$result = pwg_query($query);
+
+$need_update = array();
+
+$max_id = 0;
+$is_first = true;
+$first_time_key = null;
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $time_keys = array(
+    substr($row['date'], 0, 4), //yyyy
+    substr($row['date'], 0, 7), //yyyy-mm
+    substr($row['date'], 0, 10),//yyyy-mm-dd
+    sprintf(
+      '%s-%02u',
+      $row['date'], $row['hour']
+      ),
+    );
+
+  foreach ($time_keys as $time_key)
+  {
+    if (!isset($need_update[$time_key]))
+    {
+      $need_update[$time_key] = 0;
+    }
+    $need_update[$time_key] += $row['nb_pages'];
+  }
+
+  if ($row['max_id'] > $max_id)
+  {
+    $max_id = $row['max_id'];
+  }
+
+  if ($is_first)
+  {
+    $is_first = false;
+    $first_time_key = $time_keys[3];
+  }
+}
+
+// Only the oldest time_key might be already summarized, so we have to
+// update the 4 corresponding lines instead of simply inserting them.
+//
+// For example, if the oldest unsummarized is 2005.08.25.21, the 4 lines
+// that can be updated are:
+//
+// +---------------+----------+
+// | id            | nb_pages |
+// +---------------+----------+
+// | 2005          |   241109 |
+// | 2005-08       |    20133 |
+// | 2005-08-25    |      620 |
+// | 2005-08-25-21 |      151 |
+// +---------------+----------+
+
+
+$updates = array();
+$inserts = array();
+
+if (isset($first_time_key))
+{
+  list($year, $month, $day, $hour) = explode('-', $first_time_key);
+
+  $query = '
+SELECT *
+  FROM '.HISTORY_SUMMARY_TABLE.'
+  WHERE year='.$year.'
+    AND ( month IS NULL
+      OR ( month='.$month.'
+        AND ( day is NULL 
+          OR (day='.$day.'
+            AND (hour IS NULL OR hour='.$hour.')
+          )
+        )
+      )
+    )
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $key = sprintf('%4u', $row['year']);
+    if ( isset($row['month']) )
+    {
+      $key .= sprintf('-%02u', $row['month']);
+      if ( isset($row['day']) )
+      {
+        $key .= sprintf('-%02u', $row['day']);
+        if ( isset($row['hour']) )
+        {
+          $key .= sprintf('-%02u', $row['hour']);
+        }
+      }
+    }
+
+    if (isset($need_update[$key]))
+    {
+      $row['nb_pages'] += $need_update[$key];
+      array_push($updates, $row);
+      unset($need_update[$key]);
+    }
+  }
+}
+
+foreach ($need_update as $time_key => $nb_pages)
+{
+  $time_tokens = explode('-', $time_key);
+
+  array_push(
+      $inserts,
+      array(
+        'year'     => $time_tokens[0],
+        'month'    => @$time_tokens[1],
+        'day'      => @$time_tokens[2],
+        'hour'     => @$time_tokens[3],
+        'nb_pages' => $nb_pages,
+        )
+      );
+}
+
+if (count($updates) > 0)
+{
+  mass_updates(
+    HISTORY_SUMMARY_TABLE,
+    array(
+      'primary' => array('year','month','day','hour'),
+      'update'  => array('nb_pages'),
+      ),
+    $updates
+    );
+}
+
+if (count($inserts) > 0)
+{
+  mass_inserts(
+    HISTORY_SUMMARY_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+if ($max_id != 0)
+{
+  $query = '
+UPDATE '.HISTORY_TABLE.'
+  SET summarized = \'true\'
+  WHERE summarized = \'false\'
+    AND id <= '.$max_id.'
+;';
+  pwg_query($query);
+}
+
+// +-----------------------------------------------------------------------+
+// | Page parameters check                                                 |
+// +-----------------------------------------------------------------------+
+
+foreach (array('day', 'month', 'year') as $key)
+{
+  if (isset($_GET[$key]))
+  {
+    $page[$key] = (int)$_GET[$key];
+  }
+}
+
+if (isset($page['day']))
+{
+  if (!isset($page['month']))
+  {
+    die('month is missing in URL');
+  }
+}
+
+if (isset($page['month']))
+{
+  if (!isset($page['year']))
+  {
+    die('year is missing in URL');
+  }
+}
+
+$summary_lines = get_summary(
+  @$page['year'],
+  @$page['month'],
+  @$page['day']
+  );
+
+// +-----------------------------------------------------------------------+
+// | Display statistics header                                             |
+// +-----------------------------------------------------------------------+
+
+// page title creation
+$title_parts = array();
+
+$url = PHPWG_ROOT_PATH.'admin.php?page=stats';
+
+array_push(
+  $title_parts,
+  '<a href="'.$url.'">'.l10n('Overall').'</a>'
+  );
+
+$period_label = l10n('Year');
+
+if (isset($page['year']))
+{
+  $url.= '&amp;year='.$page['year'];
+
+  array_push(
+    $title_parts,
+    '<a href="'.$url.'">'.$page['year'].'</a>'
+    );
+
+  $period_label = l10n('Month');
+}
+
+if (isset($page['month']))
+{
+  $url.= '&amp;month='.$page['month'];
+
+  array_push(
+    $title_parts,
+    '<a href="'.$url.'">'.$lang['month'][$page['month']].'</a>'
+    );
+
+  $period_label = l10n('Day');
+}
+
+if (isset($page['day']))
+{
+  $url.= '&amp;day='.$page['day'];
+
+  $time = mktime(12, 0, 0, $page['month'], $page['day'], $page['year']);
+
+  $day_title = sprintf(
+    '%u (%s)',
+    $page['day'],
+    $lang['day'][date('w', $time)]
+    );
+
+  array_push(
+    $title_parts,
+    '<a href="'.$url.'">'.$day_title.'</a>'
+    );
+
+  $period_label = l10n('Hour');
+}
+
+$template->set_filename('stats', 'stats.tpl');
+
+// TabSheet initialization
+history_tabsheet();
+
+$base_url = get_root_url().'admin.php?page=history';
+
+$template->assign(
+  array(
+    'L_STAT_TITLE' => implode($conf['level_separator'], $title_parts),
+    'PERIOD_LABEL' => $period_label,
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=history',
+    'F_ACTION' => $base_url,
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// | Display statistic rows                                                |
+// +-----------------------------------------------------------------------+
+
+$max_width = 400;
+
+$datas = array();
+
+if (isset($page['day']))
+{
+  $key = 'hour';
+  $min_x = 0;
+  $max_x = 23;
+}
+elseif (isset($page['month']))
+{
+  $key = 'day';
+  $min_x = 1;
+  $max_x = date(
+    't',
+    mktime(12, 0, 0, $page['month'], 1, $page['year'])
+    );
+}
+elseif (isset($page['year']))
+{
+  $key = 'month';
+  $min_x = 1;
+  $max_x = 12;
+}
+else
+{
+  $key = 'year';
+}
+
+$max_pages = 1;
+foreach ($summary_lines as $line)
+{
+  if ($line['nb_pages'] > $max_pages)
+  {
+    $max_pages = $line['nb_pages'];
+  }
+
+  $datas[ $line[$key] ] = $line['nb_pages'];
+}
+
+if (!isset($min_x) and !isset($max_x) and count($datas) > 0)
+{
+  $min_x = min(array_keys($datas));
+  $max_x = max(array_keys($datas));
+}
+
+if (count($datas) > 0)
+{
+  for ($i = $min_x; $i <= $max_x; $i++)
+  {
+    if (!isset($datas[$i]))
+    {
+      $datas[$i] = 0;
+    }
+
+    $url = null;
+
+    if (isset($page['day']))
+    {
+      $value = sprintf('%02u', $i);
+    }
+    else if (isset($page['month']))
+    {
+      $url =
+        get_root_url().'admin.php'
+        .'?page=stats'
+        .'&amp;year='.$page['year']
+        .'&amp;month='.$page['month']
+        .'&amp;day='.$i
+        ;
+
+      $time = mktime(12, 0, 0, $page['month'], $i, $page['year']);
+
+      $value = $i.' ('.$lang['day'][date('w', $time)].')';
+    }
+    else if (isset($page['year']))
+    {
+      $url =
+        get_root_url().'admin.php'
+        .'?page=stats'
+        .'&amp;year='.$page['year']
+        .'&amp;month='.$i
+        ;
+
+      $value = $lang['month'][$i];
+    }
+    else
+    {
+      // at least the year is defined
+      $url =
+        get_root_url().'admin.php'
+        .'?page=stats'
+        .'&amp;year='.$i
+        ;
+
+      $value = $i;
+    }
+
+    if ($datas[$i] != 0 and isset($url))
+    {
+      $value = '<a href="'.$url.'">'.$value.'</a>';
+    }
+
+    $template->append(
+      'statrows',
+      array(
+        'VALUE' => $value,
+        'PAGES' => $datas[$i],
+        'WIDTH' => ceil(($datas[$i] * $max_width) / $max_pages ),
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | Sending html code                                                     |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'stats');
+?>
Index: tags/2.4.0RC3/admin/tags.php
===================================================================
--- tags/2.4.0RC3/admin/tags.php	(revision 14585)
+++ tags/2.4.0RC3/admin/tags.php	(revision 14585)
@@ -0,0 +1,386 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+check_status(ACCESS_ADMINISTRATOR);
+
+if (!empty($_POST))
+{
+  check_pwg_token();
+}
+
+// +-----------------------------------------------------------------------+
+// |                                edit tags                              |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['submit']))
+{
+  $query = '
+SELECT name
+  FROM '.TAGS_TABLE.'
+;';
+  $existing_names = array_from_query($query, 'name');
+  
+
+  $current_name_of = array();
+  $query = '
+SELECT id, name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.$_POST['edit_list'].')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $current_name_of[ $row['id'] ] = $row['name'];
+  }
+  
+  $updates = array();
+  // we must not rename tag with an already existing name
+  foreach (explode(',', $_POST['edit_list']) as $tag_id)
+  {
+    $tag_name = stripslashes($_POST['tag_name-'.$tag_id]);
+
+    if ($tag_name != $current_name_of[$tag_id])
+    {
+      if (in_array($tag_name, $existing_names))
+      {
+        array_push(
+          $page['errors'],
+          sprintf(
+            l10n('Tag "%s" already exists'),
+            $tag_name
+            )
+          );
+      }
+      else if (!empty($tag_name))
+      {
+        array_push(
+          $updates,
+          array(
+            'id' => $tag_id,
+            'name' => addslashes($tag_name),
+            'url_name' => trigger_event('render_tag_url', $tag_name),
+            )
+          );
+      }
+    }
+  }
+  mass_updates(
+    TAGS_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array('name', 'url_name'),
+      ),
+    $updates
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                               merge tags                              |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['confirm_merge']))
+{
+  if (!isset($_POST['destination_tag']))
+  {
+    array_push(
+      $page['errors'],
+      l10n('No destination tag selected')
+      );
+  }
+  else
+  {
+    $destination_tag_id = $_POST['destination_tag'];
+    $tag_ids = explode(',', $_POST['merge_list']);
+    
+    if (is_array($tag_ids) and count($tag_ids) > 1)
+    {
+      $name_of_tag = array();
+      $query = '
+SELECT
+    id,
+    name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $tag_ids).')
+;';
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+        $name_of_tag[ $row['id'] ] = trigger_event('render_tag_name', $row['name']);
+      }
+      
+      $tag_ids_to_delete = array_diff(
+        $tag_ids,
+        array($destination_tag_id)
+        );
+
+      $query = '
+SELECT
+    DISTINCT(image_id)
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE tag_id IN ('.implode(',', $tag_ids_to_delete).')
+;';
+      $image_ids = array_from_query($query, 'image_id');
+
+      delete_tags($tag_ids_to_delete);
+
+      $query = '
+SELECT
+    image_id
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE tag_id = '.$destination_tag_id.'
+;';
+      $destination_tag_image_ids = array_from_query($query, 'image_id');
+
+      $image_ids_to_link = array_diff(
+        $image_ids,
+        $destination_tag_image_ids
+        );
+
+      $inserts = array();
+      foreach ($image_ids_to_link as $image_id)
+      {
+        array_push(
+          $inserts,
+          array(
+            'tag_id' => $destination_tag_id,
+            'image_id' => $image_id
+            )
+          );
+      }
+
+      if (count($inserts) > 0)
+      {
+        mass_inserts(
+          IMAGE_TAG_TABLE,
+          array_keys($inserts[0]),
+          $inserts
+          );
+      }
+
+      $tags_deleted = array();
+      foreach ($tag_ids_to_delete as $tag_id)
+      {
+        $tags_deleted[] = $name_of_tag[$tag_id];
+      }
+      
+      array_push(
+        $page['infos'],
+        sprintf(
+          l10n('Tags <em>%s</em> merged into tag <em>%s</em>'),
+          implode(', ', $tags_deleted),
+          $name_of_tag[$destination_tag_id]
+          )
+        );
+    }
+  }
+}
+
+
+// +-----------------------------------------------------------------------+
+// |                               delete tags                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['delete']) and isset($_POST['tags']))
+{
+  $query = '
+SELECT name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $_POST['tags']).')
+;';
+  $tag_names = array_from_query($query, 'name');
+
+  delete_tags($_POST['tags']);
+  
+  array_push(
+    $page['infos'],
+    l10n_dec(
+      'The following tag was deleted', 
+      'The %d following tags were deleted',
+      count($tag_names)).' : '.
+      implode(', ', $tag_names)
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                           delete orphan tags                          |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['action']) and 'delete_orphans' == $_GET['action'])
+{
+  check_pwg_token();
+  
+  delete_orphan_tags();
+  $_SESSION['page_infos'] = array(l10n('Orphan tags deleted'));
+  redirect(get_root_url().'admin.php?page=tags');
+}
+
+// +-----------------------------------------------------------------------+
+// |                               add a tag                               |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['add']) and !empty($_POST['add_tag']))
+{
+  $tag_name = $_POST['add_tag'];
+
+  // does the tag already exists?
+  $query = '
+SELECT id
+  FROM '.TAGS_TABLE.'
+  WHERE name = \''.$tag_name.'\'
+;';
+  $existing_tags = array_from_query($query, 'id');
+
+  if (count($existing_tags) == 0)
+  {
+    mass_inserts(
+      TAGS_TABLE,
+      array('name', 'url_name'),
+      array(
+        array(
+          'name' => $tag_name,
+          'url_name' => trigger_event('render_tag_url', $tag_name),
+          )
+        )
+      );
+    
+    array_push(
+      $page['infos'],
+      sprintf(
+        l10n('Tag "%s" was added'),
+        stripslashes($tag_name)
+        )
+      );
+  }
+  else
+  {
+    array_push(
+      $page['errors'],
+      sprintf(
+        l10n('Tag "%s" already exists'),
+        stripslashes($tag_name)
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('tags' => 'tags.tpl'));
+
+$template->assign(
+  array(
+    'F_ACTION' => PHPWG_ROOT_PATH.'admin.php?page=tags',
+    'PWG_TOKEN' => get_pwg_token(),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                              orphan tags                              |
+// +-----------------------------------------------------------------------+
+
+$orphan_tags = get_orphan_tags();
+
+$orphan_tag_names = array();
+foreach ($orphan_tags as $tag)
+{
+  array_push($orphan_tag_names, trigger_event('render_tag_name', $tag['name']));
+}
+
+if (count($orphan_tag_names) > 0)
+{
+  array_push(
+    $page['warnings'],
+    sprintf(
+      l10n('You have %d orphan tags: %s.').' <a href="%s">'.l10n('Delete orphan tags').'</a>',
+      count($orphan_tag_names),
+      implode(', ', $orphan_tag_names),
+      get_root_url().'admin.php?page=tags&amp;action=delete_orphans&amp;pwg_token='.get_pwg_token()
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                             form creation                             |
+// +-----------------------------------------------------------------------+
+
+$template->assign(
+  array(
+    'TAG_SELECTION' => get_html_tag_selection(
+      get_all_tags(),
+      'tags'
+      ),
+    )
+  );
+
+if ((isset($_POST['edit']) or isset($_POST['merge'])) and isset($_POST['tags']))
+{
+  $list_name = 'EDIT_TAGS_LIST';
+  if (isset($_POST['merge']))
+  {
+    $list_name = 'MERGE_TAGS_LIST';
+  }
+  
+  $template->assign(
+    array(
+      $list_name => implode(',', $_POST['tags']),
+      )
+    );
+
+  $query = '
+SELECT id, name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $_POST['tags']).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $name_of[ $row['id'] ] = $row['name'];
+  }
+
+  foreach ($_POST['tags'] as $tag_id)
+  {
+    $template->append(
+      'tags',
+      array(
+        'ID' => $tag_id,
+        'NAME' => $name_of[$tag_id],
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'tags');
+
+?>
Index: tags/2.4.0RC3/admin/theme.php
===================================================================
--- tags/2.4.0RC3/admin/theme.php	(revision 14585)
+++ tags/2.4.0RC3/admin/theme.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+check_status(ACCESS_ADMINISTRATOR);
+
+if (empty($_GET['theme']))
+{
+  die('Invalid theme URL');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+$themes = new themes();
+if (!in_array($_GET['theme'], array_keys($themes->fs_themes)))
+{
+  die('Invalid theme');
+}
+
+$filename = PHPWG_THEMES_PATH.$_GET['theme'].'/admin/admin.inc.php';
+if (is_file($filename))
+{
+  include_once($filename);
+}
+else
+{
+  die('Missing file '.$filename);
+}
+?>
Index: tags/2.4.0RC3/admin/themes.php
===================================================================
--- tags/2.4.0RC3/admin/themes.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=themes';
+
+if (isset($_GET['tab']))
+  $page['tab'] = $_GET['tab'];
+else
+  $page['tab'] = 'installed';
+
+$tabsheet = new tabsheet();
+$tabsheet->add('installed', l10n('Installed Themes'), $my_base_url.'&amp;tab=installed');
+$tabsheet->add('update', l10n('Check for updates'), $my_base_url.'&amp;tab=update');
+$tabsheet->add('new', l10n('Add New Theme'), $my_base_url.'&amp;tab=new');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+if ($page['tab'] == 'update')
+  include(PHPWG_ROOT_PATH.'admin/updates_ext.php');
+else
+  include(PHPWG_ROOT_PATH.'admin/themes_'.$page['tab'].'.php');
+
+?>
Index: tags/2.4.0RC3/admin/themes/clear/icon/index.php
===================================================================
--- tags/2.4.0RC3/admin/themes/clear/icon/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/clear/icon/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/themes/clear/index.php
===================================================================
--- tags/2.4.0RC3/admin/themes/clear/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/clear/index.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id: index.php 3049 2009-01-04 23:28:36Z plg $
+// | last update   : $Date: 2009-01-05 00:28:36 +0100 (lun. 05 janv. 2009) $
+// | last modifier : $Author: plg $
+// | revision      : $Revision: 3049 $
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/themes/clear/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/clear/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/clear/mail-css.tpl	(revision 14585)
@@ -0,0 +1,19 @@
+{* $Id: mail-css.tpl 2526 2008-09-14 00:33:53Z vdigital $ *}
+/* Theme wipi mail css */
+
+body {ldelim} background-color:#111; color:#69c;}
+#the_page {ldelim} background: #111 url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/mailbody-bg.png) repeat-y scroll left top;}
+#content {ldelim} background: transparent url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/header-bg.png) no-repeat scroll left top;}
+#copyright {ldelim} background: transparent url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/footer-bg.png) no-repeat scroll left bottom;
+color: #69c;}
+h2 {ldelim} background-color: #222;color:#eee;background-image: url({$ROOT_URL}template/{$themeconf.template}/themes/{$themeconf.theme}/images/tableh1_bg.png);}
+img {ldelim} margin: 16px; padding:15px;border:1px solid #eee; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} border:1px solid #69c; -moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #69c; background: transparent; }
+a:hover {ldelim} color: #f92; }
+a.PWG {ldelim} border: 0px; }
+a.PWG .P {ldelim} color : #f92; }
+a.PWG .W {ldelim} color : #aaa; }
+a.PWG .G {ldelim} color : #69c; }
+a.PWG:hover .P {ldelim} color : #69c; }
+a.PWG:hover .G {ldelim} color : #f92; }
Index: tags/2.4.0RC3/admin/themes/clear/theme.css
===================================================================
--- tags/2.4.0RC3/admin/themes/clear/theme.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/clear/theme.css	(revision 14585)
@@ -0,0 +1,315 @@
+/* generic colors - clear
+.gcText { color: #777777; }                 used for text
+.gcText2 { color: #777777; }                used for table header
+.gcText3 { color: #555555; }                used for tabs text
+.gcTextInput { color:#666666; }             used for inputs
+.gcLink { color: #005E89; }                 used for link
+.gcLinkHover { color: #D54E21; }            used for link
+.gcBgPage { background-color: #F9F9F9; }               used for page background
+.gcBgTabSheet { background-color: #F1F1F1; }           used inside tabsheet & menu
+.gcBgTableRow1 { background-color: #DDDDDD; }            used in for tables rows background
+.gcBgTableRow2 { background-color: #EEEEEE; }            used in tables rows & some widgets background
+.gcBgInput { background-color:#CCCCCC; }                      used for inputs
+.gcBorder    { border-color: #AAAAAA; }            used for borders
+.gcBorder2   { border-color: #666666; }            used for widgets borders
+.gcBorderInput { border-color:#777777; }           used for inputs
+*/
+/* text color */
+
+body, h3, dt, h2, .throw, .content, label , LEGEND  {
+	color:#777;
+}
+
+th { color: #888; }
+INPUT, select, textarea { color:#666; background-color: #ccc; }
+input[type="radio"], input[type="checkbox"] { background-color: transparent; }
+
+INPUT[type="submit"], INPUT[type="button"], INPUT[type="reset"] {
+	color:#666;
+	border: 1px solid #777;
+	background-color: #ddd;
+	padding: 1px 15px;
+}
+
+
+INPUT[type="text"], INPUT[type="password"], INPUT[type="button"],
+INPUT[type="submit"], INPUT[type="reset"], INPUT[type="file"] {
+	background-color: #ddd;
+}
+
+INPUT.text, INPUT.password, INPUT.button,
+INPUT.submit, INPUT.reset, INPUT.file,
+SELECT, TEXTAREA {
+	background-color: #ddd;
+}
+
+INPUT:focus, SELECT:focus, TEXTAREA:focus, INPUT.focus, FORM .focus, INPUT.submit:hover {
+  background-color: #eee;
+  color: #666;
+}
+
+INPUT, SELECT, TEXTAREA { border: 1px solid #999; }
+
+
+INPUT[type="button"]:hover, INPUT[type="submit"]:hover, INPUT[type="reset"]:hover {
+  cursor:pointer;
+  color:#666;
+  border-color: #999;
+}
+
+
+#copyright { color:#777; margin:5px auto 0px 240px; text-align:center;
+padding-bottom: 15px; }
+.header_notes {
+  background: transparent url(../default/icon/note.png) no-repeat right top;
+  border: none;
+  min-height: 48px;
+  padding: 15px 60px 0 0;
+  right: 0;
+  width: 550px;
+  top: 70px;
+}
+html, body { min-height: 100%; }
+body { margin: 0; padding: 0; background:#f9f9f9 }
+/* #the_page { margin: 0; padding: 0; z-index: 1; top:0px; */
+/* padding-top: 0; min-height: 100%; width:100%; position:absolute; left:0px; } */
+#headbranch { width: 233px; height: 240px; margin: 0; padding: 0;
+position:absolute; left:0px; top:0px; z-index: 0;
+background:transparent }
+h3, .content, .throw, .row1 { background-color: #ddd; }
+.row2 { background-color:#eeeeee; }
+#content { background: #f1f1f1; min-height: 467px;}
+
+.content {
+  border: 1px solid #aaa;
+  margin-left:217px;
+  margin-top: 7px;
+}
+
+.content h3 { font-size:20px; letter-spacing:-0.4px; margin:0 20px 12px 0;
+ text-align:center; background:none; border: 0; }
+.content h3 ~ h3{ margin-top: 40px; }
+.content h4 { color: #aaa; font-size:14px; text-align:center; padding:3px; margin-top: 0; margin-bottom: 10px;}
+
+.content dl, dd { margin:5px; }
+.content div.titrePage { height:40px; }
+
+
+UL.thumbnails span.wrap2:hover { background-color:#7CBA0F; color:#999; }
+UL.thumbnails span.wrap2 {
+	padding: 4px;
+	border-radius: 4px;
+	background-color:#ddd;
+}
+
+
+/* borders */
+fieldset { border: 2px solid #ddd; }
+TEXTAREA { cursor:text; font-size: 13px; }
+.tagSelection label { padding-right:12px; }
+.tagSelection LI.tagSelected {background-color:#dbe8f3;}
+.tagSelected LABEL {color:black;}
+
+.content ul.categoryActions a img { margin-left: 10px; }
+ul.thumbnails input { border:3px double #666; color:#666; font-size:10px; margin:0; background-color:#bbb; text-align: center;}
+INPUT.bigbutton:hover { background-color: #ddd;  color:#0cc; border: 0; }
+.throw  { font-size: 120%; line-height: 26px; padding-top: 10px; font-weight: bold; }
+label { cursor:pointer }
+.categoryLi, .menuLi { background: #ddd }
+.menuLi_hidden { background: #ccc !important; }
+a.Piwigo {
+  font-family: verdana, arial, helvetica, sans-serif !important;
+  font-size: 11px; font-weight: normal; letter-spacing: 0;
+  color : #0cc; text-decoration: none; border: 0; }
+a.Piwigo:hover  span.Piwigo  {
+  border-bottom: 1px solid #0cc9c;
+}
+TABLE.table2 { border: 2px solid #dddddd; }
+
+*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
+a { color:#005E89; border-width: 0; }
+a:hover, a:active { color: #d54e21; border-bottom: 1px dotted #d54e21; cursor: pointer; }
+.content .navigationBar {color:#999;}
+ul.actions, .content form#waiting  {text-align:center;}
+
+.header_msgs {
+	border:0;
+	color:#ccc;
+	font-size:24px;
+	height:30px;
+	margin:0; padding:10px 0 0;
+	text-align:center; width:100%;
+}
+
+/* tabsheets are often used in admin  pages => No specific css files */
+#tabsheet { width:auto; margin:-1px; margin-right:-6px; padding:0;
+border:1px solid #f9f9f9; border-bottom:1px solid #aaa; background-color:#f9f9f9;margin-top:-7px;}
+.tabsheet { display:table; white-space:nowrap; padding-left:10px; margin:0; width:auto;
+font-family:verdana,arial,helvetica,sans-serif; font-size:8px;
+list-style-type:none; list-style-image:none; text-decoration:none; }
+.tabsheet li { background:#f1f1f1; float:left; margin:0 6px 0 0; overflow:hidden; text-align:right; border:1px solid #aaa; border-bottom:none; position:relative; top:11px; -moz-border-radius-topleft:5px; -moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px; -webkit-border-top-right-radius:5px;}
+.tabsheet a {
+display:block; font-size:11px; border:0;
+font-weight:bold; overflow:hidden; padding:6px;
+text-align:right; text-decoration:none; margin: 0; }
+.tabsheet a:first-letter { text-transform:capitalize; }
+.tabsheet li.selected_tab  {
+  border-bottom:1px solid #f1f1f1;
+}
+.tabsheet li:hover, .tabsheet li.selected_tab  {
+margin-top:4px; padding-bottom:3px; padding-top:3px; top:1px;
+ }
+/* .tabsheet a:hover */
+.tabsheet li.selected_tab  a { color: #555; }
+.tabsheet a span { display:block; font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
+
+.sort { clear: none; }
+/* menubar is on all admin pages => No specific css file */
+#menubar {
+  padding:0; width:207px; z-index:99; text-align: left;margin-top:7px;
+  margin-left:0;
+}
+
+#menubar ul.scroll { overflow-y:auto;
+ /* Only IE family supports colored scrollbar */
+ scrollbar-face-color: #ddd; scrollbar-shadow-color: #bbb; scrollbar-highlight-color: #fff;
+ scrollbar-3dlight-color: #d6d6d6; scrollbar-darkshadow-color: #ccc; scrollbar-track-color: #eee;
+ scrollbar-arrow-color: #0cccc; }
+#menubar dd { margin: 0; padding: 0;}
+#menubar dl { width: 200px; border:0; margin: 0; padding: 0; display: block; min-height:35px; border:1px solid #ddd; background-color:#f1f1f1; border-left:none; border-right:1px solid #ddd;}
+#menubar dl.first {border-top:none;border-radius:0 6px 0 0;}
+#menubar dl.first dt {border-radius:0 6px 0 0;}
+#menubar dl.last {border-bottom:1px solid #ddd; border-radius:0 0 6px 0;}
+#menubar dt { background-color: #ddd; margin: 0; display: block; font-weight:bold;
+position:relative; padding: 5px 1px 4px 5px; font-size: 13px; color: #777; }
+#menubar dt  span { cursor:pointer; }
+#menubar li { margin: 0; padding-left:10px; }
+#menubar li A { display:block; }
+#menubar li A:hover { border:none; color:black;}
+#menubar li:hover {background-color:#dbe8f3;}
+#menubar ul { color: #ccc; margin:0; line-height: 25px;
+  list-style-type: none; list-style-position: inside; padding: 0; }
+#adminHome       {background-color:#ddd;border-radius: 0 6px 6px 0;margin-left:0;margin-bottom:17px;}
+#adminHome:hover {background-color:#d0d0d0;}
+
+/* jQuery tooltips */
+.cluetip-default #cluetip-outer { border-color:#999; color: #777; background-color: #eee; }
+.cluetip-default h3#cluetip-title { background-color: #ddd; }
+/* jQuery ui resizable */
+.ui-resizable { position: relative; }
+.ui-wrapper { border: 0; }
+.ui-wrapper input, .ui-wrapper textarea { border: 0; }
+/* jQuery tiptip */
+#tiptip_holder a { color:#42B0FF; }
+
+/* Global handle styles */
+.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; }
+.ui-resizable .ui-resizable-handle { display: block; }
+body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+.ui-resizable-n { cursor: n-resize; height: 6px; width: 100%; top: 0px; left: 0px; background: transparent url(images/resizable-n.gif) no-repeat scroll center top; }
+.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; background: transparent url(images/resizable-s.gif) no-repeat scroll center top; }
+.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; background: transparent url(images/resizable-e.gif) no-repeat scroll right center; }
+.ui-resizable-w { cursor: w-resize; width: 6px; left: 0px; top: 0px; height: 100%; background: transparent url(images/resizable-w.gif) no-repeat scroll right center; }
+.ui-resizable-se { cursor: se-resize; width: 9px; height: 9px; right: 0px; bottom: 0px; background: transparent url(images/resizable-se.gif); }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: 0px; bottom: 0px; background: transparent url(images/resizable-sw.gif); }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: 0px; top: 0px; background: transparent url(images/resizable-nw.gif); }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: 0px; top: 0px; background: transparent url(images/resizable-ne.gif); }
+
+#ui-datepicker-div {background-color: #fff; border:2px solid #aaa;}
+#ui-datepicker-div .ui-datepicker-title {color:black;}
+#ui-datepicker-div .ui-icon-circle-triangle-w {background: transparent url(icon/prev.png) no-repeat;}
+#ui-datepicker-div .ui-icon-circle-triangle-e {background: transparent url(icon/next.png) no-repeat;}
+#ui-datepicker-div A.ui-datepicker-prev:hover,
+#ui-datepicker-div A.ui-datepicker-next:hover
+{
+  background-color:#eee;border:1px solid #aaa;
+}
+
+#ui-datepicker-div .ui-datepicker-control, #ui-datepicker-div  a { background-color: #eee; color: #08f !important;}
+#ui-datepicker-div .ui-datepicker-days-row { background-color: #bbb;}
+#ui-datepicker-div .ui-datepicker-week-end-cell, #ui-datepicker-div .ui-datepicker-week-end-cell  a { background-color: #ddd; color: #0cc; border-color: #bbb; border-top-color: #ddd; border-left-color: #ddd;}
+#ui-datepicker-div .ui-datepicker-title-row { background-color: #eee;}
+#ui-datepicker-div .ui-datepicker-title-row .ui-datepicker-week-end-cell a { color: #0cc;}
+#ui-datepicker-div  a:hover { color: #0cccc !important; border: 0; background-color: #eee !important;}
+#ui-datepicker-div .ui-datepicker-header select { background-color:#bbb; color:#666; font-weight:normal;}
+#ui-datepicker-div .ui-datepicker-links { background-color:#ddd;}
+#ui-datepicker-div .ui-datepicker-header { background-color:#bbb;}
+#ui-datepicker-div .ui-datepicker-current-day { background-color: #eee !important; border-color: #bbb; border-top-color: #eee; border-left-color: #eee;}
+#ui-datepicker-div .ui-datepicker-days-cell { background-color:#bbb; border:1px solid #ddd; border-top-color: #bbb; border-left-color: #bbb;}
+img.ui-datepicker-trigger{margin:-2px 10px 1px -2px;}
+
+INPUT[type="text"].large  { width: 317px; }
+
+.bigbutton {background:none;margin-right:-5px; padding: 10px;height:auto;position:static;width:auto;text-align:right;}
+.bigtext {display:none;position:static;}
+.bigbutton input[type="submit"] {display:inline;position:static;height:auto;width:auto;font-size:18px;padding:10px;}
+
+
+/* hacks */
+* html[lang="en"] body .content h2 , *+html[lang="en"] body .content h2 { text-transform:capitalize; } /* IE */
+*+html  .bigtext { left: 70px; }
+*+html  .bigbutton input, * html  .bigbutton input  { left:0px; position:relative; top:-40px; }
+* html .bigtext { margin-right: 300px; }
+
+.themeBox {background-color:#ddd;}
+.themeBox IMG {border:1px solid white;}
+.themeName {color:black;}
+#themesContent H3 {border-bottom:1px solid #aaa;}
+.themeDefault {background-color:#dbe8f3;}
+
+#pluginsMenuSeparator {border:1px solid #ddd;}
+
+#helpContent A {border-bottom:1px dotted #005E89;}
+#helpContent A:hover {border-bottom:1px solid #d54e21;}
+
+#pwgHead, #footer {
+	background-color: #ddd;
+	color: #666;
+}
+
+
+#pwgHead A, #footer A {color:#444;}
+#pwgHead A:hover, #footer A:hover {color:black; border-color:black;}
+#footer { background-image: url(images/piwigo_logo_small.png);}
+
+.pluginBox, .pluginMiniBox {background-color:#ddd;color:#353535;border-color:#ddd;}
+.pluginBoxNameCell, .pluginMiniBoxNameCell {color:#111;}
+.pluginBox.incompatible, .pluginMiniBox.incompatible {border-color:#a00 !important;}
+.pluginBoxes .merged, .pluginBoxes .missing  {background-color:#d99;border:1px solid #a00;}
+.showInfo {color:#fff;background-color:#999; }
+.showInfo:hover {color:#fff;border:none;background-color:#333}
+
+.languageBox {background-color:#ddd;}
+.languageName {color:black;}
+.languageDefault {background-color:#dbe8f3;}
+
+UL.thumbnails li.rank-of-image {background-color: #ddd;}
+
+#batchManagerGlobal .thumbSelected {background-color:#C2F5C2 !important}
+#batchManagerGlobal #selectedMessage {background-color:#C2F5C2;}
+
+.selectedComment {background-color:#C2F5C2;}
+
+#pwgMain {padding-left:0}
+
+input[type="submit"], input[type="button"], input[type="reset"], a.bigButton {
+  font-size:12px;
+  font-weight:bold;
+  letter-spacing:1px;
+  border:none;
+  background-color:#666666;
+  color:#fff;
+  padding:2px 5px;
+  -moz-border-radius:5px;
+  -webkit-border-radius:5px;
+  border-radius:5px;
+  margin-left:0;
+}
+
+input[type="submit"]:hover, input[type="button"]:hover, input[type="reset"]:hover, a.bigButton:hover {
+  background-color:#ff7700;
+  color:white;
+}
+
+p.albumTitle img {margin-bottom:-3px;}
Index: tags/2.4.0RC3/admin/themes/clear/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/admin/themes/clear/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/clear/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,7 @@
+<?php
+$themeconf = array(
+  'name'    => 'clear',
+  'parent'   => 'default',
+  'admin_icon_dir' => 'admin/themes/clear/icon',
+);
+?>
Index: tags/2.4.0RC3/admin/themes/default/fix-ie5-ie6.css
===================================================================
--- tags/2.4.0RC3/admin/themes/default/fix-ie5-ie6.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/fix-ie5-ie6.css	(revision 14585)
@@ -0,0 +1,35 @@
+/* Issues in IE from 5 to 6 only not to be used with IE7                      */
+
+
+/* to avoid vanishing objects in IE6 */
+H1, #theHeader {
+  width: 100%;	/* <- useless but seems to make IE6 happy */
+}
+.content {
+  height: 1em;	/* for IE6 it's like min-height */
+}
+
+/* fix quickconnect layout */
+FORM#quickconnect FIELDSET {
+  width: 99%;	/* correct an ugly 1 or 2 px misalignement with IE */
+}
+
+/* fix IE with another layout for thumbnails */
+UL.thumbnails SPAN.wrap2 {
+  display: block;
+  position: relative;
+  text-align: left;
+}
+
+UL.thumbnails IMG.thumbnail {
+  position: relative;
+  top: -50%;  /* Is this following hacking technic required ? */
+  /*\*//*/
+    margin-top: -40%;
+  /**/
+}
+UL.thumbnails INPUT {
+  position: absolute;
+  left: 2px;
+  top: 2px;  /* same as other browsers but not so pretty */
+}
Index: tags/2.4.0RC3/admin/themes/default/fix-ie7.css
===================================================================
--- tags/2.4.0RC3/admin/themes/default/fix-ie7.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/fix-ie7.css	(revision 14585)
@@ -0,0 +1,8 @@
+/* fix IE7 footer */
+#the_page { min-height:100%; position:relative; padding:0; margin:0; } 
+#menubar { margin: 0; }
+#footer { left: 0; }
+
+UL.thumbnails li.rank-of-image {
+	text-align:left;
+}
Index: tags/2.4.0RC3/admin/themes/default/icon/index.php
===================================================================
--- tags/2.4.0RC3/admin/themes/default/icon/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/icon/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/themes/default/index.php
===================================================================
--- tags/2.4.0RC3/admin/themes/default/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/themes/default/local_head.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/local_head.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/local_head.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+{if $load_css}
+<!--[if lt IE 7]>
+	<link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie5-ie6.css">
+<![endif]-->
+
+<!--[if IE 7]>
+  <link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie7.css">
+<![endif]-->
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/print.css
===================================================================
--- tags/2.4.0RC3/admin/themes/default/print.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/print.css	(revision 14585)
@@ -0,0 +1,14 @@
+#menubar, .content .navigationBar, UL.categoryActions, 
+.navThumb, #addComment {
+    display: none;
+}
+
+BODY {
+    margin: 0;
+    color: #000000;
+    background: #ffffff;
+}
+
+.content {
+    margin: 0;
+}
Index: tags/2.4.0RC3/admin/themes/default/template/admin.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/admin.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/admin.tpl	(revision 14585)
@@ -0,0 +1,157 @@
+{combine_script id='jquery.ui.accordion' load='header'}{*we load in the header because the accordion is on every admin page and usually all admin pages use the same header combined script but not the same footer script*}
+{footer_script require='jquery.ui.accordion'}
+jQuery(document).ready(function(){ldelim}
+	jQuery('#menubar').accordion({ldelim}
+		header: "dt.rdion",
+		event: "click",
+		autoHeight: false,
+		active: {$ACTIVE_MENU}
+	});
+});
+{/footer_script}
+
+{combine_script id='raphael' load='footer' path='themes/default/js/raphael.js' }
+{footer_script require='raphael'}{literal}
+jQuery(document).ready(function(){
+  Raphael("menubarUsers", 20, 16).path("M21.053,20.8c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68h-0.34c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888C28.469,23.686,22.185,21.252,21.053,20.8zM8.583,20.628c-0.099-0.18-0.148-0.31-0.148-0.31s-0.432,0.239-0.432-0.432s0.432,0.432,0.864-2.159c0,0,1.199-0.336,0.959-3.119H9.538c0,0,0.143-0.591,0.237-1.334c-0.004-0.308,0.006-0.636,0.037-0.996l0.038-0.426c-0.021-0.492-0.107-0.939-0.312-1.226C8.818,9.619,8.53,8.947,6.947,8.467c-1.583-0.48-1.008-0.385-2.159-0.336C3.636,8.179,2.676,8.802,2.676,9.139c0,0-0.72,0.048-1.008,0.336c-0.271,0.271-0.705,1.462-0.757,1.885v0.281c0.047,0.653,0.258,2.449,0.469,2.872l-0.286,0.096c-0.239,2.783,0.959,3.119,0.959,3.119c0.432,2.591,0.864,1.488,0.864,2.159s-0.432,0.432-0.432,0.432s-0.383,1.057-1.343,1.439c-0.061,0.024-0.139,0.056-0.232,0.092v5.234h0.575c-0.029-1.278,0.077-2.927,0.746-3.594C2.587,23.135,3.754,22.551,8.583,20.628zM30.913,11.572c-0.04-0.378-0.127-0.715-0.292-0.946c-0.719-1.008-1.008-1.679-2.59-2.159c-1.584-0.48-1.008-0.385-2.16-0.336C24.72,8.179,23.76,8.802,23.76,9.139c0,0-0.719,0.048-1.008,0.336c-0.271,0.272-0.709,1.472-0.758,1.891h0.033l0.08,0.913c0.02,0.231,0.022,0.436,0.027,0.645c0.09,0.666,0.21,1.35,0.33,1.589l-0.286,0.096c-0.239,2.783,0.96,3.119,0.96,3.119c0.432,2.591,0.863,1.488,0.863,2.159s-0.432,0.432-0.432,0.432s-0.053,0.142-0.163,0.338c4.77,1.9,5.927,2.48,6.279,2.834c0.67,0.667,0.775,2.315,0.746,3.594h0.48v-5.306c-0.016-0.006-0.038-0.015-0.052-0.021c-0.959-0.383-1.343-1.439-1.343-1.439s-0.433,0.239-0.433-0.432s0.433,0.432,0.864-2.159c0,0,0.804-0.229,0.963-1.841v-1.227c-0.001-0.018-0.001-0.033-0.003-0.051h-0.289c0,0,0.215-0.89,0.292-1.861V11.572z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
+
+Raphael("menubarAlbums", 20, 16).path("M6.812,17.202l7.396-3.665v-2.164h-0.834c-0.414,0-0.808-0.084-1.167-0.237v1.159l-7.396,3.667v2.912h2V17.202zM26.561,18.875v-2.913l-7.396-3.666v-1.158c-0.358,0.152-0.753,0.236-1.166,0.236h-0.832l-0.001,2.164l7.396,3.666v1.672H26.561zM16.688,18.875v-7.501h-2v7.501H16.688zM27.875,19.875H23.25c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C29.875,20.771,28.979,19.875,27.875,19.875zM8.125,19.875H3.5c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C10.125,20.771,9.229,19.875,8.125,19.875zM13.375,10.375H18c1.104,0,2-0.896,2-2V3.75c0-1.104-0.896-2-2-2h-4.625c-1.104,0-2,0.896-2,2v4.625C11.375,9.479,12.271,10.375,13.375,10.375zM18,19.875h-4.625c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2H18c1.104,0,2-0.896,2-2v-4.625C20,20.771,19.104,19.875,18,19.875z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
+
+Raphael("menubarPhotos", 20, 16).path("M2.5,4.833v22.334h27V4.833H2.5zM25.25,25.25H6.75V6.75h18.5V25.25zM11.25,14c1.426,0,2.583-1.157,2.583-2.583c0-1.427-1.157-2.583-2.583-2.583c-1.427,0-2.583,1.157-2.583,2.583C8.667,12.843,9.823,14,11.25,14zM24.251,16.25l-4.917-4.917l-6.917,6.917L10.5,16.333l-2.752,2.752v5.165h16.503V16.25z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
+
+Raphael("menubarPlugins", 20, 16).path("M3.739,13.619c0,0,3.516-4.669,5.592-3.642c2.077,1.027-0.414,2.795,1.598,3.719c2.011,0.924,5.048-0.229,4.376-2.899c-0.672-2.67-1.866-0.776-2.798-2.208c-0.934-1.432,4.586-4.59,4.586-4.59s3.361,6.651,4.316,4.911c1.157-2.105,3.193-4.265,5.305-1.025c0,0,1.814,2.412,0.246,3.434s-2.917,0.443-3.506,1.553c-0.586,1.112,3.784,4.093,3.784,4.093s-2.987,4.81-4.926,3.548c-1.939-1.262,0.356-3.364-2.599-3.989c-1.288-0.23-3.438,0.538-3.818,2.34c-0.13,2.709,1.604,2.016,2.797,3.475c1.191,1.457-4.484,4.522-4.484,4.522s-1.584-3.923-3.811-4.657c-2.227-0.735-0.893,2.135-2.917,2.531c-2.024,0.396-4.816-2.399-3.46-4.789c1.358-2.391,3.275-0.044,3.441-1.951C7.629,16.087,3.739,13.619,3.739,13.619z").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
+
+Raphael("menubarTools", 20, 16).path("M26.834,14.693c1.816-2.088,2.181-4.938,1.193-7.334l-3.646,4.252l-3.594-0.699L19.596,7.45l3.637-4.242c-2.502-0.63-5.258,0.13-7.066,2.21c-1.907,2.193-2.219,5.229-1.039,7.693L5.624,24.04c-1.011,1.162-0.888,2.924,0.274,3.935c1.162,1.01,2.924,0.888,3.935-0.274l9.493-10.918C21.939,17.625,24.918,16.896,26.834,14.693z").scale(0.5, 0.5, 0, 0).attr({fill: "#464646", stroke: "none"});
+
+Raphael("menubarConfiguration", 20, 16).path("M26.974,16.514l3.765-1.991c-0.074-0.738-0.217-1.454-0.396-2.157l-4.182-0.579c-0.362-0.872-0.84-1.681-1.402-2.423l1.594-3.921c-0.524-0.511-1.09-0.977-1.686-1.406l-3.551,2.229c-0.833-0.438-1.73-0.77-2.672-0.984l-1.283-3.976c-0.364-0.027-0.728-0.056-1.099-0.056s-0.734,0.028-1.099,0.056l-1.271,3.941c-0.967,0.207-1.884,0.543-2.738,0.986L7.458,4.037C6.863,4.466,6.297,4.932,5.773,5.443l1.55,3.812c-0.604,0.775-1.11,1.629-1.49,2.55l-4.05,0.56c-0.178,0.703-0.322,1.418-0.395,2.157l3.635,1.923c0.041,1.013,0.209,1.994,0.506,2.918l-2.742,3.032c0.319,0.661,0.674,1.303,1.085,1.905l4.037-0.867c0.662,0.72,1.416,1.351,2.248,1.873l-0.153,4.131c0.663,0.299,1.352,0.549,2.062,0.749l2.554-3.283C15.073,26.961,15.532,27,16,27c0.507,0,1.003-0.046,1.491-0.113l2.567,3.301c0.711-0.2,1.399-0.45,2.062-0.749l-0.156-4.205c0.793-0.513,1.512-1.127,2.146-1.821l4.142,0.889c0.411-0.602,0.766-1.243,1.085-1.905l-2.831-3.131C26.778,18.391,26.93,17.467,26.974,16.514zM20.717,21.297l-1.785,1.162l-1.098-1.687c-0.571,0.22-1.186,0.353-1.834,0.353c-2.831,0-5.125-2.295-5.125-5.125c0-2.831,2.294-5.125,5.125-5.125c2.83,0,5.125,2.294,5.125,5.125c0,1.414-0.573,2.693-1.499,3.621L20.717,21.297z").scale(0.5, 0.5, 0, 0).attr({fill: "#464646", stroke: "none"});
+/*
+Raphael("menubarUsers", 20, 16).path("").scale(0.6, 0.6, 0, 0).attr({fill: "#464646", stroke: "none"});
+*/
+});
+{/literal}{/footer_script}
+
+<div id="menubar">
+  <div id="adminHome"><a href="{$U_ADMIN}">{'Administration Home'|@translate}</a></div>
+  <dl class="first">
+    <dt class="rdion"><span id="menubarPhotos">&nbsp;{'Photos'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+        <li><a href="{$U_ADD_PHOTOS}">{'Add'|@translate}</a></li>
+        <li><a href="{$U_RATING}">{'Rating'|@translate}</a></li>
+        <li><a href="{$U_TAGS}">{'Tags'|@translate}</a></li>
+        <li><a href="{$U_RECENT_SET}">{'Recent photos'|@translate}</a></li>
+        <li><a href="{$U_BATCH}">{'Batch Manager'|@translate}</a></li>
+      </ul>
+    </dd>
+  </dl>
+  <dl>
+    <dt class="rdion"><span id="menubarAlbums">&nbsp;{'Albums'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+        <li><a href="{$U_CATEGORIES}">{'Manage'|@translate}</a></li>
+        <li><a href="{$U_CAT_OPTIONS}">{'Properties'|@translate}</a></li>
+      </ul>
+    </dd>
+  </dl>
+  <dl>
+    <dt class="rdion"><span id="menubarUsers">&nbsp;{'Users'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+        <li><a href="{$U_USERS}">{'Manage'|@translate}</a></li>
+        <li><a href="{$U_GROUPS}">{'Groups'|@translate}</a></li>
+        <li><a href="{$U_NOTIFICATION_BY_MAIL}">{'Notification'|@translate}</a></li>
+      </ul>
+    </dd>
+  </dl>
+  <dl>
+    <dt class="rdion"><span id="menubarPlugins">&nbsp;{'Plugins'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+        <li><a href="{$U_PLUGINS}">{'Manage'|@translate}</a></li>
+      </ul>
+      <div id="pluginsMenuSeparator"></div>
+{if !empty($plugin_menu_items)}
+      <ul class="scroll">
+  {foreach from=$plugin_menu_items item=menu_item}
+        <li><a href="{$menu_item.URL}">{$menu_item.NAME}</a></li>
+  {/foreach}
+      </ul>
+{/if}
+    </dd>
+  </dl>
+  <dl>
+    <dt class="rdion"><span id="menubarTools">&nbsp;{'Tools'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+{if $ENABLE_SYNCHRONIZATION}
+        <li><a href="{$U_CAT_UPDATE}">{'Synchronize'|@translate}</a></li>
+        <li><a href="{$U_SITE_MANAGER}">{'Site manager'|@translate}</a></li>
+{/if}
+        <li><a href="{$U_HISTORY_STAT}">{'History'|@translate}</a></li>
+        <li><a href="{$U_MAINTENANCE}">{'Maintenance'|@translate}</a></li>
+{if isset($U_PENDING_COMMENTS)}
+        <li><a href="{$U_PENDING_COMMENTS}">{'Pending Comments'|@translate}</a></li>
+{/if}
+        <li><a href="{$U_UPDATES}">{'Updates'|@translate}</a></li>
+      </ul>
+    </dd>
+  </dl>
+  <dl class="last">
+    <dt class="rdion"><span id="menubarConfiguration">&nbsp;{'Configuration'|@translate}&nbsp;</span></dt>
+    <dd>
+      <ul>
+        <li><a href="{$U_CONFIG_GENERAL}">{'Options'|@translate}</a></li>
+				<li><a href="{$U_CONFIG_DERIVATIVES}">{'Multiple Size'|@translate}</a></li>
+        <li><a href="{$U_CONFIG_MENUBAR}">{'Menu Management'|@translate}</a></li>
+        <li><a href="{$U_CONFIG_EXTENTS}">{'Templates'|@translate}</a></li>
+        <li><a href="{$U_CONFIG_LANGUAGES}">{'Languages'|@translate}</a></li>
+        <li><a href="{$U_CONFIG_THEMES}">{'Themes'|@translate}</a></li>
+      </ul>
+    </dd>
+  </dl>
+</div> <!-- menubar -->
+
+<div id="content" class="content">
+
+  {if isset($TABSHEET)}
+  {$TABSHEET}
+  {/if}
+  {if isset($U_HELP)}
+	{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+  <ul class="HelpActions">
+    <li><a href="{$U_HELP}" onclick="popuphelp(this.href); return false;" title="{'Help'|@translate}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/help.png" alt="(?)"></a></li>
+  </ul>
+  {/if}
+  
+  {if isset($errors)}
+  <div class="errors">
+    <ul>
+      {foreach from=$errors item=error}
+      <li>{$error}</li>
+      {/foreach}
+    </ul>
+  </div>
+  {/if}
+
+  {if isset($infos)}
+  <div class="infos">
+    <ul>
+      {foreach from=$infos item=info}
+      <li>{$info}</li>
+      {/foreach}
+    </ul>
+  </div>
+  {/if}
+
+  {if isset($warnings)}
+  <div class="warnings">
+    <ul>
+      {foreach from=$warnings item=warning}
+      <li>{$warning}</li>
+      {/foreach}
+    </ul>
+  </div>
+  {/if}
+
+  {$ADMIN_CONTENT}
+</div>
Index: tags/2.4.0RC3/admin/themes/default/template/album_notification.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/album_notification.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/album_notification.tpl	(revision 14585)
@@ -0,0 +1,40 @@
+<div class="titrePage">
+  <h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form action="{$F_ACTION}" method="post" id="categoryNotify">
+
+<fieldset id="emailCatInfo">
+  <legend>{'Send an information email to group members'|@translate}</legend>
+
+{if isset($group_mail_options)}
+
+  <p>
+    <strong>{'Group'|@translate}</strong>
+    <br>
+    <select name="group">
+      {html_options options=$group_mail_options}
+    </select>
+  </p>
+
+  <p>
+    <strong>{'Complementary mail content'|@translate}</strong>
+    <br>
+    <textarea cols="50" rows="5" name="mail_content" id="mail_content" class="description">{$MAIL_CONTENT}</textarea>
+  </p>
+
+  <p>
+    <input class="submit" type="submit" value="{'Send'|@translate}" name="submitEmail">
+  </p>
+
+{elseif isset($no_group_in_gallery) and $no_group_in_gallery}
+  <p>{'There is no group in this gallery.'|@translate} <a href="admin.php?page=group_list" class="externalLink">{'Group management'|@translate}</a></p>
+{else}
+  <p>
+    {'No group is permitted to see this private album'|@translate}.
+    <a href="{$permission_url}" class="externalLink">{'Permission management'|@translate}</a>
+  </p>
+{/if}
+</fieldset>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/batch_manager_global.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/batch_manager_global.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/batch_manager_global.tpl	(revision 14585)
@@ -0,0 +1,828 @@
+{include file='include/tag_selection.inc.tpl'}
+{include file='include/datepicker.inc.tpl'}
+{include file='include/colorbox.inc.tpl'}
+{include file='include/add_album.inc.tpl'}
+
+{footer_script}{literal}
+  pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#date_creation_year", "#date_creation_linked_date", "#date_creation_action_set");
+{/literal}{/footer_script}
+
+{footer_script}{literal}
+/* Shift-click: select all photos between the click and the shift+click */
+jQuery(document).ready(function() {
+  var last_clicked=0;
+  var last_clickedstatus=true;
+  jQuery.fn.enableShiftClick = function() {
+    var inputs = [];
+    var count=0;
+    var This=$(this);
+    this.find('input[type=checkbox]').each(function() {
+      var pos=count;
+      inputs[count++]=this;
+      $(this).bind("shclick", function (dummy,event) {
+        if (event.shiftKey) {
+          var first = last_clicked;
+          var last = pos;
+          if (first > last) {
+            first=pos;
+            last=last_clicked;
+          }
+
+          for (var i=first; i<=last;i++) {
+            input = $(inputs[i]);
+            $(input).attr('checked', last_clickedstatus);
+            if (last_clickedstatus)
+            {
+              $(input).siblings("span.wrap2").addClass("thumbSelected");
+            }
+            else
+            {
+              $(input).siblings("span.wrap2").removeClass("thumbSelected");
+            }
+          }
+        }
+        else {
+          last_clicked = pos;
+          last_clickedstatus = this.checked;
+        }
+        return true;
+      });
+      $(this).click(function(event) {console.log(event.shiftKey);$(this).triggerHandler("shclick",event)});
+    });
+  }
+});
+{/literal}{/footer_script}
+
+{combine_script id='jquery.tokeninput' load='footer' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
+{combine_script id='jquery.progressBar' load='footer' path='themes/default/js/plugins/jquery.progressbar.min.js'}
+{combine_script id='jquery.ajaxmanager' load='footer' path='themes/default/js/plugins/jquery.ajaxmanager.js'}
+
+{footer_script require='jquery.tokeninput'}
+jQuery(document).ready(function() {ldelim}
+  jQuery("a.preview-box").colorbox();
+  
+	var tag_src = [{foreach from=$tags item=tag name=tags}{ldelim}name:"{$tag.name|@escape:'javascript'}",id:"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}];
+  jQuery("#tags").tokenInput(
+    tag_src,
+    {ldelim}
+      hintText: '{'Type in a search term'|@translate}',
+      noResultsText: '{'No results'|@translate}',
+      searchingText: '{'Searching...'|@translate}',
+      newText: ' ({'new'|@translate})',
+      animateDropdown: false,
+      preventDuplicates: true,
+      allowCreation: true
+    }
+  );
+	
+  jQuery("#tagsFilter").tokenInput(
+    tag_src,
+    {ldelim}
+      hintText: '{'Type in a search term'|@translate}',
+      noResultsText: '{'No results'|@translate}',
+      searchingText: '{'Searching...'|@translate}',
+      animateDropdown: false,
+      preventDuplicates: true,
+      allowCreation: false
+    }
+  );
+
+});
+{/footer_script}
+
+{footer_script}
+var nb_thumbs_page = {$nb_thumbs_page};
+var nb_thumbs_set = {$nb_thumbs_set};
+var applyOnDetails_pattern = "{'on the %d selected photos'|@translate}";
+var all_elements = [{if !empty($all_elements)}{','|@implode:$all_elements}{/if}];
+var derivatives = {ldelim}
+	elements: null,
+	done: 0,
+	total: 0,
+	
+	finished: function() {ldelim}
+		return derivatives.done == derivatives.total && derivatives.elements && derivatives.elements.length==0;
+	}
+};
+
+var selectedMessage_pattern = "{'%d of %d photos selected'|@translate}";
+var selectedMessage_none = "{'No photo selected, %d photos in current set'|@translate}";
+var selectedMessage_all = "{'All %d photos are selected'|@translate}";
+
+var width_str = '{'Width'|@translate}';
+var height_str = '{'Height'|@translate}';
+var max_width_str = '{'Maximum Width'|@translate}';
+var max_height_str = '{'Maximum Height'|@translate}';
+{literal}
+function str_repeat(i, m) {
+        for (var o = []; m > 0; o[--m] = i);
+        return o.join('');
+}
+
+function sprintf() {
+        var i = 0, a, f = arguments[i++], o = [], m, p, c, x, s = '';
+        while (f) {
+                if (m = /^[^\x25]+/.exec(f)) {
+                        o.push(m[0]);
+                }
+                else if (m = /^\x25{2}/.exec(f)) {
+                        o.push('%');
+                }
+                else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
+                        if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) {
+                                throw('Too few arguments.');
+                        }
+                        if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) {
+                                throw('Expecting number but found ' + typeof(a));
+                        }
+                        switch (m[7]) {
+                                case 'b': a = a.toString(2); break;
+                                case 'c': a = String.fromCharCode(a); break;
+                                case 'd': a = parseInt(a); break;
+                                case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
+                                case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
+                                case 'o': a = a.toString(8); break;
+                                case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
+                                case 'u': a = Math.abs(a); break;
+                                case 'x': a = a.toString(16); break;
+                                case 'X': a = a.toString(16).toUpperCase(); break;
+                        }
+                        a = (/[def]/.test(m[7]) && m[2] && a >= 0 ? '+'+ a : a);
+                        c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
+                        x = m[5] - String(a).length - s.length;
+                        p = m[5] ? str_repeat(c, x) : '';
+                        o.push(s + (m[4] ? a + p : p + a));
+                }
+                else {
+                        throw('Huh ?!');
+                }
+                f = f.substring(m[0].length);
+        }
+        return o.join('');
+}
+
+function progress(success) {
+  jQuery('#progressBar').progressBar(derivatives.done, {
+    max: derivatives.total,
+    textFormat: 'fraction',
+    boxImage: 'themes/default/images/progressbar.gif',
+    barImage: 'themes/default/images/progressbg_orange.gif'
+  });
+	if (success !== undefined) {
+		var type = success ? 'regenerateSuccess': 'regenerateError',
+			s = jQuery('[name="'+type+'"]').val();
+		jQuery('[name="'+type+'"]').val(++s);
+	}
+
+	if (derivatives.finished()) {
+		jQuery('#applyAction').click();
+	}
+}
+
+$(document).ready(function() {
+  function checkPermitAction() {
+    var nbSelected = 0;
+    if ($("input[name=setSelected]").is(':checked')) {
+      nbSelected = nb_thumbs_set;
+    }
+    else {
+      $(".thumbnails input[type=checkbox]").each(function() {
+         if ($(this).is(':checked')) {
+           nbSelected++;
+         }
+      });
+    }
+
+    if (nbSelected == 0) {
+      $("#permitAction").hide();
+      $("#forbidAction").show();
+    }
+    else {
+      $("#permitAction").show();
+      $("#forbidAction").hide();
+    }
+
+    $("#applyOnDetails").text(
+      sprintf(
+        applyOnDetails_pattern,
+        nbSelected
+      )
+    );
+
+    // display the number of currently selected photos in the "Selection" fieldset
+    if (nbSelected == 0) {
+      $("#selectedMessage").text(
+        sprintf(
+          selectedMessage_none,
+          nb_thumbs_set
+        )
+      );
+    }
+    else if (nbSelected == nb_thumbs_set) {
+      $("#selectedMessage").text(
+        sprintf(
+          selectedMessage_all,
+          nb_thumbs_set
+        )
+      );
+    }
+    else {
+      $("#selectedMessage").text(
+        sprintf(
+          selectedMessage_pattern,
+          nbSelected,
+          nb_thumbs_set
+        )
+      );
+    }
+  }
+
+  $('img.thumbnail').tipTip({
+    'delay' : 0,
+    'fadeIn' : 200,
+    'fadeOut' : 200
+  });
+
+  $("[id^=action_]").hide();
+
+  $("select[name=selectAction]").change(function () {
+    $("[id^=action_]").hide();
+    $("#action_"+$(this).attr("value")).show();
+
+    /* make sure the #albumSelect is on the right select box so that the */
+    /* "add new album" popup fills the right select box                  */
+    if ("associate" == $(this).attr("value") || "move" == $(this).attr("value")) {
+      jQuery("#albumSelect").removeAttr("id");
+      jQuery("#action_"+$(this).attr("value")+" select").attr("id", "albumSelect");
+    }
+
+    if ($(this).val() != -1) {
+      $("#applyActionBlock").show();
+    }
+    else {
+      $("#applyActionBlock").hide();
+    }
+  });
+
+  $(".wrap1 label").click(function (event) {
+    $("input[name=setSelected]").attr('checked', false);
+
+    var wrap2 = $(this).children(".wrap2");
+    var checkbox = $(this).children("input[type=checkbox]");
+
+    checkbox.triggerHandler("shclick",event);
+
+    if ($(checkbox).is(':checked')) {
+      $(wrap2).addClass("thumbSelected"); 
+    }
+    else {
+      $(wrap2).removeClass('thumbSelected'); 
+    }
+
+    checkPermitAction();
+  });
+
+  $("#selectAll").click(function () {
+    $("input[name=setSelected]").attr('checked', false);
+    selectPageThumbnails();
+    checkPermitAction();
+    return false;
+  });
+
+  function selectPageThumbnails() {
+    $(".thumbnails label").each(function() {
+      var wrap2 = $(this).children(".wrap2");
+      var checkbox = $(this).children("input[type=checkbox]");
+
+      $(checkbox).attr('checked', true);
+      $(wrap2).addClass("thumbSelected"); 
+    });
+  }
+
+  $("#selectNone").click(function () {
+    $("input[name=setSelected]").attr('checked', false);
+
+    $(".thumbnails label").each(function() {
+      var wrap2 = $(this).children(".wrap2");
+      var checkbox = $(this).children("input[type=checkbox]");
+
+      $(checkbox).attr('checked', false);
+      $(wrap2).removeClass("thumbSelected"); 
+    });
+    checkPermitAction();
+    return false;
+  });
+
+  $("#selectInvert").click(function () {
+    $("input[name=setSelected]").attr('checked', false);
+
+    $(".thumbnails label").each(function() {
+      var wrap2 = $(this).children(".wrap2");
+      var checkbox = $(this).children("input[type=checkbox]");
+
+      $(checkbox).attr('checked', !$(checkbox).is(':checked'));
+
+      if ($(checkbox).is(':checked')) {
+        $(wrap2).addClass("thumbSelected"); 
+      }
+      else {
+        $(wrap2).removeClass('thumbSelected'); 
+      }
+    });
+    checkPermitAction();
+    return false;
+  });
+
+  $("#selectSet").click(function () {
+    selectPageThumbnails();
+    $("input[name=setSelected]").attr('checked', true);
+    checkPermitAction();
+    return false;
+  });
+
+  $("input[name=remove_author]").click(function () {
+    if ($(this).is(':checked')) {
+      $("input[name=author]").hide();
+    }
+    else {
+      $("input[name=author]").show();
+    }
+  });
+
+  $("input[name=remove_title]").click(function () {
+    if ($(this).is(':checked')) {
+      $("input[name=title]").hide();
+    }
+    else {
+      $("input[name=title]").show();
+    }
+  });
+
+  $("input[name=remove_date_creation]").click(function () {
+    if ($(this).is(':checked')) {
+      $("#set_date_creation").hide();
+    }
+    else {
+      $("#set_date_creation").show();
+    }
+  });
+
+  $(".removeFilter").click(function () {
+    var filter = $(this).parent('li').attr("id");
+    filter_disable(filter);
+
+    return false;
+  });
+
+  function filter_enable(filter) {
+    /* show the filter*/
+    $("#"+filter).show();
+
+    /* check the checkbox to declare we use this filter */
+    $("input[type=checkbox][name="+filter+"_use]").attr("checked", true);
+
+    /* forbid to select this filter in the addFilter list */
+    $("#addFilter").children("option[value="+filter+"]").attr("disabled", "disabled");
+  }
+
+  $("#addFilter").change(function () {
+    var filter = $(this).attr("value");
+    filter_enable(filter);
+    $(this).attr("value", -1);
+  });
+
+  function filter_disable(filter) {
+    /* hide the filter line */
+    $("#"+filter).hide();
+
+    /* uncheck the checkbox to declare we do not use this filter */
+    $("input[name="+filter+"_use]").removeAttr("checked");
+
+    /* give the possibility to show it again */
+    $("#addFilter").children("option[value="+filter+"]").removeAttr("disabled");
+  }
+
+  $("#removeFilters").click(function() {
+    $("#filterList li").each(function() {
+      var filter = $(this).attr("id");
+      filter_disable(filter);
+    });
+    return false;
+  });
+
+  jQuery('#applyAction').click(function() {
+		if (jQuery('[name="selectAction"]').val() != 'generate_derivatives'
+			|| derivatives.finished() )
+		{
+			return true;
+		}
+
+		jQuery('.bulkAction').hide();
+
+		var queuedManager = jQuery.manageAjax.create('queued', { 
+			queue: true,  
+			cacheResponse: false,
+			maxRequests: 1
+		});
+
+		derivatives.elements = [];
+		if (jQuery('input[name="setSelected"]').attr('checked'))
+			derivatives.elements = all_elements;
+		else
+			jQuery('input[name="selection[]"]').each(function() {
+				if (jQuery(this).attr('checked')) {
+					derivatives.elements.push(jQuery(this).val());
+				}
+			});
+
+		jQuery('#applyActionBlock').hide();
+		jQuery('select[name="selectAction"]').hide();
+		jQuery('#regenerationMsg').show();
+		
+		progress();
+		getDerivativeUrls();
+		return false;
+  });
+
+	function getDerivativeUrls() {
+		var ids = derivatives.elements.splice(0, 500);
+		var params = {max_urls: 100000, ids: ids, types: []};
+		jQuery("#action_generate_derivatives input").each( function(i, t) {
+			if ($(t).attr("checked"))
+				params.types.push( t.value );
+		} );
+
+		jQuery.ajax( {
+			type: "POST",
+			url: 'ws.php?format=json&method=pwg.getMissingDerivatives',
+			data: params,
+			dataType: "json",
+			success: function(data) {
+				if (!data.stat || data.stat != "ok") {
+					return;
+				}
+				derivatives.total += data.result.urls.length;
+				progress();
+				for (var i=0; i < data.result.urls.length; i++) {
+					jQuery.manageAjax.add("queued", {
+						type: 'GET', 
+						url: data.result.urls[i] + "&ajaxload=true", 
+						dataType: 'json',
+						success: ( function(data) { derivatives.done++; progress(true) }),
+						error: ( function(data) { derivatives.done++; progress(false) })
+					});
+				}
+				if (derivatives.elements.length)
+					setTimeout( getDerivativeUrls, 25 * (derivatives.total-derivatives.done));
+			}
+		} );
+	}
+
+  checkPermitAction()
+});
+
+jQuery(window).load(function() {
+	var max_w=0, max_h=0;
+	$(".thumbnails img").each(function () {
+		max_w = Math.max(max_w, $(this).width() );
+		max_h = Math.max(max_h, $(this).height() );
+	});
+	max_w += 10;
+	max_h += 35;
+	$("ul.thumbnails span, ul.thumbnails label").css('width', max_w+'px').css('height', max_h+'px');
+	$('ul.thumbnails').enableShiftClick();
+});
+{/literal}{/footer_script}
+
+<div id="batchManagerGlobal">
+
+<h2>{'Batch Manager'|@translate}</h2>
+
+  <form action="{$F_ACTION}" method="post">
+
+  <fieldset>
+    <legend>{'Filter'|@translate}</legend>
+
+    <ul id="filterList">
+      <li id="filter_prefilter" {if !isset($filter.prefilter)}style="display:none"{/if}>
+        <a href="#" class="removeFilter" title="{'remove this filter'|@translate}"><span>[x]</span></a>
+        <input type="checkbox" name="filter_prefilter_use" class="useFilterCheckbox" {if isset($filter.prefilter)}checked="checked"{/if}>
+        {'Predefined filter'|@translate}
+        <select name="filter_prefilter">
+          {foreach from=$prefilters item=prefilter}
+          <option value="{$prefilter.ID}" {if $filter.prefilter eq $prefilter.ID}selected="selected"{/if}>{$prefilter.NAME}</option>
+          {/foreach}
+        </select>
+      </li>
+      <li id="filter_category" {if !isset($filter.category)}style="display:none"{/if}>
+        <a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
+        <input type="checkbox" name="filter_category_use" class="useFilterCheckbox" {if isset($filter.category)}checked="checked"{/if}>
+        {'Album'|@translate}
+        <select style="width:400px" name="filter_category" size="1">
+          {html_options options=$filter_category_options selected=$filter_category_options_selected}
+        </select>
+        <label><input type="checkbox" name="filter_category_recursive" {if isset($filter.category_recursive)}checked="checked"{/if}> {'include child albums'|@translate}</label>
+      </li>
+      <li id="filter_tags" {if !isset($filter.tags)}style="display:none"{/if}>
+        <a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
+        <input type="checkbox" name="filter_tags_use" class="useFilterCheckbox" {if isset($filter.tags)}checked="checked"{/if}>
+        {'Tags'|@translate}
+        <select id="tagsFilter" name="filter_tags">
+          {foreach from=$filter_tags item=tag}
+          <option value="{$tag.id}">{$tag.name}</option>
+          {/foreach}
+        </select>
+        <label><span><input type="radio" name="tag_mode" value="AND" {if !isset($filter.tag_mode) or $filter.tag_mode eq 'AND'}checked="checked"{/if}> {'All tags'|@translate}</span></label>
+        <label><span><input type="radio" name="tag_mode" value="OR" {if isset($filter.tag_mode) and $filter.tag_mode eq 'OR'}checked="checked"{/if}> {'Any tag'|@translate}</span></label>
+      </li>
+      <li id="filter_level" {if !isset($filter.level)}style="display:none"{/if}>
+        <a href="#" class="removeFilter" title="remove this filter"><span>[x]</span></a>
+        <input type="checkbox" name="filter_level_use" class="useFilterCheckbox" {if isset($filter.level)}checked="checked"{/if}>
+        {'Privacy level'|@translate}
+        <select name="filter_level" size="1">
+          {html_options options=$filter_level_options selected=$filter_level_options_selected}
+        </select>
+        <label><input type="checkbox" name="filter_level_include_lower" {if isset($filter.level_include_lower)}checked="checked"{/if}> {'include photos with lower privacy level'|@translate}</label>
+      </li>
+    </ul>
+
+    <p class="actionButtons" style="">
+      <select id="addFilter">
+        <option value="-1">{'Add a filter'|@translate}</option>
+        <option disabled="disabled">------------------</option>
+        <option value="filter_prefilter">{'Predefined filter'|@translate}</option>
+        <option value="filter_category">{'Album'|@translate}</option>
+				<option value="filter_tags">{'Tags'|@translate}</option>
+        <option value="filter_level">{'Privacy level'|@translate}</option>
+      </select>
+<!--      <input id="removeFilters" class="submit" type="submit" value="Remove all filters" name="removeFilters"> -->
+      <a id="removeFilters" href="">{'Remove all filters'|@translate}</a>
+    </p>
+
+    <p class="actionButtons" id="applyFilterBlock">
+      <input id="applyFilter" class="submit" type="submit" value="{'Refresh photo set'|@translate}" name="submitFilter">
+    </p>
+
+  </fieldset>
+
+  <fieldset>
+
+    <legend>{'Selection'|@translate}</legend>
+
+  {if !empty($thumbnails)}
+  <p id="checkActions">
+    {'Select:'|@translate}
+{if $nb_thumbs_set > $nb_thumbs_page}
+    <a href="#" id="selectAll">{'The whole page'|@translate}</a>,
+    <a href="#" id="selectSet">{'The whole set'|@translate}</a>,
+{else}
+    <a href="#" id="selectAll">{'All'|@translate}</a>,
+{/if}
+    <a href="#" id="selectNone">{'None'|@translate}</a>,
+    <a href="#" id="selectInvert">{'Invert'|@translate}</a>
+
+    <span id="selectedMessage"></span>
+
+    <input type="checkbox" name="setSelected" style="display:none" {if count($selection) == $nb_thumbs_set}checked="checked"{/if}>
+  </p>
+
+    <ul class="thumbnails">
+			{foreach from=$thumbnails item=thumbnail}
+				{if in_array($thumbnail.ID, $selection)}
+					{assign var='isSelected' value=true}
+				{else}
+					{assign var='isSelected' value=false}
+				{/if}
+			<li>
+				<span class="wrap1">
+					<label>
+						<span class="wrap2{if $isSelected} thumbSelected{/if}">
+						<div class="actions"><a href="{$thumbnail.FILE_SRC}" class="preview-box">{'Zoom'|@translate}</a> &middot; <a href="{$thumbnail.U_EDIT}" target="_blank">{'Edit'|@translate}</a></div>
+							{if $thumbnail.LEVEL > 0}
+							<em class="levelIndicatorB">{$pwg->l10n($pwg->sprintf('Level %d',$thumbnail.LEVEL))}</em>
+							<em class="levelIndicatorF" title="{'Who can see these photos?'|@translate} : ">{$pwg->l10n($pwg->sprintf('Level %d',$thumbnail.LEVEL))}</em>
+							{/if}
+							<span>
+								<img src="{$thumbnail.TN_SRC}" alt="{$thumbnail.FILE}" title="{$thumbnail.TITLE|@escape:'html'}" class="thumbnail">
+							</span>
+						</span>
+						<input type="checkbox" name="selection[]" value="{$thumbnail.ID}" {if $isSelected}checked="checked"{/if}>
+					</label>
+				</span>
+			</li>
+      {/foreach}
+    </ul>
+
+  {if !empty($navbar) }
+  <div style="clear:both;">
+
+    <div style="float:left">
+    {include file='navigation_bar.tpl'|@get_extent:'navbar'}
+    </div>
+
+    <div style="float:right;margin-top:10px;">{'display'|@translate}
+      <a href="{$U_DISPLAY}&amp;display=20">20</a>
+      &middot; <a href="{$U_DISPLAY}&amp;display=50">50</a>
+      &middot; <a href="{$U_DISPLAY}&amp;display=100">100</a>
+      &middot; <a href="{$U_DISPLAY}&amp;display=all">{'all'|@translate}</a>
+      {'photos per page'|@translate}
+    </div>
+  </div>
+  {/if}
+
+  {else}
+  <div>{'No photo in the current set.'|@translate}</div>
+  {/if}
+  </fieldset>
+
+  <fieldset id="action">
+
+    <legend>{'Action'|@translate}</legend>
+      <div id="forbidAction"{if count($selection) != 0} style="display:none"{/if}>{'No photo selected, no action possible.'|@translate}</div>
+      <div id="permitAction"{if count($selection) == 0} style="display:none"{/if}>
+
+    <select name="selectAction">
+      <option value="-1">{'Choose an action'|@translate}</option>
+      <option disabled="disabled">------------------</option>
+  {if isset($show_delete_form) }
+      <option value="delete">{'Delete selected photos'|@translate}</option>
+  {/if}
+      <option value="associate">{'Associate to album'|@translate}</option>
+      <option value="move">{'Move to album'|@translate}</option>
+  {if !empty($dissociate_options)}
+      <option value="dissociate">{'Dissociate from album'|@translate}</option>
+  {/if}
+      <option value="add_tags">{'Add tags'|@translate}</option>
+  {if !empty($DEL_TAG_SELECTION)}
+      <option value="del_tags">{'remove tags'|@translate}</option>
+  {/if}
+      <option value="author">{'Set author'|@translate}</option>
+      <option value="title">{'Set title'|@translate}</option>
+      <option value="date_creation">{'Set creation date'|@translate}</option>
+      <option value="level">{'Who can see these photos?'|@translate}</option>
+      <option value="metadata">{'Synchronize metadata'|@translate}</option>
+  {if ($IN_CADDIE)}
+      <option value="remove_from_caddie">{'Remove from caddie'|@translate}</option>
+  {else}
+      <option value="add_to_caddie">{'Add to caddie'|@translate}</option>
+  {/if}
+		<option value="delete_derivatives">{'Delete multiple size images'|@translate}</option>
+		<option value="generate_derivatives">{'Generate multiple size images'|@translate}</option>
+  {if !empty($element_set_global_plugins_actions)}
+    {foreach from=$element_set_global_plugins_actions item=action}
+      <option value="{$action.ID}">{$action.NAME}</option>
+    {/foreach}
+  {/if}
+    </select>
+
+    <!-- delete -->
+    <div id="action_delete" class="bulkAction">
+    <p><label><input type="checkbox" name="confirm_deletion" value="1"> {'Are you sure?'|@translate}</label></p>
+    </div>
+
+    <!-- associate -->
+    <div id="action_associate" class="bulkAction">
+          <select style="width:400px" name="associate" size="1">
+            {html_options options=$associate_options }
+         </select>
+<br>{'... or '|@translate}</span><a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
+    </div>
+
+    <!-- move -->
+    <div id="action_move" class="bulkAction">
+          <select style="width:400px" name="move" size="1">
+            {html_options options=$move_options }
+         </select>
+<br>{'... or '|@translate}</span><a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
+    </div>
+
+
+    <!-- dissociate -->
+    <div id="action_dissociate" class="bulkAction">
+          <select style="width:400px" name="dissociate" size="1">
+            {if !empty($dissociate_options)}{html_options options=$dissociate_options }{/if}
+          </select>
+    </div>
+
+
+    <!-- add_tags -->
+    <div id="action_add_tags" class="bulkAction">
+<select id="tags" name="add_tags">
+</select>
+    </div>
+
+    <!-- del_tags -->
+    <div id="action_del_tags" class="bulkAction">
+{$DEL_TAG_SELECTION}
+    </div>
+
+    <!-- author -->
+    <div id="action_author" class="bulkAction">
+    <label><input type="checkbox" name="remove_author"> {'remove author'|@translate}</label><br>
+    {assign var='authorDefaultValue' value='Type here the author name'|@translate}
+<input type="text" class="large" name="author" value="{$authorDefaultValue}" onfocus="this.value=(this.value=='{$authorDefaultValue}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$authorDefaultValue}' : this.value;">
+    </div>    
+
+    <!-- title -->
+    <div id="action_title" class="bulkAction">
+    <label><input type="checkbox" name="remove_title"> {'remove title'|@translate}</label><br>
+    {assign var='titleDefaultValue' value='Type here the title'|@translate}
+<input type="text" class="large" name="title" value="{$titleDefaultValue}" onfocus="this.value=(this.value=='{$titleDefaultValue}') ? '' : this.value;" onblur="this.value=(this.value=='') ? '{$titleDefaultValue}' : this.value;">
+    </div>
+
+    <!-- date_creation -->
+    <div id="action_date_creation" class="bulkAction">
+      <label><input type="checkbox" name="remove_date_creation"> {'remove creation date'|@translate}</label><br>
+      <div id="set_date_creation">
+          <select id="date_creation_day" name="date_creation_day">
+             <option value="0">--</option>
+            {section name=day start=1 loop=32}
+              <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$DATE_CREATION_DAY}selected="selected"{/if}>{$smarty.section.day.index}</option>
+            {/section}
+          </select>
+          <select id="date_creation_month" name="date_creation_month">
+            {html_options options=$month_list selected=$DATE_CREATION_MONTH}
+          </select>
+          <input id="date_creation_year"
+                 name="date_creation_year"
+                 type="text"
+                 size="4"
+                 maxlength="4"
+                 value="{$DATE_CREATION_YEAR}">
+          <input id="date_creation_linked_date" name="date_creation_linked_date" type="hidden" size="10" disabled="disabled">
+      </div>
+    </div>
+
+    <!-- level -->
+    <div id="action_level" class="bulkAction">
+        <select name="level" size="1">
+          {html_options options=$level_options selected=$level_options_selected}
+        </select>
+    </div>
+
+    <!-- metadata -->
+    <div id="action_metadata" class="bulkAction">
+    </div>
+
+		<!-- generate derivatives -->
+		<div id="action_generate_derivatives" class="bulkAction">
+			<a href="javascript:selectGenerateDerivAll()">{'All'|@translate}</a>,
+			<a href="javascript:selectGenerateDerivNone()">{'None'|@translate}</a>
+			<br>
+			{foreach from=$generate_derivatives_types key=type item=disp}
+				<label><input type="checkbox" name="generate_derivatives_type[]" value="{$type}"> {$disp}</label>
+			{/foreach}
+			{footer_script}
+			function selectGenerateDerivAll() {ldelim}
+				$("#action_generate_derivatives input[type=checkbox]").attr("checked", true);
+			}
+			function selectGenerateDerivNone() {ldelim}
+				$("#action_generate_derivatives input[type=checkbox]").attr("checked", false);
+			}
+			{/footer_script}
+		</div>
+
+		<!-- delete derivatives -->
+		<div id="action_delete_derivatives" class="bulkAction">
+			<a href="javascript:selectDelDerivAll()">{'All'|@translate}</a>,
+			<a href="javascript:selectDelDerivNone()">{'None'|@translate}</a>
+			<br>
+			{foreach from=$del_derivatives_types key=type item=disp}
+				<label><input type="checkbox" name="del_derivatives_type[]" value="{$type}"> {$disp}</label>
+			{/foreach}
+			{footer_script}
+			function selectDelDerivAll() {ldelim}
+				$("#action_delete_derivatives input[type=checkbox]").attr("checked", true);
+			}
+			function selectDelDerivNone() {ldelim}
+				$("#action_delete_derivatives input[type=checkbox]").attr("checked", false);
+			}
+			{/footer_script}
+		</div>
+		
+    <!-- progress bar -->
+    <div id="regenerationMsg" class="bulkAction" style="display:none">
+      <p id="regenerationText" style="margin-bottom:10px;">{'Generate multiple size images'|@translate}</p>
+      <span class="progressBar" id="progressBar"></span>
+      <input type="hidden" name="regenerateSuccess" value="0">
+      <input type="hidden" name="regenerateError" value="0">
+    </div>
+
+    <!-- plugins -->
+{if !empty($element_set_global_plugins_actions)}
+  {foreach from=$element_set_global_plugins_actions item=action}
+    <div id="action_{$action.ID}" class="bulkAction">
+    {if !empty($action.CONTENT)}{$action.CONTENT}{/if}
+    </div>
+  {/foreach}
+{/if}
+
+    <p id="applyActionBlock" style="display:none" class="actionButtons">
+      <input id="applyAction" class="submit" type="submit" value="{'Apply action'|@translate}" name="submit"> <span id="applyOnDetails"></span></p>
+
+    </div> <!-- #permitAction -->
+  </fieldset>
+
+  </form>
+
+</div> <!-- #batchManagerGlobal -->
Index: tags/2.4.0RC3/admin/themes/default/template/batch_manager_unit.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/batch_manager_unit.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/batch_manager_unit.tpl	(revision 14585)
@@ -0,0 +1,152 @@
+{include file='include/autosize.inc.tpl'}
+{include file='include/datepicker.inc.tpl'}
+{include file='include/colorbox.inc.tpl'}
+
+{combine_script id='jquery.tokeninput' load='async' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
+{footer_script require='jquery.tokeninput'}
+var tag_boxes_selector = "";
+{foreach from=$elements item=element name=element}
+{if $smarty.foreach.element.first}
+var prefix = "";
+{else}
+prefix = ", ";
+{/if}
+	tag_boxes_selector = tag_boxes_selector + prefix + "#tags-" + {$element.ID};
+{/foreach}
+
+jQuery(document).ready(function() {ldelim}
+  jQuery(tag_boxes_selector).tokenInput(
+    [{foreach from=$tags item=tag name=tags}{ldelim}"name":"{$tag.name|@escape:'javascript'}","id":"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}],
+    {ldelim}
+      hintText: '{'Type in a search term'|@translate}',
+      noResultsText: '{'No results'|@translate}',
+      searchingText: '{'Searching...'|@translate}',
+      newText: ' ({'new'|@translate})',
+      animateDropdown: false,
+      preventDuplicates: true,
+      allowCreation: true
+    }
+  );
+
+  jQuery("a.preview-box").colorbox();
+});
+{/footer_script}
+
+<h2>{'Batch Manager'|@translate}</h2>
+
+<form action="{$F_ACTION}" method="POST">
+<fieldset>
+  <legend>{'Display options'|@translate}</legend>
+  <p>{'photos per page'|@translate} :
+      <a href="{$U_ELEMENTS_PAGE}&amp;display=5">5</a>
+    | <a href="{$U_ELEMENTS_PAGE}&amp;display=10">10</a>
+    | <a href="{$U_ELEMENTS_PAGE}&amp;display=50">50</a>
+    | <a href="{$U_ELEMENTS_PAGE}&amp;display=all">{'all'|@translate}</a>
+  </p>
+
+</fieldset>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+{if !empty($elements) }
+<div><input type="hidden" name="element_ids" value="{$ELEMENT_IDS}"></div>
+{foreach from=$elements item=element}
+<fieldset class="elementEdit">
+  <legend>{$element.LEGEND}</legend>
+
+  <span class="thumb">
+    <a href="{$element.FILE_SRC}" class="preview-box" title="{$element.LEGEND}"><img src="{$element.TN_SRC}" alt=""></a>
+    <br/>
+    <a href="{$element.U_EDIT}">{'Informations'|@translate}</a>
+  </span>
+
+  <table>
+
+    <tr>
+      <td><strong>{'Name'|@translate}</strong></td>
+      <td><input type="text" class="large" name="name-{$element.ID}" value="{$element.NAME}"></td>
+    </tr>
+
+    <tr>
+      <td><strong>{'Author'|@translate}</strong></td>
+      <td><input type="text" class="large" name="author-{$element.ID}" value="{$element.AUTHOR}"></td>
+    </tr>
+
+    <tr>
+      <td><strong>{'Creation date'|@translate}</strong></td>
+      <td>
+        <label><input type="radio" name="date_creation_action-{$element.ID}" value="unset"> {'unset'|@translate}</label>
+        <label><input type="radio" name="date_creation_action-{$element.ID}" value="set" id="date_creation_action_set-{$element.ID}"> {'set to'|@translate}</label>
+
+        <select id="date_creation_day-{$element.ID}" name="date_creation_day-{$element.ID}">
+         	<option value="0">--</option>
+           {section name=day start=1 loop=32}
+             <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$element.DATE_CREATION_DAY}selected="selected"{/if}>{$smarty.section.day.index}</option>
+           {/section}
+        </select>
+        <select id="date_creation_month-{$element.ID}" name="date_creation_month-{$element.ID}">
+          {html_options options=$month_list selected=$element.DATE_CREATION_MONTH}
+        </select>
+        <input id="date_creation_year-{$element.ID}"
+               name="date_creation_year-{$element.ID}"
+               type="text"
+               size="4"
+               maxlength="4"
+               value="{$element.DATE_CREATION_YEAR}">
+        <input id="date_creation_linked_date-{$element.ID}" name="date_creation_linked_date-{$element.ID}" type="hidden" size="10" disabled="disabled">
+        {footer_script}
+          pwg_initialization_datepicker("#date_creation_day-{$element.ID}", "#date_creation_month-{$element.ID}", "#date_creation_year-{$element.ID}", "#date_creation_linked_date-{$element.ID}", "#date_creation_action_set-{$element.ID}");
+        {/footer_script}
+      </td>
+    </tr>
+    <tr>
+      <td><strong>{'Who can see this photo?'|@translate}</strong></td>
+      <td>
+        <select name="level-{$element.ID}">
+          {html_options options=$level_options selected=$element.LEVEL}
+        </select>
+      </td>
+    </tr>
+
+    <tr>
+      <td><strong>{'Tags'|@translate}</strong></td>
+      <td>
+
+<select id="tags-{$element.ID}" name="tags-{$element.ID}">
+{foreach from=$element.TAGS item=tag}
+  <option value="{$tag.id}" class="selected">{$tag.name}</option>
+{/foreach}
+</select>
+
+      </td>
+    </tr>
+
+    <tr>
+      <td><strong>{'Description'|@translate}</strong></td>
+      <td><textarea cols="50" rows="5" name="description-{$element.ID}" id="description-{$element.ID}" class="description">{$element.DESCRIPTION}</textarea></td>
+    </tr>
+
+  </table>
+
+</fieldset>
+{/foreach}
+
+<p>
+  <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+  <input class="submit" type="reset" value="{'Reset'|@translate}">
+</p>
+{/if}
+
+</form>
+
+<script type="text/javascript">// <![CDATA[
+{literal}$(document).ready(function() {
+	$(".elementEdit img").fadeTo("slow", 0.6); // Opacity on page load
+	$(".elementEdit img").hover(function(){
+		$(this).fadeTo("slow", 1.0); // Opacity on hover
+	},function(){
+   		$(this).fadeTo("slow", 0.6); // Opacity on mouseout
+	});
+});{/literal}
+// ]]>
+</script>
Index: tags/2.4.0RC3/admin/themes/default/template/cat_list.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/cat_list.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/cat_list.tpl	(revision 14585)
@@ -0,0 +1,147 @@
+{footer_script require='jquery.ui.sortable'}{literal}
+jQuery(document).ready(function(){
+  jQuery(".catPos").hide();
+  jQuery(".drag_button").show();
+  jQuery(".categoryLi").css("cursor","move");
+  jQuery(".categoryUl").sortable({
+    axis: "y",
+    opacity: 0.8,
+    update : function() {
+      jQuery("#manualOrder").show();
+      jQuery("#notManualOrder").hide();
+      jQuery("#autoOrder").hide();
+      jQuery("#createAlbum").hide();
+    },
+  });
+
+  jQuery("#categoryOrdering").submit(function(){
+    ar = jQuery('.categoryUl').sortable('toArray');
+    for(i=0;i<ar.length;i++) {
+      cat = ar[i].split('cat_');
+      document.getElementsByName('catOrd[' + cat[1] + ']')[0].value = i;
+    }
+  });
+
+  jQuery("input[name=order_type]").click(function () {
+    jQuery("#automatic_order_params").hide();
+    if (jQuery("input[name=order_type]:checked").val() == "automatic") {
+      jQuery("#automatic_order_params").show();
+    }
+  });
+
+  jQuery("#addAlbumOpen").click(function(){
+    jQuery("#createAlbum").toggle();
+    jQuery("input[name=virtual_name]").focus();
+    jQuery("#autoOrder").hide();
+  });
+
+  jQuery("#addAlbumClose").click(function(){
+    jQuery("#createAlbum").hide();
+  });
+
+
+  jQuery("#autoOrderOpen").click(function(){
+    jQuery("#autoOrder").toggle();
+    jQuery("#createAlbum").hide();
+  });
+
+  jQuery("#autoOrderClose").click(function(){
+    jQuery("#autoOrder").hide();
+  });
+
+  jQuery("#cancelManualOrder").click(function(){
+    jQuery(".categoryUl").sortable("cancel");
+    jQuery("#manualOrder").hide();
+    jQuery("#notManualOrder").show();
+  });
+});
+{/literal}{/footer_script}
+
+<h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Album list management'|@translate}</h2>
+
+<form id="categoryOrdering" action="{$F_ACTION}" method="post">
+<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+
+<p class="showCreateAlbum">
+  <span id="notManualOrder">
+    <a href="#" id="addAlbumOpen">{'create a new album'|@translate}</a>
+    | <a href="#" id="autoOrderOpen">{'apply automatic sort order'|@translate}</a>
+  </span>
+  <span id="manualOrder" style="display:none;">
+    <input class="submit" name="submitManualOrder" type="submit" value="{'Save manual order'|@translate}">
+    {'... or '|@translate} <a href="#" id="cancelManualOrder">{'cancel manual order'|@translate}</a>
+  </span>
+</p>
+
+<fieldset id="createAlbum" style="display:none;">
+  <legend>{'create a new album'|@translate}</legend>
+  <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+
+  <p><strong>{'Album name'|@translate}</strong>
+    <br><input type="text" name="virtual_name">
+  </p>
+  <p class="actionButtons">
+    <input class="submit" type="submit" value="{'Create'|@translate}" name="submitAdd">
+    <a href="#" id="addAlbumClose">{'Cancel'|@translate}</a>
+  </p>
+</fieldset>
+
+{if count($categories) }
+
+<fieldset id="autoOrder" style="display:none;">
+  <legend>{'Automatic sort order'|@translate}</legend>
+  <p><strong>{'Sort order'|@translate}</strong>
+    <br><label><input type="radio" value="asc" name="ascdesc" checked="checked">{'ascending'|@translate}</label>
+    <br><label><input type="radio" value="desc" name="ascdesc">{'descending'|@translate}</label>
+  </p>
+
+  <p>
+    <label><input type="checkbox" name="recursive"> <strong>{'Apply to sub-albums'|@translate}</strong></label>
+  </p>
+
+  <p class="actionButtons">
+    <input class="submit" name="submitAutoOrder" type="submit" value="{'Save order'|@translate}">
+    <a href="#" id="autoOrderClose">{'Cancel'|@translate}</a>
+  </p>
+</fieldset>
+
+  <ul class="categoryUl">
+
+    {foreach from=$categories item=category}
+    <li class="categoryLi{if $category.IS_VIRTUAL} virtual_cat{/if}" id="cat_{$category.ID}">
+      <!-- category {$category.ID} -->
+      <p class="albumTitle">
+<img src="{$themeconf.admin_icon_dir}/cat_move.png" class="button drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
+      <strong><a href="{$category.U_CHILDREN}" title="{'manage sub-albums'|@translate}">{$category.NAME}</a></strong>
+      </p>
+
+      <p class="catPos">
+        <label>
+          {'Position'|@translate} :
+          <input type="text" size="4" name="catOrd[{$category.ID}]" maxlength="4" value="{$category.RANK}">
+        </label>
+      </p>
+
+<p class="albumActions">
+        <a href="{$category.U_EDIT}">{'Edit'|@translate}</a>
+        {if isset($category.U_MANAGE_ELEMENTS) }
+        | <a href="{$category.U_MANAGE_ELEMENTS}">{'manage album photos'|@translate}</a>
+        {/if}
+        | <a href="{$category.U_CHILDREN}">{'manage sub-albums'|@translate}</a>
+        {if isset($category.U_SYNC) }
+        | <a href="{$category.U_SYNC}">{'Synchronize'|@translate}</a>
+        {/if}
+        {if isset($category.U_DELETE) }
+        | <a href="{$category.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete album'|@translate}</a>
+{/if}
+{if cat_admin_access($category.ID)}
+| 
+<a href="{$category.U_JUMPTO}">{'jump to album'|@translate} →</a>
+{/if}
+</p>
+
+    </li>
+    {/foreach}
+  </ul>
+{/if}
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/cat_modify.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/cat_modify.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/cat_modify.tpl	(revision 14585)
@@ -0,0 +1,102 @@
+<div class="titrePage">
+  <h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form action="{$F_ACTION}" method="POST" id="catModify">
+
+<fieldset>
+  <legend>{'Informations'|@translate}</legend>
+
+  <table style="width:100%">
+    <tr>
+      <td id="albumThumbnail">
+{if isset($representant) }
+  {if isset($representant.picture) }
+        <a href="{$representant.picture.URL}"><img src="{$representant.picture.SRC}" alt=""></a>
+  {else}
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/category_representant_random.png" alt="{'Random photo'|@translate}">
+  {/if}
+
+  {if $representant.ALLOW_SET_RANDOM }
+        <p style="text-align:center;"><input class="submit" type="submit" name="set_random_representant" value="Refresh" title="{'Find a new representant by random'|@translate}"></p>
+  {/if}
+
+  {if isset($representant.ALLOW_DELETE) }
+        <p><input class="submit" type="submit" name="delete_representant" value="{'Delete Representant'|@translate}"></p>
+  {/if}
+{/if}
+      </td>
+
+      <td id="albumLinks">
+<p>{$INTRO}</p>
+<ul style="padding-left:15px;">
+{if cat_admin_access($CAT_ID)}
+  <li><a href="{$U_JUMPTO}">{'jump to album'|@translate} →</a></li>
+{/if}
+
+{if isset($U_MANAGE_ELEMENTS) }
+  <li><a href="{$U_MANAGE_ELEMENTS}">{'manage album photos'|@translate}</a></li>
+{/if}
+
+  <li><a href="{$U_CHILDREN}">{'manage sub-albums'|@translate}</a></li>
+
+{if isset($U_SYNC) }
+  <li><a href="{$U_SYNC}">{'Synchronize'|@translate}</a> ({'Directory'|@translate} = {$CAT_FULL_DIR})</li>
+{/if}
+
+{if isset($U_DELETE) }
+  <li><a href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete album'|@translate}</a></li>
+{/if}
+
+</ul>
+      </td>
+    </tr>
+  </table>
+
+</fieldset>
+
+<fieldset>
+  <legend>{'Properties'|@translate}</legend>
+  <p>
+    <strong>{'Name'|@translate}</strong>
+    <br>
+    <input type="text" class="large" name="name" value="{$CAT_NAME}" maxlength="60">
+  </p>
+
+  <p>
+    <strong>{'Description'|@translate}</strong>
+    <br>
+    <textarea cols="50" rows="5" name="comment" id="comment" class="description">{$CAT_COMMENT}</textarea>
+  </p>
+
+{if isset($move_cat_options) }
+  <p>
+    <strong>{'Parent album'|@translate}</strong>
+    <br>
+    <select class="categoryDropDown" name="parent">
+      <option value="0">------------</option>
+      {html_options options=$move_cat_options selected=$move_cat_options_selected }
+    </select>
+  </p>
+{/if}
+
+  <p>
+    <strong>{'Lock'|@translate}</strong>
+    <br>
+    {html_radios name='visible' values='true,false'|@explode output='No,Yes'|@explode|translate selected=$CAT_VISIBLE}
+  </p>
+
+  {if isset($CAT_COMMENTABLE)}
+  <p>
+    <strong>{'Comments'|@translate}</strong>
+    <br>
+    {html_radios name='commentable' values='false,true'|@explode output='No,Yes'|@explode|translate selected=$CAT_COMMENTABLE}
+  </p>
+  {/if}
+
+  <p style="margin:0">
+    <input class="submit" type="submit" value="{'Save Settings'|@translate}" name="submit">
+  </p>
+</fieldset>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/cat_move.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/cat_move.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/cat_move.tpl	(revision 14585)
@@ -0,0 +1,32 @@
+<div class="titrePage">
+  <h2>{'Move albums'|@translate}</h2>
+</div>
+
+<form method="post" action="{$F_ACTION}" class="filter" id="catMove">
+  <fieldset>
+    <legend>{'Move albums'|@translate}</legend>
+
+    <label>
+      {'Virtual albums to move'|@translate}
+
+      <select class="categoryList" name="selection[]" multiple="multiple">
+        {html_options options=$category_to_move_options}
+      </select>
+    </label>
+
+    <label>
+      {'New parent album'|@translate}
+
+      <select class="categoryDropDown" name="parent">
+        <option value="0">------------</option>
+        {html_options options=$category_parent_options}
+      </select>
+    </label>
+
+  </fieldset>
+
+  <p style="text-align:left;">
+    <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+  </p>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/cat_options.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/cat_options.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/cat_options.tpl	(revision 14585)
@@ -0,0 +1,11 @@
+<div class="titrePage">
+  <h2>{'Properties'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form method="post" action="{$F_ACTION}" id="cat_options">
+  <fieldset>
+    <legend>{$L_SECTION}</legend>
+    {$DOUBLE_SELECT}
+  </fieldset>
+</form>
+
Index: tags/2.4.0RC3/admin/themes/default/template/cat_perm.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/cat_perm.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/cat_perm.tpl	(revision 14585)
@@ -0,0 +1,157 @@
+{combine_script id='jquery.chosen' load='footer' path='themes/default/js/plugins/chosen.jquery.min.js'}
+{combine_css path="themes/default/js/plugins/chosen.css"}
+
+{footer_script}{literal}
+jQuery(document).ready(function() {
+  jQuery(".chzn-select").chosen();
+
+  function checkStatusOptions() {
+    if (jQuery("input[name=status]:checked").val() == "private") {
+      jQuery("#privateOptions, #applytoSubAction").show();
+    }
+    else {
+      jQuery("#privateOptions, #applytoSubAction").hide();
+    }
+  }
+
+  checkStatusOptions();
+  jQuery("#selectStatus").change(function() {
+    checkStatusOptions();
+  });
+
+  jQuery("#indirectPermissionsDetailsShow").click(function(){
+    jQuery("#indirectPermissionsDetailsShow").hide();
+    jQuery("#indirectPermissionsDetailsHide").show();
+    jQuery("#indirectPermissionsDetails").show();
+    return false;
+  });
+
+  jQuery("#indirectPermissionsDetailsHide").click(function(){
+    jQuery("#indirectPermissionsDetailsShow").show();
+    jQuery("#indirectPermissionsDetailsHide").hide();
+    jQuery("#indirectPermissionsDetails").hide();
+    return false;
+  });
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form action="{$F_ACTION}" method="post" id="categoryPermissions">
+
+<fieldset>
+  <legend>{'Access type'|@translate}</legend>
+
+  <p id="selectStatus">
+    <label><input type="radio" name="status" value="public" {if not $private}checked="checked"{/if}> <strong>{'public'|@translate}</strong> : <em>{'any visitor can see this album'|@translate}</em></label>
+    <br>
+    <label><input type="radio" name="status" value="private" {if $private}checked="checked"{/if}> <strong>{'private'|@translate}</strong> : <em>{'visitors need to login and have the appropriate permissions to see this album'|@translate}</em></label>
+  </p>
+</fieldset>
+
+<fieldset id="privateOptions">
+  <legend>{'Groups and users'|@translate}</legend>
+
+  <p>
+{if count($groups) > 0}
+    <strong>{'Permission granted for groups'|@translate}</strong>
+    <br>
+    <select data-placeholder="{'Select groups...'|@translate}" class="chzn-select" multiple style="width:700px;" name="groups[]">
+      {html_options options=$groups selected=$groups_selected}
+    </select>
+{else}
+    {'There is no group in this gallery.'|@translate} <a href="admin.php?page=group_list" class="externalLink">{'Group management'|@translate}</a>
+{/if}
+  </p>
+
+  <p>
+    <strong>{'Permission granted for users'|@translate}</strong>
+    <br>
+    <select data-placeholder="{'Select users...'|@translate}" class="chzn-select" multiple style="width:700px;" name="users[]">
+      {html_options options=$users selected=$users_selected}
+    </select>
+  </p>
+
+{if isset($nb_users_granted_indirect)}
+  <p>
+    {'%u users have automatic permission because they belong to a granted group.'|@translate|@sprintf:$nb_users_granted_indirect}
+    <a href="#" id="indirectPermissionsDetailsHide" style="display:none">{'hide details'|@translate}</a>
+    <a href="#" id="indirectPermissionsDetailsShow">{'show details'|@translate}</a>
+
+    <ul id="indirectPermissionsDetails" style="display:none">
+  {foreach from=$user_granted_indirect_groups item=group_details}
+      <li><strong>{$group_details.group_name}</strong> : {$group_details.group_users}</li>
+  {/foreach}
+    </ul>
+  </p>
+{/if}
+
+{*
+  <h4>{'Groups'|@translate}</h4>
+
+  <fieldset>
+    <legend>{'Permission granted'|@translate}</legend>
+    <ul>
+      {foreach from=$group_granted_ids item=id}
+      <li><label><input type="checkbox" name="deny_groups[]" value="{$id}"> {$all_groups[$id]}</label></li>
+      {/foreach}
+    </ul>
+    <input class="submit" type="submit" name="deny_groups_submit" value="{'Deny selected groups'|@translate}">
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Permission denied'|@translate}</legend>
+    <ul>
+      {foreach from=$group_denied_ids item=id}
+      <li><label><input type="checkbox" name="grant_groups[]" value="{$id}"> {$all_groups[$id]}</label></li>
+      {/foreach}
+    </ul>
+    <input class="submit" type="submit" name="grant_groups_submit" value="{'Grant selected groups'|@translate}">
+    <label><input type="checkbox" name="apply_on_sub">{'Apply to sub-albums'|@translate}</label>
+  </fieldset>
+
+  <h4>{'Users'|@translate}</h4>
+
+  <fieldset>
+    <legend>{'Permission granted'|@translate}</legend>
+    <ul>
+      {foreach from=$user_granted_direct_ids item=id}
+      <li><label><input type="checkbox" name="deny_users[]" value="{$id}"> {$all_users[$id]}</label></li>
+      {/foreach}
+    </ul>
+    <input class="submit" type="submit" name="deny_users_submit" value="{'Deny selected users'|@translate}">
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Permission granted thanks to a group'|@translate}</legend>
+    {if isset($user_granted_indirects) }
+    <ul>
+      {foreach from=$user_granted_indirects item=user_group}
+      <li>{$user_group.USER} ({$user_group.GROUP})</li>
+      {/foreach}
+    </ul>
+    {/if}
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Permission denied'|@translate}</legend>
+    <ul>
+      {foreach from=$user_denied_ids item=id}
+      <li><label><input type="checkbox" name="grant_users[]" value="{$id}"> {$all_users[$id]}</label></li>
+      {/foreach}
+    </ul>
+    <input class="submit" type="submit" name="grant_users_submit" value="{'Grant selected users'|@translate}">
+    <label><input type="checkbox" name="apply_on_sub">{'Apply to sub-albums'|@translate}</label>
+  </fieldset>
+*}
+</fieldset>
+
+  <p style="margin:12px;text-align:left;">
+    <input class="submit" type="submit" value="{'Save Settings'|@translate}" name="submit">
+    <label id="applytoSubAction" style="display:none;"><input type="checkbox" name="apply_on_sub">{'Apply to sub-albums'|@translate}</label>
+  </p>
+
+<input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/check_integrity.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/check_integrity.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/check_integrity.tpl	(revision 14585)
@@ -0,0 +1,109 @@
+<dl>
+  <dt>{'Check integrity'|@translate}</dt>
+  <dd>
+    <ul>
+      <form method="post" name="c13y" id="c13y" action="">
+      <fieldset>
+        <table class="table2">
+          <tr class="throw">
+            <th></th>
+            <th>{'Anomaly'|@translate}</th>
+            <th>{'Correction'|@translate}</th>
+          </tr>
+          {if isset($c13y_list)}
+            {foreach from=$c13y_list item=c13y name=c13y_loop}
+              <tr class="{if $smarty.foreach.c13y_loop.index is odd}row1{else}row2{/if}">
+                <td>
+                  {if $c13y.can_select}
+                    <input type="checkbox" name="c13y_selection[]" value="{$c13y.id}" id="c13y_selection-{$c13y.id}"><label for="c13y_selection-{$c13y.id}"></label>
+                  {/if}
+                </td>
+                <td><label for="c13y_selection-{$c13y.id}">{$c13y.anomaly}</label></td>
+                <td>
+                  <label for="c13y_selection-{$c13y.id}">
+                    {if $c13y.show_ignore_msg}
+                      {'The anomaly will be ignored until next application version'|@translate}
+                      <br>
+                      {'Correction the anomaly will cancel the fact that it\'s ignored'|@translate}
+                    {/if}
+                    {if $c13y.show_correction_fct}
+                      {'Automatic correction'|@translate}
+                    {/if}
+                    {if $c13y.show_correction_bad_fct}
+                      {'Impossible automatic correction'|@translate}
+                    {/if}
+                    {if $c13y.show_correction_success_fct}
+                      {'Correction applied with success'|@translate}
+                    {/if}
+                    {if !empty($c13y.correction_error_fct)}
+                      {'Correction applied with error'|@translate}
+                      <br>
+                      {$c13y.c13y.correction_error_fct}
+                    {/if}
+                    {if !empty($c13y.correction_msg)}
+                      {if $c13y.show_correction_success_fct or !empty($c13y.correction_error_fct) or $c13y.show_correction_fct or $c13y.show_correction_bad_fct }
+                        <br>
+                      {/if}
+                      {$c13y.correction_msg|@nl2br}
+                    {/if}
+                  </label>
+                </td>
+              </tr>
+            {/foreach}
+          {/if}
+        </table>
+
+        <p>
+			{literal}
+			<script type="text/javascript">
+			jQuery(document).ready(function(){
+
+				jQuery("#checkAllLink").click(function () {
+					jQuery("#c13y input[type=checkbox]").attr('checked', true);
+					return false;
+				});
+
+				jQuery("#uncheckAllLink").click(function () {
+					jQuery("#c13y input[type=checkbox]").attr('checked', false);
+					return false;
+				});
+
+			});
+			function DeselectAll( formulaire )
+			{
+				var elts = formulaire.elements;
+				for(var i=0; i <elts.length; i++)
+				{
+					if (elts[i].type=='checkbox')
+						elts[i].checked = false;
+				}
+			}
+			</script>
+			{/literal}
+          {if $c13y_show_submit_ignore}
+              <a href="#" id="checkAllLink">{'Check all'|@translate}</a>
+            / <a href="#" id="uncheckAllLink">{'Uncheck all'|@translate}</a>
+          {/if}
+          {if isset($c13y_do_check)}
+            / <a href="#" onclick="DeselectAll(document.getElementById('c13y'));
+            {foreach from=$c13y_do_check item=ID}
+              document.getElementById('c13y_selection-{$ID}').checked = true;
+            {/foreach}
+            return false;">{'Check automatic corrections'|@translate}</a>
+          {/if}
+        </p>
+
+        <p>
+          {if $c13y_show_submit_automatic_correction}
+            <input class="submit" type="submit" value="{'Apply selected corrections'|@translate}" name="Apply selected corrections">
+          {/if}
+          {if $c13y_show_submit_ignore}
+            <input class="submit" type="submit" value="{'Ignore selected anomalies'|@translate}" name="Ignore selected anomalies">
+          {/if}
+          <input class="submit" type="submit" value="{'Refresh'|@translate}" name="Refresh">
+          </p>
+
+      </fieldset>
+      </form>
+    </ul>
+  </dd>
Index: tags/2.4.0RC3/admin/themes/default/template/comments.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/comments.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/comments.tpl	(revision 14585)
@@ -0,0 +1,83 @@
+{footer_script}{literal}
+jQuery(document).ready(function(){
+  function highlighComments() {
+    jQuery(".checkComment").each(function() {
+      var parent = jQuery(this).parent('tr');
+      if (jQuery(this).children("input[type=checkbox]").is(':checked')) {
+        jQuery(parent).addClass('selectedComment'); 
+      }
+      else {
+        jQuery(parent).removeClass('selectedComment'); 
+      }
+    });
+  }
+
+  jQuery(".checkComment").click(function(event) {
+    if (event.target.type !== 'checkbox') {
+      var checkbox = jQuery(this).children("input[type=checkbox]");
+      jQuery(checkbox).attr('checked', !jQuery(checkbox).is(':checked'));
+      highlighComments();
+    }
+  });
+
+  jQuery("#commentSelectAll").click(function () {
+    jQuery(".checkComment input[type=checkbox]").attr('checked', true);
+    highlighComments();
+    return false;
+  });
+
+  jQuery("#commentSelectNone").click(function () {
+    jQuery(".checkComment input[type=checkbox]").attr('checked', false);
+    highlighComments();
+    return false;
+  });
+
+  jQuery("#commentSelectInvert").click(function () {
+    jQuery(".checkComment input[type=checkbox]").each(function() {
+      jQuery(this).attr('checked', !$(this).is(':checked'));
+    });
+    highlighComments();
+    return false;
+  });
+
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Pending Comments'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+{if !empty($comments) }
+<form method="post" action="{$F_ACTION}" id="pendingComments">
+  
+<table>
+  {foreach from=$comments item=comment name=comment}
+  <tr valign="top" class="{if $smarty.foreach.comment.index is odd}row2{else}row1{/if}">
+    <td style="width:50px;" class="checkComment">
+      <input type="checkbox" name="comments[]" value="{$comment.ID}">
+    </td>
+    <td>
+  <div class="comment">
+    <a class="illustration" href="{$comment.U_PICTURE}"><img src="{$comment.TN_SRC}"></a>
+    <p class="commentHeader"><strong>{$comment.AUTHOR}</strong> - <em>{$comment.DATE}</em></p>
+    <blockquote>{$comment.CONTENT}</blockquote>
+  </div>
+    </td>
+  </tr>
+  {/foreach}
+</table>
+
+  <p class="checkActions">
+    {'Select:'|@translate}
+    <a href="#" id="commentSelectAll">{'All'|@translate}</a>,
+    <a href="#" id="commentSelectNone">{'None'|@translate}</a>,
+    <a href="#" id="commentSelectInvert">{'Invert'|@translate}</a>
+  </p>
+
+  <p class="bottomButtons">
+    <input class="submit" type="submit" name="validate" value="{'Validate'|@translate}">
+    <input class="submit" type="submit" name="reject" value="{'Reject'|@translate}">
+  </p>
+
+</form>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/configuration.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/configuration.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/configuration.tpl	(revision 14585)
@@ -0,0 +1,766 @@
+{footer_script}{literal}
+jQuery(document).ready(function(){
+  jQuery("#activate_comments").change(function(){
+    if ($(this).is(':checked')) {
+      jQuery("#comments_param_warp").show();
+    } else {
+      jQuery("#comments_param_warp").hide();
+    }
+  });
+
+  var targets = {
+    'input[name="rate"]' : '#rate_anonymous',
+    'input[name="allow_user_registration"]' : '#email_admin_on_new_user',
+    'input[name="comments_validation"]' : '#email_admin_on_comment_validation',
+    'input[name="user_can_edit_comment"]' : '#email_admin_on_comment_edition',
+    'input[name="user_can_delete_comment"]' : '#email_admin_on_comment_deletion',
+  };
+
+  for (selector in targets) {
+    var target = targets[selector];
+
+    jQuery(target).toggle(jQuery(selector).is(':checked'));
+
+    (function(target){
+      jQuery(selector).bind('change', function() {
+        jQuery(target).toggle($(this).is(':checked'));
+      });
+    })(target);
+  };
+});
+{/literal}{/footer_script}
+
+<h2>{'Piwigo configuration'|@translate} {$TABSHEET_TITLE}</h2>
+
+{if !isset($default)}
+<form method="post" action="{$F_ACTION}" class="properties"{if isset($watermark)} enctype="multipart/form-data"{/if}>
+{/if}
+<div id="configContent">
+{if isset($main)}
+<fieldset id="mainConf">
+  <legend></legend>
+  <ul>
+    <li>
+      
+        <label for="gallery_title">{'Gallery title'|@translate}</label>
+      <br>
+      <input type="text" maxlength="255" size="50" name="gallery_title" id="gallery_title" value="{$main.CONF_GALLERY_TITLE}">
+    </li>
+
+    <li>
+      
+        <label for="page_banner">{'Page banner'|@translate}</label>
+      <br>
+      <textarea rows="5" cols="50" class="description" name="page_banner" id="page_banner">{$main.CONF_PAGE_BANNER}</textarea>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="rate" {if ($main.rate)}checked="checked"{/if}>
+        {'Allow rating'|@translate}
+      </label>
+    </li>
+
+    <li id="rate_anonymous">
+      <label>
+        <input type="checkbox" name="rate_anonymous" {if ($main.rate_anonymous)}checked="checked"{/if}>
+        {'Rating by guests'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="allow_user_registration" {if ($main.allow_user_registration)}checked="checked"{/if}>
+        {'Allow user registration'|@translate}
+      </label>
+    </li>
+
+    <li id="email_admin_on_new_user">
+      <label>
+        <input type="checkbox" name="email_admin_on_new_user" {if ($main.email_admin_on_new_user)}checked="checked"{/if}>
+        {'Email admins when a new user registers'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="allow_user_customization" {if ($main.allow_user_customization)}checked="checked"{/if}>
+        {'Allow user customization'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="obligatory_user_mail_address" {if ($main.obligatory_user_mail_address)}checked="checked"{/if}>
+        {'Mail address is obligatory for all users'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>{'Week starts on'|@translate}
+      {html_options name="week_starts_on" options=$main.week_starts_on_options selected=$main.week_starts_on_options_selected}</label>
+    </li>
+    
+    <li>
+        <label>{'Default photos order'|@translate}</label>
+        
+        {foreach from=$main.order_by item=order}
+        <span class="filter {if $ORDER_BY_IS_CUSTOM}transparent{/if}">          
+          <select name="order_by[]" {if $ORDER_BY_IS_CUSTOM}disabled{/if}>
+            {html_options options=$main.order_by_options selected=$order}
+          </select>
+          <a class="removeFilter">{'delete'|@translate}</a>
+        </span>
+        {/foreach}
+        
+        {if !$ORDER_BY_IS_CUSTOM}
+          <a class="addFilter">{'Add a criteria'|@translate}</a>
+        {else}
+          <span class="order_by_is_custom">{'You can\'t define a default photo order because you have a custom setting in your local configuration.'|@translate}</span>
+        {/if}
+    </li>
+    
+{if !$ORDER_BY_IS_CUSTOM}
+{footer_script require='jquery'}
+// counters for displaying of addFilter link
+fields = {$main.order_by|@count}; max_fields = Math.ceil({$main.order_by_options|@count}/2);
+
+{literal}
+function updateAddFilterLink() {
+  if (fields >= max_fields) {
+    $('.addFilter').css('display', 'none');
+  } else {
+    $('.addFilter').css('display', '');
+  }
+}
+
+function updateRemoveFilterTrigger() {
+  $(".removeFilter").click(function () {
+    $(this).parent('span.filter').remove();
+    fields--;
+    updateAddFilterLink();
+  });
+  
+  $(".removeFilter").css('display', '');
+  $(".filter:first .removeFilter").css('display', 'none');
+}
+
+jQuery(document).ready(function () {
+  $('.addFilter').click(function() {
+    $(this).prev('span.filter').clone().insertBefore($(this));
+    $(this).prev('span.filter').children('select[name="order_by[]"]').val('');
+    
+    fields++;
+    updateRemoveFilterTrigger();
+    updateAddFilterLink();
+  });
+  
+  updateRemoveFilterTrigger();
+  updateAddFilterLink();
+});
+{/literal}
+{/footer_script}
+{/if}
+
+    <li>
+      <strong>{'Save visits in history for'|@translate}</strong>
+
+      <label>
+        <input type="checkbox" name="history_guest" {if ($main.history_guest)}checked="checked"{/if}>
+        {'simple visitors'|@translate}
+      </label>
+
+      <label>
+        <input type="checkbox" name="log" {if ($main.log)}checked="checked"{/if}>
+        {'registered users'|@translate}
+      </label>
+
+      <label>
+        <input type="checkbox" name="history_admin" {if ($main.history_admin)}checked="checked"{/if}>
+        {'administrators'|@translate}
+      </label>
+
+    </li>
+  </ul>
+</fieldset>
+{/if}
+
+{if isset($comments)}
+<fieldset id="commentsConf">
+  <legend></legend>
+  <ul>
+    <li>
+      <label>
+        <input type="checkbox" name="activate_comments" id="activate_comments"{if ($comments.activate_comments)}checked="checked"{/if}>
+        {'Activate comments'|@translate}
+      </label>
+    </li>
+  </ul>
+  
+  <ul id="comments_param_warp"{if not ($comments.activate_comments)} style="display:none;"{/if}>
+    <li>
+      <label>
+        <input type="checkbox" name="comments_forall" {if ($comments.comments_forall)}checked="checked"{/if}>
+        {'Comments for all'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        {'Number of comments per page'|@translate}
+        <input type="text" size="3" maxlength="4" name="nb_comment_page" id="nb_comment_page" value="{$comments.NB_COMMENTS_PAGE}">
+      </label>
+    </li>
+    
+    <li>
+      <label>
+        {'Default comments order'|@translate}
+        <select name="comments_order">
+          {html_options options=$comments.comments_order_options selected=$comments.comments_order}
+        </select>
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="comments_validation" {if ($comments.comments_validation)}checked="checked"{/if}>
+        {'Validation'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="user_can_edit_comment" {if ($comments.user_can_edit_comment)}checked="checked"{/if}>
+        {'Allow users to edit their own comments'|@translate}
+      </label>
+    </li>
+    <li>
+      <label>
+        <input type="checkbox" name="user_can_delete_comment" {if ($comments.user_can_delete_comment)}checked="checked"{/if}>
+        {'Allow users to delete their own comments'|@translate}
+      </label>
+    </li>
+
+    <li id="notifyAdmin">
+      <strong>{'Notify administrators when a comment is'|@translate}</strong>
+
+      <label id="email_admin_on_comment_validation">
+        <input type="checkbox" name="email_admin_on_comment_validation" {if ($comments.email_admin_on_comment_validation)}checked="checked"{/if}> {'pending validation'|@translate}
+      </label>
+
+      <label>
+        <input type="checkbox" name="email_admin_on_comment" {if ($comments.email_admin_on_comment)}checked="checked"{/if}> {'added'|@translate}
+      </label>
+
+      <label id="email_admin_on_comment_edition">
+        <input type="checkbox" name="email_admin_on_comment_edition" {if ($comments.email_admin_on_comment_edition)}checked="checked"{/if}> {'modified'|@translate}
+      </label>
+
+      <label id="email_admin_on_comment_deletion">
+        <input type="checkbox" name="email_admin_on_comment_deletion" {if ($comments.email_admin_on_comment_deletion)}checked="checked"{/if}> {'deleted'|@translate}
+      </label>
+    </li>
+  </ul>
+</fieldset>
+{/if}
+
+{if isset($sizes)}
+
+{footer_script}
+var labelMaxWidth = "{'Maximum Width'|@translate}";
+var labelWidth = "{'Width'|@translate}";
+
+var labelMaxHeight = "{'Maximum Height'|@translate}";
+var labelHeight = "{'Height'|@translate}";
+{literal}
+jQuery(document).ready(function(){
+  function toggleResizeFields(size) {
+    var checkbox = jQuery("#original_resize");
+    var needToggle = jQuery("#sizeEdit-original");
+
+    if (jQuery(checkbox).is(':checked')) {
+      needToggle.show();
+    }
+    else {
+      needToggle.hide();
+    }
+  }
+
+  toggleResizeFields("original");
+  jQuery("#original_resize").click(function () {toggleResizeFields("original")});
+
+  jQuery("a[id^='sizeEditOpen-']").click(function(){
+    var sizeName = jQuery(this).attr("id").split("-")[1];
+    jQuery("#sizeEdit-"+sizeName).toggle();
+    jQuery(this).hide();
+  });
+
+  jQuery(".cropToggle").click(function() {
+    var labelBoxWidth = jQuery(this).parents('table.sizeEditForm').find('td.sizeEditWidth');
+    var labelBoxHeight = jQuery(this).parents('table.sizeEditForm').find('td.sizeEditHeight');
+
+    if (jQuery(this).is(':checked')) {
+      jQuery(labelBoxWidth).html(labelWidth);
+      jQuery(labelBoxHeight).html(labelHeight);
+    }
+    else {
+      jQuery(labelBoxWidth).html(labelMaxWidth);
+      jQuery(labelBoxHeight).html(labelMaxHeight);
+    }
+  });
+
+  jQuery("#showDetails").click(function() {
+    jQuery(".sizeDetails").show();
+    jQuery(this).css("visibility", "hidden");
+		return false;
+  });
+
+});
+{/literal}{/footer_script}
+
+{html_style}{literal}
+.sizeEnable {width:50px;}
+.sizeEditForm {margin:0 0 10px 20px;}
+.sizeEdit {display:none;}
+#sizesConf table {margin:0;}
+.showDetails {padding:0;}
+.sizeDetails {display:none;margin-left:10px;}
+.sizeEditOpen {margin-left:10px;}
+{/literal}{/html_style}
+
+<fieldset id="sizesConf">
+  <legend>{'Original Size'|@translate}</legend>
+
+  <div>
+    <label for="original_resize">
+      <input type="checkbox" name="original_resize" id="original_resize" {if ($sizes.original_resize)}checked="checked"{/if}>
+      {'Resize after upload'|@translate}
+    </label>
+  </div>
+
+  <table id="sizeEdit-original">
+    <tr>
+      <th>{'Maximum Width'|@translate}</th>
+      <td>
+        <input type="text" name="original_resize_maxwidth" value="{$sizes.original_resize_maxwidth}" size="4" maxlength="4"{if isset($ferrors.original_resize_maxwidth)} class="dError"{/if}> {'pixels'|@translate}
+        {if isset($ferrors.original_resize_maxwidth)}<span class="dErrorDesc" title="{$ferrors.original_resize_maxwidth}">!</span>{/if}
+      </td>
+    </tr>
+    <tr>
+      <th>{'Maximum Height'|@translate}</th>
+      <td>
+        <input type="text" name="original_resize_maxheight" value="{$sizes.original_resize_maxheight}" size="4" maxlength="4"{if isset($ferrors.original_resize_maxheight)} class="dError"{/if}> {'pixels'|@translate}
+        {if isset($ferrors.original_resize_maxheight)}<span class="dErrorDesc" title="{$ferrors.original_resize_maxheight}">!</span>{/if}
+      </td>
+    </tr>
+    <tr>
+      <th>{'Image Quality'|@translate}</th>
+      <td>
+        <input type="text" name="original_resize_quality" value="{$sizes.original_resize_quality}" size="3" maxlength="3"{if isset($ferrors.original_resize_quality)} class="dError"{/if}> %
+        {if isset($ferrors.original_resize_quality)}<span class="dErrorDesc" title="{$ferrors.original_resize_quality}">!</span>{/if}
+      </td>
+    </tr>
+  </table>
+
+</fieldset>
+
+<fieldset id="multiSizesConf">
+  <legend>{'Multiple Size'|@translate}</legend>
+
+<div class="showDetails">
+  <a href="#" id="showDetails"{if $show_details or isset($ferrors)} style="display:none"{/if}>{'show details'|@translate}</a>
+</div>
+
+<table style="margin:0">
+{foreach from=$derivatives item=d key=type}
+  <tr>
+    <td>
+      <label>
+        <span class="sizeEnable">
+  {if $d.must_enable}
+          &#x2714;
+  {else}
+          <input type="checkbox" name="d[{$type}][enabled]" {if $d.enabled}checked="checked"{/if}>
+  {/if}
+        </span>
+        {$type|@translate}
+      </label>
+    </td>
+
+    <td>
+      <span class="sizeDetails"{if isset($ferrors)} style="display:inline"{/if}>{$d.w} x {$d.h} {'pixels'|@translate}{if $d.crop}, {'Crop'|@translate|lower}{/if}</span>
+    </td>
+
+    <td>
+      <span class="sizeDetails"{if isset($ferrors) and !isset($ferrors.$type)} style="display:inline"{/if}>
+        <a href="#" id="sizeEditOpen-{$type}" class="sizeEditOpen">{'edit'|@translate}</a>
+      </span>
+    </td>
+  </tr>
+
+  <tr id="sizeEdit-{$type}" class="sizeEdit" {if isset($ferrors.$type)} style="display:block"{/if}>
+    <td colspan="3">
+      <table class="sizeEditForm">
+  {if !$d.must_square}
+        <tr>
+          <td colspan="2">
+            <label>
+              <input type="checkbox" class="cropToggle" name="d[{$type}][crop]" {if $d.crop}checked="checked"{/if}>
+              {'Crop'|@translate}
+            </label>
+          </td>
+        </tr>
+  {/if}
+
+        <tr>
+          <td class="sizeEditWidth">{if $d.must_square or $d.crop}{'Width'|@translate}{else}{'Maximum Width'|@translate}{/if}</td>
+          <td>
+            <input type="text" name="d[{$type}][w]" maxlength="4" size="4" value="{$d.w}"{if isset($ferrors.$type.w)} class="dError"{/if}>
+            {'pixels'|@translate}
+            {if isset($ferrors.$type.w)}<span class="dErrorDesc" title="{$ferrors.$type.w}">!</span>{/if}
+          </td>
+        </tr>
+
+  {if !$d.must_square}
+        <tr>
+          <td class="sizeEditHeight">{if $d.crop}{'Height'|@translate}{else}{'Maximum Height'|@translate}{/if}</td>
+          <td>
+            <input type="text" name="d[{$type}][h]" maxlength="4" size="4"  value="{$d.h}"{if isset($ferrors.$type.h)} class="dError"{/if}>
+            {'pixels'|@translate}
+            {if isset($ferrors.$type.h)}<span class="dErrorDesc" title="{$ferrors.$type.h}">!</span>{/if}
+          </td>
+        </tr>
+  {/if}
+      </table> {* #sizeEdit *}
+    </td>
+  </tr>
+{/foreach}
+</table>
+
+<p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
+  {'Image Quality'|@translate}
+  <input type="text" name="resize_quality" value="{$resize_quality}" size="3" maxlength="3"{if isset($ferrors.resize_quality)} class="dError"{/if}> %
+  {if isset($ferrors.resize_quality)}<span class="dErrorDesc" title="{$ferrors.resize_quality}">!</span>{/if}
+</p>
+<p style="margin:10px 0 0 0;{if isset($ferrors)} display:block;{/if}" class="sizeDetails">
+  <a href="{$F_ACTION}&action=restore_settings" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'Reset to default values'|@translate}</a>
+</p>
+</fieldset>
+{/if}
+
+{if isset($watermark)}
+
+{footer_script}{literal}
+jQuery(document).ready(function() {
+
+  function onWatermarkChange() {
+    var val = jQuery("#wSelect").val();
+    if (val.length) {
+      jQuery("#wImg").attr('src', {/literal}'{$ROOT_URL}'{literal}+val).show();
+    }
+    else {
+      jQuery("#wImg").hide();
+    }
+  }
+
+  onWatermarkChange();
+
+  jQuery("#wSelect").bind("change", onWatermarkChange);
+
+  if (jQuery("input[name='w[position]']:checked").val() == 'custom') {
+    jQuery("#positionCustomDetails").show();
+  }
+
+  jQuery("input[name='w[position]']").change(function(){
+    if (jQuery(this).val() == 'custom') {
+      jQuery("#positionCustomDetails").show();
+    }
+    else {
+      jQuery("#positionCustomDetails").hide();
+    }
+  });
+
+  jQuery(".addWatermarkOpen").click(function(){
+    jQuery("#addWatermark, #selectWatermark").toggle();
+  });
+});
+{/literal}{/footer_script}
+
+<fieldset id="watermarkConf">
+  <legend></legend>
+  <ul>
+    <li>
+      <span id="selectWatermark"{if isset($ferrors.watermarkImage)} style="display:none"{/if}><label>{'Select a file'|@translate}</label>
+      <select name="w[file]" id="wSelect">
+	{html_options options=$watermark_files selected=$watermark.file}
+      </select>
+      {'... or '|@translate}<a href="#" class="addWatermarkOpen">{'add a new watermark'|@translate}</a>
+      <br><img id="wImg"></img></span>{* #selectWatermark *}
+      <span id="addWatermark"{if isset($ferrors.watermarkImage)} style="display:inline"{/if}>
+      {'add a new watermark'|@translate} {'... or '|@translate}<a href="#" class="addWatermarkOpen">{'Select a file'|@translate}</a>
+      <br><input type="file" size="60" id="watermarkImage" name="watermarkImage"{if isset($ferrors.watermarkImage)} class="dError"{/if}> (png)
+      {if isset($ferrors.watermarkImage)}<span class="dErrorDesc" title="{$ferrors.watermarkImage}">!</span>{/if}
+      </span>{* #addWatermark *}
+    </li>
+
+    <li>
+      <label>
+        {'Apply watermark if width is bigger than'|@translate}
+        <input  size="4" maxlength="4" type="text" name="w[minw]" value="{$watermark.minw}"{if isset($ferrors.watermark.minw)} class="dError"{/if}>
+      </label>
+      {'pixels'|@translate}
+    </li>
+
+    <li>
+      <label>
+        {'Apply watermark if height is bigger than'|@translate}
+	<input  size="4" maxlength="4" type="text" name="w[minh]" value="{$watermark.minh}"{if isset($ferrors.watermark.minh)} class="dError"{/if}>
+      </label>
+      {'pixels'|@translate}
+    </li>
+
+    <li>
+      <label>{'Position'|@translate}</label>
+      <br>
+      <div id="watermarkPositionBox">
+        <label class="right">{'top right corner'|@translate} <input name="w[position]" type="radio" value="topright"{if $watermark.position eq 'topright'} checked="checked"{/if}></label>
+        <label><input name="w[position]" type="radio" value="topleft"{if $watermark.position eq 'topleft'} checked="checked"{/if}> {'top left corner'|@translate}</label>
+        <label class="middle"><input name="w[position]" type="radio" value="middle"{if $watermark.position eq 'middle'} checked="checked"{/if}> {'middle'|@translate}</label>
+        <label class="right">{'bottom right corner'|@translate} <input name="w[position]" type="radio" value="bottomright"{if $watermark.position eq 'bottomright'} checked="checked"{/if}></label>
+        <label><input name="w[position]" type="radio" value="bottomleft"{if $watermark.position eq 'bottomleft'} checked="checked"{/if}> {'bottom left corner'|@translate}</label>
+      </div>
+      <label style="display:block;margin-top:10px;font-weight:normal;"><input name="w[position]" type="radio" value="custom"{if $watermark.position eq 'custom'} checked="checked"{/if}> {'custom'|@translate}</label>
+      <div id="positionCustomDetails">
+        <label>{'X Position'|@translate}
+	  <input size="3" maxlength="3" type="text" name="w[xpos]" value="{$watermark.xpos}"{if isset($ferrors.watermark.xpos)} class="dError"{/if}>%
+          {if isset($ferrors.watermark.xpos)}<span class="dErrorDesc" title="{$ferrors.watermark.xpos}">!</span>{/if}
+        </label>
+
+        <br>
+        <label>{'Y Position'|@translate}
+          <input size="3" maxlength="3" type="text" name="w[ypos]" value="{$watermark.ypos}"{if isset($ferrors.watermark.ypos)} class="dError"{/if}>%
+          {if isset($ferrors.watermark.ypos)}<span class="dErrorDesc" title="{$ferrors.watermark.ypos}">!</span>{/if}
+        </label>
+
+        <br>
+        <label>{'X Repeat'|@translate}
+          <input size="3" maxlength="3" type="text" name="w[xrepeat]" value="{$watermark.xrepeat}"{if isset($ferrors.watermark.xrepeat)} class="dError"{/if}>
+          {if isset($ferrors.watermark.xrepeat)}<span class="dErrorDesc" title="{$ferrors.watermark.xrepeat}">!</span>{/if}
+        </label>
+      </div>
+    </li>
+
+    <li>
+      <label>{'Opacity'|@translate}</label>
+      <input size="3" maxlength="3" type="text" name="w[opacity]" value="{$watermark.opacity}"{if isset($ferrors.watermark.opacity)} class="dError"{/if}> %
+      {if isset($ferrors.watermark.opacity)}<span class="dErrorDesc" title="{$ferrors.watermark.opacity}">!</span>{/if}
+    </li>
+  </ul>
+</fieldset>
+
+{/if} {* end of watermark section *}
+
+{if isset($display)}
+<fieldset id="indexDisplayConf">
+  <legend>{'Main Page'|@translate}</legend>
+  <ul>
+    <li>
+      <label>
+        <input type="checkbox" name="menubar_filter_icon" {if ($display.menubar_filter_icon)}checked="checked"{/if}>
+        {'display only recently posted photos'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>    
+    
+    <li>
+      <label>
+        <input type="checkbox" name="index_new_icon" {if ($display.index_new_icon)}checked="checked"{/if}>
+        {'Activate icon "new" next to albums and pictures'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="index_sort_order_input" {if ($display.index_sort_order_input)}checked="checked"{/if}>
+        {'Sort order'|@translate|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="index_flat_icon" {if ($display.index_flat_icon)}checked="checked"{/if}>
+        {'display all photos in all sub-albums'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="index_posted_date_icon" {if ($display.index_posted_date_icon)}checked="checked"{/if}>
+        {'display a calendar by posted date'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="index_created_date_icon" {if ($display.index_created_date_icon)}checked="checked"{/if}>
+        {'display a calendar by creation date'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="index_slideshow_icon" {if ($display.index_slideshow_icon)}checked="checked"{/if}>
+        {'slideshow'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+  </ul>
+</fieldset>
+
+<fieldset id="pictureDisplayConf">
+  <legend>{'Photo Page'|@translate}</legend>
+  <ul>
+    <li>
+      <label>
+        <input type="checkbox" name="picture_slideshow_icon" {if ($display.picture_slideshow_icon)}checked="checked"{/if}>
+        {'slideshow'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_metadata_icon" {if ($display.picture_metadata_icon)}checked="checked"{/if}>
+        {'Show file metadata'|@translate|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_download_icon" {if ($display.picture_download_icon)}checked="checked"{/if}>
+        {'Download this file'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_favorite_icon" {if ($display.picture_favorite_icon)}checked="checked"{/if}>
+        {'add this photo to your favorites'|@translate|@ucfirst|@string_format:$pwg->l10n('Activate icon "%s"')}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_navigation_icons" {if ($display.picture_navigation_icons)}checked="checked"{/if}>
+        {'Activate Navigation Bar'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_navigation_thumb" {if ($display.picture_navigation_thumb)}checked="checked"{/if}>
+        {'Activate Navigation Thumbnails'|@translate}
+      </label>
+    </li>
+    
+    <li>
+      <label>
+        <input type="checkbox" name="picture_menu" {if ($display.picture_menu)}checked="checked"{/if}>
+        {'Show menubar'|@translate}
+      </label>
+    </li>
+  </ul>
+</fieldset>
+
+<fieldset id="pictureInfoConf">
+  <legend>{'Photo Properties'|@translate}</legend>
+  <ul>
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[author]" {if ($display.picture_informations.author)}checked="checked"{/if}>
+        {'Author'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[created_on]" {if ($display.picture_informations.created_on)}checked="checked"{/if}>
+        {'Created on'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[posted_on]" {if ($display.picture_informations.posted_on)}checked="checked"{/if}>
+        {'Posted on'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[dimensions]" {if ($display.picture_informations.dimensions)}checked="checked"{/if}>
+        {'Dimensions'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[file]" {if ($display.picture_informations.file)}checked="checked"{/if}>
+        {'File'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[filesize]" {if ($display.picture_informations.filesize)}checked="checked"{/if}>
+        {'Filesize'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[tags]" {if ($display.picture_informations.tags)}checked="checked"{/if}>
+        {'Tags'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[categories]" {if ($display.picture_informations.categories)}checked="checked"{/if}>
+        {'Albums'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[visits]" {if ($display.picture_informations.visits)}checked="checked"{/if}>
+        {'Visits'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[rating_score]" {if ($display.picture_informations.rating_score)}checked="checked"{/if}>
+        {'Rating score'|@translate}
+      </label>
+    </li>
+
+    <li>
+      <label>
+        <input type="checkbox" name="picture_informations[privacy_level]" {if ($display.picture_informations.privacy_level)}checked="checked"{/if}>
+        {'Who can see this photo?'|@translate} ({'available for administrators only'|@translate})
+      </label>
+    </li>
+  </ul>
+</fieldset>
+{/if}
+
+{if !isset($default)}
+	<p class="formButtons">
+		<input type="submit" name="submit" value="{'Save Settings'|@translate}">
+	</p>
+</form>
+{/if}
+
+</div> <!-- configContent -->
+
+{if isset($default)}
+{$PROFILE_CONTENT}
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/derivatives.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/derivatives.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/derivatives.tpl	(revision 14585)
@@ -0,0 +1,138 @@
+<h2>{'Multiple Size'|@translate}</h2>
+
+{html_head}{literal}
+<style type="text/css">
+#derviativesForm .dError {
+	background-color: red;
+	color: yellow;
+}
+
+#derviativesForm .dErrorDesc {
+}
+
+#derviativesForm TABLE THEAD {
+	height: 3em;
+}
+
+#derviativesForm TABLE INPUT[type="text"] {
+	border: 0;
+	width: 5em;
+}
+
+</style>
+{/literal}{/html_head}
+
+<form method="post" id="derviativesForm">
+<fieldset>
+<legend>{'Watermark'|@translate}</legend>
+
+
+<select name="w[file]" id="wSelect">
+	{html_options options=$watermark_files selected=$watermark.file}
+</select>
+
+<p><img id="wImg"></img></p>
+
+<label>{'Min Width'|@translate}
+	<input type="text" name="w[minw]" value="{$watermark.minw}"{if isset($ferrors.watermark.minw)}class="dError"{/if}> 
+</label>
+
+<label>{'Min Height'|@translate}
+	<input type="text" name="w[minh]" value="{$watermark.minh}"{if isset($ferrors.watermark.minh)}class="dError"{/if}> 
+</label>
+
+<label>{'X Position'|@translate}
+	<input type="text" name="w[xpos]" value="{$watermark.xpos}"{if isset($ferrors.watermark.xpos)}class="dError"{/if}> 
+%</label>
+
+<label>{'Y Position'|@translate}
+	<input type="text" name="w[ypos]" value="{$watermark.ypos}"{if isset($ferrors.watermark.ypos)}class="dError"{/if}> 
+%</label>
+
+<label>{'X Repeat'|@translate}
+	<input type="text" name="w[xrepeat]" value="{$watermark.xrepeat}"{if isset($ferrors.watermark.xrepeat)}class="dError"{/if}> 
+</label>
+
+<label>{'Opacity'|@translate}
+	<input type="text" name="w[opacity]" value="{$watermark.opacity}"{if isset($ferrors.watermark.opacity)}class="dError"{/if}> 
+</label>
+
+</fieldset>
+
+<table class="table2">
+	<thead>
+	<tr>
+		<td></td>
+		<td>Enabled</td>
+		<td>{'Width'|@translate}</td>
+		<td>{'Height'|@translate}</td>
+		<td>{'Crop'|@translate} (%)</td>
+		<td>{'Min Width'|@translate}</td>
+		<td>{'Min Height'|@translate}</td>
+		<td>{'Sharpen'|@translate} (%)</td>
+		<td>{'Quality'|@translate} (%)</td>
+	</tr>
+	</thead>
+	{foreach from=$derivatives item=d key=type}
+	<tr>
+		<td>{$type|@translate}</td>
+		<td>
+		{if $d.must_enable}
+			x
+		{else}
+			<input type="checkbox" name="d[{$type}][enabled]" {if $d.enabled}checked="checked"{/if}>
+		{/if}
+		</td>
+		<td>
+			<input type="text" name="d[{$type}][w]" value="{$d.w}"{if isset($ferrors.$type.w)}class="dError"{/if}>
+			{if isset($ferrors.$type.w)}<span class="dErrorDesc" title="{$ferrors.$type.w}">!</span>{/if}
+		</td>
+		<td>{if !$d.must_square}
+			<input type="text" name="d[{$type}][h]" value="{$d.h}"{if isset($ferrors.$type.h)}class="dError"{/if}>
+			{if isset($ferrors.$type.h)}<span class="dErrorDesc" title="{$ferrors.$type.h}">!</span>{/if}
+		{/if}</td>
+		<td>{if !$d.must_square}
+			<input type="text" name="d[{$type}][crop]" value="{$d.crop}"{if isset($ferrors.$type.crop)}class="dError"{/if}>
+			{if isset($ferrors.$type.crop)}<span class="dErrorDesc" title="{$ferrors.$type.crop}">!</span>{/if}
+		{/if}</td>
+		<td>{if !$d.must_square}
+			<input type="text" name="d[{$type}][minw]" value="{$d.minw}"{if isset($ferrors.$type.minw)}class="dError"{/if}>
+			{if isset($ferrors.$type.minw)}<span class="dErrorDesc" title="{$ferrors.$type.minw}">!</span>{/if}
+		{/if}</td>
+		<td>{if !$d.must_square}
+			<input type="text" name="d[{$type}][minh]" value="{$d.minh}"{if isset($ferrors.$type.minh)}class="dError"{/if}>
+			{if isset($ferrors.$type.minh)}<span class="dErrorDesc" title="{$ferrors.$type.minh}">!</span>{/if}
+		{/if}</td>
+		<td>
+			<input type="text" name="d[{$type}][sharpen]" value="{$d.sharpen}"{if isset($ferrors.$type.sharpen)}class="dError"{/if}>
+			{if isset($ferrors.$type.sharpen)}<span class="dErrorDesc" title="{$ferrors.$type.sharpen}">!</span>{/if}
+		</td>
+		<td>
+			<input type="text" name="d[{$type}][quality]" value="{$d.quality}"{if isset($ferrors.$type.quality)}class="dError"{/if}>
+			{if isset($ferrors.$type.quality)}<span class="dErrorDesc" title="{$ferrors.$type.quality}">!</span>{/if}
+		</td>
+	</tr>
+	{/foreach}
+</table>
+<p><input type="submit" value="{'Submit'|@translate}"></p>
+</form>
+
+{footer_script}{literal}
+jQuery(".dError").bind("focus", function () {
+	jQuery(this).removeClass("dError");
+} );
+
+function onWatermarkChange()
+{
+	var val = jQuery("#wSelect").val();
+	if (val.length) {
+		jQuery("#wImg").attr('src', {/literal}'{$ROOT_URL}'{literal}+val).show();
+	}
+	else {
+		jQuery("#wImg").hide();
+	}
+}
+
+onWatermarkChange();
+jQuery("#wSelect").bind("change", onWatermarkChange );
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/double_select.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/double_select.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/double_select.tpl	(revision 14585)
@@ -0,0 +1,22 @@
+
+{include file='include/dbselect.inc.tpl'}
+
+<table class="doubleSelect">
+  <tr>
+    <td>
+      <h3>{$L_CAT_OPTIONS_TRUE}</h3>
+      <select class="categoryList" name="cat_true[]" multiple="multiple" size="30">
+        {html_options options=$category_option_true selected=$category_option_true_selected}
+      </select>
+      <p><input class="submit" type="submit" value="&raquo;" name="falsify" style="font-size:15px;"></p>
+    </td>
+
+    <td>
+      <h3>{$L_CAT_OPTIONS_FALSE}</h3>
+      <select class="categoryList" name="cat_false[]" multiple="multiple" size="30">
+        {html_options options=$category_option_false selected=$category_option_false_selected}
+      </select>
+      <p><input class="submit" type="submit" value="&laquo;" name="trueify" style="font-size:15px;"></p>
+    </td>
+  </tr>
+</table>
Index: tags/2.4.0RC3/admin/themes/default/template/element_set_ranks.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/element_set_ranks.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/element_set_ranks.tpl	(revision 14585)
@@ -0,0 +1,94 @@
+{footer_script require='jquery.ui.sortable'}{literal}
+jQuery(document).ready(function() {
+  function checkOrderOptions() {
+    jQuery("#image_order_user_define_options").hide();
+    if (jQuery("input[name=image_order_choice]:checked").val() == "user_define") {
+      jQuery("#image_order_user_define_options").show();
+    }        
+  }
+
+  jQuery('ul.thumbnails').sortable( { 
+    revert: true, opacity: 0.7,
+    handle: jQuery('.rank-of-image').add('.rank-of-image img'),
+    update: function() {
+      jQuery(this).find('li').each(function(i) { 
+        jQuery(this).find("input[name^=rank_of_image]").each(function() {
+          jQuery(this).attr('value', (i+1)*10)
+        });
+      });
+
+      jQuery('#image_order_rank').attr('checked', true);
+      checkOrderOptions();
+    }
+  });
+
+  jQuery("input[name=image_order_choice]").click(function () {
+    checkOrderOptions();
+  });
+
+  checkOrderOptions();
+});
+jQuery(document).ready(function() {
+jQuery('.clipwrapper').tipTip({
+'delay' : 0,
+'fadeIn' : 200,
+'fadeOut' : 200
+});
+}); 
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2><span style="letter-spacing:0">{$CATEGORIES_NAV}</span> &#8250; {'Edit album'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form action="{$F_ACTION}" method="post">
+{if !empty($thumbnails)}
+  <p><input class="submit" type="submit" value="{'Submit'|@translate}" name="submit"></p>
+  <fieldset>
+    <legend>{'Manual order'|@translate}</legend>
+    {if !empty($thumbnails)}
+    <p>{'Drag to re-order'|@translate}</p>
+    <ul class="thumbnails">
+      {foreach from=$thumbnails item=thumbnail}
+      <li class="rank-of-image">
+        <img src="{$thumbnail.TN_SRC}" class="thumbnail" alt="{$thumbnail.NAME|@replace:'"':' '}"  style="width:{$thumbnail.SIZE[0]}px; height:{$thumbnail.SIZE[1]}px; ">
+        <input type="text" name="rank_of_image[{$thumbnail.ID}]" value="{$thumbnail.RANK}" style="display:none">
+      </li>
+      {/foreach}
+    </ul>
+    {/if}
+  </fieldset>
+{/if}
+
+  <fieldset>
+    <legend>{'Sort order'|@translate}</legend>
+    <p class="field">
+      <input type="radio" name="image_order_choice" id="image_order_default" value="default"{if $image_order_choice=='default'} checked="checked"{/if}>
+      <label for="image_order_default">{'Use the default photo sort order (defined in the configuration file)'|@translate}</label>
+    </p>
+    <p class="field">
+      <input type="radio" name="image_order_choice" id="image_order_rank" value="rank"{if $image_order_choice=='rank'} checked="checked"{/if}>
+      <label for="image_order_rank">{'manual order'|@translate}</label>
+    </p>
+    <p class="field">
+      <input type="radio" name="image_order_choice" id="image_order_user_define" value="user_define"{if $image_order_choice=='user_define'} checked="checked"{/if}>
+      <label for="image_order_user_define">{'automatic order'|@translate}</label>
+      <div id="image_order_user_define_options">
+      {foreach from=$image_order item=order}
+      <p class="field">
+        <select name="image_order[]">
+          {html_options options=$image_order_options selected=$order}
+        </select>
+      </p>
+      {/foreach}
+      </div>
+  </fieldset>
+  <p>
+    <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+
+    <label>
+      <input type="checkbox" name="image_order_subcats" id="image_order_subcats">
+      {'Apply to sub-albums'|@translate}
+    </label>
+  </p>
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/extend_for_templates.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/extend_for_templates.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/extend_for_templates.tpl	(revision 14585)
@@ -0,0 +1,35 @@
+<div class="titrePage"><h2>{'Extend for templates'|@translate}</h2>
+</div>
+{if isset($extents)}
+<h4>{'Replacement of original templates by customized templates from template-extension subfolder'|@translate}</h4>
+<form method="post" name="extend_for_templates" id="extend_for_templates" action="">
+  <table class="table2">
+    <tr class="throw">
+      <th>{'Replacers (customized templates)'|@translate}</th>
+      <th>{'Original templates'|@translate}</th>
+      <th>{'Optional URL keyword'|@translate}</th>
+      <th>{'Bound Theme'|@translate}</th>
+    </tr>
+    {foreach from=$extents item=tpl name=extent_loop}
+    <tr class="{if $smarty.foreach.extent_loop.index is odd}row1{else}row2{/if}">
+      <td>
+        <input type="hidden" name="reptpl[]" value="{$tpl.replacer}">
+        {$tpl.replacer}
+      </td>
+      <td>
+        {html_options name=original[] output=$tpl.original_tpl values=$tpl.original_tpl selected=$tpl.selected_tpl}
+      </td>
+      <td>
+        {html_options name=url[] output=$tpl.url_parameter values=$tpl.url_parameter selected=$tpl.selected_url}
+      </td>
+      <td>
+        {html_options name=bound[] output=$tpl.bound_tpl values=$tpl.bound_tpl selected=$tpl.selected_bound}
+      </td>
+    </tr>
+    {/foreach}
+  </table>
+  <p>
+    <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+  </p>
+</form>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/footer.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/footer.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/footer.tpl	(revision 14585)
@@ -0,0 +1,83 @@
+{* 
+          Warning : This is the admin pages footer only 
+          don't be confusing with the public page footer
+*}
+</div> <!-- pwgMain -->
+{if isset($footer_elements)}
+{foreach from=$footer_elements item=v}
+{$v}
+{/foreach}
+{/if}
+{if isset($debug.QUERIES_LIST)}
+<div id="debug">
+{$debug.QUERIES_LIST}
+</div>
+{/if}
+
+<div id="footer">
+  <div id="piwigoInfos">
+ {* Please, do not remove this copyright. If you really want to,
+      contact us on http://piwigo.org to find a solution on how
+      to show the origin of the script...
+  *}
+
+  {'Powered by'|@translate}
+  <a class="externalLink" href="{$PHPWG_URL}" title="{'Visit Piwigo project website'|@translate}">
+  <span class="Piwigo">Piwigo</span></a>
+  {$VERSION}
+  | <a class="externalLink" href="{$pwgmenu.WIKI}" title="{'Read Piwigo Documentation'|@translate}">{'Documentation'|@translate}</a>
+  | <a class="externalLink" href="{$pwgmenu.FORUM}" title="{'Get Support on Piwigo Forum'|@translate}">{'Support'|@translate}</a>
+  </div> <!-- piwigoInfos -->
+
+  <div id="pageInfos">
+ {if isset($debug.TIME) }
+ {'Page generated in'|@translate} {$debug.TIME} ({$debug.NB_QUERIES} {'SQL queries in'|@translate} {$debug.SQL_TIME}) -
+ {/if}
+
+
+  {'Contact'|@translate}
+  <a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|@translate|@escape:url}">{'Webmaster'|@translate}</a>
+  </div> <!-- pageInfos -->
+
+</div> <!-- footer -->
+</div> <!-- the_page -->
+
+
+{combine_script id='jquery.tipTip' load='async' path='themes/default/js/plugins/jquery.tipTip.minified.js'}
+{footer_script require='jquery.tipTip'}
+jQuery(document).ready(function() {ldelim}
+	jQuery('#pwgHead A[title], #footer A[title], .themeActions .tiptip, .languageActions .tiptip').tipTip({ldelim}
+			'delay' : 0,
+			'fadeIn' : 200,
+			'fadeOut' : 200
+	});
+});
+{/footer_script}
+
+<!-- BEGIN get_combined_scripts -->
+{get_combined_scripts load='footer'}
+<!-- END get_combined_scripts -->
+
+{literal}
+<script type='text/javascript'>
+  jQuery(document).ready(function() {
+    $("a.externalLink").click(function() {
+      window.open($(this).attr("href"));
+      return false;
+    });
+  });
+</script>
+{/literal}
+
+{if not $ENABLE_SYNCHRONIZATION}
+{literal}
+<script type='text/javascript'>
+  $(document).ready(function() {
+    $("#helpSynchro").hide();
+  });
+</script>
+{/literal}
+{/if}
+
+</body>
+</html>
Index: tags/2.4.0RC3/admin/themes/default/template/group_list.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/group_list.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/group_list.tpl	(revision 14585)
@@ -0,0 +1,44 @@
+<div class="titrePage">
+  <h2>{'Group management'|@translate}</h2>
+</div>
+
+<form method="post" name="add_user" action="{$F_ADD_ACTION}" class="properties">
+  <fieldset>
+    <legend>{'Add group'|@translate}</legend>
+    <span class="property">
+      <label for="groupname">{'Group name'|@translate}</label>
+    </span>
+    <input type="text" id="groupname" name="groupname" maxlength="50" size="20">
+
+    <p>
+      <input class="submit" type="submit" name="submit_add" value="{'Add'|@translate}">
+      <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}"> 
+    </p>
+  </fieldset>
+</form>
+
+<table class="table2">
+  <tr class="throw">
+    <th>{'Group name'|@translate}</th>
+    <th>{'Members'|@translate}</th>
+    <th>{'Actions'|@translate}</th>
+  </tr>
+  {if not empty($groups)}
+  {foreach from=$groups item=group name=group_loop}
+  <tr class="{if $smarty.foreach.group_loop.index is odd}row1{else}row2{/if}">
+    <td>{$group.NAME}<i><small>{$group.IS_DEFAULT}</small></i></td>
+    <td><a href="{$group.U_MEMBERS}">{$group.MEMBERS}</a></td>
+    <td style="text-align:center;">
+      <a href="{$group.U_PERM}">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/permissions.png" style="border:none" alt="{'Permissions'|@translate}" title="{'Permissions'|@translate}"></a>
+      <a href="{$group.U_DELETE}" onclick="return confirm('{'delete'|@translate|@escape:'javascript'}' 
+				+ '\n\n' + '{'Are you sure?'|@translate|@escape:'javascript'}');">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/delete.png" style="border:none" alt="{'Delete'|@translate}" title="{'Delete'|@translate}"></a>
+      <a href="{$group.U_ISDEFAULT}" onclick="return confirm('{'Toggle \'default group\' property'|@translate|@escape:'javascript'}' 
+				+'\n\n' + '{'Are you sure?'|@translate|@escape:'javascript'}');">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/toggle_is_default_group.png" style="border:none" alt="{'Toggle \'default group\' property'|@translate}" title="{'Toggle \'default group\' property'|@translate}"></a>
+    </td>
+  </tr>
+  {/foreach}
+  {/if}
+</table>
Index: tags/2.4.0RC3/admin/themes/default/template/group_perm.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/group_perm.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/group_perm.tpl	(revision 14585)
@@ -0,0 +1,8 @@
+{* $Id *}
+<h2>{$TITLE}</h2>
+
+<form method="post" action="{$F_ACTION}">
+  {$DOUBLE_SELECT}
+</form>
+
+<p>{'Only private albums are listed'|@translate}</p>
Index: tags/2.4.0RC3/admin/themes/default/template/header.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/header.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/header.tpl	(revision 14585)
@@ -0,0 +1,81 @@
+{* 
+
+          Warning : This is the admin pages header only 
+          don't confuse with the public page header
+
+*}
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
+<meta name="generator" content="Piwigo (aka PWG), see piwigo.org">
+<title>{$GALLERY_TITLE} :: {$PAGE_TITLE}</title>
+<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="admin/themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
+{/foreach}
+
+<!-- BEGIN get_combined_scripts -->
+{get_combined_scripts load='header'}
+<!-- END get_combined_scripts -->
+
+{combine_script id='jquery' path='themes/default/js/jquery.min.js'}
+
+<!--[if lt IE 7]>
+<script type="text/javascript" src="{$ROOT_URL}themes/default/js/pngfix.js"></script>
+<![endif]-->
+
+{if not empty($head_elements)}
+{foreach from=$head_elements item=elt}
+{$elt}
+{/foreach}
+{/if}
+
+</head>
+
+<body id="{$BODY_ID}">
+
+<div id="the_page">
+
+{if not empty($header_msgs)}
+<div class="header_msgs">
+  {foreach from=$header_msgs item=elt}
+  {$elt}
+  {/foreach}
+</div>
+{/if}
+
+<div id="pwgHead">
+  <h1>
+    <a href="{$U_RETURN}" title="{'Visit Gallery'|@translate}">
+      <img src="{$ROOT_URL}admin/themes/{$theme.id}/icon/home.png" alt="{'Home'|@translate}">
+      {$GALLERY_TITLE}
+    </a>
+  </h1>
+
+  <div id="headActions">
+    {'Hello'|@translate} {$USERNAME} :
+    <a href="{$U_RETURN}">{'Visit Gallery'|@translate}</a> |
+    <a href="{$U_CHANGE_THEME}" title="{'Switch to clear or dark colors for administration'|@translate}">{'Change Admin Colors'|@translate}</a> |
+    <a href="{$U_FAQ}" title="{'Instructions to use Piwigo'|@translate}">{'Help Me'|@translate}</a> |
+    <a href="{$U_LOGOUT}">{'Logout'|@translate}</a>
+  </div>
+</div>
+
+<div style="clear:both;"></div>
+
+{if not empty($header_notes)}
+<div class="header_notes">
+  {foreach from=$header_notes item=elt}
+  {$elt}
+  {/foreach}
+</div>
+{/if}
+
+<div id="pwgMain">
Index: tags/2.4.0RC3/admin/themes/default/template/help.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/help.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/help.tpl	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>{'Help'|@translate} &raquo; {$HELP_SECTION_TITLE}</h2>
+
+<div id="helpContent">
+
+{$HELP_CONTENT}
+
+</div>
Index: tags/2.4.0RC3/admin/themes/default/template/history.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/history.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/history.tpl	(revision 14585)
@@ -0,0 +1,133 @@
+
+{include file='include/datepicker.inc.tpl'}
+
+{footer_script}{literal}
+	pwg_initialization_datepicker("#start_day", "#start_month", "#start_year", "#start_linked_date", null, null, "#end_linked_date");
+	pwg_initialization_datepicker("#end_day", "#end_month", "#end_year", "#end_linked_date", null, "#start_linked_date", null);
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2>{'History'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form class="filter" method="post" name="filter" action="{$F_ACTION}">
+<fieldset>
+  <legend>{'Filter'|@translate}</legend>
+  <ul>
+    <li><label>{'Date'|@translate}</label></li>
+    <li>
+      <select id="start_day" name="start_day">
+        <option value="0">--</option>
+        {section name=day start=1 loop=32}
+        <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$START_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
+        {/section}
+      </select>
+      <select id="start_month" name="start_month">
+      {html_options options=$month_list selected=$START_MONTH_SELECTED}
+      </select>
+      <input id="start_year" name="start_year" value="{$START_YEAR}" type="text" size="4" maxlength="4" >
+      <input id="start_linked_date" name="start_linked_date" type="hidden" size="10" disabled="disabled">
+    </li>
+  </ul>
+  <ul>
+    <li><label>{'End-Date'|@translate}</label></li>
+    <li>
+      <select id="end_day" name="end_day">
+        <option value="0">--</option>
+        {section name=day start=1 loop=32}
+        <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$END_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
+        {/section}
+      </select>
+      <select id="end_month" name="end_month">
+      {html_options options=$month_list selected=$END_MONTH_SELECTED}
+      </select>
+      <input id="end_year" name="end_year" value="{$END_YEAR}" type="text" size="4" maxlength="4" >
+      <input id="end_linked_date" name="end_linked_date" type="hidden" size="10" disabled="disabled">
+    </li>
+  </ul>
+
+  <label>
+    {'Element type'|@translate}
+    <select name="types[]" multiple="multiple" size="4">
+      {html_options values=$type_option_values output=$type_option_values|translate selected=$type_option_selected}
+    </select>
+  </label>
+
+  <label>
+    {'User'|@translate}
+    <select name="user">
+      <option value="-1">------------</option>
+      {html_options options=$user_options selected=$user_options_selected}
+    </select>
+  </label>
+
+  <label>
+    {'Image id'|@translate}
+    <input name="image_id" value="{$IMAGE_ID}" type="text" size="5">
+  </label>
+
+  <label>
+    {'File name'|@translate}
+    <input name="filename" value="{$FILENAME}" type="text">
+  </label>
+
+  <label>
+    {'Thumbnails'|@translate}
+    <select name="display_thumbnail">
+      {html_options options=$display_thumbnails selected=$display_thumbnail_selected}
+    </select>
+  </label>
+
+  <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+</fieldset>
+</form>
+
+{if isset($search_summary)}
+<fieldset>
+  <legend>{'Summary'|@translate}</legend>
+
+  <ul>
+    <li>{$search_summary.NB_LINES}, {$search_summary.FILESIZE}</li>
+    <li>
+      {$search_summary.USERS}
+      <ul>
+        <li>{$search_summary.MEMBERS}</li>
+        <li>{$search_summary.GUESTS}</li>
+      </ul>
+    </li>
+  </ul>
+</fieldset>
+{/if}
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+<table class="table2" id="detailedStats">
+<tr class="throw">
+  <th>{'Date'|@translate}</th>
+  <th>{'Time'|@translate}</th>
+  <th>{'User'|@translate}</th>
+  <th>{'IP'|@translate}</th>
+  <th>{'Element'|@translate}</th>
+  <th>{'Element type'|@translate}</th>
+  <th>{'Section'|@translate}</th>
+  <th>{'Album'|@translate}</th>
+  <th>{'Tags'|@translate}</th>
+</tr>
+{if !empty($search_results) }
+{foreach from=$search_results item=detail name=res_loop}
+<tr class="{if $smarty.foreach.res_loop.index is odd}row1{else}row2{/if}">
+  <td class="hour">{$detail.DATE}</td>
+  <td class="hour">{$detail.TIME}</td>
+  <td>{$detail.USER}</td>
+  <td>{$detail.IP}</td>
+  <td>{$detail.IMAGE}</td>
+  <td>{$detail.TYPE}</td>
+  <td>{$detail.SECTION}</td>
+  <td>{$detail.CATEGORY}</td>
+  <td>{$detail.TAGS}</td>
+</tr>
+{/foreach}
+{/if}
+</table>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/include/add_album.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/add_album.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/add_album.inc.tpl	(revision 14585)
@@ -0,0 +1,102 @@
+{footer_script}{literal}
+jQuery(document).ready(function(){
+  function fillCategoryListbox(selectId, selectedValue) {
+    jQuery.getJSON(
+      "ws.php?format=json&method=pwg.categories.getList",
+      {
+        recursive: true,
+        fullname: true,
+        format: "json",
+      },
+      function(data) {
+        jQuery.each(
+          data.result.categories,
+          function(i,category) {
+            var selected = null;
+            if (category.id == selectedValue) {
+              selected = "selected";
+            }
+            
+            jQuery("<option/>")
+              .attr("value", category.id)
+              .attr("selected", selected)
+              .text(category.name)
+              .appendTo("#"+selectId)
+              ;
+          }
+        );
+      }
+    );
+  }
+
+  jQuery(".addAlbumOpen").colorbox({
+    inline:true,
+    href:"#addAlbumForm",
+    onComplete:function(){
+      jQuery("input[name=category_name]").focus();
+    }
+  });
+
+  jQuery("#addAlbumForm form").submit(function(){
+      jQuery("#categoryNameError").text("");
+
+      jQuery.ajax({
+        url: "ws.php?format=json&method=pwg.categories.add",
+        data: {
+          parent: jQuery("select[name=category_parent] option:selected").val(),
+          name: jQuery("input[name=category_name]").val(),
+        },
+        beforeSend: function() {
+          jQuery("#albumCreationLoading").show();
+        },
+        success:function(html) {
+          jQuery("#albumCreationLoading").hide();
+
+          var newAlbum = jQuery.parseJSON(html).result.id;
+          jQuery(".addAlbumOpen").colorbox.close();
+
+          jQuery("#albumSelect").find("option").remove();
+          fillCategoryListbox("albumSelect", newAlbum);
+
+          /* we refresh the album creation form, in case the user wants to create another album */
+          jQuery("#category_parent").find("option").remove();
+
+          jQuery("<option/>")
+            .attr("value", 0)
+            .text("------------")
+            .appendTo("#category_parent")
+          ;
+
+          fillCategoryListbox("category_parent", newAlbum);
+
+          jQuery("#addAlbumForm form input[name=category_name]").val('');
+
+          jQuery("#albumSelection").show();
+
+          return true;
+        },
+        error:function(XMLHttpRequest, textStatus, errorThrows) {
+            jQuery("#albumCreationLoading").hide();
+            jQuery("#categoryNameError").text(errorThrows).css("color", "red");
+        }
+      });
+
+      return false;
+  });
+});
+{/literal}{/footer_script}
+
+<div style="display:none">
+  <div id="addAlbumForm" style="text-align:left;padding:1em;">
+    <form>
+      {'Parent album'|@translate}<br>
+      <select id ="category_parent" name="category_parent">
+        <option value="0">------------</option>
+        {html_options options=$category_parent_options selected=$category_parent_options_selected}
+      </select>
+
+      <br><br>{'Album name'|@translate}<br><input name="category_name" type="text"> <span id="categoryNameError"></span>
+      <br><br><br><input type="submit" value="{'Create'|@translate}"> <span id="albumCreationLoading" style="display:none"><img src="themes/default/images/ajax-loader-small.gif"></span>
+    </form>
+  </div>
+</div>
Index: tags/2.4.0RC3/admin/themes/default/template/include/autosize.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/autosize.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/autosize.inc.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+{combine_script id='jquery.autogrow' load='async' require='jquery' path='themes/default/js/plugins/jquery.autogrow-textarea.js'}
+{* Auto size and auto grow textarea *}
+{footer_script require='jquery.autogrow'}{literal}
+jQuery(document).ready(function(){
+	jQuery('textarea').css('overflow-y', 'hidden');
+	// Auto size and auto grow for all text area
+	jQuery('textarea').autogrow();
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/include/colorbox.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/colorbox.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/colorbox.inc.tpl	(revision 14585)
@@ -0,0 +1,2 @@
+{combine_script id='jquery.colorbox' load='footer' require='jquery' path='themes/default/js/plugins/jquery.colorbox.min.js'}
+{combine_css path="themes/default/js/plugins/colorbox/style2/colorbox.css"}
Index: tags/2.4.0RC3/admin/themes/default/template/include/datepicker.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/datepicker.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/datepicker.inc.tpl	(revision 14585)
@@ -0,0 +1,18 @@
+{combine_script id='datepicker.js' load='footer' require='jquery.ui.datepicker' path='themes/default/js/datepicker.js'}
+
+{assign var="datepicker_language" value="themes/default/js/ui/i18n/jquery.ui.datepicker-`$lang_info.code`.js"}
+
+{if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists}
+{combine_script id="jquery.ui.datepicker-$lang_info.code" load='footer' path=$datepicker_language}
+{/if}
+
+{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"}
+
+{footer_script require='jquery.ui.datepicker,datepicker.js'}
+function pwg_initialization_datepicker(day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date)
+{ldelim}
+  return pwg_common_initialization_datepicker(
+    "{$ROOT_URL}{$themeconf.admin_icon_dir}/datepicker.png",
+    day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date);
+};
+{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/include/dbselect.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/dbselect.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/dbselect.inc.tpl	(revision 14585)
@@ -0,0 +1,15 @@
+{footer_script require='jquery.ui.resizable'}{literal}
+jQuery(document).ready(function(){
+	// Resize possible for double select list
+	jQuery(".doubleSelect select.categoryList").resizable({
+		handles: "w,e",
+		animate: true,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		preventDefault: true,
+		preserveCursor: true,
+		autoHide: true,
+		ghost: true
+	});
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/include/install.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/install.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/install.inc.tpl	(revision 14585)
@@ -0,0 +1,19 @@
+<script type="text/javascript" src="template-common/lib/jquery.packed.js"></script>
+{literal}
+<script type="text/javascript">
+$(function() {
+    $option_selected = $('#dblayer option:selected').attr('value');
+    if ($option_selected=='sqlite' || $option_selected=='pdo-sqlite') {
+       $('input[name=dbhost],input[name=dbuser],input[name=dbpasswd]').parent().parent().hide();
+    }
+    $('#dblayer').change(function() {
+        $db = this;
+        if ($db.value=='sqlite' || $db.value=='pdo-sqlite') {
+           $('input[name=dbhost],input[name=dbuser],input[name=dbpasswd]').parent().parent().hide();
+        } else {
+           $('input[name=dbhost],input[name=dbuser],input[name=dbpasswd]').parent().parent().show();
+        }
+      });
+  });
+</script>
+{/literal}
Index: tags/2.4.0RC3/admin/themes/default/template/include/resize.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/resize.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/resize.inc.tpl	(revision 14585)
@@ -0,0 +1,16 @@
+{* Resize possible *}
+{footer_script require='jquery.ui.resizable'}{literal}
+  jQuery().ready(function(){
+    // Resize possible for list
+    jQuery(".categoryList").resizable({
+      handles: "all",
+      animate: true,
+      animateDuration: "slow",
+      animateEasing: "swing",
+      preventDefault: true,
+      preserveCursor: true,
+      autoHide: true,
+      ghost: true
+    });
+  });
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/include/tag_selection.inc.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/include/tag_selection.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/include/tag_selection.inc.tpl	(revision 14585)
@@ -0,0 +1,15 @@
+{footer_script require='jquery'}{literal}
+jQuery(document).ready(function(){
+  jQuery(".tagSelection label").click(function () {
+    var parent = jQuery(this).parent('li');
+    var checkbox = jQuery(this).children("input[type=checkbox]");
+
+    if (jQuery(checkbox).is(':checked')) {
+      jQuery(parent).addClass("tagSelected"); 
+    }
+    else {
+      jQuery(parent).removeClass('tagSelected'); 
+    }
+  });
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/install.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/install.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/install.tpl	(revision 14585)
@@ -0,0 +1,314 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset={$T_CONTENT_ENCODING}">
+<meta http-equiv="Content-script-type" content="text/javascript">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="admin/themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{/foreach}
+
+<!--[if IE 7]>
+  <link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie7.css">
+<![endif]-->
+
+<!-- BEGIN get_combined_scripts -->
+{get_combined_scripts load='header'}
+<!-- END get_combined_scripts -->
+
+{combine_script id='jquery' path='themes/default/js/jquery.min.js'}
+{literal}
+<script type="text/javascript">
+$(function() {
+$(document).ready(function() {
+  $("a.externalLink").click(function() {
+    window.open($(this).attr("href"));
+    return false;
+  });
+
+  $("#admin_mail").keyup(function() {
+    $(".adminEmail").text($(this).val());
+  });
+});
+
+</script>
+
+<style type="text/css">
+body {
+  font-size:12px;
+}
+
+.content {
+ width: 800px;
+ margin: auto;
+ text-align: center;
+ padding:0;
+ background-color:transparent !important;
+ border:none;
+}
+
+#theHeader {
+  display: block;
+  background:url("admin/themes/clear/images/piwigo_logo_big.png") no-repeat scroll center 20px transparent;
+  height:100px;
+}
+
+fieldset {
+  margin-top:20px;
+  background-color:#f1f1f1;
+}
+
+legend {
+  font-weight:bold;
+  letter-spacing:2px;
+}
+
+.content h2 {
+  display:block;
+  font-size:20px;
+  text-align:center;
+  /* margin-top:5px; */
+}
+
+table.table2 {
+  width: 100%;
+  border:0;
+}
+
+table.table2 td {
+  text-align: left;
+  padding: 5px 2px;
+}
+
+table.table2 td.fieldname {
+  font-weight:normal;
+}
+
+table.table2 td.fielddesc {
+  padding-left:10px;
+  font-style:italic;
+}
+
+input[type="submit"], input[type="button"], a.bigButton {
+  font-size:14px;
+  font-weight:bold;
+  letter-spacing:2px;
+  border:none;
+  background-color:#666666;
+  color:#fff;
+  padding:5px;
+  -moz-border-radius:5px;
+  -webkit-border-radius:5px;
+  border-radius:5px;
+}
+
+input[type="submit"]:hover, input[type="button"]:hover, a.bigButton:hover {
+  background-color:#ff7700;
+  color:white;
+}
+
+input[type="text"], input[type="password"], select {
+  background-color:#ddd;
+  border:2px solid #ccc;
+  -moz-border-radius:5px;
+  -webkit-border-radius:5px;
+  border-radius:5px;
+  padding:2px;
+}
+
+input[type="text"]:focus, input[type="password"]:focus, select:focus {
+  background-color:#fff;
+  border:2px solid #ff7700;
+}
+
+.sql_content, .infos a {
+  color: #ff3363;
+}
+
+.errors {
+  padding-bottom:5px;
+}
+
+</style>
+{/literal}
+
+{combine_script id='jquery.cluetip' load='async' require='jquery' path='themes/default/js/plugins/jquery.cluetip.js'}
+
+{footer_script require='jquery.cluetip'}
+jQuery().ready(function(){ldelim}
+	jQuery('.cluetip').cluetip({ldelim}
+		width: 300,
+		splitTitle: '|',
+		positionBy: 'bottomTop'
+	});
+});
+{/footer_script}
+
+
+<title>Piwigo {$RELEASE} - {'Installation'|@translate}</title>
+</head>
+
+<body>
+<div id="the_page">
+<div id="theHeader"></div>
+<div id="content" class="content">
+
+<h2>{'Version'|@translate} {$RELEASE} - {'Installation'|@translate}</h2>
+
+{if isset($config_creation_failed)}
+<div class="errors">
+  <p style="margin-left:30px;">
+    <strong>{'Creation of config file local/config/database.inc.php failed.'|@translate}</strong>
+  </p>
+  <ul>
+    <li>
+      <p>{'You can download the config file and upload it to local/config directory of your installation.'|@translate}</p>
+      <p style="text-align:center">
+          <input type="button" value="{'Download the config file'|@translate}" onClick="window.open('{$config_url}');">
+      </p>
+    </li>
+    <li>
+      <p>{'An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'|@translate}</p>
+      <textarea rows="15" cols="70">{$config_file_content}</textarea>
+    </li>
+  </ul>
+</div>
+{/if}
+
+{if isset($errors)}
+<div class="errors">
+  <ul>
+    {foreach from=$errors item=error}
+    <li>{$error}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+{if isset($infos)}
+<div class="infos">
+  <ul>
+    {foreach from=$infos item=info}
+    <li>{$info}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+{if isset($install)}
+<form method="POST" action="{$F_ACTION}" name="install_form">
+
+<fieldset>
+  <legend>{'Basic configuration'|@translate}</legend>
+
+  <table class="table2">
+    <tr>
+      <td style="width: 30%">{'Default gallery language'|@translate}</td>
+      <td>
+    <select name="language" onchange="document.location = 'install.php?language='+this.options[this.selectedIndex].value;">
+    {html_options options=$language_options selected=$language_selection}
+    </select>
+      </td>
+    </tr>
+  </table>
+</fieldset>
+
+<fieldset>
+  <legend>{'Database configuration'|@translate}</legend>
+
+  <table class="table2">
+    <tr>
+      <td style="width: 30%;" class="fieldname">{'Host'|@translate}</td>
+      <td><input type="text" name="dbhost" value="{$F_DB_HOST}"></td>
+      <td class="fielddesc">{'localhost, sql.multimania.com, toto.freesurf.fr'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'User'|@translate}</td>
+      <td><input type="text" name="dbuser" value="{$F_DB_USER}"></td>
+      <td class="fielddesc">{'user login given by your host provider'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Password'|@translate}</td>
+      <td><input type="password" name="dbpasswd" value=""></td>
+      <td class="fielddesc">{'user password given by your host provider'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Database name'|@translate}</td>
+      <td><input type="text" name="dbname" value="{$F_DB_NAME}"></td>
+      <td class="fielddesc">{'also given by your host provider'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Database table prefix'|@translate}</td>
+      <td><input type="text" name="prefix" value="{$F_DB_PREFIX}"></td>
+      <td class="fielddesc">{'database tables names will be prefixed with it (enables you to manage better your tables)'|@translate}</td>
+    </tr>
+  </table>
+
+</fieldset>
+<fieldset>
+  <legend>{'Admin configuration'|@translate}</legend>
+
+  <table class="table2">
+    <tr>
+      <td style="width: 30%;" class="fieldname">{'Webmaster login'|@translate}</td>
+      <td><input type="text" name="admin_name" value="{$F_ADMIN}"></td>
+      <td class="fielddesc">{'It will be shown to the visitors. It is necessary for website administration'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Webmaster password'|@translate}</td>
+      <td><input type="password" name="admin_pass1" value=""></td>
+      <td class="fielddesc">{'Keep it confidential, it enables you to access administration panel'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Password [confirm]'|@translate}</td>
+      <td><input type="password" name="admin_pass2" value=""></td>
+      <td class="fielddesc">{'verification'|@translate}</td>
+    </tr>
+    <tr>
+      <td class="fieldname">{'Webmaster mail address'|@translate}</td>
+      <td><input type="text" name="admin_mail" id="admin_mail" value="{$F_ADMIN_EMAIL}"></td>
+      <td class="fielddesc">{'Visitors will be able to contact site administrator with this mail'|@translate}</td>
+    </tr>
+    <tr>
+      <td>{'Options'|@translate}</options>
+      <td colspan="2">
+        <label>
+          <input type="checkbox" name="newsletter_subscribe"{if $F_NEWSLETTER_SUBSCRIBE} checked="checked"{/if}>
+          <span class="cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate|@sprintf:$EMAIL}</span>
+        </label>
+        <br>
+        <label>
+          <input type="checkbox" name="send_password_by_mail" checked="checked">
+          {'Send my connection settings by email'|@translate}
+        </label>
+      </td>
+    </tr>
+  </table>
+
+</fieldset>
+
+  <div style="text-align:center; margin:20px 0 10px 0">
+    <input class="submit" type="submit" name="install" value="{'Start Install'|@translate}">
+  </div>
+</form>
+{else}
+<p>
+  <a class="bigButton" href="index.php">{'Visit Gallery'|@translate}</a>
+</p>
+{/if}
+</div> {* content *}
+<div style="text-align: center">{$L_INSTALL_HELP}</div>
+</div> {* the_page *}
+
+<!-- BEGIN get_combined_scripts -->
+{get_combined_scripts load='footer'}
+<!-- END get_combined_scripts -->
+
+</body>
+</html>
Index: tags/2.4.0RC3/admin/themes/default/template/intro.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/intro.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/intro.tpl	(revision 14585)
@@ -0,0 +1,104 @@
+{combine_script id='jquery.cluetip' load='async' require='jquery' path='themes/default/js/plugins/jquery.cluetip.js'}
+
+{footer_script require='jquery.cluetip'}
+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}
+
+<h2>{'Piwigo Administration'|@translate}</h2>
+<dl style="padding-top: 30px;">
+  <dt>{'Piwigo version'|@translate}</dt>
+  <dd>
+    <ul>
+      <li><a href="{$PHPWG_URL}" class="externalLink">Piwigo</a> {$PWG_VERSION}</li>
+      <li><a href="{$U_CHECK_UPGRADE}">{'Check for upgrade'|@translate}</a></li>
+{if isset($SUBSCRIBE_BASE_URL)}
+      <li><a href="{$SUBSCRIBE_BASE_URL}{$EMAIL}" class="externalLink cluetip" title="{'Piwigo Announcements Newsletter'|@translate}|{'Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'|@translate|@htmlspecialchars|@nl2br}">{'Subscribe %s to Piwigo Announcements Newsletter'|@translate|@sprintf:$EMAIL}</a></li>
+{/if}
+    </ul>
+  </dd>
+
+  <dt>{'Environment'|@translate}</dt>
+  <dd>
+    <ul>
+      <li>{'Operating system'|@translate}: {$OS}</li>
+      <li>PHP: {$PHP_VERSION} (<a href="{$U_PHPINFO}" class="externalLink">{'Show info'|@translate}</a>)  [{$PHP_DATATIME}]</li>
+      <li>{$DB_ENGINE}: {$DB_VERSION} [{$DB_DATATIME}]</li>
+      {if isset($GRAPHICS_LIBRARY)}
+      <li>{'Graphics Library'|@translate}: {$GRAPHICS_LIBRARY}</li>
+      {/if}
+    </ul>
+  </dd>
+
+  <dt>{'Database'|@translate}</dt>
+  <dd>
+    <ul>
+      <li>
+        {$DB_ELEMENTS}
+        {if isset($first_added)}
+        ({$first_added.DB_DATE})
+        {/if}
+      </li>
+      <li>{$DB_CATEGORIES} ({$DB_IMAGE_CATEGORY})</li>
+      <li>{$DB_TAGS} ({$DB_IMAGE_TAG})</li>
+      <li>{$DB_USERS}</li>
+      <li>{$DB_GROUPS}</li>
+    {if isset($DB_COMMENTS)}
+      <li>
+        {$DB_COMMENTS}
+        {if isset($unvalidated)}
+        (<a href="{$unvalidated.URL}">{$unvalidated.INFO}</a>)
+        {/if}
+      </li>
+    {/if}
+			<li>{$DB_RATES}</li>
+    </ul>
+  </dd>
+</dl>
+
+{if $ENABLE_SYNCHRONIZATION}
+<form name="QuickSynchro" action="{$U_CAT_UPDATE}" method="post" id="QuickSynchro" style="display: block; text-align:right;">
+<div>
+<input type="hidden" name="sync" value="files" checked="checked">
+<input type="hidden" name="display_info" value="1" checked="checked">
+<input type="hidden" name="add_to_caddie" value="1" checked="checked">
+<input type="hidden" name="privacy_level" value="0" checked="checked">
+<input type="hidden" name="sync_meta" checked="checked">
+<input type="hidden" name="simulate" value="0">
+<input type="hidden" name="subcats-included" value="1" checked="checked">
+</div>
+<div class="bigbutton">
+<span class="bigtext">{'Quick Local Synchronization'|@translate}</span>
+<input type="submit" value="{'Quick Local Synchronization'|@translate}" name="submit">
+</div>
+</form>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/languages_installed.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/languages_installed.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/languages_installed.tpl	(revision 14585)
@@ -0,0 +1,46 @@
+<div class="titrePage">
+  <h2>{'Installed Languages'|@translate}</h2>
+</div>
+
+{foreach from=$language_states item=language_state}
+<fieldset>
+  <legend>
+  {if $language_state == 'active'}
+  {'Active Languages'|@translate}
+
+  {elseif $language_state == 'inactive'}
+  {'Inactive Languages'|@translate}
+
+  {/if}
+  </legend>
+  <div class="languageBoxes">
+  {foreach from=$languages item=language}
+    {if $language.state == $language_state}
+  <div class="languageBox{if $language.is_default} languageDefault{/if}">
+    <div class="languageName">{$language.name}{if $language.is_default} <em>({'default'|@translate})</em>{/if}</div>
+    <div class="languageActions">
+      <div>
+      {if $language_state == 'active'}
+        {if $language.deactivable}
+      <a href="{$language.u_action}&amp;action=deactivate" class="tiptip" title="{'Forbid this language to users'|@translate}">{'Deactivate'|@translate}</a>
+        {else}
+      <span title="{$language.deactivate_tooltip}">{'Deactivate'|@translate}</span>
+        {/if}
+
+        {if not $language.is_default}
+      | <a href="{$language.u_action}&amp;action=set_default" class="tiptip" title="{'Set as default language for unregistered and new users'|@translate}">{'Default'|@translate}</a>
+        {/if}
+      {/if}
+
+      {if $language_state == 'inactive'}
+      <a href="{$language.u_action}&amp;action=activate" class="tiptip" title="{'Make this language available to users'|@translate}">{'Activate'|@translate}</a>
+      | <a href="{$language.u_action}&amp;action=delete" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');" class="tiptip" title="{'Delete this language'|@translate}">{'Delete'|@translate}</a>
+      {/if}
+      </div>
+    </div> <!-- languageActions -->
+  </div> <!-- languageBox -->
+    {/if}
+  {/foreach}
+  </div> <!-- languageBoxes -->
+</fieldset>
+{/foreach}
Index: tags/2.4.0RC3/admin/themes/default/template/languages_new.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/languages_new.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/languages_new.tpl	(revision 14585)
@@ -0,0 +1,41 @@
+{combine_script id='jquery.cluetip' load='async' require='jquery' path='themes/default/js/plugins/jquery.cluetip.js'}
+
+{footer_script require='jquery.cluetip'}
+jQuery().ready(function(){ldelim}
+	jQuery('.cluetip').cluetip({ldelim}
+		width: 300,
+		splitTitle: '|'
+	});
+});
+{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Add New Language'|@translate}</h2>
+</div>
+
+{if !empty($languages)}
+<table class="table2 languages">
+<thead>
+  <tr class="throw">
+    <td>{'Language'|@translate}</td>
+    <td>{'Version'|@translate}</td>
+    <td>{'Date'|@translate}</td>
+    <td>{'Author'|@translate}</td>
+    <td>{'Actions'|@translate}</td>
+  </tr>
+</thead>
+{foreach from=$languages item=language name=languages_loop}
+  <tr class="{if $smarty.foreach.languages_loop.index is odd}row1{else}row2{/if}">
+    <td><a href="{$language.EXT_URL}" class="externalLink cluetip" title="{$language.EXT_NAME}|{$language.EXT_DESC|@htmlspecialchars|@nl2br}">{$language.EXT_NAME}</a></td>
+    <td style="text-align:center;"><a href="{$language.EXT_URL}" class="externalLink cluetip" title="{$language.EXT_NAME}|{$language.VER_DESC|@htmlspecialchars|@nl2br}">{$language.VERSION}</a></td>
+    <td>{$language.DATE}</td>
+    <td>{$language.AUTHOR}</td>
+    <td style="text-align:center;"><a href="{$language.URL_INSTALL}">{'Install'|@translate}</a>
+      / <a href="{$language.URL_DOWNLOAD}">{'Download'|@translate}</a>
+    </td>
+  </tr>
+{/foreach}
+</table>
+{else}
+<p>{'There is no other language available.'|@translate}</p>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/maintenance.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/maintenance.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/maintenance.tpl	(revision 14585)
@@ -0,0 +1,40 @@
+<div class="titrePage">
+  <h2>{'Maintenance'|@translate}</h2>
+</div>
+
+<ul>
+{if (isset($U_MAINT_LOCK_GALLERY))}
+  <li><a href="{$U_MAINT_LOCK_GALLERY}" onclick="return confirm('{'A locked gallery is only visible to administrators'|@translate|@escape:'javascript'}');">{'Lock gallery'|@translate}</a></li>
+{else}
+  <li><a href="{$U_MAINT_UNLOCK_GALLERY}">{'Unlock gallery'|@translate}</a></li>
+{/if}
+</ul>
+
+<ul>
+  {foreach from=$advanced_features item=feature}
+    <li><a href="{$feature.URL}">{$feature.CAPTION}</a></li>
+  {/foreach}
+</ul>
+
+<ul>
+	<li><a href="{$U_MAINT_CATEGORIES}">{'Update albums informations'|@translate}</a></li>
+	<li><a href="{$U_MAINT_IMAGES}">{'Update photos information'|@translate}</a></li>
+</ul>
+
+<ul>
+	<li><a href="{$U_MAINT_DATABASE}">{'Repair and optimize database'|@translate}</a></li>
+	<li><a href="{$U_MAINT_C13Y}">{'Reinitialize check integrity'|@translate}</a></li>
+</ul>
+
+<ul>
+	<li><a href="{$U_MAINT_ORPHAN_TAGS}">{'Delete orphan tags'|@translate}</a></li>
+	<li><a href="{$U_MAINT_HISTORY_DETAIL}" onclick="return confirm('{'Purge history detail'|@translate|@escape:'javascript'}');">{'Purge history detail'|@translate}</a></li>
+	<li><a href="{$U_MAINT_HISTORY_SUMMARY}" onclick="return confirm('{'Purge history summary'|@translate|@escape:'javascript'}');">{'Purge history summary'|@translate}</a></li>
+	<li><a href="{$U_MAINT_SESSIONS}">{'Purge sessions'|@translate}</a></li>
+	<li><a href="{$U_MAINT_FEEDS}">{'Purge never used notification feeds'|@translate}</a></li>
+	<li><a href="{$U_MAINT_SEARCH}"onclick="return confirm('{'Purge search history'|@translate|@escape:'javascript'}');">{'Purge search history'|@translate}</a></li>
+	<li><a href="{$U_MAINT_COMPILED_TEMPLATES}">{'Purge compiled templates'|@translate}</a></li>
+	<li>{'Delete multiple size images'|@translate}: 
+	{foreach from=$purge_derivatives key=name item=url name=loop}{if !$smarty.foreach.loop.first}, {/if}<a href="{$url}">{$name}</a>{/foreach}
+	</li>
+</ul>
Index: tags/2.4.0RC3/admin/themes/default/template/menubar.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/menubar.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/menubar.tpl	(revision 14585)
@@ -0,0 +1,65 @@
+{footer_script require='jquery.ui.sortable'}{literal}
+jQuery(document).ready(function(){
+	jQuery(".menuPos").hide();
+	jQuery(".drag_button").show();
+	jQuery(".menuLi").css("cursor","move");
+	jQuery(".menuUl").sortable({
+		axis: "y",
+		opacity: 0.8
+	});
+	jQuery("input[name^='hide_']").click(function() {
+		men = this.name.split('hide_');
+		if (this.checked) {
+			jQuery("#menu_"+men[1]).addClass('menuLi_hidden');
+		} else {
+			jQuery("#menu_"+men[1]).removeClass('menuLi_hidden');
+		}
+	});
+	jQuery("#menuOrdering").submit(function(){
+		ar = jQuery('.menuUl').sortable('toArray');
+		for(i=0;i<ar.length;i++) {
+			men = ar[i].split('menu_');
+			document.getElementsByName('pos_' + men[1])[0].value = i+1;
+		}
+	});
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Menu Management'|@translate}</h2>
+</div>
+
+<form id="menuOrdering" action="{$F_ACTION}" method="post">
+  <ul class="menuUl">
+    {foreach from=$blocks item=block name="block_loop"}
+    <li class="menuLi {if $block.pos<0}menuLi_hidden{/if}" id="menu_{$block.reg->get_id()}">
+      <p>
+        <span>
+          <strong>{'Hide'|@translate} <input type="checkbox" name="hide_{$block.reg->get_id()}" {if $block.pos<0}checked="checked"{/if}></strong>
+        </span>
+
+        <img src="{$themeconf.admin_icon_dir}/cat_move.png" class="button drag_button" style="display:none;" alt="{'Drag to re-order'|@translate}" title="{'Drag to re-order'|@translate}">
+        <strong>{$block.reg->get_name()|@translate}</strong> ({$block.reg->get_id()})
+      </p>
+
+      {if $block.reg->get_owner() != 'piwigo'}
+      <p class="menuAuthor">
+        {'Author'|@translate}: <i>{$block.reg->get_owner()}</i>
+      </p>
+      {/if}
+
+      <p class="menuPos">
+        <label>
+          {'Position'|@translate} :
+          <input type="text" size="4" name="pos_{$block.reg->get_id()}" maxlength="4" value="{math equation="abs(pos)" pos=$block.pos}">
+        </label>
+      </p>
+    </li>
+    {/foreach}
+  </ul>
+  <p class="menuSubmit">
+    <input type="submit" name="submit" value="{'Submit'|@translate}">
+    <input type="submit" name="reset" value="{'Reset'|@translate}">
+  </p>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/navigation_bar.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/navigation_bar.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/navigation_bar.tpl	(revision 14585)
@@ -0,0 +1,28 @@
+<div class="navigationBar">
+  {if isset($navbar.URL_FIRST)}
+  <a href="{$navbar.URL_FIRST}" rel="first">{'First'|@translate}</a> |
+  <a href="{$navbar.URL_PREV}" rel="prev">{'Previous'|@translate}</a> |
+  {else}
+  {'First'|@translate} |
+  {'Previous'|@translate} |
+  {/if}
+
+  {assign var='prev_page' value=0}
+  {foreach from=$navbar.pages key=page item=url}
+    {if $page > $prev_page+1}...{/if}
+    {if $page == $navbar.CURRENT_PAGE}
+    <span class="pageNumberSelected">{$page}</span>
+    {else}
+    <a href="{$url}">{$page}</a>
+    {/if}
+    {assign var='prev_page' value=$page}
+  {/foreach}
+
+  {if isset($navbar.URL_NEXT)}
+  | <a href="{$navbar.URL_NEXT}" rel="next">{'Next'|@translate}</a>
+  | <a href="{$navbar.URL_LAST}" rel="last">{'Last'|@translate}</a>
+  {else}
+  | {'Next'|@translate}
+  | {'Last'|@translate}
+  {/if}
+</div>
Index: tags/2.4.0RC3/admin/themes/default/template/notification_by_mail.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/notification_by_mail.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/notification_by_mail.tpl	(revision 14585)
@@ -0,0 +1,136 @@
+
+{include file='include/autosize.inc.tpl'}
+{footer_script}{literal}
+jQuery(document).ready(function(){
+
+	jQuery("#checkAllLink").click(function () {
+		jQuery("#notification_by_mail input[type=checkbox]").attr('checked', true);
+		return false;
+	});
+
+	jQuery("#uncheckAllLink").click(function () {
+		jQuery("#notification_by_mail input[type=checkbox]").attr('checked', false);
+		return false;
+	});
+
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Send mail to users'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<form method="post" name="notification_by_mail" id="notification_by_mail" action="{$F_ACTION}">
+  {if isset($REPOST_SUBMIT_NAME)}
+  <fieldset>
+    <div class="infos">
+      <input class="submit" type="submit" value="{'Continue processing treatment'|@translate}" name="{$REPOST_SUBMIT_NAME}">
+    </div>
+  </fieldset>
+  {/if}
+
+  {if isset($param)}
+  <fieldset>
+    <legend>{'Parameters'|@translate}</legend>
+    <table>
+      <tr>
+        <td><label>{'Send mail on HTML format'|@translate}</label></td>
+        <td>
+          <label><input type="radio" name="nbm_send_html_mail" value="true"  {if $param.SEND_HTML_MAIL}checked="checked"{/if}>{'Yes'|@translate}</label>
+          <label><input type="radio" name="nbm_send_html_mail" value="false" {if not $param.SEND_HTML_MAIL}checked="checked"{/if}>{'No'|@translate}</label>
+        </td>
+      </tr>
+      <tr>
+        <td>
+          <label for="send_mail_as">{'Send mail as'|@translate}</label>
+          <br><i><small>{'With blank value, gallery title will be used'|@translate}</small></i>
+        </td>
+        <td><input type="text" maxlength="35" size="35" name="nbm_send_mail_as" id="send_mail_as" value="{$param.SEND_MAIL_AS}"></td>
+      </tr>
+      <tr>
+        <td><label>{'Add detailed content'|@translate}</label></td>
+        <td>
+          <label><input type="radio" name="nbm_send_detailed_content" value="true"  {if $param.SEND_DETAILED_CONTENT}checked="checked"{/if}>{'Yes'|@translate}</label>
+          <label><input type="radio" name="nbm_send_detailed_content" value="false" {if not $param.SEND_DETAILED_CONTENT}checked="checked"{/if}>{'No'|@translate}</label>
+        </td>
+      </tr>
+     <tr>
+        <td><label for="complementary_mail_content">{'Complementary mail content'|@translate}</label></td>
+        <td><textarea cols="50" rows="5" name="nbm_complementary_mail_content" id="complementary_mail_content">{$param.COMPLEMENTARY_MAIL_CONTENT}</textarea></td>
+      </tr>
+      <tr>
+        <td>
+          <label>{'Include display of recent photos grouped by dates'|@translate}</label>
+          <br><i><small>{'Available only with HTML format'|@translate}</small></i>
+        </td>
+        <td>
+          <label><input type="radio" name="nbm_send_recent_post_dates" value="true" {if $param.SEND_RECENT_POST_DATES}checked="checked"{/if}>{'Yes'|@translate}</label>
+          <label><input type="radio" name="nbm_send_recent_post_dates" value="false" {if not $param.SEND_RECENT_POST_DATES}checked="checked"{/if}>{'No'|@translate}</label>
+        </td>
+      </tr>
+    </table>
+  </fieldset>
+
+  <p>
+    <input class="submit" type="submit" value="{'Submit'|@translate}" name="param_submit">
+    <input class="submit" type="reset" value="{'Reset'|@translate}" name="param_reset">
+  </p>
+  {/if}{* isset $param*}
+
+  {if isset($subscribe)}
+  <fieldset>
+    <legend>{'Subscribe/unsubscribe users'|@translate}</legend>
+    <p><i>{'Warning: subscribing or unsubscribing will send mails to users'|@translate}</i></p>
+    {$DOUBLE_SELECT}
+  </fieldset>
+  {/if}{* isset $subscribe*}
+
+  {if isset($send)}
+    {if empty($send.users)}
+    <p>{'There is no available subscribers to mail.'|@translate}</p>
+    <p>
+    {'Subscribers could be listed (available) only if there is new elements to notify.'|@translate}<br>
+    {'Anyway only webmasters can see this tab and never administrators.'|@translate}
+    </p>
+    {else}
+    <fieldset>
+      <legend>{'Select recipients'|@translate}</legend>
+      <table class="table2">
+        <tr class="throw">
+          <th>{'User'|@translate}</th>
+          <th>{'email'|@translate}</th>
+          <th>{'Last send'|@translate}</th>
+          <th>{'To send ?'|@translate}</th>
+        </tr>
+        {foreach from=$send.users item=u name=user_loop}
+        <tr class="{if $smarty.foreach.user_loop.index is odd}row1{else}row2{/if}">
+          <td><label for="send_selection-{$u.ID}">{$u.USERNAME}</label></td>
+          <td><label for="send_selection-{$u.ID}">{$u.EMAIL}</label></td>
+          <td><label for="send_selection-{$u.ID}">{$u.LAST_SEND}</label></td>
+          <td><input type="checkbox" name="send_selection[]" value="{$u.ID}" {$u.CHECKED} id="send_selection-{$u.ID}"></td>
+        </tr>
+        {/foreach}
+      </table>
+      <p>
+          <a href="#" id="checkAllLink">{'Check all'|@translate}</a>
+        / <a href="#" id="uncheckAllLink">{'Uncheck all'|@translate}</a>
+      </p>
+    </fieldset>
+
+    <fieldset>
+      <legend>{'Options'|@translate}</legend>
+      <table>
+       <tr>
+          <td><label for="send_customize_mail_content">{'Complementary mail content'|@translate}</label></td>
+          <td><textarea cols="50" rows="5" name="send_customize_mail_content" id="send_customize_mail_content">{$send.CUSTOMIZE_MAIL_CONTENT}</textarea></td>
+        </tr>
+      </table>
+    </fieldset>
+
+    <p>
+      <input class="submit" type="submit" value="{'Send'|@translate}" name="send_submit">
+    </p>
+    {/if}
+  {/if}{* isset $send*}
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/permalinks.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/permalinks.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/permalinks.tpl	(revision 14585)
@@ -0,0 +1,99 @@
+{footer_script require='jquery.ui.sortable'}{literal}
+jQuery(document).ready(function(){
+  jQuery("#addPermalinkOpen").click(function(){
+    jQuery("#addPermalink").show();
+    jQuery("#showAddPermalink").hide();
+  });
+
+  jQuery("#addPermalinkClose").click(function(){
+    jQuery("#addPermalink").hide();
+    jQuery("#showAddPermalink").show();
+  });
+});
+{/literal}{/footer_script}
+
+{literal}
+<style>
+#showAddPermalink {text-align:left;margin-left:1em;margin-top:0;}
+form fieldset p {margin:0 0 1em 0;}
+form fieldset p.actionButtons {margin-bottom:0}
+</style>
+{/literal}
+
+<div class="titrePage">
+  <h2>{'Permalinks'|@translate}</h2>
+</div>
+
+<p id="showAddPermalink"><a href="#" id="addPermalinkOpen">{'Add/delete a permalink'|@translate}</a></p>
+
+<form method="post" action="" id="addPermalink" style="display:none">
+<fieldset>
+  <legend>{'Add/delete a permalink'|@translate}</legend>
+  <p>
+    <strong>{'Album'|@translate}</strong>
+    <br>
+    <select name="cat_id">
+      <option value="0">------</option>
+      {html_options options=$categories selected=$categories_selected}
+    </select>
+  </p>
+
+  <p>
+    <strong>{'Permalink'|@translate}</strong>
+    <br><input name="permalink">
+  </p>
+
+  <p>
+    <label><input type="checkbox" name="save" checked="checked"> <strong>{'Save to permalink history'|@translate}</strong></label>
+  </p>
+
+  <p class="actionButtons">
+    <input type="submit" class="submit" name="set_permalink" value="{'Submit'|@translate}">
+    <a href="#" id="addPermalinkClose">{'Cancel'|@translate}</a>
+  </p>
+</fieldset>
+</form>
+
+<fieldset>
+  <legend>{'Permalinks'|@translate}</legend>
+<table class="table2" style="margin:0">
+	<tr class="throw">
+		<td>Id {$SORT_ID}</td>
+		<td>{'Album'|@translate} {$SORT_NAME}</td>
+		<td>{'Permalink'|@translate} {$SORT_PERMALINK}</td>
+	</tr>
+{foreach from=$permalinks item=permalink name="permalink_loop"}
+	<tr class="{if $smarty.foreach.permalink_loop.index is odd}row1{else}row2{/if}" style="line-height:1.5em;">
+		<td style="text-align:center;">{$permalink.id}</td>
+		<td>{$permalink.name}</td>
+		<td>{$permalink.permalink}</td>
+	</tr>
+{/foreach}
+</table>
+</fieldset>
+
+<fieldset>
+  <legend>{'Permalink history'|@translate} <a name="old_permalinks"></a></legend>
+<table class="table2" style="margin:0">
+	<tr class="throw">
+		<td>Id {$SORT_OLD_CAT_ID}</td>
+		<td>{'Album'|@translate}</td>
+		<td>{'Permalink'|@translate} {$SORT_OLD_PERMALINK}</td>
+		<td>{'Deleted on'|@translate} {$SORT_OLD_DATE_DELETED}</td>
+		<td>{'Last hit'|@translate} {$SORT_OLD_LAST_HIT}</td>
+		<td>{'Hit'|@translate} {$SORT_OLD_HIT}</td>
+		<td style="width:5px;"></td>
+	</tr>
+{foreach from=$deleted_permalinks item=permalink}
+	<tr style="line-height:1.5em;">
+		<td style="text-align:center;">{$permalink.cat_id}</td>
+		<td>{$permalink.name}</td>
+		<td>{$permalink.permalink}</td>
+		<td>{$permalink.date_deleted}</td>
+		<td>{$permalink.last_hit}</td>
+		<td>{$permalink.hit}</td>
+		<td><a href="{$permalink.U_DELETE}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/delete.png" alt="[{'Delete'|@translate}]"></a></td>
+	</tr>
+{/foreach}
+</table>
+</fieldset>
Index: tags/2.4.0RC3/admin/themes/default/template/photos_add_applications.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/photos_add_applications.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/photos_add_applications.tpl	(revision 14585)
@@ -0,0 +1,132 @@
+{include file='include/colorbox.inc.tpl'}
+
+{footer_script}{literal}
+jQuery().ready(function(){
+  jQuery(".illustration a").colorbox({rel:'group1'});
+});
+{/literal}{/footer_script}
+
+{html_head}{literal}
+<style type="text/css">
+.illustration {float:left; margin-right:10px;}
+fieldset p {text-align:left;margin-top:0}
+</style>
+{/literal}{/html_head}
+
+<div class="titrePage">
+  <h2>{'Upload Photos'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<fieldset>
+  <legend>pLoader</legend>
+
+<div class="illustration"><a href="http://piwigo.org/ext/upload/extension-270/screenshot.jpg" title="pLoader"><img src="http://piwigo.org/ext/upload/extension-270/thumbnail.jpg"></a></div>
+<p>{'pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'|@translate}</p>
+
+<p>{'Available versions for'|@translate}
+<a href="{$URL_DOWNLOAD_WINDOWS}">Windows</a>,
+<a href="{$URL_DOWNLOAD_MAC}">Mac</a>,
+<a href="{$URL_DOWNLOAD_LINUX}">Linux</a>
+</p>
+
+</fieldset>
+
+<fieldset>
+  <legend>{'Piwigo for iOS (iPhone, iPad, iPod Touch)'|@translate}</legend>
+<div class="illustration"><a href="http://piwigo.com/blog/wp-content/uploads/2011/10/piwigo-ios-iphone-ipad.jpg" title="{'Piwigo for iOS (iPhone, iPad, iPod Touch)'|@translate}"><img src="http://piwigo.com/blog/wp-content/uploads/2011/10/piwigo-ios-iphone-ipad.jpg" style="width:150px"></a></div>
+<p>{'<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'|@translate}</p>
+
+<p>
+{'Available on'|@translate} <a target="_blank" href="http://itunes.apple.com/us/app/piwigo/id472225196">Apple AppStore</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>{'Piwigo for Android'|@translate}</legend>
+<div class="illustration"><a href="http://piwigo.com/blog/wp-content/uploads/2011/10/piwigo-ios-iphone-ipad.jpg" title="{'Piwigo for Android'|@translate}"><img src="http://piwigo.com/blog/wp-content/uploads/2011/10/piwigo-ios-iphone-ipad.jpg" style="width:150px"></a></div>
+<p>{'<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'|@translate}</p>
+
+<p>
+{'Available on'|@translate} <a target="_blank" href="https://play.google.com/store/apps/details?id=org.piwigo">Google Play</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>Lightroom</legend>
+
+<div class="illustration"><a href="http://alloyphoto.com/images/piwigo/dialog.png" title="{'Piwigo Publish plugin for Lightroom'|@translate}"><img src="http://alloyphoto.com/images/piwigo/dialog.png" style="width:150px"></a></div>
+<p>
+{'Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'|@translate}
+{'The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'|@translate}
+</p>
+
+<p>
+{'Available on'|@translate} <a target="_blank" href="http://alloyphoto.com/plugins/piwigo/">alloyphoto.com</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>Shotwell</legend>
+
+<div class="illustration"><a href="http://piwigo.files.wordpress.com/2010/11/shotwell_002.png" title="{'Piwigo publish plugin for Shotwell'|@translate}"><img src="http://piwigo.files.wordpress.com/2010/11/shotwell_002.png?w=150"></a></div>
+<p>{'Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'|@translate}</p>
+
+<p>
+{'On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'|@translate}
+<a href="http://yorba.org/shotwell/" target="_blank">{'Learn more'|@translate}</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>digiKam</legend>
+<div class="illustration"><a href="http://fr.piwigo.org/forum/showimage.php?pid=133064&filename=digikam2piwigo-01.png" title="{'Piwigo publish plugin for digiKam'|@translate}"><img src="http://fr.piwigo.org/forum/showimage.php?pid=133064&filename=digikam2piwigo-01.png" style="width:150px"></a></div>
+<p>
+{'digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'|@translate}
+{'digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'|@translate}
+</p>
+
+<p>
+{'To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'|@translate}
+<a href="http://digikam.org/" target="_blank">{'Learn more'|@translate}</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>iPhoto</legend>
+
+<div class="illustration"><a href="http://piwigo.org/forum/showimage.php?pid=126856&filename=iphoto-to-piwigo.jpg" title="{'Piwigo export plugin for iPhoto'|@translate}"><img src="http://piwigo.org/forum/showimage.php?pid=126856&filename=iphoto-to-piwigo.jpg" style="width:150px"></a></div>
+<p>{'iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'|@translate}</p>
+
+<p>
+<a target="_blank" href="http://piwigo.org/ext/extension_view.php?eid=592">{'Learn more'|@translate}</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>Aperture</legend>
+
+<div class="illustration"><a href="http://piwigo.org/ext/upload/extension-598/screenshot.jpg" title="{'Piwigo export plugin for Aperture'|@translate}"><img src="http://piwigo.org/ext/upload/extension-598/thumbnail.jpg" style="width:150px"></a></div>
+<p>
+{'Aperture is a powerful tool to refine images and manage massive libraries on Mac.'|@translate}
+{'Aperture is designed for professional photographers with iPhoto simplicity.'|@translate}
+{'The Piwigo export plugin allows you to create albums and export photos.'|@translate}
+</p>
+
+<p>
+<a target="_blank" href="http://piwigo.org/ext/extension_view.php?eid=598">{'Learn more'|@translate}</a>
+</p>
+</fieldset>
+
+<fieldset>
+  <legend>ReGalAndroid</legend>
+
+<div class="illustration"><a href="http://piwigo.org/screenshots/regalandroid.png" title="ReGalAndroid"><img src="http://piwigo.org/screenshots/regalandroid.png" style="width:150px"></a></div>
+<p>
+{'ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'|@translate}
+{'Features include gallery browsing, album creation and photo upload.'|@translate}
+</p>
+
+<p>
+{'Available on'|@translate} <a target="_blank" href="https://play.google.com/store/apps/details?id=net.dahanne.android.regalandroid">Google Play</a>
+</p>
+</fieldset>
Index: tags/2.4.0RC3/admin/themes/default/template/photos_add_direct.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/photos_add_direct.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/photos_add_direct.tpl	(revision 14585)
@@ -0,0 +1,355 @@
+{if $upload_mode eq 'multiple'}
+{combine_script id='jquery.jgrowl' load='footer' require='jquery' path='themes/default/js/plugins/jquery.jgrowl_minimized.js' }
+{combine_script id='jquery.uploadify' load='footer' require='jquery' path='admin/include/uploadify/jquery.uploadify.v3.0.0.min.js' }
+{combine_script id='jquery.ui.progressbar' load='footer'}
+{combine_css path="admin/themes/default/uploadify.jGrowl.css"}
+{combine_css path="admin/include/uploadify/uploadify.css"}
+{/if}
+
+{include file='include/colorbox.inc.tpl'}
+{include file='include/add_album.inc.tpl'}
+
+{footer_script}{literal}
+jQuery(document).ready(function(){
+  function checkUploadStart() {
+    var nbErrors = 0;
+    jQuery("#formErrors").hide();
+    jQuery("#formErrors li").hide();
+
+    if (jQuery("#albumSelect option:selected").length == 0) {
+      jQuery("#formErrors #noAlbum").show();
+      nbErrors++;
+    }
+
+    var nbFiles = 0;
+    if (jQuery("#uploadBoxes").size() == 1) {
+      jQuery("input[name^=image_upload]").each(function() {
+        if (jQuery(this).val() != "") {
+          nbFiles++;
+        }
+      });
+    }
+    else {
+      nbFiles = jQuery(".uploadifyQueueItem").size();
+    }
+
+    if (nbFiles == 0) {
+      jQuery("#formErrors #noPhoto").show();
+      nbErrors++;
+    }
+
+    if (nbErrors != 0) {
+      jQuery("#formErrors").show();
+      return false;
+    }
+    else {
+      return true;
+    }
+
+  }
+
+  function humanReadableFileSize(bytes) {
+    var byteSize = Math.round(bytes / 1024 * 100) * .01;
+    var suffix = 'KB';
+
+    if (byteSize > 1000) {
+      byteSize = Math.round(byteSize *.001 * 100) * .01;
+      suffix = 'MB';
+    }
+
+    var sizeParts = byteSize.toString().split('.');
+    if (sizeParts.length > 1) {
+      byteSize = sizeParts[0] + '.' + sizeParts[1].substr(0,2);
+    }
+    else {
+      byteSize = sizeParts[0];
+    }
+
+    return byteSize+suffix;
+  }
+
+  jQuery("#hideErrors").click(function() {
+    jQuery("#formErrors").hide();
+    return false;
+  });
+
+  jQuery("#uploadWarningsSummary a.showInfo").click(function() {
+    jQuery("#uploadWarningsSummary").hide();
+    jQuery("#uploadWarnings").show();
+  });
+
+  jQuery("#showPermissions").click(function() {
+    jQuery(this).parent(".showFieldset").hide();
+    jQuery("#permissions").show();
+  });
+
+{/literal}
+{if $upload_mode eq 'html'}
+{literal}
+  function addUploadBox() {
+    var uploadBox = '<p class="file"><input type="file" size="60" name="image_upload[]"></p>';
+    jQuery(uploadBox).appendTo("#uploadBoxes");
+  }
+
+  addUploadBox();
+
+  jQuery("#addUploadBox A").click(function () {
+    addUploadBox();
+  });
+
+  jQuery("#uploadForm").submit(function() {
+    return checkUploadStart();
+  });
+{/literal}
+{elseif $upload_mode eq 'multiple'}
+
+var uploadify_path = '{$uploadify_path}';
+var upload_id = '{$upload_id}';
+var session_id = '{$session_id}';
+var pwg_token = '{$pwg_token}';
+var buttonText = "{'Select files'|@translate}";
+var sizeLimit = Math.round({$upload_max_filesize} / 1024); /* in KBytes */
+
+{literal}
+  jQuery("#uploadify").uploadify({
+    'uploader'       : uploadify_path + '/uploadify.php',
+    'langFile'       : uploadify_path + '/uploadifyLang_en.js',
+    'swf'            : uploadify_path + '/uploadify.swf',
+    'checkExisting'  : false,
+
+    buttonCursor     : 'pointer',
+    'buttonText'     : buttonText,
+    'width'          : 300,
+    'cancelImage'    : uploadify_path + '/cancel.png',
+    'queueID'        : 'fileQueue',
+    'auto'           : false,
+    'multi'          : true,
+    'fileTypeDesc'   : 'Photo files',
+    'fileTypeExts'   : '*.jpg;*.JPG;*.jpeg;*.JPEG;*.png;*.PNG;*.gif;*.GIF',
+    'fileSizeLimit'  : sizeLimit,
+    'progressData'   : 'percentage',
+    requeueErrors   : false,
+    'onSelect'       : function(event,ID,fileObj) {
+      jQuery("#fileQueue").show();
+    },
+    'onQueueComplete'  : function(stats) {
+      jQuery("input[name=submit_upload]").click();
+    },
+    onUploadError: function (file,errorCode,errorMsg,errorString,swfuploadifyQueue) {
+      /* uploadify calls the onUploadError trigger when the user cancels a file! */
+      /* There no error so we skip it to avoid panic.                            */
+      if ("Cancelled" == errorString) {
+        return false;
+      }
+
+      var msg = file.name+', '+errorString;
+
+      /* Let's put the error message in the form to display once the form is     */
+      /* performed, it makes support easier when user can copy/paste the error   */
+      /* thrown.                                                                 */
+      jQuery("#uploadForm").append('<input type="hidden" name="onUploadError[]" value="'+msg+'">');
+
+      jQuery.jGrowl(
+        '<p></p>onUploadError '+msg,
+        {
+          theme:  'error',
+          header: 'ERROR',
+          life:   4000,
+          sticky: false
+        }
+      );
+
+      return false;
+    },
+    onUploadSuccess: function (file,data,response) {
+      var data = jQuery.parseJSON(data);
+      jQuery("#uploadedPhotos").parent("fieldset").show();
+
+      /* Let's display the thumbnail of the uploaded photo, no need to wait the  */
+      /* end of the queue                                                        */
+      jQuery("#uploadedPhotos").prepend('<img src="'+data.thumbnail_url+'" class="thumbnail"> ');
+    },
+    onUploadComplete: function(file,swfuploadifyQueue) {
+      var max = parseInt(jQuery("#progressMax").text());
+      var next = parseInt(jQuery("#progressCurrent").text())+1;
+      var addToProgressBar = 2;
+      if (next <= max) {
+        jQuery("#progressCurrent").text(next);
+      }
+      else {
+        addToProgressBar = 1;
+      }
+
+      jQuery("#progressbar").progressbar({
+        value: jQuery("#progressbar").progressbar("option", "value") + addToProgressBar
+      });
+    }
+  });
+
+  jQuery("input[type=button]").click(function() {
+    if (!checkUploadStart()) {
+      return false;
+    }
+
+    jQuery("#uploadify").uploadifySettings(
+      'postData',
+      {
+        'category_id' : jQuery("select[name=category] option:selected").val(),
+        'level' : jQuery("select[name=level] option:selected").val(),
+        'upload_id' : upload_id,
+        'session_id' : session_id,
+        'pwg_token' : pwg_token,
+      }
+    );
+
+    nb_files = jQuery(".uploadifyQueueItem").size();
+    jQuery("#progressMax").text(nb_files);
+    jQuery("#progressbar").progressbar({max: nb_files*2, value:1});
+    jQuery("#progressCurrent").text(1);
+
+    jQuery("#uploadProgress").show();
+
+    jQuery("#uploadify").uploadifyUpload();
+  });
+
+{/literal}
+{/if}
+});
+{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Upload Photos'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<div id="photosAddContent">
+
+{if count($setup_errors) > 0}
+<div class="errors">
+  <ul>
+  {foreach from=$setup_errors item=error}
+    <li>{$error}</li>
+  {/foreach}
+  </ul>
+</div>
+{else}
+
+  {if count($setup_warnings) > 0}
+<div class="warnings">
+  <ul>
+    {foreach from=$setup_warnings item=warning}
+    <li>{$warning}</li>
+    {/foreach}
+  </ul>
+  <div class="hideButton" style="text-align:center"><a href="{$hide_warnings_link}">{'Hide'|@translate}</a></div>
+</div>
+  {/if}
+
+
+{if !empty($thumbnails)}
+<fieldset>
+  <legend>{'Uploaded Photos'|@translate}</legend>
+  <div>
+  {foreach from=$thumbnails item=thumbnail}
+    <a href="{$thumbnail.link}" class="externalLink">
+      <img src="{$thumbnail.src}" alt="{$thumbnail.file}" title="{$thumbnail.title}" class="thumbnail">
+    </a>
+  {/foreach}
+  </div>
+  <p id="batchLink"><a href="{$batch_link}">{$batch_label}</a></p>
+</fieldset>
+<p style="margin:10px"><a href="{$another_upload_link}">{'Add another set of photos'|@translate}</a></p>
+{else}
+
+<div id="formErrors" class="errors" style="display:none">
+  <ul>
+    <li id="noAlbum">{'Select an album'|@translate}</li>
+    <li id="noPhoto">{'Select at least one photo'|@translate}</li>
+  </ul>
+  <div class="hideButton" style="text-align:center"><a href="#" id="hideErrors">{'Hide'|@translate}</a></div>
+</div>
+
+
+<form id="uploadForm" enctype="multipart/form-data" method="post" action="{$form_action}" class="properties">
+{if $upload_mode eq 'multiple'}
+    <input name="upload_id" value="{$upload_id}" type="hidden">
+{/if}
+
+    <fieldset>
+      <legend>{'Drop into album'|@translate}</legend>
+
+      <span id="albumSelection"{if count($category_options) == 0} style="display:none"{/if}>
+      <select id="albumSelect" name="category">
+        {html_options options=$category_options selected=$category_options_selected}
+      </select>
+      <br>{'... or '|@translate}</span><a href="#" class="addAlbumOpen" title="{'create a new album'|@translate}">{'create a new album'|@translate}</a>
+      
+    </fieldset>
+
+    <fieldset>
+      <legend>{'Select files'|@translate}</legend>
+
+    <p id="uploadWarningsSummary">{$upload_max_filesize_shorthand}B. {$upload_file_types}. {if isset($max_upload_resolution)}{$max_upload_resolution}Mpx{/if} <a class="showInfo" title="{'Learn more'|@translate}">i</a></p>
+
+    <p id="uploadWarnings">
+{'Maximum file size: %sB.'|@translate|@sprintf:$upload_max_filesize_shorthand}
+{'Allowed file types: %s.'|@translate|@sprintf:$upload_file_types}
+  {if isset($max_upload_resolution)}
+{'Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'|@translate|@sprintf:$max_upload_resolution:$max_upload_width:$max_upload_height}
+  {/if}
+    </p>
+
+{if $upload_mode eq 'html'}
+      <div id="uploadBoxes"></div>
+      <div id="addUploadBox">
+        <a href="javascript:">{'+ Add an upload box'|@translate}</a>
+      </div>
+
+    <p id="uploadModeInfos">{'You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'|@translate|@sprintf:$switch_url}</p>
+
+{elseif $upload_mode eq 'multiple'}
+    <div id="uploadify">You've got a problem with your JavaScript</div> 
+
+    <div id="fileQueue" style="display:none"></div>
+
+    <p id="uploadModeInfos">{'You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'|@translate|@sprintf:$switch_url}</p>
+
+{/if}
+    </fieldset>
+
+    <p class="showFieldset"><a id="showPermissions" href="#">{'Manage Permissions'|@translate}</a></p>
+
+    <fieldset id="permissions" style="display:none">
+      <legend>{'Who can see these photos?'|@translate}</legend>
+
+      <select name="level" size="1">
+        {html_options options=$level_options selected=$level_options_selected}
+      </select>
+    </fieldset>
+
+{if $upload_mode eq 'html'}
+    <p>
+      <input class="submit" type="submit" name="submit_upload" value="{'Start Upload'|@translate}">
+    </p>
+{elseif $upload_mode eq 'multiple'}
+    <p style="margin-bottom:1em">
+      <input class="submit" type="button" value="{'Start Upload'|@translate}">
+      <input type="submit" name="submit_upload" style="display:none">
+    </p>
+{/if}
+</form>
+
+<div id="uploadProgress" style="display:none">
+{'Photo %s of %s'|@translate|@sprintf:'<span id="progressCurrent">1</span>':'<span id="progressMax">10</span>'}
+<br>
+<div id="progressbar"></div>
+</div>
+
+<fieldset style="display:none">
+  <legend>{'Uploaded Photos'|@translate}</legend>
+  <div id="uploadedPhotos"></div>
+</fieldset>
+
+{/if} {* empty($thumbnails) *}
+{/if} {* $setup_errors *}
+
+</div> <!-- photosAddContent -->
Index: tags/2.4.0RC3/admin/themes/default/template/photos_add_ftp.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/photos_add_ftp.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/photos_add_ftp.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+<div class="titrePage">
+  <h2>{'Upload Photos'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<div id="ftpPage">
+<p><a href="{$U_CAT_UPDATE}">{'Administration'|@translate} &raquo; {'Tools'|@translate} &raquo; {'Synchronize'|@translate}</a></p>
+
+{$FTP_HELP_CONTENT}
+</div>
Index: tags/2.4.0RC3/admin/themes/default/template/picture_coi.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/picture_coi.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/picture_coi.tpl	(revision 14585)
@@ -0,0 +1,73 @@
+{html_head}
+<link rel="stylesheet" type="text/css" href="themes/default/js/plugins/jquery.Jcrop.css" />
+{/html_head}
+{combine_script id='jquery.jcrop' load='footer' require='jquery' path='themes/default/js/plugins/jquery.Jcrop.min.js'}
+
+<h2>{$TITLE} &#8250; {'Edit photo'|@translate} {$TABSHEET_TITLE}</h2>
+
+<form method="post">
+
+<fieldset>
+<legend>{'Photo sizes with crop'|@translate}</legend>
+{foreach from=$cropped_derivatives item=deriv}
+<img src="{$deriv.U_IMG}" alt="{$ALT}" {$deriv.HTM_SIZE}>
+{/foreach}
+</fieldset>
+
+<fieldset>
+<legend>{'Center of interest'|@translate}</legend>
+<p style="margin:0 0 10px 0;padding:0;">
+{'The center of interest is the most meaningful zone in the photo.'|@translate}
+{'For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'|@translate}
+{'By default, the center of interest is placed in the middle of the photo.'|@translate}
+{'Select a zone with your mouse to define a new center of interest.'|@translate}
+</p>
+<input type="hidden" id="l" name="l" value="{if isset($coi)}{$coi.l}{/if}">
+<input type="hidden" id="t" name="t" value="{if isset($coi)}{$coi.t}{/if}">
+<input type="hidden" id="r" name="r" value="{if isset($coi)}{$coi.r}{/if}">
+<input type="hidden" id="b" name="b" value="{if isset($coi)}{$coi.b}{/if}">
+
+<img id="jcrop" src="{$U_IMG}" alt="{$ALT}">
+
+<p>
+<input type="submit" name="submit" value="{'Submit'|@translate}">
+</p>
+</fieldset>
+</form>
+
+{footer_script}
+{literal}
+function from_coi(f, total) {
+	return f*total;
+}
+
+function to_coi(v, total) {
+	return v/total;
+}
+
+function jOnChange(sel) {
+	var $img = jQuery("#jcrop");
+	jQuery("#l").val( to_coi(sel.x, $img.width()) );
+	jQuery("#t").val( to_coi(sel.y, $img.height()) );
+	jQuery("#r").val( to_coi(sel.x2, $img.width()) );
+	jQuery("#b").val( to_coi(sel.y2, $img.height()) );
+}
+function jOnRelease() {
+	jQuery("#l,#t,#r,#b").val("");
+}
+
+{/literal}
+jQuery("#jcrop").Jcrop( {ldelim}
+	boxWidth: 500, boxHeight: 400,
+	onChange: jOnChange,
+	onRelease: jOnRelease
+	}
+{if isset($coi)}
+	,function() {ldelim}
+		var $img = jQuery("#jcrop");
+		this.animateTo( [from_coi({$coi.l}, $img.width()), from_coi({$coi.t}, $img.height()), from_coi({$coi.r}, $img.width()), from_coi({$coi.b}, $img.height()) ] );
+	}
+{/if}
+);
+{/footer_script}
+
Index: tags/2.4.0RC3/admin/themes/default/template/picture_modify.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/picture_modify.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/picture_modify.tpl	(revision 14585)
@@ -0,0 +1,155 @@
+{include file='include/autosize.inc.tpl'}
+{include file='include/dbselect.inc.tpl'}
+{include file='include/datepicker.inc.tpl'}
+
+{combine_script id='jquery.chosen' load='footer' path='themes/default/js/plugins/chosen.jquery.min.js'}
+{combine_css path="themes/default/js/plugins/chosen.css"}
+
+{footer_script}{literal}
+jQuery(document).ready(function() {
+  jQuery(".chzn-select").chosen();
+});
+{/literal}{/footer_script}
+
+{combine_script id='jquery.tokeninput' load='async' require='jquery' path='themes/default/js/plugins/jquery.tokeninput.js'}
+{footer_script require='jquery.tokeninput'}
+jQuery(document).ready(function() {ldelim}
+  jQuery("#tags").tokenInput(
+    [{foreach from=$tags item=tag name=tags}{ldelim}"name":"{$tag.name|@escape:'javascript'}","id":"{$tag.id}"{rdelim}{if !$smarty.foreach.tags.last},{/if}{/foreach}],
+    {ldelim}
+      hintText: '{'Type in a search term'|@translate}',
+      noResultsText: '{'No results'|@translate}',
+      searchingText: '{'Searching...'|@translate}',
+      newText: ' ({'new'|@translate})',
+      animateDropdown: false,
+      preventDuplicates: true,
+      allowCreation: true
+    }
+  );
+});
+{/footer_script}
+
+{footer_script}
+pwg_initialization_datepicker("#date_creation_day", "#date_creation_month", "#date_creation_year", "#date_creation_linked_date", "#date_creation_action_set");
+{/footer_script}
+
+<h2>{$TITLE} &#8250; {'Edit photo'|@translate} {$TABSHEET_TITLE}</h2>
+
+<form action="{$F_ACTION}" method="post" id="catModify">
+
+  <fieldset>
+    <legend>{'Informations'|@translate}</legend>
+
+    <table>
+
+      <tr>
+        <td id="albumThumbnail">
+          <img src="{$TN_SRC}" alt="{'Thumbnail'|@translate}" class="Thumbnail">
+        </td>
+        <td id="albumLinks" style="width:400px;vertical-align:top;">
+          <ul style="padding-left:15px;margin:0;">
+            <li>{$INTRO.file}</li>
+            <li>{$INTRO.add_date}</li>
+            <li>{$INTRO.added_by}</li>
+            <li>{$INTRO.size}</li>
+            <li>{$INTRO.stats}</li>
+            <li>{$INTRO.id}</li>
+          </ul>
+        </td>
+        <td style="vertical-align:top;">
+          <ul style="padding-left:15px;margin:0;">
+          {if isset($U_JUMPTO) }
+            <li><a href="{$U_JUMPTO}">{'jump to photo'|@translate} →</a></li>
+          {/if}
+          {if !url_is_remote($PATH)}
+            <li><a href="{$U_SYNC}">{'Synchronize metadata'|@translate}</a></li>
+
+            <li><a href="{$U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">{'delete photo'|@translate}</a></li>
+          {/if}
+          </ul>
+        </td>
+      </tr>
+    </table>
+
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Properties'|@translate}</legend>
+
+    <p>
+      <strong>{'Title'|@translate}</strong>
+      <br>
+      <input type="text" class="large" name="name" value="{$NAME|@escape}">
+    </p>
+
+    <p>
+      <strong>{'Author'|@translate}</strong>
+      <br>
+      <input type="text" class="large" name="author" value="{$AUTHOR}">
+    </p>
+
+    <p>
+      <strong>{'Creation date'|@translate}</strong>
+      <br>
+      <select id="date_creation_day" name="date_creation_day">
+        <option value="0">--</option>
+{section name=day start=1 loop=32}
+        <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$DATE_CREATION_DAY_VALUE}selected="selected"{/if}>{$smarty.section.day.index}</option>
+{/section}
+      </select>
+
+      <select id="date_creation_month" name="date_creation_month">
+        {html_options options=$month_list selected=$DATE_CREATION_MONTH_VALUE}
+      </select>
+
+      <input id="date_creation_year" name="date_creation_year" type="text" size="4" maxlength="4" value="{$DATE_CREATION_YEAR_VALUE}">
+      <input id="date_creation_linked_date" name="date_creation_linked_date" type="hidden" size="10" disabled="disabled">
+    <a href="#" id="unset_date_creation" style="display:none">unset</a>
+    </p>
+
+    <p>
+      <strong>{'Linked albums'|@translate}</strong>
+      <br>
+      <select data-placeholder="Select albums..." class="chzn-select" multiple style="width:700px;" name="associate[]">
+        {html_options options=$associate_options selected=$associate_options_selected}
+      </select>
+    </p>
+
+    <p>
+      <strong>{'Representation of albums'|@translate}</strong>
+      <br>
+      <select data-placeholder="Select albums..." class="chzn-select" multiple style="width:700px;" name="represent[]">
+        {html_options options=$represent_options selected=$represent_options_selected}
+      </select>
+    </p>
+
+    <p>
+      <strong>{'Tags'|@translate}</strong>
+      <br>
+<select id="tags" name="tags">
+{foreach from=$tag_selection item=tag}
+  <option value="{$tag.id}" class="selected">{$tag.name}</option>
+{/foreach}
+</select>
+    </p>
+
+    <p>
+      <strong>{'Description'|@translate}</strong>
+      <br>
+      <textarea name="description" id="description" class="description">{$DESCRIPTION}</textarea>
+    </p>
+
+    <p>
+      <strong>{'Who can see this photo?'|@translate}</strong>
+      <br>
+      <select name="level" size="1">
+        {html_options options=$level_options selected=$level_options_selected}
+      </select>
+   </p>
+
+  <p style="margin:40px 0 0 0">
+    <input class="submit" type="submit" value="{'Save Settings'|@translate}" name="submit">
+  </p>
+</fieldset>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/plugins_installed.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/plugins_installed.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/plugins_installed.tpl	(revision 14585)
@@ -0,0 +1,221 @@
+{combine_script id='jquery.ajaxmanager' load='footer' require='jquery' path='themes/default/js/plugins/jquery.ajaxmanager.js' }
+
+{footer_script require='jquery.ajaxmanager'}
+/* incompatible message */
+var incompatible_msg = '{'WARNING! This plugin does not seem to be compatible with this version of Piwigo.'|@translate|@escape:'javascript'}';
+var activate_msg = '\n{'Do you want to activate anyway?'|@translate|@escape:'javascript'}';
+
+/* group action */
+var pwg_token = '{$PWG_TOKEN}';
+var confirmMsg  = '{'Are you sure?'|@translate|@escape:'javascript'}';
+{literal}
+var queuedManager = jQuery.manageAjax.create('queued', { 
+  queue: true,  
+  maxRequests: 1
+});
+var nb_plugins = jQuery('div.active').size();
+var done = 0;
+
+jQuery(document).ready(function() {
+  /* group action */
+  jQuery('div.deactivate_all a').click(function() {
+    if (confirm(confirmMsg)) {
+      jQuery('div.active').each(function() {
+        performPluginDeactivate(jQuery(this).attr('id'));
+      });
+    }
+  });
+  function performPluginDeactivate(id) {
+   queuedManager.add({
+      type: 'GET',
+      dataType: 'json',
+      url: 'ws.php',
+      data: { method: 'pwg.plugins.performAction', action: 'deactivate', plugin: id, pwg_token: pwg_token, format: 'json' },
+      success: function(data) {
+        if (data['stat'] == 'ok') jQuery("#"+id).removeClass('active').addClass('inactive');
+        done++;
+        if (done == nb_plugins) location.reload();
+      }
+    });
+  };
+
+  /* incompatible plugins */
+  jQuery(document).ready(function() {
+    jQuery.ajax({
+      method: 'GET',
+      url: 'admin.php',
+      data: { page: 'plugins_installed', incompatible_plugins: true },
+      dataType: 'json',
+      success: function(data) {
+        for (i=0;i<data.length;i++) {
+          {/literal}
+          {if $show_details}
+            jQuery('#'+data[i]+' .pluginBoxNameCell').prepend('<a class="warning" title="'+incompatible_msg+'"></a>')
+          {else}
+            jQuery('#'+data[i]+' .pluginMiniBoxNameCell').prepend('<span class="warning" title="'+incompatible_msg+'"></span>')
+          {/if}
+          {literal}
+          jQuery('#'+data[i]).addClass('incompatible');
+          jQuery('#'+data[i]+' .activate').attr('onClick', 'return confirm(incompatible_msg + activate_msg);');
+        }
+        jQuery('.warning').tipTip({
+          'delay' : 0,
+          'fadeIn' : 200,
+          'fadeOut' : 200,
+          'maxWidth':'250px'
+        });
+      }
+    });
+  });
+  
+  /* TipTips */
+  jQuery('.plugin-restore').tipTip({
+    'delay' : 0,
+    'fadeIn' : 200,
+    'fadeOut' : 200
+  });
+  jQuery('.showInfo').tipTip({
+    'delay' : 0,
+    'fadeIn' : 200,
+    'fadeOut' : 200,
+    'maxWidth':'300px',
+    'keepAlive':true,
+    'activation':'click'
+  });
+});
+{/literal}
+{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Plugins'|@translate}</h2>
+</div>
+
+<div class="showDetails">
+  {if $show_details}
+  <a href="{$base_url}&amp;show_details=0">{'hide details'|@translate}</a>
+  {else}
+  <a href="{$base_url}&amp;show_details=1">{'show details'|@translate}</a>
+  {/if}
+</div>
+
+{if isset($plugins)}
+
+{assign var='field_name' value='null'} {* <!-- 'counter' for fieldset management --> *}
+{counter start=0 assign=i} {* <!-- counter for 'deactivate all' link --> *}
+{foreach from=$plugins item=plugin name=plugins_loop}
+    
+{if $field_name != $plugin.STATE}
+  {if $field_name != 'null'}
+  </fieldset>
+  {/if}
+  
+  <fieldset class="pluginBoxes">
+    <legend>
+    {if $plugin.STATE == 'active'}
+      {'Active Plugins'|@translate}
+    {elseif $plugin.STATE == 'inactive'}
+      {'Inactive Plugins'|@translate}
+    {elseif $plugin.STATE == 'missing'}
+      {'Missing Plugins'|@translate}
+    {elseif $plugin.STATE == 'merged'}
+      {'Obsolete Plugins'|@translate}
+    {/if}
+    </legend>
+  {assign var='field_name' value=$plugin.STATE}
+{/if}
+  
+  {if not empty($plugin.AUTHOR)}
+    {if not empty($plugin.AUTHOR_URL)}
+      {assign var='author' value="<a href='%s'>%s</a>"|@sprintf:$plugin.AUTHOR_URL:$plugin.AUTHOR}
+    {else}
+      {assign var='author' value='<u>'|cat:$plugin.AUTHOR|cat:'</u>'}
+    {/if}
+  {/if}
+   
+  {if $show_details}
+    <div id="{$plugin.ID}" class="pluginBox {$plugin.STATE}">
+      <table>
+        <tr>
+          <td class="pluginBoxNameCell">
+            {$plugin.NAME}
+          </td>
+          <td>{$plugin.DESC}</td>
+        </tr>
+        <tr class="pluginActions">
+          <td>
+          {if $plugin.STATE == 'active'}
+            <a href="{$plugin.U_ACTION}&amp;action=deactivate">{'Deactivate'|@translate}</a>
+            | <a href="{$plugin.U_ACTION}&amp;action=restore" class="plugin-restore" title="{'Restore default configuration. You will lose your plugin settings!'|@translate}" onclick="return confirm(confirmMsg);">{'Restore'|@translate}</a>
+
+          {elseif $plugin.STATE == 'inactive'}
+            <a href="{$plugin.U_ACTION}&amp;action=activate" class="activate">{'Activate'|@translate}</a>
+            | <a href="{$plugin.U_ACTION}&amp;action=delete" onclick="return confirm(confirmMsg);">{'Delete'|@translate}</a>
+
+          {elseif $plugin.STATE == 'missing'}
+            <a href="{$plugin.U_ACTION}&amp;action=uninstall" onclick="return confirm(confirmMsg);">{'Uninstall'|@translate}</a>
+
+          {elseif $plugin.STATE == 'merged'}
+            <a href="{$plugin.U_ACTION}&amp;action=delete">{'Delete'|@translate}</a>
+          {/if}
+          </td>
+          <td>
+            {'Version'|@translate} {$plugin.VERSION}
+            
+          {if not empty($author)}
+            | {'By %s'|@translate|@sprintf:$author}
+          {/if}
+
+          {if not empty($plugin.VISIT_URL)}
+            | <a class="externalLink" href="{$plugin.VISIT_URL}">{'Visit plugin site'|@translate}</a>
+          {/if}
+          </td>
+        </tr>
+      </table>
+    </div> {*<!-- pluginBox -->*}
+    
+  {else}
+    {if not empty($plugin.VISIT_URL)}
+      {assign var='version' value="<a class='externalLink' href='"|cat:$plugin.VISIT_URL|cat:"'>"|cat:$plugin.VERSION|cat:"</a>"}
+    {else}
+      {assign var='version' value=$plugin.VERSION}
+    {/if}
+          
+    <div id="{$plugin.ID}" class="pluginMiniBox {$plugin.STATE}">
+      <div class="pluginMiniBoxNameCell">
+        {$plugin.NAME}
+        <a class="showInfo" title="{if !empty($author)}{'By %s'|@translate|@sprintf:$author} | {/if}{'Version'|@translate} {$version}<br/>{$plugin.DESC|@escape:'html'}">i</a>
+      </div>
+      <div class="pluginActions">
+        <div>
+        {if $plugin.STATE == 'active'}
+          <a href="{$plugin.U_ACTION}&amp;action=deactivate">{'Deactivate'|@translate}</a>
+          | <a href="{$plugin.U_ACTION}&amp;action=restore" class="plugin-restore" title="{'Restore default configuration. You will lose your plugin settings!'|@translate}" onclick="return confirm(confirmMsg);">{'Restore'|@translate}</a>
+
+        {elseif $plugin.STATE == 'inactive'}
+          <a href="{$plugin.U_ACTION}&amp;action=activate" class="activate">{'Activate'|@translate}</a>
+          | <a href="{$plugin.U_ACTION}&amp;action=delete" onclick="return confirm(confirmMsg);">{'Delete'|@translate}</a>
+
+        {elseif $plugin.STATE == 'missing'}
+          <a href="{$plugin.U_ACTION}&amp;action=uninstall" onclick="return confirm(confirmMsg);">{'Uninstall'|@translate}</a>
+
+        {elseif $plugin.STATE == 'merged'}
+          <a href="{$plugin.U_ACTION}&amp;action=delete">{'Delete'|@translate}</a>
+        {/if}
+        </div>
+      </div>
+    </div> {*<!-- pluginMiniBox -->*}
+    
+  {/if}
+  
+{if $plugin.STATE == 'active'}
+  {counter}
+  {if $active_plugins == $i}
+    <div class="deactivate_all"><a>{'Deactivate all'|@translate}</a></div>
+    {counter}
+  {/if}
+{/if}
+  
+{/foreach}
+  </fieldset>
+
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/plugins_new.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/plugins_new.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/plugins_new.tpl	(revision 14585)
@@ -0,0 +1,91 @@
+{combine_script id='jquery.sort' load='footer' path='themes/default/js/plugins/jquery.sort.js'}
+
+{footer_script require='jquery.effects.blind,jquery.sort'}{literal}
+var sortOrder = 'date';
+var sortPlugins = (function(a, b) {
+  if (sortOrder == 'downloads' || sortOrder == 'revision' || sortOrder == 'date')
+    return parseInt($(a).find('input[name="'+sortOrder+'"]').val())
+      < parseInt($(b).find('input[name="'+sortOrder+'"]').val()) ? 1 : -1;
+  else
+    return $(a).find('input[name="'+sortOrder+'"]').val().toLowerCase()
+      > $(b).find('input[name="'+sortOrder+'"]').val().toLowerCase()  ? 1 : -1;
+});
+
+jQuery(document).ready(function(){
+	jQuery("td[id^='desc_']").click(function() {
+		id = this.id.split('_');
+		nb_lines = jQuery("#bigdesc_"+id[1]).html().split('<br>').length;
+
+		jQuery("#smalldesc_"+id[1]).toggle('blind', 1);
+		if (jQuery(this).hasClass('bigdesc')) {
+			jQuery("#bigdesc_"+id[1]).toggle('blind', 1);
+		} else {
+			jQuery("#bigdesc_"+id[1]).toggle('blind', 50 + (nb_lines * 30));
+		}
+		jQuery(this).toggleClass('bigdesc');
+		return false;
+	});
+
+  jQuery('select[name="selectOrder"]').change(function() {
+    sortOrder = this.value;
+    $('.pluginBox').sortElements(sortPlugins);
+    $.get("admin.php?plugins_new_order="+sortOrder);
+  });
+});
+{/literal}{/footer_script}
+
+<div class="titrePage">
+<span class="sort">
+{'Sort order'|@translate} : 
+{html_options name="selectOrder" options=$order_options selected=$order_selected}
+</span>
+  <h2>{'Plugins'|@translate}</h2>
+</div>
+
+{if not empty($plugins)}
+<div id="availablePlugins">
+<fieldset>
+<legend></legend>
+{foreach from=$plugins item=plugin name=plugins_loop}
+<div class="pluginBox" id="plugin_{$plugin.ID}">
+<input type="hidden" name="date" value="{$plugin.ID}">
+<input type="hidden" name="name" value="{$plugin.EXT_NAME}">
+<input type="hidden" name="revision" value="{$plugin.REVISION_DATE}">
+<input type="hidden" name="downloads" value="{$plugin.DOWNLOADS}">
+<input type="hidden" name="author" value="{$plugin.AUTHOR}">
+  <table>
+    <tr>
+      <td class="pluginBoxNameCell">{$plugin.EXT_NAME}</td>
+{if $plugin.BIG_DESC != $plugin.SMALL_DESC}
+      <td id="desc_{$plugin.ID}" class="pluginDesc">
+        <span id="smalldesc_{$plugin.ID}">
+          <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="">{$plugin.SMALL_DESC}...
+        </span>
+        <span id="bigdesc_{$plugin.ID}" style="display:none;">
+          <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="">{$plugin.BIG_DESC|@nl2br}<br>&nbsp;
+        </span>
+      </td>
+{else}
+      <td>{$plugin.BIG_DESC|@nl2br}</td>
+{/if}
+    </tr>
+    <tr>
+      <td>
+        <a href="{$plugin.URL_INSTALL}" onclick="return confirm('{'Are you sure you want to install this plugin?'|@translate|@escape:javascript}');">{'Install'|@translate}</a>
+        |  <a href="{$plugin.URL_DOWNLOAD}">{'Download'|@translate}</a>
+      </td>
+      <td>
+        <em>{'Downloads'|@translate}: {$plugin.DOWNLOADS}</em>
+        {'Version'|@translate} {$plugin.VERSION}
+        | {'By %s'|@translate|@sprintf:$plugin.AUTHOR}
+        | <a class="externalLink" href="{$plugin.EXT_URL}">{'Visit plugin site'|@translate}</a>
+      </td>
+    </tr>
+  </table>
+</div>
+{/foreach}
+</fieldset>
+</div>
+{else}
+<p>{'There is no other plugin available.'|@translate}</p>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/popuphelp.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/popuphelp.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/popuphelp.tpl	(revision 14585)
@@ -0,0 +1,12 @@
+<div id="content" class="content">
+{$HELP_CONTENT}
+</div> <!-- content -->
+
+<ul class="categoryActions">
+  <li>
+    <a href="#" onclick="window.close();" title="{'Close this window'|@translate}">
+      <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/exit.png" alt="exit">
+    </a>
+  </li>
+</ul>
+
Index: tags/2.4.0RC3/admin/themes/default/template/profile.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/profile.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/profile.tpl	(revision 14585)
@@ -0,0 +1,5 @@
+<div class="titrePage">
+  <h2>{'Profile'|@translate}</h2>
+</div>
+
+{$PROFILE_CONTENT}
Index: tags/2.4.0RC3/admin/themes/default/template/profile_content.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/profile_content.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/profile_content.tpl	(revision 14585)
@@ -0,0 +1,93 @@
+<form method="post" name="profile" action="{$F_ACTION}" id="profile" class="properties">
+
+  <fieldset>
+    <legend>{'Registration'|@translate}</legend>
+    <input type="hidden" name="redirect" value="{$REDIRECT}">
+    <ul>
+      <li>
+        <span class="property">
+          <label for="username">{'Username'|@translate}</label>
+        </span>
+      {if not $SPECIAL_USER}
+        <input type="text" name="username" id="username" value="{$USERNAME}">
+      {else}
+        {$USERNAME}
+      {/if}
+      </li>
+    {if not $SPECIAL_USER} {* can modify password + email*}
+      <li>
+        <span class="property">
+          <label for="mail_address">{'Email address'|@translate}</label>
+        </span>
+        <input type="text" name="mail_address" id="mail_address" value="{$EMAIL}">
+      </li>
+      <li>
+        <span class="property">
+          <label for="use_new_pwd">{'New password'|@translate}</label>
+        </span>
+        <input type="password" name="use_new_pwd" id="use_new_pwd" value="">
+      </li>
+      <li>
+        <span class="property">
+          <label for="passwordConf">{'Confirm Password'|@translate}</label>
+        </span>
+        <input type="password" name="passwordConf" id="passwordConf" value="">
+      </li>
+    {/if}
+    </ul>
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Preferences'|@translate}</legend>
+
+    <ul>
+      <li>
+        <span class="property">
+          <label for="nb_image_page">{'Number of photos per page'|@translate}</label>
+        </span>
+        <input type="text" size="4" maxlength="3" name="nb_image_page" id="nb_image_page" value="{$NB_IMAGE_PAGE}">
+      </li>
+    {if not $SPECIAL_USER}
+      <li>
+        <span class="property">
+          <label for="template">{'Interface theme'|@translate}</label>
+        </span>
+        {html_options id=template name=theme options=$template_options selected=$template_selection}
+      </li>
+      <li>
+        <span class="property">
+          <label for="language">{'Language'|@translate}</label>
+        </span>
+        {html_options id=language name=language options=$language_options selected=$language_selection}
+      </li>
+    {/if}
+      <li>
+        <span class="property">
+          <label for="recent_period">{'Recent period'|@translate}</label>
+        </span>
+        <input type="text" size="3" maxlength="2" name="recent_period" id="recent_period" value="{$RECENT_PERIOD}">
+      </li>
+      <li>
+        <span class="property">{'Expand all albums'|@translate}</span>
+        {html_radios name='expand' options=$radio_options selected=$EXPAND}
+      </li>
+    {if $ACTIVATE_COMMENTS}
+      <li>
+        <span class="property">{'Show number of comments'|@translate}</span>
+        {html_radios name='show_nb_comments' options=$radio_options selected=$NB_COMMENTS}
+      </li>
+    {/if}
+      <li>
+        <span class="property">{'Show number of hits'|@translate}</span>
+        {html_radios name='show_nb_hits' options=$radio_options selected=$NB_HITS}
+      </li>
+    </ul>
+  </fieldset>
+
+  <p class="bottomButtons">
+    <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+    <input class="submit" type="submit" name="validate" value="{'Submit'|@translate}">
+    <input class="submit" type="reset" name="reset" value="{'Reset'|@translate}">
+  </p>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/rating.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/rating.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/rating.tpl	(revision 14585)
@@ -0,0 +1,67 @@
+<h2>{$NB_ELEMENTS} {'Photos'|@translate}</h2>
+
+<form action="{$F_ACTION}" method="GET" class="filter">
+  <fieldset>
+    <legend>{'Filter'|@translate}</legend>
+
+    <label>
+      {'Sort by'|@translate}
+      <select name="order_by">
+        {html_options options=$order_by_options selected=$order_by_options_selected}
+      </select>
+    </label>
+
+    <label>
+      {'Users'|@translate}
+      <select name="users">
+        {html_options options=$user_options selected=$user_options_selected}
+      </select>
+    </label>
+
+    <label>
+      {'Number of items'|@translate}
+      <input type="text" name="display" size="2" value="{$DISPLAY}">
+    </label>
+
+    <label>
+      &nbsp;
+    <input class="submit" type="submit" value="{'Submit'|@translate}">
+    </label>
+    <input type="hidden" name="page" value="rating">
+  </fieldset>
+</form>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+<table width="99%">
+<tr class="throw">
+  <td>{'File'|@translate}</td>
+  <td>{'Number of rates'|@translate}</td>
+	<td>{'Rating score'|@translate}</td>
+  <td>{'Average rate'|@translate}</td>
+  <td>{'Sum of rates'|@translate}</td>
+  <td>{'Rate'|@translate}</td>
+  <td>{'Username'|@translate}</td>
+  <td>{'Rate date'|@translate}</td>
+  <td></td>
+</tr>
+{foreach from=$images item=image name=image}
+<tr valign="top" class="{if $smarty.foreach.image.index is odd}row1{else}row2{/if}">
+	<td rowspan="{$image.NB_RATES_TOTAL+1}"><a href="{$image.U_URL}"><img src="{$image.U_THUMB}" alt="{$image.FILE}" title="{$image.FILE}"></a></td>
+	<td rowspan="{$image.NB_RATES_TOTAL+1}"><strong>{$image.NB_RATES}/{$image.NB_RATES_TOTAL}</strong></td>
+	<td rowspan="{$image.NB_RATES_TOTAL+1}"><strong>{$image.SCORE_RATE}</strong></td>
+	<td rowspan="{$image.NB_RATES_TOTAL+1}"><strong>{$image.AVG_RATE}</strong></td>
+	<td rowspan="{$image.NB_RATES_TOTAL+1}" style="border-right: 1px solid;" ><strong>{$image.SUM_RATE}</strong></td>
+</tr>
+{foreach from=$image.rates item=rate name=rate}
+<tr class="{if ($smarty.foreach.image.index+$smarty.foreach.rate.index) is odd}row1{else}row2{/if}">
+	<td>{$rate.RATE}</td>
+	<td><b>{$rate.USER}</b></td>
+	<td>{$rate.DATE}</td>
+	<td><a href="{$rate.U_DELETE}"><img src="{$themeconf.admin_icon_dir}/delete.png" alt="[{'Delete'|@translate}]"></a></td>
+</tr>
+{/foreach} {*rates*}
+{/foreach} {*images*}
+</table>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/rating_user.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/rating_user.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/rating_user.tpl	(revision 14585)
@@ -0,0 +1,77 @@
+<h2>{$ratings|@count} {'Users'|@translate}</h2>
+
+<form action="{$F_ACTION}" method="GET">
+<fieldset>
+	<label>{'Sort by'|@translate}
+		<select name="order_by">
+			{html_options options=$order_by_options selected=$order_by_options_selected}
+		</select>
+	</label>
+	<label>{'Number of rates'|@translate}&gt;
+	<input type="text" size="5" name="f_min_rates" value="{$F_MIN_RATES}">
+	</label>
+	<input type="submit" value="{'Submit'|@translate}">
+	</label>
+	<input type="hidden" name="page" value="rating_user">
+</fieldset>
+</form>
+
+{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+{footer_script}{literal}
+function del(elt,uid,aid)
+{
+	if (!confirm({/literal}'{'Are you sure?'|@translate|@escape:'javascript'}'{literal}))
+		return false;
+	var tr = elt;
+	while ( tr.nodeName != "TR") tr = tr.parentNode;
+	tr = jQuery(tr).fadeTo(1000, 0.4);
+	(new PwgWS({/literal}'{$ROOT_URL|@escape:javascript}'{literal})).callService(
+		'pwg.rates.delete', {user_id:uid, anonymous_id:aid},
+		{
+			method: 'POST',
+			onFailure: function(num, text) { tr.stop(); tr.fadeTo(0,1); alert(num + " " + text); },
+			onSuccess: function(result) { if (result) {tr.remove();} else alert(result); }
+		}
+	);
+	return false;
+}
+{/literal}{/footer_script}
+<table>
+<tr class="throw">
+	<td>{'Username'|@translate}</td>
+	<td>{'Number of rates'|@translate}</td>
+	<td>{'Average rate'|@translate}</td>
+	<td>{'Variation'|@translate}</td>
+	<td>{'Consensus deviation'|@translate|@replace:' ':'<br>'}</td>
+{foreach from=$available_rates item=rate}
+	<td>{$rate}</td>
+{/foreach}
+	<td></td>
+</tr>
+{foreach from=$ratings item=rating key=user}
+<tr>
+	<td>{$user}</td>
+	<td>{$rating.count}</td>
+	<td>{$rating.avg|@number_format:2}</td>
+	<td>{$rating.cv|@number_format:3}</td>
+	<td>{$rating.cd|@number_format:3}</td>
+	{foreach from=$rating.rates item=rates key=rate}
+	<td>{if !empty($rates)}
+		{capture assign=rate_over}{foreach from=$rates item=rate_arr}<img src="{$image_urls[$rate_arr.id].tn}" alt="thumb-{$rate_arr.id}" title="{$rate_arr.date}"></img>
+		{/foreach}{/capture}
+		<a class="cluetip" title="|{$rate_over|@htmlspecialchars}">{$rates|@count}</a>
+		{/if}</td>
+	{/foreach}
+	<td><a onclick="return del(this,{$rating.uid},'{$rating.aid}');"><img src="{$themeconf.admin_icon_dir}/delete.png" alt="[{'Delete'|@translate}]"></a></td>
+</tr>
+{/foreach}
+</table>
+
+{combine_script id='jquery.cluetip' load='footer' require='jquery' path='themes/default/js/plugins/jquery.cluetip.js'}
+{footer_script require='jquery.cluetip'}
+jQuery(document).ready(function(){ldelim}
+	jQuery('.cluetip').cluetip({ldelim}
+		width: {$TN_WIDTH}, showTitle:false, splitTitle: '|'
+	});
+})
+{/footer_script}
Index: tags/2.4.0RC3/admin/themes/default/template/site_manager.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/site_manager.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/site_manager.tpl	(revision 14585)
@@ -0,0 +1,50 @@
+<div class="titrePage">
+  <h2>{'Site manager'|@translate}</h2>
+</div>
+
+{if not empty($remote_output)}
+<div class="remoteOutput">
+  <ul>
+    {foreach from=$remote_output item=remote_line}
+    <li class="{$remote_line.CLASS}">{$remote_line.CONTENT}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+{if not empty($sites)}
+<table class="table2">
+	<tr class="throw">
+		<td>{'Local'|@translate} / {'Remote'|@translate}</td>
+		<td>{'Actions'|@translate}</td>
+	</tr>
+  {foreach from=$sites item=site name=site}
+  <tr style="text-align:left" class="{if $smarty.foreach.site.index is odd}row1{else}row2{/if}"><td>
+    <a href="{$site.NAME}">{$site.NAME}</a><br>({$site.TYPE}, {$site.CATEGORIES} {'Albums'|@translate}, {$pwg->l10n_dec('%d photo','%d photos',$site.IMAGES)})
+  </td><td>
+    [<a href="{$site.U_SYNCHRONIZE}" title="{'update the database from files'|@translate}">{'Synchronize'|@translate}</a>]
+    {if isset($site.U_DELETE)}
+      [<a href="{$site.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|escape:'javascript'}');"
+                title="{'delete this site and all its attached elements'|@translate}">{'delete'|@translate}</a>]
+    {/if}
+    {if not empty($site.plugin_links)}
+        <br>
+      {foreach from=$site.plugin_links item=plugin_link}
+        [<a href="{$plugin_link.U_HREF}" title='{$plugin_link.U_HINT}'>{$plugin_link.U_CAPTION}</a>]
+      {/foreach}
+    {/if}
+  </td></tr>
+  {/foreach}
+</table>
+{/if}
+
+<form action="{$F_ACTION}" method="post">
+  <p>
+    <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+    <label for="galleries_url" >{'Create a new site : (give its URL to create_listing_file.php)'|@translate}</label>
+    <input type="text" name="galleries_url" id="galleries_url">
+  </p>
+  <p>
+    <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+  </p>
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/site_update.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/site_update.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/site_update.tpl	(revision 14585)
@@ -0,0 +1,116 @@
+
+{include file='include/resize.inc.tpl'}
+
+<div class="titrePage">
+  <h2>{'Database synchronization with files'|@translate}: <a href="{$SITE_URL}">{$SITE_URL}</a></h2>
+</div>
+
+{if isset($update_result)}
+<h3>{$L_RESULT_UPDATE}</h3>
+<ul>
+  <li class="update_summary_new">{$update_result.NB_NEW_CATEGORIES} {'albums added in the database'|@translate}</li>
+  <li class="update_summary_new">{$update_result.NB_NEW_ELEMENTS} {'photos added in the database'|@translate}</li>
+  <li class="update_summary_del">{$update_result.NB_DEL_CATEGORIES} {'albums deleted in the database'|@translate}</li>
+  <li class="update_summary_del">{$update_result.NB_DEL_ELEMENTS} {'photos deleted from the database'|@translate}</li>
+  <li>{$update_result.NB_UPD_ELEMENTS} {'photos updated in the database'|@translate}</li>
+  <li class="update_summary_err">{$update_result.NB_ERRORS} {'errors during synchronization'|@translate}</li>
+</ul>
+{/if}
+
+{if isset($metadata_result)}
+<h3>{$L_RESULT_METADATA}</h3>
+<ul>
+  <li>{$metadata_result.NB_ELEMENTS_DONE} {'photos informations synchronized with files metadata'|@translate}</li>
+  <li>{$metadata_result.NB_ELEMENTS_CANDIDATES} {'photos candidates for metadata synchronization'|@translate}</li>
+  <li>{'Used metadata'|@translate} : {$METADATA_LIST}</li>
+</ul>
+{/if}
+
+
+{if not empty($sync_errors)}
+<h3>{'Error list'|@translate}</h3>
+<div class="errors">
+<ul>
+  {foreach from=$sync_errors item=error}
+  <li>[{$error.ELEMENT}] {$error.LABEL}</li>
+  {/foreach}
+</ul>
+</div>
+<h3>{'Errors caption'|@translate}</h3>
+<ul>
+  {foreach from=$sync_error_captions item=caption}
+  <li><strong>{$caption.TYPE}</strong>: {$caption.LABEL}</li>
+  {/foreach}
+</ul>
+{/if}
+
+{if not empty($sync_infos)}
+<h3>{'Detailed informations'|@translate}</h3>
+<div class="infos">
+<ul>
+  {foreach from=$sync_infos item=info}
+  <li>[{$info.ELEMENT}] {$info.LABEL}</li>
+  {/foreach}
+</ul>
+</div>
+{/if}
+
+{if isset($introduction)}
+<h4>{'Choose an option'|@translate}</h4>
+<form action="" method="post" id="update">
+
+	<fieldset id="syncFiles">
+		<legend>{'synchronize files structure with database'|@translate}</legend>
+		<ul>
+			<li><label><input type="radio" name="sync" value="" {if empty($introduction.sync)}checked="checked"{/if}> {'nothing'|@translate}</label></li>
+			<li><label><input type="radio" name="sync" value="dirs" {if 'dirs'==$introduction.sync}checked="checked"{/if}> {'only directories'|@translate}</label></li>
+
+			<li><label><input type="radio" name="sync" value="files" {if 'files'==$introduction.sync}checked="checked"{/if}> {'directories + files'|@translate}</label>
+				<ul style="padding-left:3em">
+					<li><label><input type="checkbox" name="display_info" value="1" {if $introduction.display_info}checked="checked"{/if}> {'display maximum informations (added albums and photos, deleted albums and photos)'|@translate}</label></li>
+					<li><label><input type="checkbox" name="add_to_caddie" value="1" {if $introduction.add_to_caddie}checked="checked"{/if}> {'add new photos to caddie'|@translate}</label></li>
+					<li><label>{'Who can see these photos?'|@translate} <select name="privacy_level">{html_options options=$introduction.privacy_level_options selected=$introduction.privacy_level_selected}</select></label></li>
+				</ul>
+			</li>
+		</ul>
+	</fieldset>
+
+	<fieldset id="syncMetadata">
+		<legend>{'synchronize files metadata with database photos informations'|@translate}</legend>
+		<label><input type="checkbox" name="sync_meta" {if $introduction.sync_meta}checked="checked"{/if}> {'Synchronize metadata'|@translate} ({$METADATA_LIST})</label>
+		<ul style="padding-left:3em">
+	  		<li>
+	  			<label><input type="checkbox" name="meta_all" {if $introduction.meta_all}checked="checked"{/if}> {'even already synchronized photos'|@translate}</label>
+	  		</li>
+	  		<li>
+	  			<label><input type="checkbox" name="meta_empty_overrides" {if $introduction.meta_empty_overrides}checked="checked"{/if}> {'overrides existing values with empty ones'|@translate}</label>
+	  		</li>
+		</ul>
+	</fieldset>
+
+  <fieldset id="syncSimulate">
+    <legend>{'Simulation'|@translate}</legend>
+    <ul><li><label><input type="checkbox" name="simulate" value="1" checked="checked"> {'only perform a simulation (no change in database will be made)'|@translate}</label></li></ul>
+  </fieldset>
+
+  <fieldset id="catSubset">
+    <legend>{'reduce to single existing albums'|@translate}</legend>
+    <ul>
+    <li>
+    <select class="categoryList" name="cat" size="10">
+      {html_options options=$category_options selected=$category_options_selected}
+    </select>
+    </li>
+
+    <li><label><input type="checkbox" name="subcats-included" value="1" {if $introduction.subcats_included}checked="checked"{/if}> {'Search in sub-albums'|@translate}</label></li>
+    </ul>
+  </fieldset>
+
+  <p class="bottomButtons">
+    <input class="submit" type="submit" value="{'Submit'|@translate}" name="submit">
+    <input class="submit" type="reset"  value="{'Reset'|@translate}"  name="reset">
+  </p>
+</form>
+{/if}{*isset $introduction*}
+
+<p><a href="{$U_SITE_MANAGER}">{'Site manager'|@translate}</a></p>
Index: tags/2.4.0RC3/admin/themes/default/template/stats.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/stats.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/stats.tpl	(revision 14585)
@@ -0,0 +1,25 @@
+
+<div class="titrePage">
+  <h2>{'History'|@translate} {$TABSHEET_TITLE}</h2>
+</div>
+
+<h3>{$L_STAT_TITLE}</h3>
+
+<table class="table2" id="dailyStats">
+	<tr class="throw">
+		<th>{$PERIOD_LABEL}</th>
+		<th>{'Pages seen'|@translate}</th>
+		<th></th>
+	</tr>
+
+{if not empty($statrows)}
+{foreach from=$statrows item=row}
+	<tr>
+		<td style="white-space: nowrap">{$row.VALUE}</td>
+		<td class="number">{$row.PAGES}</td>
+		<td><div class="statBar" style="width:{$row.WIDTH}px"></div></td>
+	</tr>
+{/foreach}
+{/if}
+
+</table>
Index: tags/2.4.0RC3/admin/themes/default/template/tabsheet.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/tabsheet.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/tabsheet.tpl	(revision 14585)
@@ -0,0 +1,11 @@
+{if isset($tabsheet) and count($tabsheet)}
+<div id="tabsheet">
+<ul class="tabsheet">
+{foreach from=$tabsheet key=name item=sheet}
+  <li class="{if ($name == $tabsheet_selected)}selected_tab{else}normal_tab{/if}">
+    <a href="{$sheet.url}"><span>{$sheet.caption}</span></a>
+  </li>
+{/foreach}
+</ul>
+</div>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/tags.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/tags.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/tags.tpl	(revision 14585)
@@ -0,0 +1,93 @@
+{include file='include/tag_selection.inc.tpl'}
+
+{footer_script}{literal}
+jQuery(document).ready(function(){
+  function displayDeletionWarnings() {
+    jQuery(".warningDeletion").show();
+    jQuery("input[name=destination_tag]:checked").parent("label").children(".warningDeletion").hide();
+  }
+
+  displayDeletionWarnings();
+
+  jQuery("#mergeTags label").click(function() {
+    displayDeletionWarnings();
+  });
+
+  jQuery("input[name=merge]").click(function() {
+    if (jQuery("ul.tagSelection input[type=checkbox]:checked").length < 2) {
+      alert("{/literal}{'Select at least two tags for merging'|@translate}{literal}");
+      return false;
+    }
+  });
+});
+{/literal}{/footer_script}
+
+
+<div class="titrePage">
+  <h2>{'Manage tags'|@translate}</h2>
+</div>
+
+<form action="{$F_ACTION}" method="post">
+  {if isset($EDIT_TAGS_LIST)}
+  <fieldset>
+    <legend>{'Edit tags'|@translate}</legend>
+    <input type="hidden" name="edit_list" value="{$EDIT_TAGS_LIST}">
+    <table class="table2">
+      <tr class="throw">
+        <th>{'Current name'|@translate}</th>
+        <th>{'New name'|@translate}</th>
+      </tr>
+      {foreach from=$tags item=tag}
+      <tr>
+        <td>{$tag.NAME}</td>
+        <td><input type="text" name="tag_name-{$tag.ID}" value="{$tag.NAME}" size="30"></td>
+      </tr>
+      {/foreach}
+    </table>
+
+    <p>
+      <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+      <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+      <input class="submit" type="reset" value="{'Reset'|@translate}">
+    </p>
+  </fieldset>
+  {/if}
+
+  {if isset($MERGE_TAGS_LIST)}
+  <input type="hidden" name="merge_list" value="{$MERGE_TAGS_LIST}">
+
+  <fieldset id="mergeTags">
+    <legend>{'Merge tags'|@translate}</legend>
+    {'Select the destination tag'|@translate}<br><br>
+    {foreach from=$tags item=tag name=tagloop}
+    <label><input type="radio" name="destination_tag" value="{$tag.ID}"{if $smarty.foreach.tagloop.index == 0} checked="checked"{/if}> {$tag.NAME}<span class="warningDeletion"> {'(this tag will be deleted)'|@translate}</span></label><br>
+    {/foreach}
+    <br><input type="submit" name="confirm_merge" value="{'Confirm merge'|@translate}">
+  </fieldset>
+  {/if}
+
+  <fieldset>
+    <legend>{'Add a tag'|@translate}</legend>
+
+    <label>
+      {'New tag'|@translate}
+      <input type="text" name="add_tag" size="30">
+    </label>
+    
+    <p><input class="submit" type="submit" name="add" value="{'Submit'|@translate}"></p>
+  </fieldset>
+
+  <fieldset>
+    <legend>{'Tag selection'|@translate}</legend>
+    
+    {$TAG_SELECTION}
+
+    <p>
+      <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+      <input class="submit" type="submit" name="edit" value="{'Edit selected tags'|@translate}">
+      <input class="submit" type="submit" name="merge" value="{'Merge selected tags'|@translate}">
+      <input class="submit" type="submit" name="delete" value="{'Delete selected tags'|@translate}" onclick="return confirm('{'Are you sure?'|@translate}');">
+    </p>
+  </fieldset>
+
+</form>
Index: tags/2.4.0RC3/admin/themes/default/template/themes_installed.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/themes_installed.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/themes_installed.tpl	(revision 14585)
@@ -0,0 +1,76 @@
+{include file='include/colorbox.inc.tpl'} 
+{footer_script}{literal}
+jQuery(document).ready(function() {
+  $("a.preview-box").colorbox(); 
+}); 
+{/literal}{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Installed Themes'|@translate}</h2>
+</div>
+
+<div id="themesContent">
+
+<fieldset>
+<legend>{'Active Themes'|@translate}</legend>
+{if isset($active_themes)}
+<div class="themeBoxes">
+{foreach from=$active_themes item=theme}
+  <div class="themeBox{if $theme.is_default} themeDefault{/if}">
+    <div class="themeName">{$theme.name}{if $theme.is_default} <em>({'default'|@translate})</em>{/if} {if $theme.mobile} <em>({'Mobile'|@translate})</em>{/if}</div>
+    <div class="themeShot"><a href="{$theme.screenshot}" class="preview-box" title="{$theme.name}"><img src="{$theme.screenshot}" alt=""></a></div>
+    <div class="themeActions">
+      <div>
+{if $theme.deactivable}
+      <a href="{$deactivate_baseurl}{$theme.id}" class="tiptip" title="{'Forbid this theme to users'|@translate}">{'Deactivate'|@translate}</a>
+{else}
+      <span title="{$theme.deactivate_tooltip}" class="tiptip">{'Deactivate'|@translate}</span>
+{/if}
+      
+{if not $theme.is_default}
+      | <a href="{$set_default_baseurl}{$theme.id}" class="tiptip" title="{'Set as default theme for unregistered and new users'|@translate}">{'Default'|@translate}</a>
+{/if}
+{if isset($theme.admin_uri)}
+      <br><a href="{$theme.admin_uri}" class="tiptip" title="{'Configuration'|@translate}">{'Configuration'|@translate}</a>
+{/if}
+      </div>
+    </div> <!-- themeActions -->
+  </div>
+{/foreach}
+</div> <!-- themeBoxes -->
+{/if}
+</fieldset>
+
+{if isset($inactive_themes)}
+<fieldset>
+<legend>{'Inactive Themes'|@translate}</legend>
+<div class="themeBoxes">
+{foreach from=$inactive_themes item=theme}
+  <div class="themeBox">
+    <div class="themeName">{$theme.name}{if $theme.mobile} <em>({'Mobile'|@translate})</em>{/if}</div>
+    <div class="themeShot"><a href="{$theme.screenshot}" class="preview-box" title="{$theme.name}"><img src="{$theme.screenshot}" alt=""></a></div>
+    <div class="themeActions">
+      <div>
+  {if $theme.activable}
+      <a href="{$activate_baseurl}{$theme.id}" title="{'Make this theme available to users'|@translate}" class="tiptip">{'Activate'|@translate}</a>
+  {else}
+      <span title="{$theme.activate_tooltip}" class="tiptip">{'Activate'|@translate}</span>
+  {/if}
+
+      |
+
+  {if $theme.deletable}
+      <a href="{$delete_baseurl}{$theme.id}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');" title="{'Delete this theme'|@translate}">{'Delete'|@translate}</a>
+  {else}
+      <span title="{$theme.delete_tooltip}" class="tiptip">{'Delete'|@translate}</span>
+  {/if}
+      </div>
+    </div>
+    
+  </div>
+{/foreach}
+</div> <!-- themeBoxes -->
+</fieldset>
+{/if}
+
+</div> <!-- themesContent -->
Index: tags/2.4.0RC3/admin/themes/default/template/themes_new.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/themes_new.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/themes_new.tpl	(revision 14585)
@@ -0,0 +1,23 @@
+{include file='include/colorbox.inc.tpl'} 
+{footer_script}{literal}
+jQuery(document).ready(function() {
+  $("a.preview-box").colorbox(); 
+}); 
+{/literal}{/footer_script}
+<div class="titrePage">
+  <h2>{'Add New Theme'|@translate}</h2>
+</div>
+
+{if not empty($new_themes)}
+<div class="themeBoxes">
+{foreach from=$new_themes item=theme name=themes_loop}
+  <div class="themeBox">
+    <div class="themeName">{$theme.name}</div>
+    <div class="themeShot"><a href="{$theme.screenshot}" class="preview-box" title="{$theme.name}"><img src="{$theme.thumbnail}" onerror="this.src='{$default_screenshot}'"></a></div>
+    <div class="themeActions"><a href="{$theme.install_url}">{'Install'|@translate}</a></div>
+  </div>
+{/foreach}
+</div> <!-- themeBoxes -->
+{else}
+<p>{'There is no other theme available.'|@translate}</p>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/updates_ext.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/updates_ext.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/updates_ext.tpl	(revision 14585)
@@ -0,0 +1,281 @@
+{combine_script id='jquery.ajaxmanager' load='footer' require='jquery' path='themes/default/js/plugins/jquery.ajaxmanager.js'}
+{combine_script id='jquery.jgrowl' load='footer' require='jquery' path='themes/default/js/plugins/jquery.jgrowl_minimized.js'}
+{combine_css path="admin/themes/default/uploadify.jGrowl.css"}
+
+{footer_script require='jquery.effects.blind,jquery.ajaxmanager,jquery.jgrowl'}
+var pwg_token = '{$PWG_TOKEN}';
+var extType = '{$EXT_TYPE}';
+var confirmMsg  = '{'Are you sure?'|@translate|@escape:'javascript'}';
+var errorHead   = '{'ERROR'|@translate|@escape:'javascript'}';
+var successHead = '{'Update Complete'|@translate|@escape:'javascript'}';
+var errorMsg    = '{'an error happened'|@translate|@escape:'javascript'}';
+var restoreMsg  = '{'Reset ignored updates'|@translate|@escape:'javascript'}';
+
+{literal}
+var todo = 0;
+var queuedManager = $.manageAjax.create('queued', { 
+	queue: true,  
+	maxRequests: 1,
+  beforeSend: function() { autoupdate_bar_toggle(1); },
+  complete: function() { autoupdate_bar_toggle(-1); }
+});
+
+function updateAll() {
+  if (confirm(confirmMsg)) {
+    jQuery('.updateExtension').each( function() {
+      if (jQuery(this).parents('div').css('display') == 'block')
+        jQuery(this).click();
+    });
+  }
+};
+
+function ignoreAll() {
+  jQuery('.ignoreExtension').each( function() {
+    if (jQuery(this).parents('div').css('display') == 'block')
+      jQuery(this).click();
+  });
+};
+
+function resetIgnored() {
+  jQuery.ajax({
+    type: 'GET',
+    url: 'ws.php',
+    dataType: 'json',
+    data: { method: 'pwg.extensions.ignoreUpdate', reset: true, type: extType, pwg_token: pwg_token, format: 'json' },
+    success: function(data) {
+      if (data['stat'] == 'ok') {
+        jQuery(".pluginBox, fieldset").show();
+        jQuery("#update_all").show();
+        jQuery("#ignore_all").show();
+        jQuery("#up_to_date").hide();
+        jQuery("#reset_ignore").hide();
+        jQuery("#ignored").hide();
+        checkFieldsets();
+      }
+    }
+  });
+};
+
+function checkFieldsets() {
+  var types = new Array('plugins', 'themes', 'languages');
+  var total = 0;
+  var ignored = 0;
+  for (i=0;i<3;i++) {
+    nbExtensions = 0;
+    jQuery("div[id^='"+types[i]+"_']").each(function(index) {
+      if (jQuery(this).css('display') == 'block')
+        nbExtensions++;
+      else
+        ignored++;
+    });
+    total = total + nbExtensions;
+    if (nbExtensions == 0)
+      jQuery("#"+types[i]).hide();
+  }
+
+  if (total == 0) {
+    jQuery("#update_all").hide();
+    jQuery("#ignore_all").hide();
+    jQuery("#up_to_date").show();
+  }
+  if (ignored > 0) {
+    jQuery("#reset_ignore").val(restoreMsg + ' (' + ignored + ')');
+  }
+};
+
+function updateExtension(type, id, revision) {
+  queuedManager.add({
+    type: 'GET',
+    dataType: 'json',
+    url: 'ws.php',
+    data: { method: 'pwg.extensions.update', type: type, id: id, revision: revision, pwg_token: pwg_token, format: 'json' },
+    success: function(data) {
+      if (data['stat'] == 'ok') {
+        jQuery.jGrowl( data['result'], { theme: 'success', header: successHead, life: 4000, sticky: false });
+        jQuery("#"+type+"_"+id).remove();
+        checkFieldsets();
+      } else {
+        jQuery.jGrowl( data['result'], { theme: 'error', header: errorHead, sticky: true });
+      }
+    },
+    error: function(data) {
+      jQuery.jGrowl( errorMsg, { theme: 'error', header: errorHead, sticky: true });
+    }
+  });
+};
+
+function ignoreExtension(type, id) {
+  queuedManager.add({
+    type: 'GET',
+    url: 'ws.php',
+    dataType: 'json',
+    data: { method: 'pwg.extensions.ignoreUpdate', type: type, id: id, pwg_token: pwg_token, format: 'json' },
+    success: function(data) {
+      if (data['stat'] == 'ok') {
+        jQuery("#"+type+"_"+id).hide();
+        jQuery("#reset_ignore").show();
+        checkFieldsets();
+      }
+    }
+  });
+};
+
+function autoupdate_bar_toggle(i) {
+  todo = todo + i;
+  if ((i == 1 && todo == 1) || (i == -1 && todo == 0))
+    jQuery('.autoupdate_bar').toggle();
+}
+
+jQuery(document).ready(function() {
+	jQuery("td[id^='desc_'], p[id^='revdesc_']").click(function() {
+		id = this.id.split('_');
+		jQuery("#revdesc_"+id[1]).toggle('blind');
+    jQuery(".button_"+id[1]).toggle();
+		return false;
+	});
+});
+
+checkFieldsets();
+{/literal}
+{/footer_script}
+
+<div class="titrePage">
+  <h2>{'Updates'|@translate}</h2>
+</div>
+
+<div class="autoupdate_bar">
+<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;">
+{'Please wait...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif">
+</div>
+
+<p id="up_to_date" style="display:none; text-align:left; margin-left:20px;">{'All %s are up to date.'|@sprintf:$EXT_TYPE|@translate}</p>
+
+{if not empty($update_plugins)}
+<div>
+<fieldset id="plugins">
+<legend>{'Plugins'|@translate}</legend>
+{foreach from=$update_plugins item=plugin name=plugins_loop}
+<div class="pluginBox" id="plugins_{$plugin.EXT_ID}" {if $plugin.IGNORED}style="display:none;"{/if}>
+  <table>
+    <tr>
+      <td class="pluginBoxNameCell">
+        {$plugin.EXT_NAME}
+      </td>
+      <td>
+        <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;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        {'Version'|@translate} {$plugin.CURRENT_VERSION}
+      </td>
+      <td class="pluginDesc" id="desc_{$plugin.ID}">
+        <em>{'Downloads'|@translate}: {$plugin.DOWNLOADS}</em>
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$plugin.ID}">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$plugin.ID}" style="display:none;">
+        {'New Version'|@translate} : {$plugin.NEW_VERSION}
+        | {'By %s'|@translate|@sprintf:$plugin.AUTHOR}
+      </td>
+    </tr>
+    <tr>
+      <td></td>
+      <td class="pluginDesc">
+        <p id="revdesc_{$plugin.ID}" style="display:none;">{$plugin.REV_DESC|@htmlspecialchars|@nl2br}</p>
+      </td>
+    </tr>
+  </table>
+</div>
+{/foreach}
+</fieldset>
+</div>
+{/if}
+
+{if not empty($update_themes)}
+<div>
+<fieldset id="themes">
+<legend>{'Themes'|@translate}</legend>
+{foreach from=$update_themes item=theme name=themes_loop}
+<div class="pluginBox" id="themes_{$theme.EXT_ID}" {if $theme.IGNORED}style="display:none;"{/if}>
+  <table>
+    <tr>
+      <td class="pluginBoxNameCell">
+        {$theme.EXT_NAME}
+      </td>
+      <td>
+        <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;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        {'Version'|@translate} {$theme.CURRENT_VERSION}
+      </td>
+      <td class="pluginDesc" id="desc_{$theme.ID}">
+        <em>{'Downloads'|@translate}: {$theme.DOWNLOADS}</em>
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$theme.ID}">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$theme.ID}" style="display:none;">
+        {'New Version'|@translate} : {$theme.NEW_VERSION}
+        | {'By %s'|@translate|@sprintf:$theme.AUTHOR}
+      </td>
+    </tr>
+    <tr>
+      <td></td>
+      <td class="pluginDesc">
+        <p id="revdesc_{$theme.ID}" style="display:none;">{$theme.REV_DESC|@htmlspecialchars|@nl2br}</p>
+      </td>
+    </tr>
+  </table>
+</div>
+{/foreach}
+</fieldset>
+</div>
+{/if}
+
+{if not empty($update_languages)}
+<div>
+<fieldset id="languages">
+<legend>{'Languages'|@translate}</legend>
+{foreach from=$update_languages item=language name=languages_loop}
+<div class="pluginBox" id="languages_{$language.EXT_ID}" {if $language.IGNORED}style="display:none;"{/if}>
+  <table>
+    <tr>
+      <td class="pluginBoxNameCell">
+        {$language.EXT_NAME}
+      </td>
+      <td>
+        <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;" class="ignoreExtension">{'Ignore this update'|@translate}</a>
+      </td>
+    </tr>
+    <tr>
+      <td>
+        {'Version'|@translate} {$language.CURRENT_VERSION}
+      </td>
+      <td class="pluginDesc" id="desc_{$language.ID}">
+        <em>{'Downloads'|@translate}: {$language.DOWNLOADS}</em>
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/plus.gif" alt="" class="button_{$language.ID}">
+        <img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/minus.gif" alt="" class="button_{$language.ID}" style="display:none;">
+        {'New Version'|@translate} : {$language.NEW_VERSION}
+        | {'By %s'|@translate|@sprintf:$language.AUTHOR}
+      </td>
+    </tr>
+    <tr>
+      <td></td>
+      <td class="pluginDesc">
+        <p id="revdesc_{$language.ID}" style="display:none;">{$language.REV_DESC|@htmlspecialchars|@nl2br}</p>
+      </td>
+    </tr>
+  </table>
+</div>
+{/foreach}
+</fieldset>
+</div>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/updates_pwg.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/updates_pwg.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/updates_pwg.tpl	(revision 14585)
@@ -0,0 +1,99 @@
+{footer_script}
+jQuery(document).ready(function() {ldelim}
+	jQuery('input[name="submit"]').click(function() {ldelim}
+    if(!confirm('{'Are you sure?'|@translate}'))
+      return false;
+    jQuery(this).hide();
+    jQuery('.autoupdate_bar').show();
+	});
+  jQuery('[name="understand"]').click(function() {ldelim}
+    jQuery('[name="submit"]').attr('disabled', !this.checked);
+  });
+});
+{/footer_script}
+
+{html_head}
+{literal}
+<style type="text/css">
+form { width: 750px; }
+fieldset { padding-bottom: 30px; }
+p, form p { text-align: left; margin-left:20px; }
+li { margin: 5px; }
+</style>
+{/literal}
+{/html_head}
+
+<div class="titrePage">
+<h2>{'Updates'|@translate}</h2>
+</div>
+
+{if $STEP == 0}
+  {if $CHECK_VERSION}
+    <p>{'You are running the latest version of Piwigo.'|@translate}</p>
+  {elseif $DEV_VERSION} 
+    <p>{'You are running on development sources, no check possible.'|@translate}</p>
+  {else}
+    <p>{'Check for update failed for unknown reasons.'|@translate}</p>
+  {/if}
+{/if}
+
+{if $STEP == 1}
+<h4>{'Two updates are available'|@translate}:</h4>
+<p>
+<ul>
+  <li><a href="admin.php?page=updates&amp;step=2&amp;to={$MINOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate|@sprintf:$MINOR_VERSION}</strong></a>: {'This is a minor update, with only bug corrections.'|@translate}</li>
+  <li><a href="admin.php?page=updates&amp;step=3&amp;to={$MAJOR_VERSION}"><strong>{'Update to Piwigo %s'|@translate|@sprintf:$MAJOR_VERSION}</strong></a>: {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate|@sprintf:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}</li>
+</ul>
+</p>
+<p>{'You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'|@translate|@sprintf:$MAJOR_VERSION:$MINOR_VERSION}</p>
+{/if}
+
+{if $STEP == 2}
+<p>
+  {'A new version of Piwigo is available.'|@translate}<br>
+  {'This is a minor update, with only bug corrections.'|@translate}
+</p>
+<form action="" method="post">
+<p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}"></p>
+<p class="autoupdate_bar" style="display:none;">&nbsp; {'Update in progress...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif"></p>
+<p><input type="hidden" name="upgrade_to" value="{$UPGRADE_TO}"></p>
+</form>
+{/if}
+
+{if $STEP == 3}
+<p>
+  {'A new version of Piwigo is available.'|@translate}<br>
+  {'This is a major update, with <a href="%s">new exciting features</a>.'|@translate|@sprintf:$RELEASE_URL} {'Some themes and plugins may be not available yet.'|@translate}
+</p>
+<form action="" method="post">
+
+{counter assign=i}
+<fieldset>
+  <legend>{'Dump Database'|@translate}</legend>
+  <p><input type="checkbox" name="includeHistory"> &nbsp; {'Include history data (Warning: server memory limit may be exceeded)'|@translate}</p>
+  <p><input type="submit" name="dumpDatabase" value="{'Dump Database'|@translate}"></p>
+</fieldset>
+
+{counter assign=i}
+<fieldset>
+  <legend>{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}</legend>
+  {if !empty($missing.plugins)}
+  <p><i>{'Following plugins may not be compatible with the new version of Piwigo:'|@translate}</i></p>
+  <p><ul>{foreach from=$missing.plugins item=plugin}<li><a href="{$plugin.uri}" class="externalLink">{$plugin.name}</a></li>{/foreach}</ul><br></p>
+  {/if}
+  {if !empty($missing.themes)}
+  <p><i>{'Following themes may not be compatible with the new version of Piwigo:'|@translate}</i></p>
+  <p><ul>{foreach from=$missing.themes item=theme}<li><a href="{$theme.uri}" class="externalLink">{$theme.name}</a></li>{/foreach}</ul><br></p>
+  {/if}
+  <p>
+  {if !empty($missing.plugins) or !empty($missing.themes)}
+  <p><label><input type="checkbox" name="understand"> &nbsp;{'I decide to update anyway'|@translate}</label></p>
+  {/if}
+  <p><input type="submit" name="submit" value="{'Update to Piwigo %s'|@translate|@sprintf:$UPGRADE_TO}" {if !empty($missing.plugins) or !empty($missing.themes)}disabled="disabled"{/if}>
+  </p>
+  <p class="autoupdate_bar" style="display:none;">&nbsp; {'Update in progress...'|@translate}<br><img src="admin/themes/default/images/ajax-loader-bar.gif"></p>
+</fieldset>
+
+<p><input type="hidden" name="upgrade_to" value="{$UPGRADE_TO}"></p>
+</form>
+{/if}
Index: tags/2.4.0RC3/admin/themes/default/template/upgrade.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/upgrade.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/upgrade.tpl	(revision 14585)
@@ -0,0 +1,224 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="Content-script-type" content="text/javascript">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="admin/themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{/foreach}
+
+<!--[if IE 7]>
+  <link rel="stylesheet" type="text/css" href="{$ROOT_URL}admin/themes/default/fix-ie7.css">
+<![endif]-->
+
+<!-- BEGIN get_combined_scripts -->
+{get_combined_scripts load='header'}
+<!-- END get_combined_scripts -->
+
+{literal}
+<style type="text/css">
+body {
+  font-size:12px;
+}
+
+.content {
+ width: 800px;
+ margin: auto;
+ text-align: center;
+ padding:0;
+ background-color:transparent !important;
+ border:none;
+}
+
+#content {
+  min-height:0;
+}
+
+#theHeader {
+  display: block;
+  background:url("admin/themes/clear/images/piwigo_logo_big.png") no-repeat scroll center 20px transparent;
+  height:100px;
+}
+
+fieldset {
+  margin-top:20px;
+  background-color:#f1f1f1;
+}
+
+legend {
+  font-weight:bold;
+  letter-spacing:2px;
+}
+
+form fieldset p {
+  text-align:left;
+  margin:10px;
+}
+
+.content h2 {
+  display:block;
+  font-size:20px;
+  text-align:center;
+  /* margin-top:5px; */
+}
+
+table.table2 {
+  width: 100%;
+  border:0;
+}
+
+table.table2 td {
+  text-align: left;
+  padding: 5px 2px;
+}
+
+table.table2 td.fieldname {
+  font-weight:normal;
+}
+
+table.table2 td.fielddesc {
+  padding-left:10px;
+  font-style:italic;
+}
+
+input[type="submit"], input[type="button"], a.bigButton {
+  font-size:14px;
+  font-weight:bold;
+  letter-spacing:2px;
+  border:none;
+  background-color:#666666;
+  color:#fff;
+  padding:5px;
+  -moz-border-radius:5px;
+}
+
+input[type="submit"]:hover, input[type="button"]:hover, a.bigButton:hover {
+  background-color:#ff7700;
+  color:white;
+}
+
+input[type="text"], input[type="password"], select {
+  background-color:#ddd;
+  border:2px solid #ccc;
+  -moz-border-radius:5px;
+  padding:2px;
+}
+
+input[type="text"]:focus, input[type="password"]:focus, select:focus {
+  background-color:#fff;
+  border:2px solid #ff7700;
+}
+
+.sql_content, .infos a {
+  color: #ff3363;
+}
+
+.errors {
+  padding-bottom:5px;
+}
+
+</style>
+{/literal}
+<title>Piwigo {$RELEASE} - {'Upgrade'|@translate}</title>
+</head>
+
+<body>
+<div id="the_page">
+<div id="theHeader"></div>
+<div id="content" class="content">
+
+{if isset($introduction)}
+<h2>{'Version'|@translate} {$RELEASE} - {'Upgrade'|@translate}</h2>
+
+{if isset($errors)}
+<div class="errors">
+  <ul>
+    {foreach from=$errors item=error}
+    <li>{$error}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+<form method="POST" action="{$introduction.F_ACTION}" name="upgrade_form">
+
+<fieldset>
+<table>
+  <tr>
+    <td>{'Language'|@translate}</td>
+    <td>
+      <select name="language" onchange="document.location = 'upgrade.php?language='+this.options[this.selectedIndex].value;">
+        {html_options options=$language_options selected=$language_selection}
+      </select>
+    </td>
+  </tr>
+</table>
+
+<p>{'This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'|@translate|@sprintf:$introduction.CURRENT_RELEASE}</p>
+{if isset($login)}
+<p>{'Only administrator can run upgrade: please sign in below.'|@translate}</p>
+{/if}
+
+{if isset($login)}
+<table>
+  <tr>
+    <td>{'Username'|@translate}</td>
+    <td><input type="text" name="username" id="username" size="25" maxlength="40" style="width: 150px;"></td>
+  </tr>
+  <tr>
+    <td>{'Password'|@translate}</td>
+    <td><input type="password" name="password" id="password" size="25" maxlength="25" style="width: 150px;"></td>
+  </tr>
+</table>
+{/if}
+</fieldset>
+<p style="text-align: center;">
+<input class="submit" type="submit" name="submit" value="{'Upgrade from version %s to %s'|@translate|@sprintf:$introduction.CURRENT_RELEASE:$RELEASE}">
+</p>
+</form>
+<!--
+<p style="text-align: center;">
+<a href="{$introduction.RUN_UPGRADE_URL}">{'Upgrade from version %s to %s'|@translate|@sprintf:$introduction.CURRENT_RELEASE:$RELEASE}</a>
+</p>
+-->
+
+{/if}
+
+{if isset($upgrade)}
+<h2>{'Upgrade from version %s to %s'|@translate|@sprintf:$upgrade.VERSION:$RELEASE}</h2>
+
+<fieldset>
+<legend>{'Statistics'|@translate}</legend>
+<ul>
+  <li>{'total upgrade time'|@translate} : {$upgrade.TOTAL_TIME}</li>
+  <li>{'total SQL time'|@translate} : {$upgrade.SQL_TIME}</li>
+  <li>{'SQL queries'|@translate} : {$upgrade.NB_QUERIES}</li>
+</ul>
+</fieldset>
+
+<fieldset>
+<legend>{'Upgrade informations'|@translate}</legend>
+<ul>
+  {foreach from=$infos item=info}
+  <li>{$info}</li>
+  {/foreach}
+</ul>
+</fieldset>
+
+<p>
+  <a class="bigButton" href="index.php">{'Home'|@translate}</a>
+</p>
+{/if}
+
+</div> {* content *}
+<div>{$L_UPGRADE_HELP}</div>
+</div> {* the_page *}
+</body>
+</html>
Index: tags/2.4.0RC3/admin/themes/default/template/user_list.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/user_list.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/user_list.tpl	(revision 14585)
@@ -0,0 +1,290 @@
+<div class="titrePage">
+  <h2>{'User list'|@translate}</h2>
+</div>
+
+<form class="filter" method="post" name="add_user" action="{$F_ADD_ACTION}">
+  <fieldset>
+    <legend>{'Add a user'|@translate}</legend>
+    <label>{'Username'|@translate} <input type="text" name="login" maxlength="50" size="20"></label>
+    {if $Double_Password}
+		<label>{'Password'|@translate} <input type="password" name="password"></label>
+		<label>{'Confirm Password'|@translate} <input type="password" name="password_conf" id="password_conf"></label>
+		{else}
+		<label>{'Password'|@translate} <input type="text" name="password"></label>
+		{/if}
+		<label>{'Email address'|@translate} <input type="text" name="email"></label>
+    <label>{'Send connection settings by email'|@translate} <input type="checkbox" name="send_password_by_mail" value="1" checked="checked"></label>
+    <label>&nbsp; <input class="submit" type="submit" name="submit_add" value="{'Submit'|@translate}"></label>
+  </fieldset>
+</form>
+
+<form class="filter" method="get" name="filter" action="{$F_FILTER_ACTION}">
+<fieldset>
+  <legend>{'Filter'|@translate}</legend>
+  <input type="hidden" name="page" value="user_list">
+
+  <label>{'Username'|@translate} <input type="text" name="username" value="{$F_USERNAME}"></label>
+
+  <label>
+  {'status'|@translate}
+  {html_options name=status options=$status_options selected=$status_selected}
+  </label>
+
+  <label>
+  {'Group'|@translate}
+  {html_options name=group options=$group_options selected=$group_selected}
+  </label>
+
+  <label>
+  {'Sort by'|@translate}
+  {html_options name=order_by options=$order_options selected=$order_selected}
+  </label>
+
+  <label>
+  {'Sort order'|@translate}
+  {html_options name=direction options=$direction_options selected=$direction_selected}
+  </label>
+
+  <label>
+  &nbsp;
+  <input class="submit" type="submit" value="{'Submit'|@translate}">
+  </label>
+
+</fieldset>
+
+</form>
+
+<form method="post" name="preferences" action="">
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+<table class="table2" width="97%">
+  <thead>
+    <tr class="throw">
+      <td>&nbsp;</td>
+      <td>{'Username'|@translate}</td>
+      <td>{'User status'|@translate}</td>
+      <td>{'Email address'|@translate}</td>
+      <td>{'Groups'|@translate}</td>
+      <td>{'Properties'|@translate}</td>
+      {if not empty($plugin_user_list_column_titles)}
+      {foreach from=$plugin_user_list_column_titles item=title}
+      <td>{$title}</td>
+      {/foreach}
+      {/if}
+      <td>{'Actions'|@translate}</td>
+    </tr>
+  </thead>
+
+  {foreach from=$users item=user name=users_loop}
+  <tr class="{if $smarty.foreach.users_loop.index is odd}row1{else}row2{/if}">
+    <td><input type="checkbox" name="selection[]" value="{$user.ID}" {$user.CHECKED} id="selection-{$user.ID}"></td>
+    <td><label for="selection-{$user.ID}">{$user.USERNAME}</label></td>
+    <td>{$user.STATUS}</td>
+    <td>{$user.EMAIL}</td>
+    <td>{$user.GROUPS}</td>
+    <td>{$user.PROPERTIES}</td>
+    {foreach from=$user.plugin_columns item=data}
+    <td>{$data}</td>
+    {/foreach}
+    <td style="text-align:center;">
+      <a href="{$user.U_PERM}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/permissions.png" style="border:none" alt="{'Permissions'|@translate}" title="{'Permissions'|@translate}"></a>
+      <a href="{$user.U_PROFILE}"><img src="{$ROOT_URL}{$themeconf.admin_icon_dir}/edit_s.png" style="border:none" alt="{'Profile'|@translate}" title="{'Profile'|@translate}"></a>
+      {foreach from=$user.plugin_actions item=data}
+      {$data}
+      {/foreach}
+      </td>
+  </tr>
+  {/foreach}
+</table>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+{* delete the selected users ? *}
+<fieldset>
+  <legend>{'Deletions'|@translate}</legend>
+  <label><input type="checkbox" name="confirm_deletion" value="1"> {'confirm'|@translate}</label>
+  <input class="submit" type="submit" value="{'Delete selected users'|@translate}" name="delete">
+</fieldset>
+
+<fieldset>
+  <legend>{'Status'|@translate}</legend>
+
+  <table>
+    <tr>
+      <td>{'Status'|@translate}</td>
+      <td>
+        <label><input type="radio" name="status_action" value="leave" checked="checked"> {'leave'|@translate}</label>
+        <label><input type="radio" name="status_action" value="set" id="status_action_set"> {'set to'|@translate}</label>
+        <select onchange="document.getElementById('status_action_set').checked = true;" name="status" size="1">
+          {html_options options=$pref_status_options selected=$pref_status_selected}
+        </select>
+      </td>
+    </tr>
+  </table>
+</fieldset>
+
+{* form to set properties for many users at once *}
+<fieldset>
+  <legend>{'Groups'|@translate}</legend>
+
+<table>
+
+  <tr>
+    <td>{'associate to group'|@translate}</td>
+    <td>
+      {html_options name=associate options=$association_options selected=$associate_selected}
+    </td>
+  </tr>
+
+  <tr>
+    <td>{'dissociate from group'|@translate}</td>
+    <td>
+      {html_options name=dissociate options=$association_options selected=$dissociate_selected}
+    </td>
+  </tr>
+
+</table>
+
+</fieldset>
+
+{* Properties *}
+<fieldset>
+  <legend>{'Properties'|@translate}</legend>
+
+  <table>
+
+    <tr>
+      <td>{'High definition enabled'|@translate}</td>
+      <td>
+        <label><input type="radio" name="enabled_high" value="leave" checked="checked"> {'leave'|@translate}</label>
+        / {'set to'|@translate}
+        <label><input type="radio" name="enabled_high" value="true">{'Yes'|@translate}</label>
+        <label><input type="radio" name="enabled_high" value="false">{'No'|@translate}</label>
+      </td>
+    </tr>
+
+    <tr>
+      <td>{'Privacy level'|@translate}</td>
+      <td>
+	<label><input type="radio" name="level_action" value="leave" checked="checked">{'leave'|@translate}</label>
+	<label><input type="radio" name="level_action" value="set" id="level_action_set">{'set to'|@translate}</label>
+	<select onchange="document.getElementById('level_action_set').checked = true;" name="level" size="1">
+	  {html_options options=$level_options selected=$level_selected}
+	</select>
+      </td>
+    </tr>
+  </table>
+
+</fieldset>
+
+{* preference *}
+<fieldset>
+  <legend>{'Preferences'|@translate}</legend>
+
+<table>
+  <tr>
+    <td>{'Number of photos per page'|@translate}</td>
+    <td>
+      <label><input type="radio" name="nb_image_page_action" value="leave" checked="checked"> {'leave'|@translate}</label>
+      <label><input type="radio" name="nb_image_page_action" value="set" id="nb_image_page_action_set"> {'set to'|@translate}</label>
+      <input onmousedown="document.getElementById('nb_image_page_action_set').checked = true;"
+             size="4" maxlength="3" type="text" name="nb_image_page" value="{$NB_IMAGE_PAGE}">
+    </td>
+  </tr>
+
+  <tr>
+    <td>{'Interface theme'|@translate}</td>
+    <td>
+      <label><input type="radio" name="theme_action" value="leave" checked="checked"> {'leave'|@translate}</label>
+      <label><input type="radio" name="theme_action" value="set" id="theme_action_set"> {'set to'|@translate}</label>
+      <select onchange="document.getElementById('theme_action_set').checked = true;" name="theme" size="1">
+        {html_options options=$theme_options selected=$theme_selected}
+      </select>
+    </td>
+  </tr>
+
+  <tr>
+    <td>{'Language'|@translate}</td>
+    <td>
+      <label><input type="radio" name="language_action" value="leave" checked="checked"> {'leave'|@translate}</label>
+      <label><input type="radio" name="language_action" value="set" id="language_action_set"> {'set to'|@translate}</label>
+      <select onchange="document.getElementById('language_action_set').checked = true;" name="language" size="1">
+        {html_options options=$language_options selected=$language_selected}
+      </select>
+    </td>
+  </tr>
+
+  <tr>
+    <td>{'Recent period'|@translate}</td>
+    <td>
+      <label><input type="radio" name="recent_period_action" value="leave" checked="checked"> {'leave'|@translate}</label>
+      <label><input type="radio" name="recent_period_action" value="set" id="recent_period_action_set"> {'set to'|@translate}</label>
+      <input onmousedown="document.getElementById('recent_period_action_set').checked = true;"
+             type="text" size="3" maxlength="2" name="recent_period" value="{$RECENT_PERIOD}">
+    </td>
+  </tr>
+
+  <tr>
+    <td>{'Expand all albums'|@translate}</td>
+    <td>
+      <label><input type="radio" name="expand" value="leave" checked="checked"> {'leave'|@translate}</label>
+      / {'set to'|@translate}
+      <label><input type="radio" name="expand" value="true">{'Yes'|@translate}</label>
+      <label><input type="radio" name="expand" value="false">{'No'|@translate}</label>
+    </td>
+  </tr>
+
+{if $ACTIVATE_COMMENTS}
+  <tr>
+    <td>{'Show number of comments'|@translate}</td>
+    <td>
+      <label><input type="radio" name="show_nb_comments" value="leave" checked="checked"> {'leave'|@translate}</label>
+      / {'set to'|@translate}
+      <label><input type="radio" name="show_nb_comments" value="true">{'Yes'|@translate}</label>
+      <label><input type="radio" name="show_nb_comments" value="false">{'No'|@translate}</label>
+    </td>
+  </tr>
+{/if}
+
+  <tr>
+    <td>{'Show number of hits'|@translate}</td>
+    <td>
+      <label><input type="radio" name="show_nb_hits" value="leave" checked="checked"> {'leave'|@translate}</label>
+      / {'set to'|@translate}
+      <label><input type="radio" name="show_nb_hits" value="true">{'Yes'|@translate}</label>
+      <label><input type="radio" name="show_nb_hits" value="false">{'No'|@translate}</label>
+    </td>
+  </tr>
+
+</table>
+
+</fieldset>
+
+<p>
+  {'target'|@translate}
+  <label><input type="radio" name="target" value="all"> {'all'|@translate}</label>
+  <label><input type="radio" name="target" value="selection" checked="checked"> {'selection'|@translate}</label>
+</p>
+
+<p>
+  <input class="submit" type="submit" value="{'Submit'|@translate}" name="pref_submit">
+  <input class="submit" type="reset" value="{'Reset'|@translate}" name="pref_reset">
+</p>
+
+</form>
+
+<script type="text/javascript">// <![CDATA[{literal}
+jQuery("form:last").submit( function() {
+	if ( jQuery("input[name=target][value=selection]:checked", this).length > 0 )
+	if ( jQuery("input[name='selection[]']:checked", this).length == 0)
+	{
+		alert( {/literal}"{'Select at least one user'|@translate|escape:javascript}"{literal} );
+		return false;
+	}
+	return true;
+}
+);{/literal}
+// ]]>
+</script>
+ 
Index: tags/2.4.0RC3/admin/themes/default/template/user_perm.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/default/template/user_perm.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/template/user_perm.tpl	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>{$TITLE}</h2>
+
+{if isset($categories_because_of_groups) }
+<fieldset>
+  <legend>{'Albums authorized thanks to group associations'|@translate}</legend>
+
+  <ul>
+    {foreach from=$categories_because_of_groups item=cat }
+    <li>{$cat}</li>
+    {/foreach}
+  </ul>
+</fieldset>
+{/if}
+
+
+<fieldset>
+  <legend>{'Other private albums'|@translate}</legend>
+
+  <form method="post" action="{$F_ACTION}">
+    {$DOUBLE_SELECT}
+  </form>
+</fieldset>
Index: tags/2.4.0RC3/admin/themes/default/theme.css
===================================================================
--- tags/2.4.0RC3/admin/themes/default/theme.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/theme.css	(revision 14585)
@@ -0,0 +1,1116 @@
+/* content.css */
+
+/* .Content  is on every pages so it is common and it will no longer be a specific css */
+.content h2 {margin: 0; padding: 5px 0.5em 5px 0.5em; text-align: right; font-size: 120%;}
+.content .navigationBar { margin: 10px 0; text-align: center; }
+.content form { text-align: left; }
+.content dt { margin-bottom: 5px; font-style: italic;
+  font-size: 110%; }
+.content ul.categoryActions a img, ul.categoryActions a {
+border:0; margin-bottom:-5px; }
+ul.categoryActions { margin: 0 2px; width: auto; list-style-position:outside;
+  padding: 0; text-indent: 0; list-style: none; text-align: center; }
+.content div.titrePage ul.categoryActions { float: right; }
+.content div.titrePage { padding: 0 0 3px; }
+.content ul.categoryActions li { display: inline; }
+.content div.comment { margin: 0 0 0.5em 0; padding: 0;
+  overflow: hidden; width: 100%;	/* don't ask why. It's a very usefull trick  */ }
+
+.content DIV.comment A.illustration {
+	display: block;
+	float: left;
+	margin: 0.5em 30px 0 0.5em;
+}
+
+.content div.comment p.commentHeader {
+  text-align: right; margin: 0.5em 0.5em 0 0; }
+.content div.comment ul.actions { text-align: center; margin: 0.2em; }
+.content div.comment blockquote {
+  margin-right: 0.5em; overflow: visible; /*avoid a very strange margin behaviour (all browsers) */ }
+
+/* not used but should be */
+#thePopuphelpPage .content { margin: 1em; }
+
+/* thumbnails.css */
+UL.thumbnails {
+  margin: 0; padding: 0; list-style: none;
+  text-align: center;	/* to center the whole collection in .content */
+  float: left;
+}
+UL.thumbnails LI { display: inline }
+UL.thumbnails li.rank-of-image {
+  float: left;
+  background-color: #333;
+  color: #666;
+  -moz-border-radius: 5px;
+  display: block;
+  width: 104px;
+  height: 104px;
+  cursor: move;
+  margin: 10px;
+}
+.clipwrapper {
+  position:relative;
+  width: 96px;
+  height: 96px;
+  margin: 3px;
+}
+.clip {
+  position:absolute;
+}
+UL.thumbnails li.rank-of-image input {
+}
+UL.thumbnails SPAN.wrap1 {
+  margin: 5px;
+  display: table-cell; display: inline-table;
+  display: inline-block; /* Why 3 display option ??? */
+  vertical-align: top;		/* OK with Opera and IE6 not Geko */
+  text-align: center;		/* to center the thumbnail and legend in Geko/Opera */
+}
+UL.thumbnails SPAN.wrap2 {
+  margin: 0;			/* important reset the margins */
+  display: table-cell;		/* block prevents vertical-align here */
+  vertical-align: middle;	/* Ok with Opera and Geko not IE6 */
+}
+UL.thumbnails LABEL { display: block; border-bottom: none; }
+UL.thumbnails IMG {
+  margin-bottom: -4px;  /* why ??? something wrong with Geko and Opera ignored by IE6*/
+}
+UL.thumbnails LABEL { position: relative; }
+UL.thumbnails INPUT {
+  position: relative;	/* <= Opera can handle relative here */
+  top: -20px;
+}
+:root UL.thumbnails INPUT { /* hide from Opera */
+  position: absolute;	/* <= Opera hide 1 checkbox over 2 !!! */
+  left: 2px; top: 2px;
+}
+UL.thumbnails .levelIndicatorB {
+display:block; position:absolute; z-index:100;padding:0px 0 0 14px; color:black; font-weight:bold; font-size:120%;
+}
+UL.thumbnails .levelIndicatorF {
+display:block; position:absolute; z-index:101;padding:1px 0 0 15px; color:white; font-weight:bold; font-size:120%;
+}
+
+/* default-layout.css */
+
+/* History tables */
+TABLE.table2 {
+	border: 1px solid #111;
+	margin: 1em auto;
+	padding: 0;
+}
+
+TABLE.table2 TD, TABLE.table2 TH {
+	padding: 0 5px;
+}
+
+TABLE.table2 TR {
+	text-align: left;
+}
+
+TABLE.table2 THEAD TD { padding:7px 10px 3px 10px; }
+TABLE.table2 TR.throw { text-align: center; }
+TABLE.table2 { margin:0pt auto; }
+.sort { display:block; padding:8px 5px 0px 1px; clear: right; float:left; }
+
+
+.hour {
+	white-space: pre;
+}
+
+.number {
+	text-align: right;
+}
+
+TABLE#dailyStats {
+	width: 60%;
+}
+
+TABLE#detailedStats {
+	width: 99%;
+}
+
+/* Plugins, languages tables */
+TABLE.plugins,
+TABLE.languages {
+  min-width: 500px;
+}
+TABLE.plugins A { border: 0; }
+TABLE.plugins TR TD { padding: 4px 10px; }
+TABLE.languages TR TD { padding: 7px 20px; }
+
+
+/* categoryOrdering */
+FORM#categoryOrdering .orderParams {
+  line-height:30px;
+  margin-bottom:10px;
+}
+
+SELECT.categoryList {
+	width: 100%;
+}
+
+FORM#categoryOrdering p {
+	text-align: left;
+	/* margin-top: 1em; */
+	/* margin-bottom: 1em; */
+}
+UL.categoryUl {
+	list-style: none;
+	padding: 0;
+	margin: 1em;
+}
+
+LI.categoryLi {
+/*
+	width: 100%;
+*/
+	padding: 5px;
+	margin-bottom: 5px;
+  border-radius:5px;
+}
+
+FORM#categoryOrdering UL.categoryActions {
+	float: right;
+        height:45px;
+        line-height:45px;
+}
+/* */
+
+/* menuOrdering */
+FORM#menuOrdering {
+	padding-left: 1em;
+	padding-right: 1em;
+}
+FORM#menuOrdering p {
+	text-align: left;
+	margin: 0 10px;
+}
+FORM#menuOrdering p span {
+	float:right;
+}
+FORM#menuOrdering input {
+	vertical-align: middle;
+  margin:0 10px;
+}
+FORM#menuOrdering .menuAuthor {
+  margin: 5px 0 0 40px;
+}
+FORM#menuOrdering .menuSubmit {
+  margin: 20px 0;
+}
+
+UL.menuUl {
+	list-style: none;
+	padding: 0;
+	margin: 0;
+}
+
+LI.menuLi {
+	width: 100%;
+	border: 1px solid #666;
+	padding: 12px 0;
+	margin-bottom: 5px;
+}
+/* */
+
+FORM#catModify TABLE { width: auto; }
+
+#catModify p {
+  line-height: 20px;
+  margin: 0 0 1.5em;
+  text-align: left;
+}
+
+FIELDSET.elementEdit .thumb {
+	display: block;
+	float: right;
+	text-align: center;
+}
+
+TABLE.doubleSelect {
+	text-align: center;
+	margin: 0 auto;
+	width: 100%;
+}
+
+TABLE.doubleSelect TD {
+	padding: 0 3px;
+	width: 50%;
+}
+
+TABLE.doubleSelect SELECT.categoryList {
+	width: 100%; max-width: 100%; overflow-x: auto;
+}
+
+.statBar {
+	height: 10px;
+	background-color: #ff7700;
+	border: 1px solid #666;
+}
+
+.over{
+position: relative;
+z-index: 0;
+}
+
+.over:hover{
+background-color: transparent;
+z-index: 50;
+}
+
+.over SPAN{ /*CSS for enlarged image*/
+position: absolute;
+background-color: #222;
+padding: 5px;
+left: -1000px;
+border: 1px solid #ff3363;
+visibility: hidden;
+color: black;
+text-decoration: none;
+}
+
+.over SPAN IMG{ /*CSS for enlarged image*/
+border-width: 0;
+padding: 2px;
+}
+
+.over:hover SPAN{ /*CSS for enlarged image on hover*/
+visibility: visible;
+top: 0;
+left: 60px; /*position where enlarged image should offset horizontally */
+}
+
+BODY {
+	margin: 5px;
+	padding: 0;
+	font-size: 0.8em;
+	font-family: "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
+	text-align: center; /* be nice to IE5 */
+}
+
+H1 {
+color:#eee;
+letter-spacing:1px;
+text-align: left;
+font-size: 150%;
+font-weight: normal;
+font-style:italic;
+padding: 8px 0 0 10px;
+margin: 0;
+float:left;
+}
+
+#pwgHead {color:#aaa;}
+#pwgHead A {color:#ccc;}
+#pwgHead A:hover {color:#fff;border-bottom:1px solid #fff}
+
+#headActions {float:right; height:46px; line-height:46px; margin-right:10px;}
+
+A {
+	text-decoration:none;
+	border-bottom: 0;
+}
+A:hover {
+	border-bottom: 1px solid #FF3363;
+}
+A.button, A.button:hover {
+	border: 0;
+}
+IMG {
+	border: none;
+}
+
+/** General defaults **/
+INPUT, SELECT {
+	margin: 0;
+	font-size: 1em;	/* <= some browsers don't set it correctly */
+}
+UL, DL, OL { text-align: left;}
+TABLE { /* horizontaly centered */
+	margin-left: auto;
+	margin-right: auto;
+}
+/* for debugging purpose */
+PRE { text-align:left; }
+
+/** forms **/
+
+FORM { padding: 0em; }
+
+FORM P {
+	text-align: center;
+        margin:1em;
+}
+
+form p.field {
+  text-align: left;
+}
+
+form p.formButtons {text-align:left;}
+
+FORM FIELDSET P {
+	margin-top: 1em;
+	margin-bottom: 0;
+        text-align:left;
+}
+
+.small {
+	font-size: 80%;
+}
+
+TEXTAREA.description {
+	height: 6em;
+	width: 40em;
+	overflow: auto;
+}
+
+SELECT.categoryList {
+	height: 20em;
+	width: auto;
+}
+
+DIV.comment BLOCKQUOTE {
+	padding: 0.5em;
+	overflow: auto;	/* no solution for IE6 */
+	min-height: 2.75em;	/* fix a Gecko bug whith scrollbar and 1 line only */
+}
+
+
+/**
+ * Filter forms are displayed label by label with the input (or select...)
+ * below the label. Use an UL to make a group (radiobox for instance).
+ * Use a SPAN to group objects in line
+ */
+FIELDSET {
+	padding: 1em;
+	margin: 1em;
+}
+
+FORM.filter FIELDSET UL {
+	margin: 0;
+}
+FORM.filter FIELDSET UL,
+FORM.filter FIELDSET LABEL {
+	display: block;
+	float: left;
+	margin-right: 1em;
+	padding: 0;
+}
+
+FORM.filter FIELDSET LI {
+	list-style: none;
+	margin-bottom: 0.5em;
+}
+
+FORM.filter FIELDSET LI LABEL {
+	display: inline;
+	float: none;
+}
+
+FORM.filter FIELDSET UL.tagSelection LABEL {
+	display: inline;
+	float: none;
+	margin-right:0.5em;/*reduce from above*/
+}
+
+/* cannot use FIELDSET>LABEL because of IE<=6 */
+FORM.filter FIELDSET LABEL INPUT,
+FORM.filter FIELDSET LABEL SELECT,
+FORM.filter FIELDSET LABEL SPAN,
+FORM.filter FIELDSET LABEL TEXTAREA {
+	display: block;
+	margin: 0.5em 0;
+}
+FORM.filter FIELDSET * LABEL INPUT,
+FORM.filter FIELDSET * LABEL SELECT,
+FORM.filter FIELDSET * LABEL TEXTAREA,
+FORM.filter FIELDSET LABEL SPAN INPUT,
+FORM.filter FIELDSET LABEL SPAN SELECT,
+FORM.filter FIELDSET LABEL SPAN TEXTAREA {
+	display: inline;
+	vertical-align: top;
+	margin: 0 0.5em 0 0;
+}
+
+/* following declaration is important to avoid strange FF behaviour */
+FORM.filter FIELDSET LABEL SPAN SELECT {
+	margin: 0;
+}
+
+FORM.filter FIELDSET P
+{
+	clear: left;
+	display: block;
+}
+
+/*FORM.filter INPUT[type="submit"] {
+	margin-top: 1.8em;
+}*/
+
+FORM.properties UL, FORM#update UL {
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+}
+
+FORM.properties LI, FORM#update UL {
+	margin-bottom: 0.5em;
+	padding: 0;
+	line-height: 1.8em;
+	clear: left;
+}
+
+FORM.properties SPAN.property {
+	font-weight: bold;
+	float: left;
+	width: 50%;
+	text-align: right;
+	margin: 0;
+	padding: 0 0.5em 0 0;
+}
+
+#mainConf, #historyConf, #commentsConf, #watermarkConf {border:none}
+
+#configContent label {
+  font-weight: bold;
+}
+
+#notifyAdmin label {
+   white-space:nowrap;
+}
+
+#mainConf li {
+  margin-bottom: 1em;
+}
+
+#theHeader H1 {
+	margin-bottom: 0.5em;
+}
+
+/* button tools */
+UL.actions {
+	text-indent: 0;
+	list-style: none;
+}
+UL.actions LI {
+	display: inline;
+}
+UL.actions A {
+	border: none;
+}
+
+UL.tagSelection {
+	width: 99%;
+	margin: 1em 0 1em 0;
+	padding: 0;
+}
+
+UL.tagSelection LI {
+	display:inline-block;
+        width:150px!important;
+        overflow:hidden;
+	white-space: nowrap;
+}
+
+/* jQuery tooltips */
+.cluetip-default #cluetip-outer {
+	position: relative;
+	border: 1px solid #111111;
+	color: #dddddd;
+	background-color: #222222;
+	text-align: left;
+}
+.cluetip-default h3#cluetip-title {
+	margin: 0 0 5px;
+	padding: 8px;
+	color: #666666;
+	background-color: #d3d3d3;
+	font-size: 1.1em;
+	font-weight: bold;
+}
+.cluetip-default #cluetip-inner {
+	padding: 10px;
+}
+
+/* jQuery datepicker */
+img.ui-datepicker-trigger {
+  cursor : pointer;
+  vertical-align: middle;
+  margin:-3px 5px 2px 5px;
+}
+
+/* Add photos, direct mode */
+#uploadBoxes P {
+  margin:0;
+  margin-bottom:2px;
+  padding:0;
+}
+
+#batchLink {
+  text-align:center;
+}
+
+.category_selection {
+  min-height:65px;
+  margin-top:5px;
+}
+
+.category_selection TABLE {
+  margin:0;
+}
+
+#photosAddContent {
+  text-align:left;
+}
+
+#photosAddContent FIELDSET {
+  width:650px;
+  margin:0 auto 20px auto;
+}
+
+#photosAddContent P {
+  margin:0;
+}
+
+#photosAddContent TH {
+  text-align:right;
+  padding-right: 5px;
+}
+
+#uploadFormSettings input[type="text"] {
+  text-align:right;
+}
+
+#uploadFormSettings TH {
+  width:50%;
+}
+
+#pwgHead {
+  background-color:#464646;
+  height:46px;
+}
+
+html, body {height:100%; margin:0; padding:0;}
+#the_page {min-height:100%; position:absolute; width:100%; padding:0;margin:0;}
+
+#pwgMain {
+  padding: 10px 5px 60px;
+}
+
+#footer {
+  position:absolute;
+  bottom:0;
+  width:100%;
+  height:46px;
+  background: url(images/logo.png) no-repeat 7px 8px;
+  background-color:#464646;
+  color:#aaa;
+  line-height:46px;
+}
+
+#footer A {color:#ccc;}
+#footer A:hover {color:#fff;border-bottom:1px solid #fff;}
+
+#adminHome {
+  text-align:center;
+  margin-bottom:15px;
+  line-height:30px;
+  width:200px;
+  margin-left:5px;
+  -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px;
+}
+
+#adminHome A {display:block; font-size:1.1em; font-weight:bold;}
+#adminHome A {border:none;}
+
+#piwigoInfos {float:left; margin-left:140px;}
+#pageInfos {float:right; margin-right:10px;}
+
+/* TipTip CSS - Version 1.2 */
+
+#tiptip_holder {
+	display: none;
+	position: absolute;
+	top: 0;
+	left: 0;
+	z-index: 99999;
+}
+
+#tiptip_holder.tip_top {
+	padding-bottom: 5px;
+}
+
+#tiptip_holder.tip_bottom {
+	padding-top: 5px;
+}
+
+#tiptip_holder.tip_right {
+	padding-left: 5px;
+}
+
+#tiptip_holder.tip_left {
+	padding-right: 5px;
+}
+
+#tiptip_content {
+	font-size: 11px;
+	color: #fff;
+	text-shadow: 0 0 2px #000;
+	padding: 4px 8px;
+	border: 1px solid rgba(255,255,255,0.25);
+	background-color: rgb(25,25,25);
+	background-color: rgba(25,25,25,0.92);
+	background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	box-shadow: 0 0 3px #555;
+	-webkit-box-shadow: 0 0 3px #555;
+	-moz-box-shadow: 0 0 3px #555;
+}
+
+#tiptip_arrow, #tiptip_arrow_inner {
+	position: absolute;
+	border-color: transparent;
+	border-style: solid;
+	border-width: 6px;
+	height: 0;
+	width: 0;
+}
+
+#tiptip_holder.tip_top #tiptip_arrow {
+	border-top-color: #fff;
+	border-top-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_bottom #tiptip_arrow {
+	border-bottom-color: #fff;
+	border-bottom-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_right #tiptip_arrow {
+	border-right-color: #fff;
+	border-right-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_left #tiptip_arrow {
+	border-left-color: #fff;
+	border-left-color: rgba(255,255,255,0.35);
+}
+
+#tiptip_holder.tip_top #tiptip_arrow_inner {
+	margin-top: -7px;
+	margin-left: -6px;
+	border-top-color: rgb(25,25,25);
+	border-top-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_bottom #tiptip_arrow_inner {
+	margin-top: -5px;
+	margin-left: -6px;
+	border-bottom-color: rgb(25,25,25);
+	border-bottom-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_right #tiptip_arrow_inner {
+	margin-top: -6px;
+	margin-left: -5px;
+	border-right-color: rgb(25,25,25);
+	border-right-color: rgba(25,25,25,0.92);
+}
+
+#tiptip_holder.tip_left #tiptip_arrow_inner {
+	margin-top: -6px;
+	margin-left: -7px;
+	border-left-color: rgb(25,25,25);
+	border-left-color: rgba(25,25,25,0.92);
+}
+
+/* Webkit Hacks  */
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+	#tiptip_content {
+		padding: 4px 8px 5px 8px;
+		background-color: rgba(45,45,45,0.88);
+	}
+	#tiptip_holder.tip_bottom #tiptip_arrow_inner {
+		border-bottom-color: rgba(45,45,45,0.88);
+	}
+	#tiptip_holder.tip_top #tiptip_arrow_inner {
+		border-top-color: rgba(20,20,20,0.92);
+	}
+}
+
+/* Set the width of the menubar for the galery */
+#menubar {
+  width: 18em;
+  margin: 10px 0 50px 5px;
+  display: inline;
+  float: left;
+  left: 0;
+}
+
+.content {
+  padding:0 5px 0 0;
+  margin: 0 5px 0 227px;
+  z-index:99;
+}
+/* Set minimum width of the page before getting a scrollbar */
+/* IE5 and IE6 don't get that */
+BODY {
+  min-width: 60em;  /* ~ 3* #menubar width */
+}
+#thePopuphelpPage {
+  min-width: 0;
+}
+
+#thePopuphelpPage #pwgHead {display:none}
+#thePopuphelpPage #footer  {display:none}
+
+/* Set some sizes according to your maximum thumbnail width and height */
+UL.thumbnails SPAN,
+UL.thumbnails SPAN.wrap2 A,
+UL.thumbnails LABEL {
+  width: 140px;      /* max thumbnail width + 2px */
+}
+UL.thumbnails SPAN.wrap2 {
+  height: 140px;    /* max thumbnail height + 2px */
+}
+
+
+.themeBox {display:inline-table; text-align:center; height:192px; background-color:#eee; margin:5px; -moz-border-radius:5px; overflow:hidden; }
+
+.themeBox IMG {border:1px solid white; margin:0 15px;}
+.themeName {font-size:1.1em; margin:5px 0;}
+.themeActions {display: table-row; font-size:12px; height: 43px; }
+.themeActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
+.themeActions A {}
+
+#themesContent .themeBox IMG {width:150px; height:120px;}
+#themesContent H3 {font-size:16px; text-align:left; border-bottom:1px solid #444; letter-spacing:1px; margin:5px;}
+.themeBoxes {min-height:0;text-align:left;}
+
+h2 { letter-spacing:1px; font-weight:bold;}
+h2:lang(en) { text-transform:capitalize; }
+
+#pluginsMenuSeparator {width:80%; margin:5px auto;}
+
+#helpContent P {text-align:left; margin-left:10px;}
+#helpContent LI, #ftpPage LI {margin-top:10px;}
+#helpContent P.nextStepLink {text-align:center; font-weight:bold; margin-bottom:20px;}
+
+#availablePlugins FIELDSET  {border:none;}
+
+/**
+ * Informations box in administration
+ */
+.infos, .errors, .warnings {
+  text-align: left;
+  margin: 5px;
+  padding: 10px 50px 10px 10px;
+  font-weight:bold;
+  background-repeat: no-repeat;
+  background-position: 5px 5px;
+  padding:5px 70px 0pt 53px;
+  min-height: 54px;
+}
+
+.infos {
+  color: #0a0;
+  background-color:#c2f5c2;
+  background-image: url(icon/infos.png);
+}
+
+.errors {
+  color: #f22;
+  background-color: #ffd5dc;
+  background-image: url(icon/errors.png);
+}
+
+.warnings {
+  color: #ee8800;
+  background-color:#ffdd99;
+  background-image: url(icon/warnings.png);
+}
+
+.infos li, .errors li, .warnings li { list-style-type:square; }
+.infos .submit {margin-left:30px;}
+
+.checkActions {text-align:left;padding:0;margin:0;}
+.comment A:hover {border:none;}
+
+.pluginBoxes {
+  text-align:left;
+  position:relative;
+}
+
+.pluginBox {
+  margin-bottom:10px;
+  border-width:1px;
+  border-style:solid;
+  border-radius:5px;
+  -moz-border-radius:5px;
+ }
+.pluginBox table {width:99%;}
+.pluginBox td {text-align:left;}
+.pluginBox td.pluginDesc img {vertical-align:middle;}
+.pluginBoxNameCell {width:180px; vertical-align:top;}
+.pluginBoxes .inactive, .pluginBoxes .uninstalled {opacity:0.8;filter:alpha(opacity=80);}
+
+.pluginMiniBox {
+  display:inline-table;
+  text-align:center;
+  width:250px;
+  height:40px;
+  margin:5px;
+  border-width:1px;
+  border-style:solid;
+  border-radius:5px;
+  -moz-border-radius:5px;
+  overflow:hidden;
+ }
+.pluginMiniBoxNameCell {font-size:1.05em; margin:5px 0;position:relative;}
+.pluginActions {display: table-row; font-size:0.95em; color:#777;}
+.pluginActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
+.showInfo {display:block;position:absolute;top:0;right:5px;width:15px;font-style:italic;font-family:"Georgia",serif;background-color:#464646;font-size:0.9em;border-radius:10px;-moz-border-radius:10px;}
+.showInfo:hover {cursor:pointer}
+
+.warning:before {content:url(icon/warning.png);vertical-align:top;}
+.deactivate_all {text-align:right;font-size:0.95em;}
+.showDetails {text-align:right; margin-bottom:-15px; margin-top:-10px; padding-right:1em;}
+
+.languageBoxes {min-height:0;text-align:left;}
+.languageBox {display:inline-table; text-align:center; width:200px; height:40px; margin:5px; -moz-border-radius:5px;border-radius:5px; overflow:hidden; }
+.languageName {font-size:1.1em; margin:5px 0;}
+.languageActions {display: table-row; font-size:12px; }
+.languageActions DIV {display: table-cell; vertical-align: middle; line-height:18px; }
+
+#ui-datepicker-div {-moz-border-radius:5px;}
+#ui-datepicker-div .ui-icon-circle-triangle-w, #ui-datepicker-div .ui-icon-circle-triangle-e {color:transparent;}
+#ui-datepicker-div A.ui-datepicker-prev, #ui-datepicker-div A.ui-datepicker-next {background-color:transparent;}
+#ui-datepicker-div A.ui-datepicker-prev:hover, #ui-datepicker-div A.ui-datepicker-next:hover {-moz-border-radius:5px;}
+
+.HelpActions {
+  float:right;
+  margin:0;
+  padding:0;
+  padding-top:2px;
+  padding-left:3px;
+}
+
+.HelpActions a { border:0; margin:0; }
+.HelpActions a:hover {border:0;}
+.HelpActions li {list-style-image:none; list-style-position:outside; list-style-type:none; text-align:center; text-indent:0pt; }
+
+legend {text-align:left;}
+
+/* local-layout */
+/* You can modify this file */
+
+/* default-colors */
+/* So that non-links are slightly greyed out */
+.content .navigationBar {
+	color: #999;
+}
+
+/* Tables & forms */
+
+INPUT.text, INPUT.password, INPUT.button,
+INPUT.submit, INPUT.reset, INPUT.file,
+SELECT, TEXTAREA {
+  color:#999;
+  background-color: #666;
+}
+
+INPUT:focus, SELECT:focus, TEXTAREA:focus, INPUT.focus, FORM .focus {
+  background-color: #444;	/* whitesmoke */
+}
+
+/* some theme set a border on INPUT  which is not pretty for radio/checkbox */
+INPUT[type="radio"], INPUT[type="checkbox"] {
+  border: none;	/* <= Opera needs this */
+}
+
+INPUT.radio, INPUT.checkbox {
+  border: none;	/* <= IE6 needs this */
+}
+
+
+/**
+ * Header message like upgrade
+ */
+.header_msgs {
+  text-align:center;
+  font-weight: bold;
+  color:#333;
+  background-color: transparent;
+  margin: 1px;
+  padding: 1px;
+}
+
+/**
+ * Header notes box in public/administration
+ */
+.header_notes {
+  border: 1px solid #666;
+  background: transparent url(icon/note.png) no-repeat right top;
+  font-weight: bold;
+  margin: 14px 24px 14px 14px;
+  padding: 5px 0 0 0;
+  top: 90px;
+  position: absolute;
+  text-align: right;
+}
+
+LEGEND {
+  font-weight: bold;
+  letter-spacing: 1px;
+  padding: 0 10px;
+}
+
+/* Batch Manager, global mode */
+#batchManagerGlobal #action p {text-align:left;}
+#batchManagerGlobal .bulkAction {text-align:left;margin:15px 0;padding:0;}
+#batchManagerGlobal #action_del_tags ul.tagSelection {margin:0 !important; width:620px;}
+#batchManagerGlobal #checkActions {text-align:left; margin:0 0 20px 0;}
+#batchManagerGlobal ul.thumbnails div.actions {display:none;position:absolute;top:0;right:5px;color:#fff}
+#batchManagerGlobal ul.thumbnails div.actions a {color:#fff;}
+#batchManagerGlobal ul.thumbnails div.actions a:hover {border-color:#fff;}
+#batchManagerGlobal ul.thumbnails span.wrap1:hover div.actions {display:block;}
+#batchManagerGlobal #selectedMessage {padding:5px; -moz-border-radius:5px;-webkit-border-radius:5px;}
+#batchManagerGlobal #selectSet a {border-bottom:1px dotted;}
+#batchManagerGlobal #applyOnDetails {font-style:italic;}
+#batchManagerGlobal .actionButtons {text-align:left;}
+#batchManagerGlobal #filterList {padding-left:5px;}
+#batchManagerGlobal #filterList li {margin-bottom:5px; list-style-type:none;}
+#batchManagerGlobal a.removeFilter {background: url(icon/remove_filter.png) no-repeat top left;width:7px;height:7px;display:inline-block;}
+#batchManagerGlobal a.removeFilter:hover {background: url(icon/remove_filter_hover.png); border:none;}
+#batchManagerGlobal .removeFilter span {display:none}
+#batchManagerGlobal #applyFilterBlock {margin-top:20px;}
+#batchManagerGlobal .useFilterCheckbox {display:none;}
+
+
+/* TokenInput (with Facebook style) */
+ul.token-input-list {overflow: hidden; height: auto !important; height: 1%;width: 400px;border: 1px solid #8496ba;cursor: text;font-size: 12px;font-family: Verdana;min-height: 1px;z-index: 999;margin: 0;padding: 0;background-color: #fff;list-style-type: none;clear: left;}
+ul.token-input-list li input {border: 0;width: 100px;padding: 3px 8px;background-color: white;margin: 2px 0;-webkit-appearance: caret;}
+li.token-input-token {overflow: hidden; height: auto !important; height: 15px;margin: 3px;padding: 1px 3px;background-color: #eff2f7;color: #000;cursor: default;border: 1px solid #ccd5e4;font-size: 11px;border-radius: 5px;-moz-border-radius: 5px;-webkit-border-radius: 5px;float: left;white-space: nowrap;}
+li.token-input-token p {display: inline;padding: 0;margin: 0;}
+li.token-input-token span {color: #a6b3cf;margin-left: 5px;font-weight: bold;cursor: pointer;}
+li.token-input-selected-token {background-color: #5670a6;border: 1px solid #3b5998;color: #fff;}
+li.token-input-input-token {float: left;margin: 0;padding: 0;list-style-type: none;width:10px;}
+div.token-input-dropdown {position: absolute;width: 400px;background-color: #fff;overflow: hidden;border-left: 1px solid #ccc;border-right: 1px solid #ccc;border-bottom: 1px solid #ccc;cursor: default;font-size: 11px;font-family: Verdana;z-index: 1;}
+div.token-input-dropdown p {margin: 0;padding: 5px;font-weight: bold;color: #777;}
+div.token-input-dropdown ul {margin: 0;padding: 0;}
+div.token-input-dropdown ul li {background-color: #fff;padding: 3px;margin: 0;list-style-type: none;}
+div.token-input-dropdown ul li.token-input-dropdown-item {background-color: #fff;}
+div.token-input-dropdown ul li.token-input-dropdown-item2 {background-color: #fff;}
+div.token-input-dropdown ul li em {font-weight: bold;font-style: normal;}
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color: #3b5998;color: #fff;}
+
+#mainConf a.addFilter {font-weight:normal;margin-left:20px;}
+#mainConf a.removeFilter {font-weight:normal;}
+#mainConf span.property span.filter:first-child a.removeFilter {display:none;} /* can't delete the first field */
+#mainConf span.filter {display:block;margin-left:20px;}
+#mainConf .transparent {opacity:0.5;filter:alpha(opacity=50);}
+#mainConf .order_by_is_custom {display:block;font-weight:normal;font-style:italic;margin-left:20px;}
+
+/* Upload Form */
+#uploadBoxes .file {margin-bottom:5px;text-align:left;}
+#uploadBoxes {margin-top:20px;}
+#addUploadBox {margin-bottom:2em;}
+
+p#uploadWarningsSummary {text-align:left;margin-bottom:1em;font-size:90%;color:#999;}
+p#uploadWarningsSummary .showInfo {position:static;display:inline;padding:1px 6px;margin-left:3px;}
+p#uploadWarnings {display:none;text-align:left;margin-bottom:1em;font-size:90%;color:#999;}
+p#uploadModeInfos {text-align:left;margin-top:1em;font-size:90%;color:#999;}
+
+#photosAddContent p.showFieldset {text-align:left;margin: 0 auto 10px auto;width: 650px;}
+
+#uploadProgress {width:650px; margin:10px auto;font-size:90%;}
+#progressbar {border:1px solid #ccc; background-color:#eee;}
+.ui-progressbar-value { background-image: url(images/pbar-ani.gif); height:10px;margin:-1px;border:1px solid #E78F08;}
+
+/* Tag Manager */
+.warningDeletion {display:none;font-style:italic;}
+
+#debug { margin-left: 227px; font-size:12px; }
+
+/* Album Properties */
+#albumThumbnail {
+  width:1%;
+  padding-right:10px;
+  text-align:center;
+}
+
+#albumThumbnail img {
+  border:2px solid #ddd;
+}
+
+#albumLinks {
+  vertical-align:top;
+  border-left:2px solid #ddd;
+  padding-left:10px;
+}
+
+/* Pending Comments */
+#pendingComments {
+  padding:0 5px 0 10px;
+}
+
+#pendingComments table {
+  width:100%;
+}
+
+#pendingComments .bottomButtons {
+  text-align:left;
+}
+
+FORM#categoryOrdering p.albumTitle {margin:0;}
+FORM#categoryOrdering p.albumActions {visibility:hidden; margin:0}
+FORM#categoryOrdering .categoryLi:hover p.albumActions {visibility:visible;}
+
+.showCreateAlbum {text-align:left; margin:0 1em 1em 1em;line-height:22px;}
+#autoOrder p, #createAlbum p {text-align:left; margin:0 0 1em 0;}
+#autoOrder p.actionButtons, #createAlbum p.actionButtons {margin-bottom:0;}
+
+#ftpPage p {text-align:left;margin:1em;}
+#ftpPage fieldset p {margin:0;}
+
+/* watermark configuration screen */
+#watermarkPositionBox {
+  border:2px solid #ccc;
+  width:500px;
+  padding:5px;
+  background-color:#e5e5e5;
+}
+
+#watermarkPositionBox label {
+  font-weight:normal;
+  display:block;
+  color:#444;
+}
+
+#watermarkPositionBox label.middle {
+  margin:50px;
+  text-align:center;
+}
+
+#watermarkPositionBox label.right {
+  float:right;
+}
+
+#positionCustomDetails {
+  margin-left:20px;
+  display:none;
+}
+
+#positionCustomDetails label {
+  font-weight:normal;
+}
+
+input[type="text"].dError {border-color:#ff7070; background-color:#FFe5e5;}
+.dErrorDesc {background-color:red; color:white; padding:0 5px;border-radius:10px; font-weight:bold;cursor:help;}
+
+#wImg {max-height:100px;border:2px solid #ccc;margin-top:5px;}
+#addWatermark {display:none;}
Index: tags/2.4.0RC3/admin/themes/default/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/admin/themes/default/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,9 @@
+<?php
+$themeconf = array(
+  'name'          => 'default',
+  'icon_dir'       => 'themes/default/icon',
+  'admin_icon_dir' => 'admin/themes/default/icon',
+  'mime_icon_dir'  => 'themes/default/icon/mimetypes/',
+  'local_head'     => 'local_head.tpl',
+);
+?>
Index: tags/2.4.0RC3/admin/themes/default/uploadify.jGrowl.css
===================================================================
--- tags/2.4.0RC3/admin/themes/default/uploadify.jGrowl.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/default/uploadify.jGrowl.css	(revision 14585)
@@ -0,0 +1,147 @@
+/*
+Default jGrowl style definitions for:
+
+Uploadify v1.6.2
+Copyright (C) 2009 by Ronnie Garcia
+Co-developed by Travis Nickels
+*/
+
+/** Uploadify Styling here Styling **/
+div.jGrowl div.success {
+	background: url(images/Check.png) no-repeat 6px 6px;
+}
+div.jGrowl div.error {
+	background: url(images/Error.png) no-repeat 6px 6px;
+}
+div.jGrowl div.warning {
+	background: url(images/Alert.png) no-repeat 6px 6px;
+}
+
+div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer {
+	background-color: 		#000;
+	color: 					#fff;
+	opacity: 				.85;
+	filter: 				alpha(opacity = 85);
+	zoom: 					1;
+	width: 					300px;
+	padding: 				10px;
+	margin-top: 			5px;
+	margin-bottom: 			5px;
+	font-family: 			Tahoma, Arial, Helvetica, sans-serif;
+	font-size: 				12px;
+	text-align: 			left;
+	display: 				none;
+	-moz-border-radius: 	5px;
+	-webkit-border-radius:	5px;
+}
+
+/* original jGrowl css styling */
+
+div.center div.jGrowl-notification, div.center div.jGrowl-closer {
+	margin-left: 		auto;
+	margin-right: 		auto;
+}
+
+div.jGrowl div.jGrowl-notification {
+	min-height: 			40px;
+}
+
+div.jGrowl div.jGrowl-notification div.close {
+	float: 					right;
+	font-weight: 			bold;
+	font-size: 				12px;
+	cursor:					pointer;
+}
+
+div.jGrowl div.jGrowl-closer {
+	height: 				15px;
+	padding-top: 			4px;
+	padding-bottom: 		4px;
+	cursor: 				pointer;
+	font-size:				11px;
+	font-weight: 			bold;
+	text-align: 			center;
+}
+
+div.jGrowl div.jGrowl-notification div.header {
+	font-weight: 	bold;
+	font-size:		14px;
+	margin-left: 	60px;
+}
+div.jGrowl div.jGrowl-notification div.message {
+	font-size:		12px;
+	margin-left: 	60px;
+}
+div.jGrowl div.jGrowl-notification p {
+	font-size:		6px;
+}
+
+div.jGrowl {
+	padding: 			10px;
+	z-index: 			9999;
+}
+
+/** Special IE6 Style Positioning **/
+div.ie6 {
+	position: 			absolute;
+}
+
+div.ie6.top-right {
+	right: 				auto;
+	bottom: 			auto;
+	left: 				expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
+  	top: 				expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+}
+
+div.ie6.top-left {
+	left: 				expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
+	top: 				expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+}
+
+div.ie6.bottom-right {
+	left: 				expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
+	top: 				expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+}
+
+div.ie6.bottom-left {
+	left: 				expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
+	top: 				expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+}
+
+div.ie6.center {
+	left: 				expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' );
+	top: 				expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' );
+	width: 				100%;
+}
+
+/** Normal Style Positions **/
+body > div.jGrowl {
+	position:			fixed;
+}
+
+body > div.jGrowl.top-left {
+	left: 				0px;
+	top: 				0px;
+}
+
+body > div.jGrowl.top-right {
+	right: 				0px;
+	top: 				0px;
+}
+
+body > div.jGrowl.bottom-left {
+	left: 				0px;
+	bottom:				0px;
+}
+
+body > div.jGrowl.bottom-right {
+	right: 				0px;
+	bottom: 			0px;
+}
+
+body > div.jGrowl.center {
+	top: 				0px;
+	width: 				50%;
+	left: 				25%;
+}
+
Index: tags/2.4.0RC3/admin/themes/roma/index.php
===================================================================
--- tags/2.4.0RC3/admin/themes/roma/index.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/roma/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/admin/themes/roma/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/admin/themes/roma/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/roma/mail-css.tpl	(revision 14585)
@@ -0,0 +1,18 @@
+/* Theme wipi mail css */
+
+body {ldelim} background-color:#111; color:#69c;}
+#the_page {ldelim} background: #111 url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/mailbody-bg.png) repeat-y scroll left top;}
+#content {ldelim} background: transparent url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/header-bg.png) no-repeat scroll left top;}
+#copyright {ldelim} background: transparent url({$ROOT_URL}template/{$themeconf.template}/mail/text/html/images/footer-bg.png) no-repeat scroll left bottom;
+color: #69c;}
+h2 {ldelim} background-color: #222;color:#eee;background-image: url({$ROOT_URL}template/{$themeconf.template}/themes/{$themeconf.theme}/images/tableh1_bg.png);}
+img {ldelim} margin: 16px; padding:15px;border:1px solid #eee; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} border:1px solid #69c; -moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #69c; background: transparent; }
+a:hover {ldelim} color: #f92; }
+a.PWG {ldelim} border: 0px; }
+a.PWG .P {ldelim} color : #f92; }
+a.PWG .W {ldelim} color : #aaa; }
+a.PWG .G {ldelim} color : #69c; }
+a.PWG:hover .P {ldelim} color : #69c; }
+a.PWG:hover .G {ldelim} color : #f92; }
Index: tags/2.4.0RC3/admin/themes/roma/theme.css
===================================================================
--- tags/2.4.0RC3/admin/themes/roma/theme.css	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/roma/theme.css	(revision 14585)
@@ -0,0 +1,263 @@
+/* generic colors - roma
+.gcText { color: #666666; }                 used for text
+.gcText2 { color: #FF3366; }                used for table header
+.gcText3 { color: #FF3366; }                used for tabs text
+.gcTextInput { color:#999999; }             used for inputs
+.gcLink { color: #FF7700; }                 used for link
+.gcLinkHover { color: #FF3333; }            used for link
+.gcBgPage { background-color: #111111; }               used for page background
+.gcBgTabSheet { background-color: #222222; }           used inside tabsheet & menu
+.gcBgTableRow1 { background-color: #111111; }            used in for tables rows background
+.gcBgTableRow2 { background-color: #222222; }            used in tables rows & some widgets background
+.gcBgInput { background-color:#444444; }                      used for inputs
+.gcBorder    { border-color: #FF3363; }            used for borders
+.gcBorder2   { border-color: #666666; }            used for widgets borders
+.gcBorderInput { border-color:#666666; }           used for inputs
+*/
+/* text color */
+body, h3, dt, .throw, .content, label, LEGEND {
+	color:#666;
+}
+
+INPUT, select, textarea { color:#999; background-color: #444; }
+option[disabled] { background-color: #999; color: #444; }
+input[type="radio"], input[type="checkbox"] { background-color: transparent; }
+/* INPUT[type="checkbox"], INPUT[type="radio"]
+{ color:#999; background-color: #eee; }  */
+INPUT[type="submit"], INPUT[type="reset"]  { color:#999; border: 1px solid #666; background-color: #444; padding: 1px 15px; }
+
+h2 { color: #ccc; }
+
+.header_notes {
+  background: transparent url(../default/icon/note.png) no-repeat right top;
+  border: none;
+  min-height: 48px;
+  padding: 15px 60px 0 0;
+  right: 0;
+  width: 550px;
+}
+html, body { min-height: 100%; }
+
+body { margin: 0; padding: 0;
+background-color:#111111; }
+/* #the_page { margin: 0; padding: 0; z-index: 1; top:0px; */
+/* padding-top: 0; min-height: 100%; width:100%; position:absolute; left:0px; } */
+#headbranch { width: 233px; height: 240px; margin: 0; padding: 0;
+position:absolute; left:0px; top:0px; z-index: 0;
+}
+h3, .row2, .content { background-color: #222; }
+.throw, .row1 { background-color:#111; }
+.throw em { font-style: normal; color: #ff3363; }
+
+#content { min-height: 466px; margin-top: 15px; }
+
+.content {
+  border: 1px solid #222;
+}
+
+.content h3 { font-size:20px; letter-spacing:-0.4px; margin:0 20px 12px 0; text-align:center; background:none; border: 0; }
+.content h3 ~ h3{ margin-top: 40px; }
+.content h4 { font-size:14px; text-align:left; padding:3px; margin: 2px;}
+
+.content dl, dd { margin:5px; }
+
+
+UL.thumbnails span.wrap2:hover { background-color#7CBA0F; color:#666; }
+UL.thumbnails span.wrap2 {
+	padding: 4px;
+	border-radius: 4px;
+	background-color:#333;
+}
+
+/* .throw, */ td h3 {
+ background-image: url(images/fillet.png); background-repeat: repeat-x; }
+/* borders */
+fieldset { border: 2px solid #333; }
+INPUT, SELECT, TEXTAREA { border: 1px solid #666; }
+input:focus, select:focus, textarea:focus, input.focus, form .focus { background-color:#444;color: #999; }
+TEXTAREA { cursor:text; font-size: 13px; }
+.tagSelection label { padding-right:12px; }
+.tagSelection LI.tagSelected {background-color:#aaa;}
+.tagSelected LABEL {color:#000;}
+.content ul.categoryActions a img { margin-left: 10px; }
+ul.thumbnails input { border:3px double #999; color:#999; font-size:10px; margin:0; background-color:#444; text-align: center;}
+INPUT[type="submit"]:hover , INPUT[type="reset"]:hover  { cursor: pointer; }
+INPUT.bigbutton:hover { background-color: #222;  color:#f33; border: 0; }
+.throw  { font-size: 120%; line-height: 26px; padding-top: 10px; font-weight: bold; color: #ff3363; }
+label { cursor:pointer }
+.categoryLi, .menuLi { background: #333 }
+.menuLi_hidden { background: #333 !important; }
+a.Piwigo {
+  font-family: verdana, arial, helvetica, sans-serif !important;
+  font-size: 11px; font-weight: normal; letter-spacing: 0;
+  color : #F33; text-decoration: none; border: 0; }
+a.Piwigo:hover  span.Piwigo  {
+  border-bottom: 1px solid #FF3363;
+}
+
+/* RADU - I comment this because it makes FF form controls activation very slow)
+*, *:focus, *:active, input:active, a:active, input:focus, a:focus { outline: none; -moz-outline-width: 0px; }
+*/
+
+a { color:#f70; border-width: 0; }
+a:hover, a:active { color: #f33; border-bottom: 1px solid #FF3363; cursor: pointer; }
+.content .navigationBar {color:#666;}
+ul.actions, .content form#waiting  {text-align:center;}
+
+.header_msgs { background:transparent url(images/header_msgs-bg.gif) repeat scroll right top;
+border:0; color:#333; font-size:24px; height:30px; margin:0; padding:10px 0 0;
+text-align:center; width:100%; }
+
+/* tabsheets are often used in admin  pages => No specific css files */
+#tabsheet { width:auto; margin:-1px; margin-right:-6px; padding:0;
+border:1px solid #111111; border-bottom:1px solid #ff3363; background-color:#111111;}
+.tabsheet { display:table; white-space:nowrap; padding-left:10px; margin:0; width:auto;
+font-family:verdana,arial,helvetica,sans-serif; font-size:8px;
+list-style-type:none; list-style-image:none; text-decoration:none; }
+.tabsheet li { background:#222222; float:left; margin:0 6px 0 0; overflow:hidden; text-align:right; border:1px solid #ff3363; border-bottom:none; position:relative; top:11px; -moz-border-radius-topleft:5px; -moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px; -webkit-border-top-right-radius:5px;}
+.tabsheet a {
+outline:none; color:#666; display:block; font-size:11px; border:0;
+font-weight:bold; overflow:hidden; padding:6px;
+text-align:right; text-decoration:none; margin: 0; }
+.tabsheet a:first-letter { text-transform:capitalize; }
+.tabsheet li.selected_tab  {
+  border-bottom:1px solid #222222;
+}
+.tabsheet li:hover, .tabsheet li.selected_tab  {
+margin-top:4px; padding-bottom:3px; padding-top:3px; top:1px;
+ }
+.tabsheet a:hover, .tabsheet li.selected_tab  a { color: #F36; }
+.tabsheet a span { background-color:#222; display:block; font-size:10px; margin-right:2px; padding:0 3px 0 1px; }
+/* menubar is on all admin pages => No specific css file */
+#menubar {
+background:transparent url(images/menuBoxBottom_new.png) no-repeat scroll left bottom;
+border:0;
+padding:0; width:207px; z-index:99; text-align: left;
+}
+
+#menubar dd {
+background: transparent url(images/menubar-detail.png) repeat-y top left;
+margin: 0; padding: 0 0 10px 0; }
+#menubar dl {
+background:transparent url(images/menuBoxTop_new.png) no-repeat scroll left top;
+width: 207px; border:0; margin: 0; padding: 0; display: block; min-height:35px; }
+#menubar dl.first {
+background:transparent url(images/menubar-top.png) no-repeat scroll left 1px; }
+#menubar dl.last { padding: 0 0 24px 0;}
+#menubar dt { margin: 0; display: block; background: none; left:10px; font-weight:bold;
+position:relative; padding: 5px 1px 4px 5px; top:-8px; font-size: 13px; color: #666;  outline:none;}
+#menubar dt  span { background-color: #111; cursor:pointer; }
+#menubar li { margin: 0 0 0 6px; }
+#menubar li.external { list-style-image:url(images/external_inactive.png); padding:10px 0px 0pt 10px; }
+#menubar li.external:hover { list-style-image:url(images/external_active.png); }
+#menubar ul { color: #333; margin:0 9px 0 9px; line-height: 16px;
+  list-style-type: square; list-style-position: inside; padding: 0; }
+/* jQuery tooltips */
+.cluetip-default #cluetip-outer { border-color: #666; color: #666; background-color: #222; }
+.cluetip-default h3#cluetip-title { color: #ff3363; background-color: #111; }
+/* jQuery ui resizable */
+.ui-resizable { position: relative; }
+.ui-wrapper { border: 0; }
+.ui-wrapper input, .ui-wrapper textarea { border: 0; }
+
+/* Global handle styles */
+.ui-resizable-handle { position: absolute; display: none; font-size: 0.1px; }
+.ui-resizable .ui-resizable-handle { display: block; }
+body .ui-resizable-disabled .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+body .ui-resizable-autohide .ui-resizable-handle { display: none; } /* use 'body' to make it more specific (css order) */
+.ui-resizable-n { cursor: n-resize; height: 6px; width: 100%; top: 0px; left: 0px; background: transparent url(images/resizable-n.gif) no-repeat scroll center top; }
+.ui-resizable-s { cursor: s-resize; height: 6px; width: 100%; bottom: 0px; left: 0px; background: transparent url(images/resizable-s.gif) no-repeat scroll center top; }
+.ui-resizable-e { cursor: e-resize; width: 6px; right: 0px; top: 0px; height: 100%; background: transparent url(images/resizable-e.gif) no-repeat scroll right center; }
+.ui-resizable-w { cursor: w-resize; width: 6px; left: 0px; top: 0px; height: 100%; background: transparent url(images/resizable-w.gif) no-repeat scroll right center; }
+.ui-resizable-se { cursor: se-resize; width: 9px; height: 9px; right: 0px; bottom: 0px; background: transparent url(images/resizable-se.gif); }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: 0px; bottom: 0px; background: transparent url(images/resizable-sw.gif); }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: 0px; top: 0px; background: transparent url(images/resizable-nw.gif); }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: 0px; top: 0px; background: transparent url(images/resizable-ne.gif); }
+
+#ui-datepicker-div {background-color: #555; border:2px solid #333;}
+#ui-datepicker-div .ui-datepicker-title {color:white;}
+#ui-datepicker-div .ui-icon-circle-triangle-w {background: transparent url(icon/prev.png) no-repeat;}
+#ui-datepicker-div .ui-icon-circle-triangle-e {background: transparent url(icon/next.png) no-repeat;}
+#ui-datepicker-div A.ui-datepicker-prev:hover,
+#ui-datepicker-div A.ui-datepicker-next:hover
+{
+  background-color:#eee;border:1px solid #aaa;
+}
+.ui-datepicker th {color:#ccc;}
+.ui-state-disabled {color:#aaa;}
+
+#ui-datepicker-div .ui-datepicker-control, #ui-datepicker-div  a { background-color: #111; color: #f70 !important;}
+#ui-datepicker-div .ui-datepicker-days-row { background-color: #444;}
+#ui-datepicker-div .ui-datepicker-week-end-cell, #ui-datepicker-div .ui-datepicker-week-end-cell  a { background-color: #222; color: #f33; border-color: #444; border-top-color: #222; border-left-color: #222;}
+#ui-datepicker-div .ui-datepicker-title-row { background-color: #111;}
+#ui-datepicker-div .ui-datepicker-title-row .ui-datepicker-week-end-cell a { color: #f33;}
+#ui-datepicker-div  a:hover { color: #ff3333 !important; border: 0; background-color: #111 !important;}
+#ui-datepicker-div .ui-datepicker-header select { background-color:#444; color:#999; font-weight:normal;}
+#ui-datepicker-div .ui-datepicker-links { background-color:#222;}
+#ui-datepicker-div .ui-datepicker-header { background-color:#444;}
+#ui-datepicker-div .ui-datepicker-current-day { background-color: #111 !important; border-color: #444; border-top-color: #111; border-left-color: #111;}
+#ui-datepicker-div .ui-datepicker-days-cell { background-color:#444; border:1px solid #222; border-top-color: #444; border-left-color: #444;}
+INPUT[type="text"].large  { width: 317px; }
+input[type="button"], input[type="submit"], input[type="reset"] {
+color:#ff3363; background-color:#222; border-color: #ff3363; }
+input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
+color:#999; border-color: #666; }
+.bigbutton { background:transparent url(images/quickLocalSync_inactiv.png) no-repeat scroll left top; display: block;
+color:#111; font-size:28px; height:161px; margin: 0 20px 0 auto; padding:0 18px 0; text-align:center; width:625px;
+position:relative;  z-index: 50;}
+.bigtext { display:block; font-weight:bold; left:225px; position:relative; top:35px; width:320px;  z-index: 55; cursor:pointer; }
+.bigbutton:hover { background:transparent url(images/quickLocalSync_hover.png) no-repeat scroll left top; color: #000; }
+.bigbutton input { background:transparent url(images/transparent.gif) repeat scroll left top; border:0;
+display:block; height:85px; left:225px; position:relative; top:-42px; width:313px; z-index:99; padding:0;
+color:transparent;}
+.bigbutton input:hover { cursor:pointer; background:transparent url(images/transparent.gif) repeat scroll left top; border:0; padding:0;color:transparent;}
+/* hacks */
+* html[lang="en"] body .content h2 , *+html[lang="en"] body .content h2 { text-transform:capitalize; } /* IE */
+*+html  .bigtext { left: 70px; }
+*+html  .bigbutton input, * html  .bigbutton input  { left:0px; position:relative; top:-40px; }
+
+* html .bigtext { margin-right: 300px; }
+
+#adminHome       {background-color:#222;}
+#adminHome:hover {background-color:#333;}
+
+.themeBox {background-color:#333;}
+.themeBox IMG {border:1px solid #666;}
+.themeName {color:#ccc;}
+.themeActions A {border-bottom:none;}
+.themeDefault {background-color:#555;}
+
+#pluginsMenuSeparator {border:1px solid #333;}
+
+#helpContent, #pLoaderPage, #ftpPage, #ftpPage LEGEND {color:#aaa;}
+
+#pwgHead, #footer {background-color:#222;}
+#footer {background-image: url(images/piwigo_logo_small.png);}
+
+.pluginBox, .pluginMiniBox {background-color:#333;color:#999;border-color:#333;}
+.pluginBoxNameCell, .pluginMiniBoxNameCell {color:#ddd;}
+.pluginBox.incompatible, .pluginMiniBox.incompatible {border-color:#800 !important;}
+.pluginBoxes .merged, .pluginBoxes .missing {background-color:#422;border:1px solid #800;}
+.languageBox {background-color:#333;}
+.languageName {color:#ccc;}
+.languageDefault {background-color:#555; color:#aaa;}
+
+#batchManagerGlobal .thumbSelected {background-color:#555 !important}
+#batchManagerGlobal #selectedMessage {background-color:#555; color:#ddd;}
+
+/* TokenInput (with Facebook style for ROMA) */
+ul.token-input-list {border-color:#666;background-color:#444;}
+ul.token-input-list li input {background-color:#444;}
+li.token-input-token span {color:#878787;}
+div.token-input-dropdown {background-color:#eee;border-color:#666;}
+div.token-input-dropdown ul li {background-color:#eee;}
+div.token-input-dropdown ul li.token-input-selected-dropdown-item {background-color:#FF7800;}
+
+#progressbar {border:1px solid #666; background-color:#666;}
+
+/* Album Properties */
+#albumThumbnail img, #albumLinks {
+  border-color:#333;
+}
+
+.selectedComment {background-color:#555; color:#fff;}
Index: tags/2.4.0RC3/admin/themes/roma/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/admin/themes/roma/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes/roma/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,6 @@
+<?php
+$themeconf = array(
+  'name'  => 'roma',
+  'parent' => 'default',
+);
+?>
Index: tags/2.4.0RC3/admin/themes_installed.php
===================================================================
--- tags/2.4.0RC3/admin/themes_installed.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes_installed.php	(revision 14585)
@@ -0,0 +1,156 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+
+$base_url = get_root_url().'admin.php?page='.$page['page'];
+
+$themes = new themes();
+
+// +-----------------------------------------------------------------------+
+// |                          perform actions                              |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['action']) and isset($_GET['theme']))
+{
+  $page['errors'] = $themes->perform_action($_GET['action'], $_GET['theme']);
+
+  if (empty($page['errors']))
+  {
+    if ($_GET['action'] == 'activate' or $_GET['action'] == 'deactivate')
+    {
+      $template->delete_compiled_templates();
+    }
+    redirect($base_url);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                     start template output                             |
+// +-----------------------------------------------------------------------+
+
+$themes->sort_fs_themes();
+
+$default_theme = get_default_theme();
+
+$db_themes = $themes->get_db_themes();
+$db_theme_ids = array();
+foreach ($db_themes as $db_theme)
+{
+  array_push($db_theme_ids, $db_theme['id']);
+}
+
+$active_themes = array();
+$inactive_themes = array();
+
+foreach ($themes->fs_themes as $theme_id => $fs_theme)
+{
+  if ($theme_id == 'default')
+  {
+    continue;
+  }
+
+  if (in_array($theme_id, $db_theme_ids))
+  {
+    $fs_theme['deactivable'] = true;
+
+    if (count($db_theme_ids) <= 1)
+    {
+      $fs_theme['deactivable'] = false;
+      $fs_theme['deactivate_tooltip'] = l10n('Impossible to deactivate this theme, you need at least one theme.');
+    }
+
+    if ($theme_id == $default_theme)
+    {
+      $fs_theme['is_default'] = true;
+      array_unshift($active_themes, $fs_theme);
+    }
+    else
+    {
+      $fs_theme['is_default'] = false;
+      array_push($active_themes, $fs_theme);
+    }
+  }
+  else
+  {
+    // is the theme "activable" ?
+    if (isset($fs_theme['activable']) and !$fs_theme['activable'])
+    {
+      $fs_theme['activate_tooltip'] = l10n('This theme was not designed to be directly activated');
+    }
+    else
+    {
+      $fs_theme['activable'] = true;
+    }
+
+    $missing_parent = $themes->missing_parent_theme($theme_id);
+    if (isset($missing_parent))
+    {
+      $fs_theme['activable'] = false;
+
+      $fs_theme['activate_tooltip'] = sprintf(
+        l10n('Impossible to activate this theme, the parent theme is missing: %s'),
+        $missing_parent
+        );
+    }
+
+    // is the theme "deletable" ?
+    $children = $themes->get_children_themes($theme_id);
+
+    $fs_theme['deletable'] = true;
+
+    if (count($children) > 0)
+    {
+      $fs_theme['deletable'] = false;
+
+      $fs_theme['delete_tooltip'] = sprintf(
+        l10n('Impossible to delete this theme. Other themes depends on it: %s'),
+        implode(', ', $children)
+        );
+    }
+
+    array_push($inactive_themes, $fs_theme);
+  }
+}
+
+$template->assign(
+    array(
+      'activate_baseurl' => $base_url.'&amp;action=activate&amp;theme=',
+      'deactivate_baseurl' => $base_url.'&amp;action=deactivate&amp;theme=',
+      'set_default_baseurl' => $base_url.'&amp;action=set_default&amp;theme=',
+      'delete_baseurl' => $base_url.'&amp;action=delete&amp;theme=',
+
+      'active_themes' => $active_themes,
+      'inactive_themes' => $inactive_themes,
+    )
+  );
+
+
+$template->set_filenames(array('themes' => 'themes_installed.tpl'));
+$template->assign_var_from_handle('ADMIN_CONTENT', 'themes');
+?>
Index: tags/2.4.0RC3/admin/themes_new.php
===================================================================
--- tags/2.4.0RC3/admin/themes_new.php	(revision 14585)
+++ tags/2.4.0RC3/admin/themes_new.php	(revision 14585)
@@ -0,0 +1,147 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+
+$base_url = get_root_url().'admin.php?page='.$page['page'].'&tab='.$page['tab'];
+
+$themes = new themes();
+
+// +-----------------------------------------------------------------------+
+// |                           setup check                                 |
+// +-----------------------------------------------------------------------+
+
+$themes_dir = PHPWG_ROOT_PATH.'themes';
+if (!is_writable($themes_dir))
+{
+  array_push(
+    $page['errors'],
+    sprintf(
+      l10n('Add write access to the "%s" directory'),
+      'themes'
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                       perform installation                            |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['revision']) and isset($_GET['extension']))
+{
+  if (!is_webmaster())
+  {
+    array_push($page['errors'], l10n('Webmaster status is required.'));
+  }
+  else
+  {
+    check_pwg_token();
+
+    $install_status = $themes->extract_theme_files(
+      'install',
+      $_GET['revision'],
+      $_GET['extension']
+      );
+    
+    redirect($base_url.'&installstatus='.$install_status);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                        installation result                            |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['installstatus']))
+{
+  switch ($_GET['installstatus'])
+  {
+    case 'ok':
+      array_push(
+        $page['infos'],
+        l10n('Theme has been successfully installed')
+        );
+      break;
+
+    case 'temp_path_error':
+      array_push($page['errors'], l10n('Can\'t create temporary file.'));
+      break;
+
+    case 'dl_archive_error':
+      array_push($page['errors'], l10n('Can\'t download archive.'));
+      break;
+
+    case 'archive_error':
+      array_push($page['errors'], l10n('Can\'t read or extract archive.'));
+      break;
+
+    default:
+      array_push(
+        $page['errors'],
+        sprintf(l10n('An error occured during extraction (%s).'), htmlspecialchars($_GET['installstatus']))
+        );
+  }  
+}
+
+// +-----------------------------------------------------------------------+
+// |                          template output                              |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('themes' => 'themes_new.tpl'));
+
+if ($themes->get_server_themes(true)) // only new themes
+{
+  foreach($themes->server_themes as $theme)
+  {
+    $url_auto_install = htmlentities($base_url)
+      . '&amp;revision=' . $theme['revision_id']
+      . '&amp;extension=' . $theme['extension_id']
+      . '&amp;pwg_token='.get_pwg_token()
+      ;
+
+    $template->append(
+      'new_themes',
+      array(
+        'name' => $theme['extension_name'],
+        'thumbnail' => PEM_URL.'/upload/extension-'.$theme['extension_id'].'/thumbnail.jpg',
+        'screenshot' => PEM_URL.'/upload/extension-'.$theme['extension_id'].'/screenshot.jpg',
+        'install_url' => $url_auto_install,
+        )
+      );
+  }
+}
+else
+{
+  array_push($page['errors'], l10n('Can\'t connect to server.'));
+}
+
+$template->assign('default_screenshot',
+  get_root_url().'admin/themes/'.$conf['admin_theme'].'/images/missing_screenshot.png'
+);
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'themes');
+?>
Index: tags/2.4.0RC3/admin/updates.php
===================================================================
--- tags/2.4.0RC3/admin/updates.php	(revision 14585)
+++ tags/2.4.0RC3/admin/updates.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+
+$my_base_url = get_root_url().'admin.php?page=updates';
+
+if (isset($_GET['tab']))
+  $page['tab'] = $_GET['tab'];
+else
+  $page['tab'] = 'pwg';
+
+$tabsheet = new tabsheet();
+$tabsheet->add('pwg', l10n('Piwigo Update'), $my_base_url);
+$tabsheet->add('ext', l10n('Extensions Update'), $my_base_url.'&amp;tab=ext');
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+include(PHPWG_ROOT_PATH.'admin/updates_'.$page['tab'].'.php');
+
+?>
Index: tags/2.4.0RC3/admin/updates_ext.php
===================================================================
--- tags/2.4.0RC3/admin/updates_ext.php	(revision 14585)
+++ tags/2.4.0RC3/admin/updates_ext.php	(revision 14585)
@@ -0,0 +1,93 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+$conf['updates_ignored'] = unserialize($conf['updates_ignored']);
+
+include_once(PHPWG_ROOT_PATH.'admin/include/updates.class.php');
+$autoupdate = new updates($page['page']);
+
+$show_reset = false;
+if (!$autoupdate->get_server_extensions())
+{
+  array_push($page['errors'], l10n('Can\'t connect to server.'));
+  return;
+}
+
+foreach ($autoupdate->types as $type)
+{
+  $fs = 'fs_'.$type;
+  $server = 'server_'.$type;
+  $server_ext = $autoupdate->$type->$server;
+  $fs_ext = $autoupdate->$type->$fs;
+
+  if (empty($server_ext))
+  {
+    continue;
+  }
+
+  foreach($fs_ext as $ext_id => $fs_ext)
+  {
+    if (!isset($fs_ext['extension']) or !isset($server_ext[$fs_ext['extension']]))
+    {
+      continue;
+    }
+
+    $ext_info = $server_ext[$fs_ext['extension']];
+
+    if (!$autoupdate->version_compare($fs_ext['version'], $ext_info['revision_name'], $type))
+    {
+      $template->append('update_'.$type, array(
+        'ID' => $ext_info['extension_id'],
+        'REVISION_ID' => $ext_info['revision_id'],
+        'EXT_ID' => $ext_id,
+        'EXT_NAME' => $fs_ext['name'],
+        'EXT_URL' => PEM_URL.'/extension_view.php?eid='.$ext_info['extension_id'],
+        'EXT_DESC' => trim($ext_info['extension_description'], " \n\r"),
+        'REV_DESC' => trim($ext_info['revision_description'], " \n\r"),
+        'CURRENT_VERSION' => $fs_ext['version'],
+        'NEW_VERSION' => $ext_info['revision_name'],
+        'AUTHOR' => $ext_info['author_name'],
+        'DOWNLOADS' => $ext_info['extension_nb_downloads'],
+        'URL_DOWNLOAD' => $ext_info['download_url'] . '&amp;origin=piwigo_download',
+        'IGNORED' => in_array($ext_id, $conf['updates_ignored'][$type]),
+        )
+      );
+    }
+  }
+
+  if (!empty($conf['updates_ignored'][$type]))
+  {
+    $show_reset = true;
+  }
+}
+
+$template->assign('SHOW_RESET', $show_reset);
+$template->assign('PWG_TOKEN', get_pwg_token());
+$template->assign('EXT_TYPE', $page['page'] == 'updates' ? 'extensions' : $page['page']);
+$template->set_filename('plugin_admin_content', 'updates_ext.tpl');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
+
+?>
Index: tags/2.4.0RC3/admin/updates_pwg.php
===================================================================
--- tags/2.4.0RC3/admin/updates_pwg.php	(revision 14585)
+++ tags/2.4.0RC3/admin/updates_pwg.php	(revision 14585)
@@ -0,0 +1,166 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2010      Pierrick LE GALL             http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if( !defined("PHPWG_ROOT_PATH") )
+{
+  die ("Hacking attempt!");
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/updates.class.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/pclzip.lib.php');
+
+/*
+STEP:
+0 = check is needed. If version is latest or check fail, we stay on step 0
+1 = new version on same branch AND new branch are available => user may choose upgrade.
+2 = upgrade on same branch
+3 = upgrade on different branch
+*/
+$step = isset($_GET['step']) ? $_GET['step'] : 0;
+$upgrade_to = isset($_GET['to']) ? $_GET['to'] : '';
+
+// +-----------------------------------------------------------------------+
+// |                                Step 0                                 |
+// +-----------------------------------------------------------------------+
+if ($step == 0)
+{
+  $template->assign(array(
+    'CHECK_VERSION' => false,
+    'DEV_VERSION' => false,
+    )
+  );
+
+  if (preg_match('/(\d+\.\d+)\.(\d+)/', PHPWG_VERSION, $matches))
+  {
+    $url = PHPWG_URL.'/download/all_versions.php';
+    $url .= '?rand='.md5(uniqid(rand(), true)); // Avoid server cache
+
+    if (@fetchRemote($url, $result)
+      and $all_versions = @explode("\n", $result)
+      and is_array($all_versions))
+    {
+      $template->assign('CHECK_VERSION', true);
+
+      $last_version = trim($all_versions[0]);
+      $upgrade_to = $last_version;
+
+      if (version_compare(PHPWG_VERSION, $last_version, '<'))
+      {
+        $new_branch = preg_replace('/(\d+\.\d+)\.\d+/', '$1', $last_version);
+        $actual_branch = $matches[1];
+
+        if ($new_branch == $actual_branch)
+        {
+          $step = 2;
+        }
+        else
+        {
+          $step = 3;
+
+          // Check if new version exists in same branch
+          foreach ($all_versions as $version)
+          {
+            $new_branch = preg_replace('/(\d+\.\d+)\.\d+/', '$1', $version);
+
+            if ($new_branch == $actual_branch)
+            {
+              if (version_compare(PHPWG_VERSION, $version, '<'))
+              {
+                $step = 1;
+              }
+              break;
+            }
+          }
+        }
+      }
+    }
+  }
+  else
+  {
+    $template->assign('DEV_VERSION', true);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                                Step 1                                 |
+// +-----------------------------------------------------------------------+
+if ($step == 1)
+{
+  $template->assign(array(
+    'MINOR_VERSION' => $version,
+    'MAJOR_VERSION' => $last_version,
+    )
+  );
+}
+
+// +-----------------------------------------------------------------------+
+// |                                Step 2                                 |
+// +-----------------------------------------------------------------------+
+if ($step == 2 and is_webmaster())
+{
+  if (isset($_POST['submit']) and isset($_POST['upgrade_to']))
+  {
+    updates::upgrade_to($_POST['upgrade_to'], $step);
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                                Step 3                                 |
+// +-----------------------------------------------------------------------+
+if ($step == 3 and is_webmaster())
+{
+  if (isset($_POST['dumpDatabase']))
+  {
+    updates::dump_database(isset($_POST['includeHistory']));
+  }
+
+  if (isset($_POST['submit']) and isset($_POST['upgrade_to']))
+  {
+    updates::upgrade_to($_POST['upgrade_to'], $step);
+  }
+
+  $updates = new updates();
+  $updates->get_merged_extensions($upgrade_to);
+  $updates->get_server_extensions($upgrade_to);
+  $template->assign('missing', $updates->missing);
+}
+
+// +-----------------------------------------------------------------------+
+// |                        Process template                               |
+// +-----------------------------------------------------------------------+
+
+if (!is_webmaster())
+{
+  array_push($page['errors'], l10n('Webmaster status is required.'));
+}
+
+$template->assign(array(
+  'STEP'          => $step,
+  'PHPWG_VERSION' => PHPWG_VERSION,
+  'UPGRADE_TO'    => $upgrade_to,
+  'RELEASE_URL'   => PHPWG_URL.'/releases/'.$upgrade_to,
+  )
+);
+
+$template->set_filename('plugin_admin_content', 'updates_pwg.tpl');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
+
+?>
Index: tags/2.4.0RC3/admin/user_list.php
===================================================================
--- tags/2.4.0RC3/admin/user_list.php	(revision 14585)
+++ tags/2.4.0RC3/admin/user_list.php	(revision 14585)
@@ -0,0 +1,756 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Add users and manage users list
+ */
+
+// +-----------------------------------------------------------------------+
+// |                              functions                                |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns a list of users depending on page filters (in $_GET)
+ *
+ * Each user comes with his related informations : id, username, mail
+ * address, list of groups.
+ *
+ * @return array
+ */
+function get_filtered_user_list()
+{
+  global $conf, $page;
+
+  $users = array();
+
+  // filter
+  $filter = array();
+
+  if (isset($_GET['username']) and !empty($_GET['username']))
+  {
+    $username = str_replace('*', '%', $_GET['username']);
+    $filter['username'] = pwg_db_real_escape_string($username);
+  }
+
+  if (isset($_GET['group'])
+      and -1 != $_GET['group']
+      and is_numeric($_GET['group']))
+  {
+    $filter['group'] = $_GET['group'];
+  }
+
+  if (isset($_GET['status'])
+      and in_array($_GET['status'], get_enums(USER_INFOS_TABLE, 'status')))
+  {
+    $filter['status'] = $_GET['status'];
+  }
+
+  // how to order the list?
+  $order_by = 'id';
+  if (isset($_GET['order_by'])
+      and in_array($_GET['order_by'], array_keys($page['order_by_items'])))
+  {
+    $order_by = $_GET['order_by'];
+  }
+
+  $direction = 'ASC';
+  if (isset($_GET['direction'])
+      and in_array($_GET['direction'], array_keys($page['direction_items'])))
+  {
+    $direction = strtoupper($_GET['direction']);
+  }
+
+  // search users depending on filters and order
+  $query = '
+SELECT DISTINCT u.'.$conf['user_fields']['id'].' AS id,
+                u.'.$conf['user_fields']['username'].' AS username,
+                u.'.$conf['user_fields']['email'].' AS email,
+                ui.status,
+                ui.enabled_high,
+                ui.level
+  FROM '.USERS_TABLE.' AS u
+    INNER JOIN '.USER_INFOS_TABLE.' AS ui
+      ON u.'.$conf['user_fields']['id'].' = ui.user_id
+    LEFT JOIN '.USER_GROUP_TABLE.' AS ug
+      ON u.'.$conf['user_fields']['id'].' = ug.user_id
+  WHERE u.'.$conf['user_fields']['id'].' > 0';
+  if (isset($filter['username']))
+  {
+    $query.= '
+  AND u.'.$conf['user_fields']['username'].' LIKE \''.$filter['username'].'\'';
+  }
+  if (isset($filter['group']))
+  {
+    $query.= '
+    AND ug.group_id = '.$filter['group'];
+  }
+  if (isset($filter['status']))
+  {
+    $query.= '
+    AND ui.status = \''.$filter['status']."'";
+  }
+  $query.= '
+  ORDER BY '.$order_by.' '.$direction.'
+;';
+
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $user = $row;
+    $user['groups'] = array();
+
+    array_push($users, $user);
+  }
+
+  // add group lists
+  $user_ids = array();
+  foreach ($users as $i => $user)
+  {
+    $user_ids[$i] = $user['id'];
+  }
+  $user_nums = array_flip($user_ids);
+
+  if (count($user_ids) > 0)
+  {
+    $query = '
+SELECT user_id, group_id
+  FROM '.USER_GROUP_TABLE.'
+  WHERE user_id IN ('.implode(',', $user_ids).')
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      array_push(
+        $users[$user_nums[$row['user_id']]]['groups'],
+        $row['group_id']
+        );
+    }
+  }
+
+  return $users;
+}
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+$page['order_by_items'] = array(
+  'id' => l10n('registration date'),
+  'username' => l10n('Username'),
+  'level' => l10n('Privacy level'),
+  'Language' => l10n('Language'),
+  'email' => l10n('Email address'),
+  );
+
+$page['direction_items'] = array(
+  'asc' => l10n('ascending'),
+  'desc' => l10n('descending')
+  );
+
+// +-----------------------------------------------------------------------+
+// |                              add a user                               |
+// +-----------------------------------------------------------------------+
+
+// Check for config_default var - If True : Using double password type else single password type
+// This feature is discussed on Piwigo's english forum
+if ($conf['double_password_type_in_admin'] == true)
+{
+  if (isset($_POST['submit_add']))
+  {
+    if(empty($_POST['password']))
+    {
+      array_push($page['errors'], l10n('Password is missing. Please enter the password.'));
+    }
+    else if(empty($_POST['password_conf']))
+    {
+      array_push($page['errors'], l10n('Password confirmation is missing. Please confirm the chosen password.'));
+    }
+    else if(empty($_POST['email']))
+    {
+      array_push($page['errors'], l10n('Email address is missing. Please specify an email address.'));
+    }
+    else if ($_POST['password'] != $_POST['password_conf'])
+    {
+      array_push($page['errors'], l10n('The passwords do not match'));
+    }
+    else
+    {
+      $page['errors'] = register_user(
+        $_POST['login'], $_POST['password'], $_POST['email'], false);
+
+      if (count($page['errors']) == 0)
+      {
+        array_push(
+          $page['infos'],
+          sprintf(
+            l10n('user "%s" added'),
+            $_POST['login']
+          )
+        );
+      }
+    }
+  }
+}
+else if ($conf['double_password_type_in_admin'] == false)
+{
+  if (isset($_POST['submit_add']))
+  {
+    $page['errors'] = register_user(
+      $_POST['login'], $_POST['password'], $_POST['email'], false);
+
+    if (count($page['errors']) == 0)
+    {
+      array_push(
+        $page['infos'],
+        sprintf(
+          l10n('user "%s" added'),
+          stripslashes($_POST['login'])
+          )
+        );
+    }
+  }
+}
+
+// email notification
+if ( 
+  isset($_POST['submit_add']) 
+  and count($page['errors']) == 0  
+  and !empty($_POST['email']) 
+  and isset($_POST['send_password_by_mail']) 
+  )
+{
+  include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+        
+  $keyargs_content = array(
+    get_l10n_args('Hello %s,', $_POST['login']),
+    get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),
+    get_l10n_args('', ''),
+    get_l10n_args('Here are your connection settings', ''),
+    get_l10n_args('Username: %s', $_POST['login']),
+    get_l10n_args('Password: %s', $_POST['password']),
+    get_l10n_args('Email: %s', $_POST['email']),
+    get_l10n_args('', ''),
+    get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),
+    );
+    
+  pwg_mail(
+    $_POST['email'],
+    array(
+      'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),
+      'content' => l10n_args($keyargs_content),
+      'content_format' => 'text/plain',
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+$page['filtered_users'] = get_filtered_user_list();
+
+// +-----------------------------------------------------------------------+
+// |                            selected users                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['delete']) or isset($_POST['pref_submit']))
+{
+  $collection = array();
+
+  switch ($_POST['target'])
+  {
+    case 'all' :
+    {
+      foreach($page['filtered_users'] as $local_user)
+      {
+        array_push($collection, $local_user['id']);
+      }
+      break;
+    }
+    case 'selection' :
+    {
+      if (isset($_POST['selection']))
+      {
+        $collection = $_POST['selection'];
+      }
+      break;
+    }
+  }
+
+  if (count($collection) == 0)
+  {
+    array_push($page['errors'], l10n('Select at least one user'));
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             delete users                              |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['delete']) and count($collection) > 0)
+{
+  if (in_array($conf['guest_id'], $collection))
+  {
+    array_push($page['errors'], l10n('Guest cannot be deleted'));
+  }
+  if (($conf['guest_id'] != $conf['default_user_id']) and
+      in_array($conf['default_user_id'], $collection))
+  {
+    array_push($page['errors'], l10n('Default user cannot be deleted'));
+  }
+  if (in_array($conf['webmaster_id'], $collection))
+  {
+    array_push($page['errors'], l10n('Webmaster cannot be deleted'));
+  }
+  if (in_array($user['id'], $collection))
+  {
+    array_push($page['errors'], l10n('You cannot delete your account'));
+  }
+
+  if (count($page['errors']) == 0)
+  {
+    if (isset($_POST['confirm_deletion']) and 1 == $_POST['confirm_deletion'])
+    {
+      foreach ($collection as $user_id)
+      {
+        delete_user($user_id);
+      }
+      array_push(
+        $page['infos'],
+        l10n_dec(
+          '%d user deleted', '%d users deleted',
+          count($collection)
+          )
+        );
+      foreach ($page['filtered_users'] as $filter_key => $filter_user)
+      {
+        if (in_array($filter_user['id'], $collection))
+        {
+          unset($page['filtered_users'][$filter_key]);
+        }
+      }
+    }
+    else
+    {
+      array_push($page['errors'], l10n('You need to confirm deletion'));
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                       preferences form submission                     |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['pref_submit']) and count($collection) > 0)
+{
+  if (-1 != $_POST['associate'])
+  {
+    $datas = array();
+
+    $query = '
+SELECT user_id
+  FROM '.USER_GROUP_TABLE.'
+  WHERE group_id = '.$_POST['associate'].'
+;';
+    $associated = array_from_query($query, 'user_id');
+
+    $associable = array_diff($collection, $associated);
+
+    if (count($associable) > 0)
+    {
+      foreach ($associable as $item)
+      {
+        array_push($datas,
+                   array('group_id'=>$_POST['associate'],
+                         'user_id'=>$item));
+      }
+
+      mass_inserts(USER_GROUP_TABLE,
+                   array('group_id', 'user_id'),
+                   $datas);
+    }
+  }
+
+  if (-1 != $_POST['dissociate'])
+  {
+    $query = '
+DELETE FROM '.USER_GROUP_TABLE.'
+  WHERE group_id = '.$_POST['dissociate'].'
+  AND user_id IN ('.implode(',', $collection).')
+';
+    pwg_query($query);
+  }
+
+  // properties to set for the collection (a user list)
+  $datas = array();
+  $dbfields = array('primary' => array('user_id'), 'update' => array());
+
+  $formfields = array(
+          'nb_image_page', 'theme', 'language',
+          'recent_period', 'expand', 'show_nb_hits', 
+          'status', 'enabled_high', 'level'
+          );
+  
+  $true_false_fields = array('expand', 'show_nb_hits', 'enabled_high');
+  
+  if ($conf['activate_comments'])
+  {
+    array_push($formfields, 'show_nb_comments');
+    array_push($true_false_fields, 'show_nb_comments');
+  }
+
+  foreach ($formfields as $formfield)
+  {
+    // special for true/false fields
+    if (in_array($formfield, $true_false_fields))
+    {
+      $test = $formfield;
+    }
+    else
+    {
+      $test = $formfield.'_action';
+    }
+
+    if ($_POST[$test] != 'leave')
+    {
+      array_push($dbfields['update'], $formfield);
+    }
+  }
+
+  // updating elements is useful only if needed...
+  if (count($dbfields['update']) > 0)
+  {
+    $datas = array();
+
+    foreach ($collection as $user_id)
+    {
+      $data = array();
+      $data['user_id'] = $user_id;
+
+      // TODO : verify if submited values are semanticaly correct
+      foreach ($dbfields['update'] as $dbfield)
+      {
+        // if the action is 'unset', the key won't be in row and
+        // mass_updates function will set this field to NULL
+        if (in_array($dbfield, $true_false_fields)
+            or 'set' == $_POST[$dbfield.'_action'])
+        {
+          $data[$dbfield] = $_POST[$dbfield];
+        }
+      }
+
+      // if the status is getting greater or equal to "admin", then level
+      // automatically switches to "admin" (8), unless the level is also
+      // defined in the same batch action.
+      if (isset($data['status']) and in_array($data['status'], array('webmaster', 'admin')))
+      {
+        if (!isset($data['level']))
+        {
+          $data['level'] = 8;
+          if (!in_array('level', $dbfields['update']))
+          {
+            array_push($dbfields['update'], 'level');
+          }
+        }
+      }
+
+      // special users checks
+      if
+        (
+          ($conf['webmaster_id'] == $user_id) or
+          ($conf['guest_id'] == $user_id) or
+          ($conf['default_user_id'] == $user_id)
+        )
+      {
+        // status must not be changed
+        if (isset($data['status']))
+        {
+          if ($conf['webmaster_id'] == $user_id)
+          {
+            $data['status'] = 'webmaster';
+          }
+          else
+          {
+            $data['status'] = 'guest';
+          }
+        }
+      }
+
+      array_push($datas, $data);
+    }
+
+    mass_updates(USER_INFOS_TABLE, $dbfields, $datas);
+  }
+
+  redirect(
+    get_root_url().
+    'admin.php'.
+    get_query_string_diff(array(), false)
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                              groups list                              |
+// +-----------------------------------------------------------------------+
+
+$groups[-1] = '------------';
+
+$query = '
+SELECT id, name
+  FROM '.GROUPS_TABLE.'
+  ORDER BY name ASC
+;';
+$result = pwg_query($query);
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $groups[$row['id']] = $row['name'];
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(array('user_list'=>'user_list.tpl'));
+
+$base_url = PHPWG_ROOT_PATH.'admin.php?page=user_list';
+
+if (isset($_GET['start']) and is_numeric($_GET['start']))
+{
+  $start = $_GET['start'];
+}
+else
+{
+  $start = 0;
+}
+
+$template->assign(
+  array(
+    'U_HELP' => get_root_url().'admin/popuphelp.php?page=user_list',
+
+    'F_ADD_ACTION' => $base_url,
+    'F_USERNAME' => @htmlentities($_GET['username'], ENT_COMPAT, 'UTF-8'),
+    'F_FILTER_ACTION' => get_root_url().'admin.php',
+    
+    'ACTIVATE_COMMENTS' => $conf['activate_comments'],
+    ));
+
+// Display or Hide double password type
+$template->assign('Double_Password', $conf['double_password_type_in_admin'] );
+
+// Filter status options
+$status_options[-1] = '------------';
+foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
+{
+  $status_options[$status] = l10n('user_status_'.$status);
+}
+$template->assign('status_options', $status_options);
+$template->assign('status_selected',
+    isset($_GET['status']) ? $_GET['status'] : '');
+
+// Filter group options
+$template->assign('group_options', $groups);
+$template->assign('group_selected',
+    isset($_GET['group']) ? $_GET['group'] : '');
+
+// Filter order options
+$template->assign('order_options', $page['order_by_items']);
+$template->assign('order_selected',
+    isset($_GET['order_by']) ? $_GET['order_by'] : '');
+
+// Filter direction options
+$template->assign('direction_options', $page['direction_items']);
+$template->assign('direction_selected',
+    isset($_GET['direction']) ? $_GET['direction'] : '');
+
+
+if (isset($_POST['pref_submit']))
+{
+  $template->assign(
+    array(
+      'NB_IMAGE_PAGE' => $_POST['nb_image_page'],
+      'RECENT_PERIOD' => $_POST['recent_period'],
+      ));
+}
+else
+{
+  $default_user = get_default_user_info(true);
+  $template->assign(
+    array(
+      'NB_IMAGE_PAGE' => $default_user['nb_image_page'],
+      'RECENT_PERIOD' => $default_user['recent_period'],
+      ));
+}
+
+// Template Options
+$template->assign('theme_options', get_pwg_themes());
+$template->assign('theme_selected',
+    isset($_POST['pref_submit']) ? $_POST['theme'] : get_default_theme());
+
+// Language options
+$template->assign('language_options', get_languages());
+$template->assign('language_selected',
+    isset($_POST['pref_submit']) ? $_POST['language'] : get_default_language());
+
+// Status options
+foreach (get_enums(USER_INFOS_TABLE, 'status') as $status)
+{
+  // Only status <= can be assign
+  if (is_autorize_status(get_access_type_status($status)))
+  {
+    $pref_status_options[$status] = l10n('user_status_'.$status);
+  }
+}
+$template->assign('pref_status_options', $pref_status_options);
+$template->assign('pref_status_selected',
+    isset($_POST['pref_submit']) ? $_POST['status'] : 'normal');
+
+// associate and dissociate options
+$template->assign('association_options', $groups);
+$template->assign('associate_selected',
+    isset($_POST['pref_submit']) ? $_POST['associate'] : '');
+$template->assign('dissociate_selected',
+    isset($_POST['pref_submit']) ? $_POST['dissociate'] : '');
+
+
+// user level options
+foreach ($conf['available_permission_levels'] as $level)
+{
+  $level_options[$level] = l10n(sprintf('Level %d', $level));
+}
+$template->assign('level_options', $level_options);
+$template->assign('level_selected',
+    isset($_POST['pref_submit']) ? $_POST['level'] : $default_user['level']);
+
+// +-----------------------------------------------------------------------+
+// |                            navigation bar                             |
+// +-----------------------------------------------------------------------+
+
+$url = PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start'));
+
+$navbar = create_navigation_bar(
+  $url,
+  count($page['filtered_users']),
+  $start,
+  $conf['users_page']
+  );
+
+$template->assign('navbar', $navbar);
+
+// +-----------------------------------------------------------------------+
+// |                               user list                               |
+// +-----------------------------------------------------------------------+
+
+$profile_url = get_root_url().'admin.php?page=profile&amp;user_id=';
+$perm_url = get_root_url().'admin.php?page=user_perm&amp;user_id=';
+
+$visible_user_list = array();
+foreach ($page['filtered_users'] as $num => $local_user)
+{
+  // simulate LIMIT $start, $conf['users_page']
+  if ($num < $start)
+  {
+    continue;
+  }
+  if ($num >= $start + $conf['users_page'])
+  {
+    break;
+  }
+
+  $visible_user_list[] = $local_user;
+}
+
+// allow plugins to fill template var plugin_user_list_column_titles and
+// plugin_columns/plugin_actions for each user in the list
+$visible_user_list = trigger_event('loc_visible_user_list', $visible_user_list);
+
+foreach ($visible_user_list as $local_user)
+{
+  $groups_string = preg_replace(
+    '/(\d+)/e',
+    "\$groups['$1']",
+    implode(
+      ', ',
+      $local_user['groups']
+      )
+    );
+
+  if (isset($_POST['pref_submit'])
+      and isset($_POST['selection'])
+      and in_array($local_user['id'], $_POST['selection']))
+  {
+    $checked = 'checked="checked"';
+  }
+  else
+  {
+    $checked = '';
+  }
+
+  $properties = array();
+  if ( $local_user['level'] != 0 )
+  {
+    $properties[] = l10n( sprintf('Level %d', $local_user['level']) );
+  }
+  $properties[] =
+    (isset($local_user['enabled_high']) and ($local_user['enabled_high'] == 'true'))
+        ? l10n('High definition') : l10n('');
+
+  $template->append(
+    'users',
+    array(
+      'ID' => $local_user['id'],
+      'CHECKED' => $checked,
+      'U_PROFILE' => $profile_url.$local_user['id'],
+      'U_PERM' => $perm_url.$local_user['id'],
+      'USERNAME' => stripslashes($local_user['username'])
+        .($local_user['id'] == $conf['guest_id']
+          ? '<br>['.l10n('guest').']' : '')
+        .($local_user['id'] == $conf['default_user_id']
+          ? '<br>['.l10n('default values').']' : ''),
+      'STATUS' => l10n('user_status_'.$local_user['status']),
+      'EMAIL' => get_email_address_as_display_text($local_user['email']),
+      'GROUPS' => $groups_string,
+      'PROPERTIES' => implode( ', ', $properties),
+      'plugin_columns' => isset($local_user['plugin_columns']) ? $local_user['plugin_columns'] : array(),
+      'plugin_actions' => isset($local_user['plugin_actions']) ? $local_user['plugin_actions'] : array(),
+      )
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'user_list');
+?>
Index: tags/2.4.0RC3/admin/user_perm.php
===================================================================
--- tags/2.4.0RC3/admin/user_perm.php	(revision 14585)
+++ tags/2.4.0RC3/admin/user_perm.php	(revision 14585)
@@ -0,0 +1,181 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('IN_ADMIN'))
+{
+  die('Hacking attempt!');
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_ADMINISTRATOR);
+
+// +-----------------------------------------------------------------------+
+// |                            variables init                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['user_id']) and is_numeric($_GET['user_id']))
+{
+  $page['user'] = $_GET['user_id'];
+}
+else
+{
+  die('user_id URL parameter is missing');
+}
+
+// +-----------------------------------------------------------------------+
+// |                                updates                                |
+// +-----------------------------------------------------------------------+
+
+if (isset($_POST['falsify'])
+    and isset($_POST['cat_true'])
+    and count($_POST['cat_true']) > 0)
+{
+  // if you forbid access to a category, all sub-categories become
+  // automatically forbidden
+  $subcats = get_subcat_ids($_POST['cat_true']);
+  $query = '
+DELETE FROM '.USER_ACCESS_TABLE.'
+  WHERE user_id = '.$page['user'].'
+    AND cat_id IN ('.implode(',', $subcats).')
+;';
+  pwg_query($query);
+}
+else if (isset($_POST['trueify']))
+{
+  add_permission_on_category($_POST['cat_false'], $page['user']);
+}
+
+// +-----------------------------------------------------------------------+
+// |                             template init                             |
+// +-----------------------------------------------------------------------+
+
+$template->set_filenames(
+  array(
+    'user_perm' => 'user_perm.tpl',
+    'double_select' => 'double_select.tpl'
+    )
+  );
+
+$template->assign(
+  array(
+    'TITLE' =>
+      sprintf(
+        l10n('Manage permissions for user "%s"'),
+        get_username($page['user']
+          )
+        ),
+    'L_CAT_OPTIONS_TRUE'=>l10n('Authorized'),
+    'L_CAT_OPTIONS_FALSE'=>l10n('Forbidden'),
+
+    'F_ACTION' =>
+        PHPWG_ROOT_PATH.
+        'admin.php?page=user_perm'.
+        '&amp;user_id='.$page['user']
+    )
+  );
+
+
+// retrieve category ids authorized to the groups the user belongs to
+$group_authorized = array();
+
+$query = '
+SELECT DISTINCT cat_id, c.uppercats, c.global_rank
+  FROM '.USER_GROUP_TABLE.' AS ug
+    INNER JOIN '.GROUP_ACCESS_TABLE.' AS ga
+      ON ug.group_id = ga.group_id
+    INNER JOIN '.CATEGORIES_TABLE.' AS c
+      ON c.id = ga.cat_id
+  WHERE ug.user_id = '.$page['user'].'
+;';
+$result = pwg_query($query);
+
+if (pwg_db_num_rows($result) > 0)
+{
+  $cats = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($cats, $row);
+    array_push($group_authorized, $row['cat_id']);
+  }
+  usort($cats, 'global_rank_compare');
+
+  foreach ($cats as $category)
+  {
+    $template->append(
+      'categories_because_of_groups',
+      get_cat_display_name_cache($category['uppercats'], null, false)
+      );
+  }
+}
+
+// only private categories are listed
+$query_true = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_ACCESS_TABLE.' ON cat_id = id
+  WHERE status = \'private\'
+    AND user_id = '.$page['user'];
+if (count($group_authorized) > 0)
+{
+  $query_true.= '
+    AND cat_id NOT IN ('.implode(',', $group_authorized).')';
+}
+$query_true.= '
+;';
+display_select_cat_wrapper($query_true,array(),'category_option_true');
+
+$result = pwg_query($query_true);
+$authorized_ids = array();
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($authorized_ids, $row['id']);
+}
+
+$query_false = '
+SELECT id,name,uppercats,global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'private\'';
+if (count($authorized_ids) > 0)
+{
+  $query_false.= '
+    AND id NOT IN ('.implode(',', $authorized_ids).')';
+}
+if (count($group_authorized) > 0)
+{
+  $query_false.= '
+    AND id NOT IN ('.implode(',', $group_authorized).')';
+}
+$query_false.= '
+;';
+display_select_cat_wrapper($query_false,array(),'category_option_false');
+
+// +-----------------------------------------------------------------------+
+// |                           sending html code                           |
+// +-----------------------------------------------------------------------+
+
+$template->assign_var_from_handle('DOUBLE_SELECT', 'double_select');
+$template->assign_var_from_handle('ADMIN_CONTENT', 'user_perm');
+?>
Index: tags/2.4.0RC3/category.php
===================================================================
--- tags/2.4.0RC3/category.php	(revision 14585)
+++ tags/2.4.0RC3/category.php	(revision 14585)
@@ -0,0 +1,65 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+This file contains now only code to ensure backward url compatibility with
+versions before 1.6
+*/
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+$url_params=array();
+if ( isset($_GET['cat']) )
+{
+  if ( is_numeric($_GET['cat']) )
+  {
+    $url_params['section'] = 'categories';
+    $result = get_cat_info( $_GET['cat'] );
+    if ( !empty($result) )
+    {
+      $url_params['category'] = $result;
+    }
+  }
+  elseif ( in_array($_GET['cat'],
+              array('best_rated','most_visited','recent_pics','recent_cats')
+                  )
+         )
+  {
+    $url_params['section'] = $_GET['cat'];
+  }
+  else
+  {
+    page_not_found('');
+  }
+}
+
+$url = make_index_url($url_params);
+if (!headers_sent())
+{
+  set_status_header(301);
+  redirect_http( $url );
+}
+redirect ( $url );
+
+?>
Index: tags/2.4.0RC3/comments.php
===================================================================
--- tags/2.4.0RC3/comments.php	(revision 14585)
+++ tags/2.4.0RC3/comments.php	(revision 14585)
@@ -0,0 +1,554 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+define('PHPWG_ROOT_PATH','./');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+if (!$conf['activate_comments'])
+{
+  page_not_found(null);
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+$sort_order = array(
+  'DESC' => l10n('descending'),
+  'ASC'  => l10n('ascending')
+  );
+
+// sort_by : database fields proposed for sorting comments list
+$sort_by = array(
+  'date' => l10n('comment date'),
+  'image_id' => l10n('photo')
+  );
+
+// items_number : list of number of items to display per page
+$items_number = array(5,10,20,50,'all');
+
+// since when display comments ?
+//
+$since_options = array(
+  1 => array('label' => l10n('today'),
+             'clause' => 'date > '.pwg_db_get_recent_period_expression(1)),
+  2 => array('label' => sprintf(l10n('last %d days'), 7),
+             'clause' => 'date > '.pwg_db_get_recent_period_expression(7)),
+  3 => array('label' => sprintf(l10n('last %d days'), 30),
+             'clause' => 'date > '.pwg_db_get_recent_period_expression(30)),
+  4 => array('label' => l10n('the beginning'),
+             'clause' => '1=1') // stupid but generic
+  );
+
+if (!empty($_GET['since']) && is_numeric($_GET['since']))
+{
+  $page['since'] = $_GET['since'];
+}
+else
+{
+  $page['since'] = 4;
+}
+
+// on which field sorting
+//
+$page['sort_by'] = 'date';
+// if the form was submitted, it overloads default behaviour
+if (isset($_GET['sort_by']) and isset($sort_by[$_GET['sort_by']]) )
+{
+  $page['sort_by'] = $_GET['sort_by'];
+}
+
+// order to sort
+//
+$page['sort_order'] = 'DESC';
+// if the form was submitted, it overloads default behaviour
+if (isset($_GET['sort_order']) and isset($sort_order[$_GET['sort_order']]))
+{
+  $page['sort_order'] = $_GET['sort_order'];
+}
+
+// number of items to display
+//
+$page['items_number'] = 10;
+if (isset($_GET['items_number']))
+{
+  $page['items_number'] = $_GET['items_number'];
+}
+if ( !is_numeric($page['items_number']) and $page['items_number']!='all' )
+{
+  $page['items_number'] = 10;
+}
+
+$page['where_clauses'] = array();
+
+// which category to filter on ?
+if (isset($_GET['cat']) and 0 != $_GET['cat'])
+{
+  check_input_parameter('cat', $_GET, false, PATTERN_ID);
+
+  $category_ids = get_subcat_ids(array($_GET['cat']));
+  if (empty($category_ids))
+  {
+    $category_ids = array(-1);
+  }
+
+  $page['where_clauses'][] =
+    'category_id IN ('.implode(',', $category_ids).')';
+}
+
+// search a particular author
+if (!empty($_GET['author']))
+{
+  $page['where_clauses'][] =
+    'u.'.$conf['user_fields']['username'].' = \''.$_GET['author'].'\'
+     OR author = \''.$_GET['author'].'\'';
+}
+
+// search a specific comment (if you're coming directly from an admin
+// notification email)
+if (!empty($_GET['comment_id']))
+{
+  check_input_parameter('comment_id', $_GET, false, PATTERN_ID);
+
+  // currently, the $_GET['comment_id'] is only used by admins from email
+  // for management purpose (validate/delete)
+  if (!is_admin())
+  {
+    $login_url =
+      get_root_url().'identification.php?redirect='
+      .urlencode(urlencode($_SERVER['REQUEST_URI']))
+      ;
+    redirect($login_url);
+  }
+
+  $page['where_clauses'][] = 'com.id = '.$_GET['comment_id'];
+}
+
+// search a substring among comments content
+if (!empty($_GET['keyword']))
+{
+  $page['where_clauses'][] =
+    '('.
+    implode(' AND ',
+            array_map(
+              create_function(
+                '$s',
+                'return "content LIKE \'%$s%\'";'
+                ),
+              preg_split('/[\s,;]+/', $_GET['keyword'] )
+              )
+      ).
+    ')';
+}
+
+$page['where_clauses'][] = $since_options[$page['since']]['clause'];
+
+// which status to filter on ?
+if ( !is_admin() )
+{
+  $page['where_clauses'][] = 'validated=\'true\'';
+}
+
+$page['where_clauses'][] = get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'category_id',
+        'visible_categories' => 'category_id',
+        'visible_images' => 'ic.image_id'
+      ),
+    '', true
+  );
+
+// +-----------------------------------------------------------------------+
+// |                         comments management                           |
+// +-----------------------------------------------------------------------+
+
+$comment_id = null;
+$action = null;
+
+$actions = array('delete', 'validate', 'edit');
+foreach ($actions as $loop_action)
+{
+  if (isset($_GET[$loop_action]))
+  {
+    $action = $loop_action;
+    check_input_parameter($action, $_GET, false, PATTERN_ID);
+    $comment_id = $_GET[$action];
+    break;
+  }
+}
+
+if (isset($action))
+{
+  $comment_author_id = get_comment_author_id($comment_id);
+
+  if (can_manage_comment($action, $comment_author_id))
+  {
+    $perform_redirect = false;
+
+    if ('delete' == $action)
+    {
+      check_pwg_token();
+      delete_user_comment($comment_id);
+      $perform_redirect = true;
+    }
+
+    if ('validate' == $action)
+    {
+      check_pwg_token();
+      validate_user_comment($comment_id);
+      $perform_redirect = true;
+    }
+
+    if ('edit' == $action)
+    {
+      if (!empty($_POST['content']))
+      {
+        check_pwg_token();
+        update_user_comment(
+          array(
+            'comment_id' => $_GET['edit'],
+            'image_id' => $_POST['image_id'],
+            'content' => $_POST['content']
+            ),
+          $_POST['key']
+          );
+
+        $perform_redirect = true;
+      }
+      else
+      {
+        $edit_comment = $_GET['edit'];
+      }
+    }
+
+    if ($perform_redirect)
+    {
+      $redirect_url =
+        PHPWG_ROOT_PATH
+        .'comments.php'
+        .get_query_string_diff(array('delete','edit','validate','pwg_token'));
+
+      redirect($redirect_url);
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                       page header and options                         |
+// +-----------------------------------------------------------------------+
+
+$title= l10n('User comments');
+$page['body_id'] = 'theCommentsPage';
+
+$template->set_filenames(array('comments'=>'comments.tpl'));
+$template->assign(
+  array(
+    'F_ACTION'=>PHPWG_ROOT_PATH.'comments.php',
+    'F_KEYWORD'=> @htmlspecialchars(stripslashes($_GET['keyword'], ENT_QUOTES, 'utf-8')),
+    'F_AUTHOR'=> @htmlspecialchars(stripslashes($_GET['author'], ENT_QUOTES, 'utf-8')),
+    )
+  );
+
+// +-----------------------------------------------------------------------+
+// |                          form construction                            |
+// +-----------------------------------------------------------------------+
+
+// Search in a particular category
+$blockname = 'categories';
+
+$query = '
+SELECT id, name, uppercats, global_rank
+  FROM '.CATEGORIES_TABLE.'
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'id',
+        'visible_categories' => 'id'
+      ),
+    'WHERE'
+  ).'
+;';
+display_select_cat_wrapper($query, array(@$_GET['cat']), $blockname, true);
+
+// Filter on recent comments...
+$tpl_var=array();
+foreach ($since_options as $id => $option)
+{
+  $tpl_var[ $id ] = $option['label'];
+}
+$template->assign( 'since_options', $tpl_var);
+$template->assign( 'since_options_selected', $page['since']);
+
+// Sort by
+$template->assign( 'sort_by_options', $sort_by);
+$template->assign( 'sort_by_options_selected', $page['sort_by']);
+
+// Sorting order
+$template->assign( 'sort_order_options', $sort_order);
+$template->assign( 'sort_order_options_selected', $page['sort_order']);
+
+
+// Number of items
+$blockname = 'items_number_option';
+$tpl_var=array();
+foreach ($items_number as $option)
+{
+  $tpl_var[ $option ] = is_numeric($option) ? $option : l10n($option);
+}
+$template->assign( 'item_number_options', $tpl_var);
+$template->assign( 'item_number_options_selected', $page['items_number']);
+
+
+// +-----------------------------------------------------------------------+
+// |                            navigation bar                             |
+// +-----------------------------------------------------------------------+
+
+if (isset($_GET['start']) and is_numeric($_GET['start']))
+{
+  $start = $_GET['start'];
+}
+else
+{
+  $start = 0;
+}
+
+$query = '
+SELECT COUNT(DISTINCT(com.id))
+  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
+    INNER JOIN '.COMMENTS_TABLE.' AS com
+    ON ic.image_id = com.image_id
+    LEFT JOIN '.USERS_TABLE.' As u
+    ON u.'.$conf['user_fields']['id'].' = com.author_id
+  WHERE '.implode('
+    AND ', $page['where_clauses']).'
+;';
+list($counter) = pwg_db_fetch_row(pwg_query($query));
+
+$url = PHPWG_ROOT_PATH
+    .'comments.php'
+  .get_query_string_diff(array('start','delete','validate','pwg_token'));
+
+$navbar = create_navigation_bar($url,
+                                $counter,
+                                $start,
+                                $page['items_number'],
+                                '');
+
+$template->assign('navbar', $navbar);
+
+// +-----------------------------------------------------------------------+
+// |                        last comments display                          |
+// +-----------------------------------------------------------------------+
+
+$comments = array();
+$element_ids = array();
+$category_ids = array();
+
+$query = '
+SELECT com.id AS comment_id,
+       com.image_id,
+       com.author,
+       com.author_id,
+       com.date,
+       com.content,
+       com.validated
+  FROM '.IMAGE_CATEGORY_TABLE.' AS ic
+    INNER JOIN '.COMMENTS_TABLE.' AS com
+    ON ic.image_id = com.image_id
+    LEFT JOIN '.USERS_TABLE.' As u
+    ON u.'.$conf['user_fields']['id'].' = com.author_id
+  WHERE '.implode('
+    AND ', $page['where_clauses']).'
+  GROUP BY comment_id,
+       com.image_id,
+       com.author,
+       com.author_id,
+       com.date,
+       com.content,
+       com.validated
+  ORDER BY '.$page['sort_by'].' '.$page['sort_order'];
+if ('all' != $page['items_number'])
+{
+  $query.= '
+  LIMIT '.$page['items_number'].' OFFSET '.$start;
+}
+$query.= '
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($comments, $row);
+  array_push($element_ids, $row['image_id']);
+}
+
+if (count($comments) > 0)
+{
+  // retrieving element informations
+  $elements = array();
+  $query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $element_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $elements[$row['id']] = $row;
+  }
+
+  // retrieving category informations
+  $query = '
+SELECT c.id, name, permalink, uppercats, com.id as comment_id
+  FROM '.CATEGORIES_TABLE.' AS c
+  LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
+  ON c.id=ic.category_id
+  LEFT JOIN '.COMMENTS_TABLE.' AS com
+  ON ic.image_id=com.image_id
+  '.get_sql_condition_FandF
+    (
+      array
+      (
+	'forbidden_categories' => 'c.id',
+	'visible_categories' => 'c.id'
+       ),
+      'WHERE'
+     ).'
+;';
+  $categories = hash_from_query($query, 'comment_id');
+
+  foreach ($comments as $comment)
+  {
+    if (!empty($elements[$comment['image_id']]['name']))
+    {
+      $name=$elements[$comment['image_id']]['name'];
+    }
+    else
+    {
+      $name=get_name_from_file($elements[$comment['image_id']]['file']);
+    }
+
+    // source of the thumbnail picture
+    $src_image = new SrcImage($elements[$comment['image_id']]);
+
+    // link to the full size picture
+    $url = make_picture_url(
+      array(
+        'category' => $categories[ $comment['comment_id'] ],
+        'image_id' => $comment['image_id'],
+        'image_file' => $elements[$comment['image_id']]['file'],
+        )
+      );
+
+    $tpl_comment = array(
+      'ID' => $comment['comment_id'],
+      'U_PICTURE' => $url,
+      'src_image' => $src_image,
+      'ALT' => $name,
+      'AUTHOR' => trigger_event('render_comment_author', $comment['author']),
+      'DATE'=>format_date($comment['date'], true),
+      'CONTENT'=>trigger_event('render_comment_content',$comment['content']),
+      );
+
+    if (can_manage_comment('delete', $comment['author_id']))
+    {
+      $url =
+        get_root_url()
+        .'comments.php'
+        .get_query_string_diff(array('delete','validate','edit', 'pwg_token'));
+
+      $tpl_comment['U_DELETE'] = add_url_params(
+        $url,
+        array(
+          'delete' => $comment['comment_id'],
+          'pwg_token' => get_pwg_token(),
+          )
+        );
+    }
+
+    if (can_manage_comment('edit', $comment['author_id']))
+    {
+      $url =
+        get_root_url()
+        .'comments.php'
+	.get_query_string_diff(array('edit', 'delete','validate', 'pwg_token'));
+
+      $tpl_comment['U_EDIT'] = add_url_params(
+        $url,
+        array(
+          'edit' => $comment['comment_id']
+          )
+        );
+
+      if (isset($edit_comment) and ($comment['comment_id'] == $edit_comment))
+      {
+        $tpl_comment['IN_EDIT'] = true;
+        $key = get_ephemeral_key(2, $comment['image_id']);
+        $tpl_comment['KEY'] = $key;
+        $tpl_comment['IMAGE_ID'] = $comment['image_id'];
+        $tpl_comment['CONTENT'] = $comment['content'];
+        $tpl_comment['PWG_TOKEN'] = get_pwg_token();
+      }
+    }
+
+    if (can_manage_comment('validate', $comment['author_id']))
+    {
+      if ('true' != $comment['validated'])
+      {
+        $tpl_comment['U_VALIDATE'] = add_url_params(
+          $url,
+          array(
+            'validate'=> $comment['comment_id'],
+            'pwg_token' => get_pwg_token(),
+            )
+          );
+      }
+    }
+    $template->append('comments', $tpl_comment);
+  }
+}
+
+$derivative_params = trigger_event('get_comments_derivative_params', ImageStdParams::get_by_type(IMG_THUMB) );
+$template->assign( 'derivative_params', $derivative_params );
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theCommentsPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('comments');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/doc/COPYING
===================================================================
--- tags/2.4.0RC3/doc/COPYING	(revision 14585)
+++ tags/2.4.0RC3/doc/COPYING	(revision 14585)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: tags/2.4.0RC3/doc/README_ca.txt
===================================================================
--- tags/2.4.0RC3/doc/README_ca.txt	(revision 14585)
+++ tags/2.4.0RC3/doc/README_ca.txt	(revision 14585)
@@ -0,0 +1,61 @@
+=======
+Piwigo
+=======
+
+Lloc Web:       http://piwigo.org
+Instal·lació:   http://piwigo.org/basics/installation
+Actualització:  http://piwigo.org/basics/upgrade
+
+Com començar
+============
+
+Un cop instal·lat o actualitzat, la galeria està a punt per funcionar. 
+Situa't al directori d'instal·lació del teu navegador:
+
+http://el.teu.domini/photos
+
+A continuació, identifica't com a administrador. Apareixerà un nou enllaç 
+a la pàgina del menú d'identificació: Administració. Aneu al panell d'administració.
+
+Al panell d'administració, pren-te tot el temps que et calgui per llegir 
+detingudament les instruccions que expliquen com utilitzar la galeria PIWIGO.
+
+Comunicació
+=============
+
+Butlletí de notícies
+--------------------
+
+http://piwigo.org/basics/newsletter
+
+És *altament* recomanable inscriu-re's al butlletí de Piwigo.
+Tot i què aqusta secció té poquíssim moviment, podràs assabentar-te
+de la notificació d'errors greus o del llançament de noves versions de Piwigo.
+
+Estigues al dia
+---------------
+
+http://freecode.com/projects/piwigo
+
+Mantinguet informat per a cada nova versió, tant estable com en desenvolupament.
+El butlletí de notícies no envia notificacions de les versions en desenvolupament.
+
+Registre d'errors
+-----------------
+
+http://piwigo.org/bugs
+
+Errors i registre i seguiment de canvis. La millor forma de tindre els errors corregits:
+No te n'oblidis. (així com el fòrum).
+
+Documentació
+------------
+
+http://piwigo.org/doc
+
+Documentació Wiki: Tothom pot participar per millorar el contingut de la documentació.
+
+Fòrum
+-----
+
+http://piwigo.org/forum
Index: tags/2.4.0RC3/doc/README_en.txt
===================================================================
--- tags/2.4.0RC3/doc/README_en.txt	(revision 14585)
+++ tags/2.4.0RC3/doc/README_en.txt	(revision 14585)
@@ -0,0 +1,62 @@
+=======
+Piwigo
+=======
+
+website:        http://piwigo.org
+Installation:   http://piwigo.org/basics/installation
+Upgrade:        http://piwigo.org/basics/upgrade
+
+How to start
+============
+
+Once installed or upgraded, your gallery is ready to run. Start by
+displaying the installation directory in your browser :
+
+http://your.domain/photos
+
+Then identify as an administrator. A new link in Identification menu of main
+page will appear : Administration. Enter the administration panel.
+
+In the administration panel, take all your time for reading instructions
+explaining how to use your gallery.
+
+Communication
+=============
+
+Newsletter
+----------
+
+http://piwigo.org/basics/newsletter
+
+It is *highly* recommended to subscribe to Piwigo newsletter. This is
+extremely low-traffic, but will provide you with announcements of new
+Piwigo releases and serious bug notification.
+
+Freshmeat
+---------
+
+http://freecode.com/projects/piwigo
+
+Want to stay informed at each release, stable and development
+release. Development releases notification are not send in the newsletter.
+
+Bugtracker
+----------
+
+http://piwigo.org/bugs
+
+Bugs and change requests tracking. The best way to have your bug corrected:
+it won't be forgotten (as in the forum).
+
+Documentation
+-------------
+
+http://piwigo.org/doc
+
+Wiki documentation: everyone can participate to improve documentation
+content.
+
+Forum
+-----
+
+http://piwigo.org/forum
Index: tags/2.4.0RC3/doc/README_fr.txt
===================================================================
--- tags/2.4.0RC3/doc/README_fr.txt	(revision 14585)
+++ tags/2.4.0RC3/doc/README_fr.txt	(revision 14585)
@@ -0,0 +1,74 @@
+=======
+Piwigo
+=======
+
+Site web:        http://fr.piwigo.org
+Installation:    http://fr.piwigo.org/basics/installation
+Mise à jour:     http://fr.piwigo.org/basics/upgrade
+
+Prendre un bon départ
+=====================
+
+Une fois installée ou mise à jour, votre galerie est prête à
+fonctionner. Commencez par vous rendre sur le répertoire d'installation dans
+votre navigateur : 
+
+http://votre.domaine/photos
+
+Ensuite, identifiez-vous en tant qu'un administrateur. Un nouveau lien dans
+le menu d'identification de la page principale va apparaître :
+Administration. Suivre ce lien :-)
+
+Dans la zone d'administration, prenez tout le temps nécessaire pour
+consulter les instructions, expliquant comment utiliser votre galerie.
+
+Communication
+=============
+
+Newsletter
+----------
+
+http://fr.piwigo.org/basics/newsletter
+
+Il est *fortement* recommandé de souscrire à la newsletter de
+Piwigo. Très peu de mails sont envoyés, mais les informations sont
+importantes : nouvelles versions de l'application, notification de bugs
+importants (relatifs à la sécurité).
+
+Freshmeat
+---------
+
+http://freecode.com/projects/piwigo
+
+Permet d'être au courant des sorties de toutes les releases, et en
+exclusivité les builds de la branche de développement (ce qui n'est pas
+prévu sur les mailing lists "announce").
+
+Outil de suivi de bogues
+------------------------
+
+http://piwigo.org/bugs
+
+Gestion des bugs, mais aussi demande de nouvelles fonctionnalités. Rien de
+plus efficace pour qu'un bug soit corrigé : tant qu'il ne l'est pas, la
+"fiche" reste là à attendre, on ne l'oublie pas comme un topic sur le
+forum.
+
+Les demandes d'évolutions sont également gérées dans cet outil. Ce n'est pas
+forcément idéal car il ne s'agit pas de la même chose, mais le suivi du dev
+d'une nouvelle fonctionnalité peut se modéliser de la même façon que le
+suivi de la correction d'un bug.
+
+Documentation
+-------------
+
+http://fr.piwigo.org/doc
+
+Forum de discussion
+-------------------
+
+http://fr.piwigo.org/forum
+
+Un forum est disponible et recommandé pour toutes les questions autres que
+les demandes d'évolution et rapport de bogue (installation, discussions
+techniques).
Index: tags/2.4.0RC3/doc/index.php
===================================================================
--- tags/2.4.0RC3/doc/index.php	(revision 14585)
+++ tags/2.4.0RC3/doc/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/feed.php
===================================================================
--- tags/2.4.0RC3/feed.php	(revision 14585)
+++ tags/2.4.0RC3/feed.php	(revision 14585)
@@ -0,0 +1,201 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+/**
+ * creates a Unix timestamp (number of seconds since 1970-01-01 00:00:00
+ * GMT) from a MySQL datetime format (2005-07-14 23:01:37)
+ *
+ * @param string mysql datetime format
+ * @return int timestamp
+ */
+function datetime_to_ts($datetime)
+{
+  return strtotime($datetime);
+}
+
+/**
+ * creates an ISO 8601 format date (2003-01-20T18:05:41+04:00) from Unix
+ * timestamp (number of seconds since 1970-01-01 00:00:00 GMT)
+ *
+ * function copied from Dotclear project http://dotclear.net
+ *
+ * @param int timestamp
+ * @return string ISO 8601 date format
+ */
+function ts_to_iso8601($ts)
+{
+  $tz = date('O',$ts);
+  $tz = substr($tz, 0, -2).':'.substr($tz, -2);
+  return date('Y-m-d\\TH:i:s',$ts).$tz;
+}
+
+// +-----------------------------------------------------------------------+
+// |                            initialization                             |
+// +-----------------------------------------------------------------------+
+
+check_input_parameter('feed', $_GET, false, '/^[0-9a-z]{50}$/i');
+
+$feed_id= isset($_GET['feed']) ? $_GET['feed'] : '';
+$image_only=isset($_GET['image_only']);
+
+// echo '<pre>'.generate_key(50).'</pre>';
+if ( !empty($feed_id) )
+{
+  $query = '
+SELECT user_id,
+       last_check
+  FROM '.USER_FEED_TABLE.'
+  WHERE id = \''.$feed_id.'\'
+;';
+  $feed_row = pwg_db_fetch_assoc(pwg_query($query));
+  if ( empty($feed_row) )
+  {
+    page_not_found(l10n('Unknown feed identifier'));
+  }
+  if ($feed_row['user_id']!=$user['id'])
+  { // new user
+    $user = build_user( $feed_row['user_id'], true );
+  }
+}
+else
+{
+  $image_only = true;
+  if (!is_a_guest())
+  {// auto session was created - so switch to guest
+    $user = build_user( $conf['guest_id'], true );
+  }
+}
+
+// Check the status now after the user has been loaded
+check_status(ACCESS_GUEST);
+
+list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+
+include_once(PHPWG_ROOT_PATH.'include/feedcreator.class.php');
+
+set_make_full_url();
+
+$rss = new UniversalFeedCreator();
+$rss->encoding=get_pwg_charset();
+$rss->title = $conf['gallery_title'];
+$rss->title.= ' (as '.stripslashes($user['username']).')';
+
+$rss->link = get_gallery_home_url();
+
+// +-----------------------------------------------------------------------+
+// |                            Feed creation                              |
+// +-----------------------------------------------------------------------+
+
+$news = array();
+if (!$image_only)
+{
+  $news = news($feed_row['last_check'], $dbnow, true, true);
+
+  if (count($news) > 0)
+  {
+    $item = new FeedItem();
+    $item->title = sprintf(l10n('New on %s'), format_date($dbnow) );
+    $item->link = get_gallery_home_url();
+
+    // content creation
+    $item->description = '<ul>';
+    foreach ($news as $line)
+    {
+      $item->description.= '<li>'.$line.'</li>';
+    }
+    $item->description.= '</ul>';
+    $item->descriptionHtmlSyndicated = true;
+
+    $item->date = ts_to_iso8601(datetime_to_ts($dbnow));
+    $item->author = $conf['rss_feed_author'];
+    $item->guid= sprintf('%s', $dbnow);;
+
+    $rss->addItem($item);
+
+    $query = '
+UPDATE '.USER_FEED_TABLE.'
+  SET last_check = \''.$dbnow.'\'
+  WHERE id = \''.$feed_id.'\'
+;';
+    pwg_query($query);
+  }
+}
+
+if ( !empty($feed_id) and empty($news) )
+{// update the last check from time to time to avoid deletion by maintenance tasks
+  if ( !isset($feed_row['last_check'])
+    or time()-datetime_to_ts($feed_row['last_check']) > 30*24*3600 )
+  {
+    $query = '
+UPDATE '.USER_FEED_TABLE.'
+  SET last_check = '.pwg_db_get_recent_period_expression(-15, $dbnow).'
+  WHERE id = \''.$feed_id.'\'
+;';
+    pwg_query($query);
+  }
+}
+
+$dates = get_recent_post_dates_array($conf['recent_post_dates']['RSS']);
+
+foreach($dates as $date_detail)
+{ // for each recent post date we create a feed item
+  $item = new FeedItem();
+  $date = $date_detail['date_available'];
+  $item->title = get_title_recent_post_date($date_detail);
+  $item->link = make_index_url(
+        array(
+          'chronology_field' => 'posted',
+          'chronology_style'=> 'monthly',
+          'chronology_view' => 'calendar',
+          'chronology_date' => explode('-', substr($date,0,10) )
+        )
+      );
+
+  $item->description .=
+    '<a href="'.make_index_url().'">'.$conf['gallery_title'].'</a><br> ';
+
+  $item->description .= get_html_description_recent_post_date($date_detail);
+
+  $item->descriptionHtmlSyndicated = true;
+
+  $item->date = ts_to_iso8601(datetime_to_ts($date));
+  $item->author = $conf['rss_feed_author'];
+  $item->guid= sprintf('%s', 'pics-'.$date);;
+
+  $rss->addItem($item);
+}
+
+$fileName= PHPWG_ROOT_PATH.$conf['data_location'].'tmp';
+mkgetdir($fileName); // just in case
+$fileName.='/feed.xml';
+// send XML feed
+echo $rss->saveFeed('RSS2.0', $fileName, true);
+?>
Index: tags/2.4.0RC3/galleries/index.php
===================================================================
--- tags/2.4.0RC3/galleries/index.php	(revision 14585)
+++ tags/2.4.0RC3/galleries/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/i.php
===================================================================
--- tags/2.4.0RC3/i.php	(revision 14585)
+++ tags/2.4.0RC3/i.php	(revision 14585)
@@ -0,0 +1,599 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+
+// fast bootstrap - no db connection
+include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+
+defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
+defined('PWG_DERIVATIVE_DIR') or define('PWG_DERIVATIVE_DIR', $conf['data_location'].'i/');
+
+@include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php');
+
+
+function trigger_action() {}
+function get_extension( $filename )
+{
+  return substr( strrchr( $filename, '.' ), 1, strlen ( $filename ) );
+}
+
+function mkgetdir($dir)
+{
+  if ( !is_dir($dir) )
+  {
+    global $conf;
+    if (substr(PHP_OS, 0, 3) == 'WIN')
+    {
+      $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);
+    }
+    $umask = umask(0);
+    $mkd = @mkdir($dir, $conf['chmod_value'], true);
+    umask($umask);
+    if ($mkd==false)
+    {
+      return false;
+    }
+
+    $file = $dir.'/index.htm';
+    file_exists($file) or @file_put_contents( $file, 'Not allowed!' );
+  }
+  if ( !is_writable($dir) )
+  {
+    return false;
+  }
+  return true;
+}
+
+// end fast bootstrap
+
+function ilog()
+{
+  global $conf;
+  if (!$conf['enable_i_log']) return;
+
+  $line = date("c");
+  foreach( func_get_args() as $arg)
+  {
+    $line .= ' ';
+    if (is_array($arg))
+    {
+      $line .= implode(' ', $arg);
+    }
+    else
+    {
+      $line .= $arg;
+    }
+  }
+	$file=PHPWG_ROOT_PATH.$conf['data_location'].'tmp/i.log';
+  if (false == file_put_contents($file, $line."\n", FILE_APPEND))
+	{
+		mkgetdir(dirname($file));
+	}
+}
+
+function ierror($msg, $code)
+{
+  if ($code==301 || $code==302)
+  {
+    if (ob_get_length () !== FALSE)
+    {
+      ob_clean();
+    }
+    // default url is on html format
+    $url = html_entity_decode($msg);
+    header('Request-URI: '.$url);
+    header('Content-Location: '.$url);
+    header('Location: '.$url);
+    exit;
+  }
+  if ($code>=400)
+  {
+    $protocol = $_SERVER["SERVER_PROTOCOL"];
+    if ( ('HTTP/1.1' != $protocol) && ('HTTP/1.0' != $protocol) )
+      $protocol = 'HTTP/1.0';
+
+    header( "$protocol $code $msg", true, $code );
+  }
+  //todo improve
+  echo $msg;
+  exit;
+}
+
+function time_step( &$step )
+{
+  $tmp = $step;
+  $step = microtime(true);
+  return intval(1000*($step - $tmp));
+}
+
+function url_to_size($s)
+{
+  $pos = strpos($s, 'x');
+  if ($pos===false)
+  {
+    return array((int)$s, (int)$s);
+  }
+  return array((int)substr($s,0,$pos), (int)substr($s,$pos+1));
+}
+
+function parse_custom_params($tokens)
+{
+  if (count($tokens)<1)
+    ierror('Empty array while parsing Sizing', 400);
+
+  $crop = 0;
+  $min_size = null;
+
+  $token = array_shift($tokens);
+  if ($token[0]=='s')
+  {
+    $size = url_to_size( substr($token,1) );
+  }
+  elseif ($token[0]=='e')
+  {
+    $crop = 1;
+    $size = $min_size = url_to_size( substr($token,1) );
+  }
+  else
+  {
+    $size = url_to_size( $token );
+    if (count($tokens)<2)
+      ierror('Sizing arr', 400);
+
+    $token = array_shift($tokens);
+    $crop = char_to_fraction($token);
+
+    $token = array_shift($tokens);
+    $min_size = url_to_size( $token );
+  }
+  return new DerivativeParams( new SizingParams($size, $crop, $min_size) );
+}
+
+function parse_request()
+{
+  global $conf, $page;
+
+  if ( $conf['question_mark_in_urls']==false and
+       isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) )
+  {
+    $req = $_SERVER["PATH_INFO"];
+    $req = str_replace('//', '/', $req);
+    $path_count = count( explode('/', $req) );
+    $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1);
+  }
+  else
+  {
+    $req = $_SERVER["QUERY_STRING"];
+    if ($pos=strpos($req, '&'))
+    {
+      $req = substr($req, 0, $pos);
+    }
+    /*foreach (array_keys($_GET) as $keynum => $key)
+    {
+      $req = $key;
+      break;
+    }*/
+    $page['root_path'] = PHPWG_ROOT_PATH;
+  }
+
+  $req = ltrim($req, '/');
+
+  foreach (preg_split('#/+#', $req) as $token)
+  {
+    preg_match($conf['sync_chars_regex'], $token) or ierror('Invalid chars in request', 400);
+  }
+  
+  $page['derivative_path'] = PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$req;
+
+  $pos = strrpos($req, '.');
+  $pos!== false || ierror('Missing .', 400);
+  $ext = substr($req, $pos);
+  $page['derivative_ext'] = $ext;
+  $req = substr($req, 0, $pos);
+
+  $pos = strrpos($req, '-');
+  $pos!== false || ierror('Missing -', 400);
+  $deriv = substr($req, $pos+1);
+  $req = substr($req, 0, $pos);
+
+  $deriv = explode('_', $deriv);
+  foreach (ImageStdParams::get_defined_type_map() as $type => $params)
+  {
+    if ( derivative_to_url($type) == $deriv[0])
+    {
+      $page['derivative_type'] = $type;
+      $page['derivative_params'] = $params;
+      break;
+    }
+  }
+
+  if (!isset($page['derivative_type']))
+  {
+    if (derivative_to_url(IMG_CUSTOM) == $deriv[0])
+    {
+      $page['derivative_type'] = IMG_CUSTOM;
+    }
+    else
+    {
+      ierror('Unknown parsing type', 400);
+    }
+  }
+  array_shift($deriv);
+
+  if ($page['derivative_type'] == IMG_CUSTOM)
+  {
+    $params = $page['derivative_params'] = parse_custom_params($deriv);
+    ImageStdParams::apply_global($params);
+
+    if ($params->sizing->ideal_size[0] < 20 or $params->sizing->ideal_size[1] < 20)
+    {
+      ierror('Invalid size', 400);
+    }
+    if ($params->sizing->max_crop < 0 or $params->sizing->max_crop > 1)
+    {
+      ierror('Invalid crop', 400);
+    }
+    $greatest = ImageStdParams::get_by_type(IMG_XXLARGE);
+
+    $key = array();
+    $params->add_url_tokens($key);
+    $key = implode('_', $key);
+    if (!isset(ImageStdParams::$custom[$key]))
+    {
+      ierror('Size not allowed', 403);
+    }
+  }
+
+  if (is_file(PHPWG_ROOT_PATH.$req.$ext))
+  {
+    $req = './'.$req; // will be used to match #iamges.path
+  }
+  elseif (is_file(PHPWG_ROOT_PATH.'../'.$req.$ext))
+  {
+    $req = '../'.$req;
+  }
+
+  $page['src_location'] = $req.$ext;
+  $page['src_path'] = PHPWG_ROOT_PATH.$page['src_location'];
+  $page['src_url'] = $page['root_path'].$page['src_location'];
+}
+
+function try_switch_source(DerivativeParams $params, $original_mtime)
+{
+  global $page;
+  $candidates = array();
+  foreach(ImageStdParams::get_defined_type_map() as $candidate)
+  {
+    if ($candidate->type == $params->type)
+      continue;
+    if ($candidate->use_watermark != $params->use_watermark)
+      continue;
+    if ($candidate->max_width() < $params->max_width() || $candidate->max_height() < $params->max_height())
+      continue;
+    if ($params->sizing->max_crop==0)
+    {
+      if ($candidate->sizing->max_crop!=0)
+        continue;
+    }
+    else
+    {
+      if ($candidate->sizing->max_crop!=0)
+        continue; // this could be optimized
+      if (!isset($page['original_size']))
+        continue;
+      $candidate_size = $candidate->compute_final_size($page['original_size']);
+      if ($candidate_size[0] < $params->sizing->min_size[0] || $candidate_size[1] < $params->sizing->min_size[1] )
+        continue;
+    }
+    $candidates[] = $candidate;
+  }
+
+  foreach( array_reverse($candidates) as $candidate)
+  {
+    $candidate_path = $page['derivative_path'];
+    $candidate_path = str_replace( '-'.derivative_to_url($params->type), '-'.derivative_to_url($candidate->type), $candidate_path);
+    $candidate_mtime = @filemtime($candidate_path);
+    if ($candidate_mtime === false
+      || $candidate_mtime < $original_mtime
+      || $candidate_mtime < $candidate->last_mod_time)
+      continue;
+    $params->use_watermark = false;
+    $params->sharpen = min(1, $params->sharpen);
+    $page['src_path'] = $candidate_path;
+    $page['src_url'] = $page['root_path'] . substr($candidate_path, strlen(PHPWG_ROOT_PATH));
+    $page['rotation_angle'] = 0;
+  }
+}
+
+function send_derivative($expires)
+{
+  global $page;
+
+  if (isset($_GET['ajaxload']) and $_GET['ajaxload'] == 'true')
+  {
+    include_once(PHPWG_ROOT_PATH.'include/functions_cookie.inc.php');
+    include_once(PHPWG_ROOT_PATH.'include/functions_url.inc.php');
+
+    $response = new json_response();
+    $response->url = embellish_url(get_absolute_root_url().$page['derivative_path']);
+    echo json_encode($response);
+    return;
+  }
+  $fp = fopen($page['derivative_path'], 'rb');
+
+  $fstat = fstat($fp);
+  header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fstat['mtime']).' GMT');
+  if ($expires!==false)
+  {
+    header('Expires: '.gmdate('D, d M Y H:i:s', $expires).' GMT');
+  }
+  header('Content-length: '.$fstat['size']);
+  header('Connection: close');
+
+  $ctype="application/octet-stream";
+  switch (strtolower($page['derivative_ext']))
+  {
+    case ".jpe": case ".jpeg": case ".jpg": $ctype="image/jpeg"; break;
+    case ".png": $ctype="image/png"; break;
+    case ".gif": $ctype="image/gif"; break;
+  }
+  header("Content-Type: $ctype");
+
+  fpassthru($fp);
+  fclose($fp);
+}
+
+class json_response
+{
+  var $url;
+}
+
+$page=array();
+$begin = $step = microtime(true);
+$timing=array();
+foreach( explode(',','load,rotate,crop,scale,sharpen,watermark,save,send') as $k )
+{
+  $timing[$k] = '';
+}
+
+include_once(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
+include_once( PHPWG_ROOT_PATH .'/include/derivative_params.inc.php');
+include_once( PHPWG_ROOT_PATH .'/include/derivative_std_params.inc.php');
+
+try
+{
+  $pwg_db_link = pwg_db_connect($conf['db_host'], $conf['db_user'],
+                                $conf['db_password'], $conf['db_base']);
+}
+catch (Exception $e)
+{
+  ilog("db error", $e->getMessage());
+}
+list($conf['derivatives']) = pwg_db_fetch_row(pwg_query('SELECT value FROM '.$prefixeTable.'config WHERE param=\'derivatives\''));
+ImageStdParams::load_from_db();
+
+
+parse_request();
+//var_export($page);
+
+$params = $page['derivative_params'];
+
+$src_mtime = @filemtime($page['src_path']);
+if ($src_mtime === false)
+{
+  ierror('Source not found', 404);
+}
+
+$need_generate = false;
+$derivative_mtime = @filemtime($page['derivative_path']);
+if ($derivative_mtime === false or
+    $derivative_mtime < $src_mtime or
+    $derivative_mtime < $params->last_mod_time)
+{
+  $need_generate = true;
+}
+
+$expires=false;
+$now = time();
+if ( isset($_GET['b']) )
+{
+  $expires = $now + 100;
+  header("Cache-control: no-store, max-age=100");
+}
+elseif ( $now > (max($src_mtime, $params->last_mod_time) + 24*3600) )
+{// somehow arbitrary - if derivative params or src didn't change for the last 24 hours, we send an expire header for several days
+  $expires = $now + 10*24*3600;
+}
+
+if (!$need_generate)
+{
+  if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] )
+    and strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $derivative_mtime)
+  {// send the last mod time of the file back
+    header('Last-Modified: '.gmdate('D, d M Y H:i:s', $derivative_mtime).' GMT', true, 304);
+    header('Expires: '.gmdate('D, d M Y H:i:s', time()+10*24*3600).' GMT', true, 304);
+    exit;
+  }
+  send_derivative($expires);
+  exit;
+}
+
+include_once(PHPWG_ROOT_PATH . 'admin/include/image.class.php');
+$page['coi'] = null;
+if (strpos($page['src_location'], '/pwg_representative/')===false
+    && strpos($page['src_location'], 'themes/')===false
+    && strpos($page['src_location'], 'plugins/')===false)
+{
+  try
+  {
+    $query = '
+SELECT *
+  FROM '.$prefixeTable.'images
+  WHERE path=\''.$page['src_location'].'\'
+;';
+    
+    if ( ($row=pwg_db_fetch_assoc(pwg_query($query))) )
+    {
+      if (isset($row['width']))
+      {
+        $page['original_size'] = array($row['width'],$row['height']);
+      }
+      $page['coi'] = $row['coi'];
+
+      if (!isset($row['rotation']))
+      {
+        $page['rotation_angle'] = pwg_image::get_rotation_angle($page['src_path']);
+        
+        single_update(
+          $prefixeTable.'images',
+          array('rotation' => pwg_image::get_rotation_code_from_angle($page['rotation_angle'])),
+          array('id' => $row['id'])
+          );
+      }
+      else
+      {
+        $page['rotation_angle'] = pwg_image::get_rotation_angle_from_code($row['rotation']);
+      }
+
+    }
+    if (!$row)
+    {
+      ierror('Db file path not found', 404);
+    }
+  }
+  catch (Exception $e)
+  {
+    ilog("db error", $e->getMessage());
+  }
+}
+mysql_close($pwg_db_link);
+
+try_switch_source($params, $src_mtime);
+
+if (!mkgetdir(dirname($page['derivative_path'])))
+{
+  ierror("dir create error", 500);
+}
+
+ignore_user_abort(true);
+set_time_limit(0);
+
+$image = new pwg_image($page['src_path']);
+$timing['load'] = time_step($step);
+
+$changes = 0;
+
+// rotate
+if (0 != (int)$page['rotation_angle'])
+{
+  $image->rotate($page['rotation_angle']);
+  $changes++;
+  $timing['rotate'] = time_step($step);
+}
+
+// Crop & scale
+$o_size = $d_size = array($image->get_width(),$image->get_height());
+$params->sizing->compute($o_size , $page['coi'], $crop_rect, $scaled_size );
+if ($crop_rect)
+{
+  $changes++;
+  $image->crop( $crop_rect->width(), $crop_rect->height(), $crop_rect->l, $crop_rect->t);
+  $timing['crop'] = time_step($step);
+}
+
+if ($scaled_size)
+{
+  $changes++;
+  $image->resize( $scaled_size[0], $scaled_size[1] );
+  $d_size = $scaled_size;
+  $timing['scale'] = time_step($step);
+}
+
+if ($params->sharpen)
+{
+  $changes += $image->sharpen( $params->sharpen );
+  $timing['sharpen'] = time_step($step);
+}
+
+if ($params->use_watermark)
+{
+  $wm = ImageStdParams::get_watermark();
+  $wm_image = new pwg_image(PHPWG_ROOT_PATH.$wm->file);
+  $wm_size = array($wm_image->get_width(),$wm_image->get_height());
+  if ($d_size[0]<$wm_size[0] or $d_size[1]<$wm_size[1])
+  {
+    $wm_scaling_params = SizingParams::classic($d_size[0], $d_size[1]);
+    $wm_scaling_params->compute($wm_size, null, $tmp, $wm_scaled_size);
+    $wm_size = $wm_scaled_size;
+    $wm_image->resize( $wm_scaled_size[0], $wm_scaled_size[1] );
+  }
+  $x = round( ($wm->xpos/100)*($d_size[0]-$wm_size[0]) );
+  $y = round( ($wm->ypos/100)*($d_size[1]-$wm_size[1]) );
+  if ($image->compose($wm_image, $x, $y, $wm->opacity))
+  {
+    $changes++;
+    if ($wm->xrepeat)
+    {
+      // todo
+      $pad = $wm_size[0] + max(30, round($wm_size[0]/4));
+      for($i=-$wm->xrepeat; $i<=$wm->xrepeat; $i++)
+      {
+        if (!$i) continue;
+        $x2 = $x + $i * $pad;
+        if ($x2>=0 && $x2+$wm_size[0]<$d_size[0])
+          if (!$image->compose($wm_image, $x2, $y, $wm->opacity))
+            break;
+      }
+    }
+  }
+  $wm_image->destroy();
+  $timing['watermark'] = time_step($step);
+}
+
+// no change required - redirect to source
+if (!$changes)
+{
+  header("X-i: No change");
+  ierror( $page['src_url'], 301);
+}
+
+if ($d_size[0]*$d_size[1] < 256000)
+{// strip metadata for small images
+  $image->strip();
+}
+
+$image->set_compression_quality( $params->quality );
+$image->write( $page['derivative_path'] );
+$image->destroy();
+$timing['save'] = time_step($step);
+
+send_derivative($expires);
+$timing['send'] = time_step($step);
+
+ilog('perf',
+  basename($page['src_path']), $o_size, $o_size[0]*$o_size[1],
+  basename($page['derivative_path']), $d_size, $d_size[0]*$d_size[1],
+  function_exists('memory_get_peak_usage') ? round( memory_get_peak_usage()/(1024*1024), 1) : '',
+  time_step($begin),
+  '|', $timing);
+?>
Index: tags/2.4.0RC3/identification.php
===================================================================
--- tags/2.4.0RC3/identification.php	(revision 14585)
+++ tags/2.4.0RC3/identification.php	(revision 14585)
@@ -0,0 +1,112 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//--------------------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_FREE);
+
+//-------------------------------------------------------------- identification
+$redirect_to = '';
+if ( !empty($_GET['redirect']) )
+{
+  $redirect_to = urldecode($_GET['redirect']);
+  if ( is_a_guest() )
+  {
+    array_push($page['errors'], l10n('You are not authorized to access the requested page'));
+  }
+}
+
+if (isset($_POST['login']))
+{
+  if (!isset($_COOKIE[session_name()]))
+  {
+    array_push(
+      $page['errors'],
+      l10n('Cookies are blocked or not supported by your browser. You must enable cookies to connect.')
+      );
+  }
+  else
+  { 
+    if ($conf['insensitive_case_logon'] == true)
+    {
+      $_POST['username'] = search_case_username($_POST['username']);
+    }
+    
+    $redirect_to = isset($_POST['redirect']) ? urldecode($_POST['redirect']) : '';
+    $remember_me = isset($_POST['remember_me']) and $_POST['remember_me']==1;
+    
+    if ( try_log_user($_POST['username'], $_POST['password'], $remember_me) )
+    {
+      redirect(empty($redirect_to) ? get_gallery_home_url() : $redirect_to);
+    }
+    else
+    {
+      array_push($page['errors'], l10n('Invalid password!') );
+    }
+  }
+}
+
+//----------------------------------------------------- template initialization
+//
+// Start output of page
+//
+$title = l10n('Identification');
+$page['body_id'] = 'theIdentificationPage';
+
+$template->set_filenames( array('identification'=>'identification.tpl') );
+
+$template->assign(
+  array(
+    'U_REDIRECT' => $redirect_to,
+
+    'F_LOGIN_ACTION' => get_root_url().'identification.php',
+    'authorize_remembering' => $conf['authorize_remembering'],
+    ));
+
+if (!$conf['gallery_locked'] && $conf['allow_user_registration'])
+{
+  $template->assign('U_REGISTER', get_root_url().'register.php' );
+}
+
+if (!$conf['gallery_locked'])
+{
+  $template->assign('U_LOST_PASSWORD', get_root_url().'password.php' );
+}
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!$conf['gallery_locked'] && (!isset($themeconf['hide_menu_on']) OR !in_array('theIdentificationPage', $themeconf['hide_menu_on'])))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+//----------------------------------------------------------- html code display
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('identification');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/include/block.class.php
===================================================================
--- tags/2.4.0RC3/include/block.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/block.class.php	(revision 14585)
@@ -0,0 +1,214 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class BlockManager
+{
+  protected $id;
+  protected $registered_blocks=array();
+  protected $display_blocks = array();
+
+  public function BlockManager($id)
+  {
+    $this->id = $id;
+  }
+
+  /** triggers an action that allows implementors of menu blocks to register the blocks*/
+  public function load_registered_blocks()
+  {
+    trigger_action('blockmanager_register_blocks', array(&$this) );
+  }
+
+  public function get_id()
+  {
+    return $this->id;
+  }
+
+  public function get_registered_blocks()
+  {
+    return $this->registered_blocks;
+  }
+
+  /** registers a block with this menu. usually called as a result of menubar_register_blocks action
+   * @param MenuBlock block
+  */
+  public function register_block(&$block)
+  {
+    if ( isset($this->registered_blocks[$block->get_id()] ) )
+    {
+      trigger_error("Block '".$block->get_id()."' is already registered", E_USER_WARNING);
+      return false;
+    }
+    $this->registered_blocks[$block->get_id()] = &$block;
+    return true;
+  }
+
+  /** performs one time preparation of registered blocks for display;
+   * triggers the action menubar_prepare_display where implementors can
+   * reposition or hide blocks
+  */
+  public function prepare_display()
+  {
+    global $conf;
+    $conf_id = 'blk_'.$this->id;
+    $mb_conf = isset($conf[$conf_id]) ? $conf[$conf_id] : array();
+    if ( !is_array($mb_conf) )
+      $mb_conf = @unserialize($mb_conf);
+
+    $idx = 1;
+    foreach( $this->registered_blocks as $id => $block )
+    {
+      $pos = isset( $mb_conf[$id] ) ? $mb_conf[$id] : $idx*50;
+      if ( $pos>0 )
+      {
+        $this->display_blocks[$id] = new DisplayBlock($block);
+        $this->display_blocks[$id]->set_position($pos);
+      }
+      $idx++;
+    }
+    $this->sort_blocks();
+    trigger_action( 'blockmanager_prepare_display', array(&$this) );
+    $this->sort_blocks();
+  }
+
+  /** returns true if the block whose id is hidden
+   * @param string block_id
+  */
+  public function is_hidden($block_id)
+  {
+    return isset($this->display_blocks[$block_id]) ? false : true;
+  }
+
+  public function hide_block($block_id)
+  {
+    unset( $this->display_blocks[$block_id] );
+  }
+
+  public function &get_block($block_id)
+  {
+    $tmp = null;
+    if ( isset($this->display_blocks[$block_id]) )
+    {
+      return $this->display_blocks[$block_id];
+    }
+    return $tmp;
+  }
+
+  public function set_block_position($block_id, $position)
+  {
+    if ( isset($this->display_blocks[$block_id]) )
+    {
+      $this->display_blocks[$block_id]->set_position($position);
+    }
+  }
+
+  protected function sort_blocks()
+  {
+    uasort( $this->display_blocks, array('BlockManager', 'cmp_by_position') );
+  }
+
+  static protected function cmp_by_position($a, $b)
+  {
+    return $a->get_position() - $b->get_position();
+  }
+
+  public function apply($var, $file)
+  {
+    global $template;
+
+    $template->set_filename('menubar', $file);
+    trigger_action('blockmanager_apply', array(&$this) );
+
+    foreach( $this->display_blocks as $id=>$block)
+    {
+      if (empty($block->raw_content) and empty($block->template) )
+      {
+        $this->hide_block($id);
+      }
+    }
+    $this->sort_blocks();
+    $template->assign('blocks', $this->display_blocks);
+    $template->assign_var_from_handle($var, 'menubar');
+  }
+}
+
+/**
+ * Represents a menu block registered in a Menu object.
+ */
+class RegisteredBlock
+{
+  protected $id;
+  protected $name;
+  protected $owner;
+
+  public function RegisteredBlock($id, $name, $owner)
+  {
+    $this->id = $id;
+    $this->name = $name;
+    $this->owner = $owner;
+  }
+
+  public function get_id() { return $this->id; }
+  public function get_name() { return $this->name; }
+  public function get_owner() { return $this->owner; }
+}
+
+/**
+ * Represents a menu block ready for display in the Menu object.
+ */
+class DisplayBlock
+{
+  protected $_registeredBlock;
+  protected $_position;
+
+  protected $_title;
+
+  public $data;
+  public $template;
+  public $raw_content;
+
+  public function DisplayBlock($registeredBlock)
+  {
+    $this->_registeredBlock = &$registeredBlock;
+  }
+
+  public function &get_block() { return $this->_registeredBlock; }
+
+  public function get_position() { return $this->_position; }
+  public function set_position($position)
+  {
+    $this->_position = $position;
+  }
+
+  public function get_title()
+  {
+    if (isset($this->_title))
+      return $this->_title;
+    else
+      return $this->_registeredBlock->get_name();
+  }
+
+  public function set_title($title)
+  {
+    $this->_title = $title;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/calendar_base.class.php
===================================================================
--- tags/2.4.0RC3/include/calendar_base.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/calendar_base.class.php	(revision 14585)
@@ -0,0 +1,346 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Base class for monthly and weekly calendar styles
+ */
+class CalendarBase
+{
+  // db column on which this calendar works
+  var $date_field;
+  // used for queries (INNER JOIN or normal)
+  var $inner_sql;
+  //
+  var $calendar_levels;
+
+  /**
+   * Initialize the calendar
+   * @param string inner_sql used for queries (INNER JOIN or normal)
+   */
+  function initialize($inner_sql)
+  {
+    global $page;
+    if ($page['chronology_field']=='posted')
+    {
+      $this->date_field = 'date_available';
+    }
+    else
+    {
+      $this->date_field = 'date_creation';
+    }
+    $this->inner_sql = $inner_sql;
+  }
+
+  function get_display_name()
+  {
+    global $conf, $page;
+    $res = '';
+
+    for ($i=0; $i<count($page['chronology_date']); $i++)
+    {
+      $res .= $conf['level_separator'];
+      if ( isset($page['chronology_date'][$i+1]) )
+      {
+        $chronology_date = array_slice($page['chronology_date'],0, $i+1);
+        $url = duplicate_index_url(
+            array( 'chronology_date'=>$chronology_date ),
+            array( 'start' )
+            );
+        $res .=
+          '<a href="'.$url.'">'
+          .$this->get_date_component_label($i, $page['chronology_date'][$i])
+          .'</a>';
+      }
+      else
+      {
+        $res .=
+          '<span class="calInHere">'
+          .$this->get_date_component_label($i, $page['chronology_date'][$i])
+          .'</span>';
+      }
+    }
+    return $res;
+  }
+
+//--------------------------------------------------------- private members ---
+  /**
+   * Returns a display name for a date component optionally using labels
+  */
+  function get_date_component_label($level, $date_component)
+  {
+    $label = $date_component;
+    if (isset($this->calendar_levels[$level]['labels'][$date_component]))
+    {
+      $label = $this->calendar_levels[$level]['labels'][$date_component];
+    }
+    elseif ('any' === $date_component )
+    {
+      $label = l10n('All');
+    }
+    return $label;
+  }
+
+  /**
+   * Gets a nice display name for a date to be shown in previos/next links.
+   */
+  function get_date_nice_name($date)
+  {
+    $date_components = explode('-', $date);
+    $res = '';
+    for ($i=count($date_components)-1; $i>=0; $i--)
+    {
+      if ('any' !== $date_components[$i])
+      {
+        $label = $this->get_date_component_label($i, $date_components[$i] );
+        if ( $res!='' )
+        {
+          $res .= ' ';
+        }
+        $res .= $label;
+      }
+    }
+    return $res;
+  }
+
+  /**
+   * Creates a calendar navigation bar.
+   *
+   * @param array date_components
+   * @param array items - hash of items to put in the bar (e.g. 2005,2006)
+   * @param bool show_any - adds any link to the end of the bar
+   * @param bool show_empty - shows all labels even those without items
+   * @param array labels - optional labels for items (e.g. Jan,Feb,...)
+   * @return string the navigation bar
+   */
+  function get_nav_bar_from_items($date_components, $items,
+                                  $show_any,
+                                  $show_empty=false, $labels=null)
+  {
+    global $conf, $page, $template;
+
+    $nav_bar_datas=array();
+
+    if ($conf['calendar_show_empty'] and $show_empty and !empty($labels) )
+    {
+      foreach ($labels as $item => $label)
+      {
+        if ( ! isset($items[$item]) )
+        {
+          $items[$item] = -1;
+        }
+      }
+      ksort($items);
+    }
+
+    foreach ($items as $item => $nb_images)
+    {
+      $label = $item;
+      if (isset($labels[$item]))
+      {
+        $label = $labels[$item];
+      }
+      if ($nb_images==-1)
+      {
+        $tmp_datas=array(
+          'LABEL'=> $label
+        );
+      }
+      else
+      {
+        $url = duplicate_index_url(
+          array('chronology_date'=>array_merge($date_components,array($item))),
+          array( 'start' )
+            );
+        $tmp_datas=array(
+          'LABEL'=> $label,
+          'URL' => $url
+        );
+      }
+      if ($nb_images > 0)
+      {
+        $tmp_datas['NB_IMAGES']=$nb_images;
+      }
+      $nav_bar_datas[]=$tmp_datas;
+
+    }
+
+    if ($conf['calendar_show_any'] and $show_any and count($items)>1 and
+          count($date_components)<count($this->calendar_levels)-1 )
+    {
+      $url = duplicate_index_url(
+        array('chronology_date'=>array_merge($date_components,array('any'))),
+        array( 'start' )
+          );
+      $nav_bar_datas[]=array(
+        'LABEL' => l10n('All'),
+        'URL' => $url
+      );
+    }
+
+    return $nav_bar_datas;
+  }
+
+  /**
+   * Creates a calendar navigation bar for a given level.
+   *
+   * @param int level - the level (0-year,1-month/week,2-day)
+   * @return void
+   */
+  function build_nav_bar($level, $labels=null)
+  {
+    global $template, $conf, $page;
+
+    $query = '
+SELECT DISTINCT('.$this->calendar_levels[$level]['sql'].') as period,
+  COUNT(DISTINCT id) as nb_images'.
+$this->inner_sql.
+$this->get_date_where($level).'
+  GROUP BY period;';
+
+    $level_items = simple_hash_from_query($query, 'period', 'nb_images');
+
+    if ( count($level_items)==1 and
+         count($page['chronology_date'])<count($this->calendar_levels)-1)
+    {
+      if ( ! isset($page['chronology_date'][$level]) )
+      {
+        list($key) = array_keys($level_items);
+        $page['chronology_date'][$level] = (int)$key;
+
+        if ( $level<count($page['chronology_date']) and
+             $level!=count($this->calendar_levels)-1 )
+        {
+          return;
+        }
+      }
+    }
+
+    $dates = $page['chronology_date'];
+    while ($level<count($dates))
+    {
+      array_pop($dates);
+    }
+
+    $nav_bar = $this->get_nav_bar_from_items(
+      $dates,
+      $level_items,
+      true,
+      true,
+      isset($labels) ? $labels : $this->calendar_levels[$level]['labels']
+      );
+
+    $template->append(
+      'chronology_navigation_bars',
+      array(
+        'items' => $nav_bar,
+        )
+      );
+  }
+
+  /**
+   * Assigns the next/previous link to the template with regards to
+   * the currently choosen date.
+   */
+  function build_next_prev()
+  {
+    global $template, $page;
+
+    $prev = $next =null;
+    if ( empty($page['chronology_date']) )
+      return;
+    
+    $sub_queries = array();
+    $nb_elements = count($page['chronology_date']);
+    for ($i=0; $i<$nb_elements; $i++)
+    {
+      if ( 'any' === $page['chronology_date'][$i] )
+      {
+        $sub_queries[] = '\'any\'';
+      }
+      else
+      {
+        $sub_queries[] = pwg_db_cast_to_text($this->calendar_levels[$i]['sql']);
+      }
+    }
+    $query = 'SELECT '.pwg_db_concat_ws($sub_queries, '-').' AS period';
+    $query .= $this->inner_sql .'
+AND ' . $this->date_field . ' IS NOT NULL
+GROUP BY period';
+    
+    $current = implode('-', $page['chronology_date'] );
+    $upper_items = array_from_query( $query, 'period');
+
+    usort($upper_items, 'version_compare');
+    $upper_items_rank = array_flip($upper_items);
+    if ( !isset($upper_items_rank[$current]) )
+    {
+      array_push($upper_items, $current);// just in case (external link)
+      usort($upper_items, 'version_compare');
+      $upper_items_rank = array_flip($upper_items);
+    }
+    $current_rank = $upper_items_rank[$current];
+
+    $tpl_var = array();
+
+    if ( $current_rank>0 )
+    { // has previous
+      $prev = $upper_items[$current_rank-1];
+      $chronology_date = explode('-', $prev);
+      $tpl_var['previous'] =
+        array(
+          'LABEL' => $this->get_date_nice_name($prev),
+          'URL' => duplicate_index_url(
+                array('chronology_date'=>$chronology_date), array('start')
+                )
+        );
+    }
+
+    if ( $current_rank < count($upper_items)-1 )
+    { // has next
+      $next = $upper_items[$current_rank+1];
+      $chronology_date = explode('-', $next);
+      $tpl_var['next'] =
+        array(
+          'LABEL' => $this->get_date_nice_name($next),
+          'URL' => duplicate_index_url(
+                array('chronology_date'=>$chronology_date), array('start')
+                )
+        );
+    }
+
+    if ( !empty($tpl_var) )
+    {
+      $existing = & $template->get_template_vars('chronology_navigation_bars');
+      if ( !empty($existing) )
+      {
+        $existing[ sizeof($existing)-1 ] =
+          array_merge( $existing[ sizeof($existing)-1 ], $tpl_var);
+      }
+      else
+      {
+        $template->append( 'chronology_navigation_bars', $tpl_var );
+      }
+    }
+  }
+}
+?>
Index: tags/2.4.0RC3/include/calendar_monthly.class.php
===================================================================
--- tags/2.4.0RC3/include/calendar_monthly.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/calendar_monthly.class.php	(revision 14585)
@@ -0,0 +1,516 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
+
+define ('CYEAR',  0);
+define ('CMONTH', 1);
+define ('CDAY',   2);
+
+/**
+ * Monthly calendar style (composed of years/months and days)
+ */
+class Calendar extends CalendarBase
+{
+
+  /**
+   * Initialize the calendar
+   * @param string inner_sql used for queries (INNER JOIN or normal)
+   */
+  function initialize($inner_sql)
+  {
+    parent::initialize($inner_sql);
+    global $lang;
+    $this->calendar_levels = array(
+      array(
+          'sql'=> pwg_db_get_year($this->date_field),
+          'labels' => null
+        ),
+      array(
+	  'sql'=> pwg_db_get_month($this->date_field),
+	  'labels' => $lang['month']
+        ),
+      array(
+          'sql'=> pwg_db_get_dayofmonth($this->date_field),
+          'labels' => null
+        ),
+     );
+  }
+
+/**
+ * Generate navigation bars for category page
+ * @return boolean false to indicate that thumbnails
+ * where not included here, true otherwise
+ */
+function generate_category_content()
+{
+  global $conf, $page;
+
+  $view_type = $page['chronology_view'];
+  if ($view_type==CAL_VIEW_CALENDAR)
+  {
+    global $template;
+    $tpl_var = array();
+    if ( count($page['chronology_date'])==0 )
+    {//case A: no year given - display all years+months
+      if ($this->build_global_calendar($tpl_var))
+      {
+        $template->assign('chronology_calendar', $tpl_var);
+        return true;
+      }
+    }
+
+    if ( count($page['chronology_date'])==1 )
+    {//case B: year given - display all days in given year
+      if ($this->build_year_calendar($tpl_var))
+      {
+        $template->assign('chronology_calendar', $tpl_var);
+        $this->build_nav_bar(CYEAR); // years
+        return true;
+      }
+    }
+
+    if ( count($page['chronology_date'])==2 )
+    {//case C: year+month given - display a nice month calendar
+      if ( $this->build_month_calendar($tpl_var) )
+      {
+        $template->assign('chronology_calendar', $tpl_var);
+      }
+      $this->build_next_prev();
+      return true;
+    }
+  }
+
+  if ($view_type==CAL_VIEW_LIST or count($page['chronology_date'])==3)
+  {
+    if ( count($page['chronology_date'])==0 )
+    {
+      $this->build_nav_bar(CYEAR); // years
+    }
+    if ( count($page['chronology_date'])==1)
+    {
+      $this->build_nav_bar(CMONTH); // month
+    }
+    if ( count($page['chronology_date'])==2 )
+    {
+      $day_labels = range( 1, $this->get_all_days_in_month(
+              $page['chronology_date'][CYEAR] ,$page['chronology_date'][CMONTH] ) );
+      array_unshift($day_labels, 0);
+      unset( $day_labels[0] );
+      $this->build_nav_bar( CDAY, $day_labels ); // days
+    }
+    $this->build_next_prev();
+  }
+  return false;
+}
+
+
+/**
+ * Returns a sql where subquery for the date field
+ * @param int max_levels return the where up to this level
+ * (e.g. 2=only year and month)
+ * @return string
+ */
+function get_date_where($max_levels=3)
+{
+  global $page;
+
+  $date = $page['chronology_date'];
+  while (count($date)>$max_levels)
+  {
+    array_pop($date);
+  }
+  $res = '';
+  if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
+  {
+    $b = $date[CYEAR] . '-';
+    $e = $date[CYEAR] . '-';
+    if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+    {
+      $b .= sprintf('%02d-', $date[CMONTH]);
+      $e .= sprintf('%02d-', $date[CMONTH]);
+      if (isset($date[CDAY]) and $date[CDAY]!=='any')
+      {
+        $b .= sprintf('%02d', $date[CDAY]);
+        $e .= sprintf('%02d', $date[CDAY]);
+      }
+      else
+      {
+        $b .= '01';
+        $e .= $this->get_all_days_in_month($date[CYEAR], $date[CMONTH]);
+      }
+    }
+    else
+    {
+      $b .= '01-01';
+      $e .= '12-31';
+      if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+      {
+        $res .= ' AND '.$this->calendar_levels[CMONTH]['sql'].'='.$date[CMONTH];
+      }
+      if (isset($date[CDAY]) and $date[CDAY]!=='any')
+      {
+        $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+      }
+    }
+    $res = " AND $this->date_field BETWEEN '$b' AND '$e 23:59:59'" . $res;
+  }
+  else
+  {
+    $res = ' AND '.$this->date_field.' IS NOT NULL';
+    if (isset($date[CMONTH]) and $date[CMONTH]!=='any')
+    {
+      $res .= ' AND '.$this->calendar_levels[CMONTH]['sql'].'='.$date[CMONTH];
+    }
+    if (isset($date[CDAY]) and $date[CDAY]!=='any')
+    {
+      $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+    }
+  }
+  return $res;
+}
+
+
+
+//--------------------------------------------------------- private members ---
+
+// returns an array with all the days in a given month
+function get_all_days_in_month($year, $month)
+{
+  $md= array(1=>31,28,31,30,31,30,31,31,30,31,30,31);
+
+  if ( is_numeric($year) and $month==2)
+  {
+    $nb_days = $md[2];
+    if ( ($year%4==0)  and ( ($year%100!=0) or ($year%400!=0) ) )
+    {
+      $nb_days++;
+    }
+  }
+  elseif ( is_numeric($month) )
+  {
+    $nb_days = $md[ $month ];
+  }
+  else
+  {
+    $nb_days = 31;
+  }
+  return $nb_days;
+}
+
+function build_global_calendar(&$tpl_var)
+{
+  global $page;
+
+  assert( count($page['chronology_date']) == 0 );
+  $query='
+SELECT '.pwg_db_get_date_YYYYMM($this->date_field).' as period,
+  COUNT(distinct id) as count';
+  $query.= $this->inner_sql;
+  $query.= $this->get_date_where();
+  $query.= '
+  GROUP BY period
+  ORDER BY '.pwg_db_get_year($this->date_field).' DESC, '.pwg_db_get_month($this->date_field).' ASC';
+
+  $result = pwg_query($query);
+  $items=array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $y = substr($row['period'], 0, 4);
+    $m = (int)substr($row['period'], 4, 2);
+    if ( ! isset($items[$y]) )
+    {
+      $items[$y] = array('nb_images'=>0, 'children'=>array() );
+    }
+    $items[$y]['children'][$m] = $row['count'];
+    $items[$y]['nb_images'] += $row['count'];
+  }
+  //echo ('<pre>'. var_export($items, true) . '</pre>');
+  if (count($items)==1)
+  {// only one year exists so bail out to year view
+    list($y) = array_keys($items);
+    $page['chronology_date'][CYEAR] = $y;
+    return false;
+  }
+
+  global $lang;
+  foreach ( $items as $year=>$year_data)
+  {
+    $chronology_date = array( $year );
+    $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
+
+    $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
+            $year_data['children'], false, false, $lang['month'] );
+
+    $tpl_var['calendar_bars'][] =
+      array(
+        'U_HEAD'  => $url,
+        'NB_IMAGES' => $year_data['nb_images'],
+        'HEAD_LABEL' => $year,
+        'items' => $nav_bar,
+      );
+  }
+  return true;
+}
+
+function build_year_calendar(&$tpl_var)
+{
+  global $page;
+
+  assert( count($page['chronology_date']) == 1 );
+  $query='SELECT '.pwg_db_get_date_MMDD($this->date_field).' as period,
+            COUNT(DISTINCT id) as count';
+  $query.= $this->inner_sql;
+  $query.= $this->get_date_where();
+  $query.= '
+  GROUP BY period
+  ORDER BY period ASC';
+
+  $result = pwg_query($query);
+  $items=array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $m = (int)substr($row['period'], 0, 2);
+    $d = substr($row['period'], 2, 2);
+    if ( ! isset($items[$m]) )
+    {
+      $items[$m] = array('nb_images'=>0, 'children'=>array() );
+    }
+    $items[$m]['children'][$d] = $row['count'];
+    $items[$m]['nb_images'] += $row['count'];
+  }
+  if (count($items)==1)
+  { // only one month exists so bail out to month view
+    list($m) = array_keys($items);
+    $page['chronology_date'][CMONTH] = $m;
+    return false;
+  }
+  global $lang;
+  foreach ( $items as $month=>$month_data)
+  {
+    $chronology_date = array( $page['chronology_date'][CYEAR], $month );
+    $url = duplicate_index_url( array('chronology_date'=>$chronology_date) );
+
+    $nav_bar = $this->get_nav_bar_from_items( $chronology_date,
+                     $month_data['children'], false );
+
+    $tpl_var['calendar_bars'][] =
+      array(
+        'U_HEAD'  => $url,
+        'NB_IMAGES' => $month_data['nb_images'],
+        'HEAD_LABEL' => $lang['month'][$month],
+        'items' => $nav_bar,
+      );
+  }
+  return true;
+
+}
+
+function build_month_calendar(&$tpl_var)
+{
+  global $page, $lang, $conf;
+
+  $query='SELECT '.pwg_db_get_dayofmonth($this->date_field).' as period,
+            COUNT(DISTINCT id) as count';
+  $query.= $this->inner_sql;
+  $query.= $this->get_date_where();
+  $query.= '
+  GROUP BY period
+  ORDER BY period ASC';
+
+  $items=array();
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $d = (int)$row['period'];
+    $items[$d] = array('nb_images'=>$row['count']);
+  }
+
+  foreach ( $items as $day=>$data)
+  {
+    $page['chronology_date'][CDAY]=$day;
+    $query = '
+SELECT id, file,representative_ext,path,width,height,rotation, '.pwg_db_get_dayofweek($this->date_field).'-1 as dow';
+    $query.= $this->inner_sql;
+    $query.= $this->get_date_where();
+    $query.= '
+  ORDER BY '.DB_RANDOM_FUNCTION.'()
+  LIMIT 1';
+    unset ( $page['chronology_date'][CDAY] );
+
+    $row = pwg_db_fetch_assoc(pwg_query($query));
+    $derivative = new DerivativeImage(IMG_SQUARE, new SrcImage($row));
+    $items[$day]['derivative'] = $derivative;
+    $items[$day]['file'] = $row['file'];
+    $items[$day]['dow'] = $row['dow'];
+  }
+
+  if ( !empty($items) )
+  {
+    list($known_day) = array_keys($items);
+    $known_dow = $items[$known_day]['dow'];
+    $first_day_dow = ($known_dow-($known_day-1))%7;
+    if ($first_day_dow<0)
+    {
+      $first_day_dow += 7;
+    }
+    //first_day_dow = week day corresponding to the first day of this month
+    $wday_labels = $lang['day'];
+
+    if ('monday' == $conf['week_starts_on'])
+    {
+      if ($first_day_dow==0)
+      {
+        $first_day_dow = 6;
+      }
+      else
+      {
+        $first_day_dow -= 1;
+      }
+
+      array_push( $wday_labels, array_shift($wday_labels) );
+    }
+
+    list($cell_width, $cell_height) = ImageStdParams::get_by_type(IMG_SQUARE)->sizing->ideal_size;
+    if ($cell_width>120)
+    {
+      $cell_width = $cell_height = 120;
+    }
+
+    $tpl_weeks    = array();
+    $tpl_crt_week = array();
+
+    //fill the empty days in the week before first day of this month
+    for ($i=0; $i<$first_day_dow; $i++)
+    {
+      $tpl_crt_week[] = array();
+    }
+
+    for ( $day = 1;
+          $day <= $this->get_all_days_in_month(
+            $page['chronology_date'][CYEAR], $page['chronology_date'][CMONTH]
+              );
+          $day++)
+    {
+      $dow = ($first_day_dow + $day-1)%7;
+      if ($dow==0 and $day!=1)
+      {
+        $tpl_weeks[]    = $tpl_crt_week; // add finished week to week list
+        $tpl_crt_week   = array(); // start new week
+      }
+
+      if ( !isset($items[$day]) )
+      {// empty day
+        $tpl_crt_week[]   =
+          array(
+              'DAY' => $day
+            );
+      }
+      else
+      {
+        list($tn_width,$tn_height) = $items[$day]['derivative']->get_size();
+
+        // now need to fit the thumbnail of size tn_size within
+        // a cell of size cell_size by playing with CSS position (left/top)
+        // and the width and height of <img>.
+        $ratio_w = $tn_width/$cell_width;
+        $ratio_h = $tn_height/$cell_height;
+
+        $pos_top=$pos_left=0;
+        $css_style = '';
+
+        if ( $ratio_w>1 and $ratio_h>1)
+        {// cell completely smaller than the thumbnail so we will let the browser
+         // resize the thumbnail
+          if ($ratio_w > $ratio_h )
+          {// thumbnail ratio compared to cell -> wide format
+            $css_style = 'height:'.$cell_height.'px;';
+            $browser_img_width = $cell_height*$tn_width/$tn_height;
+            $pos_left = ($browser_img_width-$cell_width)/2;
+          }
+          else
+          {
+            $css_style = 'width:'.$cell_width.'px;';
+            $browser_img_height = $cell_width*$tn_height/$tn_width;
+            $pos_top = ($browser_img_height-$cell_height)/2;
+          }
+        }
+        else
+        {
+          $pos_left = ($tn_width-$cell_width)/2;
+          $pos_top = ($tn_height-$cell_height)/2;
+        }
+
+        if ( round($pos_left)!=0)
+        {
+          $css_style.='left:'.round(-$pos_left).'px;';
+        }
+        if ( round($pos_top)!=0)
+        {
+          $css_style.='top:'.round(-$pos_top).'px;';
+        }
+        $url = duplicate_index_url(
+            array(
+              'chronology_date' =>
+                array(
+                  $page['chronology_date'][CYEAR],
+                  $page['chronology_date'][CMONTH],
+                  $day
+                )
+            )
+          );
+
+        $tpl_crt_week[]   =
+          array(
+              'DAY'         => $day,
+              'DOW'         => $dow,
+              'NB_ELEMENTS' => $items[$day]['nb_images'],
+              'IMAGE'       => $items[$day]['derivative']->get_url(),
+              'U_IMG_LINK'  => $url,
+              'IMAGE_STYLE' => $css_style,
+              'IMAGE_ALT'   => $items[$day]['file'],
+            );
+      }
+    }
+    //fill the empty days in the week after the last day of this month
+    while ( $dow<6 )
+    {
+      $tpl_crt_week[] = array();
+      $dow++;
+    }
+    $tpl_weeks[]    = $tpl_crt_week;
+
+    $tpl_var['month_view'] =
+        array(
+           'CELL_WIDTH'   => $cell_width,
+           'CELL_HEIGHT' => $cell_height,
+           'wday_labels' => $wday_labels,
+           'weeks' => $tpl_weeks,
+          );
+  }
+
+  return true;
+}
+
+}
+?>
Index: tags/2.4.0RC3/include/calendar_weekly.class.php
===================================================================
--- tags/2.4.0RC3/include/calendar_weekly.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/calendar_weekly.class.php	(revision 14585)
@@ -0,0 +1,139 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once(PHPWG_ROOT_PATH.'include/calendar_base.class.php');
+
+define ('CYEAR', 0);
+define ('CWEEK', 1);
+define ('CDAY',  2);
+
+/**
+ * Weekly calendar style (composed of years/week in years and days in week)
+ */
+class Calendar extends CalendarBase
+{
+
+  /**
+   * Initialize the calendar
+   * @param string inner_sql used for queries (INNER JOIN or normal)
+   */
+  function initialize($inner_sql)
+  {
+    parent::initialize($inner_sql);
+    global $lang, $conf;
+    $week_no_labels=array();
+    for ($i=1; $i<=53; $i++)
+    {
+      $week_no_labels[$i] = sprintf( l10n("Week %d"), $i);
+      //$week_no_labels[$i] = $i;
+    }
+
+    $this->calendar_levels = array(
+      array(
+          'sql'=> pwg_db_get_year($this->date_field),
+          'labels' => null
+        ),
+      array(
+          'sql'=> pwg_db_get_week($this->date_field).'+1',
+          'labels' => $week_no_labels,
+        ),
+      array(
+          'sql'=> pwg_db_get_dayofweek($this->date_field).'-1',
+          'labels' => $lang['day']
+        ),
+     );
+    //Comment next lines for week starting on Sunday or if MySQL version<4.0.17
+    //WEEK(date,5) = "0-53 - Week 1=the first week with a Monday in this year"
+    if ('monday' == $conf['week_starts_on'])
+    {
+      $this->calendar_levels[CWEEK]['sql'] = pwg_db_get_week($this->date_field, 5).'+1';
+      $this->calendar_levels[CDAY]['sql'] = pwg_db_get_weekday($this->date_field);
+      array_push( $this->calendar_levels[CDAY]['labels'],
+                  array_shift( $this->calendar_levels[CDAY]['labels'] ) );
+    }
+  }
+
+/**
+ * Generate navigation bars for category page
+ * @return boolean false to indicate that thumbnails where not included here
+ */
+function generate_category_content()
+{
+  global $conf, $page;
+
+  if ( count($page['chronology_date'])==0 )
+  {
+    $this->build_nav_bar(CYEAR); // years
+  }
+  if ( count($page['chronology_date'])==1 )
+  {
+    $this->build_nav_bar(CWEEK, array()); // week nav bar 1-53
+  }
+  if ( count($page['chronology_date'])==2 )
+  {
+    $this->build_nav_bar(CDAY); // days nav bar Mon-Sun
+  }
+  $this->build_next_prev();
+  return false;
+}
+
+
+/**
+ * Returns a sql where subquery for the date field
+ * @param int max_levels return the where up to this level
+ * (e.g. 2=only year and week in year)
+ * @return string
+ */
+function get_date_where($max_levels=3)
+{
+  global $page;
+  $date = $page['chronology_date'];
+  while (count($date)>$max_levels)
+  {
+    array_pop($date);
+  }
+  $res = '';
+  if (isset($date[CYEAR]) and $date[CYEAR]!=='any')
+  {
+    $y = $date[CYEAR];
+    $res = " AND $this->date_field BETWEEN '$y-01-01' AND '$y-12-31 23:59:59'";
+  }
+
+  if (isset($date[CWEEK]) and $date[CWEEK]!=='any')
+  {
+    $res .= ' AND '.$this->calendar_levels[CWEEK]['sql'].'='.$date[CWEEK];
+  }
+  if (isset($date[CDAY]) and $date[CDAY]!=='any')
+  {
+    $res .= ' AND '.$this->calendar_levels[CDAY]['sql'].'='.$date[CDAY];
+  }
+  if (empty($res))
+  {
+    $res = ' AND '.$this->date_field.' IS NOT NULL';
+  }
+  return $res;
+}
+
+}
+
+?>
Index: tags/2.4.0RC3/include/category_cats.inc.php
===================================================================
--- tags/2.4.0RC3/include/category_cats.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/category_cats.inc.php	(revision 14585)
@@ -0,0 +1,387 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the main page to show thumbnails for a category
+ * that have only subcategories or to show recent categories
+ *
+ */
+
+// $user['forbidden_categories'] including with USER_CACHE_CATEGORIES_TABLE
+$query = '
+SELECT
+    c.*,
+    user_representative_picture_id,
+    nb_images,
+    date_last,
+    max_date_last,
+    count_images,
+    count_categories
+  FROM '.CATEGORIES_TABLE.' c
+    INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' ucc ON id = cat_id AND user_id = '.$user['id'];
+
+if ('recent_cats' == $page['section'])
+{
+  $query.= '
+  WHERE date_last >= '.pwg_db_get_recent_period_expression($user['recent_period']);
+}
+else
+{
+  $query.= '
+  WHERE id_uppercat '.(!isset($page['category']) ? 'is NULL' : '= '.$page['category']['id']);
+}
+
+$query.= '
+    '.get_sql_condition_FandF(
+  array(
+    'visible_categories' => 'id',
+    ),
+  'AND'
+  );
+
+if ('recent_cats' != $page['section'])
+{
+  $query.= '
+  ORDER BY rank';
+}
+
+$query.= '
+;';
+
+$result = pwg_query($query);
+$categories = array();
+$category_ids = array();
+$image_ids = array();
+$user_representative_updates_for = array();
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $row['is_child_date_last'] = @$row['max_date_last']>@$row['date_last'];
+
+  if (!empty($row['user_representative_picture_id']))
+  {
+    $image_id = $row['user_representative_picture_id'];
+  }
+  else if (!empty($row['representative_picture_id']))
+  { // if a representative picture is set, it has priority
+    $image_id = $row['representative_picture_id'];
+  }
+  else if ($conf['allow_random_representative'])
+  {
+    // searching a random representant among elements in sub-categories
+    $image_id = get_random_image_in_category($row);
+  }
+  else
+  { // searching a random representant among representant of sub-categories
+    if ($row['count_categories']>0 and $row['count_images']>0)
+    {
+      $query = '
+  SELECT representative_picture_id
+    FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
+    ON id = cat_id and user_id = '.$user['id'].'
+    WHERE uppercats LIKE \''.$row['uppercats'].',%\'
+      AND representative_picture_id IS NOT NULL'
+    .get_sql_condition_FandF
+    (
+      array
+        (
+          'visible_categories' => 'id',
+        ),
+      "\n  AND"
+    ).'
+    ORDER BY '.DB_RANDOM_FUNCTION.'()
+    LIMIT 1
+  ;';
+      $subresult = pwg_query($query);
+      if (pwg_db_num_rows($subresult) > 0)
+      {
+        list($image_id) = pwg_db_fetch_row($subresult);
+      }
+    }
+  }
+
+  if (isset($image_id))
+  {
+    if ($conf['representative_cache_on_subcats'] and $row['user_representative_picture_id'] != $image_id)
+    {
+      $user_representative_updates_for[ $user['id'].'#'.$row['id'] ] = $image_id;
+    }
+    
+    $row['representative_picture_id'] = $image_id;
+    array_push($image_ids, $image_id);
+    array_push($categories, $row);
+    array_push($category_ids, $row['id']);
+  }
+  unset($image_id);
+}
+
+if ($conf['display_fromto'])
+{
+  $dates_of_category = array();
+  if (count($category_ids) > 0)
+  {
+    $query = '
+SELECT
+    category_id,
+    MIN(date_creation) AS date_creation_min,
+    MAX(date_creation) AS date_creation_max
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    INNER JOIN '.IMAGES_TABLE.' ON image_id = id
+  WHERE category_id IN ('.implode(',', $category_ids).')
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'visible_categories' => 'category_id',
+        'visible_images' => 'id'
+      ),
+    'AND'
+  ).'
+  GROUP BY category_id
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $dates_of_category[ $row['category_id'] ] = array(
+        'from' => $row['date_creation_min'],
+        'to'   => $row['date_creation_max'],
+        );
+    }
+  }
+}
+
+if ($page['section']=='recent_cats')
+{
+  usort($categories, 'global_rank_compare');
+}
+if (count($categories) > 0)
+{
+  $infos_of_image = array();
+  $new_image_ids = array();
+
+  $query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $image_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if ($row['level'] <= $user['level'])
+    {
+      $infos_of_image[$row['id']] = $row;
+    }
+    else
+    {
+      // problem: we must not display the thumbnail of a photo which has a
+      // higher privacy level than user privacy level
+      //
+      // * what is the represented category?
+      // * find a random photo matching user permissions
+      // * register it at user_representative_picture_id
+      // * set it as the representative_picture_id for the category
+
+      foreach ($categories as &$category)
+      {
+        if ($row['id'] == $category['representative_picture_id'])
+        {
+          // searching a random representant among elements in sub-categories
+          $image_id = get_random_image_in_category($category);
+
+          if (isset($image_id) and !in_array($image_id, $image_ids))
+          {
+            array_push($new_image_ids, $image_id);
+          }
+
+          if ($conf['representative_cache_on_level'])
+          {
+            $user_representative_updates_for[ $user['id'].'#'.$category['id'] ] = $image_id;
+          }
+          
+          $category['representative_picture_id'] = $image_id;
+        }
+      }
+      unset($category);
+    }
+  }
+
+  if (count($new_image_ids) > 0)
+  {
+    $query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $new_image_ids).')
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $infos_of_image[$row['id']] = $row;
+    }
+  }
+  
+  foreach ($infos_of_image as &$info)
+  {
+    $info['src_image'] = new SrcImage($info);
+  }
+  unset($info);
+}
+
+if (count($user_representative_updates_for))
+{
+  $updates = array();
+  
+  foreach ($user_representative_updates_for as $user_cat => $image_id)
+  {
+    list($user_id, $cat_id) = explode('#', $user_cat);
+    
+    array_push(
+      $updates,
+      array(
+        'user_id' => $user_id,
+        'cat_id' => $cat_id,
+        'user_representative_picture_id' => $image_id,
+        )
+      );
+  }
+
+  mass_updates(
+    USER_CACHE_CATEGORIES_TABLE,
+    array(
+      'primary' => array('user_id', 'cat_id'),
+      'update'  => array('user_representative_picture_id')
+      ),
+    $updates
+    );
+}
+
+if (count($categories) > 0)
+{
+  // Update filtered data
+  if (function_exists('update_cats_with_filtered_data'))
+  {
+    update_cats_with_filtered_data($categories);
+  }
+
+  $template->set_filename('index_category_thumbnails', 'mainpage_categories.tpl');
+
+  trigger_action('loc_begin_index_category_thumbnails', $categories);
+
+  $tpl_thumbnails_var = array();
+
+  foreach ($categories as $category)
+  {
+    if (0 == $category['count_images'])
+    {
+      continue;
+    }
+    
+    $category['name'] = trigger_event(
+        'render_category_name',
+        $category['name'],
+        'subcatify_category_name'
+        );
+
+    if ($page['section']=='recent_cats')
+    {
+      $name = get_cat_display_name_cache($category['uppercats'], null, false);
+    }
+    else
+    {
+      $name = $category['name'];
+    }
+
+    $representative_infos = $infos_of_image[ $category['representative_picture_id'] ];
+
+    $tpl_var =
+        array(
+          'ID'    => $category['id'],
+          'representative'   => $representative_infos,
+          'TN_ALT'   => strip_tags($category['name']),
+
+          'URL'   => make_index_url(
+            array(
+              'category' => $category
+              )
+            ),
+          'CAPTION_NB_IMAGES' => get_display_images_count
+                                  (
+                                    $category['nb_images'],
+                                    $category['count_images'],
+                                    $category['count_categories'],
+                                    true,
+                                    '<br>'
+                                  ),
+          'DESCRIPTION' =>
+            trigger_event('render_category_literal_description',
+              trigger_event('render_category_description',
+                @$category['comment'],
+                'subcatify_category_description')),
+          'NAME'  => $name,
+        );
+    if ($conf['index_new_icon'])
+    {
+      $tpl_var['icon_ts'] = get_icon($category['max_date_last'], $category['is_child_date_last']);
+    }
+
+    if ($conf['display_fromto'])
+    {
+      if (isset($dates_of_category[ $category['id'] ]))
+      {
+        $from = $dates_of_category[ $category['id'] ]['from'];
+        $to   = $dates_of_category[ $category['id'] ]['to'];
+
+        if (!empty($from))
+        {
+          $info = '';
+
+          if ($from == $to)
+          {
+            $info = format_date($from);
+          }
+          else
+          {
+            $info = sprintf(
+              l10n('from %s to %s'),
+              format_date($from),
+              format_date($to)
+              );
+          }
+          $tpl_var['INFO_DATES'] = $info;
+        }
+      }
+    }//fromto
+
+    $tpl_thumbnails_var[] = $tpl_var;
+  }
+
+  $derivative_params = trigger_event('get_index_album_derivative_params', ImageStdParams::get_by_type(IMG_THUMB) );
+  $tpl_thumbnails_var = trigger_event('loc_end_index_category_thumbnails', $tpl_thumbnails_var, $categories);
+  $template->assign( array(
+    'category_thumbnails' => $tpl_thumbnails_var,
+    'derivative_params' => $derivative_params,
+    ) );
+
+  $template->assign_var_from_handle('CATEGORIES', 'index_category_thumbnails');
+}
+pwg_debug('end include/category_cats.inc.php');
+?>
Index: tags/2.4.0RC3/include/category_default.inc.php
===================================================================
--- tags/2.4.0RC3/include/category_default.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/category_default.inc.php	(revision 14585)
@@ -0,0 +1,167 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the main page to show thumbnails for the default
+ * case
+ *
+ */
+
+$pictures = array();
+
+$selection = array_slice(
+  $page['items'],
+  $page['start'],
+  $page['nb_image_page']
+  );
+
+$selection = trigger_event('loc_index_thumbnails_selection', $selection);
+
+if (count($selection) > 0)
+{
+  $rank_of = array_flip($selection);
+
+  $query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $selection).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $row['rank'] = $rank_of[ $row['id'] ];
+    $pictures[] = $row;
+  }
+
+  usort($pictures, 'rank_compare');
+  unset($rank_of);
+}
+
+if (count($pictures) > 0)
+{
+  // define category slideshow url
+  $row = reset($pictures);
+  $page['cat_slideshow_url'] =
+    add_url_params(
+      duplicate_picture_url(
+        array(
+          'image_id' => $row['id'],
+          'image_file' => $row['file']
+        ),
+        array('start')
+      ),
+      array('slideshow' =>
+        (isset($_GET['slideshow']) ? $_GET['slideshow']
+                                   : '' ))
+    );
+
+  if ($conf['activate_comments'] and $user['show_nb_comments'])
+  {
+    $query = '
+SELECT image_id, COUNT(*) AS nb_comments
+  FROM '.COMMENTS_TABLE.'
+  WHERE validated = \'true\'
+    AND image_id IN ('.implode(',', $selection).')
+  GROUP BY image_id
+;';
+    $nb_comments_of = simple_hash_from_query($query, 'image_id', 'nb_comments');
+  }
+}
+
+// template thumbnail initialization
+$template->set_filenames( array( 'index_thumbnails' => 'thumbnails.tpl',));
+
+trigger_action('loc_begin_index_thumbnails', $pictures);
+$tpl_thumbnails_var = array();
+
+foreach ($pictures as $row)
+{
+  // link on picture.php page
+  $url = duplicate_picture_url(
+        array(
+          'image_id' => $row['id'],
+          'image_file' => $row['file']
+        ),
+        array('start')
+      );
+
+  if (isset($nb_comments_of))
+  {
+    $row['NB_COMMENTS'] = $row['nb_comments'] = (int)@$nb_comments_of[$row['id']];
+  }
+
+  $name = render_element_name($row);
+  $desc = render_element_description($row);
+
+  $tpl_var = array_merge( $row, array(
+    'TN_ALT' => htmlspecialchars(strip_tags($name)),
+    'TN_TITLE' => get_thumbnail_title($row, $name, $desc),
+    'URL' => $url,
+    'DESCRIPTION' => $desc,
+    'src_image' => new SrcImage($row),
+    ) );
+
+  if ($conf['index_new_icon'])
+  {
+    $tpl_var['icon_ts'] = get_icon($row['date_available']);
+  }
+
+  if ($user['show_nb_hits'])
+  {
+    $tpl_var['NB_HITS'] = $row['hit'];
+  }
+
+  switch ($page['section'])
+  {
+    case 'best_rated' :
+    {
+      $name = '('.$row['rating_score'].') '.$name;
+      break;
+    }
+    case 'most_visited' :
+    {
+      if ( !$user['show_nb_hits'])
+      {
+        $name = '('.$row['hit'].') '.$name;
+      }
+      break;
+    }
+  }
+  $tpl_var['NAME'] = $name;
+  $tpl_thumbnails_var[] = $tpl_var;
+}
+
+$derivative_params = trigger_event('get_index_derivative_params', ImageStdParams::get_by_type( pwg_get_session_var('index_deriv', IMG_THUMB) ) );
+
+$template->assign( array(
+  'derivative_params' =>$derivative_params,
+  'SHOW_THUMBNAIL_CAPTION' =>$conf['show_thumbnail_caption'],
+    ) );
+$tpl_thumbnails_var = trigger_event('loc_end_index_thumbnails', $tpl_thumbnails_var, $pictures);
+$template->assign('thumbnails', $tpl_thumbnails_var);
+
+$template->assign_var_from_handle('THUMBNAILS', 'index_thumbnails');
+unset($pictures, $selection, $tpl_thumbnails_var);
+$template->clear_assign( array('thumbnails', 'derivative_params') );
+pwg_debug('end include/category_default.inc.php');
+?>
Index: tags/2.4.0RC3/include/class_smtp_mail.inc.php
===================================================================
--- tags/2.4.0RC3/include/class_smtp_mail.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/class_smtp_mail.inc.php	(revision 14585)
@@ -0,0 +1,185 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// These function were originally a part of the punBB.
+
+class smtp_mail
+{
+  var $socket;
+  var $no_error;
+  var $host;
+  var $user;
+  var $password;
+  var $email_webmaster;
+
+  function smtp_mail($host, $user, $password, $email_webmaster)
+  {
+    $this->host = $host;
+    $this->user = $user;
+    $this->password = $password;
+    $this->email_webmaster = $email_webmaster;
+  }
+
+  // Adaptation of server_parse
+  function server_parse($expected_response)
+  {
+    if ($this->no_error)
+    {
+      $server_response = '';
+      while (substr($server_response, 3, 1) != ' ')
+      {
+        if (!($server_response = fgets($this->socket, 256)))
+        {
+          trigger_error('Couldn\'t get mail server response codes.', E_USER_WARNING);
+          $this->no_error = false;
+        }
+      }
+    }
+
+    if ($this->no_error)
+    {
+      if (!(substr($server_response, 0, 3) == $expected_response))
+      {
+        trigger_error('Unable to send e-mail. Error message reported by the SMTP server: "'.$server_response.'"', E_USER_WARNING);
+        $this->no_error = false;
+      }
+    }
+    return $this->no_error;
+  }
+
+  function server_write($s)
+  {
+    $this->no_error = $this->no_error && (fwrite($this->socket, $s) !== false);
+    return $this->no_error;
+  }
+
+  function add_recipients(&$recipients, $headers, $type_header)
+  {
+    if (preg_match('/^\s*'.$type_header.'\s*:.*/mi', $headers, $matches) != 0)
+    {
+      $list = explode(',', $matches[0]);
+      foreach ($list as $email)
+      {
+        if (strpos($email, '<') !== false)
+        {
+           $email = preg_replace('/.*<(.*)>.*/i', '$1', $email);
+        }
+        $recipients[] = trim($email);
+      }
+    }
+  }
+
+  // Adaptation of pun_mail
+  function mail($to, $subject, $message, $headers = '')
+  {
+    $this->no_error = true;
+
+    // Are we using port 25 or a custom port?
+    if (strpos($this->host, ':') !== false)
+    {
+      list($smtp_host, $smtp_port) = explode(':', $this->host);
+    }
+    else
+    {
+      $smtp_host = $this->host;
+      $smtp_port = 25;
+    }
+
+    if ($this->socket = fsockopen($smtp_host, $smtp_port, $errno, $errstr, 15))
+    {
+      $this->server_parse('220');
+
+      if (!empty($this->user) && !empty($this->password))
+      {
+        $this->server_write('EHLO '.$smtp_host."\r\n");
+        $this->server_parse('250');
+
+        $this->server_write('AUTH LOGIN'."\r\n");
+        $this->server_parse('334');
+
+        $this->server_write(base64_encode($this->user)."\r\n");
+        $this->no_error = $this->no_error && $this->no_error = $this->server_parse('334');
+
+        $this->server_write(base64_encode($this->password)."\r\n");
+        $this->server_parse('235');
+      }
+      else
+      {
+        $this->server_write('HELO '.$smtp_host."\r\n");
+        $this->server_parse('250');
+      }
+
+      $this->server_write('MAIL FROM:<'.$this->email_webmaster.'>'."\r\n");
+      $this->server_parse('250');
+
+      // Add "To:" on headers if there are included
+      if ((preg_match('/^\s*to\s*:.*/mi', $headers) === 0) and !empty($to))
+      {
+        $to_header = 'To:'.implode(',', array_map(create_function('$email','return "<".$email.">";'), explode(',', $to)));
+      }
+      else
+      {
+        $to_header = '';
+      }
+
+      if (!empty($to))
+      {
+        $recipients = explode(',', $to);
+      }
+      else
+      {
+        $recipients = array();
+      }
+
+      $this->add_recipients($recipients, $headers, 'Cc');
+      $this->add_recipients($recipients, $headers, 'Bcc');
+
+      @reset($recipients);
+      while (list(, $email) = @each($recipients))
+      {
+        $this->server_write('RCPT TO:<'.$email.'>'."\r\n");
+        $this->server_parse('250');
+      }
+
+      $this->server_write('DATA'."\r\n");
+      $this->server_parse('354');
+
+      $this->server_write('Date: '.date('D, j M Y H:i:s O')."\r\n");
+      $this->server_write('Subject:'.$subject."\r\n".(empty($to_header) ? "" : $to_header."\r\n").$headers."\r\n\r\n".$message."\r\n");
+      $this->server_write('.'."\r\n");
+      $this->server_parse('250');
+
+      $this->server_write('QUIT'."\r\n");
+      fclose($this->socket);
+    }
+    else
+    {
+      trigger_error('Could not connect to smtp host "'.$this->host.'" ('.$errno.') ('.$errstr.')', E_USER_WARNING);
+      $this->no_error = false;;
+    }
+
+    return $this->no_error;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/common.inc.php
===================================================================
--- tags/2.4.0RC3/include/common.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/common.inc.php	(revision 14585)
@@ -0,0 +1,267 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or trigger_error('Hacking attempt!', E_USER_ERROR);
+
+// determine the initial instant to indicate the generation time of this page
+$t2 = microtime(true);
+
+@set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
+
+//
+// addslashes to vars if magic_quotes_gpc is off this is a security
+// precaution to prevent someone trying to break out of a SQL statement.
+//
+if( !@get_magic_quotes_gpc() )
+{
+  function sanitize_mysql_kv(&$v, $k)
+  {
+    $v = addslashes($v);
+  }
+  if( is_array( $_GET ) )
+  {
+    array_walk_recursive( $_GET, 'sanitize_mysql_kv' );
+  }
+  if( is_array( $_POST ) )
+  {
+    array_walk_recursive( $_POST, 'sanitize_mysql_kv' );
+  }
+  if( is_array( $_COOKIE ) )
+  {
+    array_walk_recursive( $_COOKIE, 'sanitize_mysql_kv' );
+  }
+}
+if ( !empty($_SERVER["PATH_INFO"]) )
+{
+  $_SERVER["PATH_INFO"] = addslashes($_SERVER["PATH_INFO"]);
+}
+
+//
+// Define some basic configuration arrays this also prevents malicious
+// rewriting of language and otherarray values via URI params
+//
+$conf = array();
+$page = array(
+  'infos' => array(),
+  'errors' => array(),
+  );
+$user = array();
+$lang = array();
+$header_msgs = array();
+$header_notes = array();
+$filter = array();
+
+foreach( array(
+  'array_intersect_key', //PHP 5 >= 5.1.0RC1
+  'hash_hmac', //(hash) - enabled by default as of PHP 5.1.2
+  'preg_last_error', // PHP 5 >= 5.2.0
+  'json_encode', // PHP 5 >= 5.2.0
+  ) as $func)
+{
+  if (!function_exists($func))
+  {
+    include_once(PHPWG_ROOT_PATH . 'include/php_compat/'.$func.'.php');
+  }
+}
+
+include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+if (!isset($conf['local_data_dir'])) $conf['local_data_dir'] = realpath(PHPWG_ROOT_PATH.$conf['data_location']); // temp 2.4 for backward compatibility
+
+defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
+
+
+@include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php');
+if (!defined('PHPWG_INSTALLED'))
+{
+  header('Location: install.php');
+  exit;
+}
+include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
+
+if(isset($conf['show_php_errors']) && !empty($conf['show_php_errors']))
+{
+  @ini_set('error_reporting', $conf['show_php_errors']);
+  @ini_set('display_errors', true);
+}
+
+include(PHPWG_ROOT_PATH . 'include/constants.php');
+include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
+
+
+// Database connection
+try
+{
+  $pwg_db_link = pwg_db_connect($conf['db_host'], $conf['db_user'],
+                                $conf['db_password'], $conf['db_base']);
+}
+catch (Exception $e)
+{
+  my_error(l10n($e->getMessage()), true);
+}
+
+pwg_db_check_charset();
+
+load_conf_from_db();
+
+if (!$conf['check_upgrade_feed'])
+{
+  if (!isset($conf['piwigo_db_version']) or $conf['piwigo_db_version'] != get_branch_from_version(PHPWG_VERSION))
+  {
+    redirect(get_root_url().'upgrade.php');
+  }
+}
+
+ImageStdParams::load_from_db();
+
+load_plugins();
+
+// users can have defined a custom order pattern, incompatible with GUI form
+if (isset($conf['order_by_custom']))
+{
+  $conf['order_by'] = $conf['order_by_custom'];
+}
+if (isset($conf['order_by_inside_category_custom']))
+{
+  $conf['order_by_inside_category'] = $conf['order_by_inside_category_custom'];
+}
+
+include(PHPWG_ROOT_PATH.'include/user.inc.php');
+
+if (in_array( substr($user['language'],0,2), array('fr','it','de','es','pl','hu','ru','nl') ) )
+{
+  define('PHPWG_DOMAIN', substr($user['language'],0,2).'.piwigo.org');
+}
+elseif ('zh_CN' == $user['language']) {
+  define('PHPWG_DOMAIN', 'cn.piwigo.org');
+}
+else {
+  define('PHPWG_DOMAIN', 'piwigo.org');
+}
+define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
+
+if(isset($conf['alternative_pem_url']) and $conf['alternative_pem_url']!='')
+{
+  define('PEM_URL', $conf['alternative_pem_url']);
+}
+else
+{
+  define('PEM_URL', 'http://'.PHPWG_DOMAIN.'/ext');
+}
+
+// language files
+load_language('common.lang');
+if ( is_admin() || (defined('IN_ADMIN') and IN_ADMIN) )
+{
+  load_language('admin.lang');
+}
+trigger_action('loading_lang');
+load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR, array('no_fallback'=>true, 'local'=>true) );
+
+// only now we can set the localized username of the guest user (and not in
+// include/user.inc.php)
+if (is_a_guest())
+{
+  $user['username'] = l10n('guest');
+}
+
+// template instance
+if (defined('IN_ADMIN') and IN_ADMIN )
+{// Admin template
+  $template = new Template(PHPWG_ROOT_PATH.'admin/themes', $conf['admin_theme']);
+}
+else
+{ // Classic template
+  $theme = mobile_theme() ? $conf['mobile_theme'] : $user['theme'];
+  $template = new Template(PHPWG_ROOT_PATH.'themes', $theme );
+}
+
+if ( !isset($conf['no_photo_yet']) )
+{
+  include(PHPWG_ROOT_PATH.'include/no_photo_yet.inc.php');
+}
+
+if (isset($user['internal_status']['guest_must_be_guest'])
+    and
+    $user['internal_status']['guest_must_be_guest'] === true)
+{
+  $header_msgs[] = l10n('Bad status for user "guest", using default status. Please notify the webmaster.');
+}
+
+if ($conf['gallery_locked'])
+{
+  $header_msgs[] = l10n('The gallery is locked for maintenance. Please, come back later.');
+
+  if ( script_basename() != 'identification' and !is_admin() )
+  {
+    set_status_header(503, 'Service Unavailable');
+    @header('Retry-After: 900');
+    header('Content-Type: text/html; charset='.get_pwg_charset());
+    echo '<a href="'.get_absolute_root_url(false).'identification.php">'.l10n('The gallery is locked for maintenance. Please, come back later.').'</a>';
+    echo str_repeat( ' ', 512); //IE6 doesn't error output if below a size
+    exit();
+  }
+}
+
+if ($conf['check_upgrade_feed'])
+{
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upgrade.php');
+  if (check_upgrade_feed())
+  {
+    $header_msgs[] = 'Some database upgrades are missing, '
+      .'<a href="'.get_absolute_root_url(false).'upgrade_feed.php">upgrade now</a>';
+  }
+}
+
+if (count($header_msgs) > 0)
+{
+  $template->assign('header_msgs', $header_msgs);
+  $header_msgs=array();
+}
+
+if (!empty($conf['filter_pages']) and get_filter_page_value('used'))
+{
+  include(PHPWG_ROOT_PATH.'include/filter.inc.php');
+}
+else
+{
+  $filter['enabled'] = false;
+}
+
+if (isset($conf['header_notes']))
+{
+  $header_notes = array_merge($header_notes, $conf['header_notes']);
+}
+
+// default event handlers
+add_event_handler('render_category_literal_description', 'render_category_literal_description');
+if ( !$conf['allow_html_descriptions'] )
+{
+  add_event_handler('render_category_description', 'nl2br');
+}
+add_event_handler('render_comment_content', 'render_comment_content');
+add_event_handler('render_comment_author', 'strip_tags');
+add_event_handler('render_tag_url', 'str2url');
+add_event_handler('blockmanager_register_blocks', 'register_default_menubar_blocks', EVENT_HANDLER_PRIORITY_NEUTRAL-1);
+trigger_action('init');
+?>
Index: tags/2.4.0RC3/include/config_default.inc.php
===================================================================
--- tags/2.4.0RC3/include/config_default.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/config_default.inc.php	(revision 14585)
@@ -0,0 +1,763 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ *                           configuration page
+ *
+ * Set configuration parameters that are not in the table config. In the
+ * application, configuration parameters are considered in the same way
+ * coming from config table or config_default.inc.php.
+ *
+ * It is recommended to let config_default.inc.php as provided and to
+ * overwrite configuration in your local configuration file
+ * local/config/config.inc.php. See tools/config.inc.php as an example.
+ *
+ * Why having some parameters in config table and others in
+ * config_*.inc.php? Modifying config_*.inc.php is a "hard" task for low
+ * skilled users, they need a GUI for this : admin/configuration. But only
+ * parameters that might be modified by low skilled users are in config
+ * table, other parameters are in config_*.inc.php
+ */
+
+// +-----------------------------------------------------------------------+
+// |                                 misc                                  |
+// +-----------------------------------------------------------------------+
+
+// order_by_custom and order_by_inside_category_custom : for non common pattern
+// you can define special ORDER configuration
+//
+// $conf['order_by_custom'] = ' ORDER BY date_available DESC, file ASC, id ASC';
+
+// order_by_inside_category : inside a category, images can also be ordered
+// by rank. A manually defined rank on each image for the category.
+//
+// $conf['order_by_inside_category_custom'] = $conf['order_by_custom'];
+
+// file_ext : file extensions (case sensitive) authorized
+$conf['file_ext'] = array('jpg','JPG','jpeg','JPEG',
+                          'png','PNG','gif','GIF','mpg','zip',
+                          'avi','mp3','ogg');
+
+// picture_ext : file extensions for picture file, must be a subset of
+// file_ext
+$conf['picture_ext'] = array('jpg','JPG','jpeg','JPEG',
+                             'png','PNG','gif','GIF');
+
+// top_number : number of element to display for "best rated" and "most
+// visited" categories
+$conf['top_number'] = 15;
+
+// anti-flood_time : number of seconds between 2 comments : 0 to disable
+$conf['anti-flood_time'] = 60;
+
+// qualified spam comments are not registered (false will register them
+// but they will require admin validation)
+$conf['comment_spam_reject'] = true;
+
+// maximum number of links in a comment before it is qualified spam
+$conf['comment_spam_max_links'] = 3;
+
+// calendar_datefield : date field of table "images" used for calendar
+// catgory
+$conf['calendar_datefield'] = 'date_creation';
+
+// calendar_show_any : the calendar shows an aditional 'any' button in the
+// year/month/week/day navigation bars
+$conf['calendar_show_any'] = true;
+
+// calendar_show_empty : the calendar shows month/weeks/days even if there are
+//no elements for these
+$conf['calendar_show_empty'] = true;
+
+// newcat_default_commentable : at creation, must a category be commentable
+// or not ?
+$conf['newcat_default_commentable'] = true;
+
+// newcat_default_visible : at creation, must a category be visible or not ?
+// Warning : if the parent category is invisible, the category is
+// automatically create invisible. (invisible = locked)
+$conf['newcat_default_visible'] = true;
+
+// newcat_default_status : at creation, must a category be public or private
+// ? Warning : if the parent category is private, the category is
+// automatically create private.
+$conf['newcat_default_status'] = 'public';
+
+// level_separator : character string used for separating a category level
+// to the sub level. Suggestions : ' / ', ' &raquo; ', ' &rarr; ', ' - ',
+// ' &gt;'
+$conf['level_separator'] = ' / ';
+
+// paginate_pages_around : on paginate navigation bar, how many pages
+// display before and after the current page ?
+$conf['paginate_pages_around'] = 2;
+
+// show_version : shall the version of Piwigo be displayed at the
+// bottom of each page ?
+$conf['show_version'] = true;
+
+// meta_ref to reference multiple sets of incorporated pages or elements
+// Set it false to avoid referencing in google, and other search engines.
+$conf['meta_ref'] = true;
+
+// links : list of external links to add in the menu. An example is the best
+// than a long explanation :
+//
+// Simple use:
+//  for each link is associated a label
+//  $conf['links'] = array(
+//    'http://piwigo.org' => 'PWG website',
+//    'http://piwigo.org/forum' => 'PWG forum',
+//    );
+//
+// Advenced use:
+//  You can also used special options. Instead to pass a string like parameter value
+//  you can pass a array with different optional parameter values
+//  $conf['links'] = array(
+//    'http://piwigo.org' => array('label' => 'PWG website', 'new_window' => false, 'eval_visible' => 'return true;'),
+//    'http://piwigo.org/forum' => array('label' => 'For ADMIN', 'new_window' => true, 'eval_visible' => 'return is_admin();'),
+//    'http://piwigo.org/ext' => array('label' => 'For Guest', 'new_window' => true, 'eval_visible' => 'return is_a_guest();'),
+//    'http://piwigo.org/downloads' =>
+//      array('label' => 'PopUp', 'new_window' => true,
+//      'nw_name' => 'PopUp', 'nw_features' => 'width=800,height=450,location=no,status=no,toolbar=no,scrollbars=no,menubar=no'),
+//    );
+// Parameters:
+//  'label':
+//    Label to display for the link, must be defined
+//  'new_window':
+//    If true open link on tab/window
+//    [Default value is true if it's not defined]
+//  'nw_name':
+//    Name use when new_window is true
+//    [Default value is '' if it's not defined]
+//  'nw_features':
+//    features use when new_window is true
+//    [Default value is '' if it's not defined]
+//  'eval_visible':
+//    It's php code witch must return if the link is visible or not
+//    [Default value is true if it's not defined]
+//
+// Equivalence:
+//  $conf['links'] = array(
+//    'http://piwigo.org' => 'PWG website',
+//    );
+//  $conf['links'] = array(
+//    'http://piwigo.org' => array('label' => 'PWG website', 'new_window' => false, 'visible' => 'return true;'),
+//    );
+//
+// If the array is empty, the "Links" box won't be displayed on the main
+// page.
+$conf['links'] = array();
+
+// random_index_redirect: list of 'internal' links to use when no section is defined on index.php.
+// An example is the best than a long explanation :
+//
+//  for each link is associated a php condition
+//  '' condition is equivalent to 'return true;'
+//  $conf['random_index_redirect'] = array(
+//    PHPWG_ROOT_PATH.'index.php?/best_rated' => 'return true;',
+//    PHPWG_ROOT_PATH.'index.php?/recent_pics' => 'return is_a_guest();',
+//    PHPWG_ROOT_PATH.'random.php' => '',
+//    PHPWG_ROOT_PATH.'index.php?/categories' => '',
+//    );
+$conf['random_index_redirect'] = array();
+
+// reverse_home_title: if Piwigo is your home page for a better robot index
+// we recommend to set it true (Only index page will reverse its title)
+$conf['reverse_home_title'] = false;
+
+// List of notes to display on all header page
+// example $conf['header_notes']  = array('Test', 'Hello');
+$conf['header_notes']  = array();
+
+// show_thumbnail_caption : on thumbnails page, show thumbnail captions ?
+$conf['show_thumbnail_caption'] = true;
+
+// display_fromto: display the date creation bounds of a
+// category.
+$conf['display_fromto'] = false;
+
+// allow_random_representative : do you wish Piwigo to search among
+// categories elements a new representative at each reload ?
+//
+// If false, an element is randomly or manually chosen to represent its
+// category and remains the representative as long as an admin does not
+// change it.
+//
+// Warning : setting this parameter to true is CPU consuming. Each time you
+// change the value of this parameter from false to true, an administrator
+// must update categories informations in screen [Admin > General >
+// Maintenance].
+$conf['allow_random_representative'] = false;
+
+// representative_cache_on_level: if a thumbnail is chosen as representative
+// but has higher privacy level than current user, Piwigo randomly selects
+// another thumbnail. Should be store this thumbnail in cache to avoid
+// another consuming SQL query on next page refresh?
+$conf['representative_cache_on_level'] = true;
+
+// representative_cache_on_subcats: if a category (= album) only contains
+// sub-categories, Piwigo randomly selects a thumbnail among sub-categories
+// representative. Should we store this thumbnail in cache to avoid another
+// "slightly" consuming SQL query on next page refresh?
+$conf['representative_cache_on_subcats'] = true;
+
+// allow_html_descriptions : authorize administrators to use HTML in
+// category and element description.
+$conf['allow_html_descriptions'] = true;
+
+// prefix_thumbnail : string before filename. Thumbnail's prefix must only
+// contain characters among : a to z (case insensitive), "-" or "_".
+$conf['prefix_thumbnail'] = 'TN-';
+
+// dir_thumbnail : directory where thumbnail reside.
+$conf['dir_thumbnail'] = 'thumbnail';
+
+// users_page: how many users to display in screen
+// Administration>Identification>Users?
+$conf['users_page'] = 20;
+
+// image level permissions available in the admin interface
+$conf['available_permission_levels'] = array(0,1,2,4,8);
+
+// mail_options: only set it true if you have a send mail warning with
+// "options" parameter missing on mail() function execution.
+$conf['mail_options'] = false;
+
+// send_bcc_mail_webmaster: send bcc mail to webmaster. Set true for debug
+// or test.
+$conf['send_bcc_mail_webmaster'] = false;
+
+// default_email_format:
+//  Define the default email format use to send email
+//  Value could be text/plain  or text/html
+$conf['default_email_format'] = 'text/html';
+
+// alternative_email_format:
+//  Define the alternative email format use to send email
+//  Value could be text/plain  or text/html
+$conf['alternative_email_format'] = 'text/plain';
+
+// define the name of sender mail:
+// If value is empty, gallery title is used
+$conf['mail_sender_name'] = '';
+
+// smtp configuration
+// (work if fsockopen function is allowed for smtp port)
+// smtp_host: smtp server host
+//  if null, regular mail function is used
+//   format: hoststring[:port]
+//   exemple: smtp.pwg.net:21
+// smtp_user/smtp_password: user & password for smtp identication
+$conf['smtp_host'] = '';
+$conf['smtp_user'] = '';
+$conf['smtp_password'] = '';
+
+
+// check_upgrade_feed: check if there are database upgrade required. Set to
+// true, a message will strongly encourage you to upgrade your database if
+// needed.
+//
+// This configuration parameter is set to true in BSF branch and to false
+// elsewhere.
+$conf['check_upgrade_feed'] = true;
+
+// rate_items: available rates for a picture
+$conf['rate_items'] = array(0,1,2,3,4,5);
+
+// Define default method to use ('http' or 'html' in order to do redirect)
+$conf['default_redirect_method'] = 'http';
+
+// Define using double password type in admin's users management panel
+$conf['double_password_type_in_admin'] = false;
+
+// Define if logins must be case sentitive or not at users registration. ie :
+// If set true, the login "user" will equal "User" or "USER" or "user",
+// etc. ... And it will be impossible to use such login variation to create a
+// new user account.
+$conf['insensitive_case_logon'] = false;
+
+// how should we check for unicity when adding a photo. Can be 'md5sum' or
+// 'filename'
+$conf['uniqueness_mode'] = 'md5sum';
+
+// Library used for image resizing. Value could be 'auto', 'imagick',
+// 'ext_imagick' or 'gd'. If value is 'auto', library will be choosen in this
+// order. If choosen library is not available, another one will be picked up.
+$conf['graphics_library'] = 'auto';
+
+// If library used is external installation of ImageMagick ('ext_imagick'),
+// you can define imagemagick directory.
+$conf['ext_imagick_dir'] = '';
+
+// +-----------------------------------------------------------------------+
+// |                               metadata                                |
+// +-----------------------------------------------------------------------+
+
+// show_iptc: Show IPTC metadata on picture.php if asked by user
+$conf['show_iptc'] = false;
+
+// show_iptc_mapping : is used for showing IPTC metadata on picture.php
+// page. For each key of the array, you need to have the same key in the
+// $lang array. For example, if my first key is 'iptc_keywords' (associated
+// to '2#025') then you need to have $lang['iptc_keywords'] set in
+// language/$user['language']/common.lang.php. If you don't have the lang
+// var set, the key will be simply displayed
+//
+// To know how to associated iptc_field with their meaning, use
+// tools/metadata.php
+$conf['show_iptc_mapping'] = array(
+  'iptc_keywords'        => '2#025',
+  'iptc_caption_writer'  => '2#122',
+  'iptc_byline_title'    => '2#085',
+  'iptc_caption'         => '2#120'
+  );
+
+// use_iptc: Use IPTC data during database synchronization with files
+// metadata
+$conf['use_iptc'] = false;
+
+// use_iptc_mapping : in which IPTC fields will Piwigo find image
+// information ? This setting is used during metadata synchronisation. It
+// associates a piwigo_images column name to a IPTC key
+$conf['use_iptc_mapping'] = array(
+  'keywords'        => '2#025',
+  'date_creation'   => '2#055',
+  'author'          => '2#122',
+  'name'            => '2#005',
+  'comment'         => '2#120'
+  );
+
+// show_exif: Show EXIF metadata on picture.php (table or line presentation
+// avalaible)
+$conf['show_exif'] = true;
+
+// show_exif_fields : in EXIF fields, you can choose to display fields in
+// sub-arrays, for example ['COMPUTED']['ApertureFNumber']. for this, add
+// 'COMPUTED;ApertureFNumber' in $conf['show_exif_fields']
+//
+// The key displayed in picture.php will be $lang['exif_field_Make'] for
+// example and if it exists. For compound fields, only take into account the
+// last part : for key 'COMPUTED;ApertureFNumber', you need
+// $lang['exif_field_ApertureFNumber']
+//
+// for PHP version newer than 4.1.2 :
+// $conf['show_exif_fields'] = array('CameraMake','CameraModel','DateTime');
+//
+$conf['show_exif_fields'] = array(
+  'Make',
+  'Model',
+  'DateTimeOriginal',
+  'COMPUTED;ApertureFNumber'
+  );
+
+// use_exif: Use EXIF data during database synchronization with files
+// metadata
+$conf['use_exif'] = true;
+
+// use_exif_mapping: same behaviour as use_iptc_mapping
+$conf['use_exif_mapping'] = array(
+  'date_creation' => 'DateTimeOriginal'
+  );
+
+// +-----------------------------------------------------------------------+
+// |                               sessions                                |
+// +-----------------------------------------------------------------------+
+
+// session_use_cookies: specifies to use cookie to store
+// the session id on client side
+$conf['session_use_cookies'] = true;
+
+// session_use_only_cookies: specifies to only use cookie to store
+// the session id on client side
+$conf['session_use_only_cookies'] = true;
+
+// session_use_trans_sid: do not use transparent session id support
+$conf['session_use_trans_sid'] = false;
+
+// session_name: specifies the name of the session which is used as cookie name
+$conf['session_name'] = 'pwg_id';
+
+// session_save_handler: comment the line below
+// to use file handler for sessions.
+$conf['session_save_handler'] = 'db';
+
+// authorize_remembering : permits user to stay logged for a long time. It
+// creates a cookie on client side.
+$conf['authorize_remembering'] = true;
+
+// remember_me_name: specifies the name of the cookie used to stay logged
+$conf['remember_me_name'] = 'pwg_remember';
+
+// remember_me_length : time of validity for "remember me" cookies, in
+// seconds.
+$conf['remember_me_length'] = 5184000;
+
+// session_length : time of validity for normal session, in seconds.
+$conf['session_length'] = 3600;
+
+// +-----------------------------------------------------------------------+
+// |                            debug/performance                          |
+// +-----------------------------------------------------------------------+
+
+// show_queries : for debug purpose, show queries and execution times
+$conf['show_queries'] = false;
+
+// show_gt : display generation time at the bottom of each page
+$conf['show_gt'] = true;
+
+// debug_l10n : display a warning message each time an unset language key is
+// accessed
+$conf['debug_l10n'] = false;
+
+// activate template debugging - a new window will appear
+$conf['debug_template'] = false;
+
+// save copies of sent mails into local data dir
+$conf['debug_mail'] = false;
+
+// die_on_sql_error: if an SQL query fails, should everything stop?
+$conf['die_on_sql_error'] = true;
+
+// if true, some language strings are replaced during template compilation
+// (insted of template output). this results in better performance. however
+// any change in the language file will not be propagated until you purge
+// the compiled templates from the admin / maintenance menu
+$conf['compiled_template_cache_language'] = false;
+
+// This tells Smarty whether to check for recompiling or not. Recompiling
+// does not need to happen unless a template is changed. false results in
+// better performance.
+$conf['template_compile_check'] = true;
+
+// This forces Smarty to (re)compile templates on every invocation. This is
+// handy for development and debugging. It should never be used in a
+// production environment.
+$conf['template_force_compile'] = false;
+
+// activate merging of javascript / css files
+$conf['template_combine_files'] = true;
+
+// this permit to show the php errors reporting (see INI 'error_reporting'
+// for possible values)
+// gives an empty value '' to deactivate
+$conf['show_php_errors'] = E_ALL;
+
+// enable log for i derivative script
+$conf['enable_i_log'] = false;
+
+// +-----------------------------------------------------------------------+
+// |                            authentication                             |
+// +-----------------------------------------------------------------------+
+
+// apache_authentication : use Apache authentication as reference instead of
+// users table ?
+$conf['apache_authentication'] = false;
+
+// users_table: which table is the reference for users? Can be a different
+// table than Piwigo table
+//
+// If you decide to use another table than the default one, you need to
+// prepare your database by deleting some datas :
+//
+// delete from piwigo_user_access;
+// delete from piwigo_user_cache;
+// delete from piwigo_user_feed;
+// delete from piwigo_user_group;
+// delete from piwigo_user_infos;
+// delete from piwigo_sessions;
+// delete from piwigo_rate;
+// update piwigo_images set rating_score = null;
+// delete from piwigo_caddie;
+// delete from piwigo_favorites;
+//
+// All informations contained in these tables and column are related to
+// piwigo_users table.
+$conf['users_table'] = null;
+
+// If you decide to use external authentication
+// change conf below by $conf['external_authentification'] = true;
+$conf['external_authentification'] = false;
+
+// Other tables can be changed, if you define associated constants
+// Example:
+//   define('USER_INFOS_TABLE', 'pwg_main'.'user_infos');
+
+// user_fields : mapping between generic field names and table specific
+// field names. For example, in PWG, the mail address is names
+// "mail_address" and in punbb, it's called "email".
+$conf['user_fields'] = array(
+  'id' => 'id',
+  'username' => 'username',
+  'password' => 'password',
+  'email' => 'mail_address'
+  );
+
+// pass_convert : function to crypt or hash the clear user password to store
+// it in the database
+$conf['pass_convert'] = create_function('$s', 'return md5($s);');
+
+// guest_id : id of the anonymous user
+$conf['guest_id'] = 2;
+// default_user_id : id of user used for default value
+$conf['default_user_id'] = $conf['guest_id'];
+
+// Registering process and guest/generic members get language from the browser
+// if language isn't available PHPWG_DEFAULT_LANGUAGE is used as previously
+$conf['browser_language'] = true;
+
+// webmaster_id : webmaster'id.
+$conf['webmaster_id'] = 1;
+
+// does the guest have access ?
+// (not a security feature, set your categories "private" too)
+// If false it'll be redirected from index.php to identification.php
+$conf['guest_access'] = true;
+
+// +-----------------------------------------------------------------------+
+// |                               history                                 |
+// +-----------------------------------------------------------------------+
+
+// nb_logs_page :  how many logs to display on a page
+$conf['nb_logs_page'] = 300;
+
+// +-----------------------------------------------------------------------+
+// |                                 urls                                  |
+// +-----------------------------------------------------------------------+
+
+// gallery_url : you can set a specific URL for the home page of your
+// gallery. This is for very specific use and you don't need to change this
+// setting when move your gallery to a new directory or a new domain name.
+$conf['gallery_url'] = null;
+
+// question_mark_in_urls : the generated urls contain a ? sign. This can be
+// changed to false only if the server translates PATH_INFO variable
+// (depends on the server AcceptPathInfo directive configuration)
+$conf['question_mark_in_urls'] = true;
+
+// php_extension_in_urls : if true, the urls generated for picture and
+// category will not contain the .php extension. This will work only if
+// .htaccess defines Options +MultiViews parameter or url rewriting rules
+// are active.
+$conf['php_extension_in_urls'] = true;
+
+// category_url_style : one of 'id' (default) or 'id-name'. 'id-name'
+// means that an simplified ascii represntation of the category name will
+// appear in the url
+$conf['category_url_style'] = 'id';
+
+// picture_url_style : one of 'id' (default), 'id-file' or 'file'. 'id-file'
+// or 'file' mean that the file name (without extension will appear in the
+// url). Note that one aditionnal sql query will occur if 'file' is choosen.
+// Note that you might experience navigation issues if you choose 'file'
+// and your file names are not unique
+$conf['picture_url_style'] = 'id';
+
+// tag_url_style : one of 'id-tag' (default), 'id' or 'tag'.
+// Note that if you choose 'tag' and the url (ascii) representation of your
+// tags is not unique, all tags with the same url representation will be shown
+$conf['tag_url_style'] = 'id-tag';
+
+// +-----------------------------------------------------------------------+
+// |                                 tags                                  |
+// +-----------------------------------------------------------------------+
+
+// full_tag_cloud_items_number: number of tags to show in the full tag
+// cloud. Only the most represented tags will be shown
+$conf['full_tag_cloud_items_number'] = 200;
+
+// menubar_tag_cloud_items_number: number of tags to show in the tag
+// cloud in the menubar. Only the most represented tags will be shown
+$conf['menubar_tag_cloud_items_number'] = 20;
+
+// content_tag_cloud_items_number: number of related tags to show in the tag
+// cloud on the content page, when the current section is not a set of
+// tags. Only the most represented tags will be shown
+$conf['content_tag_cloud_items_number'] = 12;
+
+// tags_levels: number of levels to use for display. Each level is bind to a
+// CSS class tagLevelX.
+$conf['tags_levels'] = 5;
+
+// tags_default_display_mode: group tags by letter or display a tag cloud by
+// default? 'letters' or 'cloud'.
+$conf['tags_default_display_mode'] = 'cloud';
+
+// tag_letters_column_number: how many columns to display tags by letter
+$conf['tag_letters_column_number'] = 4;
+
+// +-----------------------------------------------------------------------+
+// | Notification by mail                                                  |
+// +-----------------------------------------------------------------------+
+
+// Default Value for nbm user
+$conf['nbm_default_value_user_enabled'] = false;
+
+// Search list user to send quickly (List all without to check news)
+// More quickly but less fun to use
+$conf['nbm_list_all_enabled_users_to_send'] = false;
+
+// Max time used on one pass in order to send mails.
+// Timeout delay ratio.
+$conf['nbm_max_treatment_timeout_percent'] = 0.8;
+
+// If timeout cannot be compite with nbm_max_treatment_timeout_percent,
+// nbm_treatment_timeout_default is used by default
+$conf['nbm_treatment_timeout_default'] = 20;
+
+// Parameters used in get_recent_post_dates for the 2 kind of notification
+$conf['recent_post_dates'] = array(
+  'RSS' => array('max_dates' => 5, 'max_elements' => 6, 'max_cats' => 6),
+  'NBM' => array('max_dates' => 7, 'max_elements' => 3, 'max_cats' => 9)
+  );
+
+// the author shown in the RSS feed <author> element
+$conf['rss_feed_author'] = 'Piwigo notifier';
+
+// +-----------------------------------------------------------------------+
+// | Set admin layout                                                      |
+// +-----------------------------------------------------------------------+
+
+$conf['admin_theme'] = 'roma';
+
+// should we load the active plugins ? true=Yes, false=No
+$conf['enable_plugins']=true;
+
+// Web services are allowed (true) or completely forbidden (false)
+$conf['allow_web_services'] = true;
+
+// enable log for web services
+$conf['ws_enable_log'] = false;
+
+// web services log file path
+$conf['ws_log_filepath'] = '/tmp/piwigo_ws.log';
+
+// Maximum number of images to be returned foreach call to the web service
+$conf['ws_max_images_per_page'] = 500;
+
+// Display a link to subscribe to Piwigo Announcements Newsletter
+$conf['show_newsletter_subscription'] = true;
+
+// +-----------------------------------------------------------------------+
+// | Filter                                                                |
+// +-----------------------------------------------------------------------+
+// $conf['filter_pages'] contains configuration for each pages
+//   o If values are not defined for a specific page, default value are used
+//   o Array is composed by the basename of each page without extention
+//   o List of value names:
+//     - used: filter function are used
+//       (if false nothing is done [start, cancel, stop, ...]
+//     - cancel: cancel current started filter
+//     - add_notes: add notes about current started filter on the header
+//   o Empty configuration in order to disable completely filter functions
+//     No filter, No icon,...
+//     $conf['filter_pages'] = array();
+$conf['filter_pages'] = array
+  (
+    // Default page
+    'default' => array(
+      'used' => true, 'cancel' => false, 'add_notes' => false),
+    // Real pages
+    'index' => array('add_notes' => true),
+    'tags' => array('add_notes' => true),
+    'search' => array('add_notes' => true),
+    'comments' => array('add_notes' => true),
+    'admin' => array('used' => false),
+    'feed' => array('used' => false),
+    'notification' => array('used' => false),
+    'nbm' => array('used' => false),
+    'popuphelp' => array('used' => false),
+    'profile' => array('used' => false),
+    'ws' => array('used' => false),
+    'identification' => array('cancel' => true),
+    'install' => array('cancel' => true),
+    'password' => array('cancel' => true),
+    'register' => array('cancel' => true),
+  );
+
+// +-----------------------------------------------------------------------+
+// | Slideshow                                                             |
+// +-----------------------------------------------------------------------+
+// slideshow_period : waiting time in seconds before loading a new page
+// during automated slideshow
+// slideshow_period_min, slideshow_period_max are bounds of slideshow_period
+// slideshow_period_step is the step of navigation between min and max
+$conf['slideshow_period_min'] = 1;
+$conf['slideshow_period_max'] = 10;
+$conf['slideshow_period_step'] = 1;
+$conf['slideshow_period'] = 4;
+
+// slideshow_repeat : slideshow loops on pictures
+$conf['slideshow_repeat'] = true;
+
+// $conf['light_slideshow'] indicates to use slideshow.tpl in state of
+// picture.tpl for slideshow
+// Take care to have slideshow.tpl in all available templates
+// Or set it false.
+// Check if Picture's plugins are compliant with it
+// Every plugin from 1.7 would be design to manage light_slideshow case.
+$conf['light_slideshow'] = true;
+
+// the local data directory is used to store data such as compiled templates,
+// plugin variables, combined css/javascript or resized images. Beware of
+// mandatory trailing slash.
+$conf['data_location'] = '_data/';
+
+// where should the API/UploadForm add photos? This path must be relative to
+// the Piwigo installation directory (but can be outside, as long as it's
+// reachable from your webserver).
+$conf['upload_dir'] = './upload';
+
+// where should the user be guided when there is no photo in his gallery yet?
+$conf['no_photo_yet_url'] = 'admin.php?page=photos_add';
+
+// directory with themes inside
+$conf['themes_dir'] = PHPWG_ROOT_PATH.'themes';
+
+// pLoader direct download url for windows
+$conf['ploader_download_windows'] = 'http://piwigo.org/ext/download.php?eid=270';
+
+// pLoader direct download url for mac
+$conf['ploader_download_mac'] = 'http://piwigo.org/ext/download.php?eid=353';
+
+// pLoader direct download url for linux
+$conf['ploader_download_linux'] = 'http://piwigo.org/ext/download.php?eid=269';
+
+// enable the synchronization method for adding photos
+$conf['enable_synchronization'] = true;
+
+// permitted characters for files/directoris during synchronization
+$conf['sync_chars_regex'] = '/^[a-zA-Z0-9-_.]+$/';
+
+// PEM url
+$conf['alternative_pem_url'] = '';
+
+// based on the EXIF "orientation" tag, should we rotate photos added in the
+// upload form or through pwg.images.addSimple web API method?
+$conf['upload_form_automatic_rotation'] = true;
+
+// 0-'auto', 1-'derivative' 2-'script'
+$conf['derivative_url_style']=0;
+
+$conf['chmod_value']= substr_compare(PHP_SAPI, 'apa', 0, 3)==0 ? 0777 : 0755;
+?>
Index: tags/2.4.0RC3/include/constants.php
===================================================================
--- tags/2.4.0RC3/include/constants.php	(revision 14585)
+++ tags/2.4.0RC3/include/constants.php	(revision 14585)
@@ -0,0 +1,109 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Default settings
+define('PHPWG_VERSION', '2.4.0RC3');
+define('PHPWG_DEFAULT_LANGUAGE', 'en_UK');
+define('PHPWG_DEFAULT_TEMPLATE', 'elegant');
+
+define('PHPWG_THEMES_PATH', $conf['themes_dir'].'/');
+defined('PWG_COMBINED_DIR') or define('PWG_COMBINED_DIR', $conf['data_location'].'combined/');
+defined('PWG_DERIVATIVE_DIR') or define('PWG_DERIVATIVE_DIR', $conf['data_location'].'i/');
+
+// Required versions
+define('REQUIRED_PHP_VERSION', '5.0.0');
+
+// Access codes
+define('ACCESS_FREE', 0);
+define('ACCESS_GUEST', 1);
+define('ACCESS_CLASSIC', 2);
+define('ACCESS_ADMINISTRATOR', 3);
+define('ACCESS_WEBMASTER', 4);
+define('ACCESS_CLOSED', 5);
+
+// Sanity checks
+define('PATTERN_ID', '/^\d+$/');
+
+// Table names
+if (!defined('CATEGORIES_TABLE'))
+  define('CATEGORIES_TABLE', $prefixeTable.'categories');
+if (!defined('COMMENTS_TABLE'))
+  define('COMMENTS_TABLE', $prefixeTable.'comments');
+if (!defined('CONFIG_TABLE'))
+  define('CONFIG_TABLE', $prefixeTable.'config');
+if (!defined('FAVORITES_TABLE'))
+  define('FAVORITES_TABLE', $prefixeTable.'favorites');
+if (!defined('GROUP_ACCESS_TABLE'))
+  define('GROUP_ACCESS_TABLE', $prefixeTable.'group_access');
+if (!defined('GROUPS_TABLE'))
+  define('GROUPS_TABLE', $prefixeTable.'groups');
+if (!defined('HISTORY_TABLE'))
+  define('HISTORY_TABLE', $prefixeTable.'history');
+if (!defined('HISTORY_SUMMARY_TABLE'))
+  define('HISTORY_SUMMARY_TABLE', $prefixeTable.'history_summary');
+if (!defined('IMAGE_CATEGORY_TABLE'))
+  define('IMAGE_CATEGORY_TABLE', $prefixeTable.'image_category');
+if (!defined('IMAGES_TABLE'))
+  define('IMAGES_TABLE', $prefixeTable.'images');
+if (!defined('SESSIONS_TABLE'))
+  define('SESSIONS_TABLE', $prefixeTable.'sessions');
+if (!defined('SITES_TABLE'))
+  define('SITES_TABLE', $prefixeTable.'sites');
+if (!defined('USER_ACCESS_TABLE'))
+  define('USER_ACCESS_TABLE', $prefixeTable.'user_access');
+if (!defined('USER_GROUP_TABLE'))
+  define('USER_GROUP_TABLE', $prefixeTable.'user_group');
+if (!defined('USERS_TABLE'))
+  define('USERS_TABLE', isset($conf['users_table']) ? $conf['users_table'] : $prefixeTable.'users' );
+if (!defined('USER_INFOS_TABLE'))
+  define('USER_INFOS_TABLE', $prefixeTable.'user_infos');
+if (!defined('USER_FEED_TABLE'))
+  define('USER_FEED_TABLE', $prefixeTable.'user_feed');
+if (!defined('RATE_TABLE'))
+  define('RATE_TABLE', $prefixeTable.'rate');
+if (!defined('USER_CACHE_TABLE'))
+  define('USER_CACHE_TABLE', $prefixeTable.'user_cache');
+if (!defined('USER_CACHE_CATEGORIES_TABLE'))
+  define('USER_CACHE_CATEGORIES_TABLE', $prefixeTable.'user_cache_categories');
+if (!defined('CADDIE_TABLE'))
+  define('CADDIE_TABLE', $prefixeTable.'caddie');
+if (!defined('UPGRADE_TABLE'))
+  define('UPGRADE_TABLE', $prefixeTable.'upgrade');
+if (!defined('SEARCH_TABLE'))
+  define('SEARCH_TABLE', $prefixeTable.'search');
+if (!defined('USER_MAIL_NOTIFICATION_TABLE'))
+  define('USER_MAIL_NOTIFICATION_TABLE', $prefixeTable.'user_mail_notification');
+if (!defined('TAGS_TABLE'))
+  define('TAGS_TABLE', $prefixeTable.'tags');
+if (!defined('IMAGE_TAG_TABLE'))
+  define('IMAGE_TAG_TABLE', $prefixeTable.'image_tag');
+if (!defined('PLUGINS_TABLE'))
+  define('PLUGINS_TABLE', $prefixeTable.'plugins');
+if (!defined('OLD_PERMALINKS_TABLE'))
+  define('OLD_PERMALINKS_TABLE', $prefixeTable.'old_permalinks');
+if (!defined('THEMES_TABLE'))
+  define('THEMES_TABLE', $prefixeTable.'themes');
+if (!defined('LANGUAGES_TABLE'))
+  define('LANGUAGES_TABLE', $prefixeTable.'languages');
+
+?>
Index: tags/2.4.0RC3/include/cssmin.class.php
===================================================================
--- tags/2.4.0RC3/include/cssmin.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/cssmin.class.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+/**
+ * CssMin - A (simple) css minifier with benefits
+ * 
+ * --
+ * Copyright (c) 2011 Joe Scylla <joe.scylla@gmail.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ * --
+ * 
+ * @package		CssMin
+ * @link		http://code.google.com/p/cssmin/
+ * @author		Joe Scylla <joe.scylla@gmail.com>
+ * @copyright	2008 - 2011 Joe Scylla <joe.scylla@gmail.com>
+ * @license		http://opensource.org/licenses/mit-license.php MIT License
+ * @version		3.0.1
+ */
+ abstract class aCssToken { abstract public function __toString(); } abstract class aCssRulesetStartToken extends aCssToken { } abstract class aCssRulesetEndToken extends aCssToken { public function __toString() { return "}"; } } abstract class aCssParserPlugin { protected $configuration = array(); protected $parser = null; protected $buffer = ""; public function __construct(CssParser $parser, array $configuration = null) { $this->configuration = $configuration; $this->parser = $parser; } abstract public function getTriggerChars(); abstract public function getTriggerStates(); abstract public function parse($index, $char, $previousChar, $state); } abstract class aCssMinifierPlugin { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(aCssToken &$token); abstract public function getTriggerTokens(); } abstract class aCssMinifierFilter { protected $configuration = array(); protected $minifier = null; public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->configuration = $configuration; $this->minifier = $minifier; } abstract public function apply(array &$tokens); } abstract class aCssFormatter { protected $indent = "    "; protected $padding = 0; protected $tokens = array(); public function __construct(array $tokens, $indent = null, $padding = null) { $this->tokens = $tokens; $this->indent = !is_null($indent) ? $indent : $this->indent; $this->padding = !is_null($padding) ? $padding : $this->padding; } abstract public function __toString(); } abstract class aCssDeclarationToken extends aCssToken { public $IsImportant = false; public $IsLast = false; public $Property = ""; public $Value = ""; public function __construct($property, $value, $isImportant = false, $isLast = false) { $this->Property = $property; $this->Value = $value; $this->IsImportant = $isImportant; $this->IsLast = $isLast; } public function __toString() { return $this->Property . ":" . $this->Value . ($this->IsImportant ? " !important" : "") . ($this->IsLast ? "" : ";"); } } abstract class aCssAtBlockStartToken extends aCssToken { } abstract class aCssAtBlockEndToken extends aCssToken { public function __toString() { return "}"; } } class CssWhitesmithsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\""; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page"; $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors); $r[] = $this->indent . $indent . "{"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $r[] = $indent . "}"; $level--; } } return implode("\n", $r); } } class CssVariablesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/var\((.+)\)/iSU"; private $variables = null; public function getVariables() { return $this->variables; } public function apply(aCssToken &$token) { if (stripos($token->Value, "var") !== false && preg_match_all($this->reMatch, $token->Value, $m)) { $mediaTypes = $token->MediaTypes; if (!in_array("all", $mediaTypes)) { $mediaTypes[] = "all"; } for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variable = trim($m[1][$i]); foreach ($mediaTypes as $mediaType) { if (isset($this->variables[$mediaType], $this->variables[$mediaType][$variable])) { $token->Value = str_replace($m[0][$i], $this->variables[$mediaType][$variable], $token->Value); continue 2; } } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": No value found for variable <code>" . $variable . "</code> in media types <code>" . implode(", ", $mediaTypes) . "</code>", (string) $token)); $token = new CssNullToken(); return true; } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } public function setVariables(array $variables) { $this->variables = $variables; } } class CssVariablesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $variables = array(); $defaultMediaTypes = array("all"); $mediaTypes = array(); $remove = array(); for($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesStartToken") { $remove[] = $i; $mediaTypes = (count($tokens[$i]->MediaTypes) == 0 ? $defaultMediaTypes : $tokens[$i]->MediaTypes); foreach ($mediaTypes as $mediaType) { if (!isset($variables[$mediaType])) { $variables[$mediaType] = array(); } } for($i = $i; $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtVariablesDeclarationToken") { foreach ($mediaTypes as $mediaType) { $variables[$mediaType][$tokens[$i]->Property] = $tokens[$i]->Value; } $remove[] = $i; } elseif (get_class($tokens[$i]) === "CssAtVariablesEndToken") { $remove[] = $i; break; } } } } foreach($variables as $mediaType => $null) { foreach($variables[$mediaType] as $variable => $value) { if (stripos($value, "var") !== false && preg_match_all("/var\((.+)\)/iSU", $value, $m)) { for ($i = 0, $l = count($m[0]); $i < $l; $i++) { $variables[$mediaType][$variable] = str_replace($m[0][$i], (isset($variables[$mediaType][$m[1][$i]]) ? $variables[$mediaType][$m[1][$i]] : ""), $variables[$mediaType][$variable]); } } } } foreach ($remove as $i) { $tokens[$i] = null; } if (!($plugin = $this->minifier->getPlugin("CssVariablesMinifierPlugin"))) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>CssVariablesMinifierPlugin</code> was not found but is required for <code>" . __CLASS__ . "</code>")); } else { $plugin->setVariables($variables); } return count($remove); } } class CssUrlParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("(", ")"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 3, 4)) === "url(" && $state !== "T_URL") { $this->parser->pushState("T_URL"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_URL") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_URL") { $line = $this->parser->getBuffer(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . ")"); $this->parser->popState(); $this->parser->unsetExclusive(); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); } elseif ($char === ")" && $state === "T_URL") { $this->parser->popState(); $this->parser->unsetExclusive(); } else { return false; } return true; } } class CssStringParserPlugin extends aCssParserPlugin { private $delimiterChar = null; public function getTriggerChars() { return array("\"", "'", "\n"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if (($char === "\"" || $char === "'") && $state !== "T_STRING") { $this->delimiterChar = $char; $this->parser->pushState("T_STRING"); $this->parser->setExclusive(__CLASS__); } elseif ($char === "\n" && $previousChar === "\\" && $state === "T_STRING") { $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -2)); } elseif ($char === "\n" && $previousChar !== "\\" && $state === "T_STRING") { $line = $this->parser->getBuffer(); $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->setBuffer(substr($this->parser->getBuffer(), 0, -1) . $this->delimiterChar); CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated string literal", $line . "_")); $this->delimiterChar = null; } elseif ($char === $this->delimiterChar && $state === "T_STRING") { if ($previousChar == "\\") { $source = $this->parser->getSource(); $c = 1; $i = $index - 2; while (substr($source, $i, 1) === "\\") { $c++; $i--; } if ($c % 2) { return false; } } $this->parser->popState(); $this->parser->unsetExclusive(); $this->delimiterChar = null; } else { return false; } return true; } } class CssSortRulesetPropertiesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) !== "CssRulesetStartToken") { continue; } $endIndex = false; for ($ii = $i + 1; $ii < $l; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetEndToken") { continue; } $endIndex = $ii; break; } if (!$endIndex) { break; } $startIndex = $i; $i = $endIndex; if ($endIndex - $startIndex <= 2) { continue; } for ($ii = $startIndex + 1; $ii < $endIndex; $ii++) { if (get_class($tokens[$ii]) !== "CssRulesetDeclarationToken") { continue(2); } } $declarations = array_slice($tokens, $startIndex + 1, $endIndex - $startIndex - 1); $sortRequired = $lastPropertyName = false; foreach ($declarations as $declaration) { if ($lastPropertyName) { if (strcmp($lastPropertyName, $declaration->Property) > 0) { $sortRequired = true; break; } } $lastPropertyName = $declaration->Property; } if (!$sortRequired) { continue; } usort($declarations, array(__CLASS__, "userDefinedSort1")); for ($ii = 0, $ll = count($declarations) - 1; $ii <= $ll; $ii++) { if ($ii == $ll) { $declarations[$ii]->IsLast = true; } else { $declarations[$ii]->IsLast = false; } } array_splice($tokens, $startIndex + 1, $endIndex - $startIndex - 1, $declarations); $r += $endIndex - $startIndex - 1; } return $r; } public static function userDefinedSort1($a, $b) { return strcmp($a->Property, $b->Property); } } class CssRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssRulesetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array(",", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA", "T_RULESET::SELECTORS", "T_RULESET", "T_RULESET_DECLARATION"); } private $selectors = array(); public function parse($index, $char, $previousChar, $state) { if ($char === "," && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($state !== "T_RULESET::SELECTORS") { $this->parser->pushState("T_RULESET::SELECTORS"); } $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && ($state === "T_DOCUMENT" || $state === "T_AT_MEDIA" || $state === "T_RULESET::SELECTORS")) { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); if ($state == "T_RULESET::SELECTORS") { $this->parser->popState(); } $this->parser->pushState("T_RULESET"); $this->parser->appendToken(new CssRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_RULESET") { $this->parser->pushState("T_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssRulesetDeclarationToken($this->buffer, $value, $this->parser->getMediaTypes(), $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_RULESET") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssRulesetEndToken()); $this->buffer = ""; $this->selectors = array(); } else { return false; } return true; } } class CssRulesetEndToken extends aCssRulesetEndToken { } class CssRulesetDeclarationToken extends aCssDeclarationToken { public $MediaTypes = array("all"); public function __construct($property, $value, $mediaTypes = null, $isImportant = false, $isLast = false) { parent::__construct($property, $value, $isImportant, $isLast); $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } } class CssRemoveLastDelarationSemiColonMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i+1]) ? get_class($tokens[$i+1]) : false; if (($current === "CssRulesetDeclarationToken" && $next === "CssRulesetEndToken") || ($current === "CssAtFontFaceDeclarationToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtPageDeclarationToken" && $next === "CssAtPageEndToken")) { $tokens[$i]->IsLast = true; } } return 0; } } class CssRemoveEmptyRulesetsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssRulesetStartToken" && $next === "CssRulesetEndToken") || ($current === "CssAtKeyframesRulesetStartToken" && $next === "CssAtKeyframesRulesetEndToken" && !array_intersect(array("from", "0%", "to", "100%"), array_map("strtolower", $tokens[$i]->Selectors))) ) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveEmptyAtBlocksMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { $current = get_class($tokens[$i]); $next = isset($tokens[$i + 1]) ? get_class($tokens[$i + 1]) : false; if (($current === "CssAtFontFaceStartToken" && $next === "CssAtFontFaceEndToken") || ($current === "CssAtKeyframesStartToken" && $next === "CssAtKeyframesEndToken") || ($current === "CssAtPageStartToken" && $next === "CssAtPageEndToken") || ($current === "CssAtMediaStartToken" && $next === "CssAtMediaEndToken")) { $tokens[$i] = null; $tokens[$i + 1] = null; $i++; $r = $r + 2; } } return $r; } } class CssRemoveCommentsMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssCommentToken") { $tokens[$i] = null; $r++; } } return $r; } } class CssParser { private $buffer = ""; private $plugins = array(); private $source = ""; private $state = "T_DOCUMENT"; private $stateExclusive = false; private $stateMediaTypes = false; private $states = array("T_DOCUMENT"); private $tokens = array(); public function __construct($source = null, array $plugins = null) { $plugins = array_merge(array ( "Comment" => true, "String" => true, "Url" => true, "Expression" => true, "Ruleset" => true, "AtCharset" => true, "AtFontFace" => true, "AtImport" => true, "AtKeyframes" => true, "AtMedia" => true, "AtPage" => true, "AtVariables" => true ), is_array($plugins) ? $plugins : array()); foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "ParserPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->parse($source); } } public function appendToken(aCssToken $token) { $this->tokens[] = $token; } public function clearBuffer() { $this->buffer = ""; } public function getAndClearBuffer($trim = "", $tolower = false) { $r = $this->getBuffer($trim, $tolower); $this->buffer = ""; return $r; } public function getBuffer($trim = "", $tolower = false) { $r = $this->buffer; if ($trim) { $r = trim($r, " \t\n\r\0\x0B" . $trim); } if ($tolower) { $r = strtolower($r); } return $r; } public function getMediaTypes() { return $this->stateMediaTypes; } public function getSource() { return $this->source; } public function getState() { return $this->state; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function getTokens() { return $this->tokens; } public function isState($state) { return ($this->state == $state); } public function parse($source) { $this->source = ""; $this->tokens = array(); $globalTriggerChars = ""; $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerStates = array(); $pluginTriggerChars = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerChars[$i] = implode("", $plugins[$i]->getTriggerChars()); $tPluginTriggerStates = $plugins[$i]->getTriggerStates(); $pluginTriggerStates[$i] = $tPluginTriggerStates === false ? false : "|" . implode("|", $tPluginTriggerStates) . "|"; $pluginIndex[$tPluginClassName] = $i; for ($ii = 0, $ll = strlen($pluginTriggerChars[$i]); $ii < $ll; $ii++) { $c = substr($pluginTriggerChars[$i], $ii, 1); if (strpos($globalTriggerChars, $c) === false) { $globalTriggerChars .= $c; } } } $source = str_replace("\r\n", "\n", $source); $source = str_replace("\r", "\n", $source); $this->source = $source; $buffer = &$this->buffer; $exclusive = &$this->stateExclusive; $state = &$this->state; $c = $p = null; for ($i = 0, $l = strlen($source); $i < $l; $i++) { $c = $source[$i]; if ($exclusive === false) { if ($c === "\n" || $c === "\t") { $c = " "; } if ($c === " " && $p === " ") { continue; } } $buffer .= $c; if (strpos($globalTriggerChars, $c) !== false) { if ($exclusive) { $tPluginIndex = $pluginIndex[$exclusive]; if (strpos($pluginTriggerChars[$tPluginIndex], $c) !== false && ($pluginTriggerStates[$tPluginIndex] === false || strpos($pluginTriggerStates[$tPluginIndex], $state) !== false)) { $r = $plugins[$tPluginIndex]->parse($i, $c, $p, $state); if ($r === true) { continue; } elseif ($r !== false && $r != $i) { $i = $r; continue; } } } else { $triggerState = "|" . $state . "|"; for ($ii = 0, $ll = $pluginCount; $ii < $ll; $ii++) { if (strpos($pluginTriggerChars[$ii], $c) !== false && ($pluginTriggerStates[$ii] === false || strpos($pluginTriggerStates[$ii], $triggerState) !== false)) { $r = $plugins[$ii]->parse($i, $c, $p, $state); if ($r === true) { break; } elseif ($r !== false && $r != $i) { $i = $r; break; } } } } } $p = $c; } return $this->tokens; } public function popState() { $r = array_pop($this->states); $this->state = $this->states[count($this->states) - 1]; return $r; } public function pushState($state) { $r = array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function setBuffer($buffer) { $this->buffer = $buffer; } public function setExclusive($exclusive) { $this->stateExclusive = $exclusive; } public function setMediaTypes(array $mediaTypes) { $this->stateMediaTypes = $mediaTypes; } public function setState($state) { $r = array_pop($this->states); array_push($this->states, $state); $this->state = $this->states[count($this->states) - 1]; return $r; } public function unsetExclusive() { $this->stateExclusive = false; } public function unsetMediaTypes() { $this->stateMediaTypes = false; } } class CssOtbsFormatter extends aCssFormatter { public function __toString() { $r = array(); $level = 0; for ($i = 0, $l = count($this->tokens); $i < $l; $i++) { $token = $this->tokens[$i]; $class = get_class($token); $indent = str_repeat($this->indent, $level); if ($class === "CssCommentToken") { $lines = array_map("trim", explode("\n", $token->Comment)); for ($ii = 0, $ll = count($lines); $ii < $ll; $ii++) { $r[] = $indent . (substr($lines[$ii], 0, 1) == "*" ? " " : "") . $lines[$ii]; } } elseif ($class === "CssAtCharsetToken") { $r[] = $indent . "@charset " . $token->Charset . ";"; } elseif ($class === "CssAtFontFaceStartToken") { $r[] = $indent . "@font-face {"; $level++; } elseif ($class === "CssAtImportToken") { $r[] = $indent . "@import " . $token->Import . " " . implode(", ", $token->MediaTypes) . ";"; } elseif ($class === "CssAtKeyframesStartToken") { $r[] = $indent . "@keyframes \"" . $token->Name . "\" {"; $level++; } elseif ($class === "CssAtMediaStartToken") { $r[] = $indent . "@media " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssAtPageStartToken") { $r[] = $indent . "@page {"; $level++; } elseif ($class === "CssAtVariablesStartToken") { $r[] = $indent . "@variables " . implode(", ", $token->MediaTypes) . " {"; $level++; } elseif ($class === "CssRulesetStartToken" || $class === "CssAtKeyframesRulesetStartToken") { $r[] = $indent . implode(", ", $token->Selectors) . " {"; $level++; } elseif ($class == "CssAtFontFaceDeclarationToken" || $class === "CssAtKeyframesRulesetDeclarationToken" || $class === "CssAtPageDeclarationToken" || $class == "CssAtVariablesDeclarationToken" || $class === "CssRulesetDeclarationToken" ) { $declaration = $indent . $token->Property . ": "; if ($this->padding) { $declaration = str_pad($declaration, $this->padding, " ", STR_PAD_RIGHT); } $r[] = $declaration . $token->Value . ($token->IsImportant ? " !important" : "") . ";"; } elseif ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtKeyframesEndToken" || $class === "CssAtKeyframesRulesetEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken" || $class === "CssRulesetEndToken" ) { $level--; $r[] = str_repeat($indent, $level) . "}"; } } return implode("\n", $r); } } class CssNullToken extends aCssToken { public function __toString() { return ""; } } class CssMinifier { private $filters = array(); private $plugins = array(); private $minified = ""; public function __construct($source = null, array $filters = null, array $plugins = null) { $filters = array_merge(array ( "ImportImports" => false, "RemoveComments" => true, "RemoveEmptyRulesets" => true, "RemoveEmptyAtBlocks" => true, "ConvertLevel3Properties" => false, "ConvertLevel3AtKeyframes" => false, "Variables" => true, "RemoveLastDelarationSemiColon" => true ), is_array($filters) ? $filters : array()); $plugins = array_merge(array ( "Variables" => true, "ConvertFontWeight" => false, "ConvertHslColors" => false, "ConvertRgbColors" => false, "ConvertNamedColors" => false, "CompressColorValues" => false, "CompressUnitValues" => false, "CompressExpressionValues" => false ), is_array($plugins) ? $plugins : array()); foreach ($filters as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierFilter"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->filters[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The filter <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } foreach ($plugins as $name => $config) { if ($config !== false) { $class = "Css" . $name . "MinifierPlugin"; $config = is_array($config) ? $config : array(); if (class_exists($class)) { $this->plugins[] = new $class($this, $config); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": The plugin <code>" . $name . "</code> with the class name <code>" . $class . "</code> was not found")); } } } if (!is_null($source)) { $this->minify($source); } } public function getMinified() { return $this->minified; } public function getPlugin($class) { static $index = null; if (is_null($index)) { $index = array(); for ($i = 0, $l = count($this->plugins); $i < $l; $i++) { $index[get_class($this->plugins[$i])] = $i; } } return isset($index[$class]) ? $this->plugins[$index[$class]] : false; } public function minify($source) { $r = ""; $parser = new CssParser($source); $tokens = $parser->getTokens(); $filters = $this->filters; $filterCount = count($this->filters); $plugins = $this->plugins; $pluginCount = count($plugins); $pluginIndex = array(); $pluginTriggerTokens = array(); $globalTriggerTokens = array(); for ($i = 0, $l = count($plugins); $i < $l; $i++) { $tPluginClassName = get_class($plugins[$i]); $pluginTriggerTokens[$i] = $plugins[$i]->getTriggerTokens(); foreach ($pluginTriggerTokens[$i] as $v) { if (!in_array($v, $globalTriggerTokens)) { $globalTriggerTokens[] = $v; } } $pluginTriggerTokens[$i] = "|" . implode("|", $pluginTriggerTokens[$i]) . "|"; $pluginIndex[$tPluginClassName] = $i; } $globalTriggerTokens = "|" . implode("|", $globalTriggerTokens) . "|"; for($i = 0; $i < $filterCount; $i++) { if ($filters[$i]->apply($tokens) > 0) { $tokens = array_values(array_filter($tokens)); } } $tokenCount = count($tokens); for($i = 0; $i < $tokenCount; $i++) { $triggerToken = "|" . get_class($tokens[$i]) . "|"; if (strpos($globalTriggerTokens, $triggerToken) !== false) { for($ii = 0; $ii < $pluginCount; $ii++) { if (strpos($pluginTriggerTokens[$ii], $triggerToken) !== false || $pluginTriggerTokens[$ii] === false) { if ($plugins[$ii]->apply($tokens[$i]) === true) { continue 2; } } } } } for($i = 0; $i < $tokenCount; $i++) { $r .= (string) $tokens[$i]; } $this->minified = $r; return $r; } } class CssMin { private static $classIndex = array(); private static $errors = array(); private static $isVerbose = false; public static function autoload($class) { if (isset(self::$classIndex[$class])) { require(self::$classIndex[$class]); } } public static function getErrors() { return self::$errors; } public static function hasErrors() { return count(self::$errors) > 0; } public static function initialise() { $paths = array(dirname(__FILE__)); while (list($i, $path) = each($paths)) { $subDirectorys = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT); if (is_array($subDirectorys)) { foreach ($subDirectorys as $subDirectory) { $paths[] = $subDirectory; } } $files = glob($path . "*.php", 0); if (is_array($files)) { foreach ($files as $file) { $class = substr(basename($file), 0, -4); self::$classIndex[$class] = $file; } } } krsort(self::$classIndex); if (function_exists("spl_autoload_register") && !is_callable("__autoload")) { spl_autoload_register(array(__CLASS__, "autoload")); } else { foreach (self::$classIndex as $class => $file) { if (!class_exists($class)) { require_once($file); } } } } public static function minify($source, array $filters = null, array $plugins = null) { self::$errors = array(); $minifier = new CssMinifier($source, $filters, $plugins); return $minifier->getMinified(); } public static function parse($source, array $plugins = null) { self::$errors = array(); $parser = new CssParser($source, $plugins); return $parser->getTokens(); } public static function setVerbose($to) { self::$isVerbose = (boolean) $to; return self::$isVerbose; } public static function triggerError(CssError $error) { self::$errors[] = $error; if (self::$isVerbose) { trigger_error((string) $error, E_USER_WARNING); } } } CssMin::initialise(); class CssImportImportsMinifierFilter extends aCssMinifierFilter { private $imported = array(); public function apply(array &$tokens) { if (!isset($this->configuration["BasePath"]) || !is_dir($this->configuration["BasePath"])) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Base path <code>" . ($this->configuration["BasePath"] ? $this->configuration["BasePath"] : "null"). "</code> is not a directory")); return 0; } for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtImportToken") { $import = $this->configuration["BasePath"] . "/" . $tokens[$i]->Import; if (!is_file($import)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was not found.", (string) $tokens[$i])); } elseif (in_array($import, $this->imported)) { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Import file <code>" . $import. "</code> was already imported.", (string) $tokens[$i])); $tokens[$i] = null; } else { $this->imported[] = $import; $parser = new CssParser(file_get_contents($import)); $import = $parser->getTokens(); if (count($tokens[$i]->MediaTypes) > 0 && !(count($tokens[$i]->MediaTypes) == 1 && $tokens[$i]->MediaTypes[0] == "all")) { $blocks = array(); for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtImportToken") { if (count($import[$ii]->MediaTypes) == 0 || (count($import[$ii]->MediaTypes) == 1 && $import[$ii]->MediaTypes[0] == "all")) { $import[$ii]->MediaTypes = $tokens[$i]->MediaTypes; } elseif (count($import[$ii]->MediaTypes > 0)) { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); if (count($import[$ii]->MediaTypes) == 0) { $import[$ii] = null; } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { foreach ($import[$ii]->MediaTypes as $index => $mediaType) { if (!in_array($mediaType, $tokens[$i]->MediaTypes)) { unset($import[$ii]->MediaTypes[$index]); } $import[$ii]->MediaTypes = array_values($import[$ii]->MediaTypes); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken") { if (count($import[$ii]->MediaTypes) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) === "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) === "CssAtMediaEndToken") { array_splice($import, $ii, $iii - $ii + 1, array()); $ll = count($import); } } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { if (get_class($import[$ii]) === "CssAtMediaStartToken" && count(array_diff($tokens[$i]->MediaTypes, $import[$ii]->MediaTypes)) === 0) { for ($iii = $ii; $iii < $ll; $iii++) { if (get_class($import[$iii]) == "CssAtMediaEndToken") { break; } } if (get_class($import[$iii]) == "CssAtMediaEndToken") { unset($import[$ii]); unset($import[$iii]); $import = array_values($import); $ll = count($import); } } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtImportToken" || $class === "CssAtCharsetToken") { $blocks = array_merge($blocks, array_splice($import, $ii, 1, array())); $ll = count($import); } } for($ii = 0, $ll = count($import); $ii < $ll; $ii++) { $class = get_class($import[$ii]); if ($class === "CssAtFontFaceStartToken" || $class === "CssAtMediaStartToken" || $class === "CssAtPageStartToken" || $class === "CssAtVariablesStartToken") { for ($iii = $ii; $iii < $ll; $iii++) { $class = get_class($import[$iii]); if ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken") { break; } } $class = get_class($import[$iii]); if (isset($import[$iii]) && ($class === "CssAtFontFaceEndToken" || $class === "CssAtMediaEndToken" || $class === "CssAtPageEndToken" || $class === "CssAtVariablesEndToken")) { $blocks = array_merge($blocks, array_splice($import, $ii, $iii - $ii + 1, array())); $ll = count($import); } } } $import = array_merge($blocks, array(new CssAtMediaStartToken($tokens[$i]->MediaTypes)), $import, array(new CssAtMediaEndToken())); } array_splice($tokens, $i, 1, $import); $i--; $l = count($tokens); } } } } } class CssExpressionParserPlugin extends aCssParserPlugin { private $leftBraces = 0; private $rightBraces = 0; public function getTriggerChars() { return array("(", ")", ";", "}"); } public function getTriggerStates() { return false; } public function parse($index, $char, $previousChar, $state) { if ($char === "(" && strtolower(substr($this->parser->getSource(), $index - 10, 11)) === "expression(" && $state !== "T_EXPRESSION") { $this->parser->pushState("T_EXPRESSION"); $this->leftBraces++; } elseif ($char === "(" && $state === "T_EXPRESSION") { $this->leftBraces++; } elseif ($char === ")" && $state === "T_EXPRESSION") { $this->rightBraces++; } elseif (($char === ";" || $char === "}") && $state === "T_EXPRESSION" && $this->leftBraces === $this->rightBraces) { $this->leftBraces = $this->rightBraces = 0; $this->parser->popState(); return $index - 1; } else { return false; } return true; } } class CssError { public $File = ""; public $Line = 0; public $Message = ""; public $Source = ""; public function __construct($file, $line, $message, $source = "") { $this->File = $file; $this->Line = $line; $this->Message = $message; $this->Source = $source; } public function __toString() { return $this->Message . ($this->Source ? ": <br /><code>" . $this->Source . "</code>": "") . "<br />in file " . $this->File . " at line " . $this->Line; } } class CssConvertRgbColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/rgb\s*\(\s*([0-9%]+)\s*,\s*([0-9%]+)\s*,\s*([0-9%]+)\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "rgb") !== false && preg_match($this->reMatch, $token->Value, $m)) { for ($i = 1, $l = count($m); $i < $l; $i++) { if (strpos("%", $m[$i]) !== false) { $m[$i] = substr($m[$i], 0, -1); $m[$i] = (int) (256 * ($m[$i] / 100)); } $m[$i] = str_pad(dechex($m[$i]), 2, "0", STR_PAD_LEFT); } $token->Value = str_replace($m[0], "#" . $m[1] . $m[2] . $m[3], $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertNamedColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[strtolower(\"\${2}\")] . \"\${3}\""; private $transformation = array ( "aliceblue" => "#f0f8ff", "antiquewhite" => "#faebd7", "aqua" => "#0ff", "aquamarine" => "#7fffd4", "azure" => "#f0ffff", "beige" => "#f5f5dc", "black" => "#000", "blue" => "#00f", "blueviolet" => "#8a2be2", "brown" => "#a52a2a", "burlywood" => "#deb887", "cadetblue" => "#5f9ea0", "chartreuse" => "#7fff00", "chocolate" => "#d2691e", "coral" => "#ff7f50", "cornflowerblue" => "#6495ed", "cornsilk" => "#fff8dc", "crimson" => "#dc143c", "darkblue" => "#00008b", "darkcyan" => "#008b8b", "darkgoldenrod" => "#b8860b", "darkgray" => "#a9a9a9", "darkgreen" => "#006400", "darkkhaki" => "#bdb76b", "darkmagenta" => "#8b008b", "darkolivegreen" => "#556b2f", "darkorange" => "#ff8c00", "darkorchid" => "#9932cc", "darkred" => "#8b0000", "darksalmon" => "#e9967a", "darkseagreen" => "#8fbc8f", "darkslateblue" => "#483d8b", "darkslategray" => "#2f4f4f", "darkturquoise" => "#00ced1", "darkviolet" => "#9400d3", "deeppink" => "#ff1493", "deepskyblue" => "#00bfff", "dimgray" => "#696969", "dodgerblue" => "#1e90ff", "firebrick" => "#b22222", "floralwhite" => "#fffaf0", "forestgreen" => "#228b22", "fuchsia" => "#f0f", "gainsboro" => "#dcdcdc", "ghostwhite" => "#f8f8ff", "gold" => "#ffd700", "goldenrod" => "#daa520", "gray" => "#808080", "green" => "#008000", "greenyellow" => "#adff2f", "honeydew" => "#f0fff0", "hotpink" => "#ff69b4", "indianred" => "#cd5c5c", "indigo" => "#4b0082", "ivory" => "#fffff0", "khaki" => "#f0e68c", "lavender" => "#e6e6fa", "lavenderblush" => "#fff0f5", "lawngreen" => "#7cfc00", "lemonchiffon" => "#fffacd", "lightblue" => "#add8e6", "lightcoral" => "#f08080", "lightcyan" => "#e0ffff", "lightgoldenrodyellow" => "#fafad2", "lightgreen" => "#90ee90", "lightgrey" => "#d3d3d3", "lightpink" => "#ffb6c1", "lightsalmon" => "#ffa07a", "lightseagreen" => "#20b2aa", "lightskyblue" => "#87cefa", "lightslategray" => "#789", "lightsteelblue" => "#b0c4de", "lightyellow" => "#ffffe0", "lime" => "#0f0", "limegreen" => "#32cd32", "linen" => "#faf0e6", "maroon" => "#800000", "mediumaquamarine" => "#66cdaa", "mediumblue" => "#0000cd", "mediumorchid" => "#ba55d3", "mediumpurple" => "#9370db", "mediumseagreen" => "#3cb371", "mediumslateblue" => "#7b68ee", "mediumspringgreen" => "#00fa9a", "mediumturquoise" => "#48d1cc", "mediumvioletred" => "#c71585", "midnightblue" => "#191970", "mintcream" => "#f5fffa", "mistyrose" => "#ffe4e1", "moccasin" => "#ffe4b5", "navajowhite" => "#ffdead", "navy" => "#000080", "oldlace" => "#fdf5e6", "olive" => "#808000", "olivedrab" => "#6b8e23", "orange" => "#ffa500", "orangered" => "#ff4500", "orchid" => "#da70d6", "palegoldenrod" => "#eee8aa", "palegreen" => "#98fb98", "paleturquoise" => "#afeeee", "palevioletred" => "#db7093", "papayawhip" => "#ffefd5", "peachpuff" => "#ffdab9", "peru" => "#cd853f", "pink" => "#ffc0cb", "plum" => "#dda0dd", "powderblue" => "#b0e0e6", "purple" => "#800080", "red" => "#f00", "rosybrown" => "#bc8f8f", "royalblue" => "#4169e1", "saddlebrown" => "#8b4513", "salmon" => "#fa8072", "sandybrown" => "#f4a460", "seagreen" => "#2e8b57", "seashell" => "#fff5ee", "sienna" => "#a0522d", "silver" => "#c0c0c0", "skyblue" => "#87ceeb", "slateblue" => "#6a5acd", "slategray" => "#708090", "snow" => "#fffafa", "springgreen" => "#00ff7f", "steelblue" => "#4682b4", "tan" => "#d2b48c", "teal" => "#008080", "thistle" => "#d8bfd8", "tomato" => "#ff6347", "turquoise" => "#40e0d0", "violet" => "#ee82ee", "wheat" => "#f5deb3", "white" => "#fff", "whitesmoke" => "#f5f5f5", "yellow" => "#ff0", "yellowgreen" => "#9acd32" ); public function __construct(CssMinifier $minifier, array $configuration = array()) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)) . ")(\s|$)+/eiS"; parent::__construct($minifier, $configuration); } public function apply(aCssToken &$token) { $lcValue = strtolower($token->Value); if (isset($this->transformation[$lcValue])) { $token->Value = $this->transformation[$lcValue]; } elseif (preg_match($this->reMatch, $token->Value)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssConvertLevel3PropertiesMinifierFilter extends aCssMinifierFilter { private $transformations = array ( "animation" => array(null, "-webkit-animation", null, null), "animation-delay" => array(null, "-webkit-animation-delay", null, null), "animation-direction" => array(null, "-webkit-animation-direction", null, null), "animation-duration" => array(null, "-webkit-animation-duration", null, null), "animation-fill-mode" => array(null, "-webkit-animation-fill-mode", null, null), "animation-iteration-count" => array(null, "-webkit-animation-iteration-count", null, null), "animation-name" => array(null, "-webkit-animation-name", null, null), "animation-play-state" => array(null, "-webkit-animation-play-state", null, null), "animation-timing-function" => array(null, "-webkit-animation-timing-function", null, null), "appearance" => array("-moz-appearance", "-webkit-appearance", null, null), "backface-visibility" => array(null, "-webkit-backface-visibility", null, null), "background-clip" => array(null, "-webkit-background-clip", null, null), "background-composite" => array(null, "-webkit-background-composite", null, null), "background-inline-policy" => array("-moz-background-inline-policy", null, null, null), "background-origin" => array(null, "-webkit-background-origin", null, null), "background-position-x" => array(null, null, null, "-ms-background-position-x"), "background-position-y" => array(null, null, null, "-ms-background-position-y"), "background-size" => array(null, "-webkit-background-size", null, null), "behavior" => array(null, null, null, "-ms-behavior"), "binding" => array("-moz-binding", null, null, null), "border-after" => array(null, "-webkit-border-after", null, null), "border-after-color" => array(null, "-webkit-border-after-color", null, null), "border-after-style" => array(null, "-webkit-border-after-style", null, null), "border-after-width" => array(null, "-webkit-border-after-width", null, null), "border-before" => array(null, "-webkit-border-before", null, null), "border-before-color" => array(null, "-webkit-border-before-color", null, null), "border-before-style" => array(null, "-webkit-border-before-style", null, null), "border-before-width" => array(null, "-webkit-border-before-width", null, null), "border-border-bottom-colors" => array("-moz-border-bottom-colors", null, null, null), "border-bottom-left-radius" => array("-moz-border-radius-bottomleft", "-webkit-border-bottom-left-radius", null, null), "border-bottom-right-radius" => array("-moz-border-radius-bottomright", "-webkit-border-bottom-right-radius", null, null), "border-end" => array("-moz-border-end", "-webkit-border-end", null, null), "border-end-color" => array("-moz-border-end-color", "-webkit-border-end-color", null, null), "border-end-style" => array("-moz-border-end-style", "-webkit-border-end-style", null, null), "border-end-width" => array("-moz-border-end-width", "-webkit-border-end-width", null, null), "border-fit" => array(null, "-webkit-border-fit", null, null), "border-horizontal-spacing" => array(null, "-webkit-border-horizontal-spacing", null, null), "border-image" => array("-moz-border-image", "-webkit-border-image", null, null), "border-left-colors" => array("-moz-border-left-colors", null, null, null), "border-radius" => array("-moz-border-radius", "-webkit-border-radius", null, null), "border-border-right-colors" => array("-moz-border-right-colors", null, null, null), "border-start" => array("-moz-border-start", "-webkit-border-start", null, null), "border-start-color" => array("-moz-border-start-color", "-webkit-border-start-color", null, null), "border-start-style" => array("-moz-border-start-style", "-webkit-border-start-style", null, null), "border-start-width" => array("-moz-border-start-width", "-webkit-border-start-width", null, null), "border-top-colors" => array("-moz-border-top-colors", null, null, null), "border-top-left-radius" => array("-moz-border-radius-topleft", "-webkit-border-top-left-radius", null, null), "border-top-right-radius" => array("-moz-border-radius-topright", "-webkit-border-top-right-radius", null, null), "border-vertical-spacing" => array(null, "-webkit-border-vertical-spacing", null, null), "box-align" => array("-moz-box-align", "-webkit-box-align", null, null), "box-direction" => array("-moz-box-direction", "-webkit-box-direction", null, null), "box-flex" => array("-moz-box-flex", "-webkit-box-flex", null, null), "box-flex-group" => array(null, "-webkit-box-flex-group", null, null), "box-flex-lines" => array(null, "-webkit-box-flex-lines", null, null), "box-ordinal-group" => array("-moz-box-ordinal-group", "-webkit-box-ordinal-group", null, null), "box-orient" => array("-moz-box-orient", "-webkit-box-orient", null, null), "box-pack" => array("-moz-box-pack", "-webkit-box-pack", null, null), "box-reflect" => array(null, "-webkit-box-reflect", null, null), "box-shadow" => array("-moz-box-shadow", "-webkit-box-shadow", null, null), "box-sizing" => array("-moz-box-sizing", null, null, null), "color-correction" => array(null, "-webkit-color-correction", null, null), "column-break-after" => array(null, "-webkit-column-break-after", null, null), "column-break-before" => array(null, "-webkit-column-break-before", null, null), "column-break-inside" => array(null, "-webkit-column-break-inside", null, null), "column-count" => array("-moz-column-count", "-webkit-column-count", null, null), "column-gap" => array("-moz-column-gap", "-webkit-column-gap", null, null), "column-rule" => array("-moz-column-rule", "-webkit-column-rule", null, null), "column-rule-color" => array("-moz-column-rule-color", "-webkit-column-rule-color", null, null), "column-rule-style" => array("-moz-column-rule-style", "-webkit-column-rule-style", null, null), "column-rule-width" => array("-moz-column-rule-width", "-webkit-column-rule-width", null, null), "column-span" => array(null, "-webkit-column-span", null, null), "column-width" => array("-moz-column-width", "-webkit-column-width", null, null), "columns" => array(null, "-webkit-columns", null, null), "filter" => array(__CLASS__, "filter"), "float-edge" => array("-moz-float-edge", null, null, null), "font-feature-settings" => array("-moz-font-feature-settings", null, null, null), "font-language-override" => array("-moz-font-language-override", null, null, null), "font-size-delta" => array(null, "-webkit-font-size-delta", null, null), "font-smoothing" => array(null, "-webkit-font-smoothing", null, null), "force-broken-image-icon" => array("-moz-force-broken-image-icon", null, null, null), "highlight" => array(null, "-webkit-highlight", null, null), "hyphenate-character" => array(null, "-webkit-hyphenate-character", null, null), "hyphenate-locale" => array(null, "-webkit-hyphenate-locale", null, null), "hyphens" => array(null, "-webkit-hyphens", null, null), "force-broken-image-icon" => array("-moz-image-region", null, null, null), "ime-mode" => array(null, null, null, "-ms-ime-mode"), "interpolation-mode" => array(null, null, null, "-ms-interpolation-mode"), "layout-flow" => array(null, null, null, "-ms-layout-flow"), "layout-grid" => array(null, null, null, "-ms-layout-grid"), "layout-grid-char" => array(null, null, null, "-ms-layout-grid-char"), "layout-grid-line" => array(null, null, null, "-ms-layout-grid-line"), "layout-grid-mode" => array(null, null, null, "-ms-layout-grid-mode"), "layout-grid-type" => array(null, null, null, "-ms-layout-grid-type"), "line-break" => array(null, "-webkit-line-break", null, "-ms-line-break"), "line-clamp" => array(null, "-webkit-line-clamp", null, null), "line-grid-mode" => array(null, null, null, "-ms-line-grid-mode"), "logical-height" => array(null, "-webkit-logical-height", null, null), "logical-width" => array(null, "-webkit-logical-width", null, null), "margin-after" => array(null, "-webkit-margin-after", null, null), "margin-after-collapse" => array(null, "-webkit-margin-after-collapse", null, null), "margin-before" => array(null, "-webkit-margin-before", null, null), "margin-before-collapse" => array(null, "-webkit-margin-before-collapse", null, null), "margin-bottom-collapse" => array(null, "-webkit-margin-bottom-collapse", null, null), "margin-collapse" => array(null, "-webkit-margin-collapse", null, null), "margin-end" => array("-moz-margin-end", "-webkit-margin-end", null, null), "margin-start" => array("-moz-margin-start", "-webkit-margin-start", null, null), "margin-top-collapse" => array(null, "-webkit-margin-top-collapse", null, null), "marquee " => array(null, "-webkit-marquee", null, null), "marquee-direction" => array(null, "-webkit-marquee-direction", null, null), "marquee-increment" => array(null, "-webkit-marquee-increment", null, null), "marquee-repetition" => array(null, "-webkit-marquee-repetition", null, null), "marquee-speed" => array(null, "-webkit-marquee-speed", null, null), "marquee-style" => array(null, "-webkit-marquee-style", null, null), "mask" => array(null, "-webkit-mask", null, null), "mask-attachment" => array(null, "-webkit-mask-attachment", null, null), "mask-box-image" => array(null, "-webkit-mask-box-image", null, null), "mask-clip" => array(null, "-webkit-mask-clip", null, null), "mask-composite" => array(null, "-webkit-mask-composite", null, null), "mask-image" => array(null, "-webkit-mask-image", null, null), "mask-origin" => array(null, "-webkit-mask-origin", null, null), "mask-position" => array(null, "-webkit-mask-position", null, null), "mask-position-x" => array(null, "-webkit-mask-position-x", null, null), "mask-position-y" => array(null, "-webkit-mask-position-y", null, null), "mask-repeat" => array(null, "-webkit-mask-repeat", null, null), "mask-repeat-x" => array(null, "-webkit-mask-repeat-x", null, null), "mask-repeat-y" => array(null, "-webkit-mask-repeat-y", null, null), "mask-size" => array(null, "-webkit-mask-size", null, null), "match-nearest-mail-blockquote-color" => array(null, "-webkit-match-nearest-mail-blockquote-color", null, null), "max-logical-height" => array(null, "-webkit-max-logical-height", null, null), "max-logical-width" => array(null, "-webkit-max-logical-width", null, null), "min-logical-height" => array(null, "-webkit-min-logical-height", null, null), "min-logical-width" => array(null, "-webkit-min-logical-width", null, null), "object-fit" => array(null, null, "-o-object-fit", null), "object-position" => array(null, null, "-o-object-position", null), "opacity" => array(__CLASS__, "opacity"), "outline-radius" => array("-moz-outline-radius", null, null, null), "outline-bottom-left-radius" => array("-moz-outline-radius-bottomleft", null, null, null), "outline-bottom-right-radius" => array("-moz-outline-radius-bottomright", null, null, null), "outline-top-left-radius" => array("-moz-outline-radius-topleft", null, null, null), "outline-top-right-radius" => array("-moz-outline-radius-topright", null, null, null), "padding-after" => array(null, "-webkit-padding-after", null, null), "padding-before" => array(null, "-webkit-padding-before", null, null), "padding-end" => array("-moz-padding-end", "-webkit-padding-end", null, null), "padding-start" => array("-moz-padding-start", "-webkit-padding-start", null, null), "perspective" => array(null, "-webkit-perspective", null, null), "perspective-origin" => array(null, "-webkit-perspective-origin", null, null), "perspective-origin-x" => array(null, "-webkit-perspective-origin-x", null, null), "perspective-origin-y" => array(null, "-webkit-perspective-origin-y", null, null), "rtl-ordering" => array(null, "-webkit-rtl-ordering", null, null), "scrollbar-3dlight-color" => array(null, null, null, "-ms-scrollbar-3dlight-color"), "scrollbar-arrow-color" => array(null, null, null, "-ms-scrollbar-arrow-color"), "scrollbar-base-color" => array(null, null, null, "-ms-scrollbar-base-color"), "scrollbar-darkshadow-color" => array(null, null, null, "-ms-scrollbar-darkshadow-color"), "scrollbar-face-color" => array(null, null, null, "-ms-scrollbar-face-color"), "scrollbar-highlight-color" => array(null, null, null, "-ms-scrollbar-highlight-color"), "scrollbar-shadow-color" => array(null, null, null, "-ms-scrollbar-shadow-color"), "scrollbar-track-color" => array(null, null, null, "-ms-scrollbar-track-color"), "stack-sizing" => array("-moz-stack-sizing", null, null, null), "svg-shadow" => array(null, "-webkit-svg-shadow", null, null), "tab-size" => array("-moz-tab-size", null, "-o-tab-size", null), "table-baseline" => array(null, null, "-o-table-baseline", null), "text-align-last" => array(null, null, null, "-ms-text-align-last"), "text-autospace" => array(null, null, null, "-ms-text-autospace"), "text-combine" => array(null, "-webkit-text-combine", null, null), "text-decorations-in-effect" => array(null, "-webkit-text-decorations-in-effect", null, null), "text-emphasis" => array(null, "-webkit-text-emphasis", null, null), "text-emphasis-color" => array(null, "-webkit-text-emphasis-color", null, null), "text-emphasis-position" => array(null, "-webkit-text-emphasis-position", null, null), "text-emphasis-style" => array(null, "-webkit-text-emphasis-style", null, null), "text-fill-color" => array(null, "-webkit-text-fill-color", null, null), "text-justify" => array(null, null, null, "-ms-text-justify"), "text-kashida-space" => array(null, null, null, "-ms-text-kashida-space"), "text-overflow" => array(null, null, "-o-text-overflow", "-ms-text-overflow"), "text-security" => array(null, "-webkit-text-security", null, null), "text-size-adjust" => array(null, "-webkit-text-size-adjust", null, "-ms-text-size-adjust"), "text-stroke" => array(null, "-webkit-text-stroke", null, null), "text-stroke-color" => array(null, "-webkit-text-stroke-color", null, null), "text-stroke-width" => array(null, "-webkit-text-stroke-width", null, null), "text-underline-position" => array(null, null, null, "-ms-text-underline-position"), "transform" => array("-moz-transform", "-webkit-transform", "-o-transform", null), "transform-origin" => array("-moz-transform-origin", "-webkit-transform-origin", "-o-transform-origin", null), "transform-origin-x" => array(null, "-webkit-transform-origin-x", null, null), "transform-origin-y" => array(null, "-webkit-transform-origin-y", null, null), "transform-origin-z" => array(null, "-webkit-transform-origin-z", null, null), "transform-style" => array(null, "-webkit-transform-style", null, null), "transition" => array("-moz-transition", "-webkit-transition", "-o-transition", null), "transition-delay" => array("-moz-transition-delay", "-webkit-transition-delay", "-o-transition-delay", null), "transition-duration" => array("-moz-transition-duration", "-webkit-transition-duration", "-o-transition-duration", null), "transition-property" => array("-moz-transition-property", "-webkit-transition-property", "-o-transition-property", null), "transition-timing-function" => array("-moz-transition-timing-function", "-webkit-transition-timing-function", "-o-transition-timing-function", null), "user-drag" => array(null, "-webkit-user-drag", null, null), "user-focus" => array("-moz-user-focus", null, null, null), "user-input" => array("-moz-user-input", null, null, null), "user-modify" => array("-moz-user-modify", "-webkit-user-modify", null, null), "user-select" => array("-moz-user-select", "-webkit-user-select", null, null), "white-space" => array(__CLASS__, "whiteSpace"), "window-shadow" => array("-moz-window-shadow", null, null, null), "word-break" => array(null, null, null, "-ms-word-break"), "word-wrap" => array(null, null, null, "-ms-word-wrap"), "writing-mode" => array(null, "-webkit-writing-mode", null, "-ms-writing-mode"), "zoom" => array(null, null, null, "-ms-zoom") ); public function apply(array &$tokens) { $r = 0; $transformations = &$this->transformations; for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssRulesetDeclarationToken") { $tProperty = $tokens[$i]->Property; if (isset($transformations[$tProperty])) { $result = array(); if (is_callable($transformations[$tProperty])) { $result = call_user_func_array($transformations[$tProperty], array($tokens[$i])); if (!is_array($result) && is_object($result)) { $result = array($result); } } else { $tValue = $tokens[$i]->Value; $tMediaTypes = $tokens[$i]->MediaTypes; foreach ($transformations[$tProperty] as $property) { if ($property !== null) { $result[] = new CssRulesetDeclarationToken($property, $tValue, $tMediaTypes); } } } if (count($result) > 0) { array_splice($tokens, $i + 1, 0, $result); $i += count($result); $l += count($result); } } } } return $r; } private static function filter($token) { $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"" . $token->Value . "\"", $token->MediaTypes), ); return $r; } private static function opacity($token) { $ieValue = (int) ((float) $token->Value * 100); $r = array ( new CssRulesetDeclarationToken("-ms-filter", "\"alpha(opacity=" . $ieValue . ")\"", $token->MediaTypes), new CssRulesetDeclarationToken("filter", "alpha(opacity=" . $ieValue . ")", $token->MediaTypes), new CssRulesetDeclarationToken("zoom", "1", $token->MediaTypes) ); return $r; } private static function whiteSpace($token) { if (strtolower($token->Value) === "pre-wrap") { $r = array ( new CssRulesetDeclarationToken("white-space", "-moz-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-webkit-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("white-space", "-o-pre-wrap", $token->MediaTypes), new CssRulesetDeclarationToken("word-wrap", "break-word", $token->MediaTypes) ); return $r; } else { return array(); } } } class CssConvertLevel3AtKeyframesMinifierFilter extends aCssMinifierFilter { public function apply(array &$tokens) { $r = 0; $transformations = array("-moz-keyframes", "-webkit-keyframes"); for ($i = 0, $l = count($tokens); $i < $l; $i++) { if (get_class($tokens[$i]) === "CssAtKeyframesStartToken") { for ($ii = $i; $ii < $l; $ii++) { if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { break; } } if (get_class($tokens[$ii]) === "CssAtKeyframesEndToken") { $add = array(); $source = array(); for ($iii = $i; $iii <= $ii; $iii++) { $source[] = clone($tokens[$iii]); } foreach ($transformations as $transformation) { $t = array(); foreach ($source as $token) { $t[] = clone($token); } $t[0]->AtRuleName = $transformation; $add = array_merge($add, $t); } if (isset($this->configuration["RemoveSource"]) && $this->configuration["RemoveSource"] === true) { array_splice($tokens, $i, $ii - $i + 1, $add); } else { array_splice($tokens, $ii + 1, 0, $add); } $l = count($tokens); $i = $ii + count($add); $r += count($add); } } } return $r; } } class CssConvertHslColorsMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/^hsl\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*%\s*,\s*([0-9]+)\s*%\s*\)/iS"; public function apply(aCssToken &$token) { if (stripos($token->Value, "hsl") !== false && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = str_replace($m[0], $this->hsl2hex($m[1], $m[2], $m[3]), $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } private function hsl2hex($hue, $saturation, $lightness) { $hue = $hue / 360; $saturation = $saturation / 100; $lightness = $lightness / 100; if ($saturation == 0) { $red = $lightness * 255; $green = $lightness * 255; $blue = $lightness * 255; } else { if ($lightness < 0.5 ) { $v2 = $lightness * (1 + $saturation); } else { $v2 = ($lightness + $saturation) - ($saturation * $lightness); } $v1 = 2 * $lightness - $v2; $red = 255 * self::hue2rgb($v1, $v2, $hue + (1 / 3)); $green = 255 * self::hue2rgb($v1, $v2, $hue); $blue = 255 * self::hue2rgb($v1, $v2, $hue - (1 / 3)); } return "#" . str_pad(dechex(round($red)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($green)), 2, "0", STR_PAD_LEFT) . str_pad(dechex(round($blue)), 2, "0", STR_PAD_LEFT); } private function hue2rgb($v1, $v2, $hue) { if ($hue < 0) { $hue += 1; } if ($hue > 1) { $hue -= 1; } if ((6 * $hue) < 1) { return ($v1 + ($v2 - $v1) * 6 * $hue); } if ((2 * $hue) < 1) { return ($v2); } if ((3 * $hue) < 2) { return ($v1 + ($v2 - $v1) * (( 2 / 3) - $hue) * 6); } return $v1; } } class CssConvertFontWeightMinifierPlugin extends aCssMinifierPlugin { private $include = array ( "font", "font-weight" ); private $reMatch = null; private $reReplace = "\"\${1}\" . \$this->transformation[\"\${2}\"] . \"\${3}\""; private $transformation = array ( "normal" => "400", "bold" => "700" ); public function __construct(CssMinifier $minifier) { $this->reMatch = "/(^|\s)+(" . implode("|", array_keys($this->transformation)). ")(\s|$)+/eiS"; parent::__construct($minifier); } public function apply(aCssToken &$token) { if (in_array($token->Property, $this->include) && preg_match($this->reMatch, $token->Value, $m)) { $token->Value = preg_replace($this->reMatch, $this->reReplace, $token->Value); } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressUnitValuesMinifierPlugin extends aCssMinifierPlugin { private $re = array ( "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}.\${2}\${4}", "/(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)/iS" => "\${1}0", "/(^0\s0\s0\s0)|(^0\s0\s0$)|(^0\s0$)/iS" => "0" ); private $reMatch = "/(^| |-)0\.([0-9]+?)(0+)?(%|em|ex|px|in|cm|mm|pt|pc)|(^| )-?(\.?)0(%|em|ex|px|in|cm|mm|pt|pc)|(^0\s0\s0\s0$)|(^0\s0\s0$)|(^0\s0$)/iS"; public function apply(aCssToken &$token) { if (preg_match($this->reMatch, $token->Value)) { foreach ($this->re as $reMatch => $reReplace) { $token->Value = preg_replace($reMatch, $reReplace, $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressExpressionValuesMinifierPlugin extends aCssMinifierPlugin { public function apply(aCssToken &$token) { if (class_exists("JSMin") && stripos($token->Value, "expression(") !== false) { $value = $token->Value; $value = substr($token->Value, stripos($token->Value, "expression(") + 10); $value = trim(JSMin::minify($value)); $token->Value = "expression(" . $value . ")"; } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCompressColorValuesMinifierPlugin extends aCssMinifierPlugin { private $reMatch = "/\#([0-9a-f]{6})/iS"; public function apply(aCssToken &$token) { if (strpos($token->Value, "#") !== false && preg_match($this->reMatch, $token->Value, $m)) { $value = strtolower($m[1]); if ($value[0] == $value[1] && $value[2] == $value[3] && $value[4] == $value[5]) { $token->Value = str_replace($m[0], "#" . $value[0] . $value[2] . $value[4], $token->Value); } } return false; } public function getTriggerTokens() { return array ( "CssAtFontFaceDeclarationToken", "CssAtPageDeclarationToken", "CssRulesetDeclarationToken" ); } } class CssCommentToken extends aCssToken { public $Comment = ""; public function __construct($comment) { $this->Comment = $comment; } public function __toString() { return $this->Comment; } } class CssCommentParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("*", "/"); } public function getTriggerStates() { return false; } private $restoreBuffer = ""; public function parse($index, $char, $previousChar, $state) { if ($char === "*" && $previousChar === "/" && $state !== "T_COMMENT") { $this->parser->pushState("T_COMMENT"); $this->parser->setExclusive(__CLASS__); $this->restoreBuffer = substr($this->parser->getAndClearBuffer(), 0, -2); } elseif ($char === "/" && $previousChar === "*" && $state === "T_COMMENT") { $this->parser->popState(); $this->parser->unsetExclusive(); $this->parser->appendToken(new CssCommentToken("/*" . $this->parser->getAndClearBuffer())); $this->parser->setBuffer($this->restoreBuffer); } else { return false; } return true; } } class CssAtVariablesStartToken extends aCssAtBlockStartToken { public $MediaTypes = array(); public function __construct($mediaTypes = null) { $this->MediaTypes = $mediaTypes ? $mediaTypes : array("all"); } public function __toString() { return ""; } } class CssAtVariablesParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_VARIABLES::PREPARE", "T_AT_VARIABLES", "T_AT_VARIABLES_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@variables") { $this->parser->pushState("T_AT_VARIABLES::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_VARIABLES::PREPARE") { $this->parser->setState("T_AT_VARIABLES"); $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->appendToken(new CssAtVariablesStartToken($mediaTypes)); } if ($char === ":" && $state === "T_AT_VARIABLES") { $this->buffer = $this->parser->getAndClearBuffer(":"); $this->parser->pushState("T_AT_VARIABLES_DECLARATION"); } elseif ($char === ":" && $state === "T_AT_VARIABLES_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @variables declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_VARIABLES_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtVariablesDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_VARIABLES") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtVariablesEndToken()); } else { return false; } return true; } } class CssAtVariablesEndToken extends aCssAtBlockEndToken { public function __toString() { return ""; } } class CssAtVariablesDeclarationToken extends aCssDeclarationToken { public function __toString() { return ""; } } class CssAtPageStartToken extends aCssAtBlockStartToken { public $Selector = ""; public function __construct($selector = "") { $this->Selector = $selector; } public function __toString() { return "@page" . ($this->Selector ? " " . $this->Selector : "") . "{"; } } class CssAtPageParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_PAGE::SELECTOR", "T_AT_PAGE", "T_AT_PAGE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 5)) === "@page") { $this->parser->pushState("T_AT_PAGE::SELECTOR"); $this->parser->clearBuffer(); return $index + 5; } elseif ($char === "{" && $state === "T_AT_PAGE::SELECTOR") { $selector = $this->parser->getAndClearBuffer("{"); $this->parser->setState("T_AT_PAGE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageStartToken($selector)); } elseif ($char === ":" && $state === "T_AT_PAGE") { $this->parser->pushState("T_AT_PAGE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_PAGE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @page declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state == "T_AT_PAGE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) == "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtPageDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->popState(); $this->parser->appendToken(new CssAtPageEndToken()); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_PAGE") { $this->parser->popState(); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtPageEndToken()); } else { return false; } return true; } } class CssAtPageEndToken extends aCssAtBlockEndToken { } class CssAtPageDeclarationToken extends aCssDeclarationToken { } class CssAtMediaStartToken extends aCssAtBlockStartToken { public function __construct(array $mediaTypes = array()) { $this->MediaTypes = $mediaTypes; } public function __toString() { return "@media " . implode(",", $this->MediaTypes) . "{"; } } class CssAtMediaParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_MEDIA::PREPARE", "T_AT_MEDIA"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 6)) === "@media") { $this->parser->pushState("T_AT_MEDIA::PREPARE"); $this->parser->clearBuffer(); return $index + 6; } elseif ($char === "{" && $state === "T_AT_MEDIA::PREPARE") { $mediaTypes = array_filter(array_map("trim", explode(",", $this->parser->getAndClearBuffer("{")))); $this->parser->setMediaTypes($mediaTypes); $this->parser->setState("T_AT_MEDIA"); $this->parser->appendToken(new CssAtMediaStartToken($mediaTypes)); } elseif ($char === "}" && $state === "T_AT_MEDIA") { $this->parser->appendToken(new CssAtMediaEndToken()); $this->parser->clearBuffer(); $this->parser->unsetMediaTypes(); $this->parser->popState(); } else { return false; } return true; } } class CssAtMediaEndToken extends aCssAtBlockEndToken { } class CssAtKeyframesStartToken extends aCssAtBlockStartToken { public $AtRuleName = "keyframes"; public $Name = ""; public function __construct($name, $atRuleName = null) { $this->Name = $name; if (!is_null($atRuleName)) { $this->AtRuleName = $atRuleName; } } public function __toString() { return "@" . $this->AtRuleName . " \"" . $this->Name . "\"{"; } } class CssAtKeyframesRulesetStartToken extends aCssRulesetStartToken { public $Selectors = array(); public function __construct(array $selectors = array()) { $this->Selectors = $selectors; } public function __toString() { return implode(",", $this->Selectors) . "{"; } } class CssAtKeyframesRulesetEndToken extends aCssRulesetEndToken { } class CssAtKeyframesRulesetDeclarationToken extends aCssDeclarationToken { } class CssAtKeyframesParserPlugin extends aCssParserPlugin { private $atRuleName = ""; private $selectors = array(); public function getTriggerChars() { return array("@", "{", "}", ":", ",", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_KEYFRAMES::NAME", "T_AT_KEYFRAMES", "T_AT_KEYFRAMES_RULESETS", "T_AT_KEYFRAMES_RULESET", "T_AT_KEYFRAMES_RULESET_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@keyframes") { $this->atRuleName = "keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 15)) === "@-moz-keyframes") { $this->atRuleName = "-moz-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 15; } elseif ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 18)) === "@-webkit-keyframes") { $this->atRuleName = "-webkit-keyframes"; $this->parser->pushState("T_AT_KEYFRAMES::NAME"); $this->parser->clearBuffer(); return $index + 18; } elseif ($char === "{" && $state === "T_AT_KEYFRAMES::NAME") { $name = $this->parser->getAndClearBuffer("{\"'"); $this->parser->setState("T_AT_KEYFRAMES_RULESETS"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtKeyframesStartToken($name, $this->atRuleName)); } if ($char === "," && $state === "T_AT_KEYFRAMES_RULESETS") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); } elseif ($char === "{" && $state === "T_AT_KEYFRAMES_RULESETS") { if ($this->parser->getBuffer() !== "") { $this->selectors[] = $this->parser->getAndClearBuffer(",{"); $this->parser->pushState("T_AT_KEYFRAMES_RULESET"); $this->parser->appendToken(new CssAtKeyframesRulesetStartToken($this->selectors)); $this->selectors = array(); } } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->pushState("T_AT_KEYFRAMES_RULESET_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":;", true); } elseif ($char === ":" && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @keyframes ruleset declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_KEYFRAMES_RULESET_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetDeclarationToken($this->buffer, $value, $isImportant)); if ($char === "}") { $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); $this->parser->popState(); } $this->buffer = ""; } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESET") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesRulesetEndToken()); } elseif ($char === "}" && $state === "T_AT_KEYFRAMES_RULESETS") { $this->parser->clearBuffer(); $this->parser->popState(); $this->parser->appendToken(new CssAtKeyframesEndToken()); } else { return false; } return true; } } class CssAtKeyframesEndToken extends aCssAtBlockEndToken { } class CssAtImportToken extends aCssToken { public $Import = ""; public $MediaTypes = array(); public function __construct($import, $mediaTypes) { $this->Import = $import; $this->MediaTypes = $mediaTypes ? $mediaTypes : array(); } public function __toString() { return "@import \"" . $this->Import . "\"" . (count($this->MediaTypes) > 0 ? " " . implode(",", $this->MediaTypes) : ""). ";"; } } class CssAtImportParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", ",", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_IMPORT"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 7)) === "@import") { $this->parser->pushState("T_AT_IMPORT"); $this->parser->clearBuffer(); return $index + 7; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_IMPORT") { $this->buffer = $this->parser->getAndClearBuffer(";"); $pos = false; foreach (array(")", "\"", "'") as $needle) { if (($pos = strrpos($this->buffer, $needle)) !== false) { break; } } $import = substr($this->buffer, 0, $pos + 1); if (stripos($import, "url(") === 0) { $import = substr($import, 4, -1); } $import = trim($import, " \t\n\r\0\x0B'\""); $mediaTypes = array_filter(array_map("trim", explode(",", trim(substr($this->buffer, $pos + 1), " \t\n\r\0\x0B{")))); if ($pos) { $this->parser->appendToken(new CssAtImportToken($import, $mediaTypes)); } else { CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Invalid @import at-rule syntax", $this->parser->buffer)); } $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceStartToken extends aCssAtBlockStartToken { public function __toString() { return "@font-face{"; } } class CssAtFontFaceParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", "{", "}", ":", ";"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_FONT_FACE::PREPARE", "T_AT_FONT_FACE", "T_AT_FONT_FACE_DECLARATION"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 10)) === "@font-face") { $this->parser->pushState("T_AT_FONT_FACE::PREPARE"); $this->parser->clearBuffer(); return $index + 10; } elseif ($char === "{" && $state === "T_AT_FONT_FACE::PREPARE") { $this->parser->setState("T_AT_FONT_FACE"); $this->parser->clearBuffer(); $this->parser->appendToken(new CssAtFontFaceStartToken()); } elseif ($char === ":" && $state === "T_AT_FONT_FACE") { $this->parser->pushState("T_AT_FONT_FACE_DECLARATION"); $this->buffer = $this->parser->getAndClearBuffer(":", true); } elseif ($char === ":" && $state === "T_AT_FONT_FACE_DECLARATION") { if ($this->buffer === "filter") { return false; } CssMin::triggerError(new CssError(__FILE__, __LINE__, __METHOD__ . ": Unterminated @font-face declaration", $this->buffer . ":" . $this->parser->getBuffer() . "_")); } elseif (($char === ";" || $char === "}") && $state === "T_AT_FONT_FACE_DECLARATION") { $value = $this->parser->getAndClearBuffer(";}"); if (strtolower(substr($value, -10, 10)) === "!important") { $value = trim(substr($value, 0, -10)); $isImportant = true; } else { $isImportant = false; } $this->parser->popState(); $this->parser->appendToken(new CssAtFontFaceDeclarationToken($this->buffer, $value, $isImportant)); $this->buffer = ""; if ($char === "}") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->popState(); } } elseif ($char === "}" && $state === "T_AT_FONT_FACE") { $this->parser->appendToken(new CssAtFontFaceEndToken()); $this->parser->clearBuffer(); $this->parser->popState(); } else { return false; } return true; } } class CssAtFontFaceEndToken extends aCssAtBlockEndToken { } class CssAtFontFaceDeclarationToken extends aCssDeclarationToken { } class CssAtCharsetToken extends aCssToken { public $Charset = ""; public function __construct($charset) { $this->Charset = $charset; } public function __toString() { return "@charset " . $this->Charset . ";"; } } class CssAtCharsetParserPlugin extends aCssParserPlugin { public function getTriggerChars() { return array("@", ";", "\n"); } public function getTriggerStates() { return array("T_DOCUMENT", "T_AT_CHARSET"); } public function parse($index, $char, $previousChar, $state) { if ($char === "@" && $state === "T_DOCUMENT" && strtolower(substr($this->parser->getSource(), $index, 8)) === "@charset") { $this->parser->pushState("T_AT_CHARSET"); $this->parser->clearBuffer(); return $index + 8; } elseif (($char === ";" || $char === "\n") && $state === "T_AT_CHARSET") { $charset = $this->parser->getAndClearBuffer(";"); $this->parser->popState(); $this->parser->appendToken(new CssAtCharsetToken($charset)); } else { return false; } return true; } } 
+?>
Index: tags/2.4.0RC3/include/dblayer/dblayers.inc.php
===================================================================
--- tags/2.4.0RC3/include/dblayer/dblayers.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/dblayer/dblayers.inc.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$dblayers = array();
+$dblayers['mysql'] = array('engine' => 'MySQL',
+			   'function_available' => 'mysql_connect'
+			   );
+
+$dblayers['pgsql'] = array('engine' => 'PostgreSQL',
+			   'function_available' => 'pg_connect'
+			   );
+
+$dblayers['sqlite'] = array('engine' => 'SQLite',
+			    'class_available' => 'SQLite3'
+			    );
+
+$dblayers['pdo-sqlite'] = array('engine' => 'SQLite',
+				'class_available' => 'PDO'
+				);
+
+?>
Index: tags/2.4.0RC3/include/dblayer/functions_mysql.inc.php
===================================================================
--- tags/2.4.0RC3/include/dblayer/functions_mysql.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/dblayer/functions_mysql.inc.php	(revision 14585)
@@ -0,0 +1,774 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('DB_ENGINE', 'MySQL');
+define('REQUIRED_MYSQL_VERSION', '5.0.0');
+
+define('DB_REGEX_OPERATOR', 'REGEXP');
+define('DB_RANDOM_FUNCTION', 'RAND');
+
+/**
+ *
+ * simple functions
+ *
+ */
+
+function pwg_db_connect($host, $user, $password, $database)
+{  
+  $link = @mysql_connect($host, $user, $password);
+  if (!$link)
+  {
+    throw new Exception("Can't connect to server");
+  }
+  if (mysql_select_db($database, $link))
+  {
+    return $link;
+  }
+  else
+  {
+    throw new Exception('Connection to server succeed, but it was impossible to connect to database');
+  }
+}
+
+function pwg_db_check_charset() 
+{
+  $db_charset = 'utf8';
+  if (defined('DB_CHARSET') and DB_CHARSET != '')
+  {
+    $db_charset = DB_CHARSET;
+  }
+  pwg_query('SET NAMES "'.$db_charset.'"');
+}
+
+function pwg_db_check_version()
+{
+  $current_mysql = pwg_get_db_version();
+  if (version_compare($current_mysql, REQUIRED_MYSQL_VERSION, '<'))
+  {
+    fatal_error(
+      sprintf(
+        'your MySQL version is too old, you have "%s" and you need at least "%s"',
+        $current_mysql,
+        REQUIRED_MYSQL_VERSION
+        )
+      );
+  }
+}
+
+function pwg_get_db_version() 
+{
+  return mysql_get_server_info();
+}
+
+function pwg_query($query)
+{
+  global $conf,$page,$debug,$t2;
+
+  $start = microtime(true);
+  ($result = mysql_query($query)) or my_error($query, $conf['die_on_sql_error']);
+
+  $time = microtime(true) - $start;
+
+  if (!isset($page['count_queries']))
+  {
+    $page['count_queries'] = 0;
+    $page['queries_time'] = 0;
+  }
+
+  $page['count_queries']++;
+  $page['queries_time']+= $time;
+
+  if ($conf['show_queries'])
+  {
+    $output = '';
+    $output.= '<pre>['.$page['count_queries'].'] ';
+    $output.= "\n".$query;
+    $output.= "\n".'(this query time : ';
+    $output.= '<b>'.number_format($time, 3, '.', ' ').' s)</b>';
+    $output.= "\n".'(total SQL time  : ';
+    $output.= number_format($page['queries_time'], 3, '.', ' ').' s)';
+    $output.= "\n".'(total time      : ';
+    $output.= number_format( ($time+$start-$t2), 3, '.', ' ').' s)';
+    if ( $result!=null and preg_match('/\s*SELECT\s+/i',$query) )
+    {
+      $output.= "\n".'(num rows        : ';
+      $output.= mysql_num_rows($result).' )';
+    }
+    elseif ( $result!=null
+      and preg_match('/\s*INSERT|UPDATE|REPLACE|DELETE\s+/i',$query) )
+    {
+      $output.= "\n".'(affected rows   : ';
+      $output.= mysql_affected_rows().' )';
+    }
+    $output.= "</pre>\n";
+
+    $debug .= $output;
+  }
+
+  return $result;
+}
+
+function pwg_db_nextval($column, $table)
+{
+  $query = '
+SELECT IF(MAX('.$column.')+1 IS NULL, 1, MAX('.$column.')+1)
+  FROM '.$table;
+  list($next) = pwg_db_fetch_row(pwg_query($query));
+
+  return $next;
+}
+
+function pwg_db_changes($result) 
+{
+  return mysql_affected_rows();
+}
+
+function pwg_db_num_rows($result) 
+{
+  return mysql_num_rows($result);
+}
+
+function pwg_db_fetch_assoc($result)
+{
+  return mysql_fetch_assoc($result);
+}
+
+function pwg_db_fetch_row($result)
+{
+  return mysql_fetch_row($result);
+}
+
+function pwg_db_fetch_object($result)
+{
+  return mysql_fetch_object($result);
+}
+
+function pwg_db_free_result($result) 
+{
+  return mysql_free_result($result);
+}
+
+function pwg_db_real_escape_string($s)
+{
+  return mysql_real_escape_string($s);
+}
+
+function pwg_db_insert_id($table=null, $column='id')
+{
+  return mysql_insert_id();
+}
+
+/**
+ *
+ * complex functions
+ *
+ */
+
+/**
+ * creates an array based on a query, this function is a very common pattern
+ * used here
+ *
+ * @param string $query
+ * @param string $fieldname
+ * @return array
+ */
+function array_from_query($query, $fieldname)
+{
+  $array = array();
+
+  $result = pwg_query($query);
+  while ($row = mysql_fetch_assoc($result))
+  {
+    $array[] = $row[$fieldname];
+  }
+
+  return $array;
+}
+
+define('MASS_UPDATES_SKIP_EMPTY', 1);
+/**
+ * updates multiple lines in a table
+ *
+ * @param string table_name
+ * @param array dbfields
+ * @param array datas
+ * @param int flags - if MASS_UPDATES_SKIP_EMPTY - empty values do not overwrite existing ones
+ * @return void
+ */
+function mass_updates($tablename, $dbfields, $datas, $flags=0)
+{
+  if (count($datas) == 0)
+    return;
+  
+  // depending on the MySQL version, we use the multi table update or N update queries
+  if (count($datas) < 10)
+  {
+    foreach ($datas as $data)
+    {
+      $query = '
+UPDATE '.$tablename.'
+  SET ';
+      $is_first = true;
+      foreach ($dbfields['update'] as $key)
+      {
+        $separator = $is_first ? '' : ",\n    ";
+
+        if (isset($data[$key]) and $data[$key] != '')
+        {
+          $query.= $separator.$key.' = \''.$data[$key].'\'';
+        }
+        else
+        {
+          if ( $flags & MASS_UPDATES_SKIP_EMPTY )
+            continue; // next field
+          $query.= "$separator$key = NULL";
+        }
+        $is_first = false;
+      }
+      if (!$is_first)
+      {// only if one field at least updated
+        $query.= '
+  WHERE ';
+        $is_first = true;
+        foreach ($dbfields['primary'] as $key)
+        {
+          if (!$is_first)
+          {
+            $query.= ' AND ';
+          }
+          if ( isset($data[$key]) )
+          {
+            $query.= $key.' = \''.$data[$key].'\'';
+          }
+          else
+          {
+            $query.= $key.' IS NULL';
+          }
+          $is_first = false;
+        }
+        pwg_query($query);
+      }
+    } // foreach update
+  } // if mysql_ver or count<X
+  else
+  {
+    // creation of the temporary table
+    $query = '
+SHOW FULL COLUMNS FROM '.$tablename;
+    $result = pwg_query($query);
+    $columns = array();
+    $all_fields = array_merge($dbfields['primary'], $dbfields['update']);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      if (in_array($row['Field'], $all_fields))
+      {
+        $column = $row['Field'];
+        $column.= ' '.$row['Type'];
+
+        $nullable = true;
+        if (!isset($row['Null']) or $row['Null'] == '' or $row['Null']=='NO')
+        {
+          $column.= ' NOT NULL';
+          $nullable = false;
+        }
+        if (isset($row['Default']))
+        {
+          $column.= " default '".$row['Default']."'";
+        }
+        elseif ($nullable)
+        {
+          $column.= " default NULL";
+        }
+        if (isset($row['Collation']) and $row['Collation'] != 'NULL')
+        {
+          $column.= " collate '".$row['Collation']."'";
+        }
+        array_push($columns, $column);
+      }
+    }
+
+    $temporary_tablename = $tablename.'_'.micro_seconds();
+
+    $query = '
+CREATE TABLE '.$temporary_tablename.'
+(
+  '.implode(",\n  ", $columns).',
+  UNIQUE KEY the_key ('.implode(',', $dbfields['primary']).')
+)';
+
+    pwg_query($query);
+    mass_inserts($temporary_tablename, $all_fields, $datas);
+    if ( $flags & MASS_UPDATES_SKIP_EMPTY )
+      $func_set = create_function('$s', 'return "t1.$s = IFNULL(t2.$s, t1.$s)";');
+    else
+      $func_set = create_function('$s', 'return "t1.$s = t2.$s";');
+
+    // update of images table by joining with temporary table
+    $query = '
+UPDATE '.$tablename.' AS t1, '.$temporary_tablename.' AS t2
+  SET '.
+      implode(
+        "\n    , ",
+        array_map($func_set,$dbfields['update'])
+        ).'
+  WHERE '.
+      implode(
+        "\n    AND ",
+        array_map(
+          create_function('$s', 'return "t1.$s = t2.$s";'),
+          $dbfields['primary']
+          )
+        );
+    pwg_query($query);
+    $query = '
+DROP TABLE '.$temporary_tablename;
+    pwg_query($query);
+  }
+}
+
+/**
+ * updates one line in a table
+ *
+ * @param string table_name
+ * @param array set_fields
+ * @param array where_fields
+ * @param int flags - if MASS_UPDATES_SKIP_EMPTY - empty values do not overwrite existing ones
+ * @return void
+ */
+function single_update($tablename, $set_fields, $where_fields, $flags=0)
+{
+  if (count($set_fields) == 0)
+  {
+    return;
+  }
+
+  $query = '
+UPDATE '.$tablename.'
+  SET ';
+  $is_first = true;
+  foreach ($set_fields as $key => $value)
+  {
+    $separator = $is_first ? '' : ",\n    ";
+
+    if (isset($value) and $value !== '')
+    {
+      $query.= $separator.$key.' = \''.$value.'\'';
+    }
+    else
+    {
+      if ( $flags & MASS_UPDATES_SKIP_EMPTY )
+        continue; // next field
+      $query.= "$separator$key = NULL";
+    }
+    $is_first = false;
+  }
+  if (!$is_first)
+  {// only if one field at least updated
+    $query.= '
+  WHERE ';
+    $is_first = true;
+    foreach ($where_fields as $key => $value)
+    {
+      if (!$is_first)
+      {
+        $query.= ' AND ';
+      }
+      if ( isset($value) )
+      {
+        $query.= $key.' = \''.$value.'\'';
+      }
+      else
+      {
+        $query.= $key.' IS NULL';
+      }
+      $is_first = false;
+    }
+    pwg_query($query);
+  }
+}
+
+
+/**
+ * inserts multiple lines in a table
+ *
+ * @param string table_name
+ * @param array dbfields
+ * @param array inserts
+ * @return void
+ */
+function mass_inserts($table_name, $dbfields, $datas, $options=array())
+{
+  $ignore = '';
+  if (isset($options['ignore']) and $options['ignore'])
+  {
+    $ignore = 'IGNORE';
+  }
+  
+  if (count($datas) != 0)
+  {
+    $first = true;
+
+    $query = 'SHOW VARIABLES LIKE \'max_allowed_packet\'';
+    list(, $packet_size) = pwg_db_fetch_row(pwg_query($query));
+    $packet_size = $packet_size - 2000; // The last list of values MUST not exceed 2000 character*/
+    $query = '';
+
+    foreach ($datas as $insert)
+    {
+      if (strlen($query) >= $packet_size)
+      {
+        pwg_query($query);
+        $first = true;
+      }
+
+      if ($first)
+      {
+        $query = '
+INSERT '.$ignore.' INTO '.$table_name.'
+  ('.implode(',', $dbfields).')
+  VALUES';
+        $first = false;
+      }
+      else
+      {
+        $query .= '
+  , ';
+      }
+
+      $query .= '(';
+      foreach ($dbfields as $field_id => $dbfield)
+      {
+        if ($field_id > 0)
+        {
+          $query .= ',';
+        }
+
+        if (!isset($insert[$dbfield]) or $insert[$dbfield] === '')
+        {
+          $query .= 'NULL';
+        }
+        else
+        {
+          $query .= "'".$insert[$dbfield]."'";
+        }
+      }
+      $query .= ')';
+    }
+    pwg_query($query);
+  }
+}
+
+/**
+ * inserts one line in a table
+ *
+ * @param string table_name
+ * @param array dbfields
+ * @param array insert
+ * @return void
+ */
+function single_insert($table_name, $data)
+{
+  if (count($data) != 0)
+  {
+    $query = '
+INSERT INTO '.$table_name.'
+  ('.implode(',', array_keys($data)).')
+  VALUES';
+
+    $query .= '(';
+    $is_first = true;
+    foreach ($data as $key => $value)
+    {
+      if (!$is_first)
+      {
+        $query .= ',';
+      }
+      else
+      {
+        $is_first = false;
+      }
+      
+      if ($value === '')
+      {
+        $query .= 'NULL';
+      }
+      else
+      {
+        $query .= "'".$value."'";
+      }
+    }
+    $query .= ')';
+    
+    pwg_query($query);
+  }
+}
+
+/**
+ * Do maintenance on all PWG tables
+ *
+ * @return none
+ */
+function do_maintenance_all_tables()
+{
+  global $prefixeTable, $page;
+
+  $all_tables = array();
+
+  // List all tables
+  $query = 'SHOW TABLES LIKE \''.$prefixeTable.'%\'';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_row($result))
+  {
+    array_push($all_tables, $row[0]);
+  }
+
+  // Repair all tables
+  $query = 'REPAIR TABLE '.implode(', ', $all_tables);
+  $mysql_rc = pwg_query($query);
+
+  // Re-Order all tables
+  foreach ($all_tables as $table_name)
+  {
+    $all_primary_key = array();
+
+    $query = 'DESC '.$table_name.';';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      if ($row['Key'] == 'PRI')
+      {
+        array_push($all_primary_key, $row['Field']);
+      }
+    }
+
+    if (count($all_primary_key) != 0)
+    {
+      $query = 'ALTER TABLE '.$table_name.' ORDER BY '.implode(', ', $all_primary_key).';';
+      $mysql_rc = $mysql_rc && pwg_query($query);
+    }
+  }
+
+  // Optimize all tables
+  $query = 'OPTIMIZE TABLE '.implode(', ', $all_tables);
+  $mysql_rc = $mysql_rc && pwg_query($query);
+  if ($mysql_rc)
+  {
+    array_push(
+          $page['infos'],
+          l10n('All optimizations have been successfully completed.')
+          );
+  }
+  else
+  {
+    array_push(
+          $page['errors'],
+          l10n('Optimizations have been completed with some errors.')
+          );
+  }
+}
+
+function pwg_db_concat($array)
+{
+  $string = implode($array, ',');
+  return 'CONCAT('. $string.')';
+}
+
+function pwg_db_concat_ws($array, $separator)
+{
+  $string = implode($array, ',');
+  return 'CONCAT_WS(\''.$separator.'\','. $string.')';
+}
+
+function pwg_db_cast_to_text($string)
+{
+  return $string;
+}
+
+/**
+ * returns an array containing the possible values of an enum field
+ *
+ * @param string tablename
+ * @param string fieldname
+ */
+function get_enums($table, $field)
+{
+  // retrieving the properties of the table. Each line represents a field :
+  // columns are 'Field', 'Type'
+  $result = pwg_query('desc '.$table);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    // we are only interested in the the field given in parameter for the
+    // function
+    if ($row['Field'] == $field)
+    {
+      // retrieving possible values of the enum field
+      // enum('blue','green','black')
+      $options = explode(',', substr($row['Type'], 5, -1));
+      foreach ($options as $i => $option)
+      {
+        $options[$i] = str_replace("'", '',$option);
+      }
+    }
+  }
+  pwg_db_free_result($result);
+  return $options;
+}
+
+/**
+ * Smartly checks if a variable is equivalent to true or false
+ *
+ * @param mixed input
+ * @return bool
+ */
+function get_boolean($input)
+{
+  if ('false' === strtolower($input))
+  {
+    return false;
+  }
+
+  return (bool)$input;
+}
+
+/**
+ * returns boolean string 'true' or 'false' if the given var is boolean
+ *
+ * @param mixed $var
+ * @return mixed
+ */
+function boolean_to_string($var)
+{
+  if (is_bool($var))
+  {
+    return $var ? 'true' : 'false';
+  }
+  else
+  {
+    return $var;
+  }
+}
+
+/**
+ *
+ * interval and date functions 
+ *
+ */
+
+function pwg_db_get_recent_period_expression($period, $date='CURRENT_DATE')
+{
+  if ($date!='CURRENT_DATE')
+  {
+    $date = '\''.$date.'\'';
+  }
+
+  return 'SUBDATE('.$date.',INTERVAL '.$period.' DAY)';
+}
+
+function pwg_db_get_recent_period($period, $date='CURRENT_DATE')
+{
+  $query = '
+SELECT '.pwg_db_get_recent_period_expression($period);
+  list($d) = pwg_db_fetch_row(pwg_query($query));
+
+  return $d;
+}
+
+function pwg_db_get_flood_period_expression($seconds)
+{
+  return 'SUBDATE(now(), INTERVAL '.$seconds.' SECOND)';
+}
+
+function pwg_db_get_hour($date) 
+{
+  return 'hour('.$date.')';
+}
+
+function pwg_db_get_date_YYYYMM($date)
+{
+  return 'DATE_FORMAT('.$date.', \'%Y%m\')';
+}
+
+function pwg_db_get_date_MMDD($date)
+{
+  return 'DATE_FORMAT('.$date.', \'%m%d\')';
+}
+
+function pwg_db_get_year($date)
+{
+  return 'YEAR('.$date.')';
+}
+
+function pwg_db_get_month($date)
+{
+  return 'MONTH('.$date.')';
+}
+
+function pwg_db_get_week($date, $mode=null)
+{
+  if ($mode)
+  {
+    return 'WEEK('.$date.', '.$mode.')';
+  }
+  else
+  {
+    return 'WEEK('.$date.')';
+  }
+}
+
+function pwg_db_get_dayofmonth($date)
+{
+  return 'DAYOFMONTH('.$date.')';
+}
+
+function pwg_db_get_dayofweek($date)
+{
+  return 'DAYOFWEEK('.$date.')';
+}
+
+function pwg_db_get_weekday($date)
+{
+  return 'WEEKDAY('.$date.')';
+}
+
+function pwg_db_date_to_ts($date) 
+{
+  return 'UNIX_TIMESTAMP('.$date.')';
+}
+
+// my_error returns (or send to standard output) the message concerning the
+// error occured for the last mysql query.
+function my_error($header, $die)
+{
+  $error = "[mysql error ".mysql_errno().'] '.mysql_error()."\n";
+  $error .= $header;
+
+  if ($die)
+  {
+    fatal_error($error);
+  }
+  echo("<pre>");
+  trigger_error($error, E_USER_WARNING);
+  echo("</pre>");
+}
+
+?>
Index: tags/2.4.0RC3/include/derivative.inc.php
===================================================================
--- tags/2.4.0RC3/include/derivative.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/derivative.inc.php	(revision 14585)
@@ -0,0 +1,352 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+final class SrcImage
+{
+  const IS_ORIGINAL = 0x01;
+  const IS_MIMETYPE = 0x02;
+
+  public $id;
+  public $rel_path;
+  public $rotation = 0;
+
+  private $size=null;
+  private $flags=0;
+
+  function __construct($infos)
+  {
+    global $conf;
+
+    $this->id = $infos['id'];
+    $ext = get_extension($infos['path']);
+    if (in_array($ext, $conf['picture_ext']))
+    {
+      $this->rel_path = $infos['path'];
+      $this->flags |= self::IS_ORIGINAL;
+    }
+    elseif (!empty($infos['representative_ext']))
+    {
+      $this->rel_path = original_to_representative($infos['path'], $infos['representative_ext']);
+    }
+    else
+    {
+      $ext = strtolower($ext);
+      $this->rel_path = trigger_event('get_mimetype_location', get_themeconf('mime_icon_dir').$ext.'.png', $ext );
+      $this->flags |= self::IS_MIMETYPE;
+      $this->size = @getimagesize(PHPWG_ROOT_PATH.$this->rel_path);
+    }
+
+    if (!$this->size && isset($infos['width']) && isset($infos['height']))
+    {
+      $width = $infos['width'];
+      $height = $infos['height'];
+
+      $this->rotation = intval($infos['rotation']) % 4;
+      // 1 or 5 =>  90 clockwise
+      // 3 or 7 => 270 clockwise
+      if ($this->rotation % 2)
+      {
+        $width = $infos['height'];
+        $height = $infos['width'];
+      }
+      
+      $this->size = array($width, $height);
+    }
+  }
+
+  function is_original()
+  {
+    return $this->flags & self::IS_ORIGINAL;
+  }
+
+  function is_mimetype()
+  {
+    return $this->flags & self::IS_MIMETYPE;
+  }
+
+  function get_path()
+  {
+    return PHPWG_ROOT_PATH.$this->rel_path;
+  }
+
+  function get_url()
+  {
+    $url = get_root_url().$this->rel_path;
+    if ($this->flags & self::IS_ORIGINAL)
+    {
+      $url = trigger_event('get_src_image_url', $url, $this);
+    }
+    return embellish_url($url);
+  }
+
+  function has_size()
+  {
+    return $this->size != null;
+  }
+
+  function get_size()
+  {
+    if ($this->size == null)
+      not_implemented(); // get size from file
+    return $this->size;
+  }
+}
+
+
+
+final class DerivativeImage
+{
+  public $src_image;
+
+  private $params;
+  private $rel_path, $rel_url, $is_cached=true;
+
+  function __construct($type, $src_image)
+  {
+    $this->src_image = $src_image;
+    if (is_string($type))
+    {
+      $this->params = ImageStdParams::get_by_type($type);
+    }
+    else
+    {
+      $this->params = $type;
+    }
+
+    self::build($src_image, $this->params, $this->rel_path, $this->rel_url, $this->is_cached);
+  }
+
+  static function thumb_url($infos)
+  {
+    return self::url(IMG_THUMB, $infos);
+  }
+
+  static function url($type, $infos)
+  {
+    $src_image = is_object($infos) ? $infos : new SrcImage($infos);
+    $params = is_string($type) ? ImageStdParams::get_by_type($type) : $type;
+    self::build($src_image, $params, $rel_path, $rel_url);
+    if ($params == null)
+    {
+      return $src_image->get_url();
+    }
+    return embellish_url(
+        trigger_event('get_derivative_url',
+          get_root_url().$rel_url,
+          $params, $src_image, $rel_url
+          ) );
+  }
+
+  static function get_all($src_image)
+  {
+    $ret = array();
+    foreach (ImageStdParams::get_defined_type_map() as $type => $params)
+    {
+      $derivative = new DerivativeImage($params, $src_image);
+      $ret[$type] = $derivative;
+    }
+    foreach (ImageStdParams::get_undefined_type_map() as $type => $type2)
+    {
+      $ret[$type] = $ret[$type2];
+    }
+
+    return $ret;
+  }
+
+  private static function build($src, &$params, &$rel_path, &$rel_url, &$is_cached=null)
+  {
+    if ( $src->has_size() && $params->is_identity( $src->get_size() ) )
+    {
+      if (!$params->use_watermark && !$src->rotation)
+      {
+        $params = null;
+        $rel_path = $rel_url = $src->rel_path;
+        return;
+      }
+      $defined_types = array_keys(ImageStdParams::get_defined_type_map());
+      for ($i=0; $i<count($defined_types); $i++)
+      {
+        if ($defined_types[$i] == $params->type)
+        {
+          for ($i--; $i>=0; $i--)
+          {
+            $smaller = ImageStdParams::get_by_type($defined_types[$i]);
+            if ($smaller->sizing->max_crop==$params->sizing->max_crop && $smaller->is_identity( $src->get_size() ))
+            {
+              $params = $smaller;
+              self::build($src, $params, $rel_path, $rel_url, $is_cached);
+              return;
+            }
+          }
+          break;
+        }
+      }
+    }
+
+    $tokens=array();
+    $tokens[] = substr($params->type,0,2);
+
+    if ($params->type==IMG_CUSTOM)
+    {
+      $params->add_url_tokens($tokens);
+    }
+
+    $loc = $src->rel_path;
+    if (substr_compare($loc, './', 0, 2)==0)
+    {
+      $loc = substr($loc, 2);
+    }
+    elseif (substr_compare($loc, '../', 0, 3)==0)
+    {
+      $loc = substr($loc, 3);
+    }
+    $loc = substr_replace($loc, '-'.implode('_', $tokens), strrpos($loc, '.'), 0 );
+
+    $rel_path = PWG_DERIVATIVE_DIR.$loc;
+
+    global $conf;
+    $url_style=$conf['derivative_url_style'];
+    if (!$url_style)
+    {
+      $mtime = @filemtime(PHPWG_ROOT_PATH.$rel_path);
+      if ($mtime===false or $mtime < $params->last_mod_time)
+      {
+        $is_cached = false;
+        $url_style = 2;
+      }
+      else
+      {
+        $url_style = 1;
+      }
+    }
+
+    if ($url_style == 2)
+    {
+      $rel_url = 'i';
+      if ($conf['php_extension_in_urls']) $rel_url .= '.php';
+      if ($conf['question_mark_in_urls']) $rel_url .= '?';
+      $rel_url .= '/'.$loc;
+    }
+    else
+    {
+      $rel_url = $rel_path;
+    }
+  }
+
+  function get_path()
+  {
+    return PHPWG_ROOT_PATH.$this->rel_path;
+  }
+
+  function get_url()
+  {
+    if ($this->params == null)
+    {
+      return $this->src_image->get_url();
+    }
+    return embellish_url(
+        trigger_event('get_derivative_url',
+          get_root_url().$this->rel_url,
+          $this->params, $this->src_image, $this->rel_url
+          ) );
+  }
+
+  function same_as_source()
+  {
+    return $this->params == null;
+  }
+
+
+  function get_type()
+  {
+    if ($this->params == null)
+      return 'Original';
+    return $this->params->type;
+  }
+
+  /* returns the size of the derivative image*/
+  function get_size()
+  {
+    if ($this->params == null)
+    {
+      return $this->src_image->get_size();
+    }
+    return $this->params->compute_final_size($this->src_image->get_size());
+  }
+
+  function get_size_htm()
+  {
+    $size = $this->get_size();
+    if ($size)
+    {
+      return 'width="'.$size[0].'" height="'.$size[1].'"';
+    }
+  }
+
+  function get_size_hr()
+  {
+    $size = $this->get_size();
+    if ($size)
+    {
+      return $size[0].' x '.$size[1];
+    }
+  }
+
+  function get_scaled_size($maxw, $maxh)
+  {
+    $size = $this->get_size();
+    if ($size)
+    {
+      $ratio_w = $size[0] / $maxw;
+      $ratio_h = $size[1] / $maxh;
+      if ($ratio_w>1 || $ratio_h>1)
+      {
+        if ($ratio_w > $ratio_h)
+        {
+          $size[0] = $maxw;
+          $size[1] = floor($size[1] / $ratio_w);
+        }
+        else
+        {
+          $size[0] = floor($size[0] / $ratio_h);
+          $size[1] = $maxh;
+        }
+      }
+    }
+    return $size;
+  }
+
+  function get_scaled_size_htm($maxw=9999, $maxh=9999)
+  {
+    $size = $this->get_scaled_size($maxw, $maxh);
+    if ($size)
+    {
+      return 'width="'.$size[0].'" height="'.$size[1].'"';
+    }
+  }
+
+  function is_cached()
+  {
+    return $this->is_cached;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/derivative_params.inc.php
===================================================================
--- tags/2.4.0RC3/include/derivative_params.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/derivative_params.inc.php	(revision 14585)
@@ -0,0 +1,286 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function derivative_to_url($t)
+{
+  return substr($t, 0, 2);
+}
+
+function size_to_url($s)
+{
+  if ($s[0]==$s[1])
+  {
+    return $s[0];
+  }
+  return $s[0].'x'.$s[1];
+}
+
+function size_equals($s1, $s2)
+{
+  return ($s1[0]==$s2[0] && $s1[1]==$s2[1]);
+}
+
+function char_to_fraction($c)
+{
+	return (ord($c) - ord('a'))/25;
+}
+
+function fraction_to_char($f)
+{
+	return chr(ord('a') + round($f*25));
+}
+
+/** small utility to manipulate a 'rectangle'*/
+final class ImageRect
+{
+  public $l,$t,$r,$b;
+
+  function __construct($l)
+  {
+    $this->l = $this->t = 0;
+    $this->r = $l[0];
+    $this->b = $l[1];
+  }
+
+  function width()
+  {
+    return $this->r - $this->l;
+  }
+
+  function height()
+  {
+    return $this->b - $this->t;
+  }
+
+  function crop_h($pixels, $coi)
+  {
+    if ($this->width() <= $pixels)
+      return;
+    $tlcrop = floor($pixels/2);
+
+    if (!empty($coi))
+    {
+      $coil = floor($this->r * char_to_fraction($coi[0]));
+      $coir = ceil($this->r * char_to_fraction($coi[2]));
+      $availableL = $coil > $this->l ? $coil - $this->l : 0;
+      $availableR = $coir < $this->r ? $this->r - $coir : 0;
+      if ($availableL + $availableR >= $pixels)
+      {
+        if ($availableL < $tlcrop)
+        {
+          $tlcrop = $availableL;
+        }
+        elseif ($availableR < $tlcrop)
+        {
+          $tlcrop = $pixels - $availableR;
+        }
+      }
+    }
+    $this->l += $tlcrop;
+    $this->r -= $pixels - $tlcrop;
+  }
+
+  function crop_v($pixels, $coi)
+  {
+    if ($this->height() <= $pixels)
+      return;
+    $tlcrop = floor($pixels/2);
+
+    if (!empty($coi))
+    {
+      $coit = floor($this->b * char_to_fraction($coi[1]));
+      $coib = ceil($this->b * char_to_fraction($coi[3]));
+      $availableT = $coit > $this->t ? $coit - $this->t : 0;
+      $availableB = $coib < $this->b ? $this->b - $coib : 0;
+      if ($availableT + $availableB >= $pixels)
+      {
+        if ($availableT < $tlcrop)
+        {
+          $tlcrop = $availableT;
+        }
+        elseif ($availableB < $tlcrop)
+        {
+          $tlcrop = $pixels - $availableB;
+        }
+      }
+    }
+    $this->t += $tlcrop;
+    $this->b -= $pixels - $tlcrop;
+  }
+
+}
+
+
+/*how we crop and/or resize an image*/
+final class SizingParams
+{
+  function __construct($ideal_size, $max_crop = 0, $min_size = null)
+  {
+    $this->ideal_size = $ideal_size;
+    $this->max_crop = $max_crop;
+    $this->min_size = $min_size;
+  }
+
+  static function classic($w, $h)
+  {
+    return new SizingParams( array($w,$h) );
+  }
+
+  static function square($w)
+  {
+    return new SizingParams( array($w,$w), 1, array($w,$w) );
+  }
+
+  function add_url_tokens(&$tokens)
+  {
+      if ($this->max_crop == 0)
+      {
+        $tokens[] = 's'.size_to_url($this->ideal_size);
+      }
+      elseif ($this->max_crop == 1 && size_equals($this->ideal_size, $this->min_size) )
+      {
+        $tokens[] = 'e'.size_to_url($this->ideal_size);
+      }
+      else
+      {
+        $tokens[] = size_to_url($this->ideal_size);
+        $tokens[] = fraction_to_char($this->max_crop);
+        $tokens[] = size_to_url($this->min_size);
+      }
+  }
+
+  function compute($in_size, $coi, &$crop_rect, &$scale_size)
+  {
+    $destCrop = new ImageRect($in_size);
+
+    if ($this->max_crop > 0)
+    {
+      $ratio_w = $destCrop->width() / $this->ideal_size[0];
+      $ratio_h = $destCrop->height() / $this->ideal_size[1];
+      if ($ratio_w>1 || $ratio_h>1)
+      {
+        if ($ratio_w > $ratio_h)
+        {
+          $h = $destCrop->height() / $ratio_w;
+          if ($h < $this->min_size[1])
+          {
+            $idealCropPx = $destCrop->width() - floor($destCrop->height() * $this->ideal_size[0] / $this->min_size[1]);
+            $maxCropPx = round($this->max_crop * $destCrop->width());
+            $destCrop->crop_h( min($idealCropPx, $maxCropPx), $coi);
+          }
+        }
+        else
+        {
+          $w = $destCrop->width() / $ratio_h;
+          if ($w < $this->min_size[0])
+          {
+            $idealCropPx = $destCrop->height() - floor($destCrop->width() * $this->ideal_size[1] / $this->min_size[0]);
+            $maxCropPx = round($this->max_crop * $destCrop->height());
+            $destCrop->crop_v( min($idealCropPx, $maxCropPx), $coi);
+          }
+        }
+      }
+    }
+
+    $scale_size = array($destCrop->width(), $destCrop->height());
+
+    $ratio_w = $destCrop->width() / $this->ideal_size[0];
+    $ratio_h = $destCrop->height() / $this->ideal_size[1];
+    if ($ratio_w>1 || $ratio_h>1)
+    {
+      if ($ratio_w > $ratio_h)
+      {
+        $scale_size[0] = $this->ideal_size[0];
+        $scale_size[1] = floor(1e-6 + $scale_size[1] / $ratio_w);
+      }
+      else
+      {
+        $scale_size[0] = floor(1e-6 + $scale_size[0] / $ratio_h);
+        $scale_size[1] = $this->ideal_size[1];
+      }
+    }
+    else
+    {
+      $scale_size = null;
+    }
+
+    $crop_rect = null;
+    if ($destCrop->width()!=$in_size[0] || $destCrop->height()!=$in_size[1] )
+    {
+      $crop_rect = $destCrop;
+    }
+  }
+
+}
+
+
+/*how we generate a derivative image*/
+final class DerivativeParams
+{
+  public $type = IMG_CUSTOM;
+  public $last_mod_time = 0; // used for non-custom images to regenerate the cached files
+  public $use_watermark = false;
+  public $sizing;
+  public $sharpen = 0;
+  public $quality = 95;
+
+  function __construct($sizing)
+  {
+    $this->sizing = $sizing;
+  }
+
+  public function __sleep()
+  {
+      return array('last_mod_time', 'sizing', 'sharpen', 'quality');
+  }
+
+  function add_url_tokens(&$tokens)
+  {
+    $this->sizing->add_url_tokens($tokens);
+  }
+
+  function compute_final_size($in_size)
+  {
+    $this->sizing->compute( $in_size, null, $crop_rect, $scale_size );
+    return $scale_size != null ? $scale_size : $in_size;
+  }
+
+  function max_width()
+  {
+    return $this->sizing->ideal_size[0];
+  }
+
+  function max_height()
+  {
+    return $this->sizing->ideal_size[1];
+  }
+
+  function is_identity($in_size)
+  {
+    if ($in_size[0] > $this->sizing->ideal_size[0] or
+        $in_size[1] > $this->sizing->ideal_size[1] )
+    {
+      return false;
+    }
+    return true;
+  }
+}
+?>
Index: tags/2.4.0RC3/include/derivative_std_params.inc.php
===================================================================
--- tags/2.4.0RC3/include/derivative_std_params.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/derivative_std_params.inc.php	(revision 14585)
@@ -0,0 +1,202 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('IMG_SQUARE', 'square');
+define('IMG_THUMB', 'thumb');
+define('IMG_XXSMALL', '2small');
+define('IMG_XSMALL', 'xsmall');
+define('IMG_SMALL', 'small');
+define('IMG_MEDIUM', 'medium');
+define('IMG_LARGE', 'large');
+define('IMG_XLARGE', 'xlarge');
+define('IMG_XXLARGE', 'xxlarge');
+define('IMG_CUSTOM', 'custom');
+
+final class WatermarkParams
+{
+  public $file = '';
+  public $min_size = array(500,500);
+  public $xpos = 50;
+  public $ypos = 50;
+  public $xrepeat = 0;
+  public $opacity = 100;
+}
+
+
+final class ImageStdParams
+{
+  private static $all_types = array(
+    IMG_SQUARE,IMG_THUMB,IMG_XXSMALL,IMG_XSMALL,IMG_SMALL,IMG_MEDIUM,IMG_LARGE,IMG_XLARGE,IMG_XXLARGE
+    );
+  private static $all_type_map = array();
+  private static $type_map = array();
+  private static $undefined_type_map = array();
+  private static $watermark;
+  public static $custom = array();
+
+  static function get_all_types()
+  {
+    return self::$all_types;
+  }
+
+  static function get_all_type_map()
+  {
+    return self::$all_type_map;
+  }
+
+  static function get_defined_type_map()
+  {
+    return self::$type_map;
+  }
+
+  static function get_undefined_type_map()
+  {
+    return self::$undefined_type_map;
+  }
+
+  static function get_by_type($type)
+  {
+    return self::$all_type_map[$type];
+  }
+
+  static function get_custom($w, $h, $crop=0, $minw=null, $minh=null)
+  {
+    $params = new DerivativeParams( new SizingParams( array($w,$h), $crop, array($minw,$minh)) );
+    self::apply_global($params);
+
+    $key = array();
+    $params->add_url_tokens($key);
+    $key = implode('_',$key);
+    if ( @self::$custom[$key] < time() - 24*3600)
+    {
+      self::$custom[$key] = time();
+      self::save();
+    }
+    return $params;
+  }
+
+  static function get_watermark()
+  {
+    return self::$watermark;
+  }
+
+  static function load_from_db()
+  {
+    global $conf;
+    $arr = @unserialize($conf['derivatives']);
+    if (false!==$arr)
+    {
+      self::$type_map = $arr['d'];
+      self::$watermark = @$arr['w'];
+      if (!self::$watermark) self::$watermark = new WatermarkParams();
+      self::$custom = @$arr['c'];
+      if (!self::$custom) self::$custom = array();
+    }
+    else
+    {
+      self::$watermark = new WatermarkParams();
+      self::$type_map = self::get_default_sizes();
+    }
+    self::build_maps();
+  }
+
+  static function set_watermark($watermark)
+  {
+    self::$watermark = $watermark;
+  }
+
+  static function set_and_save($map)
+  {
+    self::$type_map = $map;
+    self::save();
+    self::build_maps();
+  }
+
+  static function save()
+  {
+    global $conf;
+
+    $ser = serialize( array(
+      'd' => self::$type_map,
+      'w' => self::$watermark,
+      'c' => self::$custom,
+      ) );
+    conf_update_param('derivatives', addslashes($ser) );
+  }
+
+  static function get_default_sizes()
+  {
+    $arr = array(
+      IMG_SQUARE => new DerivativeParams( SizingParams::square(120,120) ),
+      IMG_THUMB => new DerivativeParams( SizingParams::classic(144,144) ),
+      IMG_XXSMALL => new DerivativeParams( SizingParams::classic(240,240) ),
+      IMG_XSMALL => new DerivativeParams( SizingParams::classic(432,324) ),
+      IMG_SMALL => new DerivativeParams( SizingParams::classic(576,432) ),
+      IMG_MEDIUM => new DerivativeParams( SizingParams::classic(792,594) ),
+      IMG_LARGE => new DerivativeParams( SizingParams::classic(1008,756) ),
+      IMG_XLARGE => new DerivativeParams( SizingParams::classic(1224,918) ),
+      IMG_XXLARGE => new DerivativeParams( SizingParams::classic(1656,1242) ),
+    );
+    foreach($arr as $params)
+    {
+      $params->last_mod_time = time();
+    }
+    return $arr;
+  }
+
+  static function apply_global($params)
+  {
+    $params->use_watermark = !empty(self::$watermark->file) &&
+        (self::$watermark->min_size[0]<=$params->sizing->ideal_size[0]
+        or self::$watermark->min_size[1]<=$params->sizing->ideal_size[1] );
+  }
+
+  private static function build_maps()
+  {
+    foreach (self::$type_map as $type=>$params)
+    {
+      $params->type = $type;
+      self::apply_global($params);
+    }
+    self::$all_type_map = self::$type_map;
+
+    for ($i=0; $i<count(self::$all_types); $i++)
+    {
+      $tocheck = self::$all_types[$i];
+      if (!isset(self::$type_map[$tocheck]))
+      {
+        for ($j=$i-1; $j>=0; $j--)
+        {
+          $target = self::$all_types[$j];
+          if (isset(self::$type_map[$target]))
+          {
+            self::$all_type_map[$tocheck] = self::$type_map[$target];
+            self::$undefined_type_map[$tocheck] = $target;
+            break;
+          }
+        }
+      }
+    }
+  }
+
+}
+
+?>
Index: tags/2.4.0RC3/include/feedcreator.class.php
===================================================================
--- tags/2.4.0RC3/include/feedcreator.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/feedcreator.class.php	(revision 14585)
@@ -0,0 +1,1541 @@
+<?php
+/***************************************************************************
+
+FeedCreator class v1.7.2
+originally (c) Kai Blankenhorn
+www.bitfolge.de
+kaib@bitfolge.de
+v1.3 work by Scott Reynen (scott@randomchaos.com) and Kai Blankenhorn
+v1.5 OPML support by Dirk Clemens
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+****************************************************************************
+
+
+Changelog:
+
+v1.7.2	10-11-04
+	license changed to LGPL
+
+v1.7.1
+	fixed a syntax bug
+	fixed left over debug code
+
+v1.7	07-18-04
+	added HTML and JavaScript feeds (configurable via CSS) (thanks to Pascal Van Hecke)
+	added HTML descriptions for all feed formats (thanks to Pascal Van Hecke)
+	added a switch to select an external stylesheet (thanks to Pascal Van Hecke)
+	changed default content-type to application/xml
+	added character encoding setting
+	fixed numerous smaller bugs (thanks to Sören Fuhrmann of golem.de)
+	improved changing ATOM versions handling (thanks to August Trometer)
+	improved the UniversalFeedCreator's useCached method (thanks to Sören Fuhrmann of golem.de)
+	added charset output in HTTP headers (thanks to Sören Fuhrmann of golem.de)
+	added Slashdot namespace to RSS 1.0 (thanks to Sören Fuhrmann of golem.de)
+
+v1.6	05-10-04
+	added stylesheet to RSS 1.0 feeds
+	fixed generator comment (thanks Kevin L. Papendick and Tanguy Pruvot)
+	fixed RFC822 date bug (thanks Tanguy Pruvot)
+	added TimeZone customization for RFC8601 (thanks Tanguy Pruvot)
+	fixed Content-type could be empty (thanks Tanguy Pruvot)
+	fixed author/creator in RSS1.0 (thanks Tanguy Pruvot)
+
+v1.6 beta	02-28-04
+	added Atom 0.3 support (not all features, though)
+	improved OPML 1.0 support (hopefully - added more elements)
+	added support for arbitrary additional elements (use with caution)
+	code beautification :-)
+	considered beta due to some internal changes
+
+v1.5.1	01-27-04
+	fixed some RSS 1.0 glitches (thanks to Stéphane Vanpoperynghe)
+	fixed some inconsistencies between documentation and code (thanks to Timothy Martin)
+
+v1.5	01-06-04
+	added support for OPML 1.0
+	added more documentation
+
+v1.4	11-11-03
+	optional feed saving and caching
+	improved documentation
+	minor improvements
+
+v1.3    10-02-03
+	renamed to FeedCreator, as it not only creates RSS anymore
+	added support for mbox
+	tentative support for echo/necho/atom/pie/???
+
+v1.2    07-20-03
+	intelligent auto-truncating of RSS 0.91 attributes
+	don't create some attributes when they're not set
+	documentation improved
+	fixed a real and a possible bug with date conversions
+	code cleanup
+
+v1.1    06-29-03
+	added images to feeds
+	now includes most RSS 0.91 attributes
+	added RSS 2.0 feeds
+
+v1.0    06-24-03
+	initial release
+
+
+
+***************************************************************************/
+
+/*** GENERAL USAGE *********************************************************
+
+include("feedcreator.class.php");
+
+$rss = new UniversalFeedCreator();
+$rss->useCached(); // use cached version if age<1 hour
+$rss->title = "PHP news";
+$rss->description = "daily news from the PHP scripting world";
+
+//optional
+$rss->descriptionTruncSize = 500;
+$rss->descriptionHtmlSyndicated = true;
+
+$rss->link = "http://www.dailyphp.net/news";
+$rss->syndicationURL = "http://www.dailyphp.net/".$_SERVER["PHP_SELF"];
+
+$image = new FeedImage();
+$image->title = "dailyphp.net logo";
+$image->url = "http://www.dailyphp.net/images/logo.gif";
+$image->link = "http://www.dailyphp.net";
+$image->description = "Feed provided by dailyphp.net. Click to visit.";
+
+//optional
+$image->descriptionTruncSize = 500;
+$image->descriptionHtmlSyndicated = true;
+
+$rss->image = $image;
+
+// get your news items from somewhere, e.g. your database:
+mysql_select_db($dbHost, $dbUser, $dbPass);
+$res = mysql_query("SELECT * FROM news ORDER BY newsdate DESC");
+while ($data = mysql_fetch_object($res)) {
+    $item = new FeedItem();
+    $item->title = $data->title;
+    $item->link = $data->url;
+    $item->description = $data->short;
+
+    //optional
+    item->descriptionTruncSize = 500;
+    item->descriptionHtmlSyndicated = true;
+
+    $item->date = $data->newsdate;
+    $item->source = "http://www.dailyphp.net";
+    $item->author = "John Doe";
+
+    $rss->addItem($item);
+}
+
+// valid format strings are: RSS0.91, RSS1.0, RSS2.0, PIE0.1 (deprecated),
+// MBOX, OPML, ATOM, ATOM0.3, HTML, JS
+echo $rss->saveFeed("RSS1.0", "news/feed.xml");
+
+
+***************************************************************************
+*          A little setup                                                 *
+**************************************************************************/
+
+// your local timezone, set to "" to disable or for GMT
+define("TIME_ZONE","+00:00");
+
+
+
+
+/**
+ * Version string.
+ **/
+define("FEEDCREATOR_VERSION", "FeedCreator 1.7.2");
+
+
+
+/**
+ * A FeedItem is a part of a FeedCreator feed.
+ *
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ * @since 1.3
+ */
+class FeedItem extends HtmlDescribable {
+	/**
+	 * Mandatory attributes of an item.
+	 */
+	var $title, $description, $link;
+
+	/**
+	 * Optional attributes of an item.
+	 */
+	var $author, $authorEmail, $image, $category, $comments, $guid, $source, $creator;
+
+	/**
+	 * Publishing date of an item. May be in one of the following formats:
+	 *
+	 *	RFC 822:
+	 *	"Mon, 20 Jan 03 18:05:41 +0400"
+	 *	"20 Jan 03 18:05:41 +0000"
+	 *
+	 *	ISO 8601:
+	 *	"2003-01-20T18:05:41+04:00"
+	 *
+	 *	Unix:
+	 *	1043082341
+	 */
+	var $date;
+
+	/**
+	 * Any additional elements to include as an assiciated array. All $key => $value pairs
+	 * will be included unencoded in the feed item in the form
+	 *     <$key>$value</$key>
+	 * Again: No encoding will be used! This means you can invalidate or enhance the feed
+	 * if $value contains markup. This may be abused to embed tags not implemented by
+	 * the FeedCreator class used.
+	 */
+	var $additionalElements = Array();
+
+	// on hold
+	// var $source;
+}
+
+
+
+/**
+ * An FeedImage may be added to a FeedCreator feed.
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ * @since 1.3
+ */
+class FeedImage extends HtmlDescribable {
+	/**
+	 * Mandatory attributes of an image.
+	 */
+	var $title, $url, $link;
+
+	/**
+	 * Optional attributes of an image.
+	 */
+	var $width, $height, $description;
+}
+
+
+
+/**
+ * An HtmlDescribable is an item within a feed that can have a description that may
+ * include HTML markup.
+ */
+class HtmlDescribable {
+	/**
+	 * Indicates whether the description field should be rendered in HTML.
+	 */
+	var $descriptionHtmlSyndicated;
+
+	/**
+	 * Indicates whether and to how many characters a description should be truncated.
+	 */
+	var $descriptionTruncSize;
+
+	/**
+	 * Returns a formatted description field, depending on descriptionHtmlSyndicated and
+	 * $descriptionTruncSize properties
+	 * @return    string    the formatted description
+	 */
+	function getDescription() {
+		$descriptionField = new FeedHtmlField($this->description);
+		$descriptionField->syndicateHtml = $this->descriptionHtmlSyndicated;
+		$descriptionField->truncSize = $this->descriptionTruncSize;
+		return $descriptionField->output();
+	}
+
+}
+
+
+/**
+ * An FeedHtmlField describes and generates
+ * a feed, item or image html field (probably a description). Output is
+ * generated based on $truncSize, $syndicateHtml properties.
+ * @author Pascal Van Hecke <feedcreator.class.php@vanhecke.info>
+ * @version 1.6
+ */
+class FeedHtmlField {
+	/**
+	 * Mandatory attributes of a FeedHtmlField.
+	 */
+	var $rawFieldContent;
+
+	/**
+	 * Optional attributes of a FeedHtmlField.
+	 *
+	 */
+	var $truncSize, $syndicateHtml;
+
+	/**
+	 * Creates a new instance of FeedHtmlField.
+	 * @param  $string: if given, sets the rawFieldContent property
+	 */
+	function FeedHtmlField($parFieldContent) {
+		if ($parFieldContent) {
+			$this->rawFieldContent = $parFieldContent;
+		}
+	}
+
+
+	/**
+	 * Creates the right output, depending on $truncSize, $syndicateHtml properties.
+	 * @return string    the formatted field
+	 */
+	function output() {
+		// when field available and syndicated in html we assume
+		// - valid html in $rawFieldContent and we enclose in CDATA tags
+		// - no truncation (truncating risks producing invalid html)
+		if (!$this->rawFieldContent) {
+			$result = "";
+		}	elseif ($this->syndicateHtml) {
+			$result = "<![CDATA[".$this->rawFieldContent."]]>";
+		} else {
+			if ($this->truncSize and is_int($this->truncSize)) {
+				$result = FeedCreator::iTrunc(htmlspecialchars($this->rawFieldContent),$this->truncSize);
+			} else {
+				$result = htmlspecialchars($this->rawFieldContent);
+			}
+		}
+		return $result;
+	}
+
+}
+
+
+
+/**
+ * UniversalFeedCreator lets you choose during runtime which
+ * format to build.
+ * For general usage of a feed class, see the FeedCreator class
+ * below or the example above.
+ *
+ * @since 1.3
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class UniversalFeedCreator extends FeedCreator {
+	var $_feed;
+
+	function _setFormat($format) {
+		switch (strtoupper($format)) {
+
+			case "2.0":
+				// fall through
+			case "RSS2.0":
+				$this->_feed = new RSSCreator20();
+				break;
+
+			case "1.0":
+				// fall through
+			case "RSS1.0":
+				$this->_feed = new RSSCreator10();
+				break;
+
+			case "0.91":
+				// fall through
+			case "RSS0.91":
+				$this->_feed = new RSSCreator091();
+				break;
+
+			case "PIE0.1":
+				$this->_feed = new PIECreator01();
+				break;
+
+			case "MBOX":
+				$this->_feed = new MBOXCreator();
+				break;
+
+			case "OPML":
+				$this->_feed = new OPMLCreator();
+				break;
+
+			case "ATOM":
+				// fall through: always the latest ATOM version
+
+			case "ATOM0.3":
+				$this->_feed = new AtomCreator03();
+				break;
+
+			case "HTML":
+				$this->_feed = new HTMLCreator();
+				break;
+
+			case "JS":
+				// fall through
+			case "JAVASCRIPT":
+				$this->_feed = new JSCreator();
+				break;
+
+			default:
+				$this->_feed = new RSSCreator091();
+				break;
+		}
+
+		$vars = get_object_vars($this);
+		foreach ($vars as $key => $value) {
+			// prevent overwriting of properties "contentType", "encoding"; do not copy "_feed" itself
+			if (!in_array($key, array("_feed", "contentType"/*PWG, "encoding"*/))) {
+				$this->_feed->{$key} = $this->{$key};
+			}
+		}
+	}
+
+	/**
+	 * Creates a syndication feed based on the items previously added.
+	 *
+	 * @see        FeedCreator::addItem()
+	 * @param    string    format    format the feed should comply to. Valid values are:
+	 *			"PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS"
+	 * @return    string    the contents of the feed.
+	 */
+	function createFeed($format = "RSS0.91") {
+		$this->_setFormat($format);
+		return $this->_feed->createFeed();
+	}
+
+
+
+	/**
+	 * Saves this feed as a file on the local disk. After the file is saved, an HTTP redirect
+	 * header may be sent to redirect the use to the newly created file.
+	 * @since 1.4
+	 *
+	 * @param	string	format	format the feed should comply to. Valid values are:
+	 *			"PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM", "ATOM0.3", "HTML", "JS"
+	 * @param	string	filename	optional	the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+	 * @param	boolean	displayContents	optional	send the content of the file or not. If true, the file will be sent in the body of the response.
+	 */
+	function saveFeed($format="RSS0.91", $filename="", $displayContents=true) {
+		$this->_setFormat($format);
+		$this->_feed->saveFeed($filename, $displayContents);
+	}
+
+
+   /**
+    * Turns on caching and checks if there is a recent version of this feed in the cache.
+    * If there is, an HTTP redirect header is sent.
+    * To effectively use caching, you should create the FeedCreator object and call this method
+    * before anything else, especially before you do the time consuming task to build the feed
+    * (web fetching, for example).
+    *
+    * @param   string   format   format the feed should comply to. Valid values are:
+    *       "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
+    * @param filename   string   optional the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+    * @param timeout int      optional the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+    */
+   function useCached($format="RSS0.91", $filename="", $timeout=3600) {
+      $this->_setFormat($format);
+      $this->_feed->useCached($filename, $timeout);
+   }
+
+}
+
+
+/**
+ * FeedCreator is the abstract base implementation for concrete
+ * implementations that implement a specific format of syndication.
+ *
+ * @abstract
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ * @since 1.4
+ */
+class FeedCreator extends HtmlDescribable {
+
+	/**
+	 * Mandatory attributes of a feed.
+	 */
+	var $title, $description, $link;
+
+
+	/**
+	 * Optional attributes of a feed.
+	 */
+	var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
+
+	/**
+	* The url of the external xsl stylesheet used to format the naked rss feed.
+	* Ignored in the output when empty.
+	*/
+	var $xslStyleSheet = "";
+
+
+	/**
+	 * @access private
+	 */
+	var $items = Array();
+
+
+	/**
+	 * This feed's MIME content type.
+	 * @since 1.4
+	 * @access private
+	 */
+	var $contentType = "application/xml";
+
+
+	/**
+	 * This feed's character encoding.
+	 * @since 1.6.1
+	 **/
+	var $encoding = "ISO-8859-1";
+
+
+	/**
+	 * Any additional elements to include as an assiciated array. All $key => $value pairs
+	 * will be included unencoded in the feed in the form
+	 *     <$key>$value</$key>
+	 * Again: No encoding will be used! This means you can invalidate or enhance the feed
+	 * if $value contains markup. This may be abused to embed tags not implemented by
+	 * the FeedCreator class used.
+	 */
+	var $additionalElements = Array();
+
+
+	/**
+	 * Adds an FeedItem to the feed.
+	 *
+	 * @param object FeedItem $item The FeedItem to add to the feed.
+	 * @access public
+	 */
+	function addItem($item) {
+		$this->items[] = $item;
+	}
+
+
+	/**
+	 * Truncates a string to a certain length at the most sensible point.
+	 * First, if there's a '.' character near the end of the string, the string is truncated after this character.
+	 * If there is no '.', the string is truncated after the last ' ' character.
+	 * If the string is truncated, " ..." is appended.
+	 * If the string is already shorter than $length, it is returned unchanged.
+	 *
+	 * @static
+	 * @param string    string A string to be truncated.
+	 * @param int        length the maximum length the string should be truncated to
+	 * @return string    the truncated string
+	 */
+	function iTrunc($string, $length) {
+		if (strlen($string)<=$length) {
+			return $string;
+		}
+
+		$pos = strrpos($string,".");
+		if ($pos>=$length-4) {
+			$string = substr($string,0,$length-4);
+			$pos = strrpos($string,".");
+		}
+		if ($pos>=$length*0.4) {
+			return substr($string,0,$pos+1)." ...";
+		}
+
+		$pos = strrpos($string," ");
+		if ($pos>=$length-4) {
+			$string = substr($string,0,$length-4);
+			$pos = strrpos($string," ");
+		}
+		if ($pos>=$length*0.4) {
+			return substr($string,0,$pos)." ...";
+		}
+
+		return substr($string,0,$length-4)." ...";
+
+	}
+
+
+	/**
+	 * Creates a comment indicating the generator of this feed.
+	 * The format of this comment seems to be recognized by
+	 * Syndic8.com.
+	 */
+	function _createGeneratorComment() {
+		return "<!-- generator=\"".FEEDCREATOR_VERSION."\" -->\n";
+	}
+
+
+	/**
+	 * Creates a string containing all additional elements specified in
+	 * $additionalElements.
+	 * @param	elements	array	an associative array containing key => value pairs
+	 * @param indentString	string	a string that will be inserted before every generated line
+	 * @return    string    the XML tags corresponding to $additionalElements
+	 */
+	function _createAdditionalElements($elements, $indentString="") {
+		$ae = "";
+		if (is_array($elements)) {
+			foreach($elements AS $key => $value) {
+				$ae.= $indentString."<$key>$value</$key>\n";
+			}
+		}
+		return $ae;
+	}
+
+	function _createStylesheetReferences() {
+		$xml = "";
+		if (isset($this->cssStyleSheet)) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n";
+		if ($this->xslStyleSheet) $xml .= "<?xml-stylesheet href=\"".$this->xslStyleSheet."\" type=\"text/xsl\"?>\n";
+		return $xml;
+	}
+
+
+	/**
+	 * Builds the feed's text.
+	 * @abstract
+	 * @return    string    the feed's complete text
+	 */
+	function createFeed() {
+	}
+
+	/**
+	 * Generate a filename for the feed cache file. The result will be $_SERVER["PHP_SELF"] with the extension changed to .xml.
+	 * For example:
+	 *
+	 * echo $_SERVER["PHP_SELF"]."\n";
+	 * echo FeedCreator::_generateFilename();
+	 *
+	 * would produce:
+	 *
+	 * /rss/latestnews.php
+	 * latestnews.xml
+	 *
+	 * @return string the feed cache filename
+	 * @since 1.4
+	 * @access private
+	 */
+	function _generateFilename() {
+		$fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+		return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".xml";
+	}
+
+
+	/**
+	 * @since 1.4
+	 * @access private
+	 */
+	function _redirect($filename) {
+		// attention, heavily-commented-out-area
+
+		// maybe use this in addition to file time checking
+		//Header("Expires: ".date("r",time()+$this->_timeout));
+
+		/* no caching at all, doesn't seem to work as good:
+		Header("Cache-Control: no-cache");
+		Header("Pragma: no-cache");
+		*/
+
+		// HTTP redirect, some feed readers' simple HTTP implementations don't follow it
+		//Header("Location: ".$filename);
+
+		Header("Content-Type: ".$this->contentType."; charset=".$this->encoding."; filename=".basename($filename));
+		Header("Content-Disposition: inline; filename=".basename($filename));
+		readfile($filename, "r");
+		die();
+	}
+
+	/**
+	 * Turns on caching and checks if there is a recent version of this feed in the cache.
+	 * If there is, an HTTP redirect header is sent.
+	 * To effectively use caching, you should create the FeedCreator object and call this method
+	 * before anything else, especially before you do the time consuming task to build the feed
+	 * (web fetching, for example).
+	 * @since 1.4
+	 * @param filename	string	optional	the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+	 * @param timeout	int		optional	the timeout in seconds before a cached version is refreshed (defaults to 3600 = 1 hour)
+	 */
+	function useCached($filename="", $timeout=3600) {
+		$this->_timeout = $timeout;
+		if ($filename=="") {
+			$filename = $this->_generateFilename();
+		}
+		if (file_exists($filename) AND (time()-filemtime($filename) < $timeout)) {
+			$this->_redirect($filename);
+		}
+	}
+
+
+	/**
+	 * Saves this feed as a file on the local disk. After the file is saved, a redirect
+	 * header may be sent to redirect the user to the newly created file.
+	 * @since 1.4
+	 *
+	 * @param filename	string	optional	the filename where a recent version of the feed is saved. If not specified, the filename is $_SERVER["PHP_SELF"] with the extension changed to .xml (see _generateFilename()).
+	 * @param redirect	boolean	optional	send an HTTP redirect header or not. If true, the user will be automatically redirected to the created file.
+	 */
+	function saveFeed($filename="", $displayContents=true) {
+		if ($filename=="") {
+			$filename = $this->_generateFilename();
+		}
+		$feedFile = fopen($filename, "w+");
+		if ($feedFile) {
+			fputs($feedFile,$this->createFeed());
+			fclose($feedFile);
+			if ($displayContents) {
+				$this->_redirect($filename);
+			}
+		} else {
+			echo "<br><b>Error creating feed file, please check write permissions.</b><br>";
+		}
+	}
+
+}
+
+
+/**
+ * FeedDate is an internal class that stores a date for a feed or feed item.
+ * Usually, you won't need to use this.
+ */
+class FeedDate {
+	var $unix;
+
+	/**
+	 * Creates a new instance of FeedDate representing a given date.
+	 * Accepts RFC 822, ISO 8601 date formats as well as unix time stamps.
+	 * @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used.
+	 */
+	function FeedDate($dateString="") {
+		if ($dateString=="") $dateString = date("r");
+
+		if (is_integer($dateString)) {
+			$this->unix = $dateString;
+			return;
+		}
+		if (preg_match("~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) {
+			$months = Array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
+			$this->unix = mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);
+			if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
+				$tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
+			} else {
+				if (strlen($matches[7])==1) {
+					$oneHour = 3600;
+					$ord = ord($matches[7]);
+					if ($ord < ord("M")) {
+						$tzOffset = (ord("A") - $ord - 1) * $oneHour;
+					} elseif ($ord >= ord("M") AND $matches[7]!="Z") {
+						$tzOffset = ($ord - ord("M")) * $oneHour;
+					} elseif ($matches[7]=="Z") {
+						$tzOffset = 0;
+					}
+				}
+				switch ($matches[7]) {
+					case "UT":
+					case "GMT":	$tzOffset = 0;
+				}
+			}
+			$this->unix += $tzOffset;
+			return;
+		}
+		if (preg_match("~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~",$dateString,$matches)) {
+			$this->unix = mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);
+			if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
+				$tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
+			} else {
+				if ($matches[7]=="Z") {
+					$tzOffset = 0;
+				}
+			}
+			$this->unix += $tzOffset;
+			return;
+		}
+		$this->unix = 0;
+	}
+
+	/**
+	 * Gets the date stored in this FeedDate as an RFC 822 date.
+	 *
+	 * @return a date in RFC 822 format
+	 */
+	function rfc822() {
+		//return gmdate("r",$this->unix);
+		$date = gmdate("D, d M Y H:i:s", $this->unix);
+		if (TIME_ZONE!="") $date .= " ".str_replace(":","",TIME_ZONE);
+		return $date;
+	}
+
+	/**
+	 * Gets the date stored in this FeedDate as an ISO 8601 date.
+	 *
+	 * @return a date in ISO 8601 format
+	 */
+	function iso8601() {
+		$date = gmdate("Y-m-d\TH:i:sO",$this->unix);
+		$date = substr($date,0,22) . ':' . substr($date,-2);
+		if (TIME_ZONE!="") $date = str_replace("+00:00",TIME_ZONE,$date);
+		return $date;
+	}
+
+	/**
+	 * Gets the date stored in this FeedDate as unix time stamp.
+	 *
+	 * @return a date as a unix time stamp
+	 */
+	function unix() {
+		return $this->unix;
+	}
+}
+
+
+/**
+ * RSSCreator10 is a FeedCreator that implements RDF Site Summary (RSS) 1.0.
+ *
+ * @see http://www.purl.org/rss/1.0/
+ * @since 1.3
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class RSSCreator10 extends FeedCreator {
+
+	/**
+	 * Builds the RSS feed's text. The feed will be compliant to RDF Site Summary (RSS) 1.0.
+	 * The feed will contain all items previously added in the same order.
+	 * @return    string    the feed's complete text
+	 */
+	function createFeed() {
+		$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
+		$feed.= $this->_createGeneratorComment();
+		if ($this->cssStyleSheet=="") {
+			$cssStyleSheet = "http://www.w3.org/2000/08/w3c-synd/style.css";
+		}
+		$feed.= $this->_createStylesheetReferences();
+		$feed.= "<rdf:RDF\n";
+		$feed.= "    xmlns=\"http://purl.org/rss/1.0/\"\n";
+		$feed.= "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n";
+		$feed.= "    xmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\"\n";
+		$feed.= "    xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
+		$feed.= "    <channel rdf:about=\"".$this->syndicationURL."\">\n";
+		$feed.= "        <title>".htmlspecialchars($this->title)."</title>\n";
+		$feed.= "        <description>".htmlspecialchars($this->description)."</description>\n";
+		$feed.= "        <link>".$this->link."</link>\n";
+		if ($this->image!=null) {
+			$feed.= "        <image rdf:resource=\"".$this->image->url."\" />\n";
+		}
+		$now = new FeedDate();
+		$feed.= "       <dc:date>".htmlspecialchars($now->iso8601())."</dc:date>\n";
+		$feed.= "        <items>\n";
+		$feed.= "            <rdf:Seq>\n";
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "                <rdf:li rdf:resource=\"".htmlspecialchars($this->items[$i]->link)."\"/>\n";
+		}
+		$feed.= "            </rdf:Seq>\n";
+		$feed.= "        </items>\n";
+		$feed.= "    </channel>\n";
+		if ($this->image!=null) {
+			$feed.= "    <image rdf:about=\"".$this->image->url."\">\n";
+			$feed.= "        <title>".$this->image->title."</title>\n";
+			$feed.= "        <link>".$this->image->link."</link>\n";
+			$feed.= "        <url>".$this->image->url."</url>\n";
+			$feed.= "    </image>\n";
+		}
+		$feed.= $this->_createAdditionalElements($this->additionalElements, "    ");
+
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "    <item rdf:about=\"".htmlspecialchars($this->items[$i]->link)."\">\n";
+			//$feed.= "        <dc:type>Posting</dc:type>\n";
+			$feed.= "        <dc:format>text/html</dc:format>\n";
+			if ($this->items[$i]->date!=null) {
+				$itemDate = new FeedDate($this->items[$i]->date);
+				$feed.= "        <dc:date>".htmlspecialchars($itemDate->iso8601())."</dc:date>\n";
+			}
+			if ($this->items[$i]->source!="") {
+				$feed.= "        <dc:source>".htmlspecialchars($this->items[$i]->source)."</dc:source>\n";
+			}
+			if ($this->items[$i]->author!="") {
+				$feed.= "        <dc:creator>".htmlspecialchars($this->items[$i]->author)."</dc:creator>\n";
+			}
+			$feed.= "        <title>".htmlspecialchars(strip_tags(strtr($this->items[$i]->title,"\n\r","  ")))."</title>\n";
+			$feed.= "        <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+			$feed.= "        <description>".htmlspecialchars($this->items[$i]->description)."</description>\n";
+			$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+			$feed.= "    </item>\n";
+		}
+		$feed.= "</rdf:RDF>\n";
+		return $feed;
+	}
+}
+
+
+
+/**
+ * RSSCreator091 is a FeedCreator that implements RSS 0.91 Spec, revision 3.
+ *
+ * @see http://my.netscape.com/publish/formats/rss-spec-0.91.html
+ * @since 1.3
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class RSSCreator091 extends FeedCreator {
+
+	/**
+	 * Stores this RSS feed's version number.
+	 * @access private
+	 */
+	var $RSSVersion;
+
+	function RSSCreator091() {
+		$this->_setRSSVersion("0.91");
+		$this->contentType = "application/rss+xml";
+	}
+
+	/**
+	 * Sets this RSS feed's version number.
+	 * @access private
+	 */
+	function _setRSSVersion($version) {
+		$this->RSSVersion = $version;
+	}
+
+	/**
+	 * Builds the RSS feed's text. The feed will be compliant to RDF Site Summary (RSS) 1.0.
+	 * The feed will contain all items previously added in the same order.
+	 * @return    string    the feed's complete text
+	 */
+	function createFeed() {
+		$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
+		$feed.= $this->_createGeneratorComment();
+		$feed.= $this->_createStylesheetReferences();
+		$feed.= "<rss version=\"".$this->RSSVersion."\">\n";
+		$feed.= "    <channel>\n";
+		$feed.= "        <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
+		$this->descriptionTruncSize = 500;
+		$feed.= "        <description>".$this->getDescription()."</description>\n";
+		$feed.= "        <link>".$this->link."</link>\n";
+		$now = new FeedDate();
+		$feed.= "        <lastBuildDate>".htmlspecialchars($now->rfc822())."</lastBuildDate>\n";
+		$feed.= "        <generator>".FEEDCREATOR_VERSION."</generator>\n";
+
+		if ($this->image!=null) {
+			$feed.= "        <image>\n";
+			$feed.= "            <url>".$this->image->url."</url>\n";
+			$feed.= "            <title>".FeedCreator::iTrunc(htmlspecialchars($this->image->title),100)."</title>\n";
+			$feed.= "            <link>".$this->image->link."</link>\n";
+			if ($this->image->width!="") {
+				$feed.= "            <width>".$this->image->width."</width>\n";
+			}
+			if ($this->image->height!="") {
+				$feed.= "            <height>".$this->image->height."</height>\n";
+			}
+			if ($this->image->description!="") {
+				$feed.= "            <description>".$this->image->getDescription()."</description>\n";
+			}
+			$feed.= "        </image>\n";
+		}
+		if ($this->language!="") {
+			$feed.= "        <language>".$this->language."</language>\n";
+		}
+		if ($this->copyright!="") {
+			$feed.= "        <copyright>".FeedCreator::iTrunc(htmlspecialchars($this->copyright),100)."</copyright>\n";
+		}
+		if ($this->editor!="") {
+			$feed.= "        <managingEditor>".FeedCreator::iTrunc(htmlspecialchars($this->editor),100)."</managingEditor>\n";
+		}
+		if ($this->webmaster!="") {
+			$feed.= "        <webMaster>".FeedCreator::iTrunc(htmlspecialchars($this->webmaster),100)."</webMaster>\n";
+		}
+		if ($this->pubDate!="") {
+			$pubDate = new FeedDate($this->pubDate);
+			$feed.= "        <pubDate>".htmlspecialchars($pubDate->rfc822())."</pubDate>\n";
+		}
+		if ($this->category!="") {
+			$feed.= "        <category>".htmlspecialchars($this->category)."</category>\n";
+		}
+		if ($this->docs!="") {
+			$feed.= "        <docs>".FeedCreator::iTrunc(htmlspecialchars($this->docs),500)."</docs>\n";
+		}
+		if ($this->ttl!="") {
+			$feed.= "        <ttl>".htmlspecialchars($this->ttl)."</ttl>\n";
+		}
+		if ($this->rating!="") {
+			$feed.= "        <rating>".FeedCreator::iTrunc(htmlspecialchars($this->rating),500)."</rating>\n";
+		}
+		if ($this->skipHours!="") {
+			$feed.= "        <skipHours>".htmlspecialchars($this->skipHours)."</skipHours>\n";
+		}
+		if ($this->skipDays!="") {
+			$feed.= "        <skipDays>".htmlspecialchars($this->skipDays)."</skipDays>\n";
+		}
+		$feed.= $this->_createAdditionalElements($this->additionalElements, "    ");
+
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "        <item>\n";
+			$feed.= "            <title>".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100)."</title>\n";
+			$feed.= "            <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+			$feed.= "            <description>".$this->items[$i]->getDescription()."</description>\n";
+
+			if ($this->items[$i]->author!="") {
+				$feed.= "            <author>".htmlspecialchars($this->items[$i]->author)."</author>\n";
+			}
+			/*
+			// on hold
+			if ($this->items[$i]->source!="") {
+					$feed.= "            <source>".htmlspecialchars($this->items[$i]->source)."</source>\n";
+			}
+			*/
+			if ($this->items[$i]->category!="") {
+				$feed.= "            <category>".htmlspecialchars($this->items[$i]->category)."</category>\n";
+			}
+			if ($this->items[$i]->comments!="") {
+				$feed.= "            <comments>".htmlspecialchars($this->items[$i]->comments)."</comments>\n";
+			}
+			if ($this->items[$i]->date!="") {
+			$itemDate = new FeedDate($this->items[$i]->date);
+				$feed.= "            <pubDate>".htmlspecialchars($itemDate->rfc822())."</pubDate>\n";
+			}
+			if ($this->items[$i]->guid!="") {
+				$feed.= "            <guid isPermaLink=\"false\">".htmlspecialchars($this->items[$i]->guid)."</guid>\n";
+			}
+			$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+			$feed.= "        </item>\n";
+		}
+		$feed.= "    </channel>\n";
+		$feed.= "</rss>\n";
+		return $feed;
+	}
+}
+
+
+
+/**
+ * RSSCreator20 is a FeedCreator that implements RDF Site Summary (RSS) 2.0.
+ *
+ * @see http://backend.userland.com/rss
+ * @since 1.3
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class RSSCreator20 extends RSSCreator091 {
+
+    function RSSCreator20() {
+        parent::_setRSSVersion("2.0");
+    }
+
+}
+
+
+/**
+ * PIECreator01 is a FeedCreator that implements the emerging PIE specification,
+ * as in http://intertwingly.net/wiki/pie/Syntax.
+ *
+ * @deprecated
+ * @since 1.3
+ * @author Scott Reynen <scott@randomchaos.com> and Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class PIECreator01 extends FeedCreator {
+
+	function PIECreator01() {
+		$this->encoding = "utf-8";
+	}
+
+	function createFeed() {
+		$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
+		$feed.= $this->_createStylesheetReferences();
+		$feed.= "<feed version=\"0.1\" xmlns=\"http://example.com/newformat#\">\n";
+		$feed.= "    <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
+		$this->truncSize = 500;
+		$feed.= "    <subtitle>".$this->getDescription()."</subtitle>\n";
+		$feed.= "    <link>".$this->link."</link>\n";
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "    <entry>\n";
+			$feed.= "        <title>".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100)."</title>\n";
+			$feed.= "        <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
+			$itemDate = new FeedDate($this->items[$i]->date);
+			$feed.= "        <created>".htmlspecialchars($itemDate->iso8601())."</created>\n";
+			$feed.= "        <issued>".htmlspecialchars($itemDate->iso8601())."</issued>\n";
+			$feed.= "        <modified>".htmlspecialchars($itemDate->iso8601())."</modified>\n";
+			$feed.= "        <id>".htmlspecialchars($this->items[$i]->guid)."</id>\n";
+			if ($this->items[$i]->author!="") {
+				$feed.= "        <author>\n";
+				$feed.= "            <name>".htmlspecialchars($this->items[$i]->author)."</name>\n";
+				if ($this->items[$i]->authorEmail!="") {
+					$feed.= "            <email>".$this->items[$i]->authorEmail."</email>\n";
+				}
+				$feed.="        </author>\n";
+			}
+			$feed.= "        <content type=\"text/html\" xml:lang=\"en-us\">\n";
+			$feed.= "            <div xmlns=\"http://www.w3.org/1999/xhtml\">".$this->items[$i]->getDescription()."</div>\n";
+			$feed.= "        </content>\n";
+			$feed.= "    </entry>\n";
+		}
+		$feed.= "</feed>\n";
+		return $feed;
+	}
+}
+
+
+/**
+ * AtomCreator03 is a FeedCreator that implements the atom specification,
+ * as in http://www.intertwingly.net/wiki/pie/FrontPage.
+ * Please note that just by using AtomCreator03 you won't automatically
+ * produce valid atom files. For example, you have to specify either an editor
+ * for the feed or an author for every single feed item.
+ *
+ * Some elements have not been implemented yet. These are (incomplete list):
+ * author URL, item author's email and URL, item contents, alternate links,
+ * other link content types than text/html. Some of them may be created with
+ * AtomCreator03::additionalElements.
+ *
+ * @see FeedCreator#additionalElements
+ * @since 1.6
+ * @author Kai Blankenhorn <kaib@bitfolge.de>, Scott Reynen <scott@randomchaos.com>
+ */
+class AtomCreator03 extends FeedCreator {
+
+	function AtomCreator03() {
+		$this->contentType = "application/atom+xml";
+		$this->encoding = "utf-8";
+	}
+
+	function createFeed() {
+		$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
+		$feed.= $this->_createGeneratorComment();
+		$feed.= $this->_createStylesheetReferences();
+		$feed.= "<feed version=\"0.3\" xmlns=\"http://purl.org/atom/ns#\"";
+		if ($this->language!="") {
+			$feed.= " xml:lang=\"".$this->language."\"";
+		}
+		$feed.= ">\n";
+		$feed.= "    <title>".htmlspecialchars($this->title)."</title>\n";
+		$feed.= "    <tagline>".htmlspecialchars($this->description)."</tagline>\n";
+		$feed.= "    <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->link)."\"/>\n";
+		$feed.= "    <id>".htmlspecialchars($this->link)."</id>\n";
+		$now = new FeedDate();
+		$feed.= "    <modified>".htmlspecialchars($now->iso8601())."</modified>\n";
+		if ($this->editor!="") {
+			$feed.= "    <author>\n";
+			$feed.= "        <name>".$this->editor."</name>\n";
+			if ($this->editorEmail!="") {
+				$feed.= "        <email>".$this->editorEmail."</email>\n";
+			}
+			$feed.= "    </author>\n";
+		}
+		$feed.= "    <generator>".FEEDCREATOR_VERSION."</generator>\n";
+		$feed.= $this->_createAdditionalElements($this->additionalElements, "    ");
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "    <entry>\n";
+			$feed.= "        <title>".htmlspecialchars(strip_tags($this->items[$i]->title))."</title>\n";
+			$feed.= "        <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->items[$i]->link)."\"/>\n";
+			if ($this->items[$i]->date=="") {
+				$this->items[$i]->date = time();
+			}
+			$itemDate = new FeedDate($this->items[$i]->date);
+			$feed.= "        <created>".htmlspecialchars($itemDate->iso8601())."</created>\n";
+			$feed.= "        <issued>".htmlspecialchars($itemDate->iso8601())."</issued>\n";
+			$feed.= "        <modified>".htmlspecialchars($itemDate->iso8601())."</modified>\n";
+			$feed.= "        <id>".htmlspecialchars($this->items[$i]->link)."</id>\n";
+			$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, "        ");
+			if ($this->items[$i]->author!="") {
+				$feed.= "        <author>\n";
+				$feed.= "            <name>".htmlspecialchars($this->items[$i]->author)."</name>\n";
+				$feed.= "        </author>\n";
+			}
+			if ($this->items[$i]->description!="") {
+				$feed.= "        <summary>".htmlspecialchars($this->items[$i]->description)."</summary>\n";
+			}
+			$feed.= "    </entry>\n";
+		}
+		$feed.= "</feed>\n";
+		return $feed;
+	}
+}
+
+
+/**
+ * MBOXCreator is a FeedCreator that implements the mbox format
+ * as described in http://www.qmail.org/man/man5/mbox.html
+ *
+ * @since 1.3
+ * @author Kai Blankenhorn <kaib@bitfolge.de>
+ */
+class MBOXCreator extends FeedCreator {
+
+	function MBOXCreator() {
+		$this->contentType = "text/plain";
+		$this->encoding = "ISO-8859-15";
+	}
+
+	function qp_enc($input = "", $line_max = 76) {
+		$hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
+		$lines = preg_split("/(?:\r\n|\r|\n)/", $input);
+		$eol = "\r\n";
+		$escape = "=";
+		$output = "";
+		while( list(, $line) = each($lines) ) {
+			//$line = rtrim($line); // remove trailing white space -> no =20\r\n necessary
+			$linlen = strlen($line);
+			$newline = "";
+			for($i = 0; $i < $linlen; $i++) {
+				$c = substr($line, $i, 1);
+				$dec = ord($c);
+				if ( ($dec == 32) && ($i == ($linlen - 1)) ) { // convert space at eol only
+					$c = "=20";
+				} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
+					$h2 = floor($dec/16); $h1 = floor($dec%16);
+					$c = $escape.$hex["$h2"].$hex["$h1"];
+				}
+				if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
+					$output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
+					$newline = "";
+				}
+				$newline .= $c;
+			} // end of for
+			$output .= $newline.$eol;
+		}
+		return trim($output);
+	}
+
+
+	/**
+	 * Builds the MBOX contents.
+	 * @return    string    the feed's complete text
+	 */
+	function createFeed() {
+		for ($i=0;$i<count($this->items);$i++) {
+			if ($this->items[$i]->author!="") {
+				$from = $this->items[$i]->author;
+			} else {
+				$from = $this->title;
+			}
+			$itemDate = new FeedDate($this->items[$i]->date);
+			$feed.= "From ".strtr(MBOXCreator::qp_enc($from)," ","_")." ".date("D M d H:i:s Y",$itemDate->unix())."\n";
+			$feed.= "Content-Type: text/plain;\n";
+			$feed.= "	charset=\"".$this->encoding."\"\n";
+			$feed.= "Content-Transfer-Encoding: quoted-printable\n";
+			$feed.= "Content-Type: text/plain\n";
+			$feed.= "From: \"".MBOXCreator::qp_enc($from)."\"\n";
+			$feed.= "Date: ".$itemDate->rfc822()."\n";
+			$feed.= "Subject: ".MBOXCreator::qp_enc(FeedCreator::iTrunc($this->items[$i]->title,100))."\n";
+			$feed.= "\n";
+			$body = chunk_split(MBOXCreator::qp_enc($this->items[$i]->description));
+			$feed.= preg_replace("~\nFrom ([^\n]*)(\n?)~","\n>From $1$2\n",$body);
+			$feed.= "\n";
+			$feed.= "\n";
+		}
+		return $feed;
+	}
+
+	/**
+	 * Generate a filename for the feed cache file. Overridden from FeedCreator to prevent XML data types.
+	 * @return string the feed cache filename
+	 * @since 1.4
+	 * @access private
+	 */
+	function _generateFilename() {
+		$fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+		return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".mbox";
+	}
+}
+
+
+/**
+ * OPMLCreator is a FeedCreator that implements OPML 1.0.
+ *
+ * @see http://opml.scripting.com/spec
+ * @author Dirk Clemens, Kai Blankenhorn
+ * @since 1.5
+ */
+class OPMLCreator extends FeedCreator {
+
+	function OPMLCreator() {
+		$this->encoding = "utf-8";
+	}
+
+	function createFeed() {
+		$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
+		$feed.= $this->_createGeneratorComment();
+		$feed.= $this->_createStylesheetReferences();
+		$feed.= "<opml xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
+		$feed.= "    <head>\n";
+		$feed.= "        <title>".htmlspecialchars($this->title)."</title>\n";
+		if ($this->pubDate!="") {
+			$date = new FeedDate($this->pubDate);
+			$feed.= "         <dateCreated>".$date->rfc822()."</dateCreated>\n";
+		}
+		if ($this->lastBuildDate!="") {
+			$date = new FeedDate($this->lastBuildDate);
+			$feed.= "         <dateModified>".$date->rfc822()."</dateModified>\n";
+		}
+		if ($this->editor!="") {
+			$feed.= "         <ownerName>".$this->editor."</ownerName>\n";
+		}
+		if ($this->editorEmail!="") {
+			$feed.= "         <ownerEmail>".$this->editorEmail."</ownerEmail>\n";
+		}
+		$feed.= "    </head>\n";
+		$feed.= "    <body>\n";
+		for ($i=0;$i<count($this->items);$i++) {
+			$feed.= "    <outline type=\"rss\" ";
+			$title = htmlspecialchars(strip_tags(strtr($this->items[$i]->title,"\n\r","  ")));
+			$feed.= " title=\"".$title."\"";
+			$feed.= " text=\"".$title."\"";
+			//$feed.= " description=\"".htmlspecialchars($this->items[$i]->description)."\"";
+			$feed.= " url=\"".htmlspecialchars($this->items[$i]->link)."\"";
+			$feed.= "/>\n";
+		}
+		$feed.= "    </body>\n";
+		$feed.= "</opml>\n";
+		return $feed;
+	}
+}
+
+
+
+/**
+ * HTMLCreator is a FeedCreator that writes an HTML feed file to a specific
+ * location, overriding the createFeed method of the parent FeedCreator.
+ * The HTML produced can be included over http by scripting languages, or serve
+ * as the source for an IFrame.
+ * All output by this class is embedded in <div></div> tags to enable formatting
+ * using CSS.
+ *
+ * @author Pascal Van Hecke
+ * @since 1.7
+ */
+class HTMLCreator extends FeedCreator {
+
+	var $contentType = "text/html";
+
+	/**
+	 * Contains HTML to be output at the start of the feed's html representation.
+	 */
+	var $header;
+
+	/**
+	 * Contains HTML to be output at the end of the feed's html representation.
+	 */
+	var $footer ;
+
+	/**
+	 * Contains HTML to be output between entries. A separator is only used in
+	 * case of multiple entries.
+	 */
+	var $separator;
+
+	/**
+	 * Used to prefix the stylenames to make sure they are unique
+	 * and do not clash with stylenames on the users' page.
+	 */
+	var $stylePrefix;
+
+	/**
+	 * Determines whether the links open in a new window or not.
+	 */
+	var $openInNewWindow = true;
+
+	var $imageAlign ="right";
+
+	/**
+	 * In case of very simple output you may want to get rid of the style tags,
+	 * hence this variable.  There's no equivalent on item level, but of course you can
+	 * add strings to it while iterating over the items ($this->stylelessOutput .= ...)
+	 * and when it is non-empty, ONLY the styleless output is printed, the rest is ignored
+	 * in the function createFeed().
+	 */
+	var $stylelessOutput ="";
+
+	/**
+	 * Writes the HTML.
+	 * @return    string    the scripts's complete text
+	 */
+	function createFeed() {
+		// if there is styleless output, use the content of this variable and ignore the rest
+		if ($this->stylelessOutput!="") {
+			return $this->stylelessOutput;
+		}
+
+		//if no stylePrefix is set, generate it yourself depending on the script name
+		if ($this->stylePrefix=="") {
+			$this->stylePrefix = str_replace(".", "_", $this->_generateFilename())."_";
+		}
+
+		//set an openInNewWindow_token_to be inserted or not
+		if ($this->openInNewWindow) {
+			$targetInsert = " target='_blank'";
+		}
+
+		// use this array to put the lines in and implode later with "document.write" javascript
+		$feedArray = array();
+		if ($this->image!=null) {
+			$imageStr = "<a href='".$this->image->link."'".$targetInsert.">".
+							"<img src='".$this->image->url."' border='0' alt='".
+							FeedCreator::iTrunc(htmlspecialchars($this->image->title),100).
+							"' align='".$this->imageAlign."' ";
+			if ($this->image->width) {
+				$imageStr .=" width='".$this->image->width. "' ";
+			}
+			if ($this->image->height) {
+				$imageStr .=" height='".$this->image->height."' ";
+			}
+			$imageStr .="/></a>";
+			$feedArray[] = $imageStr;
+		}
+
+		if ($this->title) {
+			$feedArray[] = "<div class='".$this->stylePrefix."title'><a href='".$this->link."' ".$targetInsert." class='".$this->stylePrefix."title'>".
+				FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</a></div>";
+		}
+		if ($this->getDescription()) {
+			$feedArray[] = "<div class='".$this->stylePrefix."description'>".
+				str_replace("]]>", "", str_replace("<![CDATA[", "", $this->getDescription())).
+				"</div>";
+		}
+
+		if ($this->header) {
+			$feedArray[] = "<div class='".$this->stylePrefix."header'>".$this->header."</div>";
+		}
+
+		for ($i=0;$i<count($this->items);$i++) {
+			if ($this->separator and $i > 0) {
+				$feedArray[] = "<div class='".$this->stylePrefix."separator'>".$this->separator."</div>";
+			}
+
+			if ($this->items[$i]->title) {
+				if ($this->items[$i]->link) {
+					$feedArray[] =
+						"<div class='".$this->stylePrefix."item_title'><a href='".$this->items[$i]->link."' class='".$this->stylePrefix.
+						"item_title'".$targetInsert.">".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100).
+						"</a></div>";
+				} else {
+					$feedArray[] =
+						"<div class='".$this->stylePrefix."item_title'>".
+						FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100).
+						"</div>";
+				}
+			}
+			if ($this->items[$i]->getDescription()) {
+				$feedArray[] =
+				"<div class='".$this->stylePrefix."item_description'>".
+					str_replace("]]>", "", str_replace("<![CDATA[", "", $this->items[$i]->getDescription())).
+					"</div>";
+			}
+		}
+		if ($this->footer) {
+			$feedArray[] = "<div class='".$this->stylePrefix."footer'>".$this->footer."</div>";
+		}
+
+		$feed= "".join($feedArray, "\r\n");
+		return $feed;
+	}
+
+	/**
+	 * Overrrides parent to produce .html extensions
+	 *
+	 * @return string the feed cache filename
+	 * @since 1.4
+	 * @access private
+	 */
+	function _generateFilename() {
+		$fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+		return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".html";
+	}
+}
+
+
+/**
+ * JSCreator is a class that writes a js file to a specific
+ * location, overriding the createFeed method of the parent HTMLCreator.
+ *
+ * @author Pascal Van Hecke
+ */
+class JSCreator extends HTMLCreator {
+	var $contentType = "text/javascript";
+
+	/**
+	 * writes the javascript
+	 * @return    string    the scripts's complete text
+	 */
+	function createFeed()
+	{
+		$feed = parent::createFeed();
+		$feedArray = explode("\n",$feed);
+
+		$jsFeed = "";
+		foreach ($feedArray as $value) {
+			$jsFeed .= "document.write('".trim(addslashes($value))."');\n";
+		}
+		return $jsFeed;
+	}
+
+	/**
+	 * Overrrides parent to produce .js extensions
+	 *
+	 * @return string the feed cache filename
+	 * @since 1.4
+	 * @access private
+	 */
+	function _generateFilename() {
+		$fileInfo = pathinfo($_SERVER["PHP_SELF"]);
+		return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".js";
+	}
+
+}
+
+
+
+/*** TEST SCRIPT *********************************************************
+
+//include("feedcreator.class.php");
+
+$rss = new UniversalFeedCreator();
+$rss->useCached();
+$rss->title = "PHP news";
+$rss->description = "daily news from the PHP scripting world";
+
+//optional
+//$rss->descriptionTruncSize = 500;
+//$rss->descriptionHtmlSyndicated = true;
+//$rss->xslStyleSheet = "http://feedster.com/rss20.xsl";
+
+$rss->link = "http://www.dailyphp.net/news";
+$rss->feedURL = "http://www.dailyphp.net/".$PHP_SELF;
+
+$image = new FeedImage();
+$image->title = "dailyphp.net logo";
+$image->url = "http://www.dailyphp.net/images/logo.gif";
+$image->link = "http://www.dailyphp.net";
+$image->description = "Feed provided by dailyphp.net. Click to visit.";
+
+//optional
+$image->descriptionTruncSize = 500;
+$image->descriptionHtmlSyndicated = true;
+
+$rss->image = $image;
+
+// get your news items from somewhere, e.g. your database:
+//mysql_select_db($dbHost, $dbUser, $dbPass);
+//$res = mysql_query("SELECT * FROM news ORDER BY newsdate DESC");
+//while ($data = mysql_fetch_object($res)) {
+	$item = new FeedItem();
+	$item->title = "This is an the test title of an item";
+	$item->link = "http://localhost/item/";
+	$item->description = "<b>description in </b><br/>HTML";
+
+	//optional
+	//item->descriptionTruncSize = 500;
+	$item->descriptionHtmlSyndicated = true;
+
+	$item->date = time();
+	$item->source = "http://www.dailyphp.net";
+	$item->author = "John Doe";
+
+	$rss->addItem($item);
+//}
+
+// valid format strings are: RSS0.91, RSS1.0, RSS2.0, PIE0.1, MBOX, OPML, ATOM0.3, HTML, JS
+echo $rss->saveFeed("RSS0.91", "feed.xml");
+
+
+
+***************************************************************************/
+
+?>
Index: tags/2.4.0RC3/include/filter.inc.php
===================================================================
--- tags/2.4.0RC3/include/filter.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/filter.inc.php	(revision 14585)
@@ -0,0 +1,143 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// $filter['enabled']: Filter is enabled
+// $filter['recent_period']: Recent period used to computed filter data
+// $filter['categories']: Computed data of filtered categories
+// $filter['visible_categories']:
+//  List of visible categories (count(visible) < count(forbidden) more often)
+// $filter['visible_images']: List of visible images
+
+if (!get_filter_page_value('cancel'))
+{
+  if (isset($_GET['filter']))
+  {
+    $filter['matches'] = array();
+    $filter['enabled'] =
+      preg_match('/^start-recent-(\d+)$/', $_GET['filter'], $filter['matches']) === 1;
+  }
+  else
+  {
+    $filter['enabled'] = pwg_get_session_var('filter_enabled', false);
+  }
+}
+else
+{
+  $filter['enabled'] = false;
+}
+
+if ($filter['enabled'])
+{
+  $filter_key = pwg_get_session_var('filter_check_key', array('user'=>0,'recent_period'=>-1, 'time'=>0, 'date'=> '') );
+
+  if (isset($filter['matches']))
+  {
+    $filter['recent_period'] = $filter['matches'][1];
+  }
+  else
+  {
+    $filter['recent_period'] = $filter_key['recent_period']>0 ? $filter_key['recent_period'] : $user['recent_period'];
+  }
+
+  if (
+      // New filter
+      !pwg_get_session_var('filter_enabled', false) or
+      // Cache data updated
+      $filter_key['time'] <= $user['cache_update_time'] or
+      // Date, period, user are changed
+      $filter_key['user'] != $user['id'] or
+      $filter_key['recent_period'] != $filter['recent_period'] or
+      $filter_key['date'] != date('Ymd')
+    )
+  {
+    // Need to compute dats
+    $filter_key = array(
+      'user'=>(int)$user['id'],'recent_period'=>(int)$filter['recent_period'], 'time'=>time(), 'date'=> date('Ymd')
+     );
+
+    $filter['categories'] = get_computed_categories($user, (int)$filter['recent_period']);
+
+    $filter['visible_categories'] = implode(',', array_keys($filter['categories']));
+    if (empty($filter['visible_categories']))
+    {
+      // Must be not empty
+      $filter['visible_categories'] = -1;
+    }
+
+    $query ='
+SELECT
+  distinct image_id
+FROM '.
+  IMAGE_CATEGORY_TABLE.' INNER JOIN '.IMAGES_TABLE.' ON image_id = id
+WHERE ';
+    if (!empty($filter['visible_categories']))
+    {
+    $query.= '
+  category_id  IN ('.$filter['visible_categories'].') and';
+    }
+  $query.= '
+    date_available >= '.pwg_db_get_recent_period_expression($filter['recent_period']);
+
+    $filter['visible_images'] = implode(',', array_from_query($query, 'image_id'));
+
+    if (empty($filter['visible_images']))
+    {
+      // Must be not empty
+      $filter['visible_images'] = -1;
+    }
+
+    // Save filter data on session
+    pwg_set_session_var('filter_enabled', $filter['enabled']);
+    pwg_set_session_var('filter_check_key', $filter_key);
+    pwg_set_session_var('filter_categories', serialize($filter['categories']));
+    pwg_set_session_var('filter_visible_categories', $filter['visible_categories']);
+    pwg_set_session_var('filter_visible_images', $filter['visible_images']);
+  }
+  else
+  {
+    // Read only data
+    $filter['categories'] = unserialize(pwg_get_session_var('filter_categories', serialize(array())));
+    $filter['visible_categories'] = pwg_get_session_var('filter_visible_categories', '');
+    $filter['visible_images'] = pwg_get_session_var('filter_visible_images', '');
+  }
+  unset($filter_key);
+  if (get_filter_page_value('add_notes'))
+  {
+    $header_notes[] = l10n_dec('Photos posted within the last %d day.', 'Photos posted within the last %d days.', $filter['recent_period']);
+  }
+  include_once(PHPWG_ROOT_PATH.'include/functions_filter.inc.php');
+}
+else
+{
+  if (pwg_get_session_var('filter_enabled', false))
+  {
+    pwg_unset_session_var('filter_enabled');
+    pwg_unset_session_var('filter_check_key');
+    pwg_unset_session_var('filter_categories');
+    pwg_unset_session_var('filter_visible_categories');
+    pwg_unset_session_var('filter_visible_images');
+  }
+}
+
+
+?>
Index: tags/2.4.0RC3/include/functions.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions.inc.php	(revision 14585)
@@ -0,0 +1,1710 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+include_once( PHPWG_ROOT_PATH .'include/functions_user.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_cookie.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_session.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_category.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_html.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_tag.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_url.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/functions_plugins.inc.php' );
+include_once( PHPWG_ROOT_PATH .'include/derivative_params.inc.php');
+include_once( PHPWG_ROOT_PATH .'include/derivative_std_params.inc.php');
+include_once( PHPWG_ROOT_PATH .'include/derivative.inc.php');
+require_once( PHPWG_ROOT_PATH .'include/smarty/libs/Smarty.class.php');
+include_once( PHPWG_ROOT_PATH .'include/template.class.php');
+
+//----------------------------------------------------------- generic functions
+
+/**
+ * stupidly returns the current microsecond since Unix epoch
+ */
+function micro_seconds()
+{
+  $t1 = explode(' ', microtime());
+  $t2 = explode('.', $t1[0]);
+  $t2 = $t1[1].substr($t2[1], 0, 6);
+  return $t2;
+}
+
+// The function get_moment returns a float value coresponding to the number
+// of seconds since the unix epoch (1st January 1970) and the microseconds
+// are precised : e.g. 1052343429.89276600
+function get_moment()
+{
+  return microtime(true);
+}
+
+// The function get_elapsed_time returns the number of seconds (with 3
+// decimals precision) between the start time and the end time given.
+function get_elapsed_time( $start, $end )
+{
+  return number_format( $end - $start, 3, '.', ' ').' s';
+}
+
+// - The replace_space function replaces space and '-' characters
+//   by their HTML equivalent  &nbsb; and &minus;
+// - The function does not replace characters in HTML tags
+// - This function was created because IE5 does not respect the
+//   CSS "white-space: nowrap;" property unless space and minus
+//   characters are replaced like this function does.
+// - Example :
+//                 <div class="foo">My friend</div>
+//               ( 01234567891111111111222222222233 )
+//               (           0123456789012345678901 )
+// becomes :
+//             <div class="foo">My&nbsp;friend</div>
+function replace_space( $string )
+{
+  //return $string;
+  $return_string = '';
+  // $remaining is the rest of the string where to replace spaces characters
+  $remaining = $string;
+  // $start represents the position of the next '<' character
+  // $end   represents the position of the next '>' character
+  ; // -> 0
+  $end   = strpos ( $remaining, '>' ); // -> 16
+  // as long as a '<' and his friend '>' are found, we loop
+  while ( ($start=strpos( $remaining, '<' )) !==false
+        and ($end=strpos( $remaining, '>' )) !== false )
+  {
+    // $treatment is the part of the string to treat
+    // In the first loop of our example, this variable is empty, but in the
+    // second loop, it equals 'My friend'
+    $treatment = substr ( $remaining, 0, $start );
+    // Replacement of ' ' by his equivalent '&nbsp;'
+    $treatment = str_replace( ' ', '&nbsp;', $treatment );
+    $treatment = str_replace( '-', '&minus;', $treatment );
+    // composing the string to return by adding the treated string and the
+    // following HTML tag -> 'My&nbsp;friend</div>'
+    $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 );
+    // the remaining string is deplaced to the part after the '>' of this
+    // loop
+    $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
+  }
+  $treatment = str_replace( ' ', '&nbsp;', $remaining );
+  $treatment = str_replace( '-', '&minus;', $treatment );
+  $return_string.= $treatment;
+
+  return $return_string;
+}
+
+// get_extension returns the part of the string after the last "."
+function get_extension( $filename )
+{
+  return substr( strrchr( $filename, '.' ), 1, strlen ( $filename ) );
+}
+
+// get_filename_wo_extension returns the part of the string before the last
+// ".".
+// get_filename_wo_extension( 'test.tar.gz' ) -> 'test.tar'
+function get_filename_wo_extension( $filename )
+{
+  $pos = strrpos( $filename, '.' );
+  return ($pos===false) ? $filename : substr( $filename, 0, $pos);
+}
+
+/**
+ * returns an array contening sub-directories, excluding ".svn"
+ *
+ * @param string $dir
+ * @return array
+ */
+function get_dirs($directory)
+{
+  $sub_dirs = array();
+  if ($opendir = opendir($directory))
+  {
+    while ($file = readdir($opendir))
+    {
+      if ($file != '.'
+          and $file != '..'
+          and is_dir($directory.'/'.$file)
+          and $file != '.svn')
+      {
+        array_push($sub_dirs, $file);
+      }
+    }
+    closedir($opendir);
+  }
+  return $sub_dirs;
+}
+
+define('MKGETDIR_NONE', 0);
+define('MKGETDIR_RECURSIVE', 1);
+define('MKGETDIR_DIE_ON_ERROR', 2);
+define('MKGETDIR_PROTECT_INDEX', 4);
+define('MKGETDIR_PROTECT_HTACCESS', 8);
+define('MKGETDIR_DEFAULT', 7);
+/**
+ * creates directory if not exists; ensures that directory is writable
+ * @param:
+ *  string $dir
+ *  int $flags combination of MKGETDIR_xxx
+ * @return bool false on error else true
+ */
+function mkgetdir($dir, $flags=MKGETDIR_DEFAULT)
+{
+  if ( !is_dir($dir) )
+  {
+    global $conf;
+    if (substr(PHP_OS, 0, 3) == 'WIN')
+    {
+      $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);
+    }
+    $umask = umask(0);
+    $mkd = @mkdir($dir, $conf['chmod_value'], ($flags&MKGETDIR_RECURSIVE) ? true:false );
+    umask($umask);
+    if ($mkd==false)
+    {
+      !($flags&MKGETDIR_DIE_ON_ERROR) or fatal_error( "$dir ".l10n('no write access'));
+      return false;
+    }
+    if( $flags&MKGETDIR_PROTECT_HTACCESS )
+    {
+      $file = $dir.'/.htaccess';
+      file_exists($file) or @file_put_contents( $file, 'deny from all' );
+    }
+    if( $flags&MKGETDIR_PROTECT_INDEX )
+    {
+      $file = $dir.'/index.htm';
+      file_exists($file) or @file_put_contents( $file, 'Not allowed!' );
+    }
+  }
+  if ( !is_writable($dir) )
+  {
+    !($flags&MKGETDIR_DIE_ON_ERROR) or fatal_error( "$dir ".l10n('no write access'));
+    return false;
+  }
+  return true;
+}
+
+/**
+ * returns thumbnail directory name of input diretoty name
+ * make thumbnail directory is necessary
+ * set error messages on array messages
+ *
+ * @param:
+ *  string $dirname
+ *  arrayy $errors
+ * @return bool false on error else string directory name
+ */
+function mkget_thumbnail_dir($dirname, &$errors)
+{
+  global $conf;
+
+  $tndir = $dirname.'/'.$conf['dir_thumbnail'];
+  if (! mkgetdir($tndir, MKGETDIR_NONE) )
+  {
+    array_push($errors,
+          '['.$dirname.'] : '.l10n('no write access'));
+    return false;
+  }
+  return $tndir;
+}
+
+/* Returns true if the string appears to be encoded in UTF-8. (from wordpress)
+ * @param string Str
+ */
+function seems_utf8($Str) { # by bmorel at ssi dot fr
+  for ($i=0; $i<strlen($Str); $i++) {
+    if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
+    elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
+    elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
+    elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
+    elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
+    elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
+    else return false; # Does not match any model
+    for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
+      if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
+      return false;
+    }
+  }
+  return true;
+}
+
+/* Remove accents from a UTF-8 or ISO-859-1 string (from wordpress)
+ * @param string sstring - an UTF-8 or ISO-8859-1 string
+ */
+function remove_accents($string)
+{
+  if ( !preg_match('/[\x80-\xff]/', $string) )
+    return $string;
+
+  if (seems_utf8($string)) {
+    $chars = array(
+    // Decompositions for Latin-1 Supplement
+    "\xc3\x80"=>'A', "\xc3\x81"=>'A',
+    "\xc3\x82"=>'A', "\xc3\x83"=>'A',
+    "\xc3\x84"=>'A', "\xc3\x85"=>'A',
+    "\xc3\x87"=>'C', "\xc3\x88"=>'E',
+    "\xc3\x89"=>'E', "\xc3\x8a"=>'E',
+    "\xc3\x8b"=>'E', "\xc3\x8c"=>'I',
+    "\xc3\x8d"=>'I', "\xc3\x8e"=>'I',
+    "\xc3\x8f"=>'I', "\xc3\x91"=>'N',
+    "\xc3\x92"=>'O', "\xc3\x93"=>'O',
+    "\xc3\x94"=>'O', "\xc3\x95"=>'O',
+    "\xc3\x96"=>'O', "\xc3\x99"=>'U',
+    "\xc3\x9a"=>'U', "\xc3\x9b"=>'U',
+    "\xc3\x9c"=>'U', "\xc3\x9d"=>'Y',
+    "\xc3\x9f"=>'s', "\xc3\xa0"=>'a',
+    "\xc3\xa1"=>'a', "\xc3\xa2"=>'a',
+    "\xc3\xa3"=>'a', "\xc3\xa4"=>'a',
+    "\xc3\xa5"=>'a', "\xc3\xa7"=>'c',
+    "\xc3\xa8"=>'e', "\xc3\xa9"=>'e',
+    "\xc3\xaa"=>'e', "\xc3\xab"=>'e',
+    "\xc3\xac"=>'i', "\xc3\xad"=>'i',
+    "\xc3\xae"=>'i', "\xc3\xaf"=>'i',
+    "\xc3\xb1"=>'n', "\xc3\xb2"=>'o',
+    "\xc3\xb3"=>'o', "\xc3\xb4"=>'o',
+    "\xc3\xb5"=>'o', "\xc3\xb6"=>'o',
+    "\xc3\xb9"=>'u', "\xc3\xba"=>'u',
+    "\xc3\xbb"=>'u', "\xc3\xbc"=>'u',
+    "\xc3\xbd"=>'y', "\xc3\xbf"=>'y',
+    // Decompositions for Latin Extended-A
+    "\xc4\x80"=>'A', "\xc4\x81"=>'a',
+    "\xc4\x82"=>'A', "\xc4\x83"=>'a',
+    "\xc4\x84"=>'A', "\xc4\x85"=>'a',
+    "\xc4\x86"=>'C', "\xc4\x87"=>'c',
+    "\xc4\x88"=>'C', "\xc4\x89"=>'c',
+    "\xc4\x8a"=>'C', "\xc4\x8b"=>'c',
+    "\xc4\x8c"=>'C', "\xc4\x8d"=>'c',
+    "\xc4\x8e"=>'D', "\xc4\x8f"=>'d',
+    "\xc4\x90"=>'D', "\xc4\x91"=>'d',
+    "\xc4\x92"=>'E', "\xc4\x93"=>'e',
+    "\xc4\x94"=>'E', "\xc4\x95"=>'e',
+    "\xc4\x96"=>'E', "\xc4\x97"=>'e',
+    "\xc4\x98"=>'E', "\xc4\x99"=>'e',
+    "\xc4\x9a"=>'E', "\xc4\x9b"=>'e',
+    "\xc4\x9c"=>'G', "\xc4\x9d"=>'g',
+    "\xc4\x9e"=>'G', "\xc4\x9f"=>'g',
+    "\xc4\xa0"=>'G', "\xc4\xa1"=>'g',
+    "\xc4\xa2"=>'G', "\xc4\xa3"=>'g',
+    "\xc4\xa4"=>'H', "\xc4\xa5"=>'h',
+    "\xc4\xa6"=>'H', "\xc4\xa7"=>'h',
+    "\xc4\xa8"=>'I', "\xc4\xa9"=>'i',
+    "\xc4\xaa"=>'I', "\xc4\xab"=>'i',
+    "\xc4\xac"=>'I', "\xc4\xad"=>'i',
+    "\xc4\xae"=>'I', "\xc4\xaf"=>'i',
+    "\xc4\xb0"=>'I', "\xc4\xb1"=>'i',
+    "\xc4\xb2"=>'IJ', "\xc4\xb3"=>'ij',
+    "\xc4\xb4"=>'J', "\xc4\xb5"=>'j',
+    "\xc4\xb6"=>'K', "\xc4\xb7"=>'k',
+    "\xc4\xb8"=>'k', "\xc4\xb9"=>'L',
+    "\xc4\xba"=>'l', "\xc4\xbb"=>'L',
+    "\xc4\xbc"=>'l', "\xc4\xbd"=>'L',
+    "\xc4\xbe"=>'l', "\xc4\xbf"=>'L',
+    "\xc5\x80"=>'l', "\xc5\x81"=>'L',
+    "\xc5\x82"=>'l', "\xc5\x83"=>'N',
+    "\xc5\x84"=>'n', "\xc5\x85"=>'N',
+    "\xc5\x86"=>'n', "\xc5\x87"=>'N',
+    "\xc5\x88"=>'n', "\xc5\x89"=>'N',
+    "\xc5\x8a"=>'n', "\xc5\x8b"=>'N',
+    "\xc5\x8c"=>'O', "\xc5\x8d"=>'o',
+    "\xc5\x8e"=>'O', "\xc5\x8f"=>'o',
+    "\xc5\x90"=>'O', "\xc5\x91"=>'o',
+    "\xc5\x92"=>'OE', "\xc5\x93"=>'oe',
+    "\xc5\x94"=>'R', "\xc5\x95"=>'r',
+    "\xc5\x96"=>'R', "\xc5\x97"=>'r',
+    "\xc5\x98"=>'R', "\xc5\x99"=>'r',
+    "\xc5\x9a"=>'S', "\xc5\x9b"=>'s',
+    "\xc5\x9c"=>'S', "\xc5\x9d"=>'s',
+    "\xc5\x9e"=>'S', "\xc5\x9f"=>'s',
+    "\xc5\xa0"=>'S', "\xc5\xa1"=>'s',
+    "\xc5\xa2"=>'T', "\xc5\xa3"=>'t',
+    "\xc5\xa4"=>'T', "\xc5\xa5"=>'t',
+    "\xc5\xa6"=>'T', "\xc5\xa7"=>'t',
+    "\xc5\xa8"=>'U', "\xc5\xa9"=>'u',
+    "\xc5\xaa"=>'U', "\xc5\xab"=>'u',
+    "\xc5\xac"=>'U', "\xc5\xad"=>'u',
+    "\xc5\xae"=>'U', "\xc5\xaf"=>'u',
+    "\xc5\xb0"=>'U', "\xc5\xb1"=>'u',
+    "\xc5\xb2"=>'U', "\xc5\xb3"=>'u',
+    "\xc5\xb4"=>'W', "\xc5\xb5"=>'w',
+    "\xc5\xb6"=>'Y', "\xc5\xb7"=>'y',
+    "\xc5\xb8"=>'Y', "\xc5\xb9"=>'Z',
+    "\xc5\xba"=>'z', "\xc5\xbb"=>'Z',
+    "\xc5\xbc"=>'z', "\xc5\xbd"=>'Z',
+    "\xc5\xbe"=>'z', "\xc5\xbf"=>'s',
+    // Euro Sign
+    "\xe2\x82\xac"=>'E',
+    // GBP (Pound) Sign
+    "\xc2\xa3"=>'');
+
+    $string = strtr($string, $chars);
+  } else {
+    // Assume ISO-8859-1 if not UTF-8
+    $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
+      .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
+      .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
+      .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
+      .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
+      .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
+      .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
+      .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
+      .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
+      .chr(252).chr(253).chr(255);
+
+    $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
+
+    $string = strtr($string, $chars['in'], $chars['out']);
+    $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
+    $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
+    $string = str_replace($double_chars['in'], $double_chars['out'], $string);
+  }
+
+  return $string;
+}
+
+/**
+ * simplify a string to insert it into an URL
+ *
+ * @param string
+ * @return string
+ */
+function str2url($str)
+{
+  $raw = $str;
+
+  $str = remove_accents($str);
+  $str = preg_replace('/[^a-z0-9_\s\'\:\/\[\],-]/','',strtolower($str));
+  $str = preg_replace('/[\s\'\:\/\[\],-]+/',' ',trim($str));
+  $res = str_replace(' ','_',$str);
+
+  if (empty($res))
+  {
+    $res = str_replace(' ','_', $raw);
+  }
+
+  return $res;
+}
+
+//-------------------------------------------- Piwigo specific functions
+
+/**
+ * returns an array with a list of {language_code => language_name}
+ *
+ * @returns array
+ */
+function get_languages()
+{
+  $query = '
+SELECT id, name
+  FROM '.LANGUAGES_TABLE.'
+  ORDER BY name ASC
+;';
+  $result = pwg_query($query);
+
+  $languages = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if (is_dir(PHPWG_ROOT_PATH.'language/'.$row['id']))
+    {
+      $languages[ $row['id'] ] = $row['name'];
+    }
+  }
+
+  return $languages;
+}
+
+function pwg_log($image_id = null, $image_type = null)
+{
+  global $conf, $user, $page;
+
+  $do_log = $conf['log'];
+  if (is_admin())
+  {
+    $do_log = $conf['history_admin'];
+  }
+  if (is_a_guest())
+  {
+    $do_log = $conf['history_guest'];
+  }
+
+  $do_log = trigger_event('pwg_log_allowed', $do_log, $image_id, $image_type);
+
+  if (!$do_log)
+  {
+    return false;
+  }
+
+  $tags_string = null;
+  if ('tags'==@$page['section'])
+  {
+    $tags_string = implode(',', $page['tag_ids']);
+  }
+
+  $query = '
+INSERT INTO '.HISTORY_TABLE.'
+  (
+    date,
+    time,
+    user_id,
+    IP,
+    section,
+    category_id,
+    image_id,
+    image_type,
+    tag_ids
+  )
+  VALUES
+  (
+    CURRENT_DATE,
+    CURRENT_TIME,
+    '.$user['id'].',
+    \''.$_SERVER['REMOTE_ADDR'].'\',
+    '.(isset($page['section']) ? "'".$page['section']."'" : 'NULL').',
+    '.(isset($page['category']['id']) ? $page['category']['id'] : 'NULL').',
+    '.(isset($image_id) ? $image_id : 'NULL').',
+    '.(isset($image_type) ? "'".$image_type."'" : 'NULL').',
+    '.(isset($tags_string) ? "'".$tags_string."'" : 'NULL').'
+  )
+;';
+  pwg_query($query);
+
+  return true;
+}
+
+// format_date returns a formatted date for display. The date given in
+// argument must be an american format (2003-09-15). By option, you can show the time.
+// The output is internationalized.
+//
+// format_date( "2003-09-15", true ) -> "Monday 15 September 2003 21:52"
+function format_date($date, $show_time = false, $show_day_name = true)
+{
+  global $lang;
+
+  if (strpos($date, '0') == 0)
+  {
+    return l10n('N/A');
+  }
+
+  $ymdhms = array();
+  $tok = strtok( $date, '- :');
+  while ($tok !== false)
+  {
+    $ymdhms[] = $tok;
+    $tok = strtok('- :');
+  }
+
+  if ( count($ymdhms)<3 )
+  {
+    return false;
+  }
+
+  $formated_date = '';
+  // before 1970, Microsoft Windows can't mktime
+  if ($show_day_name and $ymdhms[0] >= 1970)
+  {
+    // we ask midday because Windows think it's prior to midnight with a
+    // zero and refuse to work
+    $formated_date.= $lang['day'][date('w', mktime(12,0,0,$ymdhms[1],$ymdhms[2],$ymdhms[0]))];
+  }
+  $formated_date.= ' '.$ymdhms[2];
+  $formated_date.= ' '.$lang['month'][(int)$ymdhms[1]];
+  $formated_date.= ' '.$ymdhms[0];
+  if ($show_time and count($ymdhms)>=5 )
+  {
+    $formated_date.= ' '.$ymdhms[3].':'.$ymdhms[4];
+  }
+  return $formated_date;
+}
+
+/**
+ * Works out the time since the entry post, takes a an argument in unix time or datetime
+ */
+function time_since($original, $stop = 'minute')
+{
+  if (!is_int($original))
+  {
+    $ymdhms = array();
+    $tok = strtok($original, '- :');
+    while ($tok !== false)
+    {
+      $ymdhms[] = $tok;
+      $tok = strtok('- :');
+    }
+    
+    if ($ymdhms[0] < 1970) return false;
+    if (!isset($ymdhms[3])) $ymdhms[3] = 12;
+    if (!isset($ymdhms[4])) $ymdhms[4] = 0;
+    if (!isset($ymdhms[5])) $ymdhms[5] = 0;
+    $original = mktime($ymdhms[3],$ymdhms[4],$ymdhms[5],$ymdhms[1],$ymdhms[2],$ymdhms[0]);
+  }
+  
+  // array of time period chunks
+  $chunks = array(
+    'year' => 60 * 60 * 24 * 365,
+    'month' => 60 * 60 * 24 * 30,
+    'week' => 60 * 60 * 24 * 7,
+    'day' => 60 * 60 * 24,
+    'hour' => 60 * 60,
+    'minute' => 60,
+    'second' => 1,
+  );
+  
+  $today = time(); /* Current unix time  */
+  $since = abs($today - $original);
+  
+  $print = null;
+  foreach ($chunks as $name => $seconds)
+  {
+    if (($count = floor($since / $seconds)) != 0)
+    {
+      $print.= l10n_dec('%d '.$name, '%d '.$name.'s', $count);
+      $since-= $count*$seconds;
+    }
+    if (!empty($print) and $chunks[$name] <= $chunks[$stop])
+    {
+      break;
+    }
+  }
+
+  if ($today > $original) 
+  {
+    $print = sprintf(l10n('%s ago'), $print);
+  }
+  else
+  {
+    $print = sprintf(l10n('%s in the future'), $print);
+  }
+  
+  return $print;
+}
+
+function pwg_debug( $string )
+{
+  global $debug,$t2,$page;
+
+  $now = explode( ' ', microtime() );
+  $now2 = explode( '.', $now[0] );
+  $now2 = $now[1].'.'.$now2[1];
+  $time = number_format( $now2 - $t2, 3, '.', ' ').' s';
+  $debug .= '<p>';
+  $debug.= '['.$time.', ';
+  $debug.= $page['count_queries'].' queries] : '.$string;
+  $debug.= "</p>\n";
+}
+
+/**
+ * Redirects to the given URL (HTTP method)
+ *
+ * Note : once this function called, the execution doesn't go further
+ * (presence of an exit() instruction.
+ *
+ * @param string $url
+ * @return void
+ */
+function redirect_http( $url )
+{
+  if (ob_get_length () !== FALSE)
+  {
+    ob_clean();
+  }
+  // default url is on html format
+  $url = html_entity_decode($url);
+  header('Request-URI: '.$url);
+  header('Content-Location: '.$url);
+  header('Location: '.$url);
+  exit();
+}
+
+/**
+ * Redirects to the given URL (HTML method)
+ *
+ * Note : once this function called, the execution doesn't go further
+ * (presence of an exit() instruction.
+ *
+ * @param string $url
+ * @param string $title_msg
+ * @param integer $refreh_time
+ * @return void
+ */
+function redirect_html( $url , $msg = '', $refresh_time = 0)
+{
+  global $user, $template, $lang_info, $conf, $lang, $t2, $page, $debug;
+
+  if (!isset($lang_info) || !isset($template) )
+  {
+    $user = build_user( $conf['guest_id'], true);
+    load_language('common.lang');
+    trigger_action('loading_lang');
+    load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR, array('no_fallback'=>true, 'local'=>true) );
+    $template = new Template(PHPWG_ROOT_PATH.'themes', get_default_theme());
+  }
+	elseif (defined('IN_ADMIN') and IN_ADMIN)
+	{
+		$template = new Template(PHPWG_ROOT_PATH.'themes', get_default_theme());
+	}
+
+  if (empty($msg))
+  {
+    $msg = nl2br(l10n('Redirection...'));
+  }
+
+  $refresh = $refresh_time;
+  $url_link = $url;
+  $title = 'redirection';
+
+  $template->set_filenames( array( 'redirect' => 'redirect.tpl' ) );
+
+  include( PHPWG_ROOT_PATH.'include/page_header.php' );
+
+  $template->set_filenames( array( 'redirect' => 'redirect.tpl' ) );
+  $template->assign('REDIRECT_MSG', $msg);
+
+  $template->parse('redirect');
+
+  include( PHPWG_ROOT_PATH.'include/page_tail.php' );
+
+  exit();
+}
+
+/**
+ * Redirects to the given URL (Switch to HTTP method or HTML method)
+ *
+ * Note : once this function called, the execution doesn't go further
+ * (presence of an exit() instruction.
+ *
+ * @param string $url
+ * @param string $title_msg
+ * @param integer $refreh_time
+ * @return void
+ */
+function redirect( $url , $msg = '', $refresh_time = 0)
+{
+  global $conf;
+
+  // with RefeshTime <> 0, only html must be used
+  if ($conf['default_redirect_method']=='http'
+      and $refresh_time==0
+      and !headers_sent()
+    )
+  {
+    redirect_http($url);
+  }
+  else
+  {
+    redirect_html($url, $msg, $refresh_time);
+  }
+}
+
+/**
+ * returns $_SERVER['QUERY_STRING'] whitout keys given in parameters
+ *
+ * @param array $rejects
+ * @param boolean $escape - if true escape & to &amp; (for html)
+ * @returns string
+ */
+function get_query_string_diff($rejects=array(), $escape=true)
+{
+  if (empty($_SERVER['QUERY_STRING']))
+  {
+    return '';
+  }
+
+  $query_string = '';
+
+  $str = $_SERVER['QUERY_STRING'];
+  parse_str($str, $vars);
+
+  $is_first = true;
+  foreach ($vars as $key => $value)
+  {
+    if (!in_array($key, $rejects))
+    {
+      $query_string.= $is_first ? '?' : ($escape ? '&amp;' : '&' );
+      $is_first = false;
+      $query_string.= $key.'='.$value;
+    }
+  }
+
+  return $query_string;
+}
+
+function url_is_remote($url)
+{
+  if ( strncmp($url, 'http://', 7)==0
+    or strncmp($url, 'https://', 8)==0 )
+  {
+    return true;
+  }
+  return false;
+}
+
+/**
+ * returns available themes
+ */
+function get_pwg_themes($show_mobile=false)
+{
+  global $conf;
+
+  $themes = array();
+
+  $query = '
+SELECT
+    id,
+    name
+  FROM '.THEMES_TABLE.'
+  ORDER BY name ASC
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if ($row['id'] == $conf['mobile_theme'])
+    {
+      if (!$show_mobile)
+      {
+        continue;
+      }
+      $row['name'] .= ' ('.l10n('Mobile').')';
+    }
+    if (check_theme_installed($row['id']))
+    {
+      $themes[ $row['id'] ] = $row['name'];
+    }
+  }
+
+  // plugins want remove some themes based on user status maybe?
+  $themes = trigger_event('get_pwg_themes', $themes);
+
+  return $themes;
+}
+
+function check_theme_installed($theme_id)
+{
+  global $conf;
+
+  return file_exists($conf['themes_dir'].'/'.$theme_id.'/'.'themeconf.inc.php');
+}
+
+/** Transforms an original path to its pwg representative */
+function original_to_representative($path, $representative_ext)
+{
+  $pos = strrpos($path, '/');
+  $path = substr_replace($path, 'pwg_representative/', $pos+1, 0);
+  $pos = strrpos($path, '.');
+  return substr_replace($path, $representative_ext, $pos+1);
+}
+
+/**
+ * @param element_info array containing element information from db;
+ * at least 'id', 'path' should be present
+ */
+function get_element_path($element_info)
+{
+  $path = $element_info['path'];
+  if ( !url_is_remote($path) )
+  {
+    $path = PHPWG_ROOT_PATH.$path;
+  }
+  return $path;
+}
+
+
+/* Returns the URL of the thumbnail to be displayed. If the element does not
+ * have a thumbnail, the default mime image url is returned. The URL can be
+ * sent to the browser, but not used in the php script.
+ * @param array element_info assoc array containing element info from db
+ * at least 'path', 'tn_ext' and 'id' should be present
+ */
+function get_thumbnail_url($element_info)
+{
+  return DerivativeImage::thumb_url($element_info);
+}
+
+/**
+ * fill the current user caddie with given elements, if not already in
+ * caddie
+ *
+ * @param array elements_id
+ */
+function fill_caddie($elements_id)
+{
+  global $user;
+
+  $query = '
+SELECT element_id
+  FROM '.CADDIE_TABLE.'
+  WHERE user_id = '.$user['id'].'
+;';
+  $in_caddie = array_from_query($query, 'element_id');
+
+  $caddiables = array_diff($elements_id, $in_caddie);
+
+  $datas = array();
+
+  foreach ($caddiables as $caddiable)
+  {
+    array_push($datas, array('element_id' => $caddiable,
+                             'user_id' => $user['id']));
+  }
+
+  if (count($caddiables) > 0)
+  {
+    mass_inserts(CADDIE_TABLE, array('element_id','user_id'), $datas);
+  }
+}
+
+/**
+ * returns the element name from its filename
+ *
+ * @param string filename
+ * @return string name
+ */
+function get_name_from_file($filename)
+{
+  return str_replace('_',' ',get_filename_wo_extension($filename));
+}
+
+/**
+ * returns the corresponding value from $lang if existing. Else, the key is
+ * returned
+ *
+ * @param string key
+ * @return string
+ */
+function l10n($key)
+{
+  global $lang, $conf;
+
+  if ( ($val=@$lang[$key]) == null)
+  {
+    if ($conf['debug_l10n'] and !isset($lang[$key]) and !empty($key))
+    {
+      trigger_error('[l10n] language key "'.$key.'" is not defined', E_USER_WARNING);
+    }
+    $val = $key;
+  }
+  return $val;
+}
+
+/**
+ * returns the prinft value for strings including %d
+ * return is concorded with decimal value (singular, plural)
+ *
+ * @param singular string key
+ * @param plural string key
+ * @param decimal value
+ * @return string
+ */
+function l10n_dec($singular_fmt_key, $plural_fmt_key, $decimal)
+{
+  global $lang_info;
+
+  return
+    sprintf(
+      l10n((
+        (($decimal > 1) or ($decimal == 0 and $lang_info['zero_plural']))
+          ? $plural_fmt_key
+          : $singular_fmt_key
+        )), $decimal);
+}
+
+/*
+ * returns a single element to use with l10n_args
+ *
+ * @param string key: translation key
+ * @param array/string/../number args:
+ *   arguments to use on sprintf($key, args)
+ *   if args is a array, each values are used on sprintf
+ * @return string
+ */
+function get_l10n_args($key, $args)
+{
+  if (is_array($args))
+  {
+    $key_arg = array_merge(array($key), $args);
+  }
+  else
+  {
+    $key_arg = array($key,  $args);
+  }
+  return array('key_args' => $key_arg);
+}
+
+/*
+ * returns a string with formated with l10n_args elements
+ *
+ * @param element/array $key_args: element or array of l10n_args elements
+ * @param $sep: if $key_args is array,
+ *   separator is used when translated l10n_args elements are concated
+ * @return string
+ */
+function l10n_args($key_args, $sep = "\n")
+{
+  if (is_array($key_args))
+  {
+    foreach ($key_args as $key => $element)
+    {
+      if (isset($result))
+      {
+        $result .= $sep;
+      }
+      else
+      {
+        $result = '';
+      }
+
+      if ($key === 'key_args')
+      {
+        array_unshift($element, l10n(array_shift($element)));
+        $result .= call_user_func_array('sprintf', $element);
+      }
+      else
+      {
+        $result .= l10n_args($element, $sep);
+      }
+    }
+  }
+  else
+  {
+    fatal_error('l10n_args: Invalid arguments');
+  }
+
+  return $result;
+}
+
+/**
+ * returns the corresponding value from $themeconf if existing. Else, the
+ * key is returned
+ *
+ * @param string key
+ * @return string
+ */
+function get_themeconf($key)
+{
+  global $template;
+
+  return $template->get_themeconf($key);
+}
+
+/**
+ * Returns webmaster mail address depending on $conf['webmaster_id']
+ *
+ * @return string
+ */
+function get_webmaster_mail_address()
+{
+  global $conf;
+
+  $query = '
+SELECT '.$conf['user_fields']['email'].'
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['id'].' = '.$conf['webmaster_id'].'
+;';
+  list($email) = pwg_db_fetch_row(pwg_query($query));
+
+  return $email;
+}
+
+/**
+ * Add configuration parameters from database to global $conf array
+ *
+ * @return void
+ */
+function load_conf_from_db($condition = '')
+{
+  global $conf;
+
+  $query = '
+SELECT param, value
+ FROM '.CONFIG_TABLE.'
+ '.(!empty($condition) ? 'WHERE '.$condition : '').'
+;';
+  $result = pwg_query($query);
+
+  if ((pwg_db_num_rows($result) == 0) and !empty($condition))
+  {
+    fatal_error('No configuration data');
+  }
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $val = isset($row['value']) ? $row['value'] : '';
+    // If the field is true or false, the variable is transformed into a boolean value.
+    if ($val == 'true')
+    {
+      $val = true;
+    }
+    elseif ($val == 'false')
+    {
+      $val = false;
+    }
+    $conf[ $row['param'] ] = $val;
+  }
+}
+
+function conf_update_param($param, $value)
+{
+  $query = '
+SELECT
+    param,
+    value
+  FROM '.CONFIG_TABLE.'
+  WHERE param = \''.$param.'\'
+;';
+  $params = array_from_query($query, 'param');
+
+  if (count($params) == 0)
+  {
+    $query = '
+INSERT
+  INTO '.CONFIG_TABLE.'
+  (param, value)
+  VALUES(\''.$param.'\', \''.$value.'\')
+;';
+    pwg_query($query);
+  }
+  else
+  {
+    $query = '
+UPDATE '.CONFIG_TABLE.'
+  SET value = \''.$value.'\'
+  WHERE param = \''.$param.'\'
+;';
+    pwg_query($query);
+  }
+}
+
+/**
+ * Prepends and appends a string at each value of the given array.
+ *
+ * @param array
+ * @param string prefix to each array values
+ * @param string suffix to each array values
+ */
+function prepend_append_array_items($array, $prepend_str, $append_str)
+{
+  array_walk(
+    $array,
+    create_function('&$s', '$s = "'.$prepend_str.'".$s."'.$append_str.'";')
+    );
+
+  return $array;
+}
+
+/**
+ * creates an hashed based on a query, this function is a very common
+ * pattern used here. Among the selected columns fetched, choose one to be
+ * the key, another one to be the value.
+ *
+ * @param string $query
+ * @param string $keyname
+ * @param string $valuename
+ * @return array
+ */
+function simple_hash_from_query($query, $keyname, $valuename)
+{
+  $array = array();
+
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $array[ $row[$keyname] ] = $row[$valuename];
+  }
+
+  return $array;
+}
+
+/**
+ * creates an hashed based on a query, this function is a very common
+ * pattern used here. The key is given as parameter, the value is an associative
+ * array.
+ *
+ * @param string $query
+ * @param string $keyname
+ * @return array
+ */
+function hash_from_query($query, $keyname)
+{
+  $array = array();
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $array[ $row[$keyname] ] = $row;
+  }
+  return $array;
+}
+
+/**
+ * Return basename of the current script
+ * Lower case convertion is applied on return value
+ * Return value is without file extention ".php"
+ *
+ * @param void
+ *
+ * @return script basename
+ */
+function script_basename()
+{
+  global $conf;
+
+  foreach (array('SCRIPT_NAME', 'SCRIPT_FILENAME', 'PHP_SELF') as $value)
+  {
+    if (!empty($_SERVER[$value]))
+    {
+      $filename = strtolower($_SERVER[$value]);
+      if ($conf['php_extension_in_urls'] and get_extension($filename)!=='php')
+        continue;
+      $basename = basename($filename, '.php');
+      if (!empty($basename))
+      {
+        return $basename;
+      }
+    }
+  }
+  return '';
+}
+
+/**
+ * Return value for the current page define on $conf['filter_pages']
+ * Îf value is not defined, default value are returned
+ *
+ * @param value name
+ *
+ * @return filter page value
+ */
+function get_filter_page_value($value_name)
+{
+  global $conf;
+
+  $page_name = script_basename();
+
+  if (isset($conf['filter_pages'][$page_name][$value_name]))
+  {
+    return $conf['filter_pages'][$page_name][$value_name];
+  }
+  else if (isset($conf['filter_pages']['default'][$value_name]))
+  {
+    return $conf['filter_pages']['default'][$value_name];
+  }
+  else
+  {
+    return null;
+  }
+}
+
+/**
+ * returns the character set of data sent to browsers / received from forms
+ */
+function get_pwg_charset()
+{
+  $pwg_charset = 'utf-8';
+  if (defined('PWG_CHARSET'))
+  {
+    $pwg_charset = PWG_CHARSET;
+  }
+  return $pwg_charset;
+}
+
+/**
+ * includes a language file or returns the content of a language file
+ * availability of the file
+ *
+ * in descending order of preference:
+ *   param language, user language, default language
+ * Piwigo default language.
+ *
+ * @param string filename
+ * @param string dirname
+ * @param mixed options can contain
+ *     language - language to load (if empty uses user language)
+ *     return - if true the file content is returned otherwise the file is evaluated as php
+ *     target_charset -
+ *     no_fallback - the language must be respected
+ *     local - if true, get local language file
+ * @return boolean success status or a string if options['return'] is true
+ */
+function load_language($filename, $dirname = '',
+    $options = array() )
+{
+  global $user;
+
+  if (! @$options['return'] )
+  {
+    $filename .= '.php'; //MAYBE to do .. load .po and .mo localization files
+  }
+  if (empty($dirname))
+  {
+    $dirname = PHPWG_ROOT_PATH;
+  }
+  $dirname .= 'language/';
+
+  $languages = array();
+  if ( !empty($options['language']) )
+  {
+    $languages[] = $options['language'];
+  }
+  if ( !empty($user['language']) )
+  {
+    $languages[] = $user['language'];
+  }
+  if ( ! @$options['no_fallback'] )
+  {
+    if ( defined('PHPWG_INSTALLED') )
+    {
+      $languages[] = get_default_language();
+    }
+    $languages[] = PHPWG_DEFAULT_LANGUAGE;
+  }
+
+  $languages = array_unique($languages);
+
+  if ( empty($options['target_charset']) )
+  {
+    $target_charset = get_pwg_charset();
+  }
+  else
+  {
+    $target_charset = $options['target_charset'];
+  }
+  $target_charset = strtolower($target_charset);
+  $source_file    = '';
+  foreach ($languages as $language)
+  {
+    $f = @$options['local'] ?
+      $dirname.$language.'.'.$filename:
+      $dirname.$language.'/'.$filename;
+
+    if (file_exists($f))
+    {
+      $source_file = $f;
+      break;
+    }
+  }
+
+  if ( !empty($source_file) )
+  {
+    if (! @$options['return'] )
+    {
+      @include($source_file);
+      $load_lang = @$lang;
+      $load_lang_info = @$lang_info;
+
+      global $lang, $lang_info;
+      if ( !isset($lang) ) $lang=array();
+      if ( !isset($lang_info) ) $lang_info=array();
+
+      if ( 'utf-8'!=$target_charset)
+      {
+        if ( is_array($load_lang) )
+        {
+          foreach ($load_lang as $k => $v)
+          {
+            if ( is_array($v) )
+            {
+              $func = create_function('$v', 'return convert_charset($v, "utf-8", "'.$target_charset.'");' );
+              $lang[$k] = array_map($func, $v);
+            }
+            else
+              $lang[$k] = convert_charset($v, 'utf-8', $target_charset);
+          }
+        }
+        if ( is_array($load_lang_info) )
+        {
+          foreach ($load_lang_info as $k => $v)
+          {
+            $lang_info[$k] = convert_charset($v, 'utf-8', $target_charset);
+          }
+        }
+      }
+      else
+      {
+        $lang = array_merge( $lang, (array)$load_lang );
+        $lang_info = array_merge( $lang_info, (array)$load_lang_info );
+      }
+      return true;
+    }
+    else
+    {
+      $content = @file_get_contents($source_file);
+      $content = convert_charset($content, 'utf-8', $target_charset);
+      return $content;
+    }
+  }
+  return false;
+}
+
+/**
+ * converts a string from a character set to another character set
+ * @param string str the string to be converted
+ * @param string source_charset the character set in which the string is encoded
+ * @param string dest_charset the destination character set
+ */
+function convert_charset($str, $source_charset, $dest_charset)
+{
+  if ($source_charset==$dest_charset)
+    return $str;
+  if ($source_charset=='iso-8859-1' and $dest_charset=='utf-8')
+  {
+    return utf8_encode($str);
+  }
+  if ($source_charset=='utf-8' and $dest_charset=='iso-8859-1')
+  {
+    return utf8_decode($str);
+  }
+  if (function_exists('iconv'))
+  {
+    return iconv($source_charset, $dest_charset, $str);
+  }
+  if (function_exists('mb_convert_encoding'))
+  {
+    return mb_convert_encoding( $str, $dest_charset, $source_charset );
+  }
+  return $str; //???
+}
+
+/**
+ * makes sure a index.htm protects the directory from browser file listing
+ *
+ * @param string dir directory
+ */
+function secure_directory($dir)
+{
+  $file = $dir.'/index.htm';
+  if (!file_exists($file))
+  {
+    @file_put_contents($file, 'Not allowed!');
+  }
+}
+
+/**
+ * returns a "secret key" that is to be sent back when a user posts a form
+ *
+ * @param int valid_after_seconds - key validity start time from now
+ */
+function get_ephemeral_key($valid_after_seconds, $aditionnal_data_to_hash = '')
+{
+	global $conf;
+	$time = round(microtime(true), 1);
+	return $time.':'.$valid_after_seconds.':'
+		.hash_hmac(
+			'md5',
+			$time.substr($_SERVER['REMOTE_ADDR'],0,5).$valid_after_seconds.$aditionnal_data_to_hash,
+			$conf['secret_key']);
+}
+
+function verify_ephemeral_key($key, $aditionnal_data_to_hash = '')
+{
+	global $conf;
+	$time = microtime(true);
+	$key = explode( ':', @$key );
+	if ( count($key)!=3
+		or $key[0]>$time-(float)$key[1] // page must have been retrieved more than X sec ago
+		or $key[0]<$time-3600 // 60 minutes expiration
+		or hash_hmac(
+			  'md5', $key[0].substr($_SERVER['REMOTE_ADDR'],0,5).$key[1].$aditionnal_data_to_hash, $conf['secret_key']
+			) != $key[2]
+	  )
+	{
+		return false;
+	}
+	return true;
+}
+
+/**
+ * return an array which will be sent to template to display navigation bar
+ */
+function create_navigation_bar($url, $nb_element, $start, $nb_element_page, $clean_url = false)
+{
+  global $conf;
+
+  $navbar = array();
+  $pages_around = $conf['paginate_pages_around'];
+  $start_str = $clean_url ? '/start-' : (strpos($url, '?')===false ? '?':'&amp;').'start=';
+
+  if (!isset($start) or !is_numeric($start) or (is_numeric($start) and $start < 0))
+  {
+    $start = 0;
+  }
+
+  // navigation bar useful only if more than one page to display !
+  if ($nb_element > $nb_element_page)
+  {
+    $cur_page = ceil($start / $nb_element_page) + 1;
+    $maximum = ceil($nb_element / $nb_element_page);
+    $previous = $start - $nb_element_page;
+    $next = $start + $nb_element_page;
+    $last = ($maximum - 1) * $nb_element_page;
+
+    $navbar['CURRENT_PAGE'] = $cur_page;
+
+    // link to first page and previous page?
+    if ($cur_page != 1)
+    {
+      $navbar['URL_FIRST'] = $url;
+      $navbar['URL_PREV'] = $url.($previous > 0 ? $start_str.$previous : '');
+    }
+    // link on next page and last page?
+    if ($cur_page != $maximum)
+    {
+      $navbar['URL_NEXT'] = $url.$start_str.$next;
+      $navbar['URL_LAST'] = $url.$start_str.$last;
+    }
+
+    // pages to display
+    $navbar['pages'] = array();
+    $navbar['pages'][1] = $url;
+    $navbar['pages'][$maximum] = $url.$start_str.$last;
+
+    for ($i = max($cur_page - $pages_around , 2), $stop = min($cur_page + $pages_around + 1, $maximum);
+         $i < $stop; $i++)
+    {
+      $navbar['pages'][$i] = $url.$start_str.(($i - 1) * $nb_element_page);
+    }
+    ksort($navbar['pages']);
+  }
+  return $navbar;
+}
+
+/**
+ * return an array which will be sent to template to display recent icon
+ */
+function get_icon($date, $is_child_date = false)
+{
+  global $cache, $user;
+
+  if (empty($date))
+  {
+    return false;
+  }
+
+  if (!isset($cache['get_icon']['title']))
+  {
+    $cache['get_icon']['title'] = sprintf(
+      l10n('photos posted during the last %d days'),
+      $user['recent_period']
+      );
+  }
+
+  $icon = array(
+    'TITLE' => $cache['get_icon']['title'],
+    'IS_CHILD_DATE' => $is_child_date,
+    );
+
+  if (isset($cache['get_icon'][$date]))
+  {
+    return $cache['get_icon'][$date] ? $icon : array();
+  }
+
+  if (!isset($cache['get_icon']['sql_recent_date']))
+  {
+    // Use MySql date in order to standardize all recent "actions/queries"
+    $cache['get_icon']['sql_recent_date'] = pwg_db_get_recent_period($user['recent_period']);
+  }
+
+  $cache['get_icon'][$date] = $date > $cache['get_icon']['sql_recent_date'];
+
+  return $cache['get_icon'][$date] ? $icon : array();
+}
+
+/**
+ * check token comming from form posted or get params to prevent csrf attacks
+ * if pwg_token is empty action doesn't require token
+ * else pwg_token is compare to server token
+ *
+ * @return void access denied if token given is not equal to server token
+ */
+function check_pwg_token()
+{
+  if (!empty($_REQUEST['pwg_token']))
+  {
+    if (get_pwg_token() != $_REQUEST['pwg_token'])
+    {
+      access_denied();
+    }
+  }
+  else
+    bad_request('missing token');
+}
+
+function get_pwg_token()
+{
+  global $conf;
+
+  return hash_hmac('md5', session_id(), $conf['secret_key']);
+}
+
+/*
+ * breaks the script execution if the given value doesn't match the given
+ * pattern. This should happen only during hacking attempts.
+ *
+ * @param string param_name
+ * @param array param_array
+ * @param boolean is_array
+ * @param string pattern
+ *
+ * @return void
+ */
+function check_input_parameter($param_name, $param_array, $is_array, $pattern)
+{
+  $param_value = null;
+  if (isset($param_array[$param_name]))
+  {
+    $param_value = $param_array[$param_name];
+  }
+
+  // it's ok if the input parameter is null
+  if (empty($param_value))
+  {
+    return true;
+  }
+
+  if ($is_array)
+  {
+    if (!is_array($param_value))
+    {
+      fatal_error('[Hacking attempt] the input parameter "'.$param_name.'" should be an array');
+    }
+
+    foreach ($param_value as $item_to_check)
+    {
+      if (!preg_match($pattern, $item_to_check))
+      {
+        fatal_error('[Hacking attempt] an item is not valid in input parameter "'.$param_name.'"');
+      }
+    }
+  }
+  else
+  {
+    if (!preg_match($pattern, $param_value))
+    {
+      fatal_error('[Hacking attempt] the input parameter "'.$param_name.'" is not valid');
+    }
+  }
+}
+
+
+function get_privacy_level_options()
+{
+  global $conf;
+
+  $options = array();
+  foreach (array_reverse($conf['available_permission_levels']) as $level)
+  {
+    $label = null;
+
+    if (0 == $level)
+    {
+      $label = l10n('Everybody');
+    }
+    else
+    {
+      $labels = array();
+      $sub_levels = array_reverse($conf['available_permission_levels']);
+      foreach ($sub_levels as $sub_level)
+      {
+        if ($sub_level == 0 or $sub_level < $level)
+        {
+          break;
+        }
+        array_push(
+          $labels,
+          l10n(
+            sprintf(
+              'Level %d',
+              $sub_level
+              )
+            )
+          );
+      }
+
+      $label = implode(', ', $labels);
+    }
+    $options[$level] = $label;
+  }
+  return $options;
+}
+
+
+/**
+ * return the branch from the version. For example version 2.2.4 is for branch 2.2
+ */
+function get_branch_from_version($version)
+{
+  return implode('.', array_slice(explode('.', $version), 0, 2));
+}
+
+/**
+ * return the device type: mobile, tablet or desktop
+ */
+function get_device()
+{
+  $device = pwg_get_session_var('device');
+
+  if (is_null($device))
+  {
+    include_once(PHPWG_ROOT_PATH.'include/mdetect.php');
+    $uagent_obj = new uagent_info();
+    if ($uagent_obj->DetectTierIphone())
+    {
+      $device = 'mobile';
+    }
+    elseif ($uagent_obj->DetectTierTablet())
+    {
+      $device = 'tablet';
+    }
+    else
+    {
+      $device = 'desktop';
+    }
+    pwg_set_session_var('device', $device);
+  }
+
+  return $device;
+}
+
+/**
+ * return true if mobile theme should be loaded
+ */
+function mobile_theme()
+{
+  global $conf;
+
+  if (empty($conf['mobile_theme']))
+  {
+    return false;
+  }
+
+  if (isset($_GET['mobile']))
+  {
+    $is_mobile_theme = get_boolean($_GET['mobile']);
+    pwg_set_session_var('mobile_theme', $is_mobile_theme);
+    unset($_GET['mobile']);
+  }
+  else
+  {
+    $is_mobile_theme = pwg_get_session_var('mobile_theme');
+  }
+
+  if (is_null($is_mobile_theme))
+  {
+    $is_mobile_theme = (get_device() == 'mobile');
+    pwg_set_session_var('mobile_theme', $is_mobile_theme);
+  }
+
+  return $is_mobile_theme;
+}
+?>
Index: tags/2.4.0RC3/include/functions_calendar.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_calendar.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_calendar.inc.php	(revision 14585)
@@ -0,0 +1,292 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('CAL_VIEW_LIST',     'list');
+define('CAL_VIEW_CALENDAR', 'calendar');
+
+function initialize_calendar()
+{
+  global $page, $conf, $user, $template, $filter;
+
+//------------------ initialize the condition on items to take into account ---
+  $inner_sql = ' FROM ' . IMAGES_TABLE;
+
+  if ($page['section']=='categories')
+  { // we will regenerate the items by including subcats elements
+    $page['items'] = array();
+    $inner_sql .= '
+INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id = image_id';
+
+    if ( isset($page['category']) )
+    {
+      $sub_ids = array_diff(
+        get_subcat_ids(array($page['category']['id'])),
+        explode(',', $user['forbidden_categories'])
+        );
+
+      if (empty($sub_ids))
+      {
+        return; // nothing to do
+      }
+      $inner_sql .= '
+WHERE category_id IN ('.implode(',',$sub_ids).')';
+      $inner_sql .= '
+    '.get_sql_condition_FandF
+      (
+        array
+          (
+            'visible_images' => 'id'
+          ),
+        'AND', false
+      );
+    }
+    else
+    {
+      $inner_sql .= '
+    '.get_sql_condition_FandF
+      (
+        array
+          (
+            'forbidden_categories' => 'category_id',
+            'visible_categories' => 'category_id',
+            'visible_images' => 'id'
+          ),
+        'WHERE', true
+      );
+    }
+  }
+  else
+  {
+    if ( empty($page['items']) )
+    {
+      return; // nothing to do
+    }
+    $inner_sql .= '
+WHERE id IN (' . implode(',',$page['items']) .')';
+  }
+
+//-------------------------------------- initialize the calendar parameters ---
+  pwg_debug('start initialize_calendar');
+
+  $fields = array(
+    // Created
+    'created' => array(
+      'label'          => l10n('Creation date'),
+      ),
+    // Posted
+    'posted' => array(
+      'label'          => l10n('Post date'),
+      ),
+    );
+
+  $styles = array(
+    // Monthly style
+    'monthly' => array(
+      'include'        => 'calendar_monthly.class.php',
+      'view_calendar'  => true,
+      ),
+    // Weekly style
+    'weekly' => array(
+      'include'        => 'calendar_weekly.class.php',
+      'view_calendar'  => false,
+      ),
+    );
+
+  $views = array(CAL_VIEW_LIST,CAL_VIEW_CALENDAR);
+
+  // Retrieve calendar field
+  isset( $fields[ $page['chronology_field'] ] ) or fatal_error('bad chronology field');
+
+  // Retrieve style
+  if ( !isset( $styles[ $page['chronology_style'] ] ) )
+  {
+    $page['chronology_style'] = 'monthly';
+  }
+  $cal_style = $page['chronology_style'];
+  include(PHPWG_ROOT_PATH.'include/'. $styles[$cal_style]['include']);
+  $calendar = new Calendar();
+
+  // Retrieve view
+
+  if ( !isset($page['chronology_view']) or
+       !in_array( $page['chronology_view'], $views ) )
+  {
+    $page['chronology_view'] = CAL_VIEW_LIST;
+  }
+
+  if ( CAL_VIEW_CALENDAR==$page['chronology_view'] and
+        !$styles[$cal_style]['view_calendar'] )
+  {
+
+    $page['chronology_view'] = CAL_VIEW_LIST;
+  }
+
+  // perform a sanity check on $requested
+  if (!isset($page['chronology_date']))
+  {
+    $page['chronology_date'] = array();
+  }
+  while ( count($page['chronology_date']) > 3)
+  {
+    array_pop($page['chronology_date']);
+  }
+
+  $any_count = 0;
+  for ($i = 0; $i < count($page['chronology_date']); $i++)
+  {
+    if ($page['chronology_date'][$i] == 'any')
+    {
+      if ($page['chronology_view'] == CAL_VIEW_CALENDAR)
+      {// we dont allow any in calendar view
+        while ($i < count($page['chronology_date']))
+        {
+          array_pop($page['chronology_date']);
+        }
+        break;
+      }
+      $any_count++;
+    }
+    elseif ($page['chronology_date'][$i] == '')
+    {
+      while ($i < count($page['chronology_date']))
+      {
+        array_pop($page['chronology_date']);
+      }
+    }
+    else
+    {
+      $page['chronology_date'][$i] = (int)$page['chronology_date'][$i];
+    }
+  }
+  if ($any_count == 3)
+  {
+    array_pop($page['chronology_date']);
+  }
+
+  $calendar->initialize($inner_sql);
+
+  //echo ('<pre>'. var_export($calendar, true) . '</pre>');
+
+  $must_show_list = true; // true until calendar generates its own display
+  if (script_basename() != 'picture') // basename without file extention
+  {
+    if ($calendar->generate_category_content())
+    {
+      $page['items'] = array();
+      $must_show_list = false;
+    }
+
+    $page['comment'] = '';
+    $template->assign('FILE_CHRONOLOGY_VIEW', 'month_calendar.tpl');
+
+    foreach ($styles as $style => $style_data)
+    {
+      foreach ($views as $view)
+      {
+        if ( $style_data['view_calendar'] or $view != CAL_VIEW_CALENDAR)
+        {
+          $selected = false;
+
+          if ($style!=$cal_style)
+          {
+            $chronology_date = array();
+            if ( isset($page['chronology_date'][0]) )
+            {
+              array_push($chronology_date, $page['chronology_date'][0]);
+            }
+          }
+          else
+          {
+            $chronology_date = $page['chronology_date'];
+          }
+          $url = duplicate_index_url(
+              array(
+                'chronology_style' => $style,
+                'chronology_view' => $view,
+                'chronology_date' => $chronology_date,
+                )
+             );
+
+          if ($style==$cal_style and $view==$page['chronology_view'] )
+          {
+            $selected = true;
+          }
+
+          $template->append(
+            'chronology_views',
+            array(
+              'VALUE' => $url,
+              'CONTENT' => l10n('chronology_'.$style.'_'.$view),
+              'SELECTED' => $selected,
+              )
+            );
+        }
+      }
+    }
+    $url = duplicate_index_url(
+              array(), array('start', 'chronology_date')
+            );
+    $calendar_title = '<a href="'.$url.'">'
+        .$fields[$page['chronology_field']]['label'].'</a>';
+    $calendar_title.= $calendar->get_display_name();
+    $template->assign('chronology',
+        array(
+          'TITLE' => $calendar_title
+        )
+      );
+  } // end category calling
+
+  if ($must_show_list)
+  {
+    $query = 'SELECT DISTINCT id ';
+    $query .= ','.$calendar->date_field;
+    $query .= $calendar->inner_sql.'
+  '.$calendar->get_date_where();
+    if ( isset($page['super_order_by']) )
+    {
+      $query .= '
+  '.$conf['order_by'];
+    }
+    else
+    {
+      if ( count($page['chronology_date'])==0
+           or in_array('any', $page['chronology_date']) )
+      {// selected period is very big so we show newest first
+        $order = ' DESC, ';
+      }
+      else
+      {// selected period is small (month,week) so we show oldest first
+        $order = ' ASC, ';
+      }
+      $order_by = str_replace(
+        'ORDER BY ',
+        'ORDER BY '.$calendar->date_field.$order, $conf['order_by']
+        );
+      $query .= '
+  '.$order_by;
+    }
+    $page['items'] = array_from_query($query, 'id');
+  }
+  pwg_debug('end initialize_calendar');
+}
+?>
Index: tags/2.4.0RC3/include/functions_category.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_category.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_category.inc.php	(revision 14585)
@@ -0,0 +1,483 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Provides functions to handle categories.
+ *
+ *
+ */
+
+/**
+ * Is the category accessible to the connected user ?
+ *
+ * Note : if the user is not authorized to see this category, page creation
+ * ends (exit command in this function)
+ *
+ * @param int category id to verify
+ * @return void
+ */
+function check_restrictions($category_id)
+{
+  global $user;
+
+  // $filter['visible_categories'] and $filter['visible_images']
+  // are not used because it's not necessary (filter <> restriction)
+  if (in_array($category_id, explode(',', $user['forbidden_categories'])))
+  {
+    access_denied();
+  }
+}
+
+function get_categories_menu()
+{
+  global $page, $user, $filter, $conf;
+
+  $query = '
+SELECT ';
+  // From CATEGORIES_TABLE
+  $query.= '
+  id, name, permalink, nb_images, global_rank,';
+  // From USER_CACHE_CATEGORIES_TABLE
+  $query.= '
+  date_last, max_date_last, count_images, count_categories';
+
+  // $user['forbidden_categories'] including with USER_CACHE_CATEGORIES_TABLE
+  $query.= '
+FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
+  ON id = cat_id and user_id = '.$user['id'];
+
+  // Always expand when filter is activated
+  if (!$user['expand'] and !$filter['enabled'])
+  {
+    $where = '
+(id_uppercat is NULL';
+    if (isset($page['category']))
+    {
+      $where .= ' OR id_uppercat IN ('.$page['category']['uppercats'].')';
+    }
+    $where .= ')';
+  }
+  else
+  {
+    $where = '
+  '.get_sql_condition_FandF
+    (
+      array
+        (
+          'visible_categories' => 'id',
+        ),
+      null,
+      true
+    );
+  }
+
+  $where = trigger_event('get_categories_menu_sql_where',
+    $where, $user['expand'], $filter['enabled'] );
+
+  $query.= '
+WHERE '.$where.'
+;';
+
+  $result = pwg_query($query);
+  $cats = array();
+  $selected_category = isset($page['category']) ? $page['category'] : null;
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $child_date_last = @$row['max_date_last']> @$row['date_last'];
+    $row = array_merge($row,
+      array(
+        'NAME' => trigger_event(
+          'render_category_name',
+          $row['name'],
+          'get_categories_menu'
+          ),
+        'TITLE' => get_display_images_count(
+          $row['nb_images'],
+          $row['count_images'],
+          $row['count_categories'],
+          false,
+          ' / '
+          ),
+        'URL' => make_index_url(array('category' => $row)),
+        'LEVEL' => substr_count($row['global_rank'], '.') + 1,
+        'SELECTED' => $selected_category['id'] == $row['id'] ? true : false,
+        'IS_UPPERCAT' => $selected_category['id_uppercat'] == $row['id'] ? true : false,
+        )
+      );
+    if ($conf['index_new_icon'])
+    {
+      $row['icon_ts'] = get_icon($row['max_date_last'], $child_date_last);
+    }
+    array_push($cats, $row);
+    if ($row['id']==@$page['category']['id']) //save the number of subcats for later optim
+      $page['category']['count_categories'] = $row['count_categories'];
+  }
+  usort($cats, 'global_rank_compare');
+
+  // Update filtered data
+  if (function_exists('update_cats_with_filtered_data'))
+  {
+    update_cats_with_filtered_data($cats);
+  }
+
+  return $cats;
+}
+
+
+/**
+ * Retrieve informations about a category in the database
+ *
+ * Returns an array with following keys :
+ *
+ *  - comment
+ *  - dir : directory, might be empty for virtual categories
+ *  - name : an array with indexes from 0 (lowest cat name) to n (most
+ *           uppercat name findable)
+ *  - nb_images
+ *  - id_uppercat
+ *  - site_id
+ *  -
+ *
+ * @param int category id
+ * @return array
+ */
+function get_cat_info( $id )
+{
+  $query = '
+SELECT *
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$id.'
+;';
+  $cat = pwg_db_fetch_assoc(pwg_query($query));
+  if (empty($cat))
+    return null;
+
+  foreach ($cat as $k => $v)
+  {
+    // If the field is true or false, the variable is transformed into a
+    // boolean value.
+    if ($cat[$k] == 'true' or $cat[$k] == 'false')
+    {
+      $cat[$k] = get_boolean( $cat[$k] );
+    }
+  }
+
+  $upper_ids = explode(',', $cat['uppercats']);
+  if ( count($upper_ids)==1 )
+  {// no need to make a query for level 1
+    $cat['upper_names'] = array(
+        array(
+          'id' => $cat['id'],
+          'name' => $cat['name'],
+          'permalink' => $cat['permalink'],
+          )
+      );
+  }
+  else
+  {
+    $names = array();
+    $query = '
+  SELECT id, name, permalink
+    FROM '.CATEGORIES_TABLE.'
+    WHERE id IN ('.$cat['uppercats'].')
+  ;';
+    $names = hash_from_query($query, 'id');
+
+    // category names must be in the same order than uppercats list
+    $cat['upper_names'] = array();
+    foreach ($upper_ids as $cat_id)
+    {
+      array_push( $cat['upper_names'], $names[$cat_id]);
+    }
+  }
+  return $cat;
+}
+
+
+
+// returns an array of image orders available for users/visitors
+function get_category_preferred_image_orders()
+{
+  global $conf, $page;
+    
+  return trigger_event('get_category_preferred_image_orders', array(
+    array(l10n('Default'),                        '',                     true),
+    array(l10n('Photo title, A &rarr; Z'),        'name ASC',             true),
+    array(l10n('Photo title, Z &rarr; A'),        'name DESC',            true),
+    array(l10n('Date created, new &rarr; old'),   'date_creation DESC',   true),
+    array(l10n('Date created, old &rarr; new'),   'date_creation ASC',    true), 
+    array(l10n('Date posted, new &rarr; old'),    'date_available DESC',  true),
+    array(l10n('Date posted, old &rarr; new'),    'date_available ASC',   true),
+    array(l10n('Rating score, high &rarr; low'),  'rating_score DESC',    $conf['rate']),
+    array(l10n('Rating score, low &rarr; high'),  'rating_score ASC',     $conf['rate']),
+    array(l10n('Visits, high &rarr; low'),        'hit DESC',             true),
+    array(l10n('Visits, low &rarr; high'),        'hit ASC',              true),
+    array(l10n('Permissions'),                    'level DESC',           is_admin()),
+    ));
+}
+
+function display_select_categories($categories,
+                                   $selecteds,
+                                   $blockname,
+                                   $fullname = true)
+{
+  global $template;
+
+  $tpl_cats = array();
+  foreach ($categories as $category)
+  {
+    if (!empty($category['permalink']))
+    {
+      $category['name'] .= ' &radic;';
+    }
+    if ($fullname)
+    {
+      $option = strip_tags(
+        get_cat_display_name_cache(
+          $category['uppercats'],
+          null,
+          false
+          )
+        );
+    }
+    else
+    {
+      $option = str_repeat('&nbsp;',
+                           (3 * substr_count($category['global_rank'], '.')));
+      $option.= '- ';
+      $option.= strip_tags(
+        trigger_event(
+          'render_category_name',
+          $category['name'],
+          'display_select_categories'
+          )
+        );
+    }
+    $tpl_cats[ $category['id'] ] = $option;
+  }
+
+  $template->assign( $blockname, $tpl_cats);
+  $template->assign( $blockname.'_selected', $selecteds);
+}
+
+function display_select_cat_wrapper($query, $selecteds, $blockname,
+                                    $fullname = true)
+{
+  $result = pwg_query($query);
+  $categories = array();
+  if (!empty($result))
+  {
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      array_push($categories, $row);
+    }
+  }
+  usort($categories, 'global_rank_compare');
+  display_select_categories($categories, $selecteds, $blockname, $fullname);
+}
+
+/**
+ * returns all subcategory identifiers of given category ids
+ *
+ * @param array ids
+ * @return array
+ */
+function get_subcat_ids($ids)
+{
+  $query = '
+SELECT DISTINCT(id)
+  FROM '.CATEGORIES_TABLE.'
+  WHERE ';
+  foreach ($ids as $num => $category_id)
+  {
+    is_numeric($category_id)
+      or trigger_error(
+        'get_subcat_ids expecting numeric, not '.gettype($category_id),
+        E_USER_WARNING
+      );
+    if ($num > 0)
+    {
+      $query.= '
+    OR ';
+    }
+    $query.= 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$category_id.'(,|$)\'';
+  }
+  $query.= '
+;';
+  $result = pwg_query($query);
+
+  $subcats = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($subcats, $row['id']);
+  }
+  return $subcats;
+}
+
+/** finds a matching category id from a potential list of permalinks
+ * @param array permalinks example: holiday holiday/france holiday/france/paris
+ * @param int idx - output of the index in $permalinks that matches
+ * return category id or null if no match
+ */
+function get_cat_id_from_permalinks( $permalinks, &$idx )
+{
+  $in = '';
+  foreach($permalinks as $permalink)
+  {
+    if ( !empty($in) ) $in.=', ';
+    $in .= '\''.$permalink.'\'';
+  }
+  $query ='
+SELECT cat_id AS id, permalink, 1 AS is_old
+  FROM '.OLD_PERMALINKS_TABLE.'
+  WHERE permalink IN ('.$in.')
+UNION
+SELECT id, permalink, 0 AS is_old
+  FROM '.CATEGORIES_TABLE.'
+  WHERE permalink IN ('.$in.')
+;';
+  $perma_hash = hash_from_query($query, 'permalink');
+
+  if ( empty($perma_hash) )
+    return null;
+  for ($i=count($permalinks)-1; $i>=0; $i--)
+  {
+    if ( isset( $perma_hash[ $permalinks[$i] ] ) )
+    {
+      $idx = $i;
+      $cat_id = $perma_hash[ $permalinks[$i] ]['id'];
+      if ($perma_hash[ $permalinks[$i] ]['is_old'])
+      {
+        $query='
+UPDATE '.OLD_PERMALINKS_TABLE.' SET last_hit=NOW(), hit=hit+1
+  WHERE permalink=\''.$permalinks[$i].'\' AND cat_id='.$cat_id.'
+  LIMIT 1';
+        pwg_query($query);
+      }
+      return $cat_id;
+    }
+  }
+  return null;
+}
+
+function global_rank_compare($a, $b)
+{
+  return strnatcasecmp($a['global_rank'], $b['global_rank']);
+}
+
+function rank_compare($a, $b)
+{
+  return $a['rank'] - $b['rank'];
+}
+
+/**
+ * returns display text for information images of category
+ *
+ * @param array categories
+ * @return string
+ */
+function get_display_images_count($cat_nb_images, $cat_count_images, $cat_count_categories, $short_message = true, $Separator = '\n')
+{
+  $display_text = '';
+
+  if ($cat_count_images > 0)
+  {
+    if ($cat_nb_images > 0 and $cat_nb_images < $cat_count_images)
+    {
+      $display_text.= get_display_images_count($cat_nb_images, $cat_nb_images, 0, $short_message, $Separator).$Separator;
+      $cat_count_images-= $cat_nb_images;
+      $cat_nb_images = 0;
+    }
+
+    //at least one image direct or indirect
+    $display_text.= l10n_dec('%d photo', '%d photos', $cat_count_images);
+
+    if ($cat_count_categories == 0 or $cat_nb_images == $cat_count_images)
+    {
+      //no descendant categories or descendants do not contain images
+      if (! $short_message)
+      {
+        $display_text.= ' '.l10n('in this album');
+      }
+    }
+    else
+    {
+      $display_text.= ' '.l10n_dec('in %d sub-album', 'in %d sub-albums', $cat_count_categories);
+    }
+  }
+
+  return $display_text;
+}
+
+/**
+ * Find a random photo among all photos below a given album in the tree (not
+ * only photo directly associated to the album but also to sub-albums)
+ *
+ * we need $category['uppercats'], $category['id'], $category['count_images']
+ */
+function get_random_image_in_category($category, $recursive=true)
+{
+  $image_id = null;
+  if ($category['count_images']>0)
+  {
+    $query = '
+SELECT image_id
+  FROM '.CATEGORIES_TABLE.' AS c
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
+  WHERE ';
+    if ($recursive)
+    {
+      $query.= '
+    (c.id='.$category['id'].' OR uppercats LIKE \''.$category['uppercats'].',%\')';
+    }
+    else
+    {
+      $query.= '
+    c.id='.$category['id'];
+    }
+    $query.= '
+    '.get_sql_condition_FandF
+    (
+      array
+        (
+          'forbidden_categories' => 'c.id',
+          'visible_categories' => 'c.id',
+          'visible_images' => 'image_id',
+        ),
+      "\n  AND"
+    ).'
+  ORDER BY '.DB_RANDOM_FUNCTION.'()
+  LIMIT 1
+;';
+    $result = pwg_query($query);
+    if (pwg_db_num_rows($result) > 0)
+    {
+      list($image_id) = pwg_db_fetch_row($result);
+    }
+  }
+
+  return $image_id;
+}
+
+
+?>
Index: tags/2.4.0RC3/include/functions_comment.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_comment.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_comment.inc.php	(revision 14585)
@@ -0,0 +1,413 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//returns string action to perform on a new comment: validate, moderate, reject
+function user_comment_check($action, $comment)
+{
+  global $conf,$user;
+
+  if ($action=='reject')
+    return $action;
+
+  $my_action = $conf['comment_spam_reject'] ? 'reject':'moderate';
+
+  if ($action==$my_action)
+    return $action;
+
+  // we do here only BASIC spam check (plugins can do more)
+  if ( !is_a_guest() )
+    return $action;
+
+  $link_count = preg_match_all( '/https?:\/\//',
+    $comment['content'], $matches);
+
+  if ( strpos($comment['author'], 'http://')!==false )
+  {
+    $link_count++;
+  }
+
+  if ( $link_count>$conf['comment_spam_max_links'] )
+  {
+    $_POST['cr'][] = 'links';
+    return $my_action;
+  }
+  return $action;
+}
+
+
+add_event_handler('user_comment_check', 'user_comment_check',
+  EVENT_HANDLER_PRIORITY_NEUTRAL, 2);
+
+/**
+ * Tries to insert a user comment in the database and returns one of :
+ * validate, moderate, reject
+ * @param array comm contains author, content, image_id
+ * @param string key secret key sent back to the browser
+ * @param array infos out array of messages
+ */
+function insert_user_comment( &$comm, $key, &$infos )
+{
+  global $conf, $user;
+
+  $comm = array_merge( $comm,
+    array(
+      'ip' => $_SERVER['REMOTE_ADDR'],
+      'agent' => $_SERVER['HTTP_USER_AGENT']
+    )
+   );
+
+  $infos = array();
+  if (!$conf['comments_validation'] or is_admin())
+  {
+    $comment_action='validate'; //one of validate, moderate, reject
+  }
+  else
+  {
+    $comment_action='moderate'; //one of validate, moderate, reject
+  }
+
+  // display author field if the user status is guest or generic
+  if (!is_classic_user())
+  {
+    if ( empty($comm['author']) )
+    {
+      $comm['author'] = 'guest';
+    }
+    $comm['author_id'] = $conf['guest_id'];
+    // if a guest try to use the name of an already existing user, he must be
+    // rejected
+    if ( $comm['author'] != 'guest' )
+    {
+      $query = '
+SELECT COUNT(*) AS user_exists
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['username']." = '".addslashes($comm['author'])."'";
+      $row = pwg_db_fetch_assoc( pwg_query( $query ) );
+      if ( $row['user_exists'] == 1 )
+      {
+        array_push($infos, l10n('This login is already used by another user') );
+        $comment_action='reject';
+      }
+    }
+  }
+  else
+  {
+    $comm['author'] = addslashes($user['username']);
+    $comm['author_id'] = $user['id'];
+  }
+
+  if ( empty($comm['content']) )
+  { // empty comment content
+    $comment_action='reject';
+  }
+
+  if ( !verify_ephemeral_key(@$key, $comm['image_id']) )
+  {
+    $comment_action='reject';
+    $_POST['cr'][] = 'key'; // rvelices: I use this outside to see how spam robots work
+  }
+
+  if ($comment_action!='reject' and $conf['anti-flood_time']>0 and !is_admin())
+  { // anti-flood system
+    $reference_date = pwg_db_get_flood_period_expression($conf['anti-flood_time']);
+
+    $query = '
+SELECT count(1) FROM '.COMMENTS_TABLE.'
+  WHERE date > '.$reference_date.'
+    AND author_id = '.$comm['author_id'];
+    list($counter) = pwg_db_fetch_row(pwg_query($query));
+    if ( $counter > 0 )
+    {
+      array_push( $infos, l10n('Anti-flood system : please wait for a moment before trying to post another comment') );
+      $comment_action='reject';
+    }
+  }
+
+  // perform more spam check
+  $comment_action = trigger_event('user_comment_check',
+      $comment_action, $comm
+    );
+
+  if ( $comment_action!='reject' )
+  {
+    $query = '
+INSERT INTO '.COMMENTS_TABLE.'
+  (author, author_id, content, date, validated, validation_date, image_id)
+  VALUES (
+    \''.$comm['author'].'\',
+    '.$comm['author_id'].',
+    \''.$comm['content'].'\',
+    NOW(),
+    \''.($comment_action=='validate' ? 'true':'false').'\',
+    '.($comment_action=='validate' ? 'NOW()':'NULL').',
+    '.$comm['image_id'].'
+  )
+';
+
+    pwg_query($query);
+
+    $comm['id'] = pwg_db_insert_id(COMMENTS_TABLE);
+
+    if ( ($conf['email_admin_on_comment'] && 'validate' == $comment_action)
+        or ($conf['email_admin_on_comment_validation'] and 'moderate' == $comment_action))
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+      $comment_url = get_absolute_root_url().'comments.php?comment_id='.$comm['id'];
+
+      $keyargs_content = array
+      (
+        get_l10n_args('Author: %s', stripslashes($comm['author']) ),
+        get_l10n_args('Comment: %s', stripslashes($comm['content']) ),
+        get_l10n_args('', ''),
+        get_l10n_args('Manage this user comment: %s', $comment_url)
+      );
+
+      if ('moderate' == $comment_action)
+      {
+        $keyargs_content[] = get_l10n_args('', '');
+        $keyargs_content[] = get_l10n_args('(!) This comment requires validation', '');
+      }
+
+      pwg_mail_notification_admins
+      (
+        get_l10n_args('Comment by %s', stripslashes($comm['author']) ),
+        $keyargs_content
+      );
+    }
+  }
+  return $comment_action;
+}
+
+/**
+ * Tries to delete a user comment in the database
+ * only admin can delete all comments
+ * other users can delete their own comments
+ * so to avoid a new sql request we add author in where clause
+ *
+ * @param int or array of int comment_id
+ */
+function delete_user_comment($comment_id)
+{
+  $user_where_clause = '';
+  if (!is_admin())
+  {
+    $user_where_clause = '   AND author_id = \''.$GLOBALS['user']['id'].'\'';
+  }
+  
+  if (is_array($comment_id))
+    $where_clause = 'id IN('.implode(',', $comment_id).')';
+  else
+    $where_clause = 'id = '.$comment_id;
+    
+  $query = '
+DELETE FROM '.COMMENTS_TABLE.'
+  WHERE '.$where_clause.
+$user_where_clause.'
+;';
+  $result = pwg_query($query);
+  
+  if ($result) 
+  {
+    email_admin('delete', 
+                array('author' => $GLOBALS['user']['username'],
+                      'comment_id' => $comment_id
+                  ));
+  }
+  
+  trigger_action('user_comment_deletion', $comment_id);
+}
+
+/**
+ * Tries to update a user comment in the database
+ * only admin can update all comments
+ * users can edit their own comments if admin allow them
+ * so to avoid a new sql request we add author in where clause
+ *
+ * @param comment_id
+ * @param post_key
+ * @param content
+ */
+
+function update_user_comment($comment, $post_key)
+{
+  global $conf;
+
+  $comment_action = 'validate';
+
+  if ( !verify_ephemeral_key($post_key, $comment['image_id']) )
+  {
+    $comment_action='reject';
+  }
+  elseif (!$conf['comments_validation'] or is_admin()) // should the updated comment must be validated
+  {
+    $comment_action='validate'; //one of validate, moderate, reject
+  }
+  else
+  {
+    $comment_action='moderate'; //one of validate, moderate, reject
+  }
+
+  // perform more spam check
+  $comment_action =
+    trigger_event('user_comment_check',
+		  $comment_action,
+		  array_merge($comment,
+			      array('author' => $GLOBALS['user']['username'])
+			      )
+		  );
+
+  if ( $comment_action!='reject' )
+  {
+    $user_where_clause = '';
+    if (!is_admin())
+    {
+      $user_where_clause = '   AND author_id = \''.
+	$GLOBALS['user']['id'].'\'';
+    }
+
+    $query = '
+UPDATE '.COMMENTS_TABLE.'
+  SET content = \''.$comment['content'].'\',
+      validated = \''.($comment_action=='validate' ? 'true':'false').'\',
+      validation_date = '.($comment_action=='validate' ? 'NOW()':'NULL').'
+  WHERE id = '.$comment['comment_id'].
+$user_where_clause.'
+;';
+    $result = pwg_query($query);
+    
+    // mail admin and ask to validate the comment
+    if ($result and $conf['email_admin_on_comment_validation'] and 'moderate' == $comment_action) 
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+      $comment_url = get_absolute_root_url().'comments.php?comment_id='.$comment['comment_id'];
+
+      $keyargs_content = array
+      (
+        get_l10n_args('Author: %s', stripslashes($GLOBALS['user']['username']) ),
+        get_l10n_args('Comment: %s', stripslashes($comment['content']) ),
+        get_l10n_args('', ''),
+        get_l10n_args('Manage this user comment: %s', $comment_url),
+        get_l10n_args('', ''),
+        get_l10n_args('(!) This comment requires validation', ''),
+      );
+
+      pwg_mail_notification_admins
+      (
+        get_l10n_args('Comment by %s', stripslashes($GLOBALS['user']['username']) ),
+        $keyargs_content
+      );
+    }
+    // just mail admin
+    else if ($result)
+    {
+      email_admin('edit', array('author' => $GLOBALS['user']['username'],
+				'content' => stripslashes($comment['content'])) );
+    }
+  }
+  
+  return $comment_action;
+}
+
+function email_admin($action, $comment)
+{
+  global $conf;
+
+  if (!in_array($action, array('edit', 'delete'))
+      or (($action=='edit') and !$conf['email_admin_on_comment_edition'])
+      or (($action=='delete') and !$conf['email_admin_on_comment_deletion']))
+  {
+    return;
+  }
+
+  include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+  $keyargs_content = array();
+  $keyargs_content[] = get_l10n_args('Author: %s', $comment['author']);
+  if ($action=='delete')
+  {
+    $keyargs_content[] = get_l10n_args('This author removed the comment with id %d',
+				       $comment['comment_id']
+				       );
+  }
+  else
+  {
+    $keyargs_content[] = get_l10n_args('This author modified following comment:', '');
+    $keyargs_content[] = get_l10n_args('Comment: %s', $comment['content']);
+  }
+
+  pwg_mail_notification_admins(get_l10n_args('Comment by %s',
+					     $comment['author']),
+			       $keyargs_content
+			       );
+}
+
+function get_comment_author_id($comment_id, $die_on_error=true)
+{
+  $query = '
+SELECT
+    author_id
+  FROM '.COMMENTS_TABLE.'
+  WHERE id = '.$comment_id.'
+;';
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) == 0)
+  {
+    if ($die_on_error)
+    {
+      fatal_error('Unknown comment identifier');
+    }
+    else
+    {
+      return false;
+    }
+  }
+  
+  list($author_id) = pwg_db_fetch_row($result);
+
+  return $author_id;
+}
+
+/**
+ * Tries to validate a user comment in the database
+ * @param int or array of int comment_id
+ */
+function validate_user_comment($comment_id)
+{
+  if (is_array($comment_id))
+    $where_clause = 'id IN('.implode(',', $comment_id).')';
+  else
+    $where_clause = 'id = '.$comment_id;
+    
+  $query = '
+UPDATE '.COMMENTS_TABLE.'
+  SET validated = \'true\'
+    , validation_date = NOW()
+  WHERE '.$where_clause.'
+;';
+  pwg_query($query);
+  
+  trigger_action('user_comment_validation', $comment_id);
+}
+?>
Index: tags/2.4.0RC3/include/functions_cookie.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_cookie.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_cookie.inc.php	(revision 14585)
@@ -0,0 +1,123 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// cookie_path returns the path to use for the Piwigo cookie.
+// If Piwigo is installed on :
+// http://domain.org/meeting/gallery/category.php
+// cookie_path will return : "/meeting/gallery"
+function cookie_path()
+{
+  if ( isset($_SERVER['REDIRECT_SCRIPT_NAME']) and
+       !empty($_SERVER['REDIRECT_SCRIPT_NAME']) )
+  {
+    $scr = $_SERVER['REDIRECT_SCRIPT_NAME'];
+  }
+  else if ( isset($_SERVER['REDIRECT_URL']) )
+  {
+    // mod_rewrite is activated for upper level directories. we must set the
+    // cookie to the path shown in the browser otherwise it will be discarded.
+    if
+      (
+        isset($_SERVER['PATH_INFO']) and !empty($_SERVER['PATH_INFO']) and
+        ($_SERVER['REDIRECT_URL'] !== $_SERVER['PATH_INFO']) and
+        (substr($_SERVER['REDIRECT_URL'],-strlen($_SERVER['PATH_INFO']))
+            == $_SERVER['PATH_INFO'])
+      )
+    {
+      $scr = substr($_SERVER['REDIRECT_URL'], 0,
+        strlen($_SERVER['REDIRECT_URL'])-strlen($_SERVER['PATH_INFO']));
+    }
+    else
+    {
+      $scr = $_SERVER['REDIRECT_URL'];
+    }
+  }
+  else
+  {
+    $scr = $_SERVER['SCRIPT_NAME'];
+  }
+
+  $scr = substr($scr,0,strrpos( $scr,'/'));
+
+  // add a trailing '/' if needed
+  if ((strlen($scr) == 0) or ($scr{strlen($scr)-1} !== '/'))
+  {
+    $scr .= '/';
+  }
+
+  if ( substr(PHPWG_ROOT_PATH,0,3)=='../')
+  { // this is maybe a plugin inside pwg directory
+    // TODO - what if it is an external script outside PWG ?
+    $scr = $scr.PHPWG_ROOT_PATH;
+    while (1)
+    {
+      $new = preg_replace('#[^/]+/\.\.(/|$)#', '', $scr);
+      if ($new==$scr)
+      {
+        break;
+      }
+      $scr=$new;
+    }
+  }
+  return $scr;
+}
+
+/**
+ * persistently stores a variable in pwg cookie
+ * @return boolean true on success
+ * @see pwg_get_cookie_var
+ */
+function pwg_set_cookie_var($var, $value, $expire=null)
+{
+  if ($value==null or $expire===0)
+  {
+    unset($_COOKIE['pwg_'.$var]);
+    return setcookie('pwg_'.$var, false, 0, cookie_path());
+
+  }
+  else
+  {
+    $_COOKIE['pwg_'.$var] = $value;
+    $expire = is_numeric($expire) ? $expire : strtotime('+10 years');
+    return setcookie('pwg_'.$var, $value, $expire, cookie_path());
+  }
+}
+
+/**
+ * retrieves the value of a persistent variable in pwg cookie
+ * @return mixed
+ * @see pwg_set_cookie_var
+ */
+function pwg_get_cookie_var($var, $default = null)
+{
+  if (isset($_COOKIE['pwg_'.$var]))
+  {
+    return $_COOKIE['pwg_'.$var];
+  }
+  else
+  {
+    return $default;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_filter.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_filter.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_filter.inc.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+/**
+ * update data of categories with filtered values
+ *
+ * @param array list of categories
+ * @return null
+ */
+function update_cats_with_filtered_data(&$cats)
+{
+  global $filter;
+
+  if ($filter['enabled'])
+  {
+    $upd_fields = array('date_last', 'max_date_last', 'count_images', 'count_categories', 'nb_images');
+
+    foreach ($cats as $cat_id => $category)
+    {
+      foreach ($upd_fields as $upd_field)
+      {
+        $cats[$cat_id][$upd_field] = $filter['categories'][$category['id']][$upd_field];
+      }
+    }
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_html.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_html.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_html.inc.php	(revision 14585)
@@ -0,0 +1,600 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns the list of categories as a HTML string
+ *
+ * categories string returned contains categories as given in the input
+ * array $cat_informations. $cat_informations array must be an array
+ * of array( id=>?, name=>?, permalink=>?). If url input parameter is null,
+ * returns only the categories name without links.
+ *
+ * @param array cat_informations
+ * @param string url
+ * @param boolean replace_space
+ * @return string
+ */
+function get_cat_display_name($cat_informations,
+                              $url = '',
+                              $replace_space = true)
+{
+  global $conf;
+
+  //$output = '<a href="'.get_absolute_root_url().$conf['home_page'].'">'.l10n('Home').'</a>';
+  $output = '';
+  $is_first=true;
+
+  foreach ($cat_informations as $cat)
+  {
+    is_array($cat) or trigger_error(
+        'get_cat_display_name wrong type for category ', E_USER_WARNING
+      );
+
+    $cat['name'] = trigger_event(
+      'render_category_name',
+      $cat['name'],
+      'get_cat_display_name'
+      );
+
+    if ($is_first)
+    {
+      $is_first=false;
+    }
+    else
+    {
+      $output.= $conf['level_separator'];
+    }
+
+    if ( !isset($url) )
+    {
+      $output.= $cat['name'];
+    }
+    elseif ($url == '')
+    {
+      $output.= '<a href="'
+            .make_index_url(
+                array(
+                  'category' => $cat,
+                  )
+              )
+            .'">';
+      $output.= $cat['name'].'</a>';
+    }
+    else
+    {
+      $output.= '<a href="'.PHPWG_ROOT_PATH.$url.$cat['id'].'">';
+      $output.= $cat['name'].'</a>';
+    }
+  }
+  if ($replace_space)
+  {
+    return replace_space($output);
+  }
+  else
+  {
+    return $output;
+  }
+}
+
+/**
+ * returns the list of categories as a HTML string, with cache of names
+ *
+ * categories string returned contains categories as given in the input
+ * array $cat_informations. $uppercats is the list of category ids to
+ * display in the right order. If url input parameter is empty, returns only
+ * the categories name without links.
+ *
+ * @param string uppercats
+ * @param string url
+ * @param boolean replace_space
+ * @return string
+ */
+function get_cat_display_name_cache($uppercats,
+                                    $url = '',
+                                    $replace_space = true,
+                                    $single_link = false,
+                                    $link_class = null)
+{
+  global $cache, $conf;
+
+  if (!isset($cache['cat_names']))
+  {
+    $query = '
+SELECT id, name, permalink
+  FROM '.CATEGORIES_TABLE.'
+;';
+    $cache['cat_names'] = hash_from_query($query, 'id');
+  }
+
+  $output = '';
+  if ($single_link)
+  {
+    $single_url = get_root_url().$url.array_pop(explode(',', $uppercats));
+    $output.= '<a href="'.$single_url.'"';
+    if (isset($link_class))
+    {
+      $output.= ' class="'.$link_class.'"';
+    }
+    $output.= '>';
+  }
+  $is_first = true;
+  foreach (explode(',', $uppercats) as $category_id)
+  {
+    $cat = $cache['cat_names'][$category_id];
+
+    $cat['name'] = trigger_event(
+      'render_category_name',
+      $cat['name'],
+      'get_cat_display_name_cache'
+      );
+
+    if ($is_first)
+    {
+      $is_first = false;
+    }
+    else
+    {
+      $output.= $conf['level_separator'];
+    }
+
+    if ( !isset($url) or $single_link )
+    {
+      $output.= $cat['name'];
+    }
+    elseif ($url == '')
+    {
+      $output.= '
+<a href="'
+      .make_index_url(
+          array(
+            'category' => $cat,
+            )
+        )
+      .'">'.$cat['name'].'</a>';
+    }
+    else
+    {
+      $output.= '
+<a href="'.PHPWG_ROOT_PATH.$url.$category_id.'">'.$cat['name'].'</a>';
+    }
+  }
+
+  if ($single_link and isset($single_url))
+  {
+    $output.= '</a>';
+  }
+
+  if ($replace_space)
+  {
+    return replace_space($output);
+  }
+  else
+  {
+    return $output;
+  }
+}
+
+/**
+ * returns HTMLized comment contents retrieved from database
+ *
+ * newlines becomes br tags, _word_ becomes underline, /word/ becomes
+ * italic, *word* becomes bolded
+ *
+ * @param string content
+ * @return string
+ */
+function render_comment_content($content)
+{
+  $content = htmlspecialchars($content);
+  $pattern = '/(https?:\/\/\S*)/';
+  $replacement = '<a href="$1" rel="nofollow">$1</a>';
+  $content = preg_replace($pattern, $replacement, $content);
+
+  $content = nl2br($content);
+
+  // replace _word_ by an underlined word
+  $pattern = '/\b_(\S*)_\b/';
+  $replacement = '<span style="text-decoration:underline;">$1</span>';
+  $content = preg_replace($pattern, $replacement, $content);
+
+  // replace *word* by a bolded word
+  $pattern = '/\b\*(\S*)\*\b/';
+  $replacement = '<span style="font-weight:bold;">$1</span>';
+  $content = preg_replace($pattern, $replacement, $content);
+
+  // replace /word/ by an italic word
+  $pattern = "/\/(\S*)\/(\s)/";
+  $replacement = '<span style="font-style:italic;">$1$2</span>';
+  $content = preg_replace($pattern, $replacement, $content);
+
+  return $content;
+}
+
+function get_cat_display_name_from_id($cat_id,
+                                      $url = '',
+                                      $replace_space = true)
+{
+  $cat_info = get_cat_info($cat_id);
+  return get_cat_display_name($cat_info['upper_names'], $url, $replace_space);
+}
+
+/**
+ * Returns an HTML list of tags. It can be a multi select field or a list of
+ * checkboxes.
+ *
+ * @param string HTML field name
+ * @param array selected tag ids
+ * @return array
+ */
+function get_html_tag_selection(
+  $tags,
+  $fieldname,
+  $selecteds = array(),
+  $forbidden_categories = null
+  )
+{
+  global $conf;
+
+  if (count ($tags) == 0 )
+  {
+    return '';
+  }
+  $output = '<ul class="tagSelection">';
+  foreach ($tags as $tag)
+  {
+    $output.=
+      '<li>'
+      .'<label>'
+      .'<input type="checkbox" name="'.$fieldname.'[]"'
+      .' value="'.$tag['id'].'"'
+      ;
+
+    if (in_array($tag['id'], $selecteds))
+    {
+      $output.= ' checked="checked"';
+    }
+
+    $output.=
+      '> '
+      .$tag['name']
+      .'</label>'
+      .'</li>'
+      ."\n"
+      ;
+  }
+  $output.= '</ul>';
+
+  return $output;
+}
+
+function name_compare($a, $b)
+{
+  return strcmp(strtolower($a['name']), strtolower($b['name']));
+}
+
+function tag_alpha_compare($a, $b)
+{
+  global $cache;
+
+  foreach (array($a, $b) as $tag)
+  {
+    if (!isset($cache[__FUNCTION__][ $tag['name'] ]))
+    {
+      $cache[__FUNCTION__][ $tag['name'] ] = strtolower(str2url($tag['name']));
+    }
+  }
+
+  return strcmp($cache[__FUNCTION__][ $a['name'] ], $cache[__FUNCTION__][ $b['name'] ]);
+}
+
+/**
+ * exits the current script (either exit or redirect)
+ */
+function access_denied()
+{
+  global $user;
+
+  $login_url =
+      get_root_url().'identification.php?redirect='
+      .urlencode(urlencode($_SERVER['REQUEST_URI']));
+
+  set_status_header(401);
+  if ( isset($user) and !is_a_guest() )
+  {
+    echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
+    echo '<div style="text-align:center;">'.l10n('You are not authorized to access the requested page').'<br>';
+    echo '<a href="'.get_root_url().'identification.php">'.l10n('Identification').'</a>&nbsp;';
+    echo '<a href="'.make_index_url().'">'.l10n('Home').'</a></div>';
+    echo str_repeat( ' ', 512); //IE6 doesn't error output if below a size
+    exit();
+  }
+  else
+  {
+    redirect_html($login_url);
+  }
+}
+
+/**
+ * exits the current script with 403 code
+ * @param string msg a message to display
+ * @param string alternate_url redirect to this url
+ */
+function page_forbidden($msg, $alternate_url=null)
+{
+  set_status_header(403);
+  if ($alternate_url==null)
+    $alternate_url = make_index_url();
+  redirect_html( $alternate_url,
+    '<div style="text-align:left; margin-left:5em;margin-bottom:5em;">
+<h1 style="text-align:left; font-size:36px;">Forbidden</h1><br>'
+.$msg.'</div>',
+    5 );
+}
+
+/**
+ * exits the current script with 400 code
+ * @param string msg a message to display
+ * @param string alternate_url redirect to this url
+ */
+function bad_request($msg, $alternate_url=null)
+{
+  set_status_header(400);
+  if ($alternate_url==null)
+    $alternate_url = make_index_url();
+  redirect_html( $alternate_url,
+    '<div style="text-align:left; margin-left:5em;margin-bottom:5em;">
+<h1 style="text-align:left; font-size:36px;">Bad request</h1><br>'
+.$msg.'</div>',
+    5 );
+}
+
+/**
+ * exits the current script with 404 code when a page cannot be found
+ * @param string msg a message to display
+ * @param string alternate_url redirect to this url
+ */
+function page_not_found($msg, $alternate_url=null)
+{
+  set_status_header(404);
+  if ($alternate_url==null)
+    $alternate_url = make_index_url();
+  redirect_html( $alternate_url,
+    '<div style="text-align:left; margin-left:5em;margin-bottom:5em;">
+<h1 style="text-align:left; font-size:36px;">Page not found</h1><br>'
+.$msg.'</div>',
+    5 );
+}
+
+/**
+ * exits the current script with 500 http code
+ * this method can be called at any time (does not use template/language/user etc...)
+ * @param string msg a message to display
+ */
+function fatal_error($msg, $title=null, $show_trace=true)
+{
+  if (empty($title))
+  {
+    $title = 'Piwigo encountered a non recoverable error';
+  }
+
+  $btrace_msg = '';
+  if ($show_trace and function_exists('debug_backtrace'))
+  {
+    $bt = debug_backtrace();
+    for ($i=1; $i<count($bt); $i++)
+    {
+      $class = isset($bt[$i]['class']) ? (@$bt[$i]['class'].'::') : '';
+      $btrace_msg .= "#$i\t".$class.@$bt[$i]['function'].' '.@$bt[$i]['file']."(".@$bt[$i]['line'].")\n";
+    }
+    $btrace_msg = trim($btrace_msg);
+    $msg .= "\n";
+  }
+
+  $display = "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
+<h1>$title</h1>
+<pre style='font-size:larger;background:white;color:red;padding:1em;margin:0;clear:both;display:block;width:auto;height:auto;overflow:auto'>
+<b>$msg</b>
+$btrace_msg
+</pre>\n";
+
+  @set_status_header(500);
+  echo $display.str_repeat( ' ', 300); //IE6 doesn't error output if below a size
+
+  if ( function_exists('ini_set') )
+  {// if possible turn off error display (we display it)
+    ini_set('display_errors', false);
+  }
+  error_reporting( E_ALL );
+  trigger_error( strip_tags($msg).$btrace_msg, E_USER_ERROR );
+  die(0); // just in case
+}
+
+/* returns the title to be displayed above thumbnails on tag page
+ */
+function get_tags_content_title()
+{
+  global $page;
+  $title = count($page['tags']) > 1 ? l10n('Tag') : l10n('Tag');
+  $title.= ' ';
+
+  for ($i=0; $i<count($page['tags']); $i++)
+  {
+    $title.= $i>0 ? ' + ' : '';
+
+    $title.=
+      '<a href="'
+      .make_index_url(
+        array(
+          'tags' => array( $page['tags'][$i] )
+          )
+        )
+      .'" title="'
+      .l10n('display photos linked to this tag')
+      .'">'
+      .trigger_event('render_tag_name', $page['tags'][$i]['name'])
+      .'</a>';
+
+    $remove_url = null;
+    if (count($page['tags']) == 1)
+    {
+      $remove_url = get_root_url().'tags.php';
+    }
+    else
+    {
+      $other_tags = $page['tags'];
+      unset($other_tags[$i]);
+      $remove_url = make_index_url(
+        array(
+          'tags' => $other_tags
+          )
+        );
+    }
+
+    $title.=
+      '<a href="'.$remove_url.'" style="border:none;" title="'
+      .l10n('remove this tag from the list')
+      .'"><img src="'
+        .get_root_url().get_themeconf('icon_dir').'/remove_s.png'
+      .'" alt="x" style="vertical-align:bottom;">'
+      .'</a>';
+  }
+  return $title;
+}
+
+/**
+  Sets the http status header (200,401,...)
+ */
+function set_status_header($code, $text='')
+{
+  if (empty($text))
+  {
+    switch ($code)
+    {
+      case 200: $text='OK';break;
+      case 301: $text='Moved permanently';break;
+      case 302: $text='Moved temporarily';break;
+      case 304: $text='Not modified';break;
+      case 400: $text='Bad request';break;
+      case 401: $text='Authorization required';break;
+      case 403: $text='Forbidden';break;
+      case 404: $text='Not found';break;
+      case 500: $text='Server error';break;
+      case 501: $text='Not implemented';break;
+      case 503: $text='Service unavailable';break;
+    }
+  }
+  $protocol = $_SERVER["SERVER_PROTOCOL"];
+  if ( ('HTTP/1.1' != $protocol) && ('HTTP/1.0' != $protocol) )
+    $protocol = 'HTTP/1.0';
+
+  header( "$protocol $code $text", true, $code );
+  trigger_action('set_status_header', $code, $text);
+}
+
+/** returns the category comment for rendering in html textual mode (subcatify)
+ * this is an event handler. don't call directly
+ */
+function render_category_literal_description($desc)
+{
+  return strip_tags($desc, '<span><p><a><br><b><i><small><big><strong><em>');
+}
+
+/*event handler for menu*/
+function register_default_menubar_blocks( $menu_ref_arr )
+{
+  $menu = & $menu_ref_arr[0];
+  if ($menu->get_id() != 'menubar')
+    return;
+  $menu->register_block( new RegisteredBlock( 'mbLinks', 'Links', 'piwigo'));
+  $menu->register_block( new RegisteredBlock( 'mbCategories', 'Albums', 'piwigo'));
+  $menu->register_block( new RegisteredBlock( 'mbTags', 'Related tags', 'piwigo'));
+  $menu->register_block( new RegisteredBlock( 'mbSpecials', 'Specials', 'piwigo'));
+  $menu->register_block( new RegisteredBlock( 'mbMenu', 'Menu', 'piwigo'));
+  $menu->register_block( new RegisteredBlock( 'mbIdentification', 'Identification', 'piwigo') );
+}
+
+/**
+ */
+function render_element_name($info)
+{
+  $name = $info['name'];
+  if (!empty($name))
+  {
+    $name = trigger_event('render_element_description', $name);
+    return $name;
+  }
+
+  return get_name_from_file($info['file']);
+}
+
+function render_element_description($info)
+{
+  $comment = $info['comment'];
+  if (!empty($comment))
+  {
+    $comment = trigger_event('render_element_description', $comment);
+    return $comment;
+  }
+  return '';
+}
+
+/**
+ * returns the title of the thumbnail based on photo properties
+ */
+function get_thumbnail_title($info, $title, $comment)
+{
+  global $conf, $user;
+
+  $details = array();
+
+  if (!empty($info['hit']))
+  {
+    $details[] = $info['hit'].' '.strtolower(l10n('Visits'));
+  }
+
+  if ($conf['rate'] and !empty($info['rating_score']))
+  {
+    $details[] = strtolower(l10n('Rating score')).' '.$info['rating_score'];
+  }
+
+  if (isset($info['nb_comments']) and $info['nb_comments'] != 0)
+  {
+    $details[] = l10n_dec('%d comment', '%d comments', $info['nb_comments']);
+  }
+
+  if (count($details) > 0)
+  {
+    $title.= ' ('.implode(', ', $details).')';
+  }
+
+  if (!empty($comment))
+  {
+    $title.= ' '.substr($info['comment'], 0, 100).(strlen($info['comment']) > 100 ? '...' : '');
+  }
+
+  $title = htmlspecialchars(strip_tags($title));
+  $title = trigger_event('get_thumbnail_title', $title, $info);
+  return $title;
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_mail.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_mail.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_mail.inc.php	(revision 14585)
@@ -0,0 +1,823 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+
+/**
+ * Encodes a string using Q form if required (RFC2045)
+ * mail headers MUST contain only US-ASCII characters
+ */
+function encode_mime_header($str)
+{
+  $x = preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+  if ($x==0)
+  {
+    return $str;
+  }
+  // Replace every high ascii, control =, ? and _ characters
+  $str = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
+                  "'='.sprintf('%02X', ord('\\1'))", $str);
+
+  // Replace every spaces to _ (more readable than =20)
+  $str = str_replace(" ", "_", $str);
+
+  global $lang_info;
+  return '=?'.get_pwg_charset().'?Q?'.$str.'?=';
+}
+
+/*
+ * Returns the name of the mail sender :
+ *
+ * @return string
+ */
+function get_mail_sender_name()
+{
+  global $conf;
+
+  return (empty($conf['mail_sender_name']) ? $conf['gallery_title'] : $conf['mail_sender_name']);
+}
+
+/*
+ * Returns an array of mail configuration parameters :
+ *
+ * - mail_options: see $conf['mail_options']
+ * - send_bcc_mail_webmaster: see $conf['send_bcc_mail_webmaster']
+ * - email_webmaster: mail corresponding to $conf['webmaster_id']
+ * - formated_email_webmaster: the name of webmaster is $conf['gallery_title']
+ * - text_footer: Piwigo and version
+ *
+ * @return array
+ */
+function get_mail_configuration()
+{
+  global $conf;
+
+  $conf_mail = array(
+    'mail_options' => $conf['mail_options'],
+    'send_bcc_mail_webmaster' => $conf['send_bcc_mail_webmaster'],
+    'default_email_format' => $conf['default_email_format'],
+    'alternative_email_format' => $conf['alternative_email_format'],
+    'use_smtp' => !empty($conf['smtp_host']),
+    'smtp_host' => $conf['smtp_host'],
+    'smtp_user' => $conf['smtp_user'],
+    'smtp_password' => $conf['smtp_password']
+    );
+
+  // we have webmaster id among user list, what's his email address ?
+  $conf_mail['email_webmaster'] = get_webmaster_mail_address();
+
+  // name of the webmaster is the title of the gallery
+  $conf_mail['formated_email_webmaster'] =
+    format_email(get_mail_sender_name(), $conf_mail['email_webmaster']);
+
+  $conf_mail['boundary_key'] = generate_key(32);
+
+  return $conf_mail;
+}
+
+/**
+ * Returns an email address with an associated real name
+ *
+ * @param string name
+ * @param string email
+ */
+function format_email($name, $email)
+{
+  // Spring cleaning
+  $cvt_email = trim(preg_replace('#[\n\r]+#s', '', $email));
+  $cvt_name = trim(preg_replace('#[\n\r]+#s', '', $name));
+
+  if ($cvt_name!="")
+  {
+    $cvt_name = encode_mime_header(
+              '"'
+              .addcslashes($cvt_name,'"')
+              .'"');
+    $cvt_name .= ' ';
+  }
+
+  if (strpos($cvt_email, '<') === false)
+  {
+    return $cvt_name.'<'.$cvt_email.'>';
+  }
+  else
+  {
+    return $cvt_name.$cvt_email;
+  }
+}
+
+/**
+ * Returns an email address list with minimal email string
+ *
+ * @param string with email list (email separated by comma)
+ */
+function get_strict_email_list($email_list)
+{
+  $result = array();
+  $list = explode(',', $email_list);
+  foreach ($list as $email)
+  {
+    if (strpos($email, '<') !== false)
+    {
+       $email = preg_replace('/.*<(.*)>.*/i', '$1', $email);
+    }
+    $result[] = trim($email);
+  }
+
+  return implode(',', $result);
+}
+
+
+/**
+ * Return an new mail template
+ *
+ * @params:
+ *   - email_format: mail format
+ *   - args: function params of mail function:
+ *       o template: template to use [default get_default_theme()]
+ *       o theme: template to use [default get_default_theme()]
+ */
+function & get_mail_template($email_format, $theme='')
+{
+  if (empty($theme))
+  {
+    $theme = get_default_theme();
+  }
+
+  $mail_template = new Template(PHPWG_ROOT_PATH.'themes', $theme, 'template/mail/'.$email_format);
+
+  return $mail_template;
+}
+
+/**
+ * Return string email format (html or not)
+ *
+ * @param string format
+ */
+function get_str_email_format($is_html)
+{
+  return ($is_html ? 'text/html' : 'text/plain');
+}
+
+/*
+ * Switch language to param language
+ * All entries are push on language stack
+ *
+ * @param string language
+ */
+function switch_lang_to($language)
+{
+  global $switch_lang, $user, $lang, $lang_info;
+
+  // explanation of switch_lang
+  // $switch_lang['language'] contains data of language
+  // $switch_lang['stack'] contains stack LIFO
+  // $switch_lang['initialisation'] allow to know if it's first call
+
+  // Treatment with current user
+  // Language of current user is saved (it's considered OK on firt call)
+  if (!isset($switch_lang['initialisation']) and !isset($switch_lang['language'][$user['language']]))
+  {
+    $switch_lang['initialisation'] = true;
+    $switch_lang['language'][$user['language']]['lang_info'] = $lang_info;
+    $switch_lang['language'][$user['language']]['lang'] = $lang;
+  }
+
+  // Change current infos
+  $switch_lang['stack'][] = $user['language'];
+  $user['language'] = $language;
+
+  // Load new data if necessary
+  if (!isset($switch_lang['language'][$language]))
+  {
+    // Re-Init language arrays
+    $lang_info = array();
+    $lang  = array();
+
+    // language files
+    load_language('common.lang', '', array('language'=>$language) );
+    // No test admin because script is checked admin (user selected no)
+    // Translations are in admin file too
+    load_language('admin.lang', '', array('language'=>$language) );
+    trigger_action('loading_lang');
+    load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR,
+      array('language'=>$language, 'no_fallback'=>true, 'local'=>true)
+    );
+
+    $switch_lang['language'][$language]['lang_info'] = $lang_info;
+    $switch_lang['language'][$language]['lang'] = $lang;
+  }
+  else
+  {
+    $lang_info = $switch_lang['language'][$language]['lang_info'];
+    $lang = $switch_lang['language'][$language]['lang'];
+  }
+}
+
+/*
+ * Switch back language pushed with switch_lang_to function
+ *
+ * @param: none
+ */
+function switch_lang_back()
+{
+  global $switch_lang, $user, $lang, $lang_info;
+
+  if (count($switch_lang['stack']) > 0)
+  {
+    // Get last value
+    $language = array_pop($switch_lang['stack']);
+
+    // Change current infos
+    if (isset($switch_lang['language'][$language]))
+    {
+      $lang_info = $switch_lang['language'][$language]['lang_info'];
+      $lang = $switch_lang['language'][$language]['lang'];
+    }
+    $user['language'] = $language;
+  }
+}
+
+/**
+ * Returns email of all administrator
+ *
+ * @return string
+ */
+/*
+ * send en notification email to all administrators
+ * if a administrator is doing action,
+ * he's be removed to email list
+ *
+ * @param:
+ *   - keyargs_subject: mail subject on l10n_args format
+ *   - keyargs_content: mail content on l10n_args format
+ *
+ * @return boolean (Ok or not)
+ */
+function pwg_mail_notification_admins($keyargs_subject, $keyargs_content, $send_technical_details=true)
+{
+  global $conf, $user;
+  
+  // Check arguments
+  if (empty($keyargs_subject) or empty($keyargs_content))
+  {
+    return false;
+  }
+
+  $return = true;
+
+  $admins = array();
+
+  $query = '
+SELECT
+    u.'.$conf['user_fields']['username'].' AS username,
+    u.'.$conf['user_fields']['email'].' AS mail_address
+  FROM '.USERS_TABLE.' AS u
+    JOIN '.USER_INFOS_TABLE.' AS i ON i.user_id =  u.'.$conf['user_fields']['id'].'
+  WHERE i.status in (\'webmaster\',  \'admin\')
+    AND '.$conf['user_fields']['email'].' IS NOT NULL
+    AND i.user_id <> '.$user['id'].'
+  ORDER BY username
+;';
+
+  $datas = pwg_query($query);
+  if (!empty($datas))
+  {
+    while ($admin = pwg_db_fetch_assoc($datas))
+    {
+      if (!empty($admin['mail_address']))
+      {
+        array_push($admins, format_email($admin['username'], $admin['mail_address']));
+      }
+    }
+  }
+
+  if (count($admins) > 0)
+  {
+    $keyargs_content_admin_info = array(
+      get_l10n_args('Connected user: %s', stripslashes($user['username'])),
+      get_l10n_args('IP: %s', $_SERVER['REMOTE_ADDR']),
+      get_l10n_args('Browser: %s', $_SERVER['HTTP_USER_AGENT'])
+      );
+
+    switch_lang_to(get_default_language());
+
+    $content = l10n_args($keyargs_content)."\n";
+    if ($send_technical_details)
+    {
+      $content.= "\n".l10n_args($keyargs_content_admin_info)."\n";
+    }
+
+    $return = pwg_mail(
+      implode(', ', $admins),
+      array(
+        'subject' => '['.$conf['gallery_title'].'] '.l10n_args($keyargs_subject),
+        'content' => $content,
+        'content_format' => 'text/plain',
+        'email_format' => 'text/plain',
+        )
+      );
+    
+    switch_lang_back();
+  }
+
+  return $return;
+}
+
+/*
+ * send en email to user's group
+ *
+ * @param:
+ *   - group_id: mail are sent to group with this Id
+ *   - email_format: mail format
+ *   - keyargs_subject: mail subject on l10n_args format
+ *   - dirname: short name of directory including template
+ *   - tpl_shortname: short template name without extension
+ *   - assign_vars: array used to assign_vars to mail template
+ *   - language_selected: send mail only to user with this selected language
+ *
+ * @return boolean (Ok or not)
+ */
+function pwg_mail_group(
+  $group_id, $email_format, $keyargs_subject,
+  $tpl_shortname,
+  $assign_vars = array(), $language_selected = '')
+{
+  // Check arguments
+  if
+    (
+      empty($group_id) or
+      empty($email_format) or
+      empty($keyargs_subject) or
+      empty($tpl_shortname)
+    )
+  {
+    return false;
+  }
+
+  global $conf;
+  $return = true;
+
+  $query = '
+SELECT
+  distinct language, theme
+FROM
+  '.USER_GROUP_TABLE.' as ug
+  INNER JOIN '.USERS_TABLE.' as u  ON '.$conf['user_fields']['id'].' = ug.user_id
+  INNER JOIN '.USER_INFOS_TABLE.' as ui  ON ui.user_id = ug.user_id
+WHERE
+        '.$conf['user_fields']['email'].' IS NOT NULL
+    AND group_id = '.$group_id;
+
+  if (!empty($language_selected))
+  {
+    $query .= '
+    AND language = \''.$language_selected.'\'';
+  }
+
+    $query .= '
+;';
+
+  $result = pwg_query($query);
+
+  if (pwg_db_num_rows($result) > 0)
+  {
+    $list = array();
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $list[] = $row;
+    }
+
+    foreach ($list as $elem)
+    {
+      $query = '
+SELECT
+  u.'.$conf['user_fields']['username'].' as username,
+  u.'.$conf['user_fields']['email'].' as mail_address
+FROM
+  '.USER_GROUP_TABLE.' as ug
+  INNER JOIN '.USERS_TABLE.' as u  ON '.$conf['user_fields']['id'].' = ug.user_id
+  INNER JOIN '.USER_INFOS_TABLE.' as ui  ON ui.user_id = ug.user_id
+WHERE
+        '.$conf['user_fields']['email'].' IS NOT NULL
+    AND group_id = '.$group_id.'
+    AND language = \''.$elem['language'].'\'
+    AND theme = \''.$elem['theme'].'\'
+;';
+
+      $result = pwg_query($query);
+
+      if (pwg_db_num_rows($result) > 0)
+      {
+        $Bcc = array();
+        while ($row = pwg_db_fetch_assoc($result))
+        {
+          if (!empty($row['mail_address']))
+          {
+            array_push($Bcc, format_email(stripslashes($row['username']), $row['mail_address']));
+          }
+        }
+
+        if (count($Bcc) > 0)
+        {
+          switch_lang_to($elem['language']);
+
+          $mail_template = get_mail_template($email_format, $elem['theme']);
+          $mail_template->set_filename($tpl_shortname, $tpl_shortname.'.tpl');
+
+          $mail_template->assign(
+            trigger_event('mail_group_assign_vars', $assign_vars));
+
+          $return = pwg_mail
+          (
+            '',
+            array
+            (
+              'Bcc' => $Bcc,
+              'subject' => l10n_args($keyargs_subject),
+              'email_format' => $email_format,
+              'content' => $mail_template->parse($tpl_shortname, true),
+              'content_format' => $email_format,
+              'theme' => $elem['theme']
+            )
+          ) and $return;
+
+          switch_lang_back();
+        }
+      }
+    }
+  }
+
+  return $return;
+}
+
+/*
+ * sends an email, using Piwigo specific informations
+ *
+ * @param:
+ *   - to: receiver(s) of the mail (list separated by comma).
+ *   - args: function params of mail function:
+ *       o from: sender [default value webmaster email]
+ *       o Cc: array of carbon copy receivers of the mail. [default value empty]
+ *       o Bcc: array of blind carbon copy receivers of the mail. [default value empty]
+ *       o subject  [default value 'Piwigo']
+ *       o content: content of mail    [default value '']
+ *       o content_format: format of mail content  [default value 'text/plain']
+ *       o email_format: global mail format  [default value $conf_mail['default_email_format']]
+ *       o theme: template to use [default get_default_theme()]
+ *
+ * @return boolean (Ok or not)
+ */
+function pwg_mail($to, $args = array())
+{
+  global $conf, $conf_mail, $lang_info, $page;
+
+  if (empty($to) and empty($args['Cc']) and empty($args['Bcc']))
+  {
+    return true;
+  }
+
+  if (!isset($conf_mail))
+  {
+    $conf_mail = get_mail_configuration();
+  }
+
+  if (empty($args['email_format']))
+  {
+    $args['email_format'] = $conf_mail['default_email_format'];
+  }
+
+  // Compute root_path in order have complete path
+  set_make_full_url();
+
+  if (empty($args['from']))
+  {
+    $args['from'] = $conf_mail['formated_email_webmaster'];
+  }
+  else
+  {
+    $args['from'] = format_email('', $args['from']);
+  }
+
+  if (empty($args['subject']))
+  {
+    $args['subject'] = 'Piwigo';
+  }
+  // Spring cleaning
+  $cvt_subject = trim(preg_replace('#[\n\r]+#s', '', $args['subject']));
+  // Ascii convertion
+  $cvt_subject = encode_mime_header($cvt_subject);
+
+  if (!isset($args['content']))
+  {
+    $args['content'] = '';
+  }
+
+  if (empty($args['content_format']))
+  {
+    $args['content_format'] = 'text/plain';
+  }
+
+  if ($conf_mail['send_bcc_mail_webmaster'])
+  {
+    $args['Bcc'][] = $conf_mail['formated_email_webmaster'];
+  }
+
+  if (empty($args['theme']))
+  {
+    $args['theme'] = get_default_theme();
+  }
+
+  $headers = 'From: '.$args['from']."\n";
+  $headers.= 'Reply-To: '.$args['from']."\n";
+
+  if (!empty($args['Cc']))
+  {
+    $headers.= 'Cc: '.implode(',', $args['Cc'])."\n";
+  }
+
+  if (!empty($args['Bcc']))
+  {
+    $headers.= 'Bcc: '.implode(',', $args['Bcc'])."\n";
+  }
+
+  $headers.= 'Content-Type: multipart/alternative;'."\n";
+  $headers.= '  boundary="---='.$conf_mail['boundary_key'].'";'."\n";
+  $headers.= '  reply-type=original'."\n";
+  $headers.= 'MIME-Version: 1.0'."\n";
+  $headers.= 'X-Mailer: Piwigo Mailer'."\n";
+
+  // List on content-type
+  $content_type_list[] = $args['email_format'];
+  if (!empty($conf_mail['alternative_email_format']))
+  {
+    $content_type_list[] = $conf_mail['alternative_email_format'];
+  }
+
+  $content = '';
+
+  foreach (array_unique($content_type_list) as $content_type)
+  {
+    // key compose of indexes witch allow ti cache mail data
+    $cache_key = $content_type.'-'.$lang_info['code'].'-'.$args['theme'];
+
+    if (!isset($conf_mail[$cache_key]))
+    {
+      if (!isset($conf_mail[$cache_key]['theme']))
+      {
+        $conf_mail[$cache_key]['theme'] = get_mail_template($content_type, $args['theme']);
+      }
+
+      $conf_mail[$cache_key]['theme']->set_filename('mail_header', 'header.tpl');
+      $conf_mail[$cache_key]['theme']->set_filename('mail_footer', 'footer.tpl');
+
+      $conf_mail[$cache_key]['theme']->assign(
+        array(
+          //Header
+          'BOUNDARY_KEY' => $conf_mail['boundary_key'],
+          'CONTENT_TYPE' => $content_type,
+          'CONTENT_ENCODING' => get_pwg_charset(),
+
+          // Footer
+          'GALLERY_URL' => get_gallery_home_url(),
+          'GALLERY_TITLE' =>
+            isset($page['gallery_title']) ?
+                  $page['gallery_title'] : $conf['gallery_title'],
+          'VERSION' => $conf['show_version'] ? PHPWG_VERSION : '',
+          'PHPWG_URL' => PHPWG_URL,
+
+          'TITLE_MAIL' => urlencode(l10n('A comment on your site')),
+          'MAIL' => get_webmaster_mail_address()
+          ));
+
+      if ($content_type == 'text/html')
+      {
+        if ($conf_mail[$cache_key]['theme']->smarty->template_exists('global-mail-css.tpl'))
+        {
+          $conf_mail[$cache_key]['theme']->set_filename('css', 'global-mail-css.tpl');
+          $conf_mail[$cache_key]['theme']->assign_var_from_handle('GLOBAL_MAIL_CSS', 'css');
+        }
+
+        $file = PHPWG_ROOT_PATH.'themes/'.$args['theme'].'/mail-css.tpl';
+        if (is_file($file))
+        {
+          $conf_mail[$cache_key]['theme']->set_filename('css', realpath($file));
+          $conf_mail[$cache_key]['theme']->assign_var_from_handle('MAIL_CSS', 'css');
+        }
+      }
+
+      // what are displayed on the header of each mail ?
+      $conf_mail[$cache_key]['header'] =
+        $conf_mail[$cache_key]['theme']->parse('mail_header', true);
+
+      // what are displayed on the footer of each mail ?
+      $conf_mail[$cache_key]['footer'] =
+        $conf_mail[$cache_key]['theme']->parse('mail_footer', true);
+    }
+
+    // Header
+    $content.= $conf_mail[$cache_key]['header'];
+
+    // Content
+    if (($args['content_format'] == 'text/plain') and ($content_type == 'text/html'))
+    {
+      $content.= '<p>'.
+                  nl2br(
+                    preg_replace("/(http:\/\/)([^\s,]*)/i",
+                                 "<a href='$1$2' class='thumblnk'>$1$2</a>",
+                                 htmlspecialchars($args['content']))).
+                  '</p>';
+    }
+    else if (($args['content_format'] == 'text/html') and ($content_type == 'text/plain'))
+    {
+      // convert html text to plain text
+      $content.= strip_tags($args['content']);
+    }
+    else
+    {
+      $content.= $args['content'];
+    }
+
+    // Footer
+    $content.= $conf_mail[$cache_key]['footer'];
+
+  // Close boundary
+  $content.= "\n".'-----='.$conf_mail['boundary_key'].'--'."\n";
+  }
+
+  //~ // Close boundary
+  //~ $content.= "\n".'-----='.$conf_mail['boundary_key'].'--'."\n";
+
+   // Undo Compute root_path in order have complete path
+  unset_make_full_url();
+
+  return
+    trigger_event('send_mail',
+      false, /* Result */
+      trigger_event('send_mail_to', get_strict_email_list($to)),
+      trigger_event('send_mail_subject', $cvt_subject),
+      trigger_event('send_mail_content', $content),
+      trigger_event('send_mail_headers', $headers),
+      $args
+    );
+}
+
+/*
+ * pwg sendmail
+ *
+ * @param:
+ *   - result of other sendmail
+ *   - to: Receiver or receiver(s) of the mail.
+ *   - subject  [default value 'Piwigo']
+ *   - content: content of mail
+ *   - headers: headers of mail
+ *
+ * @return boolean (Ok or not)
+ */
+function pwg_send_mail($result, $to, $subject, $content, $headers)
+{
+  if (!$result)
+  {
+    global $conf_mail;
+
+    if ($conf_mail['use_smtp'])
+    {
+      include_once( PHPWG_ROOT_PATH.'include/class_smtp_mail.inc.php' );
+      $smtp_mail = new smtp_mail(
+        $conf_mail['smtp_host'], $conf_mail['smtp_user'], $conf_mail['smtp_password'],
+        $conf_mail['email_webmaster']);
+      return $smtp_mail->mail($to, $subject, $content, $headers);
+    }
+    else
+    {
+      if ($conf_mail['mail_options'])
+      {
+        $options = '-f '.$conf_mail['email_webmaster'];
+        return mail($to, $subject, $content, $headers, $options);
+      }
+      else
+      {
+        return mail($to, $subject, $content, $headers);
+      }
+    }
+  }
+  else
+  {
+    return $result;
+  }
+}
+
+function move_ccs_rules_to_body($content)
+{
+  // We search all css rules in style tags
+  preg_match('#<style>(.*?)</style>#s', $content, $matches);
+
+  if (!empty($matches[1]))
+  {
+    preg_match_all('#([^\n]*?)\{(.*?)\}#s', $matches[1], $matches);
+
+    $selectors = array();
+    $unknow_selectors = '';
+
+    foreach ($matches[1] as $key => $value)
+    {
+      $selects = explode(',', $value);
+      $style = trim($matches[2][$key], ' ;');
+
+      foreach($selects as $select)
+      {
+        $select = trim($select);
+        $selectors[$select][] = $style;
+      }
+    }
+
+    foreach ($selectors as $selector => $style)
+    {
+      if (!preg_match('/^(#|\.|)([A-Za-z0-9_-]*)$/', $selector, $matches))
+      {
+        $unknow_selectors .= $selector.' {'.implode(";\n", $style).";}\n";
+      }
+      else switch ($matches[1])
+      {
+        case '#':
+          $content = preg_replace('|id="'.$matches[2].'"|', 'id="'.$matches[2].'" style="'.implode(";\n", $style).";\"\n", $content);
+          break;
+        case '.':
+          $content = preg_replace('|class="'.$matches[2].'"|', 'class="'.$matches[2].'" style="'.implode(";\n", $style).";\"\n", $content);
+          break;
+        default:
+          $content = preg_replace('#<'.$matches[2].'( |>)#', '<'.$matches[2].' style="'.implode(";\n", $style).";\"\n$1", $content);
+          break;
+      }
+    }
+
+    // Keep unknow tags in page head
+    if (!empty($unknow_selectors))
+    {
+      $content = preg_replace('#<style>.*?</style>#s', "<style type=\"text/css\">\n$unknow_selectors</style>", $content);
+    }
+    else
+    {
+      $content = preg_replace('#<style>.*?</style>#s', '', $content);
+    }
+  }
+  return $content;
+}
+
+/*Testing block*/
+function pwg_send_mail_test($result, $to, $subject, $content, $headers, $args)
+{
+    global $conf, $user, $lang_info;
+    $dir = PHPWG_ROOT_PATH.$conf['data_location'].'tmp';
+    if ( mkgetdir( $dir,  MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR) )
+    {
+      $filename = $dir.'/mail.'.stripslashes($user['username']).'.'.$lang_info['code'].'.'.$args['theme'].'-'.date('YmdHis');
+      if ($args['content_format'] == 'text/plain')
+      {
+        $filename .= '.txt';
+      }
+      else
+      {
+        $filename .= '.html';
+      }
+      $file = fopen($filename, 'w+');
+      fwrite($file, $to ."\n");
+      fwrite($file, $subject ."\n");
+      fwrite($file, $headers);
+      fwrite($file, $content);
+      fclose($file);
+    }
+    return $result;
+}
+if ($conf['debug_mail'])
+  add_event_handler('send_mail', 'pwg_send_mail_test', EVENT_HANDLER_PRIORITY_NEUTRAL+10, 6);
+
+
+add_event_handler('send_mail', 'pwg_send_mail', EVENT_HANDLER_PRIORITY_NEUTRAL, 5);
+add_event_handler('send_mail_content', 'move_ccs_rules_to_body');
+trigger_action('functions_mail_included');
+
+?>
Index: tags/2.4.0RC3/include/functions_metadata.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_metadata.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_metadata.inc.php	(revision 14585)
@@ -0,0 +1,143 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns informations from IPTC metadata, mapping is done at the beginning
+ * of the function
+ *
+ * @param string $filename
+ * @return array
+ */
+function get_iptc_data($filename, $map)
+{
+  $result = array();
+
+  $imginfo = array();
+  if (false == @getimagesize($filename, $imginfo) )
+  {
+    return $result;
+  }
+
+  if (isset($imginfo['APP13']))
+  {
+    $iptc = iptcparse($imginfo['APP13']);
+    if (is_array($iptc))
+    {
+      $rmap = array_flip($map);
+      foreach (array_keys($rmap) as $iptc_key)
+      {
+        if (isset($iptc[$iptc_key][0]))
+        {
+          if ($iptc_key == '2#025')
+          {
+            $value = implode(',',
+                             array_map('clean_iptc_value',$iptc[$iptc_key]));
+          }
+          else
+          {
+            $value = clean_iptc_value($iptc[$iptc_key][0]);
+          }
+
+          foreach (array_keys($map, $iptc_key) as $pwg_key)
+          {
+            $result[$pwg_key] = $value;
+          }
+        }
+      }
+    }
+  }
+  return $result;
+}
+
+/**
+ * return a cleaned IPTC value
+ *
+ * @param string value
+ * @return string
+ */
+function clean_iptc_value($value)
+{
+  // strip leading zeros (weird Kodak Scanner software)
+  while ( isset($value[0]) and $value[0] == chr(0))
+  {
+    $value = substr($value, 1);
+  }
+  // remove binary nulls
+  $value = str_replace(chr(0x00), ' ', $value);
+
+  if ( preg_match('/[\x80-\xff]/', $value) )
+  {
+    // apparently mac uses some MacRoman crap encoding. I don't know
+    // how to detect it so a plugin should do the trick.
+    $value = trigger_event('clean_iptc_value', $value);
+    $is_utf8 = seems_utf8($value);
+    $value = convert_charset( $value,
+      $is_utf8 ? 'utf-8' : 'iso-8859-1',
+      get_pwg_charset() );
+  }
+  return $value;
+}
+
+/**
+ * returns informations from EXIF metadata, mapping is done at the beginning
+ * of the function
+ *
+ * @param string $filename
+ * @return array
+ */
+function get_exif_data($filename, $map)
+{
+  $result = array();
+
+  if (!function_exists('read_exif_data'))
+  {
+    die('Exif extension not available, admin should disable exif use');
+  }
+
+  // Read EXIF data
+  if ($exif = @read_exif_data($filename))
+  {
+    $exif = trigger_event('format_exif_data', $exif, $filename, $map );
+    foreach ($map as $key => $field)
+    {
+      if (strpos($field, ';') === false)
+      {
+        if (isset($exif[$field]))
+        {
+          $result[$key] = $exif[$field];
+        }
+      }
+      else
+      {
+        $tokens = explode(';', $field);
+        if (isset($exif[$tokens[0]][$tokens[1]]))
+        {
+          $result[$key] = $exif[$tokens[0]][$tokens[1]];
+        }
+      }
+    }
+  }
+
+  return $result;
+}
+?>
Index: tags/2.4.0RC3/include/functions_notification.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_notification.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_notification.inc.php	(revision 14585)
@@ -0,0 +1,599 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                               functions                               |
+// +-----------------------------------------------------------------------+
+
+/*
+ * get standard sql where in order to
+ * restict an filter caregories and images
+ *
+ * IMAGE_CATEGORY_TABLE muste named ic in the query
+ *
+ * @param none
+ *
+ * @return string sql where
+ */
+function get_std_sql_where_restrict_filter($prefix_condition, $img_field='ic.image_id', $force_one_condition = false)
+{
+  return get_sql_condition_FandF
+          (
+            array
+              (
+                'forbidden_categories' => 'ic.category_id',
+                'visible_categories' => 'ic.category_id',
+                'visible_images' => $img_field
+              ),
+            $prefix_condition,
+            $force_one_condition
+          );
+}
+
+/*
+ * Execute custom notification query
+ *
+ * @param string action ('count' or 'info')
+ * @param string type of query ('new_comments', 'unvalidated_comments', 'new_elements', 'updated_categories', 'new_users')
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ *
+ * @return integer for action count
+ *         array for info
+ */
+function custom_notification_query($action, $type, $start, $end)
+{
+  global $user;
+
+  switch($type)
+  {
+    case 'new_comments':
+      $query = '
+  FROM '.COMMENTS_TABLE.' AS c
+     , '.IMAGE_CATEGORY_TABLE.' AS ic
+  WHERE c.image_id = ic.image_id';
+      if (!empty($start))
+      {
+	$query .= '
+    AND c.validation_date > \''.$start.'\'';
+      }
+      if (!empty($end))
+      {
+	$query .= '
+    AND c.validation_date <= \''.$end.'\'';
+      }
+      $query .= get_std_sql_where_restrict_filter('AND').'
+;';
+      break;
+    case 'unvalidated_comments':
+      $query = '
+  FROM '.COMMENTS_TABLE.'
+  WHERE 1=1';
+      if (!empty($start))
+      {
+	$query .= ' AND date> \''.$start.'\'';
+      }
+      if (!empty($end))
+      {
+	$query .= ' AND date <= \''.$end.'\'';
+      }
+      $query .= ' AND validated = \'false\'
+;';
+      break;
+    case 'new_elements':
+      $query = '
+  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
+  WHERE 1=1';
+      if (!empty($start))
+      {
+	$query .= ' AND date_available > \''.$start.'\'';
+      }
+      if (!empty($end))
+      {
+	$query .= ' AND date_available <= \''.$end.'\'';
+      }
+      $query .= get_std_sql_where_restrict_filter('AND', 'id').'
+;';
+      break;
+    case 'updated_categories':
+      $query = '
+  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON image_id = id
+  WHERE 1=1';
+      if (!empty($start))
+      {
+	$query .= ' AND date_available > \''.$start.'\'';
+      }
+      if (!empty($end))
+      {
+	$query .= ' AND date_available <= \''.$end.'\'';
+      }
+      $query .= get_std_sql_where_restrict_filter('AND', 'id').'
+;';
+      break;
+    case 'new_users':
+      $query = '
+  FROM '.USER_INFOS_TABLE.'
+  WHERE 1=1';
+      if (!empty($start))
+      {
+	$query .= ' AND registration_date > \''.$start.'\'';
+      }
+      if (!empty($end))
+      {
+	$query .= ' AND registration_date <= \''.$end.'\'';
+      }
+      $query .= '
+;';
+      break;
+    default:
+      // stop this function and return nothing
+      return;
+      break;
+  }
+
+  switch($action)
+  {
+    case 'count':
+      switch($type)
+      {
+        case 'new_comments':
+          $field_id = 'c.id';
+          break;
+        case 'unvalidated_comments':
+          $field_id = 'id';
+          break;
+        case 'new_elements':
+          $field_id = 'image_id';
+          break;
+        case 'updated_categories':
+          $field_id = 'category_id';
+          break;
+        case 'new_users':
+          $field_id = 'user_id';
+          break;
+    }
+    $query = 'SELECT count(distinct '.$field_id.') as CountId
+'.$query;
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    return $count;
+
+    break;
+    case 'info':
+      switch($type)
+      {
+        case 'new_comments':
+          $fields = array('c.id');
+          break;
+        case 'unvalidated_comments':
+          $fields = array('id');
+          break;
+        case 'new_elements':
+          $fields = array('image_id');
+          break;
+        case 'updated_categories':
+          $fields = array('category_id');
+          break;
+        case 'new_users':
+          $fields = array('user_id');
+          break;
+      }
+
+    $query = 'SELECT distinct '.implode(', ', $fields).'
+'.$query;
+    $result = pwg_query($query);
+
+    $infos = array();
+
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      array_push($infos, $row);
+    }
+
+    return $infos;
+
+    break;
+  }
+
+  //return is done on previous switch($action)
+}
+
+/**
+ * new comments between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return count comment ids
+ */
+function nb_new_comments($start, $end)
+{
+  return custom_notification_query('count', 'new_comments', $start, $end);
+}
+
+/**
+ * new comments between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return array comment ids
+ */
+function new_comments($start, $end)
+{
+  return custom_notification_query('info', 'new_comments', $start, $end);
+}
+
+/**
+ * unvalidated at a precise date
+ *
+ * Comments that are registered and not validated yet on a precise date
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @return count comment ids
+ */
+function nb_unvalidated_comments($start, $end)
+{
+  return custom_notification_query('count', 'unvalidated_comments', $start, $end);
+}
+
+
+/**
+ * new elements between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return count element ids
+ */
+function nb_new_elements($start, $end)
+{
+  return custom_notification_query('count', 'new_elements', $start, $end);
+}
+
+/**
+ * new elements between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return array element ids
+ */
+function new_elements($start, $end)
+{
+  return custom_notification_query('info', 'new_elements', $start, $end);
+}
+
+/**
+ * updated categories between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return count element ids
+ */
+function nb_updated_categories($start, $end)
+{
+  return custom_notification_query('count', 'updated_categories', $start, $end);
+}
+
+/**
+ * updated categories between two dates, according to authorized categories
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @param string forbidden categories (comma separated)
+ * @return array element ids
+ */
+function updated_categories($start, $end)
+{
+  return custom_notification_query('info', 'updated_categories', $start, $end);
+}
+
+/**
+ * new registered users between two dates
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @return count user ids
+ */
+function nb_new_users($start, $end)
+{
+  return custom_notification_query('count', 'new_users', $start, $end);
+}
+
+/**
+ * new registered users between two dates
+ *
+ * @param string start (mysql datetime format)
+ * @param string end (mysql datetime format)
+ * @return array user ids
+ */
+function new_users($start, $end)
+{
+  return custom_notification_query('info', 'new_users', $start, $end);
+}
+
+/**
+ * There are new between two dates ?
+ *
+ * Informations : number of new comments, number of new elements, number of
+ * updated categories. Administrators are also informed about : number of
+ * unvalidated comments, number of new users (TODO : number of unvalidated
+ * elements)
+ *
+ * @param string start date (mysql datetime format)
+ * @param string end date (mysql datetime format)
+ *
+ * @return boolean : true if exist news else false
+ */
+function news_exists($start, $end)
+{
+  return (
+          (nb_new_comments($start, $end) > 0) or
+          (nb_new_elements($start, $end) > 0) or
+          (nb_updated_categories($start, $end) > 0) or
+          ((is_admin()) and (nb_unvalidated_comments($start, $end) > 0)) or
+          ((is_admin()) and (nb_new_users($start, $end) > 0)));
+}
+
+/**
+ * Formats a news line and adds it to the array (e.g. '5 new elements')
+ */
+function add_news_line(&$news, $count, $singular_fmt_key, $plural_fmt_key, $url='', $add_url=false)
+{
+  if ($count > 0)
+  {
+    $line = l10n_dec($singular_fmt_key, $plural_fmt_key, $count);
+    if ($add_url and !empty($url) )
+    {
+      $line = '<a href="'.$url.'">'.$line.'</a>';
+    }
+    array_push($news, $line);
+  }
+}
+
+/**
+ * What's new between two dates ?
+ *
+ * Informations : number of new comments, number of new elements, number of
+ * updated categories. Administrators are also informed about : number of
+ * unvalidated comments, number of new users (TODO : number of unvalidated
+ * elements)
+ *
+ * @param string start date (mysql datetime format)
+ * @param string end date (mysql datetime format)
+ * @param bool exclude_img_cats if true, no info about new images/categories
+ * @param bool add_url add html A link around news
+ *
+ * @return array of news
+ */
+function news($start, $end, $exclude_img_cats=false, $add_url=false)
+{
+  $news = array();
+
+  if (!$exclude_img_cats)
+  {
+    add_news_line( $news,
+      nb_new_elements($start, $end), '%d new photo', '%d new photos',
+      make_index_url(array('section'=>'recent_pics')), $add_url );
+  }
+
+  if (!$exclude_img_cats)
+  {
+    add_news_line( $news,
+      nb_updated_categories($start, $end), '%d album updated', '%d albums updated',
+      make_index_url(array('section'=>'recent_cats')), $add_url );
+  }
+
+  add_news_line( $news,
+      nb_new_comments($start, $end), '%d new comment', '%d new comments',
+      get_root_url().'comments.php', $add_url );
+
+  if (is_admin())
+  {
+    add_news_line( $news,
+        nb_unvalidated_comments($start, $end), '%d comment to validate', '%d comments to validate',
+        get_root_url().'admin.php?page=comments', $add_url );
+
+    add_news_line( $news,
+        nb_new_users($start, $end), '%d new user', '%d new users',
+        get_root_url().'admin.php?page=user_list', $add_url );
+  }
+
+  return $news;
+}
+
+/**
+ * returns information about recently published elements grouped by post date
+ * @param int max_dates maximum returned number of recent dates
+ * @param int max_elements maximum returned number of elements per date
+ * @param int max_cats maximum returned number of categories per date
+ */
+function get_recent_post_dates($max_dates, $max_elements, $max_cats)
+{
+  global $conf, $user;
+
+  $where_sql = get_std_sql_where_restrict_filter('WHERE', 'i.id', true);
+
+  $query = '
+SELECT date_available,
+      COUNT(DISTINCT id) AS nb_elements,
+      COUNT(DISTINCT category_id) AS nb_cats
+  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
+  '.$where_sql.'
+  GROUP BY date_available
+  ORDER BY date_available DESC
+  LIMIT '.$max_dates.'
+;';
+  $result = pwg_query($query);
+  $dates = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($dates, $row);
+  }
+
+  for ($i=0; $i<count($dates); $i++)
+  {
+    if ($max_elements>0)
+    { // get some thumbnails ...
+      $query = '
+SELECT DISTINCT i.*
+  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id=image_id
+  '.$where_sql.'
+    AND date_available=\''.$dates[$i]['date_available'].'\'
+  ORDER BY '.DB_RANDOM_FUNCTION.'()
+  LIMIT '.$max_elements.'
+;';
+      $dates[$i]['elements'] = array();
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+        array_push($dates[$i]['elements'], $row);
+      }
+    }
+
+    if ($max_cats>0)
+    {// get some categories ...
+      $query = '
+SELECT DISTINCT c.uppercats, COUNT(DISTINCT i.id) AS img_count
+  FROM '.IMAGES_TABLE.' i INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON i.id=image_id
+    INNER JOIN '.CATEGORIES_TABLE.' c ON c.id=category_id
+  '.$where_sql.'
+    AND date_available=\''.$dates[$i]['date_available'].'\'
+  GROUP BY category_id, c.uppercats
+  ORDER BY img_count DESC
+  LIMIT '.$max_cats.'
+;';
+      $dates[$i]['categories'] = array();
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+        array_push($dates[$i]['categories'], $row);
+      }
+    }
+  }
+  return $dates;
+}
+
+/*
+  Call function get_recent_post_dates but
+  the parameters to be passed to the function, as an indexed array.
+
+*/
+function get_recent_post_dates_array($args)
+{
+  return
+    get_recent_post_dates
+    (
+      (empty($args['max_dates']) ? 3 : $args['max_dates']),
+      (empty($args['max_elements']) ? 3 : $args['max_elements']),
+      (empty($args['max_cats']) ? 3 : $args['max_cats'])
+    );
+}
+
+
+/**
+ * returns html description about recently published elements grouped by post date
+ * @param $date_detail: selected date computed by get_recent_post_dates function
+ */
+function get_html_description_recent_post_date($date_detail)
+{
+  global $conf;
+
+  $description = '<ul>';
+
+  $description .=
+        '<li>'
+        .l10n_dec('%d new photo', '%d new photos', $date_detail['nb_elements'])
+        .' ('
+        .'<a href="'.make_index_url(array('section'=>'recent_pics')).'">'
+          .l10n('Recent photos').'</a>'
+        .')'
+        .'</li><br>';
+
+  foreach($date_detail['elements'] as $element)
+  {
+    $tn_src = DerivativeImage::thumb_url($element);
+    $description .= '<a href="'.
+                    make_picture_url(array(
+                        'image_id' => $element['id'],
+                        'image_file' => $element['file'],
+                      ))
+                    .'"><img src="'.$tn_src.'"></a>';
+  }
+  $description .= '...<br>';
+
+  $description .=
+        '<li>'
+        .l10n_dec('%d album updated', '%d albums updated',
+                  $date_detail['nb_cats'])
+        .'</li>';
+
+  $description .= '<ul>';
+  foreach($date_detail['categories'] as $cat)
+  {
+    $description .=
+          '<li>'
+          .get_cat_display_name_cache($cat['uppercats'])
+          .' ('.
+          l10n_dec('%d new photo',
+                   '%d new photos', $cat['img_count']).')'
+          .'</li>';
+  }
+  $description .= '</ul>';
+
+  $description .= '</ul>';
+
+  return $description;
+}
+
+/**
+ * returns title about recently published elements grouped by post date
+ * @param $date_detail: selected date computed by get_recent_post_dates function
+ */
+function get_title_recent_post_date($date_detail)
+{
+  global $lang;
+
+  $date = $date_detail['date_available'];
+  $exploded_date = strptime($date, '%Y-%m-%d %H:%M:%S');
+
+  $title = l10n_dec('%d new photo', '%d new photos', $date_detail['nb_elements']);
+  $title .= ' ('.$lang['month'][1+$exploded_date['tm_mon']].' '.$exploded_date['tm_mday'].')';
+
+  return $title;
+}
+
+if(!function_exists("strptime"))
+{
+		function strptime($date, $fmt)
+		{
+			if ($fmt != '%Y-%m-%d %H:%M:%S')
+				die('Invalid strptime format '.$fmt);
+			list($y,$m,$d,$H,$M,$S) = preg_split('/[-: ]/', $date);
+			$res = localtime( mktime($H,$M,$S,$m,$d,$y), true );
+			return $res;
+		}
+ }
+?>
Index: tags/2.4.0RC3/include/functions_picture.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_picture.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_picture.inc.php	(revision 14585)
@@ -0,0 +1,233 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/*
+ * @param element_info array containing element information from db;
+ * at least 'id', 'path', 'has_high' should be present
+ */
+function get_high_path($element_info)
+{
+  $path = get_high_location($element_info);
+  if (!empty($path) and !url_is_remote($path) )
+  {
+    $path = PHPWG_ROOT_PATH.$path;
+  }
+  return $path;
+}
+
+/**
+ * @param element_info array containing element information from db;
+ * at least 'id', 'path', 'has_high' should be present
+ */
+function get_high_url($element_info)
+{
+  $url = get_high_location($element_info);
+  if (!empty($url) and !url_is_remote($url) )
+  {
+    $url = embellish_url(get_root_url().$url);
+  }
+  // plugins want another url ?
+  return trigger_event('get_high_url', $url, $element_info);
+}
+
+/**
+ * @param element_info array containing element information from db;
+ * at least 'id', 'path', 'has_high' should be present
+ */
+function get_high_location($element_info)
+{
+  $location = '';
+  if ($element_info['has_high'] == 'true')
+  {
+    $pi = pathinfo($element_info['path']);
+    $location=$pi['dirname'].'/pwg_high/'.$pi['basename'];
+  }
+  return trigger_event( 'get_high_location', $location, $element_info);
+}
+
+
+
+/*
+ * get slideshow default params into array
+ *
+ * @param void
+ *
+ * @return slideshow default values into array
+ */
+function get_default_slideshow_params()
+{
+  global $conf;
+
+  return array(
+    'period' => $conf['slideshow_period'],
+    'repeat' => $conf['slideshow_repeat'],
+    'play' => true,
+    );
+}
+
+/*
+ * check and correct slideshow params from array
+ *
+ * @param array of params
+ *
+ * @return slideshow corrected values into array
+ */
+function correct_slideshow_params($params = array())
+{
+  global $conf;
+
+  if ($params['period'] < $conf['slideshow_period_min'])
+  {
+    $params['period'] = $conf['slideshow_period_min'];
+  }
+  else if ($params['period'] > $conf['slideshow_period_max'])
+  {
+    $params['period'] = $conf['slideshow_period_max'];
+  }
+
+  return $params;
+}
+
+/*
+ * Decode slideshow string params into array
+ *
+ * @param string params like ""
+ *
+ * @return slideshow values into array
+ */
+function decode_slideshow_params($encode_params = null)
+{
+  global $conf;
+
+  $result = get_default_slideshow_params();
+
+  if (is_numeric($encode_params))
+  {
+    $result['period'] = $encode_params;
+  }
+  else
+  {
+    $matches = array();
+    if (preg_match_all('/([a-z]+)-(\d+)/', $encode_params, $matches))
+    {
+      $matchcount = count($matches[1]);
+      for ($i = 0; $i < $matchcount; $i++)
+      {
+        $result[$matches[1][$i]] = $matches[2][$i];
+      }
+    }
+
+    if (preg_match_all('/([a-z]+)-(true|false)/', $encode_params, $matches))
+    {
+      $matchcount = count($matches[1]);
+      for ($i = 0; $i < $matchcount; $i++)
+      {
+        $result[$matches[1][$i]] = get_boolean($matches[2][$i]);
+      }
+    }
+  }
+
+  return correct_slideshow_params($result);
+}
+
+/*
+ * Encode slideshow array params into array
+ *
+ * @param array params
+ *
+ * @return slideshow values into string
+ */
+function encode_slideshow_params($decode_params = array())
+{
+  global $conf;
+
+  $params = array_diff_assoc(correct_slideshow_params($decode_params), get_default_slideshow_params());
+  $result = '';
+
+  foreach ($params as $name => $value)
+  {
+    // boolean_to_string return $value, if it's not a bool
+    $result .= '+'.$name.'-'.boolean_to_string($value);
+  }
+
+  return $result;
+}
+
+// The get_picture_size function return an array containing :
+//      - $picture_size[0] : final width
+//      - $picture_size[1] : final height
+// The final dimensions are calculated thanks to the original dimensions and
+// the maximum dimensions given in parameters.  get_picture_size respects
+// the width/height ratio
+function get_picture_size( $original_width, $original_height,
+                           $max_width, $max_height )
+{
+  $width = $original_width;
+  $height = $original_height;
+  $is_original_size = true;
+
+  if ( $max_width != "" )
+  {
+    if ( $original_width > $max_width )
+    {
+      $width = $max_width;
+      $height = floor( ( $width * $original_height ) / $original_width );
+    }
+  }
+  if ( $max_height != "" )
+  {
+    if ( $original_height > $max_height )
+    {
+      $height = $max_height;
+      $width = floor( ( $height * $original_width ) / $original_height );
+      $is_original_size = false;
+    }
+  }
+  if ( is_numeric( $max_width ) and is_numeric( $max_height )
+       and $max_width != 0 and $max_height != 0 )
+  {
+    $ratioWidth = $original_width / $max_width;
+    $ratioHeight = $original_height / $max_height;
+    if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) )
+    {
+      if ( $ratioWidth < $ratioHeight )
+      {
+        $width = floor( $original_width / $ratioHeight );
+        $height = $max_height;
+      }
+      else
+      {
+        $width = $max_width;
+        $height = floor( $original_height / $ratioWidth );
+      }
+      $is_original_size = false;
+    }
+  }
+  $picture_size = array();
+  $picture_size[0] = $width;
+  $picture_size[1] = $height;
+  return $picture_size;
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_plugins.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_plugins.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_plugins.inc.php	(revision 14585)
@@ -0,0 +1,255 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+Events and event handlers are the core of Piwigo plugin management.
+Plugins are addons that are found in plugins subdirectory. If activated, PWG
+will include the index.php of each plugin.
+Events are triggered by PWG core code. Plugins (or even PWG itself) can
+register their functions to handle these events. An event is identified by a
+string.
+*/
+
+define('PHPWG_PLUGINS_PATH', PHPWG_ROOT_PATH.'plugins/');
+
+define('EVENT_HANDLER_PRIORITY_NEUTRAL', 50);
+
+/* Register a event handler.
+ * @param string $event the name of the event to listen to
+ * @param mixed $func the function that will handle the event
+ * @param int $priority optional priority (greater priority will
+ * be executed at last)
+*/
+function add_event_handler($event, $func,
+    $priority=EVENT_HANDLER_PRIORITY_NEUTRAL, $accepted_args=1)
+{
+  global $pwg_event_handlers;
+
+  if ( isset($pwg_event_handlers[$event][$priority]) )
+  {
+    foreach($pwg_event_handlers[$event][$priority] as $handler)
+    {
+      if ( $handler['function'] == $func )
+      {
+        return false;
+      }
+    }
+  }
+
+  $pwg_event_handlers[$event][$priority][] =
+    array(
+      'function'=>$func,
+      'accepted_args'=>$accepted_args);
+  ksort( $pwg_event_handlers[$event] );
+  return true;
+}
+
+/* Register a event handler.
+ * @param string $event the name of the event to listen to
+ * @param mixed $func the function that needs removal
+ * @param int $priority optional priority (greater priority will
+ * be executed at last)
+*/
+function remove_event_handler($event, $func,
+   $priority=EVENT_HANDLER_PRIORITY_NEUTRAL)
+{
+  global $pwg_event_handlers;
+
+  if (!isset( $pwg_event_handlers[$event][$priority] ) )
+  {
+    return false;
+  }
+  for ($i=0; $i<count($pwg_event_handlers[$event][$priority]); $i++)
+  {
+    if ($pwg_event_handlers[$event][$priority][$i]['function']==$func)
+    {
+      unset($pwg_event_handlers[$event][$priority][$i]);
+      $pwg_event_handlers[$event][$priority] =
+        array_values($pwg_event_handlers[$event][$priority]);
+
+      if ( empty($pwg_event_handlers[$event][$priority]) )
+      {
+        unset( $pwg_event_handlers[$event][$priority] );
+        if (empty( $pwg_event_handlers[$event] ) )
+        {
+          unset( $pwg_event_handlers[$event] );
+        }
+      }
+      return true;
+    }
+  }
+  return false;
+}
+
+/* Triggers an event and calls all registered event handlers
+ * @param string $event name of the event
+ * @param mixed $data data to pass to handlers
+*/
+function trigger_event($event, $data=null)
+{
+  global $pwg_event_handlers;
+
+  if ( isset($pwg_event_handlers['trigger']) )
+  {// just for debugging
+    trigger_action('trigger',
+        array('type'=>'event', 'event'=>$event, 'data'=>$data) );
+  }
+
+  if ( !isset($pwg_event_handlers[$event]) )
+  {
+    return $data;
+  }
+  $args = func_get_args();
+
+  foreach ($pwg_event_handlers[$event] as $priority => $handlers)
+  {
+    foreach($handlers as $handler)
+    {
+      $function_name = $handler['function'];
+      $accepted_args = $handler['accepted_args'];
+      $args[1] = $data;
+      $data = call_user_func_array($function_name, array_slice($args,1,$accepted_args) );
+    }
+  }
+  trigger_action('trigger',
+       array('type'=>'post_event', 'event'=>$event, 'data'=>$data) );
+  return $data;
+}
+
+function trigger_action($event, $data=null)
+{
+  global $pwg_event_handlers;
+  if ( isset($pwg_event_handlers['trigger']) and $event!='trigger' )
+  {// special case for debugging - avoid recursive calls
+    trigger_action('trigger',
+        array('type'=>'action', 'event'=>$event, 'data'=>$data) );
+  }
+
+  if ( !isset($pwg_event_handlers[$event]) )
+  {
+    return;
+  }
+  $args = func_get_args();
+
+  foreach ($pwg_event_handlers[$event] as $priority => $handlers)
+  {
+    foreach($handlers as $handler)
+    {
+      $function_name = $handler['function'];
+      $accepted_args = $handler['accepted_args'];
+
+      call_user_func_array($function_name, array_slice($args,1,$accepted_args) );
+    }
+  }
+}
+
+/** Saves some data with the associated plugim id. It can be retrieved later (
+ * during this script lifetime) using get_plugin_data
+ * @param string plugin_id
+ * @param mixed data
+ * returns true on success, false otherwise
+ */
+function set_plugin_data($plugin_id, &$data)
+{
+  global $pwg_loaded_plugins;
+  if ( isset($pwg_loaded_plugins[$plugin_id]) )
+  {
+    $pwg_loaded_plugins[$plugin_id]['plugin_data'] = &$data;
+    return true;
+  }
+  return false;
+}
+
+/** Retrieves plugin data saved previously with set_plugin_data
+ * @param string plugin_id
+ */
+function &get_plugin_data($plugin_id)
+{
+  global $pwg_loaded_plugins;
+  if ( isset($pwg_loaded_plugins[$plugin_id]) )
+  {
+    return $pwg_loaded_plugins[$plugin_id]['plugin_data'];
+  }
+  return null;
+}
+
+/* Returns an array of plugins defined in the database
+ * @param string $state optional filter on this state
+ * @param string $id optional returns only data about given plugin
+*/
+function get_db_plugins($state='', $id='')
+{
+  $query = '
+SELECT * FROM '.PLUGINS_TABLE;
+  $clauses = array();
+  if (!empty($state))
+  {
+    $clauses[] = 'state=\''.$state.'\'';
+  }
+  if (!empty($id))
+  {
+    $clauses[] = 'id="'.$id.'"';
+  }
+  if (count($clauses))
+  {
+      $query .= '
+  WHERE '. implode(' AND ', $clauses);
+  }
+
+  $result = pwg_query($query);
+  $plugins = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($plugins, $row);
+  }
+  return $plugins;
+}
+
+
+function load_plugin($plugin)
+{
+  $file_name = PHPWG_PLUGINS_PATH.$plugin['id'].'/main.inc.php';
+  if ( file_exists($file_name) )
+  {
+    global $pwg_loaded_plugins;
+    $pwg_loaded_plugins[ $plugin['id'] ] = $plugin;
+    include_once( $file_name );
+  }
+}
+
+/*loads all the plugins on startup*/
+function load_plugins()
+{
+  global $conf, $pwg_loaded_plugins;
+  $pwg_loaded_plugins = array();
+  if ($conf['enable_plugins'])
+  {
+    $plugins = get_db_plugins('active');
+    foreach( $plugins as $plugin)
+    {// include main from a function to avoid using same function context
+      load_plugin($plugin);
+    }
+    trigger_action('plugins_loaded');
+  }
+}
+?>
Index: tags/2.4.0RC3/include/functions_rate.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_rate.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_rate.inc.php	(revision 14585)
@@ -0,0 +1,206 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * rate a picture by a user
+ *
+ * @param int image identifier
+ * @param int rate
+ * @return void
+ */
+function rate_picture($image_id, $rate)
+{
+  global $conf, $user;
+
+  if (!isset($rate)
+      or !$conf['rate']
+      or !in_array($rate, $conf['rate_items']))
+  {
+    return false;
+  }
+
+  $user_anonymous = is_autorize_status(ACCESS_CLASSIC) ? false : true;
+
+  if ($user_anonymous and !$conf['rate_anonymous'])
+  {
+    return false;
+  }
+
+  $ip_components = explode('.', $_SERVER["REMOTE_ADDR"]);
+  if (count($ip_components) > 3)
+  {
+    array_pop($ip_components);
+  }
+  $anonymous_id = implode ('.', $ip_components);
+
+  if ($user_anonymous)
+  {
+    $save_anonymous_id = pwg_get_cookie_var('anonymous_rater', $anonymous_id);
+
+    if ($anonymous_id != $save_anonymous_id)
+    { // client has changed his IP adress or he's trying to fool us
+      $query = '
+SELECT element_id
+  FROM '.RATE_TABLE.'
+  WHERE user_id = '.$user['id'].'
+    AND anonymous_id = \''.$anonymous_id.'\'
+;';
+      $already_there = array_from_query($query, 'element_id');
+
+      if (count($already_there) > 0)
+      {
+        $query = '
+DELETE
+  FROM '.RATE_TABLE.'
+  WHERE user_id = '.$user['id'].'
+    AND anonymous_id = \''.$save_anonymous_id.'\'
+    AND element_id IN ('.implode(',', $already_there).')
+;';
+         pwg_query($query);
+       }
+
+       $query = '
+UPDATE '.RATE_TABLE.'
+  SET anonymous_id = \'' .$anonymous_id.'\'
+  WHERE user_id = '.$user['id'].'
+    AND anonymous_id = \'' . $save_anonymous_id.'\'
+;';
+       pwg_query($query);
+    } // end client changed ip
+
+    pwg_set_cookie_var('anonymous_rater', $anonymous_id);
+  } // end anonymous user
+
+  $query = '
+DELETE
+  FROM '.RATE_TABLE.'
+  WHERE element_id = '.$image_id.'
+    AND user_id = '.$user['id'].'
+';
+  if ($user_anonymous)
+  {
+    $query.= ' AND anonymous_id = \''.$anonymous_id.'\'';
+  }
+  pwg_query($query);
+  $query = '
+INSERT
+  INTO '.RATE_TABLE.'
+  (user_id,anonymous_id,element_id,rate,date)
+  VALUES
+  ('
+    .$user['id'].','
+    .'\''.$anonymous_id.'\','
+    .$image_id.','
+    .$rate
+    .',NOW())
+;';
+  pwg_query($query);
+
+  return update_rating_score($image_id);
+}
+
+
+/* update images.rating_score field
+  * we use a bayesian average (http://en.wikipedia.org/wiki/Bayesian_average) with
+C = average number of rates per item
+m = global average rate (all rates)
+
+ * param int $element_id optional, otherwise applies to all
+ * @return array(rating_score, count) if element_id is specified
+*/
+function update_rating_score($element_id = false)
+{
+  $query = '
+SELECT element_id,
+    COUNT(rate) AS rcount,
+    SUM(rate) AS rsum
+  FROM '.RATE_TABLE.'
+  GROUP by element_id';
+
+  $all_rates_count = 0;
+  $all_rates_avg = 0;
+  $item_ratecount_avg = 0;
+  $by_item = array();
+
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $all_rates_count += $row['rcount'];
+    $all_rates_avg += $row['rsum'];
+    $by_item[$row['element_id']] = $row;
+  }
+
+  if ($all_rates_count>0)
+  {
+    $all_rates_avg /= $all_rates_count;
+    $item_ratecount_avg = $all_rates_count / count($by_item);
+  }
+
+  $updates = array();
+  foreach ($by_item as $id => $rate_summary )
+  {
+    $score = ( $item_ratecount_avg * $all_rates_avg + $rate_summary['rsum'] ) / ($item_ratecount_avg + $rate_summary['rcount']);
+    $score = round($score,2);
+    if ($id==$element_id)
+    {
+      $return = array(
+        'score' => $score,
+        'average' => round($rate_summary['rsum'] / $rate_summary['rcount'], 2),
+        'count' => $rate_summary['rcount'],
+        );
+    }
+    $updates[] = array( 'id'=>$id, 'rating_score'=>$score );
+  }
+  mass_updates(
+    IMAGES_TABLE,
+    array(
+      'primary' => array('id'),
+      'update' => array('rating_score')
+      ),
+    $updates
+    );
+
+  //set to null all items with no rate
+  if ( !isset($by_item[$element_id]) )
+  {
+    $query='
+SELECT id FROM '.IMAGES_TABLE .'
+  LEFT JOIN '.RATE_TABLE.' ON id=element_id
+  WHERE element_id IS NULL AND rating_score IS NOT NULL';
+
+    $to_update = array_from_query( $query, 'id');
+
+    if ( !empty($to_update) )
+    {
+      $query='
+UPDATE '.IMAGES_TABLE .'
+  SET rating_score=NULL
+  WHERE id IN (' . implode(',',$to_update) . ')';
+    pwg_query($query);
+    }
+  }
+
+  return isset($return) ? $return : array('score'=>null, 'average'=>null, 'count'=>0 );
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_search.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_search.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_search.inc.php	(revision 14585)
@@ -0,0 +1,711 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/**
+ * returns search rules stored into a serialized array in "search"
+ * table. Each search rules set is numericaly identified.
+ *
+ * @param int search_id
+ * @return array
+ */
+function get_search_array($search_id)
+{
+  if (!is_numeric($search_id))
+  {
+    die('Search id must be an integer');
+  }
+
+  $query = '
+SELECT rules
+  FROM '.SEARCH_TABLE.'
+  WHERE id = '.$search_id.'
+;';
+  list($serialized_rules) = pwg_db_fetch_row(pwg_query($query));
+
+  return unserialize($serialized_rules);
+}
+
+/**
+ * returns the SQL clause from a search identifier
+ *
+ * Search rules are stored in search table as a serialized array. This array
+ * need to be transformed into an SQL clause to be used in queries.
+ *
+ * @param array search
+ * @return string
+ */
+function get_sql_search_clause($search)
+{
+  // SQL where clauses are stored in $clauses array during query
+  // construction
+  $clauses = array();
+
+  foreach (array('file','name','comment','author') as $textfield)
+  {
+    if (isset($search['fields'][$textfield]))
+    {
+      $local_clauses = array();
+      foreach ($search['fields'][$textfield]['words'] as $word)
+      {
+        array_push($local_clauses, $textfield." LIKE '%".$word."%'");
+      }
+
+      // adds brackets around where clauses
+      $local_clauses = prepend_append_array_items($local_clauses, '(', ')');
+
+      array_push(
+        $clauses,
+        implode(
+          ' '.$search['fields'][$textfield]['mode'].' ',
+          $local_clauses
+          )
+        );
+    }
+  }
+
+  if (isset($search['fields']['allwords']))
+  {
+    $fields = array('file', 'name', 'comment', 'author');
+    // in the OR mode, request bust be :
+    // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
+    // OR (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
+    //
+    // in the AND mode :
+    // ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
+    // AND (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
+    $word_clauses = array();
+    foreach ($search['fields']['allwords']['words'] as $word)
+    {
+      $field_clauses = array();
+      foreach ($fields as $field)
+      {
+        array_push($field_clauses, $field." LIKE '%".$word."%'");
+      }
+      // adds brackets around where clauses
+      array_push(
+        $word_clauses,
+        implode(
+          "\n          OR ",
+          $field_clauses
+          )
+        );
+    }
+
+    array_walk(
+      $word_clauses,
+      create_function('&$s','$s="(".$s.")";')
+      );
+
+    array_push(
+      $clauses,
+      "\n         ".
+      implode(
+        "\n         ".
+              $search['fields']['allwords']['mode'].
+        "\n         ",
+        $word_clauses
+        )
+      );
+  }
+
+  foreach (array('date_available', 'date_creation') as $datefield)
+  {
+    if (isset($search['fields'][$datefield]))
+    {
+      array_push(
+        $clauses,
+        $datefield." = '".$search['fields'][$datefield]['date']."'"
+        );
+    }
+
+    foreach (array('after','before') as $suffix)
+    {
+      $key = $datefield.'-'.$suffix;
+
+      if (isset($search['fields'][$key]))
+      {
+        array_push(
+          $clauses,
+
+          $datefield.
+          ($suffix == 'after'             ? ' >' : ' <').
+          ($search['fields'][$key]['inc'] ? '='  : '').
+          " '".$search['fields'][$key]['date']."'"
+
+          );
+      }
+    }
+  }
+
+  if (isset($search['fields']['cat']))
+  {
+    if ($search['fields']['cat']['sub_inc'])
+    {
+      // searching all the categories id of sub-categories
+      $cat_ids = get_subcat_ids($search['fields']['cat']['words']);
+    }
+    else
+    {
+      $cat_ids = $search['fields']['cat']['words'];
+    }
+
+    $local_clause = 'category_id IN ('.implode(',', $cat_ids).')';
+    array_push($clauses, $local_clause);
+  }
+
+  // adds brackets around where clauses
+  $clauses = prepend_append_array_items($clauses, '(', ')');
+
+  $where_separator =
+    implode(
+      "\n    ".$search['mode'].' ',
+      $clauses
+      );
+
+  $search_clause = $where_separator;
+
+  return $search_clause;
+}
+
+/**
+ * returns the list of items corresponding to the advanced search array
+ *
+ * @param array search
+ * @return array
+ */
+function get_regular_search_results($search, $images_where)
+{
+  global $conf;
+  $forbidden = get_sql_condition_FandF(
+        array
+          (
+            'forbidden_categories' => 'category_id',
+            'visible_categories' => 'category_id',
+            'visible_images' => 'id'
+          ),
+        "\n  AND"
+    );
+
+  $items = array();
+  $tag_items = array();
+
+  if (isset($search['fields']['tags']))
+  {
+    $tag_items = get_image_ids_for_tags(
+      $search['fields']['tags']['words'],
+      $search['fields']['tags']['mode']
+      );
+  }
+
+  $search_clause = get_sql_search_clause($search);
+
+  if (!empty($search_clause))
+  {
+    $query = '
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.' i
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE '.$search_clause;
+    if (!empty($images_where))
+    {
+      $query .= "\n  AND ".$images_where;
+    }
+    $query .= $forbidden.'
+  '.$conf['order_by'];
+    $items = array_from_query($query, 'id');
+  }
+
+  if ( !empty($tag_items) )
+  {
+    switch ($search['mode'])
+    {
+      case 'AND':
+        if (empty($search_clause))
+        {
+          $items = $tag_items;
+        }
+        else
+        {
+          $items = array_values( array_intersect($items, $tag_items) );
+        }
+        break;
+      case 'OR':
+        $before_count = count($items);
+        $items = array_unique(
+          array_merge(
+            $items,
+            $tag_items
+            )
+          );
+        break;
+    }
+  }
+
+  return $items;
+}
+
+
+if (function_exists('mb_strtolower'))
+{
+  function transliterate($term)
+  {
+    return remove_accents( mb_strtolower($term) );
+  }
+}
+else
+{
+  function transliterate($term)
+  {
+    return remove_accents( strtolower($term) );
+  }
+}
+
+function is_word_char($ch)
+{
+  return ($ch>='0' && $ch<='9') || ($ch>='a' && $ch<='z') || ($ch>='A' && $ch<='Z') || ord($ch)>127;
+}
+
+/**
+ * analyzes and splits the quick/query search query $q into tokens
+ * q='john bill' => 2 tokens 'john' 'bill'
+ * Special characters for MySql full text search (+,<,>,~) appear in the token modifiers.
+ * The query can contain a phrase: 'Pierre "New York"' will return 'pierre' qnd 'new york'.
+ */
+function analyse_qsearch($q, &$qtokens, &$qtoken_modifiers)
+{
+  $q = stripslashes($q);
+  $tokens = array();
+  $token_modifiers = array();
+  $crt_token = "";
+  $crt_token_modifier = "";
+  $state = 0;
+
+  for ($i=0; $i<strlen($q); $i++)
+  {
+    $ch = $q[$i];
+    switch ($state)
+    {
+      case 0:
+        if ($ch=='"')
+        {
+          $tokens[] = $crt_token; $token_modifiers[] = $crt_token_modifier;
+          $crt_token = ""; $crt_token_modifier = "q";
+          $state=1;
+        }
+        elseif ( $ch=='*' )
+        { // wild card
+          if (strlen($crt_token))
+          {
+            $crt_token .= $ch;
+          }
+          else
+          {
+            $crt_token_modifier .= '*';
+          }
+        }
+        elseif ( strcspn($ch, '+-><~')==0 )
+        { //special full text modifier
+          if (strlen($crt_token))
+          {
+            $tokens[] = $crt_token; $token_modifiers[] = $crt_token_modifier;
+            $crt_token = ""; $crt_token_modifier = "";
+          }
+          $crt_token_modifier .= $ch;
+        }
+        elseif (preg_match('/[\s,.;!\?]+/', $ch))
+        { // white space
+          if (strlen($crt_token))
+          {
+            $tokens[] = $crt_token; $token_modifiers[] = $crt_token_modifier;
+            $crt_token = ""; $crt_token_modifier = "";
+          }
+        }
+        else
+        {
+          $crt_token .= $ch;
+        }
+        break;
+      case 1: // qualified with quotes
+        switch ($ch)
+        {
+          case '"':
+            $tokens[] = $crt_token; $token_modifiers[] = $crt_token_modifier;
+            $crt_token = ""; $crt_token_modifier = "";
+            $state=0;
+            break;
+          default:
+            $crt_token .= $ch;
+        }
+        break;
+    }
+  }
+  if (strlen($crt_token))
+  {
+    $tokens[] = $crt_token;
+    $token_modifiers[] = $crt_token_modifier;
+  }
+
+  $qtokens = array();
+  $qtoken_modifiers = array();
+  for ($i=0; $i<count($tokens); $i++)
+  {
+    if (strstr($token_modifiers[$i], 'q')===false)
+    {
+      if ( substr($tokens[$i], -1)=='*' )
+      {
+        $tokens[$i] = rtrim($tokens[$i], '*');
+        $token_modifiers[$i] .= '*';
+      }
+    }
+    if ( strlen($tokens[$i])==0)
+      continue;
+    $qtokens[] = $tokens[$i];
+    $qtoken_modifiers[] = $token_modifiers[$i];
+  }
+}
+
+
+/**
+ * returns the LIKE sql clause corresponding to the quick search query 
+ * that has been split into tokens
+ * for example file LIKE '%john%' OR file LIKE '%bill%'.
+ */
+function get_qsearch_like_clause($tokens, $token_modifiers, $field)
+{
+  $clauses = array();
+  for ($i=0; $i<count($tokens); $i++)
+  {
+    $token = trim($tokens[$i], '%');
+    if (strstr($token_modifiers[$i], '-')!==false)
+      continue;
+    if ( strlen($token)==0 )
+      continue;
+    $token = addslashes($token);
+    $token = str_replace( array('%','_'), array('\\%','\\_'), $token); // escape LIKE specials %_
+    $clauses[] = $field.' LIKE \'%'.$token.'%\'';
+  }
+
+  return count($clauses) ? '('.implode(' OR ', $clauses).')' : null;
+}
+
+/**
+ * returns the search results corresponding to a quick/query search.
+ * A quick/query search returns many items (search is not strict), but results
+ * are sorted by relevance unless $super_order_by is true. Returns:
+ * array (
+ * 'items' => array(85,68,79...)
+ * 'qs'    => array(
+ *    'matching_tags' => array of matching tags
+ *    'matching_cats' => array of matching categories
+ *    'matching_cats_no_images' =>array(99) - matching categories without images
+ *      ))
+ *
+ * @param string q
+ * @param bool super_order_by
+ * @param string images_where optional aditional restriction on images table
+ * @return array
+ */
+function get_quick_search_results($q, $super_order_by, $images_where='')
+{
+  global $user, $conf;
+
+  $search_results =
+    array(
+      'items' => array(),
+      'qs' => array('q'=>stripslashes($q)),
+    );
+  $q = trim($q);
+  if (empty($q))
+  {
+    return $search_results;
+  }
+  
+  analyse_qsearch($q, $tokens, $token_modifiers);
+
+  $q_like_field = '@@__db_field__@@'; //something never in a search
+  $q_like_clause = get_qsearch_like_clause($tokens, $token_modifiers, $q_like_field );
+
+  // Step 1 - first we find matches in #images table ===========================
+  $where_clauses='MATCH(i.name, i.comment) AGAINST( \''.$q.'\' IN BOOLEAN MODE)';
+  if (!empty($q_like_clause))
+  {
+    $where_clauses .= '
+    OR '. str_replace($q_like_field, 'CONVERT(file, CHAR)', $q_like_clause);
+    $where_clauses = '('.$where_clauses.')';
+  }
+  $where_clauses = array($where_clauses);
+  if (!empty($images_where))
+  {
+    $where_clauses[]='('.$images_where.')';
+  }
+  $where_clauses[] .= get_sql_condition_FandF
+      (
+        array( 'visible_images' => 'i.id' ), null, true
+      );
+  $query = '
+SELECT i.id,
+    MATCH(i.name, i.comment) AGAINST( \''.$q.'\' IN BOOLEAN MODE) AS weight
+  FROM '.IMAGES_TABLE.' i
+  WHERE '.implode("\n AND ", $where_clauses);
+
+  $by_weights=array();
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  { // weight is important when sorting images by relevance
+    if ($row['weight'])
+    {
+      $by_weights[(int)$row['id']] =  2*$row['weight'];
+    }
+    else
+    {//full text does not match but file name match
+      $by_weights[(int)$row['id']] =  2;
+    }
+  }
+
+
+  // Step 2 - search tags corresponding to the query $q ========================
+  $transliterated_tokens = array();
+  $token_tags = array();
+  foreach ($tokens as $token)
+  {
+    $transliterated_tokens[] = transliterate($token);
+    $token_tags[] = array();
+  }
+
+  // Step 2.1 - find match tags for every token in the query search
+  $all_tags = array();
+  $query = '
+SELECT id, name, url_name, COUNT(image_id) AS nb_images
+  FROM '.TAGS_TABLE.'
+    INNER JOIN '.IMAGE_TAG_TABLE.' ON id=tag_id
+  GROUP BY id';
+  $result = pwg_query($query);
+  while ($tag = pwg_db_fetch_assoc($result))
+  {
+    $transliterated_tag = transliterate($tag['name']);
+
+    // find how this tag matches query tokens
+    for ($i=0; $i<count($tokens); $i++)
+    {
+      if (strstr($token_modifiers[$i], '-')!==false)
+        continue;// ignore this NOT token
+      $transliterated_token = $transliterated_tokens[$i];
+
+      $match = false;
+      $pos = 0;
+      while ( ($pos = strpos($transliterated_tag, $transliterated_token, $pos)) !== false)
+      {
+        if (strstr($token_modifiers[$i], '*')!==false)
+        {// wildcard in this token
+          $match = 1;
+          break;
+        }
+        $token_len = strlen($transliterated_token);
+
+        $word_begin = $pos;
+        while ($word_begin>0)
+        {
+          if (! is_word_char($transliterated_tag[$word_begin-1]) )
+            break;
+          $word_begin--;
+        }
+
+        $word_end = $pos + $token_len;
+        while ($word_end<strlen($transliterated_tag) && is_word_char($transliterated_tag[$word_end]) )
+          $word_end++;
+
+        $this_score = $token_len / ($word_end-$word_begin);
+        if ($token_len <= 2)
+        {// search for 1 or 2 characters must match exactly to avoid retrieving too much data
+          if ($token_len != $word_end-$word_begin)
+            $this_score = 0;
+        }
+        elseif ($token_len == 3)
+        {
+          if ($word_end-$word_begin > 4)
+            $this_score = 0;
+        }
+
+        if ($this_score>0)
+          $match = max($match, $this_score );
+        $pos++;
+      }
+
+      if ($match)
+      {
+        $tag_id = (int)$tag['id'];
+        $all_tags[$tag_id] = $tag;
+        $token_tags[$i][] = array('tag_id'=>$tag_id, 'score'=>$match);
+      }
+    }
+  }
+  $search_results['qs']['matching_tags']=$all_tags;
+
+  // Step 2.2 - reduce matching tags for every token in the query search
+  $score_cmp_fn = create_function('$a,$b', 'return 100*($b["score"]-$a["score"]);');
+  foreach ($token_tags as &$tt)
+  {
+    usort($tt, $score_cmp_fn);
+    $nb_images = 0;
+    $prev_score = 0;
+    for ($j=0; $j<count($tt); $j++)
+    {
+      if ($nb_images > 200 && $prev_score > $tt[$j]['score'] )
+      {// "many" images in previous tags and starting from this tag is less relevent
+        $tt = array_slice( $tt, 0, $j);
+        break;
+      }
+      $nb_images += $all_tags[ $tt[$j]['tag_id'] ]['nb_images'];
+      $prev_score = $tt[$j]['score'];
+    }
+  }
+
+  // Step 2.3 - get the images for tags
+  for ($i=0; $i<count($token_tags); $i++)
+  {
+    $tag_ids = array();
+    foreach($token_tags[$i] as $arr)
+      $tag_ids[] = $arr['tag_id'];
+
+    if (!empty($tag_ids))
+    {
+      $query = '
+SELECT image_id
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE tag_id IN ('.implode(',',$tag_ids).')
+  GROUP BY image_id';
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      { // weight is important when sorting images by relevance
+        $image_id=(int)$row['image_id'];
+        @$by_weights[$image_id] += 1;
+      }
+    }
+  }
+
+  // Step 3 - search categories corresponding to the query $q ==================
+  $query = '
+SELECT id, name, permalink, nb_images
+  FROM '.CATEGORIES_TABLE.'
+    INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.' ON id=cat_id
+  WHERE user_id='.$user['id'].'
+    AND MATCH(name, comment) AGAINST( \''.$q.'\' IN BOOLEAN MODE)'.
+  get_sql_condition_FandF (
+      array( 'visible_categories' => 'cat_id' ), "\n    AND"
+    );
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  { // weight is important when sorting images by relevance
+    if ($row['nb_images']==0)
+    {
+      $search_results['qs']['matching_cats_no_images'][] = $row;
+    }
+    else
+    {
+      $search_results['qs']['matching_cats'][$row['id']] = $row;
+    }
+  }
+
+  if ( empty($by_weights) and empty($search_results['qs']['matching_cats']) )
+  {
+    return $search_results;
+  }
+
+  // Step 4 - now we have $by_weights ( array image id => weight ) that need
+  // permission checks and/or matching categories to get images from
+  $where_clauses = array();
+  if ( !empty($by_weights) )
+  {
+    $where_clauses[]='i.id IN ('
+      . implode(',', array_keys($by_weights)) . ')';
+  }
+  if ( !empty($search_results['qs']['matching_cats']) )
+  {
+    $where_clauses[]='category_id IN ('.
+      implode(',',array_keys($search_results['qs']['matching_cats'])).')';
+  }
+  $where_clauses = array( '('.implode("\n    OR ",$where_clauses).')' );
+  if (!empty($images_where))
+  {
+    $where_clauses[]='('.$images_where.')';
+  }
+  $where_clauses[] = get_sql_condition_FandF(
+      array
+        (
+          'forbidden_categories' => 'category_id',
+          'visible_categories' => 'category_id',
+          'visible_images' => 'i.id'
+        ),
+      null,true
+    );
+
+  $query = '
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.' i
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE '.implode("\n AND ", $where_clauses)."\n".
+  $conf['order_by'];
+
+  $allowed_images = array_from_query( $query, 'id');
+
+  if ( $super_order_by or empty($by_weights) )
+  {
+    $search_results['items'] = $allowed_images;
+    return $search_results;
+  }
+
+  $allowed_images = array_flip( $allowed_images );
+  $divisor = 5.0 * count($allowed_images);
+  foreach ($allowed_images as $id=>$rank )
+  {
+    $weight = isset($by_weights[$id]) ? $by_weights[$id] : 1;
+    $weight -= $rank/$divisor;
+    $allowed_images[$id] = $weight;
+  }
+  arsort($allowed_images, SORT_NUMERIC);
+  $search_results['items'] = array_keys($allowed_images);
+  return $search_results;
+}
+
+/**
+ * returns an array of 'items' corresponding to the search id
+ *
+ * @param int search id
+ * @param string images_where optional aditional restriction on images table
+ * @return array
+ */
+function get_search_results($search_id, $super_order_by, $images_where='')
+{
+  $search = get_search_array($search_id);
+  if ( !isset($search['q']) )
+  {
+    $result['items'] = get_regular_search_results($search, $images_where);
+    return $result;
+  }
+  else
+  {
+    return get_quick_search_results($search['q'], $super_order_by, $images_where);
+  }
+}
+?>
Index: tags/2.4.0RC3/include/functions_session.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_session.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_session.inc.php	(revision 14585)
@@ -0,0 +1,228 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// The function generate_key creates a string with pseudo random characters.
+// the size of the string depends on the $conf['session_id_size'].
+// Characters used are a-z A-Z and numerical values. Examples :
+//                    "Er4Tgh6", "Rrp08P", "54gj"
+// input  : none (using global variable)
+// output : $key
+function generate_key($size)
+{
+  global $conf;
+
+  $md5 = md5(substr(microtime(), 2, 6));
+  $init = '';
+  for ( $i = 0; $i < strlen( $md5 ); $i++ )
+  {
+    if ( is_numeric( $md5[$i] ) ) $init.= $md5[$i];
+  }
+  $init = substr( $init, 0, 8 );
+  mt_srand( $init );
+  $key = '';
+  for ( $i = 0; $i < $size; $i++ )
+  {
+    $c = mt_rand( 0, 2 );
+    if ( $c == 0 )      $key .= chr( mt_rand( 65, 90 ) );
+    else if ( $c == 1 ) $key .= chr( mt_rand( 97, 122 ) );
+    else                $key .= mt_rand( 0, 9 );
+  }
+  return $key;
+}
+
+if (isset($conf['session_save_handler'])
+  and ($conf['session_save_handler'] == 'db')
+  and defined('PHPWG_INSTALLED'))
+{
+  session_set_save_handler('pwg_session_open',
+    'pwg_session_close',
+    'pwg_session_read',
+    'pwg_session_write',
+    'pwg_session_destroy',
+    'pwg_session_gc'
+  );
+  if ( function_exists('ini_set') )
+  {
+    ini_set('session.use_cookies', $conf['session_use_cookies']);
+    ini_set('session.use_only_cookies', $conf['session_use_only_cookies']);
+    ini_set('session.use_trans_sid', intval($conf['session_use_trans_sid']));
+    ini_set('session.cookie_httponly', 1);
+  }
+  session_name($conf['session_name']);
+  session_set_cookie_params(0, cookie_path());
+  register_shutdown_function('session_write_close');
+}
+
+/**
+ * returns true; used when the session_start() function is called
+ *
+ * @params not use but useful for php engine
+ */
+function pwg_session_open($path, $name)
+{
+  return true;
+}
+
+/**
+ * returns true; used when the session is closed (unset($_SESSION))
+ *
+ */
+function pwg_session_close()
+{
+  return true;
+}
+
+function get_remote_addr_session_hash()
+{
+  if (strpos($_SERVER['REMOTE_ADDR'],':')===false)
+  {//ipv4
+    return vsprintf(
+      "%02X%02X",
+      explode('.',$_SERVER['REMOTE_ADDR'])
+    );
+  }
+  return ''; //ipv6 not yet
+}
+
+/**
+ * this function returns
+ * a string corresponding to the value of the variable save in the session
+ * or an empty string when the variable doesn't exist
+ *
+ * @param string session id
+ */
+function pwg_session_read($session_id)
+{
+  $query = '
+SELECT data
+  FROM '.SESSIONS_TABLE.'
+  WHERE id = \''.get_remote_addr_session_hash().$session_id.'\'
+;';
+  $result = pwg_query($query);
+  if ($result)
+  {
+    $row = pwg_db_fetch_assoc($result);
+    return $row['data'];
+  }
+  else
+  {
+    return '';
+  }
+}
+
+/**
+ * returns true; writes set a variable in the active session
+ *
+ * @param string session id
+ * @data string value of date to be saved
+ */
+function pwg_session_write($session_id, $data)
+{
+  $query = '
+REPLACE INTO '.SESSIONS_TABLE.'
+  (id,data,expiration)
+  VALUES(\''.get_remote_addr_session_hash().$session_id.'\',\''.str_replace("'", "\'", $data).'\',now())
+;';
+  pwg_query($query);
+  return true;
+}
+
+/**
+ * returns true; delete the active session
+ *
+ * @param string session id
+ */
+function pwg_session_destroy($session_id)
+{
+  $query = '
+DELETE
+  FROM '.SESSIONS_TABLE.'
+  WHERE id = \''.get_remote_addr_session_hash().$session_id.'\'
+;';
+  pwg_query($query);
+  return true;
+}
+
+/**
+ * returns true; delete expired sessions
+ * called each time a session is closed.
+ */
+function pwg_session_gc()
+{
+  global $conf;
+
+  $query = '
+DELETE
+  FROM '.SESSIONS_TABLE.'
+  WHERE '.pwg_db_date_to_ts('NOW()').' - '.pwg_db_date_to_ts('expiration').' > '
+  .$conf['session_length'].'
+;';
+  pwg_query($query);
+  return true;
+}
+
+
+/**
+ * persistently stores a variable for the current session
+ * currently we use standard php sessions but it might change
+ * @return boolean true on success
+ * @see pwg_get_session_var, pwg_unset_session_var
+ */
+function pwg_set_session_var($var, $value)
+{
+  if ( !isset($_SESSION) )
+    return false;
+  $_SESSION['pwg_'.$var] = $value;
+  return true;
+}
+
+/**
+ * retrieves the value of a persistent variable for the current session
+ * currently we use standard php sessions but it might change
+ * @return mixed
+ * @see pwg_set_session_var, pwg_unset_session_var
+ */
+function pwg_get_session_var($var, $default = null)
+{
+  if (isset( $_SESSION['pwg_'.$var] ) )
+  {
+    return $_SESSION['pwg_'.$var];
+  }
+  return $default;
+}
+
+/**
+ * deletes a persistent variable for the current session
+ * currently we use standard php sessions but it might change
+ * @return boolean true on success
+ * @see pwg_set_session_var, pwg_get_session_var
+ */
+function pwg_unset_session_var($var)
+{
+  if ( !isset($_SESSION) )
+    return false;
+  unset( $_SESSION['pwg_'.$var] );
+  return true;
+}
+
+?>
Index: tags/2.4.0RC3/include/functions_tag.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_tag.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_tag.inc.php	(revision 14585)
@@ -0,0 +1,323 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/**
+ * Tags available. Each return tag is represented as an array with its id,
+ * its name, its weight (count), its url name. Tags are not sorted.
+ *
+ * The returned list can be a subset of all existing tags due to
+ * permissions, only if a list of forbidden categories is provided
+ *
+ * @param array forbidden categories
+ * @return array
+ */
+function get_available_tags()
+{
+  // we can find top fatter tags among reachable images
+  $query = '
+SELECT tag_id, COUNT(DISTINCT(it.image_id)) AS counter
+  FROM '.IMAGE_CATEGORY_TABLE.' ic
+    INNER JOIN '.IMAGE_TAG_TABLE.' it ON ic.image_id=it.image_id'.get_sql_condition_FandF
+    (
+      array
+        (
+          'forbidden_categories' => 'category_id',
+          'visible_categories' => 'category_id',
+          'visible_images' => 'ic.image_id'
+        ),
+      '
+  WHERE'
+    ).'
+  GROUP BY tag_id';
+  $tag_counters = simple_hash_from_query($query, 'tag_id', 'counter');
+
+  if ( empty($tag_counters) )
+  {
+    return array();
+  }
+
+  $query = '
+SELECT *
+  FROM '.TAGS_TABLE;
+  $result = pwg_query($query);
+  $tags = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $counter = @$tag_counters[ $row['id'] ];
+    if ( $counter )
+    {
+      $row['counter'] = $counter;
+      $row['name'] = trigger_event('render_tag_name', $row['name']);
+      array_push($tags, $row);
+    }
+  }
+  return $tags;
+}
+
+/**
+ * All tags, even tags associated to no image.
+ *
+ * @return array
+ */
+function get_all_tags()
+{
+  $query = '
+SELECT *
+  FROM '.TAGS_TABLE.'
+;';
+  $result = pwg_query($query);
+  $tags = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $row['name'] = trigger_event('render_tag_name', $row['name']);
+    array_push($tags, $row);
+  }
+
+  usort($tags, 'tag_alpha_compare');
+
+  return $tags;
+}
+
+/**
+ * Giving a set of tags with a counter for each one, calculate the display
+ * level of each tag.
+ *
+ * The level of each tag depends on the average count of tags. This
+ * calcylation method avoid having very different levels for tags having
+ * nearly the same count when set are small.
+ *
+ * @param array tags
+ * @return array
+ */
+function add_level_to_tags($tags)
+{
+  global $conf;
+
+  if (count($tags) == 0)
+  {
+    return $tags;
+  }
+
+  $total_count = 0;
+
+  foreach ($tags as $tag)
+  {
+    $total_count+= $tag['counter'];
+  }
+
+  // average count of available tags will determine the level of each tag
+  $tag_average_count = $total_count / count($tags);
+
+  // tag levels threshold calculation: a tag with an average rate must have
+  // the middle level.
+  for ($i = 1; $i < $conf['tags_levels']; $i++)
+  {
+    $threshold_of_level[$i] =
+      2 * $i * $tag_average_count / $conf['tags_levels'];
+  }
+
+  // display sorted tags
+  foreach (array_keys($tags) as $k)
+  {
+    $tags[$k]['level'] = 1;
+
+    // based on threshold, determine current tag level
+    for ($i = $conf['tags_levels'] - 1; $i >= 1; $i--)
+    {
+      if ($tags[$k]['counter'] > $threshold_of_level[$i])
+      {
+        $tags[$k]['level'] = $i + 1;
+        break;
+      }
+    }
+  }
+
+  return $tags;
+}
+
+/**
+ * return the list of image ids corresponding to given tags. AND & OR mode
+ * supported.
+ *
+ * @param array tag ids
+ * @param string mode
+ * @param string extra_images_where_sql - optionally apply a sql where filter to retrieved images
+ * @param string order_by - optionally overwrite default photo order
+ * @return array
+ */
+function get_image_ids_for_tags($tag_ids, $mode='AND', $extra_images_where_sql='', $order_by='', $use_permissions=true)
+{
+  global $conf;
+  if (empty($tag_ids))
+  {
+    return array();
+  }
+
+  $query = 'SELECT id
+  FROM '.IMAGES_TABLE.' i ';
+
+  if ($use_permissions)
+  {
+    $query.= '
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ic ON id=ic.image_id';
+  }
+
+  $query.= '
+    INNER JOIN '.IMAGE_TAG_TABLE.' it ON id=it.image_id
+    WHERE tag_id IN ('.implode(',', $tag_ids).')';
+
+  if ($use_permissions)
+  {
+    $query.= get_sql_condition_FandF(
+      array(
+        'forbidden_categories' => 'category_id',
+        'visible_categories' => 'category_id',
+        'visible_images' => 'id'
+        ),
+      "\n  AND"
+      );
+  }
+
+  $query.= (empty($extra_images_where_sql) ? '' : " \nAND (".$extra_images_where_sql.')').'
+  GROUP BY id';
+  
+  if ($mode=='AND' and count($tag_ids)>1)
+  {
+    $query .= '
+  HAVING COUNT(DISTINCT tag_id)='.count($tag_ids);
+  }
+  $query .= "\n".(empty($order_by) ? $conf['order_by'] : $order_by);
+
+  return array_from_query($query, 'id');
+}
+
+/**
+ * return a list of tags corresponding to given items.
+ *
+ * @param array items
+ * @param array max_tags
+ * @param array excluded_tag_ids
+ * @return array
+ */
+function get_common_tags($items, $max_tags, $excluded_tag_ids=null)
+{
+  if (empty($items))
+  {
+    return array();
+  }
+  $query = '
+SELECT t.*, count(*) AS counter
+  FROM '.IMAGE_TAG_TABLE.'
+    INNER JOIN '.TAGS_TABLE.' t ON tag_id = id
+  WHERE image_id IN ('.implode(',', $items).')';
+  if (!empty($excluded_tag_ids))
+  {
+    $query.='
+    AND tag_id NOT IN ('.implode(',', $excluded_tag_ids).')';
+  }
+  $query .='
+  GROUP BY t.id
+  ORDER BY ';
+  if ($max_tags>0)
+  {
+    $query .= 'counter DESC
+  LIMIT '.$max_tags;
+  }
+  else
+  {
+    $query .= 'NULL';
+  }
+
+  $result = pwg_query($query);
+  $tags = array();
+  while($row = pwg_db_fetch_assoc($result))
+  {
+    $row['name'] = trigger_event('render_tag_name', $row['name']);
+    array_push($tags, $row);
+  }
+  usort($tags, 'tag_alpha_compare');
+  return $tags;
+}
+
+/**
+ * return a list of tags corresponding to any of ids, url_names, names
+ *
+ * @param array ids
+ * @param array url_names
+ * @param array names
+ * @return array
+ */
+function find_tags($ids, $url_names=array(), $names=array() )
+{
+  $where_clauses = array();
+  if ( !empty($ids) )
+  {
+    $where_clauses[] = 'id IN ('.implode(',', $ids).')';
+  }
+  if ( !empty($url_names) )
+  {
+    $where_clauses[] =
+      'url_name IN ('.
+      implode(
+        ',',
+        array_map(
+          create_function('$s', 'return "\'".$s."\'";'),
+          $url_names
+          )
+        )
+      .')';
+  }
+  if ( !empty($names) )
+  {
+    $where_clauses[] =
+      'name IN ('.
+      implode(
+        ',',
+        array_map(
+          create_function('$s', 'return "\'".$s."\'";'),
+          $names
+          )
+        )
+      .')';
+  }
+  if (empty($where_clauses))
+  {
+    return array();
+  }
+
+  $query = '
+SELECT *
+  FROM '.TAGS_TABLE.'
+  WHERE '. implode( '
+    OR ', $where_clauses);
+
+  $result = pwg_query($query);
+  $tags = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    array_push($tags, $row);
+  }
+  return $tags;
+}
+?>
Index: tags/2.4.0RC3/include/functions_url.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_url.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_url.inc.php	(revision 14585)
@@ -0,0 +1,790 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/**
+ * returns a prefix for each url link on displayed page
+ * and return an empty string for current path
+ * @return string
+ */
+function get_root_url()
+{
+  global $page;
+  if ( ($root_url = @$page['root_path']) == null )
+  {// TODO - add HERE the possibility to call PWG functions from external scripts
+    $root_url = PHPWG_ROOT_PATH;
+    if ( strncmp($root_url, './', 2) == 0 )
+    {
+      return substr($root_url, 2);
+    }
+  }
+  return $root_url;
+}
+
+/**
+ * returns the absolute url to the root of PWG
+ * @param boolean with_scheme if false - does not add http://toto.com
+ */
+function get_absolute_root_url($with_scheme=true)
+{
+  // TODO - add HERE the possibility to call PWG functions from external scripts
+  $url = '';
+  if ($with_scheme)
+  {
+    if (isset($_SERVER['HTTPS']) &&
+	((strtolower($_SERVER['HTTPS']) == 'on') or ($_SERVER['HTTPS'] == 1)))
+    {
+      $url .= 'https://';
+    }
+    else
+    {
+      $url .= 'http://';
+    }
+    $url .= $_SERVER['HTTP_HOST'];
+    if ($_SERVER['SERVER_PORT'] != 80)
+    {
+      $url_port = ':'.$_SERVER['SERVER_PORT'];
+      if (strrchr($url, ':') != $url_port)
+      {
+        $url .= $url_port;
+      }
+    }
+  }
+  $url .= cookie_path();
+  return $url;
+}
+
+/**
+ * adds one or more _GET style parameters to an url
+ * example: add_url_params('/x', array('a'=>'b')) returns /x?a=b
+ * add_url_params('/x?cat_id=10', array('a'=>'b')) returns /x?cat_id=10&amp;a=b
+ * @param string url
+ * @param array params
+ * @return string
+ */
+function add_url_params($url, $params, $arg_separator='&amp;' )
+{
+  if ( !empty($params) )
+  {
+    assert( is_array($params) );
+    $is_first = true;
+    foreach($params as $param=>$val)
+    {
+      if ($is_first)
+      {
+        $is_first = false;
+        $url .= ( strpos($url, '?')===false ) ? '?' : $arg_separator;
+      }
+      else
+      {
+        $url .= $arg_separator;
+      }
+      $url .= $param;
+      if (isset($val))
+      {
+        $url .= '='.$val;
+      }
+    }
+  }
+  return $url;
+}
+
+/**
+ * build an index URL for a specific section
+ *
+ * @param array
+ * @return string
+ */
+function make_index_url($params = array())
+{
+  global $conf;
+  $url = get_root_url().'index';
+  if ($conf['php_extension_in_urls'])
+  {
+    $url .= '.php';
+  }
+  if ($conf['question_mark_in_urls'])
+  {
+    $url .= '?';
+  }
+
+  $url_before_params = $url;
+  
+  $url.= make_section_in_url($params);
+  $url = add_well_known_params_in_url($url, $params);
+
+  if ($url == $url_before_params)
+  {
+    $url = get_absolute_root_url( url_is_remote($url) );
+  }
+  
+  return $url;
+}
+
+/**
+ * build an index URL with current page parameters, but with redefinitions
+ * and removes.
+ *
+ * duplicate_index_url( array(
+ *   'category' => array('id'=>12, 'name'=>'toto'),
+ *   array('start')
+ * ) will create an index URL on the current section (categories), but on
+ * a redefined category and without the start URL parameter.
+ *
+ * @param array redefined keys
+ * @param array removed keys
+ * @return string
+ */
+function duplicate_index_url($redefined = array(), $removed = array())
+{
+  return make_index_url(
+    params_for_duplication($redefined, $removed)
+    );
+}
+
+/**
+ * returns $page global array with key redefined and key removed
+ *
+ * @param array redefined keys
+ * @param array removed keys
+ * @return array
+ */
+function params_for_duplication($redefined, $removed)
+{
+  global $page;
+
+  $params = $page;
+
+  foreach ($removed as $param_key)
+  {
+    unset($params[$param_key]);
+  }
+
+  foreach ($redefined as $redefined_param => $redefined_value)
+  {
+    $params[$redefined_param] = $redefined_value;
+  }
+
+  return $params;
+}
+
+/**
+ * create a picture URL with current page parameters, but with redefinitions
+ * and removes. See duplicate_index_url.
+ *
+ * @param array redefined keys
+ * @param array removed keys
+ * @return string
+ */
+function duplicate_picture_url($redefined = array(), $removed = array())
+{
+  return make_picture_url(
+    params_for_duplication($redefined, $removed)
+    );
+}
+
+/**
+ * create a picture URL on a specific section for a specific picture
+ *
+ * @param array
+ * @return string
+ */
+function make_picture_url($params)
+{
+  global $conf;
+
+  isset($params['image_id']) or fatal_error('make_picture_url: image_id is a required parameter');
+
+  $url = get_root_url().'picture';
+  if ($conf['php_extension_in_urls'])
+  {
+    $url .= '.php';
+  }
+  if ($conf['question_mark_in_urls'])
+  {
+    $url .= '?';
+  }
+  $url.= '/';
+  switch ( $conf['picture_url_style'] )
+  {
+    case 'id-file':
+      $url .= $params['image_id'];
+      if ( isset($params['image_file']) )
+      {
+        $url .= '-'.get_filename_wo_extension($params['image_file']);
+      }
+      break;
+    case 'file':
+      if ( isset($params['image_file']) )
+      {
+        $fname_wo_ext = get_filename_wo_extension($params['image_file']);
+        if ( ord($fname_wo_ext)>ord('9') or !preg_match('/^\d+(-|$)/', $fname_wo_ext) )
+        {
+          $url .= $fname_wo_ext;
+          break;
+        }
+      }
+    default:
+      $url .= $params['image_id'];
+  }
+  if ( !isset($params['category'] ) )
+  {// make urls shorter ...
+    unset( $params['flat'] );
+  }
+  $url .= make_section_in_url($params);
+  $url = add_well_known_params_in_url($url, $params);
+  return $url;
+}
+
+/**
+ *adds to the url the chronology and start parameters
+*/
+function add_well_known_params_in_url($url, $params)
+{
+  if ( isset($params['chronology_field']) )
+  {
+    $url .= '/'. $params['chronology_field'];
+    $url .= '-'. $params['chronology_style'];
+    if ( isset($params['chronology_view']) )
+    {
+      $url .= '-'. $params['chronology_view'];
+    }
+    if ( !empty($params['chronology_date']) )
+    {
+      $url .= '-'. implode('-', $params['chronology_date'] );
+    }
+  }
+
+  if (isset($params['flat']))
+  {
+    $url.= '/flat';
+  }
+
+  if (isset($params['start']) and $params['start'] > 0)
+  {
+    $url.= '/start-'.$params['start'];
+  }
+  return $url;
+}
+
+/**
+ * return the section token of an index or picture URL.
+ *
+ * Depending on section, other parameters are required (see function code
+ * for details)
+ *
+ * @param array
+ * @return string
+ */
+function make_section_in_url($params)
+{
+  global $conf;
+  $section_string = '';
+  $section = @$params['section'];
+  if (!isset($section))
+  {
+    $section_of = array(
+      'category' => 'categories',
+      'tags'     => 'tags',
+      'list'     => 'list',
+      'search'   => 'search',
+      );
+
+    foreach ($section_of as $param => $s)
+    {
+      if (isset($params[$param]))
+      {
+        $section = $s;
+      }
+    }
+
+    if (!isset($section))
+    {
+      $section = 'none';
+    }
+  }
+
+  switch($section)
+  {
+    case 'categories' :
+    {
+      if (!isset($params['category']))
+      {
+        $section_string.= '/categories';
+      }
+      else
+      {
+        is_array($params['category']) or trigger_error(
+            'make_section_in_url wrong type for category', E_USER_WARNING
+            );
+        is_numeric($params['category']['id']) or trigger_error(
+            'make_section_in_url category id not numeric', E_USER_WARNING
+            );
+        isset($params['category']['name']) or trigger_error(
+            'make_section_in_url category name not set', E_USER_WARNING
+            );
+
+        array_key_exists('permalink', $params['category']) or trigger_error(
+            'make_section_in_url category permalink not set', E_USER_WARNING
+            );
+
+        $section_string.= '/category/';
+        if ( empty($params['category']['permalink']) )
+        {
+          $section_string.= $params['category']['id'];
+          if ( $conf['category_url_style']=='id-name' )
+          {
+            $section_string.= '-'.str2url($params['category']['name']);
+          }
+        }
+        else
+        {
+          $section_string.= $params['category']['permalink'];
+        }
+      }
+
+      break;
+    }
+    case 'tags' :
+    {
+      if (!isset($params['tags']) or count($params['tags']) == 0)
+      {
+        fatal_error('make_section_in_url: require at least one tag');
+      }
+
+      $section_string.= '/tags';
+
+      foreach ($params['tags'] as $tag)
+      {
+        switch ( $conf['tag_url_style'] )
+        {
+          case 'id':
+            $section_string.= '/'.$tag['id'];
+            break;
+          case 'tag':
+            if (isset($tag['url_name']) and !is_numeric($tag['url_name']) )
+            {
+              $section_string.= '/'.$tag['url_name'];
+              break;
+            }
+          default:
+            $section_string.= '/'.$tag['id'];
+            if (isset($tag['url_name']))
+            {
+              $section_string.= '-'.$tag['url_name'];
+            }
+        }
+      }
+
+      break;
+    }
+    case 'search' :
+    {
+      isset($params['search']) or fatal_error('make_section_in_url: require a search identifier');
+      $section_string.= '/search/'.$params['search'];
+      break;
+    }
+    case 'list' :
+    {
+      isset($params['list']) or fatal_error('make_section_in_url: require a list of items');
+      $section_string.= '/list/'.implode(',', $params['list']);
+      break;
+    }
+    case 'none' :
+    {
+      break;
+    }
+    default :
+    {
+      $section_string.= '/'.$section;
+    }
+  }
+
+  return $section_string;
+}
+
+/**
+ * the reverse of make_section_in_url
+ * returns the 'section' (categories/tags/...) and the data associated with it
+ *
+ * Depending on section, other parameters are returned (category/tags/list/...)
+ *
+ * @param array of url tokens to parse
+ * @param int the index in the array of url tokens; in/out
+ * @return array
+ */
+function parse_section_url( $tokens, &$next_token)
+{
+  $page=array();
+  if (strncmp(@$tokens[$next_token], 'categor', 7)==0 )
+  {
+    $page['section'] = 'categories';
+    $next_token++;
+
+    if (isset($tokens[$next_token]) )
+    {
+      if (preg_match('/^(\d+)(?:-(.+))?$/', $tokens[$next_token], $matches))
+      {
+        if ( isset($matches[2]) )
+          $page['hit_by']['cat_url_name'] = $matches[2];
+        $page['category'] = $matches[1];
+        $next_token++;
+      }
+      else
+      {// try a permalink
+        $maybe_permalinks = array();
+        $current_token = $next_token;
+        while ( isset($tokens[$current_token])
+            and strpos($tokens[$current_token], 'created-')!==0
+            and strpos($tokens[$current_token], 'posted-')!==0
+            and strpos($tokens[$next_token], 'start-')!==0
+            and $tokens[$current_token] != 'flat')
+        {
+          if (empty($maybe_permalinks))
+          {
+            array_push($maybe_permalinks, $tokens[$current_token]);
+          }
+          else
+          {
+            array_push($maybe_permalinks,
+                $maybe_permalinks[count($maybe_permalinks)-1]
+                . '/' . $tokens[$current_token]
+              );
+          }
+          $current_token++;
+        }
+
+        if ( count($maybe_permalinks) )
+        {
+          $cat_id = get_cat_id_from_permalinks($maybe_permalinks, $perma_index);
+          if ( isset($cat_id) )
+          {
+            $next_token += $perma_index+1;
+            $page['category'] = $cat_id;
+            $page['hit_by']['cat_permalink'] = $maybe_permalinks[$perma_index];
+          }
+          else
+          {
+            page_not_found('Permalink for album not found');
+          }
+        }
+      }
+    }
+
+    if (isset($page['category']))
+    {
+      $result = get_cat_info($page['category']);
+      if (empty($result))
+      {
+        page_not_found('Requested category does not exist' );
+      }
+      $page['category']=$result;
+    }
+  }
+  elseif ( 'tags' == @$tokens[$next_token] )
+  {
+    global $conf;
+
+    $page['section'] = 'tags';
+    $page['tags'] = array();
+
+    $next_token++;
+    $i = $next_token;
+
+    $requested_tag_ids = array();
+    $requested_tag_url_names = array();
+
+    while (isset($tokens[$i]))
+    {
+      if (strpos($tokens[$i], 'created-')===0
+           or strpos($tokens[$i], 'posted-')===0
+           or strpos($tokens[$i], 'start-')===0 )
+        break;
+
+      if ( $conf['tag_url_style'] != 'tag' and preg_match('/^(\d+)(?:-(.*)|)$/', $tokens[$i], $matches) )
+      {
+        array_push($requested_tag_ids, $matches[1]);
+      }
+      else
+      {
+        array_push($requested_tag_url_names, $tokens[$i]);
+      }
+      $i++;
+    }
+    $next_token = $i;
+
+    if ( empty($requested_tag_ids) && empty($requested_tag_url_names) )
+    {
+      bad_request('at least one tag required');
+    }
+
+    $page['tags'] = find_tags($requested_tag_ids, $requested_tag_url_names);
+    if ( empty($page['tags']) )
+    {
+      page_not_found('Requested tag does not exist', get_root_url().'tags.php' );
+    }
+  }
+  elseif ( 'favorites' == @$tokens[$next_token] )
+  {
+    $page['section'] = 'favorites';
+    $next_token++;
+  }
+  elseif ('most_visited' == @$tokens[$next_token])
+  {
+    $page['section'] = 'most_visited';
+    $next_token++;
+  }
+  elseif ('best_rated' == @$tokens[$next_token])
+  {
+    $page['section'] = 'best_rated';
+    $next_token++;
+  }
+  elseif ('recent_pics' == @$tokens[$next_token])
+  {
+    $page['section'] = 'recent_pics';
+    $next_token++;
+  }
+  elseif ('recent_cats' == @$tokens[$next_token])
+  {
+    $page['section'] = 'recent_cats';
+    $next_token++;
+  }
+  elseif ('search' == @$tokens[$next_token])
+  {
+    $page['section'] = 'search';
+    $next_token++;
+
+    preg_match('/(\d+)/', @$tokens[$next_token], $matches);
+    if (!isset($matches[1]))
+    {
+      bad_request('search identifier is missing');
+    }
+    $page['search'] = $matches[1];
+    $next_token++;
+  }
+  elseif ('list' == @$tokens[$next_token])
+  {
+    $page['section'] = 'list';
+    $next_token++;
+
+    $page['list'] = array();
+
+    // No pictures
+    if (empty($tokens[$next_token]))
+    {
+      // Add dummy element list
+      array_push($page['list'], -1);
+    }
+    // With pictures list
+    else
+    {
+      if (!preg_match('/^\d+(,\d+)*$/', $tokens[$next_token]))
+      {
+        bad_request('wrong format on list GET parameter');
+      }
+      foreach (explode(',', $tokens[$next_token]) as $image_id)
+      {
+        array_push($page['list'], $image_id);
+      }
+    }
+    $next_token++;
+  }
+  return $page;
+}
+
+/**
+ * the reverse of add_well_known_params_in_url
+ * parses start, flat and chronology from url tokens
+*/
+function parse_well_known_params_url($tokens, &$i)
+{
+  $page = array();
+  while (isset($tokens[$i]))
+  {
+    if ( 'flat' == $tokens[$i] )
+    {
+      // indicate a special list of images
+      $page['flat'] = true;
+    }
+    elseif (strpos($tokens[$i], 'created-')===0 or strpos($tokens[$i], 'posted-')===0)
+    {
+      $chronology_tokens = explode('-', $tokens[$i] );
+
+      $page['chronology_field'] = $chronology_tokens[0];
+
+      array_shift($chronology_tokens);
+      $page['chronology_style'] = $chronology_tokens[0];
+
+      array_shift($chronology_tokens);
+      if ( count($chronology_tokens)>0 )
+      {
+        if ('list'==$chronology_tokens[0] or
+            'calendar'==$chronology_tokens[0])
+        {
+          $page['chronology_view'] = $chronology_tokens[0];
+          array_shift($chronology_tokens);
+        }
+        $page['chronology_date'] = $chronology_tokens;
+      }
+    }
+    elseif (preg_match('/^start-(\d+)/', $tokens[$i], $matches))
+    {
+      $page['start'] = $matches[1];
+    }
+    $i++;
+  }
+  return $page;
+}
+
+
+/**
+ * @param id image id
+ * @param what_part string one of 'e' (element), 'r' (representative)
+ */
+function get_action_url($id, $what_part, $download)
+{
+  $params = array(
+        'id' => $id,
+        'part' => $what_part,
+      );
+  if ($download)
+  {
+    $params['download'] = null;
+  }
+  
+  return add_url_params(get_root_url().'action.php', $params);
+}
+
+/*
+ * @param element_info array containing element information from db;
+ * at least 'id', 'path' should be present
+ */
+function get_element_url($element_info)
+{
+  $url = $element_info['path'];
+  if ( !url_is_remote($url) )
+  {
+    $url = embellish_url(get_root_url().$url);
+  }
+  return $url;
+}
+
+
+/**
+ * Indicate to build url with full path
+ *
+ * @param null
+ * @return null
+ */
+function set_make_full_url()
+{
+  global $page;
+
+  if (!isset($page['save_root_path']))
+  {
+    if (isset($page['root_path']))
+    {
+      $page['save_root_path']['path'] = $page['root_path'];
+    }
+    $page['save_root_path']['count'] = 1;
+    $page['root_path'] = get_absolute_root_url();
+  }
+  else
+  {
+    $page['save_root_path']['count'] += 1;
+  }
+}
+
+/**
+ * Restore old parameter to build url with full path
+ *
+ * @param null
+ * @return null
+ */
+function unset_make_full_url()
+{
+  global $page;
+
+  if (isset($page['save_root_path']))
+  {
+    if ($page['save_root_path']['count'] == 1)
+    {
+      if (isset($page['save_root_path']['path']))
+      {
+        $page['root_path'] = $page['save_root_path']['path'];
+      }
+      else
+      {
+        unset($page['root_path']);
+      }
+      unset($page['save_root_path']);
+    }
+    else
+    {
+      $page['save_root_path']['count'] -= 1;
+    }
+  }
+}
+
+/**
+ * Embellish the url argument
+ *
+ * @param $url
+ * @return $url embellished
+ */
+function embellish_url($url)
+{
+  $url = str_replace('/./', '/', $url);
+  while ( ($dotdot = strpos($url, '/../', 1) ) !== false )
+  {
+    $before = strrpos($url, '/', -(strlen($url)-$dotdot+1) );
+    if ($before !== false)
+    {
+      $url = substr_replace($url, '', $before, $dotdot-$before+3);
+    }
+    else
+      break;
+  }
+  return $url;
+}
+
+/**
+ * Returns the 'home page' of this gallery
+ */
+function get_gallery_home_url()
+{
+  global $conf;
+  if (!empty($conf['gallery_url']))
+  {
+    if (url_is_remote($conf['gallery_url']) or $conf['gallery_url'][0]=='/' )
+    {
+      return $conf['gallery_url'];
+    }
+    return get_root_url().$conf['gallery_url'];
+  }
+  else
+  {
+    return make_index_url();
+  }
+}
+?>
Index: tags/2.4.0RC3/include/functions_user.inc.php
===================================================================
--- tags/2.4.0RC3/include/functions_user.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/functions_user.inc.php	(revision 14585)
@@ -0,0 +1,1482 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// validate_mail_address:
+//   o verifies whether the given mail address has the
+//     right format. ie someone@domain.com "someone" can contain ".", "-" or
+//     even "_". Exactly as "domain". The extension doesn't have to be
+//     "com". The mail address can also be empty.
+//   o check if address could be empty
+//   o check if address is not used by a other user
+// If the mail address doesn't correspond, an error message is returned.
+//
+function validate_mail_address($user_id, $mail_address)
+{
+  global $conf;
+
+  if (empty($mail_address) and
+      !($conf['obligatory_user_mail_address'] and
+      in_array(script_basename(), array('register', 'profile'))))
+  {
+    return '';
+  }
+
+  $atom   = '[-a-z0-9!#$%&\'*+\\/=?^_`{|}~]';   // before  arobase
+  $domain = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)'; // domain name
+  $regex = '/^' . $atom . '+' . '(\.' . $atom . '+)*' . '@' . '(' . $domain . '{1,63}\.)+' . $domain . '{2,63}$/i';
+
+  if ( !preg_match( $regex, $mail_address ) )
+  {
+    return l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)');
+  }
+
+  if (defined("PHPWG_INSTALLED") and !empty($mail_address))
+  {
+    $query = '
+select count(*)
+from '.USERS_TABLE.'
+where upper('.$conf['user_fields']['email'].') = upper(\''.$mail_address.'\')
+'.(is_numeric($user_id) ? 'and '.$conf['user_fields']['id'].' != \''.$user_id.'\'' : '').'
+;';
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    if ($count != 0)
+    {
+      return l10n('this email address is already in use');
+    }
+  }
+}
+
+// validate_login_case:
+//   o check if login is not used by a other user
+// If the login doesn't correspond, an error message is returned.
+//
+function validate_login_case($login)
+{
+  global $conf;
+
+  if (defined("PHPWG_INSTALLED"))
+  {
+    $query = "
+SELECT ".$conf['user_fields']['username']."
+FROM ".USERS_TABLE."
+WHERE LOWER(".stripslashes($conf['user_fields']['username']).") = '".strtolower($login)."'
+;";
+
+    $count = pwg_db_num_rows(pwg_query($query));
+
+    if ($count > 0)
+    {
+      return l10n('this login is already used');
+    }
+  }
+}
+/**
+ * For test on username case sensitivity
+ *
+ * @param : $username typed in by user for identification
+ *
+ * @return : $username found in database
+ *
+ */
+function search_case_username($username)
+{
+  global $conf;
+
+  $username_lo = strtolower($username);
+
+  $SCU_users = array();
+
+  $q = pwg_query("
+    SELECT ".$conf['user_fields']['username']." AS username
+    FROM `".USERS_TABLE."`;
+  ");
+  while ($r = pwg_db_fetch_assoc($q))
+   $SCU_users[$r['username']] = strtolower($r['username']);
+   // $SCU_users is now an associative table where the key is the account as
+   // registered in the DB, and the value is this same account, in lower case
+
+  $users_found = array_keys($SCU_users, $username_lo);
+  // $users_found is now a table of which the values are all the accounts
+  // which can be written in lowercase the same way as $username
+  if (count($users_found) != 1) // If ambiguous, don't allow lowercase writing
+   return $username; // but normal writing will work
+  else
+   return $users_found[0];
+}
+function register_user($login, $password, $mail_address,
+  $with_notification = true, $errors = array())
+{
+  global $conf;
+
+  if ($login == '')
+  {
+    $errors[] = l10n('Please, enter a login');
+  }
+  if (preg_match('/^.* $/', $login))
+  {
+    $errors[] = l10n('login mustn\'t end with a space character');
+  }
+  if (preg_match('/^ .*$/', $login))
+  {
+    $errors[] = l10n('login mustn\'t start with a space character');
+  }
+  if (get_userid($login))
+  {
+    $errors[] = l10n('this login is already used');
+  }
+  if ($login != strip_tags($login))
+  {
+    $errors[] = l10n('html tags are not allowed in login');
+  }
+  $mail_error = validate_mail_address(null, $mail_address);
+  if ('' != $mail_error)
+  {
+    $errors[] = $mail_error;
+  }
+
+  if ($conf['insensitive_case_logon'] == true)
+  {
+    $login_error = validate_login_case($login);
+    if ($login_error != '')
+    {
+      $errors[] = $login_error;
+    }
+  }
+
+  $errors = trigger_event('register_user_check',
+              $errors,
+              array(
+                'username'=>$login,
+                'password'=>$password,
+                'email'=>$mail_address,
+              )
+            );
+
+  // if no error until here, registration of the user
+  if (count($errors) == 0)
+  {
+    // what will be the inserted id ?
+    $query = '
+SELECT MAX('.$conf['user_fields']['id'].') + 1
+  FROM '.USERS_TABLE.'
+;';
+    list($next_id) = pwg_db_fetch_row(pwg_query($query));
+
+    $insert =
+      array(
+        $conf['user_fields']['id'] => $next_id,
+        $conf['user_fields']['username'] => pwg_db_real_escape_string($login),
+        $conf['user_fields']['password'] => $conf['pass_convert']($password),
+        $conf['user_fields']['email'] => $mail_address
+        );
+
+    mass_inserts(USERS_TABLE, array_keys($insert), array($insert));
+
+    // Assign by default groups
+    {
+      $query = '
+SELECT id
+  FROM '.GROUPS_TABLE.'
+  WHERE is_default = \''.boolean_to_string(true).'\'
+  ORDER BY id ASC
+;';
+      $result = pwg_query($query);
+
+      $inserts = array();
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+          $inserts[] = array(
+            'user_id' => $next_id,
+            'group_id' => $row['id']
+          );
+      }
+    }
+
+    if (count($inserts) != 0)
+    {
+      mass_inserts(USER_GROUP_TABLE, array('user_id', 'group_id'), $inserts);
+    }
+
+    $override = null;
+    if ($with_notification and $conf['browser_language'])
+    {
+      if ( !get_browser_language($override['language']) )
+        $override=null;
+    }
+    create_user_infos($next_id, $override);
+
+    if ($with_notification and $conf['email_admin_on_new_user'])
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+      $admin_url = get_absolute_root_url()
+                   .'admin.php?page=user_list&username='.$login;
+
+      $keyargs_content = array
+      (
+        get_l10n_args('User: %s', stripslashes($login)),
+        get_l10n_args('Email: %s', $_POST['mail_address']),
+        get_l10n_args('', ''),
+        get_l10n_args('Admin: %s', $admin_url)
+      );
+
+      pwg_mail_notification_admins
+      (
+        get_l10n_args('Registration of %s', stripslashes($login)),
+        $keyargs_content
+      );
+    }
+
+    trigger_action('register_user',
+      array(
+        'id'=>$next_id,
+        'username'=>$login,
+        'email'=>$mail_address,
+       )
+      );
+  }
+
+  return $errors;
+}
+
+function build_user( $user_id, $use_cache )
+{
+  global $conf;
+
+  $user['id'] = $user_id;
+  $user = array_merge( $user, getuserdata($user_id, $use_cache) );
+
+  if ($user['id'] == $conf['guest_id'] and $user['status'] <> 'guest')
+  {
+    $user['status'] = 'guest';
+    $user['internal_status']['guest_must_be_guest'] = true;
+  }
+
+  // Check user theme
+  if (!isset($user['theme_name']))
+  {
+    $user['theme'] = get_default_theme();
+  }
+
+  return $user;
+}
+
+/**
+ * find informations related to the user identifier
+ *
+ * @param int user identifier
+ * @param boolean use_cache
+ * @param array
+ */
+function getuserdata($user_id, $use_cache)
+{
+  global $conf;
+
+  $userdata = array();
+
+  // retrieve basic user data
+  $query = '
+SELECT ';
+  $is_first = true;
+  foreach ($conf['user_fields'] as $pwgfield => $dbfield)
+  {
+    if ($is_first)
+    {
+      $is_first = false;
+    }
+    else
+    {
+      $query.= '
+     , ';
+    }
+    $query.= $dbfield.' AS '.$pwgfield;
+  }
+  $query.= '
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['id'].' = \''.$user_id.'\'';
+
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+
+  // retrieve additional user data ?
+  if ($conf['external_authentification'])
+  {
+    $query = '
+SELECT
+    COUNT(1) AS counter
+  FROM '.USER_INFOS_TABLE.' AS ui
+    LEFT JOIN '.USER_CACHE_TABLE.' AS uc ON ui.user_id = uc.user_id
+    LEFT JOIN '.THEMES_TABLE.' AS t ON t.id = ui.theme
+  WHERE ui.user_id = '.$user_id.'
+  GROUP BY ui.user_id
+;';
+    list($counter) = pwg_db_fetch_row(pwg_query($query));
+    if ($counter != 1)
+    {
+      create_user_infos($user_id);
+    }
+  }
+
+  // retrieve user info
+  $query = '
+SELECT
+    ui.*,
+    uc.*,
+    t.name AS theme_name
+  FROM '.USER_INFOS_TABLE.' AS ui
+    LEFT JOIN '.USER_CACHE_TABLE.' AS uc ON ui.user_id = uc.user_id
+    LEFT JOIN '.THEMES_TABLE.' AS t ON t.id = ui.theme
+  WHERE ui.user_id = '.$user_id.'
+;';
+
+  $result = pwg_query($query);
+  $user_infos_row = pwg_db_fetch_assoc($result);
+
+  // then merge basic + additional user data
+  $row = array_merge($row, $user_infos_row);
+
+  foreach ($row as $key => $value)
+  {
+    if (!is_numeric($key))
+    {
+      // If the field is true or false, the variable is transformed into a
+      // boolean value.
+      if ($value == 'true' or $value == 'false')
+      {
+        $userdata[$key] = get_boolean($value);
+      }
+      else
+      {
+        $userdata[$key] = $value;
+      }
+    }
+  }
+
+  if ($use_cache)
+  {
+    if (!isset($userdata['need_update'])
+        or !is_bool($userdata['need_update'])
+        or $userdata['need_update'] == true)
+    {
+      $userdata['cache_update_time'] = time();
+
+      // Set need update are done
+      $userdata['need_update'] = false;
+
+      $userdata['forbidden_categories'] =
+        calculate_permissions($userdata['id'], $userdata['status']);
+
+      /* now we build the list of forbidden images (this list does not contain
+      images that are not in at least an authorized category)*/
+      $query = '
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
+  WHERE category_id NOT IN ('.$userdata['forbidden_categories'].')
+    AND level>'.$userdata['level'];
+      $forbidden_ids = array_from_query($query, 'id');
+
+      if ( empty($forbidden_ids) )
+      {
+        $forbidden_ids[] = 0;
+      }
+      $userdata['image_access_type'] = 'NOT IN'; //TODO maybe later
+      $userdata['image_access_list'] = implode(',',$forbidden_ids);
+
+
+      $query = '
+SELECT COUNT(DISTINCT(image_id)) as total
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id NOT IN ('.$userdata['forbidden_categories'].')
+    AND image_id '.$userdata['image_access_type'].' ('.$userdata['image_access_list'].')';
+      list($userdata['nb_total_images']) = pwg_db_fetch_row(pwg_query($query));
+
+
+      // now we update user cache categories
+      $user_cache_cats = get_computed_categories($userdata, null);
+      if ( !is_admin($userdata['status']) )
+      { // for non admins we forbid categories with no image (feature 1053)
+        $forbidden_ids = array();
+        foreach ($user_cache_cats as $cat)
+        {
+          if ($cat['count_images']==0)
+          {
+            $forbidden_ids[] = $cat['cat_id'];
+            unset( $user_cache_cats[$cat['cat_id']] );
+          }
+        }
+        if ( !empty($forbidden_ids) )
+        {
+          if ( empty($userdata['forbidden_categories']) )
+          {
+            $userdata['forbidden_categories'] = implode(',', $forbidden_ids);
+          }
+          else
+          {
+            $userdata['forbidden_categories'] .= ','.implode(',', $forbidden_ids);
+          }
+        }
+      }
+
+      // delete user cache
+      $query = '
+DELETE FROM '.USER_CACHE_CATEGORIES_TABLE.'
+  WHERE user_id = '.$userdata['id'];
+      pwg_query($query);
+
+      // Due to concurrency issues, we ask MySQL to ignore errors on
+      // insert. This may happen when cache needs refresh and that Piwigo is
+      // called "very simultaneously".
+      mass_inserts
+      (
+        USER_CACHE_CATEGORIES_TABLE,
+        array
+        (
+          'user_id', 'cat_id',
+          'date_last', 'max_date_last', 'nb_images', 'count_images', 'count_categories'
+        ),
+        $user_cache_cats,
+        array('ignore' => true)
+      );
+
+
+      // update user cache
+      $query = '
+DELETE FROM '.USER_CACHE_TABLE.'
+  WHERE user_id = '.$userdata['id'];
+      pwg_query($query);
+
+      // for the same reason as user_cache_categories, we ignore error on
+      // this insert
+      $query = '
+INSERT IGNORE INTO '.USER_CACHE_TABLE.'
+  (user_id, need_update, cache_update_time, forbidden_categories, nb_total_images,
+    image_access_type, image_access_list)
+  VALUES
+  ('.$userdata['id'].',\''.boolean_to_string($userdata['need_update']).'\','
+  .$userdata['cache_update_time'].',\''
+  .$userdata['forbidden_categories'].'\','.$userdata['nb_total_images'].',\''
+  .$userdata['image_access_type'].'\',\''.$userdata['image_access_list'].'\')';
+      pwg_query($query);
+    }
+  }
+
+  return $userdata;
+}
+
+/*
+ * deletes favorites of the current user if he's not allowed to see them
+ *
+ * @return void
+ */
+function check_user_favorites()
+{
+  global $user;
+
+  if ($user['forbidden_categories'] == '')
+  {
+    return;
+  }
+
+  // $filter['visible_categories'] and $filter['visible_images']
+  // must be not used because filter <> restriction
+  // retrieving images allowed : belonging to at least one authorized
+  // category
+  $query = '
+SELECT DISTINCT f.image_id
+  FROM '.FAVORITES_TABLE.' AS f INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic
+    ON f.image_id = ic.image_id
+  WHERE f.user_id = '.$user['id'].'
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'ic.category_id',
+      ),
+    'AND'
+  ).'
+;';
+  $authorizeds = array_from_query($query, 'image_id');
+
+  $query = '
+SELECT image_id
+  FROM '.FAVORITES_TABLE.'
+  WHERE user_id = '.$user['id'].'
+;';
+  $favorites = array_from_query($query, 'image_id');
+
+  $to_deletes = array_diff($favorites, $authorizeds);
+  if (count($to_deletes) > 0)
+  {
+    $query = '
+DELETE FROM '.FAVORITES_TABLE.'
+  WHERE image_id IN ('.implode(',', $to_deletes).')
+    AND user_id = '.$user['id'].'
+;';
+    pwg_query($query);
+  }
+}
+
+/**
+ * calculates the list of forbidden categories for a given user
+ *
+ * Calculation is based on private categories minus categories authorized to
+ * the groups the user belongs to minus the categories directly authorized
+ * to the user. The list contains at least -1 to be compliant with queries
+ * such as "WHERE category_id NOT IN ($forbidden_categories)"
+ *
+ * @param int user_id
+ * @param string user_status
+ * @return string forbidden_categories
+ */
+function calculate_permissions($user_id, $user_status)
+{
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'private\'
+;';
+  $private_array = array_from_query($query, 'id');
+
+  // retrieve category ids directly authorized to the user
+  $query = '
+SELECT cat_id
+  FROM '.USER_ACCESS_TABLE.'
+  WHERE user_id = '.$user_id.'
+;';
+  $authorized_array = array_from_query($query, 'cat_id');
+
+  // retrieve category ids authorized to the groups the user belongs to
+  $query = '
+SELECT cat_id
+  FROM '.USER_GROUP_TABLE.' AS ug INNER JOIN '.GROUP_ACCESS_TABLE.' AS ga
+    ON ug.group_id = ga.group_id
+  WHERE ug.user_id = '.$user_id.'
+;';
+  $authorized_array =
+    array_merge(
+      $authorized_array,
+      array_from_query($query, 'cat_id')
+      );
+
+  // uniquify ids : some private categories might be authorized for the
+  // groups and for the user
+  $authorized_array = array_unique($authorized_array);
+
+  // only unauthorized private categories are forbidden
+  $forbidden_array = array_diff($private_array, $authorized_array);
+
+  // if user is not an admin, locked categories are forbidden
+  if (!is_admin($user_status))
+  {
+    $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE visible = \'false\'
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $forbidden_array[] = $row['id'];
+    }
+    $forbidden_array = array_unique($forbidden_array);
+  }
+
+  if ( empty($forbidden_array) )
+  {// at least, the list contains 0 value. This category does not exists so
+   // where clauses such as "WHERE category_id NOT IN(0)" will always be
+   // true.
+    $forbidden_array[] = 0;
+  }
+
+  return implode(',', $forbidden_array);
+}
+
+/**
+ * compute data of categories branches (one branch only)
+ */
+function compute_branch_cat_data(&$cats, &$list_cat_id, &$level, &$ref_level)
+{
+  $date = '';
+  $count_images = 0;
+  $count_categories = 0;
+  do
+  {
+    $cat_id = array_pop($list_cat_id);
+    if (!is_null($cat_id))
+    {
+      // Count images and categories
+      $cats[$cat_id]['count_images'] += $count_images;
+      $cats[$cat_id]['count_categories'] += $count_categories;
+      $count_images = $cats[$cat_id]['count_images'];
+      $count_categories = $cats[$cat_id]['count_categories'] + 1;
+
+      if ((empty($cats[$cat_id]['max_date_last'])) or ($cats[$cat_id]['max_date_last'] < $date))
+      {
+        $cats[$cat_id]['max_date_last'] = $date;
+      }
+      else
+      {
+        $date = $cats[$cat_id]['max_date_last'];
+      }
+      $ref_level = substr_count($cats[$cat_id]['global_rank'], '.') + 1;
+    }
+    else
+    {
+      $ref_level = 0;
+    }
+  } while ($level <= $ref_level);
+
+  // Last cat updating must be added to list for next branch
+  if ($ref_level <> 0)
+  {
+    array_push($list_cat_id, $cat_id);
+  }
+}
+
+/**
+ * compute data of categories branches
+ */
+function compute_categories_data(&$cats)
+{
+  $ref_level = 0;
+  $level = 0;
+  $list_cat_id = array();
+
+  foreach ($cats as $id => $category)
+  {
+    // Compute
+    $level = substr_count($category['global_rank'], '.') + 1;
+    if ($level > $ref_level)
+    {
+      array_push($list_cat_id, $id);
+    }
+    else
+    {
+      compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level);
+      array_push($list_cat_id, $id);
+    }
+    $ref_level = $level;
+  }
+
+  $level = 1;
+  compute_branch_cat_data($cats, $list_cat_id, $level, $ref_level);
+}
+
+/**
+ * get computed array of categories
+ *
+ * @param array userdata
+ * @param int filter_days number of recent days to filter on or null
+ * @return array
+ */
+function get_computed_categories($userdata, $filter_days=null)
+{
+  $query = 'SELECT c.id AS cat_id, global_rank';
+  // Count by date_available to avoid count null
+  $query .= ',
+  MAX(date_available) AS date_last, COUNT(date_available) AS nb_images
+FROM '.CATEGORIES_TABLE.' as c
+  LEFT JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON ic.category_id = c.id
+  LEFT JOIN '.IMAGES_TABLE.' AS i
+    ON ic.image_id = i.id
+      AND i.level<='.$userdata['level'];
+
+  if ( isset($filter_days) )
+  {
+    $query .= ' AND i.date_available > '.pwg_db_get_recent_period_expression($filter_days);
+  }
+
+  if ( !empty($userdata['forbidden_categories']) )
+  {
+    $query.= '
+  WHERE c.id NOT IN ('.$userdata['forbidden_categories'].')';
+  }
+
+  $query.= '
+  GROUP BY c.id, c.global_rank';
+
+  $result = pwg_query($query);
+
+  $cats = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $row['user_id'] = $userdata['id'];
+    $row['count_categories'] = 0;
+    $row['count_images'] = (int)$row['nb_images'];
+    $row['max_date_last'] = $row['date_last'];
+
+    $cats += array($row['cat_id'] => $row);
+  }
+  uasort($cats, 'global_rank_compare');
+
+  compute_categories_data($cats);
+
+  if ( isset($filter_days) )
+  {
+    $cat_tmp = $cats;
+    $cats = array();
+
+    foreach ($cat_tmp as $category)
+    {
+      if (!empty($category['max_date_last']))
+      {
+        // Re-init counters
+        $category['count_categories'] = 0;
+        $category['count_images'] = (int)$category['nb_images'];
+        // Keep category
+        $cats[$category['cat_id']] = $category;
+      }
+    }
+    // Compute a second time
+    compute_categories_data($cats);
+  }
+  return $cats;
+}
+
+/**
+ * returns user identifier thanks to his name, false if not found
+ *
+ * @param string username
+ * @param int user identifier
+ */
+function get_userid($username)
+{
+  global $conf;
+
+  $username = pwg_db_real_escape_string($username);
+
+  $query = '
+SELECT '.$conf['user_fields']['id'].'
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['username'].' = \''.$username.'\'
+;';
+  $result = pwg_query($query);
+
+  if (pwg_db_num_rows($result) == 0)
+  {
+    return false;
+  }
+  else
+  {
+    list($user_id) = pwg_db_fetch_row($result);
+    return $user_id;
+  }
+}
+
+function get_userid_by_email($email)
+{
+  global $conf;
+
+  $email = pwg_db_real_escape_string($email);
+
+  $query = '
+SELECT
+    '.$conf['user_fields']['id'].'
+  FROM '.USERS_TABLE.'
+  WHERE UPPER('.$conf['user_fields']['email'].') = UPPER(\''.$email.'\')
+;';
+  $result = pwg_query($query);
+
+  if (pwg_db_num_rows($result) == 0)
+  {
+    return false;
+  }
+  else
+  {
+    list($user_id) = pwg_db_fetch_row($result);
+    return $user_id;
+  }
+}
+
+/*
+ * Returns a array with default user value
+ *
+ * @param convert_str allows to convert string value if necessary
+ */
+function get_default_user_info($convert_str = true)
+{
+  global $cache, $conf;
+
+  if (!isset($cache['default_user']))
+  {
+    $query = 'SELECT * FROM '.USER_INFOS_TABLE.
+            ' WHERE user_id = '.$conf['default_user_id'].';';
+
+    $result = pwg_query($query);
+    $cache['default_user'] = pwg_db_fetch_assoc($result);
+
+    if ($cache['default_user'] !== false)
+    {
+      unset($cache['default_user']['user_id']);
+      unset($cache['default_user']['status']);
+      unset($cache['default_user']['registration_date']);
+    }
+  }
+
+  if (is_array($cache['default_user']) and $convert_str)
+  {
+    $default_user = array();
+    foreach ($cache['default_user'] as $name => $value)
+    {
+      // If the field is true or false, the variable is transformed into a
+      // boolean value.
+      if ($value == 'true' or $value == 'false')
+      {
+        $default_user[$name] = get_boolean($value);
+      }
+      else
+      {
+        $default_user[$name] = $value;
+      }
+    }
+    return $default_user;
+  }
+  else
+  {
+    return $cache['default_user'];
+  }
+}
+
+/*
+ * Returns a default user value
+ *
+ * @param value_name: name of value
+ * @param sos_value: value used if don't exist value
+ */
+function get_default_user_value($value_name, $sos_value)
+{
+  $default_user = get_default_user_info(true);
+  if ($default_user === false or empty($default_user[$value_name]))
+  {
+    return $sos_value;
+  }
+  else
+  {
+   return $default_user[$value_name];
+  }
+}
+
+/*
+ * Returns the default template value
+ *
+ */
+function get_default_theme()
+{
+  $theme = get_default_user_value('theme', PHPWG_DEFAULT_TEMPLATE);
+  if (check_theme_installed($theme))
+  {
+    return $theme;
+  }
+
+  // let's find the first available theme
+  $active_themes = get_pwg_themes();
+  foreach (array_keys(get_pwg_themes()) as $theme_id)
+  {
+    return $theme_id;
+  }
+}
+
+/*
+ * Returns the default language value
+ *
+ */
+function get_default_language()
+{
+  return get_default_user_value('language', PHPWG_DEFAULT_LANGUAGE);
+}
+
+/**
+  * Returns true if the browser language value is set into param $lang
+  *
+  */
+function get_browser_language(&$lang)
+{
+  $browser_language = substr(@$_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
+  foreach (get_languages() as $language_code => $language_name)
+  {
+    if (substr($language_code, 0, 2) == $browser_language)
+    {
+      $lang = $language_code;
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ * add user informations based on default values
+ *
+ * @param int user_id / array of user_if
+ * @param array of values used to override default user values
+ */
+function create_user_infos($arg_id, $override_values = null)
+{
+  global $conf;
+
+  if (is_array($arg_id))
+  {
+    $user_ids = $arg_id;
+  }
+  else
+  {
+    $user_ids = array();
+    if (is_numeric($arg_id))
+    {
+      $user_ids[] = $arg_id;
+    }
+  }
+
+  if (!empty($user_ids))
+  {
+    $inserts = array();
+    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+
+    $default_user = get_default_user_info(false);
+    if ($default_user === false)
+    {
+      // Default on structure are used
+      $default_user = array();
+    }
+
+    if (!is_null($override_values))
+    {
+      $default_user = array_merge($default_user, $override_values);
+    }
+
+    foreach ($user_ids as $user_id)
+    {
+      $level= isset($default_user['level']) ? $default_user['level'] : 0;
+      if ($user_id == $conf['webmaster_id'])
+      {
+        $status = 'webmaster';
+        $level = max( $conf['available_permission_levels'] );
+      }
+      else if (($user_id == $conf['guest_id']) or
+               ($user_id == $conf['default_user_id']))
+      {
+        $status = 'guest';
+      }
+      else
+      {
+        $status = 'normal';
+      }
+
+      $insert = array_merge(
+        $default_user,
+        array(
+          'user_id' => $user_id,
+          'status' => $status,
+          'registration_date' => $dbnow,
+          'level' => $level
+          ));
+
+      array_push($inserts, $insert);
+    }
+
+    mass_inserts(USER_INFOS_TABLE, array_keys($inserts[0]), $inserts);
+  }
+}
+
+/**
+ * returns the auto login key or false on error
+ * @param int user_id
+ * @param time_t time
+ * @param string [out] username
+*/
+function calculate_auto_login_key($user_id, $time, &$username)
+{
+  global $conf;
+  $query = '
+SELECT '.$conf['user_fields']['username'].' AS username
+  , '.$conf['user_fields']['password'].' AS password
+FROM '.USERS_TABLE.'
+WHERE '.$conf['user_fields']['id'].' = '.$user_id;
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) > 0)
+  {
+    $row = pwg_db_fetch_assoc($result);
+    $username = stripslashes($row['username']);
+    $data = $time.$user_id.$username;
+    $key = base64_encode( hash_hmac('sha1', $data, $conf['secret_key'].$row['password'],true) );
+    return $key;
+  }
+  return false;
+}
+
+/*
+ * Performs all required actions for user login
+ * @param int user_id
+ * @param bool remember_me
+ * @return void
+*/
+function log_user($user_id, $remember_me)
+{
+  global $conf, $user;
+
+  if ($remember_me and $conf['authorize_remembering'])
+  {
+    $now = time();
+    $key = calculate_auto_login_key($user_id, $now, $username);
+    if ($key!==false)
+    {
+      $cookie = $user_id.'-'.$now.'-'.$key;
+      if (version_compare(PHP_VERSION, '5.2', '>=') )
+      {
+        setcookie($conf['remember_me_name'],
+            $cookie,
+            time()+$conf['remember_me_length'],
+            cookie_path(),ini_get('session.cookie_domain'),ini_get('session.cookie_secure'),
+            ini_get('session.cookie_httponly')
+          );
+      }
+      else
+      {
+        setcookie($conf['remember_me_name'],
+            $cookie,
+            time()+$conf['remember_me_length'],
+            cookie_path(),ini_get('session.cookie_domain'),ini_get('session.cookie_secure')
+          );
+      }
+    }
+  }
+  else
+  { // make sure we clean any remember me ...
+    setcookie($conf['remember_me_name'], '', 0, cookie_path(),ini_get('session.cookie_domain'));
+  }
+  if ( session_id()!="" )
+  { // we regenerate the session for security reasons
+    // see http://www.acros.si/papers/session_fixation.pdf
+    session_regenerate_id(true);
+  }
+  else
+  {
+    session_start();
+  }
+  $_SESSION['pwg_uid'] = (int)$user_id;
+
+  $user['id'] = $_SESSION['pwg_uid'];
+}
+
+/*
+ * Performs auto-connexion when cookie remember_me exists
+ * @return true/false
+*/
+function auto_login() {
+  global $conf;
+
+  if ( isset( $_COOKIE[$conf['remember_me_name']] ) )
+  {
+    $cookie = explode('-', stripslashes($_COOKIE[$conf['remember_me_name']]));
+    if ( count($cookie)===3
+        and is_numeric(@$cookie[0]) /*user id*/
+        and is_numeric(@$cookie[1]) /*time*/
+        and time()-$conf['remember_me_length']<=@$cookie[1]
+        and time()>=@$cookie[1] /*cookie generated in the past*/ )
+    {
+      $key = calculate_auto_login_key( $cookie[0], $cookie[1], $username );
+      if ($key!==false and $key===$cookie[2])
+      {
+        log_user($cookie[0], true);
+        trigger_action('login_success', stripslashes($username));
+        return true;
+      }
+    }
+    setcookie($conf['remember_me_name'], '', 0, cookie_path(),ini_get('session.cookie_domain'));
+  }
+  return false;
+}
+
+/**
+ * Tries to login a user given username and password (must be MySql escaped)
+ * return true on success
+ */
+function try_log_user($username, $password, $remember_me)
+{
+  // we force the session table to be clean
+  pwg_session_gc();
+
+  global $conf;
+  // retrieving the encrypted password of the login submitted
+  $query = '
+SELECT '.$conf['user_fields']['id'].' AS id,
+       '.$conf['user_fields']['password'].' AS password
+  FROM '.USERS_TABLE.'
+  WHERE '.$conf['user_fields']['username'].' = \''.pwg_db_real_escape_string($username).'\'
+;';
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($row['password'] == $conf['pass_convert']($password))
+  {
+    log_user($row['id'], $remember_me);
+    trigger_action('login_success', stripslashes($username));
+    return true;
+  }
+  trigger_action('login_failure', stripslashes($username));
+  return false;
+}
+
+/** Performs all the cleanup on user logout */
+function logout_user()
+{
+  global $conf;
+  $_SESSION = array();
+  session_unset();
+  session_destroy();
+  setcookie(session_name(),'',0,
+      ini_get('session.cookie_path'),
+      ini_get('session.cookie_domain')
+    );
+  setcookie($conf['remember_me_name'], '', 0, cookie_path(),ini_get('session.cookie_domain'));
+}
+
+/*
+ * Return user status used in this library
+ * @return string
+*/
+function get_user_status($user_status)
+{
+  global $user;
+
+  if (empty($user_status))
+  {
+    if (isset($user['status']))
+    {
+      $user_status = $user['status'];
+    }
+    else
+    {
+      // swicth to default value
+      $user_status = '';
+    }
+  }
+  return $user_status;
+}
+
+/*
+ * Return access_type definition of user
+ * Test does with user status
+ * @return bool
+*/
+function get_access_type_status($user_status='')
+{
+  global $conf;
+
+  switch (get_user_status($user_status))
+  {
+    case 'guest':
+    {
+      $access_type_status =
+        ($conf['guest_access'] ? ACCESS_GUEST : ACCESS_FREE);
+      break;
+    }
+    case 'generic':
+    {
+      $access_type_status = ACCESS_GUEST;
+      break;
+    }
+    case 'normal':
+    {
+      $access_type_status = ACCESS_CLASSIC;
+      break;
+    }
+    case 'admin':
+    {
+      $access_type_status = ACCESS_ADMINISTRATOR;
+      break;
+    }
+    case 'webmaster':
+    {
+      $access_type_status = ACCESS_WEBMASTER;
+      break;
+    }
+    default:
+    {
+      $access_type_status = ACCESS_FREE;
+      break;
+    }
+  }
+
+  return $access_type_status;
+}
+
+/*
+ * Return if user have access to access_type definition
+ * Test does with user status
+ * @return bool
+*/
+function is_autorize_status($access_type, $user_status = '')
+{
+  return (get_access_type_status($user_status) >= $access_type);
+}
+
+/*
+ * Check if user have access to access_type definition
+ * Stop action if there are not access
+ * Test does with user status
+ * @return none
+*/
+function check_status($access_type, $user_status = '')
+{
+  if (!is_autorize_status($access_type, $user_status))
+  {
+    access_denied();
+  }
+}
+
+/*
+ * Return if user is generic
+ * @return bool
+*/
+ function is_generic($user_status = '')
+{
+  return get_user_status($user_status) == 'generic';
+}
+
+/*
+ * Return if user is only a guest
+ * @return bool
+*/
+ function is_a_guest($user_status = '')
+{
+  return get_user_status($user_status) == 'guest';
+}
+
+/*
+ * Return if user is, at least, a classic user
+ * @return bool
+*/
+ function is_classic_user($user_status = '')
+{
+  return is_autorize_status(ACCESS_CLASSIC, $user_status);
+}
+
+/*
+ * Return if user is, at least, an administrator
+ * @return bool
+*/
+ function is_admin($user_status = '')
+{
+  return is_autorize_status(ACCESS_ADMINISTRATOR, $user_status);
+}
+
+/*
+ * Return if user is, at least, a webmaster
+ * @return bool
+*/
+ function is_webmaster($user_status = '')
+{
+  return is_autorize_status(ACCESS_WEBMASTER, $user_status);
+}
+
+/*
+ * Adviser status is depreciated from piwigo 2.2
+ * @return false
+*/
+function is_adviser()
+{
+  // TODO for Piwigo 2.4 : trigger a warning. We don't do it on Piwigo 2.3
+  // to avoid changes for plugin contributors
+  // trigger_error('call to obsolete function is_adviser', E_USER_WARNING);
+  return false;
+}
+
+/*
+ * Return if current user can edit/delete/validate a comment
+ * @param action edit/delete/validate
+ * @return bool
+ */
+function can_manage_comment($action, $comment_author_id)
+{
+  global $user, $conf;
+
+  if (is_a_guest())
+  {
+    return false;
+  }
+
+  if (!in_array($action, array('delete','edit', 'validate')))
+  {
+    return false;
+  }
+
+  if (is_admin())
+  {
+    return true;
+  }
+
+  if ('edit' == $action and $conf['user_can_edit_comment'])
+  {
+    if ($comment_author_id == $user['id']) {
+      return true;
+    }
+  }
+
+  if ('delete' == $action and $conf['user_can_delete_comment'])
+  {
+    if ($comment_author_id == $user['id']) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+/*
+ * Return mail address as display text
+ * @return string
+*/
+function get_email_address_as_display_text($email_address)
+{
+  global $conf;
+
+  if (!isset($email_address) or (trim($email_address) == ''))
+  {
+    return '';
+  }
+  else
+  {
+    return $email_address;
+  }
+}
+
+/*
+ * Compute sql where condition with restrict and filter data. "FandF" means
+ * Forbidden and Filters.
+ *
+ * @param array condition_fields: read function body
+ * @param string prefix_condition: prefixes sql if condition is not empty
+ * @param boolean force_one_condition: use at least "1 = 1"
+ *
+ * @return string sql where/conditions
+ */
+function get_sql_condition_FandF(
+  $condition_fields,
+  $prefix_condition = null,
+  $force_one_condition = false
+  )
+{
+  global $user, $filter;
+
+  $sql_list = array();
+
+  foreach ($condition_fields as $condition => $field_name)
+  {
+    switch($condition)
+    {
+      case 'forbidden_categories':
+      {
+        if (!empty($user['forbidden_categories']))
+        {
+          $sql_list[] =
+            $field_name.' NOT IN ('.$user['forbidden_categories'].')';
+        }
+        break;
+      }
+      case 'visible_categories':
+      {
+        if (!empty($filter['visible_categories']))
+        {
+          $sql_list[] =
+            $field_name.' IN ('.$filter['visible_categories'].')';
+        }
+        break;
+      }
+      case 'visible_images':
+        if (!empty($filter['visible_images']))
+        {
+          $sql_list[] =
+            $field_name.' IN ('.$filter['visible_images'].')';
+        }
+        // note there is no break - visible include forbidden
+      case 'forbidden_images':
+        if (
+            !empty($user['image_access_list'])
+            or $user['image_access_type']!='NOT IN'
+            )
+        {
+          $table_prefix=null;
+          if ($field_name=='id')
+          {
+            $table_prefix = '';
+          }
+          elseif ($field_name=='i.id')
+          {
+            $table_prefix = 'i.';
+          }
+          if ( isset($table_prefix) )
+          {
+            $sql_list[]=$table_prefix.'level<='.$user['level'];
+          }
+          else
+          {
+            $sql_list[]=$field_name.' '.$user['image_access_type']
+                .' ('.$user['image_access_list'].')';
+          }
+        }
+        break;
+      default:
+      {
+        die('Unknow condition');
+        break;
+      }
+    }
+  }
+
+  if (count($sql_list) > 0)
+  {
+    $sql = '('.implode(' AND ', $sql_list).')';
+  }
+  else
+  {
+    $sql = $force_one_condition ? '1 = 1' : '';
+  }
+
+  if (isset($prefix_condition) and !empty($sql))
+  {
+    $sql = $prefix_condition.' '.$sql;
+  }
+
+  return $sql;
+}
+
+/**
+ * search an available activation_key
+ *
+ * @return string
+ */
+function get_user_activation_key()
+{
+  while (true)
+  {
+    $key = generate_key(20);
+    $query = '
+SELECT COUNT(*)
+  FROM '.USER_INFOS_TABLE.'
+  WHERE activation_key = \''.$key.'\'
+;';
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    if (0 == $count)
+    {
+      return $key;
+    }
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/index.php
===================================================================
--- tags/2.4.0RC3/include/index.php	(revision 14585)
+++ tags/2.4.0RC3/include/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/include/jsmin.class.php
===================================================================
--- tags/2.4.0RC3/include/jsmin.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/jsmin.class.php	(revision 14585)
@@ -0,0 +1,291 @@
+<?php
+/**
+ * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
+ *
+ * This is pretty much a direct port of jsmin.c to PHP with just a few
+ * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and
+ * outputs to stdout, this library accepts a string as input and returns another
+ * string as output.
+ *
+ * PHP 5 or higher is required.
+ *
+ * Permission is hereby granted to use this version of the library under the
+ * same terms as jsmin.c, which has the following license:
+ *
+ * --
+ * Copyright (c) 2002 Douglas Crockford  (www.crockford.com)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * The Software shall be used for Good, not Evil.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ * --
+ *
+ * @package JSMin
+ * @author Ryan Grove <ryan@wonko.com>
+ * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)
+ * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)
+ * @license http://opensource.org/licenses/mit-license.php MIT License
+ * @version 1.1.1 (2008-03-02)
+ * @link http://code.google.com/p/jsmin-php/
+ */
+
+class JSMin {
+  const ORD_LF    = 10;
+  const ORD_SPACE = 32;
+
+  protected $a           = '';
+  protected $b           = '';
+  protected $input       = '';
+  protected $inputIndex  = 0;
+  protected $inputLength = 0;
+  protected $lookAhead   = null;
+  protected $output      = '';
+
+  // -- Public Static Methods --------------------------------------------------
+
+  public static function minify($js) {
+    $jsmin = new JSMin($js);
+    return $jsmin->min();
+  }
+
+  // -- Public Instance Methods ------------------------------------------------
+
+  public function __construct($input) {
+    $this->input       = str_replace("\r\n", "\n", $input);
+    $this->inputLength = strlen($this->input);
+  }
+
+  // -- Protected Instance Methods ---------------------------------------------
+
+  protected function action($d) {
+    switch($d) {
+      case 1:
+        $this->output .= $this->a;
+
+      case 2:
+        $this->a = $this->b;
+
+        if ($this->a === "'" || $this->a === '"') {
+          for (;;) {
+            $this->output .= $this->a;
+            $this->a       = $this->get();
+
+            if ($this->a === $this->b) {
+              break;
+            }
+
+            if (ord($this->a) <= self::ORD_LF) {
+              throw new JSMinException('Unterminated string literal.');
+            }
+
+            if ($this->a === '\\') {
+              $this->output .= $this->a;
+              $this->a       = $this->get();
+            }
+          }
+        }
+
+      case 3:
+        $this->b = $this->next();
+
+        if ($this->b === '/' && (
+            $this->a === '(' || $this->a === ',' || $this->a === '=' ||
+            $this->a === ':' || $this->a === '[' || $this->a === '!' ||
+            $this->a === '&' || $this->a === '|' || $this->a === '?')) {
+
+          $this->output .= $this->a . $this->b;
+
+          for (;;) {
+            $this->a = $this->get();
+
+            if ($this->a === '/') {
+              break;
+            } elseif ($this->a === '\\') {
+              $this->output .= $this->a;
+              $this->a       = $this->get();
+            } elseif (ord($this->a) <= self::ORD_LF) {
+              throw new JSMinException('Unterminated regular expression '.
+                  'literal.');
+            }
+
+            $this->output .= $this->a;
+          }
+
+          $this->b = $this->next();
+        }
+    }
+  }
+
+  protected function get() {
+    $c = $this->lookAhead;
+    $this->lookAhead = null;
+
+    if ($c === null) {
+      if ($this->inputIndex < $this->inputLength) {
+        $c = substr($this->input, $this->inputIndex, 1);
+        $this->inputIndex += 1;
+      } else {
+        $c = null;
+      }
+    }
+
+    if ($c === "\r") {
+      return "\n";
+    }
+
+    if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
+      return $c;
+    }
+
+    return ' ';
+  }
+
+  protected function isAlphaNum($c) {
+    return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1;
+  }
+
+  protected function min() {
+    $this->a = "\n";
+    $this->action(3);
+
+    while ($this->a !== null) {
+      switch ($this->a) {
+        case ' ':
+          if ($this->isAlphaNum($this->b)) {
+            $this->action(1);
+          } else {
+            $this->action(2);
+          }
+          break;
+
+        case "\n":
+          switch ($this->b) {
+            case '{':
+            case '[':
+            case '(':
+            case '+':
+            case '-':
+              $this->action(1);
+              break;
+
+            case ' ':
+              $this->action(3);
+              break;
+
+            default:
+              if ($this->isAlphaNum($this->b)) {
+                $this->action(1);
+              }
+              else {
+                $this->action(2);
+              }
+          }
+          break;
+
+        default:
+          switch ($this->b) {
+            case ' ':
+              if ($this->isAlphaNum($this->a)) {
+                $this->action(1);
+                break;
+              }
+
+              $this->action(3);
+              break;
+
+            case "\n":
+              switch ($this->a) {
+                case '}':
+                case ']':
+                case ')':
+                case '+':
+                case '-':
+                case '"':
+                case "'":
+                  $this->action(1);
+                  break;
+
+                default:
+                  if ($this->isAlphaNum($this->a)) {
+                    $this->action(1);
+                  }
+                  else {
+                    $this->action(3);
+                  }
+              }
+              break;
+
+            default:
+              $this->action(1);
+              break;
+          }
+      }
+    }
+
+    return $this->output;
+  }
+
+  protected function next() {
+    $c = $this->get();
+
+    if ($c === '/') {
+      switch($this->peek()) {
+        case '/':
+          for (;;) {
+            $c = $this->get();
+
+            if (ord($c) <= self::ORD_LF) {
+              return $c;
+            }
+          }
+
+        case '*':
+          $this->get();
+
+          for (;;) {
+            switch($this->get()) {
+              case '*':
+                if ($this->peek() === '/') {
+                  $this->get();
+                  return ' ';
+                }
+                break;
+
+              case null:
+                throw new JSMinException('Unterminated comment.');
+            }
+          }
+
+        default:
+          return $c;
+      }
+    }
+
+    return $c;
+  }
+
+  protected function peek() {
+    $this->lookAhead = $this->get();
+    return $this->lookAhead;
+  }
+}
+
+// -- Exceptions ---------------------------------------------------------------
+class JSMinException extends Exception {}
+?>
Index: tags/2.4.0RC3/include/mdetect.php
===================================================================
--- tags/2.4.0RC3/include/mdetect.php	(revision 14585)
+++ tags/2.4.0RC3/include/mdetect.php	(revision 14585)
@@ -0,0 +1,1000 @@
+<?php
+
+/* *******************************************
+// Copyright 2010-2012, Anthony Hand
+//
+// File version date: January 21, 2012
+//              Update: 
+//              - Added the constructor method per new features in PHP 5.0: __construct(). 
+//              - Moved Windows Phone 7 to the iPhone Tier. WP7.5's IE 9-based browser is good enough now.  
+//              - Added a new variable for 2 versions of the new BlackBerry Bold Touch (9900 and 9930): deviceBBBoldTouch. 
+//              - Updated DetectBlackBerryTouch() to support the 2 versions of the new BlackBerry Bold Touch (9900 and 9930). 
+//              - Updated DetectKindle() to focus on eInk devices only. The Kindle Fire should be detected as a regular Android device.
+//
+// File version date: August 22, 2011
+//              Update: 
+//              - Updated DetectAndroidTablet() to fix a bug introduced in the last fix! The true/false returns were mixed up. 
+//
+// File version date: August 16, 2011
+//              Update: 
+//              - Updated DetectAndroidTablet() to exclude Opera Mini, which was falsely reporting as running on a tablet device when on a phone.
+//
+// File version date: August 7, 2011
+//              Update: 
+//              - The Opera for Android browser doesn't follow Google's recommended useragent string guidelines, so some fixes were needed.
+//              - Updated DetectAndroidPhone() and DetectAndroidTablet() to properly detect devices running Opera Mobile.
+//              - Created 2 new methods: DetectOperaAndroidPhone() and DetectOperaAndroidTablet(). 
+//              - Updated DetectTierIphone(). Removed the call to DetectMaemoTablet(), an obsolete mobile OS.
+//
+//
+// LICENSE INFORMATION
+// Licensed under the Apache License, Version 2.0 (the "License"); 
+// you may not use this file except in compliance with the License. 
+// You may obtain a copy of the License at 
+//        http://www.apache.org/licenses/LICENSE-2.0 
+// Unless required by applicable law or agreed to in writing, 
+// software distributed under the License is distributed on an 
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
+// either express or implied. See the License for the specific 
+// language governing permissions and limitations under the License. 
+//
+//
+// ABOUT THIS PROJECT
+//   Project Owner: Anthony Hand
+//   Email: anthony.hand@gmail.com
+//   Web Site: http://www.mobileesp.com
+//   Source Files: http://code.google.com/p/mobileesp/
+//   
+//   Versions of this code are available for:
+//      PHP, JavaScript, Java, ASP.NET (C#), and Ruby
+//
+// *******************************************
+*/
+
+
+
+//**************************
+// The uagent_info class encapsulates information about
+//   a browser's connection to your web site. 
+//   You can use it to find out whether the browser asking for
+//   your site's content is probably running on a mobile device.
+//   The methods were written so you can be as granular as you want.
+//   For example, enquiring whether it's as specific as an iPod Touch or
+//   as general as a smartphone class device.
+//   The object's methods return 1 for true, or 0 for false.
+class uagent_info
+{
+   var $useragent = "";
+   var $httpaccept = "";
+
+   //standardized values for true and false.
+   var $true = 1;
+   var $false = 0;
+
+   //Let's store values for quickly accessing the same info multiple times.
+   var $isIphone = 0; //Stores whether the device is an iPhone or iPod Touch.
+   var $isAndroidPhone = 0; //Stores whether the device is a (small-ish) Android phone or media player.
+   var $isTierTablet = 0; //Stores whether is the Tablet (HTML5-capable, larger screen) tier of devices.
+   var $isTierIphone = 0; //Stores whether is the iPhone tier of devices.
+   var $isTierRichCss = 0; //Stores whether the device can probably support Rich CSS, but JavaScript support is not assumed. (e.g., newer BlackBerry, Windows Mobile)
+   var $isTierGenericMobile = 0; //Stores whether it is another mobile device, which cannot be assumed to support CSS or JS (eg, older BlackBerry, RAZR)
+
+   //Initialize some initial smartphone string variables.
+   var $engineWebKit = 'webkit';
+   var $deviceIphone = 'iphone';
+   var $deviceIpod = 'ipod';
+   var $deviceIpad = 'ipad';
+   var $deviceMacPpc = 'macintosh'; //Used for disambiguation
+
+   var $deviceAndroid = 'android';
+   var $deviceGoogleTV = 'googletv';
+   var $deviceXoom = 'xoom'; //Motorola Xoom
+   var $deviceHtcFlyer = 'htc_flyer'; //HTC Flyer
+   
+   var $deviceNuvifone = 'nuvifone'; //Garmin Nuvifone
+
+   var $deviceSymbian = 'symbian';
+   var $deviceS60 = 'series60';
+   var $deviceS70 = 'series70';
+   var $deviceS80 = 'series80';
+   var $deviceS90 = 'series90';
+   
+   var $deviceWinPhone7 = 'windows phone os 7'; 
+   var $deviceWinMob = 'windows ce';
+   var $deviceWindows = 'windows'; 
+   var $deviceIeMob = 'iemobile';
+   var $devicePpc = 'ppc'; //Stands for PocketPC
+   var $enginePie = 'wm5 pie'; //An old Windows Mobile
+   
+   var $deviceBB = 'blackberry';   
+   var $vndRIM = 'vnd.rim'; //Detectable when BB devices emulate IE or Firefox
+   var $deviceBBStorm = 'blackberry95';  //Storm 1 and 2
+   var $deviceBBBold = 'blackberry97'; //Bold 97x0 (non-touch)
+   var $deviceBBBoldTouch = 'blackberry 99'; //Bold 99x0 (touchscreen)
+   var $deviceBBTour = 'blackberry96'; //Tour
+   var $deviceBBCurve = 'blackberry89'; //Curve2
+   var $deviceBBTorch = 'blackberry 98'; //Torch
+   var $deviceBBPlaybook = 'playbook'; //PlayBook tablet
+   
+   var $devicePalm = 'palm';
+   var $deviceWebOS = 'webos'; //For Palm's line of WebOS devices
+   var $deviceWebOShp = 'hpwos'; //For HP's line of WebOS devices
+   
+   var $engineBlazer = 'blazer'; //Old Palm browser
+   var $engineXiino = 'xiino'; //Another old Palm
+   
+   var $deviceKindle = 'kindle'; //Amazon Kindle, eInk one.
+   
+   //Initialize variables for mobile-specific content.
+   var $vndwap = 'vnd.wap';
+   var $wml = 'wml';   
+   
+   //Initialize variables for other random devices and mobile browsers.
+   var $deviceTablet = 'tablet'; //Generic term for slate and tablet devices
+   var $deviceBrew = 'brew';
+   var $deviceDanger = 'danger';
+   var $deviceHiptop = 'hiptop';
+   var $devicePlaystation = 'playstation';
+   var $deviceNintendoDs = 'nitro';
+   var $deviceNintendo = 'nintendo';
+   var $deviceWii = 'wii';
+   var $deviceXbox = 'xbox';
+   var $deviceArchos = 'archos';
+   
+   var $engineOpera = 'opera'; //Popular browser
+   var $engineNetfront = 'netfront'; //Common embedded OS browser
+   var $engineUpBrowser = 'up.browser'; //common on some phones
+   var $engineOpenWeb = 'openweb'; //Transcoding by OpenWave server
+   var $deviceMidp = 'midp'; //a mobile Java technology
+   var $uplink = 'up.link';
+   var $engineTelecaQ = 'teleca q'; //a modern feature phone browser
+   
+   var $devicePda = 'pda'; //some devices report themselves as PDAs
+   var $mini = 'mini';  //Some mobile browsers put 'mini' in their names.
+   var $mobile = 'mobile'; //Some mobile browsers put 'mobile' in their user agent strings.
+   var $mobi = 'mobi'; //Some mobile browsers put 'mobi' in their user agent strings.
+   
+   //Use Maemo, Tablet, and Linux to test for Nokia's Internet Tablets.
+   var $maemo = 'maemo';
+   var $linux = 'linux';
+   var $qtembedded = 'qt embedded'; //for Sony Mylo and others
+   var $mylocom2 = 'com2'; //for Sony Mylo also
+   
+   //In some UserAgents, the only clue is the manufacturer.
+   var $manuSonyEricsson = "sonyericsson";
+   var $manuericsson = "ericsson";
+   var $manuSamsung1 = "sec-sgh";
+   var $manuSony = "sony";
+   var $manuHtc = "htc"; //Popular Android and WinMo manufacturer
+
+   //In some UserAgents, the only clue is the operator.
+   var $svcDocomo = "docomo";
+   var $svcKddi = "kddi";
+   var $svcVodafone = "vodafone";
+
+   //Disambiguation strings.
+   var $disUpdate = "update"; //pda vs. update
+
+
+   //**************************
+   //The constructor. Allows the latest PHP (5.0+) to locate a constructor object and initialize the object.
+   function __construct()
+   {
+                $this->uagent_info();
+   }
+
+
+   //**************************
+   //The object initializer. Initializes several default variables.
+   function uagent_info()
+   { 
+                $this->useragent = isset($_SERVER['HTTP_USER_AGENT'])?strtolower($_SERVER['HTTP_USER_AGENT']):'';
+                $this->httpaccept = isset($_SERVER['HTTP_ACCEPT'])?strtolower($_SERVER['HTTP_ACCEPT']):'';
+                
+                //Let's initialize some values to save cycles later.
+                $this->InitDeviceScan();
+   }
+   
+   //**************************
+   // Initialize Key Stored Values.
+   function InitDeviceScan()
+   {
+        global $isIphone, $isAndroidPhone, $isTierTablet, $isTierIphone;
+        
+        //We'll use these 4 variables to speed other processing. They're super common.
+        $this->isIphone = $this->DetectIphoneOrIpod();
+        $this->isAndroidPhone = $this->DetectAndroidPhone();
+        $this->isTierIphone = $this->DetectTierIphone();
+        $this->isTierTablet = $this->DetectTierTablet();
+        
+        //Optional: Comment these out if you don't need them.
+        global $isTierRichCss, $isTierGenericMobile;
+        $this->isTierRichCss = $this->DetectTierRichCss();
+        $this->isTierGenericMobile = $this->DetectTierOtherPhones();
+   }
+
+   //**************************
+   //Returns the contents of the User Agent value, in lower case.
+   function Get_Uagent()
+   { 
+       return $this->useragent;
+   }
+
+   //**************************
+   //Returns the contents of the HTTP Accept value, in lower case.
+   function Get_HttpAccept()
+   { 
+       return $this->httpaccept;
+   }
+   
+
+   //**************************
+   // Detects if the current device is an iPhone.
+   function DetectIphone()
+   {
+      if (stripos($this->useragent, $this->deviceIphone) > -1)
+      {
+         //The iPad and iPod Touch say they're an iPhone. So let's disambiguate.
+         if ($this->DetectIpad() == $this->true ||
+             $this->DetectIpod() == $this->true)
+            return $this->false;
+         //Yay! It's an iPhone!
+         else
+            return $this->true; 
+      }
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is an iPod Touch.
+   function DetectIpod()
+   {
+      if (stripos($this->useragent, $this->deviceIpod) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is an iPad tablet.
+   function DetectIpad()
+   {
+      if (stripos($this->useragent, $this->deviceIpad) > -1 &&
+          $this->DetectWebkit() == $this->true)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is an iPhone or iPod Touch.
+   function DetectIphoneOrIpod()
+   {
+       //We repeat the searches here because some iPods may report themselves as an iPhone, which would be okay.
+       if (stripos($this->useragent, $this->deviceIphone) > -1 ||
+           stripos($this->useragent, $this->deviceIpod) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects *any* iOS device: iPhone, iPod Touch, iPad.
+   function DetectIos()
+   {
+      if (($this->DetectIphoneOrIpod() == $this->true) ||
+        ($this->DetectIpad() == $this->true))
+         return $this->true; 
+      else
+         return $this->false;
+   }
+
+
+   //**************************
+   // Detects *any* Android OS-based device: phone, tablet, and multi-media player.
+   // Also detects Google TV.
+   function DetectAndroid()
+   {
+      if ((stripos($this->useragent, $this->deviceAndroid) > -1) ||
+         ($this->DetectGoogleTV() == $this->true))
+         return $this->true; 
+      //Special check for the HTC Flyer 7" tablet
+      if ((stripos($this->useragent, $this->deviceHtcFlyer) > -1))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is a (small-ish) Android OS-based device
+   // used for calling and/or multi-media (like a Samsung Galaxy Player).
+   // Google says these devices will have 'Android' AND 'mobile' in user agent.
+   // Ignores tablets (Honeycomb and later).
+   function DetectAndroidPhone()
+   {
+      if (($this->DetectAndroid() == $this->true) &&
+                (stripos($this->useragent, $this->mobile) > -1))
+         return $this->true; 
+      //Special check for Android phones with Opera Mobile. They should report here.
+      if (($this->DetectOperaAndroidPhone() == $this->true))
+         return $this->true; 
+      //Special check for the HTC Flyer 7" tablet. It should report here.
+      if ((stripos($this->useragent, $this->deviceHtcFlyer) > -1))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is a (self-reported) Android tablet.
+   // Google says these devices will have 'Android' and NOT 'mobile' in their user agent.
+   function DetectAndroidTablet()
+   {
+      //First, let's make sure we're on an Android device.
+      if ($this->DetectAndroid() == $this->false)
+         return $this->false; 
+
+      //Special check for Opera Android Phones. They should NOT report here.
+      if ($this->DetectOperaMobile() == $this->true)
+         return $this->false; 
+      //Special check for the HTC Flyer 7" tablet. It should NOT report here.
+      if ((stripos($this->useragent, $this->deviceHtcFlyer) > -1))
+         return $this->false; 
+         
+      //Otherwise, if it's Android and does NOT have 'mobile' in it, Google says it's a tablet.
+      if (stripos($this->useragent, $this->mobile) > -1)
+         return $this->false;
+      else
+         return $this->true; 
+   }
+
+   //**************************
+   // Detects if the current device is an Android OS-based device and
+   //   the browser is based on WebKit.
+   function DetectAndroidWebKit()
+   {
+      if (($this->DetectAndroid() == $this->true) &&
+                ($this->DetectWebkit() == $this->true))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is a GoogleTV.
+   function DetectGoogleTV()
+   {
+      if (stripos($this->useragent, $this->deviceGoogleTV) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is based on WebKit.
+   function DetectWebkit()
+   {
+      if (stripos($this->useragent, $this->engineWebKit) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is the Nokia S60 Open Source Browser.
+   function DetectS60OssBrowser()
+   {
+      //First, test for WebKit, then make sure it's either Symbian or S60.
+      if ($this->DetectWebkit() == $this->true)
+      {
+        if (stripos($this->useragent, $this->deviceSymbian) > -1 ||
+            stripos($this->useragent, $this->deviceS60) > -1)
+        {
+           return $this->true;
+        }
+        else
+           return $this->false; 
+      }
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is any Symbian OS-based device,
+   //   including older S60, Series 70, Series 80, Series 90, and UIQ, 
+   //   or other browsers running on these devices.
+   function DetectSymbianOS()
+   {
+       if (stripos($this->useragent, $this->deviceSymbian) > -1 || 
+           stripos($this->useragent, $this->deviceS60) > -1 ||
+           stripos($this->useragent, $this->deviceS70) > -1 || 
+           stripos($this->useragent, $this->deviceS80) > -1 ||
+           stripos($this->useragent, $this->deviceS90) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a 
+   // Windows Phone 7 device.
+   function DetectWindowsPhone7()
+   {
+      if (stripos($this->useragent, $this->deviceWinPhone7) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a Windows Mobile device.
+   // Excludes Windows Phone 7 devices. 
+   // Focuses on Windows Mobile 6.xx and earlier.
+   function DetectWindowsMobile()
+   {
+      if ($this->DetectWindowsPhone7() == $this->true)
+         return $this->false; 
+      //Most devices use 'Windows CE', but some report 'iemobile' 
+      //  and some older ones report as 'PIE' for Pocket IE. 
+      if (stripos($this->useragent, $this->deviceWinMob) > -1 ||
+          stripos($this->useragent, $this->deviceIeMob) > -1 ||
+          stripos($this->useragent, $this->enginePie) > -1)
+         return $this->true; 
+      //Test for Windows Mobile PPC but not old Macintosh PowerPC.
+          if (stripos($this->useragent, $this->devicePpc) > -1
+                  && !(stripos($this->useragent, $this->deviceMacPpc) > 1))
+         return $this->true; 
+      //Test for certain Windwos Mobile-based HTC devices.
+      if (stripos($this->useragent, $this->manuHtc) > -1 &&
+          stripos($this->useragent, $this->deviceWindows) > -1)
+         return $this->true; 
+      if ($this->DetectWapWml() == $this->true &&
+          stripos($this->useragent, $this->deviceWindows) > -1) 
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is any BlackBerry device.
+   // Includes the PlayBook.
+   function DetectBlackBerry()
+   {
+       if ((stripos($this->useragent, $this->deviceBB) > -1) ||
+          (stripos($this->httpaccept, $this->vndRIM) > -1))
+         return $this->true; 
+       else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current browser is on a BlackBerry tablet device.
+   //    Examples: PlayBook
+   function DetectBlackBerryTablet()
+   {
+      if ((stripos($this->useragent, $this->deviceBBPlaybook) > -1))
+         return $this->true; 
+      else
+        return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry phone device AND uses a
+   //    WebKit-based browser. These are signatures for the new BlackBerry OS 6.
+   //    Examples: Torch. Includes the Playbook.
+   function DetectBlackBerryWebKit()
+   {
+      if (($this->DetectBlackBerry() == $this->true) &&
+                ($this->DetectWebkit() == $this->true))
+         return $this->true; 
+      else
+        return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry Touch phone
+   //    device, such as the Storm, Torch, and Bold Touch. Excludes the Playbook.
+   function DetectBlackBerryTouch()
+   {
+       if ((stripos($this->useragent, $this->deviceBBStorm) > -1) ||
+                (stripos($this->useragent, $this->deviceBBTorch) > -1) ||
+                (stripos($this->useragent, $this->deviceBBBoldTouch) > -1))
+         return $this->true; 
+       else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current browser is a BlackBerry OS 5 device AND
+   //    has a more capable recent browser. Excludes the Playbook.
+   //    Examples, Storm, Bold, Tour, Curve2
+   //    Excludes the new BlackBerry OS 6 and 7 browser!!
+   function DetectBlackBerryHigh()
+   {
+      //Disambiguate for BlackBerry OS 6 or 7 (WebKit) browser
+      if ($this->DetectBlackBerryWebKit() == $this->true)
+         return $this->false; 
+      if ($this->DetectBlackBerry() == $this->true)
+      {
+          if (($this->DetectBlackBerryTouch() == $this->true) ||
+            stripos($this->useragent, $this->deviceBBBold) > -1 ||
+            stripos($this->useragent, $this->deviceBBTour) > -1 ||
+            stripos($this->useragent, $this->deviceBBCurve) > -1)
+          {
+             return $this->true; 
+          }
+          else
+            return $this->false; 
+      }
+      else
+        return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a BlackBerry device AND
+   //    has an older, less capable browser. 
+   //    Examples: Pearl, 8800, Curve1.
+   function DetectBlackBerryLow()
+   {
+      if ($this->DetectBlackBerry() == $this->true)
+      {
+          //Assume that if it's not in the High tier, then it's Low.
+          if (($this->DetectBlackBerryHigh() == $this->true) ||
+                        ($this->DetectBlackBerryWebKit() == $this->true))
+             return $this->false; 
+          else
+            return $this->true; 
+      }
+      else
+        return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is on a PalmOS device.
+   function DetectPalmOS()
+   {
+      //Most devices nowadays report as 'Palm', but some older ones reported as Blazer or Xiino.
+      if (stripos($this->useragent, $this->devicePalm) > -1 ||
+          stripos($this->useragent, $this->engineBlazer) > -1 ||
+          stripos($this->useragent, $this->engineXiino) > -1)
+      {
+         //Make sure it's not WebOS first
+         if ($this->DetectPalmWebOS() == $this->true)
+            return $this->false;
+         else
+            return $this->true; 
+      }
+      else
+         return $this->false; 
+   }
+
+
+   //**************************
+   // Detects if the current browser is on a Palm device
+   //   running the new WebOS.
+   function DetectPalmWebOS()
+   {
+      if (stripos($this->useragent, $this->deviceWebOS) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is on an HP tablet running WebOS.
+   function DetectWebOSTablet()
+   {
+      if ((stripos($this->useragent, $this->deviceWebOShp) > -1)
+                        && (stripos($this->useragent, $this->deviceTablet) > -1))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a
+   //   Garmin Nuvifone.
+   function DetectGarminNuvifone()
+   {
+      if (stripos($this->useragent, $this->deviceNuvifone) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+
+   //**************************
+   // Check to see whether the device is any device
+   //   in the 'smartphone' category.
+   function DetectSmartphone()
+   {
+      global $isIphone, $isAndroidPhone, $isTierIphone;
+
+      if (($this->isIphone == $this->true)
+                        || ($this->isAndroidPhone == $this->true)
+                        || ($this->isTierIphone == $this->true)
+                        || ($this->DetectS60OssBrowser() == $this->true)
+                        || ($this->DetectSymbianOS() == $this->true) 
+                        || ($this->DetectWindowsMobile() == $this->true)
+                        || ($this->DetectWindowsPhone7() == $this->true)
+                        || ($this->DetectBlackBerry() == $this->true)
+                        || ($this->DetectPalmWebOS() == $this->true)
+                        || ($this->DetectPalmOS() == $this->true)
+                        || ($this->DetectGarminNuvifone() == $this->true))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+
+   //**************************
+   // Detects whether the device is a Brew-powered device.
+   function DetectBrewDevice()
+   {
+       if (stripos($this->useragent, $this->deviceBrew) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects the Danger Hiptop device.
+   function DetectDangerHiptop()
+   {
+      if (stripos($this->useragent, $this->deviceDanger) > -1 ||
+          stripos($this->useragent, $this->deviceHiptop) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is Opera Mobile or Mini.
+   function DetectOperaMobile()
+   {
+      if (stripos($this->useragent, $this->engineOpera) > -1)
+      {
+         if ((stripos($this->useragent, $this->mini) > -1) ||
+          (stripos($this->useragent, $this->mobi) > -1))
+            return $this->true; 
+         else
+            return $this->false; 
+      }
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is Opera Mobile
+   // running on an Android phone.
+   function DetectOperaAndroidPhone()
+   {
+      if ((stripos($this->useragent, $this->engineOpera) > -1) &&
+        (stripos($this->useragent, $this->deviceAndroid) > -1) &&
+                (stripos($this->useragent, $this->mobi) > -1))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is Opera Mobile
+   // running on an Android tablet.  
+   function DetectOperaAndroidTablet()
+   {
+      if ((stripos($this->useragent, $this->engineOpera) > -1) &&
+        (stripos($this->useragent, $this->deviceAndroid) > -1) &&
+                (stripos($this->useragent, $this->deviceTablet) > -1))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects whether the device supports WAP or WML.
+   function DetectWapWml()
+   {
+       if (stripos($this->httpaccept, $this->vndwap) > -1 ||
+           stripos($this->httpaccept, $this->wml) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is an Amazon Kindle (eInk devices only).
+   // Note: For the Kindle Fire, use the normal Android methods. 
+   function DetectKindle()
+   {
+      if (stripos($this->useragent, $this->deviceKindle) > -1 &&
+          DetectAndroid() == $this->false)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   
+   //**************************
+   // The quick way to detect for a mobile device.
+   //   Will probably detect most recent/current mid-tier Feature Phones
+   //   as well as smartphone-class devices. Excludes Apple iPads and other modern tablets.
+   function DetectMobileQuick()
+   {
+      //Let's exclude tablets
+      if ($this->isTierTablet == $this->true) 
+         return $this->false;
+
+      //Most mobile browsing is done on smartphones
+      if ($this->DetectSmartphone() == $this->true) 
+         return $this->true;
+
+      if (($this->DetectWapWml() == $this->true) 
+                        || ($this->DetectBrewDevice() == $this->true) 
+                        || ($this->DetectOperaMobile() == $this->true))
+         return $this->true;
+         
+      if ((stripos($this->useragent, $this->engineNetfront) > -1)
+                        || (stripos($this->useragent, $this->engineUpBrowser) > -1)
+                        || (stripos($this->useragent, $this->engineOpenWeb) > -1))
+         return $this->true; 
+         
+      if (($this->DetectDangerHiptop() == $this->true) 
+                        || ($this->DetectMidpCapable() == $this->true) 
+                        || ($this->DetectMaemoTablet() == $this->true) 
+                        || ($this->DetectArchos() == $this->true))
+         return $this->true; 
+
+       if ((stripos($this->useragent, $this->devicePda) > -1) &&
+                 !(stripos($this->useragent, $this->disUpdate) > -1))
+         return $this->true; 
+       if (stripos($this->useragent, $this->mobile) > -1)
+         return $this->true; 
+
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is a Sony Playstation.
+   function DetectSonyPlaystation()
+   {
+      if (stripos($this->useragent, $this->devicePlaystation) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is a Nintendo game device.
+   function DetectNintendo()
+   {
+      if (stripos($this->useragent, $this->deviceNintendo) > -1 || 
+           stripos($this->useragent, $this->deviceWii) > -1 ||
+           stripos($this->useragent, $this->deviceNintendoDs) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is a Microsoft Xbox.
+   function DetectXbox()
+   {
+      if (stripos($this->useragent, $this->deviceXbox) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is an Internet-capable game console.
+   function DetectGameConsole()
+   {
+      if ($this->DetectSonyPlaystation() == $this->true) 
+         return $this->true; 
+      else if ($this->DetectNintendo() == $this->true) 
+         return $this->true; 
+      else if ($this->DetectXbox() == $this->true) 
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device supports MIDP, a mobile Java technology.
+   function DetectMidpCapable()
+   {
+       if (stripos($this->useragent, $this->deviceMidp) > -1 || 
+           stripos($this->httpaccept, $this->deviceMidp) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // Detects if the current device is on one of the Maemo-based Nokia Internet Tablets.
+   function DetectMaemoTablet()
+   {
+      if (stripos($this->useragent, $this->maemo) > -1)
+         return $this->true; 
+      //For Nokia N810, must be Linux + Tablet, or else it could be something else. 
+      if ((stripos($this->useragent, $this->linux) > -1)
+                && (stripos($this->useragent, $this->deviceTablet) > -1) 
+                && ($this->DetectWebOSTablet() == $this->false)
+                && ($this->DetectAndroid() == $this->false))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current device is an Archos media player/Internet tablet.
+   function DetectArchos()
+   {
+      if (stripos($this->useragent, $this->deviceArchos) > -1)
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // Detects if the current browser is a Sony Mylo device.
+   function DetectSonyMylo()
+   {
+      if (stripos($this->useragent, $this->manuSony) > -1)
+      {
+         if ((stripos($this->useragent, $this->qtembedded) > -1) ||
+          (stripos($this->useragent, $this->mylocom2) > -1))
+         {
+            return $this->true; 
+         }
+         else
+            return $this->false; 
+      }
+      else
+         return $this->false; 
+   }
+   
+  
+   //**************************
+   // The longer and more thorough way to detect for a mobile device.
+   //   Will probably detect most feature phones,
+   //   smartphone-class devices, Internet Tablets, 
+   //   Internet-enabled game consoles, etc.
+   //   This ought to catch a lot of the more obscure and older devices, also --
+   //   but no promises on thoroughness!
+   function DetectMobileLong()
+   {
+      if ($this->DetectMobileQuick() == $this->true) 
+         return $this->true; 
+      if ($this->DetectGameConsole() == $this->true) 
+         return $this->true; 
+      if ($this->DetectSonyMylo() == $this->true) 
+         return $this->true; 
+
+       //Detect older phones from certain manufacturers and operators. 
+       if (stripos($this->useragent, $this->uplink) > -1)
+         return $this->true; 
+       if (stripos($this->useragent, $this->manuSonyEricsson) > -1)
+         return $this->true; 
+       if (stripos($this->useragent, $this->manuericsson) > -1)
+         return $this->true; 
+
+       if (stripos($this->useragent, $this->manuSamsung1) > -1)
+         return $this->true; 
+       if (stripos($this->useragent, $this->svcDocomo) > -1)
+         return $this->true; 
+       if (stripos($this->useragent, $this->svcKddi) > -1)
+         return $this->true; 
+       if (stripos($this->useragent, $this->svcVodafone) > -1)
+         return $this->true; 
+
+      else
+         return $this->false; 
+   }
+
+
+
+  //*****************************
+  // For Mobile Web Site Design
+  //*****************************
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for the new generation of
+   //   HTML 5 capable, larger screen tablets.
+   //   Includes iPad, Android (e.g., Xoom), BB Playbook, WebOS, etc.
+   function DetectTierTablet()
+   {
+      if (($this->DetectIpad() == $this->true) 
+         || ($this->DetectAndroidTablet() == $this->true) 
+         || ($this->DetectBlackBerryTablet() == $this->true) 
+         || ($this->DetectWebOSTablet() == $this->true))
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for devices which can 
+   //   display iPhone-optimized web content.
+   //   Includes iPhone, iPod Touch, Android, Windows Phone 7, WebOS, etc.
+   function DetectTierIphone()
+   {
+      if (($this->isIphone == $this->true) ||
+                        ($this->isAndroidPhone == $this->true))
+         return $this->true; 
+   
+      if (($this->DetectBlackBerryWebKit() == $this->true) &&
+                ($this->DetectBlackBerryTouch() == $this->true))
+         return $this->true; 
+      if ($this->DetectWindowsPhone7() == $this->true)
+         return $this->true; 
+      if ($this->DetectPalmWebOS() == $this->true) 
+         return $this->true; 
+      if ($this->DetectGarminNuvifone() == $this->true) 
+         return $this->true; 
+      else
+         return $this->false; 
+   }
+   
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for devices which are likely to be capable 
+   //   of viewing CSS content optimized for the iPhone, 
+   //   but may not necessarily support JavaScript.
+   //   Excludes all iPhone Tier devices.
+   function DetectTierRichCss()
+   {
+      if ($this->DetectMobileQuick() == $this->true) 
+      {
+        if (($this->DetectTierIphone() == $this->true))
+           return $this->false;
+           
+        //The following devices are explicitly ok.
+        if ($this->DetectWebkit() == $this->true) //Any WebKit
+           return $this->true;
+        if ($this->DetectS60OssBrowser() == $this->true)
+           return $this->true;
+           
+        //Note: 'High' BlackBerry devices ONLY
+        if ($this->DetectBlackBerryHigh() == $this->true)
+           return $this->true;
+        
+        //Older Windows 'Mobile' isn't good enough for iPhone Tier. 
+        if ($this->DetectWindowsMobile() == $this->true)
+           return $this->true;
+        if (stripos($this->useragent, $this->engineTelecaQ) > -1)
+           return $this->true; 
+           
+        //default
+        else
+           return $this->false;
+      }
+      else
+         return $this->false; 
+   }
+
+   //**************************
+   // The quick way to detect for a tier of devices.
+   //   This method detects for all other types of phones,
+   //   but excludes the iPhone and RichCSS Tier devices.
+   function DetectTierOtherPhones()
+   {
+      //Exclude devices in the other 2 categories 
+      if (($this->DetectMobileLong() == $this->true)
+                && ($this->DetectTierIphone() == $this->false)
+                && ($this->DetectTierRichCss() == $this->false))
+           return $this->true;
+      else
+         return $this->false; 
+   }
+      
+
+}
+
+?>
Index: tags/2.4.0RC3/include/menubar.inc.php
===================================================================
--- tags/2.4.0RC3/include/menubar.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/menubar.inc.php	(revision 14585)
@@ -0,0 +1,331 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the main page to show the menu bar
+ *
+ */
+
+include_once(PHPWG_ROOT_PATH.'include/block.class.php');
+
+initialize_menu();
+
+function initialize_menu()
+{
+  global $page, $conf, $user, $template, $filter;
+
+  $menu = new BlockManager("menubar");
+  $menu->load_registered_blocks();
+  $menu->prepare_display();
+
+//--------------------------------------------------------------- external links
+  if ( ($block=$menu->get_block('mbLinks')) and !empty($conf['links']) )
+  {
+    $block->data = array();
+    foreach ($conf['links'] as $url => $url_data)
+    {
+      if (!is_array($url_data))
+      {
+        $url_data = array('label' => $url_data);
+      }
+
+      if
+        (
+          (!isset($url_data['eval_visible']))
+          or
+          (eval($url_data['eval_visible']))
+        )
+      {
+        $tpl_var = array(
+            'URL' => $url,
+            'LABEL' => $url_data['label']
+          );
+
+        if (!isset($url_data['new_window']) or $url_data['new_window'])
+        {
+          $tpl_var['new_window'] =
+            array(
+              'NAME' => (isset($url_data['nw_name']) ? $url_data['nw_name'] : ''),
+              'FEATURES' => (isset($url_data['nw_features']) ? $url_data['nw_features'] : '')
+            );
+        }
+        $block->data[] = $tpl_var;
+      }
+    }
+    if ( !empty($block->data) )
+    {
+      $block->template = 'menubar_links.tpl';
+    }
+  }
+
+//-------------------------------------------------------------- categories
+  $block = $menu->get_block('mbCategories');
+//------------------------------------------------------------------------ filter
+  if ($conf['menubar_filter_icon'] and !empty($conf['filter_pages']) and get_filter_page_value('used'))
+  {
+    if ($filter['enabled'])
+    {
+      $template->assign(
+        'U_STOP_FILTER',
+        add_url_params(make_index_url(array()), array('filter' => 'stop'))
+        );
+    }
+    else
+    {
+      $template->assign(
+        'U_START_FILTER',
+        add_url_params(make_index_url(array()), array('filter' => 'start-recent-'.$user['recent_period']))
+        );
+    }
+  }
+
+  if ( $block!=null )
+  {
+    $block->data = array(
+      'NB_PICTURE' => $user['nb_total_images'],
+      'MENU_CATEGORIES' => get_categories_menu(),
+      'U_CATEGORIES' => make_index_url(array('section' => 'categories')),
+    );
+    $block->template = 'menubar_categories.tpl';
+  }
+
+//------------------------------------------------------------------------ tags
+  $block = $menu->get_block('mbTags');
+  if ( $block!=null and !empty($page['items']) )
+  {
+    if ('tags'==@$page['section'])
+    {
+      $tags = get_common_tags(
+        $page['items'],
+        $conf['menubar_tag_cloud_items_number'],
+        $page['tag_ids']
+        );
+      $tags = add_level_to_tags($tags);
+
+      foreach ($tags as $tag)
+      {
+        $block->data[] = array_merge(
+          $tag,
+          array(
+            'U_ADD' => make_index_url(
+              array(
+                'tags' => array_merge(
+                  $page['tags'],
+                  array($tag)
+                  )
+                )
+              ),
+            'URL' => make_index_url( array( 'tags' => array($tag) )
+              ),
+            )
+          );
+      }
+    }
+    else
+    {
+      $selection = array_slice( $page['items'], $page['start'], $page['nb_image_page'] );
+      $tags = add_level_to_tags( get_common_tags($selection, $conf['content_tag_cloud_items_number']) );
+      foreach ($tags as $tag)
+      {
+        $block->data[] =
+        array_merge( $tag,
+          array(
+            'URL' => make_index_url( array( 'tags' => array($tag) ) ),
+          )
+        );
+      }
+    }
+    if ( !empty($block->data) )
+    {
+      $block->template = 'menubar_tags.tpl';
+    }
+  }
+
+//----------------------------------------------------------- special categories
+  if ( ($block = $menu->get_block('mbSpecials')) != null )
+  {
+    if ( !is_a_guest() )
+    {// favorites
+      $block->data['favorites'] =
+        array(
+          'URL' => make_index_url(array('section' => 'favorites')),
+          'TITLE' => l10n('display your favorites photos'),
+          'NAME' => l10n('Your favorites')
+          );
+    }
+
+    $block->data['most_visited'] =
+      array(
+        'URL' => make_index_url(array('section' => 'most_visited')),
+        'TITLE' => l10n('display most visited photos'),
+        'NAME' => l10n('Most visited')
+      );
+
+    if ($conf['rate'])
+    {
+       $block->data['best_rated'] =
+        array(
+          'URL' => make_index_url(array('section' => 'best_rated')),
+          'TITLE' => l10n('display best rated photos'),
+          'NAME' => l10n('Best rated')
+        );
+    }
+
+    $block->data['random'] =
+      array(
+        'URL' => get_root_url().'random.php',
+        'TITLE' => l10n('display a set of random photos'),
+        'NAME' => l10n('Random photos'),
+        'REL'=> 'rel="nofollow"'
+      );
+
+    $block->data['recent_pics'] =
+      array(
+        'URL' => make_index_url(array('section' => 'recent_pics')),
+        'TITLE' => l10n('display most recent photos'),
+        'NAME' => l10n('Recent photos'),
+      );
+
+    $block->data['recent_cats'] =
+      array(
+        'URL' => make_index_url(array('section' => 'recent_cats')),
+        'TITLE' => l10n('display recently updated albums'),
+        'NAME' => l10n('Recent albums'),
+      );
+
+
+    $block->data['calendar'] =
+      array(
+        'URL' =>
+          make_index_url(
+            array(
+              'chronology_field' => ($conf['calendar_datefield']=='date_available'
+                                      ? 'posted' : 'created'),
+               'chronology_style'=> 'monthly',
+               'chronology_view' => 'calendar'
+            )
+          ),
+        'TITLE' => l10n('display each day with photos, month per month'),
+        'NAME' => l10n('Calendar'),
+        'REL'=> 'rel="nofollow"'
+      );
+    $block->template = 'menubar_specials.tpl';
+  }
+
+
+//---------------------------------------------------------------------- summary
+  if ( ($block=$menu->get_block('mbMenu')) != null )
+  {
+    // quick search block will be displayed only if data['qsearch'] is set
+    // to "yes"
+    $block->data['qsearch']=true;
+
+    // tags link
+    $block->data['tags'] =
+      array(
+        'TITLE' => l10n('display available tags'),
+        'NAME' => l10n('Tags'),
+        'URL'=> get_root_url().'tags.php',
+      );
+
+    // search link
+    $block->data['search'] =
+      array(
+        'TITLE'=>l10n('search'),
+        'NAME'=>l10n('Search'),
+        'URL'=> get_root_url().'search.php',
+        'REL'=> 'rel="search"'
+      );
+
+    if ($conf['activate_comments'])
+    {
+      // comments link
+      $block->data['comments'] =
+        array(
+          'TITLE'=>l10n('display last user comments'),
+          'NAME'=>l10n('Comments'),
+          'URL'=> get_root_url().'comments.php',
+        );
+    }
+
+    // about link
+    $block->data['about'] =
+      array(
+        'TITLE'     => l10n('About Piwigo'),
+        'NAME'      => l10n('About'),
+        'URL' => get_root_url().'about.php',
+      );
+
+    // notification
+    $block->data['rss'] =
+      array(
+        'TITLE'=>l10n('RSS feed'),
+        'NAME'=>l10n('Notification'),
+        'URL'=> get_root_url().'notification.php',
+        'REL'=> 'rel="nofollow"'
+      );
+    $block->template = 'menubar_menu.tpl';
+  }
+
+
+//--------------------------------------------------------------- identification
+  if (is_a_guest())
+  {
+    $template->assign(
+        array(
+          'U_LOGIN' => get_root_url().'identification.php',
+          'U_LOST_PASSWORD' => get_root_url().'password.php',
+          'AUTHORIZE_REMEMBERING' => $conf['authorize_remembering']
+        )
+      );
+    if ($conf['allow_user_registration'])
+    {
+      $template->assign( 'U_REGISTER', get_root_url().'register.php');
+    }
+  }
+  else
+  {
+    $template->assign('USERNAME', stripslashes($user['username']));
+    if (is_autorize_status(ACCESS_CLASSIC))
+    {
+      $template->assign('U_PROFILE', get_root_url().'profile.php');
+    }
+
+    // the logout link has no meaning with Apache authentication : it is not
+    // possible to logout with this kind of authentication.
+    if (!$conf['apache_authentication'])
+    {
+      $template->assign('U_LOGOUT', get_root_url().'?act=logout');
+    }
+    if (is_admin())
+    {
+      $template->assign('U_ADMIN', get_root_url().'admin.php');
+    }
+  }
+  if ( ($block=$menu->get_block('mbIdentification')) != null )
+  {
+    $block->template = 'menubar_identification.tpl';
+  }
+  $menu->apply('MENUBAR',  'menubar.tpl' );
+}
+?>
Index: tags/2.4.0RC3/include/no_photo_yet.inc.php
===================================================================
--- tags/2.4.0RC3/include/no_photo_yet.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/no_photo_yet.inc.php	(revision 14585)
@@ -0,0 +1,105 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+// The "No Photo Yet" feature: if you have no photo yet in your gallery, the
+// gallery displays only a big box to show you the way for adding your first
+// photos
+if (
+  !(defined('IN_ADMIN') and IN_ADMIN)   // no message inside administration
+  and script_basename() != 'identification' // keep the ability to login
+  and script_basename() != 'ws'             // keep the ability to discuss with web API
+  and script_basename() != 'popuphelp'      // keep the ability to display help popups
+  and !isset($_SESSION['no_photo_yet'])     // temporary hide
+  )
+{
+  $query = '
+SELECT
+    COUNT(*)
+  FROM '.IMAGES_TABLE.'
+;';
+  list($nb_photos) = pwg_db_fetch_row(pwg_query($query));
+  if (0 == $nb_photos)
+  {
+    if (isset($_GET['no_photo_yet']))
+    {
+      if ('browse' == $_GET['no_photo_yet'])
+      {
+        $_SESSION['no_photo_yet'] = 'browse';
+        redirect(make_index_url());
+        exit();
+      }
+
+      if ('deactivate' == $_GET['no_photo_yet'])
+      {
+        conf_update_param('no_photo_yet', 'false');
+        redirect(make_index_url());
+        exit();
+      }
+    }
+
+    header('Content-Type: text/html; charset='.get_pwg_charset());
+    $template->set_filenames(array('no_photo_yet'=>'no_photo_yet.tpl'));
+
+    if (is_admin())
+    {
+      $url = $conf['no_photo_yet_url'];
+      if (substr($url, 0, 4) != 'http')
+      {
+        $url = get_root_url().$url;
+      }
+
+      $template->assign(
+        array(
+          'step' => 2,
+          'intro' => sprintf(
+            l10n('Hello %s, your Piwigo photo gallery is empty!'),
+            $user['username']
+            ),
+          'next_step_url' => $url,
+          'deactivate_url' => get_root_url().'?no_photo_yet=deactivate',
+          )
+        );
+    }
+    else
+    {
+
+      $template->assign(
+        array(
+          'step' => 1,
+          'U_LOGIN' => 'identification.php',
+          'deactivate_url' => get_root_url().'?no_photo_yet=browse',
+          )
+        );
+    }
+
+    $template->pparse('no_photo_yet');
+    exit();
+  }
+  else
+  {
+    conf_update_param('no_photo_yet', 'false');
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/page_header.php
===================================================================
--- tags/2.4.0RC3/include/page_header.php	(revision 14585)
+++ tags/2.4.0RC3/include/page_header.php	(revision 14585)
@@ -0,0 +1,124 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//
+// Start output of page
+//
+$template->set_filenames(array('header'=>'header.tpl'));
+
+trigger_action('loc_begin_page_header');
+
+$template->assign(
+  array(
+    'GALLERY_TITLE' =>
+      isset($page['gallery_title']) ?
+        $page['gallery_title'] : $conf['gallery_title'],
+
+    'PAGE_BANNER' =>
+      trigger_event(
+        'render_page_banner',
+        str_replace(
+          '%gallery_title%',
+          $conf['gallery_title'],
+          isset($page['page_banner']) ? $page['page_banner'] : $conf['page_banner']
+          )
+        ),
+
+    'BODY_ID' =>
+      isset($page['body_id']) ?
+        $page['body_id'] : '',
+
+    'REVERSE' =>
+      (isset($conf['reverse_home_title']) and $conf['reverse_home_title']) ?
+        true : false,
+
+    'CONTENT_ENCODING' => get_pwg_charset(),
+    'PAGE_TITLE' => strip_tags($title),
+
+    'U_HOME' => get_gallery_home_url(),
+
+    'LEVEL_SEPARATOR' => $conf['level_separator'],
+    ));
+
+
+// Header notes
+if ( !empty($header_notes) )
+{
+  $template->assign('header_notes',$header_notes);
+}
+
+// No referencing is required
+if ( !$conf['meta_ref'] )
+{
+  $page['meta_robots']['noindex'] = 1;
+  $page['meta_robots']['nofollow'] = 1;
+}
+
+if ( !empty($page['meta_robots']) )
+{
+  $template->append('head_elements',
+        '<meta name="robots" content="'
+        .implode(',', array_keys($page['meta_robots']))
+        .'">'
+    );
+}
+if ( !isset($page['meta_robots']['noindex']) )
+{
+  $template->assign('meta_ref',1);
+}
+
+// refresh
+if ( isset( $refresh ) and intval($refresh) >= 0
+    and isset( $url_link ) )
+{
+  $template->assign(
+    array(
+      'page_refresh' => array(
+            'TIME' => $refresh,
+            'U_REFRESH' => $url_link
+          )
+      ));
+}
+else
+{// messages only if no redirection
+  foreach (array('errors','infos') as $mode)
+  {
+    if (isset($_SESSION['page_'.$mode]))
+    {
+      $page[$mode] = array_merge($page[$mode], $_SESSION['page_'.$mode]);
+      unset($_SESSION['page_'.$mode]);
+    }
+
+    if (count($page[$mode]) != 0)
+    {
+      $template->assign($mode, $page[$mode]);
+    }
+  }
+}
+trigger_action('loc_end_page_header');
+
+header('Content-Type: text/html; charset='.get_pwg_charset());
+$template->parse('header');
+
+trigger_action('loc_after_page_header');
+?>
Index: tags/2.4.0RC3/include/page_tail.php
===================================================================
--- tags/2.4.0RC3/include/page_tail.php	(revision 14585)
+++ tags/2.4.0RC3/include/page_tail.php	(revision 14585)
@@ -0,0 +1,85 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$template->set_filenames(array('tail'=>'footer.tpl'));
+
+trigger_action('loc_begin_page_tail');
+
+$template->assign(
+  array(
+    'VERSION' => $conf['show_version'] ? PHPWG_VERSION : '',
+    'PHPWG_URL' => defined('PHPWG_URL') ? PHPWG_URL : '',
+    ));
+
+//--------------------------------------------------------------------- contact
+
+if (!is_a_guest())
+{
+  $template->assign(
+    'CONTACT_MAIL', get_webmaster_mail_address()
+    );
+}
+
+//------------------------------------------------------------- generation time
+$debug_vars = array();
+
+if ($conf['show_queries'])
+{
+  $debug_vars = array_merge($debug_vars, array('QUERIES_LIST' => $debug) );
+}
+
+if ($conf['show_gt'])
+{
+  if (!isset($page['count_queries']))
+  {
+    $page['count_queries'] = 0;
+    $page['queries_time'] = 0;
+  }
+  $time = get_elapsed_time($t2, get_moment());
+
+  $debug_vars = array_merge($debug_vars,
+    array('TIME' => $time,
+          'NB_QUERIES' => $page['count_queries'],
+          'SQL_TIME' => number_format($page['queries_time'],3,'.',' ').' s')
+          );
+}
+
+$template->assign('debug', $debug_vars );
+
+//------------------------------------------------------------- mobile version
+if ( !empty($conf['mobile_theme']) && (get_device() != 'desktop' || mobile_theme()))
+{
+  $template->assign('TOGGLE_MOBILE_THEME_URL',
+      add_url_params(
+        duplicate_index_url(),
+        array('mobile' => mobile_theme() ? 'false' : 'true')
+      )
+    );
+}
+
+trigger_action('loc_end_page_tail');
+//
+// Generate the page
+//
+$template->parse('tail');
+$template->p();
+?>
Index: tags/2.4.0RC3/include/php_compat/array_intersect_key.php
===================================================================
--- tags/2.4.0RC3/include/php_compat/array_intersect_key.php	(revision 14585)
+++ tags/2.4.0RC3/include/php_compat/array_intersect_key.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+// http://www.php.net/manual/en/function.array-intersect-key.php
+// PHP 5 >= 5.1.0RC1
+function array_intersect_key()
+{
+  $args = func_get_args();
+  if (count($args) < 2) {
+      trigger_error('Wrong parameter count for array_intersect_key()', E_USER_WARNING);
+      return;
+  }
+
+  // Check arrays
+  $array_count = count($args);
+  for ($i = 0; $i !== $array_count; $i++) {
+      if (!is_array($args[$i])) {
+          trigger_error('array_intersect_key() Argument #' . ($i + 1) . ' is not an array', E_USER_WARNING);
+          return;
+      }
+  }
+
+  // Compare entries
+  $result = array();
+  foreach ($args[0] as $key1 => $value1) {
+      for ($i = 1; $i !== $array_count; $i++) {
+          foreach ($args[$i] as $key2 => $value2) {
+              if ((string) $key1 === (string) $key2) {
+                  $result[$key1] = $value1;
+              }
+          }
+      }
+  }
+
+  return $result;
+}
+?>
Index: tags/2.4.0RC3/include/php_compat/hash_hmac.php
===================================================================
--- tags/2.4.0RC3/include/php_compat/hash_hmac.php	(revision 14585)
+++ tags/2.4.0RC3/include/php_compat/hash_hmac.php	(revision 14585)
@@ -0,0 +1,25 @@
+<?php
+//(hash) - enabled by default as of PHP 5.1.2
+function hash_hmac($algo, $data, $key, $raw_output=false)
+{
+  /* md5 and sha1 only */
+  $algo=strtolower($algo);
+  $p=array('md5'=>'H32','sha1'=>'H40');
+  if ( !isset($p[$algo]) or !function_exists($algo) )
+  {
+    $algo = 'md5';
+  }
+  if(strlen($key)>64) $key=pack($p[$algo],$algo($key));
+  if(strlen($key)<64) $key=str_pad($key,64,chr(0));
+
+  $ipad=substr($key,0,64) ^ str_repeat(chr(0x36),64);
+  $opad=substr($key,0,64) ^ str_repeat(chr(0x5C),64);
+
+  $ret = $algo($opad.pack($p[$algo],$algo($ipad.$data)));
+  if ($raw_output)
+  {
+    $ret = pack('H*', $ret);
+  }
+  return $ret;
+}
+?>
Index: tags/2.4.0RC3/include/php_compat/index.php
===================================================================
--- tags/2.4.0RC3/include/php_compat/index.php	(revision 14585)
+++ tags/2.4.0RC3/include/php_compat/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/include/php_compat/json_encode.php
===================================================================
--- tags/2.4.0RC3/include/php_compat/json_encode.php	(revision 14585)
+++ tags/2.4.0RC3/include/php_compat/json_encode.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function json_encode($data) {
+  switch (gettype($data)) {
+    case 'boolean':
+      return ($data ? 'true' : 'false');
+    case 'null':
+    case 'NULL':
+      return 'null';
+    case 'integer':
+    case 'double':
+      return $data;
+    case 'string':
+      return '"'. str_replace(array("\\",'"',"/","\n","\r","\t"), array("\\\\",'\"',"\\/","\\n","\\r","\\t"), $data) .'"';
+    case 'object':
+    case 'array':
+      if ($data === array()) return '[]'; # empty array
+      if (range(0, count($data) - 1) !== array_keys($data) ) { # string keys, unordered, non-incremental keys, .. - whatever, make object
+        $out = "\n".'{';
+        foreach($data as $key => $value) {
+          $out .= json_encode((string) $key) . ':' . json_encode($value) . ',';
+        }
+        $out = substr($out, 0, -1) . "\n". '}';
+      }else{
+        # regular array
+        $out = "\n".'[' . join("\n".',', array_map('json_encode', $data)) ."\n".']';
+      }
+      return $out;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/php_compat/preg_last_error.php
===================================================================
--- tags/2.4.0RC3/include/php_compat/preg_last_error.php	(revision 14585)
+++ tags/2.4.0RC3/include/php_compat/preg_last_error.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// http://www.php.net/manual/fr/function.preg-last-error.php
+// PHP 5 >= 5.2.0
+if (!defined('PREG_NO_ERROR'))
+  define('PREG_NO_ERROR', 0);
+if (!defined('PREG_INTERNAL_ERROR'))
+  define('PREG_INTERNAL_ERROR', 1);
+if (!defined('PREG_BACKTRACK_LIMIT_ERROR'))
+  define('PREG_BACKTRACK_LIMIT_ERROR', 2);
+if (!defined('PREG_RECURSION_LIMIT_ERROR'))
+  define('PREG_RECURSION_LIMIT_ERROR', 3);
+if (!defined('PREG_BAD_UTF8_ERROR'))
+  define('PREG_BAD_UTF8_ERROR', 4);
+
+function preg_last_error()
+{
+  return PREG_NO_ERROR;
+}
+?>
Index: tags/2.4.0RC3/include/picture_comment.inc.php
===================================================================
--- tags/2.4.0RC3/include/picture_comment.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/picture_comment.inc.php	(revision 14585)
@@ -0,0 +1,258 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the picture page to manage user comments
+ *
+ */
+
+// the picture is commentable if it belongs at least to one category which
+// is commentable
+$page['show_comments'] = false;
+foreach ($related_categories as $category)
+{
+  if ($category['commentable'])
+  {
+    $page['show_comments'] = true;
+    break;
+  }
+}
+
+if ( $page['show_comments'] and isset( $_POST['content'] ) )
+{
+  if ( is_a_guest() and !$conf['comments_forall'] )
+  {
+    die ('Session expired');
+  }
+
+  $comm = array(
+    'author' => trim( @$_POST['author'] ),
+    'content' => trim( $_POST['content'] ),
+    'image_id' => $page['image_id'],
+   );
+
+  include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+  $comment_action = insert_user_comment($comm, @$_POST['key'], $page['infos']);
+
+  switch ($comment_action)
+  {
+    case 'moderate':
+      array_push($page['infos'], l10n('An administrator must authorize your comment before it is visible.') );
+    case 'validate':
+      array_push($page['infos'], l10n('Your comment has been registered'));
+      break;
+    case 'reject':
+      set_status_header(403);
+      array_push($page['errors'], l10n('Your comment has NOT been registered because it did not pass the validation rules') );
+      break;
+    default:
+      trigger_error('Invalid comment action '.$comment_action, E_USER_WARNING);
+  }
+
+  // allow plugins to notify what's going on
+  trigger_action( 'user_comment_insertion',
+      array_merge($comm, array('action'=>$comment_action) )
+    );
+}
+elseif ( isset($_POST['content']) )
+{
+  set_status_header(403);
+  die('ugly spammer');
+}
+
+if ($page['show_comments'])
+{
+  if ( !is_admin() )
+  {
+    $validated_clause = '  AND validated = \'true\'';
+  }
+  else
+  {
+    $validated_clause = '';
+  }
+
+  // number of comments for this picture
+  $query = '
+SELECT
+    COUNT(*) AS nb_comments
+  FROM '.COMMENTS_TABLE.'
+  WHERE image_id = '.$page['image_id']
+  .$validated_clause.'
+;';
+  $row = pwg_db_fetch_assoc( pwg_query( $query ) );
+
+  // navigation bar creation
+  if (!isset($page['start']))
+  {
+    $page['start'] = 0;
+  }
+
+  $navigation_bar = create_navigation_bar(
+    duplicate_picture_url(array(), array('start')),
+    $row['nb_comments'],
+    $page['start'],
+    $conf['nb_comment_page'],
+    true // We want a clean URL
+    );
+
+  $template->assign(
+    array(
+      'COMMENT_COUNT' => $row['nb_comments'],
+      'navbar' => $navigation_bar,
+      )
+    );
+
+  if ($row['nb_comments'] > 0)
+  {
+    // comments order (get, session, conf)
+    if (!empty($_GET['comments_order']) && in_array(strtoupper($_GET['comments_order']), array('ASC', 'DESC')))
+    {
+      pwg_set_session_var('comments_order', $_GET['comments_order']);
+    }
+    $comments_order = pwg_get_session_var('comments_order', $conf['comments_order']);
+
+    $template->assign(array(
+      'COMMENTS_ORDER_URL' => add_url_params( duplicate_picture_url(), array('comments_order'=> ($comments_order == 'ASC' ? 'DESC' : 'ASC') ) ),
+      'COMMENTS_ORDER_TITLE' => $comments_order == 'ASC' ? l10n('Show latest comments first') : l10n('Show oldest comments first'),
+      ));
+        
+    $query = '
+SELECT
+    com.id,
+    author,
+    author_id,
+    '.$conf['user_fields']['username'].' AS username,
+    date,
+    image_id,
+    content,
+    validated
+  FROM '.COMMENTS_TABLE.' AS com
+  LEFT JOIN '.USERS_TABLE.' AS u
+    ON u.'.$conf['user_fields']['id'].' = author_id
+  WHERE image_id = '.$page['image_id'].'
+    '.$validated_clause.'
+  ORDER BY date '.$comments_order.'
+  LIMIT '.$conf['nb_comment_page'].' OFFSET '.$page['start'].'
+;';
+    $result = pwg_query( $query );
+
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      if (!empty($row['author']))
+      {
+	$author = $row['author'];
+	if ($author == 'guest')
+	{
+	  $author = l10n('guest');
+	}
+      }
+      else
+      {
+	$author = stripslashes($row['username']);
+      }
+
+      $tpl_comment =
+        array(
+          'ID' => $row['id'],
+          'AUTHOR' => trigger_event('render_comment_author', $author),
+          'DATE' => format_date($row['date'], true),
+          'CONTENT' => trigger_event('render_comment_content',$row['content']),
+        );
+
+      if (can_manage_comment('delete', $row['author_id']))
+      {
+        $tpl_comment['U_DELETE'] = add_url_params(
+          $url_self,
+          array(
+            'action'=>'delete_comment',
+            'comment_to_delete'=>$row['id'],
+            'pwg_token' => get_pwg_token(),
+            )
+          );
+      }
+      if (can_manage_comment('edit', $row['author_id']))
+      {
+        $tpl_comment['U_EDIT'] = add_url_params(
+          $url_self,
+          array(
+            'action'=>'edit_comment',
+            'comment_to_edit'=>$row['id'],
+            )
+          );
+          if (isset($edit_comment) and ($row['id'] == $edit_comment))
+          {
+            $tpl_comment['IN_EDIT'] = true;
+            $key = get_ephemeral_key(2, $page['image_id']);
+            $tpl_comment['KEY'] = $key;
+            $tpl_comment['CONTENT'] = $row['content'];
+            $tpl_comment['PWG_TOKEN'] = get_pwg_token();
+          }
+      }
+      if (is_admin())
+      {
+        if ($row['validated'] != 'true')
+        {
+          $tpl_comment['U_VALIDATE'] = add_url_params(
+                  $url_self,
+                  array(
+                    'action' => 'validate_comment',
+                    'comment_to_validate' => $row['id'],
+                    'pwg_token' => get_pwg_token(),
+                    )
+                  );
+        }
+      }
+      $template->append('comments', $tpl_comment);
+    }
+  }
+
+  $show_add_comment_form = true;
+  if (isset($edit_comment))
+  {
+    $show_add_comment_form = false;
+  }
+  if (is_a_guest() and !$conf['comments_forall'])
+  {
+    $show_add_comment_form = false;
+  }
+
+  if ($show_add_comment_form)
+  {
+    $key = get_ephemeral_key(3, $page['image_id']);
+    $content = '';
+    if ('reject'===@$comment_action)
+    {
+      $content = htmlspecialchars( stripslashes($comm['content']) );
+    }
+    $template->assign('comment_add',
+        array(
+          'F_ACTION' => $url_self,
+          'KEY' => $key,
+          'CONTENT' => $content,
+          'SHOW_AUTHOR' => !is_classic_user()
+        ));
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/picture_metadata.inc.php
===================================================================
--- tags/2.4.0RC3/include/picture_metadata.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/picture_metadata.inc.php	(revision 14585)
@@ -0,0 +1,105 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the picture page to manage picture metadata
+ *
+ */
+
+
+include_once(PHPWG_ROOT_PATH.'/include/functions_metadata.inc.php');
+if (($conf['show_exif']) and (function_exists('read_exif_data')))
+{
+  $exif_mapping = array();
+  foreach ($conf['show_exif_fields'] as $field)
+  {
+    $exif_mapping[$field] = $field;
+  }
+
+  $exif = get_exif_data($picture['current']['src_image']->get_path(), $exif_mapping);
+  
+  if (count($exif) > 0)
+  {
+    $tpl_meta = array(
+        'TITLE' => l10n('EXIF Metadata'),
+        'lines' => array(),
+      );
+
+    foreach ($conf['show_exif_fields'] as $field)
+    {
+      if (strpos($field, ';') === false)
+      {
+        if (isset($exif[$field]))
+        {
+          $key = $field;
+          if (isset($lang['exif_field_'.$field]))
+          {
+            $key = $lang['exif_field_'.$field];
+          }
+          $tpl_meta['lines'][$key] = $exif[$field];
+        }
+      }
+      else
+      {
+        $tokens = explode(';', $field);
+        if (isset($exif[$field]))
+        {
+          $key = $tokens[1];
+          if (isset($lang['exif_field_'.$key]))
+          {
+            $key = $lang['exif_field_'.$key];
+          }
+          $tpl_meta['lines'][$key] = $exif[$field];
+        }
+      }
+    }
+    $template->append('metadata', $tpl_meta);
+  }
+}
+
+if ($conf['show_iptc'])
+{
+  $iptc = get_iptc_data($picture['current']['src_image']->get_path(), $conf['show_iptc_mapping']);
+
+  if (count($iptc) > 0)
+  {
+    $tpl_meta = array(
+        'TITLE' => l10n('IPTC Metadata'),
+        'lines' => array(),
+      );
+
+    foreach ($iptc as $field => $value)
+    {
+      $key = $field;
+      if (isset($lang[$field]))
+      {
+        $key = $lang[$field];
+      }
+      $tpl_meta['lines'][$key] = $value;
+    }
+    $template->append('metadata', $tpl_meta);
+  }
+}
+
+
+?>
Index: tags/2.4.0RC3/include/picture_rate.inc.php
===================================================================
--- tags/2.4.0RC3/include/picture_rate.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/picture_rate.inc.php	(revision 14585)
@@ -0,0 +1,87 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This file is included by the picture page to manage rates
+ *
+ */
+
+if ($conf['rate'])
+{
+  $rate_summary = array( 'count'=>0, 'score'=>$picture['current']['rating_score'], 'average'=>null );
+  if ( NULL != $rate_summary['score'] )
+  {
+    $query = '
+SELECT COUNT(rate) AS count
+     , ROUND(AVG(rate),2) AS average
+  FROM '.RATE_TABLE.'
+  WHERE element_id = '.$picture['current']['id'].'
+;';
+		list($rate_summary['count'], $rate_summary['average']) = pwg_db_fetch_row(pwg_query($query));
+  }
+  $template->assign('rate_summary', $rate_summary);
+
+  $user_rate = null;
+  if ($conf['rate_anonymous'] or is_autorize_status(ACCESS_CLASSIC) )
+  {
+    if ($rate_summary['count']>0)
+    {
+      $query = 'SELECT rate
+      FROM '.RATE_TABLE.'
+      WHERE element_id = '.$page['image_id'] . '
+      AND user_id = '.$user['id'] ;
+
+      if ( !is_autorize_status(ACCESS_CLASSIC) )
+      {
+        $ip_components = explode('.', $_SERVER['REMOTE_ADDR']);
+        if ( count($ip_components)>3 )
+        {
+          array_pop($ip_components);
+        }
+        $anonymous_id = implode ('.', $ip_components);
+        $query .= ' AND anonymous_id = \''.$anonymous_id . '\'';
+      }
+
+      $result = pwg_query($query);
+      if (pwg_db_num_rows($result) > 0)
+      {
+        $row = pwg_db_fetch_assoc($result);
+        $user_rate = $row['rate'];
+      }
+    }
+
+    $template->assign(
+        'rating',
+        array(
+          'F_ACTION' => add_url_params(
+                        $url_self,
+                        array('action'=>'rate')
+                      ),
+          'USER_RATE'=> $user_rate,
+          'marks'    => $conf['rate_items']
+        )
+      );
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/section_init.inc.php
===================================================================
--- tags/2.4.0RC3/include/section_init.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/section_init.inc.php	(revision 14585)
@@ -0,0 +1,629 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * This included page checks section related parameter and provides
+ * following informations:
+ *
+ * - $page['title']
+ *
+ * - $page['items']: ordered list of items to display
+ *
+ */
+
+// "index.php?/category/12-foo/start-24" or
+// "index.php/category/12-foo/start-24"
+// must return :
+//
+// array(
+//   'section'  => 'categories',
+//   'category' => array('id'=>12, ...),
+//   'start'    => 24
+//   );
+
+$page['items'] = array();
+
+// some ISPs set PATH_INFO to empty string or to SCRIPT_FILENAME while in the
+// default apache implementation it is not set
+if ( $conf['question_mark_in_urls']==false and
+     isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) )
+{
+  $rewritten = $_SERVER["PATH_INFO"];
+  $rewritten = str_replace('//', '/', $rewritten);
+  $path_count = count( explode('/', $rewritten) );
+  $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1);
+}
+else
+{
+  $rewritten = '';
+  foreach (array_keys($_GET) as $keynum => $key)
+  {
+    $rewritten = $key;
+    break;
+  }
+
+  // the $_GET keys are not protected in include/common.inc.php, only the values
+  $rewritten = pwg_db_real_escape_string($rewritten);
+  $page['root_path'] = PHPWG_ROOT_PATH;
+}
+
+if ( strncmp($page['root_path'], './', 2) == 0 )
+{
+  $page['root_path'] = substr($page['root_path'], 2);
+}
+
+// deleting first "/" if displayed
+$tokens = explode('/', ltrim($rewritten, '/') );
+// $tokens = array(
+//   0 => category,
+//   1 => 12-foo,
+//   2 => start-24
+//   );
+
+$next_token = 0;
+if (script_basename() == 'picture') // basename without file extention
+{ // the first token must be the identifier for the picture
+  if ( isset($_GET['image_id'])
+       and isset($_GET['cat']) and is_numeric($_GET['cat']) )
+  {// url compatibility with versions below 1.6
+    $url = make_picture_url( array(
+        'section' => 'categories',
+        'category' => get_cat_info($_GET['cat']),
+        'image_id' => $_GET['image_id']
+      ) );
+    redirect($url);
+  }
+  $token = $tokens[$next_token];
+  $next_token++;
+  if ( is_numeric($token) )
+  {
+    $page['image_id'] = $token;
+    if ($page['image_id']==0)
+    {
+      bad_request('invalid picture identifier');
+    }
+  }
+  else
+  {
+    preg_match('/^(\d+-)?(.*)?$/', $token, $matches);
+    if (isset($matches[1]) and is_numeric($matches[1]=rtrim($matches[1],'-')) )
+    {
+      $page['image_id'] = $matches[1];
+      if ( !empty($matches[2]) )
+      {
+        $page['image_file'] = $matches[2];
+      }
+    }
+    else
+    {
+      $page['image_id'] = 0; // more work in picture.php
+      if ( !empty($matches[2]) )
+      {
+        $page['image_file'] = $matches[2];
+      }
+      else
+      {
+        bad_request('picture identifier is missing');
+      }
+    }
+  }
+}
+
+$page = array_merge( $page, parse_section_url( $tokens, $next_token) );
+
+if ( !isset($page['section']) )
+{
+  $page['section'] = 'categories';
+
+  switch (script_basename())
+  {
+    case 'picture':
+      break;
+    case 'index':
+    {
+      // No section defined, go to selected url
+      if (!empty($conf['random_index_redirect']) and empty($tokens[$next_token]) )
+      {
+        $random_index_redirect = array();
+        foreach ($conf['random_index_redirect'] as $random_url => $random_url_condition)
+        {
+          if (empty($random_url_condition) or eval($random_url_condition))
+          {
+            $random_index_redirect[] = $random_url;
+          }
+        }
+        if (!empty($random_index_redirect))
+        {
+          redirect($random_index_redirect[mt_rand(0, count($random_index_redirect)-1)]);
+        }
+      }
+      $page['is_homepage'] = true;
+      break;
+    }
+    default:
+      trigger_error('script_basename "'.script_basename().'" unknown',
+        E_USER_WARNING);
+  }
+}
+
+$page = array_merge( $page, parse_well_known_params_url( $tokens, $next_token) );
+if ( script_basename()=='picture' and 'categories'==$page['section'] and
+      !isset($page['category']) and !isset($page['chronology_field']) )
+{ //access a picture only by id, file or id-file without given section
+  $page['flat']=true;
+}
+
+// $page['nb_image_page'] is the number of picture to display on this page
+// By default, it is the same as the $user['nb_image_page']
+$page['nb_image_page'] = $user['nb_image_page'];
+
+// if flat mode is active, we must consider the image set as a standard set
+// and not as a category set because we can't use the #image_category.rank :
+// displayed images are not directly linked to the displayed category
+if ('categories' == $page['section'] and !isset($page['flat']))
+{
+  $conf['order_by'] = $conf['order_by_inside_category'];
+}
+
+if (pwg_get_session_var('image_order',0) > 0)
+{
+  $image_order_id = pwg_get_session_var('image_order');
+
+  $orders = get_category_preferred_image_orders();
+
+  // the current session stored image_order might be not compatible with
+  // current image set, for example if the current image_order is the rank
+  // and that we are displaying images related to a tag.
+  //
+  // In case of incompatibility, the session stored image_order is removed.
+  if ($orders[$image_order_id][2])
+  {
+    $conf['order_by'] = str_replace(
+      'ORDER BY ',
+      'ORDER BY '.$orders[$image_order_id][1].',',
+      $conf['order_by']
+    );
+    $page['super_order_by'] = true;
+
+  }
+  else
+  {
+    pwg_unset_session_var('image_order');
+    $page['super_order_by'] = false;
+  }
+}
+
+$forbidden = get_sql_condition_FandF(
+      array
+        (
+          'forbidden_categories' => 'category_id',
+          'visible_categories' => 'category_id',
+          'visible_images' => 'id'
+        ),
+      'AND'
+  );
+
+// +-----------------------------------------------------------------------+
+// |                              category                                 |
+// +-----------------------------------------------------------------------+
+if ('categories' == $page['section'])
+{
+  if (isset($page['category']))
+  {
+    $page = array_merge(
+      $page,
+      array(
+        'comment'           =>
+            trigger_event(
+              'render_category_description',
+              $page['category']['comment'],
+              'main_page_category_description'
+            ),
+        'title'             => get_cat_display_name($page['category']['upper_names'], '', false),
+        )
+      );
+  }
+  else
+    $page['title'] = ''; // will be set later
+
+  if
+    (
+      (!isset($page['chronology_field'])) and
+      (
+        (isset($page['category'])) or
+        (isset($page['flat']))
+      )
+    )
+  {
+    if ( !empty($page['category']['image_order']) and !isset($page['super_order_by']) )
+    {
+      $conf[ 'order_by' ] = ' ORDER BY '.$page['category']['image_order'];
+    }
+
+    if (isset($page['flat']))
+    {// flat categories mode
+      if ( isset($page['category']) )
+      { // get all allowed sub-categories
+        $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE
+    uppercats LIKE \''.$page['category']['uppercats'].',%\' '
+    .get_sql_condition_FandF(
+      array
+        (
+          'forbidden_categories' => 'id',
+          'visible_categories' => 'id',
+        ),
+      "\n  AND"
+          );
+        $subcat_ids = array_from_query($query, 'id');
+        $subcat_ids[] = $page['category']['id'];
+        $where_sql = 'category_id IN ('.implode(',',$subcat_ids).')';
+        // remove categories from forbidden because just checked above
+        $forbidden = get_sql_condition_FandF(
+              array( 'visible_images' => 'id' ),
+              'AND'
+          );
+      }
+      else
+      {
+        unset($page['is_homepage']);
+        $where_sql = '1=1';
+      }
+    }
+    else
+    {// Normal mode
+      $where_sql = 'category_id = '.$page['category']['id'];
+    }
+
+    // Main query
+    $query = '
+SELECT DISTINCT(image_id)
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    INNER JOIN '.IMAGES_TABLE.' ON id = image_id
+  WHERE
+    '.$where_sql.'
+'.$forbidden.'
+  '.$conf['order_by'].'
+;';
+
+    $page['items'] = array_from_query($query, 'image_id');
+  } //otherwise the calendar will requery all subitems
+}
+// special sections
+else
+{
+// +-----------------------------------------------------------------------+
+// |                            tags section                               |
+// +-----------------------------------------------------------------------+
+  if ($page['section'] == 'tags')
+  {
+    $page['tag_ids'] = array();
+    foreach ($page['tags'] as $tag)
+    {
+      array_push($page['tag_ids'], $tag['id']);
+    }
+
+    $items = get_image_ids_for_tags($page['tag_ids']);
+
+    $page = array_merge(
+      $page,
+      array(
+        'title' => get_tags_content_title(),
+        'items' => $items,
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                           search section                              |
+// +-----------------------------------------------------------------------+
+  if ($page['section'] == 'search')
+  {
+    include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
+
+    $search_result = get_search_results($page['search'], @$page['super_order_by'] );
+    if ( isset($search_result['qs']) )
+    {//save the details of the query search
+      $page['qsearch_details'] = $search_result['qs'];
+    }
+
+    $page = array_merge(
+      $page,
+      array(
+        'items' => $search_result['items'],
+        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
+                  .l10n('Search results').'</a>',
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                           favorite section                            |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'favorites')
+  {
+    check_user_favorites();
+
+    $page = array_merge(
+      $page,
+      array(
+        'title' => l10n('Favorites')
+      )
+    );
+
+    if (!empty($_GET['action']) && ($_GET['action'] == 'remove_all_from_favorites'))
+    {
+      $query = '
+DELETE FROM '.FAVORITES_TABLE.'
+  WHERE user_id = '.$user['id'].'
+;';
+      pwg_query($query);
+      redirect(make_index_url( array('section'=>'favorites') ));
+    }
+    else
+    {
+      $query = '
+SELECT image_id
+  FROM '.FAVORITES_TABLE.'
+    INNER JOIN '.IMAGES_TABLE.' ON image_id = id
+  WHERE user_id = '.$user['id'].'
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'visible_images' => 'id'
+      ),
+    'AND'
+  ).'
+  '.$conf['order_by'].'
+;';
+      $page = array_merge(
+	$page,
+	array(
+	  'items' => array_from_query($query, 'image_id'),
+         )
+      );
+
+      if (count($page['items'])>0)
+      {
+	$template->assign(
+	  'favorite',
+	  array(
+	    'U_FAVORITE'    => add_url_params(
+	      make_index_url( array('section'=>'favorites') ),
+	      array('action'=>'remove_all_from_favorites')
+	       ),
+	     )
+           );
+      }
+    }
+  }
+// +-----------------------------------------------------------------------+
+// |                       recent pictures section                         |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'recent_pics')
+  {
+    if ( !isset($page['super_order_by']) )
+    {
+      $conf['order_by'] = str_replace(
+        'ORDER BY ',
+        'ORDER BY date_available DESC,',
+        $conf['order_by']
+        );
+    }
+
+    $query = '
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE
+    date_available >= '.pwg_db_get_recent_period_expression($user['recent_period']).'
+    '.$forbidden.'
+  '.$conf['order_by'].'
+;';
+
+    $page = array_merge(
+      $page,
+      array(
+        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
+                  .l10n('Recent photos').'</a>',
+        'items' => array_from_query($query, 'id'),
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                 recently updated categories section                   |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'recent_cats')
+  {
+    $page = array_merge(
+      $page,
+      array(
+        'title' => l10n('Recent albums'),
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                        most visited section                           |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'most_visited')
+  {
+    $page['super_order_by'] = true;
+    $conf['order_by'] = ' ORDER BY hit DESC, id DESC';
+    $query = '
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE hit > 0
+    '.$forbidden.'
+    '.$conf['order_by'].'
+  LIMIT '.$conf['top_number'].'
+;';
+
+    $page = array_merge(
+      $page,
+      array(
+        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
+                  .$conf['top_number'].' '.l10n('Most visited').'</a>',
+        'items' => array_from_query($query, 'id'),
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                          best rated section                           |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'best_rated')
+  {
+    $page['super_order_by'] = true;
+    $conf['order_by'] = ' ORDER BY rating_score DESC, id DESC';
+
+    $query ='
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE rating_score IS NOT NULL
+    '.$forbidden.'
+    '.$conf['order_by'].'
+  LIMIT '.$conf['top_number'].'
+;';
+    $page = array_merge(
+      $page,
+      array(
+        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
+                  .$conf['top_number'].' '.l10n('Best rated').'</a>',
+        'items' => array_from_query($query, 'id'),
+        )
+      );
+  }
+// +-----------------------------------------------------------------------+
+// |                             list section                              |
+// +-----------------------------------------------------------------------+
+  else if ($page['section'] == 'list')
+  {
+    $query ='
+SELECT DISTINCT(id)
+  FROM '.IMAGES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+  WHERE image_id IN ('.implode(',', $page['list']).')
+    '.$forbidden.'
+  '.$conf['order_by'].'
+;';
+
+    $page = array_merge(
+      $page,
+      array(
+        'title' => '<a href="'.duplicate_index_url(array('start'=>0)).'">'
+                    .l10n('Random photos').'</a>',
+        'items' => array_from_query($query, 'id'),
+        )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                             chronology                                |
+// +-----------------------------------------------------------------------+
+
+if (isset($page['chronology_field']))
+{
+  unset($page['is_homepage']);
+  include_once( PHPWG_ROOT_PATH.'include/functions_calendar.inc.php' );
+  initialize_calendar();
+}
+
+// title update
+if (isset($page['title']))
+{
+  if (!empty($page['title']))
+	{
+	  $page['title'] = $conf['level_separator'].$page['title'];
+	}
+  $page['title'] = '<a href="'.get_gallery_home_url().'">'.l10n('Home').'</a>'.$page['title'];
+}
+
+// add meta robots noindex, nofollow to avoid unnecesary robot crawls
+$page['meta_robots']=array();
+if ( isset($page['chronology_field'])
+      or ( isset($page['flat']) and isset($page['category']) )
+      or 'list'==$page['section'] or 'recent_pics'==$page['section'] )
+{
+  $page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+}
+elseif ('tags' == $page['section'])
+{
+  if ( count($page['tag_ids'])>1 )
+  {
+    $page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+  }
+}
+elseif ('recent_cats'==$page['section'])
+{
+  $page['meta_robots']['noindex']=1;
+}
+elseif ('search'==$page['section'])
+{
+  $page['meta_robots']['nofollow']=1;
+}
+if ( $filter['enabled'] )
+{
+  $page['meta_robots']['noindex']=1;
+}
+
+// see if we need a redirect because of a permalink
+if ( 'categories'==$page['section'] and isset($page['category']) )
+{
+  $need_redirect=false;
+  if ( empty($page['category']['permalink']) )
+  {
+    if ( $conf['category_url_style'] == 'id-name' and
+        @$page['hit_by']['cat_url_name'] !== str2url($page['category']['name']) )
+    {
+      $need_redirect=true;
+    }
+  }
+  else
+  {
+    if ( $page['category']['permalink'] !== @$page['hit_by']['cat_permalink'] )
+    {
+      $need_redirect=true;
+    }
+  }
+
+  if ($need_redirect)
+  {
+    $redirect_url = ( script_basename()=='picture'
+        ? duplicate_picture_url()
+          : duplicate_index_url()
+      );
+    if (!headers_sent())
+    { // this is a permanent redirection
+      set_status_header(301);
+      redirect_http( $redirect_url );
+    }
+    redirect( $redirect_url );
+  }
+  unset( $need_redirect, $page['hit_by'] );
+}
+
+trigger_action('loc_end_section_init');
+?>
Index: tags/2.4.0RC3/include/smarty/COPYING.lib
===================================================================
--- tags/2.4.0RC3/include/smarty/COPYING.lib	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/COPYING.lib	(revision 14585)
@@ -0,0 +1,466 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
Index: tags/2.4.0RC3/include/smarty/NEWS
===================================================================
--- tags/2.4.0RC3/include/smarty/NEWS	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/NEWS	(revision 14585)
@@ -0,0 +1,1067 @@
+Version 2.6.26 (June 18th, 2009)
+-------------------------------
+- revert super global access changes, and instead rely on
+  USE_SUPER_GLOBALS for security
+
+Version 2.6.25 (May 19th, 2009)
+-------------------------------
+- fix E_NOTICE when sessions are disabled (mohrt)
+
+Version 2.6.24 (May 16th, 2009)
+-------------------------------
+- fix problem introduced with super global changes (mohrt)
+
+Version 2.6.23 (May 13th, 2009)
+-------------------------------
+- strip backticks from {math} equations (mohrt)
+- make PHP super globals read-only from template (mohrt)
+- throw error when template exists but not readable (mohrt)
+
+Version 2.6.22 (Dec 17th, 2008)
+-------------------------------
+
+- back out method chaining, bug in some versions of PCRE causes errors (mohrt)
+
+Version 2.6.21 (Dec 2nd, 2008)
+------------------------------
+
+- fix  function injection security hole closed (U.Tews)
+- fix pass expiration time at cache_handler_fuc call in core.write_cache_file.php (U.Tews)
+- Update of compiler.class.php to allow method chaining for PHP4 and PHP5 (U.Tews)
+
+Version 2.6.20 (Feb 15th, 2008)
+-------------------------------
+
+- fix cache tag bug when multiple cache tags on a page (mankyd,
+  mohrt)
+- fix /e tag checking when using arrays with regex_replace
+  (mohrt)
+- fix that function results can be used with condition like "is even" in 
+  {if} tags (U.Tews)
+- fix handling of non-empty <pre>-tags and empty <textarea>- and
+  <script>-tags (Spuerhund, messju)
+
+Version 2.6.19 (Feb 11th, 2008)
+-------------------------------
+
+- fix regex_replace allowing \0 in the search string (c960657,
+  monte)
+- add append feature to {capture} (jablko, monte)
+- fix when (un)registering filters with the same method name but different class
+  name (danilo)
+- fix calling registered objects' methods with an empty argument list
+  (marcello, messju)
+ 
+Version 2.6.18 (Mar 7th, 2007)
+------------------------------
+
+- fix html_select_date separator when parts are missing (hayk,
+  monte)
+- fix broken detection of non-cached blocks introduced in 2.6.17
+  (messju)
+
+Version 2.6.17 (Mar 5th, 2007)
+------------------------------
+
+- fix php handling (monte, boots, danilo)
+- fix handling of plugin tags directly followed by an else tag (Fahr, danilo)
+- fix handling of $etc in the truncate modifier when $etc is longer
+  than $length (Sylvinus, messju)
+- fix handling of %I with mysql timestamps in the date_format modifier
+  (danilo, boots)
+- update smarty_core_write_file() and smarty_modifier_date_format() to better
+  recognize Windows (boots, danilo)
+- emulate %h, %n, %r, %R, %t in the date_format modifier on Windows 
+  (danilo, boots)
+
+Version 2.6.16 (Dec 1st, 2006)
+------------------------------
+
+- fixed replacement bug in trimwhitespace output filter that was introduced
+  in the last release (Spuerhund, boots)
+
+Version 2.6.15 (Nov 30th, 2006)
+-------------------------------
+
+- change file writing semantics in smarty_core_write_file() to unlink() only
+  when rename() fails or a Windows system is detected (c960657, boots) 
+- update debug.tpl to xhtml 1.1 compliance, fix javascript escaping in debug
+  output and apply a Smarty based color scheme (cybot, boots)
+- enhance reporting precision of debug_print_var modifier (cybot, boots) 
+- make html_select_date work consistently with 0000-00-00 00:00:00 and
+  0000-00-00 inputs (cybot, boots)
+- fix wrong handling of insert's name attribute. (messju)
+- fix false replacement of "$t" inside double quotes (checat, messju)
+- added support for column headings and caption element to html_table and
+  updated the output to use thead/tbody elements (boots)
+- fixed ordering of replacements in trimwhitespace output filter (Getty, boots)
+- update mailto function plugin to work around a firefox/thunderbird
+  escaping bug (elijahlofgren, boots)
+- emulate %l in the date_format modifier on windows (boots) 
+- fix handling of apostrophes in capitalize modifier (Alec Smecher, boots)
+
+Version 2.6.14 (May 28th, 2006)
+-------------------------------
+
+- fix compiler bug allowing php tags in secure templates
+  (boots,monte)
+- un-hide hidden xml open tags (boots)
+- fix handling of block-methods of registered objects (El Hombre Gris,
+  messju)
+
+Version 2.6.13 (March 9th, 2006)
+--------------------------------
+
+ - update regex_replace, removing possible use of "e" modifier
+
+Version 2.6.12 (Jan 18th, 2006)
+-------------------------------
+
+ - fix improper use of references in the compiler handling cached
+   attributes and in compiled code handling block plugins (messju)
+ - make Smarty::_read_file() work on latest php (messju)
+ - fixed improper tokenization of certain inline math expressions (boots)
+
+Version 2.6.11 (Dec 14, 2005)
+-----------------------------
+
+ - fixed code generation of non-cacheable blocks to play well with php's
+   "Alternative syntax for control structures" (kihara, messju)
+ - fix handling of multiple identical inserts in one display()-call (messju)
+ - replace {} string access with equivalent substr() to avoid E_STRICT
+   warnings in PHP 5.1 (boots)
+ - return valid reference in get_config_vars() when given var is
+   non-existant (Thomas Schulz, boots)
+ - plugin html_image: fix incorrect secure_dir error when
+   file doesn't exist (monte)
+ - plugin html_image: add path_prefix param (monte)
+ - add char_set parameter to escape modifier (Loading, monte)
+ - fix notice in debug security check (Drakla, monte)
+ - return valid reference in get_template_vars() when given var is
+   non-existant (monte)
+ - add escape type "urlpathinfo" to escape modifier (monte)
+
+Version 2.6.10 (Aug 5, 2005)
+----------------------------
+
+  - allow secure_dir to be a filename, not just
+    a directory name (monte)
+  - set debug.tpl as a secure_dir, not the entire
+    SMARTY_DIR (monte)
+  - fix proper escaping for literal strings in
+    Smarty_Compiler::_parse_var_props() (boots, messju)
+  - remove ambiguity for numeric values passed to smarty_make_timestamp()
+    (and thus the date_format modifier). numeric values are treated as
+    timestamps now. (andreas, messju)
+  - add passthru attribute feature to html_select_date (Sedgar,
+    monte)
+  - add "middle" parameter to truncate (monte)
+  - make form input label ids optional (monte)
+  - add error message for empty if/elseif statements (eykanal,
+    monte)
+  - cast selected value to string for comparison in html_radios
+    (Exeption, monte)
+  - updated html_select_date's year_as_text-feature to be xhtml compliant
+    (Mark West, messju)
+  - fix handling of selected month html_select_date (Yuri Weseman, messju)
+
+Version 2.6.9 (Mar 31, 2005)
+----------------------------
+
+  - disallow variable function calls in {if} statements (messju, monte)
+  - disallow variable function calls in {math} equations (messju, monte)
+
+Version 2.6.8 (Mar 21, 2005)
+----------------------------
+
+  - remove e-modifier from regex_replace modifier (messju)
+  - remove cast of object to array in foreach's from-attribute (messju)
+  - add "null" as a valid token for {if} when security is enabled (messju)
+  - add javascript_charcode encoding option to mailto function
+    (monte)
+  - add ids to html_radios labels (monte, menulis)
+  - fix handling of strip-tags with non-default delimiters (Mark West, messju)
+
+Version 2.6.7 (Feb 3, 2005)
+---------------------------
+
+  - fix handling of hashed opening php-tags inside strip-blocks (messju)
+  - removed border tag from html_image function (monte)
+  - change escape:url use rawurlencode() instead of urlencode() (messju)
+  - make $smarty.const.FOO compile to "FOO", and not to "constant('foo')".
+    this is less code and a little faster execution. note that undefined
+    constants are now displayed as the constant's name. (messju)
+  - make block functions and registered objects' block methods use a
+    local variable for block_content instead of a property of $smarty (messju)
+  - fix escaping in the generated code that calls smarty_core_load_plugins
+    (jes5199, messju)
+  - fix invalid HTML issue with popup (Stefanos Harhalakis,
+    Monte)
+  - fixed {popup} to properly handle inarray and function parameters and added
+    support for mouseoff and followmouse options (boots)
+
+Version 2.6.6 (Oct 13, 2004)
+----------------------------
+
+  - fixed nocache-handling with nested includes (Lars Jankowfsky, messju)
+  - moved /libs/core to /libs/internals (boots)
+  - fixed more parsing problems (messju)
+
+Version 2.6.5 (Sept 13, 2004)
+-----------------------------
+
+  - fixed some parsing problems with object calls introduced
+    in 2.6.4 (Monte)
+  - add $smarty->security_settings['ALLOW_CONSTANTS']. note: this
+    defaults to false which means you have to allow them explicitly
+    in your secured templates from now on! (messju)
+
+Version 2.6.4 (Sept 7, 2004)
+----------------------------
+
+  - add $smarty.ldelim and $smarty.rdelim to smarty special var (Monte)
+  - fall back to old uniqid()-behaviour when tempnam() fails in
+    core.write_file.php (messju)
+  - fix capitalize modifier, don't rely on buggy ucwords (Monte)
+  - make html_select_date work with negative timestamps, also
+    force year range to include given date unless explicitly
+    set (Garo, Monte)
+  - fix bug with {fetch}, passing user/pass in url did not work
+    (Monte)
+  - fix occasional wrong error messages on mismatched tags when
+    {else}, {elseif}, {foreachelse} or {sectionelse} is involved (messju)
+  - fix handling of methods arguments (messju, Manfred Wischin)
+  - remove touch() call that made the compiled-template's timestamp the
+    same as the source-template's one. (messju)
+  - add assign attribute to html_checkboxes and html_radios
+    (pcg, Monte)
+  - remove non-xhtml conformant tag from mailto function
+    (tacker, Monte)
+  - handle date_format codes %e, %T and %D for windows (tip,
+    Monte)
+  - fix unnecessary call to smarty_core_get_include_path() inside
+    Smarty::_get_auto_filename() (c960657, messju)
+  - add error-messages when anything else than an identifier is passed
+    to foreach's key- or item-attribute (messju)
+  - fix handling of digits inside tagnames (messju)
+  - fix escaping of backslashes in Smarty_Compiler::_quote_replace() (messju)
+
+Version 2.6.3 (June 16, 2004)
+-----------------------------
+
+  - added escapement of '</' to '<\/' in escape:javascript
+    modifier (c960657, Monte)
+  - added obfuscation of protocol-string in {mailto} when using hex-
+    encoding (bharat, messju)
+  - enhanced auto-generated filenames for templates_c and cache (messju)
+  - add 'nonstd' to escape modifier for escaping non-std chars,
+    such as ms doc quote (Monte)
+  - adjusted textformat to not output wrap chars after last para
+    (Monte)
+  - use tempnam() instead of unqid() to create better temporary files in
+    smarty_core_write_file() (xces, messju)
+  - add 'mail' to escape modifier for safe display of e-mail
+    addresses (Monte)
+  - add cycle function attribute "reset" to english docs (Monte)
+  - enhanced support of numeric constants as variable-expressions (messju)
+  - add case decentity to smarty_modifier_escape() (Konstantin A. Pelepelin,
+    messju)
+  - make smarty_core_write_compiled_include() php5-aware (messju)
+  - removed unused functionality to load a subset of lines from a file (messju)
+  - fix is_secure() should only check if a file is_readable, not if
+    the directory where it is in is readable (sagi, messju)
+  - fix problem displaying debug console when $default_resource_type
+    is not "file:" (c960657, Monte)
+  - fix permission handling with security and config_load (messju)
+  - removed '.' from the list of default template locations in
+    _parse_resource_name() (messju)
+  - fix avoid warning with template_exists() on an absolute paths (messju)
+  - fix parameters passed to resource's secure()-function (messju)
+  - fix handling of integer values like width and delay im
+    smarty_function_popup() (messju)
+
+Version 2.6.2 (Feb 17, 2004)
+----------------------------
+
+  - fix allow empty years, months and days in html_select_date's
+    time-attribute (messju)
+  - fix YES and NO should not be booleanized inside triple-quotes in a
+    config-file (messju)
+  - fix accidently slurped line following a triple-quoted value in a
+    config-file (messju)
+  - change default for use_sub_dirs to false (messju)
+  - fix quoting of values in smarty_function_popup() (messju)
+  - fix handling of hidden sections in Config_File (messju)
+  - add handling of resources for {config_load} (messju)
+  - fix bug when using arrays with tr_attr and td_attr in {html_table} (messju)
+  - add unit testing to cvs core (Monte)
+
+Version 2.6.1 (Jan 16, 2004)
+----------------------------
+
+  - rename $smarty->tpl_error_reporting to $smarty->error_reporting
+    (messju)
+  - fix interpretation of $smarty->security in {html_image} (messju)
+  - add caching of requested paths to _assemble_plugin_filepath() (messju)
+  - fix handling of comments inside {php}- and {literal}-blocks (messju)
+  - fix bug handling triple-quotes in config-files (BRDude, messju)
+  - change default of request_use_auto_globals to true - $_SERVER is
+    now preferred over $HTTP_SERVER_VARS (messju)
+  - re-add support for $SCRIPT_NAME (messju)
+  - reactivate $smarty->default_modifiers (messju)
+  - add cookie persistance to debug console (Monte)
+  - allow single-digit days and months without smarty_make_timestamp()
+    in html_select_date (messju)
+  - fix headers sent erroneously with cache_modified_check and fetch()
+    (wphilips, messju)
+  - fix config_file path bug (Marc Cabadas, Monte)
+  - fix 'is even by' and 'is odd by' logic (Monte)
+  - add day_empty, month_empty, year_empty and all_empty attributes to
+    html_select_date (messju)
+  - add table of explanation for {if} qualifiers in docs (boots)
+  - fix bug when comparing array-keys to "selected" in html_options
+    and html_checkboxes (messju)
+  - add better checks for correctly nested tags when compiling (messju)
+  - remove {$SCRIPT_NAME}. use {$smarty.server.SCRIPT_NAME} instead (messju)
+  - remove $global_assign. assign global variables explicitly instead (messju)
+  - fix example for count_characters in docs (boots)
+  - add section new basic syntax section "Escaping Smarty Parsing" in docs (boots)
+  - fix error handler call in config_load (boots)
+  - remove warning in debug_print_var on php-resources (messju)
+  - move function.assign.php to compiler.assign.php (messju)
+  - add property $tpl_error_reporting (messju)
+  - remove property $undefined. "null" is used literally instead (messju)
+
+Version 2.6.0 (Nov 19, 2003)
+----------------------------
+
+  - move Smarty::quote_replace() to Smarty_Compiler::_quote_replace() (messju)
+  - remove import of of attributes of {include_php} to php's namespace.
+    use $params[name] instead (messju)
+
+Version 2.6.0-RC3 (Nov 13, 2003)
+--------------------------------
+
+  - fix handling of $var.key inside [] (messju)
+  - fix handling of assign inside {insert}-tags (messju)
+  - fix handling if [...] inside triple-quotes in config-files (messju)
+  - fix handling of simple-math-operators inside modifiers (Dominik, messju)
+  - fix handling of trailing-slashes in open_basedir in
+    smarty_core_create_dir_structure() (packman, messju)
+
+Version 2.6.0-RC2 (Oct 8, 2003)
+-------------------------------
+
+  - apply modifiers only once to section-loop and foreach-from attrs (messju)
+  - remove use of _smarty_cached_paths-files (messju)
+  - remove Smarty::_plugin_implementation_exists() - use is_callable() (messju)
+  - ignore {strip}/{/strip) inside {strip}-blocks (messju)
+  - fixed removal of leading/trailing newlines in {strip}-blocks (messju)
+  - fixed proper escaping of " and ' with escape:javascript (messju)
+  - fixed bug in traversal of $smarty->plugins_dir-array. now the
+    first matching plugin is taken (messju)
+  - moved {strip} back into the compiler (messju)
+  - fixed config_load: handling of section-attribute and use of
+    multiple config-files in one template (atu, messju)
+
+Version 2.6.0-RC1 (August 11, 2003)
+-----------------------------------
+
+  - fixed status-header for cache_modified_check under cgi-sapi (messju)
+  - added optional parameter $cache_attrs to register_function() and
+    register_block(). $cache_attrs is an array containing attribute-
+    names that should be cached on calls to functions that have
+    $cacheable set to false. (messju)
+  - enabled registration of class-methods as callbacks for the register_*-
+    functions (use: array('classname', 'method_name')) as callback) (messju)
+  - added filepath caching (Monte)
+  - added optional assign-attribute to {capture}-tag (messju)
+  - added $cacheable-parameter to register_compiler_function() (messju)
+  - added $cacheable-parameter with default=true to register_function()
+    and register_block() (messju)
+  - add math speedup to core (Dominik, Monte)
+  - fix newlines for tags without template output (Monte)
+  - added config-option "request_use_auto_globals" to make auto-globals be
+    used as request vars instead of HTTP_*_VARS (messju)
+  - speed up config_load, simplify compiling (Monte)
+  - added block-methods for registered objects (Bharat Mediratta, messju)
+  - ignore one char resource names like c:foo.tpl (Monte)
+  - added default_resource_type feature (Monte)
+  - fix bug where config file starts with hidden section (boots, Monte)
+  - add discrete error checking pertaining to $cache_dir
+    and $compile_dir, their existance and writability (Monte)
+  - fixed behaviour of start=... for {counter} (messju)
+  - fixed assign for {counter} (messju)
+  - added params vdir, hdir and inner to html_table to allow looping
+    over the data in various directions (messju)
+  - allow spaces in literal tags (Paul Lockaby, Monte)
+  - speed up compiled templates, hardcode plugin filepaths
+    instead of dynamically calculate at runtime. (Monte)
+  - abstract many core components from Smarty.class.php,
+    speeding up core class instantiation (Monte)
+  - fixed bug in _create_dir_structure() when used with open_basedir-
+    restriction and relative paths (messju)
+  - use DIRECTORY_SEPARATOR exclusively, keep DIR_SEP for BC (Monte)
+  - changed "link" to "href" in html_image. "link" is still working
+    but deprecated (messju)
+  - html_image always renders an alt-tag now (default alt="") (messju)
+  - fixed assign attribute for multiple counters (messju)
+  - added simple math operators to variables (Monte)
+  - enabled array(&$obj. 'source', 'timestamp', 'secure', 'trusted')
+    as callback for register_resource() (messju);
+  - enabled array(&$obj, 'method') as callback for
+    $default_template_handler_func (messju)
+  - remove unnecessary close/open tags from compiled templates
+    (Monte)
+  - fixed errornous creation of '//' in image_path in html_image (messju)
+  - fix escapement of special chars for key vals in debug
+    console (Monte)
+  - fixed debug timing logic for config_load (Tom Sommer, Monte)
+  - all in-code doc comments converted to phpDocumentor format (Greg)
+  - moved strip from smarty core to plugin (Monte)
+  - moved config_load from smarty core to plugin (Monte)
+  - added &$repeat-parameter to block-functions (messju)
+  - enabled hex-constants in function.math.php (messju)
+  - enabled hex-constants (0x...) as function-attributes, inside if-statements
+    and as modifier-parameters (messju)
+  - fixed bug with passing $smarty as reference in Smarty.compiler.class
+    (messju)
+  - corrected output with {strip} and PHP tag newlines (Monte)
+  - added possibility to register function-callbacks as "array(&$obj, 'method)"
+    this affects register_function(), -block, -compiler_function, -modifier,
+    -prefilter, -postfilter, -outputfilter-functions() and $cache_handler_func
+    (messju)
+  - added <labels> to html_checkboxes and html_radios (Philippe, messju)
+  - added "labels"-options to turn off labels in html_checkboxes and _radios
+    (messju)
+
+Version 2.5.0 (April 11, 2003)
+------------------------------
+
+   - fixed bug with default modifier when passing integer 0
+     (Monte)
+   - change backtic syntax from $`foo` to `$foo` (Monte)
+   - recognize $foo[][] syntax inside embedded quotes without
+     backtics (Monte)
+   - name=123 is passed as an integer (not a string) to plugins now (messju)
+   - $length is now propagated to sub-values in debug_print_var (messju)
+
+Version 2.5.0-RC2 (March 26, 2003)
+----------------------------------
+
+    - made clear_cache() ignore compile_id, when clearing cache-groups (this
+      is when no $tpl_file is supplied) (messju)
+    - made onmouseout XHTML-compliant in function.popup.php (messju)
+    - applied local-var-naming-scheme to fetch() (messju)
+    - renamed $localvars to $_localvars in cache-file-handling-functions,
+      added _get_auto_id()-function (messju)
+    - swapped compile_id and cache_id in read_cache_file and write_cache_file
+      (messju)
+    - reverted patch for cache-file-handling (messju)
+    - made html_radios and html_checkboxes accept "selected" instead
+      of "checked" optionally. (messju)
+    - made compile_id ignored in clear_cache, made order of
+      auto_file_name $cache_id.$compile_id again, applied the the new
+      variable-naming-scheme for cache_file_handing functions (messju)
+    - removed notice of undefined var in _rm_auto() (messju)
+    - added warning message when an array is passed as
+      the "checked" value of html_radios (Monte)
+    - fixed errormessage in _compile_smarty_ref() (messju)
+    - updated docs for html_image "name" -> "file" (messju)
+    - fixed bug with html_options-optgroups (Nichlas Löfdahl, messju)
+    - cleaned up calls to readdir() (messju)
+    - fixed bug with passing multiple modifiers to a parameter
+      (Monte)
+    - updated docs for html_checkboxes, html_options and html_radios (messju)
+    - fixed wrong default "name" attribute for html_options (messju)
+    - html_checkboxes now expect the options as attribute "options" instead
+      of "checkboxes. html_radios expect "options" instead of "radios".
+      cleaned up indentiation (messju)
+    - fixed too greedy str_replace in trimwhitespace outputfilter (messju)
+    - html_checkboxes and html_radios passthru all unknown paramters now
+      additionally their output is now XHTML compliant (messju)
+    - html_options passthru all unknown paramters now (messju)
+    - fix link functionality of html_image, also make
+      output XHTML compatible (Hinrich Donner, Monte)
+    - append "@" to default modifier vars/args
+      supress possible warnings (Monte)
+    - fix problem with escaped double quotes (Monte)
+    - fix html_radios to not return an array (Monte)
+    - fixed length in modifier.truncate.php (messju)
+    - fixed handling of '$'-signs in trimwhitespace outputfilter (messju)
+    - fix bug that makes config files recompile every time
+      (Nagger, Monte)
+    - add dpi functionality to html_image, change "name"
+      parameter to "file" (Thomas Shulz, Monte)
+    - fix height/width parameter index in html_image (Gerard,
+      Monte)
+    - get rid of unsetting name and script attributes
+      to insert tag (Thomas Schulz, Monte)
+    - changed argument order of string_format modifier back,
+      was right in the first place (Monte)
+
+Version 2.5.0-RC1 (March 5, 2003)
+---------------------------------
+
+    - fixed notice in popup function (Nagger, Monte)
+    - fix "once" var compiling for include_php (Monte)
+    - added nl2br modifier to distribution (Monte)
+    - added html_image to distribution (Monte)
+    - added cat modifier to distribution (Monte)
+    - added html_table to distribution (Monte)
+    - added << >> <> support to if statments (SMK, Monte)
+    - fix _assign_smarty_interface to not overwrite keys
+      other than 'request' (Jerome Poudevigne, Monte)
+    - added html_checkboxes to distribution (Christopher Kvarme, Monte)
+    - added html_radios to distribution (Christopher Kvarme, Monte)
+    - fixed string_format modifier args (wrong order) (Paul
+      Lockaby, Monte)
+    - use tmp file for file writes, avoid file lock race (Monte)
+    - support syntax "$`smarty.config.foo`.tpl" for embedded
+      vars in quotes, and allow full dollar var syntax (Monte)
+    - add $smarty.config.varname variable for accessing config vars (Paul
+      Lockaby, Monte)
+    - silence PHP warnings in function.fetch.php (Eduardo,
+      Monte)
+    - added get_config_vars(), same basic functionality as
+      get_template_vars() (Monte)
+    - update get_template_vars() to be able to get
+      individual vars (Monte)
+    - fix minor logic in _fetch_template_info (Dennis Gearon,
+      Monte)
+    - fix cache groups with compile_id set (Monte)
+    - add support for merging appended vars (messju, Monte)
+    - allow null as function attribute value
+      (André Rabold, Monte)
+    - support $foo->bar[index] syntax (Monte)
+    - add get_registered_object function (messju, Monte)
+    - treat unrecognized param attribute syntax as string (Monte)
+    - support $smarty.const.$foo syntax (messju, Monte)
+    - remove E_NOTICE warnings from debug.tpl,
+      escape modifier (Kanstantin, Monte)
+    - don't count non-ascii chars in count_words modifier
+      (Kanstantin, Monte)
+    - clean up param calls to _parse_var and _parse_attrs (Monte)
+    - define $template_source var, elude possible warning
+      (Monte)
+    - fix syntax problem with evaluating PHP constants (Monte)
+    - add @ and === as valid if statement tokens (Monte)
+    - enable error messages for config_load errors,
+      use $this->config_class for loading class name (Monte)
+    - fix html_options to not escape already escaped entities (Monte)
+    - send Last-Modified header on cache creation (Monte)
+    - check strict syntax of function attributes (Monte)
+    - dropped support for modifers on object parameters,
+      added support for objects as modifier parameters (Monte)
+    - fixed bug with decimal numbers in if statements (Monte)
+
+Version 2.4.2 (Feb 11, 2003)
+----------------------------
+    - support embedded variables in objects (Monte)
+    - fix bug with objects with no properties (M Mohr, Monte)
+    - support full dollar var syntax in quoted text (Monte)
+    - fixed bug in $smarty.const.FOO introduced in 2.4.1 (M
+      Mohr, Monte)
+
+Version 2.4.1 (Feb 6, 2003)
+---------------------------
+
+    - ignore case in IF statements (Rainer Collet, Monte)
+    - treat undefined constants as null (Ferdinand Beyer, Monte)
+    - fix problem with inserts and nested fetches
+      (Rainer Collet, Monte)
+    - added support for passing params to include_php
+      (Tim Riley, Monte)
+    - added support for math operators in if statements (Monte)
+    - added support for $foo->bar[$x].blah syntax (Monte)
+
+Version 2.4.0 (Feb 2, 2003)
+---------------------------
+
+    - fix known problems with php tag handling in templates
+      (recursion, echoing xml tags) (Monte)
+    - add support for object registration (Monte)
+    - add debug template to secure_dir, add template_dir
+      to secure_dir by default (Ferdinand Beyer, Monte)
+    - added support for assigned object access (Monte)
+    - fixed bug with directories named '0' (Frank Bauer, Monte)
+    - add javascript parameter to escape modifier (Monte)
+    - added calling function line numbers to syntax error
+      messages in compiler (Monte)
+    - added support for modifiers to function calls (Monte)
+    - support return value for custom functions
+      instead of echoing (but echo still works) (Monte)
+    - added direct access to constants
+      via $smarty.const.FOO (Monte)
+    - added support for passing modifiers
+      to static values (Monte)
+    - fix up regex code in compiler, more accurate and
+      maintainable (Monte)
+    - added day_value_format to html_select_date (Marcus
+      Bointon, Monte)
+    - assigned variables are no longer in global
+      namespace, saving extract() calls and speeding
+      up fetch() and display() linearly with no. of
+      assigned variables (Monte)
+    - added trimwhitespace output filter to dist. (Monte)
+    - fix popup function to allow newlines in text (Monte)
+    - escape html entities in html_options (Monte)
+    - fixed bug with label for html_options (Monte)
+    - added config_load API function (Monte)
+    - added caching to config file loading (Monte)
+    - added "extra" parameter to mailto function (Monte,
+      Massimiliano Perantoni)
+    - added mailto plugin to dist.  (Monte)
+
+Version 2.3.1 (Nov 19, 2002)
+----------------------------
+
+    - added optgroup support to html_options (Monte, Robert
+      Amos)
+    - set mtime on compile files so they match source
+      files (Monte, Peter Bowen)
+    - added proper support for open_basedir setting
+      (Monte, Alessandro Astarita)
+    - added strip variable modifier, updated docs (Monte)
+    - fixed access to $smarty.x variables as arrays. (Andrei)
+    - fixed errors with example setup docs (Monte, Matthew
+      Hagerty)
+    - added textformat block function (Monte)
+
+Version 2.3.0 (Aug 7, 2002)
+---------------------------
+
+    - added assign_by_ref() and append_by_ref() functions
+      (Bob Silva, Monte)
+    - changed default warning type for plugin errors from
+      E_USER_WARNING to E_USER_ERROR (Monte)
+    - added $all_extra, $hour_extra, $minute_extra,
+      $second_extra and $meridian_extra parameters to
+      html_select_time function (Rainer Collet, Monte)
+    - update debug console to print objects (Simon Willison,
+      Monte)
+    - fix Config_File class to not error when there are no
+      sections (Peter Kmet, Monte)
+    - add default modifier logic (Monte)
+    - updated popup_init to be xhtml compliant (Tom Oram, Monte)
+    - fix filename bug with windows (Gary Loescher, Monte)
+    - add ability to supply expire time in seconds when clearing
+      cache or compile files (Monte)
+    - add {debug} plugin to distribution (Monte)
+    - fixed bug with insert tags, loading from "script" attribute
+      when caching is enabled (Monte)
+    - fix bug with debug_tpl file path with Windows (.SMK., Monte)
+    - fix append() function with string/array problem (Monte)
+
+Version 2.2.0 (July 11, 2002)
+-----------------------------
+
+    - make debug.tpl work with any delimiter (Monte)
+    - change logic in assign() and append() to test var names
+      against != '' instead of empty() (Monte)
+    - fix PHP notice in append() function (Monte)
+    - allow $plugins_dir to be an array of directories
+      (Andreas Kossmeier, Monte)
+    - move debug.tpl to SMARTY_DIR, add to constructor (Monte)
+    - fixed warning message in function.assign_debug_info (Monte)
+    - fixed $template_dir, $compile_dir, $cache_dir, $config_dir,
+      $plugin_dir to respect include_path (Monte)
+    - fixed warning message with output filter array (Monte)
+    - add optional 2nd parameter to date_format, used as
+      the default date if the passed date is empty (Monte)
+    - gave $reset a default value in cycle plugin (Monte)
+    - fixed warnings with html_select_date and timestamp
+      functions (Monte)
+    - added support for sub directory exlusion format (Monte)
+    - added support for grouping by cache_id, compile_id
+      and segments thereof (Monte)
+    - changed cache and compile files to human readable
+      format (Monte)
+    - remove overlib.js file from distribution (Monte)
+    - fixed bug with 304 Not Modified response sending
+      content (Monte)
+    - fixed cycle function to respect delimiter after
+      initial setting (Monte)
+    - update $GLOBALS references to work properly with
+      track_globals settings (Michal Prinke, Monte)
+    - fixed bug in math function with call to assign
+      (Grigory V. Kareev, Monte)
+    - optimized for loops with count() function calls (Monte)
+    - add month_value_format attribute to html_select_date
+      plugin (Gary Loescher, Monte)
+    - made it possible to use simple variables inside [] for
+      indexing. (Andrei)
+    - added "once" attribute to {include_php}. (Monte)
+
+Version 2.1.1
+-------------
+    - added cycle function. (Monte)
+    - fixed bug with resource testing, and include_path. (Monte)
+    - fixed a bug with register_outputfilter function. (Monte)
+
+Version 2.1.0
+-------------
+
+    - introduced output filters. (Andrei)
+    - changed the way filters are loaded, added load_filter()
+      API function and $autoload_filters variable. (Andrei)
+    - added caching logic for expire times per cache file
+      (Norbert Rocher, Monte)
+    - fixed html_select_date when field separator is "/"
+      (Roberto Berto, Monte)
+    - added YYYY-MM-DD format support to html_select_date
+      (Jan Rosier, Monte)
+    - fixed cache_lifetime logic bug, also made -1 = never
+      expire (Monte)
+    - fixed directory separator issue for Windows. (Andrei)
+    - added ability to use simple variables as array indices or
+      object properties. (Andrei)
+    - added ability to unregister pre/postfilters plugins at
+      runtime. (Andrei)
+    - added 'htmlall' attribute to escape modifier. (Monte)
+    - added template_exists() API function. (Andrei)
+    - fixed a problem with using dynamic values for 'file'
+      attribute of {include_php} tag. (Andrei)
+    - added $smarty.template variable. (Andrei)
+    - fixed several plugins that would not work if the plugin
+      directory was not the default one. (Andrei)
+    - implemented support for block functions. (Andrei)
+    - made it possible to assign variables in pre/postfilter
+      plugins. (Andrei)
+
+Version 2.0.1
+-------------
+    - rename plugin .make_timestamp.php to shared.make_timestamp.php.
+      (Monte)
+    - changed crc32() generated values, replace '-' with 'N'. (Monte)
+    - added support for +/- N syntax in html_select_date year values.
+      (Monte)
+    - fixed behavior of inserts with script attribute. (Andrei)
+    - fixed bug with $smarty.cookies and $smarty.server. (Andrei)
+    - wordwrap and indent are missing from 2.0 release, now fixed.
+      (Monte)
+    - removed show_info_header and show_info_include variables. (Monte)
+
+Version 2.0.0
+-------------
+    - added "eval" function plugin for evaluating variables as
+      templates. (Monte)
+    - removed $tpl_file_ext class variable, no longer used. (Monte)
+    - added "hex" and "hexentity" escape types to escape modifier.
+      (Monte)
+    - removed dependency on PEAR. (Andrei)
+    - update popup_init to accept src attribute. (Monte, Duncan Forrest)
+    - implemented several optimizations, speeding up Smarty
+      significantly in most cases. (Andrei,Monte)
+    - implemented plugin architecture. (Andrei)
+    - added wordwrap and indent modifiers. (Monte)
+    - added support for 'If-Modified-Since' headers for cached content.
+      (Monte)
+    - removed insert_tag_check class variable, no longer needed. (Monte)
+    - optimized cache fetches by scanning for insert tags only if they
+      exist. (Monte)
+    - fixed bugs in overlib. (Monte, Duncan Forrest)
+    - fixed a problem with compile_id usage. (Andrei)
+    - fixed problem with using assigned vars with {include_php ...}
+      filepath. (Monte)
+
+Version 1.5.2
+-------------
+    - added Smarty object as fifth argument for template resource functions.
+      (Monte)
+    - fixed a bug with incorrectly combined cache and compile id in
+      clear_cache(). (Andrei)
+    - fixed bug in smarty_make_timestamp introduced in PHP 4.1.0. (Monte)
+    - fixed bug with cached insert debug timing. (Monte)
+    - added 'script' attribute to {insert..} which specifies the script that
+      the insert function can be found in. (Andrei)
+    - added default template function handler. (Monte)
+
+Version 1.5.1
+-------------
+    - removed error message from the generic _read_file() method, the caller
+      should take care of that. (Andrei)
+    - fixed a bug with incorrectly combined cache and compile id. (Andrei)
+
+Version 1.5.0
+-------------
+    - added include_php built-in function, documented. (Monte)
+    - added trusted_dir functionality, documented. (Monte)
+    - consolidated secure_dir tests to one function. (Monte)
+    - prepended _smarty_ to variable names in fetch() class function to avoid
+      namespace conflicts. (Monte)
+    - introduced $compile_id class variable that can be used to set persistent
+      compile identifier across multiple display calls, documented. (Andrei)
+    - fixed bug with concatenated null cache and compile identifiers. (Andrei)
+    - added $smarty.section.* syntax for accessing section properties,
+      documented. (Andrei)
+    - added custom cache handling function ability, documented. (Monte)
+    - added assign attribute to include, include_php, insert, fetch, math, and
+      counter functions, documented. (Monte)
+    - fixed bug with fetch testing for local file when http address. (Monte)
+    - fixed bug with counter and skipval setting. (Monte)
+    - made {config_load ...} merge globals from each config file only once per
+      scope, thus avoiding several problems. (Andrei)
+    - added {foreach ...} tag that can be used to iterate through
+      non-sequential and associative arrays, documented. (Andrei)
+    - speeded up section property access a bit. (Andrei)
+    - removed $smarty variable from storage used by normal template variables,
+      to prevent any problems. (Andrei)
+    - fixed a bug that could cause parse error with quotes inside literal
+      blocks. (Andrei, Alexander Belonosov)
+    - added 'field_array' attribute to html_select_time function, documented.
+      (Andrei, Michael Caplan)
+    - documented {section} "max" attribute. (Monte)
+    - fixed notice message in Smarty_Compiler.class.php. (Monte)
+    - fixed bug with clear_cache introduced in 1.4.6, third parameter should
+      default to null. (Monte)
+    - updated Config_File class to support '\' path separator in OS/2. (Monte,
+      Francesco Cipriani)
+    - removed secure_ext setting (not used). (Monte)
+    - made cache reading process more efficient. (Monte)
+    - fixed bug, is_cached() now supports new 1.4.6 caching behavior. (Monte)
+    - update FAQ with mailing list Reply-To header FAQ. (Monte)
+    - supress error messages for fopen(), fix cache to regenerate if cache
+      file is not available (i.e. cluster race condition). (Monte)
+    - added index key example to QUICKSTART guide. (Monte)
+
+Version 1.4.6
+-------------
+    - fixed bug with {assign ...} when passing an empty value. (Monte)
+    - add more warning message fixes. (Monte, Tara Johnson)
+    - documentation updates. (Monte)
+    - update fetch function to give proper warning when fetching a non-readable
+      or non-existant file. (Monte)
+    - fixed problem with newline at the end of included templates (Monte, Andrei)
+    - added feature to regenerate cache if compile_check is enabled and an
+      involved template or config file gets modified. (Monte)
+    - added DEBUG execution times to included files: REQUIRES updated debug.tpl
+      file! (Monte)
+    - added support for hidden config variables that cannot be read by
+      templates. (Andrei)
+    - added execution time to DEBUG console, total and inserts. (Monte)
+    - fixed bug where DEBUG console would not appear with cached content. (Monte)
+    - added support for postfilter functions that are applied to compiled
+      template right after compilation. (Andrei)
+    - fixed the name of clear_compile_tpl() API function to clear_compiled_tpl.
+      (Andrei)
+    - added fix for removing comments so that the line numbers are reported
+      correctly in case of errors. (patch from Anders Janson)
+    - made html_options output xhtml compatible code. (Monte, Arnaud Limbourg)
+
+Version 1.4.5
+-------------
+    - update FAQ with index of questions at the top
+    - update overlib to 3.50, adjust addon code so that the overlib.js
+      file isn't modified, and not using the mini one. (Monte)
+    - added many more options to html_select_date. (Alexander Skwar, Andrei)
+    - added support for generating different compiled templates from the same
+      source template. (Hans-Peter Oeri, Andrei)
+    - modified Smarty to pass itself to insert functions as the second
+      parameter. (Andrei)
+    - modified Smarty to pass itself to prefilter functions as the second
+      parameter. (Andrei)
+    - fixed syntax error when including a non-existant template with security
+      enabled. (Monte)
+    - fixed comments handling to allow commenting out template blocks. (Andrei)
+    - implemented named capture buffers, with results accessible via
+      $smarty.capture.<name>. (Andrei)
+    - added ability to index arrays directly by numbers. (Andrei)
+    - fixed bug with SMARTY_DIR not prepended to Config_File include. (Monte)
+
+Version 1.4.4
+-------------
+    - fixed problem with including insecure templates with security enabled.
+      (Monte)
+    - numerous documentation updates. (Monte)
+    - added ENT_QUOTES to escapement of html. (Monte, Sam Beckwith)
+    - implemented access to request variables via auto-assigned $smarty
+      template variable. (Andrei)
+    - fixed a bug with parsing function arguments inside {if} tags if a comma
+      was present. (Andrei)
+    - updated debug console with config file vars. (Monte)
+    - added SMARTY_DIR constant as an alternative to relying on include_path.
+      (Monte)
+    - added popup_init and popup functions (requires overlib.js). (Monte)
+    - updated debug console with config file vars. (Monte)
+    - added debugging url control. (Monte)
+    - added 'quotes' type to escape modifier. (Monte, Mike Krus)
+    - added 'total' and 'iteration' section properties. (Andrei)
+    - added 'start', 'max', and 'step' section attributes/properties. (Andrei)
+    - fixed a bug with security checking of functions inside {if} tags.
+      (Andrei)
+    - fixed a bug in Config_File that would incorrectly booleanize values that
+      weren't really booleans. (Andrei)
+
+Version 1.4.3
+-------------
+    - added regex_replace modifier, documented. (Monte)
+    - added debugging console feature and custom function assign_debug_info,
+      documented. (Monte)
+    - added 'scope' attribute for {config_load}, 'global' is now deprecated but
+      is still supported. (Andrei)
+    - reduced template symbol table pollution by moving config array into the
+      class itself. (Andrei)
+    - fixed a bug with passing quoted arguments to modifiers inside {if}
+      statements. (Andrei, Sam Beckwith)
+    - added security features for third party template editing, documented
+      (Monte)
+    - added assign custom function, documented. (Monte)
+    - fixed bug with template header using version instead of _version. (Monte)
+    - fixed a problem with putting $ followed by numbers inside {strip} and
+      {/strip} tags. (Andrei)
+    - fixed Config_File class to allow empty config paths (defaults to current
+      directory). (Andrei)
+
+Version 1.4.2
+-------------
+    - move $version to internal variable, remove from docs. (Monte)
+    - cleaned up compiled templates global scope by moving some variables into
+      the class itself. (Andrei)
+    - fixed a bug that would not allow referring to a section in the including
+      file from the included file. (Andrei)
+    - configs directory missing from 1.4.1 release, added back in. (Monte)
+    - added windows include_path setup instructions to FAQ & QUICKSTART.
+      (Monte)
+
+Version 1.4.1
+-------------
+    - fix LOCK_EX logic for all windows platforms (Monte)
+    - fixed indexing by section properties with the new syntax. (Andrei)
+    - updated Smarty to use absolute paths when requiring/including Smarty
+      components. (Andrei, John Lim)
+
+Version 1.4.0
+-------------
+    - added {capture}{/capture} function, documented (Monte)
+    - added {counter} function, documented (Monte)
+
+Version 1.4.0b2
+---------------
+    - fixed issue in Config_File.class with referencing blank sections (Andrei)
+    - fixed problem with passing variables to included files (Andrei)
+    - fixed resource path recognition for windows (Monte)
+
+Version 1.4.0b1
+---------------
+    - added "componentized templates" tip into documentation (Monte)
+    - added {php}{/php} tags for embedding php code into templates (Monte)
+    - changed default value of $show_info_header to false (Monte)
+    - implemented '->' syntax for accessing properties of objects passed to the
+      template. (Andrei)
+    - allowed custom functions to receive Smarty object as the second
+      parameter; this can be used to dynamically change template variables, for
+      example. (Andrei)
+    - added custom compiler functions support, register_compiler_function() and
+      unregister_compiler_function() API functions. (Andrei, Ivo Jansch).
+    - updated GLOBAL_ASSIGN to take SCRIPT_NAME from HTTP_SERVER_VARS
+      instead of global variable. You can also assign several variables
+      in one shot with an array. (Monte, Roman Neuhauser)
+    - added template prefilters, register_prefilter() and
+      unregister_prefilter() API functions. (Monte)
+    - added RELEASE_NOTES file to distribution. (Monte)
+    - moved CREDITS out of manual into its own file. (Monte)
+    - added register_resource() and unregister_resource() API functions. (Monte)
+    - changed the syntax of indexing template variables, thus supporting
+      structures of arbitrary complexity; supplied fix_vars.php script to fix
+      old syntax. (Andrei)
+    - added $insert_tag_check to speed up cached pages if {insert ...} is not
+      used. (Monte)
+    - added $compiler_class variable to allow specifying a different compiler
+      class. (Andrei)
+    - changed Smarty to compile templates at runtime, allowing for arbitrary
+      template resources. (Monte)
+    - added fix for LOCK_EX under Windows and changed a couple of file
+      permissions for security. (Monte, Fernando Nunes)
+    - allow arbitrary date strings to date_format, html_select_date and
+      html_select_time (Monte)
+
+Version 1.3.2
+-------------
+    - fixed a bug that caused some nested includes to loop infinitely. (Andrei)
+    - added optional HTML header to output. (Monte)
+    - significantly improved config_load performance. (Andrei)
+    - added format attribute to math function. (Monte)
+    - added html_select_time custom function. (Andrei)
+    - fixed minor PHP warning when attempting to unset an unset variable
+      (Monte)
+    - added count_characters, count_words, count_sentences, count_paragraphs
+      modifiers (Monte)
+
+Version 1.3.1pl1
+--------------
+    - bug fix, recovered missing _syntax_error function (Monte)
+
+Version 1.3.1
+-------------
+    - document first, last, index_prev, index_next (Monte)
+    - added 'first' and 'last' section properties. (Andrei)
+    - split out compiling code to separate class for faster template execution
+      time (Monte)
+    - fixed a couple of minor PHP warnings (Monte)
+    - added and documented unregister_modifier() and unregister_function() API
+      calls. (Monte)
+    - added and documented 'fetch' and 'math' functions. (Monte)
+    - added ability to index looped variables by section properties, e.g.
+      $foo.index_prev/bar. (Andrei)
+    - added index_prev and index_next section properties. (Andrei)
+    - fixed issue with php executing in literal blocks. (Monte)
+
+Version 1.3.0
+-------------
+    - moved license from GPL to LGPL (Monte)
+    - implemented workaround for PHP "feature" that eats carriage returns
+      if the PHP tag is at the end of the line. (Andrei)
+    - removed $allow_php, added $php_handling logic (Monte)
+    - added file locking to prevent reader/writer problem. (Andrei)
+    - made Smarty catch unimplemented modifiers and custom functions and output
+      error messages during compilation instead of failing during run time.
+      (Andrei)
+    - removed short-tags at the top of the smarty scripts (Monte)
+    - added register_function() and register_modifier() API calls to make
+      registering stuff easier. (Andrei)
+    - added template results caching capability. (Monte, Andrei)
+    - added optional 'options' attribute to html_options custom function
+      that allows passing associative arrays for values/output. (Andrei)
+    - modifier arguments can now contain '|' and ':' characters inside quoted
+      strings. (Andrei)
+
+Version 1.2.2
+-------------
+    - fixed bug that would not respect nested template directories and would
+      put all compiled files into top-level one. (Andrei)
+    - fixed bug using $PHP_VERSION instead of environment var PHP_VERSION.
+      (Monte)
+    - a couple small warning fixes. (Monte)
+
+Version 1.2.1
+-------------
+    - added $compile_dir, removed $compile_dir_ext, simplified usage. (Monte)
+    - added tips & tricks chapter to documentation. (Monte)
+    - misc documentation updates. (Monte)
+
+Version 1.2.0
+-------------
+    - updated documentation (Monte)
+    - added file and line number information to syntax error messages. (Andrei)
+    - added ability to index template vars by a key. (Andrei)
+
+Version 1.1.0
+-------------
+    - misc documentation changes, official stable release
+
+Version 1.0b
+------------
+    - fixed the bug that prevented using non-array values for 'loop' attribute.
+      (Andrei)
+    - many misc documentation changes & additions (Monte)
+
+Version 1.0a
+------------
+    - fixed bug that caused templates to recompile every time (Monte)
+
+Version 1.0
+------------
+    - initial release
+
+/* vim: set et tw=64 ft=changelog: */
Index: tags/2.4.0RC3/include/smarty/README
===================================================================
--- tags/2.4.0RC3/include/smarty/README	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/README	(revision 14585)
@@ -0,0 +1,86 @@
+
+NAME:
+
+    Smarty - the PHP compiling template engine
+
+VERSION: 2.6.26
+
+AUTHORS:
+    
+    Monte Ohrt <monte at ohrt dot com>
+    Andrei Zmievski <andrei@php.net>
+
+MAILING LISTS:
+
+    We have a few mailing lists. "discussion" for you to share your ideas or ask
+	questions, "developers" for those interested in the development efforts of Smarty,
+	and "svn" for those that would like to track the updates made in the svn
+	repository.
+
+    send a blank e-mail message to:
+      smarty-discussion-subscribe@googlecode.com(subscribe to the general discussion list)
+      smarty-discussion-unsubscribe@googlecode.com (unsubscribe from the general discussion list)
+      smarty-discussion-digest-subscribe@googlecode.com (subscribe to digest)
+      smarty-discussion-digest-unsubscribe@googlecode.com (unsubscribe from digest)
+      smarty-developers-subscribe@googlecode.com (subscribe to the dev list)
+      smarty-developers-unsubscribe@googlecode.com (unsubscribe from the dev list)
+      smarty-svn-subscribe@googlecode.com (subscribe to the svn list)
+      smarty-svn-unsubscribe@googlecode.com (unsubscribe from the svn list)
+
+    You can also browse the mailing list archives at
+    http://groups.google.com/group/smarty-discussion
+    http://groups.google.com/group/smarty-developers
+
+    and the OLD list archives at
+    http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
+
+SYNOPSIS:
+
+    require("Smarty.class.php");
+
+    $smarty = new Smarty;
+
+    $smarty->assign("Title","My Homepage");
+    $smarty->assign("Names",array("John","Gary","Gregg","James"));
+
+    $smarty->display("index.tpl");
+
+
+DESCRIPTION:
+
+    What is Smarty?
+
+    Smarty is a template engine for PHP. Many other template engines for PHP
+    provide basic variable substitution and dynamic block functionality.
+    Smarty takes a step further to be a "smart" template engine, adding
+    features such as configuration files, template functions, and variable
+    modifiers, and making all of this functionality as easy as possible to
+    use for both programmers and template designers. Smarty also converts
+    the templates into PHP scripts, eliminating the need to parse the
+    templates on every invocation. This makes Smarty extremely scalable and
+    manageable for large application needs.
+
+    Some of Smarty's features:
+
+    * it is extremely fast
+    * no template parsing overhead, only compiles once.
+	* it is smart about recompiling only the template files that have
+	  changed.
+    * the template language is remarkably extensible via the plugin
+      architecture.
+    * configurable template delimiter tag syntax, so you can use
+      {}, {{}}, <!--{}-->, or whatever you like.
+    * built-in caching of template output.
+    * arbitrary template sources (filesystem, databases, etc.)
+    * template if/elseif/else/endif constructs are passed to the PHP parser,
+      so the if syntax can be as simple or as complex as you like.
+    * unlimited nesting of sections, conditionals, etc. allowed
+    * it is possible to embed PHP code right in your template files,
+      although not recommended and doubtfully needed since the engine
+      is so customizable.
+    * and many more.
+
+COPYRIGHT:
+    Copyright (c) 2001-2005 New Digital Group, Inc. All rights reserved.
+    This software is released under the GNU Lesser General Public License.
+    Please read the disclaimer at the top of the Smarty.class.php file.
Index: tags/2.4.0RC3/include/smarty/libs/Config_File.class.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/Config_File.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/Config_File.class.php	(revision 14585)
@@ -0,0 +1,393 @@
+<?php
+
+/**
+ * Config_File class.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com 
+ *
+ * @link http://www.smarty.net/
+ * @version 2.6.26
+ * @copyright Copyright: 2001-2005 New Digital Group, Inc.
+ * @author Andrei Zmievski <andrei@php.net>
+ * @access public
+ * @package Smarty
+ */
+
+/* $Id: Config_File.class.php 3149 2009-05-23 20:59:25Z monte.ohrt $ */
+
+/**
+ * Config file reading class
+ * @package Smarty
+ */
+class Config_File {
+    /**#@+
+     * Options
+     * @var boolean
+     */
+    /**
+     * Controls whether variables with the same name overwrite each other.
+     */
+    var $overwrite        =    true;
+
+    /**
+     * Controls whether config values of on/true/yes and off/false/no get
+     * converted to boolean values automatically.
+     */
+    var $booleanize        =    true;
+
+    /**
+     * Controls whether hidden config sections/vars are read from the file.
+     */
+    var $read_hidden     =    true;
+
+    /**
+     * Controls whether or not to fix mac or dos formatted newlines.
+     * If set to true, \r or \r\n will be changed to \n.
+     */
+    var $fix_newlines =    true;
+    /**#@-*/
+
+    /** @access private */
+    var $_config_path    = "";
+    var $_config_data    = array();
+    /**#@-*/
+
+    /**
+     * Constructs a new config file class.
+     *
+     * @param string $config_path (optional) path to the config files
+     */
+    function Config_File($config_path = NULL)
+    {
+        if (isset($config_path))
+            $this->set_path($config_path);
+    }
+
+
+    /**
+     * Set the path where configuration files can be found.
+     *
+     * @param string $config_path path to the config files
+     */
+    function set_path($config_path)
+    {
+        if (!empty($config_path)) {
+            if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
+                $this->_trigger_error_msg("Bad config file path '$config_path'");
+                return;
+            }
+            if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
+                $config_path .= DIRECTORY_SEPARATOR;
+            }
+
+            $this->_config_path = $config_path;
+        }
+    }
+
+
+    /**
+     * Retrieves config info based on the file, section, and variable name.
+     *
+     * @param string $file_name config file to get info for
+     * @param string $section_name (optional) section to get info for
+     * @param string $var_name (optional) variable to get info for
+     * @return string|array a value or array of values
+     */
+    function get($file_name, $section_name = NULL, $var_name = NULL)
+    {
+        if (empty($file_name)) {
+            $this->_trigger_error_msg('Empty config file name');
+            return;
+        } else {
+            $file_name = $this->_config_path . $file_name;
+            if (!isset($this->_config_data[$file_name]))
+                $this->load_file($file_name, false);
+        }
+
+        if (!empty($var_name)) {
+            if (empty($section_name)) {
+                return $this->_config_data[$file_name]["vars"][$var_name];
+            } else {
+                if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
+                    return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
+                else
+                    return array();
+            }
+        } else {
+            if (empty($section_name)) {
+                return (array)$this->_config_data[$file_name]["vars"];
+            } else {
+                if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
+                    return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
+                else
+                    return array();
+            }
+        }
+    }
+
+
+    /**
+     * Retrieves config info based on the key.
+     *
+     * @param $file_name string config key (filename/section/var)
+     * @return string|array same as get()
+     * @uses get() retrieves information from config file and returns it
+     */
+    function &get_key($config_key)
+    {
+        list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
+        $result = &$this->get($file_name, $section_name, $var_name);
+        return $result;
+    }
+
+    /**
+     * Get all loaded config file names.
+     *
+     * @return array an array of loaded config file names
+     */
+    function get_file_names()
+    {
+        return array_keys($this->_config_data);
+    }
+
+
+    /**
+     * Get all section names from a loaded file.
+     *
+     * @param string $file_name config file to get section names from
+     * @return array an array of section names from the specified file
+     */
+    function get_section_names($file_name)
+    {
+        $file_name = $this->_config_path . $file_name;
+        if (!isset($this->_config_data[$file_name])) {
+            $this->_trigger_error_msg("Unknown config file '$file_name'");
+            return;
+        }
+
+        return array_keys($this->_config_data[$file_name]["sections"]);
+    }
+
+
+    /**
+     * Get all global or section variable names.
+     *
+     * @param string $file_name config file to get info for
+     * @param string $section_name (optional) section to get info for
+     * @return array an array of variables names from the specified file/section
+     */
+    function get_var_names($file_name, $section = NULL)
+    {
+        if (empty($file_name)) {
+            $this->_trigger_error_msg('Empty config file name');
+            return;
+        } else if (!isset($this->_config_data[$file_name])) {
+            $this->_trigger_error_msg("Unknown config file '$file_name'");
+            return;
+        }
+
+        if (empty($section))
+            return array_keys($this->_config_data[$file_name]["vars"]);
+        else
+            return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
+    }
+
+
+    /**
+     * Clear loaded config data for a certain file or all files.
+     *
+     * @param string $file_name file to clear config data for
+     */
+    function clear($file_name = NULL)
+    {
+        if ($file_name === NULL)
+            $this->_config_data = array();
+        else if (isset($this->_config_data[$file_name]))
+            $this->_config_data[$file_name] = array();
+    }
+
+
+    /**
+     * Load a configuration file manually.
+     *
+     * @param string $file_name file name to load
+     * @param boolean $prepend_path whether current config path should be
+     *                              prepended to the filename
+     */
+    function load_file($file_name, $prepend_path = true)
+    {
+        if ($prepend_path && $this->_config_path != "")
+            $config_file = $this->_config_path . $file_name;
+        else
+            $config_file = $file_name;
+
+        ini_set('track_errors', true);
+        $fp = @fopen($config_file, "r");
+        if (!is_resource($fp)) {
+            $this->_trigger_error_msg("Could not open config file '$config_file'");
+            return false;
+        }
+
+        $contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
+        fclose($fp);
+
+        $this->_config_data[$config_file] = $this->parse_contents($contents);
+        return true;
+    }
+
+    /**
+     * Store the contents of a file manually.
+     *
+     * @param string $config_file file name of the related contents
+     * @param string $contents the file-contents to parse
+     */
+    function set_file_contents($config_file, $contents)
+    {
+        $this->_config_data[$config_file] = $this->parse_contents($contents);
+        return true;
+    }
+
+    /**
+     * parse the source of a configuration file manually.
+     *
+     * @param string $contents the file-contents to parse
+     */
+    function parse_contents($contents)
+    {
+        if($this->fix_newlines) {
+            // fix mac/dos formatted newlines
+            $contents = preg_replace('!\r\n?!', "\n", $contents);
+        }
+
+        $config_data = array();
+        $config_data['sections'] = array();
+        $config_data['vars'] = array();
+
+        /* reference to fill with data */
+        $vars =& $config_data['vars'];
+
+        /* parse file line by line */
+        preg_match_all('!^.*\r?\n?!m', $contents, $match);
+        $lines = $match[0];
+        for ($i=0, $count=count($lines); $i<$count; $i++) {
+            $line = $lines[$i];
+            if (empty($line)) continue;
+
+            if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
+                /* section found */
+                if (substr($match[1], 0, 1) == '.') {
+                    /* hidden section */
+                    if ($this->read_hidden) {
+                        $section_name = substr($match[1], 1);
+                    } else {
+                        /* break reference to $vars to ignore hidden section */
+                        unset($vars);
+                        $vars = array();
+                        continue;
+                    }
+                } else {                    
+                    $section_name = $match[1];
+                }
+                if (!isset($config_data['sections'][$section_name]))
+                    $config_data['sections'][$section_name] = array('vars' => array());
+                $vars =& $config_data['sections'][$section_name]['vars'];
+                continue;
+            }
+
+            if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
+                /* variable found */
+                $var_name = rtrim($match[1]);
+                if (strpos($match[2], '"""') === 0) {
+                    /* handle multiline-value */
+                    $lines[$i] = substr($match[2], 3);
+                    $var_value = '';
+                    while ($i<$count) {
+                        if (($pos = strpos($lines[$i], '"""')) === false) {
+                            $var_value .= $lines[$i++];
+                        } else {
+                            /* end of multiline-value */
+                            $var_value .= substr($lines[$i], 0, $pos);
+                            break;
+                        }
+                    }
+                    $booleanize = false;
+
+                } else {
+                    /* handle simple value */
+                    $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2]));
+                    $booleanize = $this->booleanize;
+
+                }
+                $this->_set_config_var($vars, $var_name, $var_value, $booleanize);
+            }
+            /* else unparsable line / means it is a comment / means ignore it */
+        }
+        return $config_data;
+    }
+
+    /**#@+ @access private */
+    /**
+     * @param array &$container
+     * @param string $var_name
+     * @param mixed $var_value
+     * @param boolean $booleanize determines whether $var_value is converted to
+     *                            to true/false
+     */
+    function _set_config_var(&$container, $var_name, $var_value, $booleanize)
+    {
+        if (substr($var_name, 0, 1) == '.') {
+            if (!$this->read_hidden)
+                return;
+            else
+                $var_name = substr($var_name, 1);
+        }
+
+        if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
+            $this->_trigger_error_msg("Bad variable name '$var_name'");
+            return;
+        }
+
+        if ($booleanize) {
+            if (preg_match("/^(on|true|yes)$/i", $var_value))
+                $var_value = true;
+            else if (preg_match("/^(off|false|no)$/i", $var_value))
+                $var_value = false;
+        }
+
+        if (!isset($container[$var_name]) || $this->overwrite)
+            $container[$var_name] = $var_value;
+        else {
+            settype($container[$var_name], 'array');
+            $container[$var_name][] = $var_value;
+        }
+    }
+
+    /**
+     * @uses trigger_error() creates a PHP warning/error
+     * @param string $error_msg
+     * @param integer $error_type one of
+     */
+    function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
+    {
+        trigger_error("Config_File error: $error_msg", $error_type);
+    }
+    /**#@-*/
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/Smarty.class.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/Smarty.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/Smarty.class.php	(revision 14585)
@@ -0,0 +1,1966 @@
+<?php
+
+/**
+ * Project:     Smarty: the PHP compiling template engine
+ * File:        Smarty.class.php
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Smarty mailing list. Send a blank e-mail to
+ * smarty-discussion-subscribe@googlegroups.com
+ *
+ * @link http://www.smarty.net/
+ * @copyright 2001-2005 New Digital Group, Inc.
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Andrei Zmievski <andrei@php.net>
+ * @package Smarty
+ * @version 2.6.26
+ */
+
+/* $Id: Smarty.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
+
+/**
+ * DIR_SEP isn't used anymore, but third party apps might
+ */
+if(!defined('DIR_SEP')) {
+    define('DIR_SEP', DIRECTORY_SEPARATOR);
+}
+
+/**
+ * set SMARTY_DIR to absolute path to Smarty library files.
+ * if not defined, include_path will be used. Sets SMARTY_DIR only if user
+ * application has not already defined it.
+ */
+
+if (!defined('SMARTY_DIR')) {
+    define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+}
+
+if (!defined('SMARTY_CORE_DIR')) {
+    define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
+}
+
+define('SMARTY_PHP_PASSTHRU',   0);
+define('SMARTY_PHP_QUOTE',      1);
+define('SMARTY_PHP_REMOVE',     2);
+define('SMARTY_PHP_ALLOW',      3);
+
+/**
+ * @package Smarty
+ */
+class Smarty
+{
+    /**#@+
+     * Smarty Configuration Section
+     */
+
+    /**
+     * The name of the directory where templates are located.
+     *
+     * @var string
+     */
+    var $template_dir    =  'templates';
+
+    /**
+     * The directory where compiled templates are located.
+     *
+     * @var string
+     */
+    var $compile_dir     =  'templates_c';
+
+    /**
+     * The directory where config files are located.
+     *
+     * @var string
+     */
+    var $config_dir      =  'configs';
+
+    /**
+     * An array of directories searched for plugins.
+     *
+     * @var array
+     */
+    var $plugins_dir     =  array('plugins');
+
+    /**
+     * If debugging is enabled, a debug console window will display
+     * when the page loads (make sure your browser allows unrequested
+     * popup windows)
+     *
+     * @var boolean
+     */
+    var $debugging       =  false;
+
+    /**
+     * When set, smarty does uses this value as error_reporting-level.
+     *
+     * @var integer
+     */
+    var $error_reporting  =  null;
+
+    /**
+     * This is the path to the debug console template. If not set,
+     * the default one will be used.
+     *
+     * @var string
+     */
+    var $debug_tpl       =  '';
+
+    /**
+     * This determines if debugging is enable-able from the browser.
+     * <ul>
+     *  <li>NONE => no debugging control allowed</li>
+     *  <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
+     * </ul>
+     * @link http://www.foo.dom/index.php?SMARTY_DEBUG
+     * @var string
+     */
+    var $debugging_ctrl  =  'NONE';
+
+    /**
+     * This tells Smarty whether to check for recompiling or not. Recompiling
+     * does not need to happen unless a template or config file is changed.
+     * Typically you enable this during development, and disable for
+     * production.
+     *
+     * @var boolean
+     */
+    var $compile_check   =  true;
+
+    /**
+     * This forces templates to compile every time. Useful for development
+     * or debugging.
+     *
+     * @var boolean
+     */
+    var $force_compile   =  false;
+
+    /**
+     * This enables template caching.
+     * <ul>
+     *  <li>0 = no caching</li>
+     *  <li>1 = use class cache_lifetime value</li>
+     *  <li>2 = use cache_lifetime in cache file</li>
+     * </ul>
+     * @var integer
+     */
+    var $caching         =  0;
+
+    /**
+     * The name of the directory for cache files.
+     *
+     * @var string
+     */
+    var $cache_dir       =  'cache';
+
+    /**
+     * This is the number of seconds cached content will persist.
+     * <ul>
+     *  <li>0 = always regenerate cache</li>
+     *  <li>-1 = never expires</li>
+     * </ul>
+     *
+     * @var integer
+     */
+    var $cache_lifetime  =  3600;
+
+    /**
+     * Only used when $caching is enabled. If true, then If-Modified-Since headers
+     * are respected with cached content, and appropriate HTTP headers are sent.
+     * This way repeated hits to a cached page do not send the entire page to the
+     * client every time.
+     *
+     * @var boolean
+     */
+    var $cache_modified_check = false;
+
+    /**
+     * This determines how Smarty handles "<?php ... ?>" tags in templates.
+     * possible values:
+     * <ul>
+     *  <li>SMARTY_PHP_PASSTHRU -> print tags as plain text</li>
+     *  <li>SMARTY_PHP_QUOTE    -> escape tags as entities</li>
+     *  <li>SMARTY_PHP_REMOVE   -> remove php tags</li>
+     *  <li>SMARTY_PHP_ALLOW    -> execute php tags</li>
+     * </ul>
+     *
+     * @var integer
+     */
+    var $php_handling    =  SMARTY_PHP_PASSTHRU;
+
+    /**
+     * This enables template security. When enabled, many things are restricted
+     * in the templates that normally would go unchecked. This is useful when
+     * untrusted parties are editing templates and you want a reasonable level
+     * of security. (no direct execution of PHP in templates for example)
+     *
+     * @var boolean
+     */
+    var $security       =   false;
+
+    /**
+     * This is the list of template directories that are considered secure. This
+     * is used only if {@link $security} is enabled. One directory per array
+     * element.  {@link $template_dir} is in this list implicitly.
+     *
+     * @var array
+     */
+    var $secure_dir     =   array();
+
+    /**
+     * These are the security settings for Smarty. They are used only when
+     * {@link $security} is enabled.
+     *
+     * @var array
+     */
+    var $security_settings  = array(
+                                    'PHP_HANDLING'    => false,
+                                    'IF_FUNCS'        => array('array', 'list',
+                                                               'isset', 'empty',
+                                                               'count', 'sizeof',
+                                                               'in_array', 'is_array',
+                                                               'true', 'false', 'null'),
+                                    'INCLUDE_ANY'     => false,
+                                    'PHP_TAGS'        => false,
+                                    'MODIFIER_FUNCS'  => array('count'),
+                                    'ALLOW_CONSTANTS'  => false,
+                                    'ALLOW_SUPER_GLOBALS' => true
+                                   );
+
+    /**
+     * This is an array of directories where trusted php scripts reside.
+     * {@link $security} is disabled during their inclusion/execution.
+     *
+     * @var array
+     */
+    var $trusted_dir        = array();
+
+    /**
+     * The left delimiter used for the template tags.
+     *
+     * @var string
+     */
+    var $left_delimiter  =  '{';
+
+    /**
+     * The right delimiter used for the template tags.
+     *
+     * @var string
+     */
+    var $right_delimiter =  '}';
+
+    /**
+     * The order in which request variables are registered, similar to
+     * variables_order in php.ini E = Environment, G = GET, P = POST,
+     * C = Cookies, S = Server
+     *
+     * @var string
+     */
+    var $request_vars_order    = 'EGPCS';
+
+    /**
+     * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false)
+     * are uses as request-vars or $_*[]-vars. note: if
+     * request_use_auto_globals is true, then $request_vars_order has
+     * no effect, but the php-ini-value "gpc_order"
+     *
+     * @var boolean
+     */
+    var $request_use_auto_globals      = true;
+
+    /**
+     * Set this if you want different sets of compiled files for the same
+     * templates. This is useful for things like different languages.
+     * Instead of creating separate sets of templates per language, you
+     * set different compile_ids like 'en' and 'de'.
+     *
+     * @var string
+     */
+    var $compile_id            = null;
+
+    /**
+     * This tells Smarty whether or not to use sub dirs in the cache/ and
+     * templates_c/ directories. sub directories better organized, but
+     * may not work well with PHP safe mode enabled.
+     *
+     * @var boolean
+     *
+     */
+    var $use_sub_dirs          = false;
+
+    /**
+     * This is a list of the modifiers to apply to all template variables.
+     * Put each modifier in a separate array element in the order you want
+     * them applied. example: <code>array('escape:"htmlall"');</code>
+     *
+     * @var array
+     */
+    var $default_modifiers        = array();
+
+    /**
+     * This is the resource type to be used when not specified
+     * at the beginning of the resource path. examples:
+     * $smarty->display('file:index.tpl');
+     * $smarty->display('db:index.tpl');
+     * $smarty->display('index.tpl'); // will use default resource type
+     * {include file="file:index.tpl"}
+     * {include file="db:index.tpl"}
+     * {include file="index.tpl"} {* will use default resource type *}
+     *
+     * @var array
+     */
+    var $default_resource_type    = 'file';
+
+    /**
+     * The function used for cache file handling. If not set, built-in caching is used.
+     *
+     * @var null|string function name
+     */
+    var $cache_handler_func   = null;
+
+    /**
+     * This indicates which filters are automatically loaded into Smarty.
+     *
+     * @var array array of filter names
+     */
+    var $autoload_filters = array();
+
+    /**#@+
+     * @var boolean
+     */
+    /**
+     * This tells if config file vars of the same name overwrite each other or not.
+     * if disabled, same name variables are accumulated in an array.
+     */
+    var $config_overwrite = true;
+
+    /**
+     * This tells whether or not to automatically booleanize config file variables.
+     * If enabled, then the strings "on", "true", and "yes" are treated as boolean
+     * true, and "off", "false" and "no" are treated as boolean false.
+     */
+    var $config_booleanize = true;
+
+    /**
+     * This tells whether hidden sections [.foobar] are readable from the
+     * tempalates or not. Normally you would never allow this since that is
+     * the point behind hidden sections: the application can access them, but
+     * the templates cannot.
+     */
+    var $config_read_hidden = false;
+
+    /**
+     * This tells whether or not automatically fix newlines in config files.
+     * It basically converts \r (mac) or \r\n (dos) to \n
+     */
+    var $config_fix_newlines = true;
+    /**#@-*/
+
+    /**
+     * If a template cannot be found, this PHP function will be executed.
+     * Useful for creating templates on-the-fly or other special action.
+     *
+     * @var string function name
+     */
+    var $default_template_handler_func = '';
+
+    /**
+     * The file that contains the compiler class. This can a full
+     * pathname, or relative to the php_include path.
+     *
+     * @var string
+     */
+    var $compiler_file        =    'Smarty_Compiler.class.php';
+
+    /**
+     * The class used for compiling templates.
+     *
+     * @var string
+     */
+    var $compiler_class        =   'Smarty_Compiler';
+
+    /**
+     * The class used to load config vars.
+     *
+     * @var string
+     */
+    var $config_class          =   'Config_File';
+
+/**#@+
+ * END Smarty Configuration Section
+ * There should be no need to touch anything below this line.
+ * @access private
+ */
+    /**
+     * where assigned template vars are kept
+     *
+     * @var array
+     */
+    var $_tpl_vars             = array();
+
+    /**
+     * stores run-time $smarty.* vars
+     *
+     * @var null|array
+     */
+    var $_smarty_vars          = null;
+
+    /**
+     * keeps track of sections
+     *
+     * @var array
+     */
+    var $_sections             = array();
+
+    /**
+     * keeps track of foreach blocks
+     *
+     * @var array
+     */
+    var $_foreach              = array();
+
+    /**
+     * keeps track of tag hierarchy
+     *
+     * @var array
+     */
+    var $_tag_stack            = array();
+
+    /**
+     * configuration object
+     *
+     * @var Config_file
+     */
+    var $_conf_obj             = null;
+
+    /**
+     * loaded configuration settings
+     *
+     * @var array
+     */
+    var $_config               = array(array('vars'  => array(), 'files' => array()));
+
+    /**
+     * md5 checksum of the string 'Smarty'
+     *
+     * @var string
+     */
+    var $_smarty_md5           = 'f8d698aea36fcbead2b9d5359ffca76f';
+
+    /**
+     * Smarty version number
+     *
+     * @var string
+     */
+    var $_version              = '2.6.26';
+
+    /**
+     * current template inclusion depth
+     *
+     * @var integer
+     */
+    var $_inclusion_depth      = 0;
+
+    /**
+     * for different compiled templates
+     *
+     * @var string
+     */
+    var $_compile_id           = null;
+
+    /**
+     * text in URL to enable debug mode
+     *
+     * @var string
+     */
+    var $_smarty_debug_id      = 'SMARTY_DEBUG';
+
+    /**
+     * debugging information for debug console
+     *
+     * @var array
+     */
+    var $_smarty_debug_info    = array();
+
+    /**
+     * info that makes up a cache file
+     *
+     * @var array
+     */
+    var $_cache_info           = array();
+
+    /**
+     * default file permissions
+     *
+     * @var integer
+     */
+    var $_file_perms           = 0644;
+
+    /**
+     * default dir permissions
+     *
+     * @var integer
+     */
+    var $_dir_perms               = 0771;
+
+    /**
+     * registered objects
+     *
+     * @var array
+     */
+    var $_reg_objects           = array();
+
+    /**
+     * table keeping track of plugins
+     *
+     * @var array
+     */
+    var $_plugins              = array(
+                                       'modifier'      => array(),
+                                       'function'      => array(),
+                                       'block'         => array(),
+                                       'compiler'      => array(),
+                                       'prefilter'     => array(),
+                                       'postfilter'    => array(),
+                                       'outputfilter'  => array(),
+                                       'resource'      => array(),
+                                       'insert'        => array());
+
+
+    /**
+     * cache serials
+     *
+     * @var array
+     */
+    var $_cache_serials = array();
+
+    /**
+     * name of optional cache include file
+     *
+     * @var string
+     */
+    var $_cache_include = null;
+
+    /**
+     * indicate if the current code is used in a compiled
+     * include
+     *
+     * @var string
+     */
+    var $_cache_including = false;
+
+    /**#@-*/
+    /**
+     * The class constructor.
+     */
+    function Smarty()
+    {
+      $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
+                    : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
+    }
+
+    /**
+     * assigns values to template variables
+     *
+     * @param array|string $tpl_var the template variable name(s)
+     * @param mixed $value the value to assign
+     */
+    function assign($tpl_var, $value = null)
+    {
+        if (is_array($tpl_var)){
+            foreach ($tpl_var as $key => $val) {
+                if ($key != '') {
+                    $this->_tpl_vars[$key] = $val;
+                }
+            }
+        } else {
+            if ($tpl_var != '')
+                $this->_tpl_vars[$tpl_var] = $value;
+        }
+    }
+
+    /**
+     * assigns values to template variables by reference
+     *
+     * @param string $tpl_var the template variable name
+     * @param mixed $value the referenced value to assign
+     */
+    function assign_by_ref($tpl_var, &$value)
+    {
+        if ($tpl_var != '')
+            $this->_tpl_vars[$tpl_var] = &$value;
+    }
+
+    /**
+     * appends values to template variables
+     *
+     * @param array|string $tpl_var the template variable name(s)
+     * @param mixed $value the value to append
+     */
+    function append($tpl_var, $value=null, $merge=false)
+    {
+        if (is_array($tpl_var)) {
+            // $tpl_var is an array, ignore $value
+            foreach ($tpl_var as $_key => $_val) {
+                if ($_key != '') {
+                    if(!@is_array($this->_tpl_vars[$_key])) {
+                        settype($this->_tpl_vars[$_key],'array');
+                    }
+                    if($merge && is_array($_val)) {
+                        foreach($_val as $_mkey => $_mval) {
+                            $this->_tpl_vars[$_key][$_mkey] = $_mval;
+                        }
+                    } else {
+                        $this->_tpl_vars[$_key][] = $_val;
+                    }
+                }
+            }
+        } else {
+            if ($tpl_var != '' && isset($value)) {
+                if(!@is_array($this->_tpl_vars[$tpl_var])) {
+                    settype($this->_tpl_vars[$tpl_var],'array');
+                }
+                if($merge && is_array($value)) {
+                    foreach($value as $_mkey => $_mval) {
+                        $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
+                    }
+                } else {
+                    $this->_tpl_vars[$tpl_var][] = $value;
+                }
+            }
+        }
+    }
+
+    /**
+     * appends values to template variables by reference
+     *
+     * @param string $tpl_var the template variable name
+     * @param mixed $value the referenced value to append
+     */
+    function append_by_ref($tpl_var, &$value, $merge=false)
+    {
+        if ($tpl_var != '' && isset($value)) {
+            if(!@is_array($this->_tpl_vars[$tpl_var])) {
+             settype($this->_tpl_vars[$tpl_var],'array');
+            }
+            if ($merge && is_array($value)) {
+                foreach($value as $_key => $_val) {
+                    $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
+                }
+            } else {
+                $this->_tpl_vars[$tpl_var][] = &$value;
+            }
+        }
+    }
+
+
+    /**
+     * clear the given assigned template variable.
+     *
+     * @param string $tpl_var the template variable to clear
+     */
+    function clear_assign($tpl_var)
+    {
+        if (is_array($tpl_var))
+            foreach ($tpl_var as $curr_var)
+                unset($this->_tpl_vars[$curr_var]);
+        else
+            unset($this->_tpl_vars[$tpl_var]);
+    }
+
+
+    /**
+     * Registers custom function to be used in templates
+     *
+     * @param string $function the name of the template function
+     * @param string $function_impl the name of the PHP function to register
+     */
+    function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
+    {
+        $this->_plugins['function'][$function] =
+            array($function_impl, null, null, false, $cacheable, $cache_attrs);
+
+    }
+
+    /**
+     * Unregisters custom function
+     *
+     * @param string $function name of template function
+     */
+    function unregister_function($function)
+    {
+        unset($this->_plugins['function'][$function]);
+    }
+
+    /**
+     * Registers object to be used in templates
+     *
+     * @param string $object name of template object
+     * @param object &$object_impl the referenced PHP object to register
+     * @param null|array $allowed list of allowed methods (empty = all)
+     * @param boolean $smarty_args smarty argument format, else traditional
+     * @param null|array $block_functs list of methods that are block format
+     */
+    function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
+    {
+        settype($allowed, 'array');
+        settype($smarty_args, 'boolean');
+        $this->_reg_objects[$object] =
+            array(&$object_impl, $allowed, $smarty_args, $block_methods);
+    }
+
+    /**
+     * Unregisters object
+     *
+     * @param string $object name of template object
+     */
+    function unregister_object($object)
+    {
+        unset($this->_reg_objects[$object]);
+    }
+
+
+    /**
+     * Registers block function to be used in templates
+     *
+     * @param string $block name of template block
+     * @param string $block_impl PHP function to register
+     */
+    function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
+    {
+        $this->_plugins['block'][$block] =
+            array($block_impl, null, null, false, $cacheable, $cache_attrs);
+    }
+
+    /**
+     * Unregisters block function
+     *
+     * @param string $block name of template function
+     */
+    function unregister_block($block)
+    {
+        unset($this->_plugins['block'][$block]);
+    }
+
+    /**
+     * Registers compiler function
+     *
+     * @param string $function name of template function
+     * @param string $function_impl name of PHP function to register
+     */
+    function register_compiler_function($function, $function_impl, $cacheable=true)
+    {
+        $this->_plugins['compiler'][$function] =
+            array($function_impl, null, null, false, $cacheable);
+    }
+
+    /**
+     * Unregisters compiler function
+     *
+     * @param string $function name of template function
+     */
+    function unregister_compiler_function($function)
+    {
+        unset($this->_plugins['compiler'][$function]);
+    }
+
+    /**
+     * Registers modifier to be used in templates
+     *
+     * @param string $modifier name of template modifier
+     * @param string $modifier_impl name of PHP function to register
+     */
+    function register_modifier($modifier, $modifier_impl)
+    {
+        $this->_plugins['modifier'][$modifier] =
+            array($modifier_impl, null, null, false);
+    }
+
+    /**
+     * Unregisters modifier
+     *
+     * @param string $modifier name of template modifier
+     */
+    function unregister_modifier($modifier)
+    {
+        unset($this->_plugins['modifier'][$modifier]);
+    }
+
+    /**
+     * Registers a resource to fetch a template
+     *
+     * @param string $type name of resource
+     * @param array $functions array of functions to handle resource
+     */
+    function register_resource($type, $functions)
+    {
+        if (count($functions)==4) {
+            $this->_plugins['resource'][$type] =
+                array($functions, false);
+
+        } elseif (count($functions)==5) {
+            $this->_plugins['resource'][$type] =
+                array(array(array(&$functions[0], $functions[1])
+                            ,array(&$functions[0], $functions[2])
+                            ,array(&$functions[0], $functions[3])
+                            ,array(&$functions[0], $functions[4]))
+                      ,false);
+
+        } else {
+            $this->trigger_error("malformed function-list for '$type' in register_resource");
+
+        }
+    }
+
+    /**
+     * Unregisters a resource
+     *
+     * @param string $type name of resource
+     */
+    function unregister_resource($type)
+    {
+        unset($this->_plugins['resource'][$type]);
+    }
+
+    /**
+     * Registers a prefilter function to apply
+     * to a template before compiling
+     *
+     * @param callback $function
+     */
+    function register_prefilter($function)
+    {
+        $this->_plugins['prefilter'][$this->_get_filter_name($function)]
+            = array($function, null, null, false);
+    }
+
+    /**
+     * Unregisters a prefilter function
+     *
+     * @param callback $function
+     */
+    function unregister_prefilter($function)
+    {
+        unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
+    }
+
+    /**
+     * Registers a postfilter function to apply
+     * to a compiled template after compilation
+     *
+     * @param callback $function
+     */
+    function register_postfilter($function)
+    {
+        $this->_plugins['postfilter'][$this->_get_filter_name($function)]
+            = array($function, null, null, false);
+    }
+
+    /**
+     * Unregisters a postfilter function
+     *
+     * @param callback $function
+     */
+    function unregister_postfilter($function)
+    {
+        unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
+    }
+
+    /**
+     * Registers an output filter function to apply
+     * to a template output
+     *
+     * @param callback $function
+     */
+    function register_outputfilter($function)
+    {
+        $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
+            = array($function, null, null, false);
+    }
+
+    /**
+     * Unregisters an outputfilter function
+     *
+     * @param callback $function
+     */
+    function unregister_outputfilter($function)
+    {
+        unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
+    }
+
+    /**
+     * load a filter of specified type and name
+     *
+     * @param string $type filter type
+     * @param string $name filter name
+     */
+    function load_filter($type, $name)
+    {
+        switch ($type) {
+            case 'output':
+                $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
+                require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+                smarty_core_load_plugins($_params, $this);
+                break;
+
+            case 'pre':
+            case 'post':
+                if (!isset($this->_plugins[$type . 'filter'][$name]))
+                    $this->_plugins[$type . 'filter'][$name] = false;
+                break;
+        }
+    }
+
+    /**
+     * clear cached content for the given template and cache id
+     *
+     * @param string $tpl_file name of template file
+     * @param string $cache_id name of cache_id
+     * @param string $compile_id name of compile_id
+     * @param string $exp_time expiration time
+     * @return boolean
+     */
+    function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
+    {
+
+        if (!isset($compile_id))
+            $compile_id = $this->compile_id;
+
+        if (!isset($tpl_file))
+            $compile_id = null;
+
+        $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
+
+        if (!empty($this->cache_handler_func)) {
+            return call_user_func_array($this->cache_handler_func,
+                                  array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
+        } else {
+            $_params = array('auto_base' => $this->cache_dir,
+                            'auto_source' => $tpl_file,
+                            'auto_id' => $_auto_id,
+                            'exp_time' => $exp_time);
+            require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
+            return smarty_core_rm_auto($_params, $this);
+        }
+
+    }
+
+
+    /**
+     * clear the entire contents of cache (all templates)
+     *
+     * @param string $exp_time expire time
+     * @return boolean results of {@link smarty_core_rm_auto()}
+     */
+    function clear_all_cache($exp_time = null)
+    {
+        return $this->clear_cache(null, null, null, $exp_time);
+    }
+
+
+    /**
+     * test to see if valid cache exists for this template
+     *
+     * @param string $tpl_file name of template file
+     * @param string $cache_id
+     * @param string $compile_id
+     * @return string|false results of {@link _read_cache_file()}
+     */
+    function is_cached($tpl_file, $cache_id = null, $compile_id = null)
+    {
+        if (!$this->caching)
+            return false;
+
+        if (!isset($compile_id))
+            $compile_id = $this->compile_id;
+
+        $_params = array(
+            'tpl_file' => $tpl_file,
+            'cache_id' => $cache_id,
+            'compile_id' => $compile_id
+        );
+        require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
+        return smarty_core_read_cache_file($_params, $this);
+    }
+
+
+    /**
+     * clear all the assigned template variables.
+     *
+     */
+    function clear_all_assign()
+    {
+        $this->_tpl_vars = array();
+    }
+
+    /**
+     * clears compiled version of specified template resource,
+     * or all compiled template files if one is not specified.
+     * This function is for advanced use only, not normally needed.
+     *
+     * @param string $tpl_file
+     * @param string $compile_id
+     * @param string $exp_time
+     * @return boolean results of {@link smarty_core_rm_auto()}
+     */
+    function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
+    {
+        if (!isset($compile_id)) {
+            $compile_id = $this->compile_id;
+        }
+        $_params = array('auto_base' => $this->compile_dir,
+                        'auto_source' => $tpl_file,
+                        'auto_id' => $compile_id,
+                        'exp_time' => $exp_time,
+                        'extensions' => array('.inc', '.php'));
+        require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
+        return smarty_core_rm_auto($_params, $this);
+    }
+
+    /**
+     * Checks whether requested template exists.
+     *
+     * @param string $tpl_file
+     * @return boolean
+     */
+    function template_exists($tpl_file)
+    {
+        $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
+        return $this->_fetch_resource_info($_params);
+    }
+
+    /**
+     * Returns an array containing template variables
+     *
+     * @param string $name
+     * @param string $type
+     * @return array
+     */
+    function &get_template_vars($name=null)
+    {
+        if(!isset($name)) {
+            return $this->_tpl_vars;
+        } elseif(isset($this->_tpl_vars[$name])) {
+            return $this->_tpl_vars[$name];
+        } else {
+            // var non-existant, return valid reference
+            $_tmp = null;
+            return $_tmp;
+        }
+    }
+
+    /**
+     * Returns an array containing config variables
+     *
+     * @param string $name
+     * @param string $type
+     * @return array
+     */
+    function &get_config_vars($name=null)
+    {
+        if(!isset($name) && is_array($this->_config[0])) {
+            return $this->_config[0]['vars'];
+        } else if(isset($this->_config[0]['vars'][$name])) {
+            return $this->_config[0]['vars'][$name];
+        } else {
+            // var non-existant, return valid reference
+            $_tmp = null;
+            return $_tmp;
+        }
+    }
+
+    /**
+     * trigger Smarty error
+     *
+     * @param string $error_msg
+     * @param integer $error_type
+     */
+    function trigger_error($error_msg, $error_type = E_USER_WARNING)
+    {
+        trigger_error("Smarty error: $error_msg", $error_type);
+    }
+
+
+    /**
+     * executes & displays the template results
+     *
+     * @param string $resource_name
+     * @param string $cache_id
+     * @param string $compile_id
+     */
+    function display($resource_name, $cache_id = null, $compile_id = null)
+    {
+        $this->fetch($resource_name, $cache_id, $compile_id, true);
+    }
+
+    /**
+     * executes & returns or displays the template results
+     *
+     * @param string $resource_name
+     * @param string $cache_id
+     * @param string $compile_id
+     * @param boolean $display
+     */
+    function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
+    {
+        static $_cache_info = array();
+
+        $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
+               ? $this->error_reporting : error_reporting() & ~E_NOTICE);
+
+        if (!$this->debugging && $this->debugging_ctrl == 'URL') {
+            $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
+            if (@strstr($_query_string, $this->_smarty_debug_id)) {
+                if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
+                    // enable debugging for this browser session
+                    @setcookie('SMARTY_DEBUG', true);
+                    $this->debugging = true;
+                } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
+                    // disable debugging for this browser session
+                    @setcookie('SMARTY_DEBUG', false);
+                    $this->debugging = false;
+                } else {
+                    // enable debugging for this page
+                    $this->debugging = true;
+                }
+            } else {
+                $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
+            }
+        }
+
+        if ($this->debugging) {
+            // capture time for debugging info
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $_debug_start_time = smarty_core_get_microtime($_params, $this);
+            $this->_smarty_debug_info[] = array('type'      => 'template',
+                                                'filename'  => $resource_name,
+                                                'depth'     => 0);
+            $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
+        }
+
+        if (!isset($compile_id)) {
+            $compile_id = $this->compile_id;
+        }
+
+        $this->_compile_id = $compile_id;
+        $this->_inclusion_depth = 0;
+
+        if ($this->caching) {
+            // save old cache_info, initialize cache_info
+            array_push($_cache_info, $this->_cache_info);
+            $this->_cache_info = array();
+            $_params = array(
+                'tpl_file' => $resource_name,
+                'cache_id' => $cache_id,
+                'compile_id' => $compile_id,
+                'results' => null
+            );
+            require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
+            if (smarty_core_read_cache_file($_params, $this)) {
+                $_smarty_results = $_params['results'];
+                if (!empty($this->_cache_info['insert_tags'])) {
+                    $_params = array('plugins' => $this->_cache_info['insert_tags']);
+                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+                    smarty_core_load_plugins($_params, $this);
+                    $_params = array('results' => $_smarty_results);
+                    require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
+                    $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
+                }
+                if (!empty($this->_cache_info['cache_serials'])) {
+                    $_params = array('results' => $_smarty_results);
+                    require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
+                    $_smarty_results = smarty_core_process_compiled_include($_params, $this);
+                }
+
+
+                if ($display) {
+                    if ($this->debugging)
+                    {
+                        // capture time for debugging info
+                        $_params = array();
+                        require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+                        $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
+                        require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+                        $_smarty_results .= smarty_core_display_debug_console($_params, $this);
+                    }
+                    if ($this->cache_modified_check) {
+                        $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
+                        $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
+                        $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
+                        if (@count($this->_cache_info['insert_tags']) == 0
+                            && !$this->_cache_serials
+                            && $_gmt_mtime == $_last_modified_date) {
+                            if (php_sapi_name()=='cgi')
+                                header('Status: 304 Not Modified');
+                            else
+                                header('HTTP/1.1 304 Not Modified');
+
+                        } else {
+                            header('Last-Modified: '.$_gmt_mtime);
+                            echo $_smarty_results;
+                        }
+                    } else {
+                            echo $_smarty_results;
+                    }
+                    error_reporting($_smarty_old_error_level);
+                    // restore initial cache_info
+                    $this->_cache_info = array_pop($_cache_info);
+                    return true;
+                } else {
+                    error_reporting($_smarty_old_error_level);
+                    // restore initial cache_info
+                    $this->_cache_info = array_pop($_cache_info);
+                    return $_smarty_results;
+                }
+            } else {
+                $this->_cache_info['template'][$resource_name] = true;
+                if ($this->cache_modified_check && $display) {
+                    header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
+                }
+            }
+        }
+
+        // load filters that are marked as autoload
+        if (count($this->autoload_filters)) {
+            foreach ($this->autoload_filters as $_filter_type => $_filters) {
+                foreach ($_filters as $_filter) {
+                    $this->load_filter($_filter_type, $_filter);
+                }
+            }
+        }
+
+        $_smarty_compile_path = $this->_get_compile_path($resource_name);
+
+        // if we just need to display the results, don't perform output
+        // buffering - for speed
+        $_cache_including = $this->_cache_including;
+        $this->_cache_including = false;
+        if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
+            if ($this->_is_compiled($resource_name, $_smarty_compile_path)
+                    || $this->_compile_resource($resource_name, $_smarty_compile_path))
+            {
+                include($_smarty_compile_path);
+            }
+        } else {
+            ob_start();
+            if ($this->_is_compiled($resource_name, $_smarty_compile_path)
+                    || $this->_compile_resource($resource_name, $_smarty_compile_path))
+            {
+                include($_smarty_compile_path);
+            }
+            $_smarty_results = ob_get_contents();
+            ob_end_clean();
+
+            foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
+                $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
+            }
+        }
+
+        if ($this->caching) {
+            $_params = array('tpl_file' => $resource_name,
+                        'cache_id' => $cache_id,
+                        'compile_id' => $compile_id,
+                        'results' => $_smarty_results);
+            require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
+            smarty_core_write_cache_file($_params, $this);
+            require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
+            $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
+
+            if ($this->_cache_serials) {
+                // strip nocache-tags from output
+                $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
+                                                ,''
+                                                ,$_smarty_results);
+            }
+            // restore initial cache_info
+            $this->_cache_info = array_pop($_cache_info);
+        }
+        $this->_cache_including = $_cache_including;
+
+        if ($display) {
+            if (isset($_smarty_results)) { echo $_smarty_results; }
+            if ($this->debugging) {
+                // capture time for debugging info
+                $_params = array();
+                require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+                $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
+                require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+                echo smarty_core_display_debug_console($_params, $this);
+            }
+            error_reporting($_smarty_old_error_level);
+            return;
+        } else {
+            if ($this->debugging) {
+                // capture time for debugging info
+                require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+                $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime(array(), $this) - $_debug_start_time);
+            }
+            error_reporting($_smarty_old_error_level);
+            if (isset($_smarty_results)) { return $_smarty_results; }
+        }
+    }
+
+    /**
+     * load configuration values
+     *
+     * @param string $file
+     * @param string $section
+     * @param string $scope
+     */
+    function config_load($file, $section = null, $scope = 'global')
+    {
+        require_once($this->_get_plugin_filepath('function', 'config_load'));
+        smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
+    }
+
+    /**
+     * return a reference to a registered object
+     *
+     * @param string $name
+     * @return object
+     */
+    function &get_registered_object($name) {
+        if (!isset($this->_reg_objects[$name]))
+        $this->_trigger_fatal_error("'$name' is not a registered object");
+
+        if (!is_object($this->_reg_objects[$name][0]))
+        $this->_trigger_fatal_error("registered '$name' is not an object");
+
+        return $this->_reg_objects[$name][0];
+    }
+
+    /**
+     * clear configuration values
+     *
+     * @param string $var
+     */
+    function clear_config($var = null)
+    {
+        if(!isset($var)) {
+            // clear all values
+            $this->_config = array(array('vars'  => array(),
+                                         'files' => array()));
+        } else {
+            unset($this->_config[0]['vars'][$var]);
+        }
+    }
+
+    /**
+     * get filepath of requested plugin
+     *
+     * @param string $type
+     * @param string $name
+     * @return string|false
+     */
+    function _get_plugin_filepath($type, $name)
+    {
+        $_params = array('type' => $type, 'name' => $name);
+        require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
+        return smarty_core_assemble_plugin_filepath($_params, $this);
+    }
+
+   /**
+     * test if resource needs compiling
+     *
+     * @param string $resource_name
+     * @param string $compile_path
+     * @return boolean
+     */
+    function _is_compiled($resource_name, $compile_path)
+    {
+        if (!$this->force_compile && file_exists($compile_path)) {
+            if (!$this->compile_check) {
+                // no need to check compiled file
+                return true;
+            } else {
+                // get file source and timestamp
+                $_params = array('resource_name' => $resource_name, 'get_source'=>false);
+                if (!$this->_fetch_resource_info($_params)) {
+                    return false;
+                }
+                if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
+                    // template not expired, no recompile
+                    return true;
+                } else {
+                    // compile template
+                    return false;
+                }
+            }
+        } else {
+            // compiled template does not exist, or forced compile
+            return false;
+        }
+    }
+
+   /**
+     * compile the template
+     *
+     * @param string $resource_name
+     * @param string $compile_path
+     * @return boolean
+     */
+    function _compile_resource($resource_name, $compile_path)
+    {
+
+        $_params = array('resource_name' => $resource_name);
+        if (!$this->_fetch_resource_info($_params)) {
+            return false;
+        }
+
+        $_source_content = $_params['source_content'];
+        $_cache_include    = substr($compile_path, 0, -4).'.inc';
+
+        if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
+            // if a _cache_serial was set, we also have to write an include-file:
+            if ($this->_cache_include_info) {
+                require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
+                smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)),  $this);
+            }
+
+            $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
+            require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
+            smarty_core_write_compiled_resource($_params, $this);
+
+            return true;
+        } else {
+            return false;
+        }
+
+    }
+
+   /**
+     * compile the given source
+     *
+     * @param string $resource_name
+     * @param string $source_content
+     * @param string $compiled_content
+     * @return boolean
+     */
+    function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
+    {
+        if (file_exists(SMARTY_DIR . $this->compiler_file)) {
+            require_once(SMARTY_DIR . $this->compiler_file);
+        } else {
+            // use include_path
+            require_once($this->compiler_file);
+        }
+
+
+        $smarty_compiler = new $this->compiler_class;
+
+        $smarty_compiler->template_dir      = $this->template_dir;
+        $smarty_compiler->compile_dir       = $this->compile_dir;
+        $smarty_compiler->plugins_dir       = $this->plugins_dir;
+        $smarty_compiler->config_dir        = $this->config_dir;
+        $smarty_compiler->force_compile     = $this->force_compile;
+        $smarty_compiler->caching           = $this->caching;
+        $smarty_compiler->php_handling      = $this->php_handling;
+        $smarty_compiler->left_delimiter    = $this->left_delimiter;
+        $smarty_compiler->right_delimiter   = $this->right_delimiter;
+        $smarty_compiler->_version          = $this->_version;
+        $smarty_compiler->security          = $this->security;
+        $smarty_compiler->secure_dir        = $this->secure_dir;
+        $smarty_compiler->security_settings = $this->security_settings;
+        $smarty_compiler->trusted_dir       = $this->trusted_dir;
+        $smarty_compiler->use_sub_dirs      = $this->use_sub_dirs;
+        $smarty_compiler->_reg_objects      = &$this->_reg_objects;
+        $smarty_compiler->_plugins          = &$this->_plugins;
+        $smarty_compiler->_tpl_vars         = &$this->_tpl_vars;
+        $smarty_compiler->default_modifiers = $this->default_modifiers;
+        $smarty_compiler->compile_id        = $this->_compile_id;
+        $smarty_compiler->_config            = $this->_config;
+        $smarty_compiler->request_use_auto_globals  = $this->request_use_auto_globals;
+
+        if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
+            $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
+        }
+        $smarty_compiler->_cache_include = $cache_include_path;
+
+
+        $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
+
+        if ($smarty_compiler->_cache_serial) {
+            $this->_cache_include_info = array(
+                'cache_serial'=>$smarty_compiler->_cache_serial
+                ,'plugins_code'=>$smarty_compiler->_plugins_code
+                ,'include_file_path' => $cache_include_path);
+
+        } else {
+            $this->_cache_include_info = null;
+
+        }
+
+        return $_results;
+    }
+
+    /**
+     * Get the compile path for this resource
+     *
+     * @param string $resource_name
+     * @return string results of {@link _get_auto_filename()}
+     */
+    function _get_compile_path($resource_name)
+    {
+        return $this->_get_auto_filename($this->compile_dir, $resource_name,
+                                         $this->_compile_id) . '.php';
+    }
+
+    /**
+     * fetch the template info. Gets timestamp, and source
+     * if get_source is true
+     *
+     * sets $source_content to the source of the template, and
+     * $resource_timestamp to its time stamp
+     * @param string $resource_name
+     * @param string $source_content
+     * @param integer $resource_timestamp
+     * @param boolean $get_source
+     * @param boolean $quiet
+     * @return boolean
+     */
+
+    function _fetch_resource_info(&$params)
+    {
+        if(!isset($params['get_source'])) { $params['get_source'] = true; }
+        if(!isset($params['quiet'])) { $params['quiet'] = false; }
+
+        $_return = false;
+        $_params = array('resource_name' => $params['resource_name']) ;
+        if (isset($params['resource_base_path']))
+            $_params['resource_base_path'] = $params['resource_base_path'];
+        else
+            $_params['resource_base_path'] = $this->template_dir;
+
+        if ($this->_parse_resource_name($_params)) {
+            $_resource_type = $_params['resource_type'];
+            $_resource_name = $_params['resource_name'];
+            switch ($_resource_type) {
+                case 'file':
+                    if ($params['get_source']) {
+                        $params['source_content'] = $this->_read_file($_resource_name);
+                    }
+                    $params['resource_timestamp'] = filemtime($_resource_name);
+                    $_return = is_file($_resource_name) && is_readable($_resource_name);
+                    break;
+
+                default:
+                    // call resource functions to fetch the template source and timestamp
+                    if ($params['get_source']) {
+                        $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
+                            call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
+                                                 array($_resource_name, &$params['source_content'], &$this));
+                    } else {
+                        $_source_return = true;
+                    }
+
+                    $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
+                        call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
+                                             array($_resource_name, &$params['resource_timestamp'], &$this));
+
+                    $_return = $_source_return && $_timestamp_return;
+                    break;
+            }
+        }
+
+        if (!$_return) {
+            // see if we can get a template with the default template handler
+            if (!empty($this->default_template_handler_func)) {
+                if (!is_callable($this->default_template_handler_func)) {
+                    $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
+                } else {
+                    $_return = call_user_func_array(
+                        $this->default_template_handler_func,
+                        array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
+                }
+            }
+        }
+
+        if (!$_return) {
+            if (!$params['quiet']) {
+                $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
+            }
+        } else if ($_return && $this->security) {
+            require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
+            if (!smarty_core_is_secure($_params, $this)) {
+                if (!$params['quiet'])
+                    $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
+                $params['source_content'] = null;
+                $params['resource_timestamp'] = null;
+                return false;
+            }
+        }
+        return $_return;
+    }
+
+
+    /**
+     * parse out the type and name from the resource
+     *
+     * @param string $resource_base_path
+     * @param string $resource_name
+     * @param string $resource_type
+     * @param string $resource_name
+     * @return boolean
+     */
+
+    function _parse_resource_name(&$params)
+    {
+
+        // split tpl_path by the first colon
+        $_resource_name_parts = explode(':', $params['resource_name'], 2);
+
+        if (count($_resource_name_parts) == 1) {
+            // no resource type given
+            $params['resource_type'] = $this->default_resource_type;
+            $params['resource_name'] = $_resource_name_parts[0];
+        } else {
+            if(strlen($_resource_name_parts[0]) == 1) {
+                // 1 char is not resource type, but part of filepath
+                $params['resource_type'] = $this->default_resource_type;
+                $params['resource_name'] = $params['resource_name'];
+            } else {
+                $params['resource_type'] = $_resource_name_parts[0];
+                $params['resource_name'] = $_resource_name_parts[1];
+            }
+        }
+
+        if ($params['resource_type'] == 'file') {
+            if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
+                // relative pathname to $params['resource_base_path']
+                // use the first directory where the file is found
+                foreach ((array)$params['resource_base_path'] as $_curr_path) {
+                    $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
+                    if (file_exists($_fullpath) && is_file($_fullpath)) {
+                        $params['resource_name'] = $_fullpath;
+                        return true;
+                    }
+                    // didn't find the file, try include_path
+                    $_params = array('file_path' => $_fullpath);
+                    require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+                    if(smarty_core_get_include_path($_params, $this)) {
+                        $params['resource_name'] = $_params['new_file_path'];
+                        return true;
+                    }
+                }
+                return false;
+            } else {
+                /* absolute path */
+                return file_exists($params['resource_name']);
+            }
+        } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
+            $_params = array('type' => $params['resource_type']);
+            require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
+            smarty_core_load_resource_plugin($_params, $this);
+        }
+
+        return true;
+    }
+
+
+    /**
+     * Handle modifiers
+     *
+     * @param string|null $modifier_name
+     * @param array|null $map_array
+     * @return string result of modifiers
+     */
+    function _run_mod_handler()
+    {
+        $_args = func_get_args();
+        list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
+        list($_func_name, $_tpl_file, $_tpl_line) =
+            $this->_plugins['modifier'][$_modifier_name];
+
+        $_var = $_args[0];
+        foreach ($_var as $_key => $_val) {
+            $_args[0] = $_val;
+            $_var[$_key] = call_user_func_array($_func_name, $_args);
+        }
+        return $_var;
+    }
+
+    /**
+     * Remove starting and ending quotes from the string
+     *
+     * @param string $string
+     * @return string
+     */
+    function _dequote($string)
+    {
+        if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
+            substr($string, -1) == substr($string, 0, 1))
+            return substr($string, 1, -1);
+        else
+            return $string;
+    }
+
+
+    /**
+     * read in a file
+     *
+     * @param string $filename
+     * @return string
+     */
+    function _read_file($filename)
+    {
+        if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
+            $contents = '';
+            while (!feof($fd)) {
+                $contents .= fread($fd, 8192);
+            }
+            fclose($fd);
+            return $contents;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * get a concrete filename for automagically created content
+     *
+     * @param string $auto_base
+     * @param string $auto_source
+     * @param string $auto_id
+     * @return string
+     * @staticvar string|null
+     * @staticvar string|null
+     */
+    function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
+    {
+        $_compile_dir_sep =  $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
+        $_return = $auto_base . DIRECTORY_SEPARATOR;
+
+        if(isset($auto_id)) {
+            // make auto_id safe for directory names
+            $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
+            // split into separate directories
+            $_return .= $auto_id . $_compile_dir_sep;
+        }
+
+        if(isset($auto_source)) {
+            // make source name safe for filename
+            $_filename = urlencode(basename($auto_source));
+            $_crc32 = sprintf('%08X', crc32($auto_source));
+            // prepend %% to avoid name conflicts with
+            // with $params['auto_id'] names
+            $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
+                      substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
+            $_return .= '%%' . $_crc32 . '%%' . $_filename;
+        }
+
+        return $_return;
+    }
+
+    /**
+     * unlink a file, possibly using expiration time
+     *
+     * @param string $resource
+     * @param integer $exp_time
+     */
+    function _unlink($resource, $exp_time = null)
+    {
+        if(isset($exp_time)) {
+            if(time() - @filemtime($resource) >= $exp_time) {
+                return @unlink($resource);
+            }
+        } else {
+            return @unlink($resource);
+        }
+    }
+
+    /**
+     * returns an auto_id for auto-file-functions
+     *
+     * @param string $cache_id
+     * @param string $compile_id
+     * @return string|null
+     */
+    function _get_auto_id($cache_id=null, $compile_id=null) {
+    if (isset($cache_id))
+        return (isset($compile_id)) ? $cache_id . '|' . $compile_id  : $cache_id;
+    elseif(isset($compile_id))
+        return $compile_id;
+    else
+        return null;
+    }
+
+    /**
+     * trigger Smarty plugin error
+     *
+     * @param string $error_msg
+     * @param string $tpl_file
+     * @param integer $tpl_line
+     * @param string $file
+     * @param integer $line
+     * @param integer $error_type
+     */
+    function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
+            $file = null, $line = null, $error_type = E_USER_ERROR)
+    {
+        if(isset($file) && isset($line)) {
+            $info = ' ('.basename($file).", line $line)";
+        } else {
+            $info = '';
+        }
+        if (isset($tpl_line) && isset($tpl_file)) {
+            $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
+        } else {
+            $this->trigger_error($error_msg . $info, $error_type);
+        }
+    }
+
+
+    /**
+     * callback function for preg_replace, to call a non-cacheable block
+     * @return string
+     */
+    function _process_compiled_include_callback($match) {
+        $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
+        ob_start();
+        $_func($this);
+        $_ret = ob_get_contents();
+        ob_end_clean();
+        return $_ret;
+    }
+
+
+    /**
+     * called for included templates
+     *
+     * @param string $_smarty_include_tpl_file
+     * @param string $_smarty_include_vars
+     */
+
+    // $_smarty_include_tpl_file, $_smarty_include_vars
+
+    function _smarty_include($params)
+    {
+        if ($this->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $debug_start_time = smarty_core_get_microtime($_params, $this);
+            $this->_smarty_debug_info[] = array('type'      => 'template',
+                                                  'filename'  => $params['smarty_include_tpl_file'],
+                                                  'depth'     => ++$this->_inclusion_depth);
+            $included_tpls_idx = count($this->_smarty_debug_info) - 1;
+        }
+
+        $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
+
+        // config vars are treated as local, so push a copy of the
+        // current ones onto the front of the stack
+        array_unshift($this->_config, $this->_config[0]);
+
+        $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
+
+
+        if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
+            || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
+        {
+            include($_smarty_compile_path);
+        }
+
+        // pop the local vars off the front of the stack
+        array_shift($this->_config);
+
+        $this->_inclusion_depth--;
+
+        if ($this->debugging) {
+            // capture time for debugging info
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
+        }
+
+        if ($this->caching) {
+            $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
+        }
+    }
+
+
+    /**
+     * get or set an array of cached attributes for function that is
+     * not cacheable
+     * @return array
+     */
+    function &_smarty_cache_attrs($cache_serial, $count) {
+        $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
+
+        if ($this->_cache_including) {
+            /* return next set of cache_attrs */
+            $_return = current($_cache_attrs);
+            next($_cache_attrs);
+            return $_return;
+
+        } else {
+            /* add a reference to a new set of cache_attrs */
+            $_cache_attrs[] = array();
+            return $_cache_attrs[count($_cache_attrs)-1];
+
+        }
+
+    }
+
+
+    /**
+     * wrapper for include() retaining $this
+     * @return mixed
+     */
+    function _include($filename, $once=false, $params=null)
+    {
+        if ($once) {
+            return include_once($filename);
+        } else {
+            return include($filename);
+        }
+    }
+
+
+    /**
+     * wrapper for eval() retaining $this
+     * @return mixed
+     */
+    function _eval($code, $params=null)
+    {
+        return eval($code);
+    }
+
+    /**
+     * Extracts the filter name from the given callback
+     *
+     * @param callback $function
+     * @return string
+     */
+	function _get_filter_name($function)
+	{
+		if (is_array($function)) {
+			$_class_name = (is_object($function[0]) ?
+				get_class($function[0]) : $function[0]);
+			return $_class_name . '_' . $function[1];
+		}
+		else {
+			return $function;
+		}
+	}
+
+    /**#@-*/
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/Smarty_Compiler.class.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/Smarty_Compiler.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/Smarty_Compiler.class.php	(revision 14585)
@@ -0,0 +1,2365 @@
+<?php
+
+/**
+ * Project:     Smarty: the PHP compiling template engine
+ * File:        Smarty_Compiler.class.php
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * @link http://smarty.php.net/
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Andrei Zmievski <andrei@php.net>
+ * @version 2.6.26
+ * @copyright 2001-2005 New Digital Group, Inc.
+ * @package Smarty
+ */
+
+/* $Id: Smarty_Compiler.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
+
+/**
+ * Template compiling class
+ * @package Smarty
+ */
+class Smarty_Compiler extends Smarty {
+
+    // internal vars
+    /**#@+
+     * @access private
+     */
+    var $_folded_blocks         =   array();    // keeps folded template blocks
+    var $_current_file          =   null;       // the current template being compiled
+    var $_current_line_no       =   1;          // line number for error messages
+    var $_capture_stack         =   array();    // keeps track of nested capture buffers
+    var $_plugin_info           =   array();    // keeps track of plugins to load
+    var $_init_smarty_vars      =   false;
+    var $_permitted_tokens      =   array('true','false','yes','no','on','off','null');
+    var $_db_qstr_regexp        =   null;        // regexps are setup in the constructor
+    var $_si_qstr_regexp        =   null;
+    var $_qstr_regexp           =   null;
+    var $_func_regexp           =   null;
+    var $_reg_obj_regexp        =   null;
+    var $_var_bracket_regexp    =   null;
+    var $_num_const_regexp      =   null;
+    var $_dvar_guts_regexp      =   null;
+    var $_dvar_regexp           =   null;
+    var $_cvar_regexp           =   null;
+    var $_svar_regexp           =   null;
+    var $_avar_regexp           =   null;
+    var $_mod_regexp            =   null;
+    var $_var_regexp            =   null;
+    var $_parenth_param_regexp  =   null;
+    var $_func_call_regexp      =   null;
+    var $_obj_ext_regexp        =   null;
+    var $_obj_start_regexp      =   null;
+    var $_obj_params_regexp     =   null;
+    var $_obj_call_regexp       =   null;
+    var $_cacheable_state       =   0;
+    var $_cache_attrs_count     =   0;
+    var $_nocache_count         =   0;
+    var $_cache_serial          =   null;
+    var $_cache_include         =   null;
+
+    var $_strip_depth           =   0;
+    var $_additional_newline    =   "\n";
+
+    /**#@-*/
+    /**
+     * The class constructor.
+     */
+    function Smarty_Compiler()
+    {
+        // matches double quoted strings:
+        // "foobar"
+        // "foo\"bar"
+        $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
+
+        // matches single quoted strings:
+        // 'foobar'
+        // 'foo\'bar'
+        $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
+
+        // matches single or double quoted strings
+        $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')';
+
+        // matches bracket portion of vars
+        // [0]
+        // [foo]
+        // [$bar]
+        $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
+
+        // matches numerical constants
+        // 30
+        // -12
+        // 13.22
+        $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
+
+        // matches $ vars (not objects):
+        // $foo
+        // $foo.bar
+        // $foo.bar.foobar
+        // $foo[0]
+        // $foo[$bar]
+        // $foo[5][blah]
+        // $foo[5].bar[$foobar][4]
+        $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
+        $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
+        $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp
+                . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?';
+        $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
+
+        // matches config vars:
+        // #foo#
+        // #foobar123_foo#
+        $this->_cvar_regexp = '\#\w+\#';
+
+        // matches section vars:
+        // %foo.bar%
+        $this->_svar_regexp = '\%\w+\.\w+\%';
+
+        // matches all valid variables (no quotes, no modifiers)
+        $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|'
+           . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')';
+
+        // matches valid variable syntax:
+        // $foo
+        // $foo
+        // #foo#
+        // #foo#
+        // "text"
+        // "text"
+        $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
+
+        // matches valid object call (one level of object nesting allowed in parameters):
+        // $foo->bar
+        // $foo->bar()
+        // $foo->bar("text")
+        // $foo->bar($foo, $bar, "text")
+        // $foo->bar($foo, "foo")
+        // $foo->bar->foo()
+        // $foo->bar->foo->bar()
+        // $foo->bar($foo->bar)
+        // $foo->bar($foo->bar())
+        // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
+        $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')';
+        $this->_obj_restricted_param_regexp = '(?:'
+                . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')'
+                . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)';
+        $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
+                . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)';
+        $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp
+                . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)';
+        $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
+        $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)';
+        
+        // matches valid modifier syntax:
+        // |foo
+        // |@foo
+        // |foo:"bar"
+        // |foo:$bar
+        // |foo:"bar":$foobar
+        // |foo|bar
+        // |foo:$foo->bar
+        $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|'
+           . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
+
+        // matches valid function name:
+        // foo123
+        // _foo_bar
+        $this->_func_regexp = '[a-zA-Z_]\w*';
+
+        // matches valid registered object:
+        // foo->bar
+        $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*';
+
+        // matches valid parameter values:
+        // true
+        // $foo
+        // $foo|bar
+        // #foo#
+        // #foo#|bar
+        // "text"
+        // "text"|bar
+        // $foo->bar
+        $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|'
+           . $this->_var_regexp . '|' . $this->_num_const_regexp  . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)';
+
+        // matches valid parenthesised function parameters:
+        //
+        // "text"
+        //    $foo, $bar, "text"
+        // $foo|bar, "foo"|bar, $foo->bar($foo)|bar
+        $this->_parenth_param_regexp = '(?:\((?:\w+|'
+                . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
+                . $this->_param_regexp . ')))*)?\))';
+
+        // matches valid function call:
+        // foo()
+        // foo_bar($foo)
+        // _foo_bar($foo,"bar")
+        // foo123($foo,$foo->bar(),"foo")
+        $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:'
+           . $this->_parenth_param_regexp . '))';
+    }
+
+    /**
+     * compile a resource
+     *
+     * sets $compiled_content to the compiled source
+     * @param string $resource_name
+     * @param string $source_content
+     * @param string $compiled_content
+     * @return true
+     */
+    function _compile_file($resource_name, $source_content, &$compiled_content)
+    {
+
+        if ($this->security) {
+            // do not allow php syntax to be executed unless specified
+            if ($this->php_handling == SMARTY_PHP_ALLOW &&
+                !$this->security_settings['PHP_HANDLING']) {
+                $this->php_handling = SMARTY_PHP_PASSTHRU;
+            }
+        }
+
+        $this->_load_filters();
+
+        $this->_current_file = $resource_name;
+        $this->_current_line_no = 1;
+        $ldq = preg_quote($this->left_delimiter, '~');
+        $rdq = preg_quote($this->right_delimiter, '~');
+
+        // run template source through prefilter functions
+        if (count($this->_plugins['prefilter']) > 0) {
+            foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
+                if ($prefilter === false) continue;
+                if ($prefilter[3] || is_callable($prefilter[0])) {
+                    $source_content = call_user_func_array($prefilter[0],
+                                                            array($source_content, &$this));
+                    $this->_plugins['prefilter'][$filter_name][3] = true;
+                } else {
+                    $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented");
+                }
+            }
+        }
+
+        /* fetch all special blocks */
+        $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s";
+
+        preg_match_all($search, $source_content, $match,  PREG_SET_ORDER);
+        $this->_folded_blocks = $match;
+        reset($this->_folded_blocks);
+
+        /* replace special blocks by "{php}" */
+        $source_content = preg_replace($search.'e', "'"
+                                       . $this->_quote_replace($this->left_delimiter) . 'php'
+                                       . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
+                                       . $this->_quote_replace($this->right_delimiter)
+                                       . "'"
+                                       , $source_content);
+
+        /* Gather all template tags. */
+        preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match);
+        $template_tags = $_match[1];
+        /* Split content by template tags to obtain non-template content. */
+        $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content);
+
+        /* loop through text blocks */
+        for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) {
+            /* match anything resembling php tags */
+            if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
+                /* replace tags with placeholders to prevent recursive replacements */
+                $sp_match[1] = array_unique($sp_match[1]);
+                usort($sp_match[1], '_smarty_sort_length');
+                for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
+                    $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]);
+                }
+                /* process each one */
+                for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
+                    if ($this->php_handling == SMARTY_PHP_PASSTHRU) {
+                        /* echo php contents */
+                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $text_blocks[$curr_tb]);
+                    } else if ($this->php_handling == SMARTY_PHP_QUOTE) {
+                        /* quote php tags */
+                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]);
+                    } else if ($this->php_handling == SMARTY_PHP_REMOVE) {
+                        /* remove php tags */
+                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
+                    } else {
+                        /* SMARTY_PHP_ALLOW, but echo non php starting tags */
+                        $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', '<?php echo \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
+                        $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
+                    }
+                }
+            }
+        }
+        
+        /* Compile the template tags into PHP code. */
+        $compiled_tags = array();
+        for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) {
+            $this->_current_line_no += substr_count($text_blocks[$i], "\n");
+            $compiled_tags[] = $this->_compile_tag($template_tags[$i]);
+            $this->_current_line_no += substr_count($template_tags[$i], "\n");
+        }
+        if (count($this->_tag_stack)>0) {
+            list($_open_tag, $_line_no) = end($this->_tag_stack);
+            $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__);
+            return;
+        }
+
+        /* Reformat $text_blocks between 'strip' and '/strip' tags,
+           removing spaces, tabs and newlines. */
+        $strip = false;
+        for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
+            if ($compiled_tags[$i] == '{strip}') {
+                $compiled_tags[$i] = '';
+                $strip = true;
+                /* remove leading whitespaces */
+                $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
+            }
+            if ($strip) {
+                /* strip all $text_blocks before the next '/strip' */
+                for ($j = $i + 1; $j < $for_max; $j++) {
+                    /* remove leading and trailing whitespaces of each line */
+                    $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]);
+                    if ($compiled_tags[$j] == '{/strip}') {                       
+                        /* remove trailing whitespaces from the last text_block */
+                        $text_blocks[$j] = rtrim($text_blocks[$j]);
+                    }
+                    $text_blocks[$j] = "<?php echo '" . strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
+                    if ($compiled_tags[$j] == '{/strip}') {
+                        $compiled_tags[$j] = "\n"; /* slurped by php, but necessary
+                                    if a newline is following the closing strip-tag */
+                        $strip = false;
+                        $i = $j;
+                        break;
+                    }
+                }
+            }
+        }
+        $compiled_content = '';
+        
+        $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%';
+        
+        /* Interleave the compiled contents and text blocks to get the final result. */
+        for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
+            if ($compiled_tags[$i] == '') {
+                // tag result empty, remove first newline from following text block
+                $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
+            }
+            // replace legit PHP tags with placeholder
+            $text_blocks[$i] = str_replace('<?', $tag_guard, $text_blocks[$i]);
+            $compiled_tags[$i] = str_replace('<?', $tag_guard, $compiled_tags[$i]);
+            
+            $compiled_content .= $text_blocks[$i] . $compiled_tags[$i];
+        }
+        $compiled_content .= str_replace('<?', $tag_guard, $text_blocks[$i]);
+
+        // escape php tags created by interleaving
+        $compiled_content = str_replace('<?', "<?php echo '<?' ?>\n", $compiled_content);
+        $compiled_content = preg_replace("~(?<!')language\s*=\s*[\"\']?\s*php\s*[\"\']?~", "<?php echo 'language=php' ?>\n", $compiled_content);
+
+        // recover legit tags
+        $compiled_content = str_replace($tag_guard, '<?', $compiled_content); 
+        
+        // remove \n from the end of the file, if any
+        if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") ) {
+            $compiled_content = substr($compiled_content, 0, -1);
+        }
+
+        if (!empty($this->_cache_serial)) {
+            $compiled_content = "<?php \$this->_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content;
+        }
+
+        // run compiled template through postfilter functions
+        if (count($this->_plugins['postfilter']) > 0) {
+            foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
+                if ($postfilter === false) continue;
+                if ($postfilter[3] || is_callable($postfilter[0])) {
+                    $compiled_content = call_user_func_array($postfilter[0],
+                                                              array($compiled_content, &$this));
+                    $this->_plugins['postfilter'][$filter_name][3] = true;
+                } else {
+                    $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
+                }
+            }
+        }
+
+        // put header at the top of the compiled template
+        $template_header = "<?php /* Smarty version ".$this->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
+        $template_header .= "         compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n";
+
+        /* Emit code to load needed plugins. */
+        $this->_plugins_code = '';
+        if (count($this->_plugin_info)) {
+            $_plugins_params = "array('plugins' => array(";
+            foreach ($this->_plugin_info as $plugin_type => $plugins) {
+                foreach ($plugins as $plugin_name => $plugin_info) {
+                    $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], ";
+                    $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),';
+                }
+            }
+            $_plugins_params .= '))';
+            $plugins_code = "<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_params, \$this); ?>\n";
+            $template_header .= $plugins_code;
+            $this->_plugin_info = array();
+            $this->_plugins_code = $plugins_code;
+        }
+
+        if ($this->_init_smarty_vars) {
+            $template_header .= "<?php require_once(SMARTY_CORE_DIR . 'core.assign_smarty_interface.php');\nsmarty_core_assign_smarty_interface(null, \$this); ?>\n";
+            $this->_init_smarty_vars = false;
+        }
+
+        $compiled_content = $template_header . $compiled_content;
+        return true;
+    }
+
+    /**
+     * Compile a template tag
+     *
+     * @param string $template_tag
+     * @return string
+     */
+    function _compile_tag($template_tag)
+    {
+        /* Matched comment. */
+        if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
+            return '';
+        
+        /* Split tag into two three parts: command, command modifiers and the arguments. */
+        if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
+                . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
+                      (?:\s+(.*))?$
+                    ~xs', $template_tag, $match)) {
+            $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__);
+        }
+        
+        $tag_command = $match[1];
+        $tag_modifier = isset($match[2]) ? $match[2] : null;
+        $tag_args = isset($match[3]) ? $match[3] : null;
+
+        if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
+            /* tag name is a variable or object */
+            $_return = $this->_parse_var_props($tag_command . $tag_modifier);
+            return "<?php echo $_return; ?>" . $this->_additional_newline;
+        }
+
+        /* If the tag name is a registered object, we process it. */
+        if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
+            return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier);
+        }
+
+        switch ($tag_command) {
+            case 'include':
+                return $this->_compile_include_tag($tag_args);
+
+            case 'include_php':
+                return $this->_compile_include_php_tag($tag_args);
+
+            case 'if':
+                $this->_push_tag('if');
+                return $this->_compile_if_tag($tag_args);
+
+            case 'else':
+                list($_open_tag) = end($this->_tag_stack);
+                if ($_open_tag != 'if' && $_open_tag != 'elseif')
+                    $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
+                else
+                    $this->_push_tag('else');
+                return '<?php else: ?>';
+
+            case 'elseif':
+                list($_open_tag) = end($this->_tag_stack);
+                if ($_open_tag != 'if' && $_open_tag != 'elseif')
+                    $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
+                if ($_open_tag == 'if')
+                    $this->_push_tag('elseif');
+                return $this->_compile_if_tag($tag_args, true);
+
+            case '/if':
+                $this->_pop_tag('if');
+                return '<?php endif; ?>';
+
+            case 'capture':
+                return $this->_compile_capture_tag(true, $tag_args);
+
+            case '/capture':
+                return $this->_compile_capture_tag(false);
+
+            case 'ldelim':
+                return $this->left_delimiter;
+
+            case 'rdelim':
+                return $this->right_delimiter;
+
+            case 'section':
+                $this->_push_tag('section');
+                return $this->_compile_section_start($tag_args);
+
+            case 'sectionelse':
+                $this->_push_tag('sectionelse');
+                return "<?php endfor; else: ?>";
+                break;
+
+            case '/section':
+                $_open_tag = $this->_pop_tag('section');
+                if ($_open_tag == 'sectionelse')
+                    return "<?php endif; ?>";
+                else
+                    return "<?php endfor; endif; ?>";
+
+            case 'foreach':
+                $this->_push_tag('foreach');
+                return $this->_compile_foreach_start($tag_args);
+                break;
+
+            case 'foreachelse':
+                $this->_push_tag('foreachelse');
+                return "<?php endforeach; else: ?>";
+
+            case '/foreach':
+                $_open_tag = $this->_pop_tag('foreach');
+                if ($_open_tag == 'foreachelse')
+                    return "<?php endif; unset(\$_from); ?>";
+                else
+                    return "<?php endforeach; endif; unset(\$_from); ?>";
+                break;
+
+            case 'strip':
+            case '/strip':
+                if (substr($tag_command, 0, 1)=='/') {
+                    $this->_pop_tag('strip');
+                    if (--$this->_strip_depth==0) { /* outermost closing {/strip} */
+                        $this->_additional_newline = "\n";
+                        return '{' . $tag_command . '}';
+                    }
+                } else {
+                    $this->_push_tag('strip');
+                    if ($this->_strip_depth++==0) { /* outermost opening {strip} */
+                        $this->_additional_newline = "";
+                        return '{' . $tag_command . '}';
+                    }
+                }
+                return '';
+
+            case 'php':
+                /* handle folded tags replaced by {php} */
+                list(, $block) = each($this->_folded_blocks);
+                $this->_current_line_no += substr_count($block[0], "\n");
+                /* the number of matched elements in the regexp in _compile_file()
+                   determins the type of folded tag that was found */
+                switch (count($block)) {
+                    case 2: /* comment */
+                        return '';
+
+                    case 3: /* literal */
+                        return "<?php echo '" . strtr($block[2], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline;
+
+                    case 4: /* php */
+                        if ($this->security && !$this->security_settings['PHP_TAGS']) {
+                            $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
+                            return;
+                        }
+                        return '<?php ' . $block[3] .' ?>';
+                }
+                break;
+
+            case 'insert':
+                return $this->_compile_insert_tag($tag_args);
+
+            default:
+                if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
+                    return $output;
+                } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
+                    return $output;
+                } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
+                    return $output;                    
+                } else {
+                    $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
+                }
+
+        }
+    }
+
+
+    /**
+     * compile the custom compiler tag
+     *
+     * sets $output to the compiled custom compiler tag
+     * @param string $tag_command
+     * @param string $tag_args
+     * @param string $output
+     * @return boolean
+     */
+    function _compile_compiler_tag($tag_command, $tag_args, &$output)
+    {
+        $found = false;
+        $have_function = true;
+
+        /*
+         * First we check if the compiler function has already been registered
+         * or loaded from a plugin file.
+         */
+        if (isset($this->_plugins['compiler'][$tag_command])) {
+            $found = true;
+            $plugin_func = $this->_plugins['compiler'][$tag_command][0];
+            if (!is_callable($plugin_func)) {
+                $message = "compiler function '$tag_command' is not implemented";
+                $have_function = false;
+            }
+        }
+        /*
+         * Otherwise we need to load plugin file and look for the function
+         * inside it.
+         */
+        else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) {
+            $found = true;
+
+            include_once $plugin_file;
+
+            $plugin_func = 'smarty_compiler_' . $tag_command;
+            if (!is_callable($plugin_func)) {
+                $message = "plugin function $plugin_func() not found in $plugin_file\n";
+                $have_function = false;
+            } else {
+                $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true);
+            }
+        }
+
+        /*
+         * True return value means that we either found a plugin or a
+         * dynamically registered function. False means that we didn't and the
+         * compiler should now emit code to load custom function plugin for this
+         * tag.
+         */
+        if ($found) {
+            if ($have_function) {
+                $output = call_user_func_array($plugin_func, array($tag_args, &$this));
+                if($output != '') {
+                $output = '<?php ' . $this->_push_cacheable_state('compiler', $tag_command)
+                                   . $output
+                                   . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>';
+                }
+            } else {
+                $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+
+    /**
+     * compile block function tag
+     *
+     * sets $output to compiled block function tag
+     * @param string $tag_command
+     * @param string $tag_args
+     * @param string $tag_modifier
+     * @param string $output
+     * @return boolean
+     */
+    function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output)
+    {
+        if (substr($tag_command, 0, 1) == '/') {
+            $start_tag = false;
+            $tag_command = substr($tag_command, 1);
+        } else
+            $start_tag = true;
+
+        $found = false;
+        $have_function = true;
+
+        /*
+         * First we check if the block function has already been registered
+         * or loaded from a plugin file.
+         */
+        if (isset($this->_plugins['block'][$tag_command])) {
+            $found = true;
+            $plugin_func = $this->_plugins['block'][$tag_command][0];
+            if (!is_callable($plugin_func)) {
+                $message = "block function '$tag_command' is not implemented";
+                $have_function = false;
+            }
+        }
+        /*
+         * Otherwise we need to load plugin file and look for the function
+         * inside it.
+         */
+        else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) {
+            $found = true;
+
+            include_once $plugin_file;
+
+            $plugin_func = 'smarty_block_' . $tag_command;
+            if (!function_exists($plugin_func)) {
+                $message = "plugin function $plugin_func() not found in $plugin_file\n";
+                $have_function = false;
+            } else {
+                $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);
+
+            }
+        }
+
+        if (!$found) {
+            return false;
+        } else if (!$have_function) {
+            $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+            return true;
+        }
+
+        /*
+         * Even though we've located the plugin function, compilation
+         * happens only once, so the plugin will still need to be loaded
+         * at runtime for future requests.
+         */
+        $this->_add_plugin('block', $tag_command);
+
+        if ($start_tag)
+            $this->_push_tag($tag_command);
+        else
+            $this->_pop_tag($tag_command);
+
+        if ($start_tag) {
+            $output = '<?php ' . $this->_push_cacheable_state('block', $tag_command);
+            $attrs = $this->_parse_attrs($tag_args);
+            $_cache_attrs='';
+            $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs);
+            $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); ';
+            $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);';
+            $output .= 'while ($_block_repeat) { ob_start(); ?>';
+        } else {
+            $output = '<?php $_block_content = ob_get_contents(); ob_end_clean(); ';
+            $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)';
+            if ($tag_modifier != '') {
+                $this->_parse_modifiers($_out_tag_text, $tag_modifier);
+            }
+            $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } ';
+            $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';
+        }
+
+        return true;
+    }
+
+
+    /**
+     * compile custom function tag
+     *
+     * @param string $tag_command
+     * @param string $tag_args
+     * @param string $tag_modifier
+     * @return string
+     */
+    function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output)
+    {
+        $found = false;
+        $have_function = true;
+
+        /*
+         * First we check if the custom function has already been registered
+         * or loaded from a plugin file.
+         */
+        if (isset($this->_plugins['function'][$tag_command])) {
+            $found = true;
+            $plugin_func = $this->_plugins['function'][$tag_command][0];
+            if (!is_callable($plugin_func)) {
+                $message = "custom function '$tag_command' is not implemented";
+                $have_function = false;
+            }
+        }
+        /*
+         * Otherwise we need to load plugin file and look for the function
+         * inside it.
+         */
+        else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) {
+            $found = true;
+
+            include_once $plugin_file;
+
+            $plugin_func = 'smarty_function_' . $tag_command;
+            if (!function_exists($plugin_func)) {
+                $message = "plugin function $plugin_func() not found in $plugin_file\n";
+                $have_function = false;
+            } else {
+                $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true);
+
+            }
+        }
+
+        if (!$found) {
+            return false;
+        } else if (!$have_function) {
+            $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
+            return true;
+        }
+
+        /* declare plugin to be loaded on display of the template that
+           we compile right now */
+        $this->_add_plugin('function', $tag_command);
+
+        $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);
+        $attrs = $this->_parse_attrs($tag_args);
+        $_cache_attrs = '';
+        $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs);
+
+        $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
+        if($tag_modifier != '') {
+            $this->_parse_modifiers($output, $tag_modifier);
+        }
+
+        if($output != '') {
+            $output =  '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $output . ';'
+                . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;
+        }
+
+        return true;
+    }
+
+    /**
+     * compile a registered object tag
+     *
+     * @param string $tag_command
+     * @param array $attrs
+     * @param string $tag_modifier
+     * @return string
+     */
+    function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)
+    {
+        if (substr($tag_command, 0, 1) == '/') {
+            $start_tag = false;
+            $tag_command = substr($tag_command, 1);
+        } else {
+            $start_tag = true;
+        }
+
+        list($object, $obj_comp) = explode('->', $tag_command);
+
+        $arg_list = array();
+        if(count($attrs)) {
+            $_assign_var = false;
+            foreach ($attrs as $arg_name => $arg_value) {
+                if($arg_name == 'assign') {
+                    $_assign_var = $arg_value;
+                    unset($attrs['assign']);
+                    continue;
+                }
+                if (is_bool($arg_value))
+                    $arg_value = $arg_value ? 'true' : 'false';
+                $arg_list[] = "'$arg_name' => $arg_value";
+            }
+        }
+
+        if($this->_reg_objects[$object][2]) {
+            // smarty object argument format
+            $args = "array(".implode(',', (array)$arg_list)."), \$this";
+        } else {
+            // traditional argument format
+            $args = implode(',', array_values($attrs));
+            if (empty($args)) {
+                $args = '';
+            }
+        }
+
+        $prefix = '';
+        $postfix = '';
+        $newline = '';
+        if(!is_object($this->_reg_objects[$object][0])) {
+            $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+        } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {
+            $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+        } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {
+            // method
+            if(in_array($obj_comp, $this->_reg_objects[$object][3])) {
+                // block method
+                if ($start_tag) {
+                    $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";
+                    $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
+                    $prefix .= "while (\$_block_repeat) { ob_start();";
+                    $return = null;
+                    $postfix = '';
+                } else {
+                    $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;";
+                    $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)";
+                    $postfix = "} array_pop(\$this->_tag_stack);";
+                }
+            } else {
+                // non-block method
+                $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";
+            }
+        } else {
+            // property
+            $return = "\$this->_reg_objects['$object'][0]->$obj_comp";
+        }
+
+        if($return != null) {
+            if($tag_modifier != '') {
+                $this->_parse_modifiers($return, $tag_modifier);
+            }
+
+            if(!empty($_assign_var)) {
+                $output = "\$this->assign('" . $this->_dequote($_assign_var) ."',  $return);";
+            } else {
+                $output = 'echo ' . $return . ';';
+                $newline = $this->_additional_newline;
+            }
+        } else {
+            $output = '';
+        }
+
+        return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;
+    }
+
+    /**
+     * Compile {insert ...} tag
+     *
+     * @param string $tag_args
+     * @return string
+     */
+    function _compile_insert_tag($tag_args)
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+        $name = $this->_dequote($attrs['name']);
+
+        if (empty($name)) {
+            return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);
+        }
+        
+        if (!preg_match('~^\w+$~', $name)) {
+            return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        if (!empty($attrs['script'])) {
+            $delayed_loading = true;
+        } else {
+            $delayed_loading = false;
+        }
+
+        foreach ($attrs as $arg_name => $arg_value) {
+            if (is_bool($arg_value))
+                $arg_value = $arg_value ? 'true' : 'false';
+            $arg_list[] = "'$arg_name' => $arg_value";
+        }
+
+        $this->_add_plugin('insert', $name, $delayed_loading);
+
+        $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";
+
+        return "<?php require_once(SMARTY_CORE_DIR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;
+    }
+
+    /**
+     * Compile {include ...} tag
+     *
+     * @param string $tag_args
+     * @return string
+     */
+    function _compile_include_tag($tag_args)
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+        $arg_list = array();
+
+        if (empty($attrs['file'])) {
+            $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        foreach ($attrs as $arg_name => $arg_value) {
+            if ($arg_name == 'file') {
+                $include_file = $arg_value;
+                continue;
+            } else if ($arg_name == 'assign') {
+                $assign_var = $arg_value;
+                continue;
+            }
+            if (is_bool($arg_value))
+                $arg_value = $arg_value ? 'true' : 'false';
+            $arg_list[] = "'$arg_name' => $arg_value";
+        }
+
+        $output = '<?php ';
+
+        if (isset($assign_var)) {
+            $output .= "ob_start();\n";
+        }
+
+        $output .=
+            "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";
+
+
+        $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";
+        $output .= "\$this->_smarty_include($_params);\n" .
+        "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .
+        "unset(\$_smarty_tpl_vars);\n";
+
+        if (isset($assign_var)) {
+            $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";
+        }
+
+        $output .= ' ?>';
+
+        return $output;
+
+    }
+
+    /**
+     * Compile {include ...} tag
+     *
+     * @param string $tag_args
+     * @return string
+     */
+    function _compile_include_php_tag($tag_args)
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+
+        if (empty($attrs['file'])) {
+            $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']);
+        $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true';
+
+        $arg_list = array();
+        foreach($attrs as $arg_name => $arg_value) {
+            if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {
+                if(is_bool($arg_value))
+                    $arg_value = $arg_value ? 'true' : 'false';
+                $arg_list[] = "'$arg_name' => $arg_value";
+            }
+        }
+
+        $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))";
+
+        return "<?php require_once(SMARTY_CORE_DIR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;
+    }
+
+
+    /**
+     * Compile {section ...} tag
+     *
+     * @param string $tag_args
+     * @return string
+     */
+    function _compile_section_start($tag_args)
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+        $arg_list = array();
+
+        $output = '<?php ';
+        $section_name = $attrs['name'];
+        if (empty($section_name)) {
+            $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        $output .= "unset(\$this->_sections[$section_name]);\n";
+        $section_props = "\$this->_sections[$section_name]";
+
+        foreach ($attrs as $attr_name => $attr_value) {
+            switch ($attr_name) {
+                case 'loop':
+                    $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
+                    break;
+
+                case 'show':
+                    if (is_bool($attr_value))
+                        $show_attr_value = $attr_value ? 'true' : 'false';
+                    else
+                        $show_attr_value = "(bool)$attr_value";
+                    $output .= "{$section_props}['show'] = $show_attr_value;\n";
+                    break;
+
+                case 'name':
+                    $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
+                    break;
+
+                case 'max':
+                case 'start':
+                    $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
+                    break;
+
+                case 'step':
+                    $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
+                    break;
+
+                default:
+                    $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);
+                    break;
+            }
+        }
+
+        if (!isset($attrs['show']))
+            $output .= "{$section_props}['show'] = true;\n";
+
+        if (!isset($attrs['loop']))
+            $output .= "{$section_props}['loop'] = 1;\n";
+
+        if (!isset($attrs['max']))
+            $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
+        else
+            $output .= "if ({$section_props}['max'] < 0)\n" .
+                       "    {$section_props}['max'] = {$section_props}['loop'];\n";
+
+        if (!isset($attrs['step']))
+            $output .= "{$section_props}['step'] = 1;\n";
+
+        if (!isset($attrs['start']))
+            $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
+        else {
+            $output .= "if ({$section_props}['start'] < 0)\n" .
+                       "    {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .
+                       "else\n" .
+                       "    {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
+        }
+
+        $output .= "if ({$section_props}['show']) {\n";
+        if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {
+            $output .= "    {$section_props}['total'] = {$section_props}['loop'];\n";
+        } else {
+            $output .= "    {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
+        }
+        $output .= "    if ({$section_props}['total'] == 0)\n" .
+                   "        {$section_props}['show'] = false;\n" .
+                   "} else\n" .
+                   "    {$section_props}['total'] = 0;\n";
+
+        $output .= "if ({$section_props}['show']):\n";
+        $output .= "
+            for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
+                 {$section_props}['iteration'] <= {$section_props}['total'];
+                 {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
+        $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
+        $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
+        $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
+        $output .= "{$section_props}['first']      = ({$section_props}['iteration'] == 1);\n";
+        $output .= "{$section_props}['last']       = ({$section_props}['iteration'] == {$section_props}['total']);\n";
+
+        $output .= "?>";
+
+        return $output;
+    }
+
+
+    /**
+     * Compile {foreach ...} tag.
+     *
+     * @param string $tag_args
+     * @return string
+     */
+    function _compile_foreach_start($tag_args)
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+        $arg_list = array();
+
+        if (empty($attrs['from'])) {
+            return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
+        }
+        $from = $attrs['from'];
+
+        if (empty($attrs['item'])) {
+            return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
+        }
+        $item = $this->_dequote($attrs['item']);
+        if (!preg_match('~^\w+$~', $item)) {
+            return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        if (isset($attrs['key'])) {
+            $key  = $this->_dequote($attrs['key']);
+            if (!preg_match('~^\w+$~', $key)) {
+                return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
+            }
+            $key_part = "\$this->_tpl_vars['$key'] => ";
+        } else {
+            $key = null;
+            $key_part = '';
+        }
+
+        if (isset($attrs['name'])) {
+            $name = $attrs['name'];
+        } else {
+            $name = null;
+        }
+
+        $output = '<?php ';
+        $output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }";
+        if (isset($name)) {
+            $foreach_props = "\$this->_foreach[$name]";
+            $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
+            $output .= "if ({$foreach_props}['total'] > 0):\n";
+            $output .= "    foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
+            $output .= "        {$foreach_props}['iteration']++;\n";
+        } else {
+            $output .= "if (count(\$_from)):\n";
+            $output .= "    foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
+        }
+        $output .= '?>';
+
+        return $output;
+    }
+
+
+    /**
+     * Compile {capture} .. {/capture} tags
+     *
+     * @param boolean $start true if this is the {capture} tag
+     * @param string $tag_args
+     * @return string
+     */
+
+    function _compile_capture_tag($start, $tag_args = '')
+    {
+        $attrs = $this->_parse_attrs($tag_args);
+
+        if ($start) {
+            $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'";
+            $assign = isset($attrs['assign']) ? $attrs['assign'] : null;
+            $append = isset($attrs['append']) ? $attrs['append'] : null;
+            
+            $output = "<?php ob_start(); ?>";
+            $this->_capture_stack[] = array($buffer, $assign, $append);
+        } else {
+            list($buffer, $assign, $append) = array_pop($this->_capture_stack);
+            $output = "<?php \$this->_smarty_vars['capture'][$buffer] = ob_get_contents(); ";
+            if (isset($assign)) {
+                $output .= " \$this->assign($assign, ob_get_contents());";
+            }
+            if (isset($append)) {
+                $output .= " \$this->append($append, ob_get_contents());";
+            }
+            $output .= "ob_end_clean(); ?>";
+        }
+
+        return $output;
+    }
+
+    /**
+     * Compile {if ...} tag
+     *
+     * @param string $tag_args
+     * @param boolean $elseif if true, uses elseif instead of if
+     * @return string
+     */
+    function _compile_if_tag($tag_args, $elseif = false)
+    {
+
+        /* Tokenize args for 'if' tag. */
+        preg_match_all('~(?>
+                ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call
+                ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)?    | # var or quoted string
+                \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@    | # valid non-word token
+                \b\w+\b                                                        | # valid word token
+                \S+                                                           # anything else
+                )~x', $tag_args, $match);
+
+        $tokens = $match[0];
+
+        if(empty($tokens)) {
+            $_error_msg = $elseif ? "'elseif'" : "'if'";
+            $_error_msg .= ' statement requires arguments'; 
+            $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__);
+        }
+            
+                
+        // make sure we have balanced parenthesis
+        $token_count = array_count_values($tokens);
+        if(isset($token_count['(']) && $token_count['('] != $token_count[')']) {
+            $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        $is_arg_stack = array();
+
+        for ($i = 0; $i < count($tokens); $i++) {
+
+            $token = &$tokens[$i];
+
+            switch (strtolower($token)) {
+                case '!':
+                case '%':
+                case '!==':
+                case '==':
+                case '===':
+                case '>':
+                case '<':
+                case '!=':
+                case '<>':
+                case '<<':
+                case '>>':
+                case '<=':
+                case '>=':
+                case '&&':
+                case '||':
+                case '|':
+                case '^':
+                case '&':
+                case '~':
+                case ')':
+                case ',':
+                case '+':
+                case '-':
+                case '*':
+                case '/':
+                case '@':
+                    break;
+
+                case 'eq':
+                    $token = '==';
+                    break;
+
+                case 'ne':
+                case 'neq':
+                    $token = '!=';
+                    break;
+
+                case 'lt':
+                    $token = '<';
+                    break;
+
+                case 'le':
+                case 'lte':
+                    $token = '<=';
+                    break;
+
+                case 'gt':
+                    $token = '>';
+                    break;
+
+                case 'ge':
+                case 'gte':
+                    $token = '>=';
+                    break;
+
+                case 'and':
+                    $token = '&&';
+                    break;
+
+                case 'or':
+                    $token = '||';
+                    break;
+
+                case 'not':
+                    $token = '!';
+                    break;
+
+                case 'mod':
+                    $token = '%';
+                    break;
+
+                case '(':
+                    array_push($is_arg_stack, $i);
+                    break;
+
+                case 'is':
+                    /* If last token was a ')', we operate on the parenthesized
+                       expression. The start of the expression is on the stack.
+                       Otherwise, we operate on the last encountered token. */
+                    if ($tokens[$i-1] == ')') {
+                        $is_arg_start = array_pop($is_arg_stack);
+                        if ($is_arg_start != 0) {
+                            if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) {
+                                $is_arg_start--;
+                            } 
+                        } 
+                    } else
+                        $is_arg_start = $i-1;
+                    /* Construct the argument for 'is' expression, so it knows
+                       what to operate on. */
+                    $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
+
+                    /* Pass all tokens from next one until the end to the
+                       'is' expression parsing function. The function will
+                       return modified tokens, where the first one is the result
+                       of the 'is' expression and the rest are the tokens it
+                       didn't touch. */
+                    $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
+
+                    /* Replace the old tokens with the new ones. */
+                    array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
+
+                    /* Adjust argument start so that it won't change from the
+                       current position for the next iteration. */
+                    $i = $is_arg_start;
+                    break;
+
+                default:
+                    if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) {
+                            // function call
+                            if($this->security &&
+                               !in_array($token, $this->security_settings['IF_FUNCS'])) {
+                                $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
+                            }
+                    } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') {
+                        // variable function call
+                        $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);                      
+                    } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) {
+                        // object or variable
+                        $token = $this->_parse_var_props($token);
+                    } elseif(is_numeric($token)) {
+                        // number, skip it
+                    } else {
+                        $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__);
+                    }
+                    break;
+            }
+        }
+
+        if ($elseif)
+            return '<?php elseif ('.implode(' ', $tokens).'): ?>';
+        else
+            return '<?php if ('.implode(' ', $tokens).'): ?>';
+    }
+
+
+    function _compile_arg_list($type, $name, $attrs, &$cache_code) {
+        $arg_list = array();
+
+        if (isset($type) && isset($name)
+            && isset($this->_plugins[$type])
+            && isset($this->_plugins[$type][$name])
+            && empty($this->_plugins[$type][$name][4])
+            && is_array($this->_plugins[$type][$name][5])
+            ) {
+            /* we have a list of parameters that should be cached */
+            $_cache_attrs = $this->_plugins[$type][$name][5];
+            $_count = $this->_cache_attrs_count++;
+            $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');";
+
+        } else {
+            /* no parameters are cached */
+            $_cache_attrs = null;
+        }
+
+        foreach ($attrs as $arg_name => $arg_value) {
+            if (is_bool($arg_value))
+                $arg_value = $arg_value ? 'true' : 'false';
+            if (is_null($arg_value))
+                $arg_value = 'null';
+            if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) {
+                $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)";
+            } else {
+                $arg_list[] = "'$arg_name' => $arg_value";
+            }
+        }
+        return $arg_list;
+    }
+
+    /**
+     * Parse is expression
+     *
+     * @param string $is_arg
+     * @param array $tokens
+     * @return array
+     */
+    function _parse_is_expr($is_arg, $tokens)
+    {
+        $expr_end = 0;
+        $negate_expr = false;
+
+        if (($first_token = array_shift($tokens)) == 'not') {
+            $negate_expr = true;
+            $expr_type = array_shift($tokens);
+        } else
+            $expr_type = $first_token;
+
+        switch ($expr_type) {
+            case 'even':
+                if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
+                    $expr_end++;
+                    $expr_arg = $tokens[$expr_end++];
+                    $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
+                } else
+                    $expr = "!(1 & $is_arg)";
+                break;
+
+            case 'odd':
+                if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
+                    $expr_end++;
+                    $expr_arg = $tokens[$expr_end++];
+                    $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
+                } else
+                    $expr = "(1 & $is_arg)";
+                break;
+
+            case 'div':
+                if (@$tokens[$expr_end] == 'by') {
+                    $expr_end++;
+                    $expr_arg = $tokens[$expr_end++];
+                    $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")";
+                } else {
+                    $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__);
+                }
+                break;
+
+            default:
+                $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__);
+                break;
+        }
+
+        if ($negate_expr) {
+            $expr = "!($expr)";
+        }
+
+        array_splice($tokens, 0, $expr_end, $expr);
+
+        return $tokens;
+    }
+
+
+    /**
+     * Parse attribute string
+     *
+     * @param string $tag_args
+     * @return array
+     */
+    function _parse_attrs($tag_args)
+    {
+
+        /* Tokenize tag attributes. */
+        preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
+                         )+ |
+                         [=]
+                        ~x', $tag_args, $match);
+        $tokens       = $match[0];
+
+        $attrs = array();
+        /* Parse state:
+            0 - expecting attribute name
+            1 - expecting '='
+            2 - expecting attribute value (not '=') */
+        $state = 0;
+
+        foreach ($tokens as $token) {
+            switch ($state) {
+                case 0:
+                    /* If the token is a valid identifier, we set attribute name
+                       and go to state 1. */
+                    if (preg_match('~^\w+$~', $token)) {
+                        $attr_name = $token;
+                        $state = 1;
+                    } else
+                        $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
+                    break;
+
+                case 1:
+                    /* If the token is '=', then we go to state 2. */
+                    if ($token == '=') {
+                        $state = 2;
+                    } else
+                        $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
+                    break;
+
+                case 2:
+                    /* If token is not '=', we set the attribute value and go to
+                       state 0. */
+                    if ($token != '=') {
+                        /* We booleanize the token if it's a non-quoted possible
+                           boolean value. */
+                        if (preg_match('~^(on|yes|true)$~', $token)) {
+                            $token = 'true';
+                        } else if (preg_match('~^(off|no|false)$~', $token)) {
+                            $token = 'false';
+                        } else if ($token == 'null') {
+                            $token = 'null';
+                        } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
+                            /* treat integer literally */
+                        } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) {
+                            /* treat as a string, double-quote it escaping quotes */
+                            $token = '"'.addslashes($token).'"';
+                        }
+
+                        $attrs[$attr_name] = $token;
+                        $state = 0;
+                    } else
+                        $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__);
+                    break;
+            }
+            $last_token = $token;
+        }
+
+        if($state != 0) {
+            if($state == 1) {
+                $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
+            } else {
+                $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__);
+            }
+        }
+
+        $this->_parse_vars_props($attrs);
+
+        return $attrs;
+    }
+
+    /**
+     * compile multiple variables and section properties tokens into
+     * PHP code
+     *
+     * @param array $tokens
+     */
+    function _parse_vars_props(&$tokens)
+    {
+        foreach($tokens as $key => $val) {
+            $tokens[$key] = $this->_parse_var_props($val);
+        }
+    }
+
+    /**
+     * compile single variable and section properties token into
+     * PHP code
+     *
+     * @param string $val
+     * @param string $tag_attrs
+     * @return string
+     */
+    function _parse_var_props($val)
+    {
+        $val = trim($val);
+
+        if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) {
+            // $ variable or object
+            $return = $this->_parse_var($match[1]);
+            $modifiers = $match[2];
+            if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
+                $_default_mod_string = implode('|',(array)$this->default_modifiers);
+                $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
+            }
+            $this->_parse_modifiers($return, $modifiers);
+            return $return;
+        } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+                // double quoted text
+                preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+                $return = $this->_expand_quoted_text($match[1]);
+                if($match[2] != '') {
+                    $this->_parse_modifiers($return, $match[2]);
+                }
+                return $return;
+            }
+        elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+                // numerical constant
+                preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+                if($match[2] != '') {
+                    $this->_parse_modifiers($match[1], $match[2]);
+                    return $match[1];
+                }
+            }
+        elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+                // single quoted text
+                preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
+                if($match[2] != '') {
+                    $this->_parse_modifiers($match[1], $match[2]);
+                    return $match[1];
+                }
+            }
+        elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+                // config var
+                return $this->_parse_conf_var($val);
+            }
+        elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
+                // section var
+                return $this->_parse_section_prop($val);
+            }
+        elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) {
+            // literal string
+            return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
+        }
+        return $val;
+    }
+
+    /**
+     * expand quoted text with embedded variables
+     *
+     * @param string $var_expr
+     * @return string
+     */
+    function _expand_quoted_text($var_expr)
+    {
+        // if contains unescaped $, expand it
+        if(preg_match_all('~(?:\`(?<!\\\\)\$' . $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
+            $_match = $_match[0];
+            $_replace = array();
+            foreach($_match as $_var) {
+                $_replace[$_var] = '".(' . $this->_parse_var(str_replace('`','',$_var)) . ')."';
+            }
+            $var_expr = strtr($var_expr, $_replace);
+            $_return = preg_replace('~\.""|(?<!\\\\)""\.~', '', $var_expr);
+        } else {
+            $_return = $var_expr;
+        }
+        // replace double quoted literal string with single quotes
+        $_return = preg_replace('~^"([\s\w]+)"$~',"'\\1'",$_return);
+        return $_return;
+    }
+
+    /**
+     * parse variable expression into PHP code
+     *
+     * @param string $var_expr
+     * @param string $output
+     * @return string
+     */
+    function _parse_var($var_expr)
+    {
+        $_has_math = false;
+        $_math_vars = preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+        if(count($_math_vars) > 1) {
+            $_first_var = "";
+            $_complete_var = "";
+            $_output = "";
+            // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter)
+            foreach($_math_vars as $_k => $_math_var) {
+                $_math_var = $_math_vars[$_k];
+
+                if(!empty($_math_var) || is_numeric($_math_var)) {
+                    // hit a math operator, so process the stuff which came before it
+                    if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) {
+                        $_has_math = true;
+                        if(!empty($_complete_var) || is_numeric($_complete_var)) {
+                            $_output .= $this->_parse_var($_complete_var);
+                        }
+
+                        // just output the math operator to php
+                        $_output .= $_math_var;
+
+                        if(empty($_first_var))
+                            $_first_var = $_complete_var;
+
+                        $_complete_var = "";
+                    } else {
+                        $_complete_var .= $_math_var;
+                    }
+                }
+            }
+            if($_has_math) {
+                if(!empty($_complete_var) || is_numeric($_complete_var))
+                    $_output .= $this->_parse_var($_complete_var);
+
+                // get the modifiers working (only the last var from math + modifier is left)
+                $var_expr = $_complete_var;
+            }
+        }
+
+        // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit)
+        if(is_numeric(substr($var_expr, 0, 1)))
+            $_var_ref = $var_expr;
+        else
+            $_var_ref = substr($var_expr, 1);
+        
+        if(!$_has_math) {
+            
+            // get [foo] and .foo and ->foo and (...) pieces
+            preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match);
+                        
+            $_indexes = $match[0];
+            $_var_name = array_shift($_indexes);
+
+            /* Handle $smarty.* variable references as a special case. */
+            if ($_var_name == 'smarty') {
+                /*
+                 * If the reference could be compiled, use the compiled output;
+                 * otherwise, fall back on the $smarty variable generated at
+                 * run-time.
+                 */
+                if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) {
+                    $_output = $smarty_ref;
+                } else {
+                    $_var_name = substr(array_shift($_indexes), 1);
+                    $_output = "\$this->_smarty_vars['$_var_name']";
+                }
+            } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) {
+                // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers
+                if(count($_indexes) > 0)
+                {
+                    $_var_name .= implode("", $_indexes);
+                    $_indexes = array();
+                }
+                $_output = $_var_name;
+            } else {
+                $_output = "\$this->_tpl_vars['$_var_name']";
+            }
+
+            foreach ($_indexes as $_index) {
+                if (substr($_index, 0, 1) == '[') {
+                    $_index = substr($_index, 1, -1);
+                    if (is_numeric($_index)) {
+                        $_output .= "[$_index]";
+                    } elseif (substr($_index, 0, 1) == '$') {
+                        if (strpos($_index, '.') !== false) {
+                            $_output .= '[' . $this->_parse_var($_index) . ']';
+                        } else {
+                            $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]";
+                        }
+                    } else {
+                        $_var_parts = explode('.', $_index);
+                        $_var_section = $_var_parts[0];
+                        $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index';
+                        $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]";
+                    }
+                } else if (substr($_index, 0, 1) == '.') {
+                    if (substr($_index, 1, 1) == '$')
+                        $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]";
+                    else
+                        $_output .= "['" . substr($_index, 1) . "']";
+                } else if (substr($_index,0,2) == '->') {
+                    if(substr($_index,2,2) == '__') {
+                        $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+                    } elseif($this->security && substr($_index, 2, 1) == '_') {
+                        $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+                    } elseif (substr($_index, 2, 1) == '$') {
+                        if ($this->security) {
+                            $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
+                        } else {
+                            $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}';
+                        }
+                    } else {
+                        $_output .= $_index;
+                    }
+                } elseif (substr($_index, 0, 1) == '(') {
+                    $_index = $this->_parse_parenth_args($_index);
+                    $_output .= $_index;
+                } else {
+                    $_output .= $_index;
+                }
+            }
+        }
+
+        return $_output;
+    }
+
+    /**
+     * parse arguments in function call parenthesis
+     *
+     * @param string $parenth_args
+     * @return string
+     */
+    function _parse_parenth_args($parenth_args)
+    {
+        preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match);
+        $orig_vals = $match = $match[0];
+        $this->_parse_vars_props($match);
+        $replace = array();
+        for ($i = 0, $count = count($match); $i < $count; $i++) {
+            $replace[$orig_vals[$i]] = $match[$i];
+        }
+        return strtr($parenth_args, $replace);
+    }
+
+    /**
+     * parse configuration variable expression into PHP code
+     *
+     * @param string $conf_var_expr
+     */
+    function _parse_conf_var($conf_var_expr)
+    {
+        $parts = explode('|', $conf_var_expr, 2);
+        $var_ref = $parts[0];
+        $modifiers = isset($parts[1]) ? $parts[1] : '';
+
+        $var_name = substr($var_ref, 1, -1);
+
+        $output = "\$this->_config[0]['vars']['$var_name']";
+
+        $this->_parse_modifiers($output, $modifiers);
+
+        return $output;
+    }
+
+    /**
+     * parse section property expression into PHP code
+     *
+     * @param string $section_prop_expr
+     * @return string
+     */
+    function _parse_section_prop($section_prop_expr)
+    {
+        $parts = explode('|', $section_prop_expr, 2);
+        $var_ref = $parts[0];
+        $modifiers = isset($parts[1]) ? $parts[1] : '';
+
+        preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);
+        $section_name = $match[1];
+        $prop_name = $match[2];
+
+        $output = "\$this->_sections['$section_name']['$prop_name']";
+
+        $this->_parse_modifiers($output, $modifiers);
+
+        return $output;
+    }
+
+
+    /**
+     * parse modifier chain into PHP code
+     *
+     * sets $output to parsed modified chain
+     * @param string $output
+     * @param string $modifier_string
+     */
+    function _parse_modifiers(&$output, $modifier_string)
+    {
+        preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
+        list(, $_modifiers, $modifier_arg_strings) = $_match;
+
+        for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) {
+            $_modifier_name = $_modifiers[$_i];
+
+            if($_modifier_name == 'smarty') {
+                // skip smarty modifier
+                continue;
+            }
+
+            preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
+            $_modifier_args = $_match[1];
+
+            if (substr($_modifier_name, 0, 1) == '@') {
+                $_map_array = false;
+                $_modifier_name = substr($_modifier_name, 1);
+            } else {
+                $_map_array = true;
+            }
+
+            if (empty($this->_plugins['modifier'][$_modifier_name])
+                && !$this->_get_plugin_filepath('modifier', $_modifier_name)
+                && function_exists($_modifier_name)) {
+                if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
+                    $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
+                } else {
+                    $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name,  null, null, false);
+                }
+            }
+            $this->_add_plugin('modifier', $_modifier_name);
+
+            $this->_parse_vars_props($_modifier_args);
+
+            if($_modifier_name == 'default') {
+                // supress notifications of default modifier vars and args
+                if(substr($output, 0, 1) == '$') {
+                    $output = '@' . $output;
+                }
+                if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') {
+                    $_modifier_args[0] = '@' . $_modifier_args[0];
+                }
+            }
+            if (count($_modifier_args) > 0)
+                $_modifier_args = ', '.implode(', ', $_modifier_args);
+            else
+                $_modifier_args = '';
+
+            if ($_map_array) {
+                $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))";
+
+            } else {
+
+                $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)";
+
+            }
+        }
+    }
+
+
+    /**
+     * add plugin
+     *
+     * @param string $type
+     * @param string $name
+     * @param boolean? $delayed_loading
+     */
+    function _add_plugin($type, $name, $delayed_loading = null)
+    {
+        if (!isset($this->_plugin_info[$type])) {
+            $this->_plugin_info[$type] = array();
+        }
+        if (!isset($this->_plugin_info[$type][$name])) {
+            $this->_plugin_info[$type][$name] = array($this->_current_file,
+                                                      $this->_current_line_no,
+                                                      $delayed_loading);
+        }
+    }
+
+
+    /**
+     * Compiles references of type $smarty.foo
+     *
+     * @param string $indexes
+     * @return string
+     */
+    function _compile_smarty_ref(&$indexes)
+    {
+        /* Extract the reference name. */
+        $_ref = substr($indexes[0], 1);
+        foreach($indexes as $_index_no=>$_index) {
+            if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) {
+                $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
+            }
+        }
+
+        switch ($_ref) {
+            case 'now':
+                $compiled_ref = 'time()';
+                $_max_index = 1;
+                break;
+
+            case 'foreach':
+                array_shift($indexes);
+                $_var = $this->_parse_var_props(substr($indexes[0], 1));
+                $_propname = substr($indexes[1], 1);
+                $_max_index = 1;
+                switch ($_propname) {
+                    case 'index':
+                        array_shift($indexes);
+                        $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)";
+                        break;
+                        
+                    case 'first':
+                        array_shift($indexes);
+                        $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)";
+                        break;
+
+                    case 'last':
+                        array_shift($indexes);
+                        $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])";
+                        break;
+                        
+                    case 'show':
+                        array_shift($indexes);
+                        $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)";
+                        break;
+                        
+                    default:
+                        unset($_max_index);
+                        $compiled_ref = "\$this->_foreach[$_var]";
+                }
+                break;
+
+            case 'section':
+                array_shift($indexes);
+                $_var = $this->_parse_var_props(substr($indexes[0], 1));
+                $compiled_ref = "\$this->_sections[$_var]";
+                break;
+
+            case 'get':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_GET";
+                break;
+
+            case 'post':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_POST";
+                break;
+
+            case 'cookies':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_COOKIE";
+                break;
+
+            case 'env':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_ENV";
+                break;
+
+            case 'server':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_SERVER";
+                break;
+
+            case 'session':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                $compiled_ref = "\$_SESSION";
+                break;
+
+            /*
+             * These cases are handled either at run-time or elsewhere in the
+             * compiler.
+             */
+            case 'request':
+                if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
+                    $this->_syntax_error("(secure mode) super global access not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                if ($this->request_use_auto_globals) {
+                    $compiled_ref = "\$_REQUEST";
+                    break;
+                } else {
+                    $this->_init_smarty_vars = true;
+                }
+                return null;
+
+            case 'capture':
+                return null;
+
+            case 'template':
+                $compiled_ref = "'$this->_current_file'";
+                $_max_index = 1;
+                break;
+
+            case 'version':
+                $compiled_ref = "'$this->_version'";
+                $_max_index = 1;
+                break;
+
+            case 'const':
+                if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) {
+                    $this->_syntax_error("(secure mode) constants not permitted",
+                                         E_USER_WARNING, __FILE__, __LINE__);
+                    return;
+                }
+                array_shift($indexes);
+                if (preg_match('!^\.\w+$!', $indexes[0])) {
+                    $compiled_ref = '@' . substr($indexes[0], 1);
+                } else {
+                    $_val = $this->_parse_var_props(substr($indexes[0], 1));
+                    $compiled_ref = '@constant(' . $_val . ')';
+                }
+                $_max_index = 1;
+                break;
+
+            case 'config':
+                $compiled_ref = "\$this->_config[0]['vars']";
+                $_max_index = 3;
+                break;
+
+            case 'ldelim':
+                $compiled_ref = "'$this->left_delimiter'";
+                break;
+
+            case 'rdelim':
+                $compiled_ref = "'$this->right_delimiter'";
+                break;
+                
+            default:
+                $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
+                break;
+        }
+
+        if (isset($_max_index) && count($indexes) > $_max_index) {
+            $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        array_shift($indexes);
+        return $compiled_ref;
+    }
+
+    /**
+     * compiles call to plugin of type $type with name $name
+     * returns a string containing the function-name or method call
+     * without the paramter-list that would have follow to make the
+     * call valid php-syntax
+     *
+     * @param string $type
+     * @param string $name
+     * @return string
+     */
+    function _compile_plugin_call($type, $name) {
+        if (isset($this->_plugins[$type][$name])) {
+            /* plugin loaded */
+            if (is_array($this->_plugins[$type][$name][0])) {
+                return ((is_object($this->_plugins[$type][$name][0][0])) ?
+                        "\$this->_plugins['$type']['$name'][0][0]->"    /* method callback */
+                        : (string)($this->_plugins[$type][$name][0][0]).'::'    /* class callback */
+                       ). $this->_plugins[$type][$name][0][1];
+
+            } else {
+                /* function callback */
+                return $this->_plugins[$type][$name][0];
+
+            }
+        } else {
+            /* plugin not loaded -> auto-loadable-plugin */
+            return 'smarty_'.$type.'_'.$name;
+
+        }
+    }
+
+    /**
+     * load pre- and post-filters
+     */
+    function _load_filters()
+    {
+        if (count($this->_plugins['prefilter']) > 0) {
+            foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
+                if ($prefilter === false) {
+                    unset($this->_plugins['prefilter'][$filter_name]);
+                    $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false)));
+                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+                    smarty_core_load_plugins($_params, $this);
+                }
+            }
+        }
+        if (count($this->_plugins['postfilter']) > 0) {
+            foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
+                if ($postfilter === false) {
+                    unset($this->_plugins['postfilter'][$filter_name]);
+                    $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false)));
+                    require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
+                    smarty_core_load_plugins($_params, $this);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Quote subpattern references
+     *
+     * @param string $string
+     * @return string
+     */
+    function _quote_replace($string)
+    {
+        return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
+    }
+
+    /**
+     * display Smarty syntax error
+     *
+     * @param string $error_msg
+     * @param integer $error_type
+     * @param string $file
+     * @param integer $line
+     */
+    function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
+    {
+        $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
+    }
+
+
+    /**
+     * check if the compilation changes from cacheable to
+     * non-cacheable state with the beginning of the current
+     * plugin. return php-code to reflect the transition.
+     * @return string
+     */
+    function _push_cacheable_state($type, $name) {
+        $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
+        if ($_cacheable
+            || 0<$this->_cacheable_state++) return '';
+        if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty'));
+        $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:'
+            . $this->_cache_serial . '#' . $this->_nocache_count
+            . '}\'; endif;';
+        return $_ret;
+    }
+
+
+    /**
+     * check if the compilation changes from non-cacheable to
+     * cacheable state with the end of the current plugin return
+     * php-code to reflect the transition.
+     * @return string
+     */
+    function _pop_cacheable_state($type, $name) {
+        $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
+        if ($_cacheable
+            || --$this->_cacheable_state>0) return '';
+        return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:'
+            . $this->_cache_serial . '#' . ($this->_nocache_count++)
+            . '}\'; endif;';
+    }
+
+
+    /**
+     * push opening tag-name, file-name and line-number on the tag-stack
+     * @param string the opening tag's name
+     */
+    function _push_tag($open_tag)
+    {
+        array_push($this->_tag_stack, array($open_tag, $this->_current_line_no));
+    }
+
+    /**
+     * pop closing tag-name
+     * raise an error if this stack-top doesn't match with the closing tag
+     * @param string the closing tag's name
+     * @return string the opening tag's name
+     */
+    function _pop_tag($close_tag)
+    {
+        $message = '';
+        if (count($this->_tag_stack)>0) {
+            list($_open_tag, $_line_no) = array_pop($this->_tag_stack);
+            if ($close_tag == $_open_tag) {
+                return $_open_tag;
+            }
+            if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) {
+                return $this->_pop_tag($close_tag);
+            }
+            if ($close_tag == 'section' && $_open_tag == 'sectionelse') {
+                $this->_pop_tag($close_tag);
+                return $_open_tag;
+            }
+            if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') {
+                $this->_pop_tag($close_tag);
+                return $_open_tag;
+            }
+            if ($_open_tag == 'else' || $_open_tag == 'elseif') {
+                $_open_tag = 'if';
+            } elseif ($_open_tag == 'sectionelse') {
+                $_open_tag = 'section';
+            } elseif ($_open_tag == 'foreachelse') {
+                $_open_tag = 'foreach';
+            }
+            $message = " expected {/$_open_tag} (opened line $_line_no).";
+        }
+        $this->_syntax_error("mismatched tag {/$close_tag}.$message",
+                             E_USER_ERROR, __FILE__, __LINE__);
+    }
+
+}
+
+/**
+ * compare to values by their string length
+ *
+ * @access private
+ * @param string $a
+ * @param string $b
+ * @return 0|-1|1
+ */
+function _smarty_sort_length($a, $b)
+{
+    if($a == $b)
+        return 0;
+
+    if(strlen($a) == strlen($b))
+        return ($a > $b) ? -1 : 1;
+
+    return (strlen($a) > strlen($b)) ? -1 : 1;
+}
+
+
+/* vim: set et: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/debug.tpl
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/debug.tpl	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/debug.tpl	(revision 14585)
@@ -0,0 +1,157 @@
+{* Smarty *}
+{* debug.tpl, last updated version 2.1.0 *}
+{assign_debug_info}
+{capture assign=debug_output}
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+    <title>Smarty Debug Console</title>
+{literal}
+<style type="text/css">
+/* <![CDATA[ */
+body, h1, h2, td, th, p {
+    font-family: sans-serif;
+    font-weight: normal;
+    font-size: 0.9em;
+    margin: 1px;
+    padding: 0;
+}
+
+h1 {
+    margin: 0;
+    text-align: left;
+    padding: 2px;
+    background-color: #f0c040;
+    color:  black;
+    font-weight: bold;
+    font-size: 1.2em;
+ }
+
+h2 {
+    background-color: #9B410E;
+    color: white;
+    text-align: left;
+    font-weight: bold;
+    padding: 2px;
+    border-top: 1px solid black;
+}
+
+body {
+    background: black; 
+}
+
+p, table, div {
+    background: #f0ead8;
+} 
+
+p {
+    margin: 0;
+    font-style: italic;
+    text-align: center;
+}
+
+table {
+    width: 100%;
+}
+
+th, td {
+    font-family: monospace;
+    vertical-align: top;
+    text-align: left;
+    width: 50%;
+}
+
+td {
+    color: green;
+}
+
+.odd {
+    background-color: #eeeeee;
+}
+
+.even {
+    background-color: #fafafa;
+}
+
+.exectime {
+    font-size: 0.8em;
+    font-style: italic;
+}
+
+#table_assigned_vars th {
+    color: blue;
+}
+
+#table_config_vars th {
+    color: maroon;
+}
+/* ]]> */
+</style>
+{/literal}
+</head>
+<body>
+
+<h1>Smarty Debug Console</h1>
+
+<h2>included templates &amp; config files (load time in seconds)</h2>
+
+<div>
+{section name=templates loop=$_debug_tpls}
+    {section name=indent loop=$_debug_tpls[templates].depth}&nbsp;&nbsp;&nbsp;{/section}
+    <font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
+        {$_debug_tpls[templates].filename|escape:html}</font>
+    {if isset($_debug_tpls[templates].exec_time)}
+        <span class="exectime">
+        ({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
+        {if %templates.index% eq 0}(total){/if}
+        </span>
+    {/if}
+    <br />
+{sectionelse}
+    <p>no templates included</p>
+{/section}
+</div>
+
+<h2>assigned template variables</h2>
+
+<table id="table_assigned_vars">
+    {section name=vars loop=$_debug_keys}
+        <tr class="{cycle values="odd,even"}">
+            <th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
+            <td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
+    {sectionelse}
+        <tr><td><p>no template variables assigned</p></td></tr>
+    {/section}
+</table>
+
+<h2>assigned config file variables (outer template scope)</h2>
+
+<table id="table_config_vars">
+    {section name=config_vars loop=$_debug_config_keys}
+        <tr class="{cycle values="odd,even"}">
+            <th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
+            <td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
+    {sectionelse}
+        <tr><td><p>no config vars assigned</p></td></tr>
+    {/section}
+</table>
+</body>
+</html>
+{/capture}
+{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
+    {$debug_output}
+{else}
+<script type="text/javascript">
+// <![CDATA[
+    if ( self.name == '' ) {ldelim}
+       var title = 'Console';
+    {rdelim}
+    else {ldelim}
+       var title = 'Console_' + self.name;
+    {rdelim}
+    _smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
+    _smarty_console.document.write('{$debug_output|escape:'javascript'}');
+    _smarty_console.document.close();
+// ]]>
+</script>
+{/if}
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.assemble_plugin_filepath.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.assemble_plugin_filepath.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.assemble_plugin_filepath.php	(revision 14585)
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * assemble filepath of requested plugin
+ *
+ * @param string $type
+ * @param string $name
+ * @return string|false
+ */
+function smarty_core_assemble_plugin_filepath($params, &$smarty)
+{
+    static $_filepaths_cache = array();
+
+    $_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
+    if (isset($_filepaths_cache[$_plugin_filename])) {
+        return $_filepaths_cache[$_plugin_filename];
+    }
+    $_return = false;
+
+    foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
+
+        $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
+
+        // see if path is relative
+        if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
+            $_relative_paths[] = $_plugin_dir;
+            // relative path, see if it is in the SMARTY_DIR
+            if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
+                $_return = SMARTY_DIR . $_plugin_filepath;
+                break;
+            }
+        }
+        // try relative to cwd (or absolute)
+        if (@is_readable($_plugin_filepath)) {
+            $_return = $_plugin_filepath;
+            break;
+        }
+    }
+
+    if($_return === false) {
+        // still not found, try PHP include_path
+        if(isset($_relative_paths)) {
+            foreach ((array)$_relative_paths as $_plugin_dir) {
+
+                $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
+
+                $_params = array('file_path' => $_plugin_filepath);
+                require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+                if(smarty_core_get_include_path($_params, $smarty)) {
+                    $_return = $_params['new_file_path'];
+                    break;
+                }
+            }
+        }
+    }
+    $_filepaths_cache[$_plugin_filename] = $_return;
+    return $_return;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.assign_smarty_interface.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.assign_smarty_interface.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.assign_smarty_interface.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty assign_smarty_interface core plugin
+ *
+ * Type:     core<br>
+ * Name:     assign_smarty_interface<br>
+ * Purpose:  assign the $smarty interface variable
+ * @param array Format: null
+ * @param Smarty
+ */
+function smarty_core_assign_smarty_interface($params, &$smarty)
+{
+        if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
+            return;
+        }
+
+        $_globals_map = array('g'  => 'HTTP_GET_VARS',
+                             'p'  => 'HTTP_POST_VARS',
+                             'c'  => 'HTTP_COOKIE_VARS',
+                             's'  => 'HTTP_SERVER_VARS',
+                             'e'  => 'HTTP_ENV_VARS');
+
+        $_smarty_vars_request  = array();
+
+        foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
+            if (isset($_globals_map[$_c])) {
+                $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
+            }
+        }
+        $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
+
+        $smarty->_smarty_vars['request'] = $_smarty_vars_request;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.create_dir_structure.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.create_dir_structure.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.create_dir_structure.php	(revision 14585)
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * create full directory structure
+ *
+ * @param string $dir
+ */
+
+// $dir
+
+function smarty_core_create_dir_structure($params, &$smarty)
+{
+    if (!file_exists($params['dir'])) {
+        $_open_basedir_ini = ini_get('open_basedir');
+
+        if (DIRECTORY_SEPARATOR=='/') {
+            /* unix-style paths */
+            $_dir = $params['dir'];
+            $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
+            $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
+            if($_use_open_basedir = !empty($_open_basedir_ini)) {
+                $_open_basedirs = explode(':', $_open_basedir_ini);
+            }
+
+        } else {
+            /* other-style paths */
+            $_dir = str_replace('\\','/', $params['dir']);
+            $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
+            if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
+                /* leading "//" for network volume, or "[letter]:/" for full path */
+                $_new_dir = $_root_dir[1];
+                /* remove drive-letter from _dir_parts */
+                if (isset($_root_dir[3])) array_shift($_dir_parts);
+
+            } else {
+                $_new_dir = str_replace('\\', '/', getcwd()).'/';
+
+            }
+
+            if($_use_open_basedir = !empty($_open_basedir_ini)) {
+                $_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
+            }
+
+        }
+
+        /* all paths use "/" only from here */
+        foreach ($_dir_parts as $_dir_part) {
+            $_new_dir .= $_dir_part;
+
+            if ($_use_open_basedir) {
+                // do not attempt to test or make directories outside of open_basedir
+                $_make_new_dir = false;
+                foreach ($_open_basedirs as $_open_basedir) {
+                    if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
+                        $_make_new_dir = true;
+                        break;
+                    }
+                }
+            } else {
+                $_make_new_dir = true;
+            }
+
+            if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
+                $smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
+                return false;
+            }
+            $_new_dir .= '/';
+        }
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.display_debug_console.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.display_debug_console.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.display_debug_console.php	(revision 14585)
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty debug_console function plugin
+ *
+ * Type:     core<br>
+ * Name:     display_debug_console<br>
+ * Purpose:  display the javascript debug console window
+ * @param array Format: null
+ * @param Smarty
+ */
+function smarty_core_display_debug_console($params, &$smarty)
+{
+    // we must force compile the debug template in case the environment
+    // changed between separate applications.
+
+    if(empty($smarty->debug_tpl)) {
+        // set path to debug template from SMARTY_DIR
+        $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
+        if($smarty->security && is_file($smarty->debug_tpl)) {
+            $smarty->secure_dir[] = realpath($smarty->debug_tpl);
+        }
+        $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
+    }
+
+    $_ldelim_orig = $smarty->left_delimiter;
+    $_rdelim_orig = $smarty->right_delimiter;
+
+    $smarty->left_delimiter = '{';
+    $smarty->right_delimiter = '}';
+
+    $_compile_id_orig = $smarty->_compile_id;
+    $smarty->_compile_id = null;
+
+    $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
+    if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
+    {
+        ob_start();
+        $smarty->_include($_compile_path);
+        $_results = ob_get_contents();
+        ob_end_clean();
+    } else {
+        $_results = '';
+    }
+
+    $smarty->_compile_id = $_compile_id_orig;
+
+    $smarty->left_delimiter = $_ldelim_orig;
+    $smarty->right_delimiter = $_rdelim_orig;
+
+    return $_results;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.get_include_path.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.get_include_path.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.get_include_path.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Get path to file from include_path
+ *
+ * @param string $file_path
+ * @param string $new_file_path
+ * @return boolean
+ * @staticvar array|null
+ */
+
+//  $file_path, &$new_file_path
+
+function smarty_core_get_include_path(&$params, &$smarty)
+{
+    static $_path_array = null;
+
+    if(!isset($_path_array)) {
+        $_ini_include_path = ini_get('include_path');
+
+        if(strstr($_ini_include_path,';')) {
+            // windows pathnames
+            $_path_array = explode(';',$_ini_include_path);
+        } else {
+            $_path_array = explode(':',$_ini_include_path);
+        }
+    }
+    foreach ($_path_array as $_include_path) {
+        if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
+               $params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
+            return true;
+        }
+    }
+    return false;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.get_microtime.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.get_microtime.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.get_microtime.php	(revision 14585)
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Get seconds and microseconds
+ * @return double
+ */
+function smarty_core_get_microtime($params, &$smarty)
+{
+    $mtime = microtime();
+    $mtime = explode(" ", $mtime);
+    $mtime = (double)($mtime[1]) + (double)($mtime[0]);
+    return ($mtime);
+}
+
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.get_php_resource.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.get_php_resource.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.get_php_resource.php	(revision 14585)
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Retrieves PHP script resource
+ *
+ * sets $php_resource to the returned resource
+ * @param string $resource
+ * @param string $resource_type
+ * @param  $php_resource
+ * @return boolean
+ */
+
+function smarty_core_get_php_resource(&$params, &$smarty)
+{
+
+    $params['resource_base_path'] = $smarty->trusted_dir;
+    $smarty->_parse_resource_name($params, $smarty);
+
+    /*
+     * Find out if the resource exists.
+     */
+
+    if ($params['resource_type'] == 'file') {
+        $_readable = false;
+        if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
+            $_readable = true;
+        } else {
+            // test for file in include_path
+            $_params = array('file_path' => $params['resource_name']);
+            require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
+            if(smarty_core_get_include_path($_params, $smarty)) {
+                $_include_path = $_params['new_file_path'];
+                $_readable = true;
+            }
+        }
+    } else if ($params['resource_type'] != 'file') {
+        $_template_source = null;
+        $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
+            && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
+                                    array($params['resource_name'], &$_template_source, &$smarty));
+    }
+
+    /*
+     * Set the error function, depending on which class calls us.
+     */
+    if (method_exists($smarty, '_syntax_error')) {
+        $_error_funcc = '_syntax_error';
+    } else {
+        $_error_funcc = 'trigger_error';
+    }
+
+    if ($_readable) {
+        if ($smarty->security) {
+            require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
+            if (!smarty_core_is_trusted($params, $smarty)) {
+                $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
+                return false;
+            }
+        }
+    } else {
+        $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
+        return false;
+    }
+
+    if ($params['resource_type'] == 'file') {
+        $params['php_resource'] = $params['resource_name'];
+    } else {
+        $params['php_resource'] = $_template_source;
+    }
+    return true;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.is_secure.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.is_secure.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.is_secure.php	(revision 14585)
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * determines if a resource is secure or not.
+ *
+ * @param string $resource_type
+ * @param string $resource_name
+ * @return boolean
+ */
+
+//  $resource_type, $resource_name
+
+function smarty_core_is_secure($params, &$smarty)
+{
+    if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
+        return true;
+    }
+
+    if ($params['resource_type'] == 'file') {
+        $_rp = realpath($params['resource_name']);
+        if (isset($params['resource_base_path'])) {
+            foreach ((array)$params['resource_base_path'] as $curr_dir) {
+                if ( ($_cd = realpath($curr_dir)) !== false &&
+                     strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+                     substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
+                    return true;
+                }
+            }
+        }
+        if (!empty($smarty->secure_dir)) {
+            foreach ((array)$smarty->secure_dir as $curr_dir) {
+                if ( ($_cd = realpath($curr_dir)) !== false) {
+                    if($_cd == $_rp) {
+                        return true;
+                    } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
+                        substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
+                        return true;
+                    }
+                }
+            }
+        }
+    } else {
+        // resource is not on local file system
+        return call_user_func_array(
+            $smarty->_plugins['resource'][$params['resource_type']][0][2],
+            array($params['resource_name'], &$smarty));
+    }
+
+    return false;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.is_trusted.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.is_trusted.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.is_trusted.php	(revision 14585)
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * determines if a resource is trusted or not
+ *
+ * @param string $resource_type
+ * @param string $resource_name
+ * @return boolean
+ */
+
+ // $resource_type, $resource_name
+
+function smarty_core_is_trusted($params, &$smarty)
+{
+    $_smarty_trusted = false;
+    if ($params['resource_type'] == 'file') {
+        if (!empty($smarty->trusted_dir)) {
+            $_rp = realpath($params['resource_name']);
+            foreach ((array)$smarty->trusted_dir as $curr_dir) {
+                if (!empty($curr_dir) && is_readable ($curr_dir)) {
+                    $_cd = realpath($curr_dir);
+                    if (strncmp($_rp, $_cd, strlen($_cd)) == 0
+                        && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
+                        $_smarty_trusted = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+    } else {
+        // resource is not on local file system
+        $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
+                                                array($params['resource_name'], $smarty));
+    }
+
+    return $_smarty_trusted;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.load_plugins.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.load_plugins.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.load_plugins.php	(revision 14585)
@@ -0,0 +1,125 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Load requested plugins
+ *
+ * @param array $plugins
+ */
+
+// $plugins
+
+function smarty_core_load_plugins($params, &$smarty)
+{
+
+    foreach ($params['plugins'] as $_plugin_info) {
+        list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
+        $_plugin = &$smarty->_plugins[$_type][$_name];
+
+        /*
+         * We do not load plugin more than once for each instance of Smarty.
+         * The following code checks for that. The plugin can also be
+         * registered dynamically at runtime, in which case template file
+         * and line number will be unknown, so we fill them in.
+         *
+         * The final element of the info array is a flag that indicates
+         * whether the dynamically registered plugin function has been
+         * checked for existence yet or not.
+         */
+        if (isset($_plugin)) {
+            if (empty($_plugin[3])) {
+                if (!is_callable($_plugin[0])) {
+                    $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+                } else {
+                    $_plugin[1] = $_tpl_file;
+                    $_plugin[2] = $_tpl_line;
+                    $_plugin[3] = true;
+                    if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
+                }
+            }
+            continue;
+        } else if ($_type == 'insert') {
+            /*
+             * For backwards compatibility, we check for insert functions in
+             * the symbol table before trying to load them as a plugin.
+             */
+            $_plugin_func = 'insert_' . $_name;
+            if (function_exists($_plugin_func)) {
+                $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
+                continue;
+            }
+        }
+
+        $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
+
+        if (! $_found = ($_plugin_file != false)) {
+            $_message = "could not load plugin file '$_type.$_name.php'\n";
+        }
+
+        /*
+         * If plugin file is found, it -must- provide the properly named
+         * plugin function. In case it doesn't, simply output the error and
+         * do not fall back on any other method.
+         */
+        if ($_found) {
+            include_once $_plugin_file;
+
+            $_plugin_func = 'smarty_' . $_type . '_' . $_name;
+            if (!function_exists($_plugin_func)) {
+                $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+                continue;
+            }
+        }
+        /*
+         * In case of insert plugins, their code may be loaded later via
+         * 'script' attribute.
+         */
+        else if ($_type == 'insert' && $_delayed_loading) {
+            $_plugin_func = 'smarty_' . $_type . '_' . $_name;
+            $_found = true;
+        }
+
+        /*
+         * Plugin specific processing and error checking.
+         */
+        if (!$_found) {
+            if ($_type == 'modifier') {
+                /*
+                 * In case modifier falls back on using PHP functions
+                 * directly, we only allow those specified in the security
+                 * context.
+                 */
+                if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
+                    $_message = "(secure mode) modifier '$_name' is not allowed";
+                } else {
+                    if (!function_exists($_name)) {
+                        $_message = "modifier '$_name' is not implemented";
+                    } else {
+                        $_plugin_func = $_name;
+                        $_found = true;
+                    }
+                }
+            } else if ($_type == 'function') {
+                /*
+                 * This is a catch-all situation.
+                 */
+                $_message = "unknown tag - '$_name'";
+            }
+        }
+
+        if ($_found) {
+            $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
+        } else {
+            // output error
+            $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
+        }
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.load_resource_plugin.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.load_resource_plugin.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.load_resource_plugin.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * load a resource plugin
+ *
+ * @param string $type
+ */
+
+// $type
+
+function smarty_core_load_resource_plugin($params, &$smarty)
+{
+    /*
+     * Resource plugins are not quite like the other ones, so they are
+     * handled differently. The first element of plugin info is the array of
+     * functions provided by the plugin, the second one indicates whether
+     * all of them exist or not.
+     */
+
+    $_plugin = &$smarty->_plugins['resource'][$params['type']];
+    if (isset($_plugin)) {
+        if (!$_plugin[1] && count($_plugin[0])) {
+            $_plugin[1] = true;
+            foreach ($_plugin[0] as $_plugin_func) {
+                if (!is_callable($_plugin_func)) {
+                    $_plugin[1] = false;
+                    break;
+                }
+            }
+        }
+
+        if (!$_plugin[1]) {
+            $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
+        }
+
+        return;
+    }
+
+    $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
+    $_found = ($_plugin_file != false);
+
+    if ($_found) {            /*
+         * If the plugin file is found, it -must- provide the properly named
+         * plugin functions.
+         */
+        include_once($_plugin_file);
+
+        /*
+         * Locate functions that we require the plugin to provide.
+         */
+        $_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
+        $_resource_funcs = array();
+        foreach ($_resource_ops as $_op) {
+            $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
+            if (!function_exists($_plugin_func)) {
+                $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
+                return;
+            } else {
+                $_resource_funcs[] = $_plugin_func;
+            }
+        }
+
+        $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.process_cached_inserts.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.process_cached_inserts.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.process_cached_inserts.php	(revision 14585)
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Replace cached inserts with the actual results
+ *
+ * @param string $results
+ * @return string
+ */
+function smarty_core_process_cached_inserts($params, &$smarty)
+{
+    preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
+                   $params['results'], $match);
+    list($cached_inserts, $insert_args) = $match;
+
+    for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
+        if ($smarty->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $debug_start_time = smarty_core_get_microtime($_params, $smarty);
+        }
+
+        $args = unserialize($insert_args[$i]);
+        $name = $args['name'];
+
+        if (isset($args['script'])) {
+            $_params = array('resource_name' => $smarty->_dequote($args['script']));
+            require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+            if(!smarty_core_get_php_resource($_params, $smarty)) {
+                return false;
+            }
+            $resource_type = $_params['resource_type'];
+            $php_resource = $_params['php_resource'];
+
+
+            if ($resource_type == 'file') {
+                $smarty->_include($php_resource, true);
+            } else {
+                $smarty->_eval($php_resource);
+            }
+        }
+
+        $function_name = $smarty->_plugins['insert'][$name][0];
+        if (empty($args['assign'])) {
+            $replace = $function_name($args, $smarty);
+        } else {
+            $smarty->assign($args['assign'], $function_name($args, $smarty));
+            $replace = '';
+        }
+
+        $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
+        if ($smarty->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $smarty->_smarty_debug_info[] = array('type'      => 'insert',
+                                                'filename'  => 'insert_'.$name,
+                                                'depth'     => $smarty->_inclusion_depth,
+                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
+        }
+    }
+
+    return $params['results'];
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.process_compiled_include.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.process_compiled_include.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.process_compiled_include.php	(revision 14585)
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Replace nocache-tags by results of the corresponding non-cacheable
+ * functions and return it
+ *
+ * @param string $compiled_tpl
+ * @param string $cached_source
+ * @return string
+ */
+
+function smarty_core_process_compiled_include($params, &$smarty)
+{
+    $_cache_including = $smarty->_cache_including;
+    $smarty->_cache_including = true;
+
+    $_return = $params['results'];
+
+    foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
+        $smarty->_include($_include_file_path, true);
+    }
+
+    foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
+        $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
+                                         array(&$smarty, '_process_compiled_include_callback'),
+                                         $_return);
+    }
+    $smarty->_cache_including = $_cache_including;
+    return $_return;
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.read_cache_file.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.read_cache_file.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.read_cache_file.php	(revision 14585)
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * read a cache file, determine if it needs to be
+ * regenerated or not
+ *
+ * @param string $tpl_file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @param string $results
+ * @return boolean
+ */
+
+//  $tpl_file, $cache_id, $compile_id, &$results
+
+function smarty_core_read_cache_file(&$params, &$smarty)
+{
+    static  $content_cache = array();
+
+    if ($smarty->force_compile) {
+        // force compile enabled, always regenerate
+        return false;
+    }
+
+    if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
+        list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
+        return true;
+    }
+
+    if (!empty($smarty->cache_handler_func)) {
+        // use cache_handler function
+        call_user_func_array($smarty->cache_handler_func,
+                             array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
+    } else {
+        // use local cache file
+        $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
+        $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
+        $params['results'] = $smarty->_read_file($_cache_file);
+    }
+
+    if (empty($params['results'])) {
+        // nothing to parse (error?), regenerate cache
+        return false;
+    }
+
+    $_contents = $params['results'];
+    $_info_start = strpos($_contents, "\n") + 1;
+    $_info_len = (int)substr($_contents, 0, $_info_start - 1);
+    $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
+    $params['results'] = substr($_contents, $_info_start + $_info_len);
+
+    if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
+        // caching by expiration time
+        if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
+            // cache expired, regenerate
+            return false;
+        }
+    } else {
+        // caching by lifetime
+        if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
+            // cache expired, regenerate
+            return false;
+        }
+    }
+
+    if ($smarty->compile_check) {
+        $_params = array('get_source' => false, 'quiet'=>true);
+        foreach (array_keys($_cache_info['template']) as $_template_dep) {
+            $_params['resource_name'] = $_template_dep;
+            if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
+                // template file has changed, regenerate cache
+                return false;
+            }
+        }
+
+        if (isset($_cache_info['config'])) {
+            $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
+            foreach (array_keys($_cache_info['config']) as $_config_dep) {
+                $_params['resource_name'] = $_config_dep;
+                if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
+                    // config file has changed, regenerate cache
+                    return false;
+                }
+            }
+        }
+    }
+
+    $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
+
+    $smarty->_cache_info = $_cache_info;
+    return true;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.rm_auto.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.rm_auto.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.rm_auto.php	(revision 14585)
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * delete an automagically created file by name and id
+ *
+ * @param string $auto_base
+ * @param string $auto_source
+ * @param string $auto_id
+ * @param integer $exp_time
+ * @return boolean
+ */
+
+// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
+
+function smarty_core_rm_auto($params, &$smarty)
+{
+    if (!@is_dir($params['auto_base']))
+      return false;
+
+    if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
+        $_params = array(
+            'dirname' => $params['auto_base'],
+            'level' => 0,
+            'exp_time' => $params['exp_time']
+        );
+        require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
+        $_res = smarty_core_rmdir($_params, $smarty);
+    } else {
+        $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
+
+        if(isset($params['auto_source'])) {
+            if (isset($params['extensions'])) {
+                $_res = false;
+                foreach ((array)$params['extensions'] as $_extension)
+                    $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
+            } else {
+                $_res = $smarty->_unlink($_tname, $params['exp_time']);
+            }
+        } elseif ($smarty->use_sub_dirs) {
+            $_params = array(
+                'dirname' => $_tname,
+                'level' => 1,
+                'exp_time' => $params['exp_time']
+            );
+            require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
+            $_res = smarty_core_rmdir($_params, $smarty);
+        } else {
+            // remove matching file names
+            $_handle = opendir($params['auto_base']);
+            $_res = true;
+            while (false !== ($_filename = readdir($_handle))) {
+                if($_filename == '.' || $_filename == '..') {
+                    continue;
+                } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
+                    $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
+                }
+            }
+        }
+    }
+
+    return $_res;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.rmdir.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.rmdir.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.rmdir.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * delete a dir recursively (level=0 -> keep root)
+ * WARNING: no tests, it will try to remove what you tell it!
+ *
+ * @param string $dirname
+ * @param integer $level
+ * @param integer $exp_time
+ * @return boolean
+ */
+
+//  $dirname, $level = 1, $exp_time = null
+
+function smarty_core_rmdir($params, &$smarty)
+{
+   if(!isset($params['level'])) { $params['level'] = 1; }
+   if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
+
+   if($_handle = @opendir($params['dirname'])) {
+
+        while (false !== ($_entry = readdir($_handle))) {
+            if ($_entry != '.' && $_entry != '..') {
+                if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
+                    $_params = array(
+                        'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
+                        'level' => $params['level'] + 1,
+                        'exp_time' => $params['exp_time']
+                    );
+                    smarty_core_rmdir($_params, $smarty);
+                }
+                else {
+                    $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
+                }
+            }
+        }
+        closedir($_handle);
+   }
+
+   if ($params['level']) {
+       return @rmdir($params['dirname']);
+   }
+   return (bool)$_handle;
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.run_insert_handler.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.run_insert_handler.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.run_insert_handler.php	(revision 14585)
@@ -0,0 +1,71 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Handle insert tags
+ *
+ * @param array $args
+ * @return string
+ */
+function smarty_core_run_insert_handler($params, &$smarty)
+{
+
+    require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+    if ($smarty->debugging) {
+        $_params = array();
+        $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
+    }
+
+    if ($smarty->caching) {
+        $_arg_string = serialize($params['args']);
+        $_name = $params['args']['name'];
+        if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
+            $smarty->_cache_info['insert_tags'][$_name] = array('insert',
+                                                             $_name,
+                                                             $smarty->_plugins['insert'][$_name][1],
+                                                             $smarty->_plugins['insert'][$_name][2],
+                                                             !empty($params['args']['script']) ? true : false);
+        }
+        return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
+    } else {
+        if (isset($params['args']['script'])) {
+            $_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
+            require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+            if(!smarty_core_get_php_resource($_params, $smarty)) {
+                return false;
+            }
+
+            if ($_params['resource_type'] == 'file') {
+                $smarty->_include($_params['php_resource'], true);
+            } else {
+                $smarty->_eval($_params['php_resource']);
+            }
+            unset($params['args']['script']);
+        }
+
+        $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
+        $_content = $_funcname($params['args'], $smarty);
+        if ($smarty->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $smarty->_smarty_debug_info[] = array('type'      => 'insert',
+                                                'filename'  => 'insert_'.$params['args']['name'],
+                                                'depth'     => $smarty->_inclusion_depth,
+                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
+        }
+
+        if (!empty($params['args']["assign"])) {
+            $smarty->assign($params['args']["assign"], $_content);
+        } else {
+            return $_content;
+        }
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.smarty_include_php.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.smarty_include_php.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.smarty_include_php.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * called for included php files within templates
+ *
+ * @param string $smarty_file
+ * @param string $smarty_assign variable to assign the included template's
+ *               output into
+ * @param boolean $smarty_once uses include_once if this is true
+ * @param array $smarty_include_vars associative array of vars from
+ *              {include file="blah" var=$var}
+ */
+
+//  $file, $assign, $once, $_smarty_include_vars
+
+function smarty_core_smarty_include_php($params, &$smarty)
+{
+    $_params = array('resource_name' => $params['smarty_file']);
+    require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
+    smarty_core_get_php_resource($_params, $smarty);
+    $_smarty_resource_type = $_params['resource_type'];
+    $_smarty_php_resource = $_params['php_resource'];
+
+    if (!empty($params['smarty_assign'])) {
+        ob_start();
+        if ($_smarty_resource_type == 'file') {
+            $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
+        } else {
+            $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
+        }
+        $smarty->assign($params['smarty_assign'], ob_get_contents());
+        ob_end_clean();
+    } else {
+        if ($_smarty_resource_type == 'file') {
+            $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
+        } else {
+            $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
+        }
+    }
+}
+
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.write_cache_file.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.write_cache_file.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.write_cache_file.php	(revision 14585)
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Prepend the cache information to the cache file
+ * and write it
+ *
+ * @param string $tpl_file
+ * @param string $cache_id
+ * @param string $compile_id
+ * @param string $results
+ * @return true|null
+ */
+
+ // $tpl_file, $cache_id, $compile_id, $results
+
+function smarty_core_write_cache_file($params, &$smarty)
+{
+
+    // put timestamp in cache header
+    $smarty->_cache_info['timestamp'] = time();
+    if ($smarty->cache_lifetime > -1){
+        // expiration set
+        $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
+    } else {
+        // cache will never expire
+        $smarty->_cache_info['expires'] = -1;
+    }
+
+    // collapse nocache.../nocache-tags
+    if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
+        // remove everything between every pair of outermost noache.../nocache-tags
+        // and replace it by a single nocache-tag
+        // this new nocache-tag will be replaced by dynamic contents in
+        // smarty_core_process_compiled_includes() on a cache-read
+        
+        $match_count = count($match[0]);
+        $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
+        
+        $level = 0;
+        $j = 0;
+        for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
+            if ($results[$i] == $match[0][$j]) {
+                // nocache tag
+                if ($match[1][$j]) { // closing tag
+                    $level--;
+                    unset($results[$i]);
+                } else { // opening tag
+                    if ($level++ > 0) unset($results[$i]);
+                }
+                $j++;
+            } elseif ($level > 0) {
+                unset($results[$i]);
+            }
+        }
+        $params['results'] = implode('', $results);
+    }
+    $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
+
+    // prepend the cache header info into cache file
+    $_cache_info = serialize($smarty->_cache_info);
+    $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
+
+    if (!empty($smarty->cache_handler_func)) {
+        // use cache_handler function
+        call_user_func_array($smarty->cache_handler_func,
+                             array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires']));
+    } else {
+        // use local cache file
+
+        if(!@is_writable($smarty->cache_dir)) {
+            // cache_dir not writable, see if it exists
+            if(!@is_dir($smarty->cache_dir)) {
+                $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
+                return false;
+            }
+            $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
+            return false;
+        }
+
+        $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
+        $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
+        $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
+        require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+        smarty_core_write_file($_params, $smarty);
+        return true;
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_include.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_include.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_include.php	(revision 14585)
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Extract non-cacheable parts out of compiled template and write it
+ *
+ * @param string $compile_path
+ * @param string $template_compiled
+ * @return boolean
+ */
+
+function smarty_core_write_compiled_include($params, &$smarty)
+{
+    $_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
+    $_tag_end   = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
+
+    preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
+                   $params['compiled_content'], $_match_source, PREG_SET_ORDER);
+    
+    // no nocache-parts found: done
+    if (count($_match_source)==0) return;
+
+    // convert the matched php-code to functions
+    $_include_compiled =  "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
+    $_include_compiled .= "         compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
+
+    $_compile_path = $params['include_file_path'];
+
+    $smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
+    $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
+
+    $_include_compiled .= $params['plugins_code'];
+    $_include_compiled .= "<?php";
+
+    $this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
+    for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
+        $_match =& $_match_source[$_i];
+        $source = $_match[4];
+        if ($this_varname == '_smarty') {
+            /* rename $this to $_smarty in the sourcecode */
+            $tokens = token_get_all('<?php ' . $_match[4]);
+
+            /* remove trailing <?php */
+            $open_tag = '';
+            while ($tokens) {
+                $token = array_shift($tokens);
+                if (is_array($token)) {
+                    $open_tag .= $token[1];
+                } else {
+                    $open_tag .= $token;
+                }
+                if ($open_tag == '<?php ') break;
+            }
+
+            for ($i=0, $count = count($tokens); $i < $count; $i++) {
+                if (is_array($tokens[$i])) {
+                    if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
+                        $tokens[$i] = '$' . $this_varname;
+                    } else {
+                        $tokens[$i] = $tokens[$i][1];
+                    }                   
+                }
+            }
+            $source = implode('', $tokens);
+        }
+
+        /* add function to compiled include */
+        $_include_compiled .= "
+function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
+{
+$source
+}
+
+";
+    }
+    $_include_compiled .= "\n\n?>\n";
+
+    $_params = array('filename' => $_compile_path,
+                     'contents' => $_include_compiled, 'create_dirs' => true);
+
+    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+    smarty_core_write_file($_params, $smarty);
+    return true;
+}
+
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_resource.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_resource.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.write_compiled_resource.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * write the compiled resource
+ *
+ * @param string $compile_path
+ * @param string $compiled_content
+ * @return true
+ */
+function smarty_core_write_compiled_resource($params, &$smarty)
+{
+    if(!@is_writable($smarty->compile_dir)) {
+        // compile_dir not writable, see if it exists
+        if(!@is_dir($smarty->compile_dir)) {
+            $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
+            return false;
+        }
+        $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
+        return false;
+    }
+
+    $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
+    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
+    smarty_core_write_file($_params, $smarty);
+    return true;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/internals/core.write_file.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/internals/core.write_file.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/internals/core.write_file.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * write out a file to disk
+ *
+ * @param string $filename
+ * @param string $contents
+ * @param boolean $create_dirs
+ * @return boolean
+ */
+function smarty_core_write_file($params, &$smarty)
+{
+    $_dirname = dirname($params['filename']);
+
+    if ($params['create_dirs']) {
+        $_params = array('dir' => $_dirname);
+        require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
+        smarty_core_create_dir_structure($_params, $smarty);
+    }
+
+    // write to tmp file, then rename it to avoid file locking race condition
+    $_tmp_file = tempnam($_dirname, 'wrt');
+
+    if (!($fd = @fopen($_tmp_file, 'wb'))) {
+        $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
+        if (!($fd = @fopen($_tmp_file, 'wb'))) {
+            $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
+            return false;
+        }
+    }
+
+    fwrite($fd, $params['contents']);
+    fclose($fd);
+
+    if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
+        // On platforms and filesystems that cannot overwrite with rename() 
+        // delete the file before renaming it -- because windows always suffers
+        // this, it is short-circuited to avoid the initial rename() attempt
+        @unlink($params['filename']);
+        @rename($_tmp_file, $params['filename']);
+    }
+    @chmod($params['filename'], $smarty->_file_perms);
+
+    return true;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/block.textformat.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/block.textformat.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/block.textformat.php	(revision 14585)
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {textformat}{/textformat} block plugin
+ *
+ * Type:     block function<br>
+ * Name:     textformat<br>
+ * Purpose:  format text a certain way with preset styles
+ *           or custom wrap/indent settings<br>
+ * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
+ *       (Smarty online manual)
+ * @param array
+ * <pre>
+ * Params:   style: string (email)
+ *           indent: integer (0)
+ *           wrap: integer (80)
+ *           wrap_char string ("\n")
+ *           indent_char: string (" ")
+ *           wrap_boundary: boolean (true)
+ * </pre>
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param string contents of the block
+ * @param Smarty clever simulation of a method
+ * @return string string $content re-formatted
+ */
+function smarty_block_textformat($params, $content, &$smarty)
+{
+    if (is_null($content)) {
+        return;
+    }
+
+    $style = null;
+    $indent = 0;
+    $indent_first = 0;
+    $indent_char = ' ';
+    $wrap = 80;
+    $wrap_char = "\n";
+    $wrap_cut = false;
+    $assign = null;
+    
+    foreach ($params as $_key => $_val) {
+        switch ($_key) {
+            case 'style':
+            case 'indent_char':
+            case 'wrap_char':
+            case 'assign':
+                $$_key = (string)$_val;
+                break;
+
+            case 'indent':
+            case 'indent_first':
+            case 'wrap':
+                $$_key = (int)$_val;
+                break;
+
+            case 'wrap_cut':
+                $$_key = (bool)$_val;
+                break;
+
+            default:
+                $smarty->trigger_error("textformat: unknown attribute '$_key'");
+        }
+    }
+
+    if ($style == 'email') {
+        $wrap = 72;
+    }
+
+    // split into paragraphs
+    $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
+    $_output = '';
+
+    for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
+        if ($_paragraphs[$_x] == '') {
+            continue;
+        }
+        // convert mult. spaces & special chars to single space
+        $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
+        // indent first line
+        if($indent_first > 0) {
+            $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
+        }
+        // wordwrap sentences
+        $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
+        // indent lines
+        if($indent > 0) {
+            $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
+        }
+    }
+    $_output = implode($wrap_char . $wrap_char, $_paragraphs);
+
+    return $assign ? $smarty->assign($assign, $_output) : $_output;
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/compiler.assign.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/compiler.assign.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/compiler.assign.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {assign} compiler function plugin
+ *
+ * Type:     compiler function<br>
+ * Name:     assign<br>
+ * Purpose:  assign a value to a template variable
+ * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
+ *       (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com> (initial author)
+ * @author messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
+ * @param string containing var-attribute and value-attribute
+ * @param Smarty_Compiler
+ */
+function smarty_compiler_assign($tag_attrs, &$compiler)
+{
+    $_params = $compiler->_parse_attrs($tag_attrs);
+
+    if (!isset($_params['var'])) {
+        $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
+        return;
+    }
+
+    if (!isset($_params['value'])) {
+        $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
+        return;
+    }
+
+    return "\$this->assign({$_params['var']}, {$_params['value']});";
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.assign_debug_info.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.assign_debug_info.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.assign_debug_info.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {assign_debug_info} function plugin
+ *
+ * Type:     function<br>
+ * Name:     assign_debug_info<br>
+ * Purpose:  assign debug info to the template<br>
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
+ *              {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
+ * @param Smarty
+ */
+function smarty_function_assign_debug_info($params, &$smarty)
+{
+    $assigned_vars = $smarty->_tpl_vars;
+    ksort($assigned_vars);
+    if (@is_array($smarty->_config[0])) {
+        $config_vars = $smarty->_config[0];
+        ksort($config_vars);
+        $smarty->assign("_debug_config_keys", array_keys($config_vars));
+        $smarty->assign("_debug_config_vals", array_values($config_vars));
+    }
+    
+    $included_templates = $smarty->_smarty_debug_info;
+    
+    $smarty->assign("_debug_keys", array_keys($assigned_vars));
+    $smarty->assign("_debug_vals", array_values($assigned_vars));
+    
+    $smarty->assign("_debug_tpls", $included_templates);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.config_load.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.config_load.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.config_load.php	(revision 14585)
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {config_load} function plugin
+ *
+ * Type:     function<br>
+ * Name:     config_load<br>
+ * Purpose:  load config file vars
+ * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
+ *       (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
+ * @param array Format:
+ * <pre>
+ * array('file' => required config file name,
+ *       'section' => optional config file section to load
+ *       'scope' => local/parent/global
+ *       'global' => overrides scope, setting to parent if true)
+ * </pre>
+ * @param Smarty
+ */
+function smarty_function_config_load($params, &$smarty)
+{
+        if ($smarty->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
+        }
+
+        $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
+        $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
+        $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
+        $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
+
+        if (!isset($_file) || strlen($_file) == 0) {
+            $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
+        }
+
+        if (isset($_scope)) {
+            if ($_scope != 'local' &&
+                $_scope != 'parent' &&
+                $_scope != 'global') {
+                $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
+            }
+        } else {
+            if ($_global) {
+                $_scope = 'parent';
+            } else {
+                $_scope = 'local';
+            }
+        }
+
+        $_params = array('resource_name' => $_file,
+                         'resource_base_path' => $smarty->config_dir,
+                         'get_source' => false);
+        $smarty->_parse_resource_name($_params);
+        $_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
+        if (isset($_section))
+            $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
+        else
+            $_compile_file = $smarty->_get_compile_path($_file_path);
+
+        if($smarty->force_compile || !file_exists($_compile_file)) {
+            $_compile = true;
+        } elseif ($smarty->compile_check) {
+            $_params = array('resource_name' => $_file,
+                             'resource_base_path' => $smarty->config_dir,
+                             'get_source' => false);
+            $_compile = $smarty->_fetch_resource_info($_params) &&
+                $_params['resource_timestamp'] > filemtime($_compile_file);
+        } else {
+            $_compile = false;
+        }
+
+        if($_compile) {
+            // compile config file
+            if(!is_object($smarty->_conf_obj)) {
+                require_once SMARTY_DIR . $smarty->config_class . '.class.php';
+                $smarty->_conf_obj = new $smarty->config_class();
+                $smarty->_conf_obj->overwrite = $smarty->config_overwrite;
+                $smarty->_conf_obj->booleanize = $smarty->config_booleanize;
+                $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
+                $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
+            }
+
+            $_params = array('resource_name' => $_file,
+                             'resource_base_path' => $smarty->config_dir,
+                             $_params['get_source'] = true);
+            if (!$smarty->_fetch_resource_info($_params)) {
+                return;
+            }
+            $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
+            $_config_vars = array_merge($smarty->_conf_obj->get($_file),
+                    $smarty->_conf_obj->get($_file, $_section));
+            if(function_exists('var_export')) {
+                $_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
+            } else {
+                $_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
+            }
+            $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
+            require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
+            smarty_core_write_compiled_resource($_params, $smarty);
+        } else {
+            include($_compile_file);
+        }
+
+        if ($smarty->caching) {
+            $smarty->_cache_info['config'][$_file] = true;
+        }
+
+        $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
+        $smarty->_config[0]['files'][$_file] = true;
+
+        if ($_scope == 'parent') {
+                $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
+                $smarty->_config[1]['files'][$_file] = true;
+        } else if ($_scope == 'global') {
+            for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
+                $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
+                $smarty->_config[$i]['files'][$_file] = true;
+            }
+        }
+
+        if ($smarty->debugging) {
+            $_params = array();
+            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
+            $smarty->_smarty_debug_info[] = array('type'      => 'config',
+                                                'filename'  => $_file.' ['.$_section.'] '.$_scope,
+                                                'depth'     => $smarty->_inclusion_depth,
+                                                'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
+        }
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.counter.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.counter.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.counter.php	(revision 14585)
@@ -0,0 +1,80 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {counter} function plugin
+ *
+ * Type:     function<br>
+ * Name:     counter<br>
+ * Purpose:  print out a counter value
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
+ *       (Smarty online manual)
+ * @param array parameters
+ * @param Smarty
+ * @return string|null
+ */
+function smarty_function_counter($params, &$smarty)
+{
+    static $counters = array();
+
+    $name = (isset($params['name'])) ? $params['name'] : 'default';
+    if (!isset($counters[$name])) {
+        $counters[$name] = array(
+            'start'=>1,
+            'skip'=>1,
+            'direction'=>'up',
+            'count'=>1
+            );
+    }
+    $counter =& $counters[$name];
+
+    if (isset($params['start'])) {
+        $counter['start'] = $counter['count'] = (int)$params['start'];
+    }
+
+    if (!empty($params['assign'])) {
+        $counter['assign'] = $params['assign'];
+    }
+
+    if (isset($counter['assign'])) {
+        $smarty->assign($counter['assign'], $counter['count']);
+    }
+    
+    if (isset($params['print'])) {
+        $print = (bool)$params['print'];
+    } else {
+        $print = empty($counter['assign']);
+    }
+
+    if ($print) {
+        $retval = $counter['count'];
+    } else {
+        $retval = null;
+    }
+
+    if (isset($params['skip'])) {
+        $counter['skip'] = $params['skip'];
+    }
+    
+    if (isset($params['direction'])) {
+        $counter['direction'] = $params['direction'];
+    }
+
+    if ($counter['direction'] == "down")
+        $counter['count'] -= $counter['skip'];
+    else
+        $counter['count'] += $counter['skip'];
+    
+    return $retval;
+    
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.cycle.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.cycle.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.cycle.php	(revision 14585)
@@ -0,0 +1,102 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {cycle} function plugin
+ *
+ * Type:     function<br>
+ * Name:     cycle<br>
+ * Date:     May 3, 2002<br>
+ * Purpose:  cycle through given values<br>
+ * Input:
+ *         - name = name of cycle (optional)
+ *         - values = comma separated list of values to cycle,
+ *                    or an array of values to cycle
+ *                    (this can be left out for subsequent calls)
+ *         - reset = boolean - resets given var to true
+ *         - print = boolean - print var or not. default is true
+ *         - advance = boolean - whether or not to advance the cycle
+ *         - delimiter = the value delimiter, default is ","
+ *         - assign = boolean, assigns to template var instead of
+ *                    printed.
+ *
+ * Examples:<br>
+ * <pre>
+ * {cycle values="#eeeeee,#d0d0d0d"}
+ * {cycle name=row values="one,two,three" reset=true}
+ * {cycle name=row}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
+ *       (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author credit to Mark Priatel <mpriatel@rogers.com>
+ * @author credit to Gerard <gerard@interfold.com>
+ * @author credit to Jason Sweat <jsweat_php@yahoo.com>
+ * @version  1.3
+ * @param array
+ * @param Smarty
+ * @return string|null
+ */
+function smarty_function_cycle($params, &$smarty)
+{
+    static $cycle_vars;
+    
+    $name = (empty($params['name'])) ? 'default' : $params['name'];
+    $print = (isset($params['print'])) ? (bool)$params['print'] : true;
+    $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true;
+    $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false;
+            
+    if (!in_array('values', array_keys($params))) {
+        if(!isset($cycle_vars[$name]['values'])) {
+            $smarty->trigger_error("cycle: missing 'values' parameter");
+            return;
+        }
+    } else {
+        if(isset($cycle_vars[$name]['values'])
+            && $cycle_vars[$name]['values'] != $params['values'] ) {
+            $cycle_vars[$name]['index'] = 0;
+        }
+        $cycle_vars[$name]['values'] = $params['values'];
+    }
+
+    $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ',';
+    
+    if(is_array($cycle_vars[$name]['values'])) {
+        $cycle_array = $cycle_vars[$name]['values'];
+    } else {
+        $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
+    }
+    
+    if(!isset($cycle_vars[$name]['index']) || $reset ) {
+        $cycle_vars[$name]['index'] = 0;
+    }
+    
+    if (isset($params['assign'])) {
+        $print = false;
+        $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
+    }
+        
+    if($print) {
+        $retval = $cycle_array[$cycle_vars[$name]['index']];
+    } else {
+        $retval = null;
+    }
+
+    if($advance) {
+        if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) {
+            $cycle_vars[$name]['index'] = 0;
+        } else {
+            $cycle_vars[$name]['index']++;
+        }
+    }
+    
+    return $retval;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.debug.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.debug.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.debug.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {debug} function plugin
+ *
+ * Type:     function<br>
+ * Name:     debug<br>
+ * Date:     July 1, 2002<br>
+ * Purpose:  popup debug window
+ * @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
+ *       (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @version  1.0
+ * @param array
+ * @param Smarty
+ * @return string output from {@link Smarty::_generate_debug_output()}
+ */
+function smarty_function_debug($params, &$smarty)
+{
+    if (isset($params['output'])) {
+        $smarty->assign('_smarty_debug_output', $params['output']);
+    }
+    require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+    return smarty_core_display_debug_console(null, $smarty);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.eval.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.eval.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.eval.php	(revision 14585)
@@ -0,0 +1,49 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {eval} function plugin
+ *
+ * Type:     function<br>
+ * Name:     eval<br>
+ * Purpose:  evaluate a template variable as a template<br>
+ * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
+ *       (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ */
+function smarty_function_eval($params, &$smarty)
+{
+
+    if (!isset($params['var'])) {
+        $smarty->trigger_error("eval: missing 'var' parameter");
+        return;
+    }
+
+    if($params['var'] == '') {
+        return;
+    }
+
+    $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
+
+    ob_start();
+    $smarty->_eval('?>' . $_var_compiled);
+    $_contents = ob_get_contents();
+    ob_end_clean();
+
+    if (!empty($params['assign'])) {
+        $smarty->assign($params['assign'], $_contents);
+    } else {
+        return $_contents;
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.fetch.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.fetch.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.fetch.php	(revision 14585)
@@ -0,0 +1,221 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {fetch} plugin
+ *
+ * Type:     function<br>
+ * Name:     fetch<br>
+ * Purpose:  fetch file, web or ftp data and display results
+ * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
+ *       (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string|null if the assign parameter is passed, Smarty assigns the
+ *                     result to a template variable
+ */
+function smarty_function_fetch($params, &$smarty)
+{
+    if (empty($params['file'])) {
+        $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
+        return;
+    }
+
+    $content = '';
+    if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
+        $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
+        require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
+        if(!smarty_core_is_secure($_params, $smarty)) {
+            $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
+            return;
+        }
+        
+        // fetch the file
+        if($fp = @fopen($params['file'],'r')) {
+            while(!feof($fp)) {
+                $content .= fgets ($fp,4096);
+            }
+            fclose($fp);
+        } else {
+            $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
+            return;
+        }
+    } else {
+        // not a local file
+        if(preg_match('!^http://!i',$params['file'])) {
+            // http fetch
+            if($uri_parts = parse_url($params['file'])) {
+                // set defaults
+                $host = $server_name = $uri_parts['host'];
+                $timeout = 30;
+                $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
+                $agent = "Smarty Template Engine ".$smarty->_version;
+                $referer = "";
+                $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
+                $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
+                $_is_proxy = false;
+                if(empty($uri_parts['port'])) {
+                    $port = 80;
+                } else {
+                    $port = $uri_parts['port'];
+                }
+                if(!empty($uri_parts['user'])) {
+                    $user = $uri_parts['user'];
+                }
+                if(!empty($uri_parts['pass'])) {
+                    $pass = $uri_parts['pass'];
+                }
+                // loop through parameters, setup headers
+                foreach($params as $param_key => $param_value) {
+                    switch($param_key) {
+                        case "file":
+                        case "assign":
+                        case "assign_headers":
+                            break;
+                        case "user":
+                            if(!empty($param_value)) {
+                                $user = $param_value;
+                            }
+                            break;
+                        case "pass":
+                            if(!empty($param_value)) {
+                                $pass = $param_value;
+                            }
+                            break;
+                        case "accept":
+                            if(!empty($param_value)) {
+                                $accept = $param_value;
+                            }
+                            break;
+                        case "header":
+                            if(!empty($param_value)) {
+                                if(!preg_match('![\w\d-]+: .+!',$param_value)) {
+                                    $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
+                                    return;
+                                } else {
+                                    $extra_headers[] = $param_value;
+                                }
+                            }
+                            break;
+                        case "proxy_host":
+                            if(!empty($param_value)) {
+                                $proxy_host = $param_value;
+                            }
+                            break;
+                        case "proxy_port":
+                            if(!preg_match('!\D!', $param_value)) {
+                                $proxy_port = (int) $param_value;
+                            } else {
+                                $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
+                                return;
+                            }
+                            break;
+                        case "agent":
+                            if(!empty($param_value)) {
+                                $agent = $param_value;
+                            }
+                            break;
+                        case "referer":
+                            if(!empty($param_value)) {
+                                $referer = $param_value;
+                            }
+                            break;
+                        case "timeout":
+                            if(!preg_match('!\D!', $param_value)) {
+                                $timeout = (int) $param_value;
+                            } else {
+                                $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
+                                return;
+                            }
+                            break;
+                        default:
+                            $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
+                            return;
+                    }
+                }
+                if(!empty($proxy_host) && !empty($proxy_port)) {
+                    $_is_proxy = true;
+                    $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
+                } else {
+                    $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
+                }
+
+                if(!$fp) {
+                    $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
+                    return;
+                } else {
+                    if($_is_proxy) {
+                        fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
+                    } else {
+                        fputs($fp, "GET $uri HTTP/1.0\r\n");
+                    }
+                    if(!empty($host)) {
+                        fputs($fp, "Host: $host\r\n");
+                    }
+                    if(!empty($accept)) {
+                        fputs($fp, "Accept: $accept\r\n");
+                    }
+                    if(!empty($agent)) {
+                        fputs($fp, "User-Agent: $agent\r\n");
+                    }
+                    if(!empty($referer)) {
+                        fputs($fp, "Referer: $referer\r\n");
+                    }
+                    if(isset($extra_headers) && is_array($extra_headers)) {
+                        foreach($extra_headers as $curr_header) {
+                            fputs($fp, $curr_header."\r\n");
+                        }
+                    }
+                    if(!empty($user) && !empty($pass)) {
+                        fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
+                    }
+
+                    fputs($fp, "\r\n");
+                    while(!feof($fp)) {
+                        $content .= fgets($fp,4096);
+                    }
+                    fclose($fp);
+                    $csplit = split("\r\n\r\n",$content,2);
+
+                    $content = $csplit[1];
+
+                    if(!empty($params['assign_headers'])) {
+                        $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0]));
+                    }
+                }
+            } else {
+                $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
+                return;
+            }
+        } else {
+            // ftp fetch
+            if($fp = @fopen($params['file'],'r')) {
+                while(!feof($fp)) {
+                    $content .= fgets ($fp,4096);
+                }
+                fclose($fp);
+            } else {
+                $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
+                return;
+            }
+        }
+
+    }
+
+
+    if (!empty($params['assign'])) {
+        $smarty->assign($params['assign'],$content);
+    } else {
+        return $content;
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_checkboxes.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_checkboxes.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_checkboxes.php	(revision 14585)
@@ -0,0 +1,143 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_checkboxes} function plugin
+ *
+ * File:       function.html_checkboxes.php<br>
+ * Type:       function<br>
+ * Name:       html_checkboxes<br>
+ * Date:       24.Feb.2003<br>
+ * Purpose:    Prints out a list of checkbox input types<br>
+ * Input:<br>
+ *           - name       (optional) - string default "checkbox"
+ *           - values     (required) - array
+ *           - options    (optional) - associative array
+ *           - checked    (optional) - array default not set
+ *           - separator  (optional) - ie <br> or &nbsp;
+ *           - output     (optional) - the output next to each checkbox
+ *           - assign     (optional) - assign the output as an array to this variable
+ * Examples:
+ * <pre>
+ * {html_checkboxes values=$ids output=$names}
+ * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
+ * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
+ *      (Smarty online manual)
+ * @author     Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author credits to Monte Ohrt <monte at ohrt dot com>
+ * @version    1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_checkboxes($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+
+    $name = 'checkbox';
+    $values = null;
+    $options = null;
+    $selected = null;
+    $separator = '';
+    $labels = true;
+    $output = null;
+
+    $extra = '';
+
+    foreach($params as $_key => $_val) {
+        switch($_key) {
+            case 'name':
+            case 'separator':
+                $$_key = $_val;
+                break;
+
+            case 'labels':
+                $$_key = (bool)$_val;
+                break;
+
+            case 'options':
+                $$_key = (array)$_val;
+                break;
+
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+
+            case 'checked':
+            case 'selected':
+                $selected = array_map('strval', array_values((array)$_val));
+                break;
+
+            case 'checkboxes':
+                $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
+                $options = (array)$_val;
+                break;
+
+            case 'assign':
+                break;
+
+            default:
+                if(!is_array($_val)) {
+                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+                } else {
+                    $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+
+    if (!isset($options) && !isset($values))
+        return ''; /* raise error here? */
+
+    settype($selected, 'array');
+    $_html_result = array();
+
+    if (isset($options)) {
+
+        foreach ($options as $_key=>$_val)
+            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+
+
+    } else {
+        foreach ($values as $_i=>$_key) {
+            $_val = isset($output[$_i]) ? $output[$_i] : '';
+            $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
+        }
+
+    }
+
+    if(!empty($params['assign'])) {
+        $smarty->assign($params['assign'], $_html_result);
+    } else {
+        return implode("\n",$_html_result);
+    }
+
+}
+
+function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
+    $_output = '';
+    if ($labels) $_output .= '<label>';
+    $_output .= '<input type="checkbox" name="'
+        . smarty_function_escape_special_chars($name) . '[]" value="'
+        . smarty_function_escape_special_chars($value) . '"';
+
+    if (in_array((string)$value, $selected)) {
+        $_output .= ' checked="checked"';
+    }
+    $_output .= $extra . '>' . $output;
+    if ($labels) $_output .= '</label>';
+    $_output .=  $separator;
+
+    return $_output;
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_image.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_image.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_image.php	(revision 14585)
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_image} function plugin
+ *
+ * Type:     function<br>
+ * Name:     html_image<br>
+ * Date:     Feb 24, 2003<br>
+ * Purpose:  format HTML tags for the image<br>
+ * Input:<br>
+ *         - file = file (and path) of image (required)
+ *         - height = image height (optional, default actual height)
+ *         - width = image width (optional, default actual width)
+ *         - basedir = base directory for absolute paths, default
+ *                     is environment variable DOCUMENT_ROOT
+ *         - path_prefix = prefix for path output (optional, default empty)
+ *
+ * Examples: {html_image file="/images/masthead.gif"}
+ * Output:   <img src="/images/masthead.gif" width=400 height=23>
+ * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
+ *      (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @author credits to Duda <duda@big.hu> - wrote first image function
+ *           in repository, helped with lots of functionality
+ * @version  1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_image($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+    
+    $alt = '';
+    $file = '';
+    $height = '';
+    $width = '';
+    $extra = '';
+    $prefix = '';
+    $suffix = '';
+    $path_prefix = '';
+    $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
+    $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
+    foreach($params as $_key => $_val) {
+        switch($_key) {
+            case 'file':
+            case 'height':
+            case 'width':
+            case 'dpi':
+            case 'path_prefix':
+            case 'basedir':
+                $$_key = $_val;
+                break;
+
+            case 'alt':
+                if(!is_array($_val)) {
+                    $$_key = smarty_function_escape_special_chars($_val);
+                } else {
+                    $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+
+            case 'link':
+            case 'href':
+                $prefix = '<a href="' . $_val . '">';
+                $suffix = '</a>';
+                break;
+
+            default:
+                if(!is_array($_val)) {
+                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+                } else {
+                    $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+
+    if (empty($file)) {
+        $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
+        return;
+    }
+
+    if (substr($file,0,1) == '/') {
+        $_image_path = $basedir . $file;
+    } else {
+        $_image_path = $file;
+    }
+    
+    if(!isset($params['width']) || !isset($params['height'])) {
+        if(!$_image_data = @getimagesize($_image_path)) {
+            if(!file_exists($_image_path)) {
+                $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
+                return;
+            } else if(!is_readable($_image_path)) {
+                $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
+                return;
+            } else {
+                $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
+                return;
+            }
+        }
+        if ($smarty->security &&
+            ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
+            (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
+            (!smarty_core_is_secure($_params, $smarty)) ) {
+            $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
+        }        
+        
+        if(!isset($params['width'])) {
+            $width = $_image_data[0];
+        }
+        if(!isset($params['height'])) {
+            $height = $_image_data[1];
+        }
+
+    }
+
+    if(isset($params['dpi'])) {
+        if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
+            $dpi_default = 72;
+        } else {
+            $dpi_default = 96;
+        }
+        $_resize = $dpi_default/$params['dpi'];
+        $width = round($width * $_resize);
+        $height = round($height * $_resize);
+    }
+
+    return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.'>' . $suffix;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_options.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_options.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_options.php	(revision 14585)
@@ -0,0 +1,122 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_options} function plugin
+ *
+ * Type:     function<br>
+ * Name:     html_options<br>
+ * Input:<br>
+ *           - name       (optional) - string default "select"
+ *           - values     (required if no options supplied) - array
+ *           - options    (required if no values supplied) - associative array
+ *           - selected   (optional) - string default not set
+ *           - output     (required if not options supplied) - array
+ * Purpose:  Prints the list of <option> tags generated from
+ *           the passed parameters
+ * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
+ *      (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_options($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+    
+    $name = null;
+    $values = null;
+    $options = null;
+    $selected = array();
+    $output = null;
+    
+    $extra = '';
+    
+    foreach($params as $_key => $_val) {
+        switch($_key) {
+            case 'name':
+                $$_key = (string)$_val;
+                break;
+            
+            case 'options':
+                $$_key = (array)$_val;
+                break;
+                
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+
+            case 'selected':
+                $$_key = array_map('strval', array_values((array)$_val));
+                break;
+                
+            default:
+                if(!is_array($_val)) {
+                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+                } else {
+                    $smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+
+    if (!isset($options) && !isset($values))
+        return ''; /* raise error here? */
+
+    $_html_result = '';
+
+    if (isset($options)) {
+        
+        foreach ($options as $_key=>$_val)
+            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
+
+    } else {
+        
+        foreach ($values as $_i=>$_key) {
+            $_val = isset($output[$_i]) ? $output[$_i] : '';
+            $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
+        }
+
+    }
+
+    if(!empty($name)) {
+        $_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
+    }
+
+    return $_html_result;
+
+}
+
+function smarty_function_html_options_optoutput($key, $value, $selected) {
+    if(!is_array($value)) {
+        $_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
+            smarty_function_escape_special_chars($key) . '"';
+        if (in_array((string)$key, $selected))
+            $_html_result .= ' selected="selected"';
+        $_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
+    } else {
+        $_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
+    }
+    return $_html_result;
+}
+
+function smarty_function_html_options_optgroup($key, $values, $selected) {
+    $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
+    foreach ($values as $key => $value) {
+        $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
+    }
+    $optgroup_html .= "</optgroup>\n";
+    return $optgroup_html;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_radios.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_radios.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_radios.php	(revision 14585)
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_radios} function plugin
+ *
+ * File:       function.html_radios.php<br>
+ * Type:       function<br>
+ * Name:       html_radios<br>
+ * Date:       24.Feb.2003<br>
+ * Purpose:    Prints out a list of radio input types<br>
+ * Input:<br>
+ *           - name       (optional) - string default "radio"
+ *           - values     (required) - array
+ *           - options    (optional) - associative array
+ *           - checked    (optional) - array default not set
+ *           - separator  (optional) - ie <br> or &nbsp;
+ *           - output     (optional) - the output next to each radio button
+ *           - assign     (optional) - assign the output as an array to this variable
+ * Examples:
+ * <pre>
+ * {html_radios values=$ids output=$names}
+ * {html_radios values=$ids name='box' separator='<br>' output=$names}
+ * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
+ *      (Smarty online manual)
+ * @author     Christopher Kvarme <christopher.kvarme@flashjab.com>
+ * @author credits to Monte Ohrt <monte at ohrt dot com>
+ * @version    1.0
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_function_escape_special_chars()
+ */
+function smarty_function_html_radios($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+   
+    $name = 'radio';
+    $values = null;
+    $options = null;
+    $selected = null;
+    $separator = '';
+    $labels = true;
+    $label_ids = false;
+    $output = null;
+    $extra = '';
+
+    foreach($params as $_key => $_val) {
+        switch($_key) {
+            case 'name':
+            case 'separator':
+                $$_key = (string)$_val;
+                break;
+
+            case 'checked':
+            case 'selected':
+                if(is_array($_val)) {
+                    $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
+                } else {
+                    $selected = (string)$_val;
+                }
+                break;
+
+            case 'labels':
+            case 'label_ids':
+                $$_key = (bool)$_val;
+                break;
+
+            case 'options':
+                $$_key = (array)$_val;
+                break;
+
+            case 'values':
+            case 'output':
+                $$_key = array_values((array)$_val);
+                break;
+
+            case 'radios':
+                $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
+                $options = (array)$_val;
+                break;
+
+            case 'assign':
+                break;
+
+            default:
+                if(!is_array($_val)) {
+                    $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
+                } else {
+                    $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+
+    if (!isset($options) && !isset($values))
+        return ''; /* raise error here? */
+
+    $_html_result = array();
+
+    if (isset($options)) {
+
+        foreach ($options as $_key=>$_val)
+            $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
+
+    } else {
+
+        foreach ($values as $_i=>$_key) {
+            $_val = isset($output[$_i]) ? $output[$_i] : '';
+            $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
+        }
+
+    }
+
+    if(!empty($params['assign'])) {
+        $smarty->assign($params['assign'], $_html_result);
+    } else {
+        return implode("\n",$_html_result);
+    }
+
+}
+
+function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) {
+    $_output = '';
+    if ($labels) {
+      if($label_ids) {
+          $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
+          $_output .= '<label for="' . $_id . '">';
+      } else {
+          $_output .= '<label>';           
+      }
+   }
+   $_output .= '<input type="radio" name="'
+        . smarty_function_escape_special_chars($name) . '" value="'
+        . smarty_function_escape_special_chars($value) . '"';
+
+   if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
+
+    if ((string)$value==$selected) {
+        $_output .= ' checked="checked"';
+    }
+    $_output .= $extra . '>' . $output;
+    if ($labels) $_output .= '</label>';
+    $_output .=  $separator;
+
+    return $_output;
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_date.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_date.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_date.php	(revision 14585)
@@ -0,0 +1,331 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty {html_select_date} plugin
+ *
+ * Type:     function<br>
+ * Name:     html_select_date<br>
+ * Purpose:  Prints the dropdowns for date selection.
+ *
+ * ChangeLog:<br>
+ *           - 1.0 initial release
+ *           - 1.1 added support for +/- N syntax for begin
+ *                and end year values. (Monte)
+ *           - 1.2 added support for yyyy-mm-dd syntax for
+ *                time value. (Jan Rosier)
+ *           - 1.3 added support for choosing format for
+ *                month values (Gary Loescher)
+ *           - 1.3.1 added support for choosing format for
+ *                day values (Marcus Bointon)
+ *           - 1.3.2 support negative timestamps, force year
+ *             dropdown to include given date unless explicitly set (Monte)
+ *           - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
+ *             of 0000-00-00 dates (cybot, boots)
+ * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
+ *      (Smarty online manual)
+ * @version 1.3.4
+ * @author Andrei Zmievski
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_html_select_date($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
+    require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
+    require_once $smarty->_get_plugin_filepath('function','html_options');
+    /* Default values. */
+    $prefix          = "Date_";
+    $start_year      = strftime("%Y");
+    $end_year        = $start_year;
+    $display_days    = true;
+    $display_months  = true;
+    $display_years   = true;
+    $month_format    = "%B";
+    /* Write months as numbers by default  GL */
+    $month_value_format = "%m";
+    $day_format      = "%02d";
+    /* Write day values using this format MB */
+    $day_value_format = "%d";
+    $year_as_text    = false;
+    /* Display years in reverse order? Ie. 2000,1999,.... */
+    $reverse_years   = false;
+    /* Should the select boxes be part of an array when returned from PHP?
+       e.g. setting it to "birthday", would create "birthday[Day]",
+       "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
+    $field_array     = null;
+    /* <select size>'s of the different <select> tags.
+       If not set, uses default dropdown. */
+    $day_size        = null;
+    $month_size      = null;
+    $year_size       = null;
+    /* Unparsed attributes common to *ALL* the <select>/<input> tags.
+       An example might be in the template: all_extra ='class ="foo"'. */
+    $all_extra       = null;
+    /* Separate attributes for the tags. */
+    $day_extra       = null;
+    $month_extra     = null;
+    $year_extra      = null;
+    /* Order in which to display the fields.
+       "D" -> day, "M" -> month, "Y" -> year. */
+    $field_order     = 'MDY';
+    /* String printed between the different fields. */
+    $field_separator = "\n";
+    $time = time();
+    $all_empty       = null;
+    $day_empty       = null;
+    $month_empty     = null;
+    $year_empty      = null;
+    $extra_attrs     = '';
+
+    foreach ($params as $_key=>$_value) {
+        switch ($_key) {
+            case 'prefix':
+            case 'time':
+            case 'start_year':
+            case 'end_year':
+            case 'month_format':
+            case 'day_format':
+            case 'day_value_format':
+            case 'field_array':
+            case 'day_size':
+            case 'month_size':
+            case 'year_size':
+            case 'all_extra':
+            case 'day_extra':
+            case 'month_extra':
+            case 'year_extra':
+            case 'field_order':
+            case 'field_separator':
+            case 'month_value_format':
+            case 'month_empty':
+            case 'day_empty':
+            case 'year_empty':
+                $$_key = (string)$_value;
+                break;
+
+            case 'all_empty':
+                $$_key = (string)$_value;
+                $day_empty = $month_empty = $year_empty = $all_empty;
+                break;
+
+            case 'display_days':
+            case 'display_months':
+            case 'display_years':
+            case 'year_as_text':
+            case 'reverse_years':
+                $$_key = (bool)$_value;
+                break;
+
+            default:
+                if(!is_array($_value)) {
+                    $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
+                } else {
+                    $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
+                }
+                break;
+        }
+    }
+
+    if (preg_match('!^-\d+$!', $time)) {
+        // negative timestamp, use date()
+        $time = date('Y-m-d', $time);
+    }
+    // If $time is not in format yyyy-mm-dd
+    if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
+        $time = $found[1];
+    } else {
+        // use smarty_make_timestamp to get an unix timestamp and
+        // strftime to make yyyy-mm-dd
+        $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
+    }
+    // Now split this in pieces, which later can be used to set the select
+    $time = explode("-", $time);
+
+    // make syntax "+N" or "-N" work with start_year and end_year
+    if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
+        if ($match[1] == '+') {
+            $end_year = strftime('%Y') + $match[2];
+        } else {
+            $end_year = strftime('%Y') - $match[2];
+        }
+    }
+    if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
+        if ($match[1] == '+') {
+            $start_year = strftime('%Y') + $match[2];
+        } else {
+            $start_year = strftime('%Y') - $match[2];
+        }
+    }
+    if (strlen($time[0]) > 0) {
+        if ($start_year > $time[0] && !isset($params['start_year'])) {
+            // force start year to include given date if not explicitly set
+            $start_year = $time[0];
+        }
+        if($end_year < $time[0] && !isset($params['end_year'])) {
+            // force end year to include given date if not explicitly set
+            $end_year = $time[0];
+        }
+    }
+
+    $field_order = strtoupper($field_order);
+
+    $html_result = $month_result = $day_result = $year_result = "";
+
+    $field_separator_count = -1;
+    if ($display_months) {
+    	$field_separator_count++;
+        $month_names = array();
+        $month_values = array();
+        if(isset($month_empty)) {
+            $month_names[''] = $month_empty;
+            $month_values[''] = '';
+        }
+        for ($i = 1; $i <= 12; $i++) {
+            $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
+            $month_values[$i] = strftime($month_value_format, mktime(0, 0, 0, $i, 1, 2000));
+        }
+
+        $month_result .= '<select name=';
+        if (null !== $field_array){
+            $month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
+        } else {
+            $month_result .= '"' . $prefix . 'Month"';
+        }
+        if (null !== $month_size){
+            $month_result .= ' size="' . $month_size . '"';
+        }
+        if (null !== $month_extra){
+            $month_result .= ' ' . $month_extra;
+        }
+        if (null !== $all_extra){
+            $month_result .= ' ' . $all_extra;
+        }
+        $month_result .= $extra_attrs . '>'."\n";
+
+        $month_result .= smarty_function_html_options(array('output'     => $month_names,
+                                                            'values'     => $month_values,
+                                                            'selected'   => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
+                                                            'print_result' => false),
+                                                      $smarty);
+        $month_result .= '</select>';
+    }
+
+    if ($display_days) {
+    	$field_separator_count++;
+        $days = array();
+        if (isset($day_empty)) {
+            $days[''] = $day_empty;
+            $day_values[''] = '';
+        }
+        for ($i = 1; $i <= 31; $i++) {
+            $days[] = sprintf($day_format, $i);
+            $day_values[] = sprintf($day_value_format, $i);
+        }
+
+        $day_result .= '<select name=';
+        if (null !== $field_array){
+            $day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
+        } else {
+            $day_result .= '"' . $prefix . 'Day"';
+        }
+        if (null !== $day_size){
+            $day_result .= ' size="' . $day_size . '"';
+        }
+        if (null !== $all_extra){
+            $day_result .= ' ' . $all_extra;
+        }
+        if (null !== $day_extra){
+            $day_result .= ' ' . $day_extra;
+        }
+        $day_result .= $extra_attrs . '>'."\n";
+        $day_result .= smarty_function_html_options(array('output'     => $days,
+                                                          'values'     => $day_values,
+                                                          'selected'   => $time[2],
+                                                          'print_result' => false),
+                                                    $smarty);
+        $day_result .= '</select>';
+    }
+
+    if ($display_years) {
+    	$field_separator_count++;
+        if (null !== $field_array){
+            $year_name = $field_array . '[' . $prefix . 'Year]';
+        } else {
+            $year_name = $prefix . 'Year';
+        }
+        if ($year_as_text) {
+            $year_result .= '<input type="text" name="' . $year_name . '" value="' . $time[0] . '" size="4" maxlength="4"';
+            if (null !== $all_extra){
+                $year_result .= ' ' . $all_extra;
+            }
+            if (null !== $year_extra){
+                $year_result .= ' ' . $year_extra;
+            }
+            $year_result .= '>';
+        } else {
+            $years = range((int)$start_year, (int)$end_year);
+            if ($reverse_years) {
+                rsort($years, SORT_NUMERIC);
+            } else {
+                sort($years, SORT_NUMERIC);
+            }
+            $yearvals = $years;
+            if(isset($year_empty)) {
+                array_unshift($years, $year_empty);
+                array_unshift($yearvals, '');
+            }
+            $year_result .= '<select name="' . $year_name . '"';
+            if (null !== $year_size){
+                $year_result .= ' size="' . $year_size . '"';
+            }
+            if (null !== $all_extra){
+                $year_result .= ' ' . $all_extra;
+            }
+            if (null !== $year_extra){
+                $year_result .= ' ' . $year_extra;
+            }
+            $year_result .= $extra_attrs . '>'."\n";
+            $year_result .= smarty_function_html_options(array('output' => $years,
+                                                               'values' => $yearvals,
+                                                               'selected'   => $time[0],
+                                                               'print_result' => false),
+                                                         $smarty);
+            $year_result .= '</select>';
+        }
+    }
+
+    // Loop thru the field_order field
+    for ($i = 0; $i <= 2; $i++){
+        $c = substr($field_order, $i, 1);
+        switch ($c){
+            case 'D':
+                $html_result .= $day_result;
+                break;
+
+            case 'M':
+                $html_result .= $month_result;
+                break;
+
+            case 'Y':
+                $html_result .= $year_result;
+                break;
+        }
+        // Add the field seperator
+        if($i < $field_separator_count) {
+            $html_result .= $field_separator;
+        }
+    }
+
+    return $html_result;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_time.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_time.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_select_time.php	(revision 14585)
@@ -0,0 +1,194 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_select_time} function plugin
+ *
+ * Type:     function<br>
+ * Name:     html_select_time<br>
+ * Purpose:  Prints the dropdowns for time selection
+ * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
+ *          (Smarty online manual)
+ * @author Roberto Berto <roberto@berto.net>
+ * @credits Monte Ohrt <monte AT ohrt DOT com>
+ * @param array
+ * @param Smarty
+ * @return string
+ * @uses smarty_make_timestamp()
+ */
+function smarty_function_html_select_time($params, &$smarty)
+{
+    require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
+    require_once $smarty->_get_plugin_filepath('function','html_options');
+    /* Default values. */
+    $prefix             = "Time_";
+    $time               = time();
+    $display_hours      = true;
+    $display_minutes    = true;
+    $display_seconds    = true;
+    $display_meridian   = true;
+    $use_24_hours       = true;
+    $minute_interval    = 1;
+    $second_interval    = 1;
+    /* Should the select boxes be part of an array when returned from PHP?
+       e.g. setting it to "birthday", would create "birthday[Hour]",
+       "birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
+       Can be combined with prefix. */
+    $field_array        = null;
+    $all_extra          = null;
+    $hour_extra         = null;
+    $minute_extra       = null;
+    $second_extra       = null;
+    $meridian_extra     = null;
+
+    foreach ($params as $_key=>$_value) {
+        switch ($_key) {
+            case 'prefix':
+            case 'time':
+            case 'field_array':
+            case 'all_extra':
+            case 'hour_extra':
+            case 'minute_extra':
+            case 'second_extra':
+            case 'meridian_extra':
+                $$_key = (string)$_value;
+                break;
+
+            case 'display_hours':
+            case 'display_minutes':
+            case 'display_seconds':
+            case 'display_meridian':
+            case 'use_24_hours':
+                $$_key = (bool)$_value;
+                break;
+
+            case 'minute_interval':
+            case 'second_interval':
+                $$_key = (int)$_value;
+                break;
+
+            default:
+                $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
+        }
+    }
+
+    $time = smarty_make_timestamp($time);
+
+    $html_result = '';
+
+    if ($display_hours) {
+        $hours       = $use_24_hours ? range(0, 23) : range(1, 12);
+        $hour_fmt = $use_24_hours ? '%H' : '%I';
+        for ($i = 0, $for_max = count($hours); $i < $for_max; $i++)
+            $hours[$i] = sprintf('%02d', $hours[$i]);
+        $html_result .= '<select name=';
+        if (null !== $field_array) {
+            $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
+        } else {
+            $html_result .= '"' . $prefix . 'Hour"';
+        }
+        if (null !== $hour_extra){
+            $html_result .= ' ' . $hour_extra;
+        }
+        if (null !== $all_extra){
+            $html_result .= ' ' . $all_extra;
+        }
+        $html_result .= '>'."\n";
+        $html_result .= smarty_function_html_options(array('output'          => $hours,
+                                                           'values'          => $hours,
+                                                           'selected'      => strftime($hour_fmt, $time),
+                                                           'print_result' => false),
+                                                     $smarty);
+        $html_result .= "</select>\n";
+    }
+
+    if ($display_minutes) {
+        $all_minutes = range(0, 59);
+        for ($i = 0, $for_max = count($all_minutes); $i < $for_max; $i+= $minute_interval)
+            $minutes[] = sprintf('%02d', $all_minutes[$i]);
+        $selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
+        $html_result .= '<select name=';
+        if (null !== $field_array) {
+            $html_result .= '"' . $field_array . '[' . $prefix . 'Minute]"';
+        } else {
+            $html_result .= '"' . $prefix . 'Minute"';
+        }
+        if (null !== $minute_extra){
+            $html_result .= ' ' . $minute_extra;
+        }
+        if (null !== $all_extra){
+            $html_result .= ' ' . $all_extra;
+        }
+        $html_result .= '>'."\n";
+        
+        $html_result .= smarty_function_html_options(array('output'          => $minutes,
+                                                           'values'          => $minutes,
+                                                           'selected'      => $selected,
+                                                           'print_result' => false),
+                                                     $smarty);
+        $html_result .= "</select>\n";
+    }
+
+    if ($display_seconds) {
+        $all_seconds = range(0, 59);
+        for ($i = 0, $for_max = count($all_seconds); $i < $for_max; $i+= $second_interval)
+            $seconds[] = sprintf('%02d', $all_seconds[$i]);
+        $selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
+        $html_result .= '<select name=';
+        if (null !== $field_array) {
+            $html_result .= '"' . $field_array . '[' . $prefix . 'Second]"';
+        } else {
+            $html_result .= '"' . $prefix . 'Second"';
+        }
+        
+        if (null !== $second_extra){
+            $html_result .= ' ' . $second_extra;
+        }
+        if (null !== $all_extra){
+            $html_result .= ' ' . $all_extra;
+        }
+        $html_result .= '>'."\n";
+        
+        $html_result .= smarty_function_html_options(array('output'          => $seconds,
+                                                           'values'          => $seconds,
+                                                           'selected'      => $selected,
+                                                           'print_result' => false),
+                                                     $smarty);
+        $html_result .= "</select>\n";
+    }
+
+    if ($display_meridian && !$use_24_hours) {
+        $html_result .= '<select name=';
+        if (null !== $field_array) {
+            $html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]"';
+        } else {
+            $html_result .= '"' . $prefix . 'Meridian"';
+        }
+        
+        if (null !== $meridian_extra){
+            $html_result .= ' ' . $meridian_extra;
+        }
+        if (null !== $all_extra){
+            $html_result .= ' ' . $all_extra;
+        }
+        $html_result .= '>'."\n";
+        
+        $html_result .= smarty_function_html_options(array('output'          => array('AM', 'PM'),
+                                                           'values'          => array('am', 'pm'),
+                                                           'selected'      => strtolower(strftime('%p', $time)),
+                                                           'print_result' => false),
+                                                     $smarty);
+        $html_result .= "</select>\n";
+    }
+
+    return $html_result;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.html_table.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.html_table.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.html_table.php	(revision 14585)
@@ -0,0 +1,177 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {html_table} function plugin
+ *
+ * Type:     function<br>
+ * Name:     html_table<br>
+ * Date:     Feb 17, 2003<br>
+ * Purpose:  make an html table from an array of data<br>
+ * Input:<br>
+ *         - loop = array to loop through
+ *         - cols = number of columns, comma separated list of column names
+ *                  or array of column names
+ *         - rows = number of rows
+ *         - table_attr = table attributes
+ *         - th_attr = table heading attributes (arrays are cycled)
+ *         - tr_attr = table row attributes (arrays are cycled)
+ *         - td_attr = table cell attributes (arrays are cycled)
+ *         - trailpad = value to pad trailing cells with
+ *         - caption = text for caption element 
+ *         - vdir = vertical direction (default: "down", means top-to-bottom)
+ *         - hdir = horizontal direction (default: "right", means left-to-right)
+ *         - inner = inner loop (default "cols": print $loop line by line,
+ *                   $loop will be printed column by column otherwise)
+ *
+ *
+ * Examples:
+ * <pre>
+ * {table loop=$data}
+ * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
+ * {table loop=$data cols="first,second,third" tr_attr=$colors}
+ * </pre>
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
+ * @author credit to boots <boots dot smarty at yahoo dot com>
+ * @version  1.1
+ * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
+ *          (Smarty online manual)
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_html_table($params, &$smarty)
+{
+    $table_attr = 'border="1"';
+    $tr_attr = '';
+    $th_attr = '';
+    $td_attr = '';
+    $cols = $cols_count = 3;
+    $rows = 3;
+    $trailpad = '&nbsp;';
+    $vdir = 'down';
+    $hdir = 'right';
+    $inner = 'cols';
+    $caption = '';
+
+    if (!isset($params['loop'])) {
+        $smarty->trigger_error("html_table: missing 'loop' parameter");
+        return;
+    }
+
+    foreach ($params as $_key=>$_value) {
+        switch ($_key) {
+            case 'loop':
+                $$_key = (array)$_value;
+                break;
+
+            case 'cols':
+                if (is_array($_value) && !empty($_value)) {
+                    $cols = $_value;
+                    $cols_count = count($_value);
+                } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
+                    $cols = explode(',', $_value);
+                    $cols_count = count($cols);
+                } elseif (!empty($_value)) {
+                    $cols_count = (int)$_value;
+                } else {
+                    $cols_count = $cols;
+                }
+                break;
+
+            case 'rows':
+                $$_key = (int)$_value;
+                break;
+
+            case 'table_attr':
+            case 'trailpad':
+            case 'hdir':
+            case 'vdir':
+            case 'inner':
+            case 'caption':
+                $$_key = (string)$_value;
+                break;
+
+            case 'tr_attr':
+            case 'td_attr':
+            case 'th_attr':
+                $$_key = $_value;
+                break;
+        }
+    }
+
+    $loop_count = count($loop);
+    if (empty($params['rows'])) {
+        /* no rows specified */
+        $rows = ceil($loop_count/$cols_count);
+    } elseif (empty($params['cols'])) {
+        if (!empty($params['rows'])) {
+            /* no cols specified, but rows */
+            $cols_count = ceil($loop_count/$rows);
+        }
+    }
+
+    $output = "<table $table_attr>\n";
+
+    if (!empty($caption)) {
+        $output .= '<caption>' . $caption . "</caption>\n";
+    }
+
+    if (is_array($cols)) {
+        $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
+        $output .= "<thead><tr>\n";
+
+        for ($r=0; $r<$cols_count; $r++) {
+            $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
+            $output .= $cols[$r];
+            $output .= "</th>\n";
+        }
+        $output .= "</tr></thead>\n";
+    }
+
+    $output .= "<tbody>\n";
+    for ($r=0; $r<$rows; $r++) {
+        $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
+        $rx =  ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
+
+        for ($c=0; $c<$cols_count; $c++) {
+            $x =  ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
+            if ($inner!='cols') {
+                /* shuffle x to loop over rows*/
+                $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
+            }
+
+            if ($x<$loop_count) {
+                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
+            } else {
+                $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
+            }
+        }
+        $output .= "</tr>\n";
+    }
+    $output .= "</tbody>\n";
+    $output .= "</table>\n";
+    
+    return $output;
+}
+
+function smarty_function_html_table_cycle($name, $var, $no) {
+    if(!is_array($var)) {
+        $ret = $var;
+    } else {
+        $ret = $var[$no % count($var)];
+    }
+    
+    return ($ret) ? ' '.$ret : '';
+}
+
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.mailto.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.mailto.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.mailto.php	(revision 14585)
@@ -0,0 +1,165 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {mailto} function plugin
+ *
+ * Type:     function<br>
+ * Name:     mailto<br>
+ * Date:     May 21, 2002
+ * Purpose:  automate mailto address link creation, and optionally
+ *           encode them.<br>
+ * Input:<br>
+ *         - address = e-mail address
+ *         - text = (optional) text to display, default is address
+ *         - encode = (optional) can be one of:
+ *                * none : no encoding (default)
+ *                * javascript : encode with javascript
+ *                * javascript_charcode : encode with javascript charcode
+ *                * hex : encode with hexidecimal (no javascript)
+ *         - cc = (optional) address(es) to carbon copy
+ *         - bcc = (optional) address(es) to blind carbon copy
+ *         - subject = (optional) e-mail subject
+ *         - newsgroups = (optional) newsgroup(s) to post to
+ *         - followupto = (optional) address(es) to follow up to
+ *         - extra = (optional) extra tags for the href link
+ *
+ * Examples:
+ * <pre>
+ * {mailto address="me@domain.com"}
+ * {mailto address="me@domain.com" encode="javascript"}
+ * {mailto address="me@domain.com" encode="hex"}
+ * {mailto address="me@domain.com" subject="Hello to you!"}
+ * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
+ * {mailto address="me@domain.com" extra='class="mailto"'}
+ * </pre>
+ * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
+ *          (Smarty online manual)
+ * @version  1.2
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @author   credits to Jason Sweat (added cc, bcc and subject functionality)
+ * @param    array
+ * @param    Smarty
+ * @return   string
+ */
+function smarty_function_mailto($params, &$smarty)
+{
+    $extra = '';
+
+    if (empty($params['address'])) {
+        $smarty->trigger_error("mailto: missing 'address' parameter");
+        return;
+    } else {
+        $address = $params['address'];
+    }
+
+    $text = $address;
+
+    // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
+    // so, don't encode it.
+    $search = array('%40', '%2C');
+    $replace  = array('@', ',');
+    $mail_parms = array();
+    foreach ($params as $var=>$value) {
+        switch ($var) {
+            case 'cc':
+            case 'bcc':
+            case 'followupto':
+                if (!empty($value))
+                    $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
+                break;
+                
+            case 'subject':
+            case 'newsgroups':
+                $mail_parms[] = $var.'='.rawurlencode($value);
+                break;
+
+            case 'extra':
+            case 'text':
+                $$var = $value;
+
+            default:
+        }
+    }
+
+    $mail_parm_vals = '';
+    for ($i=0; $i<count($mail_parms); $i++) {
+        $mail_parm_vals .= (0==$i) ? '?' : '&';
+        $mail_parm_vals .= $mail_parms[$i];
+    }
+    $address .= $mail_parm_vals;
+
+    $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
+    if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
+        $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
+        return;
+    }
+
+    if ($encode == 'javascript' ) {
+        $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
+
+        $js_encode = '';
+        for ($x=0; $x < strlen($string); $x++) {
+            $js_encode .= '%' . bin2hex($string[$x]);
+        }
+
+        return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
+
+    } elseif ($encode == 'javascript_charcode' ) {
+        $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
+
+        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
+            $ord[] = ord($string[$x]);   
+        }
+
+        $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
+        $_ret .= "<!--\n";
+        $_ret .= "{document.write(String.fromCharCode(";
+        $_ret .= implode(',',$ord);
+        $_ret .= "))";
+        $_ret .= "}\n";
+        $_ret .= "//-->\n";
+        $_ret .= "</script>\n";
+        
+        return $_ret;
+        
+        
+    } elseif ($encode == 'hex') {
+
+        preg_match('!^(.*)(\?.*)$!',$address,$match);
+        if(!empty($match[2])) {
+            $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
+            return;
+        }
+        $address_encode = '';
+        for ($x=0; $x < strlen($address); $x++) {
+            if(preg_match('!\w!',$address[$x])) {
+                $address_encode .= '%' . bin2hex($address[$x]);
+            } else {
+                $address_encode .= $address[$x];
+            }
+        }
+        $text_encode = '';
+        for ($x=0; $x < strlen($text); $x++) {
+            $text_encode .= '&#x' . bin2hex($text[$x]).';';
+        }
+
+        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
+        return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
+
+    } else {
+        // no encoding
+        return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
+
+    }
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.math.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.math.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.math.php	(revision 14585)
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {math} function plugin
+ *
+ * Type:     function<br>
+ * Name:     math<br>
+ * Purpose:  handle math computations in template<br>
+ * @link http://smarty.php.net/manual/en/language.function.math.php {math}
+ *          (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_math($params, &$smarty)
+{
+    // be sure equation parameter is present
+    if (empty($params['equation'])) {
+        $smarty->trigger_error("math: missing equation parameter");
+        return;
+    }
+
+    // strip out backticks, not necessary for math
+    $equation = str_replace('`','',$params['equation']);
+
+    // make sure parenthesis are balanced
+    if (substr_count($equation,"(") != substr_count($equation,")")) {
+        $smarty->trigger_error("math: unbalanced parenthesis");
+        return;
+    }
+
+    // match all vars in equation, make sure all are passed
+    preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]+)!",$equation, $match);
+    $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
+                           'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
+    
+    foreach($match[1] as $curr_var) {
+        if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
+            $smarty->trigger_error("math: function call $curr_var not allowed");
+            return;
+        }
+    }
+
+    foreach($params as $key => $val) {
+        if ($key != "equation" && $key != "format" && $key != "assign") {
+            // make sure value is not empty
+            if (strlen($val)==0) {
+                $smarty->trigger_error("math: parameter $key is empty");
+                return;
+            }
+            if (!is_numeric($val)) {
+                $smarty->trigger_error("math: parameter $key: is not numeric");
+                return;
+            }
+            $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
+        }
+    }
+
+    eval("\$smarty_math_result = ".$equation.";");
+
+    if (empty($params['format'])) {
+        if (empty($params['assign'])) {
+            return $smarty_math_result;
+        } else {
+            $smarty->assign($params['assign'],$smarty_math_result);
+        }
+    } else {
+        if (empty($params['assign'])){
+            printf($params['format'],$smarty_math_result);
+        } else {
+            $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
+        }
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.popup.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.popup.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.popup.php	(revision 14585)
@@ -0,0 +1,119 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {popup} function plugin
+ *
+ * Type:     function<br>
+ * Name:     popup<br>
+ * Purpose:  make text pop up in windows via overlib
+ * @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
+ *          (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_popup($params, &$smarty)
+{
+    $append = '';
+    foreach ($params as $_key=>$_value) {
+        switch ($_key) {
+            case 'text':
+            case 'trigger':
+            case 'function':
+            case 'inarray':
+                $$_key = (string)$_value;
+                if ($_key == 'function' || $_key == 'inarray')
+                    $append .= ',' . strtoupper($_key) . ",'$_value'";
+                break;
+
+            case 'caption':
+            case 'closetext':
+            case 'status':
+                $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
+                break;
+
+            case 'fgcolor':
+            case 'bgcolor':
+            case 'textcolor':
+            case 'capcolor':
+            case 'closecolor':
+            case 'textfont':
+            case 'captionfont':
+            case 'closefont':
+            case 'fgbackground':
+            case 'bgbackground':
+            case 'caparray':
+            case 'capicon':
+            case 'background':
+            case 'frame':
+                $append .= ',' . strtoupper($_key) . ",'$_value'";
+                break;
+
+            case 'textsize':
+            case 'captionsize':
+            case 'closesize':
+            case 'width':
+            case 'height':
+            case 'border':
+            case 'offsetx':
+            case 'offsety':
+            case 'snapx':
+            case 'snapy':
+            case 'fixx':
+            case 'fixy':
+            case 'padx':
+            case 'pady':
+            case 'timeout':
+            case 'delay':
+                $append .= ',' . strtoupper($_key) . ",$_value";
+                break;
+
+            case 'sticky':
+            case 'left':
+            case 'right':
+            case 'center':
+            case 'above':
+            case 'below':
+            case 'noclose':
+            case 'autostatus':
+            case 'autostatuscap':
+            case 'fullhtml':
+            case 'hauto':
+            case 'vauto':
+            case 'mouseoff':
+            case 'followmouse':
+            case 'closeclick':
+                if ($_value) $append .= ',' . strtoupper($_key);
+                break;
+
+            default:
+                $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
+        }
+    }
+
+    if (empty($text) && !isset($inarray) && empty($function)) {
+        $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
+        return false;
+    }
+
+    if (empty($trigger)) { $trigger = "onmouseover"; }
+
+    $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
+    $retval .= $append . ');"';
+    if ($trigger == 'onmouseover')
+       $retval .= ' onmouseout="nd();"';
+
+
+    return $retval;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/function.popup_init.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/function.popup_init.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/function.popup_init.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty {popup_init} function plugin
+ *
+ * Type:     function<br>
+ * Name:     popup_init<br>
+ * Purpose:  initialize overlib
+ * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
+ *          (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param array
+ * @param Smarty
+ * @return string
+ */
+function smarty_function_popup_init($params, &$smarty)
+{
+    $zindex = 1000;
+    
+    if (!empty($params['zindex'])) {
+        $zindex = $params['zindex'];
+    }
+    
+    if (!empty($params['src'])) {
+        return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
+         . '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
+    } else {
+        $smarty->trigger_error("popup_init: missing src parameter");
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.capitalize.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.capitalize.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.capitalize.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty capitalize modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     capitalize<br>
+ * Purpose:  capitalize words in the string
+ * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
+ *      capitalize (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_capitalize($string, $uc_digits = false)
+{
+    smarty_modifier_capitalize_ucfirst(null, $uc_digits);
+    return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
+}
+
+function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
+{
+    static $_uc_digits = false;
+    
+    if(isset($uc_digits)) {
+        $_uc_digits = $uc_digits;
+        return;
+    }
+    
+    if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
+        return ucfirst($string[0]);
+    else
+        return $string[0];
+}
+
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.cat.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.cat.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.cat.php	(revision 14585)
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty cat modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     cat<br>
+ * Date:     Feb 24, 2003
+ * Purpose:  catenate a value to a variable
+ * Input:    string to catenate
+ * Example:  {$var|cat:"foo"}
+ * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
+ *          (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @version 1.0
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_cat($string, $cat)
+{
+    return $string . $cat;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_characters.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_characters.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_characters.php	(revision 14585)
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_characters modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     count_characteres<br>
+ * Purpose:  count the number of characters in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
+ *          count_characters (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param boolean include whitespace in the character count
+ * @return integer
+ */
+function smarty_modifier_count_characters($string, $include_spaces = false)
+{
+    if ($include_spaces)
+       return(strlen($string));
+
+    return preg_match_all("/[^\s]/",$string, $match);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_paragraphs.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_paragraphs.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_paragraphs.php	(revision 14585)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_paragraphs modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     count_paragraphs<br>
+ * Purpose:  count the number of paragraphs in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ *          count_paragraphs (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_paragraphs($string)
+{
+    // count \r or \n characters
+    return count(preg_split('/[\r\n]+/', $string));
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_sentences.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_sentences.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_sentences.php	(revision 14585)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_sentences modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     count_sentences
+ * Purpose:  count the number of sentences in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
+ *          count_sentences (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_sentences($string)
+{
+    // find periods with a word before but not after.
+    return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_words.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_words.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.count_words.php	(revision 14585)
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty count_words modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     count_words<br>
+ * Purpose:  count the number of words in a text
+ * @link http://smarty.php.net/manual/en/language.modifier.count.words.php
+ *          count_words (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return integer
+ */
+function smarty_modifier_count_words($string)
+{
+    // split text by ' ',\r,\n,\f,\t
+    $split_array = preg_split('/\s+/',$string);
+    // count matches that contain alphanumerics
+    $word_count = preg_grep('/[a-zA-Z0-9\\x80-\\xff]/', $split_array);
+
+    return count($word_count);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.date_format.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.date_format.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.date_format.php	(revision 14585)
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Include the {@link shared.make_timestamp.php} plugin
+ */
+require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
+/**
+ * Smarty date_format modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     date_format<br>
+ * Purpose:  format datestamps via strftime<br>
+ * Input:<br>
+ *         - string: input date string
+ *         - format: strftime format for output
+ *         - default_date: default date if $string is empty
+ * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
+ *          date_format (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @param string
+ * @return string|void
+ * @uses smarty_make_timestamp()
+ */
+function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
+{
+    if ($string != '') {
+        $timestamp = smarty_make_timestamp($string);
+    } elseif ($default_date != '') {
+        $timestamp = smarty_make_timestamp($default_date);
+    } else {
+        return;
+    }
+    if (DIRECTORY_SEPARATOR == '\\') {
+        $_win_from = array('%D',       '%h', '%n', '%r',          '%R',    '%t', '%T');
+        $_win_to   = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
+        if (strpos($format, '%e') !== false) {
+            $_win_from[] = '%e';
+            $_win_to[]   = sprintf('%\' 2d', date('j', $timestamp));
+        }
+        if (strpos($format, '%l') !== false) {
+            $_win_from[] = '%l';
+            $_win_to[]   = sprintf('%\' 2d', date('h', $timestamp));
+        }
+        $format = str_replace($_win_from, $_win_to, $format);
+    }
+    return strftime($format, $timestamp);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.debug_print_var.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.debug_print_var.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.debug_print_var.php	(revision 14585)
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty debug_print_var modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     debug_print_var<br>
+ * Purpose:  formats variable contents for display in the console
+ * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
+ *          debug_print_var (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param array|object
+ * @param integer
+ * @param integer
+ * @return string
+ */
+function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
+{
+    $_replace = array(
+        "\n" => '<i>\n</i>',
+        "\r" => '<i>\r</i>',
+        "\t" => '<i>\t</i>'
+    );
+
+    switch (gettype($var)) {
+        case 'array' :
+            $results = '<b>Array (' . count($var) . ')</b>';
+            foreach ($var as $curr_key => $curr_val) {
+                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
+                    . '<b>' . strtr($curr_key, $_replace) . '</b> =&gt; '
+                    . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+                    $depth--;
+            }
+            break;
+        case 'object' :
+            $object_vars = get_object_vars($var);
+            $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
+            foreach ($object_vars as $curr_key => $curr_val) {
+                $results .= '<br>' . str_repeat('&nbsp;', $depth * 2)
+                    . '<b> -&gt;' . strtr($curr_key, $_replace) . '</b> = '
+                    . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
+                    $depth--;
+            }
+            break;
+        case 'boolean' :
+        case 'NULL' :
+        case 'resource' :
+            if (true === $var) {
+                $results = 'true';
+            } elseif (false === $var) {
+                $results = 'false';
+            } elseif (null === $var) {
+                $results = 'null';
+            } else {
+                $results = htmlspecialchars((string) $var);
+            }
+            $results = '<i>' . $results . '</i>';
+            break;
+        case 'integer' :
+        case 'float' :
+            $results = htmlspecialchars((string) $var);
+            break;
+        case 'string' :
+            $results = strtr($var, $_replace);
+            if (strlen($var) > $length ) {
+                $results = substr($var, 0, $length - 3) . '...';
+            }
+            $results = htmlspecialchars('"' . $results . '"');
+            break;
+        case 'unknown type' :
+        default :
+            $results = strtr((string) $var, $_replace);
+            if (strlen($results) > $length ) {
+                $results = substr($results, 0, $length - 3) . '...';
+            }
+            $results = htmlspecialchars($results);
+    }
+
+    return $results;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.default.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.default.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.default.php	(revision 14585)
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty default modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     default<br>
+ * Purpose:  designate default value for empty variables
+ * @link http://smarty.php.net/manual/en/language.modifier.default.php
+ *          default (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_default($string, $default = '')
+{
+    if (!isset($string) || $string === '')
+        return $default;
+    else
+        return $string;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.escape.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.escape.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.escape.php	(revision 14585)
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty escape modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     escape<br>
+ * Purpose:  Escape the string according to escapement type
+ * @link http://smarty.php.net/manual/en/language.modifier.escape.php
+ *          escape (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param html|htmlall|url|quotes|hex|hexentity|javascript
+ * @return string
+ */
+function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
+{
+    switch ($esc_type) {
+        case 'html':
+            return htmlspecialchars($string, ENT_QUOTES, $char_set);
+
+        case 'htmlall':
+            return htmlentities($string, ENT_QUOTES, $char_set);
+
+        case 'url':
+            return rawurlencode($string);
+
+        case 'urlpathinfo':
+            return str_replace('%2F','/',rawurlencode($string));
+            
+        case 'quotes':
+            // escape unescaped single quotes
+            return preg_replace("%(?<!\\\\)'%", "\\'", $string);
+
+        case 'hex':
+            // escape every character into hex
+            $return = '';
+            for ($x=0; $x < strlen($string); $x++) {
+                $return .= '%' . bin2hex($string[$x]);
+            }
+            return $return;
+            
+        case 'hexentity':
+            $return = '';
+            for ($x=0; $x < strlen($string); $x++) {
+                $return .= '&#x' . bin2hex($string[$x]) . ';';
+            }
+            return $return;
+
+        case 'decentity':
+            $return = '';
+            for ($x=0; $x < strlen($string); $x++) {
+                $return .= '&#' . ord($string[$x]) . ';';
+            }
+            return $return;
+
+        case 'javascript':
+            // escape quotes and backslashes, newlines, etc.
+            return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
+            
+        case 'mail':
+            // safe way to display e-mail address on a web page
+            return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
+            
+        case 'nonstd':
+           // escape non-standard chars, such as ms document quotes
+           $_res = '';
+           for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
+               $_ord = ord(substr($string, $_i, 1));
+               // non-standard char, escape it
+               if($_ord >= 126){
+                   $_res .= '&#' . $_ord . ';';
+               }
+               else {
+                   $_res .= substr($string, $_i, 1);
+               }
+           }
+           return $_res;
+
+        default:
+            return $string;
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.indent.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.indent.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.indent.php	(revision 14585)
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty indent modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     indent<br>
+ * Purpose:  indent lines of text
+ * @link http://smarty.php.net/manual/en/language.modifier.indent.php
+ *          indent (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @return string
+ */
+function smarty_modifier_indent($string,$chars=4,$char=" ")
+{
+    return preg_replace('!^!m',str_repeat($char,$chars),$string);
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.lower.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.lower.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.lower.php	(revision 14585)
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty lower modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     lower<br>
+ * Purpose:  convert string to lowercase
+ * @link http://smarty.php.net/manual/en/language.modifier.lower.php
+ *          lower (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_lower($string)
+{
+    return strtolower($string);
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.nl2br.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.nl2br.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.nl2br.php	(revision 14585)
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty plugin
+ *
+ * Type:     modifier<br>
+ * Name:     nl2br<br>
+ * Date:     Feb 26, 2003
+ * Purpose:  convert \r\n, \r or \n to <<br>>
+ * Input:<br>
+ *         - contents = contents to replace
+ *         - preceed_test = if true, includes preceeding break tags
+ *           in replacement
+ * Example:  {$text|nl2br}
+ * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
+ *          nl2br (Smarty online manual)
+ * @version  1.0
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_nl2br($string)
+{
+    return nl2br($string);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.regex_replace.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.regex_replace.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.regex_replace.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty regex_replace modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     regex_replace<br>
+ * Purpose:  regular expression search/replace
+ * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
+ *          regex_replace (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string|array
+ * @param string|array
+ * @return string
+ */
+function smarty_modifier_regex_replace($string, $search, $replace)
+{
+    if(is_array($search)) {
+      foreach($search as $idx => $s)
+        $search[$idx] = _smarty_regex_replace_check($s);
+    } else {
+      $search = _smarty_regex_replace_check($search);
+    }       
+
+    return preg_replace($search, $replace, $string);
+}
+
+function _smarty_regex_replace_check($search)
+{
+    if (($pos = strpos($search,"\0")) !== false)
+      $search = substr($search,0,$pos);
+    if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
+        /* remove eval-modifier from $search */
+        $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
+    }
+    return $search;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.replace.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.replace.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.replace.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty replace modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     replace<br>
+ * Purpose:  simple search/replace
+ * @link http://smarty.php.net/manual/en/language.modifier.replace.php
+ *          replace (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_replace($string, $search, $replace)
+{
+    return str_replace($search, $replace, $string);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.spacify.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.spacify.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.spacify.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty spacify modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     spacify<br>
+ * Purpose:  add spaces between characters in a string
+ * @link http://smarty.php.net/manual/en/language.modifier.spacify.php
+ *          spacify (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_spacify($string, $spacify_char = ' ')
+{
+    return implode($spacify_char,
+                   preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.string_format.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.string_format.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.string_format.php	(revision 14585)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty string_format modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     string_format<br>
+ * Purpose:  format strings via sprintf
+ * @link http://smarty.php.net/manual/en/language.modifier.string.format.php
+ *          string_format (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_string_format($string, $format)
+{
+    return sprintf($format, $string);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip.php	(revision 14585)
@@ -0,0 +1,33 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty strip modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     strip<br>
+ * Purpose:  Replace all repeated spaces, newlines, tabs
+ *           with a single space or supplied replacement string.<br>
+ * Example:  {$var|strip} {$var|strip:"&nbsp;"}
+ * Date:     September 25th, 2002
+ * @link http://smarty.php.net/manual/en/language.modifier.strip.php
+ *          strip (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @version  1.0
+ * @param string
+ * @param string
+ * @return string
+ */
+function smarty_modifier_strip($text, $replace = ' ')
+{
+    return preg_replace('!\s+!', $replace, $text);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip_tags.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip_tags.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.strip_tags.php	(revision 14585)
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty strip_tags modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     strip_tags<br>
+ * Purpose:  strip html tags from text
+ * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php
+ *          strip_tags (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_strip_tags($string, $replace_with_space = true)
+{
+    if ($replace_with_space)
+        return preg_replace('!<[^>]*?>!', ' ', $string);
+    else
+        return strip_tags($string);
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.truncate.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.truncate.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.truncate.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty truncate modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     truncate<br>
+ * Purpose:  Truncate a string to a certain length if necessary,
+ *           optionally splitting in the middle of a word, and
+ *           appending the $etc string or inserting $etc into the middle.
+ * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
+ *          truncate (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @param boolean
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_truncate($string, $length = 80, $etc = '...',
+                                  $break_words = false, $middle = false)
+{
+    if ($length == 0)
+        return '';
+
+    if (strlen($string) > $length) {
+        $length -= min($length, strlen($etc));
+        if (!$break_words && !$middle) {
+            $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
+        }
+        if(!$middle) {
+            return substr($string, 0, $length) . $etc;
+        } else {
+            return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
+        }
+    } else {
+        return $string;
+    }
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.upper.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.upper.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.upper.php	(revision 14585)
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty upper modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     upper<br>
+ * Purpose:  convert string to uppercase
+ * @link http://smarty.php.net/manual/en/language.modifier.upper.php
+ *          upper (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_modifier_upper($string)
+{
+    return strtoupper($string);
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/modifier.wordwrap.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/modifier.wordwrap.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/modifier.wordwrap.php	(revision 14585)
@@ -0,0 +1,29 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Smarty wordwrap modifier plugin
+ *
+ * Type:     modifier<br>
+ * Name:     wordwrap<br>
+ * Purpose:  wrap a string of text at a given length
+ * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php
+ *          wordwrap (Smarty online manual)
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @param integer
+ * @param string
+ * @param boolean
+ * @return string
+ */
+function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false)
+{
+    return wordwrap($string,$length,$break,$cut);
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/outputfilter.trimwhitespace.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/outputfilter.trimwhitespace.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/outputfilter.trimwhitespace.php	(revision 14585)
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+/**
+ * Smarty trimwhitespace outputfilter plugin
+ *
+ * File:     outputfilter.trimwhitespace.php<br>
+ * Type:     outputfilter<br>
+ * Name:     trimwhitespace<br>
+ * Date:     Jan 25, 2003<br>
+ * Purpose:  trim leading white space and blank lines from
+ *           template source after it gets interpreted, cleaning
+ *           up code and saving bandwidth. Does not affect
+ *           <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br>
+ * Install:  Drop into the plugin directory, call
+ *           <code>$smarty->load_filter('output','trimwhitespace');</code>
+ *           from application.
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de>
+ * @version  1.3
+ * @param string
+ * @param Smarty
+ */
+function smarty_outputfilter_trimwhitespace($source, &$smarty)
+{
+    // Pull out the script blocks
+    preg_match_all("!<script[^>]*?>.*?</script>!is", $source, $match);
+    $_script_blocks = $match[0];
+    $source = preg_replace("!<script[^>]*?>.*?</script>!is",
+                           '@@@SMARTY:TRIM:SCRIPT@@@', $source);
+
+    // Pull out the pre blocks
+    preg_match_all("!<pre[^>]*?>.*?</pre>!is", $source, $match);
+    $_pre_blocks = $match[0];
+    $source = preg_replace("!<pre[^>]*?>.*?</pre>!is",
+                           '@@@SMARTY:TRIM:PRE@@@', $source);
+    
+    // Pull out the textarea blocks
+    preg_match_all("!<textarea[^>]*?>.*?</textarea>!is", $source, $match);
+    $_textarea_blocks = $match[0];
+    $source = preg_replace("!<textarea[^>]*?>.*?</textarea>!is",
+                           '@@@SMARTY:TRIM:TEXTAREA@@@', $source);
+
+    // remove all leading spaces, tabs and carriage returns NOT
+    // preceeded by a php close tag.
+    $source = trim(preg_replace('/((?<!\?>)\n)[\s]+/m', '\1', $source));
+
+    // replace textarea blocks
+    smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source);
+
+    // replace pre blocks
+    smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source);
+
+    // replace script blocks
+    smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source);
+
+    return $source;
+}
+
+function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) {
+    $_len = strlen($search_str);
+    $_pos = 0;
+    for ($_i=0, $_count=count($replace); $_i<$_count; $_i++)
+        if (($_pos=strpos($subject, $search_str, $_pos))!==false)
+            $subject = substr_replace($subject, $replace[$_i], $_pos, $_len);
+        else
+            break;
+
+}
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/shared.escape_special_chars.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/shared.escape_special_chars.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/shared.escape_special_chars.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Smarty shared plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * escape_special_chars common function
+ *
+ * Function: smarty_function_escape_special_chars<br>
+ * Purpose:  used by other smarty functions to escape
+ *           special chars except for already escaped ones
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_function_escape_special_chars($string)
+{
+    if(!is_array($string)) {
+        $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string);
+        $string = htmlspecialchars($string);
+        $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string);
+    }
+    return $string;
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/smarty/libs/plugins/shared.make_timestamp.php
===================================================================
--- tags/2.4.0RC3/include/smarty/libs/plugins/shared.make_timestamp.php	(revision 14585)
+++ tags/2.4.0RC3/include/smarty/libs/plugins/shared.make_timestamp.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Smarty shared plugin
+ * @package Smarty
+ * @subpackage plugins
+ */
+
+
+/**
+ * Function: smarty_make_timestamp<br>
+ * Purpose:  used by other smarty functions to make a timestamp
+ *           from a string.
+ * @author   Monte Ohrt <monte at ohrt dot com>
+ * @param string
+ * @return string
+ */
+function smarty_make_timestamp($string)
+{
+    if(empty($string)) {
+        // use "now":
+        $time = time();
+
+    } elseif (preg_match('/^\d{14}$/', $string)) {
+        // it is mysql timestamp format of YYYYMMDDHHMMSS?            
+        $time = mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2),
+                       substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4));
+        
+    } elseif (is_numeric($string)) {
+        // it is a numeric string, we handle it as timestamp
+        $time = (int)$string;
+        
+    } else {
+        // strtotime should handle it
+        $time = strtotime($string);
+        if ($time == -1 || $time === false) {
+            // strtotime() was not able to parse $string, use "now":
+            $time = time();
+        }
+    }
+    return $time;
+
+}
+
+/* vim: set expandtab: */
+
+?>
Index: tags/2.4.0RC3/include/template.class.php
===================================================================
--- tags/2.4.0RC3/include/template.class.php	(revision 14585)
+++ tags/2.4.0RC3/include/template.class.php	(revision 14585)
@@ -0,0 +1,1407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+class Template {
+
+  var $smarty;
+
+  var $output = '';
+
+  // Hash of filenames for each template handle.
+  var $files = array();
+
+  // Template extents filenames for each template handle.
+  var $extents = array();
+
+  // Templates prefilter from external sources (plugins)
+  var $external_filters = array();
+
+  // used by html_head smarty block to add content before </head>
+  var $html_head_elements = array();
+  private $html_style = '';
+
+  const COMBINED_SCRIPTS_TAG = '<!-- COMBINED_SCRIPTS -->';
+  var $scriptLoader;
+
+  const COMBINED_CSS_TAG = '<!-- COMBINED_CSS -->';
+  var $css_by_priority = array();
+
+  function Template($root = ".", $theme= "", $path = "template")
+  {
+    global $conf, $lang_info;
+
+    $this->scriptLoader = new ScriptLoader;
+    $this->smarty = new Smarty;
+    $this->smarty->debugging = $conf['debug_template'];
+    $this->smarty->compile_check = $conf['template_compile_check'];
+    $this->smarty->force_compile = $conf['template_force_compile'];
+
+    if (!isset($conf['data_dir_checked']))
+    {
+      $dir = PHPWG_ROOT_PATH.$conf['data_location'];
+      mkgetdir($dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR);
+      if (!is_writable($dir))
+      {
+        load_language('admin.lang');
+        fatal_error(
+          sprintf(
+            l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
+            $conf['data_location']
+            ),
+          l10n('an error happened'),
+          false // show trace
+          );
+      }
+      if (function_exists('pwg_query')) {
+        conf_update_param('data_dir_checked', 1);
+      }
+    }
+
+    if (!isset($conf['combined_dir_checked']))
+    {
+      $dir = PHPWG_ROOT_PATH.PWG_COMBINED_DIR;
+      mkgetdir($dir, MKGETDIR_DEFAULT&~MKGETDIR_DIE_ON_ERROR);
+      if (!is_writable($dir))
+      {
+        load_language('admin.lang');
+        fatal_error(
+          sprintf(
+            l10n('Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'),
+            PWG_COMBINED_DIR
+            ),
+          l10n('an error happened'),
+          false // show trace
+          );
+      }
+      if (function_exists('pwg_query')) {
+        conf_update_param('combined_dir_checked', 1);
+      }
+    }
+
+
+    $compile_dir = PHPWG_ROOT_PATH.$conf['data_location'].'templates_c';
+    mkgetdir( $compile_dir );
+
+    $this->smarty->compile_dir = $compile_dir;
+
+    $this->smarty->assign_by_ref( 'pwg', new PwgTemplateAdapter() );
+    $this->smarty->register_modifier( 'translate', array('Template', 'mod_translate') );
+    $this->smarty->register_modifier( 'explode', array('Template', 'mod_explode') );
+    $this->smarty->register_modifier( 'get_extent', array(&$this, 'get_extent') );
+    $this->smarty->register_block('html_head', array(&$this, 'block_html_head') );
+    $this->smarty->register_block('html_style', array(&$this, 'block_html_style') );
+    $this->smarty->register_function('combine_script', array(&$this, 'func_combine_script') );
+    $this->smarty->register_function('get_combined_scripts', array(&$this, 'func_get_combined_scripts') );
+    $this->smarty->register_function('combine_css', array(&$this, 'func_combine_css') );
+    $this->smarty->register_function('define_derivative', array(&$this, 'func_define_derivative') );
+    $this->smarty->register_compiler_function('get_combined_css', array(&$this, 'func_get_combined_css') );
+    $this->smarty->register_block('footer_script', array(&$this, 'block_footer_script') );
+    $this->smarty->register_prefilter( array('Template', 'prefilter_white_space') );
+    if ( $conf['compiled_template_cache_language'] )
+    {
+      $this->smarty->register_prefilter( array('Template', 'prefilter_language') );
+    }
+
+    $this->smarty->template_dir = array();
+    if ( !empty($theme) )
+    {
+      $this->set_theme($root, $theme, $path);
+      $this->set_prefilter( 'header', array('Template', 'prefilter_local_css') );
+    }
+    else
+      $this->set_template_dir($root);
+
+    $this->smarty->assign('lang_info', $lang_info);
+
+    if (!defined('IN_ADMIN') and isset($conf['extents_for_templates']))
+    {
+      $tpl_extents = unserialize($conf['extents_for_templates']);
+      $this->set_extents($tpl_extents, './template-extension/', true, $theme);
+    }
+  }
+
+  /**
+   * Load theme's parameters.
+   */
+  function set_theme($root, $theme, $path, $load_css=true, $load_local_head=true)
+  {
+    $this->set_template_dir($root.'/'.$theme.'/'.$path);
+
+    $themeconf = $this->load_themeconf($root.'/'.$theme);
+
+    if (isset($themeconf['parent']) and $themeconf['parent'] != $theme)
+    {
+      $this->set_theme(
+        $root,
+        $themeconf['parent'],
+        $path,
+        isset($themeconf['load_parent_css']) ? $themeconf['load_parent_css'] : $load_css,
+        isset($themeconf['load_parent_local_head']) ? $themeconf['load_parent_local_head'] : $load_local_head
+      );
+    }
+
+    $tpl_var = array(
+      'id' => $theme,
+      'load_css' => $load_css,
+    );
+    if (!empty($themeconf['local_head']) and $load_local_head)
+    {
+      $tpl_var['local_head'] = realpath($root.'/'.$theme.'/'.$themeconf['local_head'] );
+    }
+    $themeconf['id'] = $theme;
+    $this->smarty->append('themes', $tpl_var);
+    $this->smarty->append('themeconf', $themeconf, true);
+  }
+
+  /**
+   * Add template directory for this Template object.
+   * Set compile id if not exists.
+   */
+  function set_template_dir($dir)
+  {
+    $this->smarty->template_dir[] = $dir;
+
+    if (!isset($this->smarty->compile_id))
+    {
+      $real_dir = realpath($dir);
+      $compile_id = crc32( $real_dir===false ? $dir : $real_dir);
+      $this->smarty->compile_id = base_convert($compile_id, 10, 36 );
+    }
+  }
+
+  /**
+   * Gets the template root directory for this Template object.
+   */
+  function get_template_dir()
+  {
+    return $this->smarty->template_dir;
+  }
+
+  /**
+   * Deletes all compiled templates.
+   */
+  function delete_compiled_templates()
+  {
+      $save_compile_id = $this->smarty->compile_id;
+      $this->smarty->compile_id = null;
+      $this->smarty->clear_compiled_tpl();
+      $this->smarty->compile_id = $save_compile_id;
+      file_put_contents($this->smarty->compile_dir.'/index.htm', 'Not allowed!');
+  }
+
+  function get_themeconf($val)
+  {
+    $tc = $this->smarty->get_template_vars('themeconf');
+    return isset($tc[$val]) ? $tc[$val] : '';
+  }
+
+  /**
+   * Sets the template filename for handle.
+   */
+  function set_filename($handle, $filename)
+  {
+    return $this->set_filenames( array($handle=>$filename) );
+  }
+
+  /**
+   * Sets the template filenames for handles. $filename_array should be a
+   * hash of handle => filename pairs.
+   */
+  function set_filenames($filename_array)
+  {
+    if (!is_array($filename_array))
+    {
+      return false;
+    }
+    reset($filename_array);
+    while(list($handle, $filename) = each($filename_array))
+    {
+      if (is_null($filename))
+      {
+        unset($this->files[$handle]);
+      }
+      else
+      {
+        $this->files[$handle] = $this->get_extent($filename, $handle);
+      }
+    }
+    return true;
+  }
+
+  /**
+   * Sets template extention filename for handles.
+   */
+  function set_extent($filename, $param, $dir='', $overwrite=true, $theme='N/A')
+  {
+    return $this->set_extents(array($filename => $param), $dir, $overwrite);
+  }
+
+  /**
+   * Sets template extentions filenames for handles.
+   * $filename_array should be an hash of filename => array( handle, param) or filename => handle
+   */
+  function set_extents($filename_array, $dir='', $overwrite=true, $theme='N/A')
+  {
+    if (!is_array($filename_array))
+    {
+      return false;
+    }
+    foreach ($filename_array as $filename => $value)
+    {
+      if (is_array($value))
+      {
+        $handle = $value[0];
+        $param = $value[1];
+        $thm = $value[2];
+      }
+      elseif (is_string($value))
+      {
+        $handle = $value;
+        $param = 'N/A';
+        $thm = 'N/A';
+      }
+      else
+      {
+        return false;
+      }
+
+      if ((stripos(implode('',array_keys($_GET)), '/'.$param) !== false or $param == 'N/A')
+        and ($thm == $theme or $thm == 'N/A')
+        and (!isset($this->extents[$handle]) or $overwrite)
+        and file_exists($dir . $filename))
+      {
+        $this->extents[$handle] = realpath($dir . $filename);
+      }
+    }
+    return true;
+  }
+
+  /** return template extension if exists  */
+  function get_extent($filename='', $handle='')
+  {
+    if (isset($this->extents[$handle]))
+    {
+      $filename = $this->extents[$handle];
+    }
+    return $filename;
+  }
+
+  /** see smarty assign http://www.smarty.net/manual/en/api.assign.php */
+  function assign($tpl_var, $value = null)
+  {
+    $this->smarty->assign( $tpl_var, $value );
+  }
+
+  /**
+   * Inserts the uncompiled code for $handle as the value of $varname in the
+   * root-level. This can be used to effectively include a template in the
+   * middle of another template.
+   * This is equivalent to assign($varname, $this->parse($handle, true))
+   */
+  function assign_var_from_handle($varname, $handle)
+  {
+    $this->assign($varname, $this->parse($handle, true));
+    return true;
+  }
+
+  /** see smarty append http://www.smarty.net/manual/en/api.append.php */
+  function append($tpl_var, $value=null, $merge=false)
+  {
+    $this->smarty->append( $tpl_var, $value, $merge );
+  }
+
+  /**
+   * Root-level variable concatenation. Appends a  string to an existing
+   * variable assignment with the same name.
+   */
+  function concat($tpl_var, $value)
+  {
+    $old_val = & $this->smarty->get_template_vars($tpl_var);
+    if ( isset($old_val) )
+    {
+      $old_val .= $value;
+    }
+    else
+    {
+      $this->assign($tpl_var, $value);
+    }
+  }
+
+  /** see smarty append http://www.smarty.net/manual/en/api.clear_assign.php */
+  function clear_assign($tpl_var)
+  {
+    $this->smarty->clear_assign( $tpl_var );
+  }
+
+  /** see smarty get_template_vars http://www.smarty.net/manual/en/api.get_template_vars.php */
+  function &get_template_vars($name=null)
+  {
+    return $this->smarty->get_template_vars( $name );
+  }
+
+
+  /**
+   * Load the file for the handle, eventually compile the file and run the compiled
+   * code. This will add the output to the results or return the result if $return
+   * is true.
+   */
+  function parse($handle, $return=false)
+  {
+    if ( !isset($this->files[$handle]) )
+    {
+      fatal_error("Template->parse(): Couldn't load template file for handle $handle");
+    }
+
+    $this->smarty->assign( 'ROOT_URL', get_root_url() );
+
+    $save_compile_id = $this->smarty->compile_id;
+    $this->load_external_filters($handle);
+
+    global $conf, $lang_info;
+    if ( $conf['compiled_template_cache_language'] and isset($lang_info['code']) )
+    {
+      $this->smarty->compile_id .= '.'.$lang_info['code'];
+    }
+
+    $v = $this->smarty->fetch($this->files[$handle], null, null, false);
+
+    $this->smarty->compile_id = $save_compile_id;
+    $this->unload_external_filters($handle);
+
+    if ($return)
+    {
+      return $v;
+    }
+    $this->output .= $v;
+  }
+
+  /**
+   * Load the file for the handle, eventually compile the file and run the compiled
+   * code. This will print out the results of executing the template.
+   */
+  function pparse($handle)
+  {
+    $this->parse($handle, false);
+    $this->flush();
+  }
+
+  function flush()
+  {
+    if (!$this->scriptLoader->did_head())
+    {
+      $pos = strpos( $this->output, self::COMBINED_SCRIPTS_TAG );
+      if ($pos !== false)
+      {
+          $scripts = $this->scriptLoader->get_head_scripts();
+          $content = array();
+          foreach ($scripts as $script)
+          {
+              $content[]=
+                  '<script type="text/javascript" src="'
+                  . self::make_script_src($script)
+                  .'"></script>';
+          }
+
+          $this->output = substr_replace( $this->output, "\n".implode( "\n", $content ), $pos, strlen(self::COMBINED_SCRIPTS_TAG) );
+      } //else maybe error or warning ?
+    }
+
+    if(!empty($this->css_by_priority))
+    {
+      ksort($this->css_by_priority);
+
+      global $conf;
+      $css = array();
+      if ($conf['template_combine_files'])
+      {
+        $combiner = new FileCombiner('css');
+        foreach ($this->css_by_priority as $files)
+        {
+          foreach ($files as $file_ver)
+            $combiner->add( $file_ver[0], $file_ver[1] );
+        }
+        if ( $combiner->combine( $out_file, $out_version) )
+          $css[] = array($out_file, $out_version);
+      }
+      else
+      {
+        foreach ($this->css_by_priority as $files)
+          $css = array_merge($css, $files);
+      }
+
+      $content = array();
+      foreach( $css as $file_ver )
+      {
+        $href = embellish_url(get_root_url().$file_ver[0]);
+        if ($file_ver[1] !== false)
+          $href .= '?v' . ($file_ver[1] ? $file_ver[1] : PHPWG_VERSION);
+        // trigger the event for eventual use of a cdn
+        $href = trigger_event('combined_css', $href, $file_ver[0], $file_ver[1]);
+        $content[] = '<link rel="stylesheet" type="text/css" href="'.$href.'">';
+      }
+      $this->output = str_replace(self::COMBINED_CSS_TAG,
+          implode( "\n", $content ),
+          $this->output );
+			$this->css_by_priority = array();
+    }
+
+    if ( count($this->html_head_elements) || strlen($this->html_style) )
+    {
+      $search = "\n</head>";
+      $pos = strpos( $this->output, $search );
+      if ($pos !== false)
+      {
+        $rep = "\n".implode( "\n", $this->html_head_elements );
+        if (strlen($this->html_style))
+        {
+          $rep.='<style type="text/css">'.$this->html_style.'</style>';
+        }
+        $this->output = substr_replace( $this->output, $rep, $pos, 0 );
+      } //else maybe error or warning ?
+      $this->html_head_elements = array();
+      $this->html_style = '';
+    }
+
+    echo $this->output;
+    $this->output='';
+  }
+
+  /** flushes the output */
+  function p()
+  {
+    $this->flush();
+
+    if ($this->smarty->debugging)
+    {
+      global $t2;
+      $this->smarty->assign(
+        array(
+        'AAAA_DEBUG_TOTAL_TIME__' => get_elapsed_time($t2, get_moment())
+        )
+        );
+      require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
+      echo smarty_core_display_debug_console(null, $this->smarty);
+    }
+  }
+
+  /**
+   * translate variable modifier - translates a text to the currently loaded
+   * language
+   */
+  static function mod_translate($text)
+  {
+    return l10n($text);
+  }
+
+  /**
+   * explode variable modifier - similar to php explode
+   * 'Yes;No'|@explode:';' -> array('Yes', 'No')
+   */
+  static function mod_explode($text, $delimiter=',')
+  {
+    return explode($delimiter, $text);
+  }
+
+  /**
+   * This smarty "html_head" block allows to add content just before
+   * </head> element in the output after the head has been parsed. This is
+   * handy in order to respect strict standards when <style> and <link>
+   * html elements must appear in the <head> element
+   */
+  function block_html_head($params, $content, &$smarty, &$repeat)
+  {
+    $content = trim($content);
+    if ( !empty($content) )
+    { // second call
+      $this->html_head_elements[] = $content;
+    }
+  }
+
+  function block_html_style($params, $content, &$smarty, &$repeat)
+  {
+    $content = trim($content);
+    if ( !empty($content) )
+    { // second call
+      $this->html_style .= $content;
+    }
+  }
+
+  function func_define_derivative($params, &$smarty)
+  {
+    !empty($params['name']) or fatal_error('define_derivative missing name');
+    if (isset($params['type']))
+    {
+      $derivative = ImageStdParams::get_by_type($params['type']);
+      $smarty->assign( $params['name'], $derivative);
+      return;
+    }
+    !empty($params['width']) or fatal_error('define_derivative missing width');
+    !empty($params['height']) or fatal_error('define_derivative missing height');
+
+    $w = intval($params['width']);
+    $h = intval($params['height']);
+    $crop = 0;
+    $minw=null;
+    $minh=null;
+    
+    if (isset($params['crop']))
+    {
+      if (is_bool($params['crop']))
+      {
+        $crop = $params['crop'] ? 1:0;
+      }
+      else
+      {
+        $crop = round($params['crop']/100, 2);
+      }
+
+      if ($crop)
+      {
+        $minw = empty($params['min_width']) ? $w : intval($params['min_width']);
+        $minw <= $w or fatal_error('define_derivative invalid min_width');
+        $minh = empty($params['min_height']) ? $h : intval($params['min_height']);
+        $minh <= $h or fatal_error('define_derivative invalid min_height');
+      }
+    }
+
+    $smarty->assign( $params['name'], ImageStdParams::get_custom($w, $h, $crop, $minw, $minh) );
+  }
+
+   /**
+    * combine_script smarty function allows inclusion of a javascript file in the current page.
+    * The engine will combine several js files into a single one in order to reduce the number of
+    * required http requests.
+    * param id - required
+    * param path - required - the path to js file RELATIVE to piwigo root dir
+    * param load - optional - header|footer|async, default header
+    * param require - optional - comma separated list of script ids required to be loaded and executed
+        before this one
+    * param version - optional - plugins could use this and change it in order to force a
+        browser refresh
+    */
+  function func_combine_script($params, &$smarty)
+  {
+    if (!isset($params['id']))
+    {
+      $smarty->trigger_error("combine_script: missing 'id' parameter", E_USER_ERROR);
+    }
+    $load = 0;
+    if (isset($params['load']))
+    {
+      switch ($params['load'])
+      {
+        case 'header': break;
+        case 'footer': $load=1; break;
+        case 'async': $load=2; break;
+        default: $smarty->trigger_error("combine_script: invalid 'load' parameter", E_USER_ERROR);
+      }
+    }
+    $this->scriptLoader->add( $params['id'], $load,
+      empty($params['require']) ? array() : explode( ',', $params['require'] ),
+      @$params['path'],
+      isset($params['version']) ? $params['version'] : 0 );
+  }
+
+
+  function func_get_combined_scripts($params, &$smarty)
+  {
+    if (!isset($params['load']))
+    {
+      $smarty->trigger_error("get_combined_scripts: missing 'load' parameter", E_USER_ERROR);
+    }
+    $load = $params['load']=='header' ? 0 : 1;
+    $content = array();
+
+    if ($load==0)
+    {
+      return self::COMBINED_SCRIPTS_TAG;
+    }
+    else
+    {
+      $scripts = $this->scriptLoader->get_footer_scripts();
+      foreach ($scripts[0] as $script)
+      {
+        $content[]=
+          '<script type="text/javascript" src="'
+          . self::make_script_src($script)
+          .'"></script>';
+      }
+      if (count($this->scriptLoader->inline_scripts))
+      {
+        $content[]= '<script type="text/javascript">//<![CDATA[
+';
+        $content = array_merge($content, $this->scriptLoader->inline_scripts);
+        $content[]= '//]]></script>';
+      }
+
+      if (count($scripts[1]))
+      {
+        $content[]= '<script type="text/javascript">';
+        $content[]= '(function() {
+var s,after = document.getElementsByTagName(\'script\')[document.getElementsByTagName(\'script\').length-1];';
+        foreach ($scripts[1] as $id => $script)
+        {
+          $content[]=
+            's=document.createElement(\'script\'); s.type=\'text/javascript\'; s.async=true; s.src=\''
+            . self::make_script_src($script)
+            .'\';';
+          $content[]= 'after = after.parentNode.insertBefore(s, after);';
+        }
+        $content[]= '})();';
+        $content[]= '</script>';
+      }
+    }
+    return implode("\n", $content);
+  }
+
+
+  private static function make_script_src( $script )
+  {
+    $ret = '';
+    if ( $script->is_remote() )
+      $ret = $script->path;
+    else
+    {
+      $ret = get_root_url().$script->path;
+      if ($script->version!==false)
+      {
+        $ret.= '?v'. ($script->version ? $script->version : PHPWG_VERSION);
+      }
+    }
+    // trigger the event for eventual use of a cdn
+    $ret = trigger_event('combined_script', $ret, $script);
+    return embellish_url($ret);
+  }
+
+  function block_footer_script($params, $content, &$smarty, &$repeat)
+  {
+    $content = trim($content);
+    if ( !empty($content) )
+    { // second call
+      $this->scriptLoader->add_inline(
+        $content,
+        empty($params['require']) ? array() : explode(',', $params['require'])
+      );
+    }
+  }
+
+  /**
+    * combine_css smarty function allows inclusion of a css stylesheet file in the current page.
+    * The engine will combine several css files into a single one in order to reduce the number of
+    * required http requests.
+    * param path - required - the path to css file RELATIVE to piwigo root dir
+    * param version - optional - plugins could use this and change it in order to force a
+        browser refresh
+    */
+  function func_combine_css($params, &$smarty)
+  {
+    !empty($params['path']) || fatal_error('combine_css missing path');
+    $order = (int)@$params['order'];
+    $version = isset($params['version']) ? $params['version'] : 0;
+    $this->css_by_priority[$order][] = array( $params['path'], $version);
+  }
+
+  function func_get_combined_css($params, &$smarty)
+  {
+    return 'echo '.var_export(self::COMBINED_CSS_TAG,true);
+  }
+
+
+ /**
+   * This function allows to declare a Smarty prefilter from a plugin, thus allowing
+   * it to modify template source before compilation and without changing core files
+   * They will be processed by weight ascending.
+   * http://www.smarty.net/manual/en/advanced.features.prefilters.php
+   */
+  function set_prefilter($handle, $callback, $weight=50)
+  {
+    $this->external_filters[$handle][$weight][] = array('prefilter', $callback);
+    ksort($this->external_filters[$handle]);
+  }
+
+  function set_postfilter($handle, $callback, $weight=50)
+  {
+    $this->external_filters[$handle][$weight][] = array('postfilter', $callback);
+    ksort($this->external_filters[$handle]);
+  }
+
+  function set_outputfilter($handle, $callback, $weight=50)
+  {
+    $this->external_filters[$handle][$weight][] = array('outputfilter', $callback);
+    ksort($this->external_filters[$handle]);
+  }
+
+ /**
+   * This function actually triggers the filters on the tpl files.
+   * Called in the parse method.
+   * http://www.smarty.net/manual/en/advanced.features.prefilters.php
+   */
+  function load_external_filters($handle)
+  {
+    if (isset($this->external_filters[$handle]))
+    {
+      $compile_id = '';
+      foreach ($this->external_filters[$handle] as $filters)
+      {
+        foreach ($filters as $filter)
+        {
+          list($type, $callback) = $filter;
+          $compile_id .= $type.( is_array($callback) ? implode('', $callback) : $callback );
+          call_user_func(array($this->smarty, 'register_'.$type), $callback);
+        }
+      }
+      $this->smarty->compile_id .= '.'.base_convert(crc32($compile_id), 10, 36);
+    }
+  }
+
+  function unload_external_filters($handle)
+  {
+    if (isset($this->external_filters[$handle]))
+    {
+      foreach ($this->external_filters[$handle] as $filters)
+      {
+        foreach ($filters as $filter)
+        {
+          list($type, $callback) = $filter;
+          call_user_func(array($this->smarty, 'unregister_'.$type), $callback);
+        }
+      }
+    }
+  }
+
+  static function prefilter_white_space($source, &$smarty)
+  {
+    $ld = $smarty->left_delimiter;
+    $rd = $smarty->right_delimiter;
+    $ldq = preg_quote($ld, '#');
+    $rdq = preg_quote($rd, '#');
+
+    $regex = array();
+    $tags = array('if','foreach','section','footer_script');
+    foreach($tags as $tag)
+    {
+      array_push($regex, "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m");
+      array_push($regex, "#^[ \t]+($ldq/$tag$rdq)\s*$#m");
+    }
+    $tags = array('include','else','combine_script','html_head');
+    foreach($tags as $tag)
+    {
+      array_push($regex, "#^[ \t]+($ldq$tag"."[^$ld$rd]*$rdq)\s*$#m");
+    }
+    $source = preg_replace( $regex, "$1", $source);
+    return $source;
+  }
+
+  /**
+   * Smarty prefilter to allow caching (whenever possible) language strings
+   * from templates.
+   */
+  static function prefilter_language($source, &$smarty)
+  {
+    global $lang;
+    $ldq = preg_quote($smarty->left_delimiter, '~');
+    $rdq = preg_quote($smarty->right_delimiter, '~');
+
+    $regex = "~$ldq *\'([^'$]+)\'\|@translate *$rdq~";
+    $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[1]]) ? $lang[$m[1]] : $m[0];'), $source);
+
+    $regex = "~$ldq *\'([^'$]+)\'\|@translate\|~";
+    $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[1]]) ? \'{\'.var_export($lang[$m[1]],true).\'|\' : $m[0];'), $source);
+
+    $regex = "~($ldq *assign +var=.+ +value=)\'([^'$]+)\'\|@translate~";
+    $source = preg_replace_callback( $regex, create_function('$m', 'global $lang; return isset($lang[$m[2]]) ? $m[1].var_export($lang[$m[2]],true) : $m[0];'), $source);
+
+    return $source;
+  }
+
+  static function prefilter_local_css($source, &$smarty)
+  {
+    $css = array();
+    foreach ($smarty->get_template_vars('themes') as $theme)
+    {
+      $f = PWG_LOCAL_DIR.'css/'.$theme['id'].'-rules.css';
+      if (file_exists(PHPWG_ROOT_PATH.$f))
+      {
+        array_push($css, "{combine_css path='$f' order=10}");
+      }
+    }
+    $f = PWG_LOCAL_DIR.'css/rules.css';
+    if (file_exists(PHPWG_ROOT_PATH.$f))
+    {
+      array_push($css, "{combine_css path='$f' order=10}");
+    }
+
+    if (!empty($css))
+    {
+      $source = str_replace("\n{get_combined_css}", "\n".implode( "\n", $css )."\n{get_combined_css}", $source);
+    }
+
+    return $source;
+  }
+
+  function load_themeconf($dir)
+  {
+    global $themeconfs, $conf;
+
+    $dir = realpath($dir);
+    if (!isset($themeconfs[$dir]))
+    {
+      $themeconf = array();
+      include($dir.'/themeconf.inc.php');
+      // Put themeconf in cache
+      $themeconfs[$dir] = $themeconf;
+    }
+    return $themeconfs[$dir];
+  }
+}
+
+
+/**
+ * This class contains basic functions that can be called directly from the
+ * templates in the form $pwg->l10n('edit')
+ */
+class PwgTemplateAdapter
+{
+  function l10n($text)
+  {
+    return l10n($text);
+  }
+
+  function l10n_dec($s, $p, $v)
+  {
+    return l10n_dec($s, $p, $v);
+  }
+
+  function sprintf()
+  {
+    $args = func_get_args();
+    return call_user_func_array('sprintf',  $args );
+  }
+
+  function derivative($type, $img)
+  {
+    return new DerivativeImage($type, $img);
+  }
+
+  function derivative_url($type, $img)
+  {
+    return DerivativeImage::url($type, $img);
+  }
+}
+
+
+final class Script
+{
+  public $id;
+  public $load_mode;
+  public $precedents = array();
+  public $path;
+  public $version;
+  public $extra = array();
+
+  function Script($load_mode, $id, $path, $version, $precedents)
+  {
+    $this->id = $id;
+    $this->load_mode = $load_mode;
+    $this->id = $id;
+    $this->set_path($path);
+    $this->version = $version;
+    $this->precedents = $precedents;
+  }
+
+  function set_path($path)
+  {
+    if (!empty($path))
+      $this->path = $path;
+  }
+
+  function is_remote()
+  {
+    return url_is_remote( $this->path );
+  }
+}
+
+
+/** Manage a list of required scripts for a page, by optimizing their loading location (head, bottom, async)
+and later on by combining them in a unique file respecting at the same time dependencies.*/
+class ScriptLoader
+{
+  private $registered_scripts;
+  public $inline_scripts;
+
+  private $did_head;
+  private $head_done_scripts;
+  private $did_footer;
+
+  private static $known_paths = array(
+      'core.scripts' => 'themes/default/js/scripts.js',
+      'jquery' => 'themes/default/js/jquery.min.js',
+      'jquery.ui' => 'themes/default/js/ui/minified/jquery.ui.core.min.js',
+      'jquery.effects' => 'themes/default/js/ui/minified/jquery.effects.core.min.js',
+    );
+
+  private static $ui_core_dependencies = array(
+      'jquery.ui.widget' => array('jquery'),
+      'jquery.ui.position' => array('jquery'),
+      'jquery.ui.mouse' => array('jquery', 'jquery.ui', 'jquery.ui.widget'),
+    );
+
+  function __construct()
+  {
+    $this->clear();
+  }
+
+  function clear()
+  {
+    $this->registered_scripts = array();
+    $this->inline_scripts = array();
+    $this->head_done_scripts = array();
+    $this->did_head = $this->did_footer = false;
+  }
+
+  function get_all()
+  {
+    return $this->registered_scripts;
+  }
+
+  function add_inline($code, $require)
+  {
+    !$this->did_footer || trigger_error("Attempt to add inline script but the footer has been written", E_USER_WARNING);
+    if(!empty($require))
+    {
+      foreach ($require as $id)
+      {
+        if(!isset($this->registered_scripts[$id]))
+          $this->load_known_required_script($id, 1) or fatal_error("inline script not found require $id");
+        $s = $this->registered_scripts[$id];
+        if($s->load_mode==2)
+          $s->load_mode=1; // until now the implementation does not allow executing inline script depending on another async script
+      }
+    }
+    $this->inline_scripts[] = $code;
+  }
+
+  function add($id, $load_mode, $require, $path, $version=0)
+  {
+    if ($this->did_head && $load_mode==0)
+    {
+      trigger_error("Attempt to add script $id but the head has been written", E_USER_WARNING);
+    }
+    elseif ($this->did_footer)
+    {
+      trigger_error("Attempt to add script $id but the footer has been written", E_USER_WARNING);
+    }
+    if (! isset( $this->registered_scripts[$id] ) )
+    {
+      $script = new Script($load_mode, $id, $path, $version, $require);
+      self::fill_well_known($id, $script);
+      $this->registered_scripts[$id] = $script;
+
+      // Load or modify all UI core files
+      if ($id == 'jquery.ui' and $script->path == self::$known_paths['jquery.ui'])
+      {
+        foreach (self::$ui_core_dependencies as $script_id => $required_ids)
+          $this->add($script_id, $load_mode, $required_ids, null, $version);
+      }
+
+      // Try to load undefined required script
+      foreach ($script->precedents as $script_id)
+      {
+        if (! isset( $this->registered_scripts[$script_id] ) )
+          $this->load_known_required_script($script_id, $load_mode);
+      }
+    }
+    else
+    {
+      $script = $this->registered_scripts[$id];
+      if (count($require))
+      {
+        $script->precedents = array_unique( array_merge($script->precedents, $require) );
+      }
+      $script->set_path($path);
+      if ($version && version_compare($script->version, $version)<0 )
+        $script->version = $version;
+      if ($load_mode < $script->load_mode)
+        $script->load_mode = $load_mode;
+    }
+
+  }
+
+  function did_head()
+  {
+    return $this->did_head;
+  }
+
+  function get_head_scripts()
+  {
+    self::check_load_dep($this->registered_scripts);
+    foreach( array_keys($this->registered_scripts) as $id )
+    {
+      $this->compute_script_topological_order($id);
+    }
+
+    uasort($this->registered_scripts, array('ScriptLoader', 'cmp_by_mode_and_order'));
+
+    foreach( $this->registered_scripts as $id => $script)
+    {
+      if ($script->load_mode > 0)
+        break;
+      if ( !empty($script->path) )
+        $this->head_done_scripts[$id] = $script;
+      else
+        trigger_error("Script $id has an undefined path", E_USER_WARNING);
+    }
+    $this->did_head = true;
+    return self::do_combine($this->head_done_scripts, 0);
+  }
+
+  function get_footer_scripts()
+  {
+    if (!$this->did_head)
+    {
+      self::check_load_dep($this->registered_scripts);
+    }
+    $this->did_footer = true;
+    $todo = array();
+    foreach( $this->registered_scripts as $id => $script)
+    {
+      if (!isset($this->head_done_scripts[$id]))
+      {
+        $todo[$id] = $script;
+      }
+    }
+
+    foreach( array_keys($todo) as $id )
+    {
+      $this->compute_script_topological_order($id);
+    }
+
+    uasort($todo, array('ScriptLoader', 'cmp_by_mode_and_order'));
+
+    $result = array( array(), array() );
+    foreach( $todo as $id => $script)
+    {
+      $result[$script->load_mode-1][$id] = $script;
+    }
+    return array( self::do_combine($result[0],1), self::do_combine($result[1],2) );
+  }
+
+  private static function do_combine($scripts, $load_mode)
+  {
+    global $conf;
+    if (count($scripts)<2 or !$conf['template_combine_files'])
+      return $scripts;
+    $combiner = new FileCombiner('js');
+    $result = array();
+    foreach ($scripts as $script)
+    {
+      if ($script->is_remote())
+      {
+        if ( $combiner->combine( $out_file, $out_version) )
+        {
+          $results[] = new Script($load_mode, 'combi', $out_file, $out_version, array() );
+        }
+        $results[] = $script;
+      }
+      else
+        $combiner->add( $script->path, $script->version );
+    }
+    if ( $combiner->combine( $out_file, $out_version) )
+    {
+      $results[] = new Script($load_mode, 'combi', $out_file, $out_version, array() );
+    }
+    return $results;
+  }
+
+  // checks that if B depends on A, then B->load_mode >= A->load_mode in order to respect execution order
+  private static function check_load_dep($scripts)
+  {
+    global $conf;
+    do
+    {
+      $changed = false;
+      foreach( $scripts as $id => $script)
+      {
+        $load = $script->load_mode;
+        foreach( $script->precedents as $precedent)
+        {
+          if ( !isset($scripts[$precedent] ) )
+            continue;
+          if ( $scripts[$precedent]->load_mode > $load )
+          {
+            $scripts[$precedent]->load_mode = $load;
+            $changed = true;
+          }
+          if ($load==2 && $scripts[$precedent]->load_mode==2 && ($scripts[$precedent]->is_remote() or !$conf['template_combine_files']) )
+          {// we are async -> a predecessor cannot be async unlesss it can be merged; otherwise script execution order is not guaranteed
+            $scripts[$precedent]->load_mode = 1;
+            $changed = true;
+          }
+        }
+      }
+    }
+    while ($changed);
+  }
+
+
+  private static function fill_well_known($id, $script)
+  {
+    if ( empty($script->path) && isset(self::$known_paths[$id]))
+    {
+      $script->path = self::$known_paths[$id];
+    }
+    if ( strncmp($id, 'jquery.', 7)==0 )
+    {
+      $required_ids = array('jquery');
+
+      if ( strncmp($id, 'jquery.ui.', 10)==0 )
+      {
+        if ( !isset(self::$ui_core_dependencies[$id]) )
+          $required_ids = array_merge(array('jquery', 'jquery.ui'), array_keys(self::$ui_core_dependencies));
+
+        if ( empty($script->path) )
+          $script->path = dirname(self::$known_paths['jquery.ui'])."/$id.min.js";
+      }
+      elseif ( strncmp($id, 'jquery.effects.', 15)==0 )
+      {
+        $required_ids = array('jquery', 'jquery.effects');
+
+        if ( empty($script->path) )
+          $script->path = dirname(self::$known_paths['jquery.effects'])."/$id.min.js";
+      }
+
+      foreach ($required_ids as $required_id)
+      {
+        if ( !in_array($required_id, $script->precedents ) )
+          $script->precedents[] = $required_id;
+      }
+    }
+  }
+
+  private function load_known_required_script($id, $load_mode)
+  {
+    if ( isset(self::$known_paths[$id]) or strncmp($id, 'jquery.ui.', 10)==0 or strncmp($id, 'jquery.effects.', 15)==0 )
+    {
+      $this->add($id, $load_mode, array(), null);
+      return true;
+    }
+    return false;
+  }
+
+  private function compute_script_topological_order($script_id, $recursion_limiter=0)
+  {
+    if (!isset($this->registered_scripts[$script_id]))
+    {
+      trigger_error("Undefined script $script_id is required by someone", E_USER_WARNING);
+      return 0;
+    }
+    $recursion_limiter<5 or fatal_error("combined script circular dependency");
+    $script = $this->registered_scripts[$script_id];
+    if (isset($script->extra['order']))
+      return $script->extra['order'];
+    if (count($script->precedents) == 0)
+      return ($script->extra['order'] = 0);
+    $max = 0;
+    foreach( $script->precedents as $precedent)
+      $max = max($max, $this->compute_script_topological_order($precedent, $recursion_limiter+1) );
+    $max++;
+    return ($script->extra['order'] = $max);
+  }
+
+  private static function cmp_by_mode_and_order($s1, $s2)
+  {
+    $ret = $s1->load_mode - $s2->load_mode;
+    if ($ret) return $ret;
+
+    $ret = $s1->extra['order'] - $s2->extra['order'];
+    if ($ret) return $ret;
+
+    if ($s1->extra['order']==0 and ($s1->is_remote() xor $s2->is_remote()) )
+    {
+      return $s1->is_remote() ? -1 : 1;
+    }
+    return strcmp($s1->id,$s2->id);
+  }
+}
+
+
+/*Allows merging of javascript and css files into a single one.*/
+final class FileCombiner
+{
+  private $type; // js or css
+  private $files = array();
+  private $versions = array();
+
+  function FileCombiner($type)
+  {
+    $this->type = $type;
+  }
+
+  static function clear_combined_files()
+  {
+    $dir = opendir(PHPWG_ROOT_PATH.PWG_COMBINED_DIR);
+    while ($file = readdir($dir))
+    {
+      if ( get_extension($file)=='js' || get_extension($file)=='css')
+        unlink(PHPWG_ROOT_PATH.PWG_COMBINED_DIR.$file);
+    }
+    closedir($dir);
+  }
+
+  function add($file, $version)
+  {
+    $this->files[] = $file;
+    $this->versions[] = $version;
+  }
+
+  function clear()
+  {
+    $this->files = array();
+    $this->versions = array();
+  }
+
+  function combine(&$out_file, &$out_version)
+  {
+    if (count($this->files) == 0)
+    {
+      return false;
+    }
+    if (count($this->files) == 1)
+    {
+      $out_file = $this->files[0];
+      $out_version = $this->versions[0];
+      $this->clear();
+      return 1;
+    }
+
+    $is_css = $this->type == "css";
+    global $conf;
+    $key = array();
+    if ($is_css)
+      $key[] = get_absolute_root_url(false);//because we modify bg url
+    for ($i=0; $i<count($this->files); $i++)
+    {
+      $key[] = $this->files[$i];
+      $key[] = $this->versions[$i];
+      if ($conf['template_compile_check']) $key[] = filemtime( PHPWG_ROOT_PATH . $this->files[$i] );
+    }
+    $key = join('>', $key);
+
+    $file = base_convert(crc32($key),10,36);
+    $file = PWG_COMBINED_DIR . $file . '.' . $this->type;
+
+    $exists = file_exists( PHPWG_ROOT_PATH . $file );
+    if ($exists)
+    {
+      $is_reload =
+        (isset($_SERVER['HTTP_CACHE_CONTROL']) && strpos($_SERVER['HTTP_CACHE_CONTROL'], 'max-age=0') !== false)
+        || (isset($_SERVER['HTTP_PRAGMA']) && strpos($_SERVER['HTTP_PRAGMA'], 'no-cache'));
+      if (is_admin() && $is_reload)
+      {// the user pressed F5 in the browser
+        if ($is_css || $conf['template_compile_check']==false)
+          $exists = false; // we foce regeneration of css because @import sub-files are never checked for modification
+      }
+    }
+
+    if ($exists)
+    {
+      $out_file = $file;
+      $out_version = false;
+      $this->clear();
+      return 2;
+    }
+
+    $output = '';
+    foreach ($this->files as $input_file)
+    {
+      $output .= "/*BEGIN $input_file */\n";
+      if ($is_css)
+        $output .= self::process_css($input_file);
+      else
+        $output .= self::process_js($input_file);
+      $output .= "\n";
+    }
+
+    file_put_contents( PHPWG_ROOT_PATH . $file,  $output );
+    $out_file = $file;
+    $out_version = false;
+    $this->clear();
+    return 2;
+  }
+
+  private static function process_js($file)
+  {
+    $js = file_get_contents(PHPWG_ROOT_PATH . $file);
+    if (strpos($file, '.min')===false and strpos($file, '.packed')===false )
+    {
+      require_once(PHPWG_ROOT_PATH.'include/jsmin.class.php');
+      try { $js = JSMin::minify($js); } catch(Exception $e) {}
+    }
+    return trim($js, " \t\r\n;").";\n";
+  }
+
+  private static function process_css($file)
+  {
+    $css = self::process_css_rec($file);
+    require_once(PHPWG_ROOT_PATH.'include/cssmin.class.php');
+    $css = CssMin::minify($css, array('Variables'=>false));
+    $css = trigger_event('combined_css_postfilter', $css);
+    return $css;
+  }
+
+  private static function process_css_rec($file)
+  {
+    static $PATTERN = "#url\(\s*['|\"]{0,1}(.*?)['|\"]{0,1}\s*\)#";
+    $css = file_get_contents(PHPWG_ROOT_PATH . $file);
+    if (preg_match_all($PATTERN, $css, $matches, PREG_SET_ORDER))
+    {
+      $search = $replace = array();
+      foreach ($matches as $match)
+      {
+        if ( !url_is_remote($match[1]) && $match[1][0] != '/')
+        {
+          $relative = dirname($file) . "/$match[1]";
+          $search[] = $match[0];
+          $replace[] = 'url('.embellish_url(get_absolute_root_url(false).$relative).')';
+        }
+      }
+      $css = str_replace($search, $replace, $css);
+    }
+
+    $imports = preg_match_all("#@import\s*['|\"]{0,1}(.*?)['|\"]{0,1};#", $css, $matches, PREG_SET_ORDER);
+    if ($imports)
+    {
+      $search = $replace = array();
+      foreach ($matches as $match)
+      {
+        $search[] = $match[0];
+        $replace[] = self::process_css_rec(dirname($file) . "/$match[1]");
+      }
+      $css = str_replace($search, $replace, $css);
+    }
+    return $css;
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/user.inc.php
===================================================================
--- tags/2.4.0RC3/include/user.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/user.inc.php	(revision 14585)
@@ -0,0 +1,83 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// by default we start with guest
+$user['id'] = $conf['guest_id'];
+
+if (isset($_COOKIE[session_name()]))
+{
+  session_start();
+  if (isset($_GET['act']) and $_GET['act'] == 'logout')
+  { // logout
+    logout_user();
+    redirect(get_gallery_home_url());
+  }
+  elseif (!empty($_SESSION['pwg_uid']))
+  {
+    $user['id'] = $_SESSION['pwg_uid'];
+  }
+}
+
+// Now check the auto-login
+if ( $user['id']==$conf['guest_id'] )
+{
+  auto_login();
+}
+
+if (session_id()=="")
+{
+  session_start();
+}
+
+// using Apache authentication override the above user search
+if ($conf['apache_authentication'])
+{
+  $remote_user = null;
+  foreach (array('REMOTE_USER', 'REDIRECT_REMOTE_USER') as $server_key)
+  {
+    if (isset($_SERVER[$server_key]))
+    {
+      $remote_user = $_SERVER[$server_key];
+      break;
+    }
+  }
+
+  if (isset($remote_user))
+  {
+    if (!($user['id'] = get_userid($remote_user)))
+    {
+      register_user($remote_user, '', '', false);
+      $user['id'] = get_userid($remote_user);
+    }
+  }
+}
+
+$user = build_user( $user['id'],
+          ( defined('IN_ADMIN') and IN_ADMIN ) ? false : true // use cache ?
+         );
+if ($conf['browser_language'] and (is_a_guest() or is_generic()) )
+{
+  get_browser_language($user['language']);
+}
+trigger_action('user_init', $user);
+?>
Index: tags/2.4.0RC3/include/ws_core.inc.php
===================================================================
--- tags/2.4.0RC3/include/ws_core.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_core.inc.php	(revision 14585)
@@ -0,0 +1,580 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**** WEB SERVICE CORE CLASSES************************************************
+ * PwgServer - main object - the link between web service methods, request
+ *  handler and response encoder
+ * PwgRequestHandler - base class for handlers
+ * PwgResponseEncoder - base class for response encoders
+ * PwgError, PwgNamedArray, PwgNamedStruct - can be used by web service functions
+ * as return values
+ */
+
+
+define( 'WS_PARAM_ACCEPT_ARRAY',  0x010000 );
+define( 'WS_PARAM_FORCE_ARRAY',   0x030000 );
+define( 'WS_PARAM_OPTIONAL',      0x040000 );
+
+define( 'WS_ERR_INVALID_METHOD',  501 );
+define( 'WS_ERR_MISSING_PARAM',   1002 );
+define( 'WS_ERR_INVALID_PARAM',   1003 );
+
+define( 'WS_XML_ATTRIBUTES', 'attributes_xml_');
+define( 'WS_XML_CONTENT', 'content_xml_');
+
+/**
+ * PwgError object can be returned from any web service function implementation.
+ */
+class PwgError
+{
+  private $_code;
+  private $_codeText;
+
+  function PwgError($code, $codeText)
+  {
+    if ($code>=400 and $code<600)
+    {
+      set_status_header($code, $codeText);
+    }
+
+    $this->_code = $code;
+    $this->_codeText = $codeText;
+  }
+
+  function code() { return $this->_code; }
+  function message() { return $this->_codeText; }
+}
+
+/**
+ * Simple wrapper around an array (keys are consecutive integers starting at 0).
+ * Provides naming clues for xml output (xml attributes vs. xml child elements?)
+ * Usually returned by web service function implementation.
+ */
+class PwgNamedArray
+{
+  /*private*/ var $_content;
+  /*private*/ var $_itemName;
+  /*private*/ var $_xmlAttributes;
+
+  /**
+   * Constructs a named array
+   * @param arr array (keys must be consecutive integers starting at 0)
+   * @param itemName string xml element name for values of arr (e.g. image)
+   * @param xmlAttributes array of sub-item attributes that will be encoded as
+   *      xml attributes instead of xml child elements
+   */
+  function PwgNamedArray($arr, $itemName, $xmlAttributes=array() )
+  {
+    $this->_content = $arr;
+    $this->_itemName = $itemName;
+    $this->_xmlAttributes = array_flip($xmlAttributes);
+  }
+}
+/**
+ * Simple wrapper around a "struct" (php array whose keys are not consecutive
+ * integers starting at 0). Provides naming clues for xml output (what is xml
+ * attributes and what is element)
+ */
+class PwgNamedStruct
+{
+  /*private*/ var $_content;
+  /*private*/ var $_name;
+  /*private*/ var $_xmlAttributes;
+
+  /**
+   * Constructs a named struct (usually returned by web service function
+   * implementation)
+   * @param name string - containing xml element name
+   * @param content array - the actual content (php array)
+   * @param xmlAttributes array - name of the keys in $content that will be
+   *    encoded as xml attributes (if null - automatically prefer xml attributes
+   *    whenever possible)
+   */
+  function PwgNamedStruct($name, $content, $xmlAttributes=null, $xmlElements=null )
+  {
+    $this->_name = $name;
+    $this->_content = $content;
+    if ( isset($xmlAttributes) )
+    {
+      $this->_xmlAttributes = array_flip($xmlAttributes);
+    }
+    else
+    {
+      $this->_xmlAttributes = array();
+      foreach ($this->_content as $key=>$value)
+      {
+        if (!empty($key) and (is_scalar($value) or is_null($value)) )
+        {
+          if ( empty($xmlElements) or !in_array($key,$xmlElements) )
+          {
+            $this->_xmlAttributes[$key]=1;
+          }
+        }
+      }
+    }
+  }
+}
+
+
+/**
+ * Abstract base class for request handlers.
+ */
+class PwgRequestHandler
+{
+  /** Virtual abstract method. Decodes the request (GET or POST) handles the
+   * method invocation as well as response sending.
+   */
+  function handleRequest(&$server) { assert(false); }
+}
+
+/**
+ *
+ * Base class for web service response encoder.
+ */
+class PwgResponseEncoder
+{
+  /** encodes the web service response to the appropriate output format
+   * @param response mixed the unencoded result of a service method call
+   */
+  function encodeResponse($response) { assert(false); }
+
+  /** default "Content-Type" http header for this kind of response format
+   */
+  function getContentType() { assert(false); }
+
+  /**
+   * returns true if the parameter is a 'struct' (php array type whose keys are
+   * NOT consecutive integers starting with 0)
+   */
+  static function is_struct(&$data)
+  {
+    if (is_array($data) )
+    {
+      if (range(0, count($data) - 1) !== array_keys($data) )
+      { # string keys, unordered, non-incremental keys, .. - whatever, make object
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * removes all XML formatting from $response (named array, named structs, etc)
+   * usually called by every response encoder, except rest xml.
+   */
+  static function flattenResponse(&$response)
+  {
+    PwgResponseEncoder::_mergeAttributesAndContent($response);
+    PwgResponseEncoder::_removeNamedArray($response);
+    PwgResponseEncoder::_removeNamedStruct($response);
+    if (is_array($response))
+    { // need to call 2 times (first time might add new arrays)
+      array_walk_recursive($response, array('PwgResponseEncoder', '_remove_named_callback') );
+      array_walk_recursive($response, array('PwgResponseEncoder', '_remove_named_callback') );
+    }
+//print_r($response);
+    PwgResponseEncoder::_mergeAttributesAndContent($response);
+  }
+
+  private static function _remove_named_callback(&$value, $key)
+  {
+    do
+    {
+      $changed = 0;
+      $changed += PwgResponseEncoder::_removeNamedArray($value);
+      $changed += PwgResponseEncoder::_removeNamedStruct($value);
+  //    print_r('walk '.$key."<br>\n");
+    }
+    while ($changed);
+  }
+
+  private static function _mergeAttributesAndContent(&$value)
+  {
+    if ( !is_array($value) )
+      return;
+/*    $first_key = '';
+    if (count($value)) { $ak = array_keys($value); $first_key = $ak[0]; }
+
+    print_r( '_mergeAttributesAndContent is_struct='.PwgResponseEncoder::is_struct($value)
+      .' count='.count($value)
+      .' first_key='.$first_key
+      ."<br>\n"
+      );*/
+    $ret = 0;
+    if (PwgResponseEncoder::is_struct($value))
+    {
+      if ( isset($value[WS_XML_ATTRIBUTES]) )
+      {
+        $value = array_merge( $value, $value[WS_XML_ATTRIBUTES] );
+        unset( $value[WS_XML_ATTRIBUTES] );
+        $ret=1;
+      }
+      if ( isset($value[WS_XML_CONTENT]) )
+      {
+        $cont_processed = 0;
+        if ( count($value)==1 )
+        {
+          $value = $value[WS_XML_CONTENT];
+          $cont_processed=1;
+        }
+        else
+        {
+          if (PwgResponseEncoder::is_struct($value[WS_XML_CONTENT]))
+          {
+            $value = array_merge( $value, $value[WS_XML_CONTENT] );
+            unset( $value[WS_XML_CONTENT] );
+            $cont_processed=1;
+          }
+        }
+        $ret += $cont_processed;
+        if (!$cont_processed)
+        {
+          $value['_content'] = $value[WS_XML_CONTENT];
+          unset( $value[WS_XML_CONTENT] );
+          $ret++;
+        }
+      }
+    }
+
+    foreach ($value as $key=>$v)
+    {
+      if ( PwgResponseEncoder::_mergeAttributesAndContent($v) )
+      {
+        $value[$key]=$v;
+        $ret++;
+      }
+    }
+    return $ret;
+  }
+
+  private static function _removeNamedArray(&$value)
+  {
+    if ( strtolower( @get_class($value) ) =='pwgnamedarray')
+    {
+      $value = $value->_content;
+      return 1;
+    }
+    return 0;
+  }
+
+  private static function _removeNamedStruct(&$value)
+  {
+    if ( strtolower( @get_class($value) ) =='pwgnamedstruct')
+    {
+      if ( isset($value->_content['']) )
+      {
+        $unknown = $value->_content[''];
+        unset( $value->_content[''] );
+        $value->_content[$value->_name] = $unknown;
+      }
+      $value = $value->_content;
+      return 1;
+    }
+    return 0;
+  }
+}
+
+
+
+class PwgServer
+{
+  var $_requestHandler;
+  var $_requestFormat;
+  var $_responseEncoder;
+  var $_responseFormat;
+
+  var $_methods = array();
+
+  function PwgServer()
+  {
+  }
+
+  /**
+   *  Initializes the request handler.
+   */
+  function setHandler($requestFormat, &$requestHandler)
+  {
+    $this->_requestHandler = &$requestHandler;
+    $this->_requestFormat = $requestFormat;
+  }
+
+  /**
+   *  Initializes the request handler.
+   */
+  function setEncoder($responseFormat, &$encoder)
+  {
+    $this->_responseEncoder = &$encoder;
+    $this->_responseFormat = $responseFormat;
+  }
+
+  /**
+   * Runs the web service call (handler and response encoder should have been
+   * created)
+   */
+  function run()
+  {
+    if ( is_null($this->_responseEncoder) )
+    {
+      set_status_header(400);
+      @header("Content-Type: text/plain");
+      echo ("Cannot process your request. Unknown response format.
+Request format: ".@$this->_requestFormat." Response format: ".@$this->_responseFormat."\n");
+      var_export($this);
+      die(0);
+    }
+
+    if ( is_null($this->_requestHandler) )
+    {
+      $this->sendResponse( new PwgError(400, 'Unknown request format') );
+      return;
+    }
+
+    $this->addMethod('reflection.getMethodList',
+        array('PwgServer', 'ws_getMethodList'),
+        null, '' );
+    $this->addMethod('reflection.getMethodDetails',
+        array('PwgServer', 'ws_getMethodDetails'),
+        array('methodName'),'');
+
+    trigger_action('ws_add_methods', array(&$this) );
+    uksort( $this->_methods, 'strnatcmp' );
+    $this->_requestHandler->handleRequest($this);
+  }
+
+  /**
+   * Encodes a response and sends it back to the browser.
+   */
+  function sendResponse($response)
+  {
+    $encodedResponse = $this->_responseEncoder->encodeResponse($response);
+    $contentType = $this->_responseEncoder->getContentType();
+
+    @header('Content-Type: '.$contentType.'; charset='.get_pwg_charset());
+    print_r($encodedResponse);
+    trigger_action('sendResponse', $encodedResponse );
+  }
+
+  /**
+   * Registers a web service method.
+   * @param methodName string - the name of the method as seen externally
+   * @param callback mixed - php method to be invoked internally
+   * @param params array - map of allowed parameter names with optional default
+   * values and parameter flags. Example of $params:
+   * array( 'param1' => array('default'=>523, 'flags'=>WS_PARAM_FORCE_ARRAY) ) .
+   * Possible parameter flags are:
+   * WS_PARAM_ALLOW_ARRAY - this parameter can be an array
+   * WS_PARAM_FORCE_ARRAY - if this parameter is scalar, force it to an array
+   *  before invoking the method
+   * @param description string - a description of the method.
+   */
+  function addMethod($methodName, $callback, $params=array(), $description, $include_file='')
+  {
+    if (!is_array($params))
+    {
+      $params = array();
+    }
+
+    if ( range(0, count($params) - 1) === array_keys($params) )
+    {
+      $params = array_flip($params);
+    }
+
+    foreach( $params as $param=>$options)
+    {
+      if ( !is_array($options) )
+      {
+        $params[$param] = array('flags'=>0);
+      }
+      else
+      {
+        $flags = isset($options['flags']) ? $options['flags'] : 0;
+        if ( array_key_exists('default', $options) )
+        {
+          $flags |= WS_PARAM_OPTIONAL;
+        }
+        if ( $flags & WS_PARAM_FORCE_ARRAY )
+        {
+          $flags |= WS_PARAM_ACCEPT_ARRAY;
+        }
+        $options['flags'] = $flags;
+        $params[$param] = $options;
+      }
+    }
+
+    $this->_methods[$methodName] = array(
+      'callback'    => $callback,
+      'description' => $description,
+      'signature'   => $params,
+      'include'     => $include_file,
+      );
+  }
+
+  function hasMethod($methodName)
+  {
+    return isset($this->_methods[$methodName]);
+  }
+
+  function getMethodDescription($methodName)
+  {
+    $desc = @$this->_methods[$methodName]['description'];
+    return isset($desc) ? $desc : '';
+  }
+
+  function getMethodSignature($methodName)
+  {
+    $signature = @$this->_methods[$methodName]['signature'];
+    return isset($signature) ? $signature : array();
+  }
+
+  /*static*/ function isPost()
+  {
+    return isset($HTTP_RAW_POST_DATA) or !empty($_POST);
+  }
+
+  /*static*/ function makeArrayParam(&$param)
+  {
+    if ( $param==null )
+    {
+      $param = array();
+    }
+    else
+    {
+      if (! is_array($param) )
+      {
+        $param = array($param);
+      }
+    }
+  }
+
+  /**
+   *  Invokes a registered method. Returns the return of the method (or
+   *  a PwgError object if the method is not found)
+   *  @param methodName string the name of the method to invoke
+   *  @param params array array of parameters to pass to the invoked method
+   */
+  function invoke($methodName, $params)
+  {
+    $method = @$this->_methods[$methodName];
+
+    if ( $method==null )
+    {
+      return new PwgError(WS_ERR_INVALID_METHOD, 'Method name is not valid');
+    }
+
+    // parameter check and data coercion !
+    $signature = $method['signature'];
+    $missing_params = array();
+    foreach($signature as $name=>$options)
+    {
+      $flags = $options['flags'];
+      if ( !array_key_exists($name, $params) )
+      {// parameter not provided in the request
+        if ( !($flags&WS_PARAM_OPTIONAL) )
+        {
+          $missing_params[] = $name;
+        }
+        else if ( array_key_exists('default',$options) )
+        {
+          $params[$name] = $options['default'];
+          if ( ($flags&WS_PARAM_FORCE_ARRAY) )
+          {
+            $this->makeArrayParam( $params[$name] );
+          }
+        }
+      }
+      else
+      {// parameter provided - do some basic checks
+        $the_param = $params[$name];
+        if ( is_array($the_param) and ($flags&WS_PARAM_ACCEPT_ARRAY)==0 )
+        {
+          return new PwgError(WS_ERR_INVALID_PARAM, $name.' must be scalar' );
+        }
+        if ( ($flags&WS_PARAM_FORCE_ARRAY) )
+        {
+          $this->makeArrayParam( $the_param );
+        }
+        if ( isset($options['maxValue']) and $the_param>$options['maxValue'])
+        {
+          $the_param = $options['maxValue'];
+        }
+        $params[$name] = $the_param;
+      }
+    }
+    if (count($missing_params))
+    {
+      return new PwgError(WS_ERR_MISSING_PARAM, 'Missing parameters: '.implode(',',$missing_params));
+    }
+    $result = trigger_event('ws_invoke_allowed', true, $methodName, $params);
+    if ( strtolower( @get_class($result) )!='pwgerror')
+    {
+      if ( !empty($method['include']) )
+      {
+        include_once( $method['include'] );
+      }
+      $result = call_user_func_array($method['callback'], array($params, &$this) );
+    }
+    return $result;
+  }
+
+  /**
+   * WS reflection method implementation: lists all available methods
+   */
+  static function ws_getMethodList($params, &$service)
+  {
+    return array('methods' => new PwgNamedArray( array_keys($service->_methods),'method' ) );
+  }
+
+  /**
+   * WS reflection method implementation: gets information about a given method
+   */
+  static function ws_getMethodDetails($params, &$service)
+  {
+    $methodName = $params['methodName'];
+    if (!$service->hasMethod($methodName))
+    {
+      return new PwgError(WS_ERR_INVALID_PARAM,
+            'Requested method does not exist');
+    }
+    $res = array(
+      'name' => $methodName,
+      'description' => $service->getMethodDescription($methodName),
+      'params' => array(),
+    );
+    $signature = $service->getMethodSignature($methodName);
+    foreach ($signature as $name => $options)
+    {
+      $param_data = array(
+        'name' => $name,
+        'optional' => ($options['flags']&WS_PARAM_OPTIONAL)?true:false,
+        'acceptArray' => ($options['flags']&WS_PARAM_ACCEPT_ARRAY)?true:false,
+        );
+      if (isset($options['default']))
+      {
+        $param_data['defaultValue'] = $options['default'];
+      }
+      $res['params'][] = $param_data;
+    }
+    return $res;
+  }
+}
+?>
Index: tags/2.4.0RC3/include/ws_functions.inc.php
===================================================================
--- tags/2.4.0RC3/include/ws_functions.inc.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_functions.inc.php	(revision 14585)
@@ -0,0 +1,3452 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**** IMPLEMENTATION OF WEB SERVICE METHODS ***********************************/
+
+/**
+ * Event handler for method invocation security check. Should return a PwgError
+ * if the preconditions are not satifsied for method invocation.
+ */
+function ws_isInvokeAllowed($res, $methodName, $params)
+{
+  global $conf;
+
+  if ( strpos($methodName,'reflection.')===0 )
+  { // OK for reflection
+    return $res;
+  }
+
+  if ( !is_autorize_status(ACCESS_GUEST) and
+      strpos($methodName,'pwg.session.')!==0 )
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  return $res;
+}
+
+/**
+ * returns a "standard" (for our web service) array of sql where clauses that
+ * filters the images (images table only)
+ */
+function ws_std_image_sql_filter( $params, $tbl_name='' )
+{
+  $clauses = array();
+  if ( is_numeric($params['f_min_rate']) )
+  {
+    $clauses[] = $tbl_name.'rating_score>'.$params['f_min_rate'];
+  }
+  if ( is_numeric($params['f_max_rate']) )
+  {
+    $clauses[] = $tbl_name.'rating_score<='.$params['f_max_rate'];
+  }
+  if ( is_numeric($params['f_min_hit']) )
+  {
+    $clauses[] = $tbl_name.'hit>'.$params['f_min_hit'];
+  }
+  if ( is_numeric($params['f_max_hit']) )
+  {
+    $clauses[] = $tbl_name.'hit<='.$params['f_max_hit'];
+  }
+  if ( isset($params['f_min_date_available']) )
+  {
+    $clauses[] = $tbl_name."date_available>='".$params['f_min_date_available']."'";
+  }
+  if ( isset($params['f_max_date_available']) )
+  {
+    $clauses[] = $tbl_name."date_available<'".$params['f_max_date_available']."'";
+  }
+  if ( isset($params['f_min_date_created']) )
+  {
+    $clauses[] = $tbl_name."date_creation>='".$params['f_min_date_created']."'";
+  }
+  if ( isset($params['f_max_date_created']) )
+  {
+    $clauses[] = $tbl_name."date_creation<'".$params['f_max_date_created']."'";
+  }
+  if ( is_numeric($params['f_min_ratio']) )
+  {
+    $clauses[] = $tbl_name.'width/'.$tbl_name.'height>'.$params['f_min_ratio'];
+  }
+  if ( is_numeric($params['f_max_ratio']) )
+  {
+    $clauses[] = $tbl_name.'width/'.$tbl_name.'height<='.$params['f_max_ratio'];
+  }
+  if (is_numeric($params['f_max_level']) )
+  {
+    $clauses[] = $tbl_name.'level <= '.$params['f_max_level'];
+  }
+  return $clauses;
+}
+
+/**
+ * returns a "standard" (for our web service) ORDER BY sql clause for images
+ */
+function ws_std_image_sql_order( $params, $tbl_name='' )
+{
+  $ret = '';
+  if ( empty($params['order']) )
+  {
+    return $ret;
+  }
+  $matches = array();
+  preg_match_all('/([a-z_]+) *(?:(asc|desc)(?:ending)?)? *(?:, *|$)/i',
+    $params['order'], $matches);
+  for ($i=0; $i<count($matches[1]); $i++)
+  {
+    switch ($matches[1][$i])
+    {
+      case 'date_created':
+        $matches[1][$i] = 'date_creation'; break;
+      case 'date_posted':
+        $matches[1][$i] = 'date_available'; break;
+      case 'rand': case 'random':
+        $matches[1][$i] = DB_RANDOM_FUNCTION.'()'; break;
+    }
+    $sortable_fields = array('id', 'file', 'name', 'hit', 'rating_score',
+      'date_creation', 'date_available', DB_RANDOM_FUNCTION.'()' );
+    if ( in_array($matches[1][$i], $sortable_fields) )
+    {
+      if (!empty($ret))
+        $ret .= ', ';
+      if ($matches[1][$i] != DB_RANDOM_FUNCTION.'()' )
+      {
+        $ret .= $tbl_name;
+      }
+      $ret .= $matches[1][$i];
+      $ret .= ' '.$matches[2][$i];
+    }
+  }
+  return $ret;
+}
+
+/**
+ * returns an array map of urls (thumb/element) for image_row - to be returned
+ * in a standard way by different web service methods
+ */
+function ws_std_get_urls($image_row)
+{
+  $ret = array();
+
+  $src_image = new SrcImage($image_row);
+
+  global $user;
+  if ($user['enabled_high'])
+  {
+    $ret['element_url'] = get_element_url($image_row);
+  }
+
+  $derivatives = DerivativeImage::get_all($src_image);
+  $derivatives_arr = array();
+  foreach($derivatives as $type=>$derivative)
+  {
+    $size = $derivative->get_size();
+    $size != null or $size=array(null,null);
+    $derivatives_arr[$type] = array('url' => $derivative->get_url(), 'width'=>$size[0], 'height'=>$size[1] );
+  }
+  $ret['derivatives'] = $derivatives_arr;;
+  return $ret;
+}
+
+/**
+ * returns an array of image attributes that are to be encoded as xml attributes
+ * instead of xml elements
+ */
+function ws_std_get_image_xml_attributes()
+{
+  return array(
+    'id','element_url', 'file','width','height','hit','date_available','date_creation'
+    );
+}
+
+function ws_getMissingDerivatives($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(403, 'Forbidden');
+  }
+
+  if ( empty($params['types']) )
+  {
+    $types = array_keys(ImageStdParams::get_defined_type_map());
+  }
+  else
+  {
+    $types = array_intersect(array_keys(ImageStdParams::get_defined_type_map()), $params['types']);
+    if (count($types)==0)
+    {
+      return new PwgError(WS_ERR_INVALID_PARAM, "Invalid types");
+    }
+  }
+
+  if ( ($max_urls = intval($params['max_urls'])) <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid max_urls");
+  }
+
+  list($max_id, $image_count) = pwg_db_fetch_row( pwg_query('SELECT MAX(id)+1, COUNT(*) FROM '.IMAGES_TABLE) );
+  $start_id = intval($params['prev_page']);
+  if ($start_id<=0)
+  {
+    $start_id = $max_id;
+  }
+
+  $uid = '&b='.time();
+  global $conf;
+  $conf['question_mark_in_urls'] = $conf['php_extension_in_urls'] = true;
+  $conf['derivative_url_style']=2; //script
+
+  $qlimit = min(5000, ceil(max($image_count/500, $max_urls/count($types))));
+  $where_clauses = ws_std_image_sql_filter( $params, '' );
+  $where_clauses[] = 'id<start_id';
+  if ( !empty($params['ids']) )
+  {
+    $where_clauses[] = 'id IN ('.implode(',',$params['ids']).')';
+  }
+
+  $query_model = 'SELECT id, path, representative_ext, width,height,rotation
+  FROM '.IMAGES_TABLE.'
+  WHERE '.implode(' AND ', $where_clauses).'
+  ORDER BY id DESC
+  LIMIT '.$qlimit;
+
+  $urls=array();
+  do
+  {
+    $result = pwg_query( str_replace('start_id', $start_id, $query_model));
+    $is_last = pwg_db_num_rows($result) < $qlimit;
+    while ($row=pwg_db_fetch_assoc($result))
+    {
+      $start_id = $row['id'];
+      $src_image = new SrcImage($row);
+      if ($src_image->is_mimetype())
+        continue;
+      foreach($types as $type)
+      {
+        $derivative = new DerivativeImage($type, $src_image);
+        if ($type != $derivative->get_type())
+          continue;
+        if (@filemtime($derivative->get_path())===false)
+        {
+          $urls[] = $derivative->get_url().$uid;
+        }
+      }
+      if (count($urls)>=$max_urls && !$is_last)
+        break;
+    }
+    if ($is_last)
+    {
+      $start_id = 0;
+    }
+  }while (count($urls)<$max_urls && $start_id);
+
+  $ret = array();
+  if ($start_id)
+  {
+    $ret['next_page']=$start_id;
+  }
+  $ret['urls']=$urls;
+  return $ret;
+}
+
+/**
+ * returns PWG version (web service method)
+ */
+function ws_getVersion($params, &$service)
+{
+  global $conf;
+  if ($conf['show_version'] or is_admin() )
+    return PHPWG_VERSION;
+  else
+    return new PwgError(403, 'Forbidden');
+}
+
+/**
+ * returns general informations (web service method)
+ */
+function ws_getInfos($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(403, 'Forbidden');
+  }
+
+  $infos['version'] = PHPWG_VERSION;
+
+  $query = 'SELECT COUNT(*) FROM '.IMAGES_TABLE.';';
+  list($infos['nb_elements']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.';';
+  list($infos['nb_categories']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NULL;';
+  list($infos['nb_virtual']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.CATEGORIES_TABLE.' WHERE dir IS NOT NULL;';
+  list($infos['nb_physical']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.IMAGE_CATEGORY_TABLE.';';
+  list($infos['nb_image_category']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.TAGS_TABLE.';';
+  list($infos['nb_tags']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.IMAGE_TAG_TABLE.';';
+  list($infos['nb_image_tag']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.USERS_TABLE.';';
+  list($infos['nb_users']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.GROUPS_TABLE.';';
+  list($infos['nb_groups']) = pwg_db_fetch_row(pwg_query($query));
+
+  $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.';';
+  list($infos['nb_comments']) = pwg_db_fetch_row(pwg_query($query));
+
+  // first element
+  if ($infos['nb_elements'] > 0)
+  {
+    $query = 'SELECT MIN(date_available) FROM '.IMAGES_TABLE.';';
+    list($infos['first_date']) = pwg_db_fetch_row(pwg_query($query));
+  }
+
+  // unvalidated comments
+  if ($infos['nb_comments'] > 0)
+  {
+    $query = 'SELECT COUNT(*) FROM '.COMMENTS_TABLE.' WHERE validated=\'false\';';
+    list($infos['nb_unvalidated_comments']) = pwg_db_fetch_row(pwg_query($query));
+  }
+
+  foreach ($infos as $name => $value)
+  {
+    $output[] = array(
+      'name' => $name,
+      'value' => $value,
+    );
+  }
+
+  return array('infos' => new PwgNamedArray($output, 'item'));
+}
+
+function ws_caddie_add($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+  $params['image_id'] = array_map( 'intval',$params['image_id'] );
+  if ( empty($params['image_id']) )
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+  global $user;
+  $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.' LEFT JOIN '.CADDIE_TABLE.' ON id=element_id AND user_id='.$user['id'].'
+  WHERE id IN ('.implode(',',$params['image_id']).')
+    AND element_id IS NULL';
+  $datas = array();
+  foreach ( array_from_query($query, 'id') as $id )
+  {
+    array_push($datas, array('element_id'=>$id, 'user_id'=>$user['id']) );
+  }
+  if (count($datas))
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+    mass_inserts(CADDIE_TABLE, array('element_id','user_id'), $datas);
+  }
+  return count($datas);
+}
+
+/**
+ * returns images per category (web service method)
+ */
+function ws_categories_getImages($params, &$service)
+{
+  @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+  global $user, $conf;
+
+  $images = array();
+
+  //------------------------------------------------- get the related categories
+  $where_clauses = array();
+  foreach($params['cat_id'] as $cat_id)
+  {
+    $cat_id = (int)$cat_id;
+    if ($cat_id<=0)
+      continue;
+    if ($params['recursive'])
+    {
+      $where_clauses[] = 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.$cat_id.'(,|$)\'';
+    }
+    else
+    {
+      $where_clauses[] = 'id='.$cat_id;
+    }
+  }
+  if (!empty($where_clauses))
+  {
+    $where_clauses = array( '('.
+    implode('
+    OR ', $where_clauses) . ')'
+      );
+  }
+  $where_clauses[] = get_sql_condition_FandF(
+        array('forbidden_categories' => 'id'),
+        NULL, true
+      );
+
+  $query = '
+SELECT id, name, permalink, image_order
+  FROM '.CATEGORIES_TABLE.'
+  WHERE '. implode('
+    AND ', $where_clauses);
+  $result = pwg_query($query);
+  $cats = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $row['id'] = (int)$row['id'];
+    $cats[ $row['id'] ] = $row;
+  }
+
+  //-------------------------------------------------------- get the images
+  if ( !empty($cats) )
+  {
+    $where_clauses = ws_std_image_sql_filter( $params, 'i.' );
+    $where_clauses[] = 'category_id IN ('
+      .implode(',', array_keys($cats) )
+      .')';
+    $where_clauses[] = get_sql_condition_FandF( array(
+          'visible_images' => 'i.id'
+        ), null, true
+      );
+
+    $order_by = ws_std_image_sql_order($params, 'i.');
+    if ( empty($order_by)
+          and count($params['cat_id'])==1
+          and isset($cats[ $params['cat_id'][0] ]['image_order'])
+        )
+    {
+      $order_by = $cats[ $params['cat_id'][0] ]['image_order'];
+    }
+    $order_by = empty($order_by) ? $conf['order_by'] : 'ORDER BY '.$order_by;
+
+    $query = '
+SELECT i.*, GROUP_CONCAT(category_id) AS cat_ids
+  FROM '.IMAGES_TABLE.' i
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON i.id=image_id
+  WHERE '. implode('
+    AND ', $where_clauses).'
+GROUP BY i.id
+'.$order_by.'
+LIMIT '.(int)$params['per_page'].' OFFSET '.(int)($params['per_page']*$params['page']);
+
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $image = array();
+      foreach ( array('id', 'width', 'height', 'hit') as $k )
+      {
+        if (isset($row[$k]))
+        {
+          $image[$k] = (int)$row[$k];
+        }
+      }
+      foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
+      {
+        $image[$k] = $row[$k];
+      }
+      $image = array_merge( $image, ws_std_get_urls($row) );
+
+      $image_cats = array();
+      foreach ( explode(',', $row['cat_ids']) as $cat_id )
+      {
+        $url = make_index_url(
+                array(
+                  'category' => $cats[$cat_id],
+                  )
+                );
+        $page_url = make_picture_url(
+                array(
+                  'category' => $cats[$cat_id],
+                  'image_id' => $row['id'],
+                  'image_file' => $row['file'],
+                  )
+                );
+        array_push( $image_cats,  array(
+              WS_XML_ATTRIBUTES => array (
+                  'id' => (int)$cat_id,
+                  'url' => $url,
+                  'page_url' => $page_url,
+                )
+            )
+          );
+      }
+
+      $image['categories'] = new PwgNamedArray(
+            $image_cats,'category', array('id','url','page_url')
+          );
+      array_push($images, $image);
+    }
+  }
+
+  return array( 'images' =>
+    array (
+      WS_XML_ATTRIBUTES =>
+        array(
+            'page' => $params['page'],
+            'per_page' => $params['per_page'],
+            'count' => count($images)
+          ),
+       WS_XML_CONTENT => new PwgNamedArray($images, 'image',
+          ws_std_get_image_xml_attributes() )
+      )
+    );
+}
+
+
+/**
+ * create a tree from a flat list of categories, no recursivity for high speed
+ */
+function categories_flatlist_to_tree($categories)
+{
+  $tree = array();
+  $key_of_cat = array();
+
+  foreach ($categories as $key => &$node)
+  {
+    $key_of_cat[$node['id']] = $key;
+
+    if (!isset($node['id_uppercat']))
+    {
+      $tree[$key] = &$node;
+    }
+    else
+    {
+      if (!isset($categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories']))
+      {
+        $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'] = array();
+      }
+
+      $categories[ $key_of_cat[ $node['id_uppercat'] ] ]['sub_categories'][$key] = &$node;
+    }
+  }
+
+  return $tree;
+}
+
+/**
+ * returns a list of categories (web service method)
+ */
+function ws_categories_getList($params, &$service)
+{
+  global $user,$conf;
+
+  if ($params['tree_output'])
+  {
+    if (!isset($_GET['format']) or !in_array($_GET['format'], array('php', 'json')))
+    {
+      // the algorithm used to build a tree from a flat list of categories
+      // keeps original array keys, which is not compatible with
+      // PwgNamedArray.
+      //
+      // PwgNamedArray is useful to define which data is an attribute and
+      // which is an element in the XML output. The "hierarchy" output is
+      // only compatible with json/php output.
+
+      return new PwgError(405, "The tree_output option is only compatible with json/php output formats");
+    }
+  }
+
+  $where = array('1=1');
+  $join_type = 'INNER';
+  $join_user = $user['id'];
+
+  if (!$params['recursive'])
+  {
+    if ($params['cat_id']>0)
+      $where[] = '(id_uppercat='.(int)($params['cat_id']).'
+    OR id='.(int)($params['cat_id']).')';
+    else
+      $where[] = 'id_uppercat IS NULL';
+  }
+  else if ($params['cat_id']>0)
+  {
+    $where[] = 'uppercats '.DB_REGEX_OPERATOR.' \'(^|,)'.
+      (int)($params['cat_id'])
+      .'(,|$)\'';
+  }
+
+  if ($params['public'])
+  {
+    $where[] = 'status = "public"';
+    $where[] = 'visible = "true"';
+
+    $join_user = $conf['guest_id'];
+  }
+  elseif (is_admin())
+  {
+    // in this very specific case, we don't want to hide empty
+    // categories. Function calculate_permissions will only return
+    // categories that are either locked or private and not permitted
+    //
+    // calculate_permissions does not consider empty categories as forbidden
+    $forbidden_categories = calculate_permissions($user['id'], $user['status']);
+    $where[]= 'id NOT IN ('.$forbidden_categories.')';
+    $join_type = 'LEFT';
+  }
+
+  $query = '
+SELECT id, name, permalink, uppercats, global_rank, id_uppercat,
+    comment,
+    nb_images, count_images AS total_nb_images,
+    representative_picture_id, user_representative_picture_id, count_images, count_categories,
+    date_last, max_date_last, count_categories AS nb_categories
+  FROM '.CATEGORIES_TABLE.'
+   '.$join_type.' JOIN '.USER_CACHE_CATEGORIES_TABLE.' ON id=cat_id AND user_id='.$join_user.'
+  WHERE '. implode('
+    AND ', $where);
+
+  $result = pwg_query($query);
+
+  // management of the album thumbnail -- starts here
+  $image_ids = array();
+  $categories = array();
+  $user_representative_updates_for = array();
+  // management of the album thumbnail -- stops here
+
+  $cats = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $row['url'] = make_index_url(
+        array(
+          'category' => $row
+          )
+      );
+    foreach( array('id','nb_images','total_nb_images','nb_categories') as $key)
+    {
+      $row[$key] = (int)$row[$key];
+    }
+
+    if ($params['fullname'])
+    {
+      $row['name'] = strip_tags(get_cat_display_name_cache($row['uppercats'], null, false));
+    }
+    else
+    {
+      $row['name'] = strip_tags(
+        trigger_event(
+          'render_category_name',
+          $row['name'],
+          'ws_categories_getList'
+          )
+        );
+    }
+
+    $row['comment'] = strip_tags(
+      trigger_event(
+        'render_category_description',
+        $row['comment'],
+        'ws_categories_getList'
+        )
+      );
+
+    // management of the album thumbnail -- starts here
+    //
+    // on branch 2.3, the algorithm is duplicated from
+    // include/category_cats, but we should use a common code for Piwigo 2.4
+    //
+    // warning : if the API method is called with $params['public'], the
+    // album thumbnail may be not accurate. The thumbnail can be viewed by
+    // the connected user, but maybe not by the guest. Changing the
+    // filtering method would be too complicated for now. We will simply
+    // avoid to persist the user_representative_picture_id in the database
+    // if $params['public']
+    if (!empty($row['user_representative_picture_id']))
+    {
+      $image_id = $row['user_representative_picture_id'];
+    }
+    else if (!empty($row['representative_picture_id']))
+    { // if a representative picture is set, it has priority
+      $image_id = $row['representative_picture_id'];
+    }
+    else if ($conf['allow_random_representative'])
+    {
+      // searching a random representant among elements in sub-categories
+      $image_id = get_random_image_in_category($row);
+    }
+    else
+    { // searching a random representant among representant of sub-categories
+      if ($row['count_categories']>0 and $row['count_images']>0)
+      {
+        $query = '
+  SELECT representative_picture_id
+    FROM '.CATEGORIES_TABLE.' INNER JOIN '.USER_CACHE_CATEGORIES_TABLE.'
+    ON id = cat_id and user_id = '.$user['id'].'
+    WHERE uppercats LIKE \''.$row['uppercats'].',%\'
+      AND representative_picture_id IS NOT NULL'
+          .get_sql_condition_FandF
+          (
+            array
+            (
+              'visible_categories' => 'id',
+              ),
+            "\n  AND"
+            ).'
+    ORDER BY '.DB_RANDOM_FUNCTION.'()
+    LIMIT 1
+  ;';
+        $subresult = pwg_query($query);
+        if (pwg_db_num_rows($subresult) > 0)
+        {
+          list($image_id) = pwg_db_fetch_row($subresult);
+        }
+      }
+    }
+
+    if (isset($image_id))
+    {
+      if ($conf['representative_cache_on_subcats'] and $row['user_representative_picture_id'] != $image_id)
+      {
+        $user_representative_updates_for[ $user['id'].'#'.$row['id'] ] = $image_id;
+      }
+
+      $row['representative_picture_id'] = $image_id;
+      array_push($image_ids, $image_id);
+      array_push($categories, $row);
+    }
+    unset($image_id);
+    // management of the album thumbnail -- stops here
+
+
+    array_push($cats, $row);
+  }
+  usort($cats, 'global_rank_compare');
+
+  // management of the album thumbnail -- starts here
+  if (count($categories) > 0)
+  {
+    $thumbnail_src_of = array();
+    $new_image_ids = array();
+
+    $query = '
+SELECT id, path, representative_ext, level
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $image_ids).')
+;';
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      if ($row['level'] <= $user['level'])
+      {
+        $thumbnail_src_of[$row['id']] = DerivativeImage::thumb_url($row);
+      }
+      else
+      {
+        // problem: we must not display the thumbnail of a photo which has a
+        // higher privacy level than user privacy level
+        //
+        // * what is the represented category?
+        // * find a random photo matching user permissions
+        // * register it at user_representative_picture_id
+        // * set it as the representative_picture_id for the category
+
+        foreach ($categories as &$category)
+        {
+          if ($row['id'] == $category['representative_picture_id'])
+          {
+            // searching a random representant among elements in sub-categories
+            $image_id = get_random_image_in_category($category);
+
+            if (isset($image_id) and !in_array($image_id, $image_ids))
+            {
+              array_push($new_image_ids, $image_id);
+            }
+
+            if ($conf['representative_cache_on_level'])
+            {
+              $user_representative_updates_for[ $user['id'].'#'.$category['id'] ] = $image_id;
+            }
+
+            $category['representative_picture_id'] = $image_id;
+          }
+        }
+        unset($category);
+      }
+    }
+
+    if (count($new_image_ids) > 0)
+    {
+      $query = '
+SELECT id, path, representative_ext
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $new_image_ids).')
+;';
+      $result = pwg_query($query);
+      while ($row = pwg_db_fetch_assoc($result))
+      {
+        $thumbnail_src_of[$row['id']] = DerivativeImage::thumb_url($row);
+      }
+    }
+  }
+
+  // compared to code in include/category_cats, we only persist the new
+  // user_representative if we have used $user['id'] and not the guest id,
+  // or else the real guest may see thumbnail that he should not
+  if (!$params['public'] and count($user_representative_updates_for))
+  {
+    $updates = array();
+
+    foreach ($user_representative_updates_for as $user_cat => $image_id)
+    {
+      list($user_id, $cat_id) = explode('#', $user_cat);
+
+      array_push(
+        $updates,
+        array(
+          'user_id' => $user_id,
+          'cat_id' => $cat_id,
+          'user_representative_picture_id' => $image_id,
+          )
+        );
+    }
+
+    mass_updates(
+      USER_CACHE_CATEGORIES_TABLE,
+      array(
+        'primary' => array('user_id', 'cat_id'),
+        'update'  => array('user_representative_picture_id')
+        ),
+      $updates
+      );
+  }
+
+  foreach ($cats as &$cat)
+  {
+    foreach ($categories as $category)
+    {
+      if ($category['id'] == $cat['id'])
+      {
+        $cat['tn_url'] = $thumbnail_src_of[$category['representative_picture_id']];
+      }
+    }
+    // we don't want them in the output
+    unset($cat['user_representative_picture_id']);
+    unset($cat['count_images']);
+    unset($cat['count_categories']);
+  }
+  unset($cat);
+  // management of the album thumbnail -- stops here
+
+  if ($params['tree_output'])
+  {
+    return categories_flatlist_to_tree($cats);
+  }
+  else
+  {
+    return array(
+      'categories' => new PwgNamedArray(
+        $cats,
+        'category',
+        array(
+          'id',
+          'url',
+          'nb_images',
+          'total_nb_images',
+          'nb_categories',
+          'date_last',
+          'max_date_last',
+          )
+        )
+      );
+  }
+}
+
+/**
+ * returns the list of categories as you can see them in administration (web
+ * service method).
+ *
+ * Only admin can run this method and permissions are not taken into
+ * account.
+ */
+function ws_categories_getAdminList($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $query = '
+SELECT
+    category_id,
+    COUNT(*) AS counter
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  GROUP BY category_id
+;';
+  $nb_images_of = simple_hash_from_query($query, 'category_id', 'counter');
+
+  $query = '
+SELECT
+    id,
+    name,
+    comment,
+    uppercats,
+    global_rank
+  FROM '.CATEGORIES_TABLE.'
+;';
+  $result = pwg_query($query);
+  $cats = array();
+
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $id = $row['id'];
+    $row['nb_images'] = isset($nb_images_of[$id]) ? $nb_images_of[$id] : 0;
+    $row['name'] = strip_tags(
+      trigger_event(
+        'render_category_name',
+        $row['name'],
+        'ws_categories_getAdminList'
+        )
+      );
+    $row['comment'] = strip_tags(
+      trigger_event(
+        'render_category_description',
+        $row['comment'],
+        'ws_categories_getAdminList'
+        )
+      );
+    array_push($cats, $row);
+  }
+
+  usort($cats, 'global_rank_compare');
+  return array(
+    'categories' => new PwgNamedArray(
+      $cats,
+      'category',
+      array(
+        'id',
+        'nb_images',
+        'name',
+        'uppercats',
+        'global_rank',
+        )
+      )
+    );
+}
+
+/**
+ * returns detailed information for an element (web service method)
+ */
+function ws_images_addComment($params, &$service)
+{
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+  $params['image_id'] = (int)$params['image_id'];
+  $query = '
+SELECT DISTINCT image_id
+  FROM '.IMAGE_CATEGORY_TABLE.' INNER JOIN '.CATEGORIES_TABLE.' ON category_id=id
+  WHERE commentable="true"
+    AND image_id='.$params['image_id'].
+    get_sql_condition_FandF(
+      array(
+        'forbidden_categories' => 'id',
+        'visible_categories' => 'id',
+        'visible_images' => 'image_id'
+      ),
+      ' AND'
+    );
+  if ( !pwg_db_num_rows( pwg_query( $query ) ) )
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  $comm = array(
+    'author' => trim( $params['author'] ),
+    'content' => trim( $params['content'] ),
+    'image_id' => $params['image_id'],
+   );
+
+  include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+  $comment_action = insert_user_comment(
+      $comm, $params['key'], $infos
+    );
+
+  switch ($comment_action)
+  {
+    case 'reject':
+      array_push($infos, l10n('Your comment has NOT been registered because it did not pass the validation rules') );
+      return new PwgError(403, implode("; ", $infos) );
+    case 'validate':
+    case 'moderate':
+      $ret = array(
+          'id' => $comm['id'],
+          'validation' => $comment_action=='validate',
+        );
+      return new PwgNamedStruct(
+          'comment',
+          $ret,
+          null, array()
+        );
+    default:
+      return new PwgError(500, "Unknown comment action ".$comment_action );
+  }
+}
+
+/**
+ * returns detailed information for an element (web service method)
+ */
+function ws_images_getInfo($params, &$service)
+{
+  @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+  global $user, $conf;
+  $params['image_id'] = (int)$params['image_id'];
+  if ( $params['image_id']<=0 )
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  $query='
+SELECT * FROM '.IMAGES_TABLE.'
+  WHERE id='.$params['image_id'].
+    get_sql_condition_FandF(
+      array('visible_images' => 'id'),
+      ' AND'
+    ).'
+LIMIT 1';
+
+  $image_row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($image_row==null)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+  $image_row = array_merge( $image_row, ws_std_get_urls($image_row) );
+
+  //-------------------------------------------------------- related categories
+  $query = '
+SELECT id, name, permalink, uppercats, global_rank, commentable
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    INNER JOIN '.CATEGORIES_TABLE.' ON category_id = id
+  WHERE image_id = '.$image_row['id'].
+  get_sql_condition_FandF(
+      array( 'forbidden_categories' => 'category_id' ),
+      ' AND'
+    ).'
+;';
+  $result = pwg_query($query);
+  $is_commentable = false;
+  $related_categories = array();
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if ($row['commentable']=='true')
+    {
+      $is_commentable = true;
+    }
+    unset($row['commentable']);
+    $row['url'] = make_index_url(
+        array(
+          'category' => $row
+          )
+      );
+
+    $row['page_url'] = make_picture_url(
+        array(
+          'image_id' => $image_row['id'],
+          'image_file' => $image_row['file'],
+          'category' => $row
+          )
+      );
+    $row['id']=(int)$row['id'];
+    array_push($related_categories, $row);
+  }
+  usort($related_categories, 'global_rank_compare');
+  if ( empty($related_categories) )
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  //-------------------------------------------------------------- related tags
+  $related_tags = get_common_tags( array($image_row['id']), -1 );
+  foreach( $related_tags as $i=>$tag)
+  {
+    $tag['url'] = make_index_url(
+        array(
+          'tags' => array($tag)
+          )
+      );
+    $tag['page_url'] = make_picture_url(
+        array(
+          'image_id' => $image_row['id'],
+          'image_file' => $image_row['file'],
+          'tags' => array($tag),
+          )
+      );
+    unset($tag['counter']);
+    $tag['id']=(int)$tag['id'];
+    $related_tags[$i]=$tag;
+  }
+  //------------------------------------------------------------- related rates
+	$rating = array('score'=>$image_row['rating_score'], 'count'=>0, 'average'=>null);
+	if (isset($rating['score']))
+	{
+		$query = '
+SELECT COUNT(rate) AS count
+     , ROUND(AVG(rate),2) AS average
+  FROM '.RATE_TABLE.'
+  WHERE element_id = '.$image_row['id'].'
+;';
+		$row = pwg_db_fetch_assoc(pwg_query($query));
+		$rating['score'] = (float)$rating['score'];
+		$rating['average'] = (float)$row['average'];
+		$rating['count'] = (int)$row['count'];
+	}
+
+  //---------------------------------------------------------- related comments
+  $related_comments = array();
+
+  $where_comments = 'image_id = '.$image_row['id'];
+  if ( !is_admin() )
+  {
+    $where_comments .= '
+    AND validated="true"';
+  }
+
+  $query = '
+SELECT COUNT(id) AS nb_comments
+  FROM '.COMMENTS_TABLE.'
+  WHERE '.$where_comments;
+  list($nb_comments) = array_from_query($query, 'nb_comments');
+  $nb_comments = (int)$nb_comments;
+
+  if ( $nb_comments>0 and $params['comments_per_page']>0 )
+  {
+    $query = '
+SELECT id, date, author, content
+  FROM '.COMMENTS_TABLE.'
+  WHERE '.$where_comments.'
+  ORDER BY date
+  LIMIT '.(int)$params['comments_per_page'].
+    ' OFFSET '.(int)($params['comments_per_page']*$params['comments_page']);
+
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $row['id']=(int)$row['id'];
+      array_push($related_comments, $row);
+    }
+  }
+
+  $comment_post_data = null;
+  if ($is_commentable and
+      (!is_a_guest()
+        or (is_a_guest() and $conf['comments_forall'] )
+      )
+      )
+  {
+    $comment_post_data['author'] = stripslashes($user['username']);
+    $comment_post_data['key'] = get_ephemeral_key(2, $params['image_id']);
+  }
+
+  $ret = $image_row;
+  foreach ( array('id','width','height','hit','filesize') as $k )
+  {
+    if (isset($ret[$k]))
+    {
+      $ret[$k] = (int)$ret[$k];
+    }
+  }
+  foreach ( array('path', 'storage_category_id') as $k )
+  {
+    unset($ret[$k]);
+  }
+
+  $ret['rates'] = array( WS_XML_ATTRIBUTES => $rating );
+  $ret['categories'] = new PwgNamedArray($related_categories, 'category', array('id','url', 'page_url') );
+  $ret['tags'] = new PwgNamedArray($related_tags, 'tag', array('id','url_name','url','name','page_url') );
+  if ( isset($comment_post_data) )
+  {
+    $ret['comment_post'] = array( WS_XML_ATTRIBUTES => $comment_post_data );
+  }
+  $ret['comments'] = array(
+     WS_XML_ATTRIBUTES =>
+        array(
+          'page' => $params['comments_page'],
+          'per_page' => $params['comments_per_page'],
+          'count' => count($related_comments),
+          'nb_comments' => $nb_comments,
+        ),
+     WS_XML_CONTENT => new PwgNamedArray($related_comments, 'comment', array('id','date') )
+      );
+
+  return new PwgNamedStruct('image',$ret, null, array('name','comment') );
+}
+
+
+/**
+ * rates the image_id in the parameter
+ */
+function ws_images_Rate($params, &$service)
+{
+  $image_id = (int)$params['image_id'];
+  $query = '
+SELECT DISTINCT id FROM '.IMAGES_TABLE.'
+  INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
+  WHERE id='.$image_id
+  .get_sql_condition_FandF(
+    array(
+        'forbidden_categories' => 'category_id',
+        'forbidden_images' => 'id',
+      ),
+    '    AND'
+    ).'
+    LIMIT 1';
+  if ( pwg_db_num_rows( pwg_query($query) )==0 )
+  {
+    return new PwgError(404, "Invalid image_id or access denied" );
+  }
+  $rate = (int)$params['rate'];
+  include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+  $res = rate_picture( $image_id, $rate );
+  if ($res==false)
+  {
+    global $conf;
+    return new PwgError( 403, "Forbidden or rate not in ". implode(',',$conf['rate_items']));
+  }
+  return $res;
+}
+
+
+/**
+ * returns a list of elements corresponding to a query search
+ */
+function ws_images_search($params, &$service)
+{
+  global $page;
+  $images = array();
+  include_once( PHPWG_ROOT_PATH .'include/functions_search.inc.php' );
+  include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+
+  $where_clauses = ws_std_image_sql_filter( $params, 'i.' );
+  $order_by = ws_std_image_sql_order($params, 'i.');
+
+  $super_order_by = false;
+  if ( !empty($order_by) )
+  {
+    global $conf;
+    $conf['order_by'] = 'ORDER BY '.$order_by;
+    $super_order_by=true; // quick_search_result might be faster
+  }
+
+  $search_result = get_quick_search_results($params['query'],
+      $super_order_by,
+      implode(',', $where_clauses)
+    );
+
+  $image_ids = array_slice(
+      $search_result['items'],
+      $params['page']*$params['per_page'],
+      $params['per_page']
+    );
+
+  if ( count($image_ids) )
+  {
+    $query = '
+SELECT * FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $image_ids).')';
+
+    $image_ids = array_flip($image_ids);
+    $result = pwg_query($query);
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $image = array();
+      foreach ( array('id', 'width', 'height', 'hit') as $k )
+      {
+        if (isset($row[$k]))
+        {
+          $image[$k] = (int)$row[$k];
+        }
+      }
+      foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
+      {
+        $image[$k] = $row[$k];
+      }
+      $image = array_merge( $image, ws_std_get_urls($row) );
+      $images[$image_ids[$image['id']]] = $image;
+    }
+    ksort($images, SORT_NUMERIC);
+    $images = array_values($images);
+  }
+
+
+  return array( 'images' =>
+    array (
+      WS_XML_ATTRIBUTES =>
+        array(
+            'page' => $params['page'],
+            'per_page' => $params['per_page'],
+            'count' => count($images)
+          ),
+       WS_XML_CONTENT => new PwgNamedArray($images, 'image',
+          ws_std_get_image_xml_attributes() )
+      )
+    );
+}
+
+function ws_images_setPrivacyLevel($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+  $params['image_id'] = array_map( 'intval',$params['image_id'] );
+  if ( empty($params['image_id']) )
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+  global $conf;
+  if ( !in_array( (int)$params['level'], $conf['available_permission_levels']) )
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid level");
+  }
+
+  $query = '
+UPDATE '.IMAGES_TABLE.'
+  SET level='.(int)$params['level'].'
+  WHERE id IN ('.implode(',',$params['image_id']).')';
+  $result = pwg_query($query);
+  $affected_rows = pwg_db_changes($result);
+  if ($affected_rows)
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+    invalidate_user_cache();
+  }
+  return $affected_rows;
+}
+
+function ws_images_setRank($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  // is the image_id valid?
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  // is the category valid?
+  $params['category_id'] = (int)$params['category_id'];
+  if ($params['category_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
+  }
+
+  // is the rank valid?
+  $params['rank'] = (int)$params['rank'];
+  if ($params['rank'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid rank");
+  }
+
+  // does the image really exist?
+  $query='
+SELECT
+    *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+
+  $image_row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($image_row == null)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+
+  // is the image associated to this category?
+  $query = '
+SELECT
+    image_id,
+    category_id,
+    rank
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id = '.$params['image_id'].'
+    AND category_id = '.$params['category_id'].'
+;';
+  $category_row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($category_row == null)
+  {
+    return new PwgError(404, "This image is not associated to this category");
+  }
+
+  // what is the current higher rank for this category?
+  $query = '
+SELECT
+    MAX(rank) AS max_rank
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE category_id = '.$params['category_id'].'
+;';
+  $result = pwg_query($query);
+  $row = pwg_db_fetch_assoc($result);
+
+  if (is_numeric($row['max_rank']))
+  {
+    if ($params['rank'] > $row['max_rank'])
+    {
+      $params['rank'] = $row['max_rank'] + 1;
+    }
+  }
+  else
+  {
+    $params['rank'] = 1;
+  }
+
+  // update rank for all other photos in the same category
+  $query = '
+UPDATE '.IMAGE_CATEGORY_TABLE.'
+  SET rank = rank + 1
+  WHERE category_id = '.$params['category_id'].'
+    AND rank IS NOT NULL
+    AND rank >= '.$params['rank'].'
+;';
+  pwg_query($query);
+
+  // set the new rank for the photo
+  $query = '
+UPDATE '.IMAGE_CATEGORY_TABLE.'
+  SET rank = '.$params['rank'].'
+  WHERE image_id = '.$params['image_id'].'
+    AND category_id = '.$params['category_id'].'
+;';
+  pwg_query($query);
+
+  // return data for client
+  return array(
+    'image_id' => $params['image_id'],
+    'category_id' => $params['category_id'],
+    'rank' => $params['rank'],
+    );
+}
+
+function ws_images_add_chunk($params, &$service)
+{
+  global $conf;
+
+  // data
+  // original_sum
+  // type {thumb, file, high}
+  // position
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  foreach ($params as $param_key => $param_value) {
+    if ('data' == $param_key) {
+      continue;
+    }
+
+    ws_logfile(
+      sprintf(
+        '[ws_images_add_chunk] input param "%s" : "%s"',
+        $param_key,
+        is_null($param_value) ? 'NULL' : $param_value
+        )
+      );
+  }
+
+  $upload_dir = $conf['upload_dir'].'/buffer';
+
+  // create the upload directory tree if not exists
+  if (!is_dir($upload_dir)) {
+    umask(0000);
+    if (!@mkdir($upload_dir, 0777, true))
+    {
+      return new PwgError(500, 'error during buffer directory creation');
+    }
+  }
+
+  if (!is_writable($upload_dir))
+  {
+    // last chance to make the directory writable
+    @chmod($upload_dir, 0777);
+
+    if (!is_writable($upload_dir))
+    {
+      return new PwgError(500, 'buffer directory has no write access');
+    }
+  }
+
+  secure_directory($upload_dir);
+
+  $filename = sprintf(
+    '%s-%s-%05u.block',
+    $params['original_sum'],
+    $params['type'],
+    $params['position']
+    );
+
+  ws_logfile('[ws_images_add_chunk] data length : '.strlen($params['data']));
+
+  $bytes_written = file_put_contents(
+    $upload_dir.'/'.$filename,
+    base64_decode($params['data'])
+    );
+
+  if (false === $bytes_written) {
+    return new PwgError(
+      500,
+      'an error has occured while writting chunk '.$params['position'].' for '.$params['type']
+      );
+  }
+}
+
+function merge_chunks($output_filepath, $original_sum, $type)
+{
+  global $conf;
+
+  ws_logfile('[merge_chunks] input parameter $output_filepath : '.$output_filepath);
+
+  if (is_file($output_filepath))
+  {
+    unlink($output_filepath);
+
+    if (is_file($output_filepath))
+    {
+      return new PwgError(500, '[merge_chunks] error while trying to remove existing '.$output_filepath);
+    }
+  }
+
+  $upload_dir = $conf['upload_dir'].'/buffer';
+  $pattern = '/'.$original_sum.'-'.$type.'/';
+  $chunks = array();
+
+  if ($handle = opendir($upload_dir))
+  {
+    while (false !== ($file = readdir($handle)))
+    {
+      if (preg_match($pattern, $file))
+      {
+        ws_logfile($file);
+        array_push($chunks, $upload_dir.'/'.$file);
+      }
+    }
+    closedir($handle);
+  }
+
+  sort($chunks);
+
+  if (function_exists('memory_get_usage')) {
+    ws_logfile('[merge_chunks] memory_get_usage before loading chunks: '.memory_get_usage());
+  }
+
+  $i = 0;
+
+  foreach ($chunks as $chunk)
+  {
+    $string = file_get_contents($chunk);
+
+    if (function_exists('memory_get_usage')) {
+      ws_logfile('[merge_chunks] memory_get_usage on chunk '.++$i.': '.memory_get_usage());
+    }
+
+    if (!file_put_contents($output_filepath, $string, FILE_APPEND))
+    {
+      return new PwgError(500, '[merge_chunks] error while writting chunks for '.$output_filepath);
+    }
+
+    unlink($chunk);
+  }
+
+  if (function_exists('memory_get_usage')) {
+    ws_logfile('[merge_chunks] memory_get_usage after loading chunks: '.memory_get_usage());
+  }
+}
+
+/**
+ * Function introduced for Piwigo 2.4 and the new "multiple size"
+ * (derivatives) feature. As we only need the biggest sent photo as
+ * "original", we remove chunks for smaller sizes. We can't make it earlier
+ * in ws_images_add_chunk because at this moment we don't know which $type
+ * will be the biggest (we could remove the thumb, but let's use the same
+ * algorithm)
+ */
+function remove_chunks($original_sum, $type)
+{
+  global $conf;
+
+  $upload_dir = $conf['upload_dir'].'/buffer';
+  $pattern = '/'.$original_sum.'-'.$type.'/';
+  $chunks = array();
+
+  if ($handle = opendir($upload_dir))
+  {
+    while (false !== ($file = readdir($handle)))
+    {
+      if (preg_match($pattern, $file))
+      {
+        array_push($chunks, $upload_dir.'/'.$file);
+      }
+    }
+    closedir($handle);
+  }
+
+  foreach ($chunks as $chunk)
+  {
+    unlink($chunk);
+  }
+}
+
+function ws_images_addFile($params, &$service)
+{
+  ws_logfile(__FUNCTION__.', input :  '.var_export($params, true));
+  // image_id
+  // type {thumb, file, high}
+  // sum -> not used currently (Piwigo 2.4)
+
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  //
+  // what is the path and other infos about the photo?
+  //
+  $query = '
+SELECT
+    path,
+    file,
+    md5sum,
+    width,
+    height,
+    filesize
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+  $image = pwg_db_fetch_assoc(pwg_query($query));
+
+  if ($image == null)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+
+  // since Piwigo 2.4 and derivatives, we do not take the imported "thumb"
+  // into account
+  if ('thumb' == $params['type'])
+  {
+    remove_chunks($image['md5sum'], $type);
+    return true;
+  }
+
+  // since Piwigo 2.4 and derivatives, we only care about the "original"
+  $original_type = 'file';
+  if ('high' == $params['type'])
+  {
+    $original_type = 'high';
+  }
+
+  $file_path = $conf['upload_dir'].'/buffer/'.$image['md5sum'].'-original';
+
+  merge_chunks($file_path, $image['md5sum'], $original_type);
+  chmod($file_path, 0644);
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+  // if we receive the "file", we only update the original if the "file" is
+  // bigger than current original
+  if ('file' == $params['type'])
+  {
+    $do_update = false;
+
+    $infos = pwg_image_infos($file_path);
+
+    foreach (array('width', 'height', 'filesize') as $image_info)
+    {
+      if ($infos[$image_info] > $image[$image_info])
+      {
+        $do_update = true;
+      }
+    }
+
+    if (!$do_update)
+    {
+      unlink($file_path);
+      return true;
+    }
+  }
+
+  $image_id = add_uploaded_file(
+    $file_path,
+    $image['file'],
+    null,
+    null,
+    $params['image_id'],
+    $image['md5sum'] // we force the md5sum to remain the same
+    );
+}
+
+function ws_images_add($params, &$service)
+{
+  global $conf, $user;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  foreach ($params as $param_key => $param_value) {
+    ws_logfile(
+      sprintf(
+        '[pwg.images.add] input param "%s" : "%s"',
+        $param_key,
+        is_null($param_value) ? 'NULL' : $param_value
+        )
+      );
+  }
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] > 0)
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+    $query='
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+
+    $image_row = pwg_db_fetch_assoc(pwg_query($query));
+    if ($image_row == null)
+    {
+      return new PwgError(404, "image_id not found");
+    }
+  }
+
+  // does the image already exists ?
+  if ($params['check_uniqueness'])
+  {
+    if ('md5sum' == $conf['uniqueness_mode'])
+    {
+      $where_clause = "md5sum = '".$params['original_sum']."'";
+    }
+    if ('filename' == $conf['uniqueness_mode'])
+    {
+      $where_clause = "file = '".$params['original_filename']."'";
+    }
+
+    $query = '
+SELECT
+    COUNT(*) AS counter
+  FROM '.IMAGES_TABLE.'
+  WHERE '.$where_clause.'
+;';
+    list($counter) = pwg_db_fetch_row(pwg_query($query));
+    if ($counter != 0) {
+      return new PwgError(500, 'file already exists');
+    }
+  }
+
+  // due to the new feature "derivatives" (multiple sizes) introduced for
+  // Piwigo 2.4, we only take the biggest photos sent on
+  // pwg.images.addChunk. If "high" is available we use it as "original"
+  // else we use "file".
+  remove_chunks($params['original_sum'], 'thumb');
+
+  if (isset($params['high_sum']))
+  {
+    $original_type = 'high';
+    remove_chunks($params['original_sum'], 'file');
+  }
+  else
+  {
+    $original_type = 'file';
+  }
+
+  $file_path = $conf['upload_dir'].'/buffer/'.$params['original_sum'].'-original';
+
+  merge_chunks($file_path, $params['original_sum'], $original_type);
+  chmod($file_path, 0644);
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+  $image_id = add_uploaded_file(
+    $file_path,
+    $params['original_filename'],
+    null, // categories
+    isset($params['level']) ? $params['level'] : null,
+    $params['image_id'] > 0 ? $params['image_id'] : null,
+    $params['original_sum']
+    );
+
+  $info_columns = array(
+    'name',
+    'author',
+    'comment',
+    'date_creation',
+    );
+
+  $update = array();
+
+  foreach ($info_columns as $key)
+  {
+    if (isset($params[$key]))
+    {
+      $update[$key] = $params[$key];
+    }
+  }
+
+  if (count(array_keys($update)) > 0)
+  {
+    single_update(
+      IMAGES_TABLE,
+      $update,
+      array('id' => $image_id)
+      );
+  }
+
+  $url_params = array('image_id' => $image_id);
+
+  // let's add links between the image and the categories
+  if (isset($params['categories']))
+  {
+    ws_add_image_category_relations($image_id, $params['categories']);
+
+    if (preg_match('/^\d+/', $params['categories'], $matches)) {
+      $category_id = $matches[0];
+
+      $query = '
+SELECT id, name, permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$category_id.'
+;';
+      $result = pwg_query($query);
+      $category = pwg_db_fetch_assoc($result);
+
+      $url_params['section'] = 'categories';
+      $url_params['category'] = $category;
+    }
+  }
+
+  // and now, let's create tag associations
+  if (isset($params['tag_ids']) and !empty($params['tag_ids']))
+  {
+    set_tags(
+      explode(',', $params['tag_ids']),
+      $image_id
+      );
+  }
+
+  invalidate_user_cache();
+
+  return array(
+    'image_id' => $image_id,
+    'url' => make_picture_url($url_params),
+    );
+}
+
+function ws_images_addSimple($params, &$service)
+{
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  if (!isset($_FILES['image']))
+  {
+    return new PwgError(405, "The image (file) parameter is missing");
+  }
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] > 0)
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+    $query='
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+
+    $image_row = pwg_db_fetch_assoc(pwg_query($query));
+    if ($image_row == null)
+    {
+      return new PwgError(404, "image_id not found");
+    }
+  }
+
+  // category
+  $params['category'] = (int)$params['category'];
+  if ($params['category'] <= 0 and $params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+
+  $image_id = add_uploaded_file(
+    $_FILES['image']['tmp_name'],
+    $_FILES['image']['name'],
+    $params['category'] > 0 ? array($params['category']) : null,
+    8,
+    $params['image_id'] > 0 ? $params['image_id'] : null
+    );
+
+  $info_columns = array(
+    'name',
+    'author',
+    'comment',
+    'level',
+    'date_creation',
+    );
+
+  foreach ($info_columns as $key)
+  {
+    if (isset($params[$key]))
+    {
+      $update[$key] = $params[$key];
+    }
+  }
+
+  if (count(array_keys($update)) > 0)
+  {
+    $update['id'] = $image_id;
+
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+    mass_updates(
+      IMAGES_TABLE,
+      array(
+        'primary' => array('id'),
+        'update'  => array_diff(array_keys($update), array('id'))
+        ),
+      array($update)
+      );
+  }
+
+
+  if (isset($params['tags']) and !empty($params['tags']))
+  {
+    $tag_ids = array();
+    $tag_names = explode(',', $params['tags']);
+    foreach ($tag_names as $tag_name)
+    {
+      $tag_id = tag_id_from_tag_name($tag_name);
+      array_push($tag_ids, $tag_id);
+    }
+
+    add_tags($tag_ids, array($image_id));
+  }
+
+  $url_params = array('image_id' => $image_id);
+
+  if ($params['category'] > 0)
+  {
+    $query = '
+SELECT id, name, permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$params['category'].'
+;';
+    $result = pwg_query($query);
+    $category = pwg_db_fetch_assoc($result);
+
+    $url_params['section'] = 'categories';
+    $url_params['category'] = $category;
+  }
+
+  // update metadata from the uploaded file (exif/iptc), even if the sync
+  // was already performed by add_uploaded_file().
+
+  require_once(PHPWG_ROOT_PATH.'admin/include/functions_metadata.php');
+  sync_metadata(array($image_id));
+
+  return array(
+    'image_id' => $image_id,
+    'url' => make_picture_url($url_params),
+    );
+}
+
+function ws_rates_delete($params, &$service)
+{
+  global $conf;
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, 'This method requires HTTP POST');
+  }
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $user_id = (int)$params['user_id'];
+  if ($user_id<=0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid user_id');
+  }
+
+  $query = '
+DELETE FROM '.RATE_TABLE.'
+  WHERE user_id='.$user_id;
+
+  if (!empty($params['anonymous_id']))
+  {
+    $query .= ' AND anonymous_id=\''.$params['anonymous_id'].'\'';
+  }
+
+  $changes = pwg_db_changes(pwg_query($query));
+  if ($changes)
+  {
+    include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+    update_rating_score();
+  }
+  return $changes;
+}
+
+
+/**
+ * perform a login (web service method)
+ */
+function ws_session_login($params, &$service)
+{
+  global $conf;
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+  if (try_log_user($params['username'], $params['password'],false))
+  {
+    return true;
+  }
+  return new PwgError(999, 'Invalid username/password');
+}
+
+
+/**
+ * performs a logout (web service method)
+ */
+function ws_session_logout($params, &$service)
+{
+  if (!is_a_guest())
+  {
+    logout_user();
+  }
+  return true;
+}
+
+function ws_session_getStatus($params, &$service)
+{
+  global $user;
+  $res = array();
+  $res['username'] = is_a_guest() ? 'guest' : stripslashes($user['username']);
+  foreach ( array('status', 'theme', 'language') as $k )
+  {
+    $res[$k] = $user[$k];
+  }
+  $res['pwg_token'] = get_pwg_token();
+  $res['charset'] = get_pwg_charset();
+
+  list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+  $res['current_datetime'] = $dbnow;
+
+  return $res;
+}
+
+
+/**
+ * returns a list of tags (web service method)
+ */
+function ws_tags_getList($params, &$service)
+{
+  $tags = get_available_tags();
+  if ($params['sort_by_counter'])
+  {
+    usort($tags, create_function('$a,$b', 'return -$a["counter"]+$b["counter"];') );
+  }
+  else
+  {
+    usort($tags, 'tag_alpha_compare');
+  }
+  for ($i=0; $i<count($tags); $i++)
+  {
+    $tags[$i]['id'] = (int)$tags[$i]['id'];
+    $tags[$i]['counter'] = (int)$tags[$i]['counter'];
+    $tags[$i]['url'] = make_index_url(
+        array(
+          'section'=>'tags',
+          'tags'=>array($tags[$i])
+        )
+      );
+  }
+  return array('tags' => new PwgNamedArray($tags, 'tag', array('id','url_name','url', 'name', 'counter' )) );
+}
+
+/**
+ * returns the list of tags as you can see them in administration (web
+ * service method).
+ *
+ * Only admin can run this method and permissions are not taken into
+ * account.
+ */
+function ws_tags_getAdminList($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $tags = get_all_tags();
+  return array(
+    'tags' => new PwgNamedArray(
+      $tags,
+      'tag',
+      array(
+        'name',
+        'id',
+        'url_name',
+        )
+      )
+    );
+}
+
+/**
+ * returns a list of images for tags (web service method)
+ */
+function ws_tags_getImages($params, &$service)
+{
+  @include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+  global $conf;
+
+  // first build all the tag_ids we are interested in
+  $params['tag_id'] = array_map( 'intval',$params['tag_id'] );
+  $tags = find_tags($params['tag_id'], $params['tag_url_name'], $params['tag_name']);
+  $tags_by_id = array();
+  foreach( $tags as $tag )
+  {
+    $tags['id'] = (int)$tag['id'];
+    $tags_by_id[ $tag['id'] ] = $tag;
+  }
+  unset($tags);
+  $tag_ids = array_keys($tags_by_id);
+
+
+  $where_clauses = ws_std_image_sql_filter($params);
+  if (!empty($where_clauses))
+  {
+    $where_clauses = implode( ' AND ', $where_clauses);
+  }
+  $image_ids = get_image_ids_for_tags(
+    $tag_ids,
+    $params['tag_mode_and'] ? 'AND' : 'OR',
+    $where_clauses,
+    ws_std_image_sql_order($params) );
+
+
+  $image_ids = array_slice($image_ids, (int)($params['per_page']*$params['page']), (int)$params['per_page'] );
+
+  $image_tag_map = array();
+  if ( !empty($image_ids) and !$params['tag_mode_and'] )
+  { // build list of image ids with associated tags per image
+    $query = '
+SELECT image_id, GROUP_CONCAT(tag_id) AS tag_ids
+  FROM '.IMAGE_TAG_TABLE.'
+  WHERE tag_id IN ('.implode(',',$tag_ids).') AND image_id IN ('.implode(',',$image_ids).')
+  GROUP BY image_id';
+    $result = pwg_query($query);
+    while ( $row=pwg_db_fetch_assoc($result) )
+    {
+      $row['image_id'] = (int)$row['image_id'];
+      array_push( $image_ids, $row['image_id'] );
+      $image_tag_map[ $row['image_id'] ] = explode(',', $row['tag_ids']);
+    }
+  }
+
+  $images = array();
+  if (!empty($image_ids))
+  {
+    $rank_of = array_flip($image_ids);
+    $result = pwg_query('
+SELECT * FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',',$image_ids).')');
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      $image = array();
+      $image['rank'] = $rank_of[ $row['id'] ];
+      foreach ( array('id', 'width', 'height', 'hit') as $k )
+      {
+        if (isset($row[$k]))
+        {
+          $image[$k] = (int)$row[$k];
+        }
+      }
+      foreach ( array('file', 'name', 'comment', 'date_creation', 'date_available') as $k )
+      {
+        $image[$k] = $row[$k];
+      }
+      $image = array_merge( $image, ws_std_get_urls($row) );
+
+      $image_tag_ids = ($params['tag_mode_and']) ? $tag_ids : $image_tag_map[$image['id']];
+      $image_tags = array();
+      foreach ($image_tag_ids as $tag_id)
+      {
+        $url = make_index_url(
+                 array(
+                  'section'=>'tags',
+                  'tags'=> array($tags_by_id[$tag_id])
+                )
+              );
+        $page_url = make_picture_url(
+                 array(
+                  'section'=>'tags',
+                  'tags'=> array($tags_by_id[$tag_id]),
+                  'image_id' => $row['id'],
+                  'image_file' => $row['file'],
+                )
+              );
+        array_push($image_tags, array(
+                'id' => (int)$tag_id,
+                'url' => $url,
+                'page_url' => $page_url,
+              )
+            );
+      }
+      $image['tags'] = new PwgNamedArray($image_tags, 'tag',
+              array('id','url_name','url','page_url')
+            );
+      array_push($images, $image);
+    }
+    usort($images, 'rank_compare');
+    unset($rank_of);
+  }
+
+  return array( 'images' =>
+    array (
+      WS_XML_ATTRIBUTES =>
+        array(
+            'page' => $params['page'],
+            'per_page' => $params['per_page'],
+            'count' => count($images)
+          ),
+       WS_XML_CONTENT => new PwgNamedArray($images, 'image',
+          ws_std_get_image_xml_attributes() )
+      )
+    );
+}
+
+function ws_categories_add($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+  $creation_output = create_virtual_category(
+    $params['name'],
+    $params['parent']
+    );
+
+  if (isset($creation_output['error']))
+  {
+    return new PwgError(500, $creation_output['error']);
+  }
+
+  invalidate_user_cache();
+
+  return $creation_output;
+}
+
+function ws_tags_add($params, &$service)
+{
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+  $creation_output = create_tag($params['name']);
+
+  if (isset($creation_output['error']))
+  {
+    return new PwgError(500, $creation_output['error']);
+  }
+
+  return $creation_output;
+}
+
+function ws_images_exist($params, &$service)
+{
+  ws_logfile(__FUNCTION__.' '.var_export($params, true));
+
+  global $conf;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  $split_pattern = '/[\s,;\|]/';
+
+  if ('md5sum' == $conf['uniqueness_mode'])
+  {
+    // search among photos the list of photos already added, based on md5sum
+    // list
+    $md5sums = preg_split(
+      $split_pattern,
+      $params['md5sum_list'],
+      -1,
+      PREG_SPLIT_NO_EMPTY
+    );
+
+    $query = '
+SELECT
+    id,
+    md5sum
+  FROM '.IMAGES_TABLE.'
+  WHERE md5sum IN (\''.implode("','", $md5sums).'\')
+;';
+    $id_of_md5 = simple_hash_from_query($query, 'md5sum', 'id');
+
+    $result = array();
+
+    foreach ($md5sums as $md5sum)
+    {
+      $result[$md5sum] = null;
+      if (isset($id_of_md5[$md5sum]))
+      {
+        $result[$md5sum] = $id_of_md5[$md5sum];
+      }
+    }
+  }
+
+  if ('filename' == $conf['uniqueness_mode'])
+  {
+    // search among photos the list of photos already added, based on
+    // filename list
+    $filenames = preg_split(
+      $split_pattern,
+      $params['filename_list'],
+      -1,
+      PREG_SPLIT_NO_EMPTY
+    );
+
+    $query = '
+SELECT
+    id,
+    file
+  FROM '.IMAGES_TABLE.'
+  WHERE file IN (\''.implode("','", $filenames).'\')
+;';
+    $id_of_filename = simple_hash_from_query($query, 'file', 'id');
+
+    $result = array();
+
+    foreach ($filenames as $filename)
+    {
+      $result[$filename] = null;
+      if (isset($id_of_filename[$filename]))
+      {
+        $result[$filename] = $id_of_filename[$filename];
+      }
+    }
+  }
+
+  return $result;
+}
+
+function ws_images_checkFiles($params, &$service)
+{
+  ws_logfile(__FUNCTION__.', input :  '.var_export($params, true));
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  // input parameters
+  //
+  // image_id
+  // thumbnail_sum
+  // file_sum
+  // high_sum
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  $query = '
+SELECT
+    path
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result) == 0)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+  list($path) = pwg_db_fetch_row($result);
+
+  $ret = array();
+
+  if (isset($params['thumbnail_sum']))
+  {
+    // We always say the thumbnail is equal to create no reaction on the
+    // other side. Since Piwigo 2.4 and derivatives, the thumbnails and web
+    // sizes are always generated by Piwigo
+    $ret['thumbnail'] = 'equals';
+  }
+
+  if (isset($params['high_sum']))
+  {
+    $ret['file'] = 'equals';
+    $compare_type = 'high';
+  }
+  elseif (isset($params['file_sum']))
+  {
+    $compare_type = 'file';
+  }
+
+  if (isset($compare_type))
+  {
+    ws_logfile(__FUNCTION__.', md5_file($path) = '.md5_file($path));
+    if (md5_file($path) != $params[$compare_type.'_sum'])
+    {
+      $ret[$compare_type] = 'differs';
+    }
+    else
+    {
+      $ret[$compare_type] = 'equals';
+    }
+  }
+
+  ws_logfile(__FUNCTION__.', output :  '.var_export($ret, true));
+
+  return $ret;
+}
+
+function ws_images_setInfo($params, &$service)
+{
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+  $query='
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+
+  $image_row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($image_row == null)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+
+  // database registration
+  $update = array();
+
+  $info_columns = array(
+    'name',
+    'author',
+    'comment',
+    'level',
+    'date_creation',
+    );
+
+  foreach ($info_columns as $key)
+  {
+    if (isset($params[$key]))
+    {
+      if ('fill_if_empty' == $params['single_value_mode'])
+      {
+        if (empty($image_row[$key]))
+        {
+          $update[$key] = $params[$key];
+        }
+      }
+      elseif ('replace' == $params['single_value_mode'])
+      {
+        $update[$key] = $params[$key];
+      }
+      else
+      {
+        return new PwgError(
+          500,
+          '[ws_images_setInfo]'
+          .' invalid parameter single_value_mode "'.$params['single_value_mode'].'"'
+          .', possible values are {fill_if_empty, replace}.'
+          );
+      }
+    }
+  }
+
+  if (isset($params['file']))
+  {
+    if (!empty($image_row['storage_category_id']))
+    {
+      return new PwgError(500, '[ws_images_setInfo] updating "file" is forbidden on photos added by synchronization');
+    }
+
+    $update['file'] = $params['file'];
+  }
+
+  if (count(array_keys($update)) > 0)
+  {
+    $update['id'] = $params['image_id'];
+
+    mass_updates(
+      IMAGES_TABLE,
+      array(
+        'primary' => array('id'),
+        'update'  => array_diff(array_keys($update), array('id'))
+        ),
+      array($update)
+      );
+  }
+
+  if (isset($params['categories']))
+  {
+    ws_add_image_category_relations(
+      $params['image_id'],
+      $params['categories'],
+      ('replace' == $params['multiple_value_mode'] ? true : false)
+      );
+  }
+
+  // and now, let's create tag associations
+  if (isset($params['tag_ids']))
+  {
+    $tag_ids = explode(',', $params['tag_ids']);
+
+    if ('replace' == $params['multiple_value_mode'])
+    {
+      set_tags(
+        $tag_ids,
+        $params['image_id']
+        );
+    }
+    elseif ('append' == $params['multiple_value_mode'])
+    {
+      add_tags(
+        $tag_ids,
+        array($params['image_id'])
+        );
+    }
+    else
+    {
+      return new PwgError(
+        500,
+        '[ws_images_setInfo]'
+        .' invalid parameter multiple_value_mode "'.$params['multiple_value_mode'].'"'
+        .', possible values are {replace, append}.'
+        );
+    }
+  }
+
+  invalidate_user_cache();
+}
+
+function ws_images_delete($params, &$service)
+{
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  $params['image_id'] = preg_split(
+    '/[\s,;\|]/',
+    $params['image_id'],
+    -1,
+    PREG_SPLIT_NO_EMPTY
+    );
+  $params['image_id'] = array_map('intval', $params['image_id']);
+
+  $image_ids = array();
+  foreach ($params['image_id'] as $image_id)
+  {
+    if ($image_id > 0)
+    {
+      array_push($image_ids, $image_id);
+    }
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  delete_elements($image_ids, true);
+}
+
+function ws_add_image_category_relations($image_id, $categories_string, $replace_mode=false)
+{
+  // let's add links between the image and the categories
+  //
+  // $params['categories'] should look like 123,12;456,auto;789 which means:
+  //
+  // 1. associate with category 123 on rank 12
+  // 2. associate with category 456 on automatic rank
+  // 3. associate with category 789 on automatic rank
+  $cat_ids = array();
+  $rank_on_category = array();
+  $search_current_ranks = false;
+
+  $tokens = explode(';', $categories_string);
+  foreach ($tokens as $token)
+  {
+    @list($cat_id, $rank) = explode(',', $token);
+
+    if (!preg_match('/^\d+$/', $cat_id))
+    {
+      continue;
+    }
+
+    array_push($cat_ids, $cat_id);
+
+    if (!isset($rank))
+    {
+      $rank = 'auto';
+    }
+    $rank_on_category[$cat_id] = $rank;
+
+    if ($rank == 'auto')
+    {
+      $search_current_ranks = true;
+    }
+  }
+
+  $cat_ids = array_unique($cat_ids);
+
+  if (count($cat_ids) == 0)
+  {
+    return new PwgError(
+      500,
+      '[ws_add_image_category_relations] there is no category defined in "'.$categories_string.'"'
+      );
+  }
+
+  $query = '
+SELECT
+    id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $cat_ids).')
+;';
+  $db_cat_ids = array_from_query($query, 'id');
+
+  $unknown_cat_ids = array_diff($cat_ids, $db_cat_ids);
+  if (count($unknown_cat_ids) != 0)
+  {
+    return new PwgError(
+      500,
+      '[ws_add_image_category_relations] the following categories are unknown: '.implode(', ', $unknown_cat_ids)
+      );
+  }
+
+  $to_update_cat_ids = array();
+
+  // in case of replace mode, we first check the existing associations
+  $query = '
+SELECT
+    category_id
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id = '.$image_id.'
+;';
+  $existing_cat_ids = array_from_query($query, 'category_id');
+
+  if ($replace_mode)
+  {
+    $to_remove_cat_ids = array_diff($existing_cat_ids, $cat_ids);
+    if (count($to_remove_cat_ids) > 0)
+    {
+      $query = '
+DELETE
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE image_id = '.$image_id.'
+    AND category_id IN ('.implode(', ', $to_remove_cat_ids).')
+;';
+      pwg_query($query);
+      update_category($to_remove_cat_ids);
+    }
+  }
+
+  $new_cat_ids = array_diff($cat_ids, $existing_cat_ids);
+  if (count($new_cat_ids) == 0)
+  {
+    return true;
+  }
+
+  if ($search_current_ranks)
+  {
+    $query = '
+SELECT
+    category_id,
+    MAX(rank) AS max_rank
+  FROM '.IMAGE_CATEGORY_TABLE.'
+  WHERE rank IS NOT NULL
+    AND category_id IN ('.implode(',', $new_cat_ids).')
+  GROUP BY category_id
+;';
+    $current_rank_of = simple_hash_from_query(
+      $query,
+      'category_id',
+      'max_rank'
+      );
+
+    foreach ($new_cat_ids as $cat_id)
+    {
+      if (!isset($current_rank_of[$cat_id]))
+      {
+        $current_rank_of[$cat_id] = 0;
+      }
+
+      if ('auto' == $rank_on_category[$cat_id])
+      {
+        $rank_on_category[$cat_id] = $current_rank_of[$cat_id] + 1;
+      }
+    }
+  }
+
+  $inserts = array();
+
+  foreach ($new_cat_ids as $cat_id)
+  {
+    array_push(
+      $inserts,
+      array(
+        'image_id' => $image_id,
+        'category_id' => $cat_id,
+        'rank' => $rank_on_category[$cat_id],
+        )
+      );
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  mass_inserts(
+    IMAGE_CATEGORY_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+
+  update_category($new_cat_ids);
+}
+
+function ws_categories_setInfo($params, &$service)
+{
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  // category_id
+  // name
+  // comment
+
+  $params['category_id'] = (int)$params['category_id'];
+  if ($params['category_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
+  }
+
+  // database registration
+  $update = array(
+    'id' => $params['category_id'],
+    );
+
+  $info_columns = array(
+    'name',
+    'comment',
+    );
+
+  $perform_update = false;
+  foreach ($info_columns as $key)
+  {
+    if (isset($params[$key]))
+    {
+      $perform_update = true;
+      $update[$key] = $params[$key];
+    }
+  }
+
+  if ($perform_update)
+  {
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+    mass_updates(
+      CATEGORIES_TABLE,
+      array(
+        'primary' => array('id'),
+        'update'  => array_diff(array_keys($update), array('id'))
+        ),
+      array($update)
+      );
+  }
+
+}
+
+function ws_categories_setRepresentative($params, &$service)
+{
+  global $conf;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  // category_id
+  // image_id
+
+  $params['category_id'] = (int)$params['category_id'];
+  if ($params['category_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid category_id");
+  }
+
+  // does the category really exist?
+  $query='
+SELECT
+    *
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id = '.$params['category_id'].'
+;';
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($row == null)
+  {
+    return new PwgError(404, "category_id not found");
+  }
+
+  $params['image_id'] = (int)$params['image_id'];
+  if ($params['image_id'] <= 0)
+  {
+    return new PwgError(WS_ERR_INVALID_PARAM, "Invalid image_id");
+  }
+
+  // does the image really exist?
+  $query='
+SELECT
+    *
+  FROM '.IMAGES_TABLE.'
+  WHERE id = '.$params['image_id'].'
+;';
+
+  $row = pwg_db_fetch_assoc(pwg_query($query));
+  if ($row == null)
+  {
+    return new PwgError(404, "image_id not found");
+  }
+
+  // apply change
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = '.$params['image_id'].'
+  WHERE id = '.$params['category_id'].'
+;';
+  pwg_query($query);
+
+  $query = '
+UPDATE '.USER_CACHE_CATEGORIES_TABLE.'
+  SET user_representative_picture_id = NULL
+  WHERE cat_id = '.$params['category_id'].'
+;';
+  pwg_query($query);
+}
+
+function ws_categories_delete($params, &$service)
+{
+  global $conf;
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  $modes = array('no_delete', 'delete_orphans', 'force_delete');
+  if (!in_array($params['photo_deletion_mode'], $modes))
+  {
+    return new PwgError(
+      500,
+      '[ws_categories_delete]'
+      .' invalid parameter photo_deletion_mode "'.$params['photo_deletion_mode'].'"'
+      .', possible values are {'.implode(', ', $modes).'}.'
+      );
+  }
+
+  $params['category_id'] = preg_split(
+    '/[\s,;\|]/',
+    $params['category_id'],
+    -1,
+    PREG_SPLIT_NO_EMPTY
+    );
+  $params['category_id'] = array_map('intval', $params['category_id']);
+
+  $category_ids = array();
+  foreach ($params['category_id'] as $category_id)
+  {
+    if ($category_id > 0)
+    {
+      array_push($category_ids, $category_id);
+    }
+  }
+
+  if (count($category_ids) == 0)
+  {
+    return;
+  }
+
+  $query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $category_ids).')
+;';
+  $category_ids = array_from_query($query, 'id');
+
+  if (count($category_ids) == 0)
+  {
+    return;
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  delete_categories($category_ids, $params['photo_deletion_mode']);
+  update_global_rank();
+}
+
+function ws_categories_move($params, &$service)
+{
+  global $conf, $page;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (!$service->isPost())
+  {
+    return new PwgError(405, "This method requires HTTP POST");
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  $params['category_id'] = preg_split(
+    '/[\s,;\|]/',
+    $params['category_id'],
+    -1,
+    PREG_SPLIT_NO_EMPTY
+    );
+  $params['category_id'] = array_map('intval', $params['category_id']);
+
+  $category_ids = array();
+  foreach ($params['category_id'] as $category_id)
+  {
+    if ($category_id > 0)
+    {
+      array_push($category_ids, $category_id);
+    }
+  }
+
+  if (count($category_ids) == 0)
+  {
+    return new PwgError(403, 'Invalid category_id input parameter, no category to move');
+  }
+
+  // we can't move physical categories
+  $categories_in_db = array();
+
+  $query = '
+SELECT
+    id,
+    name,
+    dir
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',', $category_ids).')
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $categories_in_db[$row['id']] = $row;
+    // we break on error at first physical category detected
+    if (!empty($row['dir']))
+    {
+      $row['name'] = strip_tags(
+        trigger_event(
+          'render_category_name',
+          $row['name'],
+          'ws_categories_move'
+          )
+        );
+
+      return new PwgError(
+        403,
+        sprintf(
+          'Category %s (%u) is not a virtual category, you cannot move it',
+          $row['name'],
+          $row['id']
+          )
+        );
+    }
+  }
+
+  if (count($categories_in_db) != count($category_ids))
+  {
+    $unknown_category_ids = array_diff($category_ids, array_keys($categories_in_db));
+
+    return new PwgError(
+      403,
+      sprintf(
+        'Category %u does not exist',
+        $unknown_category_ids[0]
+        )
+      );
+  }
+
+  // does this parent exists? This check should be made in the
+  // move_categories function, not here
+  //
+  // 0 as parent means "move categories at gallery root"
+  if (!is_numeric($params['parent']))
+  {
+    return new PwgError(403, 'Invalid parent input parameter');
+  }
+
+  if (0 != $params['parent']) {
+    $params['parent'] = intval($params['parent']);
+    $subcat_ids = get_subcat_ids(array($params['parent']));
+    if (count($subcat_ids) == 0)
+    {
+      return new PwgError(403, 'Unknown parent category id');
+    }
+  }
+
+  $page['infos'] = array();
+  $page['errors'] = array();
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  move_categories($category_ids, $params['parent']);
+  invalidate_user_cache();
+
+  if (count($page['errors']) != 0)
+  {
+    return new PwgError(403, implode('; ', $page['errors']));
+  }
+}
+
+function ws_logfile($string)
+{
+  global $conf;
+
+  if (!$conf['ws_enable_log']) {
+    return true;
+  }
+
+  file_put_contents(
+    $conf['ws_log_filepath'],
+    '['.date('c').'] '.$string."\n",
+    FILE_APPEND
+    );
+}
+
+function ws_images_checkUpload($params, &$service)
+{
+  global $conf;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions_upload.inc.php');
+  $ret['message'] = ready_for_upload_message();
+  $ret['ready_for_upload'] = true;
+
+  if (!empty($ret['message']))
+  {
+    $ret['ready_for_upload'] = false;
+  }
+
+  return $ret;
+}
+
+function ws_plugins_getList($params, &$service)
+{
+  global $conf;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+  $plugins = new plugins();
+  $plugins->sort_fs_plugins('name');
+  $plugin_list = array();
+
+  foreach($plugins->fs_plugins as $plugin_id => $fs_plugin)
+  {
+    if (isset($plugins->db_plugins_by_id[$plugin_id]))
+    {
+      $state = $plugins->db_plugins_by_id[$plugin_id]['state'];
+    }
+    else
+    {
+      $state = 'uninstalled';
+    }
+
+    array_push(
+      $plugin_list,
+      array(
+        'id' => $plugin_id,
+        'name' => $fs_plugin['name'],
+        'version' => $fs_plugin['version'],
+        'state' => $state,
+        'description' => $fs_plugin['description'],
+        )
+      );
+  }
+
+  return $plugin_list;
+}
+
+function ws_plugins_performAction($params, &$service)
+{
+  global $template;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  define('IN_ADMIN', true);
+  include_once(PHPWG_ROOT_PATH.'admin/include/plugins.class.php');
+  $plugins = new plugins();
+  $errors = $plugins->perform_action($params['action'], $params['plugin']);
+
+
+  if (!empty($errors))
+  {
+    return new PwgError(500, $errors);
+  }
+  else
+  {
+    if (in_array($params['action'], array('activate', 'deactivate')))
+    {
+      $template->delete_compiled_templates();
+    }
+    return true;
+  }
+}
+
+function ws_themes_performAction($params, &$service)
+{
+  global $template;
+
+  if (!is_admin())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  define('IN_ADMIN', true);
+  include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+  $themes = new themes();
+  $errors = $themes->perform_action($params['action'], $params['theme']);
+
+  if (!empty($errors))
+  {
+    return new PwgError(500, $errors);
+  }
+  else
+  {
+    if (in_array($params['action'], array('activate', 'deactivate')))
+    {
+      $template->delete_compiled_templates();
+    }
+    return true;
+  }
+}
+
+function ws_extensions_update($params, &$service)
+{
+  if (!is_webmaster())
+  {
+    return new PwgError(401, l10n('Webmaster status is required.'));
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  if (empty($params['type']) or !in_array($params['type'], array('plugins', 'themes', 'languages')))
+  {
+    return new PwgError(403, "invalid extension type");
+  }
+
+  if (empty($params['id']) or empty($params['revision']))
+  {
+    return new PwgError(null, 'Wrong parameters');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+  include_once(PHPWG_ROOT_PATH.'admin/include/'.$params['type'].'.class.php');
+
+  $type = $params['type'];
+  $extension_id = $params['id'];
+  $revision = $params['revision'];
+
+  $extension = new $type();
+
+  if ($type == 'plugins')
+  {
+    if (isset($extension->db_plugins_by_id[$extension_id]) and $extension->db_plugins_by_id[$extension_id]['state'] == 'active')
+    {
+      $extension->perform_action('deactivate', $extension_id);
+
+      redirect(PHPWG_ROOT_PATH
+        . 'ws.php'
+        . '?method=pwg.extensions.update'
+        . '&type=plugins'
+        . '&id=' . $extension_id
+        . '&revision=' . $revision
+        . '&reactivate=true'
+        . '&pwg_token=' . get_pwg_token()
+        . '&format=json'
+      );
+    }
+
+    $upgrade_status = $extension->extract_plugin_files('upgrade', $revision, $extension_id);
+    $extension_name = $extension->fs_plugins[$extension_id]['name'];
+
+    if (isset($params['reactivate']))
+    {
+      $extension->perform_action('activate', $extension_id);
+    }
+  }
+  elseif ($type == 'themes')
+  {
+    $upgrade_status = $extension->extract_theme_files('upgrade', $revision, $extension_id);
+    $extension_name = $extension->fs_themes[$extension_id]['name'];
+  }
+  elseif ($type == 'languages')
+  {
+    $upgrade_status = $extension->extract_language_files('upgrade', $revision, $extension_id);
+    $extension_name = $extension->fs_languages[$extension_id]['name'];
+  }
+
+  global $template;
+  $template->delete_compiled_templates();
+
+  switch ($upgrade_status)
+  {
+    case 'ok':
+      return sprintf(l10n('%s has been successfully updated.'), $extension_name);
+
+    case 'temp_path_error':
+      return new PwgError(null, l10n('Can\'t create temporary file.'));
+
+    case 'dl_archive_error':
+      return new PwgError(null, l10n('Can\'t download archive.'));
+
+    case 'archive_error':
+      return new PwgError(null, l10n('Can\'t read or extract archive.'));
+
+    default:
+      return new PwgError(null, sprintf(l10n('An error occured during extraction (%s).'), $upgrade_status));
+  }
+}
+
+function ws_extensions_ignoreupdate($params, &$service)
+{
+  global $conf;
+
+  define('IN_ADMIN', true);
+  include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+  if (!is_webmaster())
+  {
+    return new PwgError(401, 'Access denied');
+  }
+
+  if (empty($params['pwg_token']) or get_pwg_token() != $params['pwg_token'])
+  {
+    return new PwgError(403, 'Invalid security token');
+  }
+
+  $conf['updates_ignored'] = unserialize($conf['updates_ignored']);
+
+  // Reset ignored extension
+  if ($params['reset'])
+  {
+    if (!empty($params['type']) and isset($conf['updates_ignored'][$params['type']]))
+    {
+      $conf['updates_ignored'][$params['type']] = array();
+    }
+    else
+    {
+      $conf['updates_ignored'] = array(
+        'plugins'=>array(),
+        'themes'=>array(),
+        'languages'=>array()
+      );
+    }
+    conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
+    unset($_SESSION['extensions_need_update']);
+    return true;
+  }
+
+  if (empty($params['id']) or empty($params['type']) or !in_array($params['type'], array('plugins', 'themes', 'languages')))
+  {
+    return new PwgError(403, 'Invalid parameters');
+  }
+
+  // Add or remove extension from ignore list
+  if (!in_array($params['id'], $conf['updates_ignored'][$params['type']]))
+  {
+    array_push($conf['updates_ignored'][$params['type']], $params['id']);
+  }
+  conf_update_param('updates_ignored', pwg_db_real_escape_string(serialize($conf['updates_ignored'])));
+  unset($_SESSION['extensions_need_update']);
+  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: tags/2.4.0RC3/include/ws_protocols/index.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/index.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/include/ws_protocols/json_encoder.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/json_encoder.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/json_encoder.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class PwgJsonEncoder extends PwgResponseEncoder
+{
+  function encodeResponse($response)
+  {
+    $respClass = strtolower( @get_class($response) );
+    if ($respClass=='pwgerror')
+    {
+      return json_encode(
+        array(
+          'stat' => 'fail',
+          'err' => $response->code(),
+          'message' => $response->message(),
+          )
+      );
+    }
+    parent::flattenResponse($response);
+    return json_encode(
+        array(
+          'stat' => 'ok',
+          'result' => $response,
+      )
+    );
+  }
+
+  function getContentType()
+  {
+    return 'text/plain';
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/ws_protocols/php_encoder.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/php_encoder.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/php_encoder.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class PwgSerialPhpEncoder extends PwgResponseEncoder
+{
+  function encodeResponse($response)
+  {
+    $respClass = strtolower( @get_class($response) );
+    if ($respClass=='pwgerror')
+    {
+      return serialize(
+        array(
+          'stat' => 'fail',
+          'err' => $response->code(),
+          'message' => $response->message(),
+          )
+      );
+    }
+    parent::flattenResponse($response);
+    return serialize(
+        array(
+          'stat' => 'ok',
+          'result' => $response
+      )
+    );
+  }
+
+  function getContentType()
+  {
+    return 'text/plain';
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/ws_protocols/rest_encoder.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/rest_encoder.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/rest_encoder.php	(revision 14585)
@@ -0,0 +1,281 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+class PwgXmlWriter
+{
+  var $_indent;
+  var $_indentStr;
+
+  var $_elementStack;
+  var $_lastTagOpen;
+  var $_indentLevel;
+
+  var $_encodedXml;
+
+  function PwgXmlWriter()
+  {
+    $this->_elementStack = array();
+    $this->_lastTagOpen = false;
+    $this->_indentLevel = 0;
+
+    $this->_encodedXml = '';
+    $this->_indent = true;
+    $this->_indentStr = "\t";
+  }
+
+  function &getOutput()
+  {
+    return $this->_encodedXml;
+  }
+
+
+  function start_element($name)
+  {
+    $this->_end_prev(false);
+    if (!empty($this->_elementStack))
+    {
+      $this->_eol_indent();
+    }
+    $this->_indentLevel++;
+    $this->_indent();
+    $this->_output( '<'.$name );
+    $this->_lastTagOpen = true;
+    array_push( $this->_elementStack, $name);
+  }
+
+  function end_element($x)
+  {
+    $close_tag = $this->_end_prev(true);
+    $name = array_pop( $this->_elementStack );
+    if ($close_tag)
+    {
+      $this->_indentLevel--;
+      $this->_indent();
+//      $this->_eol_indent();
+      $this->_output('</'.$name.">");
+    }
+  }
+
+  function write_content($value)
+  {
+    $this->_end_prev(false);
+    $value = (string)$value;
+    $this->_output( htmlspecialchars( $value ) );
+  }
+
+  function write_cdata($value)
+  {
+    $this->_end_prev(false);
+    $value = (string)$value;
+    $this->_output(
+      '<![CDATA['
+      . str_replace(']]>', ']]&gt;', $value)
+      . ']]>' );
+  }
+
+  function write_attribute($name, $value)
+  {
+    $this->_output(' '.$name.'="'.$this->encode_attribute($value).'"');
+  }
+
+  function encode_attribute($value)
+  {
+    return htmlspecialchars( (string)$value);
+  }
+
+  function _end_prev($done)
+  {
+    $ret = true;
+    if ($this->_lastTagOpen)
+    {
+      if ($done)
+      {
+        $this->_indentLevel--;
+        $this->_output( ' />' );
+        //$this->_eol_indent();
+        $ret = false;
+      }
+      else
+      {
+        $this->_output( '>' );
+      }
+      $this->_lastTagOpen = false;
+    }
+    return $ret;
+  }
+
+  function _eol_indent()
+  {
+    if ($this->_indent)
+      $this->_output("\n");
+  }
+
+  function _indent()
+  {
+    if ($this->_indent and
+        $this->_indentLevel > count($this->_elementStack) )
+    {
+      $this->_output(
+        str_repeat( $this->_indentStr, count($this->_elementStack) )
+       );
+    }
+  }
+
+  function _output($raw_content)
+  {
+    $this->_encodedXml .= $raw_content;
+  }
+}
+
+class PwgRestEncoder extends PwgResponseEncoder
+{
+  function encodeResponse($response)
+  {
+    $respClass = strtolower( @get_class($response) );
+    if ($respClass=='pwgerror')
+    {
+      $ret = '<?xml version="1.0"?>
+<rsp stat="fail">
+	<err code="'.$response->code().'" msg="'.htmlspecialchars($response->message()).'" />
+</rsp>';
+      return $ret;
+    }
+
+    $this->_writer = new PwgXmlWriter();
+    $this->encode($response);
+    $ret = $this->_writer->getOutput();
+    $ret = '<?xml version="1.0" encoding="'.get_pwg_charset().'" ?>
+<rsp stat="ok">
+'.$ret.'
+</rsp>';
+
+    return $ret;
+  }
+
+  function getContentType()
+  {
+    return 'text/xml';
+  }
+
+  function encode_array($data, $itemName, $xml_attributes=array())
+  {
+    foreach ($data as $item)
+    {
+      $this->_writer->start_element( $itemName );
+      $this->encode($item, $xml_attributes);
+      $this->_writer->end_element( $itemName );
+    }
+  }
+
+  function encode_struct($data, $skip_underscore, $xml_attributes=array())
+  {
+    foreach ($data as $name => $value)
+    {
+      if (is_numeric($name))
+        continue;
+      if ($skip_underscore and $name[0]=='_')
+        continue;
+      if ( is_null($value) )
+        continue; // null means we dont put it
+      if ( $name==WS_XML_ATTRIBUTES)
+      {
+        foreach ($value as $attr_name => $attr_value)
+        {
+          $this->_writer->write_attribute($attr_name, $attr_value);
+        }
+        unset($data[$name]);
+      }
+      else if ( isset($xml_attributes[$name]) )
+      {
+        $this->_writer->write_attribute($name, $value);
+        unset($data[$name]);
+      }
+    }
+
+    foreach ($data as $name => $value)
+    {
+      if (is_numeric($name))
+        continue;
+      if ($skip_underscore and $name[0]=='_')
+        continue;
+      if ( is_null($value) )
+        continue; // null means we dont put it
+      if ($name!=WS_XML_CONTENT)
+        $this->_writer->start_element($name);
+      $this->encode($value);
+      if ($name!=WS_XML_CONTENT)
+        $this->_writer->end_element($name);
+    }
+  }
+
+  function encode($data, $xml_attributes=array() )
+  {
+    switch (gettype($data))
+    {
+      case 'null':
+      case 'NULL':
+        $this->_writer->write_content('');
+        break;
+      case 'boolean':
+        $this->_writer->write_content($data ? '1' : '0');
+        break;
+      case 'integer':
+      case 'double':
+        $this->_writer->write_content($data);
+        break;
+      case 'string':
+        $this->_writer->write_content($data);
+        break;
+      case 'array':
+        $is_array = range(0, count($data) - 1) === array_keys($data);
+        if ($is_array)
+        {
+          $this->encode_array($data, 'item' );
+        }
+        else
+        {
+          $this->encode_struct($data, false, $xml_attributes);
+        }
+        break;
+      case 'object':
+        switch ( strtolower(@get_class($data)) )
+        {
+          case 'pwgnamedarray':
+            $this->encode_array($data->_content, $data->_itemName, $data->_xmlAttributes);
+            break;
+          case 'pwgnamedstruct':
+            $this->encode_array( array($data->_content), $data->_name, $data->_xmlAttributes);
+            break;
+          default:
+            $this->encode_struct(get_object_vars($data), true);
+            break;
+        }
+        break;
+      default:
+        trigger_error("Invalid type ". gettype($data)." ".@get_class($data), E_USER_WARNING );
+    }
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/ws_protocols/rest_handler.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/rest_handler.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/rest_handler.php	(revision 14585)
@@ -0,0 +1,61 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+class PwgRestRequestHandler
+{
+  function handleRequest(&$service)
+  {
+    $params = array();
+
+    $param_array = $service->isPost() ? $_POST : $_GET;
+    foreach ($param_array as $name => $value)
+    {
+      if ($name=='format')
+        continue; // ignore - special keys
+      if ($name=='method')
+      {
+        $method = $value;
+      }
+      else
+      {
+        $params[$name]=$value;
+      }
+    }
+		if ( empty($method) && isset($_GET['method']) )
+		{
+			$method = $_GET['method'];
+		}
+
+    if ( empty($method) )
+    {
+      $service->sendResponse(
+          new PwgError(WS_ERR_INVALID_METHOD, 'Missing "method" name')
+        );
+      return;
+    }
+    $resp = $service->invoke($method, $params);
+    $service->sendResponse($resp);
+  }
+}
+
+?>
Index: tags/2.4.0RC3/include/ws_protocols/xmlrpc_encoder.php
===================================================================
--- tags/2.4.0RC3/include/ws_protocols/xmlrpc_encoder.php	(revision 14585)
+++ tags/2.4.0RC3/include/ws_protocols/xmlrpc_encoder.php	(revision 14585)
@@ -0,0 +1,115 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function xmlrpc_encode($data)
+{
+  switch (gettype($data))
+  {
+    case 'boolean':
+      return '<boolean>'.($data ? '1' : '0').'</boolean>';
+    case 'integer':
+      return '<int>'.$data.'</int>';
+    case 'double':
+      return '<double>'.$data.'</double>';
+    case 'string':
+      return '<string>'.htmlspecialchars($data).'</string>';
+    case 'object':
+    case 'array':
+      $is_array = range(0, count($data) - 1) === array_keys($data);
+      if ($is_array)
+      {
+        $return = '<array><data>'."\n";
+        foreach ($data as $item)
+        {
+          $return .= '  <value>'.xmlrpc_encode($item)."</value>\n";
+        }
+        $return .= '</data></array>';
+      }
+      else
+      {
+        $return = '<struct>'."\n";
+        foreach ($data as $name => $value)
+        {
+					$name = htmlspecialchars($name);
+          $return .= "  <member><name>$name</name><value>";
+          $return .= xmlrpc_encode($value)."</value></member>\n";
+        }
+        $return .= '</struct>';
+      }
+      return $return;
+  }
+}
+
+class PwgXmlRpcEncoder extends PwgResponseEncoder
+{
+  function encodeResponse($response)
+  {
+    $respClass = strtolower( @get_class($response) );
+    if ($respClass=='pwgerror')
+    {
+      $code = $response->code();
+      $msg = htmlspecialchars($response->message());
+      $ret = <<<EOD
+<methodResponse>
+  <fault>
+    <value>
+      <struct>
+        <member>
+          <name>faultCode</name>
+          <value><int>{$code}</int></value>
+        </member>
+        <member>
+          <name>faultString</name>
+          <value><string>{$msg}</string></value>
+        </member>
+      </struct>
+    </value>
+  </fault>
+</methodResponse>
+EOD;
+      return $ret;
+    }
+
+    parent::flattenResponse($response);
+    $ret = xmlrpc_encode($response);
+    $ret = <<<EOD
+<methodResponse>
+  <params>
+    <param>
+      <value>
+        $ret
+      </value>
+    </param>
+  </params>
+</methodResponse>
+EOD;
+    return $ret;
+  }
+
+  function getContentType()
+  {
+    return 'text/xml';
+  }
+}
+
+?>
Index: tags/2.4.0RC3/index.php
===================================================================
--- tags/2.4.0RC3/index.php	(revision 14585)
+++ tags/2.4.0RC3/index.php	(revision 14585)
@@ -0,0 +1,348 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//--------------------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+include(PHPWG_ROOT_PATH.'include/section_init.inc.php');
+
+// Check Access and exit when user status is not ok
+check_status(ACCESS_GUEST);
+
+if (!isset($page['start']))
+{
+  $page['start'] = 0;
+}
+
+// access authorization check
+if (isset($page['category']))
+{
+  check_restrictions($page['category']['id']);
+}
+if ($page['start']>0 && $page['start']>=count($page['items']))
+{
+  page_not_found('', duplicate_index_url(array('start'=>0)));
+}
+
+trigger_action('loc_begin_index');
+
+//---------------------------------------------- change of image display order
+if (isset($_GET['image_order']))
+{
+  if ( (int)$_GET['image_order'] > 0)
+  {
+    pwg_set_session_var('image_order', (int)$_GET['image_order']);
+  }
+  else
+  {
+    pwg_unset_session_var('image_order');
+  }
+  redirect(
+    duplicate_index_url(
+      array(),        // nothing to redefine
+      array('start')  // changing display order goes back to section first page
+      )
+    );
+}
+if (isset($_GET['display']))
+{
+  $page['meta_robots']['noindex']=1;
+  if (array_key_exists($_GET['display'], ImageStdParams::get_defined_type_map()))
+  {
+    pwg_set_session_var('index_deriv', $_GET['display']);
+  }
+}
+//-------------------------------------------------------------- initialization
+
+$page['navigation_bar'] = array();
+if (count($page['items']) > $page['nb_image_page'])
+{
+  $page['navigation_bar'] = create_navigation_bar(
+    duplicate_index_url(array(), array('start')),
+    count($page['items']),
+    $page['start'],
+    $page['nb_image_page'],
+    true
+    );
+}
+
+// caddie filling :-)
+if (isset($_GET['caddie']))
+{
+  fill_caddie($page['items']);
+  redirect(duplicate_index_url());
+}
+
+if (isset($page['is_homepage']) and $page['is_homepage'])
+{
+  $canonical_url = get_gallery_home_url();
+}
+else
+{
+  $canonical_url = duplicate_index_url();
+}
+$template->assign('U_CANONICAL', $canonical_url);
+
+//----------------------------------------------------- template initialization
+//
+// Start output of page
+//
+$title = $page['title'];
+$page['body_id'] = 'theCategoryPage';
+
+$template->set_filenames( array('index'=>'index.tpl') );
+//-------------------------------------------------------------- category title
+$template_title = $page['title'];
+if (count($page['items']) > 0)
+{
+  $template_title.= ' ['.count($page['items']).']';
+}
+$template->assign('TITLE', $template_title);
+
+if (isset($page['flat']) or isset($page['chronology_field']))
+{
+  $template->assign(
+    'U_MODE_NORMAL',
+    duplicate_index_url( array(), array('chronology_field', 'start', 'flat') )
+    );
+}
+
+if ($conf['index_flat_icon'] and !isset($page['flat']) and 'categories' == $page['section'])
+{
+  $template->assign(
+    'U_MODE_FLAT',
+    duplicate_index_url(array('flat' => ''), array('start', 'chronology_field'))
+    );
+}
+
+if (!isset($page['chronology_field']))
+{
+  $chronology_params =
+      array(
+          'chronology_field' => 'created',
+          'chronology_style' => 'monthly',
+          'chronology_view' => 'list',
+      );
+  if ($conf['index_created_date_icon'])
+  {
+    $template->assign(
+      'U_MODE_CREATED',
+      duplicate_index_url( $chronology_params, array('start', 'flat') )
+      );
+  }
+  if ($conf['index_posted_date_icon'])
+  {
+    $chronology_params['chronology_field'] = 'posted';
+    $template->assign(
+      'U_MODE_POSTED',
+      duplicate_index_url( $chronology_params, array('start', 'flat') )
+      );
+  }
+}
+else
+{
+  if ($page['chronology_field'] == 'created')
+  {
+    $chronology_field = 'posted';
+  }
+  else
+  {
+    $chronology_field = 'created';
+  }
+  if ($conf['index_'.$chronology_field.'_date_icon'])
+  {
+    $url = duplicate_index_url(
+              array('chronology_field'=>$chronology_field ),
+              array('chronology_date', 'start', 'flat')
+            );
+    $template->assign(
+        'U_MODE_'.strtoupper($chronology_field),
+        $url
+      );
+  }
+}
+
+if ('search' == $page['section'])
+{
+  $template->assign(
+    'U_SEARCH_RULES',
+    get_root_url().'search_rules.php?search_id='.$page['search']
+    );
+}
+
+if (isset($page['category']) and is_admin())
+{
+  $template->assign(
+    'U_EDIT',
+    get_root_url().'admin.php?page=album-'.$page['category']['id']
+    );
+}
+
+if (is_admin() and !empty($page['items']))
+{
+  $template->assign(
+    'U_CADDIE',
+     add_url_params(duplicate_index_url(), array('caddie'=>1) )
+    );
+}
+
+if ( $page['section']=='search' and $page['start']==0 and
+    !isset($page['chronology_field']) and isset($page['qsearch_details']) )
+{
+  $template->assign('QUERY_SEARCH',
+    htmlspecialchars($page['qsearch_details']['q']) );
+
+  $cats = array_merge(
+      (array)@$page['qsearch_details']['matching_cats_no_images'],
+      (array)@$page['qsearch_details']['matching_cats'] );
+  if (count($cats))
+  {
+    usort($cats, 'name_compare');
+    $hints = array();
+    foreach ( $cats as $cat )
+    {
+      $hints[] = get_cat_display_name( array($cat), '', false );
+    }
+    $template->assign( 'category_search_results', $hints);
+  }
+
+  $tags = (array)@$page['qsearch_details']['matching_tags'];
+  if (count($tags))
+  {
+    usort($tags, 'name_compare');
+    $hints = array();
+    foreach ( $tags as $tag )
+    {
+      $hints[] =
+        '<a href="' . make_index_url(array('tags'=>array($tag))) . '">'
+        .trigger_event('render_tag_name', $tag['name'])
+        .'</a>';
+    }
+    $template->assign( 'tag_search_results', $hints);
+  }
+}
+
+// navigation bar
+$template->assign( 'navbar', $page['navigation_bar'] );
+
+if ( $conf['index_sort_order_input']
+    and count($page['items']) > 0
+    and $page['section'] != 'most_visited'
+    and $page['section'] != 'best_rated')
+{
+  // image order
+  $order_idx = pwg_get_session_var( 'image_order', 0 );
+
+  $url = add_url_params(
+          duplicate_index_url(),
+          array('image_order' => '')
+        );
+  foreach (get_category_preferred_image_orders() as $order_id => $order)
+  {
+    if ($order[2])
+    {
+      $template->append(
+        'image_orders',
+        array(
+          'DISPLAY' => $order[0],
+          'URL' => $url.$order_id,
+          'SELECTED' => ($order_idx == $order_id ? true:false),
+          )
+        );
+    }
+  }
+}
+
+if ( count($page['items']) > 0 )
+{
+  $url = add_url_params(
+          duplicate_index_url(),
+          array('display' => '')
+        );
+  $selected_type = pwg_get_session_var('index_deriv', IMG_THUMB);
+  $type_map = ImageStdParams::get_defined_type_map();
+  unset($type_map[IMG_XXLARGE], $type_map[IMG_XLARGE]);
+  foreach($type_map as $params)
+  {
+    $template->append(
+      'image_derivatives',
+      array(
+        'DISPLAY' => l10n($params->type),
+        'URL' => $url.$params->type,
+        'SELECTED' => ($params->type == $selected_type ? true:false),
+        )
+      );
+  }
+}
+
+// category comment
+if ($page['start']==0 and !isset($page['chronology_field']) and !empty($page['comment']) )
+{
+  $template->assign('CONTENT_DESCRIPTION', $page['comment'] );
+}
+
+// include menubar
+include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+
+if ( isset($page['category']['count_categories']) and $page['category']['count_categories']==0 )
+{// count_categories might be computed by menubar - if the case unassign flat link if no sub albums
+	$template->clear_assign('U_MODE_FLAT');
+}
+
+//------------------------------------------------------ main part : thumbnails
+if ( 0==$page['start']
+    and !isset($page['flat'])
+    and !isset($page['chronology_field'])
+    and ('recent_cats'==$page['section'] or 'categories'==$page['section'])
+    and (!isset($page['category']['count_categories']) or $page['category']['count_categories']>0 )
+  )
+{
+  include(PHPWG_ROOT_PATH.'include/category_cats.inc.php');
+}
+if ( !empty($page['items']) )
+{
+  include(PHPWG_ROOT_PATH.'include/category_default.inc.php');
+}
+//------------------------------------------------------- category informations
+
+// slideshow
+// execute after init thumbs in order to have all picture informations
+if (!empty($page['cat_slideshow_url']))
+{
+  if (isset($_GET['slideshow']))
+  {
+    redirect($page['cat_slideshow_url']);
+  }
+  elseif ($conf['index_slideshow_icon'])
+  {
+    $template->assign('U_SLIDESHOW', $page['cat_slideshow_url']);
+  }
+}
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+trigger_action('loc_end_index');
+$template->pparse('index');
+//------------------------------------------------------------ log informations
+pwg_log();
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/install.php
===================================================================
--- tags/2.4.0RC3/install.php	(revision 14585)
+++ tags/2.4.0RC3/install.php	(revision 14585)
@@ -0,0 +1,507 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//----------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+
+@set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
+//
+// addslashes to vars if magic_quotes_gpc is off this is a security
+// precaution to prevent someone trying to break out of a SQL statement.
+//
+if( !@get_magic_quotes_gpc() )
+{
+  if( is_array($_POST) )
+  {
+    while( list($k, $v) = each($_POST) )
+    {
+      if( is_array($_POST[$k]) )
+      {
+        while( list($k2, $v2) = each($_POST[$k]) )
+        {
+          $_POST[$k][$k2] = addslashes($v2);
+        }
+        @reset($_POST[$k]);
+      }
+      else
+      {
+        $_POST[$k] = addslashes($v);
+      }
+    }
+    @reset($_POST);
+  }
+
+  if( is_array($_GET) )
+  {
+    while( list($k, $v) = each($_GET) )
+    {
+      if( is_array($_GET[$k]) )
+      {
+        while( list($k2, $v2) = each($_GET[$k]) )
+        {
+          $_GET[$k][$k2] = addslashes($v2);
+        }
+        @reset($_GET[$k]);
+      }
+      else
+      {
+        $_GET[$k] = addslashes($v);
+      }
+    }
+    @reset($_GET);
+  }
+
+  if( is_array($_COOKIE) )
+  {
+    while( list($k, $v) = each($_COOKIE) )
+    {
+      if( is_array($_COOKIE[$k]) )
+      {
+        while( list($k2, $v2) = each($_COOKIE[$k]) )
+        {
+          $_COOKIE[$k][$k2] = addslashes($v2);
+        }
+        @reset($_COOKIE[$k]);
+      }
+      else
+      {
+        $_COOKIE[$k] = addslashes($v);
+      }
+    }
+    @reset($_COOKIE);
+  }
+}
+
+//----------------------------------------------------- variable initialization
+
+define('DEFAULT_PREFIX_TABLE', 'piwigo_');
+
+if (isset($_POST['install']))
+{
+  $prefixeTable = $_POST['prefix'];
+}
+else
+{
+  $prefixeTable = DEFAULT_PREFIX_TABLE;
+}
+
+include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
+
+// download database config file if exists
+if (!empty($_GET['dl']) && file_exists(PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.$_GET['dl']))
+{
+  $filename = PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.$_GET['dl'];
+  header('Cache-Control: no-cache, must-revalidate');
+  header('Pragma: no-cache');
+  header('Content-Disposition: attachment; filename="database.inc.php"');
+  header('Content-Transfer-Encoding: binary');
+  header('Content-Length: '.filesize($filename));
+  echo file_get_contents($filename);
+  unlink($filename);
+  exit();
+} 
+
+// Obtain various vars
+$dbhost = (!empty($_POST['dbhost'])) ? $_POST['dbhost'] : 'localhost';
+$dbuser = (!empty($_POST['dbuser'])) ? $_POST['dbuser'] : '';
+$dbpasswd = (!empty($_POST['dbpasswd'])) ? $_POST['dbpasswd'] : '';
+$dbname = (!empty($_POST['dbname'])) ? $_POST['dbname'] : '';
+$dblayer = 'mysql';
+
+$admin_name = (!empty($_POST['admin_name'])) ? $_POST['admin_name'] : '';
+$admin_pass1 = (!empty($_POST['admin_pass1'])) ? $_POST['admin_pass1'] : '';
+$admin_pass2 = (!empty($_POST['admin_pass2'])) ? $_POST['admin_pass2'] : '';
+$admin_mail = (!empty($_POST['admin_mail'])) ? $_POST['admin_mail'] : '';
+
+$is_newsletter_subscribe = true;
+if (isset($_POST['install']))
+{
+  $is_newsletter_subscribe = isset($_POST['newsletter_subscribe']);
+}
+
+$infos = array();
+$errors = array();
+
+$config_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php';
+if (@file_exists($config_file))
+{
+  include($config_file);
+  // Is Piwigo already installed ?
+  if (defined("PHPWG_INSTALLED"))
+  {
+    die('Piwigo is already installed');
+  }
+}
+
+include(PHPWG_ROOT_PATH . 'include/constants.php');
+include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
+include(PHPWG_ROOT_PATH . 'admin/include/functions.php');
+
+include(PHPWG_ROOT_PATH . 'admin/include/languages.class.php');
+$languages = new languages('utf-8');
+
+if (isset($_GET['language']))
+{
+  $language = strip_tags($_GET['language']);
+  
+  if (!in_array($language, array_keys($languages->fs_languages)))
+  {
+    $language = PHPWG_DEFAULT_LANGUAGE;
+  }
+}
+else
+{
+  $language = 'en_UK';
+  // Try to get browser language
+  foreach ($languages->fs_languages as $language_code => $fs_language)
+  {
+    if (substr($language_code,0,2) == @substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2))
+    {
+      $language = $language_code;
+      break;
+    }
+  }
+}
+
+if ('fr_FR' == $language) {
+  define('PHPWG_DOMAIN', 'fr.piwigo.org');
+}
+else if ('it_IT' == $language) {
+  define('PHPWG_DOMAIN', 'it.piwigo.org');
+}
+else if ('de_DE' == $language) {
+  define('PHPWG_DOMAIN', 'de.piwigo.org');
+}
+else if ('es_ES' == $language) {
+  define('PHPWG_DOMAIN', 'es.piwigo.org');
+}
+else if ('pl_PL' == $language) {
+  define('PHPWG_DOMAIN', 'pl.piwigo.org');
+}
+else if ('zh_CN' == $language) {
+  define('PHPWG_DOMAIN', 'cn.piwigo.org');
+}
+else if ('hu_HU' == $language) {
+  define('PHPWG_DOMAIN', 'hu.piwigo.org');
+}
+else if ('ru_RU' == $language) {
+  define('PHPWG_DOMAIN', 'ru.piwigo.org');
+}
+else if ('nl_NL' == $language) {
+  define('PHPWG_DOMAIN', 'nl.piwigo.org');
+}
+else {
+  define('PHPWG_DOMAIN', 'piwigo.org');
+}
+define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
+
+load_language('common.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
+load_language('admin.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
+load_language('install.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
+
+header('Content-Type: text/html; charset=UTF-8');
+//------------------------------------------------- check php version
+if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
+{
+  include(PHPWG_ROOT_PATH.'install/php5_apache_configuration.php');
+}
+
+//----------------------------------------------------- template initialization
+$template = new Template(PHPWG_ROOT_PATH.'admin/themes', 'clear');
+$template->set_filenames( array('install' => 'install.tpl') );
+if (!isset($step))
+{
+  $step = 1;
+}
+//---------------------------------------------------------------- form analyze
+include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$dblayer.'.inc.php');
+include(PHPWG_ROOT_PATH . 'admin/include/functions_install.inc.php');
+include(PHPWG_ROOT_PATH . 'admin/include/functions_upgrade.php');
+
+if ( isset( $_POST['install'] ))
+{
+  install_db_connect($infos, $errors);
+  pwg_db_check_charset();
+
+  $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
+  if ( empty($webmaster))
+    array_push( $errors, l10n('enter a login for webmaster') );
+  else if ( preg_match( '/[\'"]/', $webmaster ) )
+    array_push( $errors, l10n('webmaster login can\'t contain characters \' or "') );
+  if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
+    array_push( $errors, l10n('please enter your password again') );
+  if ( empty($admin_mail))
+    array_push( $errors, l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)') );
+  else
+  {
+    $error_mail_address = validate_mail_address(null, $admin_mail);
+    if (!empty($error_mail_address))
+      array_push( $errors, $error_mail_address );
+  }
+
+  if ( count( $errors ) == 0 )
+  {
+    $step = 2;
+    $file_content = '<?php
+$conf[\'dblayer\'] = \''.$dblayer.'\';
+$conf[\'db_base\'] = \''.$dbname.'\';
+$conf[\'db_user\'] = \''.$dbuser.'\';
+$conf[\'db_password\'] = \''.$dbpasswd.'\';
+$conf[\'db_host\'] = \''.$dbhost.'\';
+
+$prefixeTable = \''.$prefixeTable.'\';
+
+define(\'PHPWG_INSTALLED\', true);
+define(\'PWG_CHARSET\', \'utf-8\');
+define(\'DB_CHARSET\', \'utf8\');
+define(\'DB_COLLATE\', \'\');
+
+?'.'>';
+
+    @umask(0111);
+    // writing the configuration file
+    if ( !($fp = @fopen( $config_file, 'w' )))
+    {
+      $tmp_filename = md5(uniqid(time()));
+      $fh = @fopen( PHPWG_ROOT_PATH.$conf['data_location'] . 'pwg_' . $tmp_filename, 'w' );
+      @fputs($fh, $file_content, strlen($file_content));
+      @fclose($fh);
+
+      $template->assign(
+        array(
+          'config_creation_failed' => true,
+          'config_url' => 'install.php?dl='.$tmp_filename,
+          'config_file_content' => $file_content,
+          )
+        );
+    }
+    @fputs($fp, $file_content, strlen($file_content));
+    @fclose($fp);
+
+    // tables creation, based on piwigo_structure.sql
+    execute_sqlfile(
+      PHPWG_ROOT_PATH.'install/piwigo_structure-'.$dblayer.'.sql',
+      DEFAULT_PREFIX_TABLE,
+      $prefixeTable,
+      $dblayer
+      );
+    // We fill the tables with basic informations
+    execute_sqlfile(
+      PHPWG_ROOT_PATH.'install/config.sql',
+      DEFAULT_PREFIX_TABLE,
+      $prefixeTable,
+      $dblayer
+      );
+
+    $query = '
+INSERT INTO '.$prefixeTable.'config (param,value,comment) 
+   VALUES (\'secret_key\',md5('.pwg_db_cast_to_text(DB_RANDOM_FUNCTION.'()').'),
+   \'a secret key specific to the gallery for internal use\');';
+    pwg_query($query);
+
+    conf_update_param('piwigo_db_version', get_branch_from_version(PHPWG_VERSION));
+    conf_update_param('gallery_title', l10n('Just another Piwigo gallery'));
+    conf_update_param('page_banner', '<h1>%gallery_title%</h1>'."\n\n<p>".l10n('Welcome to my photo gallery').'</p>');
+
+    // fill languages table
+    foreach ($languages->fs_languages as $language_code => $fs_language)
+    {
+      $languages->perform_action('activate', $language_code);
+    }
+
+    // fill $conf global array
+    load_conf_from_db();
+
+    // PWG_CHARSET is required for building the fs_themes array in the
+    // themes class
+    if (!defined('PWG_CHARSET'))
+    {
+      define('PWG_CHARSET', 'utf-8');
+    }
+    activate_core_themes();
+
+    $insert = array(
+      'id' => 1,
+      'galleries_url' => PHPWG_ROOT_PATH.'galleries/',
+      );
+    mass_inserts(SITES_TABLE, array_keys($insert), array($insert));
+
+    // webmaster admin user
+    $inserts = array(
+      array(
+        'id'           => 1,
+        'username'     => $admin_name,
+        'password'     => md5($admin_pass1),
+        'mail_address' => $admin_mail,
+        ),
+      array(
+        'id'           => 2,
+        'username'     => 'guest',
+        ),
+      );
+    mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
+
+    create_user_infos(array(1,2), array('language' => $language));
+
+    // Available upgrades must be ignored after a fresh installation. To
+    // make PWG avoid upgrading, we must tell it upgrades have already been
+    // made.
+    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+    define('CURRENT_DATE', $dbnow);
+    $datas = array();
+    foreach (get_available_upgrade_ids() as $upgrade_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'id'          => $upgrade_id,
+          'applied'     => CURRENT_DATE,
+          'description' => 'upgrade included in installation',
+          )
+        );
+    }
+    mass_inserts(
+      UPGRADE_TABLE,
+      array_keys($datas[0]),
+      $datas
+      );
+
+    if ($is_newsletter_subscribe)
+    {
+      fetchRemote(
+        get_newsletter_subscribe_base_url($language).$admin_mail,
+        $result,
+        array(),
+        array('origin' => 'installation')
+        );
+    }
+  }
+}
+
+//------------------------------------------------------ start template output
+foreach ($languages->fs_languages as $language_code => $fs_language)
+{
+  if ($language == $language_code)
+  {
+    $template->assign('language_selection', $language_code);
+  }
+  $languages_options[$language_code] = $fs_language['name'];
+}
+$template->assign('language_options', $languages_options);
+
+$template->assign(
+  array(
+    'T_CONTENT_ENCODING' => 'utf-8',
+    'RELEASE' => PHPWG_VERSION,
+    'F_ACTION' => 'install.php?language=' . $language,
+    'F_DB_HOST' => $dbhost,
+    'F_DB_USER' => $dbuser,
+    'F_DB_NAME' => $dbname,
+    'F_DB_PREFIX' => $prefixeTable,
+    'F_ADMIN' => $admin_name,
+    'F_ADMIN_EMAIL' => $admin_mail,
+    'EMAIL' => '<span class="adminEmail">'.$admin_mail.'</span>',
+    'F_NEWSLETTER_SUBSCRIBE' => $is_newsletter_subscribe,
+    'L_INSTALL_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
+    ));
+
+//------------------------------------------------------ errors & infos display
+if ($step == 1)
+{
+  $template->assign('install', true);
+}
+else
+{
+  array_push(
+    $infos,
+    l10n('Congratulations, Piwigo installation is completed')
+    );
+
+  if (isset($error_copy))
+  {
+    array_push($errors, $error_copy);
+  }
+  else
+  {
+    session_set_save_handler('pwg_session_open',
+      'pwg_session_close',
+      'pwg_session_read',
+      'pwg_session_write',
+      'pwg_session_destroy',
+      'pwg_session_gc'
+    );
+    if ( function_exists('ini_set') )
+    {
+      ini_set('session.use_cookies', $conf['session_use_cookies']);
+      ini_set('session.use_only_cookies', $conf['session_use_only_cookies']);
+      ini_set('session.use_trans_sid', intval($conf['session_use_trans_sid']));
+      ini_set('session.cookie_httponly', 1);
+    }
+    session_name($conf['session_name']);
+    session_set_cookie_params(0, cookie_path());
+    $user = build_user(1, true);
+    log_user($user['id'], false);
+    
+    // email notification
+    if (isset($_POST['send_password_by_mail']))
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+            
+      $keyargs_content = array(
+        get_l10n_args('Hello %s,', $admin_name),
+        get_l10n_args('Welcome to your new installation of Piwigo!', ''),
+        get_l10n_args('', ''),
+        get_l10n_args('Here are your connection settings', ''),
+        get_l10n_args('Username: %s', $admin_name),
+        get_l10n_args('Password: %s', $admin_pass1),
+        get_l10n_args('Email: %s', $admin_mail),
+        get_l10n_args('', ''),
+        get_l10n_args('Don\'t hesitate to consult our forums for any help: %s', PHPWG_URL),
+        );
+        
+      pwg_mail(
+        $admin_mail,
+        array(
+          'subject' => l10n('Just another Piwigo gallery'),
+          'content' => l10n_args($keyargs_content),
+          'content_format' => 'text/plain',
+          )
+        );
+    }
+  }
+}
+if (count($errors) != 0)
+{
+  $template->assign('errors', $errors);
+}
+
+if (count($infos) != 0 )
+{
+  $template->assign('infos', $infos);
+}
+
+//----------------------------------------------------------- html code display
+$template->pparse('install');
+?>
Index: tags/2.4.0RC3/install/config.sql
===================================================================
--- tags/2.4.0RC3/install/config.sql	(revision 14585)
+++ tags/2.4.0RC3/install/config.sql	(revision 14585)
@@ -0,0 +1,76 @@
+-- initial configuration for Piwigo
+
+INSERT INTO piwigo_config (param,value,comment) VALUES ('activate_comments','true','Global parameter for usage of comments system');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nb_comment_page','10','number of comments to display on each page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('log','true','keep an history of visits on your website');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('comments_validation','false','administrators validate users comments before becoming visible');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('comments_forall','false','even guest not registered can post comments');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('comments_order','ASC','comments order on picture page and cie');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('user_can_delete_comment','false','administrators can allow user delete their own comments');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('user_can_edit_comment','false','administrators can allow user edit their own comments');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('email_admin_on_comment_edition','false','Send an email to the administrators when a comment is modified');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('email_admin_on_comment_deletion','false','Send an email to the administrators when a comment is deleted');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('gallery_locked','false','Lock your gallery temporary for non admin users');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('gallery_title','','Title at top of each page and for RSS feed');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('rate','true','Rating pictures feature is enabled');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('rate_anonymous','true','Rating pictures feature is also enabled for visitors');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('page_banner','','html displayed on the top each page of your gallery');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('history_admin','false','keep a history of administrator visits on your website');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('history_guest','true','keep a history of guest visits on your website');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('allow_user_registration','true','allow visitors to register?');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('allow_user_customization','true','allow users to customize their gallery?');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nbm_send_html_mail','true','Send mail on HTML format for notification by mail');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nbm_send_mail_as','','Send mail as param value for notification by mail');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nbm_send_detailed_content','true','Send detailed content for notification by mail');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nbm_complementary_mail_content','','Complementary mail content for notification by mail');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('nbm_send_recent_post_dates','true','Send recent post by dates for notification by mail');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('email_admin_on_new_user','false','Send an email to theadministrators when a user registers');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('email_admin_on_comment','false','Send an email to the administrators when a valid comment is entered');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('email_admin_on_comment_validation','true','Send an email to the administrators when a comment requires validation');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('obligatory_user_mail_address','false','Mail address is obligatory for users');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('c13y_ignore',null,'List of ignored anomalies');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('extents_for_templates','a:0:{}','Actived template-extension(s)');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('blk_menubar','','Menubar options');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('menubar_filter_icon','false','Display filter icon');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_sort_order_input','true','Display image order selection list');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_flat_icon','false','Display flat icon');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_posted_date_icon','true','Display calendar by posted date');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_created_date_icon','true','Display calendar by creation date icon');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_slideshow_icon','true','Display slideshow icon');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('index_new_icon','true','Display new icons next albums and pictures');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_metadata_icon','true','Display metadata icon on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_slideshow_icon','true','Display slideshow icon on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_favorite_icon','true','Display favorite icon on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_download_icon','true','Display download icon on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_navigation_icons','true','Display navigation icons on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_navigation_thumb','true','Display navigation thumbnails on picture page');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('picture_menu','false','Show menubar on picture page');
+INSERT INTO piwigo_config (param,value,comment)
+  VALUES (
+    'picture_informations',
+    'a:11:{s:6:"author";b:1;s:10:"created_on";b:1;s:9:"posted_on";b:1;s:10:"dimensions";b:0;s:4:"file";b:0;s:8:"filesize";b:0;s:4:"tags";b:1;s:10:"categories";b:1;s:6:"visits";b:1;s:12:"rating_score";b:1;s:13:"privacy_level";b:1;}',
+    'Information displayed on picture page'
+  );
+INSERT INTO piwigo_config (param,value,comment) VALUES ('week_starts_on','monday','Monday may not be the first day of the week');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('updates_ignored','a:3:{s:7:"plugins";a:0:{}s:6:"themes";a:0:{}s:9:"languages";a:0:{}}','Extensions ignored for update');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('order_by','ORDER BY date_available DESC, file ASC, id ASC','default photo order');
+INSERT INTO piwigo_config (param,value,comment) VALUES ('order_by_inside_category','ORDER BY date_available DESC, file ASC, id ASC','default photo order inside category');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_websize_resize','false');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_websize_maxwidth','800');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_websize_maxheight','600');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_websize_quality','95');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_thumb_maxwidth','128');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_thumb_maxheight','96');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_thumb_quality','95');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_thumb_crop','false');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_thumb_follow_orientation','true');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_hd_keep','true');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_hd_resize','false');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_hd_maxwidth','2000');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_hd_maxheight','2000');
+INSERT INTO piwigo_config (param,value) VALUES ('upload_form_hd_quality','95');
+INSERT INTO piwigo_config (param,value) VALUES ('original_resize','false');
+INSERT INTO piwigo_config (param,value) VALUES ('original_resize_maxwidth','2016');
+INSERT INTO piwigo_config (param,value) VALUES ('original_resize_maxheight','2016');
+INSERT INTO piwigo_config (param,value) VALUES ('original_resize_quality','95');
+INSERT INTO piwigo_config (param,value) VALUES ('mobile_theme',null);
Index: tags/2.4.0RC3/install/db/100-database.php
===================================================================
--- tags/2.4.0RC3/install/db/100-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/100-database.php	(revision 14585)
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add high_width and high_height fields into IMAGES_TABLE';
+
+if ('mysql' == $conf['dblayer'])
+{
+  $query = 'ALTER TABLE '.IMAGES_TABLE.' 
+    ADD COLUMN `high_width` smallint(9) unsigned default NULL, 
+    ADD COLUMN `high_height` smallint(9) unsigned default NULL;';
+}
+
+if (in_array($conf['dblayer'], array('pgsql', 'sqlite', 'pdo-sqlite')))
+{
+  $query = 'ALTER TABLE '.IMAGES_TABLE.' 
+    ADD COLUMN "high_width" INTEGER, 
+    ADD COLUMN "high_height" INTEGER;';
+}
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/101-database.php
===================================================================
--- tags/2.4.0RC3/install/db/101-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/101-database.php	(revision 14585)
@@ -0,0 +1,65 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'merge nb_line_page and nb_image_line into nb_image_page';
+
+// add column
+if ('mysql' == $conf['dblayer'])
+{
+  pwg_query('
+    ALTER TABLE '.USER_INFOS_TABLE.' 
+      ADD COLUMN `nb_image_page` smallint(3) unsigned NOT NULL default \'15\'
+  ;');
+}
+else if (in_array($conf['dblayer'], array('pgsql', 'sqlite', 'pdo-sqlite')))
+{
+  pwg_query('
+    ALTER TABLE '.USER_INFOS_TABLE.' 
+      ADD COLUMN "nb_image_page" INTEGER default 15 NOT NULL
+  ;');
+}
+
+// merge datas
+pwg_query('
+  UPDATE '.USER_INFOS_TABLE.' 
+  SET nb_image_page = nb_line_page*nb_image_line
+;');
+
+// delete old columns
+pwg_query('
+  ALTER TABLE '.USER_INFOS_TABLE.' 
+    DROP `nb_line_page`,
+    DROP `nb_image_line`
+;');
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/102-database.php
===================================================================
--- tags/2.4.0RC3/install/db/102-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/102-database.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'change nb_image_page into smallint(3)';
+
+// add column
+if ('mysql' == $conf['dblayer'])
+{
+  pwg_query('
+    ALTER TABLE '.USER_INFOS_TABLE.' 
+      CHANGE `nb_image_page` `nb_image_page` SMALLINT(3) UNSIGNED NOT NULL DEFAULT 15
+  ;');
+}
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/103-database.php
===================================================================
--- tags/2.4.0RC3/install/db/103-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/103-database.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Extensions ignored for update';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config (param,value,comment)
+  VALUES (\'updates_ignored\',\'a:3:{s:7:"plugins";a:0:{}s:6:"themes";a:0:{}s:9:"languages";a:0:{}}\', \''.$upgrade_description.'\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/104-database.php
===================================================================
--- tags/2.4.0RC3/install/db/104-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/104-database.php	(revision 14585)
@@ -0,0 +1,86 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add upload form parameters in database';
+
+global $conf;
+
+load_conf_from_db();
+
+$upload_form_config = array(
+  'websize_resize' => true,
+  'websize_maxwidth' => 800,
+  'websize_maxheight' => 600,
+  'websize_quality' => 95,
+  'thumb_maxwidth' => 128,
+  'thumb_maxheight' => 96,
+  'thumb_quality' => 95,
+  'thumb_crop' => false,
+  'thumb_follow_orientation' => true,
+  'hd_keep' => true,
+  'hd_resize' => false,
+  'hd_maxwidth' => 2000,
+  'hd_maxheight' => 2000,
+  'hd_quality' => 95,
+);
+
+$inserts = array();
+
+foreach ($upload_form_config as $param_shortname => $param)
+{
+  $param_name = 'upload_form_'.$param_shortname;
+
+  if (!isset($conf[$param_name]))
+  {
+    $conf[$param_name] = $param;
+    
+    array_push(
+      $inserts,
+      array(
+        'param' => $param_name,
+        'value' => boolean_to_string($param),
+        )
+      );
+  }
+}
+
+if (count($inserts) > 0)
+{
+  mass_inserts(
+    CONFIG_TABLE,
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/105-database.php
===================================================================
--- tags/2.4.0RC3/install/db/105-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/105-database.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Show menubar on picture page';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config (param,value,comment)
+  VALUES (\'picture_menu\',\'false\', \''.$upgrade_description.'\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/106-database.php
===================================================================
--- tags/2.4.0RC3/install/db/106-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/106-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add order parameters to bdd';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config(param,value,comment) 
+  VALUES (\'order_by\', \''.$conf['order_by'].'\', \'default photos order\')
+;';
+pwg_query($query);
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config(param,value,comment) 
+  VALUES (\'order_by_inside_category\', \''.$conf['order_by_inside_category'].'\', \'default photos order inside category\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/107-database.php
===================================================================
--- tags/2.4.0RC3/install/db/107-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/107-database.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Display new icons next albums and pictures';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config (param,value,comment) 
+  VALUES (\'index_new_icon\',\'true\',\'Display new icons next albums and pictures\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/108-database.php
===================================================================
--- tags/2.4.0RC3/install/db/108-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/108-database.php	(revision 14585)
@@ -0,0 +1,127 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add order parameters to bdd #2';
+
+$order_regex = '#^(( *)(id|file|name|date_available|date_creation|hit|average_rate|comment|author|filesize|width|height|high_filesize|high_width|high_height|rank) (ASC|DESC),{1}){1,}$#';
+
+// local file is writable
+if ( is_writable($local_file = PHPWG_ROOT_PATH. 'local/config/config.inc.php') )
+{
+  $order_by = str_ireplace(
+    array('order by ', 'asc', 'desc'),
+    array(null, 'ASC', 'DESC'),
+    trim($conf['order_by_inside_category'])
+    );
+    
+  // for a simple patern
+  if ( preg_match($order_regex, $order_by.',') )
+  {
+    $order_by = 'ORDER BY '.$order_by;
+    // update database
+    $query = '
+    UPDATE '.PREFIX_TABLE.'config
+      SET value = \''.preg_replace('# rank (ASC|DESC)(,?)#', null, $order_by).'\'
+      WHERE param = \'order_by\'
+    ;';
+    pwg_query($query);
+    $query = '
+    UPDATE '.PREFIX_TABLE.'config
+      SET value = \''.$order_by.'\'
+      WHERE param = \'order_by_inside_category\'
+    ';
+    pwg_query($query);
+    
+    // update local file (delete lines)
+    $local_config = file($local_file);
+    $new_local_config = array();
+    foreach ($local_config as $line)
+    {
+      if (strpos($line, 'order_by') === false)
+      {
+        $new_local_config[] = $line;
+      }
+    }
+    var_dump($new_local_config);
+    file_put_contents(
+      $local_file,
+      implode("", $new_local_config)
+      );
+  }
+  // for a complex patern
+  else
+  {
+    // update database with default param
+    $query = '
+    UPDATE '.PREFIX_TABLE.'config
+      SET value = \'ORDER BY date_available DESC, file ASC, id ASC\'
+      WHERE param = \'order_by\'
+    ;';
+    pwg_query($query);
+    $query = '
+    UPDATE '.PREFIX_TABLE.'config
+      SET value = \'ORDER BY date_available DESC, file ASC, id ASC\'
+      WHERE param = \'order_by_inside_category\'
+    ';
+    pwg_query($query);
+    
+    // update local file (rename lines)
+    $local_config = file_get_contents($local_file);
+    $new_local_config = str_replace(
+      array("['order_by']", "['order_by_inside_category']"),
+      array("['order_by_custom']", "['order_by_inside_category_custom']"),
+      $local_config
+      );
+    file_put_contents($local_file, $new_local_config);
+  }
+  
+}
+// local file is locked
+else
+{
+  // update database with default param
+  $query = '
+  UPDATE '.PREFIX_TABLE.'config
+    SET value = \'ORDER BY date_available DESC, file ASC, id ASC\'
+    WHERE param = \'order_by\'
+  ;';
+  pwg_query($query);
+  $query = '
+  UPDATE '.PREFIX_TABLE.'config
+    SET value = \'ORDER BY date_available DESC, file ASC, id ASC\'
+    WHERE param = \'order_by_inside_category\'
+  ';
+  pwg_query($query);
+}
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/109-database.php
===================================================================
--- tags/2.4.0RC3/install/db/109-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/109-database.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+$upgrade_description = 'Rename #images.average_rate to ratingscore.';
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+if ('mysql' == $conf['dblayer'])
+  $q = 'ALTER TABLE '.IMAGES_TABLE.' CHANGE average_rate rating_score float(5,2) unsigned default NULL';
+else
+  $q = 'ALTER TABLE '.IMAGES_TABLE.' RENAME average_rate TO rating_score';
+pwg_query($q);
+
+$q="UPDATE ".CATEGORIES_TABLE." SET image_order=REPLACE(image_order, 'average_rate', 'rating_score')";
+pwg_query($q);
+
+$q="UPDATE ".CONFIG_TABLE." SET value=REPLACE(value, 'average_rate', 'rating_score')
+WHERE param IN ('picture_informations', 'order_by', 'order_by_inside_category')";
+pwg_query($q);
+?>
Index: tags/2.4.0RC3/install/db/110-database.php
===================================================================
--- tags/2.4.0RC3/install/db/110-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/110-database.php	(revision 14585)
@@ -0,0 +1,117 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+defined('PHPWG_ROOT_PATH') or die('Hacking attempt!');
+
+$upgrade_description = 'Move "gallery_url" parameter from config table to local configuration file';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+if (!isset($page))
+{
+  $page = array();
+}
+
+if (!isset($page['errors']))
+{
+  $page['errors'] = array();
+}
+
+$query = '
+SELECT
+    value
+  FROM '.CONFIG_TABLE.'
+  WHERE param =\'gallery_url\'
+;';
+list($gallery_url) = pwg_db_fetch_row(pwg_query($query));
+
+if (!empty($gallery_url))
+{
+  // let's try to write it in the local configuration file
+  $local_conf = PHPWG_ROOT_PATH. 'local/config/config.inc.php';
+  if (isset($conf['local_dir_site']))
+  {
+    $local_conf = PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'config/config.inc.php';
+  }
+
+  $conf_line = '$conf[\'gallery_url\'] = \''.$gallery_url.'\';';
+
+  if (!is_file($local_conf))
+  {
+    $config_file_contents_new = "<?php\n".$conf_line."\n?>";
+  }
+  else
+  {
+    // we have to update the local conf
+    $config_file_contents = @file_get_contents($local_conf);
+    if ($config_file_contents === false)
+    {
+      $error = 'Cannot load '.$local_conf.', add by hand: '.$conf_line;
+      
+      array_push($page['errors'], $error);
+      echo $error;
+    }
+    else
+    {
+      $php_end_tag = strrpos($config_file_contents, '?'.'>');
+      if ($php_end_tag === false)
+      {
+        // the file is empty
+        $config_file_contents_new = "<?php\n".$conf_line."\n?>";
+      }
+      else
+      {
+        $config_file_contents_new =
+          substr($config_file_contents, 0, $php_end_tag) . "\n"
+          .$conf_line."\n"
+          .substr($config_file_contents, $php_end_tag)
+          ;
+      }
+    }
+  }
+
+  if (isset($config_file_contents_new))
+  {
+    if (!@file_put_contents($local_conf, $config_file_contents_new))
+    {
+      $error = 'Cannot write into local configuration file '.$local_conf.', add by hand: '.$conf_line;
+      
+      array_push($page['errors'], $error);
+      echo $error;
+    }
+  }
+}
+
+$query = '
+DELETE
+  FROM '.CONFIG_TABLE.'
+  WHERE param =\'gallery_url\'
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/111-database.php
===================================================================
--- tags/2.4.0RC3/install/db/111-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/111-database.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'New colum user_infos.activation_key';
+
+// Add column
+$query = 'ALTER TABLE '.USER_INFOS_TABLE.' ADD COLUMN ';
+
+if ('mysql' == $conf['dblayer'])
+{
+  $query.= ' `activation_key` char(20) default NULL';
+}
+
+if (in_array($conf['dblayer'], array('pgsql', 'sqlite', 'pdo-sqlite')))
+{
+  $query.= ' "activation_key" CHAR(20) default NULL';
+}
+
+$query.= ';';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/112-database.php
===================================================================
--- tags/2.4.0RC3/install/db/112-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/112-database.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Change combined dir';
+
+// Add column
+$query = 'DELETE FROM '.CONFIG_TABLE.'
+  WHERE param IN (\'local_data_dir_checked\', \'combined_dir_checked\') ';
+
+pwg_query($query);
+
+$dir=PHPWG_ROOT_PATH.'local/combined/';
+if (is_dir($dir))
+{
+  foreach (glob($dir.'*.css') as $file)
+  {
+    @unlink($file);
+  }
+  foreach (glob($dir.'*.js') as $file)
+    @unlink($file);
+  @unlink($dir.'index.htm');
+  @rmdir($dir);
+}
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/113-database.php
===================================================================
--- tags/2.4.0RC3/install/db/113-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/113-database.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'New settings for resizing original photo (related to multiple sizes feature)';
+
+conf_update_param('original_resize', 'false');
+conf_update_param('original_resize_maxwidth', 2016);
+conf_update_param('original_resize_maxheight', 2016);
+conf_update_param('original_resize_quality', 95);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/114-database.php
===================================================================
--- tags/2.4.0RC3/install/db/114-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/114-database.php	(revision 14585)
@@ -0,0 +1,38 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'new parameter: Activate comments';
+
+conf_update_param('activate_comments', 'true');
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/115-database.php
===================================================================
--- tags/2.4.0RC3/install/db/115-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/115-database.php	(revision 14585)
@@ -0,0 +1,38 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'New setting for comments order on picture page';
+
+conf_update_param('comments_order', 'ASC');
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/116-database.php
===================================================================
--- tags/2.4.0RC3/install/db/116-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/116-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add #images.coi';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+ALTER TABLE '.IMAGES_TABLE.' ADD COLUMN coi CHAR(4) DEFAULT NULL COMMENT \'center of interest\' AFTER height
+';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/117-database.php
===================================================================
--- tags/2.4.0RC3/install/db/117-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/117-database.php	(revision 14585)
@@ -0,0 +1,65 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'fill empty images name with filename';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'SELECT id, file FROM '.IMAGES_TABLE.' WHERE name IS NULL;';
+$images = pwg_query($query);
+
+$updates = array();
+while ($row = pwg_db_fetch_assoc($images))
+{
+  $updates[] = array(
+    'id' => $row['id'],
+    'name' => get_name_from_file($row['file']),
+    );
+}
+  
+mass_updates(
+  IMAGES_TABLE,
+  array(
+    'primary' => array('id'),
+    'update' => array('name'),
+    ),
+  $updates
+  );
+
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/118-database.php
===================================================================
--- tags/2.4.0RC3/install/db/118-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/118-database.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Automatically activate mobile theme.';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+$themes = new themes();
+$themes->perform_action('activate', 'smartpocket');
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/119-database.php
===================================================================
--- tags/2.4.0RC3/install/db/119-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/119-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Reset derivative configuration to include XXS and XS sizes.';
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+clear_derivative_cache();
+
+$derivative_conf_file = PHPWG_ROOT_PATH.$conf['data_location'].'derivatives.dat';
+if (is_file($derivative_conf_file))
+{
+  unlink($derivative_conf_file);
+}
+
+conf_update_param('derivatives', '');
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/120-database.php
===================================================================
--- tags/2.4.0RC3/install/db/120-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/120-database.php	(revision 14585)
@@ -0,0 +1,39 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'rotation mode (code, not angle) is stored in the database';
+
+$query = 'ALTER TABLE '.IMAGES_TABLE.' ADD COLUMN rotation tinyint unsigned DEFAULT NULL';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/61-database.php
===================================================================
--- tags/2.4.0RC3/install/db/61-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/61-database.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add unique index on #_groups for name';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+
+$query = "
+alter table ".GROUPS_TABLE."
+  add UNIQUE KEY `groups_ui1` (`name`)
+;";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/62-database.php
===================================================================
--- tags/2.4.0RC3/install/db/62-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/62-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add obligatory_user_mail config';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+INSERT INTO ".CONFIG_TABLE." (param,value,comment) VALUES ('obligatory_user_mail_address','false','Mail address is obligatory for users');
+";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/63-database.php
===================================================================
--- tags/2.4.0RC3/install/db/63-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/63-database.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add #user_infos.level, #images.level and #user_cache.forbidden_images';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+ALTER TABLE '.IMAGES_TABLE.' ADD COLUMN level TINYINT UNSIGNED NOT NULL DEFAULT 0
+';
+pwg_query($query);
+
+$query = '
+ALTER TABLE '.USER_INFOS_TABLE.' ADD COLUMN level TINYINT UNSIGNED NOT NULL DEFAULT 0
+';
+pwg_query($query);
+
+$query = '
+ALTER TABLE '.USER_CACHE_TABLE.' ADD COLUMN image_access_type enum("NOT IN","IN") NOT NULL default "NOT IN"
+';
+pwg_query($query);
+
+$query = '
+ALTER TABLE '.USER_CACHE_TABLE.' ADD COLUMN image_access_list TEXT DEFAULT NULL
+';
+pwg_query($query);
+
+$query = '
+UPDATE '.USER_INFOS_TABLE.' SET level=8 WHERE status="webmaster"
+';
+pwg_query($query);
+
+$query = '
+UPDATE '.USER_CACHE_TABLE.' SET need_update=true
+';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/64-database.php
===================================================================
--- tags/2.4.0RC3/install/db/64-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/64-database.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Activation of c13_upgrade plugin';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+REPLACE INTO '.PLUGINS_TABLE.'
+  (id, state)
+  VALUES (\'c13y_upgrade\', \'active\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/65-database.php
===================================================================
--- tags/2.4.0RC3/install/db/65-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/65-database.php	(revision 14585)
@@ -0,0 +1,300 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+function upgrade65_change_table_to_blob($table, $field_definitions)
+{
+  $types = array('varchar'  => 'varbinary',
+    'text' => 'blob',
+    'mediumtext' => 'mediumblob',
+    'longtext' => 'longblob');
+
+  $changes=array();
+  foreach( $field_definitions as $row)
+  {
+    if ( !isset($row['Collation']) or $row['Collation']=='NULL' )
+      continue;
+    list ($type) = explode('(', $row['Type']);
+    if (!isset($types[$type]))
+      continue; // no need
+    $binaryType = preg_replace('/'. $type .'/i', $types[$type], $row['Type'] );
+    $changes[] = 'MODIFY COLUMN '.$row['Field'].' '.$binaryType;
+  }
+  if (count($changes))
+  {
+    $query = 'ALTER TABLE '.$table.' '.implode(', ', $changes);
+    pwg_query($query);
+  }
+}
+
+function upgrade65_change_table_to_charset($table, $field_definitions, $db_charset)
+{
+  $changes=array();
+  foreach( $field_definitions as $row)
+  {
+    if ( !isset($row['Collation']) or $row['Collation']=='NULL' )
+      continue;
+    $query = $row['Field'].' '.$row['Type'];
+    $query .= ' CHARACTER SET '.$db_charset;
+    if (strpos($row['Collation'],'_bin')!==false)
+    {
+      $query .= ' BINARY';
+    }
+    if ($row['Null']!='YES')
+    {
+      $query.=' NOT NULL';
+      if (isset($row['Default']))
+        $query.=' DEFAULT "'.addslashes($row['Default']).'"';
+    }
+    else
+    {
+      if (!isset($row['Default']))
+        $query.=' DEFAULT NULL';
+      else
+        $query.=' DEFAULT "'.addslashes($row['Default']).'"';
+    }
+
+    if ($row['Extra']=='auto_increment')
+    {
+      $query.=' auto_increment';
+    }
+    $changes[] = 'MODIFY COLUMN '.$query;
+  }
+
+  if (count($changes))
+  {
+    $query = 'ALTER TABLE `'.$table.'` '.implode(', ', $changes);
+    pwg_query($query);
+  }
+}
+
+
+$upgrade_description = 'PWG charset migration';
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+if ( !defined('PWG_CHARSET') )
+{
+  $upgrade_log = '';
+
+// +-----------------------------------------------------------------------+
+// load all the user languages
+  $all_langs=array();
+  $query='
+SELECT language, COUNT(user_id) AS count FROM '.USER_INFOS_TABLE.'
+  GROUP BY language';
+  $result = pwg_query($query);
+  while ( $row=pwg_db_fetch_assoc($result) )
+  {
+    $language = $row["language"];
+    $lang_def = explode('.', $language);
+    if ( count($lang_def)==2 )
+    {
+      $new_lang = $lang_def[0];
+      $charset = strtolower($lang_def[1]);
+    }
+    else
+    {
+      $new_lang = 'en_UK';
+      $charset = 'iso-8859-1';
+    }
+    $all_langs[$language] = array(
+      'count' => $row['count'],
+      'new_lang' => $new_lang,
+      'charset' => $charset,
+      );
+    $upgrade_log .= ">>user_lang\t".$language."\t".$row['count']."\n";
+  }
+  $upgrade_log .= "\n";
+
+
+// +-----------------------------------------------------------------------+
+// get admin charset
+  include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+  @include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+  $admin_charset='iso-8859-1';
+  $query='
+SELECT language FROM '.USER_INFOS_TABLE.'
+  WHERE user_id='.$conf['webmaster_id'];
+  $result = pwg_query($query);
+  if (pwg_db_num_rows($result)==0)
+  {
+    $query='
+SELECT language FROM '.USER_INFOS_TABLE.'
+  WHERE status="webmaster" and adviser="false"
+  LIMIT 1';
+    $result = pwg_query($query);
+  }
+
+  if ( $row=pwg_db_fetch_assoc($result) )
+  {
+    $admin_charset = $all_langs[$row['language']]['charset'];
+  }
+  $upgrade_log .= ">>admin_charset\t".$admin_charset."\n";
+
+
+// +-----------------------------------------------------------------------+
+// get mysql version and structure of tables
+  $mysql_version = mysql_get_server_info();
+  $upgrade_log .= ">>mysql_ver\t".$mysql_version."\n";
+
+  $all_tables = array();
+  $query = 'SHOW TABLES LIKE "'.$prefixeTable.'%"';
+  $result = pwg_query($query);
+  while ( $row=pwg_db_fetch_row($result) )
+  {
+    array_push($all_tables, $row[0]);
+  }
+
+  $all_tables_definition = array();
+  foreach( $all_tables as $table)
+  {
+    $query = 'SHOW FULL COLUMNS FROM '.$table;
+    $result = pwg_query($query);
+    $field_definitions=array();
+    while ( $row=pwg_db_fetch_assoc($result) )
+    {
+      if ( !isset($row['Collation']) or $row['Collation']=='NULL' )
+        continue;
+      array_push($field_definitions, $row);
+    }
+    $all_tables_definition[$table] = $field_definitions;
+  }
+
+// +-----------------------------------------------------------------------+
+// calculate the result and convert the tables
+
+//tables that can be converted without going through binary (they contain only ascii data)
+  $safe_tables=array('history','history_backup','history_summary','old_permalinks','plugins','rate','upgrade','user_cache','user_feed','user_infos','user_mail_notification', 'users', 'waiting','ws_access');
+  $safe_tables=array_flip($safe_tables);
+
+  $pwg_charset = 'iso-8859-1';
+  $db_charset = 'latin1';
+  $db_collate = '';
+  if ( version_compare($mysql_version, '4.1', '<') )
+  { // below 4.1 no charset support
+    $upgrade_log .= "< conversion\tnothing\n";
+  }
+  elseif ($admin_charset=='iso-8859-1')
+  {
+    $pwg_charset = 'utf-8';
+    $db_charset = 'utf8';
+    foreach($all_tables as $table)
+    {
+      upgrade65_change_table_to_charset($table, $all_tables_definition[$table], 'utf8' );
+      $query = 'ALTER TABLE '.$table.' DEFAULT CHARACTER SET utf8';
+      pwg_query($query);
+    }
+    $upgrade_log .= "< conversion\tchange utf8\n";
+  }
+/*ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name; (or change column character set)
+
+Warning: The preceding operation converts column values between the character sets. This is not what you want if you have a column in one character set (like latin1) but the stored values actually use some other, incompatible character set (like utf8). In this case, you have to do the following for each such column:
+
+ALTER TABLE t1 CHANGE c1 c1 BLOB;
+ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
+*/
+  elseif ( $admin_charset=='utf-8')
+  {
+    $pwg_charset = 'utf-8';
+    $db_charset = 'utf8';
+    foreach($all_tables as $table)
+    {
+      if ( !isset($safe_tables[ substr($table, strlen($prefixeTable)) ]) )
+        upgrade65_change_table_to_blob($table, $all_tables_definition[$table] );
+      upgrade65_change_table_to_charset($table, $all_tables_definition[$table], 'utf8' );
+      $query = 'ALTER TABLE '.$table.' DEFAULT CHARACTER SET utf8';
+      pwg_query($query);
+    }
+    $upgrade_log .= "< conversion\tchange binary\n";
+    $upgrade_log .= "< conversion\tchange utf8\n";
+  }
+  elseif ( $admin_charset=='iso-8859-2'/*Central European*/)
+  {
+    $pwg_charset = 'utf-8';
+    $db_charset = 'utf8';
+    foreach($all_tables as $table)
+    {
+      if ( !isset($safe_tables[ substr($table, strlen($prefixeTable)) ]) )
+      {
+        upgrade65_change_table_to_blob($table, $all_tables_definition[$table] );
+        upgrade65_change_table_to_charset($table, $all_tables_definition[$table], 'latin2' );
+      }
+      upgrade65_change_table_to_charset($table, $all_tables_definition[$table], 'utf8' );
+      $query = 'ALTER TABLE '.$table.' DEFAULT CHARACTER SET utf8';
+      pwg_query($query);
+    }
+    $upgrade_log .= "< conversion\tchange binary\n";
+    $upgrade_log .= "< conversion\tchange latin2\n";
+    $upgrade_log .= "< conversion\tchange utf8\n";
+  }
+
+
+// +-----------------------------------------------------------------------+
+// changes to write in database.inc.php
+  array_push($mysql_changes,
+'define(\'PWG_CHARSET\', \''.$pwg_charset.'\');
+define(\'DB_CHARSET\',  \''.$db_charset.'\');
+define(\'DB_COLLATE\',  \'\');'
+  );
+
+  foreach ($all_langs as $old_lang=>$lang_data)
+  {
+    $query='
+  UPDATE '.USER_INFOS_TABLE.' SET language="'.$lang_data['new_lang'].'"
+    WHERE language="'.$old_lang.'"';
+    pwg_query($query);
+  }
+
+  define('PWG_CHARSET', $pwg_charset);
+  define('DB_CHARSET',  $db_charset);
+  define('DB_COLLATE',  '');
+
+  if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') and DB_CHARSET!='' )
+  {
+    pwg_query('SET NAMES "'.DB_CHARSET.'"');
+  }
+
+  echo $upgrade_log;
+  $fp = @fopen( PHPWG_ROOT_PATH.'upgrade65.log', 'w' );
+  if ($fp)
+  {
+    @fputs($fp, $upgrade_log, strlen($upgrade_log));
+    @fclose($fp);
+  }
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+}
+else
+{
+  echo 'PWG_CHARSET already defined - nada';
+}
+?>
Index: tags/2.4.0RC3/install/db/66-database.php
===================================================================
--- tags/2.4.0RC3/install/db/66-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/66-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add c13y_ignore config';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+INSERT INTO ".CONFIG_TABLE." (param,value,comment) VALUES ('c13y_ignore',null,'List of ignored anomalies');
+";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/67-database.php
===================================================================
--- tags/2.4.0RC3/install/db/67-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/67-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Uninstall dew plugin';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+delete from ".PLUGINS_TABLE." where id ='dew';
+";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/68-database.php
===================================================================
--- tags/2.4.0RC3/install/db/68-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/68-database.php	(revision 14585)
@@ -0,0 +1,55 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Change type from text to mediumtext for #sessions.data #user_cache.forbidden_categories and #user_cache.image_access_list';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+ALTER TABLE '.SESSIONS_TABLE.'
+  MODIFY COLUMN data MEDIUMTEXT NOT NULL';
+pwg_query($query);
+
+$query = '
+ALTER TABLE '.USER_CACHE_TABLE.'
+  MODIFY COLUMN forbidden_categories MEDIUMTEXT,
+  MODIFY COLUMN image_access_list MEDIUMTEXT
+  ';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/69-database.php
===================================================================
--- tags/2.4.0RC3/install/db/69-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/69-database.php	(revision 14585)
@@ -0,0 +1,58 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Move #categories.date_last and nb_images to #user_cache_categories';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+ALTER TABLE '.USER_CACHE_CATEGORIES_TABLE.'
+  ADD COLUMN date_last datetime default NULL AFTER cat_id,
+  ADD COLUMN nb_images mediumint(8) unsigned NOT NULL default 0 AFTER max_date_last';
+pwg_query($query);
+
+$query = '
+ALTER TABLE '.CATEGORIES_TABLE.'
+  DROP COLUMN date_last,
+  DROP COLUMN nb_images
+  ';
+pwg_query($query);
+
+invalidate_user_cache(); // just to force recalculation
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/70-database.php
===================================================================
--- tags/2.4.0RC3/install/db/70-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/70-database.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add upload config';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+replace into ".CONFIG_TABLE."
+  (param, value, comment)
+values
+('upload_link_everytime','false','Show Upload link every time'),
+('upload_user_access',".ACCESS_CLASSIC.",'Minimal user status allowed to upload pictures')
+;";
+
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/71-database.php
===================================================================
--- tags/2.4.0RC3/install/db/71-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/71-database.php	(revision 14585)
@@ -0,0 +1,58 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Delete unnecessary #history_summary.id, #history.year, #history.month, #history.day and #history.hour';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'ALTER TABLE '.HISTORY_SUMMARY_TABLE.'
+DROP PRIMARY KEY,
+DROP COLUMN id,
+ADD UNIQUE KEY history_summary_ymdh (`year`, `month`, `day`, `hour`)
+;';
+pwg_query($query);
+
+$query = 'ALTER TABLE '.HISTORY_TABLE.'
+DROP COLUMN year,
+DROP COLUMN month,
+DROP COLUMN day,
+DROP COLUMN hour
+;';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/72-database.php
===================================================================
--- tags/2.4.0RC3/install/db/72-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/72-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add extents_for_templates config';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+INSERT INTO ".CONFIG_TABLE." (param,value,comment) VALUES ('extents_for_templates','a:0:{}','Actived template-extension(s)');
+";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/73-database.php
===================================================================
--- tags/2.4.0RC3/install/db/73-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/73-database.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add #user_cache.cache_update_time';
+
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = '
+ALTER TABLE '.USER_CACHE_TABLE.' ADD COLUMN `cache_update_time` INTEGER UNSIGNED NOT NULL DEFAULT 0 AFTER need_update';
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/74-database.php
===================================================================
--- tags/2.4.0RC3/install/db/74-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/74-database.php	(revision 14585)
@@ -0,0 +1,48 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add blk_menubar config';
+
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = "
+INSERT INTO ".CONFIG_TABLE." (param,value,comment) VALUES ('blk_menubar','','Menubar options');
+";
+pwg_query($query);
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/75-database.php
===================================================================
--- tags/2.4.0RC3/install/db/75-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/75-database.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add blk_menubar config';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'DROP TABLE IF EXISTS '.$prefixeTable.'ws_access';
+pwg_query($query);
+
+$upgrade_description = $query;
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/76-database.php
===================================================================
--- tags/2.4.0RC3/install/db/76-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/76-database.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add image_category.rank column';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'ALTER TABLE '.IMAGE_CATEGORY_TABLE.' add column `rank` mediumint(8) unsigned default NULL';
+pwg_query($query);
+
+$upgrade_description = $query;
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/77-database.php
===================================================================
--- tags/2.4.0RC3/install/db/77-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/77-database.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'images.file categories.permalink old_permalinks.permalink - become binary';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'ALTER TABLE '.CATEGORIES_TABLE.'
+  MODIFY COLUMN permalink varchar(64) binary default NULL';
+pwg_query($query);
+
+$query = 'ALTER TABLE '.OLD_PERMALINKS_TABLE.'
+  MODIFY COLUMN permalink varchar(64) binary NOT NULL default ""';
+pwg_query($query);
+
+$query = 'ALTER TABLE '.IMAGES_TABLE.'
+  MODIFY COLUMN file varchar(255) binary NOT NULL default ""';
+pwg_query($query);
+
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/78-database.php
===================================================================
--- tags/2.4.0RC3/install/db/78-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/78-database.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add images.md5sum column, for web API uploaded photos';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+$query = 'ALTER TABLE '.IMAGES_TABLE.' add column `md5sum` char(32) default NULL';
+pwg_query($query);
+
+$upgrade_description = $query;
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/79-database.php
===================================================================
--- tags/2.4.0RC3/install/db/79-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/79-database.php	(revision 14585)
@@ -0,0 +1,47 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Update default template';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+
+// set yoga/Sylvia as default value for user_infos.template column
+$query = '
+ALTER TABLE '.PREFIX_TABLE.'user_infos
+  CHANGE COLUMN template template varchar(255) NOT NULL default \'yoga/Sylvia\'
+;';
+pwg_query($query);
+
+echo
+"\n"
+.'Default template modified to yoga/Sylvia'
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/80-database.php
===================================================================
--- tags/2.4.0RC3/install/db/80-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/80-database.php	(revision 14585)
@@ -0,0 +1,988 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+/* $list_files generated by this sh
+#!/bin/sh
+
+final_src=trunk-r3105
+
+LIST_SOURCES="\
+phpwebgallery-1.0.0 \
+phpwebgallery-1.1.0 \
+phpwebgallery-1.2.1 \
+phpwebgallery-1.3.0 \
+phpwebgallery-1.3.1 \
+phpwebgallery-1.3.2 \
+phpwebgallery-1.3.3 \
+phpwebgallery-1.3.4 \
+phpwebgallery-1.4.0 \
+phpwebgallery-1.4.1 \
+phpwebgallery-1.5.0 \
+phpwebgallery-1.5.1 \
+phpwebgallery-1.5.2 \
+phpwebgallery-1.6.0RC1 \
+phpwebgallery-1.6.0RC2 \
+phpwebgallery-1.6.0 \
+phpwebgallery-1.6.1 \
+phpwebgallery-1.6.2 \
+phpwebgallery-1.7.0RC1 \
+phpwebgallery-1.7.0RC2 \
+phpwebgallery-1.7.0 \
+phpwebgallery-1.7.1 \
+phpwebgallery-1.7.2 \
+phpwebgallery-1.7.3 \
+phpwebgallery-2.0.0RC1 \
+phpwebgallery-2.0.0RC2 \
+phpwebgallery-2.0.0RC3 \
+phpwebgallery-2.0.0RC4 \
+$final_src \
+"
+
+set $LIST_SOURCES
+LastSrc=$1
+shift
+
+dir_all=`pwd`
+dir_final_src=$dir_all/$Src/$final_src
+
+for Src in $@
+do
+  dir_current=$dir_all/$Src
+  cd $LastSrc
+  echo "// Comparison between $Src and $LastSrc"
+  for f in `find *`
+  do
+    current_file_or_dir=$dir_current/$f
+    final_file_or_dir=$dir_final_src/$f
+    # if not exists on current src
+    [ ! -f  $current_file_or_dir ] && [ ! -d  $current_file_or_dir ] && \
+    # if not exists on final src
+    [ ! -f  $final_file_or_dir ] && [ ! -d  $final_file_or_dir ] && \
+    # Display file or dir to delete
+      echo "'$f',"
+  done
+  cd -
+  LastSrc=$Src;
+done
+
+*/
+
+$list_files = array(
+// Comparison between phpwebgallery-1.1.0 and phpwebgallery-1.0.0
+'admin_phpwebgallery',
+'admin_phpwebgallery/admin.php',
+'admin_phpwebgallery/ajout.php',
+'admin_phpwebgallery/configuration.php',
+'admin_phpwebgallery/creationBD.php',
+'admin_phpwebgallery/historique.php',
+'admin_phpwebgallery/index.htm',
+'admin_phpwebgallery/install_step1.php',
+'admin_phpwebgallery/install_step2.php',
+'admin_phpwebgallery/isadmin.php',
+'admin_phpwebgallery/liste_users.php',
+'admin_phpwebgallery/manuel.php',
+'admin_phpwebgallery/miseajour.php',
+'admin_phpwebgallery/perm.php',
+'commenter.php',
+'debut_tableau.inc',
+'fin_tableau.inc',
+'help_phpwebgallery',
+'help_phpwebgallery/admin.png',
+'help_phpwebgallery/config_step2.png',
+'help_phpwebgallery/index.htm',
+'images_phpwebgallery',
+'images_phpwebgallery/bleu_01.gif',
+'images_phpwebgallery/bleu_02.gif',
+'images_phpwebgallery/bleu_03.gif',
+'images_phpwebgallery/bleu_04.gif',
+'images_phpwebgallery/bleu_05.gif',
+'images_phpwebgallery/bleu_06.gif',
+'images_phpwebgallery/bleu_07.gif',
+'images_phpwebgallery/bleu_08.gif',
+'images_phpwebgallery/bleu_09.gif',
+'images_phpwebgallery/commentaire.gif',
+'images_phpwebgallery/espace.gif',
+'images_phpwebgallery/gris_01.gif',
+'images_phpwebgallery/gris_02.gif',
+'images_phpwebgallery/gris_03.gif',
+'images_phpwebgallery/gris_04.gif',
+'images_phpwebgallery/gris_05.gif',
+'images_phpwebgallery/gris_06.gif',
+'images_phpwebgallery/gris_07.gif',
+'images_phpwebgallery/gris_08.gif',
+'images_phpwebgallery/gris_09.gif',
+'images_phpwebgallery/index.htm',
+'images_phpwebgallery/info.gif',
+'images_phpwebgallery/lost.gif',
+'images_phpwebgallery/lost2.gif',
+'images_phpwebgallery/moins.gif',
+'images_phpwebgallery/new_2.gif',
+'images_phpwebgallery/new_rouge.gif',
+'images_phpwebgallery/perm.gif',
+'images_phpwebgallery/php_sqreuil_artistes.gif',
+'images_phpwebgallery/plus.gif',
+'images_phpwebgallery/prev.gif',
+'images_phpwebgallery/puce.gif',
+'images_phpwebgallery/puce_noire.gif',
+'images_phpwebgallery/register.gif',
+'images_phpwebgallery/register2.gif',
+'images_phpwebgallery/supprimer.gif',
+'images_phpwebgallery/vert_01.gif',
+'images_phpwebgallery/vert_02.gif',
+'images_phpwebgallery/vert_03.gif',
+'images_phpwebgallery/vert_04.gif',
+'images_phpwebgallery/vert_05.gif',
+'images_phpwebgallery/vert_06.gif',
+'images_phpwebgallery/vert_07.gif',
+'images_phpwebgallery/vert_08.gif',
+'images_phpwebgallery/vert_09.gif',
+'images_phpwebgallery/violet_01.gif',
+'images_phpwebgallery/violet_02.gif',
+'images_phpwebgallery/violet_03.gif',
+'images_phpwebgallery/violet_04.gif',
+'images_phpwebgallery/violet_05.gif',
+'images_phpwebgallery/violet_06.gif',
+'images_phpwebgallery/violet_07.gif',
+'images_phpwebgallery/violet_08.gif',
+'images_phpwebgallery/violet_09.gif',
+'include_phpwebgallery',
+'include_phpwebgallery/config.php',
+'include_phpwebgallery/index.htm',
+'include_phpwebgallery/local/config/database.inc.php',
+'index.htm',
+// Comparison between phpwebgallery-1.2.1 and phpwebgallery-1.1.0
+'admin/isadmin.php',
+'images/commentaire.gif',
+'images/lost.gif',
+'images/prev.gif',
+'images/register.gif',
+'include/config.php',
+'template/agjimmy/blue',
+'template/agjimmy/blue/01.gif',
+'template/agjimmy/blue/02.gif',
+'template/agjimmy/blue/03.gif',
+'template/agjimmy/blue/04.gif',
+'template/agjimmy/blue/05.gif',
+'template/agjimmy/blue/06.gif',
+'template/agjimmy/blue/07.gif',
+'template/agjimmy/blue/08.gif',
+'template/agjimmy/blue/09.gif',
+'template/agjimmy/blue/collapsed.gif',
+'template/agjimmy/blue/commentaire.gif',
+'template/agjimmy/blue/conf.php',
+'template/agjimmy/blue/expanded.gif',
+'template/agjimmy/blue/lost.gif',
+'template/agjimmy/blue/new_long.gif',
+'template/agjimmy/blue/new_short.gif',
+'template/agjimmy/blue/prev.gif',
+'template/agjimmy/blue/register.gif',
+'template/eexell/coldblue/commentaire.gif',
+'template/eexell/coldblue/prev.gif',
+'template/neon',
+'template/neon/black',
+'template/neon/black/01.gif',
+'template/neon/black/02.gif',
+'template/neon/black/03.gif',
+'template/neon/black/04.gif',
+'template/neon/black/05.gif',
+'template/neon/black/06.gif',
+'template/neon/black/07.gif',
+'template/neon/black/08.gif',
+'template/neon/black/09.gif',
+'template/neon/black/collapsed.gif',
+'template/neon/black/commentaire.gif',
+'template/neon/black/conf.php',
+'template/neon/black/expanded.gif',
+'template/neon/black/lost.gif',
+'template/neon/black/new_long.gif',
+'template/neon/black/new_short.gif',
+'template/neon/black/prev.gif',
+'template/neon/black/register.gif',
+'template/rounded/blue',
+'template/rounded/blue/01.gif',
+'template/rounded/blue/02.gif',
+'template/rounded/blue/03.gif',
+'template/rounded/blue/04.gif',
+'template/rounded/blue/05.gif',
+'template/rounded/blue/06.gif',
+'template/rounded/blue/07.gif',
+'template/rounded/blue/08.gif',
+'template/rounded/blue/09.gif',
+'template/rounded/blue/collapsed.gif',
+'template/rounded/blue/commentaire.gif',
+'template/rounded/blue/conf.php',
+'template/rounded/blue/expanded.gif',
+'template/rounded/blue/lost.gif',
+'template/rounded/blue/new_long.gif',
+'template/rounded/blue/new_short.gif',
+'template/rounded/blue/prev.gif',
+'template/rounded/blue/register.gif',
+'template/rounded/darkgray/commentaire.gif',
+'template/rounded/darkgray/prev.gif',
+'template/rounded/gray',
+'template/rounded/gray/01.gif',
+'template/rounded/gray/02.gif',
+'template/rounded/gray/03.gif',
+'template/rounded/gray/04.gif',
+'template/rounded/gray/05.gif',
+'template/rounded/gray/06.gif',
+'template/rounded/gray/07.gif',
+'template/rounded/gray/08.gif',
+'template/rounded/gray/09.gif',
+'template/rounded/gray/collapsed.gif',
+'template/rounded/gray/commentaire.gif',
+'template/rounded/gray/conf.php',
+'template/rounded/gray/expanded.gif',
+'template/rounded/gray/lost.gif',
+'template/rounded/gray/new_long.gif',
+'template/rounded/gray/new_short.gif',
+'template/rounded/gray/prev.gif',
+'template/rounded/gray/register.gif',
+// Comparison between phpwebgallery-1.3.0 and phpwebgallery-1.2.1
+'a_propos.php',
+'admin/ajout.php',
+'admin/cat.php',
+'admin/edit_cat.php',
+'admin/historique.php',
+'admin/images/arrow_up.gif',
+'admin/images/moins.gif',
+'admin/images/plus.gif',
+'admin/images/puce.gif',
+'admin/liste_users.php',
+'admin/manuel.php',
+'admin/miseajour.php',
+'admin/perm.php',
+'diapo.php',
+'images',
+'images/php_sqreuil_artistes.gif',
+'include/functions.php',
+'include/index.htm',
+'include/style.php',
+'language/czech.php',
+'language/danish.php',
+'language/italiano.php',
+'language/nederlands.php',
+'personnaliser.php',
+'photo.php',
+'template/agjimmy',
+'template/agjimmy/lightred',
+'template/agjimmy/lightred/01.gif',
+'template/agjimmy/lightred/02.gif',
+'template/agjimmy/lightred/03.gif',
+'template/agjimmy/lightred/04.gif',
+'template/agjimmy/lightred/05.gif',
+'template/agjimmy/lightred/06.gif',
+'template/agjimmy/lightred/07.gif',
+'template/agjimmy/lightred/08.gif',
+'template/agjimmy/lightred/09.gif',
+'template/agjimmy/lightred/collapsed.gif',
+'template/agjimmy/lightred/commentaire.gif',
+'template/agjimmy/lightred/conf.php',
+'template/agjimmy/lightred/delete.gif',
+'template/agjimmy/lightred/del_favorite.gif',
+'template/agjimmy/lightred/expanded.gif',
+'template/agjimmy/lightred/favorite.gif',
+'template/agjimmy/lightred/lost.gif',
+'template/agjimmy/lightred/new_long.gif',
+'template/agjimmy/lightred/new_short.gif',
+'template/agjimmy/lightred/register.gif',
+'template/eexell',
+'template/eexell/coldblue',
+'template/eexell/coldblue/01.gif',
+'template/eexell/coldblue/02.gif',
+'template/eexell/coldblue/03.gif',
+'template/eexell/coldblue/04.gif',
+'template/eexell/coldblue/05.gif',
+'template/eexell/coldblue/06.gif',
+'template/eexell/coldblue/07.gif',
+'template/eexell/coldblue/08.gif',
+'template/eexell/coldblue/09.gif',
+'template/eexell/coldblue/collapsed.gif',
+'template/eexell/coldblue/conf.php',
+'template/eexell/coldblue/delete.gif',
+'template/eexell/coldblue/del_favorite.gif',
+'template/eexell/coldblue/expanded.gif',
+'template/eexell/coldblue/favorite.gif',
+'template/eexell/coldblue/lost.gif',
+'template/eexell/coldblue/new_long.gif',
+'template/eexell/coldblue/new_short.gif',
+'template/eexell/coldblue/register.gif',
+'template/erya',
+'template/erya/blue',
+'template/erya/blue/01.gif',
+'template/erya/blue/02.gif',
+'template/erya/blue/03.gif',
+'template/erya/blue/04.gif',
+'template/erya/blue/05.gif',
+'template/erya/blue/06.gif',
+'template/erya/blue/07.gif',
+'template/erya/blue/08.gif',
+'template/erya/blue/09.gif',
+'template/erya/blue/collapsed.gif',
+'template/erya/blue/conf.php',
+'template/erya/blue/delete.gif',
+'template/erya/blue/del_favorite.gif',
+'template/erya/blue/expanded.gif',
+'template/erya/blue/favorite.gif',
+'template/erya/blue/lost.gif',
+'template/erya/blue/new_long.gif',
+'template/erya/blue/new_short.gif',
+'template/erya/blue/register.gif',
+'template/melodie',
+'template/melodie/blue',
+'template/melodie/blue/01.gif',
+'template/melodie/blue/02.gif',
+'template/melodie/blue/03.gif',
+'template/melodie/blue/04.gif',
+'template/melodie/blue/05.gif',
+'template/melodie/blue/06.gif',
+'template/melodie/blue/07.gif',
+'template/melodie/blue/08.gif',
+'template/melodie/blue/09.gif',
+'template/melodie/blue/collapsed.gif',
+'template/melodie/blue/conf.php',
+'template/melodie/blue/delete.gif',
+'template/melodie/blue/del_favorite.gif',
+'template/melodie/blue/expanded.gif',
+'template/melodie/blue/favorite.gif',
+'template/melodie/blue/lost.gif',
+'template/melodie/blue/new_long.gif',
+'template/melodie/blue/new_short.gif',
+'template/melodie/blue/register.gif',
+'template/rounded',
+'template/rounded/darkgray',
+'template/rounded/darkgray/01.gif',
+'template/rounded/darkgray/02.gif',
+'template/rounded/darkgray/03.gif',
+'template/rounded/darkgray/04.gif',
+'template/rounded/darkgray/05.gif',
+'template/rounded/darkgray/06.gif',
+'template/rounded/darkgray/07.gif',
+'template/rounded/darkgray/08.gif',
+'template/rounded/darkgray/09.gif',
+'template/rounded/darkgray/collapsed.gif',
+'template/rounded/darkgray/conf.php',
+'template/rounded/darkgray/delete.gif',
+'template/rounded/darkgray/del_favorite.gif',
+'template/rounded/darkgray/expanded.gif',
+'template/rounded/darkgray/favorite.gif',
+'template/rounded/darkgray/lost.gif',
+'template/rounded/darkgray/new_long.gif',
+'template/rounded/darkgray/new_short.gif',
+'template/rounded/darkgray/register.gif',
+'template/square',
+'template/square/light',
+'template/square/light/01.gif',
+'template/square/light/02.gif',
+'template/square/light/03.gif',
+'template/square/light/04.gif',
+'template/square/light/05.gif',
+'template/square/light/06.gif',
+'template/square/light/07.gif',
+'template/square/light/08.gif',
+'template/square/light/09.gif',
+'template/square/light/collapsed.gif',
+'template/square/light/conf.php',
+'template/square/light/delete.gif',
+'template/square/light/del_favorite.gif',
+'template/square/light/expanded.gif',
+'template/square/light/favorite.gif',
+'template/square/light/lost.gif',
+'template/square/light/new_long.gif',
+'template/square/light/new_short.gif',
+'template/square/light/register.gif',
+// Comparison between phpwebgallery-1.3.1 and phpwebgallery-1.3.0
+'template/default/style.inc.php',
+'template/default/theme/conf.php',
+// Comparison between phpwebgallery-1.3.2 and phpwebgallery-1.3.1
+// Comparison between phpwebgallery-1.3.3 and phpwebgallery-1.3.2
+// Comparison between phpwebgallery-1.3.4 and phpwebgallery-1.3.3
+// Comparison between phpwebgallery-1.4.0 and phpwebgallery-1.3.4
+'admin/admin.php',
+'admin/create_listing_file.php',
+'admin/images/admin.png',
+'admin/install.php',
+'admin/phpwebgallery_structure.sql',
+'admin/user_modify.php',
+'include/init.inc.php',
+'include/vtemplate.class.php',
+'language/catala.php',
+'language/czech.php',
+'language/deutsch.php',
+'language/dutch.php',
+'language/english.php',
+'language/francais.php',
+'language/japanese.php',
+'language/magyar.php',
+'language/norsk.php',
+'language/portuguese-br.php',
+'language/russian.php',
+'language/spanish.php',
+'language/svenska.php',
+'readme.txt',
+'template/default/about.vtp',
+'template/default/admin/admin.vtp',
+'template/default/admin/cat_list.vtp',
+'template/default/admin/cat_modify.vtp',
+'template/default/admin/comments.vtp',
+'template/default/admin/configuration.vtp',
+'template/default/admin/group_list.vtp',
+'template/default/admin/group_perm.vtp',
+'template/default/admin/help.vtp',
+'template/default/admin/infos_image.vtp',
+'template/default/admin/install.vtp',
+'template/default/admin/picture_modify.vtp',
+'template/default/admin/stats.vtp',
+'template/default/admin/thumbnail.vtp',
+'template/default/admin/update.vtp',
+'template/default/admin/user_list.vtp',
+'template/default/admin/user_modify.vtp',
+'template/default/admin/user_perm.vtp',
+'template/default/admin/waiting.vtp',
+'template/default/category.vtp',
+'template/default/comments.vtp',
+'template/default/default-admin.css',
+'template/default/footer.htm',
+'template/default/footer.vtp',
+'template/default/header.htm',
+'template/default/header.vtp',
+'template/default/htmlfunctions.inc.php',
+'template/default/identification.vtp',
+'template/default/picture.vtp',
+'template/default/profile.vtp',
+'template/default/register.vtp',
+'template/default/search.vtp',
+'template/default/theme/01.gif',
+'template/default/theme/02.gif',
+'template/default/theme/03.gif',
+'template/default/theme/04.gif',
+'template/default/theme/05.gif',
+'template/default/theme/06.gif',
+'template/default/theme/07.gif',
+'template/default/theme/08.gif',
+'template/default/theme/09.gif',
+'template/default/theme/collapsed.gif',
+'template/default/theme/expanded.gif',
+'template/default/theme/new_long.gif',
+'template/default/theme/new_short.gif',
+'template/default/upload.vtp',
+// Comparison between phpwebgallery-1.4.1 and phpwebgallery-1.4.0
+// Comparison between phpwebgallery-1.5.0 and phpwebgallery-1.4.1
+'admin/admin_phpinfo.php',
+'admin/infos_images.php',
+'admin/search.php',
+'include/config.inc.php',
+'install/dbscheme.txt',
+'install/upgrade_1.3.2.php',
+'install/upgrade_1.3.3.php',
+'install/upgrade_1.3.4.php',
+'language/en_UK.iso-8859-1/faq.lang.php',
+'language/fr_FR.iso-8859-1/faq.lang.php',
+'template/default',
+'template/default/about.tpl',
+'template/default/admin',
+'template/default/admin/cat_list.tpl',
+'template/default/admin/cat_modify.tpl',
+'template/default/admin/cat_options.tpl',
+'template/default/admin/cat_perm.vtp',
+'template/default/admin/configuration.tpl',
+'template/default/admin/group_list.tpl',
+'template/default/admin/group_perm.tpl',
+'template/default/admin/help.tpl',
+'template/default/admin/images',
+'template/default/admin/images/arrow_down.gif',
+'template/default/admin/images/arrow_first.gif',
+'template/default/admin/images/arrow_last.gif',
+'template/default/admin/images/arrow_select.gif',
+'template/default/admin/images/arrow_up.gif',
+'template/default/admin/images/collapsed.gif',
+'template/default/admin/images/delete.gif',
+'template/default/admin/images/expanded.gif',
+'template/default/admin/images/icon_folder.gif',
+'template/default/admin/images/icon_folder_link.gif',
+'template/default/admin/images/icon_folder_lock.gif',
+'template/default/admin/images/icon_subfolder.gif',
+'template/default/admin/images/moins.gif',
+'template/default/admin/images/plus.gif',
+'template/default/admin/images/puce.gif',
+'template/default/admin/images/stat_left.gif',
+'template/default/admin/images/stat_middle.gif',
+'template/default/admin/images/stat_right.gif',
+'template/default/admin/infos_images.tpl',
+'template/default/admin/picture_modify.tpl',
+'template/default/admin/remote_site.tpl',
+'template/default/admin/search_username.tpl',
+'template/default/admin/stats.tpl',
+'template/default/admin/thumbnail.tpl',
+'template/default/admin/update.tpl',
+'template/default/admin/user_perm.tpl',
+'template/default/admin/waiting.tpl',
+'template/default/admin.tpl',
+'template/default/category.tpl',
+'template/default/comments.tpl',
+'template/default/default.css',
+'template/default/footer.tpl',
+'template/default/header.tpl',
+'template/default/identification.tpl',
+'template/default/images',
+'template/default/images/logo.jpg',
+'template/default/images/php_sqreuil_artistes.gif',
+'template/default/install.tpl',
+'template/default/mimetypes',
+'template/default/mimetypes/avi.png',
+'template/default/mimetypes/mp3.png',
+'template/default/mimetypes/mpg.png',
+'template/default/mimetypes/ogg.png',
+'template/default/mimetypes/zip.png',
+'template/default/picture.tpl',
+'template/default/profile.tpl',
+'template/default/redirect.tpl',
+'template/default/register.tpl',
+'template/default/search.tpl',
+'template/default/theme',
+'template/default/theme/button_bg.gif',
+'template/default/theme/categories.gif',
+'template/default/theme/delete.gif',
+'template/default/theme/del_favorite.gif',
+'template/default/theme/download.gif',
+'template/default/theme/eCard.gif',
+'template/default/theme/favorite.gif',
+'template/default/theme/left-arrow.gif',
+'template/default/theme/lost.gif',
+'template/default/theme/metadata.gif',
+'template/default/theme/properties.gif',
+'template/default/theme/recent.gif',
+'template/default/theme/register.gif',
+'template/default/theme/right-arrow.gif',
+'template/default/theme/slideshow.gif',
+'template/default/theme/tableh1_bg.gif',
+'template/default/upgrade.tpl',
+'template/default/upload.tpl',
+// Comparison between phpwebgallery-1.5.1 and phpwebgallery-1.5.0
+'include/.cvsignore',
+// Comparison between phpwebgallery-1.5.2 and phpwebgallery-1.5.1
+// Comparison between phpwebgallery-1.6.0RC1 and phpwebgallery-1.5.2
+'admin/include/isadmin.inc.php',
+'admin/remote_site.php',
+'admin/update.php',
+'include/category_calendar.inc.php',
+'install/upgrade_1.4.1.php',
+'template/yoga/admin/images',
+'template/yoga/admin/images/errors.png',
+'template/yoga/admin/images/infos.png',
+'template/yoga/admin/remote_site.tpl',
+'template/yoga/admin/update.tpl',
+'template/yoga/category.tpl',
+'template/yoga/mimetypes',
+'template/yoga/mimetypes/avi.png',
+'template/yoga/mimetypes/mp3.png',
+'template/yoga/mimetypes/mpg.png',
+'template/yoga/mimetypes/ogg.png',
+'template/yoga/mimetypes/zip.png',
+'template/yoga/theme/caddie_add.png',
+'template/yoga/theme/category_children.png',
+'template/yoga/theme/category_delete.png',
+'template/yoga/theme/category_edit.png',
+'template/yoga/theme/category_elements.png',
+'template/yoga/theme/category_jump-to.png',
+'template/yoga/theme/category_permissions.png',
+'template/yoga/theme/category_representant_random.png',
+'template/yoga/theme/delete.png',
+'template/yoga/theme/del_favorite.png',
+'template/yoga/theme/exit.png',
+'template/yoga/theme/favorite.png',
+'template/yoga/theme/help.png',
+'template/yoga/theme/home.png',
+'template/yoga/theme/left.png',
+'template/yoga/theme/lost_password.png',
+'template/yoga/theme/metadata.png',
+'template/yoga/theme/permissions.png',
+'template/yoga/theme/preferences.png',
+'template/yoga/theme/recent.png',
+'template/yoga/theme/register.png',
+'template/yoga/theme/representative.png',
+'template/yoga/theme/right.png',
+'template/yoga/theme/save.png',
+'template/yoga/theme/slideshow.png',
+'template/yoga/theme/sync_metadata.png',
+'template/yoga/theme/up.png',
+'template/yoga-dark',
+'template/yoga-dark/about.tpl',
+'template/yoga-dark/admin',
+'template/yoga-dark/admin/cat_list.tpl',
+'template/yoga-dark/admin/cat_modify.tpl',
+'template/yoga-dark/admin/cat_move.tpl',
+'template/yoga-dark/admin/cat_options.tpl',
+'template/yoga-dark/admin/cat_perm.tpl',
+'template/yoga-dark/admin/comments.tpl',
+'template/yoga-dark/admin/configuration.tpl',
+'template/yoga-dark/admin/double_select.tpl',
+'template/yoga-dark/admin/element_set_global.tpl',
+'template/yoga-dark/admin/element_set_unit.tpl',
+'template/yoga-dark/admin/group_list.tpl',
+'template/yoga-dark/admin/group_perm.tpl',
+'template/yoga-dark/admin/images',
+'template/yoga-dark/admin/images/errors.png',
+'template/yoga-dark/admin/images/infos.png',
+'template/yoga-dark/admin/intro.tpl',
+'template/yoga-dark/admin/maintenance.tpl',
+'template/yoga-dark/admin/picture_modify.tpl',
+'template/yoga-dark/admin/remote_site.tpl',
+'template/yoga-dark/admin/stats.tpl',
+'template/yoga-dark/admin/thumbnail.tpl',
+'template/yoga-dark/admin/update.tpl',
+'template/yoga-dark/admin/user_list.tpl',
+'template/yoga-dark/admin/user_perm.tpl',
+'template/yoga-dark/admin/waiting.tpl',
+'template/yoga-dark/admin.tpl',
+'template/yoga-dark/category.tpl',
+'template/yoga-dark/comments.tpl',
+'template/yoga-dark/content.css',
+'template/yoga-dark/dclear.css',
+'template/yoga-dark/default-colors.css',
+'template/yoga-dark/default-layout.css',
+'template/yoga-dark/fix-khtml.css',
+'template/yoga-dark/footer.tpl',
+'template/yoga-dark/header.tpl',
+'template/yoga-dark/identification.tpl',
+'template/yoga-dark/image.css',
+'template/yoga-dark/install.tpl',
+'template/yoga-dark/menubar.css',
+'template/yoga-dark/mimetypes',
+'template/yoga-dark/mimetypes/avi.png',
+'template/yoga-dark/mimetypes/mp3.png',
+'template/yoga-dark/mimetypes/mpg.png',
+'template/yoga-dark/mimetypes/ogg.png',
+'template/yoga-dark/mimetypes/zip.png',
+'template/yoga-dark/notification.tpl',
+'template/yoga-dark/password.tpl',
+'template/yoga-dark/picture.tpl',
+'template/yoga-dark/popuphelp.css',
+'template/yoga-dark/popuphelp.tpl',
+'template/yoga-dark/print.css',
+'template/yoga-dark/profile.tpl',
+'template/yoga-dark/redirect.tpl',
+'template/yoga-dark/register.tpl',
+'template/yoga-dark/search.tpl',
+'template/yoga-dark/theme',
+'template/yoga-dark/theme/button_bg.gif',
+'template/yoga-dark/theme/caddie_add.png',
+'template/yoga-dark/theme/category_children.png',
+'template/yoga-dark/theme/category_delete.png',
+'template/yoga-dark/theme/category_edit.png',
+'template/yoga-dark/theme/category_elements.png',
+'template/yoga-dark/theme/category_jump-to.png',
+'template/yoga-dark/theme/category_permissions.png',
+'template/yoga-dark/theme/category_representant_random.png',
+'template/yoga-dark/theme/delete.png',
+'template/yoga-dark/theme/del_favorite.png',
+'template/yoga-dark/theme/exit.png',
+'template/yoga-dark/theme/favorite.png',
+'template/yoga-dark/theme/help.png',
+'template/yoga-dark/theme/home.png',
+'template/yoga-dark/theme/left.png',
+'template/yoga-dark/theme/lost_password.png',
+'template/yoga-dark/theme/metadata.png',
+'template/yoga-dark/theme/permissions.png',
+'template/yoga-dark/theme/preferences.png',
+'template/yoga-dark/theme/recent.png',
+'template/yoga-dark/theme/register.png',
+'template/yoga-dark/theme/representative.png',
+'template/yoga-dark/theme/right.png',
+'template/yoga-dark/theme/save.png',
+'template/yoga-dark/theme/slideshow.png',
+'template/yoga-dark/theme/sync_metadata.png',
+'template/yoga-dark/theme/tableh1_bg.gif',
+'template/yoga-dark/theme/tableh2_bg.gif',
+'template/yoga-dark/theme/up.png',
+'template/yoga-dark/upgrade.tpl',
+'template/yoga-dark/upload.tpl',
+// Comparison between phpwebgallery-1.6.0RC2 and phpwebgallery-1.6.0RC1
+// Comparison between phpwebgallery-1.6.0 and phpwebgallery-1.6.0RC2
+'template/yoga/dclear.css',
+'template/yoga/image.css',
+// Comparison between phpwebgallery-1.6.1 and phpwebgallery-1.6.0
+'admin/images/index.htm',
+'admin/include/index.htm',
+'admin/index.htm',
+'galleries/index.htm',
+'language/index.htm',
+// Comparison between phpwebgallery-1.6.2 and phpwebgallery-1.6.1
+// Comparison between phpwebgallery-1.7.0RC1 and phpwebgallery-1.6.2
+'admin/images/daily_stats.img.php',
+'admin/images/global_stats.img.php',
+'admin/images/monthly_stats.img.php',
+'admin/images/phpBarGraph.php',
+'include/category_recent_cats.inc.php',
+'include/category_subcats.inc.php',
+'include/pngfix.js',
+'include/scripts.js',
+'install/db/22.1-database.php',
+'install/db/22.2-database.php',
+'install/db/22.3-database.php',
+'install/db/22.5-database.php',
+'install/db/22.6-database.php',
+'install/db/22.7-database.php',
+'install/db/22.8-database.php',
+'install/db/22.9-database.php',
+'language/en_UK.iso-8859-1/help/remote_site.html',
+'language/fr_FR.iso-8859-1/help/remote_site.html',
+'template/yoga/upgrade.tpl',
+// Comparison between phpwebgallery-1.7.0RC2 and phpwebgallery-1.7.0RC1
+'admin/waiting.php',
+'template/yoga/admin/waiting.tpl',
+// Comparison between phpwebgallery-1.7.0 and phpwebgallery-1.7.0RC2
+// Comparison between phpwebgallery-1.7.1 and phpwebgallery-1.7.0
+// Comparison between phpwebgallery-1.7.2 and phpwebgallery-1.7.1
+'include/functions_group.inc.php',
+'template/yoga/thumbnails-fix-ie5-ie6.css',
+// Comparison between phpwebgallery-1.7.3 and phpwebgallery-1.7.2
+// Comparison between phpwebgallery-2.0.0RC1 and phpwebgallery-1.7.3
+'admin/include/functions_check_integrity.inc.php',
+'admin/include/functions_tabsheet.inc.php',
+'admin/plugins.php',
+'admin/ws_checker.php',
+'include/template.php',
+'install/phpwebgallery_structure.sql',
+'language/en_UK.iso-8859-1',
+'language/en_UK.iso-8859-1/about.html',
+'language/en_UK.iso-8859-1/admin.lang.php',
+'language/en_UK.iso-8859-1/common.lang.php',
+'language/en_UK.iso-8859-1/help',
+'language/en_UK.iso-8859-1/help/advanced_feature.html',
+'language/en_UK.iso-8859-1/help/cat_modify.html',
+'language/en_UK.iso-8859-1/help/cat_move.html',
+'language/en_UK.iso-8859-1/help/cat_options.html',
+'language/en_UK.iso-8859-1/help/cat_perm.html',
+'language/en_UK.iso-8859-1/help/configuration.html',
+'language/en_UK.iso-8859-1/help/group_list.html',
+'language/en_UK.iso-8859-1/help/history.html',
+'language/en_UK.iso-8859-1/help/index.php',
+'language/en_UK.iso-8859-1/help/maintenance.html',
+'language/en_UK.iso-8859-1/help/notification_by_mail.html',
+'language/en_UK.iso-8859-1/help/permalinks.html',
+'language/en_UK.iso-8859-1/help/search.html',
+'language/en_UK.iso-8859-1/help/site_manager.html',
+'language/en_UK.iso-8859-1/help/synchronize.html',
+'language/en_UK.iso-8859-1/help/thumbnail.html',
+'language/en_UK.iso-8859-1/help/user_list.html',
+'language/en_UK.iso-8859-1/help/web_service.html',
+'language/en_UK.iso-8859-1/help.html',
+'language/en_UK.iso-8859-1/index.php',
+'language/en_UK.iso-8859-1/install.lang.php',
+'language/en_UK.iso-8859-1/iso.txt',
+'language/fr_FR.iso-8859-1',
+'language/fr_FR.iso-8859-1/about.html',
+'language/fr_FR.iso-8859-1/admin.lang.php',
+'language/fr_FR.iso-8859-1/common.lang.php',
+'language/fr_FR.iso-8859-1/help',
+'language/fr_FR.iso-8859-1/help/advanced_feature.html',
+'language/fr_FR.iso-8859-1/help/cat_modify.html',
+'language/fr_FR.iso-8859-1/help/cat_move.html',
+'language/fr_FR.iso-8859-1/help/cat_options.html',
+'language/fr_FR.iso-8859-1/help/cat_perm.html',
+'language/fr_FR.iso-8859-1/help/configuration.html',
+'language/fr_FR.iso-8859-1/help/group_list.html',
+'language/fr_FR.iso-8859-1/help/history.html',
+'language/fr_FR.iso-8859-1/help/index.php',
+'language/fr_FR.iso-8859-1/help/maintenance.html',
+'language/fr_FR.iso-8859-1/help/notification_by_mail.html',
+'language/fr_FR.iso-8859-1/help/permalinks.html',
+'language/fr_FR.iso-8859-1/help/search.html',
+'language/fr_FR.iso-8859-1/help/site_manager.html',
+'language/fr_FR.iso-8859-1/help/synchronize.html',
+'language/fr_FR.iso-8859-1/help/thumbnail.html',
+'language/fr_FR.iso-8859-1/help/user_list.html',
+'language/fr_FR.iso-8859-1/help/web_service.html',
+'language/fr_FR.iso-8859-1/help.html',
+'language/fr_FR.iso-8859-1/index.php',
+'language/fr_FR.iso-8859-1/install.lang.php',
+'language/fr_FR.iso-8859-1/iso.txt',
+'plugins/add_index/language/en_UK.iso-8859-1',
+'plugins/add_index/language/en_UK.iso-8859-1/help',
+'plugins/add_index/language/en_UK.iso-8859-1/help/advanced_feature.html',
+'plugins/add_index/language/en_UK.iso-8859-1/help/index.php',
+'plugins/add_index/language/en_UK.iso-8859-1/help/site_manager.html',
+'plugins/add_index/language/en_UK.iso-8859-1/index.php',
+'plugins/add_index/language/en_UK.iso-8859-1/plugin.lang.php',
+'plugins/add_index/language/fr_FR.iso-8859-1',
+'plugins/add_index/language/fr_FR.iso-8859-1/help',
+'plugins/add_index/language/fr_FR.iso-8859-1/help/advanced_feature.html',
+'plugins/add_index/language/fr_FR.iso-8859-1/help/index.php',
+'plugins/add_index/language/fr_FR.iso-8859-1/help/site_manager.html',
+'plugins/add_index/language/fr_FR.iso-8859-1/index.php',
+'plugins/add_index/language/fr_FR.iso-8859-1/plugin.lang.php',
+'plugins/admin_advices/en_UK.iso-8859-1',
+'plugins/admin_advices/en_UK.iso-8859-1/index.php',
+'plugins/admin_advices/en_UK.iso-8859-1/lang.adv.php',
+'plugins/admin_advices/fr_FR.iso-8859-1',
+'plugins/admin_advices/fr_FR.iso-8859-1/index.php',
+'plugins/admin_advices/fr_FR.iso-8859-1/lang.adv.php',
+'plugins/hello_world',
+'plugins/hello_world/index.php',
+'plugins/hello_world/main.inc.php',
+'template/yoga/admin',
+'template/yoga/admin/advanced_feature.tpl',
+'template/yoga/admin/cat_list.tpl',
+'template/yoga/admin/cat_modify.tpl',
+'template/yoga/admin/cat_move.tpl',
+'template/yoga/admin/cat_options.tpl',
+'template/yoga/admin/cat_perm.tpl',
+'template/yoga/admin/check_integrity.tpl',
+'template/yoga/admin/comments.tpl',
+'template/yoga/admin/configuration.tpl',
+'template/yoga/admin/default-layout.css',
+'template/yoga/admin/double_select.tpl',
+'template/yoga/admin/element_set_global.tpl',
+'template/yoga/admin/element_set_unit.tpl',
+'template/yoga/admin/group_list.tpl',
+'template/yoga/admin/group_perm.tpl',
+'template/yoga/admin/history.tpl',
+'template/yoga/admin/index.php',
+'template/yoga/admin/intro.tpl',
+'template/yoga/admin/maintenance.tpl',
+'template/yoga/admin/notification_by_mail.tpl',
+'template/yoga/admin/permalinks.tpl',
+'template/yoga/admin/picture_modify.tpl',
+'template/yoga/admin/plugin.tpl',
+'template/yoga/admin/plugins.tpl',
+'template/yoga/admin/profile.tpl',
+'template/yoga/admin/rating.tpl',
+'template/yoga/admin/site_manager.tpl',
+'template/yoga/admin/site_update.tpl',
+'template/yoga/admin/stats.tpl',
+'template/yoga/admin/tabsheet.tpl',
+'template/yoga/admin/tags.tpl',
+'template/yoga/admin/thumbnail.tpl',
+'template/yoga/admin/upload.tpl',
+'template/yoga/admin/user_list.tpl',
+'template/yoga/admin/user_perm.tpl',
+'template/yoga/admin/ws_checker.tpl',
+'template/yoga/admin.tpl',
+'template/yoga/icon/category_delete.png',
+'template/yoga/icon/category_elements.png',
+'template/yoga/icon/category_jump-to.png',
+'template/yoga/icon/category_permissions.png',
+'template/yoga/icon/check.png',
+'template/yoga/icon/edit_s.png',
+'template/yoga/icon/page_end.png',
+'template/yoga/icon/page_top.png',
+'template/yoga/icon/permissions.png',
+'template/yoga/icon/slideshow.png',
+'template/yoga/icon/star_e.gif',
+'template/yoga/icon/star_f.gif',
+'template/yoga/icon/sync_metadata.png',
+'template/yoga/icon/toggle_is_default_group.png',
+'template/yoga/icon/uncheck.png',
+'template/yoga/icon/virt_category.png',
+'template/yoga/popuphelp.css',
+'template-common/layout.css',
+// Comparison between phpwebgallery-2.0.0RC2 and phpwebgallery-2.0.0RC1
+'language/en_UK/help/web_service.html',
+'language/es_ES/help/web_service.html',
+'language/fr_FR/help/web_service.html',
+'language/it_IT/help/web_service.html',
+'language/nl_NL/help/web_service.html',
+'template/yoga/mail/text/html/admin',
+'template/yoga/mail/text/html/admin/cat_group_info.tpl',
+'template/yoga/mail/text/html/admin/index.php',
+'template/yoga/mail/text/html/admin/notification_by_mail.tpl',
+'template/yoga/mail/text/plain/admin',
+'template/yoga/mail/text/plain/admin/cat_group_info.tpl',
+'template/yoga/mail/text/plain/admin/index.php',
+'template/yoga/mail/text/plain/admin/notification_by_mail.tpl',
+'template-common/lib/plugins/jquery.growfield.js',
+'template-common/lib/plugins/jquery.growfield.packed.js',
+// Comparison between phpwebgallery-2.0.0RC3 and phpwebgallery-2.0.0RC2
+'admin/template/goto/icon/del_favorite.png',
+'admin/template/goto/theme/roma/datepicker.css',
+// Comparison between phpwebgallery-2.0.0RC4 and phpwebgallery-2.0.0RC3
+'template/yoga/install.tpl',
+'template/yoga/upgrade.tpl',
+// Comparison between trunk-r3105 and phpwebgallery-2.0.0RC4
+'admin/template/goto/theme/roma/images/bottom-left-bg.png',
+'admin/template/goto/theme/roma/images/top-left-bg.png',
+'local/config/database.inc.php',
+'template-common/lib/ui/ui.accordion.packed.js',
+'template-common/lib/ui/ui.core.packed.js',
+'template-common/lib/ui/ui.datepicker.css',
+'template-common/lib/ui/ui.datepicker.packed.js',
+'template-common/lib/ui/ui.dialog.packed.js',
+'template-common/lib/ui/ui.draggable.packed.js',
+'template-common/lib/ui/ui.droppable.packed.js',
+'template-common/lib/ui/ui.resizable.packed.js',
+'template-common/lib/ui/ui.selectable.packed.js',
+'template-common/lib/ui/ui.slider.packed.js',
+'template-common/lib/ui/ui.sortable.packed.js',
+'template-common/lib/ui/ui.tabs.packed.js',
+);
+
+$list_exlude_files = array(
+'local/config/database.inc.php',
+);
+
+
+$upgrade_description = 'Delete old and not used files';
+
+// +-----------------------------------------------------------------------+
+// |                            Upgrade content                            |
+// +-----------------------------------------------------------------------+
+// remove exclude files
+$files=array_diff($list_files, $list_exlude_files);
+// inverse sort in order to remove corretly directory
+rsort($files);
+
+foreach ($files as $file)
+{
+  if (is_file($file))
+  {
+    echo 'Delete file '.$file."\n";
+    @chmod($file, 0777);
+    if (! unlink($file))
+    {
+      echo 'Error on delete file '.$file."\n";
+    }
+  }
+  elseif (is_dir($file))
+  {
+    echo 'Delete directory '.$file."\n";
+    @chmod($file, 0777);
+    if (! rmdir($file))
+    {
+      echo 'Error on directory file '.$file."\n";
+    }
+  }
+}
+
+echo
+"\n"
+.'"'.$upgrade_description.'"'.' ended'
+."\n"
+;
+
+?>
Index: tags/2.4.0RC3/install/db/81-database.php
===================================================================
--- tags/2.4.0RC3/install/db/81-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/81-database.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add new email features : 
+users can modify/delete their owns comments';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config (param,value,comment)
+  VALUES (\'user_can_delete_comment\',\'false\',
+    \'administrators can allow user delete their own comments\'),
+  (\'user_can_edit_comment\',\'false\',
+    \'administrators can allow user edit their own comments\'),
+  (\'email_admin_on_comment_edition\',\'false\',
+    \'Send an email to the administrators when a comment is modified\'),
+  (\'email_admin_on_comment_deletion\',\'false\',
+    \'Send an email to the administrators when a comment is deleted\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/82-database.php
===================================================================
--- tags/2.4.0RC3/install/db/82-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/82-database.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add new column to save author_id. 
+Guest users names are saved in author column';
+
+$query = '
+ALTER TABLE '.PREFIX_TABLE.'comments
+  ADD COLUMN author_id smallint(5) DEFAULT NULL
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/83-database.php
===================================================================
--- tags/2.4.0RC3/install/db/83-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/83-database.php	(revision 14585)
@@ -0,0 +1,59 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Update column save author_id with value.';
+
+$query = '
+UPDATE
+  '.COMMENTS_TABLE.' AS c ,
+  '.USERS_TABLE.' AS u,
+  '.USER_INFOS_TABLE.' AS i
+SET c.author_id = u.'.$conf['user_fields']['id'].'
+WHERE
+    c.author_id is null
+AND c.author = u.'.$conf['user_fields']['username'].' 
+AND u.'.$conf['user_fields']['id'].' = i.user_id
+AND i.registration_date <= c.date
+;';
+
+pwg_query($query);
+
+$query = '
+UPDATE '.COMMENTS_TABLE.' AS c 
+SET c.author_id = '.$conf['guest_id'].'
+WHERE c.author_id is null
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/84-database.php
===================================================================
--- tags/2.4.0RC3/install/db/84-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/84-database.php	(revision 14585)
@@ -0,0 +1,96 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Update default template to default theme.';
+
+$query = '
+ALTER TABLE '.USER_INFOS_TABLE.'
+  CHANGE COLUMN template theme varchar(255) NOT NULL default \'Sylvia\'
+;';
+
+pwg_query($query);
+
+$query = '
+SELECT user_id, theme
+  FROM '.USER_INFOS_TABLE.'
+;';
+
+$result = pwg_query($query);
+
+$users = array();
+while ($row = pwg_db_fetch_assoc($result))
+{
+  list($user_template, $user_theme) = explode('/', $row['theme']);
+
+  switch ($user_template)
+  {
+    case 'yoga':
+      break;
+
+    case 'gally':
+      $user_theme = 'gally-'.$user_theme;
+      break;
+
+    case 'floPure':
+      $user_theme = 'Pure_'.$user_theme;
+      break;
+
+    case 'floOs':
+      $user_theme = 'OS_'.$user_theme;
+      break;
+
+    case 'simple':
+      $user_theme = 'simple-'.$user_theme;
+      break;
+
+    default:
+      $user_theme = 'Sylvia';
+  }
+
+  array_push($users, array(
+    'user_id' => $row['user_id'],
+    'theme' => $user_theme
+    )
+  );
+}
+
+mass_updates(
+  USER_INFOS_TABLE,
+  array(
+    'primary' => array('user_id'),
+    'update'  => array('theme')
+    ),
+  $users
+  );
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/85-database.php
===================================================================
--- tags/2.4.0RC3/install/db/85-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/85-database.php	(revision 14585)
@@ -0,0 +1,51 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add a table to manage themes.';
+
+$query = "
+CREATE TABLE ".PREFIX_TABLE."themes (
+  `id` varchar(64) NOT NULL default '',
+  `version` varchar(64) NOT NULL default '0',
+  `name` varchar(64) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM";
+
+if (DB_CHARSET == 'utf8')
+{
+  $query .= " DEFAULT CHARACTER SET utf8";
+}
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/86-database.php
===================================================================
--- tags/2.4.0RC3/install/db/86-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/86-database.php	(revision 14585)
@@ -0,0 +1,39 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Automatically activate core themes.';
+
+include_once(PHPWG_ROOT_PATH . 'admin/include/functions_install.inc.php');
+activate_core_themes();
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/87-database.php
===================================================================
--- tags/2.4.0RC3/install/db/87-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/87-database.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined("PHPWG_ROOT_PATH"))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add display configuration options.';
+
+$query = '
+INSERT INTO '.CONFIG_TABLE.' (param,value,comment)
+  VALUES
+    ("menubar_filter_icon","true","Display filter icon"),
+    ("index_sort_order_input","true","Display image order selection list"),
+    ("index_flat_icon","true","Display flat icon"),
+    ("index_posted_date_icon","true","Display calendar by posted date"),
+    ("index_created_date_icon","true","Display calendar by creation date icon"),
+    ("index_slideshow_icon","true","Display slideshow icon"),
+    ("picture_metadata_icon","true","Display metadata icon on picture page"),
+    ("picture_slideshow_icon","true","Display slideshow icon on picture page"),
+    ("picture_favorite_icon","true","Display favorite icon on picture page"),
+    ("picture_navigation_icons","true","Display navigation icons on picture page"),
+    ("picture_navigation_thumb","true","Display navigation thumbnails on picture page")
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/88-database.php
===================================================================
--- tags/2.4.0RC3/install/db/88-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/88-database.php	(revision 14585)
@@ -0,0 +1,49 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined("PHPWG_ROOT_PATH"))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add display configuration for picture properties.';
+
+$query = '
+INSERT INTO '.CONFIG_TABLE.' (param,value,comment)
+  VALUES
+    ("picture_download_icon","true","Display download icon on picture page"),
+    (
+      "picture_informations", 
+      "a:11:{s:6:\"author\";b:1;s:10:\"created_on\";b:1;s:9:\"posted_on\";b:1;s:10:\"dimensions\";b:1;s:4:\"file\";b:1;s:8:\"filesize\";b:1;s:4:\"tags\";b:1;s:10:\"categories\";b:1;s:6:\"visits\";b:1;s:12:\"average_rate\";b:1;s:13:\"privacy_level\";b:1;}",
+      "Information displayed on picture page"
+    )
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/89-database.php
===================================================================
--- tags/2.4.0RC3/install/db/89-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/89-database.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined("PHPWG_ROOT_PATH"))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Admins can activate/deactivate user customization.';
+
+$query = '
+INSERT INTO '.CONFIG_TABLE.' (param,value,comment)
+  VALUES
+    ("allow_user_customization","true","allow users to customize their gallery?")
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/90-database.php
===================================================================
--- tags/2.4.0RC3/install/db/90-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/90-database.php	(revision 14585)
@@ -0,0 +1,62 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Add a table to manage languages.';
+
+$query = "
+CREATE TABLE ".PREFIX_TABLE."languages (
+  `id` varchar(64) NOT NULL default '',
+  `version` varchar(64) NOT NULL default '0',
+  `name` varchar(64) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM";
+
+if (DB_CHARSET == 'utf8')
+{
+  $query .= " DEFAULT CHARACTER SET utf8";
+}
+
+pwg_query($query);
+
+// Fill table
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/languages.class.php');
+
+$languages = new languages(PWG_CHARSET);
+
+foreach ($languages->fs_languages as $language_code => $fs_language)
+{
+  $languages->perform_action('activate', $language_code);
+}
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/91-database.php
===================================================================
--- tags/2.4.0RC3/install/db/91-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/91-database.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Remove adviser status.';
+
+// Existing adviser become normal user
+$query = "
+UPDATE ".USER_INFOS_TABLE."
+SET status = 'normal'
+WHERE status IN ('webmaster', 'admin')
+  AND adviser = 'true'
+;";
+
+pwg_query($query);
+
+// Remove adviser column
+$query = '
+ALTER TABLE '.USER_INFOS_TABLE.'
+DROP COLUMN adviser
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/92-database.php
===================================================================
--- tags/2.4.0RC3/install/db/92-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/92-database.php	(revision 14585)
@@ -0,0 +1,57 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'New colum images.added_by, reference to users.id';
+
+// Add column
+$query = 'ALTER TABLE '.IMAGES_TABLE.' ADD COLUMN ';
+
+if ('mysql' == $conf['dblayer'])
+{
+  $query.= ' added_by smallint(5)';
+}
+
+if (in_array($conf['dblayer'], array('pgsql', 'sqlite', 'pdo-sqlite')))
+{
+  $query.= ' "added_by" INTEGER default 0';
+}
+
+$query.= ' NOT NULL;';
+
+pwg_query($query);
+
+// set the existing photos with the webmaster_id as added_by
+$query = 'UPDATE '.IMAGES_TABLE.' SET added_by = '.$conf['webmaster_id'].';';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/93-database.php
===================================================================
--- tags/2.4.0RC3/install/db/93-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/93-database.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'Monday may not be the first day of the week';
+
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config (param,value,comment)
+  VALUES (\'week_starts_on\',\'monday\', \''.$upgrade_description.'\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/94-database.php
===================================================================
--- tags/2.4.0RC3/install/db/94-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/94-database.php	(revision 14585)
@@ -0,0 +1,109 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'remove user upload as core feature and save config for Community plugin';
+
+$user_upload_conf = array();
+
+// upload_user_access
+$conf_orig = $conf;
+load_conf_from_db();
+$user_upload_conf['upload_user_access'] = $conf['upload_user_access'];
+$conf = $conf_orig;
+
+// unvalidated photos submitted by users
+$query = '
+SELECT *
+  FROM '.PREFIX_TABLE.'waiting
+;';
+$result = pwg_query($query);
+$user_upload_conf['waiting_rows'] = array();
+while ($row = pwg_db_fetch_assoc($result)) {
+  array_push($user_upload_conf['waiting_rows'], $row);
+}
+
+// uploadable categories
+$query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE uploadable = \'true\'
+;';
+$result = pwg_query($query);
+$user_upload_conf['uploadable_categories'] = array();
+while ($row = pwg_db_fetch_assoc($result)) {
+  array_push($user_upload_conf['uploadable_categories'], $row['id']);
+}
+
+// save configuration for a future use by the Community plugin
+$backup_filepath = PHPWG_ROOT_PATH.$conf['data_location'].'plugins/core_user_upload_to_community.php';
+$save_conf = true;
+if (is_dir(dirname($backup_filepath)))
+{
+  if (!is_writable(dirname($backup_filepath)))
+  {
+    $save_conf = false;
+  }
+}
+elseif (!is_writable( PHPWG_ROOT_PATH.$conf['data_location'] ))
+{
+  $save_conf = false;
+}
+
+if ($save_conf)
+{
+  mkgetdir(dirname($backup_filepath));
+
+  file_put_contents(
+    $backup_filepath,
+    '<?php $user_upload_conf = \''.serialize($user_upload_conf).'\'; ?>'
+    );
+}
+
+//
+// remove all what is related to user upload in the database
+//
+
+// categories.uploadable
+pwg_query('ALTER TABLE '.CATEGORIES_TABLE.' DROP COLUMN uploadable;');
+
+// waiting
+pwg_query('DROP TABLE '.PREFIX_TABLE.'waiting;');
+
+// config parameter settings : upload_user_access, upload_link_everytime
+$query = '
+DELETE FROM '.PREFIX_TABLE.'config
+  WHERE param IN (\'upload_user_access\', \'upload_link_everytime\', \'email_admin_on_picture_uploaded\')
+;';
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/95-database.php
===================================================================
--- tags/2.4.0RC3/install/db/95-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/95-database.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'New colum user_cache_categories.user_representative_picture_id';
+
+// Add column
+$query = 'ALTER TABLE '.USER_CACHE_CATEGORIES_TABLE.' ADD COLUMN ';
+
+if ('mysql' == $conf['dblayer'])
+{
+  $query.= ' `user_representative_picture_id` mediumint(8) unsigned default NULL';
+}
+
+if (in_array($conf['dblayer'], array('pgsql', 'sqlite', 'pdo-sqlite')))
+{
+  $query.= ' "user_representative_picture_id" INTEGER';
+}
+
+$query.= ';';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/96-database.php
===================================================================
--- tags/2.4.0RC3/install/db/96-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/96-database.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add time in images.date_creation column';
+
+// Only MySQL is concerned, other DB engines are already "timestamp"
+if ('mysql' == $conf['dblayer'])
+{
+  $query = '
+ALTER TABLE '.IMAGES_TABLE.'
+  MODIFY date_creation datetime
+;';
+  pwg_query($query);
+}
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/97-database.php
===================================================================
--- tags/2.4.0RC3/install/db/97-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/97-database.php	(revision 14585)
@@ -0,0 +1,63 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'makes sure default user has a theme and a language';
+
+$query = '
+SELECT
+    theme,
+    language
+  FROM '.USER_INFOS_TABLE.'
+  WHERE user_id = '.$conf['default_user_id'].'
+;';
+$result = pwg_query($query);
+list($theme, $language) = pwg_db_fetch_row($result);
+
+$data = array(
+  'user_id' => $conf['default_user_id'],
+  'theme' => empty($theme) ? 'Sylvia' : $theme,
+  'language' => empty($language) ? 'en_UK' : $language,
+  );
+
+mass_updates(
+  USER_INFOS_TABLE,
+  array(
+    'primary' => array('user_id'),
+    'update'  => array('theme', 'language')
+    ),
+  array(
+    $data
+    )
+  );
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/98-database.php
===================================================================
--- tags/2.4.0RC3/install/db/98-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/98-database.php	(revision 14585)
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'add the config parameter comments_update_validation';
+
+$query = '
+INSERT INTO '.CONFIG_TABLE.'
+  (
+    param,
+    value,
+    comment
+  )
+  VALUES (
+    \'comments_update_validation\',
+    false,
+    \'administrators validate users updated comments before becoming visible\'
+   )
+;';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/99-database.php
===================================================================
--- tags/2.4.0RC3/install/db/99-database.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/99-database.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$upgrade_description = 'delete the config parameter comments_update_validation';
+
+$query = 'DELETE FROM '.CONFIG_TABLE.' WHERE param = \'comments_update_validation\';';
+
+pwg_query($query);
+
+echo
+"\n"
+. $upgrade_description
+."\n"
+;
+?>
Index: tags/2.4.0RC3/install/db/index.php
===================================================================
--- tags/2.4.0RC3/install/db/index.php	(revision 14585)
+++ tags/2.4.0RC3/install/db/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/install/hosting.php
===================================================================
--- tags/2.4.0RC3/install/hosting.php	(revision 14585)
+++ tags/2.4.0RC3/install/hosting.php	(revision 14585)
@@ -0,0 +1,59 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/* PHP5 configuration for known servers */
+$hosting = array(
+
+  //1and1
+    'kundenserver.de' => 'AddType x-mapp-php5 .php',
+
+  //Apinc
+    'apinc.org' => 'AddHandler x-httpd-php5 .php',
+
+  //Free
+    'free.fr' => 'php 1',
+
+  //Lost Oasis
+    'lost-oasis.net' => 'PHP_Version 5.0',
+    'lo-data.net' => 'PHP_Version 5.0',
+
+  //MediaTemple
+    'gridserver.com' => 'AddHandler php5-script .php',
+
+  //Online
+    'online.net' => 'AddType application/x-httpd-php5 .php',
+
+  //Ouvaton
+    'web.ocsa-data.net' => 'AddHandler application/x-suexec-php5 .php',
+
+  //OVH
+    'ovh.net' => 'SetEnv PHP_VER 5',
+
+  //Strato
+    'rzone.de' => 'AddType application/x-httpd-php5 .php',
+
+  //Web1.fr - NFrance
+    'nfrance.com' => 'AddHandler php-fastcgi5 .php',
+);
+?>
Index: tags/2.4.0RC3/install/index.php
===================================================================
--- tags/2.4.0RC3/install/index.php	(revision 14585)
+++ tags/2.4.0RC3/install/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/install/obsolete.list
===================================================================
--- tags/2.4.0RC3/install/obsolete.list	(revision 14585)
+++ tags/2.4.0RC3/install/obsolete.list	(revision 14585)
@@ -0,0 +1,131 @@
+readme.txt
+photo.php
+index.htm
+commenter.php
+a_propos.php
+diapo.php
+personnaliser.php
+debut_tableau.inc
+fin_tableau.inc
+help_phpwebgallery
+tools/translation_validated.inc.php
+tools/config_local.inc.php
+galleries/index.htm
+galleries/.cvsignore
+install/upgrade_1.3.2.php
+install/upgrade_1.4.1.php
+install/phpwebgallery_structure.sql
+install/dbscheme.txt
+install/upgrade_1.3.3.php
+install/upgrade_1.3.4.php
+install/piwigo_structure.sql
+install/db/22.7-database.php
+install/db/22.6-database.php
+install/db/22.8-database.php
+install/db/22.9-database.php
+install/db/22.5-database.php
+install/db/22.2-database.php
+install/db/22.3-database.php
+install/db/22.1-database.php
+include_phpwebgallery
+plugins/admin_advices
+plugins/event_tracer
+plugins/language_switch/icons
+plugins/add_index
+plugins/hello_world
+admin/update.php
+admin/remote_site.php
+admin/user_modify.php
+admin/index.htm
+admin/ws_checker.php
+admin/admin_phpinfo.php
+admin/isadmin.php
+admin/admin.php
+admin/search.php
+admin/infos_images.php
+admin/ajout.php
+admin/create_listing_file.php
+admin/liste_users.php
+admin/advanced_feature.php
+admin/phpwebgallery_structure.sql
+admin/manuel.php
+admin/cat.php
+admin/waiting.php
+admin/install.php
+admin/historique.php
+admin/miseajour.php
+admin/edit_cat.php
+admin/perm.php
+admin/images
+admin/include/functions_waiting.inc.php
+admin/include/index.htm
+admin/include/isadmin.inc.php
+admin/include/functions_themes.inc.php
+admin/include/functions_tabsheet.inc.php
+admin/include/functions_check_integrity.inc.php
+admin/template
+doc/ChangeLog
+admin_phpwebgallery
+images
+template-common
+include/template.php
+include/config.php
+include/style.php
+include/scripts.js
+include/index.htm
+include/functions_group.inc.php
+include/category_recent_cats.inc.php
+include/vtemplate.class.php
+include/mysql.inc.php
+include/init.inc.php
+include/category_calendar.inc.php
+include/.cvsignore
+include/category_subcats.inc.php
+include/pngfix.js
+include/functions.php
+include/config.inc.php
+include/php_compat/file_put_contents.php
+template
+images_phpwebgallery
+language/dutch.php
+language/nederlands.php
+language/index.htm
+language/svenska.php
+language/english.php
+language/catala.php
+language/francais.php
+language/czech.php
+language/magyar.php
+language/russian.php
+language/portuguese-br.php
+language/spanish.php
+language/italiano.php
+language/deutsch.php
+language/norsk.php
+language/japanese.php
+language/es_ES/help.html
+language/es_ES/help/advanced_feature.html
+language/ja_JP/help.html
+language/ja_JP/help/advanced_feature.html
+language/it_IT/help.html
+language/it_IT/help/advanced_feature.html
+language/hr_HR/help.html
+language/hr_HR/help/advanced_feature.html
+language/zh_CN/help.html
+language/de_DE/help.html
+language/de_DE/help/advanced_feature.html
+language/fr_FR/help.html
+language/fr_FR/help/advanced_feature.html
+language/fr_FR.iso-8859-1
+language/cz_CZ
+language/hu_HU/help.html
+language/en_UK.iso-8859-1
+language/pl_PL/help.html
+language/pl_PL/help/advanced_feature.html
+language/pt_BR/help.html
+language/ru_RU/help.html
+language/ru_RU/help/advanced_feature.html
+language/nl_NL/help.html
+language/nl_NL/help/advanced_feature.html
+language/en_UK/help.html
+language/en_UK/help/advanced_feature.html
Index: tags/2.4.0RC3/install/obsolete_extensions.list
===================================================================
--- tags/2.4.0RC3/install/obsolete_extensions.list	(revision 14585)
+++ tags/2.4.0RC3/install/obsolete_extensions.list	(revision 14585)
@@ -0,0 +1,12 @@
+411: pwg_images_addSimple
+396: albums
+449: Photos
+405: unTagged
+440: bulk_manager
+302: autoupdate
+525: regenerateThumbnails
+529: regenerateWebsize
+388: square_thumbnails
+522: external_ImageMagick
+327: Ajax_Thumbnailer
+400: spread_menus
Index: tags/2.4.0RC3/install/php5_apache_configuration.php
===================================================================
--- tags/2.4.0RC3/install/php5_apache_configuration.php	(revision 14585)
+++ tags/2.4.0RC3/install/php5_apache_configuration.php	(revision 14585)
@@ -0,0 +1,201 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+$script = script_basename();
+
+if (($script != 'install' and $script != 'upgrade')
+  or version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '>='))
+{
+  die('Nothing to do here...');
+}
+
+function initPHP5()
+{
+  include(PHPWG_ROOT_PATH.'install/hosting.php');
+  $htaccess = PHPWG_ROOT_PATH.'.htaccess';
+  
+  if ((file_exists($htaccess) and (!is_readable($htaccess) or !is_writable($htaccess)))
+    or !($my_hostname = @gethostbyaddr($_SERVER['SERVER_ADDR'])))
+  {
+    return false;
+  }
+
+  foreach ($hosting as $hostname => $rule)
+  {
+    if (preg_match('!'.preg_quote($hostname).'$!',$my_hostname))
+    {
+      if (false !== ($fh = @fopen($htaccess,"ab")))
+      {
+        fwrite($fh,"\n".$rule);
+        fclose($fh);
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+function openPage()
+{
+  global $script;
+
+  $title = 'Piwigo '.PHPWG_VERSION.' - '.l10n(ucwords($script));
+
+  header('Content-Type: text/html; charset=UTF-8');
+
+  echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta http-equiv="Content-script-type" content="text/javascript">
+<meta http-equiv="Content-Style-Type" content="text/css">
+<link rel="shortcut icon" type="image/x-icon" href="themes/default/icon/favicon.ico">
+<link rel="stylesheet" type="text/css" href="admin/themes/roma/default-colors.css">
+<link rel="stylesheet" type="text/css" href="admin/themes/roma/theme.css">
+<style type="text/css">
+body {
+  background:url("admin/themes/roma/images/bottom-left-bg.jpg") no-repeat fixed left bottom #111111;
+}
+
+.content {
+ background:url("admin/themes/roma/images/fillet.png") repeat-x scroll left top #222222;
+ width: 800px;
+ min-height: 0px !important;
+ margin: auto;
+ text-align: left;
+ padding: 25px;
+}
+
+#headbranch  {
+  background:url("admin/themes/roma/images/top-left-bg.jpg") no-repeat scroll left top transparent;
+}
+
+#theHeader {
+  display: block;
+  background:url("admin/themes/roma/images/piwigo_logo_sombre_214x100.png") no-repeat scroll 245px top transparent;
+}
+
+.content h2 {
+  display:block;
+  font-size:28px;
+  height:104px;
+  width:54%;
+  color:#666666;
+  letter-spacing:-1px;
+  margin:0 30px 3px 20px;
+  overflow:hidden;
+  position:absolute;
+  right:0;
+  text-align:right;
+  top:0;
+  width:770px;
+  text-align:right;
+  text-transform:none; 
+}
+
+table { margin: 0 0 15px 0; }
+td {  padding: 3px 10px; }
+h1 { text-align: left; }
+</style>
+<title>'.$title.'</title>
+</head>
+
+<body>
+<div id="headbranch"></div>
+<div id="the_page">
+<div id="theHeader"></div>
+<div id="content" class="content">
+
+<h2>'.$title.'</h2>';
+}
+
+function closePage()
+{
+  echo '
+</div>
+<div style="text-align: center">'.sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum').'</div>
+</div>
+</body>
+</html>';
+}
+
+if (isset($_GET['setphp5']))
+{
+  // Try to configure php5
+  if (initPHP5())
+  {
+    header('Location: '.$script.'.php?language='.$language);
+  }
+  else
+  {
+    openPage();
+    echo '
+<h1>'.l10n('Sorry!').'</h1>
+<p>
+'.l10n('Piwigo was not able to configure PHP 5.').'<br>
+'.l10n("You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself.").'<br>
+'.l10n('Hope to see you back soon.').'
+</p>';
+    closePage();
+  }
+}
+else
+{
+  openPage();
+  echo '
+  <table>
+  <tr>
+    <td>'.l10n('Language').'</td>
+    <td>
+      <select name="language" onchange="document.location = \''.$script.'.php?language=\'+this.options[this.selectedIndex].value;">';
+  foreach ($languages->fs_languages as $code => $fs_language)
+  {
+    echo '
+      <option label="'.$fs_language['name'].'" value="'.$code.'" '.($code == $language ? 'selected="selected"' : '') .'>'.$fs_language['name'].'</option>';
+  }
+  echo '
+      </select>
+    </td>
+  </tr>
+</table>
+
+<h1>'.l10n('PHP 5 is required').'</h1>
+<p>
+'.sprintf(l10n('It appears your webhost is currently running PHP %s.'), PHP_VERSION).'<br>
+'.l10n('Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.').'<br>
+'.l10n('Note you can change your configuration by yourself and restart Piwigo after that.').'<br>
+</p>
+<p style="text-align: center;"><br>
+<input type="button" value="'.l10n('Try to configure PHP 5').'" onClick="document.location = \''.$script.'.php?language='.$language.'&amp;setphp5=\';">
+</p>';
+  closePage();
+}
+
+exit();
+?>
Index: tags/2.4.0RC3/install/piwigo_structure-mysql.sql
===================================================================
--- tags/2.4.0RC3/install/piwigo_structure-mysql.sql	(revision 14585)
+++ tags/2.4.0RC3/install/piwigo_structure-mysql.sql	(revision 14585)
@@ -0,0 +1,452 @@
+-- MySQL dump 9.11
+--
+-- Host: localhost    Database: pwg-bsf
+-- ------------------------------------------------------
+-- Server version	4.0.24_Debian-10-log
+
+--
+-- Table structure for table `piwigo_caddie`
+--
+
+DROP TABLE IF EXISTS `piwigo_caddie`;
+CREATE TABLE `piwigo_caddie` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `element_id` mediumint(8) NOT NULL default '0',
+  PRIMARY KEY  (`user_id`,`element_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_categories`
+--
+
+DROP TABLE IF EXISTS `piwigo_categories`;
+CREATE TABLE `piwigo_categories` (
+  `id` smallint(5) unsigned NOT NULL auto_increment,
+  `name` varchar(255) NOT NULL default '',
+  `id_uppercat` smallint(5) unsigned default NULL,
+  `comment` text,
+  `dir` varchar(255) default NULL,
+  `rank` smallint(5) unsigned default NULL,
+  `status` enum('public','private') NOT NULL default 'public',
+  `site_id` tinyint(4) unsigned default '1',
+  `visible` enum('true','false') NOT NULL default 'true',
+  `representative_picture_id` mediumint(8) unsigned default NULL,
+  `uppercats` varchar(255) NOT NULL default '',
+  `commentable` enum('true','false') NOT NULL default 'true',
+  `global_rank` varchar(255) default NULL,
+  `image_order` varchar(128) default NULL,
+  `permalink` varchar(64) binary default NULL,
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `categories_i3` (`permalink`),
+  KEY `categories_i2` (`id_uppercat`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_comments`
+--
+
+DROP TABLE IF EXISTS `piwigo_comments`;
+CREATE TABLE `piwigo_comments` (
+  `id` int(11) unsigned NOT NULL auto_increment,
+  `image_id` mediumint(8) unsigned NOT NULL default '0',
+  `date` datetime NOT NULL default '0000-00-00 00:00:00',
+  `author` varchar(255) default NULL,
+  `author_id` smallint(5) DEFAULT NULL,
+  `content` longtext,
+  `validated` enum('true','false') NOT NULL default 'false',
+  `validation_date` datetime default NULL,
+  PRIMARY KEY  (`id`),
+  KEY `comments_i2` (`validation_date`),
+  KEY `comments_i1` (`image_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_config`
+--
+
+DROP TABLE IF EXISTS `piwigo_config`;
+CREATE TABLE `piwigo_config` (
+  `param` varchar(40) NOT NULL default '',
+  `value` text,
+  `comment` varchar(255) default NULL,
+  PRIMARY KEY  (`param`)
+) ENGINE=MyISAM COMMENT='configuration table';
+
+--
+-- Table structure for table `piwigo_favorites`
+--
+
+DROP TABLE IF EXISTS `piwigo_favorites`;
+CREATE TABLE `piwigo_favorites` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `image_id` mediumint(8) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`user_id`,`image_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_group_access`
+--
+
+DROP TABLE IF EXISTS `piwigo_group_access`;
+CREATE TABLE `piwigo_group_access` (
+  `group_id` smallint(5) unsigned NOT NULL default '0',
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`group_id`,`cat_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_groups`
+--
+
+DROP TABLE IF EXISTS `piwigo_groups`;
+CREATE TABLE `piwigo_groups` (
+  `id` smallint(5) unsigned NOT NULL auto_increment,
+  `name` varchar(255) NOT NULL default '',
+  `is_default` enum('true','false') NOT NULL default 'false',
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `groups_ui1` (`name`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_history`
+--
+
+DROP TABLE IF EXISTS `piwigo_history`;
+CREATE TABLE `piwigo_history` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `date` date NOT NULL default '0000-00-00',
+  `time` time NOT NULL default '00:00:00',
+  `user_id` smallint(5) NOT NULL default '0',
+  `IP` varchar(15) NOT NULL default '',
+  `section` enum('categories','tags','search','list','favorites','most_visited','best_rated','recent_pics','recent_cats') default NULL,
+  `category_id` smallint(5) default NULL,
+  `tag_ids` varchar(50) default NULL,
+  `image_id` mediumint(8) default NULL,
+  `summarized` enum('true','false') default 'false',
+  `image_type` enum('picture','high','other') default NULL,
+  PRIMARY KEY  (`id`),
+  KEY `history_i1` (`summarized`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_history_summary`
+--
+
+DROP TABLE IF EXISTS `piwigo_history_summary`;
+CREATE TABLE `piwigo_history_summary` (
+  `year` smallint(4) NOT NULL default '0',
+  `month` tinyint(2) default NULL,
+  `day` tinyint(2) default NULL,
+  `hour` tinyint(2) default NULL,
+  `nb_pages` int(11) default NULL,
+  UNIQUE KEY history_summary_ymdh (`year`,`month`,`day`,`hour`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_image_category`
+--
+
+DROP TABLE IF EXISTS `piwigo_image_category`;
+CREATE TABLE `piwigo_image_category` (
+  `image_id` mediumint(8) unsigned NOT NULL default '0',
+  `category_id` smallint(5) unsigned NOT NULL default '0',
+  `rank` mediumint(8) unsigned default NULL,
+  PRIMARY KEY  (`image_id`,`category_id`),
+  KEY `image_category_i1` (`category_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_image_tag`
+--
+
+DROP TABLE IF EXISTS `piwigo_image_tag`;
+CREATE TABLE `piwigo_image_tag` (
+  `image_id` mediumint(8) unsigned NOT NULL default '0',
+  `tag_id` smallint(5) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`image_id`,`tag_id`),
+  KEY `image_tag_i1` (`tag_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_images`
+--
+
+DROP TABLE IF EXISTS `piwigo_images`;
+CREATE TABLE `piwigo_images` (
+  `id` mediumint(8) unsigned NOT NULL auto_increment,
+  `file` varchar(255) binary NOT NULL default '',
+  `date_available` datetime NOT NULL default '0000-00-00 00:00:00',
+  `date_creation` datetime default NULL,
+  `tn_ext` varchar(4) default '',
+  `name` varchar(255) default NULL,
+  `comment` text,
+  `author` varchar(255) default NULL,
+  `hit` int(10) unsigned NOT NULL default '0',
+  `filesize` mediumint(9) unsigned default NULL,
+  `width` smallint(9) unsigned default NULL,
+  `height` smallint(9) unsigned default NULL,
+  `coi` char(4) default NULL COMMENT 'center of interest',
+  `representative_ext` varchar(4) default NULL,
+  `date_metadata_update` date default NULL,
+  `rating_score` float(5,2) unsigned default NULL,
+  `has_high` enum('true') default NULL,
+  `path` varchar(255) NOT NULL default '',
+  `storage_category_id` smallint(5) unsigned default NULL,
+  `high_filesize` mediumint(9) unsigned default NULL,
+  `high_width` smallint(9) unsigned default NULL,
+  `high_height` smallint(9) unsigned default NULL,
+  `level` tinyint unsigned NOT NULL default '0',
+  `md5sum` char(32) default NULL,
+  `added_by` smallint(5) NOT NULL default '0',
+  `rotation` tinyint unsigned default null,
+  PRIMARY KEY  (`id`),
+  KEY `images_i2` (`date_available`),
+  KEY `images_i3` (`rating_score`),
+  KEY `images_i4` (`hit`),
+  KEY `images_i5` (`date_creation`),
+  KEY `images_i1` (`storage_category_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_languages`
+--
+
+DROP TABLE IF EXISTS `piwigo_languages`;
+CREATE TABLE `piwigo_languages` (
+  `id` varchar(64) NOT NULL default '',
+  `version` varchar(64) NOT NULL default '0',
+  `name` varchar(64) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_old_permalinks`
+--
+
+DROP TABLE IF EXISTS `piwigo_old_permalinks`;
+CREATE TABLE `piwigo_old_permalinks` (
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  `permalink` varchar(64) binary NOT NULL default '',
+  `date_deleted` datetime NOT NULL default '0000-00-00 00:00:00',
+  `last_hit` datetime default NULL,
+  `hit` int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`permalink`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_plugins`
+--
+
+DROP TABLE IF EXISTS `piwigo_plugins`;
+CREATE TABLE `piwigo_plugins` (
+  `id` varchar(64) binary NOT NULL default '',
+  `state` enum('inactive','active') NOT NULL default 'inactive',
+  `version` varchar(64) NOT NULL default '0',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_rate`
+--
+
+DROP TABLE IF EXISTS `piwigo_rate`;
+CREATE TABLE `piwigo_rate` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `element_id` mediumint(8) unsigned NOT NULL default '0',
+  `anonymous_id` varchar(45) NOT NULL default '',
+  `rate` tinyint(2) unsigned NOT NULL default '0',
+  `date` date NOT NULL default '0000-00-00',
+  PRIMARY KEY  (`element_id`,`user_id`,`anonymous_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_search`
+--
+
+DROP TABLE IF EXISTS `piwigo_search`;
+CREATE TABLE `piwigo_search` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `last_seen` date default NULL,
+  `rules` text,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_sessions`
+--
+
+DROP TABLE IF EXISTS `piwigo_sessions`;
+CREATE TABLE `piwigo_sessions` (
+  `id` varchar(255) binary NOT NULL default '',
+  `data` mediumtext NOT NULL,
+  `expiration` datetime NOT NULL default '0000-00-00 00:00:00',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_sites`
+--
+
+DROP TABLE IF EXISTS `piwigo_sites`;
+CREATE TABLE `piwigo_sites` (
+  `id` tinyint(4) NOT NULL auto_increment,
+  `galleries_url` varchar(255) NOT NULL default '',
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `sites_ui1` (`galleries_url`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_tags`
+--
+
+DROP TABLE IF EXISTS `piwigo_tags`;
+CREATE TABLE `piwigo_tags` (
+  `id` smallint(5) unsigned NOT NULL auto_increment,
+  `name` varchar(255) binary NOT NULL default '',
+  `url_name` varchar(255) binary NOT NULL default '',
+  PRIMARY KEY  (`id`),
+  KEY `tags_i1` (`url_name`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_themes`
+--
+
+DROP TABLE IF EXISTS `piwigo_themes`;
+CREATE TABLE `piwigo_themes` (
+  `id` varchar(64) NOT NULL default '',
+  `version` varchar(64) NOT NULL default '0',
+  `name` varchar(64) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_upgrade`
+--
+
+DROP TABLE IF EXISTS `piwigo_upgrade`;
+CREATE TABLE `piwigo_upgrade` (
+  `id` varchar(20) NOT NULL default '',
+  `applied` datetime NOT NULL default '0000-00-00 00:00:00',
+  `description` varchar(255) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_access`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_access`;
+CREATE TABLE `piwigo_user_access` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`user_id`,`cat_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_cache`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_cache`;
+CREATE TABLE `piwigo_user_cache` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `need_update` enum('true','false') NOT NULL default 'true',
+  `cache_update_time` integer unsigned NOT NULL default 0,
+  `forbidden_categories` mediumtext,
+  `nb_total_images` mediumint(8) unsigned default NULL,
+  `image_access_type` enum('NOT IN','IN') NOT NULL default 'NOT IN',
+  `image_access_list` mediumtext default NULL,
+  PRIMARY KEY  (`user_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_cache_categories`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_cache_categories`;
+CREATE TABLE `piwigo_user_cache_categories` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  `date_last` datetime default NULL,
+  `max_date_last` datetime default NULL,
+  `nb_images` mediumint(8) unsigned NOT NULL default '0',
+  `count_images` mediumint(8) unsigned default '0',
+  `count_categories` mediumint(8) unsigned default '0',
+  `user_representative_picture_id` mediumint(8) unsigned default NULL,
+  PRIMARY KEY  (`user_id`,`cat_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_feed`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_feed`;
+CREATE TABLE `piwigo_user_feed` (
+  `id` varchar(50) binary NOT NULL default '',
+  `user_id` smallint(5) NOT NULL default '0',
+  `last_check` datetime default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_group`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_group`;
+CREATE TABLE `piwigo_user_group` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `group_id` smallint(5) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`group_id`,`user_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_infos`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_infos`;
+CREATE TABLE `piwigo_user_infos` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `nb_image_page` smallint(3) unsigned NOT NULL default '15',
+  `status` enum('webmaster','admin','normal','generic','guest') NOT NULL default 'guest',
+  `language` varchar(50) NOT NULL default 'en_UK',
+  `maxwidth` smallint(6) default NULL,
+  `maxheight` smallint(6) default NULL,
+  `expand` enum('true','false') NOT NULL default 'false',
+  `show_nb_comments` enum('true','false') NOT NULL default 'false',
+  `show_nb_hits` enum('true','false') NOT NULL default 'false',
+  `recent_period` tinyint(3) unsigned NOT NULL default '7',
+  `theme` varchar(255) NOT NULL default 'elegant',
+  `registration_date` datetime NOT NULL default '0000-00-00 00:00:00',
+  `enabled_high` enum('true','false') NOT NULL default 'true',
+  `level` tinyint unsigned NOT NULL default '0',
+  `activation_key` char(20) default NULL,
+  UNIQUE KEY `user_infos_ui1` (`user_id`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_user_mail_notification`
+--
+
+DROP TABLE IF EXISTS `piwigo_user_mail_notification`;
+CREATE TABLE `piwigo_user_mail_notification` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `check_key` varchar(16) binary NOT NULL default '',
+  `enabled` enum('true','false') NOT NULL default 'false',
+  `last_send` datetime default NULL,
+  PRIMARY KEY  (`user_id`),
+  UNIQUE KEY `user_mail_notification_ui1` (`check_key`)
+) ENGINE=MyISAM;
+
+--
+-- Table structure for table `piwigo_users`
+--
+
+DROP TABLE IF EXISTS `piwigo_users`;
+CREATE TABLE `piwigo_users` (
+  `id` smallint(5) NOT NULL auto_increment,
+  `username` varchar(100) binary NOT NULL default '',
+  `password` varchar(32) default NULL,
+  `mail_address` varchar(255) default NULL,
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `users_ui1` (`username`)
+) ENGINE=MyISAM;
Index: tags/2.4.0RC3/install/upgrade_1.3.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.3.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.3.0.php	(revision 14585)
@@ -0,0 +1,126 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+/**
+ * Upgrade from 1.3.0 to 1.3.1
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+$queries = array(
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD COLUMN uppercats varchar(255) NOT NULL default ''
+;",
+
+  "
+CREATE TABLE phpwebgallery_user_category (
+  user_id smallint(5) unsigned NOT NULL default '0'
+)
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD INDEX id (id)
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD INDEX id_uppercat (id_uppercat)
+;",
+
+  "
+ALTER TABLE phpwebgallery_image_category
+  ADD INDEX category_id (category_id)
+;",
+
+  "
+ALTER TABLE phpwebgallery_image_category
+  ADD INDEX image_id (image_id)
+;",
+  );
+
+foreach ($queries as $query)
+{
+  $query = str_replace('phpwebgallery_', PREFIX_TABLE, $query);
+  pwg_query($query);
+}
+// filling the new column categories.uppercats
+$id_uppercats = array();
+
+$query = '
+SELECT id, id_uppercat
+  FROM '.CATEGORIES_TABLE.'
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  if (!isset($row['id_uppercat']) or $row['id_uppercat'] == '')
+  {
+    $row['id_uppercat'] = 'NULL';
+  }
+  $id_uppercats[$row['id']] = $row['id_uppercat'];
+}
+
+$datas = array();
+
+foreach (array_keys($id_uppercats) as $id)
+{
+  $data = array();
+  $data['id'] = $id;
+  $uppercats = array();
+  
+  array_push($uppercats, $id);
+  while (isset($id_uppercats[$id]) and $id_uppercats[$id] != 'NULL')
+  {
+    array_push($uppercats, $id_uppercats[$id]);
+    $id = $id_uppercats[$id];
+  }
+  $data['uppercats'] = implode(',', array_reverse($uppercats));
+
+  array_push($datas, $data);
+}
+
+mass_updates(
+  CATEGORIES_TABLE,
+  array(
+    'primary' => array('id'),
+    'update' => array('uppercats')
+    ),
+  $datas
+  );
+
+// now we upgrade from 1.3.1 to 1.6.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.3.1.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.3.1.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.3.1.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.3.1.php	(revision 14585)
@@ -0,0 +1,613 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Upgrade from 1.3.x (x >= 1) to 1.4.0
+ */
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+// save data before deletion
+$query = '
+SELECT prefix_thumbnail, mail_webmaster
+  FROM '.PREFIX_TABLE.'config
+;';
+$save = pwg_db_fetch_assoc(pwg_query($query));
+
+$queries = array(
+  "
+DROP TABLE phpwebgallery_config
+;",
+
+  "
+CREATE TABLE phpwebgallery_config (
+  param varchar(40) NOT NULL default '',
+  value varchar(255) default NULL,
+  comment varchar(255) default NULL,
+  PRIMARY KEY  (param)
+) ENGINE=MyISAM COMMENT='configuration table'
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  CHANGE COLUMN site_id site_id tinyint(4) unsigned default '1'
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD COLUMN commentable enum('true','false') NOT NULL default 'true'
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD COLUMN global_rank varchar(255) default NULL
+;",
+
+  "
+ALTER TABLE phpwebgallery_categories
+  ADD INDEX categories_i2 (id_uppercat)
+;",
+
+  "
+ALTER TABLE phpwebgallery_comments
+  ADD COLUMN date_temp int(11) unsigned
+;",
+
+  "
+UPDATE phpwebgallery_comments
+  SET date_temp = date
+;",
+
+  "
+ALTER TABLE phpwebgallery_comments
+  CHANGE COLUMN date date datetime NOT NULL default '0000-00-00 00:00:00'
+;",
+
+  "
+UPDATE phpwebgallery_comments
+  SET date = FROM_UNIXTIME(date_temp)
+;",
+
+  "
+ALTER TABLE phpwebgallery_comments
+  DROP COLUMN date_temp
+;",
+
+  "
+ALTER TABLE phpwebgallery_favorites
+  DROP INDEX user_id
+;",
+
+  "
+ALTER TABLE phpwebgallery_favorites
+  ADD PRIMARY KEY (user_id,image_id)
+;",
+
+  "
+ALTER TABLE phpwebgallery_history
+  ADD COLUMN date_temp int(11) unsigned
+;",
+
+  "
+UPDATE phpwebgallery_history
+  SET date_temp = date
+;",
+
+  "
+ALTER TABLE phpwebgallery_history
+  CHANGE COLUMN date date datetime NOT NULL default '0000-00-00 00:00:00'
+;",
+
+  "
+UPDATE phpwebgallery_history
+  SET date = FROM_UNIXTIME(date_temp)
+;",
+
+  "
+ALTER TABLE phpwebgallery_history
+  DROP COLUMN date_temp
+;",
+
+  "
+ALTER TABLE phpwebgallery_history
+  ADD INDEX history_i1 (date)
+;",
+
+  "
+ALTER TABLE phpwebgallery_image_category
+  ADD INDEX image_category_i1 (image_id),
+  ADD INDEX image_category_i2 (category_id)
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  CHANGE COLUMN tn_ext tn_ext varchar(4) default ''
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD COLUMN path varchar(255) NOT NULL default ''
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD COLUMN date_metadata_update date default NULL
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD COLUMN average_rate float(5,2) unsigned default NULL
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD COLUMN representative_ext varchar(4) default NULL
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  DROP INDEX storage_category_id
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD INDEX images_i1 (storage_category_id)
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD INDEX images_i2 (date_available)
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD INDEX images_i3 (average_rate)
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD INDEX images_i4 (hit)
+;",
+
+  "
+ALTER TABLE phpwebgallery_images
+  ADD INDEX images_i5 (date_creation)
+;",
+
+  "
+ALTER TABLE phpwebgallery_sessions
+  DROP COLUMN ip
+;",
+
+    "
+ALTER TABLE phpwebgallery_sessions
+  ADD COLUMN expiration_temp int(11) unsigned
+;",
+
+  "
+UPDATE phpwebgallery_sessions
+  SET expiration_temp = expiration
+;",
+
+  "
+ALTER TABLE phpwebgallery_sessions
+  CHANGE COLUMN expiration expiration datetime NOT NULL default '0000-00-00 00:00:00'
+;",
+
+  "
+UPDATE phpwebgallery_sessions
+  SET expiration = FROM_UNIXTIME(expiration_temp)
+;",
+
+  "
+ALTER TABLE phpwebgallery_sessions
+  DROP COLUMN expiration_temp
+;",
+
+  "
+ALTER TABLE phpwebgallery_sites
+  DROP INDEX galleries_url
+;",
+
+  "
+ALTER TABLE phpwebgallery_sites
+  ADD UNIQUE sites_ui1 (galleries_url)
+;",
+
+  "
+DROP TABLE phpwebgallery_user_category
+;",
+
+  "
+ALTER TABLE phpwebgallery_users
+  DROP COLUMN long_period
+;",
+
+  "
+ALTER TABLE phpwebgallery_users
+  DROP COLUMN short_period
+;",
+
+  "
+ALTER TABLE phpwebgallery_users
+  ADD COLUMN recent_period tinyint(3) unsigned NOT NULL default '7'
+;",
+
+  "
+ALTER TABLE phpwebgallery_users
+  DROP INDEX username
+;",
+
+  "
+ALTER TABLE phpwebgallery_users
+  ADD UNIQUE users_ui1 (username)
+;",
+
+  "
+CREATE TABLE phpwebgallery_rate (
+  user_id smallint(5) unsigned NOT NULL default '0',
+  element_id mediumint(8) unsigned NOT NULL default '0',
+  rate tinyint(2) unsigned NOT NULL default '0',
+  PRIMARY KEY  (user_id,element_id)
+) ENGINE=MyISAM
+;",
+
+  "
+CREATE TABLE phpwebgallery_user_forbidden (
+  user_id smallint(5) unsigned NOT NULL default '0',
+  need_update enum('true','false') NOT NULL default 'true',
+  forbidden_categories text,
+  PRIMARY KEY  (user_id)
+) ENGINE=MyISAM
+;",
+
+  "
+UPDATE phpwebgallery_users
+  SET language = 'en_UK.iso-8859-1'
+    , template = 'default'
+;",
+
+  "
+DELETE FROM phpwebgallery_user_access
+;",
+
+  "
+DELETE FROM phpwebgallery_group_access
+;"
+
+  );
+
+foreach ($queries as $query)
+{
+  $query = str_replace('phpwebgallery_', PREFIX_TABLE, $query);
+  pwg_query($query);
+}
+
+//
+// check indexes
+//
+$indexes_of = array(
+  'categories' => array(
+    'categories_i2' => array(
+      'columns' => array('id_uppercat'),
+      'unique' => false,
+      )
+    ),
+  'image_category' => array(
+    'image_category_i1' => array(
+      'columns' => array('image_id'),
+      'unique' => false,
+      ),
+    'image_category_i2' => array(
+      'columns' => array('category_id'),
+      'unique' => false,
+      ),
+    ),
+  );
+
+foreach (array_keys($indexes_of) as $table)
+{
+  $existing_indexes = array();
+
+  $query = '
+SHOW INDEX
+  FROM '.PREFIX_TABLE.$table.'
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    if ($row['Key_name'] != 'PRIMARY')
+    {
+      if (!in_array($row['Key_name'], array_keys($indexes_of[$table])))
+      {
+        $query = '
+ALTER TABLE '.PREFIX_TABLE.$table.'
+  DROP INDEX '.$row['Key_name'].'
+;';
+        pwg_query($query);
+      }
+      else
+      {
+        array_push($existing_indexes, $row['Key_name']);
+      }
+    }
+  }
+
+  foreach ($indexes_of[$table] as $index_name => $index)
+  {
+    if (!in_array($index_name, $existing_indexes))
+    {
+      $query = '
+ALTER TABLE '.PREFIX_TABLE.$table.'
+  ADD '.($index['unique'] ? 'UNIQUE' : 'INDEX').' '
+        .$index_name.' ('.implode(',', $index['columns']).')
+;';
+      pwg_query($query);
+    }
+  }
+}
+
+//
+// insert params in new configuration table
+//
+$params = array(
+  array(
+    'param'   => 'prefix_thumbnail',
+    'value'   => $save['prefix_thumbnail'],
+    'comment' => 'thumbnails filename prefix'
+    ),
+  array(
+    'param'   => 'mail_webmaster',
+    'value'   => $save['mail_webmaster'],
+    'comment' => 'webmaster mail'
+    ),
+  array(
+    'param'   => 'default_language',
+    'value'   => 'en_UK.iso-8859-1',
+    'comment' => 'Default gallery language'
+    ),
+  array(
+    'param'   => 'default_template',
+    'value'   => 'default',
+    'comment' => 'Default gallery style'
+    ),
+  array(
+    'param'   => 'default_maxwidth',
+    'value'   => '',
+    'comment' => 'maximum width authorized for displaying images'
+    ),
+  array(
+    'param'   => 'default_maxheight',
+    'value'   => '',
+    'comment' => 'maximum height authorized for the displaying images'
+    ),
+  array(
+    'param'   => 'nb_comment_page',
+    'value'   => '10',
+    'comment' => 'number of comments to display on each page'
+    ),
+  array(
+    'param'   => 'upload_maxfilesize',
+    'value'   => '150',
+    'comment' => 'maximum filesize for the uploaded pictures'
+    ),
+  array(
+    'param'   => 'upload_maxwidth',
+    'value'   => '800',
+    'comment' => 'maximum width authorized for the uploaded images'
+    ),
+  array(
+    'param'   => 'upload_maxheight',
+    'value'   => '600',
+    'comment' => 'maximum height authorized for the uploaded images'
+    ),
+  array(
+    'param'   => 'upload_maxwidth_thumbnail',
+    'value'   => '150',
+    'comment' => 'maximum width authorized for the uploaded thumbnails'
+    ),
+  array(
+    'param'   => 'upload_maxheight_thumbnail',
+    'value'   => '100',
+    'comment' => 'maximum height authorized for the uploaded thumbnails'
+    ),
+  array(
+    'param'   => 'log',
+    'value'   => 'false',
+    'comment' => 'keep an history of visits on your website'
+    ),
+  array(
+    'param'   => 'comments_validation',
+    'value'   => 'false',
+    'comment' => 'administrators validate users comments before becoming visible'
+    ),
+  array(
+    'param'   => 'comments_forall',
+    'value'   => 'false',
+    'comment' => 'even guest not registered can post comments'
+    ),
+  array(
+    'param'   => 'mail_notification',
+    'value'   => 'false',
+    'comment' => 'automated mail notification for adminsitrators'
+    ),
+  array(
+    'param'   => 'nb_image_line',
+    'value'   => '5',
+    'comment' => 'Number of images displayed per row'
+    ),
+  array(
+    'param'   => 'nb_line_page',
+    'value'   => '3',
+    'comment' => 'Number of rows displayed per page'
+    ),
+  array(
+    'param'   => 'recent_period',
+    'value'   => '7',
+    'comment' => 'Period within which pictures are displayed as new (in days)'
+    ),
+  array(
+    'param'   => 'auto_expand',
+    'value'   => 'false',
+    'comment' => 'Auto expand of the category tree'
+    ),
+  array(
+    'param'   => 'show_nb_comments',
+    'value'   => 'false',
+    'comment' => 'Show the number of comments under the thumbnails'
+    ),
+  array(
+    'param'   => 'use_iptc',
+    'value'   => 'false',
+    'comment' => 'Use IPTC data during database synchronization with files metadata'
+    ),
+  array(
+    'param'   => 'use_exif',
+    'value'   => 'false',
+    'comment' => 'Use EXIF data during database synchronization with files metadata'
+    ),
+  array(
+    'param'   => 'show_iptc',
+    'value'   => 'false',
+    'comment' => 'Show IPTC metadata on picture.php if asked by user'
+    ),
+  array(
+    'param'   => 'show_exif',
+    'value'   => 'true',
+    'comment' => 'Show EXIF metadata on picture.php if asked by user'
+    ),
+  array(
+    'param'   => 'authorize_remembering',
+    'value'   => 'true',
+    'comment' => 'Authorize users to be remembered, see $conf{remember_me_length}'
+    ),
+  array(
+    'param'   => 'gallery_locked',
+    'value'   => 'false',
+    'comment' => 'Lock your gallery temporary for non admin users'
+    ),
+  );
+
+mass_inserts(
+  CONFIG_TABLE,
+  array_keys($params[0]),
+  $params
+  );
+
+// refresh calculated datas
+update_global_rank();
+update_category();
+
+// update calculated field "images.path"
+$cat_ids = array();
+
+$query = '
+SELECT DISTINCT(storage_category_id) AS unique_storage_category_id
+  FROM '.IMAGES_TABLE.'
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($cat_ids, $row['unique_storage_category_id']);
+}
+$fulldirs = get_fulldirs($cat_ids);
+
+foreach ($cat_ids as $cat_id)
+{
+  $query = '
+UPDATE '.IMAGES_TABLE.'
+  SET path = CONCAT(\''.$fulldirs[$cat_id].'\',\'/\',file)
+  WHERE storage_category_id = '.$cat_id.'
+;';
+  pwg_query($query);
+}
+
+// all sub-categories of private categories become private
+$cat_ids = array();
+
+$query = '
+SELECT id
+  FROM '.CATEGORIES_TABLE.'
+  WHERE status = \'private\'
+;';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  array_push($cat_ids, $row['id']);
+}
+
+if (count($cat_ids) > 0)
+{
+  $privates = get_subcat_ids($cat_ids);
+
+  $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET status = \'private\'
+  WHERE id IN ('.implode(',', $privates).')
+;';
+  pwg_query($query);
+}
+
+// load the config file
+$config_file = PHPWG_ROOT_PATH.'local/config/database.inc.php';
+$config_file_contents = @file_get_contents($config_file);
+if ($config_file_contents === false)
+{
+  die('CANNOT LOAD '.$config_file);
+}
+$php_end_tag = strrpos($config_file_contents, '?'.'>');
+if ($php_end_tag === false)
+{
+  die('CANNOT FIND PHP END TAG IN '.$config_file);
+}
+if (!is_writable($config_file))
+{
+  die('FILE NOT WRITABLE '.$config_file);
+}
+
+// changes to write in database.inc.php
+array_push($mysql_changes, 'define(\'PHPWG_INSTALLED\', true);');
+
+// Send infos
+$page['infos'] = array_merge(
+  $page['infos'],
+  array(
+    l10n('All sub-albums of private albums become private'),
+    l10n('User permissions and group permissions have been erased'),
+    l10n('Only thumbnails prefix and webmaster mail address have been saved from previous configuration')
+    )
+  );
+
+// now we upgrade from 1.4.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.4.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.4.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.4.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.4.0.php	(revision 14585)
@@ -0,0 +1,292 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+$last_time = get_moment();
+
+// will the user have to edit include/config_local.inc.php for
+// prefix_thumbnail configuration parameter
+$query = '
+SELECT value
+  FROM '.CONFIG_TABLE.'
+  WHERE param = \'prefix_thumbnail\'
+;';
+list($prefix_thumbnail) = pwg_db_fetch_row(pwg_query($query));
+
+// delete obsolete configuration
+$query = '
+DELETE
+  FROM '.PREFIX_TABLE.'config
+  WHERE param IN (
+   \'prefix_thumbnail\',
+   \'mail_webmaster\',
+   \'upload_maxfilesize\',
+   \'upload_maxwidth\',
+   \'upload_maxheight\',
+   \'upload_maxwidth_thumbnail\',
+   \'upload_maxheight_thumbnail\',
+   \'mail_notification\',
+   \'use_iptc\',
+   \'use_exif\',
+   \'show_iptc\',
+   \'show_exif\',
+   \'authorize_remembering\'
+   )
+;';
+pwg_query($query);
+
+$queries = array(
+
+  "
+ALTER TABLE piwigo_categories
+  CHANGE COLUMN date_last date_last datetime default NULL
+;",
+
+  "
+ALTER TABLE piwigo_comments
+  ADD COLUMN validation_date datetime default NULL
+;",
+
+  "
+UPDATE piwigo_comments
+  SET validation_date = date
+",
+
+  "
+ALTER TABLE piwigo_comments
+  ADD INDEX comments_i1 (image_id)
+;",
+
+  "
+ALTER TABLE piwigo_comments
+  ADD INDEX comments_i2 (validation_date)
+;",
+
+  "
+ALTER TABLE piwigo_favorites
+  CHANGE COLUMN user_id user_id smallint(5) NOT NULL default '0'
+;",
+
+  "
+ALTER TABLE piwigo_images
+  CHANGE COLUMN date_available
+    date_available datetime NOT NULL default '0000-00-00 00:00:00'
+;",
+
+  "
+ALTER TABLE piwigo_rate
+  CHANGE COLUMN user_id user_id smallint(5) NOT NULL default '0'
+;",
+
+  "
+ALTER TABLE piwigo_sessions
+  CHANGE COLUMN user_id user_id smallint(5) NOT NULL default '0'
+;",
+
+  "
+ALTER TABLE piwigo_user_access
+  CHANGE COLUMN user_id user_id smallint(5) NOT NULL default '0'
+;",
+
+  "
+DROP TABLE piwigo_user_forbidden
+;",
+
+  "
+ALTER TABLE piwigo_user_group
+ CHANGE COLUMN user_id user_id smallint(5) NOT NULL default '0'
+;",
+
+  "
+ALTER TABLE piwigo_users
+  CHANGE COLUMN id id smallint(5) NOT NULL auto_increment
+;",
+
+  "
+CREATE TABLE piwigo_caddie (
+  user_id smallint(5) NOT NULL default '0',
+  element_id mediumint(8) NOT NULL default '0',
+  PRIMARY KEY  (user_id,element_id)
+) ENGINE=MyISAM
+;",
+
+  "
+CREATE TABLE piwigo_user_cache (
+  user_id smallint(5) NOT NULL default '0',
+  need_update enum('true','false') NOT NULL default 'true',
+  forbidden_categories text,
+  PRIMARY KEY  (user_id)
+) ENGINE=MyISAM
+;",
+
+  "
+CREATE TABLE piwigo_user_feed (
+  id varchar(50) binary NOT NULL default '',
+  user_id smallint(5) NOT NULL default '0',
+  last_check datetime default NULL,
+  PRIMARY KEY  (id)
+) ENGINE=MyISAM
+;",
+
+  "
+CREATE TABLE piwigo_user_infos (
+  user_id smallint(5) NOT NULL default '0',
+  nb_image_line tinyint(1) unsigned NOT NULL default '5',
+  nb_line_page tinyint(3) unsigned NOT NULL default '3',
+  status enum('admin','guest') NOT NULL default 'guest',
+  language varchar(50) NOT NULL default 'english',
+  maxwidth smallint(6) default NULL,
+  maxheight smallint(6) default NULL,
+  expand enum('true','false') NOT NULL default 'false',
+  show_nb_comments enum('true','false') NOT NULL default 'false',
+  recent_period tinyint(3) unsigned NOT NULL default '7',
+  template varchar(255) NOT NULL default 'yoga',
+  registration_date datetime NOT NULL default '0000-00-00 00:00:00',
+  UNIQUE KEY user_infos_ui1 (user_id)
+) ENGINE=MyISAM
+;"
+  );
+
+foreach ($queries as $query)
+{
+  $query = str_replace('piwigo_', PREFIX_TABLE, $query);
+  pwg_query($query);
+}
+
+// user datas migration from piwigo_users to piwigo_user_infos
+$query = '
+SELECT *
+  FROM '.USERS_TABLE.'
+;';
+
+$datas = array();
+list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $row['user_id'] = $row['id'];
+  $row['registration_date'] = $dbnow;
+  array_push($datas, $row);
+}
+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+mass_inserts(
+  USER_INFOS_TABLE,
+  array(
+    'user_id',
+    'nb_image_line',
+    'nb_line_page',
+    'status',
+    'language',
+    'maxwidth',
+    'maxheight',
+    'expand',
+    'show_nb_comments',
+    'recent_period',
+    'template',
+    'registration_date'
+    ),
+  $datas
+  );
+
+$queries = array(
+
+  "
+UPDATE ".USER_INFOS_TABLE."
+  SET template = 'yoga'
+;",
+
+  "
+UPDATE ".USER_INFOS_TABLE."
+  SET language = 'en_UK.iso-8859-1'
+  WHERE language NOT IN ('en_UK.iso-8859-1', 'fr_FR.iso-8859-1')
+;",
+
+  "
+UPDATE ".CONFIG_TABLE."
+  SET value = 'en_UK.iso-8859-1'
+  WHERE param = 'default_language'
+    AND value NOT IN ('en_UK.iso-8859-1', 'fr_FR.iso-8859-1')
+;",
+
+  "
+UPDATE ".CONFIG_TABLE."
+  SET value = 'yoga'
+  WHERE param = 'default_template'
+;",
+
+  "
+INSERT INTO ".CONFIG_TABLE."
+  (param,value,comment)
+  VALUES
+  (
+    'gallery_title',
+    'Piwigo demonstration site',
+    'Title at top of each page and for RSS feed'
+  )
+;",
+
+  "
+INSERT INTO ".CONFIG_TABLE."
+  (param,value,comment)
+  VALUES
+  (
+    'gallery_description',
+    'My photos web site',
+    'Short description displayed with gallery title'
+  )
+;"
+
+  );
+
+foreach ($queries as $query)
+{
+  $query = str_replace('piwigo_', PREFIX_TABLE, $query);
+  pwg_query($query);
+}
+
+if ($prefix_thumbnail != 'TN-')
+{
+  array_push(
+    $page['infos'],
+    'the thumbnail prefix configuration parameter was moved to configuration
+file, copy config.inc.php from "tools" directory to "local/config" directory
+and edit $conf[\'prefix_thumbnail\'] = '.$prefix_thumbnail
+    );
+}
+
+// now we upgrade from 1.5.0 to 1.6.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.5.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.5.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.5.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.5.0.php	(revision 14585)
@@ -0,0 +1,469 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+/**
+ * replace old style #images.keywords by #tags. Requires a big data
+ * migration.
+ *
+ * @return void
+ */
+function tag_replace_keywords()
+{
+  // code taken from upgrades 19 and 22
+  
+  $query = '
+CREATE TABLE '.PREFIX_TABLE.'tags (
+  id smallint(5) UNSIGNED NOT NULL auto_increment,
+  name varchar(255) BINARY NOT NULL,
+  url_name varchar(255) BINARY NOT NULL,
+  PRIMARY KEY (id)
+)
+;';
+  pwg_query($query);
+  
+  $query = '
+CREATE TABLE '.PREFIX_TABLE.'image_tag (
+  image_id mediumint(8) UNSIGNED NOT NULL,
+  tag_id smallint(5) UNSIGNED NOT NULL,
+  PRIMARY KEY (image_id,tag_id)
+)
+;';
+  pwg_query($query);
+  
+  //
+  // Move keywords to tags
+  //
+
+  // each tag label is associated to a numeric identifier
+  $tag_id = array();
+  // to each tag id (key) a list of image ids (value) is associated
+  $tag_images = array();
+
+  $current_id = 1;
+
+  $query = '
+SELECT id, keywords
+  FROM '.PREFIX_TABLE.'images
+  WHERE keywords IS NOT NULL
+;';
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    foreach(preg_split('/[,]+/', $row['keywords']) as $keyword)
+    {
+      if (!isset($tag_id[$keyword]))
+      {
+        $tag_id[$keyword] = $current_id++;
+      }
+
+      if (!isset($tag_images[ $tag_id[$keyword] ]))
+      {
+        $tag_images[ $tag_id[$keyword] ] = array();
+      }
+
+      array_push(
+        $tag_images[ $tag_id[$keyword] ],
+        $row['id']
+        );
+    }
+  }
+
+  $datas = array();
+  foreach ($tag_id as $tag_name => $tag_id)
+  {
+    array_push(
+      $datas,
+      array(
+        'id'       => $tag_id,
+        'name'     => $tag_name,
+        'url_name' => str2url($tag_name),
+        )
+      );
+  }
+  
+  if (!empty($datas))
+  {
+    mass_inserts(
+      PREFIX_TABLE.'tags',
+      array_keys($datas[0]),
+      $datas
+      );
+  }
+
+  $datas = array();
+  foreach ($tag_images as $tag_id => $images)
+  {
+    foreach (array_unique($images) as $image_id)
+    {
+      array_push(
+        $datas,
+        array(
+          'tag_id'   => $tag_id,
+          'image_id' => $image_id,
+          )
+        );
+    }
+  }
+  
+  if (!empty($datas))
+  {
+    mass_inserts(
+      PREFIX_TABLE.'image_tag',
+      array_keys($datas[0]),
+      $datas
+      );
+  }
+
+  //
+  // Delete images.keywords
+  //
+  $query = '
+ALTER TABLE '.PREFIX_TABLE.'images DROP COLUMN keywords
+;';
+  pwg_query($query);
+
+  //
+  // Add useful indexes
+  //
+  $query = '
+ALTER TABLE '.PREFIX_TABLE.'tags
+  ADD INDEX tags_i1(url_name)
+;';
+  pwg_query($query);
+
+
+  $query = '
+ALTER TABLE '.PREFIX_TABLE.'image_tag
+  ADD INDEX image_tag_i1(tag_id)
+;';
+  pwg_query($query);
+
+  // print_time('tags have replaced keywords');
+}
+
+tag_replace_keywords();
+
+$queries = array(
+  "
+CREATE TABLE ".PREFIX_TABLE."search (
+  id int UNSIGNED NOT NULL AUTO_INCREMENT,
+  last_seen date DEFAULT NULL,
+  rules text,
+  PRIMARY KEY  (id)
+);",
+
+  "
+CREATE TABLE ".PREFIX_TABLE."user_mail_notification (
+  user_id smallint(5) NOT NULL default '0',
+  check_key varchar(16) binary NOT NULL default '',
+  enabled enum('true','false') NOT NULL default 'false',
+  last_send datetime default NULL,
+  PRIMARY KEY  (user_id),
+  UNIQUE KEY uidx_check_key (check_key)
+);",
+
+  "
+CREATE TABLE ".PREFIX_TABLE."upgrade (
+  id varchar(20) NOT NULL default '',
+  applied datetime NOT NULL default '0000-00-00 00:00:00',
+  description varchar(255) default NULL,
+  PRIMARY KEY  (`id`)
+);",
+
+  "
+ALTER TABLE ".PREFIX_TABLE."config
+  MODIFY COLUMN value TEXT
+;",
+
+  "
+ALTER TABLE ".PREFIX_TABLE."images
+  ADD COLUMN has_high enum('true') default NULL
+;",
+
+  "
+ALTER TABLE ".PREFIX_TABLE."rate
+  ADD COLUMN anonymous_id varchar(45) NOT NULL default ''
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."rate
+  ADD COLUMN date date NOT NULL default '0000-00-00'
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."rate
+  DROP PRIMARY KEY
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."rate
+  ADD PRIMARY KEY (element_id,user_id,anonymous_id)
+;",
+  "
+UPDATE ".PREFIX_TABLE."rate
+  SET date = CURDATE()
+;",
+  
+  "
+DELETE
+  FROM ".PREFIX_TABLE."sessions
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."sessions
+  DROP COLUMN user_id
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."sessions
+  ADD COLUMN data text NOT NULL
+;",
+  
+  "
+ALTER TABLE ".PREFIX_TABLE."user_cache
+  ADD COLUMN nb_total_images mediumint(8) unsigned default NULL
+;",
+  
+  "
+ALTER TABLE ".PREFIX_TABLE."user_infos
+  CHANGE COLUMN status
+     status enum('webmaster','admin','normal','generic','guest')
+     NOT NULL default 'guest'
+;",
+  "
+UPDATE ".PREFIX_TABLE."user_infos
+  SET status = 'normal'
+  WHERE status = 'guest'
+;",
+  "
+UPDATE ".PREFIX_TABLE."user_infos
+  SET status = 'guest'
+  WHERE user_id = ".$conf['guest_id']."
+;",
+  "
+UPDATE ".PREFIX_TABLE."user_infos
+  SET status = 'webmaster'
+  WHERE user_id = ".$conf['webmaster_id']."
+;",
+
+  "
+ALTER TABLE ".PREFIX_TABLE."user_infos
+   CHANGE COLUMN template template varchar(255) NOT NULL default 'yoga/clear'
+;",
+
+  "
+UPDATE ".PREFIX_TABLE."user_infos
+  SET template = 'yoga/dark'
+  WHERE template = 'yoga-dark'
+;",
+  "
+UPDATE ".PREFIX_TABLE."user_infos
+  SET template = 'yoga/clear'
+  WHERE template != 'yoga/dark'
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."user_infos
+  ADD COLUMN adviser enum('true','false') NOT NULL default 'false'
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."user_infos
+  ADD COLUMN enabled_high enum('true','false') NOT NULL default 'true'
+;",
+  "
+ALTER TABLE ".PREFIX_TABLE."categories
+  CHANGE COLUMN rank rank SMALLINT(5) UNSIGNED DEFAULT NULL
+;",
+  // configuration table
+  "
+UPDATE ".PREFIX_TABLE."config
+  SET value = 'yoga/clear'
+  WHERE param = 'default_template'
+;"
+  );
+
+foreach ($queries as $query)
+{
+  pwg_query($query);
+}
+
+//
+// Move rate, rate_anonymous and gallery_url from config file to database
+//
+$params = array(
+  'gallery_url' => array(
+    '',
+    'Optional alternate homepage for the gallery'
+    ),
+  'rate' => array(
+    'true',
+    'Rating pictures feature is enabled'
+    ),
+  'rate_anonymous' => array(
+    'true',
+    'Rating pictures feature is also enabled for visitors'
+    )
+  );
+// Get real values from config file
+$conf_save = $conf;
+unset($conf);
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+if ( isset($conf['gallery_url']) )
+{
+  $params['gallery_url'][0] = $conf['gallery_url'];
+}
+if ( isset($conf['rate']) and is_bool($conf['rate']) )
+{
+  $params['rate'][0] = $conf['rate'] ? 'true' : 'false';
+}
+if ( isset($conf['rate_anonymous']) and is_bool($conf['rate_anonymous']) )
+{
+  $params['rate_anonymous'][0] = $conf['rate_anonymous'] ? 'true' : 'false';
+}
+$conf = $conf_save;
+
+// Do I already have them in DB ?
+$query = 'SELECT param FROM '.PREFIX_TABLE.'config';
+$result = pwg_query($query);
+while ($row = pwg_db_fetch_assoc($result))
+{
+  unset( $params[ $row['param'] ] );
+}
+
+// Perform the insert query
+foreach ($params as $param_key => $param_values)
+{
+  $query = '
+INSERT INTO '.PREFIX_TABLE.'config
+  (param,value,comment)
+  VALUES
+ ('."'$param_key','$param_values[0]','$param_values[1]')
+;";
+  pwg_query($query);
+}
+
+$query = "
+ALTER TABLE ".PREFIX_TABLE."config MODIFY COLUMN `value` TEXT;";
+pwg_query($query);
+
+
+//
+// replace gallery_description by page_banner
+//
+$query = '
+SELECT value
+  FROM '.PREFIX_TABLE.'config
+  WHERE param=\'gallery_title\'
+;';
+list($t) = array_from_query($query, 'value');
+
+$query = '
+SELECT value
+  FROM '.PREFIX_TABLE.'config
+  WHERE param=\'gallery_description\'
+;';
+list($d) = array_from_query($query, 'value');
+
+$page_banner='<h1>'.$t.'</h1><p>'.$d.'</p>';
+$page_banner=addslashes($page_banner);
+$query = '
+INSERT INTO '.PREFIX_TABLE.'config
+  (param,value,comment)
+  VALUES
+  (
+    \'page_banner\',
+    \''.$page_banner.'\',
+    \'html displayed on the top each page of your gallery\'
+  )
+;';
+pwg_query($query);
+
+$query = '
+DELETE FROM '.PREFIX_TABLE.'config
+  WHERE param=\'gallery_description\'
+;';
+pwg_query($query);
+
+//
+// configuration for notification by mail
+//
+$query = "
+INSERT INTO ".CONFIG_TABLE."
+  (param,value,comment)
+  VALUES
+  (
+    'nbm_send_mail_as',
+    '',
+    'Send mail as param value for notification by mail'
+  ),
+  (
+    'nbm_send_detailed_content',
+    'true',
+    'Send detailed content for notification by mail'
+  ),
+  (
+    'nbm_complementary_mail_content',
+    '',
+    'Complementary mail content for notification by mail'
+  )
+;";
+pwg_query($query);
+
+// depending on the way the 1.5.0 was installed (from scratch or by upgrade)
+// the database structure has small differences that should be corrected.
+
+$query = '
+ALTER TABLE '.PREFIX_TABLE.'users
+  CHANGE COLUMN password password varchar(32) default NULL
+;';
+pwg_query($query);
+
+$to_keep = array('id', 'username', 'password', 'mail_address');
+  
+$query = '
+DESC '.PREFIX_TABLE.'users
+;';
+
+$result = pwg_query($query);
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  if (!in_array($row['Field'], $to_keep))
+  {
+    $query = '
+ALTER TABLE '.PREFIX_TABLE.'users
+  DROP COLUMN '.$row['Field'].'
+;';
+    pwg_query($query);
+  }
+}
+
+// now we upgrade from 1.6.0 to 1.6.2
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.6.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.6.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.6.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.6.0.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+$queries = array(
+  "
+ALTER TABLE ".PREFIX_TABLE."user_infos
+  ADD auto_login_key varchar(64) NOT NULL
+;",
+  '
+ALTER TABLE '.PREFIX_TABLE.'users
+  CHANGE username username VARCHAR(100) binary NOT NULL
+;',
+  );
+
+foreach ($queries as $query)
+{
+  pwg_query($query);
+}
+
+// now we upgrade from 1.6.2
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.6.2.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.6.2.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.6.2.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.6.2.php	(revision 14585)
@@ -0,0 +1,347 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+$queries = array(
+"
+ALTER TABLE `".PREFIX_TABLE."categories`
+  ADD COLUMN `permalink` varchar(64) default NULL
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."categories`
+  ADD COLUMN `image_order` varchar(128) default NULL
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."categories`
+  ADD UNIQUE `categories_i3` (`permalink`)
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."groups`
+  ADD COLUMN `is_default` enum('true','false') NOT NULL default 'false'
+;",
+
+"
+RENAME TABLE `".PREFIX_TABLE."history` TO `".PREFIX_TABLE."history_backup`
+;",
+
+"
+CREATE TABLE `".PREFIX_TABLE."history` (
+  `id` int(10) unsigned NOT NULL auto_increment,
+  `date` date NOT NULL default '0000-00-00',
+  `time` time NOT NULL default '00:00:00',
+  `year` smallint(4) NOT NULL default '0',
+  `month` tinyint(2) NOT NULL default '0',
+  `day` tinyint(2) NOT NULL default '0',
+  `hour` tinyint(2) NOT NULL default '0',
+  `user_id` smallint(5) NOT NULL default '0',
+  `IP` varchar(15) NOT NULL default '',
+  `section` enum('categories','tags','search','list','favorites','most_visited','best_rated','recent_pics','recent_cats') default NULL,
+  `category_id` smallint(5) default NULL,
+  `tag_ids` varchar(50) default NULL,
+  `image_id` mediumint(8) default NULL,
+  `summarized` enum('true','false') default 'false',
+  `image_type` enum('picture','high','other') default NULL,
+  PRIMARY KEY  (`id`),
+  KEY `history_i1` (`summarized`)
+) ENGINE=MyISAM
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."image_category`
+  DROP INDEX `image_category_i1`
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."image_category`
+  ADD INDEX `image_category_i1` (`category_id`)
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."image_category`
+  DROP INDEX `image_category_i2`
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."images`
+  ADD COLUMN `high_filesize` mediumint(9) unsigned default NULL
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."user_infos`
+  CHANGE COLUMN `language`
+    `language` varchar(50) NOT NULL default 'en_UK.iso-8859-1'
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."user_infos`
+  DROP COLUMN `auto_login_key`
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."user_infos`
+  ADD COLUMN `show_nb_hits` enum('true','false') NOT NULL default 'false'
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."user_mail_notification`
+  DROP INDEX `uidx_check_key`
+;",
+
+"
+ALTER TABLE `".PREFIX_TABLE."user_mail_notification`
+  ADD UNIQUE `user_mail_notification_ui1` (`check_key`)
+;",
+
+"
+CREATE TABLE `".PREFIX_TABLE."history_summary` (
+  `id` varchar(13) NOT NULL default '',
+  `year` smallint(4) NOT NULL default '0',
+  `month` tinyint(2) default NULL,
+  `day` tinyint(2) default NULL,
+  `hour` tinyint(2) default NULL,
+  `nb_pages` int(11) default NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM
+;",
+
+"
+CREATE TABLE `".PREFIX_TABLE."old_permalinks` (
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  `permalink` varchar(64) NOT NULL default '',
+  `date_deleted` datetime NOT NULL default '0000-00-00 00:00:00',
+  `last_hit` datetime default NULL,
+  `hit` int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`permalink`)
+) ENGINE=MyISAM
+;",
+
+"
+CREATE TABLE `".PREFIX_TABLE."plugins` (
+  `id` varchar(64) binary NOT NULL default '',
+  `state` enum('inactive','active') NOT NULL default 'inactive',
+  `version` varchar(64) NOT NULL default '0',
+  PRIMARY KEY  (`id`)
+) ENGINE=MyISAM
+;",
+
+"
+CREATE TABLE `".PREFIX_TABLE."user_cache_categories` (
+  `user_id` smallint(5) NOT NULL default '0',
+  `cat_id` smallint(5) unsigned NOT NULL default '0',
+  `max_date_last` datetime default NULL,
+  `count_images` mediumint(8) unsigned default '0',
+  `count_categories` mediumint(8) unsigned default '0',
+  PRIMARY KEY  (`user_id`,`cat_id`)
+) ENGINE=MyISAM
+;",
+
+/* TABLE DROPPED BEFORE Butterfly/Piwigo release - see later DROP IF EXISTS
+"
+CREATE TABLE `".PREFIX_TABLE."ws_access` (
+  `id` smallint(5) unsigned NOT NULL auto_increment,
+  `name` varchar(32) NOT NULL default '',
+  `access` varchar(255) default NULL,
+  `start` datetime default NULL,
+  `end` datetime default NULL,
+  `request` varchar(255) default NULL,
+  `limit` smallint(5) unsigned default NULL,
+  `comment` varchar(255) default NULL,
+  PRIMARY KEY  (`id`),
+  UNIQUE KEY `ws_access_ui1` (`name`)
+) ENGINE=MyISAM COMMENT='Access for Web Services'
+;",*/
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('show_nb_hits', 'false', 'Show hits count under thumbnails')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('history_admin','false','keep a history of administrator visits on your website')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('history_guest','true','keep a history of guest visits on your website')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('allow_user_registration','true','allow visitors to register?')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('secret_key', MD5(RAND()), 'a secret key specific to the gallery for internal use')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('nbm_send_html_mail','true','Send mail on HTML format for notification by mail')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('nbm_send_recent_post_dates','true','Send recent post by dates for notification by mail')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('email_admin_on_new_user','false','Send an email to theadministrators when a user registers')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('email_admin_on_comment','false','Send an email to the administrators when a valid comment is entered')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('email_admin_on_comment_validation','false','Send an email to the administrators when a comment requires validation')
+;",
+
+"
+INSERT INTO ".PREFIX_TABLE."config
+  (param,value,comment)
+  VALUES
+  ('email_admin_on_picture_uploaded','false','Send an email to the administrators when a picture is uploaded')
+;",
+
+"
+UPDATE ".PREFIX_TABLE."user_cache
+  SET need_update = 'true'
+;",
+
+);
+
+foreach ($queries as $query)
+{
+  pwg_query($query);
+}
+
+$replacements = array(
+  array('&#039;', '\''),
+  array('&quot;', '"'),
+  array('&lt;',   '<'),
+  array('&gt;',   '>'),
+  array('&amp;',  '&') // <- this must be the last one
+  );
+
+foreach ($replacements as $replacement)
+{
+    $query = '
+UPDATE '.PREFIX_TABLE.'comments
+  SET content = REPLACE(content, "'.
+  addslashes($replacement[0]).
+  '", "'.
+  addslashes($replacement[1]).
+  '")
+;';
+    pwg_query($query);
+}
+
+load_conf_from_db();
+
+$query = "
+UPDATE ".USER_INFOS_TABLE."
+SET
+  template = '".$conf['default_template']."',
+  nb_image_line = ".$conf['nb_image_line'].",
+  nb_line_page = ".$conf['nb_line_page'].",
+  language = '".$conf['default_language']."',
+  maxwidth = ".
+  (empty($conf['default_maxwidth']) ? "NULL" : $conf['default_maxwidth']).
+  ",
+  maxheight = ".
+  (empty($conf['default_maxheight']) ? "NULL" : $conf['default_maxheight']).
+  ",
+  recent_period = ".$conf['recent_period'].",
+  expand = '".boolean_to_string($conf['auto_expand'])."',
+  show_nb_comments = '".boolean_to_string($conf['show_nb_comments'])."',
+  show_nb_hits = '".boolean_to_string($conf['show_nb_hits'])."',
+  enabled_high = '".boolean_to_string(
+    (isset($conf['newuser_default_enabled_high']) ?
+      $conf['newuser_default_enabled_high'] : true)
+    ).
+  "'
+WHERE
+  user_id = ".$conf['default_user_id'].";";
+pwg_query($query);
+
+$query = "
+DELETE FROM ".CONFIG_TABLE."
+WHERE
+  param IN
+(
+  'default_template',
+  'nb_image_line',
+  'nb_line_page',
+  'default_language',
+  'default_maxwidth',
+  'default_maxheight',
+  'recent_period',
+  'auto_expand',
+  'show_nb_comments',
+  'show_nb_hits'
+)
+;";
+pwg_query($query);
+
+// now we upgrade from 1.7.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_1.7.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_1.7.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_1.7.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_1.7.0.php	(revision 14585)
@@ -0,0 +1,118 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |             Fill upgrade table without applying upgrade               |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+  FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+$inserts = array();
+foreach ($to_apply as $upgrade_id)
+{
+  if ($upgrade_id > 60)
+  {
+    break;
+  }
+  
+  array_push(
+    $inserts,
+    array(
+      'id' => $upgrade_id,
+      'applied' => CURRENT_DATE,
+      'description' => '[migration from 1.7.0 to '.PHPWG_VERSION.'] not applied',
+      )
+    );
+}
+
+if (!empty($inserts))
+{
+  mass_inserts(
+    '`'.UPGRADE_TABLE.'`',
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                          Perform upgrades                             |
+// +-----------------------------------------------------------------------+
+
+ob_start();
+echo '<pre>';
+
+for ($upgrade_id = 61; $upgrade_id <= 79; $upgrade_id++)
+{
+  if (!file_exists(UPGRADES_PATH.'/'.$upgrade_id.'-database.php'))
+  {
+    break;
+  }
+  
+  unset($upgrade_description);
+
+  echo "\n\n";
+  echo '=== upgrade '.$upgrade_id."\n";
+
+  // include & execute upgrade script. Each upgrade script must contain
+  // $upgrade_description variable which describe briefly what the upgrade
+  // script does.
+  include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+  // notify upgrade
+  $query = '
+INSERT INTO `'.PREFIX_TABLE.'upgrade`
+  (id, applied, description)
+  VALUES
+  (\''.$upgrade_id.'\', NOW(), \'[migration from 1.7.0 to '.PHPWG_VERSION.'] '.$upgrade_description.'\')
+;';
+  pwg_query($query);
+}
+
+echo '</pre>';
+ob_end_clean();
+
+// now we upgrade from 2.0.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_2.0.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_2.0.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_2.0.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_2.0.0.php	(revision 14585)
@@ -0,0 +1,118 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |             Fill upgrade table without applying upgrade               |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+  FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+$inserts = array();
+foreach ($to_apply as $upgrade_id)
+{
+  if ($upgrade_id >= 81)
+  {
+    break;
+  }
+  
+  array_push(
+    $inserts,
+    array(
+      'id' => $upgrade_id,
+      'applied' => CURRENT_DATE,
+      'description' => '[migration from 2.0.0 to '.PHPWG_VERSION.'] not applied',
+      )
+    );
+}
+
+if (!empty($inserts))
+{
+  mass_inserts(
+    '`'.UPGRADE_TABLE.'`',
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                          Perform upgrades                             |
+// +-----------------------------------------------------------------------+
+
+ob_start();
+echo '<pre>';
+
+for ($upgrade_id = 81; $upgrade_id <= 90; $upgrade_id++)
+{
+  if (!file_exists(UPGRADES_PATH.'/'.$upgrade_id.'-database.php'))
+  {
+    break;
+  }
+  
+  unset($upgrade_description);
+
+  echo "\n\n";
+  echo '=== upgrade '.$upgrade_id."\n";
+
+  // include & execute upgrade script. Each upgrade script must contain
+  // $upgrade_description variable which describe briefly what the upgrade
+  // script does.
+  include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+  // notify upgrade
+  $query = '
+INSERT INTO `'.PREFIX_TABLE.'upgrade`
+  (id, applied, description)
+  VALUES
+  (\''.$upgrade_id.'\', NOW(), \'[migration from 2.0.0 to '.PHPWG_VERSION.'] '.$upgrade_description.'\')
+;';
+  pwg_query($query);
+}
+
+echo '</pre>';
+ob_end_clean();
+
+// now we upgrade from 2.1.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_2.1.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_2.1.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_2.1.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_2.1.0.php	(revision 14585)
@@ -0,0 +1,118 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |             Fill upgrade table without applying upgrade               |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+  FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+$inserts = array();
+foreach ($to_apply as $upgrade_id)
+{
+  if ($upgrade_id >= 91)
+  {
+    break;
+  }
+  
+  array_push(
+    $inserts,
+    array(
+      'id' => $upgrade_id,
+      'applied' => CURRENT_DATE,
+      'description' => '[migration from 2.1.0 to '.PHPWG_VERSION.'] not applied',
+      )
+    );
+}
+
+if (!empty($inserts))
+{
+  mass_inserts(
+    '`'.UPGRADE_TABLE.'`',
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                          Perform upgrades                             |
+// +-----------------------------------------------------------------------+
+
+ob_start();
+echo '<pre>';
+
+for ($upgrade_id = 91; $upgrade_id <= 97; $upgrade_id++)
+{
+  if (!file_exists(UPGRADES_PATH.'/'.$upgrade_id.'-database.php'))
+  {
+    break;
+  }
+  
+  unset($upgrade_description);
+
+  echo "\n\n";
+  echo '=== upgrade '.$upgrade_id."\n";
+
+  // include & execute upgrade script. Each upgrade script must contain
+  // $upgrade_description variable which describe briefly what the upgrade
+  // script does.
+  include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+  // notify upgrade
+  $query = '
+INSERT INTO `'.PREFIX_TABLE.'upgrade`
+  (id, applied, description)
+  VALUES
+  (\''.$upgrade_id.'\', NOW(), \'[migration from 2.1.0 to '.PHPWG_VERSION.'] '.$upgrade_description.'\')
+;';
+  pwg_query($query);
+}
+
+echo '</pre>';
+ob_end_clean();
+
+// now we upgrade from 2.2.0
+include_once(PHPWG_ROOT_PATH.'install/upgrade_2.2.0.php');
+?>
Index: tags/2.4.0RC3/install/upgrade_2.2.0.php
===================================================================
--- tags/2.4.0RC3/install/upgrade_2.2.0.php	(revision 14585)
+++ tags/2.4.0RC3/install/upgrade_2.2.0.php	(revision 14585)
@@ -0,0 +1,118 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die ('This page cannot be loaded directly, load upgrade.php');
+}
+else
+{
+  if (!defined('PHPWG_IN_UPGRADE') or !PHPWG_IN_UPGRADE)
+  {
+    die ('Hacking attempt!');
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |             Fill upgrade table without applying upgrade               |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+  FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+$inserts = array();
+foreach ($to_apply as $upgrade_id)
+{
+  if ($upgrade_id >= 98)
+  {
+    break;
+  }
+  
+  array_push(
+    $inserts,
+    array(
+      'id' => $upgrade_id,
+      'applied' => CURRENT_DATE,
+      'description' => '[migration from 2.2.0 to '.PHPWG_VERSION.'] not applied',
+      )
+    );
+}
+
+if (!empty($inserts))
+{
+  mass_inserts(
+    '`'.UPGRADE_TABLE.'`',
+    array_keys($inserts[0]),
+    $inserts
+    );
+}
+
+// +-----------------------------------------------------------------------+
+// |                          Perform upgrades                             |
+// +-----------------------------------------------------------------------+
+
+ob_start();
+echo '<pre>';
+
+for ($upgrade_id = 98; $upgrade_id <= 111; $upgrade_id++)
+{
+  if (!file_exists(UPGRADES_PATH.'/'.$upgrade_id.'-database.php'))
+  {
+    break;
+  }
+  
+  unset($upgrade_description);
+
+  echo "\n\n";
+  echo '=== upgrade '.$upgrade_id."\n";
+
+  // include & execute upgrade script. Each upgrade script must contain
+  // $upgrade_description variable which describe briefly what the upgrade
+  // script does.
+  include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+  // notify upgrade
+  $query = '
+INSERT INTO `'.PREFIX_TABLE.'upgrade`
+  (id, applied, description)
+  VALUES
+  (\''.$upgrade_id.'\', NOW(), \'[migration from 2.2.0 to '.PHPWG_VERSION.'] '.$upgrade_description.'\')
+;';
+  pwg_query($query);
+}
+
+echo '</pre>';
+ob_end_clean();
+
+// now we upgrade from 2.2.0
+// include_once(PHPWG_ROOT_PATH.'install/upgrade_2.2.0.php');
+?>
Index: tags/2.4.0RC3/language/af_ZA/about.html
===================================================================
--- tags/2.4.0RC3/language/af_ZA/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/about.html	(revision 14585)
@@ -0,0 +1,16 @@
+<p>Hierdie fotogallery is geskep deur Piwigo.</p>
+
+<p>Piwigo is webgebaseerde fotogallery sagteware. Dit word ontwikkel en onderhou
+deur 'n aktiewe gemeenskap gebruikers en ontwikkelaars. Piwigo kan soos verkies
+aangepas word deur 'n verskeidenheid modules. Kersie op die koek: Piwigo is gratis
+en oopkode.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Besoek die Piwigo webblad</a></p>
+
+<p>Die Afrikaanse vertaling word onderhou deur (in alfabetiese volgorde):
+
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=13577">maeztro</a></li>
+    <li>vlooi
+    </ul>
+           .... Baie dankie aan almal</p>
Index: tags/2.4.0RC3/language/af_ZA/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/af_ZA/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/admin.lang.php	(revision 14585)
@@ -0,0 +1,192 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Average rate'] = "Gemiddelde gradering";
+$lang['Rate'] = "Gradeer";
+$lang['Access type'] = 'Toegangstipe';
+$lang['ACCESS_0'] = 'Vry toegang';
+$lang['ACCESS_1'] = 'Toegang tot alles';
+$lang['ACCESS_2'] = 'Toegang aan geregistreerde gebruikers';
+$lang['ACCESS_3'] = 'Toegang aan administrateurs';
+$lang['ACCESS_4'] = 'Toegang aan webmeesters';
+$lang['ACCESS_5'] = 'Geen toegang';
+$lang[' and %d virtual'] = 'en %d virtuele';
+$lang['%d album including'] = '%d album ingesluit';
+$lang['%d album moved'] = '%d album geskuif';
+$lang['%d albums including'] = '%d albums insluitend';
+$lang['%d albums moved'] = '%d albums geskuif';
+$lang['%d anomalies have been detected corrected.'] = '%d onreëlmatighede is gevind en reggemaak';
+$lang['%d anomalies have been detected.'] = '%d onreëlmatighede is gevind';
+$lang['%d anomalies have been ignored.'] = '%d onreëlmatighede is geignoreer';
+$lang['%d anomalies have not been corrected.'] = '%d onreëlmatighede is nie reggemaak nie';
+$lang['%d anomaly has been corrected.'] = '%d onreëlmatigheid is reggemaak';
+$lang['%d anomaly has been detected.'] = '%d onreëlmatigheid is gevind';
+$lang['%d anomaly has been ignored.'] = '%d onreëlmatigheid is geignoreer';
+$lang['%d anomaly has not been corrected.'] = '%d onreëlmatigheid is nie reggemaak nie';
+$lang['%d association'] = '%d assosiasie';
+$lang['%d associations'] = '%d assosiasies';
+$lang['%d group'] = '%d groep';
+$lang['%d groups'] = '%d groepe';
+$lang['%d guest'] = '%d gas';
+$lang['%d guests'] = '%d gaste';
+$lang['%d line filtered'] = '%d lyn gefilter';
+$lang['%d lines filtered'] = '%d lyne gefilter';
+$lang['%d mail was not sent.'] = '%d epos is nie gestuur nie';
+$lang['%d mail was sent.'] = '%d epos is gestuur';
+$lang['%d mails were not sent.'] = '%d eposse is nie gestuur nie';
+$lang['%d mails were sent.'] = '%d eposse is gestuur';
+$lang['%d member'] = '%d lid';
+$lang['%d members'] = '%d lede';
+$lang['%d of %d photos selected'] = '%d van %d fotos gekies';
+$lang['%d parameter was updated.'] = '%d parameter is opgedateer';
+$lang['%d parameters were updated.'] = '%d parameters is opgedateer';
+$lang['%d photo was deleted'] = '%d foto is verwyder';
+$lang['%d photos uploaded'] = '%d fotos opgelaai';
+$lang['%d photos were deleted'] = '%d fotos verwyder';
+$lang['%d physical'] = '%d fisies';
+$lang['%d tag'] = '%d etiket';
+$lang['%d tags'] = '%d etikette';
+$lang['%d user'] = '%d gebruiker ';
+$lang['%d user comment rejected'] = '%d gebruikerskommentaar verwerp';
+$lang['%d user comment validated'] = '%d gebruikerskommentaar aanvaar';
+$lang['%d user comments rejected'] = '%d gebruikerskommentare verwerp ';
+$lang['%d user comments validated'] = '%d gebruikerskommentare aanvaar';
+$lang['%d user deleted'] = '%d gebruikers verwyder';
+$lang['%d user was not updated.'] = '%d gebruiker is nie opgedateer nie';
+$lang['%d user was updated.'] = '%d gebruikers is opgedateer ';
+$lang['%d users'] = '%d gebruikers ';
+$lang['%d users deleted'] = '%d gebruikers verwyder ';
+$lang['%d users were not updated.'] = '%d gebruikers is nie opgedateer nie';
+$lang['%d users were updated.'] = '%d gebruikers is opgedateer ';
+$lang['%d waiting for validation'] = '%d wag vir bekragtiging';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s moet as "false" gemerk word in jou local/config/config.inc.php lêer';
+$lang['%s value is not correct file because exif are not supported'] = '%s waarde is nie regte lêer nie want exif word nie ondersteun nie';
+$lang['+ Add an upload box'] = '+ Voeg oplaai vakkie by';
+$lang[', click on'] = ', kliek op';
+$lang['A local listing.xml file has been found for'] = '\'n Plaaslike listing.xml lêer is gevind';
+$lang['A new version of Piwigo is available.'] = '\'n Nuwe weergawe van Piwigo is beskikbaar.';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = '\'n beeld lêertipe benodig \'n duimnael. Die duimnael moet in die ondergids "thumbnail" van die album gids wees. Die duimnael lêernaam moet begin met die opgestelde duimnael voorvoegsel en die uitbreiding moet een van die volgende lys wees:';
+$lang['Action'] = 'Aksie';
+$lang['Actions'] = 'Aksies';
+$lang['Activate'] = 'Aktiveer ';
+$lang['Activate icon "%s"'] = 'Aktiveer ikoon "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktiveer ikoon "nuut" langs albums en prentjies';
+$lang['Activate Navigation Bar'] = 'Aktiveer Navigasie Staaf';
+$lang['Activate Navigation Thumbnails'] = 'Aktiveer Navigasie Duimnaels';
+$lang['Active Languages'] = 'Aktiveer Tale';
+$lang['Active Plugins'] = 'Aktiveer Invoegsels';
+$lang['Active Themes'] = 'Aktiveer Temas';
+$lang['... or '] = '... of';
+$lang['Add'] = 'Voeg by';
+$lang['Add a criteria'] = 'Voeg kriteria by';
+$lang['Add a filter'] = 'Voeg filter by';
+$lang['Add a tag'] = 'Voeg sleutelwoord by';
+$lang['Add a user'] = 'Voeg gebruiker by';
+$lang['Add a virtual album'] = 'Voeg virtuele album by';
+$lang['Add another set of photos'] = 'Voeg nog \'n stel fotos by';
+$lang['Add group'] = 'Voeg groep by';
+$lang['Add New Language'] = 'Voeg Nuwe Taal by';
+$lang['add new photos to caddie'] = 'plaas nuwe fotos in mandjie';
+$lang['Add New Theme'] = 'Voeg Nuwe Tema by';
+$lang['Add Photos'] = 'Voeg fotos by';
+$lang['Add tags'] = 'Voeg sleutelwoorde by';
+$lang['Add/delete a permalink'] = 'Voeg by/verwyder permanente skakel';
+$lang['added'] = 'bygevoeg';
+$lang['Album "%s" has been added'] = 'Album "%s" is bygevoeg';
+$lang['Album "%s" now contains %d photos'] = 'Album "%s" bevat nou %d fotos';
+$lang['Album name'] = 'Album naam';
+$lang['Album updated successfully'] = 'Album opdatering suksesvol';
+$lang['all'] = 'alles';
+$lang['an error happened'] = '\'n fout het voorgekom';
+$lang['An error occured during extraction (%s).'] = '\'n fout het voorgekom met ontbondeling (%s).';
+$lang['and'] = 'en';
+$lang['Anomaly'] = 'Anomalie';
+$lang['Create'] = 'Skep';
+$lang['Crop'] = 'Snoei';
+$lang['GD version'] = 'GD weergawe';
+$lang['General statistics'] = 'Algemene statistiek';
+$lang['Get Support on Piwigo Forum'] = 'Kry hulp op die Piwigo Forum';
+$lang['Go to'] = 'Gaan na';
+$lang['Group name'] = 'Groep naam';
+$lang['Groups'] = 'Groepe';
+$lang['guest'] = 'gas';
+$lang['Guest cannot be deleted'] = 'Gaste kan nie verwyder word nie';
+$lang['Guest Settings'] = 'Gas Instellings';
+$lang['Guests'] = 'Gaste';
+$lang['Height'] = 'Hoogte';
+$lang['height must be a number superior to'] = 'hoogte moet \'n getal groter wees as';
+$lang['Hello'] = 'Hallo';
+$lang['Hello,'] = 'Hallo,';
+$lang['Help Me'] = 'Help My';
+$lang['Hide'] = 'Versteek';
+$lang['high'] = 'hoog';
+$lang['High definition'] = 'Hoë definisie';
+$lang['History'] = 'Geskiedenis';
+$lang['Hour'] = 'Uur';
+$lang['Ignore All'] = 'Ignoreer Almal';
+$lang['Image id'] = 'Beeld id';
+$lang['Image Quality'] = 'Beeld kwaliteit';
+$lang['Inactive Languages'] = 'Onaktiewe Tale';
+$lang['Inactive Plugins'] = 'Onaktiewe Byvoegsels';
+$lang['Inactive Themes'] = 'Onaktiewe Temas';
+$lang['Install'] = 'Installeer';
+$lang['Install on your computer,'] = 'Installeer op jou rekenaar,';
+$lang['Installed Languages'] = 'Geïnstalleerde Tale';
+$lang['Installed Themes'] = 'Geïnstalleerde Temas';
+$lang['Instructions to use Piwigo'] = 'Instruksies in die gebruik van Piwigo';
+$lang['IP'] = 'IP';
+$lang['jump to album'] = 'spring na album';
+$lang['jump to photo'] = 'spring na foto';
+$lang['Languages'] = 'Tale';
+$lang['Last import'] = 'Laaste invoer';
+$lang['Last revisions'] = 'Laaste wysigings';
+$lang['Last send'] = 'Laaste stuur';
+$lang['leave'] = 'verlaat';
+$lang['Level 0'] = 'Vlak 0';
+$lang['Level 1'] = 'Vlak 1';
+$lang['Level 2'] = 'Vlak 2';
+$lang['Level 4'] = 'Vlak 4';
+$lang['Level 8'] = 'Vlak 8';
+$lang['Main'] = 'Hoof';
+$lang['Main Page'] = 'Hoofblad';
+$lang['Width'] = 'Wydte';
+$lang['Add to caddie'] = "plaas in mandjie";
+$lang['Caddie'] = 'Mandjie';
+$lang['%s photos can not be regenerated'] = '%s fotos kan nie herskep word nie';
+$lang['%s photos have been regenerated'] = '%s fotos is herskep';
+$lang['%s thumbnails can not be regenerated'] = '%s duimnaels kan nie herskep word nie';
+$lang['%s thumbnails have been regenerated'] = '%s duimnaels is herskep';
+$lang['(this tag will be deleted)'] = '(hierdie sleutel gaan verwyder word)';
+$lang['Add detailed content'] = 'Voeg detail inhoud by';
+$lang['Add tags'] = 'Voeg sleutels by';
+$lang['Add write access to the "%s" directory'] = 'Voeg skryfregte by die "%s" gids';
+$lang['Administration Home'] = 'Administrasie Tuiste';
+$lang['Advanced features'] = 'Gevorderde kenmerke';
+$lang['Album list management'] = 'Album lys bestuur';
+$lang['Album manual order was saved'] = 'Album handroliese rangskikking is gebêre';
+$lang['Album photos associated to the following albums: %s'] = 'Album fotos geassosieer met die volgende albums: %s';
+$lang['albums added in the database'] = 'albums bygevoeg tot die databasis';
+$lang['Albums authorized thanks to group associations'] = 'Albums bevestig aan die hand van groep verbintenis';
+$lang['Albums automatically sorted'] = 'Albums outomaties gesorteer';
+$lang['albums deleted in the database'] = 'albums verwyder uit databasis';
+?>
Index: tags/2.4.0RC3/language/af_ZA/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/af_ZA/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/common.lang.php	(revision 14585)
@@ -0,0 +1,384 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Afrikaans [ZA]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=572
+Author: Marius Loots and Mignon Smit
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Afrikaans";
+$lang_info['country'] = "Suid-Afrika";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "af";
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = "%d Kb";
+$lang['%d album updated'] = "%d album opdateer";
+$lang['%d albums updated'] = "%d albums opdateer";
+$lang['%d comment to validate'] = "%d kommentaar om te verifieer";
+$lang['%d comments to validate'] = "%d kommentaar om te verifieer";
+$lang['%d new comment'] = "%d nuwe kommentaar";
+$lang['%d new comments'] = "%d nuwe kommentaar";
+$lang['%d comment'] = "%d kommentaar";
+$lang['%d comments'] = "%d kommentaar";
+$lang['%d hit'] = "%d besoeke";
+$lang['%d hits'] = "%d besoeke";
+$lang['%d new photo'] = "%d nuwe foto";
+$lang['%d new photos'] = "%d nuwe fotos";
+$lang['%d new user'] = "%d nuwe gebruiker";
+$lang['%d new users'] = "%d nuwe gebruikers";
+$lang['About'] = "Waaroor";
+$lang['All tags'] = "Alle sleutelwoorde";
+$lang['Any tag'] = "Enige sleutelwoorde";
+$lang['At least one listed rule must be satisfied.'] = "Ten minste een kriteria moet aan voldoen word.";
+$lang['Author'] = "Outeur";
+$lang['Albums'] = "Albums";
+$lang['Album'] = "Album";
+$lang['Close this window'] = "Maak die skerm toe";
+$lang['Complete RSS feed (photos, comments)'] = "Volledige RSS string (Fotos, kommentaar)";
+$lang['Confirm Password'] = "Bevestig wagwoord";
+$lang['Connection settings'] = "Verbinding stelling";
+$lang['Login'] = 'Teken aan';
+$lang['Contact webmaster'] = "Kontak Webwerf Admin";
+$lang['Create a new account'] = "Skep nuwe rekening";
+$lang['Created on'] = "Geskep op";
+$lang['Creation date'] = "Skep datum";
+$lang['Current password is wrong'] = "Huidige wagwoord is verkeerd";
+$lang['Dimensions'] = "Afmetings";
+$lang['Display'] = "Vertoon";
+$lang['Each listed rule must be satisfied.'] = "Elke gelyste kriteria moet aan voldoen word.";
+$lang['Email address'] = "Epos adres";
+$lang['Enter your personnal informations'] = "Sleutel persoonlike data in";
+$lang['Error sending email'] = "Fout wanneer epos gestuur word";
+$lang['File name'] = "Lêernaam";
+$lang['File'] = "Lêer";
+$lang['Filesize'] = "Lêer grootte";
+$lang['Filter and display'] = "Filtreer en vertoon";
+$lang['Filter'] = "Filtreer";
+$lang['Forgot your password?'] = "Wagwoord vergeet?";
+$lang['Go through the gallery as a visitor'] = "Navigeer deur die gallery as 'n besoeker";
+$lang['Help'] = "Hulp";
+$lang['Identification'] = "Identifikasie";
+$lang['Photos only RSS feed'] = "Foto RSS string";
+$lang['Keyword'] = "Sleutelwoord";
+$lang['Links'] = "Skakels";
+$lang['N/A'] = "Nvt";
+$lang['New on %s'] = "Nuut op %s";
+$lang['Notification'] = "Kennisgewing";
+$lang['Number of items'] = "Getal items";
+$lang['Original dimensions'] = "Oorspronklike afmetings";
+$lang['Password forgotten'] = "Wagwoord vergeet";
+$lang['Password'] = "Wagwoord";
+$lang['Post date'] = "Datum bygevoeg";
+$lang['Posted on'] = "Bygevoeg op";
+$lang['Profile'] = "Profiel";
+$lang['Quick connect'] = "Vinnig verbind";
+$lang['RSS feed'] = "RSS string";
+$lang['Register'] = "Registreer";
+$lang['Registration'] = "Registrasie";
+$lang['Related tags'] = "Verbandhoudende sleutelwoorde";
+$lang['Reset'] = "Herstel";
+$lang['Retrieve password'] = "Herwin wagwoord";
+$lang['Search rules'] = "Soek kriteria";
+$lang['Search tags'] = "Soek sleutelwoorde";
+$lang['Search'] = "Soek";
+$lang['display available tags'] = "Vertoon beskikbare sleutelwoorde";
+$lang['Since'] = "Sedert";
+$lang['Sort by'] = "Sorteer volgens";
+$lang['Sort order'] = "Sorteer orde";
+$lang['Tag'] = "Sleutelwoord";
+$lang['Tags'] = "Sleutelwoorde";
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = "Die RSS string gee kennis van nuwe gebeure op die webwerf: nuwe fotos, opdatering van albums en nuwe kommentaar. Gebruik saam met RSS stringleser.";
+$lang['Unknown feed identifier'] = "Onbekende string identifiseerder";
+$lang['User comments'] = "Gebruikerskommentaar";
+$lang['Username'] = "Gebruikersnaam";
+$lang['Visits'] = "Besoeke";
+$lang['Webmaster'] = "Webwerf admin";
+$lang['Week %d'] = 'Week %d';
+$lang['remove this tag from the list'] = "haal die sleutelwoord uit die lys uit";
+$lang['representative'] = "verteenwoordiger";
+$lang['Search for Author'] = "Soek vir 'n outeur";
+$lang['Search in albums'] = "Soek in albums";
+$lang['Search by date'] = "Soek volgens datum";
+$lang['Date'] = "Datum";
+$lang['End-Date'] = "Eind datum";
+$lang['Kind of date'] = "Tipe datum";
+$lang['Search for words'] = "Soek vir woorde";
+$lang['Search for all terms'] = "Soek vir alle terme";
+$lang['Search for any term'] = "Soek vir enige term";
+$lang['Empty query. No criteria has been entered.'] = "Soektog leeg. Geen kriteria is ingevul nie.";
+$lang['Search results'] = "Soektog resultate";
+$lang['Search in sub-albums'] = "Soek in sub-albums";
+$lang['searched words : %s'] = 'soek woorde : %s';
+$lang['Welcome'] = 'Welkom';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Welkom by u Piwigo foto gallery!';
+$lang['... or browse your empty gallery'] = '... of kyk deur die spook gallery';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... of haal die boodskap af, ek sal my eie pad vind';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %s, jou Piwigo foto gallery is leeg!';
+$lang['I want to add photos'] = 'Ek wil fotos byvoeg';
+$lang['Manage this user comment: %s'] = 'Bestuur die gebruiker se kommentaar: %s';
+$lang['Email address is missing. Please specify an email address.'] = "Epos adres word vermis. Spesifiseer asb. epos adres.";
+$lang['This author modified following comment:'] = 'Die outeur het die volgende kommentaar verander:';
+$lang['This author removed the comment with id %d'] = 'Die outeur het die kommentaar met id %d verwyder';
+$lang['html tags are not allowed in login'] = 'html mag nie in aantekening gebruik word nie';
+$lang['%d rates'] = '%d graderings';
+$lang['Rating score'] = 'Gradering telling';
+$lang['The number of photos per page must be a not null scalar'] = 'Die aantal fotos per bladsy mag nie nul wees nie';
+$lang['Number of photos per page'] = 'Aantal fotos per bladsy';
+$lang['Invalid username or email'] = 'Ongeldige gebruikersnaam of epos adres';
+$lang['Password reset is not allowed for this user'] = 'Wagwoord herstel word nie vir hierdie gebruiker toegelaat nie';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Gebruiker "%s" het nie \'n epos adres nie, wagwoord herstel is nie moontlik nie';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Iemand het gevra dat die wagwoord vir die volgende gebruiker herstel moet word:';
+$lang['Username "%s" on gallery %s'] = 'Gebruikersnaam "%s" op gallery %s';
+$lang['To reset your password, visit the following address:'] = 'Om jou wagwoord te herstel, besoek die volgende adres:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'As dit \'n fout was, ignoreer hierdie epos en niks sal gebeur nie.';
+$lang['Password Reset'] = 'Wagwoord Herstel';
+$lang['Check your email for the confirmation link'] = '\'n Bevestigingskakel word per epos aan jou gestuur';
+$lang['Invalid key'] = 'Ongeldige sleutel';
+$lang['The passwords do not match'] = 'Die wagwoorde pas nie';
+$lang['Your password has been reset'] = 'Jou wagwoord is herstel';
+$lang['Return to home page'] = 'Gaan terug na die tuisblad';
+$lang['Please enter your username or email address.'] = 'Vul asseblief jou gebruikersnaam of epos adres in.';
+$lang['You will receive a link to create a new password via email.'] = 'Jy sal met epos \'n skakel ontvang om \'n nuwe wagwoord te skep.';
+$lang['Username or email'] = 'Gebruikersnaam of epos adres';
+$lang['Change my password'] = 'Verander my wagwoord';
+$lang['Enter your new password below.'] = 'Vul jou wagwoord hier onder in';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['About Piwigo'] = "Oor Piwigo";
+$lang['You are not authorized to access the requested page'] = "U is nie gemagtig om die blad te besoek nie";
+$lang['add this photo to your favorites'] = "plaas die foto by u gunstelinge";
+$lang['Administration'] = "Administrasie";
+$lang['all'] = "alles";
+$lang['ascending'] = "toenemend";
+$lang['author(s) : %s'] = "outeur(s) : %s";
+$lang['Expand all albums'] = "Vergroot alle albums";
+$lang['posted after %s (%s)'] = "bygevoeg na %s (%s)";
+$lang['posted before %s (%s)'] = "bygevoeg voor %s (%s)";
+$lang['posted between %s (%s) and %s (%s)'] = "bygevoeg tussen %s (%s) en %s (%s)";
+$lang['posted on %s'] = "bygevoeg op %s";
+$lang['Best rated'] = "Hoogste gradering";
+$lang['display best rated photos'] = "Vertoon gewildste fotos";
+$lang['Calendar'] = "Kalender";
+$lang['All'] = "Almal";
+$lang['display each day with photos, month per month'] = "Vertoon elke dag met nuwe fotos, maand per maand";
+$lang['View'] = "Besigtig";
+$lang['chronology_monthly_calendar'] = "Maandelikse kalender";
+$lang['chronology_monthly_list'] = "Maandelikse lys";
+$lang['chronology_weekly_list'] = "Weeklikse lys";
+$lang['Click here if your browser does not automatically forward you'] = "Kliek hier as die leser u nie automaties neem nie";
+$lang['comment date'] = "kommentaar datum";
+$lang['Comment'] = "Kommentaar";
+$lang['Your comment has been registered'] = "U kommentaar is geregistreer";
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "Gemorspos voorkoming : Was asb 'n oomblik voor u weer probeer";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "U kommentaar is in die asblik, dit het nie die verifikasie toets deurstaan nie";
+$lang['An administrator must authorize your comment before it is visible.'] = "Die Administrateur moet u kommentaar goedkeur VOOR dit sal vertoon.";
+$lang['This login is already used by another user'] = "Die aanteken naam is ongelukkig reeds in gebruik";
+$lang['Comments'] = "Kommentaar";
+$lang['Add a comment'] = "Los kommentaar";
+$lang['created after %s (%s)'] = "geskep na %s (%s)";
+$lang['created before %s (%s)'] = "geskep voor %s (%s)";
+$lang['created between %s (%s) and %s (%s)'] = "geskep tussen %s (%s) en %s (%s)";
+$lang['created on %s'] = "geskep op %s";
+$lang['Customize'] = "Verander na smaak";
+$lang['Your Gallery Customization'] = "Verander U gallery na smaak";
+$lang['day'][0] = "Sondag";
+$lang['day'][1] = "Maandag";
+$lang['day'][2] = "Dinsdag";
+$lang['day'][3] = "Woensdag";
+$lang['day'][4] = "Donderdag";
+$lang['day'][5] = "Vrydag";
+$lang['day'][6] = "Saterdag";
+$lang['Default'] = "Verstek";
+$lang['delete this photo from your favorites'] = "Verwyder die foto onder u gunstelinge";
+$lang['Delete'] = "Verwyder";
+$lang['descending'] = "afnemend";
+$lang['Download'] = "Laai af";
+$lang['Download this file'] = "Laai die lêer af";
+$lang['edit'] = "verander";
+$lang['wrong date'] = "verkeerde datum";
+$lang['excluded'] = "uitgesluit";
+$lang['Your favorites'] = "U gunstelinge";
+$lang['display your favorites photos'] = "vertoon u gunsteling fotos";
+$lang['Favorites'] = "Gunstelinge";
+$lang['First'] = "Eerste";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = "Die gallery is toe vir instandhouding. Kom besoek ons asb. later weer.";
+$lang['Page generated in'] = "Bladsy gegenereer in";
+$lang['guest'] = "gas";
+$lang['Hello'] = "Hallo";
+$lang['available for administrators only'] = "slegs vir administrateur beskikbaar";
+$lang['display this album'] = "vertoon hierdie album";
+$lang['display last user comments'] = "vertoon die laaste gebruiker se kommentaar";
+$lang['customize the appareance of the gallery'] = "Verander die voorkoms van die gallery";
+$lang['search'] = "soek";
+$lang['Home'] = "Tuis";
+$lang['in this album'] = "in hierdie album";
+$lang['in %d sub-album'] = "in %d sub-album";
+$lang['in %d sub-albums'] = "in %d sub-albums";
+$lang['included'] = "ingesluit";
+$lang['Invalid password!'] = "Ongeldige wagwoord!";
+$lang['Language'] = "Taal";
+$lang['last %d days'] = "laaste %d dae";
+$lang['Last'] = "Laaste";
+$lang['Logout'] = "Teken uit";
+$lang['obligatory'] = "verplig";
+$lang['Maximum photo height'] = "Maksimum foto hoogte";
+$lang['Maximum height must be a number superior to 50'] = "Maksimum hoogte moet 'n getal groter as 50 wees";
+$lang['Maximum photo width'] = "Maksimum foto wydte";
+$lang['Maximum width must be a number superior to 50'] = "Maksimum wydte moet 'n getal groter as 50 wees";
+$lang['display a calendar by creation date'] = "vertoon 'n kalender volgens datum geskep";
+$lang['display all photos in all sub-albums'] = "vertoon alle fotos in alle sub-albums";
+$lang['return to normal view mode'] = "gaan terug na normale voorkoms";
+$lang['display a calendar by posted date'] = "vertoon die kalender volgens publikasie datum";
+$lang['month'][10] = "Oktober";
+$lang['month'][11] = "November";
+$lang['month'][12] = "Desember";
+$lang['month'][1] = "Januarie";
+$lang['month'][2] = "Februarie";
+$lang['month'][3] = "Maart";
+$lang['month'][4] = "April";
+$lang['month'][5] = "Mei";
+$lang['month'][6] = "Junie";
+$lang['month'][7] = "Julie";
+$lang['month'][8] = "Augustus";
+$lang['month'][9] = "September";
+$lang['Most visited'] = "Meeste besoek";
+$lang['display most visited photos'] = "vertoon gewildste fotos";
+$lang['Unknown identifier'] = "Onbekende identifiseerder";
+$lang['New password'] = "Nuwe wagwoord";
+$lang['Rate this photo'] = "Gradeer die foto";
+$lang['Next'] = "Volgende";
+$lang['no rate'] = "geen gradering";
+$lang['Photos posted within the last %d day.'] = "Slegs fotos wat binne die laaste %d dae gepos is.";
+$lang['Photos posted within the last %d days.'] = "Slegs fotos wat die laaste %d dae gepos is.";
+$lang['password updated'] = "wagwoord opgedateer";
+$lang['Recent period must be a positive integer value'] = "Onlangse periode moet 'n positiewe waarde wees";
+$lang['photo'] = "foto";
+$lang['Click on the photo to see it in high definition'] = "Kliek om die foto in hoë definisie te sien";
+$lang['Show file metadata'] = "Wys lêer metadata";
+$lang['Powered by'] = "Aangedryf deur";
+$lang['Preferences'] = "Voorkeure";
+$lang['Previous'] = "Vorige";
+$lang['Random photos'] = "Lukraak fotos";
+$lang['display a set of random photos'] = "vertoon 'n stel lukraak fotos";
+$lang['Recent albums'] = "Onlangse albums";
+$lang['display recently updated albums'] = "Vertoon albums wat onlangs opgedateer is";
+$lang['Recent period'] = "Onlangs periode";
+$lang['Recent photos'] = "Onlangse fotos";
+$lang['display most recent photos'] = "Vertoon mees onlangse fotos";
+$lang['Redirection...'] = "Verwysing...";
+$lang['Please, enter a login'] = "Vul 'n aanteken naam in";
+$lang['login mustn\'t end with a space character'] = "Aanteken naam mag nie op 'n spasie eindig nie";
+$lang['login mustn\'t start with a space character'] = "Aanteken naam kan nie met 'n spasie begin nie";
+$lang['this login is already used'] = "die aanteken naam is reeds in gebruik";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "epos adres moet wees soos xxx@yyy.ee.ee (voorbeeld : koos@vlooi.co.za)";
+$lang['please enter your password again'] = "Sleutel jou wagwoord weer in";
+$lang['Auto login'] = 'Automatiese aanteken';
+$lang['Contact'] = "Kontak";
+$lang['set as album representative'] = "Stel as album verteenwoordiger";
+$lang['Show number of comments'] = "Toon aantal kommentare";
+$lang['Show number of hits'] = "Wys aantal besoeke";
+$lang['slideshow'] = "skyfiereeks";
+$lang['stop the slideshow'] = "stop die skyfiereeks";
+$lang['Specials'] = "Treffers";
+$lang['SQL queries in'] = "SQL navrae in";
+$lang['display only recently posted photos'] = "Vertoon slegs fotos wat onlangs gepos is";
+$lang['return to the display of all photos'] = "gaan terug na vertoning van alle fotos";
+$lang['the beginning'] = "die begin";
+$lang['Interface theme'] = "Koppelvlak tema";
+$lang['Thumbnails'] = "Duimnale";
+$lang['Menu'] = "Keusepaneel";
+$lang['A comment on your site'] = "Kommentaar op u werf";
+$lang['today'] = "vandag";
+$lang['Update your rating'] = "Dateer u gradering op";
+$lang['the username must be given'] = "die gebruikersnaam word vereis";
+$lang['useful when password forgotten'] = "handig indien wagwoord vergeet is";
+$lang['Quick search'] = "Vinnige soek";
+$lang['Connected user: %s'] = "Gebruikers aanlyn: %s";
+$lang['IP: %s'] = "IP: %s";
+$lang['Browser: %s'] = "Leser: %s";
+$lang['Author: %s'] = "Outeur: %s";
+$lang['Comment: %s'] = "Kommentaar: %s";
+$lang['Comment by %s'] = "Kommentaar deur %s";
+$lang['User: %s'] = "Gebruiker: %s";
+$lang['Email: %s'] = "Epos: %s";
+$lang['Admin: %s'] = "Admin: %s";
+$lang['Registration of %s'] = "Registrasie van %s";
+$lang['Album: %s'] = "Album: %s";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Swak status vir gebruiker \"gas\", verstek status sal gebruik word. Kontak die webwerf adminisrateur.";
+$lang['this email address is already in use'] = "die epos is reeds in gebruik";
+$lang['Album results for'] = "Album resultate vir";
+$lang['Tag results for'] = "Sleutelwoord resultate vir";
+$lang['from %s to %s'] = "van %s na %s";
+$lang['Play of slideshow'] = "Speel skyfiereeks";
+$lang['Pause of slideshow'] = "Halt skyfiereeks";
+$lang['Repeat the slideshow'] = "Herhaal skyfiereeks";
+$lang['Not repeat the slideshow'] = "Moenie skyfiereeks herhaal nie";
+$lang['Reduce diaporama speed'] = "Verminder skyfiereeks spoed";
+$lang['Accelerate diaporama speed'] = "Verhoog skyfiereeks spoed";
+$lang['Submit'] = "Stuur";
+$lang['Yes'] = "Ja";
+$lang['No'] = "Nee";
+$lang['%d photo'] = "%d foto";
+$lang['%d photos'] = "%d fotos";
+$lang['%d photo is also linked to current tags'] = "%d foto is gekoppel aan huidige sleutelwoorde";
+$lang['%d photos are also linked to current tags'] = "%d fotos is gekoppel aan huidige sleutelwoorde";
+$lang['display photos linked to this tag'] = "vertoon fotos gekoppel aan die sleutelwoorde";
+$lang['photos posted during the last %d days'] = "fotos gepos die laaste %d dae";
+$lang['Piwigo Help'] = "Piwigo hulp";
+$lang['Rank'] = "Orde";
+$lang['group by letters'] = "groepeer volgens letters";
+$lang['letters'] = "letters";
+$lang['show tag cloud'] = "wys sleutelwoorde in sleutelwolk";
+$lang['cloud'] = "wolk";
+$lang['Reset to default values'] = "Herstel na verstek waardes";
+$lang['delete all photos from your favorites'] = "verwyder alle fotos vanuit gunstelinge";
+$lang['Sent by'] = "Gestuur deur";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Koekblik is toe, of word nie deur u leser ondersteun nie. U moet koekies ontvang om te kan aanteken.";
+$lang['Edit a comment'] = "Wysig kommentaar";
+$lang['Are you sure?'] = "Is jy seker?";
+$lang['(!) This comment requires validation'] = '(!) Die kommentaar vereis validasie';
+$lang['Edit'] = 'Redigeer';
+$lang['Hello %s,'] = 'Hallo %s,';
+$lang['Send my connection settings by email'] = 'Stuur my verbindingopstelling met epos';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Sukselvolle registrasie, jy sal binnekort \'n epos ontvan met jou verbinding opstellings. Welkom!';
+$lang['Username modification'] = 'Gebruikersnaam verandering';
+$lang['Your username has been successfully changed to : %s'] = 'Jou gebruikersnaam is suksesvol verander na: %s';
+$lang['square'] = 'Vierkantig';
+$lang['thumb'] = 'Duim';
+$lang['small'] = 'Klein';
+$lang['medium'] = 'Medium';
+$lang['large'] = 'Groot';
+$lang['xlarge'] = 'Groter';
+$lang['xxlarge'] = 'Baie groot';
+$lang['Original'] = 'Oorspronklike';
+$lang['Thank you for registering at %s!'] = 'Dankie vir registrasie by %s!';
+$lang['Here are your connection settings'] = 'Hier is jou verbindingopstellings';
+$lang['Password: %s'] = 'Wagwoord: %s';
+$lang['Username: %s'] = 'Gebruikersnaam: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'As jy dink jy het foutiewelik hierdie epos ontvang, kontak ons by %s';
+$lang['Photo sizes'] = 'Foto groottes';
+
+?>
Index: tags/2.4.0RC3/language/af_ZA/index.php
===================================================================
--- tags/2.4.0RC3/language/af_ZA/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/af_ZA/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/af_ZA/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/install.lang.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['Admin configuration'] = 'Admin konfigurasie';
+$lang['Basic configuration'] = 'Basiese konfigurasie';
+$lang['Congratulations, Piwigo installation is completed'] = 'Baie geluk, Piwigo installasie is voltooi';
+$lang['Database configuration'] = 'Databasis konfigurasie';
+$lang['Download the config file'] = 'Laai die konfigurasie lêer af';
+$lang['Installation'] = 'Installasie';
+$lang['Just another Piwigo gallery'] = 'Net nog \'n Piwigo gallery';
+$lang['Password [confirm]'] = 'Wagwoord [bevestig]';
+$lang['PHP 5 is required'] = 'PHP 5 word vereis';
+$lang['Sorry!'] = 'Jammer!';
+$lang['Start Install'] = 'Begin installasie';
+$lang['User'] = 'Gebruiker';
+$lang['verification'] = 'verifikasie';
+$lang['Webmaster login'] = 'Webmeester login';
+$lang['Webmaster mail address'] = 'Webmeester epos adres';
+$lang['Welcome to my photo gallery'] = 'Welkom by my fotogallery';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Jy kan die konfigurasie lêer aflaai en oplaai na die local/config gids van jou installasie';
+?>
Index: tags/2.4.0RC3/language/af_ZA/iso.txt
===================================================================
--- tags/2.4.0RC3/language/af_ZA/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Afrikaans [ZA]
Index: tags/2.4.0RC3/language/af_ZA/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/af_ZA/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/af_ZA/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = "Upgrade";
+$lang['Upgrade'] = "Opgradering";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Hierdie blad se doel is om die Piwigo databasis van 'n ou na nuwer weergawe te opgradeer. Die opgraderingassistent dink jy gebruik tans <strong>weergawe %s</strong> (of ekwivalent).";
+$lang['Upgrade from version %s to %s'] = "Opgradeer van weergawe %s na %s";
+$lang['Statistics'] = "Statistiek";
+$lang['total upgrade time'] = "totale opgraderingstyd";
+$lang['total SQL time'] = "totale SQL tyd";
+$lang['SQL queries'] = "SQL navrae";
+$lang['Upgrade informations'] = "Opgraderingsinligting";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Doen 'n instandhoudingsondersoek by [Administrasie>Werktuie>Instandhouding] indien jy enige probleme ondervind.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "As voorsorg is die volgende invoegings gedeaktiveer. Voor heraktivering moet jy eers vir opgraderings soek:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Net die administrateur kan opgraderings doen: teken hier onder aan.";
+$lang['You do not have access rights to run upgrade'] = "Jy het nie toegangsregte op 'n opgradering te doen nie";
+$lang['All sub-albums of private albums become private'] = "Alle onderalbums van privaat albums word ook privaat";
+$lang['User permissions and group permissions have been erased'] = "Gebruiker en groepregte is uitgevee";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Slegs duimnaels en webmeester se pos adres is uit die vorige opstelling behou";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'In <i>%s</i>, voor <b>?></b>, voeg in:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'As voorsorg is die volgende temas gedeaktiveer. Voor heraktivering moet jy eers vir opgraderings soek:';
+?>
Index: tags/2.4.0RC3/language/ar_SA/Translator.txt
===================================================================
--- tags/2.4.0RC3/language/ar_SA/Translator.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/Translator.txt	(revision 14585)
@@ -0,0 +1,6 @@
+Translator
+
+mohammed ahmed al mobarak
+
+http://boayoob.tawaslcom.com
+m0h@msn.com
Index: tags/2.4.0RC3/language/ar_SA/about.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+<p>معرض الصور بدعم من Piwigo</p>
+
+<p>
+piwigo برنامج  معرض الصور برنامج  لشبكة الانترنت ، أنشأه مجموعه من المطورين و المستخدمين ،  وجود الإضافات جعلت من Piwigo سهل التخصيص ، كتبريد الحلوه ، برنامج Piwigo  برنامج مجاني و مفتوح .</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">زيارة موقع Piwigo</a></p>
+
+<p>تم ترجمته الى اللغة العربية  حسب ( الترتيب الأبجدي ) بواسطة :
+
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=5100">mohammed</a></li>
+        <li><a href="http://piwigo.org/forum/profile.php?id=12203">bakir</a></li>
+    </ul>
+           .... جزيل الشكر و الامتنان لك </p>
Index: tags/2.4.0RC3/language/ar_SA/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ar_SA/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/admin.lang.php	(revision 14585)
@@ -0,0 +1,900 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d مجموعه';
+$lang['%d associations'] = '%d جمعيات';
+$lang['%d album including'] = '%d ألبوم متضمن ';
+$lang['%d albums including'] = '%d ألبومات متضامنه ';
+$lang['%d physical'] = '%d طبيعين';
+$lang['%d physical'] = '%d طبيعي';
+$lang[' and %d virtual'] = ' و %d افتراضي';
+$lang[' and %d virtual'] = ' و %d أفترضي';
+$lang['%d album moved'] = '%d نقل الألبوم';
+$lang['%d albums moved'] = '%d نقل الألبومات';
+$lang['%d group'] = '%d مجموعه';
+$lang['%d groups'] = '%d مجموعات';
+$lang['%d member'] = '%d عدد';
+$lang['%d members'] = '%d أعداد';
+$lang['%d tag'] = '%d كلمة دلائلية';
+$lang['%d tags'] = '%d كلمات';
+$lang['%d user comment rejected'] = '%d تعليق المستخدم رُفض';
+$lang['%d user comments rejected'] = '%d تعليقات المستخدمين رفض';
+$lang['%d user comment validated'] = '%d تم مصادقة التعليق';
+$lang['%d user comments validated'] = '%d تم مصادقة التلعيقات';
+$lang['%d user deleted'] = '%d تم حذف المستخدم';
+$lang['%d users deleted'] = '%d تم حذف المستخدمين';
+$lang['%d user'] = '%d مستخدم';
+$lang['%d users'] = '%d مستخدمين';
+$lang['%d waiting for validation'] = '%d ينتظر المصادقة';
+$lang['Actions'] = 'الاجراءات';
+$lang['Activate'] = 'تفعيل';
+$lang['Add/delete a permalink'] = 'اضافة/حذف الرابط الدائم';
+$lang['Add a tag'] = 'اضافة كلمة دلائلية';
+$lang['Add a user'] = 'اضافة مستخدم';
+$lang['Add group'] = 'اضافة مجموعه';
+$lang['Add'] = 'أضف';
+$lang['Allow user registration'] = 'السماح للمستخدمين بالتسجيل';
+$lang['Apply to sub-albums'] = 'التطبيق على الألبوم الفرعي';
+$lang['Associated'] = 'مرتبط';
+$lang['Caddie management'] = 'ادارة السلة';
+$lang['Caddie'] = 'السلة';
+$lang['Albums authorized thanks to group associations'] = 'تم المصادقة عى الألبومات ، شكرا لله';
+$lang['Album manual order was saved'] = 'طلب الألبومات اليدوية تم حفظه';
+$lang['Check for upgrade failed for unknown reasons.'] = 'لم يتم التحدث لاسباب غير معروفه.';
+$lang['Check for upgrade'] = 'التأكد من التحديثات';
+$lang['Comments for all'] = 'يسمح للجميع بالتعليق دون استثناء و دون طائفية :)';
+$lang['Current name'] = 'الاسم الحالي';
+$lang['Database'] = 'قاعدة البيانات';
+$lang['Deactivate'] = 'تعطيل';
+$lang['Delete Representant'] = 'حذف هذا الرد';
+$lang['Delete selected tags'] = 'حذف الكلمات المختارة';
+$lang['Delete selected users'] = 'حذف المستخدمين المحددين';
+$lang['Deletions'] = 'الازالة';
+$lang['Deny selected groups'] = 'نفي المجموعات المختارة';
+$lang['Deny selected users'] = 'حذف المستخدم المحدد';
+$lang['Description'] = 'الوصف';
+$lang['Display options'] = 'عرض الخيارت';
+$lang['Dissociated'] = 'فصل';
+$lang['Does not represent'] = 'لا يمكن الرد';
+$lang['Edit selected tags'] = 'تحرير الكلمات المختارة';
+$lang['Edit tags'] = 'تحرير الكلمات الدلائلية';
+$lang['Email admins when a new user registers'] = 'ارسل للمدير عند تسجيل مستخدم جديد';
+$lang['Email admins when a valid comment is entered'] = 'اعلم المدير عند اي تعليق جديد';
+$lang['Email admins when a comment requires validation'] = 'اعلم المدير للمصادقة على تعليقات جديدة';
+$lang['Environment'] = 'البيئة';
+$lang['Form'] = 'نموذج';
+$lang['Gallery title'] = 'عنوان المعرض';
+$lang['Grant selected groups'] = 'تصريح المجموعه المختارة';
+$lang['Grant selected users'] = 'تصريح المستخدم المحدد';
+$lang['Group name'] = 'اسم المجموهة';
+$lang['Groups'] = 'مجموعات';
+$lang['Guests'] = 'الضيوف';
+$lang['History'] = 'السجـل';
+$lang['Informations'] = 'المعلومات';
+$lang['Install'] = 'تثبيت';
+$lang['Link all album photos to a new album'] = 'اربط جميع عناصر الألبومات بالألبوم الجديد';
+$lang['Link all album photos to some existing albums'] = 'اربط جميع عناصر الألبوم للقائمة الألبومات المشابهه';
+$lang['Linked albums'] = 'ربط الألبومات';
+$lang['Lock gallery'] = 'اغلاق المعرض';
+$lang['Maintenance'] = 'صيانة';
+$lang['Edit album permissions'] = 'ادراة تصاريح الألبومات';
+$lang['Manage permissions for group "%s"'] = 'ادارة تصاريح المجموعه "%s"';
+$lang['Manage permissions for user "%s"'] = 'ادارة تصاريح المشتركين "%s"';
+$lang['Manage tags'] = 'ادارة الكلمات الدلائلية';
+$lang['Members'] = 'الاعضاء';
+$lang['Metadata synchronized from file'] = 'تزامن البيانات الوصفية للملف';
+$lang['Move albums'] = 'نقل الألبومات';
+$lang['Move'] = 'نقل';
+$lang['Name'] = 'الاسم';
+$lang['New name'] = 'اسم جديد';
+$lang['New parent album'] = 'ألبوم فرعي جديد';
+$lang['New tag'] = 'كلمة جديد';
+$lang['Number of comments per page'] = 'عدد التلعيقات في الصفحة';
+$lang['Number of rates'] = 'عدد التقيمات';
+$lang['Number of thumbnails to create'] = 'عدد المصغرات المنشأة';
+$lang['Only private albums are listed'] = 'فقط للألبومات المدرجة';
+$lang['Operating system'] = 'نظام المعالجة';
+$lang['Options'] = 'الخيارات';
+$lang['Other private albums'] = 'ألبومات أخرى مدرجة';
+$lang['Page banner'] = 'عنوان المعرض ( أعلى الصفحة) يمكنك استخدام HTML';
+$lang['Parent album'] = 'الألبوم الرئيسي';
+$lang['Path'] = 'مسار';
+$lang['Permalink'] = 'رابط دائم';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'الرابط الدائم %sكان يستخدم من قبل الألبوم سابقا أحذفه   اولا من تاريخ %sالرابط الدائم';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'يجب ان يكون الرابط من الحروف الانجليزية   فقط مع امكانية استخدام الارقام ';
+$lang['Permalink %s is already used by album %s'] = 'هذا الرابط   %s بمستخدم من قبل هذا الألبوم ـ%s ';
+$lang['Permalink history'] = 'سجل الرابط الدائم';
+$lang['Permalinks'] = 'الروابط الدائمة';
+$lang['Permission denied'] = 'تصريح مرفوض';
+$lang['Permission granted thanks to a group'] = 'تم التصريح مع الشكر للمجموعه';
+$lang['Permission granted'] = 'منح التصريح';
+$lang['Photo informations updated'] = 'تم تحديث معلومات الصورة';
+$lang['Plugins'] = 'الاضافات';
+$lang['Position'] = 'المـوقع';
+$lang['Preferences'] = 'التفضبلات';
+$lang['Properties'] = 'الخصائص';
+$lang['Random photo'] = 'صورة عشوائية';
+$lang['Rate date'] = 'تاريخ التقييم';
+$lang['Rating by guests'] = 'امكانية التقييم للضيوف';
+$lang['Rating'] = 'تقييم';
+$lang['Reject'] = 'رفض';
+$lang['Representant'] = ' موصوف أو مُـمثل';
+$lang['Representation of albums'] = 'توصيف الألبومات';
+$lang['Representative'] = 'التوصيف  أو التمثيل';
+$lang['Represents'] = 'يُـمثل';
+$lang['Save order'] = 'حفظ المطلوب';
+$lang['Save to permalink history'] = 'حفظ في سجل الرابط الدائم';
+$lang['Select at least one album'] = 'اختر على الاقل ألبوم واحد يا أخي';
+$lang['Select at least one photo'] = 'اختر على الاقل صورة واحدة يا حبيبي';
+$lang['Select at least one user'] = 'اختر  عضوا واحد على الاقل';
+$lang['Show info'] = 'اعرض المعلومات';
+$lang['Site manager'] = 'إدارة الموقع';
+$lang['Status'] = 'الحالة';
+$lang['Statistics'] = 'الأحصائيات';
+$lang['Storage album'] = 'مخزن الألبومات';
+$lang['Sum of rates'] = 'مجموع التقييم';
+$lang['Tag "%s" already exists'] = 'الكلمات  "%s" موجودة بالفعل';
+$lang['Tag "%s" was added'] = 'تم اضافة هذه الكلمة "%s"';
+$lang['Tag selection'] = 'اختيار الكلمات الدلائلية';
+$lang['The %d following tags were deleted'] = 'تم حذف هذه الكلمات %d مسبقا';
+$lang['Unable to check for upgrade.'] = 'لا يمكن التأكد عن تحديثات جديدة';
+$lang['Uninstall'] = 'إلغاء التثبيت';
+$lang['Use the default photo sort order (defined in the configuration file)']='استخدام الصورة الافتراضية من أجل نوع (المحددة في ملف)';
+$lang['User comments validation'] = 'تعليقات تنتظر التصريح';
+$lang['Users'] = 'المستخدمين';
+$lang['Validate'] = 'تصريح';
+$lang['Validation'] = 'التصريح';
+$lang['Version'] = 'الاصدار';
+$lang['Virtual albums to move'] = 'لنقل الألبومات';
+$lang['Virtual album name'] = 'أسم الألبوم';
+$lang['Webmaster cannot be deleted'] = 'لا يمكنك حذف مدير الموقع';
+$lang['You are running on development sources, no check possible.'] = 'ربما لا يمكن تطوير المصادر';
+$lang['You cannot delete your account'] = "لا تستطيع حذف حسابك";
+$lang['You cannot move an album in its own sub album'] = 'لايمكن حذف ألبوم يحتوي على ألبوم فرعي';
+$lang['You need to confirm deletion'] = 'تحتاج  تأكيد الحذف';
+$lang['Associate to album'] = 'المرتبط بهذا الألبوم';
+$lang['associate to group'] = 'مرتبط بهذه المجموعه';
+$lang['Authorized'] = 'المرخص';
+$lang['Add a virtual album'] = 'انشاء ألبوم';
+$lang['Authorize users to add comments on selected albums'] = 'السماح للمستخدمين باضافة تعليق على ألبومات معينة';
+$lang['The name of an album must not be empty'] = 'لا يمكن ان  تبقي اسم الألبوم خالي';
+$lang['Lock albums'] = 'قفل الألبوم';
+$lang['Private'] = 'ألبوم خاص';
+$lang['Public'] = 'ألبوم عام';
+$lang['Find a new representant by random'] = 'اظهر  جديد التواصيف او التمثيل بطريقة عشوائية';
+$lang['Public / Private'] = 'العام/ الخاص';
+$lang['Manage authorizations for selected albums'] = 'ادارة  تصريح التعليقات على الألبومات';
+$lang['Virtual album added'] = 'الألبوم المضاف';
+$lang['Virtual album deleted'] = 'الألبوم المحذوف';
+$lang['Access type'] = 'طريقة الدخول';
+$lang['Information data registered in database'] = '     تم تحديث المعرض بنجاح  ';
+$lang['Default display'] = 'العرض الافتراضي';
+$lang['History'] = 'السجل';
+$lang['The gallery URL is not valid.'] = 'رابط المعرض غير صحيح';
+$lang['Main'] = 'الرئيسية';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'عدد التعليقات في الصفحة يجب أن تكون ما بين 5 و 50.';
+$lang['Configuration'] = 'التهيئة';
+$lang['confirm'] = 'تـأكيد';
+$lang['Date'] = 'التاريخ';
+$lang['delete album'] = 'حذف الألبوم';
+$lang['Dissociate from album'] = 'فصل من الألبوم';
+$lang['dissociate from group'] = 'فصل من المجموعه';
+$lang['Album updated successfully'] = 'تم تحديث معلومات الألبومات بنجاح منقط النظير.';
+$lang['photos per page'] = 'عدد في كل صفحة';
+$lang['High definition enabled'] = 'تمكين ابعاد الارتفاع';
+$lang['File'] = 'ملف';
+$lang['first photo added on %s'] = ' اول ما اضيف في  %s';
+$lang['Forbidden'] = 'ممنوع';
+$lang['global mode'] = 'النمط الشائع';
+$lang['group "%s" added'] = 'المجموعه  "%s"  أضيفت';
+$lang['group "%s" deleted'] = 'المجموعه  "%s"  جذفت';
+$lang['group "%s" updated'] = 'المجموعه  "%s"  تم تحميلها';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'لا تستخدم الترقيم "/" و لا تترك اسم المجموع فارغ';
+$lang['This name is already used by another group.'] = 'هذا الاسم مستخدم من قبل مجموعه أ×خرى.';
+$lang['High definition'] = 'ابعاد الارتفاع';
+$lang['jump to album'] = 'اغفز للمجموعة';
+$lang['jump to photo'] = 'اغفز للصورة';
+$lang['leave'] = 'تـَرك';
+$lang['Lock'] = 'قفل';
+$lang['Locked'] = 'مقفول';
+$lang['manage album photos'] = 'ادارةعناصر الألبوم';
+$lang['manage sub-albums'] = 'صور الألبوم الفرعي';
+$lang['Manage'] = 'إدارة';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = ' أستنفذت الوقت المتاح للتنفيذ وهو %d دقيقة';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'أستنفذت الوقت المتاح للتنفيذ وهو %d دقائق';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'الوقت المتاح لامراسلة قائمة المستخدمين محدود ،هناك متخدمين لم يتم اضافتهم في القائمة.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'الوقت للارسال محدود ، تم تجاهل بعض العناوين.';
+$lang['To send ?'] = 'إرسـال؟';
+$lang['Last send'] = 'الارسال الاخير';
+$lang['email'] = 'البريدالالكتروني';
+$lang['User'] = 'المستخدم';
+$lang['See you soon,'] = 'ستسعدنا جدا  زيارتك';
+$lang['Go to'] = 'يمكنك زيارتنا من خلال هذا الرابط ';
+$lang['Hello'] = 'السلام عليكم و رحمة الله و بركاته ';
+$lang['New photos were added'] = 'هناك صور جديدة في المعرض';
+$lang['on'] = 'صور واحدة جديدة ';
+$lang['between'] = ' بين ';
+$lang['and'] = ' و ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'تم اضافة بريدك لقائمة مراسلات المعرض ..لنعلمك بكل جديد ';
+$lang['You have subscribed to receiving notifications by mail.'] = 'نشكر لك ثقتك بنا .. تم اضافة بريدك  الى  قائمة  المراسلات  بنجاح';
+$lang['To subscribe'] = 'للاشتراك';
+$lang['If you encounter problems or have any question, please send a message to'] = 'إذا واجهتك اي مشكلة او كان لديك سؤال  أرسل فورا إلي ';
+$lang['[NBM] Problems or questions'] = '[NBM] مشكلةأو استفسار';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'تم الغاء بريدك من قائمة المراسلات .. و نحن جداآسفون لذلك';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'نأسف جدا لعدم تمكننا من خدمتك ..تم إلغاء بريدك  ';
+$lang[', click on'] = ', اضغط على ';
+$lang['To unsubscribe'] = 'لإلغاء الاشتراك';
+$lang['With blank value, gallery title will be used'] = 'القيمة فارغة ،عنوان المعرض سيستخدم';
+$lang['Notification'] = 'إدارة التبليغات';
+$lang['Error when sending email to %s [%s].'] = 'هناك خطأ عند الارسال الي %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'تم الارسل الي %s [%s].';
+$lang['%d mail was sent.'] = '%d تم ارسال البريد.';
+$lang['%d mails were sent.'] = '%d تم ارسال الرسائل .';
+$lang['%d mail was not sent.'] = '%d لم يتم الارسال.';
+$lang['%d mails were not sent.'] = '%d لم يتم ارسال الرسائل.';
+$lang['No mail to send.'] = 'البريد ليس موجود في قائمة المرسلات';
+$lang['There is no available subscribers to mail.'] = 'ليس هناك مشتركين للارسال.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'ممكنه لقائمة المشتركين فقط إذا كان مصرح لهم  بالعلم بمستجدات المعرض.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'متاح فقط لمسؤول المعرض المشاهدة.';
+$lang['No user to send notifications by mail.'] = 'لا يوجد مستخدمين للارسال.';
+$lang['New photos added'] = 'هناك صور جديدة في المعرض';
+$lang['Subscribe to notification by mail'] = ' تم اضافة بريدك';
+$lang['Unsubscribe from notification by mail'] = 'تم الغاء بريدك ';
+$lang['Parameter'] = 'نموذج الارسال';
+$lang['Continue processing treatment'] = 'معالجة المعاملة مسـتمرة';
+$lang['Complementary mail content'] = 'استكمال حساب البريد';
+$lang['Add detailed content'] = 'تم اضافة تفاصيل أخرى للحساب';
+$lang['Send mail as'] = 'أرسل بريد كـ ';
+$lang['Send mail to users'] = 'ارسل بريد للمستخدمين';
+$lang['Send'] = 'أرسل';
+$lang['Options'] = 'خيارات';
+$lang['Subscribed'] = 'مشترك';
+$lang['Subscribe'] = 'اشتـراك';
+$lang['Parameters'] = 'البارامترات';
+$lang['Select recipients'] = 'اختيار المستفيدين';
+$lang['Subscribe/unsubscribe users'] = 'اشتراك/الغاء اشتراك المستخدمين';
+$lang['Unsubscribed'] = 'الغاء الاشتراك';
+$lang['%d parameter was updated.'] = '%d تم تحديث البارامتر.';
+$lang['%d parameters were updated.'] = '%d البارمتر حُـدث.';
+$lang['%d user was not updated.'] = '%d المستخدم لم يتم تحديثه.';
+$lang['%d users were not updated.'] = '%d المستخدمين لم يتم تحديثهم.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'أسم المستخدم%s [%s] تم إزالة هذا البريد من قائمة المراسلات.';
+$lang['User %s [%s] was added to the subscription list.'] = 'بأسم : %s [%s] تم اضافة هذا البريد الي قائمة المراسلات.';
+$lang['%d user was updated.'] = '%d المستخدم تم تحديثه.';
+$lang['%d users were updated.'] = '%d تم تحديث قائمة المراسلات';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'المستخدم%s [%s] تم ازالة هذا البريد من قائمة المراسلات.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'المستخدم %s [%s] تم اضافة هذا البريد الى قائمة المراسلات.';
+$lang['User %s [%s] added.'] = 'المستخدم %s [%s]تم اضافة.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'تحذير : سيتم اعلام المشتركين باالاغلاء و الاشتراك';
+$lang['Send mail on HTML format'] = 'ارسال البريد بصيغة HTML';
+$lang['Include display of recent photos grouped by dates'] = 'تضمين عرض الصور الاخير حسب تاريخها';
+$lang['Available only with HTML format'] = 'متاح فقط بصيغة HTML';
+$lang['no write access'] = 'حرية التنفيذ مقيدة';
+$lang['Permissions'] = 'أذونات';
+$lang['private'] = 'خاص';
+$lang['public'] = 'العام';
+$lang['Purge never used notification feeds'] = 'عدم تسهيل استخدام التغذية الراجعه ';
+$lang['Purge sessions'] = 'تبسط او تسهيل الجلسات';
+$lang['randomly represented'] = 'تمثيل عشوائي';
+$lang['registration date'] = 'تاريخ التسجيل';
+$lang['clean'] = 'نظـيف';
+$lang['Create this site'] = 'عيّـن هذا الموقع';
+$lang['test'] = 'أختبار';
+$lang['test this remote site'] = 'اختبر هذا الموقع البعيد';
+$lang['remove tags'] = 'ازالة الكلمات الدلائلية';
+$lang['Repair and optimize database'] = 'اصلاح و تحسين قاعدة البيانات';
+$lang['selection'] = 'الاختيار';
+$lang['set to'] = 'أعـد لـ ';
+$lang['singly represented'] = 'نوصيف او تمثيل منفرد';
+$lang['This site already exists'] = 'هذا الموقع موجود بالفعل';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'إنشاء موقع جديد : (إعطاء عنوان لcreate_listing_file.php)';
+$lang['created'] = 'تم الانشاء';
+$lang['delete'] = 'حـذف';
+$lang['delete this site and all its attached elements'] = 'احذف هذا الموقع بكل عناصره المرتبطه به';
+$lang['deleted'] = 'تم الحــذف يا عبد الله';
+$lang['an error happened'] = 'هناك خطأ ما';
+$lang['Local'] = 'محلي';
+$lang['Remote'] = 'البعيد';
+$lang['update the database from files'] = 'تحديث قاعدة البيانات من الملف';
+$lang['status'] = 'الحالة';
+$lang['Directory'] = 'الدليل';
+$lang['sub-albums'] = 'الألبوم الفرعي';
+$lang['Synchronize metadata'] = 'مزامنة البيانات الوصفية';
+$lang['target'] = 'الهـدف';
+$lang['Thumbnail'] = 'المــصغرة';
+$lang['title'] = 'العنوان';
+$lang['Album list management'] = 'إدارة الألبومات';
+$lang['Piwigo configuration'] = 'تهيئة المعرض';
+$lang['Edit album'] = 'تحرير الألبوم';
+$lang['Group management'] = 'ادارة المجموعات';
+$lang['User list'] = 'قائمة المستخدم';
+$lang['Edit photo information'] = 'تعديل معلومات عن الصورة';
+$lang['Database synchronization with files'] = 'قاعدة بيانت المزامنة مع الملفات';
+$lang['all'] = 'الكل';
+$lang['height must be a number superior to'] = 'يجب عن يكون عدد الارتفاع يتعدى';
+$lang['width must be a number superior to'] = 'يجب ان يكون عدد العرض يتعدى';
+$lang['for the file format'] = 'لتنسيق الملف';
+$lang['Photo unreachable or no support'] = 'صور لا يمكن الوصول لها او لم تدعم';
+$lang['GD version'] = 'GD أصدار';
+$lang['General statistics'] = 'الاحصائيات العامة';
+$lang['average time'] = 'متوسط الوقت';
+$lang['number of miniaturized photos'] = 'عدد الصور المصغرة';
+$lang['total time'] = 'الوقت الكلي';
+$lang['for this file format'] = 'لتنسيق هذا الملف';
+$lang['unit mode'] = 'نمط موحد';
+$lang['Unlocked'] = 'غيرمقفل';
+$lang['unset'] = 'غير مهيأ';
+$lang['Update albums informations'] = 'تحديث ملعومات الألبومات';
+$lang['Update photos information'] = 'تحديث معلومات الصور';
+$lang['Synchronize'] = 'التزامن';
+$lang['reduce to single existing albums'] = 'تقليص الألبومات الحاليه';
+$lang['Choose an option'] = 'اختر واحد من الخيارات';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'الحد الاقصى لعرض الملعومات (حذف ،اضافة صور او ألبومات)';
+$lang['Error list'] = 'خطأ في القائمة';
+$lang['Errors caption'] = 'أخطاء في الايجاد';
+$lang['Detailed informations'] = 'ملعومات محذوفة';
+$lang['File/directory read error'] = 'خطأ في قراءة ملف/دليل';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'ملف أو دليل لا يمكن الوصول إليها (أي أنه لا وجود لها ، أو منعوا من الدخول)';
+$lang['albums deleted in the database'] = 'الألبومات محذوفة من قاعدة البيانات';
+$lang['photos deleted from the database'] = 'الصور محذوفة من قاعدة البيانات';
+$lang['photos candidates for metadata synchronization'] = 'تزامن المعلومات التفصيلة للصور المرشحه';
+$lang['photos informations synchronized with files metadata'] = 'ملعومات الصور متزامنة مع المعلومات التفصيلة للصور';
+$lang['errors during synchronization'] = 'أخطاء اثناء التزامن';
+$lang['albums added in the database'] = 'ألبومات اضيفت في قاعدة البيانات';
+$lang['photos added in the database'] = 'صور اضيفت في قاعدة البيانات';
+$lang['photos updated in the database'] = 'تم تحديث الصور في قاعدة البيانات';
+$lang['Search for new images in the directories'] = 'البحث عن صور جديدة في الألبومات';
+$lang['added'] = 'تمت الاضافة';
+$lang['deleted'] = 'تم الحذف للاسف الشديد';
+$lang['Metadata synchronization results'] = 'نتائج تزامن المعلومات التفصيلية';
+$lang['only perform a simulation (no change in database will be made)'] = 'اداة للمحاكاة فقط (لن يتم أي تغير في قاعدة البيانات)';
+$lang['Simulation'] = 'محاكات';
+$lang['directories + files'] = 'مجلدات + ملفات';
+$lang['only directories'] = 'فقط المجلدات';
+$lang['synchronize files structure with database'] = 'مزامنة الملفات مع هيكل قاعدة البيانات';
+$lang['synchronize files metadata with database photos informations'] = 'مزامنة الملعومات التفصيلة مع الصور الموجودة في قاعدة البيانات';
+$lang['even already synchronized photos'] = 'سبق التزامن مع الصور';
+$lang['Used metadata'] = 'معومات التفصيلة مُـستخدمة';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'اسم الأدلة والملفات يجب أن تكون مكونة من الحروف والأرقام ، "--" ، "_" أو "."';
+$lang['wrong filename'] = 'خطأ فادح  في اسم الملف';
+$lang['Upload'] = 'تحميل';
+$lang['user "%s" added'] = ' تم اضافة المستخدم"%s"  بنجاح';
+$lang['User status'] = 'حالة المستخدم';
+$lang['user_status_admin'] = 'مدير عام';
+$lang['user_status_generic'] = 'عام';
+$lang['user_status_guest'] = 'ضيف محترم';
+$lang['user_status_normal'] = 'مستخدم';
+$lang['user_status_webmaster'] = 'مسؤول الموقع';
+$lang['Virtual album'] = 'ألبوم افتراضي';
+$lang['Waiting'] = 'تحت الانتظار';
+$lang['default'] = 'افتراضي';
+$lang['Toggle \'default group\' property'] = 'ترجيح \'مجموعة افتراضية\' الخصوصية';
+$lang['Advanced features'] = 'مميزات متقدمة';
+$lang['Overall'] = 'اجماليا';
+$lang['Year'] = 'سنة';
+$lang['Month'] = 'شهر';
+$lang['Day'] = 'يوم';
+$lang['Pages seen'] = 'صفحة مشاهده';
+$lang['Time'] = 'الوقت';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'عنصر';
+$lang['Section'] = 'القسم';
+$lang['An information email was sent to group "%s"'] = 'معلومات تم ارسالها الي المجموعة "%s';
+$lang['Send an information email to group members'] = 'أرسل الملعومات الي أعضاء المجموعة';
+$lang['Group'] = 'مجموعه';
+$lang['[%s] Visit album %s'] = 'ألبوم تم تحديثه [%s]';
+$lang['Hello,'] = '  السلام عليكم و رحمة الله و بركاته,';
+$lang['See you soon.'] = 'زيارتك للمعرض تعني لي الكثير ..';
+$lang['Discover album:'] = ' البوم يحتوي صور جديدة :';
+$lang['Mail content'] = 'محتوى البريد';
+$lang['none'] = 'لا شيء';
+$lang['high'] = 'الارتفاع';
+$lang['other'] = 'آخــر';
+$lang['Element type'] = 'نوع العنـصر';
+$lang['Image id'] = 'هوية الصورة';
+$lang['Summary'] = 'ملخص';
+$lang['%d line filtered'] = '%d خط مـُرشح';
+$lang['%d lines filtered'] = '%d خطوط مُـرشح';
+$lang['%d guest'] = '%d ضيف كريم';
+$lang['%d guests'] = '%d ضيوف كرام';
+$lang['Hour'] = 'سـاعـة';
+$lang['guest'] = 'ضيف';
+$lang['default values'] = 'قيم أفتراضية';
+$lang['Guest cannot be deleted'] = 'هل انت جاد بطرد الضيف و حذفه (لايمكن ذلك)';
+$lang['Default user cannot be deleted'] = 'المستخدم الافتراضي لا يمكن حذفه';
+$lang['Purge history detail'] = 'معالجة تفاصيل السجل';
+$lang['Purge history summary'] = 'معالجة ملخص التفاصيل';
+$lang['Check integrity'] = 'فحص سلامة المراقبة';
+$lang['Anomaly'] = 'شـاذ';
+$lang['Correction'] = 'التصحيح';
+$lang['Automatic correction'] = 'تصحيح تلقائي';
+$lang['Impossible automatic correction'] = 'استحالة التصحيح التلقائي';
+$lang['Correction applied with success'] = 'تم التصحيح بنجاح منقطع التظير';
+$lang['Correction applied with error'] = 'لم يتم التحصيح هناك خطأ ما';
+$lang['%d anomaly has been detected.'] = '%d تم العثور على شذوذ .';
+$lang['%d anomalies have been detected.'] = '%d تم اكتشاف حالات شاذة.';
+$lang['%d anomaly has been corrected.'] = '%d تم تصحيح الحالة الشاذة.';
+$lang['%d anomalies have been detected corrected.'] = '%d تم تصحيح الحالات الشاذة.';
+$lang['%d anomaly has not been corrected.'] = '%d للاسف لم يتم تصحيح الحالة الشاذة.';
+$lang['%d anomalies have not been corrected.'] = '%d أوه..لم يتم تصحيح الحالات الشاذة.';
+$lang['Go to %s or %s for more informations'] = 'أذهب الي %s أو %s لمزيد من المعلومات';
+$lang['the forum'] = 'النـموذج';
+$lang['the wiki'] = 'the wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s القيم غير صحيح لانه exif غير مدعوم';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s لابد ان هناك فشل ما في ملف config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'الرئيسية "ضيفا" المستخدم غير موجود';
+$lang['Main "guest" user status is incorrect'] = 'حالة المستخدم غير صحيح';
+$lang['Default user does not exist'] = 'المستخدم الافتراضي غير صحيح';
+$lang['Main "webmaster" user does not exist'] = 'الرئيسية "مدير الموقع"غير موجود';
+$lang['Main "webmaster" user status is incorrect'] = 'الرئيسية حالة مدير الموقع " غير موجودة';
+$lang['User "%s" created with "%s" like password'] = 'المستخدم "%s" أنشأ مع  "%s" مثل كلمة المرور';
+$lang['Status of user "%s" updated'] = 'تم نحديث حالة المستخدم"%s" ';
+$lang['add new photos to caddie'] = 'اضف صور جديدة الى السلة';
+$lang['No display'] = 'لم يعرض';
+$lang['Classic display'] = 'عرض عادي';
+$lang['Hoverbox display'] = 'عرض مربعات عائمة';
+$lang['Mail address is obligatory for all users'] = 'عنوان البريد الإلكتروني إلزامي لجميع المستخدمين';
+$lang['Minimum privacy level'] = 'الحد الأدنى لمستوى الخصوصية';
+$lang['Privacy level'] = 'مستوى الخصوصية';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'متصلين';
+$lang['Level 2'] = 'اصدقاء';
+$lang['Level 4'] = 'العائلة';
+$lang['Level 8'] = 'مدراء';
+$lang['Reinitialize check integrity'] = 'اعادة فحص السلامة';
+$lang['Check all'] = 'أختر الجميع';
+$lang['Uncheck all'] = 'إلغاء الاختيار';
+$lang['Check automatic corrections'] = 'فحص وتصحيح آلي';
+$lang['Apply selected corrections'] = 'تطبيق التصحيح على البنود المختارة';
+$lang['Ignore selected anomalies'] = 'تجاهل اختيار المفارقات';
+$lang['Refresh'] = 'إنعاش';
+$lang['The anomaly will be ignored until next application version'] = 'سيتم تجاهل الشذوذ في النسخ القادمة';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'تصحيح وضع شاذ سيلغي أنه\'s متجاهل';
+$lang['%d anomaly has been ignored.'] = '%d تم تجاهل هذا الشيئ الشاذ.';
+$lang['%d anomalies have been ignored.'] = '%d تم تجاهل هذه الحلات الشاذه.';
+$lang['Plugins which need upgrade'] = 'اضافات تحتاج لتحديث';
+$lang['Plugin list'] = 'قائمة الاضافات';
+$lang['Check for updates'] = 'فحص للتحديث';
+$lang['Other plugins'] = 'اضافات أخرى';
+$lang['Last revisions'] = 'الاصدارت الاخيرة';
+$lang['Are you sure you want to delete this plugin?'] = 'هل انت متأكد من حذف هذه الاضاة?';
+$lang['Are you sure you want to install this plugin?'] = 'هل تريد فعلا تثبيت هذه الاضافة?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'هل فعلا تريد ترقية هذا التحديث ؟ قد تحتاج ان تتأكد انك لن تحتاج لعلمية الغاء التنصيب.';
+$lang['Plugin has been successfully copied'] = 'تم نسخ الاضافة الجديدة بنجاح';
+$lang['You might go to plugin list to install and activate it.'] = 'ينبقي عليك تفعيلها من قائمة الاضافات.';
+$lang['Can\'t create temporary file.'] = 'يمكن\'لا انشاء ملف مؤقت.';
+$lang['Can\'t download archive.'] = 'يمكن\'لا تحميل الارشيف.';
+$lang['Can\'t read or extract archive.'] = 'يمكن\'لا قراءة او استخراج الارشيف.';
+$lang['An error occured during extraction (%s).'] = ' (%s)حدث خطأ أثناء استخراج';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'ارجوا فحص "الاضافات" المجلدو المجلد الفرعي (CHMOD).';
+$lang['Can\'t connect to server.'] = 'يمكن\'لا الاتصال بالخادم.';
+$lang['Purge compiled templates'] = 'معالجة جميع النماذج';
+$lang['ACCESS_0'] = 'حرية الوصول';
+$lang['ACCESS_1'] = 'الوصول للجميع';
+$lang['ACCESS_2'] = 'للمشتركين فقط';
+$lang['ACCESS_3'] = 'للمدراء';
+$lang['ACCESS_4'] = 'لمدير الموقع';
+$lang['ACCESS_5'] = 'ليس لاحد';
+$lang['Support'] = 'الدعم الفني';
+$lang['Documentation'] = 'الوثائق';
+$lang['A new version of Piwigo is available.'] = 'هناك نسخة جديدة من Piwigo متاحة.';
+$lang['Piwigo Administration'] = 'Piwigo الإدارة';
+$lang['Piwigo version'] = 'Piwigo الاصدار';
+$lang['You are running the latest version of Piwigo.'] = 'انت تستعمل آخر نسخة من سكبرت المعرض .';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'اصدار الـ %s [%s] ليس متوافق من تنسيق الاصدار المطلوب[%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'انت بحاجة لتطوير النظام للتمع بكل امتيازات هذا البرنامج او انك لن تتمكن من تشغيل البرنامج على الاطلاق';
+$lang['Deleted on'] = 'محذزف';
+$lang['Last hit'] =  'النقرة الاخيرة';
+$lang['GD library is missing'] = '  مفقودة GD مكتبة ';
+$lang['Templates'] = 'النماذج';
+$lang['Extend for templates'] = 'توسيع النماذج';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'استبدال النماذج الأصلية من خلال نماذج من قالب مخصص في المجلد الفرعي';
+$lang['Replacers (customized templates)'] = 'تبديل(نماذج مخصصة)';
+$lang['Original templates'] = 'نماذج اصلية';
+$lang['Optional URL keyword'] = 'الكلمات الاساسية URL خيارات';
+$lang['Templates configuration has been recorded.'] = 'تم تسجيل قاولب التشكيل';
+$lang['All optimizations have been successfully completed.'] = 'تمت عملية التحسينات بنجاح.';
+$lang['Optimizations have been completed with some errors.'] = 'اكتملت عملية التحسين مع';
+$lang['Modify information'] = 'تعديل المعلومات';
+$lang['nothing'] = 'لا شيء';
+$lang['overrides existing values with empty ones'] = 'استبدل القيم الموجودة بقيم فارغة';
+$lang['Manage photo ranks'] = 'إدارة ترتيب الصور';
+$lang['Edit ranks'] = 'تحرير الترتيب';
+$lang['No photo in this album'] = 'لا يوجد صور في الالبوم';
+$lang['Images manual order was saved'] = 'تم حفظ الصور المطلوبة يديويا';
+$lang['ranks'] = 'الترتيب';
+$lang['Drag to re-order'] = 'أسحب لتغيير';
+$lang['Quick Local Synchronization'] = 'فحص سريع للمستجدات';
+$lang['No photo can be deleted'] = 'لا صور يمكن حذفها';
+$lang['Delete selected photos'] = 'حذف الصورالمختارة';
+$lang['%d photo was deleted'] = ' صورة محذوفة %d';
+$lang['%d photos were deleted'] = ' صور محذوفة %d';
+$lang['Downloads'] = 'تنزيل';
+$lang['Released on'] = 'Released on تمكين استخدام';
+$lang['Number of downloads'] = 'عدد التنزيلات';
+$lang['Piwigo Announcements Newsletter'] = 'اعلانات Piwigo الإخبارية';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'البقاء على اتصال مع Piwigo المشروع ، الاشتراك في النشرة Piwigo إعلان. سوف تتلقى رسائل البريد الإلكتروني عندما يتوفر الإصدار الجديد (في بعض الأحيان بما في تثبيت الأمن علة ، / / من المهم معرفة والارتقاء) ، وعندما يحدث الأحداث الرئيسية لهذا المشروع. سوى عدد قليل من الرسائل الإلكترونية في السنة.';
+$lang['Subscribe %s'] = ' %s اشتراك ';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'اشترك  %s لـ اعلانات Piwigo الإخبارية';
+$lang['Purge search history'] = 'معالجة احصائيات البحث';
+$lang['Hide'] = 'أخفاء';
+$lang['Menu Management'] = 'القائمة الرئيسية';
+$lang['Operation in progress'] = 'معالجة العرض';
+$lang['Please wait...'] = 'لحظات الانتظار أشغلها بالإستغفار ..';
+$lang['By rank'] = 'حسب المنزلة';
+$lang['Manual order'] = 'دليل النظام';
+$lang['Password is missing. Please enter the password.'] = 'لم تكتب كلمة المرور، فضلا ً أكتب كلمة المرور';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'لم يتم تأكيد كلمة المرور، فضلا ً لا أمر أكد المرور رحم الله والديك';
+$lang['Allow users to edit their own comments'] = 'اسمح للمستخدم بتحريرتعليقه الخاص';
+$lang['Allow users to delete their own comments'] = 'اسمح للمستخدم بحذف تعليقه الخاص';
+$lang['Email administrators when a comment is modified'] = 'ابلغ المديرعن تعديل التعليم ';
+$lang['Email administrators when a comment is deleted'] = 'ابلغ المدير عند حذف تعليق عن طريق البريد';
+$lang['Cannot delete the old permalink !'] = 'الروابط الدائمة و القديمة لا يمكن حذفها';
+$lang['Hit'] = 'نقرة';
+$lang['Tools'] = 'أدوات';
+$lang['Photos'] = 'الصور';
+$lang['Themes'] = 'واجهة العرض';
+$lang['Instructions to use Piwigo'] = 'دليل استخدام Piwigo';
+$lang['Installed Themes'] = 'تثبيت واجهات العرض';
+$lang['Add New Theme'] = 'اضف واجهة جديدة';
+$lang['Forbid this theme to users'] = 'امنع هذه الواجهة عن المستخدمين';
+$lang['Set as default theme for unregistered and new users'] = 'اجعلها كواجهة افتراضية لغير المسجلين و المستخدمين الجدد';
+$lang['unknown'] = 'غير معروف';
+$lang['Upload Photos'] = 'رفع الصور';
+$lang['Drop into album'] = 'اتركها داخل الالبوم';
+$lang['+ Add an upload box'] = '+ اضف عن طريق برنامج الرفع';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'إنشاء "%s" دليل على جذر التثبيت الخاص Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'اعطي تصريح الكتابة (chmod 777) على مجلد "%s" الذي ثبت فيه المعرض  ';
+$lang['existing album'] = 'الالبومات الموجودة';
+$lang['create a new album'] = 'انشأ ألبوم جديد ';
+$lang['Album name'] = 'أسم الألبوم';
+$lang['Album "%s" has been added'] = 'تم اضافته"%s"الألبوم ';
+$lang['Uploaded Photos'] = 'رفع الصور';
+$lang['%d photos uploaded'] = 'صور تم رفعها %d';
+$lang['Privacy level set to "%s"'] = '"%s"اعد مستوى الخصوصية ';
+$lang['Album "%s" now contains %d photos'] = ' الألبوم "%s" يحوي الآن %d صورة ';
+$lang['Manage this set of %d photos'] = '%d إدارة اعدادت صور';
+$lang['Select files'] = 'اختيار الملفات';
+$lang['Everybody'] = 'الجميع';
+$lang['Who can see these photos?'] = 'من يمكنه رؤية هذه الصور';
+$lang['Who can see this photo?'] = 'من يمكنه رؤية هذه الصورة؟';
+$lang['Settings'] = 'الإعدادت';
+$lang['Resize'] = 'تغيير المقاس';
+$lang['Maximum Width'] = 'الحد الأعلى لعرض الصورة';
+$lang['pixels'] = 'بكسل ';
+$lang['Maximum Height'] = 'الحد الاعلى لطول الصورة';
+$lang['Image Quality'] = 'جودة الصورة';
+$lang['Save Settings'] = 'حفظ الإعدادات';
+$lang['Your configuration settings are saved'] = 'تم حفظ الإعدادت ';
+$lang['Active Themes'] = 'تنشيط الواجهة';
+$lang['Add write access to the "%s" directory'] = ' "%s" اعطي تصريح الوصول و الكتابة على المجلد ';
+$lang['Administration Home'] = 'الأدارة الرئيسية';
+$lang['Change Admin Colors'] = 'تغير ألوان لوحة التحكم';
+$lang['Delete this theme'] = 'أحذف هذه الواجهة';
+$lang['Directory does not exist'] = 'المجلد غير موجود';
+$lang['Download,'] = ',تحميل';
+$lang['FTP + Synchronization'] = 'أف تي بي + التزامن ';
+$lang['Get Support on Piwigo Forum'] = 'أحصل على الدعم الفني من منتدى Piwigo';
+$lang['Help Me'] = 'ساعدني';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = ' %s لا يمكن تفعيل هذه الواجهة شيء ما مفقود ';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = ' %sلا يمكن حذف هذه الواجهة لرتباطها  بأشياء أخرى : ';
+$lang['Inactive Themes'] = 'الواجهات المفعلة';
+$lang['Install on your computer,'] = 'التثبيب على جهاز الكمبيوتر,';
+$lang['Make this theme available to users'] = 'أجعل هذه الواجهة متاحة للمستخدمين';
+$lang['Page end'] = 'نهاية الصفحة';
+$lang['Piwigo Uploader'] = 'برنامج piwigo للتحميل الصور';
+$lang['Read Piwigo Documentation'] = 'وثائق عن Piwigo';
+$lang['Start pLoader and add your photos.'] = 'بدء pLoader وإضافة الصور الخاصة بك.';
+$lang['Switch to clear or dark colors for administration'] = 'تغير لون لوحة التحكم أسود أو ابيض';
+$lang['Theme has been successfully installed'] = 'تم تثبيت واجهة المعرض بنجاح';
+$lang['Visit Gallery'] = 'معاينة المعرض';
+$lang['Visit Piwigo project website'] = 'زيارة الموقع الرئيسي لمشروع Piwigo ';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader اعتمد على <em>Piwigo Uploader</em>. من الكمبيوتر ، pLoader تستعد صورك وتحويلها الى معرض الصور الخاص بك Piwigo.';
+$lang['Guest Settings'] = 'اعدادت الضيوف';
+$lang['Main Page'] = 'صفحة رئيسية';
+$lang['Photo Page'] = 'صفحة الصورة';
+$lang['Activate Navigation Bar'] = 'اظهار لوح تبديل و اظهار الصور';
+$lang['Activate Navigation Thumbnails'] = 'تنشيط امكانية المشاهدة عن طريق المصغرات أسف صفحة الصورة';
+$lang['Activate icon "%s"'] = 'اظهار ايقونة  "%s"';
+$lang['Photo Properties'] = 'خصائص الصور';
+$lang['Allow user customization'] = 'السماح للمستخدم بتغيير خصائص العرض';
+$lang['Languages'] = 'اللغة';
+$lang['Installed Languages'] = 'تثبيت لغة';
+$lang['Add New Language'] = 'اضف لغة جديدة';
+$lang['Language has been successfully installed'] = 'تم تثبيت اللغة بنجاح';
+$lang['Select:'] = 'أختيار:';
+$lang['None'] = 'لا شيء';
+$lang['Invert'] = 'عكس';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'لا يمكن حذف الواجهة لانها الأخيرة ، لابد من وجود واجهة واحدة ';
+$lang['Webmaster status is required.'] = 'تم تغير حالة المدير العالم .';
+$lang['Bound Theme'] = 'واجهة إلزامية';
+$lang['Allow rating'] = 'السماح بالتوصويت';
+$lang['Select at least one comment'] = 'أختر تعليقا واحدا على الأقل';
+$lang['Active Plugins'] = 'تنشيط الإضافات';
+$lang['Inactive Plugins'] = 'تعطيل الإضافات';
+$lang['Missing Plugins'] = 'إضافات مفقودة';
+$lang['Uninstalled Plugins'] = 'اضافات غير مثبته';
+$lang['By %s'] = ' %s بواسطة';
+$lang['Visit plugin site'] = 'زيارة موقع الاضافة';
+$lang['Active Languages'] = 'تنشيط اللغة';
+$lang['Delete this language'] = 'اخذف هذه اللغة';
+$lang['Forbid this language to users'] = 'أمنع هذه اللغة عن المستخدمين';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'لا يمكن تعطيل هذه اللغة ، أولا ً قم باختيار لغة أخرى كلغة افتراضية';
+$lang['Impossible to deactivate this language, you need at least one language.'] = ' لا يمكن تعطيل هذه اللغة ، يجب اختيار لغة واحدة على الأقل';
+$lang['Inactive Languages'] = 'تعطيل اللغات';
+$lang['Make this language available to users'] = 'اجعل هذه اللغة متاحة للمستخدمين';
+$lang['Set as default language for unregistered and new users'] = 'اجعلها كلغة افتراضية لغير المسجلين و المستخدمين الجدد';
+$lang['Add Photos'] = 'أضف صور';
+$lang['The following tag was deleted'] = 'هذه الكلمات الدلائلية حُـذفت';
+$lang['Miscellaneous'] = 'متفرقات';
+$lang['Virtual Links'] = 'روابط ظاهرة';
+$lang['There is no other language available.'] = 'ليس هناك لغة أخرى متاحة.';
+$lang['There is no other plugin available.'] = 'ليس هناك اضافة أخرى متاحة.';
+$lang['There is no other theme available.'] = 'ليس هناك واجهة عرض أخرى متاحة.';
+$lang['Add another set of photos'] = 'اضف مجوعة أخرى من الصور';
+$lang['Order of menubar items has been updated successfully.'] = 'تم تحديث ترتيب العناصر بنجاح';
+$lang['This theme was not designed to be directly activated'] = 'لم يتم تصميم هذه الواجهة لتفعيلها مباشرة';
+$lang['Pending Comments'] = 'تعليقات تحت الانتظار';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'ملف PHP.ini the upload_max_filesize (%sB) أكبر منpost_max_size (%sB), يتوجب عليك تغير الاعدادت';
+$lang['Exif extension not available, admin should disable exif use'] = 'خاصية Exif غير متاحة ، ينبغي على المدير تعطيلها';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'الملف الذي تم تحميله يتجاوز upload_max_filesize  مباشرة في php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'الملف الذي تم تحميلة يتجاوز post_max_size مباشرة في php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'الملف الذي تم تحميلة يتجاور  MAX_FILE_SIZE التوجيه الذي تم تحديده في شكل أتش تي أم أل';
+$lang['The uploaded file was only partially uploaded'] = 'الملف الذي رُفع ، تم رفه جزئيا ً ';
+$lang['No file was uploaded'] = 'لم يتم رفع الملفات';
+$lang['Missing a temporary folder'] = 'مجلد الملفات المؤقته مفقود';
+$lang['Failed to write file to disk'] = 'فشل في كتابة الملف للقرص';
+$lang['File upload stopped by extension'] = 'تم يقاف رفع الملفات بسبب امتداد الملفات';
+$lang['Unknown upload error'] = 'خطأ غير معروف في رفع الملفات';
+$lang['Error on file "%s" : %s'] = ' "%s" : %s خطأ في الملف';
+$lang['automatic order'] = 'ترتيب آلي';
+$lang['manual order'] = 'ترتيب يدوي';
+$lang['Albums automatically sorted'] = 'ترتيب الألبومات آليا ً ';
+$lang['Batch Manager'] = 'دعم المدير';
+$lang['include child albums'] = 'تضمين الالبومات الفرعية';
+$lang['Selection'] = 'الاختيار';
+$lang['Action'] = 'الأداء';
+$lang['Set author'] = 'تعيين كاتب';
+$lang['Set title'] = 'تعيين عنوان';
+$lang['Set creation date'] = 'تعين تاريخ الأنشاء';
+$lang['Apply action'] = 'تطبيق الأجراءات';
+$lang['on the %d selected photos'] = 'تم اختيار الصور  %d في ';
+$lang['%d of %d photos selected'] = '%d من %d اختيار الصور';
+$lang['No photo selected, %d photos in current set'] = 'لم يتم اختيار صوره, %d صور في المجموعة الحالية';
+$lang['All %d photos are selected'] = 'كل %d الصور المختارة ';
+$lang['remove this filter'] = 'ازل هذه المرشح';
+$lang['Duplicates'] = 'المكرر';
+$lang['Add a filter'] = 'أضف مُـرشح';
+$lang['Remove all filters'] = 'احذف جميع المُرشحات';
+$lang['Refresh photo set'] = 'حدث مجموعة الصور';
+$lang['The whole page'] = 'صفحة كاملة';
+$lang['The whole set'] = 'مجموعة كلمة';
+$lang['No photo in the current set.'] = 'لا صور في المجموعة الحالية';
+$lang['No photo selected, no action possible.'] = 'لا توجد صور محددة ، أي إجراء ممكن';
+$lang['Choose an action'] = 'اختر اجراء';
+$lang['remove author'] = 'احذف الكاتب';
+$lang['Type here the author name'] = 'أكتب هنا أسم الكاتب ';
+$lang['remove title'] = 'احذف العنوان';
+$lang['Type here the title'] = 'أكتب هنا عنوان ';
+$lang['remove creation date'] = 'احذف تاريخ الانشاء';
+$lang['Album photos associated to the following albums: %s'] = 'صور الالبوم المرتبطة بالابومات اللاحقة : %s';
+$lang['Delete orphan tags'] = 'جذف الاكواد اليتيمة';
+$lang['delete photo'] = 'حذف صورة';
+$lang['Orphan tags deleted'] = 'الاكواد اليتيمة حذفت';
+$lang['Remove from caddie'] = 'حذف من السلة';
+$lang['Week starts on'] = 'يبدأ الاسبوع بيوم';
+$lang['You have %d orphan tags: %s.'] = 'يوجد %d اكواد يتيمة :%s';
+$lang['Themes which need upgrade'] = 'الثيمات التي تحتاج الى تحديث';
+$lang['Languages which need upgrade'] = 'اللغات التي تحتاج الى تحديث';
+$lang['All themes are up to date.'] = 'كل الثيم محدثة';
+$lang['All plugins are up to date.'] = 'كل الادوات محدثة';
+$lang['All languages are up to date.'] = 'كل اللغات محدثة';
+$lang['Visit theme site'] = 'زر موقع الثيمات';
+$lang['Visit language site'] = 'زر موقع اللغات';
+$lang['New Version'] = 'اصدار جديد';
+$lang['Obsolete Plugins'] = 'ادوات قديمة';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'تحذير !! هذه الاضافة لا تبدو ناها متوافقة مع اصدار PIWIGO.';
+$lang['Do you want to activate anyway?'] = 'هل تريد تفعيلها بأي شكل تفعيلها';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'هذه الاداة اصبحت جزءا من PIWIGO نفسها يجب ان تزيلها الان';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'خطأ : هذه الاداة مفقودة لكنها مثبتة, الغ تثبيتها الان';
+$lang['new'] = 'جديد';
+$lang['No results'] = 'لا نتائج';
+$lang['Searching...'] = 'جاري البحث ..';
+$lang['Type in a search term'] = 'اكتب كلمات البحث';
+$lang['display'] = 'عرض';
+$lang['Learn more'] = 'تعلم أكثر';
+$lang['An error has occured during upgrade.'] = 'حصل خطأ ما أثناء الترقية.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'حدث خطأ أثناء الأستخراج. يرجى التحقق من أذونات الملفات من التثبيت piwigo الخاص.<br><a href="%s">اضغط هنا لإظهار الخطأ</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'لا يمكن Piwigo استرداد ملف الترقية من الملقم';
+$lang['Rate'] = 'قيمة';
+$lang['Average rate'] = 'متوسط التصويت';
+$lang['Update Complete'] = 'اكتملت الترقية';
+$lang['Piwigo Update'] = 'ترقية Piwigo';
+$lang['Extensions Update'] = 'ترقية الاضافات';
+$lang['Update in progress... Please wait.'] = 'يتم معالجة التحديثات ،لحظات الانتظار .. املئها بالاستغفار';
+$lang['Ignore this update'] = 'اهمال هذا التحديث';
+$lang['Reset ignored updates'] = 'اعادة تعييين التحديثات المهملة';
+$lang['Update All'] = 'تجديث الكل';
+$lang['ERROR'] = 'خطأ';
+$lang['All extensions are up to date.'] = 'كل الاضافة محدثة.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'الادوات التالية يمكن ان تكون غير متوافقة مع الاصدار الجديد ل Piwigo :';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'الثيمات التالية يمكن ان تكون غير مكتملة مع الاصدار الجديد ل Piwigo:';
+$lang['I decide to update anyway'] = 'أقر التحديث بأي شكل';
+$lang['Update to Piwigo %s'] = ' Piwigo %s الترقية إلى ';
+$lang['Two updates are available'] = 'هناك ترقيتان متاحة';
+$lang['This is a minor update, with only bug corrections.'] = 'هذه ترقية ثانوية لتصحيح بعض الأخطاء.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'هذه تحديثات رئيسية مع <a href="%s"> ملحقات جديدة و مميزة</a>.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'تستطيع ترقية Piwigo إلى %s مباشرة ، بدون  تحديث Piwigo إلى %s (مستحسن )';
+$lang['Dump Database'] = 'تفريغ قاعدة البيانات';
+$lang['Save Template Directory'] = 'حفظ نماذج الدليل';
+$lang['Some themes and plugins may be not available yet.'] = 'بعض الواجهات مع بعض الإضافات قد لا يمكن تشغليها في الوقت الحالي';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'تضمين تاريخ البيانات (تنبيه:يجب توسيع ذاكرة الخادم)ـ';
+$lang['Unable to dump database.'] = 'غير قادرعلى تفريق قاعدة البيانات.';
+$lang['Some upgrades are available for extensions.'] = 'تتوفر بعض الترقية للاضافات';
+$lang['Height'] = 'الارتفاع';
+$lang['Width'] = 'العرض';
+$lang['Add to caddie'] = 'اضفها الي السلة';
+$lang['%s has been successfully updated.'] = '
+%s تم تحديثه بنجاح ';
+$lang['%s photos can not be regenerated'] = '%s لا يمكن تجديد الصور';
+$lang['%s photos have been regenerated'] = '%s تم تجديد الصور';
+$lang['(this tag will be deleted)'] = '( الكلمه الدلاذليه سيتم حذفها )';
+$lang['... or '] = '..آو';
+$lang['Add a criteria'] = 'إضافة معايير';
+$lang['Add tags'] = 'إضافه كلمات دلائليه';
+$lang['Allowed file types: %s.'] = ' %s :انواع ملفات الصور المسموح بها ';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'الحد الاقصى التقريبي لدقه العرض: %dM بكسلات (هكذا  %dx%d بكسلات).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'افتراضياً سيتم انشاء معرض Piwigo بالقيم عاليه الدقه من صوزك';
+$lang['Confirm merge'] = 'تأكيد الدمج';
+$lang['Create'] = 'انشأ';
+$lang['Crop'] = 'اعاده قص';
+$lang['Deactivate all'] = 'تعطيل الكل';
+$lang['Default photos order'] = 'طلب القيم الافتراضيه للصور';
+$lang['Follow Orientation'] = 'اتبع التوجيهات';
+$lang['Graphics Library'] = 'مكتبة الرسومات';
+$lang['hide details'] = 'اخفاء التفاصيل';
+$lang['Ignore All'] = 'تجاهل الكل';
+$lang['Last import'] = 'الاستيراد الاخير';
+$lang['Manage Permissions'] = 'اداره التصاريح';
+$lang['Activate comments'] = 'فعل التعليقات';
+$lang['Activate icon "new" next to albums and pictures'] = 'فعل ايقونه "جديد" بجانب الالبومات و الصور';
+$lang['Default comments order'] = 'الوضع الافتراضي للتعليقات';
+$lang['Maximum file size: %sB.'] = 'الحد الآعلى لحجم الملف : %sB. ';
+$lang['Merge selected tags'] = 'دمج الكلمات الدلائليه المختاره';
+$lang['Merge tags'] = 'دمج الكلمات الدلائليه';
+$lang['Photo %s of %s'] = 'صوره %s من %s';
+$lang['Photo name'] = 'آسم الصوره ';
+$lang['Photos generation in progress...'] = 'يتم معالجة  مجموعه الصور ..';
+$lang['Restore'] = 'استعاده';
+$lang['Select an album'] = 'اختيار الالبوم';
+$lang['Select at least two tags for merging'] = 'اختر آخر كلمتين دلاليتين للدمج';
+$lang['A locked gallery is only visible to administrators'] = 'غلق المعرض متاح لمديرالمعرض فقط';
+$lang['administrators'] = 'الأدارة';
+$lang['Applications'] = 'تطبيقات';
+$lang['apply automatic sort order'] = 'نفذ حسب الترتيب الآلي';
+$lang['Automatic sort order'] = 'ترتيب آلي ';
+$lang['Available on'] = 'متاح لـ';
+$lang['Available versions for'] = 'الإصدارات المتاحه لـ';
+$lang['cancel manual order'] = 'إلغي الأمر اليدوي';
+$lang['Cancel'] = 'إلغي';
+$lang['Center of interest'] = 'مركز الإهتمام';
+$lang['Gallery unlocked'] = 'تم فتح المعرض';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'إذا لم تكن هناك جوده عالية متاحة وكانت الإعدادات الحالية  أكبر من الأبعاد,سيقوم المعرض بتقليص الصورة  بما يناسب ابعاد صفحة الويب';
+$lang['List'] = 'آخر';
+$lang['modified'] = 'تعديل';
+$lang['Move to album'] = 'حرك إلى الألبوم';
+$lang['No destination tag selected'] = 'لم يتم تحديد كلمات دلائلية مستهدفه';
+$lang['Not cropped correctly?'] = 'الإقتطاع غير صحيح؟';
+$lang['Notify administrators when a comment is'] = 'أبلغ المدير عندالتعليق';
+$lang['Original Size'] = 'الحجم الأصلي';
+$lang['pending validation'] = 'في إنتظار التصريح';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo أضافة للنشر بوا سطة برنامج  Lightroom';
+$lang['Predefined filter'] = 'مُرشح مُحدد مُسبقاً';
+$lang['registered users'] = 'تسجيل المستخدمين';
+$lang['Resize after upload'] = 'غير الحجم بعد الرفع';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'استعادة التكوين الإفتراضي . سوف تفقد إعدادات الإضافات!';
+$lang['Save manual order'] = 'حفظ الأمر يدوياً';
+$lang['Save visits in history for'] = 'حفظ سجل الزوار لـ';
+$lang['Select the destination tag'] = 'أختر الكلمات الدلائلية المُستهدفة';
+$lang['Send connection settings by email'] = 'أرسل معلومات الاتصال عبر البريد';
+$lang['show details'] = 'أظهر التفاصيل';
+$lang['Show menubar'] = 'أظهر الأرقام';
+$lang['simple visitors'] = 'زوار عاديين';
+$lang['Start Upload'] = 'إبدأ الرفع';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = ' <em>%s</em>تم دمج الكلمات الدلائلية <em>%s</em> مع الكلمات الدلائية ';
+$lang['The original image quality must be a number between %d and %d'] = 'جودةالصورة الأصلية يجب أن تكون بين الرقم %d و %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'الحد الأدنى لإرتفاع الصورة يجب أن يكون بين الرقم %d و %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'الحد الأدنى لعرض الصورة يجب أن يكون بين الرقم %d و %d';
+$lang['This album contains %d photos, added between %s and %s.'] = 'هذا الألبوم يحتوي على %d أضيفت بين %s و %s .';
+$lang['This album contains %d photos, added on %s.'] = 'هذا الألبوم يحتوي على %d صورة,أضيفت في %s.';
+$lang['This album contains no photo.'] = 'هذا الألبوم لايحوي أي صورة';
+$lang['Thumbnails generation in progress...'] = 'معالجة إنشاء الصور المصغرة..';
+$lang['Unlock gallery'] = 'أفتح المعرض';
+$lang['Updates'] = 'تحديثات';
+$lang['Web Form'] = 'نموذج ويب';
+$lang['With no album'] = 'من غير ألبوم';
+$lang['With no tag'] = 'من غير كلمات دلائلية';
+$lang['With no virtual album'] = 'من غير ألبوم ظاهر';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'أنت تستخدم رافع الصور الخاص بالمتصفح .جرب استخدام <a href="%s">Flash uploader</a> بدلا ً منه ';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = ' هل تجد مشكله في رفع الصور بالفلاش جرب استخدام  <a href="%s">Browser uploader</a>  بدلً';
+$lang['You can activate only one mobile theme.'] = 'تستطيع تفعيل واجهة واحدة فقط  للموبايلي ';
+$lang['Zoom'] = 'تكبير';
+$lang['%u users have automatic permission because they belong to a granted group.'] = 'تصريح المستخدم %u تلقائي  لانه ضمن مجموعه لها تصريح';
+$lang['any visitor can see this album'] = 'أي زائر يمكنه مشاهدة هذا الألبوم';
+$lang['custom'] = 'تخصيص';
+$lang['Delete multiple size images'] = 'خذف الصور المتعددة الأحجام';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'ملامح استعراض المعرض , إنشاء ألبوم  و رفع الصور';
+$lang['Generate multiple size images'] = 'توليد صور بأحجام متعدده';
+$lang['Groups and users'] = 'مجموعات و مستخدمين';
+$lang['include photos with lower privacy level'] = 'استدعاء الصور بمستوى خصوصية أقل';
+$lang['No group is permitted to see this private album'] = 'لا يمكن لأي مجموعه مشاهدة هذا الألبوم';
+$lang['Permission granted for groups'] = 'تصريح ممنوح للمجموعات';
+$lang['Permission granted for users'] = 'التصريح الممنوح للمستخدم';
+$lang['Permission management'] = 'إدارة التصريحات';
+$lang['Select groups...'] = 'تحديد مجموعات ..';
+$lang['Select users...'] = 'تحديد المستخدمين';
+$lang['There is no group in this gallery.'] = 'لا توجد مجموعه لهذا الألبوم';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'الزوار في حاجه لتسجيل الدخول او  التصريح حتى يمكنهم مشاهده هذا الألبوم';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo for Android</em> تطبيقات للاجهزه اللمسيه التي تعمل علي نظام آندرويذ ، يتيح لهذه الاجهزه رفع الصور و انشاء الآلبومات';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em>  تطبيقات للاجهزه اللمسيه الخاصة بشركه أبل ،آيفون ، آيباد و آيبود  ، تطبيق يتيح لهذه الاجهزه الاتصال بمعرضك الخاص و رفع الصور و انشاء و الألبومات ';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'أدوبي فوتوشوب لايتروم  هو برنامج التصوير المصممة لإدارة كميات كبيرة من الصور الرقمية والقيام بأعمال ما بعد الإنتاج.';
+$lang['Piwigo publish plugin for Shotwell'] = 'اضافة النشر في Piwigo  الخاصه ببرنامج  Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell برنامج مفتوح المصدر لتنظيم و إدارة و معالجة الصور يعمل في بيئه لينوكس 
+هذا البرنامج باداره  Ubuntu و Fedora. ';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'اضافة للنشر في Piwigo  تسمح لك بتصدير ومزامنة الصور من لايترووم مباشرة إلى معرض الصور الخاص بك Piwigo. ';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'لا يمكنك تحديد ترتيب الصورة الافتراضية لأنه لديك إعداد مخصص في التكوين الخاص بك ';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'لقد حددت   <i>$conf[\'order_by\']</i>  في ملف التكوينات  ستم اهمال هذه التغيرات ، الرجاد تحزيك اوتغيير الاسم إلي <i>$conf[\'order_by_custom\']</i> !';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = ' Aperture برنامج بأدوات قوية لتحسين و ادارة الصور  خاص ببئة الماكنتوش';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture صمم من اجل الفوتوغرافين المحترفين  مع بساطة  iPhoto';
+$lang['Apply watermark if height is bigger than'] = 'تطبيق العلامة المائية إذا كان الإرتفاع أكبر من ';
+$lang['Apply watermark if width is bigger than'] = 'تطبيق العلامة المائية إذا كان العرض أكبر من';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'افتراضيا ، سيكون مركز الاهتمام في الوسط';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'لتحجيم الصور مع الاستقطاع " لتكون مربعه الشكل مثلا "   سيتم المحافظة على مركز الاهتمام  بأقصى ما يمكن';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'على اللينكس الخاص بك ، ثبت Shotwell ببساطه  عن طريق ادارة الحزم  ثم فعل خيارات النشر في Piwigo .';
+$lang['Opacity'] = 'غموض';
+$lang['Photo sizes with crop'] = 'حجم الصورة مع الاستقطاع';
+$lang['Piwigo export plugin for Aperture'] = 'إضافة التصدير الى Piwigo  لبرنامج  Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'إضافة التصدير الى Piwigo  لبرنامج iPhoto';
+$lang['Piwigo publish plugin for digiKam'] = 'إضافة النشر الخاص بـ digikam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.';
+$lang['Select a file'] = 'حدد الملف';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'حدد منطقة الاهتمام  بالفأرة لإنشاء  مركز جديد للاهتمام';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'الاضافة للتصدير الى Piwigo  اضافة تتيج لك أن تنشأ الألبوم و اضافة الصور';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'مركز الاهتمام ، هي المنطقة الأكثر وضوحا في الصورة';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'لتصدير صورك من digiKam  الى  Piwigo  ، ثبت digiKam ببساطه و اضف Kipi-plugins.';
+$lang['X Position'] = ' موضع X';
+$lang['X Repeat'] = 'كرر X';
+$lang['Y Position'] = 'موضع Y';
+$lang['add a new watermark'] = 'أضف علامة مائية جديدة';
+$lang['bottom left corner'] = 'الزاوية اليسرى السفلى';
+$lang['bottom right corner'] = 'الزاوية اليمنى السفلى';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam برنامج متقدم لتحرير  و ادارة الصور الرقمية ، يمكن تشغيله على  الوندوز و الماكنتوش و اللينكس';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'تم تصميم digiKam للمصورين الذين يرغبون في عرض وإدارة وتحرير وتعزيز وتنظيم والعلامة، ومشاركة الصورالفوتوغرافية.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto هو البرنامج الافتراضي لتحرير و تنظيم الصور لأجهزة المكنتوش .  إضافة التصدير  لهذا البرنامج تتيح لك انشاء الألبومات و تصدير الصور الى المعرض';
+$lang['middle'] = 'وسط';
+$lang['top left corner'] = 'الزاوية اليسرى العليا';
+$lang['top right corner'] = 'الزاوية اليمنى العليا';
+$lang['Multiple Size'] = 'حجم متعدد';
+?>
Index: tags/2.4.0RC3/language/ar_SA/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ar_SA/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/common.lang.php	(revision 14585)
@@ -0,0 +1,413 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: العربية [AR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=412
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Arbic';
+$lang_info['country'] = 'saudi';
+$lang_info['direction'] = 'rtl';
+$lang_info['code'] = 'ar';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d كيلوبايت';
+$lang['%d album updated'] = '%d ألبوم يحوي صور جديدة';
+$lang['%d albums updated'] = '%d ألبومات تحتوي على صور جديدة';
+$lang['%d comment to validate'] = '%d مصادقة التعليق';
+$lang['%d comments to validate'] = '%d مصادقة التعليقات';
+$lang['%d new comment'] = '%d تعليق جديد';
+$lang['%d new comments'] = '%d تعليقات جديدة';
+$lang['%d comment'] = ' التعليقات %d ';
+$lang['%d comments'] = ' عدد التعليقات %d ';
+$lang['%d hit'] = ' المشاهد %d ';
+$lang['%d hits'] = ' المشاهدين %d ';
+$lang['%d new photo'] = '%d صورة جديدة';
+$lang['%d new photos'] = '%d صور جديدة';
+$lang['%d new user'] = '%d مسخدم جديد';
+$lang['%d new users'] = '%d مستخدمين جدد';
+$lang['About'] = 'ماذا عن Piwgo ?';
+$lang['All tags'] = 'كل الكلمات الدلائلية';
+$lang['Any tag'] = 'أي كلمة دلائلية';
+$lang['At least one listed rule must be satisfied.'] = 'على الأقل واحدة لهذه يجب أن تكون مستوفية.';
+$lang['Author'] = 'بواسطة :';
+$lang['Albums'] = 'الألبومات';
+$lang['Album'] = 'ألبوم';
+$lang['Close this window'] = 'أغلق هذه النافذة';
+$lang['Complete RSS feed (photos, comments)'] = 'تابع تحديثات الموقع من صور جديدة و تعليقات  عبر الاشتراك في هذه الخدمة RSS';
+$lang['Confirm Password'] = 'تأكيد كلمة المرور';
+$lang['Connection settings'] = 'إعداد الاتصال';
+$lang['Login'] = 'دخول';
+$lang['Contact webmaster'] = 'اتصل بمدير الموقع';
+$lang['Create a new account'] = 'حساب جديد';
+$lang['Created on'] = 'تاريخ الصورة';
+$lang['Creation date'] = 'تاريخ الصورة';
+$lang['Current password is wrong'] = 'كلمة المرور غير صحيحة';
+$lang['Dimensions'] = 'الأبعاد';
+$lang['Display'] = 'المظهر';
+$lang['Each listed rule must be satisfied.'] = 'كل العناصر يجب ان تكون مكتملة.';
+$lang['Email address is missing. Please specify an email address.'] = 'البريد الإلكتروني غير موجود';
+$lang['Email address'] = 'البريد الالكتروني';
+$lang['Enter your personnal informations'] = 'ادخل معلوماتك الشخصية';
+$lang['Error sending email'] = 'خطأ في إرسال الرسالة';
+$lang['File name'] = 'أسم الملف';
+$lang['File'] = 'ملف';
+$lang['Filesize'] = 'حجم الملف';
+$lang['Filter and display'] = 'أعرض مع الترشيح';
+$lang['Filter'] = 'مُرشح ';
+$lang['Forgot your password?'] = 'هل نسيت كلمة المرور?';
+$lang['Go through the gallery as a visitor'] = 'شاهد معرض الصور كأحد الزوار';
+$lang['Help'] = 'مساعدة';
+$lang['Identification'] = 'الخصوصية';
+$lang['Photos only RSS feed'] = 'التغذية الراجعه للصورة RSS';
+$lang['Keyword'] = 'كلمة مفتاحية';
+$lang['Links'] = 'روابط';
+$lang['N/A'] = 'غير معروف';
+$lang['New on %s'] = 'جديد لـ  %s';
+$lang['Notification'] = 'تحديثات جديدة';
+$lang['Number of items'] = 'عدد البنود';
+$lang['Original dimensions'] = 'الأبعاد الأصلية';
+$lang['Password forgotten'] = 'نسيت كلمة المرور';
+$lang['Password'] = 'كلمة المرور';
+$lang['Post date'] = ' تاريخ الإضافة';
+$lang['Posted on'] = 'تاريخ إضافة الصورة في المعرض';
+$lang['Profile'] = 'ملف التعريف';
+$lang['Quick connect'] = 'تسجيل الدخول';
+$lang['RSS feed'] = 'RSS التغذية الراجعه';
+$lang['Register'] = 'تسجيل';
+$lang['Registration'] = 'التسجيل';
+$lang['Related tags'] = ' كلمات الدلائلية لها صلة';
+$lang['Reset'] = 'إستعادة';
+$lang['Retrieve password'] = 'إسترجاع كلمة المرور';
+$lang['Search rules'] = 'شروط البحث';
+$lang['Search tags'] = 'كلمات البحث';
+$lang['Search'] = 'بحث';
+$lang['display available tags'] = 'أنظر في الكلمات الدلائلية';
+$lang['Since'] = 'منذ';
+$lang['Sort by'] = 'ترتيب حسب ..';
+$lang['Sort order'] = 'طريقة العرض';
+$lang['Tag'] = 'كلمة دلائلية';
+$lang['Tags'] = 'الكلمات الدلائلية';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'استخدم خدمة التغذية الراجعه RSS للحصول التحديثات الجديدة من تعليقات و اضافات في هذا الموقع';
+$lang['Unknown feed identifier'] = 'التغذية غير معرفة';
+$lang['User comments'] = 'آخر التلعيقات في المعرض';
+$lang['Username'] = 'أسم المستخدم';
+$lang['Visits'] = 'الزوار';
+$lang['Webmaster'] = 'مدير المعرض';
+$lang['Week %d'] = 'أسبوع %d';
+$lang['About Piwigo'] = 'ماذا عن Piwigo';
+$lang['You are not authorized to access the requested page'] = 'لم تقم بتسجيل الدخول أو انك غير مشترك  أو .. غير مصرح لك';
+$lang['add this photo to your favorites'] = 'أضف هذه الصوة لمفضلتك ';
+$lang['Administration'] = 'الإدارة';
+$lang['all'] = 'كل';
+$lang['ascending'] = 'تصاعدي';
+$lang['author(s) : %s'] = 'الكتاب(s) : %s';
+$lang['Expand all albums'] = 'عرض جميع الألبومات المتفرعه';
+$lang['posted after %s (%s)'] = 'أضيفت بعد %s (%s)';
+$lang['posted before %s (%s)'] = 'أضيفت قبل %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'أضيفت بين %s (%s) و %s (%s)';
+$lang['posted on %s'] = 'أضيفت لـ . %s';
+$lang['Best rated'] = 'افضل تصويت';
+$lang['display best rated photos'] = 'اعرض الصور الاكثر تقيما من قبل المشاهدين';
+$lang['Calendar'] = 'التقويم';
+$lang['All'] = 'الجميع';
+$lang['display each day with photos, month per month'] = 'أعرض جميع صور هذا اليوم ،شهريا';
+$lang['View'] = 'عرض';
+$lang['chronology_monthly_calendar'] = 'تقويم شهري';
+$lang['chronology_monthly_list'] = 'القائم الشهرية';
+$lang['chronology_weekly_list'] = 'القائمة الأسبوعية';
+$lang['Click here if your browser does not automatically forward you'] = 'إذا كان متصفحك لا يدعم الإنتقال الآلي أضغط هنا';
+$lang['comment date'] = 'تاريخ التعليق';
+$lang['Comment'] = 'التلعيق';
+$lang['Your comment has been registered'] = 'سيتم إعتماد كلماتك الطيبة في أقرب وقت';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'نرجوا الانتظار قبل اضافة تعليق آخر ';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'لم يتم إعتماد تعليقك لأنه مخالف لشروط التعليقات';
+$lang['An administrator must authorize your comment before it is visible.'] = 'لن يطول انتظارك حتى ترى تعليقك هنا بعد مراجعة الإدارة.';
+$lang['This login is already used by another user'] = 'يبدو أن هناك مستخدم آخر بنفس هذا المعلومات';
+$lang['Comments'] = 'التعليقات';
+$lang['Add a comment'] = 'أكتب تعليق';
+$lang['created after %s (%s)'] = 'أنشأ قبل %s (%s)';
+$lang['Comments'] = 'آخر التلعيقات';
+$lang['Add a comment'] = 'اكتب تعليق';
+$lang['created after %s (%s)'] = 'انشأ قبل %s (%s)';
+$lang['created before %s (%s)'] = 'اُنشأ بعد %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'اُنشأ بين %s (%s) و %s (%s)';
+$lang['created on %s'] = 'تاريخ الإنشاء %s';
+$lang['Customize'] = 'تخصيص';
+$lang['Your Gallery Customization'] = 'تخصيص المعرض ';
+$lang['day'][0] = 'الاحد';
+$lang['day'][1] = 'الاثنين';
+$lang['day'][2] = 'الثلاثاء';
+$lang['day'][3] = 'الاربعاء';
+$lang['day'][4] = 'الخميس';
+$lang['day'][5] = 'الجمعه';
+$lang['day'][6] = 'السبت';
+$lang['Default'] = 'إفتراضي';
+$lang['delete this photo from your favorites'] = 'أزل هذه الصورة من مفضلتك';
+$lang['descending'] = 'تنازلي';
+$lang['Download'] = 'تحميل';
+$lang['Download this file'] = 'تحميل هذا الصورة';
+$lang['edit'] = 'تحرير';
+$lang['wrong date'] = 'تاريخ خطأ';
+$lang['excluded'] = 'استبعاد';
+$lang['Your favorites'] = 'مفضلتي';
+$lang['display your favorites photos'] = 'عرض صور المفضلة';
+$lang['Favorites'] = 'المفضلات';
+$lang['First'] = 'الأولى';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'مغلق للصيانة و التحديث .. نرجوا إعادة الزيارة مرة أخرى.';
+$lang['Page generated in'] = 'صفحة أنشئت في ..';
+$lang['guest'] = 'ضيف';
+$lang['Hello'] = 'السلام عليكم ';
+$lang['available for administrators only'] = 'متاح للأدارين فقط';
+$lang['display this album'] = 'عرض  جميع صور هذا الألبوم';
+$lang['display last user comments'] = 'شاهد آخر التعليقات';
+$lang['customize the appareance of the gallery'] = 'تخصيص معلوماتك الشخصية';
+$lang['search'] = 'بحث';
+$lang['Home'] = 'الرئيسية';
+$lang['Identification'] = 'إدارة المستخدمين';
+$lang['in this album'] = 'في هذا الألبوم';
+$lang['in %d sub-album'] = 'في %d البوم فرعي';
+$lang['in %d sub-albums'] = 'في %d ألبومات فرعية';
+$lang['included'] = 'مستدعى';
+$lang['Invalid password!'] = 'عفوا كلمة المرور غير صحيحة!';
+$lang['Language']='اللغة';
+$lang['last %d days'] = 'آخر %d الأيام';
+$lang['Last'] = 'الأخيرة';
+$lang['Logout'] = 'خروج';
+$lang['obligatory'] = 'ضروري';
+$lang['Maximum photo height'] = 'الإرتفاع الأقصى للصورة';
+$lang['Maximum height must be a number superior to 50'] = 'يجب أن يكون أقصى إرتفاع للصورة يتعدى الـ50';
+$lang['Maximum photo width'] = 'العرض الأقصى للصورة';
+$lang['Maximum width must be a number superior to 50'] = 'يجب أن يكون العرض الأقصى للصورة يتعدى الـ50';
+$lang['display a calendar by creation date'] = 'عرض التقويم حسب الألبومات';
+$lang['display all photos in all sub-albums'] = 'عرض جميع الصور ';
+$lang['return to normal view mode'] = 'العودة لنمط العرض العادي';
+$lang['display a calendar by posted date'] = 'عرض التقويم حسب تاريخ الصورة المضافة';
+$lang['month'][10] = 'أكتوبر';
+$lang['month'][11] = 'نوفمبر';
+$lang['month'][12] = 'ديسمبر';
+$lang['month'][1] = 'جينوري';
+$lang['month'][2] = 'فبراير';
+$lang['month'][3] = 'مارس';
+$lang['month'][4] = 'ابريل';
+$lang['month'][5] = 'ماي';
+$lang['month'][6] = 'يونيو';
+$lang['month'][7] = 'جولاي';
+$lang['month'][8] = 'أغسطس';
+$lang['month'][9] = 'سبتمبر';
+$lang['Most visited'] = 'الصور الأكثر مشاهدة';
+$lang['display most visited photos'] = ' عرض الصور الأكثر مشاهدة';
+$lang['Unknown identifier'] = 'معرف مجهول';
+$lang['New password'] = 'كلمة مرور جديدة';
+$lang['Rate this photo'] = 'قيم هذه الصورة';
+$lang['Next'] = 'التالي';
+$lang['no rate'] = 'كن أول من يعطي تقيمه لهذه الصورة';
+$lang['Photos posted within the last %d day.'] = 'صور اضيفت في آخر  %d يوم.';
+$lang['Photos posted within the last %d days.'] = 'صور ادخلت في آخر %d الايام.';
+$lang['password updated'] = 'تم تغير كلمة المرور ';
+$lang['Recent period must be a positive integer value'] = 'يجب أن تكون القيمة إيجابية في الفترة السابقة';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'صورة';
+$lang['Click on the photo to see it in high definition'] = 'أنقر على الصورة لتراها بحجم أكبر ';
+$lang['Show file metadata'] = 'أظهر المعلومات الفوتوغرافية للصورة';
+$lang['Powered by'] = 'بدعم من';
+$lang['Preferences'] = 'التفضيلات';
+$lang['Previous'] = 'الصورة السابقة';
+$lang['Random photos'] = 'صور  عشوائية';
+$lang['display a set of random photos'] = 'عرض مجموعة من الصورة عشوائياً';
+$lang['Recent albums'] = 'الألبومات الأخيرة';
+$lang['display recently updated albums'] = 'عرض أحدث الألبومات الحالية';
+$lang['Recent period'] = 'الفترة الأخيرة';
+$lang['Recent photos'] = 'الصور الأخيرة';
+$lang['display most recent photos'] = 'عرض أحدث الصور';
+$lang['Redirection...'] = 'إعادة التوجيه .....';
+$lang['Please, enter a login'] = 'من فضلك ، سجل دخولك';
+$lang['login mustn\'t end with a space character'] = 'لا يمكن تسجيل الدخول بترك مسافه خاليه';
+$lang['login mustn\'t start with a space character'] = 'لا يمكن تسجيل الدخول بالبدء بمسافه حرف خاليه';
+$lang['this login is already used'] = 'this login is already used';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail address must be like xxx@yyy.eee (example : jack@altern.org)';
+$lang['this login is already used'] = 'هذا المستخدم موجود حاليا';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'يجب ان يكون البريد بهذه الكيفيةxxx@yyy.eee (مثلا : jack@altern.org)';
+$lang['please enter your password again'] = 'من فضلك أعد كتابة كلمة المرور مرة أخرى';
+$lang['Auto login'] = 'دخول آلي';
+$lang['remove this tag from the list'] = 'حذف هذه الكلمات من القائمة';
+$lang['representative'] = 'صفه /نموذجي';
+$lang['Search for Author'] = 'أبحث عن الكاتب';
+$lang['Search in albums'] = 'أبحث في الألبومات';
+$lang['Search by date'] = 'بحث حسب التاريخ';
+$lang['Date'] = 'التاريح';
+$lang['End-Date'] = 'نهاية التاريح';
+$lang['Kind of date'] = 'صيغة التاريخ';
+$lang['Search for words'] = 'بحث بواسطة الكلمة';
+$lang['Search for all terms'] = 'بحث بوسطة جميع البنود ';
+$lang['Search for any term'] = 'بحث بواسطة أي بند';
+$lang['Empty query. No criteria has been entered.'] = 'الاستعلام فارغ .. ماذا تريد أن تفعل ؟!!.';
+$lang['Search results'] = 'نتائج البحث ';
+$lang['Search in sub-albums'] = 'بحث في الألبومات الفرعية';
+$lang['searched words : %s'] = 'نتيجة البحث عن : %s';
+$lang['Contact'] = 'إتصل بـ';
+$lang['set as album representative'] = 'تحديد فئة الصفة او النموذج';
+$lang['Show number of comments'] = 'أظهر عدد التعليقات';
+$lang['Show number of hits'] = 'أظهر عدد الزيارت';
+$lang['slideshow'] = 'عرض الشرائح';
+$lang['stop the slideshow'] = 'إيقاف العرض';
+$lang['Specials'] = 'إمتيازات';
+$lang['SQL queries in'] = 'استفسارات في SQL';
+$lang['display only recently posted photos'] = 'عرض الصور المضافة حديثا';
+$lang['return to the display of all photos'] = 'العودة لعرض جميع الصورة';
+$lang['the beginning'] = 'البداية';
+$lang['Interface theme'] = 'واجة العرض';
+$lang['Thumbnails'] = 'الصور المصغرة';
+$lang['Menu'] = 'القائمة الرئيسية';
+$lang['A comment on your site'] = 'استفسار مهم';
+$lang['today'] = 'اليوم';
+$lang['Update your rating'] = 'غير تقييمك';
+$lang['the username must be given'] = 'اسم المستخدم ضروري';
+$lang['useful when password forgotten'] = 'مهم ( لاستعاده كلمه المرور حال فقدانها )ـ';
+$lang['Quick search'] = 'بحث سريع';
+$lang['Connected user: %s'] = 'الاتصال بالمستخدم: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'استعراض: %s';
+$lang['Author: %s'] = 'بواسطة: %s';
+$lang['Comment: %s'] = 'تعليق : %s';
+$lang['Comment by %s'] = 'كاتب التعليق  %s';
+$lang['User: %s'] = 'المستخدم: %s';
+$lang['Email: %s'] = 'البريد الالكتروني: %s';
+$lang['Admin: %s'] = 'المدير: %s';
+$lang['Registration of %s'] = 'تسجيل  %s';
+$lang['Album: %s'] = 'الألبوم: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'وضغ سيئ للضيف "ضيف", استخدم الحالة الافرتاضية. يرجى ابلاغ المسؤول عن الموقع.';
+$lang['this email address is already in use'] = 'هذا البريد مسجل لدينامن قبل';
+$lang['Album results for'] = 'نتيجة البحث في الألبومات عن:';
+$lang['Tag results for'] = 'نتائج الكلمات الدلائلية';
+$lang['from %s to %s'] = 'من%s الي %s';
+$lang['Play of slideshow'] = ' عرض شرائح الصور';
+$lang['Pause of slideshow'] = 'إيقاف العرض';
+$lang['Repeat the slideshow'] = 'أعد عرض الشرائح';
+$lang['Not repeat the slideshow'] = 'لا تكرر عرض الشرائح';
+$lang['Reduce diaporama speed'] = 'خفض سرعة العرض';
+$lang['Accelerate diaporama speed'] = 'تسريع العرض';
+$lang['Submit'] = 'أرسل';
+$lang['Yes'] = 'نعم';
+$lang['No'] = 'لا';
+$lang['%d photo']=' صورة %d';
+$lang['%d photos'] = 'مجموع الصور %d';
+$lang['%d photo is also linked to current tags'] = '%d صورة لها صله بالكلمات';
+$lang['%d photos are also linked to current tags'] = '%d صور لها ارتباط بــ';
+$lang['display photos linked to this tag'] = 'شاهد الصور التي لها إرتباط بالكلمات الدلائلية ';
+$lang['photos posted during the last %d days'] = 'صور الايــ %d ــام الاخيرة ';
+$lang['Piwigo Help'] = 'الدعم الفني ';
+$lang['Rank'] = 'الألبوم';
+$lang['group by letters'] = 'عرض الكلمات في مجموعات';
+$lang['letters'] = 'الرسائل';
+$lang['show tag cloud'] = 'عرض سحابة الكلمات الدلائيه';
+$lang['cloud'] = 'سحابة';
+$lang['Are you sure?'] = 'هل انت متأكد?';
+$lang['Reset to default values'] = 'إستعادة القيم الافتراضيه';
+$lang['delete all photos from your favorites'] = 'حذف كل الصور من مفضلتي';
+$lang['Sent by'] = 'أرسل بواسطة : ';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'ملفات الإرتباط محضورة في متصفحك أو غير معتمده ،يجب تمكين الكوكيز للتمكن من التسجيل';
+$lang['Edit a comment'] = 'حرر تعليق';
+$lang['(!) This comment requires validation'] = '(!) التعليق يحتاج تصريح';
+$lang['Welcome'] = 'أهلاً وسهلا ً';
+$lang['Welcome to your Piwigo photo gallery!'] = ' Piwigo مرحبا بك في  معرض الصور الخاص بك';
+$lang['... or browse your empty gallery'] = '.. أو تصفح معرضك الفارغ';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... أو أخفي هذه الرسالة ، وسوف أجد طريقي بنفسي';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'مرحبا بك %s، معرض الصور Piwigo فارغ ';
+$lang['I want to add photos'] = 'أريد أن أضيف صور';
+$lang['Manage this user comment: %s'] = ' %s حرر تعليق المستخدم :';
+$lang['This author modified following comment:'] = 'هذا الكاتب حرر تعليقه  : ';
+$lang['This author removed the comment with id %d'] = 'هذا الكاتب حذف تعليقه : %d';
+$lang['html tags are not allowed in login'] = 'اكواد html غير مسموحة في تسجيل الدخول';
+$lang['%d rates'] = '%d التقييم';
+$lang['Change my password'] = 'غيّر كلمة المرور';
+$lang['Check your email for the confirmation link'] = 'تم أرسال رابط التأكيد الى بريدك الإلكتروني ..أفحص بريدك';
+$lang['Delete'] = 'حذف';
+$lang['Edit'] = 'تحرير';
+$lang['Enter your new password below.'] = 'ادخل كلمة المرور الجديدة .';
+$lang['EXIF Metadata'] = 'البيانات الوصفية EXIF';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'اذا وصلتك هذه الرسالة عن طريق الخطأ فقط تجاهل هذه الرسالة  و لا شيء سوف يحدث ';
+$lang['Invalid key'] = 'مفتاح خاطئ';
+$lang['Invalid username or email'] = 'اسم المستخدم او البريد الالكتروني غير صحيح ';
+$lang['IPTC Metadata'] = 'IPTC البيانات الوصفية ';
+$lang['Number of photos per page'] = 'عدد الصور في كل صفحة';
+$lang['Password reset is not allowed for this user'] = 'لا يمكن تغير كلمة المرور لهذا المستخدم';
+$lang['Password Reset'] = 'إعادة تعين كلمة المرور ';
+$lang['Please enter your username or email address.'] = 'فضلاً أكتب أسم المستخدم أو بريدك الألكتروني ';
+$lang['Rating score'] = 'حسب معدل التقييم';
+$lang['Return to home page'] = 'العودة للصفحة الرئيسية للمعرض';
+$lang['Someone requested that the password be reset for the following user account:'] = 'أحدهم طلب إعادة تعين كلمة المرور للحساب : ';
+$lang['The number of photos per page must be a not null scalar'] = 'عدد الصور في كل صفحة لا يمكن ان يكون صفر';
+$lang['The passwords do not match'] = 'كلمة المرور لا تتطابق ';
+$lang['To reset your password, visit the following address:'] = 'لإعادة تعين كلمة المرور تفضل بزيارة العنوان التالي :';
+$lang['User "%s" has no email address, password reset is not possible'] = 'ليس للمستخدم "%s" بريد الكتروني .. لا يمكن اعادة تعين كامة المرور ';
+$lang['Username "%s" on gallery %s'] = 'اسم المستخدم "%s"  في  معرض %s ';
+$lang['Username or email'] = 'أسم المستخدم أو البريد الإلكتروني ';
+$lang['You will receive a link to create a new password via email.'] = 'ستصل إلى بريدك رسالة فيها رابط إنشاء كلمة مرور جديدة ';
+$lang['Your password has been reset'] = ' تم إعادة تعيين كلمة المرور بنجاج ';
+
+$lang['large'] = 'كبير';
+$lang['medium'] = 'متوسط';
+$lang['Original'] = 'الاصلي';
+$lang['small'] = 'صغير';
+$lang['square'] = 'مربع';
+$lang['thumb'] = 'تصفح';
+$lang['xlarge'] = 'كبير جداً';
+$lang['xxlarge'] = 'كبير جداً جداً';
+$lang['2small'] = 'XXS-صغير';
+$lang['Desktop'] = 'سطح المكتب';
+$lang['Hello %s,'] = 'السلام عليكم %s.';
+$lang['Here are your connection settings'] = 'هنا تجد معلومات الدخول ';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'إذا كنت تعتقد أن هناك خطأ في تلقيك  هذه الرسالة , فضلاً اتصل بنا عبر %s';
+$lang['Mobile'] = 'محمول';
+$lang['Password: %s'] = 'كلمة المرور:  %s';
+$lang['Photo sizes'] = 'حجم الصورة ';
+$lang['Send my connection settings by email'] = 'أرسل إعدادات الإتصال عبر البريد';
+$lang['Show latest comments first'] = 'أظهر آخر التعليقات أولا ً';
+$lang['Show oldest comments first'] = 'أظهر التعليقات الاقدم  أولا ً';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'تم التسجيل بنجاح , قريبا ً تصلك معلومات الدخول إلى بريدك . مرحبا بك';
+$lang['Thank you for registering at %s!'] = 'شكراً لتسجيلك بأسم %s!';
+$lang['Username modification'] = 'تعديل أسم المستخدم';
+$lang['Username: %s'] = 'أسم المستخدم : %s';
+$lang['View in'] = 'عرض كـ';
+$lang['xsmall'] = 'XS - صغير أكثر';
+$lang['Your username has been successfully changed to : %s'] = 'تم تغيير أسم المستخدم الخاص بك  إلى : %s.';
+$lang['Date created, new &rarr; old'] = 'تاريخ الإنشاء , جديد  &rarr; قديم ';
+$lang['Date created, old &rarr; new'] = 'تاريخ الإنشاء , جديد  &rarr; قديم';
+$lang['Date posted, new &rarr; old'] = 'تاريخ الإضافة , جديد  &rarr; قديم ';
+$lang['Date posted, old &rarr; new'] = 'تاريخ الإضافة , جديد  &rarr; قديم';
+$lang['File name, A &rarr; Z'] = 'أسم الملف , أ  &rarr; ي';
+$lang['File name, Z &rarr; A'] = 'أسم الملف , أ  &rarr; ي';
+$lang['Manual sort order'] = 'ترتيب يدوي';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'رقمي , 1  &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'رقمي , 1  &rarr; 9';
+$lang['Photo title, A &rarr; Z'] = 'عنوان الصورة , أ  &rarr; ي';
+$lang['Photo title, Z &rarr; A'] = 'عنوان الصورة , أ  &rarr; ي';
+$lang['Rating score, high &rarr; low'] = 'درجة التقييم ,عالية &rarr; متدنية';
+$lang['Rating score, low &rarr; high'] = 'درجة التقييم , عالية &rarr; متدنية';
+$lang['Visits, high &rarr; low'] = 'المشاهدة , عالية&rarr; متدنية';
+$lang['Visits, low &rarr; high'] = 'المشاهدة , عالية &rarr; متدنية';
+?>
Index: tags/2.4.0RC3/language/ar_SA/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,142 @@
+<h2>تعديل البوم</h2>
+
+<h3>المعلومات</h3>
+
+<ul>
+
+<li><strong>الاسم</strong>: اعادة تسمية البوم (تغيير وهمي في حالة الالبوم الحقيقي).</li>
+
+<li><strong>description</strong>: نص قصير يعطي معلومات عامة عن الالبوم,
+   سيعرض هذا النص اسفل صفحة الصور المصغرة</li>
+
+</ul>
+
+<h3>تحريك</h3>
+
+<p>اذا كان هذا الالبوم وهمي يمكنك تحريكه.
+وهذا يعني تغيير الالبوم الاب.</p>
+
+<h3>خيارات</h3>
+
+<ul>
+
+<li><strong>نوع الوصول</strong>: تنظيم السماح. اذا جعلت البوم وهمي خاص كل الالبومات
+فيه ستكون خاصة. وعلى العكس اض اذا كانت عامة.</li>
+
+<li><strong>قفل</strong>: الالبوم وما فيه من البومات فرعية ستغلق للصيانة.</li>
+
+<li><strong>التعليقات</strong>: المستخدمون المخولون لاضافة التعليقات.</li>
+
+<li><strong>تخويل الرفع</strong>: السماح لمستخدم برفع الصور وهذا يكون للالبومات الحقيقية
+وليست الوهمية .</li>
+
+</ul>
+
+<p>يمكنك أيضا إدارة هذه الخيارات على "خصائص"
+إدارة الشاشة (الشاشات<span class="pwgScreen">الرفع</span>, <span
+class="pwgScreen">التعلبقات</span>, <span class="pwgScreen">القفل</span>,
+<span class="pwgScreen">عام/خاص</span>, <span
+class="pwgScreen">الممثل</span> متاح من <span
+class="pwgScreen">الادارة &raquo;الالبوم &raquo;
+وخصائصها</span>).</p>
+
+<h3>الترتيب</h3>
+
+<p>استخدام الصور في الترتيب الافتراضي</p>
+
+<p>بيان ما إذا كان هذا الترتيب  سينطبق أيضا على الالبومات الفرعية.</p>
+
+<p>عدد الساعات لاستخدامها في معايير الفرز المحددة مع هذا الألبوم.</p>
+<ul>
+<li><strong>تاريخ الإنشاء</strong>: وقت اخذ الصور</li>
+<li><strong>تاريخ النشر</strong>: تاريخ المزامنة</li>
+<li><strong>معدل التقييم(*)</strong>: يمكن تغيير متوسط التقييم من قبل
+الزوار</li>
+<li><strong>الاكثر زيارة (*)</strong>: الزيارة الحالية قد تغير
+الترتيب</li>
+<li><strong>اسم الملف</strong>: الاسم المعطى في حقل المعلومات</li>
+<li><strong>الرقم</strong>: الرقم الداخلي الفئات الأخيرة لديها أعلى
+رقم من سابقاتها.</li>
+
+</ul>
+<p><strong>(*)</strong>تحذير : يجب التأكد من اختبار هذه الأوامر حسب
+نفسك كما أنها يمكن أن تعطي نتائج غير متوقعة.</p>
+
+
+<h3>التمثيل</h3>
+
+<p>ممثل الألبوم هو تصغير يعرض على الصفحة الرئيسية
+(<span class="pwgScreen">category.php</span>) لتمثيل
+الألبوم
+إلا أنه يحتوي على البومات فرعية للصور مباشرة وليس (فقط كجذر
+ألبوم).</p>
+صورة  ألبوم :</p>
+
+<ul>
+
+<li><span class="pwgScreen">صفحة الصور</span>: واحدة من أزرار الإجراءات
+تتيح لك تعيين الصورة الحالية ممثلا لعرض الألبوم. يتوفر هذا الزر فقط للمشرفين.</li>
+
+<li><span class="pwgScreen">تعديل معلومات عن صورة</span>في
+الإدارة. يمكن الوصول إلى هذه الشاشة من <span
+   class="pwgScreen">picture.php</span> او <span class="pwgScreen">دفعة
+    إدارة</span> in <em>وضع الوحدة</em>. راجع التعليمات من هذه الشاشة ل
+    تفاصيل.</li>
+
+<li><span class="pwgScreen">الادارة &raquo; البومات &raquo;
+وخصائصها,
+   التمثيل</span>. راجع التعليمات من هذه الشاشة للحصول على تفاصيل.</li>
+
+<li><span class="pwgScreen">تعديل البوم</span> (الشاشة الحالية).</li>
+
+</ul>
+
+<p>اختيار ممثل يعتمد على
+<code>allow_random_representative</code> اعدادات التكوين (انظر<span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>في الوضع الافتراضي (<code>allow_random_representative</code> يوضع ل خطأ),
+يتم تمثيل كل الألبوم يحتوي على عنصر واحد على الأقل من قبل ثابت
+العنصر. مجموعة مرة واحدة (في خلق ألبوم)، ممثل من التغييرات فقط
+عندما تسأل الادارة عن ذلك. وإذا كان ممثل من غير المناسب،
+يمكنك ان تطلب من الممثل واحدة جديدة عشوائية</strong>.</p>
+
+<p>اذا كان <code>allow_random_representative</code> الاعدادت
+المكونة
+وضعت ل صحيحة, التصنيف قد لا يحتوي على ممثل ثابت
+فقط استخدم <strong>احذف التمثيل</strong> الزر.</p>
+
+<p>إذا كان الألبوم الفرعي والبومات الصور فارغة لا يمكن أن
+تكون ممثلة من قبل أي عنصر شكرا ل <span
+class="pwgScreen">تعديل معلومات عن صورة</span> شاشة. الخيار الوحيد الحالي علىالشاشة
+هو<strong>حذف الممثل</strong> زر.</p>
+
+<h3>وصل كل عناصر الالبوم ل البوم جديد</h3>
+
+<ul>
+
+<li><strong>اسم الالبوم الوهمي</strong>: اسم الالبوم الجديد للانشاء
+كل صور التصنيف الحالي ستربط به</li>
+
+<li><strong>الالبوم الاب</strong>: المكان الذي سيكون به الالبوم الجديد,
+اتركه فارغا للانشاء في الجذر</li>
+
+</ul>
+
+<h3>وصل كل عناصر الالبوم ل البوم موجود</h3>
+
+<ul>
+
+<li><strong>البومات</strong>: اختر الالبوم المستهدف</li>
+
+</ul>
+
+<h3>ارسل ايميل معلوماتي لمجموعة اشخاص</h3>
+
+<ul>
+
+<li><strong>المجموعة</strong>: المجموعة المستقبلة</li>
+
+<li><strong>محتوى الايميل</strong>: النص للارسال لهم.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ar_SA/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/cat_move.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>نقل الالبومات الوهمية</h2>
+
+<p>فقط الالبومات الفرعية يمكن ان يكون لها البوم اب</p>
+
+<h3>البومات وهمية للنقل</h3>
+
+<p>اختار البوم واحد او اكثر للنقل, اذا القائمة لم تحتوي على البومات, هذا يعني انك لم تنشئ واحدا بعد</p>
+
+<h3>البوم اب جديد</h3>
+
+<p>اختار البوم اب وهمي كان ام حقيقي , اذا لم تختار سيتم اضافة الالبوم الجديد الى جذر المعرض
+لايمكن نقل الالبوم الى نفسه او احد الالبومات الفرعية داخله</p>
Index: tags/2.4.0RC3/language/ar_SA/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>خيارات الالبوم</h2>
+
+<p>تنظيم الخيارات لعدة البومات مرة واحدة.</p>
+
+<dl>
+
+<dt>التعليقات</dt>
+<dd>الصورة ممكن تستقبل تعليقات من زوارك في البوم التعليقات فيه مفعلة.</dd>
+
+<dt>الاغلاق</dt>
+<dd>الالبومات المغلقة للصيانة , فقط المسؤول يمكنه رؤيتهم اثناء تصفحه للالبوم</dd>
+
+<dt>عام او خاص</dt>
+<dd>عندما يصبح الالبوم خاص , سيتم منح صلاحيات الوصول لمستخدمون ومجموعات يتم تعينها مسبقا</dd>
+
+<dt>التقديم</dt>
+<dd>هذا الخيار متاح عندما تضع اعدادات التكوين
+<code>allow_random_representative</code> (انظر<span
+  class="filename">include/config_defaults.inc.php</span>) الى
+<em>true</em>. كل البوم ممكن ان يقدم بواسطة صورة عشوائية او صورة توضع على انها صورة فريدة للالبوم</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ar_SA/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>تعديل تصاريح الالبوم</h2>
+
+<p>هذه الشاشة متاحة للألبومات خاصة. هنا يمكنك تحديد
+أذون للمستخدمين والمجموعات للألبوم.</p>
+
+<h3>المجموعات</h3>
+
+<p>يمكنك إازالة أو منح الجماعات وصول الألبوم الحالي. عن طريق تعديل
+مجموعات التراخيص، وسوف يمنح المستخدمين الذين ينتمون إلى هذه الجماعات  حق الوصول او المنع إلى هذا الألبوم.</p>
+
+<h3>المستخدمون</h3>
+
+<p>يمكنك منع او اضافة التصاريح للمستخدمون لوحدهم اما المنتمون لمجموعة فيجب اعطائهم
+استثناء بالمنع او السماح</p>
Index: tags/2.4.0RC3/language/ar_SA/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/configuration.html	(revision 14585)
@@ -0,0 +1,141 @@
+<h2>الاعدادات</h2>
+
+<p>تدع هذه الشاشة المسؤول القيام ب التكوين الأساسي. والواقع أن هذا
+الشاشة لا تظهر الا معايير الاعدادات البسيطة التي ينبغي أن تكون كافية ل
+الغالبية العظمى من المسؤولين. إذا كنت تريد أن ترى عديدة أخرى (و
+المتقدمة) المعايير الاعدادات، اقرأ الملف<span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>وتنقسم هذه الشاشة في عدة أقسام، تجميع اعدادات
+المعايير حسب الثيم.</p>
+
+
+<h3>الرئيسية</h3>
+<ul>
+<li><strong>عنوان المعرض</strong>: المستخدمة في آر إس إس وإخطارات
+البريد الإلكتروني.</li>
+
+<li><strong>بنر الصفحة</strong>: تعرض على رأس كل
+صفحةعامة.</li>
+
+<li><strong>رابط المعرض</strong>: المستخدمة في آر إس إس.</li>
+
+<li><strong>اغلاق المعرض</strong>: قفل كامل للمعرض
+للصيانةالعامة. فقط سوف يكون المستخدم المسؤول قادرا على الوصول الى
+المعرض.</li>
+
+<li><strong>التقييم</strong>: خاصية تقييم الصور مفعلة.</li>
+
+<li><strong>التقييم من الضيوف</strong>: حتى الضيوف يمكنهم تقييم الصور.</li>
+
+<li><strong>اتاحة التسجيل</strong>: اي شخص يستطيع التسجيل.</li>
+
+<li><strong>عنوان البريد إلزامي لجميع المستخدمين</strong>: عنوان البريد
+سوف يتم التحقق منه عند تحديث تسجيل الشخصي، إلا إذا
+تم ذلك العمل من قبل مسؤول.</li>
+
+<li><strong>ارسال بريد الى المسؤول عند تسجيل احدهم</strong>:
+المسؤول سوف يتم اخطاره بعملية تسجل مستخدم</li>
+
+</ul>
+
+<h3>التاريخ</h3>
+
+<p>زيارة الصفحات <span
+   class="pwgScreen">category.php</span> و<span
+   class="pwgScreen">picture.php</span> سوف يتم الحفظ في
+<code>التاريخ</code> قاعدة</p>
+
+<p>الزيارات سوف تظهر في<span
+   class="pwgScreen">الادارة&raquo; الادوات &raquo;
+التاريخ</span>.</p>
+
+<ul>
+<li><strong>حفظ زيارات الصفحة من الضيوف</strong>: الزيارات التي يقوم بها الضيوف
+سيتم تسجيلها.</li>
+
+<li><strong>حفظ زيارات المستخدمين</strong>: سوف يتم حفظ زيارات الاعضاء المسجلين.</li>
+
+<li><strong>حفظ  زيارات المسؤولون</strong>: زيارات المسؤولون سوف تحفظ</li>
+
+</ul>
+
+<h3>التعليقات</h3>
+<ul>
+
+<li><strong>التعليقات للكل</strong>: حتى الضيوف يمكنهم اضافة التعليقات</li>
+
+<li><strong>عدد التعليقات في الصفحة الواحدة</strong>.</li>
+
+<li><strong>التحقق</strong>:المسؤول يجب التحقق من صحة
+تعليقات المستخدمين قبل أن تصبح مرئية في الموقع. التحقق من صحة تعليقات المستخدم
+يحدث في الشاشة <span class="pwgScreen">الادارةn &raquo;
+الادوات &raquo; التعليقات المنتظرة</span>.</li>
+
+<li><strong>ارسال بريد عندما يتم ادخال تعليق حقيقي</strong>:
+يرسل بريد إلكتروني إلى المسؤولين عندما يقوم المستخدم بإدخال تعليق و
+هذا التعليق هو تم التحقق من صحته.</li>
+
+<li><strong>ارسال بريد الى المسؤول عندما يوجد تعليق يجب التحقق منه</strong>:
+يرسل بريد إلكتروني إلى المسؤولين عندما يقوم المستخدم بإدخال تعليقا
+يتطلب المصادقة من قبل الإدارة.
+التحقق من صحة تعليقات المستخدم يحدث في الشاشة <span
+class="pwgScreen">الادارة, الصور, التعليقات</span>.</li>
+
+</ul>
+
+<h3>الرفع</h3>
+<ul>
+<li><strong>اظهار رابط الرفع كل وقت</strong>:إذا البومات قابلة للرفع
+موجود، سيظهر رابط رفع لكل الألبوم.</li>
+<li><strong>مستوى الوصول للمستخدمين</strong>: يقيد رفع
+بعض الألبومات من المستخدمين</li>
+<li><strong>ارسال بريد للمسؤول عند رفع صورة</strong>:
+تنبيه المسؤول في كل مرة ترفع فيها صورة</li>
+</ul>
+
+<h3>العرض الافتراضي</h3>
+
+<p>هنا يمكنك تغيير خيارات العرض المستخدمة من قبل الضيف، المستخدم الافتراضي
+غير المتصل
+بمجرد الاتصال، وهذه الخيارات يتم تجاوزها من قبل خيارات المستخدم الخاصة
+(القابلة للتعديل في <span class="pwgScreen">الملف الشخصي</span>).</p>
+
+<p>It is possible to change the display options for all existing users,
+on the <span class="pwgScreen">الادارة &raquo;
+المستخدمون &raquo; تنظيم</span> الشاشة,حيث يمكنك اختيار قائمة من المستخدمين</p>
+
+<ul>
+
+<li><strong>اللغة</strong>: تتطبق ل Piwigo
+  التسميات فقط أسماء الألبوم، وأسماء وصور جميع المجالات أوصاف غير
+المترجمة.</li>
+
+<li><strong>عدد الصور في كل صف</strong></li>
+
+<li><strong>عدد الصفوف في كل صفحة</strong></li>
+
+<li><strong>ثيم الواجهة</strong></li>
+
+<li><strong>الفترة الحديثة</strong>: بواسطة أيام, الفترة التي كانت الصورة
+جديدة يجب أن تكون أكبر من 1 في اليوم.</li>
+
+<li><strong>توسيع كل الالبومات</strong>: توسيع كل الالبومات افتراضيا في القائمة<em>Warning</em>: هذا الخيار يتم استهلاك الموارد
+و يمكن توليد قائمة ضخمة إذا شجرة الألبوم تحتوي على العديد من
+البومات.</li>
+
+<li><strong>اظهار عدد التعليقات</strong>: عرض عدد من التعليقات
+    عن كل صورة على الصور المصغرة. فيها استهلاك الموارد</li>
+
+<li><strong>اظهار عدد النقرات</strong>: عرض اسفل الصفحة فقط عند الصور المصغرة حيث يتم عرض عدد النقرات ويمكن اعداد ذلك في الاعدادات المتقدمة <br>
+   $conf['show_nb_hits'] = true; <br>
+   ملاحظة خطأ افتراضيا</li>
+
+<li><strong>اكبر عرض للصور</strong>: عرض الحد الأقصى
+    العرض, وسيتم تغيير حجم الصور أكبر من هذا االعرض
+    في العرض, بدلا من اختيار هذا الخيار ، قد ترغب في النظر في
+    تعديل عرض الصور الخاصة بك، وهذا سيكون افضل</li>
+
+<li><strong>اقصى ارتفاع للصورة</strong>: انظر نفس اعدادات العرض في الاعلى.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ar_SA/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,92 @@
+<h2>توسع في اعدادت النماذج</h2>
+
+<h3>الهدف</h3>
+<p>تحديد الشروط البديلة لكل نموذج من ملحق - النماذج (النموذج يسمى "البدل").</p>
+
+<p>سيتم استبدال "./themes/default/template النموذج الأصلي" من (أو أي ثيم آخر) من قبل "البدل" إذا تم ربط البدل لهذا " النموذج الأصلي"(وبشكل اختياري ، عندما عنوان المطلوب يحتوي على
+"الكلمة اختياري عنوان الموقع").</p>
+
+<p>"كلمات عنوان الموقع الاختياري " هي تلك التي يمكنك أن تجد بعد اسم الوحدة النمطية في عناوين المواقع.</p>
+
+<p>ولذلك "كلمات عنوان الموقع الاختياري " يمكن أن تكون نشطة "الرابط الثابت"
+(انظر الرابط الدائم في الوثائق الخاصة بنا لمزيد من التوضيح).</p>
+
+<p>اقرأ: `<a href="#warnings">Warning</a>`شروط الاستخدام.</p>
+
+<h3>ماهي ملحقات النماذج؟</h3>
+
+<p>هذا التكوين هو أداة قوية للمبتدئين والمستخدمين المتقدمين. بواسطة بروتوكول نقل الملفات ، في المجلد template-extension ، لا يمكن لل مسؤول الموقع تكرار الكثير من الملفات. امتداد .tpl (" النموذج الأصلي") مع اسم مختلف ("البدل"). " النماذج الأصلية "، الحالية المدعومة هي </p>
+<ul>
+<li><span class="filename">index.tpl</span></li>
+<li><span class="filename">mainpage_categories.tpl</span> and/or <span
+class="filename">thumbnails.tpl</span></li>
+<li><span class="filename">menubar.tpl</span></li>
+<li><span class="filename">header.tpl</span> and/or <span
+class="filename">footer.tpl</span></li>
+<li><span class="filename">picture_content.tpl</span> and/or <span
+class="filename">picture.tpl</span></li>
+<!-- <li><span class="filename">slideshow.tpl</span></li> -->
+<li><span class="filename">profile.tpl</span> and/or <span
+class="filename">profile_content.tpl</span></li>
+<li><span class="filename">tags.tpl</span></li>
+<li><span class="filename">upload.tpl</span></li>
+<li><span class="filename">about.tpl</span></li>
+<li><span class="filename">popuphelp.tpl</span></li>
+<li><span class="filename">search.tpl</span> and/or <span
+class="filename">search_rules.tpl</span></li>
+<li><span class="filename">nbm.tpl</span> and/or <span
+class="filename">notification.tpl</span></li>
+<li><span class="filename">identification.tpl</span> and/or <span
+class="filename">register.tpl</span></li>
+<li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>اين اجد النماذج الاصلية؟</h3>
+
+<p>النماذج الاصلية موزعة في /themes/default/template/
+(لا تعدل عليهم للاستخدام في عملية الترقية). ف مع النماذج الاصلية
+اي مسؤول موقع يستطيع انشاء اي بديل ويجهزه حسب ما يريد.</p>
+
+<h3>اين يجب ان احفظ البدائل</h3>
+
+<p><strong>البدائل(النماذج المشكلة)</strong> يجب ان توضع في اي فولدر او فولدر فرعي <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>كيف افعل النموذج البديل؟</h3>
+<p>اي <strong>نموذج اصلي</strong> يجب ان يكون موصول لكل
+<strong>بديل(نموذج مشكل)</strong> لتفعيل كل ابدائل ذات العلاقة
+وهذا هو الهدف من "توسيع لل نماذج" في تكوين
+قوائم الإدارة .</p>
+
+<p>اذا اخترت  <strong>كلمات الروابط الاختيارية</strong> وسوف يتم استبدال ثم تعمل فقط على صفحات مع هذه الكلمة الرئيسية. على سبيل المثال : <span
+   class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+
+<p>المستخدمون المتقدمون سو يستخدمون الرابط الدائم ك <strong>كلمة الروابط الاختيارية</strong>. </p>
+
+<p>اذا اخترت <strong>نموذج محاط</strong> لاستبدال سوف تعمل فقط على هذا القالب.</p>
+
+<h3>كيف يمكن ان الغي"البدائل"؟</h3>
+<ul>
+<li>الغ اختيار "القالب الاصلي"</li>
+<li>بواسط بروتوكول FTP احذف "البدل"</li>
+</ul>
+<a name="warnings"></a>
+<h3>تحذيرات</h3>
+<ul>
+
+<li><strong>القالب الاصلي</strong> يجب أن يكون نموذج "الأصلي" يمكن أن يكون خلاف ذلك نتائج غير متوقعة!</li>
+
+<li>في العديد <strong>البدائل(القوالب المشكلة)</strong> التي هي تملك نفس<strong>القالب الاصلي</strong> ونفس<strong>الكلمات الاختيارية للرابط</strong>فقط البدل الاخير سوف يفعل</li>
+
+<li>الغير مختارة من  <strong>الكلمات الاختيارية للرابط</strong> سوف ينشط البديل عند أي استخدام للقالب. كما النقطة السابقة، الترتيب يمكن تجاوز بدائل مختارة سابقا.</li>
+
+<li>المجلدات الفرعية :
+يتم تجاهل المجلدات الفرعية كنها مفيدة لتغيير المجلد الحالي.<br>
+توزيع العينات : ويتم ذلك لغرض الاختبار!
+<strong>لا تقم بتعديلها</strong> قم بانشاء خاصتك
+</li>
+
+<li>في حالة حذف البديل <strong>القالب الاصلي</strong>مباشرة سوف يعاد تفعيلها</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ar_SA/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>قائمة بالمجموعات</h2>
+
+<p>في هذا المكان تستطيع تنظيم المجموعات</p>
+
+<h3>اضافة مجموعة</h3>
+
+<p>المسؤول بامكانه اضافة مجموعة</p>
+
+<h3>قائمة المجموعات</h3>
+
+<p>لكل عنصر ,القائمة تسمح ب:</p>
+
+
+<ul>
+<li>الذهاب الى قائمة الاعضاء</li>
+<li>الذهاب الى شاشة تنظيم الصلاحيات</li>
+<li>حذف مجموعة (تتطلب تأكيد)</li>
+<li>تغيير حالة "الافتراضي" (تتطلب تأكيد)</li>
+</ul>
+
+<h3>لالمجموعات الافتراضية</h3>
+<p>المجموعات الافتراضية هي التي يوضع بها العضو المسجل الجديد او المضاف من قبل المسؤول</p>
Index: tags/2.4.0RC3/language/ar_SA/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>هناك عدة طرق لإضافة الصور في المعرض</p>
+
+<ul>
+  <li><strong>الإضافة مباشرة </strong> ابسط و أسهل طريقة  لرفع الصور استخدام  مستعرض الويب . و ذلك يعتمد على امكانيات المتصفح و خادم الموقع ، للكمية كبيرة من الصور قد تواجه بعض المشاكل لذلك فهناك أساليب أخرى في انتظارك</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">أذهب إلى إضافة الصور مباشرة</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> برنامج يمكنك تثبيته على سطح المكتبه ، بعدها يمكنك سحب و افلات الصورة في نافذة ploade ثم تضغط على زر <em>"Upload to Piwigo"</em> ثم دع البرنامج يقوم بعمله في رفع الصور لمعرضك. يمكنكأن تجد  برامج مشابه مثل <strong>WinToPiwigo</strong> أو <strong>Digikam</strong> تصدير الاضافات إلى piwigo</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">أذهب إلى pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP ناقل الملفات</strong> هي الطريقةالمفضلة و الموصى بها لإضافة أعداد كبيرة من الصور في المعرض بقليل من النقرات ، فقط عليك اتباع التلعيمات الخاص باعداد الصور ،يسمح لك  اسلوب بروتوكول نقل الملفات FTP تنظيم صورك على الموقع  حسب تصنيفك الخاص ، </li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">FTPأذهب إلى </a></p>
+</div>
Index: tags/2.4.0RC3/language/ar_SA/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/help_groups.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>المجموعات هي وسيلة ملائمة لتعيين الأذونات لقائمة المستخدمين.</p>
+
+<p>لـ إنشاء مجموعة <span class="pwgScreen"> الإدارة &raquo; المستخدمين
+&raquo; مجموعات </span> ولمشاهدة الأعضاء المنتسبين لمجموعة <span class="pwgScreen"> الإدارة &raquo; المستخدمين &raquo;
+إدارة</span>.</p>
+
+<p>  يمكن للمستخدم ان يكون في أكثر من مجموعة حسب تصنيفك الخاص .للمنع اوتخصيص بعض الصوراوالالبومات يمكنك انشاء مجموعه كـ مجموعة( مثلا )  الاسرة التي تختص بصور لا  يراها إلا أعضاء مجموعة الأسرة فقط </p>
Index: tags/2.4.0RC3/language/ar_SA/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>بمجرد إنشاء معرض الصور يمكنك اعداد تكوينه للزوار حسب ما يلي :
+<ul>
+    <li> العرض الافتراضي الذي تفضله،  <span class="pwgScreen">الاإدارة  &raquo; التهيئة  &raquo;   الخيارات  </span>جدول  <span class="pwgScreen">إعدادت الضيوف، </span></li>
+    <li>الواجهة الافتراضية للمعرض ، <span class="pwgScreen">الادارة  &raquo; التهيئة  &raquo; واجهات العرض</span></li>
+    <li> اللغة الافتراضية للمعرض، <span class="pwgScreen">الادارة  &raquo; التهيئة  &raquo; اللغة   </span></li>
+</ul>
+سيتم تطبيق هذه الخيارات الافتراضية للمستخدمين الجدد
+</p>
+<p>نرحب بك و بأسئتلك في مجتمع   <a href="http://piwigo.org/forum">منتدى Piwigo</a>.</p>
Index: tags/2.4.0RC3/language/ar_SA/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,59 @@
+<fieldset>
+<legend>تخصيص الصور </legend>
+
+<p>
+لكل صورة <strong>مستوى من الخصوية</strong>  .(مغلقه) . كل مستخدم له أيضا ً خمس مستويات من الخصوصية ( مفتاح( . مستويات الخصوصية 5 و هي كما يلي:</p>
+<ol>
+  <li>لا شيء</li>
+  <li><em>متصلين </em></li>
+  <li><em>الاصدقاء (الذين لديهم مستوى عالي من الوصول للصور)</em></li>
+  <li><em>العائلة (الذين لديهم مستوى أعلى من مستوى الأصدقاء في الوصول)</em></li>
+  <li><em>المدراء (المستوى الأعلى من أي مستوى )</em></li>
+</ol>
+
+<p>
+المستويات العليا  لديها خصوصية أوسع من المستويات الادنى  الممنوحة لمستخدم معين  ، المستوى العالي يمنح مشاهدة المزيد من الصور.</p>
+
+<p>مثلا ، إذا كان مستوى الخصوصية لـ صورة "زواج علي " هي   لـ <em>"العائلة"</em>  إذن : </p>
+<ul>
+  <li>محمد ( هو  "<em>"المدير"</em> " )يستطيع مشاهد الصورة ، لانه مدير يستطيع أن يشاهد كل الصور</li>
+  <li>حسن ( هو أحد أفراد <em>"العائلة"</em> ) يستطيع أن يشاهد هذه الصورة</li>
+  <li>عمر ( هو مجرد <em>"صديق"</em> ) فلن يستطيع أن يشاهد الصورة</li>
+</ul>
+
+<p>
+المشاهد الذي لا يملك تصريح لمشاهدة الصور لفئة معينة فلن يشاهد الصور و لا حتى العنوان او حتى الكلمات الدلائلية </p>
+
+<p>يمكنك مشاهدة  مستوى الخصوية للمستخدمين  <span class="pwgScreen">الإدارة  &raquo; المستخدمين  &raquo; إدارة</span> </p>
+
+</fieldset>
+
+<fieldset>
+<legend>تخصيص الالبومات</legend>
+
+<p>
+إذا كانت مستويات الخصوصية لا تناسب احتياجاتك ، يمكنك أيضا إدارة الخصوصية  على الألبومات  لمستخدم أو مجموعة. يمكنك إدارة الصورة  على صور و الألبومات في نفس الوقت، دون تعارض.</p>
+
+<p>تخصيص مشاهدة الألبومات . التبديل السريع الى الخصوصية إذا كنت تريد إدارة التخصيص </p>
+
+<p>يمكنك تعيين البوم خاص من خلال تحريره بمفرده
+(<span class="pwgScreen">الإدارة &raquo; الألبومات &raquo;  إدارة 
+&raquo; تحرير </span>) او عن  طريق وضع و اختيار  الألبومات  في  أي خانة الخاص  أو العام
+(<span class="pwgScreen"> الإدارة  &raquo;  الألبومات &raquo;
+الخصائص  &raquo;  ألبوم عام  / ألبوم خاص  </span>).</p>
+
+<p>
+وضعية تخصيص الالبومات ، تستطيع إدارة التخصيص للمجموعات و المستخدمين في ثلاث شاشات :</p>
+
+<ul>
+
+  <li><span class="pwgScreen"> الإدارة &raquo;  المستخدمين  &raquo; إدارة &raquo;
+إجراء التفضيلات  </span> (رابط واحد لكل مستخدم )</li>
+
+  <li><span class="pwgScreen">الإدارة   &raquo; المستخدمين  &raquo; المجموعات &raquo;
+   الاجراءات لكل مجموعه</span> (رابط لكل مجموعة)</li>
+
+  <li><span class="pwgScreen">الإدارة &raquo; الألبومات &raquo;  إدارة  &raquo; تحرير الألبوم و إجراء نقل الالبومات </span> (رابط لكل ألبوم)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ar_SA/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>عرض صورة في ألبوم آخر  </p>
+
+<p>تستطيع ربط صورة واحدة أو أكثر في أكثر من البوم  دون ان تتكرر هذه الصورة ودون الحاجة لاعادة تحرير معلوماتها  مرة أخرى ،تستطيعع ذلك من خلال ايوقنة ا  التحرير الظاهرة  في كل صورة اثناء التصفح ( هذه الايقونة مخصصة فقط للمدير ) ـ </p>
+
+
+<p>لربط الصورة لاي ألبوم من نموذج تحرير الصورة  ( يمكن  لمدير المعرض الوصول لاي صورة و تحريرها عبر تصفحة المعرض ) ـ</p>
+
+<p>كذلك يمكنك  تصنيف الصور في الالبومات بهذه الطريقة ، لانشاء ألبوم <span class="pwgScreen"> الإدارة  &raquo;  الألبومات  &raquo;
+إدارة  </span>.</p>
Index: tags/2.4.0RC3/language/ar_SA/help/history.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/history.html	(revision 14585)
@@ -0,0 +1,41 @@
+<h2>التاريخ</h2>
+
+<p>على هذه الشاشات، يمكنك مراقبة تاريخ زيارات المعرض
+وفقا للخيارات التي اخترتها في -- إدارة &raquo; التكوين&raquo; تاريخ &raquo; المؤشر .</p>
+
+<h3>إحصاءات</h3>
+<ul>
+<p>إذا كنت قد اخترت تسجيل (<span
+class="pwgScreen">index.php</span>و<span
+class="pwgScreen">picture.php</span>(الصفحات التي تمت زيارتها في الجدول
+<code>التاريخ</code>,
+يمكنك متابعة هذه من هذا التبويب.</p>
+
+<li><strong>الإحصاءات العالمية</strong>: الزيارات سنويا.</li>
+
+<li><strong>إحصاءات سنوية</strong>: زيارة شهريا في العام المحدد.</li>
+
+<li><strong>إحصاءات شهرية</strong>: الزيارات في الأيام في الشهر المحدد.</li>
+
+<li><strong>الإحصائيات اليومية</strong>: الزيارات لكل ساعة في اليوم المحدد.</li>
+
+</ul>
+
+<h3>البحث</h3>
+<ul>
+<p>إذا كنت قد اخترت تسجيل (<span
+class="pwgScreen">index.php</span> و <span
+class="pwgScreen">picture.php</span>زار صفحات في الجدول(
+<code>التاريخ </code>، يمكنك استعراض تفاصيل الصفحات التي تمت زيارتها
+من هذا التبويب ، بمساعدة مرشحات مختلفة.</p>
+
+<li><strong>تصفية لكل تاريخ</strong> : اختر مدى التاريخ الذي تريد مراقبة الأنشطة.</li>
+
+<li><strong>تصفية لكل نوع من العنصر</strong>: اختيار نوع العنصر الذي تريده مراقبة نشاطه.</li>
+
+<li><strong>تصفية لكل مستخدم</strong>: اختر المستخدم الذي تريد مراقبة نشاطه.</li>
+
+<li><strong>تصفية لكل اسم ملف</strong> : اختر اسم الملف الذي تريد مراقبة نشاطه.</li>
+
+<li><strong>تصفية لكل معرف  صورة r</strong>: اختر معرف صورة تريد مراقبة نشاطه.</li>
+</ul>
Index: tags/2.4.0RC3/language/ar_SA/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/maintenance.html	(revision 14585)
@@ -0,0 +1,52 @@
+<h2>الاصلاحات</h2>
+
+<p>لتحسين وقت انشاء الصفحة، Piwigo يستخدم مؤقتا
+المعلومات. على سبيل المثال ، بدلا من احصاء عدد الصور
+المتضمنة في كل ألبوم في كل تحديث، يتم تخزين هذه المعلومات في قاعدة البيانات. من الناحية النظرية ، ينبغي أن تكون هذه المعلومات صحيحة دائما، ولكن أحيانا يحدث خطأ ويمكن أن تصبح المعلومات المخزنة مؤقتا خاطئة.</p>
+
+<p>بعض المعلومات تصبح عديمة الفائدة مع مرور الوقت مع مرور الوقت. حذف هذه المعلومات عديمة الفائدة من قاعدة البيانات تجعلك توفر مساحة على القرص.</p>
+
+<ul>
+
+<li>
+<strong>الصور غير المرتبطة:</strong>
+   عرض الصور التي لا ترتبط إلى أي ألبوم وهمي.
+</li>
+<li>
+<strong>ملفات تحمل الاسم نفسه في أكثر من ألبوم حقيقي واحد :</strong>
+     عرض الصور أو ملفات التي وجدت في نفس اسم الملف في
+ألبومات عدة.
+</li>
+
+</ul>
+
+<ul>
+
+<li><strong>تحديث معلومات الألبومات :</strong> Fأو كل الألبوم،
+يتم التحقق من المعلومات التالية ، وتحديث إذا لزم الأمر : قائمة الألبومات الأصل، وعدد من الصور وتاريخ آخر الصورة، بين موقع الألبومات المتشابهة، وموقع بين جميع الالبومات. هذا الإجراء أيضا يتحقق ثبات الصور الممثلة.</li>
+
+<li><strong>تحديث معلومات الصور :</strong> عن كل صورة،
+معلومات محدثة : المسار الكامل إلى الملف متوسط التقييم.<em>تحذير</em>, لا تخلط الامور : المعلومات الوصفية تكون متزامنة من<span class="pwgScreen">الادارة &raquo;
+   الادوات &raquo; التزامن</span>, أو في شاشة تعديل صورة واحدة (من خلال<span class="pwgScreen">صورة</span> على سبيل المثال).</li>
+
+<li><strong>إصلاح وتحسين قاعدة البيانات :</strong>
+  تنفيذ إعادة ترتيب وإصلاح وتحسين العمليات على كل جدول من قاعدة البيانات.
+</li>
+</ul>
+
+<ul>
+<li><strong>تفاصيل إزالة التاريخ :</strong> حذف كافة الأسطر من
+<code>التاريخ</code> جدول. الشاشة <span
+class="pwgScreen">الادارة &raquo;
+   الادارة &raquo; التاريخ</span>لن تظهر معلومات التاريخ الماضي لفترة أطول<em>Warning</em>: سيتم فقدان كافة البيانات، من دون أي طريقة للحصول عليها مرة أخرى.</li>
+
+<li><strong>إزالة ملخص التاريخ :</strong> حذف كافة معلومات ملخص التاريخ عن تاريخ الزيارة. ويحسب هذا التلخيص من تفاصيل التاريخ.</li>
+
+<li><strong>إزالة الجلسات :</strong> حذف جلسات عمل المستخدم منتهية الصلاحية.</li>
+
+<li><strong>إزالة الإخطارات المستخدمة</strong></li>
+
+<li><strong>ازالة تاريخ الحذف</strong></li>
+
+<li><strong>إزالة النماذج المترجمة</strong></li>
+</ul>
Index: tags/2.4.0RC3/language/ar_SA/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,16 @@
+<h2>اخطار بالايميل</h2>
+
+<p>تسمح هذه الشاشة لتكوين وإدارة البريد الإلكتروني للمستخدمين ، لإخطارهم من التغييرات على موقعك.</p>
+
+<p>تضم هذه الشاشة 3 علامات التبويب:</p>
+
+<h3>المعايير</h3>
+<p>متاحة فقط لأصحاب المواقع، هذا التبويب مجموعات بارامترات
+إخطار عن طريق البريد.</p>
+
+<h3>اشترك</h3>
+<p>متاحة فقط لأصحاب المواقع، هذا التبويب تدير المستخدمين
+اشتراك / إلغاء الاشتراك في تبليغات البريد الإلكتروني.</p>
+
+<h3>Envoi</h3>
+<p>متاحة فقط لأصحاب المواقع والإداريين، هذا التبويب يسمح بإرسال رسائل إخطار عن التغييرات.</p>
Index: tags/2.4.0RC3/language/ar_SA/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/permalinks.html	(revision 14585)
@@ -0,0 +1,9 @@
+<h2>الرابط النهائي</h2>
+
+<p>الرابط النهائي تستخدم لجعل عناوين الألبوم أجمل. عندما ألبوم له الرابط الدائم محددة ، غير مطلوب معرف الالبوم بعد الان</p>
+
+<p>عندما تم حذف الرابط الدائم، يمكنك حفظه في تاريخ الرابط الدائم
+، بحيث الارتباطات الخارجية للصفحات Piwigo لا تزال تعمل. في
+جدول تاريخ الرابط الدائم تستطيع أن ترى تاريخ حذف الرابط الدائم، آخر مرة تم استخدامه وعدد مرات هذا الرابط الدائم قد استخدمت.</p>
+
+<p>لاحظ أن الرابط الدائم يجب أن تكون فريدة لكل البوم. أيضا في جدول تاريخ الرابط الدائم لا يمكن أن يكون نفس جدول تاريخ الرابط الدائم معرف أكثر من مرة.</p>
Index: tags/2.4.0RC3/language/ar_SA/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,120 @@
+<fieldset>
+<legend>بداية سريعة</legend>
+
+<ol>
+<li>انشاء مجلد في جهازك.</li>
+
+<li>انسخ بعض الصور في المجلد,قم بتغيير الحجم للعرض في الويب
+<em>تحذير</em>: اسم المجلد او الملف يجب ان يحتوي على حروف, الارقام, "-", "_" او ".". لا فواص ولا حتى احرف مبرزة/li>
+
+<li>باستخدام برنامج (FTP) قم بنسخ الصور من جهازك  الى معرضك</li>
+
+<li>سجل الدخول في معرضك واذهب الى <span class="pwgScreen">الادارة
+&raquo; الادوات &raquo; الصور المصغرة</span> لانشاء صور مصغرة مفقودة.</li>
+
+<li>اذهب الى <span class="pwgScreen">الادارة</span> وانقر على زر التزامن الكبير</li>
+</ol>
+
+تهانينا لقد خلقت اول البوم في معرضك
+</fieldset>
+
+<fieldset>
+<legend>تنظيم المجلدات والملفات</legend>
+
+<ul>
+
+<li>
+
+<p>مجلد الالبوم هو في مجلد PIWIGO
+     "معرض". وفي ما يلي دليل شجرة صغيرة جدا
+المعرض (ولكن
+به العديد من الميزات:</p>
+
+<pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- album-1
+|   |   |-- album-1.1
+|   |   |   |-- album-1.1.1
+|   |   |   |   |-- album-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- album-1.1.1.2
+|   |   |   +-- album-1.1.2
+|   |   |-- album-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- album-1.3
+|   +-- album-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- local
+|-- plugins
+|-- template-extension
+|-- themes
++-- tool</pre>
+
+</li>
+
+<li>باستثناء تلك المسماة "تصغير"، "pwg_high "
+"pwg_representative"(انظر شرح أدناه)، تحت كل مجلد
+"معرض" تنتج ألبوم, لا يوجد حد في العمق,</li>
+
+<li>في الأساس ، اي عنصر يمثل ب ملف, يمكن أن يكون ملف
+عنصر Piwigo إذا كان امتداده بين <code>file_ext</code>
+   إمكانيات اعدادات (انظر <span
+   class="filename">include/config_default.inc.php</span> ملف). يمكن أن يكون الملف صورة إذا كان امتداده بين <code>picture_ext</code>
+   إمكانيات اعدادات.</li>
+
+<li>عناصر الصور يجب يكون لها ذات الصلة صورة مصغرة (انظر المقطع أدناه حول الصور المصغرة)</li>
+
+<li>عناصر الصور يمكن أن يكون لها جودة عالية من ملف مرتبط بها أما بالنسبة
+wedding.jpg في المثال أعلاه, بدون اختصار على الصورة ذات الجودة العالية</li>
+
+<li>ليس اي عناصر من الصورة (نصوص ملف الفيديو والأصوات، كل ما تريد...
+يتم تمثيلها بواسطة الافتراضي بأيقونة المقابلة لملحق اسم الملف, اختياريا ، يمكنك ربط الصورة المصغرة و الملف الممثل لها (انظر video.avi في المثال أعلاه),</li>
+
+<li><em>تحذير</em>اسم المجلد او الملف يجب ان يحتوي على حروف, الارقام, "-", "_" او ".". لا فواص ولا حتى احرف مبرزة/li>
+
+<li>بمجرد، الملفات والصور المصغرة والصور الممثلة يتم وضعها بشكل صحيح في
+    المجلدات، انتقل إلى : <span class="pwgScreen">الادارة &raquo;
+الادوات &raquo;
+   التزامن</span></li>
+
+</ul>
+</fieldset>
+
+<fieldset>
+<legend>الصور الممثلة</legend>
+<ul>
+
+<li>كل صورة يجب ان تملك صورة مصغرة</li>
+
+<li>يتم تخزين الصور المصغرة في "الصورة المصغرة" الفرعي في مجلدالالبوم
+والصورة المصغرة لها نفس اسم الملف كما الصورة المناظرة، مع اعدادات المعايير <code>prefix_thumbnail</code> كما بادئة (انظر <span class="filename">include/config.inc.php</span>).</li>
+
+<li>ملفات الصور المصغرة وليس من الضروري ان يكون ملحقها نفس
+الصورة المرتبطة بها (على سبيل المثال " JPG" صورة قد يكون لها ملحق " GIF").</li>
+
+<li>من المستحسن استخدام وحدة خارجية انشاء صورة مصغرة</li>
+
+<li>إستخدام أداة إنشاء الصورة المصغرة المتكاملة في Piwigo هو
+ليس من المستحسن، وذلك لأن جودة الناتجة قد تكون مخيبة للآمال، وهذا سوف تقع بشكل كبير على موارد الخادم (والتي يمكن أن يمثل مشكلة خطيرة على خادم مشترك)
+
+<li>إذا اخترت استخدام خادم الويب ل إنشاء الصور المصغرة ، يجب السماح حق الوصول للكتابة على كافة مجلدات الالبومات</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ar_SA/help/search.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/search.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>البحث</h2>
+
+<p>تتيح لك هذه الصفحة البحث عن صورة في كل المعرض</p>
+
+<dl>
+
+<dt>البحث عن كلمات</dt>
+<dd>البحث ل واحدة أو عدة كلمات ضمن سمات ذات الصلة
+صور المعرض الخاص بك. استخدام * كعلامة شاملة للمطابقة الجزئية.</dd>
+
+<dt>البحث عن مؤلف</dt>
+<dd>استخدام * كعلامة شاملة للمطابقة الجزئية.</dd>
+
+<dt>البحث بالتاريخ</dt>
+<dd>دد تاريخا و / أو تاريخ إنهاء للاستعلام. ترك حقل تاريخ فارغ إذا كان كنت تريد أن تجعل من "قبل" الاستعلام. يجب إدخال السنة في الحقل الأخير في الشكل التالي : AAAA (مثال 2004)</dd>
+
+<dt>البحث في الالبومات</dt>
+<dd>حدد الألبوم أو الالبومات التي تريد البحث. جميع
+الالبومات الفرعية يمكن البحث عن طريق اختيار الألبوم الأصل و إعداد تمكين البحث في الالبومات الفرعية أدناه.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ar_SA/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/site_manager.html	(revision 14585)
@@ -0,0 +1,41 @@
+<h2>المواقع البعيدة</h2>
+
+<p>Piwigo توفر إمكانية استخدام عدة خادمات لتخزين
+الصور التي سوف تشكل معرض الصور الخاص بك. ويمكن أن يكون مفيدا إذا تم تثبيت معرض الصور الخاص بك على مساحة محدودة وكان لديك كمية كبيرة من الصور للعرض.</p>
+
+<ol>
+
+<li>تعديل ملفe <span
+class="filename">tools/create_listing_file_local.inc.php</span>,
+   عن طريق تعديل معايير القسم مثل
+<code>$conf['prefix_thumbnail']</code> or
+<code>$conf['use_exif']</code>.</li>
+
+<li>باستخدام بروتوكول نقل الملفات، ضع الملفات<span
+class="filename">tools/create_listing_file.php</span>
+   و <span
+class="filename">tools/create_listing_file_local.inc.php</span>(تعديل) على موقع الويب البعيد الخاص بك ، في نفس المجلد كما مجلد ألبومك (حسب المجلد<span class="filename">المعرض</span> ي هذا الموقع). على سبيل المثال، دعنا نقول أنه يمكنك الوصول <span
+   
+class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+<li>اذهب الى <span class="pwgScreen">لوحة التحكمl &raquo; الادوات
+&raquo; ادارة الموقع</span>. اسئل ل انشاء موقع جديد, مثال <span
+   class="filename">http://example.com/galleries</span>.</li>
+
+<li>موقع بعيد تم انشائه يمكنك القيام باربعة امور :
+
+<ol>
+
+<li><strong>إنشاء قائمة</strong>: تطلق طلب بعيد لإنشاء قائمة ملف بعيد</li>
+
+<li><strong>تزامن</strong> تقرأ البعيد :<span
+       class="filename">listing.xml</span> ملف بالتزامن مع معلومات قاعدة البيانات</li>
+
+<li><strong>clean</strong> حذف البعيد:<span
+       class="filename">listing.xml</span> الملف</li>
+
+<li><strong>حذف</strong>: حذف موقع (وجميع الألبومات ذات الصلة ، و الصور) في قاعدة البيانات</li>
+
+</ol>
+</li>
+</ol>
Index: tags/2.4.0RC3/language/ar_SA/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/synchronize.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>التزامن</h2>
+
+<p>هناك نوعين مختلفين من التزامن : المجلدات / الملفات والبيانات الوصفية . المجلدات / الملفات تزامن معلومات عن مع شجرة شجرة الألبوم في قاعدة البيانات. البيانات الوصفية هو تحديث المعلومات عن الصور مثل حجم الملف، والأبعاد بالبكسل معلومات EXIF أو IPTC.</p>
+
+<p>ويجب أن يكون التزامن الأول ل المجلدات / الملفات واحدة.</p>
+
+<p>المزامنة عملية قد تستغرق وقتا طويلا (اعتمادا على تحميل الخادم وكمية في العناصر لالمراد ادارتها) لذلك فمن الممكن أن تفعل ذلك ألبوم بعد ألبوم.</p>
Index: tags/2.4.0RC3/language/ar_SA/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>انشاء الصور المصغرة</h2>
+
+<p>هذه اصفحة تجعلك تخلق الصور المصغرة المفقودة, ينصح بعدم استخدام هذه الخاصية
+في الاستضافات المشتركة</p>
+
+<dl>
+
+<dt>GDاصدار </dt>
+
+<dd>GD هي انشاء صورة مصغرة مكتبة PHP . اختر إصدار يعمل
+    المثبتة على الخادم الخاص بك. سيتم تحذيرك من رسالة خطأ،
+يجب عليك أن تختار واحدة خاطئة، ارجع إلى الصفحة السابقة مع المتصفح الخاص بك واختر إصدار يعمل أخرى. إذا لم يكن هناك
+إصدار يعمل، ثم الملقم لا يدعم تلك الاصدار من  </dd>
+
+<dt>الطول والعرض</dt>
+
+<dd>الحد الأقصى للابعاد الصورة المصغرة . نسبة الارتفاع الأصلي هو
+محفوظ يمكن تعديل القيم الافتراضية باستخدام ضبط اعدادات المعايير <code>tn_width</code> and
+<code>tn_height</code> (انظر<span
+class="filename">include/config_default.inc.php</span> file).</dd>
+
+<dt>عدد الصور المصغرة للانشاء</dt>
+
+<dd>لا تحاول لتصغير الصور كثيرة جدا في آن واحد.
+عملية التصغير لا تستخدم الكثير من وحدة المعالجة المركزية. إذا كان Piwigo المعرض الخاص بك يتم استضافتها من قبل مزود مجانا، استخدام وحدة المعالجة المركزية عالية جدا قد تؤدي الى حمل الغاء موقع الويب الخاص بك.</dd>
+
+<dt>تنسيق الملف</dt>
+
+<dd>يتم إنشاء الصور المصغرة في تنسيق ملف JPEG. أنها
+    يمكن أن تنشأ من صور PNGو JPEG فقط.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ar_SA/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/ar_SA/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/help/user_list.html	(revision 14585)
@@ -0,0 +1,29 @@
+<h2>قوائم المستخدمون</h2>
+
+<p>هذا هو المكان المناسب لإدارة الخصائص للمستخدمين المسجلين، ما عدا
+الصلاحيات التي تدار من الشاشات الاخرى.</p>
+
+<h3>اضافة مستخدم</h3>
+
+<p>المسؤولون بامكانهم اضافة مستخدم يدويا</p>
+
+<h3>قوائم المستخدمون</h3>
+
+<p>ويمكن تصفية قائمة على اسم المستخدم (* استخدامها بدل اي حرف)، مجموعة او
+الحالة. يمكن ان يكون الامر حسب تاريخ التسجيل أو اسم المستخدم ، بالترتيب التصاعدي
+أو تنازلي.</p>
+
+<p>هذه الشاشة تسمح إدارة العديد من المستخدمين في آن واحد، وذلك باستخدام إجراءات مختلفة :</p>
+
+<ul>
+
+<li>حذف المستخدمين (يتطلب تأكيد)</li>
+<li>تغيير حالة</li>
+<li>اضافة او ازالة الى مجموعه</li>
+<li>تعديل اعدادات العرض</li>
+<li>تعديل خصائص اضافية</li>
+
+</ul>
+
+<p>الهدف هو تحديد (افتراضيا) أو لكافة المستخدمين كما
+تم عرضها في قائمة تمت تصفيتها.</p>
Index: tags/2.4.0RC3/language/ar_SA/index.php
===================================================================
--- tags/2.4.0RC3/language/ar_SA/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ar_SA/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ar_SA/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'التثبيت ';
+$lang['Basic configuration'] = 'التكوينات الأساسية';
+$lang['Default gallery language'] = 'اللغة الافتراضية للمعرض';
+$lang['Database configuration'] = 'تكوين قاعدة البيانات';
+$lang['Admin configuration'] = 'اعدادات المدير';
+$lang['Start Install'] = 'ابدأ التثبيت';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'البريد يجب ان يكون على هذه الهيئة xxx@yyy.ee ( مثلاً : Jack@altern.org)';
+$lang['Webmaster login'] = 'دخول المدير';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'سوف تظهر للزوار ، ضرورية للادارة و لوحة التحكم';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'تم الاتصال بالخادم الموقع ، لكن لم يتم يتم الاتصال بقاعدة البيانات';
+$lang['Can\'t connect to server'] = 'لا يمكن الاتصال بالخادم';
+$lang['Host'] = 'المضيف';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'المستخدم';
+$lang['user login given by your host provider'] = 'اصرح للمستخدم  الدخول بواسطة المضيف الخاص بك';
+$lang['Password'] = 'كلمة المرور';
+$lang['user password given by your host provider'] = 'اعطي  للمستخدم كلمة المرور  بواسطة المضيف الخاص بك';
+$lang['Database name'] = 'أسم قاعدة البيانات';
+$lang['also given by your host provider'] = 'ايضا بواسط المضيف الخاص بك ';
+$lang['Database table prefix'] = 'بداية جداول قاعدة البيانات';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'الاسماءالمبتدأ في جداول قاعدة البيانات ( تمكنك من أدارة قاعدة البيانات بشكل أفضل)ـ';
+$lang['enter a login for webmaster'] = 'دخول مدير الموقع';
+$lang['webmaster login can\'t contain characters \' or "'] = 'دخول المدر لا \ يمكن تتضمن الأحرف  \' أو "';
+$lang['please enter your password again'] = 'فضلا ً أعد كتابة كلمة المرور مرةأخرى';
+$lang['Webmaster password'] = 'كلمة مرور مدير الموقع';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'ابقائه سريا، فإنه يتيح لك الوصول إلى لوحة الإدارة';
+$lang['Password [confirm]'] = 'كلمة المرور [confirm]';
+$lang['verification'] = 'التحقق';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'هل تحتاج لمساعده؟ يمكنك السؤال  <a href="%s">Piwigo لجنة الأسئلة في </a>.';
+$lang['Webmaster mail address'] = 'بريد مدير الموقع';
+$lang['Visitors will be able to contact site administrator with this mail'] = ' سيتمكن الزوار لاستخدام هذا البريد إلى الاتصال بالمسؤول عن الموقع';
+$lang['PHP 5 is required'] = 'مطلوب  PHP 5 ';
+$lang['It appears your webhost is currently running PHP %s.'] = 'PHP %s يبدوا أن المضيف يستخدم حاليا ';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'قد يحاول تبديل التكوين الخاص بك إلىPHP 5 عن طريق إنشاء أو تعديل ملف htaccess . Piwigo ';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'ملاحظة يمكنك تغيير التكوين الخاص بك من نفسك وإعادة Piwigo بعد ذلك.';
+$lang['Try to configure PHP 5'] = 'PHP 5 محاولة تكوين ';
+$lang['Sorry!'] = 'مـعـذرة !1';
+$lang['Piwigo was not able to configure PHP 5.'] = ' Piwigo غير قادر على تكوين PHP 5';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'تحقق من مزود الاستضافة حول دعمه لـ PHP 5';
+$lang['Hope to see you back soon.'] = 'نأمل أن نرى عودتك إلى هنا قريبا';
+$lang['Congratulations, Piwigo installation is completed'] = 'تم بحمد الله تثبيت معرضPiwigo  بنجاح  ، مبروك ';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'حل آخر هو نسخ النص في المربع أعلاه ولصقه في ملف"local/config/database.inc.php" (تحذير : database.inc.php يجب أن تحتوي فقط ما هو موجود في   النص،  الخط أو حرف مسافة)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'فشل في إنشاء ملف التكوين local/config/database.inc.php ';
+$lang['Download the config file'] = 'تحميل ملف التكوين';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'يمكنك تحميل ملف التكوين وتحميله إلى الدليل المحلي';
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'لاتتردد في طلب الإستشارة و الاستفسار من خلال منتدانا للمساعده : %s';
+$lang['Just another Piwigo gallery'] = 'معرض آخر من Piwigo';
+$lang['Welcome to my photo gallery'] = 'مرحباً بك في معرض الصور';
+$lang['Welcome to your new installation of Piwigo!'] = 'مرحبا بكم في التثبيت الجديد من Piwigo!';
+?>
Index: tags/2.4.0RC3/language/ar_SA/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ar_SA/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+العربية [AR]
Index: tags/2.4.0RC3/language/ar_SA/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ar_SA/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ar_SA/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'تحديث';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'معالجة التحديث يقترح تحديث قاعدة البيانات القديمة الخاصة بـ Piwigo من الاصدار القديم إلى الاصدار الجديد . مساعد الترقية يتعقد انك جاليا ً تشغل<strong> %s الأصدار </strong> ( أو ما يعادلها ).';
+$lang['Upgrade from version %s to %s'] = '%s إلى %s التحديث من الأصدار';
+$lang['Statistics'] = 'إحصاءات';
+$lang['total upgrade time'] = 'الوقت الذي يحتاجه التحديث';
+$lang['total SQL time'] = 'الوقت الذي يجتاجه المزو SQL';
+$lang['SQL queries'] = ' SQLمزود الاستعلامات';
+$lang['Upgrade informations'] = 'ترقية المعلومات ';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'للفحص والتدقيق والصيانى  [الإدارة>أدوات>الصيانة] إذا واجهتك أي مشكلة  ';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'كأجراء وقائي يجب تعطيل الاضافات ، كما ينبغي التأكد من وجود تحديثات جديدة لهذه الاضافات';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'فقط يمكن للمسؤول تشغيل الترقية : الرجاء تسجيل الدخول أدناه.';
+$lang['You do not have access rights to run upgrade'] = 'ليس لديك حقق الوصول  في تشغيل الترقية';
+$lang['All sub-albums of private albums become private'] = 'جميع البومات الفرعية من الألبومات الخاصة أصبحت خاصة';
+$lang['User permissions and group permissions have been erased'] = 'تم مسح للمستخدمين وأذونات المجموعات';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'تم حفظ بدائة الصور المصغرة ، و عنواين مدير الموقع حفظت من التكوين السابق';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'في <i>%s</i>, قبل <b>?></b>, إدراج:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'للاحتياط,الثيمات التالية تم الغاء تفعيلها.يجب ان تقوم بعملية تحديث للثيمات قبل تفعيلها';
+
+?>
Index: tags/2.4.0RC3/language/bg_BG/about.html
===================================================================
--- tags/2.4.0RC3/language/bg_BG/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/about.html	(revision 14585)
@@ -0,0 +1,15 @@
+<p>Тази фотогалерия e базирана на Piwigo.</p>
+
+<p>Piwigo е интернет приложение,  разработено от активна общност от потребители и разработчици. Допълнителните разширения, правят Piwigo лесен за персонализиране. Черешката на тортата е, че Piwigo е безплатен и с отворен код.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Посетете страницата на  Piwigo</a></p>
+
+<p>Българският превод  се поддържа от (по азбучен ред):
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=7483">hamsia</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=14471">josifbg</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=13458">n0kS</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16006">turnokopa</a></li>
+
+    </ul>
+           .... благодарности</p>
Index: tags/2.4.0RC3/language/bg_BG/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/bg_BG/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/admin.lang.php	(revision 14585)
@@ -0,0 +1,202 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Hello'] = 'Здравей';
+$lang['Notification'] = 'RSS';
+$lang['File'] = 'Файл';
+$lang['Preferences'] = 'Предпочитания';
+$lang['Rate'] = 'Оценка';
+$lang['Average rate'] = 'Средна оценка';
+$lang['Zoom'] = 'Увеличи';
+$lang['Add to caddie'] = 'Добави в кутийката';
+$lang['Width'] = 'Ширина';
+$lang['With blank value, gallery title will be used'] = 'Ако е празно, името на галерията ще се ползва';
+$lang['With no album'] = 'Без албум';
+$lang['With no tag'] = 'Без етикет';
+$lang['With no virtual album'] = 'Без виртуален албум';
+$lang['wrong filename'] = 'грешно име на файл';
+$lang['Year'] = 'Година';
+$lang['You are running on development sources, no check possible.'] = 'Вие сте стартирали разработващ се код, невъзможна проверка.';
+$lang['You are running the latest version of Piwigo.'] = 'Вие използвате последната версия на Piwigo.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Вие ползване качване през браузъра. Пробвайте <a href="%s">Флаш качване</a> като алтернатива.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Вие използвате Флаш качване. Проблеми? Пробвайте <a href="%s">качване през браузър</a> като алтернатива.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Може да надстроите до Piwigo %s направо, без актуализация с Piwigo %s (recommended).';
+$lang['You cannot delete your account'] = 'Вие не може да изтриете акаунта си';
+$lang['You cannot move an album in its own sub album'] = 'Не може да преместите албум в негов собствен под-албум';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Не може да дефинирате ред на снимките по подразбиране, заради потребителските Ви настройки в локалната конфигурация.';
+$lang['You have %d orphan tags: %s.'] = 'Имате %d необвързани етикети: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Вие сте задали <i>$conf[\'order_by\']</i> в локалния си конфигурационен файл, този параметър не се използва вече, моля премахнете го или го преименувайте на<i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Вие се абонирахте да получавате известия по имейл.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Вие прекратихте абонамента си за уведомяване по имейл.';
+$lang['You might go to plugin list to install and activate it.'] = 'Идете на списъка с добавки за да го инсталирате и активирате.';
+$lang['You need to confirm deletion'] = 'Трябва да потвърдите изтриването';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Необходимо е да актуализирате вашата система за да може да използвате пълните функции на програмата, в противен случай тя може да не работи коректно или изцяло';
+$lang['Your configuration settings are saved'] = 'Вашите конфигурационни настройки са записани';
+$lang['[%s] Visit album %s'] = '[%s] Посетен албум %s';
+$lang['[NBM] Problems or questions'] = '[NBM] Проблеми или въпроси';
+$lang['Resize after upload'] = 'Промени размера след качването';
+$lang['Original Size'] = 'Оригинален размер';
+$lang['A locked gallery is only visible to administrators'] = 'Заключена галерия е видима само за Администратори';
+$lang['Unlock gallery'] = 'Отключи галерията';
+$lang['Gallery unlocked'] = 'Галерията е отключена';
+$lang['%d albums moved'] = '%d албуми са преместени';
+$lang['%d group'] = '%d група';
+$lang['%d groups'] = '%d групи';
+$lang['%d guest'] = '%d посетител';
+$lang['%d guests'] = '%d посетители';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ВНИМАНИЕ!Тази добавка не е съвместима с тази версия на Piwigo.';
+$lang['Week starts on'] = 'Седмицата започва от';
+$lang['Who can see these photos?'] = 'Кой може да види тези снимки?';
+$lang['Who can see this photo?'] = 'Кой може да види тази снимка?';
+$lang['width must be a number superior to'] = 'ширината трябва да бъде число, по-голямо от';
+$lang['Notification'] = "Съобщение";
+$lang['Upload Photos'] = 'Качи Снимки';
+$lang['Select an album'] = 'Избери Албум';
+$lang['... or '] = '... или ';
+$lang['create a new album'] = 'създай нов албум';
+$lang['Select files'] = 'Избери файлове';
+$lang['Start Upload'] = 'Стартирай Качването';
+$lang['Learn more'] = 'Научи повече';
+$lang['Maximum file size: %sB.'] = 'Максимален размер на файла: %sB.';
+$lang['Allowed file types: %s.'] = 'Позволени файлови формати: %s.';
+$lang['+ Add an upload box'] = '+ Добави кутийка за качване';
+$lang['Add another set of photos'] = 'Добави друг набор от снимки';
+$lang['Photo %s of %s'] = 'Снимка %s на %s';
+$lang['%d photos uploaded'] = '%d качени снимки';
+$lang['All %d photos are selected'] = 'Всички %d снимки са селектирани';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Вие използвате качване през Браузер. Можете да превключите в режим <a href="%s">Качване чрез Флаш</a>.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Вие използвате качване чрез Флаш. Имате проблем? Можете да превключите в режим <a href="%s">Качване през Браузер</a>.';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif форматът не е разрешен, администратора трябва да забрани използването на exif';
+$lang['Hide'] = "Скрий";
+$lang['ACCESS_0'] = "Свободен достъп";
+$lang['ACCESS_1'] = "Достъп за всички";
+$lang['ACCESS_2'] = "Достъп за регистрирани потребители";
+$lang['ACCESS_3'] = "Достъп за администратори";
+$lang['ACCESS_4'] = "Достъп за уебмастери";
+$lang['ACCESS_5'] = "Достъп забранен";
+$lang['Level 1'] = "Контакти";
+$lang['Level 2'] = "Приятели";
+$lang['Photo Properties'] = 'Настройки на снимките';
+$lang['Photo name'] = 'Име на снимката';
+$lang['Name'] = 'Име';
+$lang['Description'] = 'Описание';
+$lang['Parent album'] = 'Родителски албум';
+$lang['Album name'] = 'Име на албума';
+$lang['Create'] = 'Създай';
+$lang['Level 4'] = "Семейство";
+$lang['Level 8'] = "Администратори";
+$lang['Informations'] = "Информация";
+$lang['Discover album:'] = "Разгледайте албум:";
+$lang['See you soon.'] = "До скоро.";
+$lang['Hello,'] = "Здравейте,";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "Администраторът на сайта Ви е абонирал за получаване на известия по пощата.";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "Администраторът на сайта Ви е отписал от абонамента за получаване на известия по пощата.";
+$lang['New photos were added'] = "Нови снимки са добавени";
+$lang['on'] = "на";
+$lang['between'] = "между";
+$lang['Go to'] = "Посетете";
+$lang['See you soon,'] = "До скоро,";
+$lang['To unsubscribe'] = "За да се отпишете от абонамента";
+$lang['To subscribe'] = "За да се абонирате";
+$lang['If you encounter problems or have any question, please send a message to'] = "Ако имате проблеми или въпроси, моля изпратете съобщение до";
+
+$lang['This album contains %d photos, added on %s.'] = 'Този албум съдържа %d фотографиии, добавени на %s';
+$lang[' and %d virtual'] = 'и %d витруален';
+$lang['%d album including'] = '%d албум наличен';
+$lang['%d album moved'] = '%d албум преместен';
+$lang['%d albums including'] = '%d налични албума';
+$lang['%d anomalies have been detected corrected.'] = '%d открити и оправене проблема ';
+$lang['%d anomalies have been detected.'] = '%d открити проблема ';
+$lang['%d anomalies have been ignored.'] = '%d игнорирани проблема ';
+$lang['%d anomalies have not been corrected.'] = '%d неоправени проблема';
+$lang['%d anomaly has been corrected.'] = '%d оправен проблем';
+$lang['%d anomaly has been detected.'] = '%d открит проблем';
+$lang['%d anomaly has been ignored.'] = '%d игнориран проблем';
+$lang['%d anomaly has not been corrected.'] = '%d неоправен проблем';
+$lang['%d mail was not sent.'] = '%d имейл не е изпратен';
+$lang['%d mail was sent.'] = '%d изпратен имейл';
+$lang['%d mails were not sent.'] = '%d имейли не са изпратени';
+$lang['%d mails were sent.'] = '%d изпратени имейли';
+$lang['%d member'] = '%d потребител';
+$lang['%d members'] = '%d потребители';
+$lang['%d of %d photos selected'] = '%d от %d избрани снимки';
+$lang['%d parameter was updated.'] = '%d запаметена стойност';
+$lang['%d parameters were updated.'] = '%d запаметени стойности';
+$lang['%d photo was deleted'] = '%d изтрита снимка';
+$lang['%d photos were deleted'] = '%d изтрити снимки';
+$lang['%d tag'] = '%d таг';
+$lang['%d tags'] = '%d тагове';
+$lang['%d user deleted'] = '%d изтрит потребител';
+$lang['%d users deleted'] = '%d изтрити потребители';
+$lang['%d users'] = '%d потребители';
+$lang['%d waiting for validation'] = '%d чакат за потвърждение';
+$lang['%d user was not updated.'] = '%d потребител не е актуализиран';
+$lang['%d user was updated.'] = '%d актуализиран потребител';
+$lang['%d user'] = '%d потребител';
+$lang['%d users were not updated.'] = '%d не актуализирани потребители';
+$lang['%d users were updated.'] = '%d актуализирани потребители';
+$lang['%s has been successfully updated.'] = '%d са успешно актуализирани';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u потребители имат автоматичен достъп, като част от сигурна група';
+$lang['A new version of Piwigo is available.'] = 'Нова версия ва Piwigo е налична';
+$lang['Active Languages'] = 'Текущ език';
+$lang['Active Plugins'] = 'Активни добавки';
+$lang['Active Themes'] = 'Активни теми';
+$lang['Add a criteria'] = 'Добави критерии';
+$lang['Add a filter'] = 'Добави филтър';
+$lang['Add a tag'] = 'Добави таг';
+$lang['Add a user'] = 'Добави потребител';
+$lang['Add a virtual album'] = 'Добави виртуален албум';
+$lang['Add group'] = 'Добави група';
+$lang['Add New Language'] = 'Добави нов език';
+$lang['Add New Theme'] = 'Добави нова тема';
+$lang['Add Photos'] = 'Добави снимки';
+$lang['Add tags'] = 'Добави тагове';
+$lang['Add'] = 'Добави';
+$lang['added'] = 'добавен';
+$lang['administrators'] = 'администратори';
+$lang['Advanced features'] = 'Разширени добавки';
+$lang['Album updated successfully'] = 'Албума е обновен успешно';
+$lang['albums added in the database'] = 'албуми добавени в базата данни';
+$lang['all'] = 'всички';
+$lang['and'] = 'и';
+$lang['any visitor can see this album'] = 'албума е видим от всички';
+$lang['Applications'] = 'Приложения';
+$lang['Apply action'] = 'Потвърди действието';
+$lang['Apply selected corrections'] = 'Потвърди избраните корекции';
+$lang['Available on'] = 'Налична от';
+$lang['Available versions for'] = 'Налични версии за';
+$lang['Cancel'] = 'Отказ';
+$lang['Groups and users'] = 'Групи и потребители';
+$lang['List'] = 'Списък';
+$lang['Move to album'] = 'Премести в албум';
+$lang['Permission granted for groups'] = 'Достъпа е гарантиран за групите';
+$lang['Permission granted for users'] = 'Достъпа е гарантиран за потребители';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo за iOS (iPhone, iPad, iPod Touch)';
+$lang['registered users'] = 'регистрирани потребители';
+$lang['Select groups...'] = 'Избрани групи';
+$lang['Select users...'] = 'Избрани потребители';
+$lang['simple visitors'] = 'обикновенни потребители';
+$lang['There is no group in this gallery.'] = 'Няма групи в тази галерия';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'необходима регистрация на потребителите и допълнителен достъп за да видят този албум';
+$lang['Web Form'] = 'Уеб бланка';
+?>
Index: tags/2.4.0RC3/language/bg_BG/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/bg_BG/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/common.lang.php	(revision 14585)
@@ -0,0 +1,395 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Български [BG]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=510
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Български";
+$lang_info['country'] = "България";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "bg";
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d албума е обновен';
+$lang['%d albums updated'] = '%d албумите са обновени';
+$lang['%d comment to validate'] = '%d коментар за одобрение';
+$lang['%d comments to validate'] = '%d коментари за одобрение';
+$lang['%d new comment'] = '%d нов коментар';
+$lang['%d new comments'] = '%d нови коментари';
+$lang['%d comment'] = '%d коментар';
+$lang['%d comments'] = '%d коментари';
+$lang['%d hit'] = '%d показан';
+$lang['%d hits'] = '%d показвания';
+$lang['%d new photo'] = '%d нова снимка';
+$lang['%d new photos'] = '%d нови снимки';
+$lang['%d new user'] = '%d нов потребител';
+$lang['%d new users'] = '%d нови потребители';
+$lang['About'] = 'За нас';
+$lang['All tags'] = 'Всички етикети';
+$lang['Any tag'] = 'Всеки етикет';
+$lang['At least one listed rule must be satisfied.'] = 'Най-малко един критерии трябва да бъде изпълнен.';
+$lang['Author'] = 'Автор';
+$lang['Albums'] = 'Албуми';
+$lang['Album'] = 'Албум';
+$lang['Close this window'] = 'Затворете този прозорец';
+$lang['Complete RSS feed (photos, comments)'] = 'Пълна RSS емисия (снимки, коментари)';
+$lang['Confirm Password'] = 'Потвърдете паролата';
+$lang['Connection settings'] = 'Настройки за свързване';
+$lang['Login'] = 'Вход';
+$lang['Contact webmaster'] = 'Контакт Уебмастър';
+$lang['Create a new account'] = 'Регистрация на нов потребител';
+$lang['Created on'] = 'Създаден на';
+$lang['Creation date'] = 'Дата на създаване';
+$lang['Current password is wrong'] = 'Въведената парола е грешна';
+$lang['Dimensions'] = 'Размери';
+$lang['Display'] = 'Изглед';
+$lang['Each listed rule must be satisfied.'] = 'Всяко правило от списъка трябва да е изпълнено.';
+$lang['Email address'] = 'Мейл адрес';
+$lang['Enter your personnal informations'] = 'Въведете Вашата лична информация';
+$lang['Error sending email'] = 'Грешка при изпращането на електронната поща';
+$lang['File name'] = 'Име на файла';
+$lang['File'] = 'Файл';
+$lang['Filesize'] = 'Размер на файла';
+$lang['Filter and display'] = 'Филтър и изглед';
+$lang['Filter'] = 'Филтър';
+$lang['Forgot your password?'] = 'Забравена парола';
+$lang['Go through the gallery as a visitor'] = 'Преглед на галерията като посетител';
+$lang['Help'] = 'Помощ';
+$lang['Identification'] = 'Регистрация/Вход';
+$lang['Photos only RSS feed'] = 'RSS Емисия само за снимки';
+$lang['Keyword'] = 'Ключова дума';
+$lang['day'][0] = 'Нд';
+$lang['day'][1] = 'Пн';
+$lang['day'][2] = 'Вт';
+$lang['day'][3] = 'Ср';
+$lang['day'][4] = 'Чт';
+$lang['day'][5] = 'Пт';
+$lang['day'][6] = 'Сб';
+$lang['month'][10] = 'Октомври';
+$lang['month'][11] = 'Ноември';
+$lang['month'][12] = 'Декември';
+$lang['month'][1] = 'Януари';
+$lang['month'][2] = 'Февруари';
+$lang['month'][3] = 'Март';
+$lang['month'][4] = 'Април';
+$lang['month'][5] = 'Май';
+$lang['month'][6] = 'Юни';
+$lang['month'][7] = 'Юли';
+$lang['month'][8] = 'Август';
+$lang['month'][9] = 'Септември';
+$lang['slideshow'] = 'Слайдшоу';
+$lang['stop the slideshow'] = 'Спри слайдшоуто';
+$lang['Specials'] = 'Покажи';
+$lang['SQL queries in'] = 'SQL запитвания в';
+$lang['display only recently posted photos'] = 'покажи само наскоро добавени снимки';
+$lang['return to the display of all photos'] = 'върни се на преглед на всички снимки';
+$lang['the beginning'] = 'началото';
+$lang['Interface theme'] = 'Тема на интерфейса';
+$lang['Thumbnails'] = 'Умален преглед';
+$lang['Menu'] = 'Меню';
+$lang['A comment on your site'] = 'Коментар на Вашият сайт';
+$lang['today'] = 'днес';
+$lang['Update your rating'] = 'Обновете Вашето гласуване';
+$lang['the username must be given'] = 'потребителското име е задължително';
+$lang['useful when password forgotten'] = 'полезно в случай на забравена парола';
+$lang['Quick search'] = 'Бързо търсене';
+$lang['Connected user: %s'] = 'Свързан потребител: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Браузър: %s';
+$lang['Author: %s'] = 'Автор: %s';
+$lang['Comment: %s'] = 'Коментар: %s';
+$lang['Comment by %s'] = 'Коментар от %s';
+$lang['User: %s'] = 'Потребител: %s';
+$lang['Email: %s'] = 'Мейл: %s';
+$lang['Admin: %s'] = 'Админ: %s';
+$lang['Registration of %s'] = 'Регистрация на %s';
+$lang['Album: %s'] = 'Албум: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Грешен статус за потребител "guest", ще бъде използвана настройка по подразбиране. Моля уведомете уебмастерът.';
+$lang['this email address is already in use'] = 'този емайл адрес вече се използва.';
+$lang['Album results for'] = 'Албумни резултати за';
+$lang['Tag results for'] = 'Таг резултати за';
+$lang['from %s to %s'] = 'от %s до %s';
+$lang['Play of slideshow'] = 'Пусни слайдшоу';
+$lang['Pause of slideshow'] = 'Пауза на слайдшоуто';
+$lang['Repeat the slideshow'] = 'Повтори слайдшоуто';
+$lang['Not repeat the slideshow'] = 'Не повтаряй слайдшоуто';
+$lang['Reduce diaporama speed'] = 'Намали скоростта на слайдшоуто';
+$lang['Accelerate diaporama speed'] = 'Увеличи скоростта на слайдшоуто';
+$lang['Submit'] = 'Изпрати';
+$lang['Yes'] = 'Да';
+$lang['No'] = 'Не';
+$lang['%d photo'] = '%d снимка';
+$lang['%d photos'] = '%d снимки';
+$lang['%d photo is also linked to current tags'] = '%d снимката е свързана също и с настоящите тагове';
+$lang['%d photos are also linked to current tags'] = '%d снимките са свързани също и с настоящите тагове';
+$lang['display photos linked to this tag'] = 'покажи снимките свързани с този таг';
+$lang['photos posted during the last %d days'] = 'добавени снимки през последните %d дни';
+$lang['Piwigo Help'] = 'Piwigo Помощ';
+$lang['Rank'] = 'Ранг';
+$lang['group by letters'] = 'групирай по букви';
+$lang['letters'] = 'букви';
+$lang['show tag cloud'] = 'покажи облак от тагове';
+$lang['cloud'] = 'облак';
+$lang['Reset to default values'] = 'Върни до настройки по подразбиране';
+$lang['delete all photos from your favorites'] = 'изтрий всички снимки от любими';
+$lang['Sent by'] = 'Изпратено от';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Блокирали сте бисквитките или Вашият браузър не ги поддържа. Разрешете бисквитките за да влезете в системата.';
+$lang['Edit a comment'] = 'Редактирай коментар';
+$lang['Are you sure?'] = 'Сигурен ли сте?';
+$lang['%d Kb'] = '%d Кб';
+$lang['Links'] = 'Линкове';
+$lang['N/A'] = 'Не е налична';
+$lang['New on %s'] = 'Нови на %s';
+$lang['Notification'] = 'RSS';
+$lang['Number of items'] = 'Брой обекти';
+$lang['Original dimensions'] = 'Оригинален размер';
+$lang['Password forgotten'] = 'Забравена парола';
+$lang['Password'] = 'Парола';
+$lang['Post date'] = 'Дата на добавяне';
+$lang['Posted on'] = 'Добавен на';
+$lang['Profile'] = 'Профил';
+$lang['Quick connect'] = 'Вход/Регистрация';
+$lang['RSS feed'] = 'RSS запис';
+$lang['Register'] = 'Регистрация';
+$lang['Registration'] = 'Регистрация';
+$lang['Related tags'] = 'Свързани тагове';
+$lang['Reset'] = 'Изчистване';
+$lang['Retrieve password'] = 'Възстанови парола';
+$lang['Search rules'] = 'Критерий за търсене';
+$lang['Search tags'] = 'Търси тагове';
+$lang['Search'] = 'Търси';
+$lang['display available tags'] = 'покажи налични тагове';
+$lang['Since'] = 'От';
+$lang['Sort by'] = 'Сортирано по';
+$lang['Sort order'] = 'Сортирай по';
+$lang['Tag'] = 'Таг';
+$lang['Tags'] = 'Тагове';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS записа предлага уведомяване от този сайт, когато има: нови снимки, обновени албуми, нови коментари. Използвайте четец за RSS записи.';
+$lang['Unknown feed identifier'] = 'Неизвестен идентификатор на записи';
+$lang['User comments'] = 'Потребителски коментари';
+$lang['Username'] = 'Потребителско име';
+$lang['Visits'] = 'Посещения';
+$lang['Webmaster'] = 'Уебмастър';
+$lang['Week %d'] = 'Седмица %d';
+$lang['About Piwigo'] = 'За Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Вие нямате права за достъп до желаната страница.';
+$lang['add this photo to your favorites'] = 'добави снимката в любими';
+$lang['Administration'] = 'Администрация';
+$lang['all'] = 'всички';
+$lang['ascending'] = 'възходящ ред';
+$lang['author(s) : %s'] = 'автор(и) : %s';
+$lang['Expand all albums'] = 'Покажи всички албуми';
+$lang['posted after %s (%s)'] = 'качени след %s (%s)';
+$lang['posted before %s (%s)'] = 'качени преди %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'качени между %s (%s) и %s (%s)';
+$lang['posted on %s'] = 'качени на %s';
+$lang['Best rated'] = 'Най-добра оценка';
+$lang['display best rated photos'] = 'покажи снимките с най-добри оценки';
+$lang['Calendar'] = 'Календар';
+$lang['All'] = 'Всички';
+$lang['display each day with photos, month per month'] = 'покажи всеки ден със снимки, месец по месец';
+$lang['View'] = 'Изглед';
+$lang['chronology_monthly_calendar'] = 'хронологичен месечен календар';
+$lang['chronology_monthly_list'] = 'хронологичен списък с месеци';
+$lang['chronology_weekly_list'] = 'хронологичен списък със седмици';
+$lang['Click here if your browser does not automatically forward you'] = 'Натиснете тук ако браузера не Ви пренасочи автоматично';
+$lang['comment date'] = 'дата на коментар';
+$lang['Comment'] = 'Коментар';
+$lang['Your comment has been registered'] = 'Вашият коментар бе регистриран';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Анти-флуд система: моля изчакайте малко преди да напишете друг коментар';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Вашият коментар не бе регистриран защото не отговаря на правилата за писане на коментари';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Администратор трябва да одобри Вашият коментар преди да бъде видим.';
+$lang['This login is already used by another user'] = 'Това потребителско име вече се използва от друг потребител.';
+$lang['Comments'] = 'Коментари';
+$lang['Add a comment'] = 'Добави коментар';
+$lang['created after %s (%s)'] = 'добавени след %s (%s)';
+$lang['created before %s (%s)'] = 'добавени преди %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'добавени между %s (%s) и %s (%s)';
+$lang['created on %s'] = 'добавени на %s';
+$lang['Customize'] = 'Персонализирай';
+$lang['Your Gallery Customization'] = 'Персонализиране на Вашата Галерия';
+$lang['Default'] = 'По подразбиране';
+$lang['delete this photo from your favorites'] = 'изтрий тази снимка от любими';
+$lang['Delete'] = 'Изтрий';
+$lang['descending'] = 'низходящ ред';
+$lang['Download'] = 'изтегли';
+$lang['Download this file'] = 'свалете този файл';
+$lang['edit'] = 'редактирай';
+$lang['wrong date'] = 'грешна дата';
+$lang['excluded'] = 'изключени';
+$lang['Your favorites'] = 'Вашите любими';
+$lang['display your favorites photos'] = 'покажи вашите любими снимки';
+$lang['Favorites'] = 'Любими';
+$lang['First'] = 'Първа';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Галерията е заключена за поправка. Моля, елате по-късно.';
+$lang['Page generated in'] = 'Страница генерирана за';
+$lang['guest'] = 'гост';
+$lang['Hello'] = 'Здравей';
+$lang['available for administrators only'] = 'само за администратори';
+$lang['display this album'] = 'покажи този албум';
+$lang['display last user comments'] = 'покажи последните коментари';
+$lang['customize the appareance of the gallery'] = 'персонализиране на външния вид на галерията';
+$lang['search'] = 'търси';
+$lang['Home'] = 'Начало';
+$lang['in this album'] = 'в този албум';
+$lang['in %d sub-album'] = 'в %d под-албум';
+$lang['in %d sub-albums'] = 'в %d под-албуми';
+$lang['included'] = 'включено';
+$lang['Invalid password!'] = 'Грешна парола!';
+$lang['Language'] = 'Език';
+$lang['last %d days'] = 'последните %d дни';
+$lang['Last'] = 'Последна';
+$lang['Logout'] = 'Изход';
+$lang['obligatory'] = 'задължително';
+$lang['Maximum photo height'] = 'Максимална височина на снимката';
+$lang['Maximum height must be a number superior to 50'] = 'Максимална височина трябва да е число, по-голямо от 50';
+$lang['Maximum photo width'] = 'Максимална ширина на снимката';
+$lang['Maximum width must be a number superior to 50'] = 'Максимална ширина трябва да е число, по-голяма от 50';
+$lang['display a calendar by creation date'] = 'покажи календар по дата на създаване';
+$lang['display all photos in all sub-albums'] = 'покажи всички снимки във всички под-албуми';
+$lang['return to normal view mode'] = 'върнете се към нормален изглед';
+$lang['display a calendar by posted date'] = 'показване на календар от дата на публикуване';
+$lang['display most visited photos'] = 'покажи най-посещаваните снимки';
+$lang['Unknown identifier'] = 'Неизвестен идентификатор';
+$lang['New password'] = 'Нова парола';
+$lang['Rate this photo'] = 'Оцени тази снимка';
+$lang['Next'] = 'Следващ';
+$lang['no rate'] = 'няма оценка';
+$lang['Photos posted within the last %d day.'] = 'Снимки, публикувани в рамките на последния/те %d ден/дни.';
+$lang['Photos posted within the last %d days.'] = 'Снимки, публикувани в рамките на последния/те %d ден/дни.';
+$lang['password updated'] = 'паролата е актуализирана';
+$lang['Recent period must be a positive integer value'] = 'Последния период трябва да бъде положително цяло число';
+$lang['Click on the photo to see it in high definition'] = 'Кликнете върху снимката за да я видите с висока резолюция';
+$lang['Show file metadata'] = 'Покажи метаданните на файла';
+$lang['Preferences'] = 'Предпочитания';
+$lang['Previous'] = 'Предишен';
+$lang['Random photos'] = 'Случайни снимки';
+$lang['display a set of random photos'] = 'показване набор от случайни снимки';
+$lang['Recent albums'] = 'Последни албуми';
+$lang['display recently updated albums'] = 'показване наскоро актуализирани албуми';
+$lang['Recent period'] = 'Последния период';
+$lang['Recent photos'] = 'Последните снимки';
+$lang['display most recent photos'] = 'показване най-новите снимки';
+$lang['Redirection...'] = 'Пренасочване...';
+$lang['Please, enter a login'] = 'Моля, въведете потребителско име';
+$lang['login mustn\'t end with a space character'] = 'потребителското име не трябва да завършва с интервал';
+$lang['login mustn\'t start with a space character'] = 'потребителското име неможе да започва с интервал';
+$lang['this login is already used'] = 'потребителското име е заето';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'мейл адресът трябва да бъде подобно на xxx@yyy.eee (пример : jack@altern.org)';
+$lang['please enter your password again'] = 'моля въведете Вашата парола отново';
+$lang['Auto login'] = 'Автоматично влизане';
+$lang['remove this tag from the list'] = 'премахване на този маркер от списъка';
+$lang['representative'] = 'представител';
+$lang['Search for Author'] = 'Търсене на автор';
+$lang['Search in albums'] = 'Търсене в албумите';
+$lang['Search by date'] = 'Търсене по дата';
+$lang['Date'] = 'Дата';
+$lang['End-Date'] = 'Крайна дата';
+$lang['Kind of date'] = 'Вид дата';
+$lang['Search for words'] = 'Търсене за думи';
+$lang['Search for all terms'] = 'Търсене за всички условия';
+$lang['Search for any term'] = 'Търсене за условия ';
+$lang['Most visited'] = 'Най-посещавани';
+$lang['photo'] = 'снимка';
+$lang['Powered by'] = 'Осъществено от';
+$lang['Empty query. No criteria has been entered.'] = 'Празна заявка. Не е въведен критерии.';
+$lang['Search results'] = 'Резултати от търсенето';
+$lang['Search in sub-albums'] = 'Търсене в под-албуми';
+$lang['searched words : %s'] = 'търсени думи : %s';
+$lang['Contact'] = 'Контакт';
+$lang['set as album representative'] = 'задай снимка на албума';
+$lang['Show number of comments'] = 'Показване броя на коментарите';
+$lang['Show number of hits'] = 'Покажи брой на попаденията';
+$lang['(!) This comment requires validation'] = '(!) Този коментар изисква валидация';
+$lang['Welcome'] = 'Добре дошъл';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Добре дошли във Вашата Piwigo фото галерия!';
+$lang['... or browse your empty gallery'] = '... или разгледайте Вашите празни галерии';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... или моля деактивирайте това съобщение, аз ще намеря друг начин';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Здравейте %s, Вашата Piwigo фото галерия е празна!';
+$lang['I want to add photos'] = 'Искам да добавя снимки';
+$lang['Manage this user comment: %s'] = 'Управление на потребителския коментар: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Липсва е-Мейл адрес. Моля въведете е-Мейл адрес.';
+$lang['This author modified following comment:'] = 'Автора промени следния коментар:';
+$lang['This author removed the comment with id %d'] = 'Автора премахна коментара с id %d';
+$lang['html tags are not allowed in login'] = 'html тагове не са разрешени в логина';
+$lang['Unknown feed identifier'] = 'Неизвестен индетификатор';
+$lang['The number of photos per page must be a not null scalar'] = 'Броят на снимките на страница трябва да е различен от нула';
+$lang['Number of photos per page'] = 'Брои на снимки за страница';
+$lang['Change my password'] = 'Смана на паролата';
+$lang['Invalid key'] = 'Невалиден ключ';
+$lang['Invalid username or email'] = 'Невалидно потребителско име или е-майл';
+$lang['Please enter your username or email address.'] = 'Моля, въведете Вашето потребителско име или е-майл';
+$lang['Return to home page'] = 'Връщане към началната страница';
+$lang['The passwords do not match'] = 'Въведените пароли не съвпадат';
+$lang['To reset your password, visit the following address:'] = 'За да анулирате паролата, посетете този адрес:';
+$lang['Username or email'] = 'Потребителско име или е-майл';
+$lang['You will receive a link to create a new password via email.'] = 'Ще получите линк на електронната си поща, с който ще съзадате нова парола';
+$lang['Your password has been reset'] = 'Вашата парола е анулирана';
+$lang['Check your email for the confirmation link'] = 'Проверете вашата поща за връзка за потвърждение';
+$lang['Edit'] = 'Редактиране';
+$lang['Enter your new password below.'] = 'Въведете новата парола отдолу:';
+$lang['EXIF Metadata'] = 'EXIF метаданни';
+$lang['Hello %s,'] = 'Здравей %s,';
+$lang['Here are your connection settings'] = 'Вашите настройки за свързване';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ако смятатае, че това съобщение е грешка,просто го ингнорирайте без никакви последствия.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ако смятате, че сте получили това съобщение вследстиве на грешка, моля свържете се с нас на %s';
+$lang['IPTC Metadata'] = 'IPTC метаданни';
+$lang['large'] = 'голям';
+$lang['medium'] = 'среден';
+$lang['Original'] = 'оригинал';
+$lang['Password Reset'] = 'Нулиране на парола';
+$lang['Password reset is not allowed for this user'] = 'Нулирае на парола не е разрешено за този потребител';
+$lang['Password: %s'] = 'Парола: %s';
+$lang['Rating score'] = 'Резултат оценка';
+$lang['Send my connection settings by email'] = 'Изпращане на настройките за свързване по пощата!';
+$lang['small'] = 'малък';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Зявака за нулиране на парола за потребителско име:';
+$lang['square'] = 'правоъгълен';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Успешна регистрация, скоро ще получите съобщение на електронната поща, със настройките за свързване. Добре дошли!';
+$lang['Thank you for registering at %s!'] = 'Благодарим Ви, за регистрацията на  %s!';
+$lang['thumb'] = 'прелиствам';
+$lang['User "%s" has no email address, password reset is not possible'] = 'За потребителят  "%s" липсва електронна поща, затова нулирането на паролата е невъзможно';
+$lang['Username "%s" on gallery %s'] = 'Потребител  "%s" на галерия %s';
+$lang['Username modification'] = 'Промяна на потребител';
+$lang['Username: %s'] = 'Потребител: %s';
+$lang['xlarge'] = 'по-голям';
+$lang['xxlarge'] = 'огромен';
+$lang['Your username has been successfully changed to : %s'] = 'Вашетопотребителско име беше успешно промененно на : %s';
+$lang['%d rates'] = '%d оценки';
+
+$lang['Show latest comments first'] = 'Покажи първо най-новите коментари';
+$lang['Show oldest comments first'] = 'Покажи първо най-старите коментари';
+$lang['Desktop'] = 'Настолна';
+$lang['Mobile'] = 'Мобилна';
+$lang['Photo sizes'] = 'Размери на снимката';
+$lang['View in'] = 'Вижте в';
+$lang['2small'] = 'XXS - мъничък';
+$lang['File name, A &rarr; Z'] = 'Име на файл, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Име на файл, Z &rarr; A';
+$lang['Manual sort order'] = 'Ръчно определяне на подредбата';
+$lang['xsmall'] = 'XS - много малък';
+?>
Index: tags/2.4.0RC3/language/bg_BG/index.php
===================================================================
--- tags/2.4.0RC3/language/bg_BG/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/bg_BG/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/bg_BG/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/install.lang.php	(revision 14585)
@@ -0,0 +1,72 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['also given by your host provider'] = 'също предоставена от доставчика на услугата';
+$lang['Basic configuration'] = 'Основно конфигуриране';
+$lang['Database configuration'] = 'Конфигуриране на базата данни';
+$lang['Database name'] = 'Име на базата данни';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'имената на таблиците в базата данни, ще имат тази представка ( това Ви дава възможност да управлявате таблиците по-добре)';
+$lang['Default gallery language'] = 'Език по подразбиране за галерията';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Не се колебайте да се консултира в нашите форуми за всяка помощ:% S';
+$lang['Download the config file'] = 'Изтегляне на конфигурационния файл';
+$lang['enter a login for webmaster'] = 'въведете потребителско име за уебмастер';
+$lang['Installation'] = 'Инсталиране';
+$lang['Just another Piwigo gallery'] = 'Още една  Piwigo фотогалерия';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Пазете я в тайна, тя Ви дава достъп до административния панел';
+$lang['Password'] = 'Парола';
+$lang['Password [confirm]'] = 'Парола [потвърждаване]';
+$lang['please enter your password again'] = 'моля, въведете паролата още веднъж';
+$lang['User'] = 'Потребител';
+$lang['verification'] = 'проверка';
+$lang['webmaster login can\'t contain characters \' or "'] = 'потребителското име за уебмастера, не може да съдържа символите\' или "';
+$lang['Webmaster password'] = 'Парола на уебмастера';
+$lang['Welcome to my photo gallery'] = 'Здравейте и добре дошли в моята фотогалерия';
+$lang['Welcome to your new installation of Piwigo!'] = 'Здравейте и добре дошли във вашата нова Piwigo инсталация! ';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Вие можете да изтеглите конфигурационния файл и да го качите в директорията  local/config на вашата инсталация';
+$lang['PHP 5 is required'] = 'Изисква се инсталиран PHP 5';
+$lang['Start Install'] = 'Стартиране на инсталацията';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo не успя да конфигурира PHP5';
+$lang['Admin configuration'] = 'Администратор настройки';
+$lang['Congratulations, Piwigo installation is completed'] = 'Поздравления, Piwigo е инсталиран успешно';
+$lang['Database table prefix'] = 'Прифкс на базата с данни';
+$lang['Hope to see you back soon.'] = 'Надяваме се да се видим скоро';
+$lang['Host'] = 'Доставчик';
+$lang['Sorry!'] = 'Съжаляваме!';
+$lang['Try to configure PHP 5'] = 'Опитайте да настройте PHP 5';
+$lang['user login given by your host provider'] = 'потребителско име за достъп до вашия доставчик';
+$lang['user password given by your host provider'] = 'парола за достъп до вашия доставчик';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Потребителите ще могат да използват този имейл за контакт с Администратора на сайта';
+$lang['Webmaster mail address'] = 'Webmaster имейл адрес';
+$lang['Can\'t connect to server'] = 'Невъзможен достъп до сървъра';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Връзката със сървъра е успешна, но достъпа до базата данни е невъзможен';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Това ще е видимо от потребителите. Необходимо е за администриране на сайта';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'имейл адреса трябва да е като xxx@yyy.eee (example : jack@altern.org)';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Нужна ви е помощ? Задайте вашият въпрос в <a href="%s">Piwigo борда за съобщения</a>.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Вие може да промените конфигурацията и сами и да рестартирате Piwigo след това.';
+$lang['Webmaster login'] = 'Webmaster вход';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Алтернативно решение е да копирате текста от кутията горе и да го добавите ръчно във файла "local/config/database.inc.php" (ВНИМАНИЕ: database.inc.php трябва да съдържа само това от текстовото поле, без празни знаци)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Създаването на конфигурационен файл local/config/database.inc.php е неуспещно.';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Изглежда вашият уеб хост се изпълнява в PHP %s';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo може да се опита да превключите вашата конфигурация на PHP 5 като създаде или промени .htaccess файла.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Обърнете се към вашия хостинг доставчик и вижте как можете да преминете към PHP 5 самостоятелно.';
+?>
Index: tags/2.4.0RC3/language/bg_BG/iso.txt
===================================================================
--- tags/2.4.0RC3/language/bg_BG/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Български [BG]
Index: tags/2.4.0RC3/language/bg_BG/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/bg_BG/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/bg_BG/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Само администратор може да стартира обновяване: моля, влезте в профила си.';
+$lang['SQL queries'] = 'SQL заявки';
+$lang['Statistics'] = 'Статистика';
+$lang['total SQL time'] = 'общо време за SQL';
+$lang['total upgrade time'] = 'общо време за обновяване';
+$lang['Upgrade'] = 'Обновяване';
+$lang['Upgrade from version %s to %s'] = 'Обновяване от версия %s към %s';
+$lang['Upgrade informations'] = 'Информация за обновяването';
+$lang['You do not have access rights to run upgrade'] = 'Вие нямате права, за да стартирате обновяване.';
+$lang['All sub-albums of private albums become private'] = 'Всички под-албуми на лични албуми, стават също лични.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Като предпазна мярка, следните приставки са били деактивирани. Трябва да проверите за ъпгрейд на приставките преди да ги активирате отново:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Като предпазна мярка, следните теми бяха деактивирани. Трябва да проверите за ъпгрейд на темите преди да ги активирате отново:';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'Във <i>%s</i>, преди <b></b>, добави:';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Само миниатюрата на префикса и webmaster имейл адреса бяха запазени от предишната конфигурация';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Направете проверка за подръжка в  [Administration>Tools>Maintenance] ако имате някакви проблеми.';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Тази страница предлага да актуализира базата данни от вашия Piwigo стара версия към поновата версия. Ъпгрейд асистента мисли, че в момента използвате <strong> релииз %s</ strong> (или подобна).';
+$lang['User permissions and group permissions have been erased'] = 'Разрешенията на потребителите и групите бяха изтрити';
+?>
Index: tags/2.4.0RC3/language/ca_ES/about.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/about.html	(revision 14585)
@@ -0,0 +1,15 @@
+<p>Aquesta galeria fotogràfica es basa en el programari Piwigo.</p>
+
+<p>Piwigo és una galeria fotogràfica per al web, construït per una 
+comunitat activa d'usuaris i desenvolupadors, amb un gran nombre d'extensions que fan que sigui fàcilment
+personalitzable. I el millor de tot és que Piwigo és programari lliure, totalment gratuït.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Visita el web de Piwigo </a></p>
+
+<p>The catalan translation is maintained by (in alphabetical order):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=4722">AlbertParera</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=8387">josep.torne</a></li>
+</ul>
+.... Many thanks to you</p> 
Index: tags/2.4.0RC3/language/ca_ES/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ca_ES/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/admin.lang.php	(revision 14585)
@@ -0,0 +1,910 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d associació';
+$lang['%d associations'] = '%d associacions';
+$lang['%d album including'] = '%d àlbum inclòs';
+$lang['%d albums including'] = '%d àlbums inclosos ';
+$lang['%d physical'] = '%d física';
+$lang['%d physical'] = '%d físics';
+$lang[' and %d virtual'] = ' i %d virtual';
+$lang[' and %d virtual'] = ' i %d virtuals';
+$lang['%d album moved'] = '%d àlbum mogut';
+$lang['%d albums moved'] = '%d àlbums moguts';
+$lang['%d member'] = '%d membre';
+$lang['%d members'] = '%d membres';
+$lang['%d tag'] = '%d etiqueta';
+$lang['%d tags'] = '%d etiquetes';
+$lang['%d user comment rejected'] = '%d comentari d\'usuari rebutjat';
+$lang['%d user comments rejected'] = '%d comentaris d\'usuari rebutjats';
+$lang['%d user comment validated'] = '%d comentari d\'usuari validat';
+$lang['%d user comments validated'] = '%d comentaris d\'usuari validats';
+$lang['%d user deleted'] = '%d usuari eliminat';
+$lang['%d users deleted'] = '%d usuaris eliminats';
+$lang['%d user'] = '%d usuari';
+$lang['%d users'] = '%d usuaris';
+$lang['%d waiting for validation'] = '%d s\'està esperant per a que es validi';
+$lang['Actions'] = 'Accions';
+$lang['Activate'] = 'Activa';
+$lang['Add/delete a permalink'] = 'Afegeix/elimina un enllaç permanent';
+$lang['Add a tag'] = 'Afegeix etiqueta';
+$lang['Add a user'] = 'Afegeix usuari';
+$lang['Add'] = 'Afegeix';
+$lang['Allow user registration'] = 'Permet el registre d\'usuaris';
+$lang['Apply to sub-albums'] = 'Aplica als subàlbums';
+$lang['Associated'] = 'Associat';
+$lang['Caddie management'] = 'Gestió del carret';
+$lang['Caddie'] = 'Carret';
+$lang['Album manual order was saved'] = 'S\'ha guardat l\'orde manual d\'àlbums';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Check for upgrade failed for unknown reasons.';
+$lang['Check for upgrade'] = 'Comprova si hi ha actualitzacions';
+$lang['Current name'] = 'Nom actual';
+$lang['Database'] = 'Base de dades';
+$lang['Deactivate'] = 'Desactiva';
+$lang['Deletions'] = 'Eliminacions';
+$lang['Deny selected users'] = 'Denega els ususaris seleccionats';
+$lang['Description'] = 'Descripció';
+$lang['Display options'] = 'Visualitza opcions';
+$lang['Dissociated'] = 'Desassòcia';
+$lang['Does not represent'] = 'No representis';
+$lang['Edit selected tags'] = 'Edita les etiquetes seleccionades';
+$lang['Edit tags'] = 'Edita etiquetes';
+$lang['Email admins when a new user registers'] = 'Envia un correu electrònic als administradors quan un usuari nou es registri';
+$lang['Email admins when a valid comment is entered'] = 'Envia un correu electrònic als administradors quan s\'hagi introduït un comentari vàlid';
+$lang['Email admins when a comment requires validation'] = 'Envia un correu electrònic als administradors quan un comentari requereixi validació';
+$lang['Environment'] = 'Entorn';
+$lang['Form'] = 'Formulari';
+$lang['Gallery title'] = 'Títol de la galeria';
+$lang['Grant selected users'] = 'Atorgar als usuaris seleccionats';
+$lang['Group name'] = 'Nom del grup';
+$lang['Groups'] = 'Grups';
+$lang['Guests'] = 'Visitants';
+$lang['History'] = 'Història';
+$lang['Informations'] = 'Informacions';
+$lang['Install'] = 'Instal·la';
+$lang['Link all album photos to a new album'] = 'Enllaça tots els àlbums de fotos al nou àlbum';
+$lang['Link all album photos to some existing albums'] = 'Enllaça tots els àlbums de fotos a alguns àlbums existents';
+$lang['Linked albums'] = 'Àlbums enllaçats';
+$lang['Lock gallery'] = 'Tancar galeria';
+$lang['Maintenance'] = 'Manteniment';
+$lang['Edit album permissions'] = 'Edita els permisos de l\'àlbum';
+$lang['Manage permissions for user "%s"'] = 'Gestiona els permisos de l\'usuari "%s"';
+$lang['Manage tags'] = 'Gestiona etiquetes';
+$lang['Members'] = 'Membres';
+$lang['Move albums'] = 'Moure àlbums';
+$lang['Move'] = 'Moure';
+$lang['Name'] = 'Nom';
+$lang['New name'] = 'Nou nom';
+$lang['New parent album'] = 'Nou àlbum pare';
+$lang['New tag'] = 'Nova etiqueta';
+$lang['Number of comments per page'] = 'Nombre de comentaris per pàgina';
+$lang['Number of rates'] = 'Nombre de valoracions';
+$lang['Number of thumbnails to create'] = 'Nombre de miniatures per crear';
+$lang['Only private albums are listed'] = 'Només es llisten els àlbums privats';
+$lang['Operating system'] = 'Sistema operatiu';
+$lang['Options'] = 'Opcions';
+$lang['Other private albums'] = 'Altres àlbums privats';
+$lang['Page banner'] = 'Bànner de la pàgina';
+$lang['Parent album'] = 'Àlbum pare';
+$lang['Path'] = 'Camí';
+$lang['Permalink'] = 'Enllaç permanent';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'El nom de l\'enllaç permanent s\'ha de composar per els caràcters a-z, A-Z, 0-9, "-", "_" o "/". No ha de ser numèric o començar amb un número seguit per "-"';
+$lang['Permalink %s is already used by album %s'] = 'L\'enllaç permanent %s ja s\'utilitza per l\'àlbum %s';
+$lang['Permalink history'] = 'Historial d\'enllaços permanents';
+$lang['Permalinks'] = 'Enllaços permanents';
+$lang['Permission denied'] = 'Permís denegat';
+$lang['Permission granted'] = 'Permís atorgat';
+$lang['Photo informations updated'] = 'Informació de la imatge actualitzada';
+$lang['Plugins'] = 'Complements';
+$lang['Position'] = 'Posició';
+$lang['Preferences'] = 'Preferències';
+$lang['Properties'] = 'Propietats';
+$lang['Random photo'] = 'Imatge aleatòria';
+$lang['Rate date'] = 'Data valoració';
+$lang['Rating by guests'] = 'Valoració dels visitants';
+$lang['Rating'] = 'Classificació';
+$lang['Reject'] = 'Rebutja';
+$lang['Representant'] = 'Representant';
+$lang['Representation of albums'] = 'Representació d\'àlbums';
+$lang['Representative'] = 'Representatiu';
+$lang['Represents'] = 'Representa';
+$lang['Save order'] = 'Desa l\'ordre';
+$lang['Save to permalink history'] = 'Desa a l\'historial d\'enllaços permanents';
+$lang['Select at least one album'] = 'Seleccioneu almenys un àlbum';
+$lang['Select at least one photo'] = 'Seleccioneu almenys una imatge';
+$lang['Select at least one user'] = 'Seleccioneu almenys un usuari';
+$lang['Show info'] = 'Mostrar informació';
+$lang['Site manager'] = 'Gestor del lloc';
+$lang['Status'] = 'Estat';
+$lang['Statistics'] = 'Estadístiques';
+$lang['Storage album'] = 'Àlbum d\'emmagatzemament';
+$lang['Sum of rates'] = 'Suma de valoracions';
+$lang['Tag "%s" already exists'] = 'L\'etiqueta "%s" ja existeix';
+$lang['Tag "%s" was added'] = 'L\'etiqueta "%s" estaba afegida';
+$lang['Tag selection'] = 'Selecció d\'etiquetes';
+$lang['The %d following tags were deleted'] = 'Les etiquetes següents %d estaven eliminades';
+$lang['Unable to check for upgrade.'] = 'No es pot verificar per actualitzar.';
+$lang['Uninstall'] = 'Desinstal·lar';
+$lang['Use the default photo sort order (defined in the configuration file)']='Utilitza l\'ordenació predeterminada  (definida en el fitxer de configuració)';
+$lang['User comments validation'] = 'Validació dels comentaris d\'usuari';
+$lang['Users'] = 'Usuaris';
+$lang['Validate'] = 'Valida';
+$lang['Validation'] = 'Validació';
+$lang['Version'] = 'Versió';
+$lang['Virtual albums to move'] = 'Àlbums virtuals per a moure';
+$lang['Virtual album name'] = 'Nom de l\'àlbum virtual';
+$lang['Webmaster cannot be deleted'] = 'El Webmaster no es pot eliminar';
+$lang['You are running on development sources, no check possible.'] = 'Estàs treballant sobre una font en desenvolupament. Sense verificació possible.
+You are running on development sources, no check possible.';
+$lang['You cannot delete your account'] = "No pots eliminar el teu compte.";
+$lang['You cannot move an album in its own sub album'] = 'No pots moure un àlbum dins del seu propi sub-àlbum';
+$lang['You need to confirm deletion'] = 'Cal confirmar l\'eliminació';
+$lang['Associate to album'] = 'Assòcia a l\'àlbum';
+$lang['Authorized'] = 'Autoritzat';
+$lang['Add a virtual album'] = 'Afegeix un àlbum virtual';
+$lang['Authorize users to add comments on selected albums'] = 'Autoritza als usuaris a afegir comentaris en els àlbums seleccionats';
+$lang['The name of an album must not be empty'] = 'El nom de l\'àlbum no pot ser buit';
+$lang['Lock albums'] = 'Bloqueig d\'àlbums';
+$lang['Private'] = 'Categoria privada';
+$lang['Public'] = 'Categoria pública';
+$lang['Find a new representant by random'] = 'Cercar un nou representant a l\'atzar';
+$lang['Public / Private'] = 'Públic / Privat';
+$lang['Manage authorizations for selected albums'] = 'Gestiona les autoritzacions dels àlbums seleccionats';
+$lang['Virtual album added'] = 'Àlbum virtual afegit';
+$lang['Virtual album deleted'] = 'Àlbum virtual eliminat';
+$lang['Access type'] = 'Tipus d\'accès';
+$lang['Information data registered in database'] = 'Informació de les dades registrades de la base de dades';
+$lang['Default display'] = 'Visualització predeterminada';
+$lang['History'] = 'Historial';
+$lang['The gallery URL is not valid.'] = 'La URL de la galeria no es vàlida.';
+$lang['Main'] = 'Principal';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'El nombre de comentaris d\'una pàgina ha d\'estar entre 5 i 50 inclosos.';
+$lang['Configuration'] = 'Configuració';
+$lang['confirm'] = 'confirma';
+$lang['Date'] = 'Data';
+$lang['delete album'] = 'Eliminar àlbum';
+$lang['Dissociate from album'] = 'desassòcia l\'àlbum';
+$lang['Album updated successfully'] = 'Àlbum actualitzat correctament.';
+$lang['photos per page'] = 'elements per pàgina';
+$lang['High definition enabled'] = 'Alta definicio habilitat';
+$lang['File'] = 'Arxiu';
+$lang['first photo added on %s'] = 'primera imatge afegida el %s';
+$lang['Forbidden'] = 'Prohibit';
+$lang['global mode'] = 'mode global';
+$lang['group "%s" updated'] = 'grup "%s" actualitzat';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'El nom d\'un grup no pot contenir " o \' o ser buit.';
+$lang['This name is already used by another group.'] = 'Aquest nom ja està en us per un altre grup.';
+$lang['High definition'] = 'Alta definició';
+$lang['jump to album'] = 'Salta cap a l\'àlbum';
+$lang['jump to photo'] = 'Salta cap a la imatge';
+$lang['leave'] = 'deixa';
+$lang['Lock'] = 'Bloqueja';
+$lang['Locked'] = 'Bloquejat';
+$lang['manage album photos'] = 'gestiona els elements de l\'àlbum';
+$lang['manage sub-albums'] = 'Gestionar sub-àlbums';
+$lang['Manage'] = 'Gestiona';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'El temps d\'execució s\'ha acabat, el tractament ha de continuar [Temps estimat: %d segon].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Temps d\'execució excedit, el tractament ha de continuar [Tiempo estimado: %d secundas].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'El temps requerit per a processar la llista d\'usuaris a enviar-los correus és limitat. No s\'han pogut processar tots els usuaris.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'El temps d\'enviament del correu és limitat. No tots els missatges han pogut ser enviats. S\'han omès missatges de correu electrònic.';
+$lang['To send ?'] = 'Enviar-ho?';
+$lang['email'] = 'correu electrònic';
+$lang['User'] = 'Usuari';
+$lang['Complementary mail content'] = 'Contingut complementari del correu';
+$lang['See you soon,'] = 'Fins aviat,';
+$lang['Go to'] = 'Vés a';
+$lang['Hello'] = 'Hola';
+$lang['New photos were added'] = 'S\'han afegit nous elements';
+$lang['on'] = 'sobre';
+$lang['between'] = 'entre';
+$lang['and'] = 'i';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'L\'administrador del web t\'ha subscrit per rebre notificacións per correu electrònic.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Us heu subscrit per a rebre notificacións per correu electrònic.';
+$lang['To subscribe'] = 'Subscriure\'s';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Si trobeu problemes o teniu qüalsevol qüestió, si us plau envieu un missatge a';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemes o preguntes';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'L\'administrador de la web us ha donat de baixa de rebre notificacions per correu.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Us heu donat de baixa de rebre notificacions per correu.';
+$lang[', click on'] = ', cliqueu a sobre';
+$lang['To unsubscribe'] = 'Donar-se de baixa';
+$lang['With blank value, gallery title will be used'] = 'El títol de la galeria s\'utilitzarà amb el valor en blanc';
+$lang['Notification'] = 'Notificació';
+$lang['Error when sending email to %s [%s].'] = 'Error en enviar correu electrònic a %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Correu electrònic enviat a %s [%s].';
+$lang['%d mail was sent.'] = '%d correu(s) electrònic(s) han sigut enviats.';
+$lang['%d mails were sent.'] = 's\'han enviat %d correus electrònics.';
+$lang['%d mail was not sent.'] = 'El correu electrònic %d no s\'ha pogut enviar.';
+$lang['%d mails were not sent.'] = 'No s\'han enviat %d correus electrònics.';
+$lang['No mail to send.'] = 'No hi ha correus electrònics per enviar.';
+$lang['There is no available subscribers to mail.'] = 'No hi ha subscriptors per enviar correu.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Els subscriptors es poden llistar (disponible) només si hi ha nous elements per a notificar.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'De totes formes només els webmasters poden veure aquesta pestanya i mai els administradors.';
+$lang['No user to send notifications by mail.'] = 'No hi ha usuaris per enviar notificacions per correu..';
+$lang['New photos added'] = 'Nous elements afegits';
+$lang['Subscribe to notification by mail'] = 'Subscriure per notificar per correu';
+$lang['Unsubscribe from notification by mail'] = 'Donar-se de baixa de les notificacions per correu';
+$lang['Parameter'] = 'Paràmetre';
+$lang['Continue processing treatment'] = 'Continua processant el tractament';
+$lang['Complementary mail content'] = 'Contingut de correu complementari';
+$lang['Add detailed content'] = 'Afegeix contingut detallat';
+$lang['Send mail as'] = 'Envia correu com';
+$lang['Send mail to users'] = 'Envia correu als usuaris';
+$lang['Send'] = 'Envia';
+$lang['Options'] = 'Opcions';
+$lang['Subscribed'] = 'Subscrit';
+$lang['Subscribe'] = 'Subscriu';
+$lang['Parameters'] = 'Paràmetres';
+$lang['Select recipients'] = 'Seleccioneu destinataris';
+$lang['Subscribe/unsubscribe users'] = 'Subscriu/dóna de baixa usuaris';
+$lang['Unsubscribed'] = 'Dóna de baixa';
+$lang['%d parameter was updated.'] = '%d paràmetre ha estat actualitzat.';
+$lang['%d parameters were updated.'] = '%d paràmetres han estat actualitzats.';
+$lang['%d user was not updated.'] = '%d usuari no estava actualitzat.';
+$lang['%d users were not updated.'] = '%d usuaris no estaven actualitzats.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'L\'usuari %s [%s] ha estat eliminat de la llista de subscripció.';
+$lang['User %s [%s] was added to the subscription list.'] = 'L\'usuari %s [%s] ha estat afegit a la llista de subscripció.';
+$lang['%d user was updated.'] = '%d usuari ha estat actualitzat.';
+$lang['%d users were updated.'] = '%d usuaris han estat actualitzats.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'L\'usuari %s [%s] no ha estat eliminat de la llista de subscripció.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'L\'usuari %s [%s] no ha estat afegit a la llista de subscripció.';
+$lang['User %s [%s] added.'] = 'S\'ha afegit l\'usuari %s [%s].';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Avís: Tant en subscripcions com en baixes s\'enviarà un coreu electrònic als usuaris.';
+$lang['Send mail on HTML format'] = 'Envia correu en format HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Inclou una visualització de les imatges recents agrupades per dates';
+$lang['Available only with HTML format'] = 'Disponible només en format HTML';
+$lang['no write access'] = 'accés d\'escriptura no permès';
+$lang['Permissions'] = 'Permisos';
+$lang['private'] = 'privat';
+$lang['Properties'] = 'Propietats';
+$lang['public'] = 'públic';
+$lang['Purge never used notification feeds'] = 'La depuració mai utilitza canals de notificació'; // pendent de revisar
+$lang['Purge sessions'] = 'Depurar sessions';
+$lang['randomly represented'] = 'representació aleatòria';
+$lang['registration date'] = 'data de registre';
+$lang['clean'] = 'neteja';
+$lang['Create this site'] = 'Crea aquest lloc';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'testeja aquest lloc remot';
+$lang['remove tags'] = 'elimina les etiquetes';
+$lang['Repair and optimize database'] = 'Repara i optimitza la base de dades';
+$lang['selection'] = 'selecciona';
+$lang['set to'] = 'estableix a';
+$lang['singly represented'] = 'representa per separat';
+$lang['This site already exists'] = 'Aquest lloc ja existeix';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Crea un nou lloc : (dóna aquesta URL per create_listing_file.php)';
+$lang['created'] = 'creat';
+$lang['delete'] = 'elimina';
+$lang['delete this site and all its attached elements'] = 'elimina aquest lloc i tots els elements adjunts';
+$lang['deleted'] = 'eliminat';
+$lang['an error happened'] = 'hi ha hagut algun error';
+$lang['Local'] = 'Local';
+$lang['Remote'] = 'Remot';
+$lang['update the database from files'] = 'actualitza la base de dades a partir dels fitxers';
+$lang['status'] = 'estat';
+$lang['Directory'] = 'Directori';
+$lang['sub-albums'] = 'sub-àlbums';
+$lang['target'] = 'objectiu';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['title'] = 'títol';
+$lang['Album list management'] = 'Gestió de la llista d\'àlbums';
+$lang['Piwigo configuration'] = 'Configuració del Piwigo';
+$lang['Edit album'] = 'Edita un àlbum';
+$lang['Group management'] = 'Gestió de grups';
+$lang['User list'] = 'Llista d\'usuaris';
+$lang['Edit photo information'] = 'Modifica la informació sobre una imatge';
+$lang['Database synchronization with files'] = 'Sincronització de la base de dades amb fitxers';
+$lang['all'] = 'totes';
+$lang['height must be a number superior to'] = 'l\'alçada ha de ser un número superior a';
+$lang['width must be a number superior to'] = 'l\'amplada ha de ser un número superior a';
+$lang['for the file format'] = 'per al format de fitxer';
+$lang['Photo unreachable or no support'] = 'Imatge inaccessible o no soportada';
+$lang['GD version'] = 'versió GD';
+$lang['General statistics'] = 'Estadístiques generals';
+$lang['average time'] = 'Promig de temps';
+$lang['number of miniaturized photos'] = 'número d\'imatges miniaturitzades';
+$lang['total time'] = 'temps total';
+$lang['for this file format'] = 'per aquest format de fitxer';
+$lang['unit mode'] = 'mode unit';
+$lang['Unlocked'] = 'Desbloquejat';
+$lang['unset'] = 'no definit';
+$lang['Update albums informations'] = 'Actualitza la informació dels àlbums';
+$lang['Update photos information'] = 'Actualitza la informació de les imatges';
+$lang['Synchronize'] = 'Sincronitza';
+$lang['reduce to single existing albums'] = 'redueix solament als àlbums existents';
+$lang['Choose an option'] = 'Escolliu una opció';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'mostra la màxima informació (àlbums i fotos afegides i eliminades)';
+$lang['Error list'] = 'Llista d\'errors';
+$lang['Errors caption'] = 'Títol de l\'error';
+$lang['Detailed informations'] = 'Informació detallada';
+$lang['File/directory read error'] = 'Error de lectura de l\'arxiu/directori';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'No es pot accedir al fitxer o directori (potser no existeix o l\'accès està denegat)';
+$lang['albums deleted in the database'] = 'categories eliminades de la base de dades';
+$lang['photos deleted from the database'] = 'elements eliminats de la base de dades';
+$lang['photos candidates for metadata synchronization'] = 'imatges candidates per la sincronització de metadades';
+$lang['photos informations synchronized with files metadata'] = 'elements d\'informació sincronitzats amb fitxers de metadades';
+$lang['errors during synchronization'] = 'errors durant la sincronització';
+$lang['albums added in the database'] = 'categories afegides a la base de dades';
+$lang['photos added in the database'] = 'elements afegits a la base de dades';
+$lang['photos updated in the database'] = 'elements actualitzats de la base de dades';
+$lang['Search for new images in the directories'] = 'Cerca noves imatges en els directoris';
+$lang['added'] = 'afegides';
+$lang['deleted'] = 'eliminades';
+$lang['Metadata synchronization results'] = 'Resultats de la sincronització de les metadades';
+$lang['only perform a simulation (no change in database will be made)'] = 'realitza només una simulació (no es farà cap canvi a la base de dades)';
+$lang['Simulation'] = 'Simulació';
+$lang['directories + files'] = 'directoris + fitxers';
+$lang['only directories'] = 'només directoris';
+$lang['synchronize files structure with database'] = 'sincronitza l\'estructura de fitxers amb la base de dades';
+$lang['synchronize files metadata with database photos informations'] = 'sincronitza els fitxers de metadades amb els elements d\'informació de la base de dades';
+$lang['even already synchronized photos'] = 'també els elements ja sincronitzats';
+$lang['Used metadata'] = 'Metadades utilitzades';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'El nom dels directoris i fitxers ha de estar composat per lletres, números, "-", "_" o "."';
+$lang['wrong filename'] = 'nom de fitxer erroni';
+$lang['Upload'] = 'Penja';
+$lang['user "%s" added'] = 's\'ha afegit l\'usuari "%s"';
+$lang['User status'] = 'Estat de l\'usuari';
+$lang['user_status_admin'] = 'Administrador';
+$lang['user_status_generic'] = 'Genèric';
+$lang['user_status_guest'] = 'Visitant';
+$lang['user_status_normal'] = 'Usuari';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Users'] = 'Usuaris';
+$lang['Virtual album'] = 'Categoria virtual';
+$lang['Waiting'] = 'Pendent';
+$lang['default'] = 'predeterminat';
+$lang['Toggle \'default group\' property'] = 'Commuta la propietat \'grup predeterminat\'';
+$lang['Advanced features'] = 'Funcions avançades';
+$lang['Overall'] = 'Informació general';
+$lang['Year'] = 'Any';
+$lang['Month'] = 'Mes';
+$lang['Day'] = 'Dia';
+$lang['Pages seen'] = 'Pàgines vistes';
+$lang['Time'] = 'Hora';
+$lang['User'] = 'Usuari';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Element';
+$lang['Section'] = 'Secció';
+$lang['Properties'] = 'Propietats';
+$lang['An information email was sent to group "%s"'] = 'S\'ha enviat al grup "%s" un correu electrònic informatiu';
+$lang['Send an information email to group members'] = 'Envia un correu electrònic informatiu als membres del grup';
+$lang['Group'] = 'Grup';
+$lang['[%s] Visit album %s'] = '[%s] Veniu a visitar la categoria %s';
+$lang['Hello,'] = 'Hola,';
+$lang['See you soon.'] = 'Fins aviat.';
+$lang['Discover album:'] = 'Veniu a descobrir la categoria:';
+$lang['Mail content'] = 'Contingut del correu';
+$lang['none'] = 'cap';
+$lang['high'] = 'alt';
+$lang['other'] = 'altre';
+$lang['Element type'] = 'Tipus d\'element';
+$lang['User'] = 'Usuari';
+$lang['Image id'] = 'Id d\'imatge';
+$lang['Summary'] = 'Resum';
+$lang['%d line filtered'] = '%d línia filtrada';
+$lang['%d lines filtered'] = '%d línies filtrades';
+$lang['%d guest'] = '%d visitant';
+$lang['%d guests'] = '%d visitants';
+$lang['Hour'] = 'Hora';
+$lang['guest'] = 'visitant';
+$lang['default values'] = 'valors predeterminats';
+$lang['Guest cannot be deleted'] = '\'Visitant\' no pot ser eliminat';
+$lang['Default user cannot be deleted'] = 'l\'usuari predeterminat no es pot eliminar';
+$lang['Purge history detail'] = 'Purga l\'historial del detall';
+$lang['Purge history summary'] = 'Purga l\'historial del resum';
+$lang['Check integrity'] = 'Comprova la integritat';
+$lang['Anomaly'] = 'Anomalia';
+$lang['Correction'] = 'Correcció';
+$lang['Automatic correction'] = 'Correció automàtica';
+$lang['Impossible automatic correction'] = 'No es possible la correcció automàtica';
+$lang['Correction applied with success'] = 'Correcció aplicada amb èxit';
+$lang['Correction applied with error'] = 'Correcció applicada amb errors';
+$lang['%d anomaly has been detected.'] = 'S\'ha detectat %d anomalia.';
+$lang['%d anomalies have been detected.'] = 'S\'han detectat %d anomalies.';
+$lang['%d anomaly has been corrected.'] = 'S\'ha corregit %d anomalia.';
+$lang['%d anomalies have been detected corrected.'] = 'S\'han corregit %d anomalies detectades.';
+$lang['%d anomaly has not been corrected.'] = 'L\'anomalia %d no s\'ha corregit.
+';
+$lang['%d anomalies have not been corrected.'] = 'No s\'han corregit %d anomalies.';
+$lang['Go to %s or %s for more informations'] = 'Aneu a %s o %s per a més informació';
+$lang['the forum'] = 'el fòrum';
+$lang['the wiki'] = 'la wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s valor de l\'arxiu no és correcte ja que Exif no és sorportat';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s s\'ha d\'establir a fals al fitxer local/config/config.inc.php';
+$lang['Main "guest" user does not exist'] = 'No existeix l\'usuari principal "guest"';
+$lang['Main "guest" user status is incorrect'] = 'L\'estat de l\'usuari principal "guest" és incorrecte';
+$lang['Default user does not exist'] = 'L\'usuari predeterminat no existeix';
+$lang['Main "webmaster" user does not exist'] = 'El principal usuari "webmaster" no existeix';
+$lang['Main "webmaster" user status is incorrect'] = 'L\'estat de l\'usuari principal "webmaster" és incorrecte';
+$lang['User "%s" created with "%s" like password'] = 'S\'ha creat l\'usuari "%s" amb contrasenya "%s"';
+$lang['Status of user "%s" updated'] = 'S\'ha actualitzat l\'estat de l\'usuari "%s"';
+$lang['add new photos to caddie'] = 'afegeix nous elements al carret';
+$lang['No display'] = 'Sense visualització';
+$lang['Classic display'] = 'Visualització clàssica';
+$lang['Hoverbox display'] = 'Visualització Hoverbox';
+$lang['Mail address is obligatory for all users'] = 'L\'adreça de correu és obligatòria per a tots els usuaris';
+$lang['Minimum privacy level'] = 'Nivell mínim de privacitat';
+$lang['Privacy level'] = 'Nivell de privacitat';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contactes';
+$lang['Level 2'] = 'Amics';
+$lang['Level 4'] = 'Família';
+$lang['Level 8'] = 'Admins';
+$lang['Reinitialize check integrity'] = 'Reinicia la comprovació de la integritat';
+$lang['Check all'] = 'Marca-ho tot';
+$lang['Uncheck all'] = 'Desmarca-ho tot';
+$lang['Check automatic corrections'] = 'Comprova les correccions automàtiques';
+$lang['Apply selected corrections'] = 'Aplica les correccions seleccionades';
+$lang['Ignore selected anomalies'] = 'Ignora les anomalies seleccionades';
+$lang['Refresh'] = 'Refresca';
+$lang['The anomaly will be ignored until next application version'] = 'L\'anomalia serà ignorada fins a la següent versió de l\'aplicació';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Correction the anomaly will cancel the fact that it\'s ignored'; //raríssim...
+$lang['%d anomaly has been ignored.'] = 'S\'ha ignorat l\'anomalia %d.';
+$lang['%d anomalies have been ignored.'] = 'S\'han ignorat les anomalies %d.';
+$lang['Plugins which need upgrade'] = 'Complements que necessiten actualitzar-se';
+$lang['Plugin list'] = 'Llista de complements';
+$lang['Check for updates'] = 'Comprovar actualitzacions';
+$lang['Other plugins'] = 'Altres complements';
+$lang['Last revisions'] = 'Últimes modificacions';
+$lang['Are you sure you want to delete this plugin?'] = 'Esteu segur que vols eliminar aquest connector?';
+$lang['Are you sure you want to install this plugin?'] = 'Esteu segur que voleu instal·lar aquest connector?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Esteu segur que voleu instal·lar aquesta actualització? Heu de verificar si aquesta versió no necessita ser desinstal·lada..';
+$lang['Plugin has been successfully copied'] = 'El complement s\'ha copiat correctament';
+$lang['You might go to plugin list to install and activate it.'] = 'Heu d\'anar a la llista de connectors instal·lats i activar-lo.';
+$lang['Can\'t create temporary file.'] = 'No es pot crear el fitxer temporal.';
+$lang['Can\'t download archive.'] = 'No es pot descarregar l\'arxiu.';
+$lang['Can\'t read or extract archive.'] = 'No es pot llegir o extreure l\'arxiu.';
+$lang['An error occured during extraction (%s).'] = 'Hi ha hagut un error durant l\'extracció (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Si us plau, reviseu els permisos de la carpeta "plugins" i les seves subcarpetes (CHMOD).';
+$lang['Can\'t connect to server.'] = 'No es pot conectar al servidor.';
+$lang['Purge compiled templates'] = 'Elimina les plantilles compilades';
+$lang['Upload'] = 'Penja';
+$lang['ACCESS_0'] = 'Lliure accés';
+$lang['ACCESS_1'] = 'Accés a tothom';
+$lang['ACCESS_2'] = 'Accés als qui estan subscrits';
+$lang['ACCESS_3'] = 'Accés als administradors';
+$lang['ACCESS_4'] = 'Accés als webmasters';
+$lang['ACCESS_5'] = 'Sense accés';
+$lang['Support'] = 'Suport';
+$lang['Documentation'] = 'Documentació';
+$lang['A new version of Piwigo is available.'] = 'Hi ha una nova versió de Piwigo disponible.';
+$lang['Piwigo Administration'] = 'Administració de Piwigo';
+$lang['Piwigo version'] = 'Versió de Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Esteu executant l\'última versió de Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'La versió instal·lada de %s [%s] no és compatible amb la versió requerida [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Necessiteu actualitzar el vostre sistema per tenir totes les funcionalitats de l\'aplicació, sinó l\'aplicació no funcionará correctament, o completament.';
+$lang['Deleted on'] = 'Eliminada el';
+$lang['Last hit'] =  'Última visualització';
+$lang['GD library is missing'] = 'No es troba la llibreria GD';
+$lang['Templates'] = 'Plantilles';
+$lang['Extend for templates'] = 'Extendre per a les plantilles';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Substitució de la plantilla d\'origen per la seva plantilla adaptada per l\'expedient template-extension';
+$lang['Replacers (customized templates)'] = 'Substituts (plantilles modificades)';
+$lang['Original templates'] = 'Plantilles d\'origen';
+$lang['Optional URL keyword'] = 'Paraula clau opcional a la URL';
+$lang['Templates configuration has been recorded.'] = 'La configuració de les plantilles ha estat registrada..';
+$lang['All optimizations have been successfully completed.'] = 'Totes les optimitzacions s\'han realizat correctament.';
+$lang['Optimizations have been completed with some errors.'] = 'Les optimitzacions s\'han realitzat amb errors.';
+$lang['Modify information'] = 'Modificar la informació';
+$lang['nothing'] = 'res';
+$lang['overrides existing values with empty ones'] = 'Restablir els valors existentes.';
+$lang['Manage photo ranks'] = "Administrar el orden de las fotos";
+$lang['Edit ranks'] = 'Modificar el orden';
+$lang['No photo in this album'] = 'Aquest àlbum no conté imatges';
+$lang['Images manual order was saved'] = 'L\'ordre manual de les imatges s\'ha desat correctament.';
+$lang['ranks'] = 'Filas';
+$lang['Drag to re-order'] = 'Fes clic i arrossega per a reorganitzar';
+$lang['Quick Local Synchronization'] = 'Sincronización Rápida';
+$lang['No photo can be deleted'] = 'Cap imatge pot ser eliminada';
+$lang['Delete selected photos'] = 'Elimina les imatges seleccionades';
+$lang['%d photo was deleted'] = '%d imatge eliminada';
+$lang['%d photos were deleted'] = '%d imatges eliminades';
+$lang['Released on'] = 'Llançat el';
+$lang['Number of downloads'] = 'Nombre de descàrregues';
+$lang['Piwigo Announcements Newsletter'] = 'Butlletí informatiu de Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Mantingue\'t informat quant al projecte Piwigo. Inscriu-te al butlletí de notícies. Rebràs un correu electrònic quan una nova versió estigui disponible (de vegades un bug de seguretat és corregit..., és important estar alerta) o que hi hagi un aconteixement important sobre el projecte. Únicament seràn alguns missatges durant l\'any.';
+$lang['Subscribe %s'] = 'Subscriure %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Subscriure %s al Butlletí de notícies de Piwigo';
+$lang['Purge search history'] = 'Purgar el historico de búsquedad';
+$lang['Hide'] = 'Amagar';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Sobrepasado el tiempo de ejecución, el procesamiento debe continuar [Tiempo estimado: %d secundas].';
+$lang['Operation in progress'] = 'Operación en progreso.';
+$lang['Please wait...'] = 'Si us plau, esperi...';
+$lang['Password is missing. Please enter the password.'] = 'Falta la clau d\'accès. Si us plau, introdueix-la.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'La confirmación de la contraseña faltó. Por favor, confirme la contraseña elegida.';
+$lang['Allow users to edit their own comments'] = 'Autoritzar als usuaris editar els seus propis comentaris';
+$lang['Allow users to delete their own comments'] = 'Autoritzar als usuaris eliminar els seus propis comentaris';
+$lang['Email administrators when a comment is modified'] = 'Notificar als administradors quan un comentari sigui modificat';
+$lang['Email administrators when a comment is deleted'] = 'Notificar a los administradores cuando un comentario es suprimido';
+$lang['Cannot delete the old permalink !'] = 'Impossible eliminar aquest enllaç permanent!';
+$lang['Hit'] = 'Accès';
+$lang['Tools'] = 'Eines';
+$lang['Photos'] = 'Imatges';
+$lang['Themes'] = 'Temes';
+$lang['Instructions to use Piwigo'] = 'Instruccions d\'ús de Piwigo';
+$lang['Installed Themes'] = 'Temes instal·lats';
+$lang['Add New Theme'] = 'Afegir un tema';
+$lang['Forbid this theme to users'] = 'Prohibir aquest tema als usuaris';
+$lang['Set as default theme for unregistered and new users'] = 'Tema per defecte pels visitants i els nous usuaris';
+$lang['unknown'] = 'desconegut';
+$lang['Upload Photos'] = 'Penjar imatges';
+$lang['Drop into album'] = 'Arrastrar a un álbum';
+$lang['+ Add an upload box'] = '+ Afegir caixa de transferència';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Cree el directorio "%s" en la raíz de su instalación Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dé permisos de escritura (chmod 777) al directorio "%s"  en la raíz de su instalación Piwigo';
+$lang['existing album'] = 'Àlbum existent';
+$lang['create a new album'] = 'Nou àlbum';
+$lang['Album name'] = 'Nombre del álbum';
+$lang['Album "%s" has been added'] = 'el álbum "%s" se ha añadido';
+$lang['Uploaded Photos'] = 'Fotos añadidas';
+$lang['%d photos uploaded'] = '%d imatges afegides';
+$lang['Privacy level set to "%s"'] = 'Nivel de confidencialidad "%s"';
+$lang['Album "%s" now contains %d photos'] = 'EL álbum "%s" ahora contiene %d fotos';
+$lang['Manage this set of %d photos'] = 'Administra aquest lot de %d imatges';
+$lang['Select files'] = 'Escoger ficheros';
+$lang['Everybody'] = 'Tothom';
+$lang['Who can see these photos?'] = 'Qui pot veure aquestes imatges?';
+$lang['Settings'] = 'Configuració';
+$lang['Resize'] = 'Redimensionar';
+$lang['Maximum Width'] = 'Ancho máxima';
+$lang['pixels'] = 'píxels';
+$lang['Maximum Height'] = 'Altura máxima';
+$lang['Image Quality'] = 'Qualitat d\'imatge';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['Save Settings'] = 'Desa la configuració';
+$lang['Your configuration settings are saved'] = 'Sus parámetros de configuraciones son registrados';
+$lang['Active Themes'] = 'Temas activados';
+$lang['Add write access to the "%s" directory'] = 'Permitir escritura en la carpeta "%s"';
+$lang['Administration Home'] = 'Panell d\'administració';
+$lang['Change Admin Colors'] = 'Intercaviar de color';
+$lang['Delete this theme'] = 'Elimina aquest tema';
+$lang['Directory does not exist'] = 'Aquest directori no existeix';
+$lang['FTP + Synchronization'] = 'FTP + Sincronització';
+$lang['Get Support on Piwigo Forum'] = 'Obtenir suport al forum de iwigo';
+$lang['Help Me'] = 'Ajuda';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Imposible activar el tema, falta el archivo %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Aquest tema no pot ser eliminat perquè n\'hi ha d\'altres que en depenen d\'ell: %s';
+$lang['Inactive Themes'] = 'Temes desactivats';
+$lang['Install on your computer,'] = 'Instal·lar al teu ordinador,';
+$lang['Make this theme available to users'] = 'Fer que aquest tema estigui disponible per als usuaris';
+$lang['Page end'] = 'Pàgina final';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Llegir la documentació de Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Inicia pLoader i afegeix les teves imatges.';
+$lang['Switch to clear or dark colors for administration'] = 'Escull colors clars o foscos per a l\'espai de gestió';
+$lang['Theme has been successfully installed'] = 'El tema s\'ha instal·lat amb èxit.';
+$lang['Visit Gallery'] = 'Visitar la galeria';
+$lang['Visit Piwigo project website'] = 'Visitar el sitio Web del proyecto Piwigo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'PLoader representa a <em>Piwigo Uploader</em>. Des del teu ordinador pLoader prepara les teves fotos i les trasllada a la teva galeria Piwigo.';
+$lang['Guest Settings'] = 'Ajustos del visitant';
+$lang['Main Page'] = 'Página principal';
+$lang['Photo Page'] = 'Página de la foto';
+$lang['Activate Navigation Bar'] = 'Activar la barra de navegación';
+$lang['Activate Navigation Thumbnails'] = 'Activar las miniaturas de navegación';
+$lang['Activate icon "%s"'] = 'Activado el icono "%s"';
+$lang['Photo Properties'] = 'Propiedades de la foto';
+$lang['Allow user customization'] = 'Permetre la personalització de l\'usuari';
+$lang['Languages'] = 'Idiomes';
+$lang['Installed Languages'] = 'Idiomes instal·lats';
+$lang['Add New Language'] = 'Afegir un nou idioma';
+$lang['Language has been successfully installed'] = 'L\'idioma s\'ha instal·lat correctament';
+$lang['Select:'] = 'Seleccionar:';
+$lang['None'] = 'Res';
+$lang['Invert'] = 'Invertir';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Impossible desactivar aquest tema, es necessita al menys un tema.';
+$lang['Webmaster status is required.'] = 'Cal tenir l\'estat de "webmaster".';
+$lang['Bound Theme'] = 'Tema relacionat';
+$lang['Allow rating'] = 'Permetre valoracions';
+$lang['Select at least one comment'] = 'Selecciona al menys un comentari';
+$lang['Active Plugins'] = 'Complements activats';
+$lang['Inactive Plugins'] = 'Complements desactivats';
+$lang['Missing Plugins'] = 'Complements que falten';
+$lang['Uninstalled Plugins'] = 'Complements desinstal·lats';
+$lang['By %s'] = 'Per %s';
+$lang['Visit plugin site'] = 'Visita el web del complement';
+$lang['Active Languages'] = 'Idiomes activats';
+$lang['Delete this language'] = 'Suprimeix aquest idioma';
+$lang['Forbid this language to users'] = 'Prohibeix aquest idioma als usuaris';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossible desactivar aquest idioma, primer cal definir-ne un altre per defecte.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossible desactivar aquest idioma, es necessita al menys un idioma.';
+$lang['Inactive Languages'] = 'Idiomes desactivats';
+$lang['Make this language available to users'] = 'Fer que aquest idioma estigui disponible per als usuaris';
+$lang['Set as default language for unregistered and new users'] = 'Idioma per defecte pels visitants i els nous usuaris';
+$lang['Miscellaneous'] = 'Més informació';
+$lang['Virtual Links'] = 'Enllaços virtuals';
+$lang['Add Photos'] = 'Afegeix imatges';
+$lang['The following tag was deleted'] = 'La següent etiqueta ha estat eliminada';
+$lang['There is no other language available.'] = 'No hi ha un altre idioma disponible';
+$lang['There is no other plugin available.'] = 'No hi ha cap complement disponible.';
+$lang['There is no other theme available.'] = 'No hi ha un altre tema disponible';
+$lang['By rank'] = 'Per classificació';
+$lang['Manual order'] = 'Ordre manual';
+$lang['Add another set of photos'] = 'Afegir un altre conjunt d\'imatges';
+$lang['Order of menubar items has been updated successfully.'] = 'L\'ordre de la barra de menú s\'ha actualitzat correctament.';
+$lang['This theme was not designed to be directly activated'] = 'Este tema no es concebido por ser acelerado directamente';
+$lang['Who can see this photo?'] = 'Qui pot veure aquesta imatge?';
+$lang['Pending Comments'] = 'Comentaris pendents';
+$lang['Menu Management'] = 'Gestionar el menú';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'A l\'arxiu php.ini, la variable upload_max_filesize (% SB) es major que post_max_size (SB%). Hauries de canviar aquesta configuració.';
+$lang['Exif extension not available, admin should disable exif use'] = 'L\'extensió Exif no està disponible. Un administrador hauria de desabilitar l\'ús de metadades Exif.';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'La mida de l\'arxiu pujat excedeix el valor upload_max_filesize de l\'arxiu php.ini: sB%';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'La mida total dels arxius que estàs pujant excedeix el valor post_max_size de l\'arxiu php.ini: sB%';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'La mida de l\'arxiu pujat excedeix el MAX_FILE_SIZE definit en el formulario HTML';
+$lang['The uploaded file was only partially uploaded'] = 'L\'arxiu s\'ha pujat només parcialment.';
+$lang['No file was uploaded'] = 'No s\'ha pujat cap arxiu';
+$lang['Missing a temporary folder'] = 'No es troba el directori temporal';
+$lang['Failed to write file to disk'] = 'No s\'ha pogut escriure el fitxer al disc del servidor';
+$lang['File upload stopped by extension'] = 'La transferència d\'arxius s\'ha detingut por una extensió';
+$lang['Unknown upload error'] = 'Error desconegut al pujar elements';
+$lang['Error on file "%s" : %s'] = 'Error en el archivo "%s" : %s';
+$lang['automatic order'] = 'orden automático';
+$lang['manual order'] = 'Ordre manual';
+$lang['Albums automatically sorted'] = 'Àlbums classificats correctament';
+$lang['Batch Manager'] = 'Gestió de lots';
+$lang['include child albums'] = 'Incloure els sub-àlbums';
+$lang['Selection'] = 'Selección';
+$lang['Action'] = 'Acción';
+$lang['Set author'] = 'Establir autor';
+$lang['Set title'] = 'Establir el títol';
+$lang['Set creation date'] = 'Establir la data de creació';
+$lang['Apply action'] = 'Aplicar la acción';
+$lang['on the %d selected photos'] = 'en les %d imatges seleccionades';
+$lang['%d of %d photos selected'] = '%d fotos sobre %d estan selecciónadas';
+$lang['No photo selected, %d photos in current set'] = 'Cap imatge seleccionada entre les %d imatges del lot';
+$lang['All %d photos are selected'] = 'Totes les %d imatges del lot han sigut seleccionades';
+$lang['remove this filter'] = 'elimina aquest filtre';
+$lang['Add a filter'] = 'Agregar un filtro';
+$lang['Remove all filters'] = 'Eliminar tots els filtres';
+$lang['Refresh photo set'] = 'Actualitza el lot d\'imatges';
+$lang['The whole page'] = 'Página sencera';
+$lang['The whole set'] = 'Tot el conjunt';
+$lang['No photo in the current set.'] = 'No hi ha imatges en aquest lot.';
+$lang['No photo selected, no action possible.'] = 'No s\'ha seleccionat cap imatge, per tant, no hi ha possible acció a executar.';
+$lang['Choose an action'] = 'Seleccione una acción';
+$lang['remove author'] = 'eliminar l\'autor';
+$lang['Type here the author name'] = 'Escriu aquí el nom de l\'autor';
+$lang['remove title'] = 'elimina el títol';
+$lang['Type here the title'] = 'Escriu aquí el títol';
+$lang['remove creation date'] = 'eliminar la data de creació';
+$lang['Album photos associated to the following albums: %s'] = 'Las fotos del álbum se han asociado con los àlbumes sigientes: %s';
+$lang['Delete orphan tags'] = 'Eliminar las etiquetas huerfanas ';
+$lang['delete photo'] = 'Eliminar la foto';
+$lang['Orphan tags deleted'] = 'Etiquetes orfes eliminades';
+$lang['Week starts on'] = 'La setmana comença en';
+$lang['You have %d orphan tags: %s.'] = 'Tens %d etiquetes orfes: %s.';
+$lang['Remove from caddie'] = 'Treu-lo del carret';
+$lang['Themes which need upgrade'] = 'Temes per actualitzar';
+$lang['Languages which need upgrade'] = 'Idiomes per actualitzar';
+$lang['All themes are up to date.'] = 'Todos los temas están actualizados.';
+$lang['All plugins are up to date.'] = 'Tots els complements estàn actualizats.';
+$lang['All languages are up to date.'] = 'Totes els idiomes estàn actualitzats.';
+$lang['Visit theme site'] = 'Visita el web del tema';
+$lang['Visit language site'] = 'Visita el sitio web del idioma';
+$lang['New Version'] = 'Nova versió';
+$lang['Obsolete Plugins'] = 'Complements obsolets';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ADVERTÈNCIA! Aquest complement sembla no ser compatible amb la teva versió de Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Vols activar-ho de totes maneres?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'AQUEST COMPLEMENT ÉS ARA PART DEL CORE DE PIWIGO! DESINSTAL·LA\'L! ';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERROR: FALTA AQUEST COMPLEMENT TOT I QUE INDIQUI QUE ESTÀ INSTAL·LAT. DESINSTAL·LA\'L!';
+$lang['Thumbnails generation in progress...'] = 'Generació de miniatures en curs...';
+$lang['Photos generation in progress...'] = 'Generació d\'imatges en curs...';
+$lang['%s photos have been regenerated'] = '%s imatges han sigut regenerades';
+$lang['%s photos can not be regenerated'] = '%s imatges no poden ser regenerades';
+$lang['display'] = 'Visualizar';
+$lang['Type in a search term'] = 'Escriu un terme de cerca';
+$lang['new'] = 'nou';
+$lang['No results'] = 'Sense resultats.';
+$lang['Searching...'] = 'Buscant...';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activar el icono "nuevo" al lado de álbumes y fotos';
+$lang['Add a criteria'] = 'Añadir un criterio';
+$lang['Deactivate all'] = 'Desactivar todo';
+$lang['Default photos order'] = 'Orden de las fotos por defecto';
+$lang['Restore'] = 'Restaurar';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaurar la configuració per defecte. Perdràs la configuració dels complements!';
+$lang['Show menubar'] = 'Mostrar barra de menú';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'No es pot definir un ordre d\'imatges per defecte ja que tenen una configuració personalitzada en la configuració local.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Has especificat <i>$conf[\'order_by\']</ i> en el teu arxiu de configuració local. Aquest paràmetre està obsolet. Elimina\'l o canvia-li en nom a <i>$conf[\'order_by_custom\']</ i>!';
+$lang['Updates'] = 'Actualizaciones';
+$lang['Update in progress... Please wait.'] = 'Actualització en curs... Si us plau, esperi.';
+$lang['Ignore this update'] = 'Ignora aquesta actualització';
+$lang['Reset ignored updates'] = 'Restablieix les actualitzacions que han estat omeses';
+$lang['Update All'] = 'actualizar tot';
+$lang['ERROR'] = 'ERROR';
+$lang['Update Complete'] = 'actualització completa';
+$lang['Piwigo Update'] = 'Piwigo Update';
+$lang['Extensions Update'] = 'Actualitzar extensions';
+$lang['All extensions are up to date.'] = 'Totes les extensions estàn actualitzades.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Els següents complements poden no ser compatibles amb la nova versió de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Els següents temes poden no ser compatibles amb la nova versió de Piwigo:';
+$lang['I decide to update anyway'] = 'Decideixo actualitzat de totes maneres';
+$lang['Update to Piwigo %s'] = 'Actualitzar a Piwigo %s';
+$lang['Two updates are available'] = 'Dues actualitzacions estàn disponibles';
+$lang['This is a minor update, with only bug corrections.'] = 'Aquesta és una actualització menor, només amb correccions d\'errors.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Esta es una actualización importante, con <a href="%s">nuevas características emocionantes</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Alguns dels temes i complements poden encara no estar disponibles.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Pots actualitzar a Piwigo %s directament, sense necessitat d\'actualizar a Piwigo %s (recomanat).';
+$lang['Save Template Directory'] = 'Desa directori de plantilles';
+$lang['Dump Database'] = 'volcar la base de dades';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Incloure la informació de l\'historial. (Advertència: el límit de memòria del servidor pot ser superat)';
+$lang['Unable to dump database.'] = 'No és possible volcar la base de dades.';
+$lang['Some upgrades are available for extensions.'] = 'Actualitzacions disponibles per a les extensiones.';
+$lang['Ignore All'] = 'Ignorar tot';
+$lang['Crop'] = 'Redimensionar ';
+$lang['Width'] = 'Ample';
+$lang['Height'] = 'Altura';
+$lang['Follow Orientation'] = 'Segueixen la orientació';
+$lang['Graphics Library'] = 'llibreria gràfica';
+$lang['Learn more'] = 'Més informació';
+$lang['Rate'] = 'Valoració';
+$lang['Average rate'] = 'Valoració promig';
+$lang['... or '] = '... o ';
+$lang['Create'] = 'Crear';
+$lang['Start Upload'] = 'Inicia la transferència';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Utiliza el formulario de Flash. Problemas? intentar el <a href="%s">formulario HTML</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Se utiliza el formulario HTML. Intentar el <a href="%s">formulario Flash</a>';
+$lang['Maximum file size: %sB.'] = 'Mida màxima dels arxius : %sB.';
+$lang['Allowed file types: %s.'] = 'Tipus d\'arxius permesos : %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Ressolució màxima aproximada : %dM píxels (és a dir %dx%d píxels).';
+$lang['Manage Permissions'] = 'Administrar permisos';
+$lang['Photo %s of %s'] = 'Imatge %s de %s';
+$lang['show details'] = 'Mostrar detalls';
+$lang['hide details'] = 'ocultar detalls';
+$lang['Merge tags'] = 'Fusionar etiquetes';
+$lang['Select the destination tag'] = 'Selecciona l\'etiqueta de destí';
+$lang['(this tag will be deleted)'] = '(aquesta etiqueta s\'eliminarà)';
+$lang['Confirm merge'] = 'Confirmar la fusión';
+$lang['Merge selected tags'] = 'Fusionar les etiquetes seleccionades';
+$lang['No destination tag selected'] = 'No has seleccionat una etiqueta de destí';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Les etiquetes <em>%s</em> han estat fusionades amb l\'etiqueta <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Seleccioni al menys dues etiquetes per a la fusió';
+$lang['Select an album'] = 'Selecciona un àlbum';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Per defecte, Piwigo crearà una nova mida del web procedent de les imatges en mode d\'alta qualitat';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Si no està disponible en alta qualitat i la mida actual es més gran que les dimensions del canvi de mida, es considerarà \'alta qualitat\' (HD) tot i què finalment caldrà reduir la mida de la imatge.';
+$lang['An error has occured during upgrade.'] = 'Hi ha hagut un error durante el procés d\'actualització.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Imposible extraer los ficheros. Por favor, verifique los permisos de los ficheros de su instalación. <Br> <a href="%s"> Haga clic aquí para ver el informe de error</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo no pot recuperar l\'arxiu d\'actualització del servidor';
+$lang['Updates'] = 'Actualitzacions';
+$lang['%s has been successfully updated.'] = '%s s\'ha actualitzat correctament.';
+$lang['A locked gallery is only visible to administrators'] = 'Una galeria blocada només és visible per als administradors';
+$lang['Activate comments'] = 'Activar comentaris';
+$lang['Add tags'] = 'Afegir etiquetes';
+$lang['Add to caddie'] = 'Afegir al carret';
+$lang['Applications'] = 'Aplicacions';
+$lang['Automatic sort order'] = 'Ordre automàtic';
+$lang['Available on'] = 'Disponible en';
+$lang['Available versions for'] = 'Versions disponibles per';
+$lang['Cancel'] = 'Cancel·lar';
+$lang['Center of interest'] = 'Centre d\'interès';
+$lang['Default comments order'] = 'Ordre dels comentaris per defecte';
+$lang['Delete multiple size images'] = 'Eliminar imatges de múltiples mides';
+$lang['Duplicates'] = 'Duplicats';
+$lang['Gallery unlocked'] = 'Galeria desblocada';
+$lang['Generate multiple size images'] = 'Generar imatges de múltiples mides';
+$lang['Groups and users'] = 'Grups i usuaris';
+$lang['Last import'] = 'Últim importat';
+$lang['List'] = 'Llista';
+$lang['Move to album'] = 'Moure a l\'àlbum';
+$lang['Multiple Size'] = 'Mida múltiple';
+$lang['Notify administrators when a comment is'] = 'Notificar als administradors quan un comentari segui';
+$lang['Original Size'] = 'Mida original';
+$lang['Permission granted for groups'] = 'Permisos concedits per a grups';
+$lang['Permission granted for users'] = 'Es concedeix permís als usuaris';
+$lang['Photo name'] = 'Nom de la imatge';
+$lang['Piwigo for Android'] = 'Piwigo per Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo per iOS (iPhone, iPad, iPod Touch)';
+$lang['Predefined filter'] = 'Filtre predeterminat';
+$lang['Resize after upload'] = 'Canviar de mida després de pujar-la';
+$lang['Save manual order'] = 'Desar ordre manual';
+$lang['Save visits in history for'] = 'Guardar les visites a l\'historial per';
+$lang['Select a file'] = 'Selecciona un arxiu';
+$lang['Select groups...'] = 'Seleccionar grups...';
+$lang['Select users...'] = 'Seleccionar usuaris...';
+$lang['Send connection settings by email'] = 'Enviar paràmetres de conexió per correu electrònic';
+$lang['Synchronize metadata'] = 'Sincronitzar metadades';
+$lang['The original image quality must be a number between %d and %d'] = 'La qualitat de la imatge original ha de ser un número comprès entre %d i %d.';
+$lang['There is no group in this gallery.'] = 'No hi ha cap grup en aquesta galeria.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Aquest àlbum conté %d imatges, afegides entre %s i $s.';
+$lang['This album contains %d photos, added on %s.'] = 'Aquest àlbum conté %d imatges, afegides el %s.';
+$lang['This album contains no photo.'] = 'Aquest àlbum no conté imatges.';
+$lang['Unlock gallery'] = 'Desblocar galeria';
+$lang['With no album'] = 'Sense àlbums';
+$lang['With no tag'] = 'Sense etiquetes';
+$lang['With no virtual album'] = 'Sense àlbum virtual';
+$lang['You can activate only one mobile theme.'] = 'Només pots activar un tema pel mòbil.';
+$lang['Zoom'] = 'Ampliar';
+$lang['add a new watermark'] = 'afegir una nova marca d\'aigua';
+$lang['administrators'] = 'administradors';
+$lang['apply automatic sort order'] = 'Ordenar-ho automàticament';
+$lang['cancel manual order'] = 'cancel·lar l\'ordre manual';
+$lang['custom'] = 'Personalitzar';
+$lang['modified'] = 'modificat';
+$lang['pending validation'] = 'pendent de validació';
+$lang['registered users'] = 'usuaris registrats';
+$lang['%d group'] = '%d grup';
+$lang['%d groups'] = '%d grups';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u usuaris han obtingut permisos automàticament perquè pertanyen a un grup que ha estat autoritzat.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo per Android</em> Aquesta aplicació et permet connectar-te a la teva galeria Piwigo des del teu dispositiu Android, crear nous àlbums així com pujar les imatges que vulguis allà on estiguis.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo per iOS</em> Aquesta aplicació et permet connectar-te a la teva galeria Piwigo des del teu iPhone, iPad o iPod Touch, crear nous àlbums així com pujar les imatges que vulguis allà on estiguis.';
+$lang['Add group'] = 'Afegir grup';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom és un programari de fotografia dissenyat per a l\'administració de grans quantitats d\'imatges digitals i realitzar tasques de postproducció.';
+$lang['Albums authorized thanks to group associations'] = 'Àlbums autoritzats gràcies a les associacions de grups';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture és una poderosa eina per perfeccionar les imatges i gestionar grans biblioteques per a Mac';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture s\'ha dissenyat per als fotògrafs professionals amb la senzillesa de iPhoto.';
+$lang['Apply watermark if height is bigger than'] = 'Aplicar marca d\'aigua si l\'altura és major que';
+$lang['Apply watermark if width is bigger than'] = 'Aplicar marca d\'aigua si l\'ample és més gran que';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Per defecte, el centre d\'interès es col·loca al centre de la imatge.';
+$lang['Comments for all'] = 'Comentaris per a tots';
+$lang['Delete Representant'] = 'Eliminar miniatura de l\'àlbum';
+$lang['Delete selected tags'] = 'Eliminar etiquetes seleccionades';
+$lang['Delete selected users'] = 'Eliminar usuaris seleccionats';
+$lang['Deny selected groups'] = 'Denegar als grups seleccionats';
+$lang['Download,'] = 'Descarregar,';
+$lang['Downloads'] = 'Descàrregues';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Les característiques inclouen la navegació per la galeria, la creació d\'àlbum pujar imatges.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Per a les imatges amb mides sesgades, per exemple les cuadrades, Piwigo farà tot el possible per a ressaltar-ne el seu centre d\'interès.';
+$lang['Grant selected groups'] = 'Permetre als grups seleccionats';
+$lang['Manage permissions for group "%s"'] = 'Administració de permisos per al grup "%s"';
+$lang['Metadata synchronized from file'] = 'Metadades sincronitzades de l\'arxiu';
+$lang['No group is permitted to see this private album'] = 'A cap grup se li permet veure aquest àlbum privat';
+$lang['Not cropped correctly?'] = 'No s\'ha retallat correctament?';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Per a Linux, només cal instal·lar Shotwell amb el seu gestor de paquets i l\'opció d\'activar la publicació d\'Piwigo.';
+$lang['Opacity'] = 'Opacitat';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s s\'ha utilitzat anteriorment per l\'àlbum %s. Esborra\'l primer del historial de permalinks';
+$lang['Permission granted thanks to a group'] = 'Permís concedit gràcies a un grup';
+$lang['Permission management'] = 'Gestió de permisos';
+$lang['Photo sizes with crop'] = 'Imatges amb mides sesgades';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Complement Piwigo Publish per Lightroom';
+$lang['Piwigo export plugin for Aperture'] = 'Complement Piwigo Export per Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Complement Piwigo Export per iPhoto';
+$lang['Piwigo publish plugin for Shotwell'] = 'Complement Piwigo Publish per Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Complement Piwigo Publish per digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (client RemoteGallery per Android) és un codi obert (GPL v3) Piwigo client per a la plataforma Android.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Seleccioneu una zona amb el ratolí per definir un nou centre d\'interès.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell és un organitzador de codi obert digital que s\'executa a Linux. És el gestor de fotos per defecte en Ubuntu i Fedora.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'El complement Piwigo Export li permet crear àlbums i exportar imatges.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'El complement Piwigo Publish et permet exportar i sincronitzar imatges des de Lightroom directament a la seva galeria de fotos Piwigo.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'El centre d\'interès és la zona més significativa a la imatge.';
+$lang['The original maximum height must be a number between %d and %d'] = 'L\'alçada màxima original ha de ser un número entre %d i %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'L\'amplada màxima original ha de ser un número entre %d i %d';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Per a exportar les teves imatges des de digiKam a Piwigo, hauràs d\'instal·lar els complements digiKam i Kipi.';
+$lang['Web Form'] = 'Formulari web';
+$lang['X Position'] = 'Posició X';
+$lang['X Repeat'] = 'Repeteix X';
+$lang['Y Position'] = 'Posició Y';
+$lang['any visitor can see this album'] = 'cap visitant pot veure aquest àlbum';
+$lang['associate to group'] = 'Associar al grup';
+$lang['bottom left corner'] = 'racó inferior esquerre';
+$lang['bottom right corner'] = 'racó inferior dret';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam és un avançat software de gestió de fotografies digitals lliure per a Linux, Windows i MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam està dissenyat per als fotògrafs que volen veure, administrar, editar, millorar, organitzar, etiquetar i compartir fotografies.';
+$lang['dissociate from group'] = 'dissociar del grup';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto és el gestor de fotos per defecte en MacOSX. El complement d\'exportació Piwigo li permeten crear nous àlbums i exportar les teves fotos directament des d\'iPhoto a la teva galeria de fotos Piwigo.';
+$lang['include photos with lower privacy level'] = 'incloure imatges amb el mínim nivell de privacitat';
+$lang['middle'] = 'mig';
+$lang['simple visitors'] = 'simples visitants';
+$lang['top left corner'] = 'racó superior esquerre';
+$lang['top right corner'] = 'racó superior dret';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'els visitants han d\'autenticar-se i disposar dels permisos adequats per veure aquest àlbum';
+$lang['Last send'] = 'Últim enviament';
+$lang['group "%s" added'] = 'grups "%s" afegits';
+$lang['group "%s" deleted'] = 'grups "%s" eliminats';
+?>
Index: tags/2.4.0RC3/language/ca_ES/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ca_ES/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Català [CA]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=413
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Català';
+$lang_info['country'] = 'Catalunya/Spain';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ca';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d àlbum actualitzat';
+$lang['%d albums updated'] = '%d àlbums actualitzats';
+$lang['%d comment to validate'] = '%d comentari per validar';
+$lang['%d comments to validate'] = '%d comentaris per validar';
+$lang['%d new comment'] = '%d nou comentari';
+$lang['%d new comments'] = '%d nous comentaris';
+$lang['%d comment'] = '%d comentari';
+$lang['%d comments'] = '%d comentaris';
+$lang['%d hit'] = '%d visites';
+$lang['%d hits'] = '%d visites';
+$lang['%d new photo'] = '%d nova imatge';
+$lang['%d new photos'] = '%d noves imatges';
+$lang['%d new user'] = '%d nou usuari';
+$lang['%d new users'] = '%d nous usuaris';
+$lang['About'] = 'Quant a';
+$lang['All tags'] = 'Totes les etiquetes';
+$lang['Any tag'] = 'Qualsevol etiqueta';
+$lang['At least one listed rule must be satisfied.'] = 'Almenys cal satisfer un criteria de la llista .';
+$lang['Albums'] = 'Àlbums';
+$lang['Album'] = 'Àlbum';
+$lang['Close this window'] = 'Tancar la finestra';
+$lang['Complete RSS feed (photos, comments)'] = 'Canal RSS complet (imatges, comentaris)';
+$lang['Confirm Password'] = 'Confirma la clau d\'accès';
+$lang['Connection settings'] = 'Paràmetres de connexió';
+$lang['Login'] = 'Identifica\'t';
+$lang['Contact webmaster'] = 'Contacta amb l\'administrador del web';
+$lang['Create a new account'] = 'Crea\'t un compte d\'usuari';
+$lang['Created on'] = 'Creada el';
+$lang['Creation date'] = 'Data de creació';
+$lang['Current password is wrong'] = 'L\'actual clau d\'accès és errònia';
+$lang['Dimensions'] = 'Dimensions';
+$lang['Display'] = 'Visualitzar';
+$lang['Each listed rule must be satisfied.'] = 'S\'ha de satisfer cada regla llistada.';
+$lang['Email address'] = 'Correu electrònic';
+$lang['Enter your personnal informations'] = 'Introdueix la teva informació personal';
+$lang['Error sending email'] = 'Error enviant el correu electrònic';
+$lang['File name'] = 'Nom d\'arxiu';
+$lang['File'] = 'Arxiu';
+$lang['Filesize'] = 'Mida';
+$lang['Filter and display'] = 'Filtrar i visualitzar';
+$lang['Filter'] = 'Filtrar';
+$lang['Forgot your password?'] = 'Has oblidat la teva clau d\'accès?';
+$lang['Go through the gallery as a visitor'] = 'Entra a la galeria com a visitant';
+$lang['Help'] = 'Ajuda';
+$lang['Identification'] = 'Autenticació';
+$lang['Photos only RSS feed'] = 'Canal RSS només d\'imatges';
+$lang['Keyword'] = 'Paraula clau';
+$lang['Links'] = 'Enllaços';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Nou a %s';
+$lang['Notification'] = 'Notificació';
+$lang['Number of items'] = 'Nombre d\'elements';
+$lang['Original dimensions'] = 'Dimensions originals';
+$lang['Password forgotten'] = 'He oblidat la meva clau d\'accès. Recorda\'m-la!';
+$lang['Password'] = 'Clau';
+$lang['Post date'] = 'Data de publicació';
+$lang['Posted on'] = 'Publicada el';
+$lang['Profile'] = 'Perfil';
+$lang['Quick connect'] = 'Connexió ràpida';
+$lang['RSS feed'] = 'Canal RSS';
+$lang['Register'] = 'Inscriu-te';
+$lang['Registration'] = 'Registre';
+$lang['Related tags'] = 'Etiquetes afins';
+$lang['Reset'] = 'Reinicia';
+$lang['Retrieve password'] = 'Recuperar la clau d\'accès';
+$lang['Search rules'] = 'Criteris de cerca';
+$lang['Search tags'] = 'Cerca etiquetes';
+$lang['Search'] = 'Cercar';
+$lang['display available tags'] = 'Mostrar etiquetes disponibles';
+$lang['Since'] = 'Des de';
+$lang['Sort by'] = 'Ordenar per';
+$lang['Sort order'] = 'Ordenar';
+$lang['Tag'] = 'Etiqueta';
+$lang['Tags'] = 'Etiquetes';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'La font de redifusió amb format RSS et proporciona notificacions automàtiques de les novetats d\'aquest lloc web: noves fotos, actualitzacions en els àlbums, nous comentaris... Utilitza un lector de canal RSS.';
+$lang['Unknown feed identifier'] = 'Identificador de canal desconegut';
+$lang['User comments'] = 'Comentaris dels usuaris';
+$lang['Username'] = 'Usuari';
+$lang['Visits'] = 'Visites';
+$lang['Webmaster'] = 'webmaster';
+$lang['Week %d'] = 'Setmana %d';
+$lang['About Piwigo'] = 'Quant a Piwigo';
+$lang['You are not authorized to access the requested page'] = 'No esteu autoritzats a accedir en aquesta pàgina';
+$lang['add this photo to your favorites'] = 'Inclou-la a preferits';
+$lang['Administration'] = 'Administrar';
+$lang['all'] = 'tot';
+$lang['ascending'] = 'ascendent';
+$lang['author(s) : %s'] = 'autor(s) : %s';
+$lang['Expand all albums'] = 'Expandeix tots els àlbums';
+$lang['posted after %s (%s)'] = 'Publicades després %s (%s)';
+$lang['posted before %s (%s)'] = 'Publicades abans %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'Publicades entre %s (%s) i %s (%s)';
+$lang['posted on %s'] = 'Publicades el %s';
+$lang['Best rated'] = 'Millor valorades';
+$lang['display best rated photos'] = 'visualitza els elements més valorats';
+$lang['Calendar'] = 'Calendari';
+$lang['All'] = 'TOT';
+$lang['display each day with photos, month per month'] = 'visualitza les imatges per dia, mes a mes';
+$lang['View'] = 'Visualitzar';
+$lang['chronology_monthly_calendar'] = 'Cronologia mensual';
+$lang['chronology_monthly_list'] = 'Llista mensual';
+$lang['chronology_weekly_list'] = 'Llista setmanal';
+$lang['Click here if your browser does not automatically forward you'] = 'Cliqueu aquí si el vostre navegador no us redirecciona';
+$lang['comment date'] = 'Data del comentari';
+$lang['Comment'] = 'Comentari';
+$lang['Your comment has been registered'] = 'El vostre comentari ha estat registrat';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema de prevenció anti col·lapse. Si us plau, espereu un moment abans de provar d\'enviar un altre comentari. El servidor està processant peticions d\'altres usuaris.';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Atenció, el comentari NO serà publicat perquè no ha ha estat validat correctament.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un administrador ha d\'autoritzar el teu comentari per a què sigui visible.';
+$lang['This login is already used by another user'] = 'Aquest nom d\'usuari ja està en ús per un altre usuari';
+$lang['Comments'] = 'Comentaris';
+$lang['Add a comment'] = 'Afegeix un comentari';
+$lang['created after %s (%s)'] = 'creat després %s (%s)';
+$lang['created before %s (%s)'] = 'creat abans %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'creat entre %s (%s) i %s (%s)';
+$lang['created on %s'] = 'creada el %s';
+$lang['Customize'] = 'Personalitzar';
+$lang['Your Gallery Customization'] = 'Personalitza la galeria';
+$lang['day'][0] = 'Diumenge';
+$lang['day'][1] = 'Dilluns';
+$lang['day'][2] = 'Dimarts';
+$lang['day'][3] = 'Dimecres';
+$lang['day'][4] = 'Dijous';
+$lang['day'][5] = 'Divendres';
+$lang['day'][6] = 'Dissabte';
+$lang['Default'] = 'Per defecte';
+$lang['delete this photo from your favorites'] = 'Elimina aquesta imatge de les teves preferides';
+$lang['descending'] = 'descendent';
+$lang['edit'] = 'editar';
+$lang['wrong date'] = 'data errònia';
+$lang['excluded'] = 'exclosa';
+$lang['Your favorites'] = 'Preferides';
+$lang['display your favorites photos'] = 'Visualitza les teves imatges preferides';
+$lang['Favorites'] = 'Preferides';
+$lang['First'] = 'Primera';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'La galeria roman tancada temporalment per tasques de manteniment. Si us plau, torna al cap d\'una estona i disculpa les molèsties.';
+$lang['Page generated in'] = 'Pàgina generada en';
+$lang['guest'] = 'convidat';
+$lang['Hello'] = 'Hola';
+$lang['available for administrators only'] = 'disponible només per a administradors';
+$lang['display this album'] = 'mostra imatges a l\'arrel d\'aquest àlbum';
+$lang['display last user comments'] = 'Veure els últims comentaris dels usuaris';
+$lang['customize the appareance of the gallery'] = 'Personalitza l\'aparença';
+$lang['search'] = 'cercar';
+$lang['in this album'] = 'en aquest àlbum';
+$lang['in %d sub-album'] = 'en %d sub-àlbum';
+$lang['in %d sub-albums'] = 'en %d sub-àlbums';
+$lang['included'] = 'inclòs';
+$lang['Invalid password!'] = 'Clau d\'accès no vàlida!';
+$lang['Language']='Idioma';
+$lang['last %d days'] = 'últims %d dies';
+$lang['Last'] = 'Última';
+$lang['Logout'] = 'Tancar sessió';
+$lang['obligatory'] = 'obligatori';
+$lang['Maximum photo height'] = 'Alçada màxima de les imatges';
+$lang['Maximum height must be a number superior to 50'] = 'L\'alçada màxima ha de ser un número superior a 50';
+$lang['Maximum photo width'] = 'Amplada màxima de les imatges';
+$lang['Maximum width must be a number superior to 50'] = 'L\'amplada màxima ha de ser un número superior a 50';
+$lang['display a calendar by creation date'] = 'Calendari segons la data de creació';
+$lang['display all photos in all sub-albums'] = 'Vista per miniatures';
+$lang['return to normal view mode'] = 'Vista per directoris';
+$lang['display a calendar by posted date'] = 'Calendari segons la data de publicació';
+$lang['month'][10] = 'Octubre';
+$lang['month'][11] = 'Novembre';
+$lang['month'][12] = 'Desembre';
+$lang['month'][1] = 'Gener';
+$lang['month'][2] = 'Febrer';
+$lang['month'][3] = 'Març';
+$lang['month'][4] = 'Abril';
+$lang['month'][5] = 'Maig';
+$lang['month'][6] = 'Juny';
+$lang['month'][7] = 'Juliol';
+$lang['month'][8] = 'Agost';
+$lang['month'][9] = 'Setembre';
+$lang['Most visited'] = 'Més visitades';
+$lang['display most visited photos'] = 'visualitza les imatges més vistes';
+$lang['The number of photos per page must be a not null scalar'] = 'El nombre d\'imatges per pàgina ha de ser un escalar no nul';
+$lang['Number of photos per page'] = 'Nombre d\'imatges per pàgina';
+$lang['Unknown identifier'] = 'Identificador desconegut';
+$lang['New password'] = 'Nova clau d\'accès';
+$lang['Rate this photo'] = 'Valora aquesta imatge';
+$lang['Next'] = 'Següent';
+$lang['Home'] = 'Inici';
+$lang['no rate'] = 'sense valorar';
+$lang['photos posted during the last %d days'] = "Imatges publicades durant els últims %d dies.";
+$lang['Photos posted within the last %d day.'] = "Imatge publicads aquest %d.";
+$lang['Photos posted within the last %d days.'] = "Només es mostren les imatges publicades durant els últims %d dies.";
+$lang['password updated'] = 'Clau d\'accès actualitzada';
+$lang['Recent period must be a positive integer value'] = 'El periode ha de ser un valor enter positiu';
+$lang['photo'] = 'Imatge'; /* DEPRECATED USED IN comments.php FOR image_id ? */ 
+$lang['Click on the photo to see it in high definition'] = 'Clica sobre la imatge per a veure-la amb alta qualitat';
+$lang['Show file metadata'] = 'Mostrar la informació del dispositiu (metadades Exif)';
+$lang['Powered by'] = 'Desenvolupat per';
+$lang['Preferences'] = 'Preferències';
+$lang['Previous'] = 'Anterior';
+$lang['Random photos'] = 'A l\'atzar';
+$lang['display a set of random photos'] = 'visualitza un conjunt d\'imatges a l\'atzar';
+$lang['Recent albums'] = 'Últims àlbums';
+$lang['display recently updated albums'] = 'visualitza els àlbums actualitzats recentment';
+$lang['Recent period'] = 'Període recent';
+$lang['Recent photos'] = 'Més recents';
+$lang['display most recent photos'] = 'visualitza les imatges més recents';
+$lang['Redirection...'] = 'Redirecció...';
+$lang['Please, enter a login'] = 'Si us plau, introduïu les dades d\'autenticació';
+$lang['login mustn\'t end with a space character'] = 'el nom d\'usuari no pot acabar amb el caràcter de l\'espai';
+$lang['login mustn\'t start with a space character'] = 'el nom d\usuari no pot començar amb el caràcter de l\'espai';
+$lang['this login is already used'] = 'aquest nom d\'usuari ja s\'està utilitzant';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'adreça de correu ha de ser com xxx@yyy.eee (exemple: jack@altern.org)';
+$lang['please enter your password again'] = 'Si us plau, introdueix la clau d\'accès una altra vegada';
+$lang['Auto login'] = 'Recorda-ho';
+$lang['remove this tag from the list'] = 'elimina aquesta etiqueta de la llista';
+$lang['representative'] = 'Representar';
+$lang['Search for Author'] = 'Cerca per autor';
+$lang['Search in albums'] = 'Cercar en els àlbums';
+$lang['Date'] = 'Data inicial';
+$lang['End-Date'] = 'Data final';
+$lang['Kind of date'] = 'Quina?';
+$lang['Search for words'] = 'Cerca per paraules';
+$lang['Search for all terms'] = 'Cerca per tots els termes';
+$lang['Empty query. No criteria has been entered.'] = 'No has introduït cap criteri de cerca.';
+$lang['Search results'] = 'Resultats de la cerca';
+$lang['Search in sub-albums'] = 'Cerca en els sub-àlbums';
+$lang['searched words : %s'] = 'paraules trobades : %s';
+$lang['Contact'] = 'Contacta amb el';
+$lang['set as album representative'] = 'Estableix com a miniatura de l\'àlbum';
+$lang['Show number of comments'] = 'Mostra el número de comentaris';
+$lang['Show number of hits'] = 'Mostra el número de visualitzacions';
+$lang['slideshow'] = 'Presentació de diapositives';
+$lang['stop the slideshow'] = 'Atura la presentació';
+$lang['Specials'] = 'Especials';
+$lang['SQL queries in'] = 'consultes SQL en';
+$lang['display only recently posted photos'] = 'visualitza només les imatges publicades recentment';
+$lang['return to the display of all photos'] = 'torna a visualitzar totes les imatges';
+$lang['the beginning'] = 'El començament';
+$lang['Interface theme'] = 'Escull un tema';
+$lang['Thumbnails'] = 'Miniatures';
+$lang['Menu'] = 'Menú';
+$lang['A comment on your site'] = 'Un comentari al teu web';
+$lang['today'] = 'avui';
+$lang['Update your rating'] = 'Canvia la teva valoració';
+$lang['Author'] = 'Autor';
+$lang['the username must be given'] = 'cal indicar el nom d\'usuari';
+$lang['useful when password forgotten'] = 'Necessari en cas de què perdéssis la teva clau d\'accès';
+$lang['Quick search'] = 'Cerca ràpida';
+$lang['Connected user: %s'] = 'Usuari connectat: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Navegador: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Comentari: %s';
+$lang['Comment by %s'] = 'Comentat per %s';
+$lang['User: %s'] = 'Usuari: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Registrat de %s';
+$lang['Album: %s'] = 'Àlbum: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Estat erroni de l\'usuari "convidat". S\'està utilitzant l\'estat predeterminat. Si us plau, informeu-ho a l\'administrador del web.';
+$lang['this email address is already in use'] = 'un usuari ja utilitza aquesta adreça de correu';
+$lang['Album results for'] = 'Resultats dels àlbums per';
+$lang['Tag results for'] = 'Resultats de l\'etiqueta per';
+$lang['from %s to %s'] = 'de %s a %s';
+$lang['Play of slideshow'] = 'Iniciar presentació amb diapositives ';
+$lang['Pause of slideshow'] = 'Pausa la presentació';
+$lang['Repeat the slideshow'] = 'Repeteix la presentació';
+$lang['Not repeat the slideshow'] = 'No repetir la presentació';
+$lang['Reduce diaporama speed'] = 'Disminueix la velocitat';
+$lang['Accelerate diaporama speed'] = 'Incrementa la velocitat';
+$lang['Submit'] = 'OK';
+$lang['Yes'] = 'Sí';
+$lang['No'] = 'No';
+$lang['%d photo']='%d imatge';
+$lang['%d photos']='%d imatges';
+$lang['%d photo is also linked to current tags'] = '%d imatge també ha estat enllaçada a aquesta etiqueta';
+$lang['%d photos are also linked to current tags'] = '%d imatges també han estat enllaçades amb aquestes etiquetes';
+$lang['display photos linked to this tag'] = 'Veure imatges enllaçades amb aquesta etiqueta solament';
+$lang['Piwigo Help'] = 'Ajuda';
+$lang['Rank'] = 'Millor valorades';
+$lang['group by letters'] = 'agrupa per lletres';
+$lang['letters'] = 'lletres';
+$lang['show tag cloud'] = 'mostra el núbol d\'etiquetes';
+$lang['cloud'] = 'núbol';
+$lang['Reset to default values'] = 'Reinicia als valors predeterminats';
+$lang['delete all photos from your favorites'] = 'elimina totes les imatges preferides';
+$lang['Sent by'] = 'Enviat per';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Les galetes (cookies) estan bloquejades o el navegador no en permet l\'ús. Heu d\'habilitar-les per poder-vos connectar.';
+$lang['Edit a comment'] = "Edita un comentari";
+$lang['Are you sure?'] = 'N\'estàs segur?';
+$lang['Email address is missing. Please specify an email address.'] = 'Falta l\'adreça de correu electrònic. Si us plau, introduiu-la.';
+$lang['Delete'] = 'Elimina';
+$lang['(!) This comment requires validation'] = '(!) Aquest comentari requereix ser validat';
+$lang['Welcome'] = 'Benvingut';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Benvingut a la galeria fotogràfica Piwigo!';
+$lang['... or browse your empty gallery'] = '... o navega per la galeria (actualment buida)';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... o si us plau desactiveu aquest missatge.  Ja trobaré la manera pel meu compte.';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hola %s, la galeria no conté elements per mostrar.';
+$lang['I want to add photos'] = 'Vull afegir imatges';
+$lang['Manage this user comment: %s'] = 'Gestiona aquest comentari d\'usuari: %s';
+$lang['This author modified following comment:'] = 'Aquest autor ha modificat el següent comentari:';
+$lang['This author removed the comment with id %d'] = 'Aquest autor ha eliminat el comentari amb id %d';
+$lang['html tags are not allowed in login'] = "les etiquetes html no són permeses en les dades d'inici de sessió";
+$lang['%d rates'] = '%d valoracions';
+$lang['Rating score'] = 'Resultat de la valoració';
+$lang['Invalid username or email'] = 'Nom d\'usuari o correu electrònic invàlid';
+$lang['Password reset is not allowed for this user'] = 'No està permès restablir la clau d\'accès per aquest usuari';
+$lang['User "%s" has no email address, password reset is not possible'] = 'L\'usuari "%s" no té adreça de correu electrònic. No es pot restablir la clau d\'accès.';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Algú ha demanat que la clau d\'accès sigui restablerta pels següents comptes d\'usuari';
+$lang['Username "%s" on gallery %s'] = 'El nom d\'usuari "%s" sobre la galeria %s';
+$lang['To reset your password, visit the following address:'] = 'Per restablir la teva clau d\'accès visita la següent adreça:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Si es tracta d\'un error, ignoreu aquest correu electrònic com si res hagués passat.';
+$lang['Password Reset'] = 'Estableix una nova clau d\'accès';
+$lang['Check your email for the confirmation link'] = 'Reviseu el vostre correu electrònic amb l\'enllaç de confirmació';
+$lang['Invalid key'] = 'Clau invàlida';
+$lang['The passwords do not match'] = 'Compte! La clau d\'accès no coincideix';
+$lang['Your password has been reset'] = 'S\'ha restablert la teva clau d\'accès.';
+$lang['Return to home page'] = 'Torna a la pàgina d\'inici';
+$lang['Please enter your username or email address.'] = 'Introdueix el teu nom d\usuari o el correu electrònic que vas emprar per donar-te d\'alta.';
+$lang['You will receive a link to create a new password via email.'] = 'Rebràs un enllaç al teu correu electrònic que et permetrà crear una nova clau d\'accès.';
+$lang['Username or email'] = 'Nom d\'usuari o correu electrònic';
+$lang['Change my password'] = 'Restablir';
+$lang['Enter your new password below.'] = 'Introdueix la nova clau d\'accès.';
+$lang['EXIF Metadata'] = 'Informació del dispositiu (metadades Exif)';
+$lang['IPTC Metadata'] = 'Metadades IPTC';
+$lang['2small'] = 'XXS - diminut';
+$lang['Desktop'] = 'Escriptori';
+$lang['Edit'] = 'Editar';
+$lang['File name, A &rarr; Z'] = 'Nom d\'arxiu, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nom d\'arxiu, Z &rarr; A';
+$lang['Hello %s,'] = 'Hola %s,';
+$lang['Here are your connection settings'] = 'Aquests son els teus paràmetres de connexió';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Si creus que has rebut aquest correu electrònic per error, si us plau, contacta amb nosaltres a %s';
+$lang['Manual sort order'] = 'Ordre manual';
+$lang['Mobile'] = 'Mòbil';
+$lang['Original'] = 'Original';
+$lang['Password: %s'] = 'Clau: %s';
+$lang['Photo sizes'] = 'Canviar-ne la mida';
+$lang['Photo title, A &rarr; Z'] = 'Nom de l\'arxiu, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Nom de l\'arxiu, Z &rarr; A';
+$lang['Send my connection settings by email'] = 'Envia\'m els meus paràmetres de connexió per correu electrònic';
+$lang['Show latest comments first'] = 'Mostra els últims comentaris primer';
+$lang['Show oldest comments first'] = 'Mostra els comentaris més antics primer';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Has estat registrat correctament. En breu rebràs un correu electrònic amb els teus paràmetres de connexió. Benvingut!';
+$lang['Thank you for registering at %s!'] = 'Gràcies per inscriute\'t a %s!';
+$lang['Username modification'] = 'Modificar usuari';
+$lang['Username: %s'] = 'Usuari: %s';
+$lang['View in'] = 'Vista adaptada per:';
+$lang['Your username has been successfully changed to : %s'] = 'El teu nom d\'usuari s\'ha canviat amb èxit per: %s';
+$lang['large'] = 'L - gran';
+$lang['medium'] = 'M - mitjà';
+$lang['small'] = 'S - petit';
+$lang['square'] = 'Quadrat';
+$lang['thumb'] = 'Miniatura';
+$lang['xlarge'] = 'XL - extra gran';
+$lang['xsmall'] = 'XS - extra petit';
+$lang['xxlarge'] = 'XXL - enorme';
+$lang['Date created, new &rarr; old'] = 'Data de creació, nou &rarr; antic';
+$lang['Date created, old &rarr; new'] = 'Data de creació, antic &rarr; nou';
+$lang['Date posted, new &rarr; old'] = 'Data de publicació, nou &rarr; antic';
+$lang['Date posted, old &rarr; new'] = 'Data de publicació, antic &rarr; nou';
+$lang['Download this file'] = 'Descarregar';
+$lang['Download'] = 'Descarregar';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identificador numèric, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identificador numèric, 9 &rarr; 1';
+$lang['Rating score, high &rarr; low'] = 'Resultat de la valoració, alt &rarr; baix';
+$lang['Rating score, low &rarr; high'] = 'Resultat de la valoració, baix &rarr; alt';
+$lang['Search by date'] = 'Cerca per data';
+$lang['Search for any term'] = 'Cerca per qualsevol terme';
+$lang['Visits, high &rarr; low'] = 'Visites, alt &rarr; baix';
+$lang['Visits, low &rarr; high'] = 'Visites, baix &rarr; alt';
+?>
Index: tags/2.4.0RC3/language/ca_ES/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,123 @@
+<h2>Edita l'&agrave;lbum</h2>
+
+<h3>Informaci&oacute;</h3>
+
+<ul>
+
+  <li><strong>Nom</strong>: Canvia el nom de l'&agrave;lbum (virtualment per un &agrave;lbum f&iacute;sic).</li>
+
+  <li><strong>Descripci&oacute;</strong>: Un text curt donant una idea del contingut de l'&agrave;lbum.
+  Aquesta indicaci&oacute; es mostrar&agrave; al final de la p&agrave;gina de les miniatures.</li>
+
+</ul>
+
+<h3>Despla&ccedil;ar</h3>
+
+<p>Els &agrave;lbums virtuals poden ser despla&ccedil;ats. Despla&ccedil;ar un &agrave;lbum significa canviar el seu &agrave;lbum pare.</p>
+
+<h3>Opcions</h3>
+
+<ul>
+
+  <li><strong>Tipus d'acc&egrave;s</strong>: Administraci&oacute; de permisos. Si afegiu un &agrave;lbum privat, tots els seus 
+  &agrave;lbums fills esdevenir&agrave;n privats. Si afegiu un &agrave;lbum p&uacute;blic, tots els seus &agrave;lbums pare esdevenir&agrave;n p&uacute;blics.</li>
+
+  <li><strong>Bloquejar</strong>: L'&agrave;lbum i tots els seus sub-&agrave;lbums esdevenir&agrave;n temporalment inaccessibles per manteniment.</li>
+
+  <li><strong>Comentaris</strong>: Autoritza als usuaris a afegir comentaris dels elements de l'&agrave;lbum.</li>
+
+</ul>
+
+<p>Tamb&eacute; pot administrar aquestes opcions de gesti&oacute; de "Propietats" <span
+class="pwgScreen">Comentaris</span>, <span class="pwgScreen">Bloquejats</span>,
+<span class="pwgScreen">P&uacute;blic/Privats</span>, <span
+class="pwgScreen">Representatiu</span> Disponibles a <span
+class="pwgScreen">Administraci&oacute; &raquo; &Agrave;lbums &raquo; Propietats</span>).</p>
+
+<h3>Ordenar</h3>
+
+<p>Utilitza l'ordre dels elements per defecte.</p>
+
+<p>Indica si l'ordre s'aplica tamb&eacute; als sub-&agrave;lbums.</p>
+
+<p>Selecciona els criteris a utilitzar per aquest &agrave;lbum.</p>
+<ul>
+<li><strong>Data de creaci&oacute;</strong>: Data de presa de la imatge</li>
+<li><strong>Data de publicaci&oacute;</strong>: Data de sincronitzaci&oacute;</li>
+<li><strong>Nota mitja (*)</strong>: S'actualitza segons la qualificaci&oacute; dels visitants</li>
+<li><strong>Les m&eacute;s visitades (*)</strong>: La visita actual podria canviar l'ordre m&eacute;s visitat</li>
+<li><strong>Nom de l'arxiu</strong>: Nom que es d&oacute;na en el camp de la informaci&oacute;</li>
+<li><strong>Id</strong>: Id inern (les categories m&eacute;s recents tenen un identificador m&eacute;s alt que els anteriors.</li>
+
+</ul>
+<p><strong>(*)</strong>Atenci&oacute;: Assegureu-vos de provar els criteris d'ordenaci&oacute; perqu&egrave; de vegades poden generar resultats inesperats.</p>
+
+
+<h3>Representatiu</h3>
+
+<p>L'&agrave;lbum representatiu &eacute;s la imatge que apareix a la a la p&agrave;gina principal <span class="pwgScreen">category.php</span>) per representar
+aquell &agrave;lbum que cont&eacute; sub-&agrave;lbums per&ograve; no imatges: (per exemple l'&agrave;lbum arrel del directori).
+</p>
+
+<p>Existeixen 4 maneres diferents d'escollir la representaci&oacute; de l'&agrave;lbum:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Imatges de p&agrave;gina</span>: un dels botons d'acci&oacute; permet escollir la present imatge per a representar el seu propi &agrave;lbum.</li>
+
+  <li><span class="pwgScreen">Modifica la informaci&oacute; d'una imatge.</span> a Administraci&oacute;. Hi pots accedir des de <span
+  class="pwgScreen">picture.php</span> o <span class="pwgScreen">Gesti&oacute; de lots</span> a <em>mode unitari</em>. Consulta l'ajuda per a m&eacute;s detalls.</li>
+
+  <li><span class="pwgScreen">Administraci&oacute; &raquo; &Agrave;lbums &raquo; Propietats,
+  Representatiu</span>. Consulta l'ajuda per a m&eacute;s detalls.</li>
+
+  <li><span class="pwgScreen">Editar &agrave;lbum</span> (aquesta pantalla).</li>
+
+</ul>
+
+<p>L'elecci&oacute; de la representaci&oacute; dep&eacute;n del par&agrave;metre de configuraci&oacute; 
+<code>allow_random_representative</code> (veure <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Mode Per defecte (<code>allow_random_representative</code> establert a fals),
+cada &agrave;lbum que cont&eacute; almenys un element que est&agrave; representat per un element fix. 
+Un cop establert (a la creaci&oacute; de l'&agrave;lbum), la representaci&oacute; nom&eacute;s canvia
+ quan un administrador jo sol&middot;licita. Si la representaci&oacute; no &eacute;s apropiada,
+ pots <strong>establir-se una nova representaci&oacute; de l'&agrave;lbum a l'atzar.<strong></p>
+
+<p>Si el <code>allow_random_representative</code>par&agrave;metre de configuraci&oacute; &eacute;s cert,
+ una categoria que contingui elements pot no tindre una represetnaci&oacute; fixe. Simplement utilitza el bot&oacute; 
+ <strong>Eliminar representant</strong>.</p>
+
+<p>Si l'&agrave;lbum cont&eacute; sub-&agrave;lbums per&ograve; no elements (imatges), pot ser representat per qualsevol element gr&agrave;cies a la pantalla <span class="pwgScreen">Modicar
+informaci&oacute; quant a la imatge</span>. L'&uacute;nica opci&oacute; en la pantalla actual
+&eacute;s el bot&oacute;<strong>Eliminar representaci&oacute;</strong>.</p>
+
+<h3>Enlla&ccedil;a tots els elements de l'&agrave;lbum a un nou &agrave;lbum</h3>
+
+<ul>
+
+<li><strong>Nom de l'&agrave;lbum virtual</strong>: Nom del nou &agrave;lbum que es crear&agrave;. 
+Tots els elements de la categoria actual es vincularan amb la nova.</li>
+
+<li><strong>&Agrave;lbum pare</strong>: Crea sub-&agrave;lbums jer&agrave;rquicament.</li>
+
+</ul>
+
+<h3>Enlla&ccedil;a totes les fotos de l'&agrave;lbum als &agrave;lbums existents</h3>
+
+<ul>
+
+<li><strong>&Agrave;lbums</strong>: Selecciona l'&agrave;lbum de dest&iacute;.</li>
+
+</ul>
+
+<h3>Informa per correu electr&ograve;nic als tots els membres d'un grup.</h3>
+
+<ul>
+
+<li><strong>Grups</strong>: grup de destinataris</li>
+
+<li><strong>Contingut del correu electr&ograve;nic</strong>: Amb la possibilitat de redactar textes lliurement.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/ca_ES/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/cat_move.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Despla&ccedil;ament de categories virtuals</h2>
+
+<p>Pots canviar l'arrel del directori d'una categoria virtual.</p>
+
+<h3>Categories virtuals que s'han de despla&ccedil;ar</h3>
+
+<p>Selecciona un o varis &agrave;lbums virtuals a despla&ccedil;ar. Si la llista est&agrave; buida, &eacute;s perqu&egrave; encara s'ha creat.</p>
+
+<h3>Crear un nou &agrave;lbum a un nivell superior</h3>
+
+<p>Selecciona el nou &agrave;lbum pare (virtual o f&iacute;sica). Si no se'n selecciona cap, els &agrave;lbums que s'han de moure haur&agrave;n pujat a l'arrel dels &agrave;lbums. No es pot moure una categoria dins d'ella mateixa o dels seus nivells inferiors.</p>
Index: tags/2.4.0RC3/language/ca_ES/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/cat_options.html	(revision 14585)
@@ -0,0 +1,26 @@
+<h2>Opcions dels &agrave;lbums</h2>
+
+<p>Gestiona les opcions per varis &agrave;lbums a la vegada.</p>
+
+<dl>
+
+    <dt>Comentaris dels usuaris</dt>
+
+  <dd>Autoritza als usuaris a afegir comentaris als &agrave;lbums seleccionats.
+Per her&egrave;ncia, una imatge pot ser comentada sempre que aquesta pertanyi a un &agrave;lbum amb autoritzaci&oacute; de publicaci&oacute; de comentaris per part del l'administrador.</dd>
+  
+  <dt>Bloquejar</dt>
+
+  <dd>Els &agrave;lbums es tornen temporalment inactius durant les tasques de manteniment. &Eacute;s important tenir en compte que al bloquejar un &agrave;lbum, tots els seus nivells inferiors s&oacute;n tamb&eacute; bloquejats. Per contra, al desbloquejar un &agrave;lbum, totes els &agrave;lbums d'aquell nivell queden sense restriccions d'acc&egrave;s.</dd>
+
+  <dt>P&uacute;blic/Privat</dt>
+
+  <dd>Els permisos nom&eacute;s tenen sentit per als &agrave;lbums privats. Una vegada que un &agrave;lbum &eacute;s privat, cal autoritzar-ne l'acc&egrave;s als usuaris o grups de forma expl&iacute;cita. Quan un &agrave;lbum &eacute;s considerat com a P&uacute;blic, tots els nivells inferiors que en depenen d'ell esdevenen tamb&eacute; p&uacute;blics.</dd>
+
+  <dt>Representant</dt>
+
+  <dd>Aquesta opci&oacute; est&agrave; disponible &uacute;nicament si el par&agrave;metre de configuraci&oacute; <code>allow_random_representative</code> (Veure <span
+class="filename">include/config_default.inc.php</span>) &eacute;st&agrave;
+<em>activada</em>. Cada &agrave;lbum pot ser representat per una imatge presa a l'atzar o per una miniatura fixa &uacute;nica.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ca_ES/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Administrar els permisos d'un &agrave;lbum</h2>
+
+<p>Aquesta pantalla nom&eacute;s est&agrave; disponible per als &agrave;lbums privats. Aqu&iacute; pots seleccionar usuaris i grups autoritzats per a un &agrave;lbum.</p>
+
+<h3>Grups</h3>
+
+<p>Pots autoritzar o denegar l'acc&eacute;s a un &agrave;lbum a un grup concret. Gr&agrave;cies a la a pertinen&ccedil;a a grups, es poden elaborar llistes d'usuaris amb un perfil com&uacute; per ajudar als administradors a gestionar el nivell de privacitat dels elements publicats.</p>
+
+<h3>Usuaris</h3>
+
+<p>Pots autoritzar o denegar l'acc&egrave;s a usuaris individuals.</p>
Index: tags/2.4.0RC3/language/ca_ES/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/configuration.html	(revision 14585)
@@ -0,0 +1,89 @@
+<h2>Configuraci&oacute;</h2>
+
+<p>Aquesta secci&oacute; permet administrar la configuraci&oacute; b&agrave;sica. Evidentment nom&eacute;s es mostren els par&agrave;metres de configuraci&oacute; suficients per a la majoria d'administradors. En cas de qu&egrave; sigui necessari consultar detalladament tots els par&agrave;metres configuraci&oacute;, llegiu el fitxer<span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Aquesta secci&oacute; es troba dividida en paries parts, reagrupant els par&agrave;metres per tem&agrave;tica.</p>
+
+<h3>Principal</h3>
+<ul>
+
+  <li><strong>T&iacute;tol de la galeria</strong>: utilitzato per al canal RSS i les notificacions per correu electr&ograve;nic.</li>
+
+  <li><strong>P&agrave;gines de la bandera</strong>: codi html visible dalt de les p&agrave;gines.</li>
+
+  <li><strong>URL de la galer&iacute;a</strong>: utilitzat pel canal RSS.</li>
+
+  <li><strong>Bloqueig de la galeria</strong>: Bloquejar el conjunt de galeries per a dur a terme tasques de manteniment. Nom&eacute;s els administradors tenen acc&eacute;s a la galeria.</li>
+
+  <li><strong>Comentaris</strong>: &Eacute;s possible comentar les imatges de la galeria.</li>
+
+  <li><strong>Comentaris dels visitants</strong>: Activant aquesta opci&oacute;, tots els visitants encara que siguin convidats no registrats, poden comentar les imatges.</li>
+
+  <li><strong>Notificar als administradors la inscripci&oacute; d'un nou usuari</strong>: Els administradors rebr&agrave;n un missatge de correu electr&ograve;nic per a cada nou usuari inscrit.</li>
+
+  <li><strong>Permere la inscripci&oacute; de nous usuaris</strong>: La inscripci&oacute; &eacute;s lliure per tothom que s'hi vulgui registrar.</li>
+
+</ul>
+
+<h3>Historial</h3>
+
+  <p>Les visites a les p&agrave;gines<span
+class="pwgScreen">index.php</span> i <span
+class="pwgScreen">picture.php</span> queden registrades a la taula <code>history</code>.</p>
+
+  <p>Les visites es mostren a la pantalla <span class="pwgScreen">Administraci&oacute; &raquo; Eines &raquo; Historial</span>.</p>
+
+<ul>
+  <li><strong>Enregistrament de les p&agrave;gines visitades pels convidats</strong>: Les entrades queden totalment consignades.</li>
+
+  <li><strong>Enregistrament de les p&agrave;gines visitades pels usuaris</strong>: Les entrades queden totalment consignades.</li>
+
+  <li><strong>Enregistrament de les p&agrave;gines visitades pels administradors</strong>: Les entrades queden totalment consignades.</li>
+
+</ul>
+
+<h3>Comentaris</h3>
+<ul>
+
+  <li><strongComentaris dels usuaris per a tots</strong>: fins i tot els usuaris no registrats poden deixar comentaris.</li>
+
+  <li><strong>Nombre de comentaris dels usuaris per p&agrave;gina</strong>.</li>
+
+  <li><strong>Validaci&oacute;</strong>: Un administrador ha de validar els comentaris dels usuaris abans que puguin ser visibles p&uacute;blicament. La validaci&oacute; es porta a terme per mitj&agrave; de la pantalla <span class="pwgScreen">Administraci&oacute; &raquo; Eines &raquo; Comentaris en espera</span>.</li>
+
+  <li><strong>Notificaci&oacute; als administradors quan es requereixi la validaci&oacute; d'un comentari</strong>: Envia un correu electr&ograve;nic als administradors quan un usuari afegeixi comentari que sigui validat.</li>
+
+  <li><strong>Notificar als administradors quan es requereixi la validaci&oacute; d'un comentari </strong>: Envia un correu electr&ograve;nic als administradors quan un usuari afegeixi un comentari que requereix validaci&oacute; per part dels administradors.
+ Validaci&oacute; dels comentaris dels usuaris s'efectua a la pantalla <span class="pwgScreen">Administraci&oacute; &raquo; Eines &raquo; Comentaris en espera</span>.</li>
+
+</ul>
+
+<h3>Visualitzaci&oacute; per defecte</h3>
+<p>Canviar les opcions de visualitzaci&oacute; per defecte: per als visitants no connectats. Un cop connectat, aquestes opcions s&oacute;n reempla&ccedil;ades per la de l'usuari. Es poden modificar a la pantalla <span
+class="pwgScreen">perfil</span>.</p>
+
+<p>Podeu canviar aquestes opcions per als usuaris existents, per&ograve; aix&ograve; &eacute;s una altra pantalla: <span class="pwgScreen">Administraci&oacute; &raquo; Usuaris &raquo; Gestionar</span>, on es poden canviar aquestes opcions per obtenir una llista d'usuaris seleccionats.</p>
+
+<ul>
+
+  <li><strong>Idioma</strong>: Nom&eacute;s afecta a les etiquetes de Piwigo. Els noms dels &agrave;lbums, fotos i descripcions no s'han tradu&iuml;t (&eacute;s a dir, multiling&uuml;e).</li>
+
+  <li><strong>N&uacute;mero de miniatures por l&iacute;nia</strong></li>
+
+  <li><strong>N&uacute;mero de l&iacute;nies per p&agrave;gina</strong></li>
+
+  <li><strong>Tema de la interf&iacute;cie</strong></li>
+
+  <li><strong>Elements recents</strong>: en dies. Per&iacute;ode durant el qual la imatge &eacute;s considerada com a una novetat. Aquest per&iacute;ode ha de ser superior a 1 dia</li>
+
+  <li><strong>Desenvolupar tots els &agrave;lbums</strong>: Desenvolupar tots els &agrave;lbums al men&uacute;? <em>Atenci&oacute;n</em>: Aquesta opci&oacute; &eacute;s la susceptible de consumir recursos innecess&agrave;riament si el seu &agrave;lbum d'arbre cont&eacute; molts elements.</li>
+
+  <li><strong>Mostrar el n&uacute;mero de comentaris</strong>: mostren el nombre de comentaris dels usuaris per sota de cada miniatura. Aquesta caracter&iacute;stica consumeix recursos.</li>
+
+  <li><strong>Mostrar el n&uacute;mero de visualitzacions</strong>: Enumera les vegades que l'element ha estat visualitzat pels usuaris sota la seva miniatura a la p&agrave;gina de miniatures. Nom&eacute;s &eacute;s v&agrave;lid si el par&agrave;metre de configuraci&oacute; avan&ccedil;ada es: <br />
+  $conf['show_nb_hits'] = true; <br /> (No es visualitzen per defecte. Cal activar-ho manualment.)</li>
+
+  <li><strong>Amplada i al&ccedil;ada m&agrave;xima de les imatges</strong>: A la pantalla. Si la imatge &eacute;s m&eacute;s ampla que aquest par&agrave;metre, llavors ser&agrave; redimensionada. Si penses que necessites modificar aquests par&agrave;metres, (aix&iacute; com per a una visualitzaci&oacute; per defecte), seria rellevant redimensionar directament les imatges emmagatzemades.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ca_ES/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/group_list.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>LLista de grups</h2>
+
+<p>Administrar les propietats dels grups.</p>
+
+<h3>Afegir un grup</h3>
+
+<p>L'administrador pot afegir grups.</p>
+
+<h3>Llista de grups</h3>
+
+<p>La llista permet per a cada grup:</p>
+
+<ul>
+  <li>Accedir a la llista dels seus membres</li>
+  <li>Accedir als permisos</li>
+  <li>Suprimir el grup (es necessita confirmaci&oacute;)</li>
+  <li>Invertir l'estat "per defecte" (es necessita confirmaci&oacute;)</li>
+</ul>
+
+<h3>Grups predeterminats</h3>
+<p>Els grups predeterminats (o grups per defecte) s&oacute;n els grups associats a cada nou usuari de forma autom&agrave;tica en el moment de la seva inscripci&oacute; o si va ser inscri't per un administrador.</p>
Index: tags/2.4.0RC3/language/ca_ES/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Creaci&oacute; de miniaturas</h2>
+
+<p>Creaci&oacute; de miniatures que falten. L'&uacute;s d'aquesta caracter&iacute;stica no es recomana si la galeria es troba allotjat en un servidor compartit (recursos compartits de la m&agrave;quina).</p>
+
+<dl>
+
+  <dt>Versi&oacute; de GD</dt>
+
+  <dd>GD &eacute;s una llibreria gr&agrave;fica per a la manipulaci&oacute; d'imatges per a PHP. Selecciona la versi&oacute; instal&middot;lada en el teu servidor. Se us notificar&agrave; mitjan&ccedil;ant un missatge d'error si es tria la versi&oacute; incorrecta. A continuaci&oacute;, torna a la p&agrave;gina anterior i tria l'altra versi&oacute;. Si no hi ha cap versi&oacute; s'estigui execuntant significa que GD no est&agrave; disponible.</dd>
+
+  <dt>Amplada i al&ccedil;ada</dt>
+
+  <dd>Mida m&agrave;xima de les miniatures. Es mant&eacute; la relaci&oacute; original d'amplada i al&ccedil;ada. Aquests valors es poden modificar a trav&eacute;s dels par&agrave;metres de configuraci&oacute; <code>tn_width</code> i <code>tn_height</code> (veure l'arxiu <span class="filename">include/config_default.inc.php</span>).</dd>
+  
+  <dt>N&uacute;mero de miniatures a crear</dt>
+
+  <dd>No tractis de miniaturitzar un nombre massa gran d'imatges alhora. Cal tenir en compte que el tractament de miniatures requereix un alt &uacute;s de CPU. Si la teva galeria Piwigo est&agrave; allotjada en un servidor gratuit, un important &uacute;s de la CPU pot implicar que directament t'eliminin la teva galeria.</dd>
+
+  <dt>Mides d'arxius</dt>
+
+  <dd>Les miniatures s&oacute;n creades en format JPEG. Nom&eacute;s es poden crear miniatures amb els formats PNG i JPEG.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ca_ES/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/ca_ES/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/help/user_list.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>LLista d'usuaris</h2>
+
+<p>Permet gestionar les propietats dels usuaris inscrits amb l'excepci&oacute; dels permisos, que es gestionen a trav&eacute;s d'altres seccions.</p>
+
+<h3>Afegir un usuari</h3>
+
+<p>L'administrador pot afegir usuaris manualment.</p>
+
+<h3>Llista d'usuaris</h3>
+
+<p>La llista pot ser filtrada amb el nom d'usuari (* = comod&iacute;), amb el grup o l'estat. La llista pot ser ordenada per data d'inscripci&oacute; o per nom d'usuari, de forma ascendent o descendent.</p>
+
+<p>Aquesta pantalla permet la modificaci&oacute; de diversos usuaris simult&agrave;niament:</p>
+
+<ul>
+  <li>suprimir usuaris (es necessita confirmaci&oacute;)</li>
+  <li>canviar l'estat dels usuaris</li>
+  <li>associar o dissociar grups</li>
+  <li>modificar les propietats de visualitzaci&oacute;</li>
+  <li>modificar les propietats annexes</li>
+</ul>
+
+<p>Els usuaris modificats s&oacute;n aquells usuaris seleccionats (per defecte) o la totalitat de la llista filtrada.</p>
Index: tags/2.4.0RC3/language/ca_ES/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ca_ES/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/install.lang.php	(revision 14585)
@@ -0,0 +1,75 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "Instal·lació";
+$lang['Basic configuration'] = "Configuració bàsica";
+$lang['Default gallery language'] = "Idioma predeterminat de la galeria";
+$lang['Database configuration'] = "Configuració de la base de dades";
+$lang['Admin configuration'] = "Configuració de l'administrador";
+$lang['Start Install'] = "Inicia la instal·lació";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "l'adreça de correu electrònic ha de ser com  xxx@yyy.eee (exemple : jack@altern.org)";
+$lang['Webmaster login'] = "Nom de l'usuari administrador";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Això es mostrarà als visitants. És necessari pel web d\'administració';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'La connexió amb el servidor s\'ha establert correctament però no és possible connectar amb la base de dades.';
+$lang['Can\'t connect to server'] = "No es pot connectar amb el servidor";
+$lang['Host'] = 'Allotjament';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "Usuari";
+$lang['user login given by your host provider'] = 'nom d\'usuari facilitat pel teu proveïdor d\'allotjament';
+$lang['Password'] = 'Clau d\'accès';
+$lang['user password given by your host provider'] = 'clau d\'accès de l\'usuari facilitada pel teu proveïdor d\'allotjament';
+$lang['Database name'] = "Nom de la base de dades";
+$lang['also given by your host provider'] = 'també el dóna el teu proveïdor d\'allotjament';
+$lang['Database table prefix'] = "Prefix de les taules de la base de dades";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "Els noms de les taules de la base de dades començaran amb aquest prefix (permet gestionar millor les taules)";
+$lang['enter a login for webmaster'] = "Introdueix un nom d'usuari per l'administrador de la web";
+$lang['webmaster login can\'t contain characters \' or "'] = "El nom d'usuari de l'administrador de la web no pot contenir caràcters \' o \"";
+$lang['please enter your password again'] = "si us plau introduïu una altra vegada la vostra contrasenya";
+$lang['Webmaster password'] = "Contrasenya de l'administrador de la web";
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Manté la confidencialitat, permet accedir al panell d\'administració';
+$lang['Password [confirm]'] = "Contrasenya [confirmeu]";
+$lang['verification'] = "verificació";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Necessiteu ajuda? Feu la vostra pregunta a <a href=\"%s\">Piwigo message board</a>.";
+$lang['Webmaster mail address'] = "Adreça de correu electrònic de l'administrador del web";
+$lang['Visitors will be able to contact site administrator with this mail'] = "Els visitants poden utilitzar aquesta adreça de correu electrònic per a contactar amb l'administrador del lloc";
+$lang['PHP 5 is required'] = "Es requereix PHP 5 ";
+$lang['It appears your webhost is currently running PHP %s.'] = "Sembla que el vostre amfitrió web està executant la versió PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo pot tractar de canviar la teva configuració per PHP 5 mitjançant la creació o modificació de l\'arxiu .htaccess';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Tingues en compte que en qualsevol moment pots canviar la configuració i reiniciar Piwigo.';
+$lang['Try to configure PHP 5'] = "Intenteu configurar PHP 5";
+$lang['Sorry!'] = "Perdó!";
+$lang['Piwigo was not able to configure PHP 5.'] = "A Piwigo no li ha estat possible configurar PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Haurieu d'adreçar-vos al vostre proveidor d'hostatge i averiguar com poder canviar-vos cap a PHP 5.";
+$lang['Hope to see you back soon.'] = "Esperem tornar-vos a veure ben aviat.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Felicitats, la instal·lació de Piwigo s\'ha completat';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Una solució alternativa és copiar el text del quadre del costat i pegar-lo dins del fitxer "local/config/database.inc.php" (Advertiment : el fitxer database.inc.php només ha de contenir el que hi ha a l\'àrea de text, sense linia de retorn o caràcter d\'espai)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'La creació del fitxer de configuració local/config/database.inc.php ha fallat.';
+$lang['Download the config file'] = 'Descarregat l\'arxiu de configuració';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Pots descarregar l\'arxiu de configuració i penjar-lo al directori local/config de la teva instal·lació.';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'No dubtis en consultar als nostres fòrums per a qualsevol ajuda: %s';
+$lang['Just another Piwigo gallery'] = 'Aquesta galeria és Piwigo';
+$lang['Welcome to my photo gallery'] = 'Benvingut a la meva galeria fotogràfica';
+$lang['Welcome to your new installation of Piwigo!'] = 'Benvingut a la nova instal·lació de Piwigo!';
+?>
Index: tags/2.4.0RC3/language/ca_ES/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ca_ES/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Català [CA]
Index: tags/2.4.0RC3/language/ca_ES/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ca_ES/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ca_ES/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Actualització";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Aquesta pàgina actualitza la base de dades de la teva antiga galeria Piwigo a la nova versió. L'assistent d'actualització detecta que esteu executant la <strong>versió %s</strong> (o equivalent).";
+$lang['Upgrade from version %s to %s'] = "Actualitzar la versió %s a la %s";
+$lang['Statistics'] = "Estadístiques";
+$lang['total upgrade time'] = "temps total d'actualització";
+$lang['total SQL time'] = "temps total SQL ";
+$lang['SQL queries'] = "consultes SQL";
+$lang['Upgrade informations'] = "Informació de l'actualització";
+
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Si trobeu algun problema realitzeu una revisió de manteniment [Administració>Eines>Manteniment].";
+
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Com a precaució, els següents connectors s'han desactivat. Haureu de revisar les actualitzacions dels connectors abans de reactivar-los:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Únicament un usuari administrador pot executar l'actualització: si us plau, inicieu la sessió a sota.";
+$lang['You do not have access rights to run upgrade'] = "No teniu drets d'accés per executar l'actualització";
+$lang['All sub-albums of private albums become private'] = "Tots els sub-àlbums dels àlbums privats esdeveneixen privats";
+$lang['User permissions and group permissions have been erased'] = "S'han eliminat els permisos d'usuaris i de grups";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Només s'ha guardat de l'anterior configuració els prefixos de les miniatures i l'adreça de correu electrònic de l'administrador de la web";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'En <i>%s</i>, abans <b>?></b>, insertar:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Com a precaució, els següents tempes s\'han desactivat. Haureu de revisar les actualitzacions dels temes abans de reactivar-los:';
+?>
Index: tags/2.4.0RC3/language/cs_CZ/about.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/about.html	(revision 14585)
@@ -0,0 +1,23 @@
+<p>Tato web fotogalerie je založena na aplikaci Piwigo.</p>
+
+<p>Piwigo je software foto galerie pro web, vytvořený aktivní 
+komunitou uživatelů a vývojářů. Rozšíření a doplňky dělají Piwigo jednoduše
+přizpůsobitelné. Zásadní výhoda nakonec, Piwigo je bezplatné a opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Navštivte Piwigo web stránky</a></p>
+
+<p>České Piwigo udržují:
+
+	<ul>
+        <a href="http://piwigo.org/forum/profile.php?id=16188">coudy</a></li>
+		<li>Honza Kříž</li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16305">lanius</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=3828">Pavel Budka</a></li>
+        <li>Petr Jirsa</li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=13662">puschpull</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16598">sichr</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=11239">TPY</a></li>
+        <li>webprostor hosting</li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=15925">ZdenekMaterna</a></li>
+	</ul>
+            .... díky nim</p>
Index: tags/2.4.0RC3/language/cs_CZ/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/admin.lang.php	(revision 14585)
@@ -0,0 +1,905 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d spojení';
+$lang['%d associations'] = '%d spojení';
+$lang['%d album including'] = '%d album';
+$lang['%d albums including'] = '%d alb';
+$lang['%d physical'] = '%d fyzický';
+$lang['%d physical'] = '%d fyzických';
+$lang[' and %d virtual'] = 'a %d virtuální';
+$lang[' and %d virtual'] = 'a %d virtuálních';
+$lang['%d album moved'] = '%d album přesunuto';
+$lang['%d albums moved'] = '%d alb přesunuto';
+$lang['%d group'] = '%d skupina';
+$lang['%d groups'] = '%d skupin';
+$lang['%d member'] = '%d účastník';
+$lang['%d members'] = '%d účastníků';
+$lang['%d tag'] = '%d klíčové slovo';
+$lang['%d tags'] = '%d klíčových slov';
+$lang['%d user comment rejected'] = '%d komentář uživatele odmítnut';
+$lang['%d user comments rejected'] = '%d komentářů uživatelů odmítnuto';
+$lang['%d user comment validated'] = '%d komentář uživatele schválen';
+$lang['%d user comments validated'] = '%d komentářů uživatelů schváleno';
+$lang['%d user deleted'] = '%d uživatel smazán';
+$lang['%d users deleted'] = '%d uživatelů smazáno';
+$lang['%d user'] = '%d uživatel';
+$lang['%d users'] = '%d uživatelů';
+$lang['%d waiting for validation'] = '%d čeká na schválení';
+$lang['Actions'] = 'Akce';
+$lang['Activate'] = 'Aktivovat';
+$lang['Add/delete a permalink'] = 'Přidat/odebrat pernamentní odkaz';
+$lang['Add a tag'] = 'Přidat klíčové slovo';
+$lang['Add a user'] = 'Přidat uživatele';
+$lang['Add group'] = 'Přidat skupinu';
+$lang['Add'] = 'Přidat';
+$lang['Allow user registration'] = 'Povolit registraci uživatelů';
+$lang['Apply to sub-albums'] = 'Použít na subalba';
+$lang['Associated'] = 'Přiřazeno';
+$lang['Caddie management'] = 'Správa košíku';
+$lang['Caddie'] = 'Košík';
+$lang['Albums authorized thanks to group associations'] = 'Alba autorizována díky skupinovému sloučení';
+$lang['Album manual order was saved'] = 'Alba s ručním vyběrem byla uložena';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Zjištění možnosti aktualizace se nezdařilo';
+$lang['Check for upgrade'] = 'Zkontroluj nové aktualizace';
+$lang['Comments for all'] = 'Komentáře pro všechny';
+$lang['Current name'] = 'Současný název';
+$lang['Database'] = 'Databáze';
+$lang['Deactivate'] = 'Deaktivovat';
+$lang['Delete Representant'] = 'Smazat reprezentativní obrázek';
+$lang['Delete selected tags'] = 'Smazat vybraná klíčová slova';
+$lang['Delete selected users'] = 'Smazat vybrané uživatele';
+$lang['Deletions'] = 'Smazání';
+$lang['Deny selected groups'] = 'Zakázat vybraným skupinám';
+$lang['Deny selected users'] = 'Zakázat vybraným uživatelům';
+$lang['Description'] = 'Popis';
+$lang['Display options'] = 'Nastavení zobrazení';
+$lang['Dissociated'] = 'Vazba zrušena';
+$lang['Does not represent'] = 'Nereprezentuje';
+$lang['Edit selected tags'] = 'Upravit vybraná klíčová slova';
+$lang['Edit tags'] = 'Upravit klíčová slova';
+$lang['Email admins when a new user registers'] = 'Poslat e-mail administrátorovi při registraci nového uživatele';
+$lang['Email admins when a valid comment is entered'] = 'Poslat e-mail administrátorovi při vložení nového komentáře';
+$lang['Email admins when a comment requires validation'] = 'Poslat e-mail administrátorovi při vložení nového komentáře vyžadujícího schválení.';
+$lang['Environment'] = 'Prostředí';
+$lang['Form'] = 'Formulář';
+$lang['Gallery title'] = 'Název galerie';
+$lang['Grant selected groups'] = 'Povolit vybrané skupiny';
+$lang['Grant selected users'] = 'Povolit vybrané uživatele';
+$lang['Group name'] = 'Jméno skupiny';
+$lang['Groups'] = 'Skupiny';
+$lang['Guests'] = 'Hosté';
+$lang['History'] = 'Historie';
+$lang['Informations'] = 'Informace';
+$lang['Install'] = 'Instalovat';
+$lang['Link all album photos to a new album'] = 'Napojí všechny fotky do nového alba';
+$lang['Link all album photos to some existing albums'] = 'Napojí všechny fotky na existující alba';
+$lang['Linked albums'] = 'Propojená alba';
+$lang['Lock gallery'] = 'Zamknout galerii';
+$lang['Maintenance'] = 'Údržba';
+$lang['Edit album permissions'] = 'Editace oprávnění pro dané album';
+$lang['Manage permissions for group "%s"'] = 'Nastavit práva pro skupinu "%s"';
+$lang['Manage permissions for user "%s"'] = 'Nastavit práva pro uživatele "%s"';
+$lang['Manage tags'] = 'Správa klíčových slov';
+$lang['Members'] = 'Členové';
+$lang['Metadata synchronized from file'] = 'Metadata synchronizována ze souboru';
+$lang['Move albums'] = 'Přesun alb';
+$lang['Move'] = 'Přesunout';
+$lang['Name'] = 'Jméno';
+$lang['New name'] = 'Nové jméno';
+$lang['New parent album'] = 'Nové hlavní album';
+$lang['New tag'] = 'Nové klíčové slovo';
+$lang['Number of comments per page'] = 'Počet komentářů na stránce';
+$lang['Number of rates'] = 'Počet hodnocení';
+$lang['Number of thumbnails to create'] = 'Počet náhledů k vytvoření';
+$lang['Only private albums are listed'] = 'Pouze soukromá alba jsou uvedena';
+$lang['Operating system'] = 'Operační systém';
+$lang['Options'] = 'Nastavení';
+$lang['Other private albums'] = 'Ostatní soukromá alba';
+$lang['Page banner'] = 'Banner stránky';
+$lang['Parent album'] = 'Hlavní album';
+$lang['Path'] = 'Cesta';
+$lang['Permalink'] = 'Pernamentní spojení';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s byl dříve používán albem %s. Nejprve ho vymažte z historie permalinků';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Pernamentní spojení musí být složeno ze znaků a-z, A-Z, 0-9, "-", "_" nebo "/". Nelze použít pouze číslo nebo číslo následované "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s již používá album %s';
+$lang['Permalink history'] = 'Historie pernamentního spojení';
+$lang['Permalinks'] = 'Pernamentní spojení';
+$lang['Permission denied'] = 'Přístup zamítnut';
+$lang['Permission granted thanks to a group'] = 'Přístup povolen díky skupině';
+$lang['Permission granted'] = 'Přístup povolen';
+$lang['Photo informations updated'] = 'Informace o fotografiích aktualizovány';
+$lang['Plugins'] = 'Doplňky';
+$lang['Position'] = 'Pozice';
+$lang['Preferences'] = 'Nastavení';
+$lang['Properties'] = 'Vlastnosti';
+$lang['Random photo'] = 'Náhodná fotografie';
+$lang['Rate date'] = 'Datum hodnocení';
+$lang['Rating by guests'] = 'Hodnocení hosty';
+$lang['Rating'] = 'Hodnocení';
+$lang['Reject'] = 'Zamítnout';
+$lang['Representant'] = 'Reprezentant';
+$lang['Representation of albums'] = 'Alba reprezentace';
+$lang['Representative'] = 'Reprezentativní fotografie';
+$lang['Represents'] = 'Reprezentativní fotografie';
+$lang['Save order'] = 'Uložit pořadí';
+$lang['Save to permalink history'] = 'Uložit do historie pernamentního spojení';
+$lang['Select at least one album'] = 'Vyberte alespoň jedno album';
+$lang['Select at least one photo'] = 'Je nutné zvolit alespoň jednu fotografii';
+$lang['Select at least one user'] = 'Je nutné zvolit alespoň jednoho uživatele';
+$lang['Show info'] = 'Zobrazit informace';
+$lang['Site manager'] = 'Správce stránky';
+$lang['Status'] = 'Stav';
+$lang['Statistics'] = 'Statistiky';
+$lang['Storage album'] = 'Uložené album';
+$lang['Sum of rates'] = 'Součet hodnot';
+$lang['Tag "%s" already exists'] = 'Klíčové slovo "%" už existuje';
+$lang['Tag "%s" was added'] = '"%" klíčových slov bylo přidáno';
+$lang['Tag selection'] = 'Výběr klíčových slov';
+$lang['The %d following tags were deleted'] = 'Následujících %d klíčových slov bylo odstraněno';
+$lang['Unable to check for upgrade.'] = 'Unable to check for upgrade.';
+$lang['Uninstall'] = 'Odinstalovat';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Použít výchozí řazení (definované v konfiguračním souboru)';
+$lang['User comments validation'] = 'Schválení komentářů uživatelů';
+$lang['Users'] = 'Uživatelé';
+$lang['Validate'] = 'Schválit';
+$lang['Validation'] = 'Schválení';
+$lang['Version'] = 'Verze';
+$lang['Virtual albums to move'] = 'Virtuální alba k přesunu';
+$lang['Virtual album name'] = 'Název virtuálního alba';
+$lang['Webmaster cannot be deleted'] = 'Administrátor nemůže být smazán';
+$lang['You are running on development sources, no check possible.'] = 'Jsou používány vývojové zdrojové kódy, zjištění není možné.';
+$lang['You cannot delete your account'] = 'Nemůžete smazat svůj účet';
+$lang['You cannot move an album in its own sub album'] = 'Nemůžete přesunout album do jeho vlastního sub alba';
+$lang['You need to confirm deletion'] = 'Je nutné potvrdit vymazání';
+$lang['Associate to album'] = 'přiřadit k album';
+$lang['associate to group'] = 'Přiřadit ke skupině';
+$lang['Authorized'] = 'Autorizováno';
+$lang['Add a virtual album'] = 'Přidat virtuální album';
+$lang['Authorize users to add comments on selected albums'] = 'Povolit uživatelům přidávat komentáře k vybraným albám';
+$lang['The name of an album must not be empty'] = 'Název alba nesmí být prázdný';
+$lang['Lock albums'] = 'Zamknout alba';
+$lang['Private'] = 'Privátní album';
+$lang['Public'] = 'Veřejné album';
+$lang['Find a new representant by random'] = 'Najít reprezentativní obrázek pomocí náhodného výběru';
+$lang['Public / Private'] = 'Veřejná / Soukromá';
+$lang['Manage authorizations for selected albums'] = 'Nastavit oprávnění pro vybraná alba';
+$lang['Virtual album added'] = 'Virtuální album přidáno';
+$lang['Virtual album deleted'] = 'Virtuální album odstraněno';
+$lang['Access type'] = 'Druh přístupu';
+$lang['Information data registered in database'] = 'Data byla uložena do databáze';
+$lang['Default display'] = 'Výchozí zobrazení';
+$lang['The gallery URL is not valid.'] = 'URL galerie není platné';
+$lang['Main'] = 'Hlavní';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Počet komentářů na stránku musí být číslo mezi 5 a 50 včetně';
+$lang['Configuration'] = 'Konfigurace';
+$lang['confirm'] = 'Potvrdit';
+$lang['Date'] = 'Datum';
+$lang['delete album'] = 'smazat album';
+$lang['Dissociate from album'] = 'oddělit od album';
+$lang['dissociate from group'] = 'Oddělit od skupiny';
+$lang['Album updated successfully'] = 'Informace o album uloženy.';
+$lang['photos per page'] = 'Položek na stránce';
+$lang['High definition enabled'] = 'Vysoké rozlišení povoleno';
+$lang['File'] = 'Soubor';
+$lang['first photo added on %s'] = 'první položka přidána %s';
+$lang['Forbidden'] = 'Zakázáno';
+$lang['global mode'] = 'Více najednou';
+$lang['group "%s" added'] = 'skupina "%s" přidána';
+$lang['group "%s" deleted'] = 'skupina "%s" vymazána';
+$lang['group "%s" updated'] = 'skupina "%s" aktualizována';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Název skupiny nesmí obsahovat " nebo \' nebo být prázdný.';
+$lang['This name is already used by another group.'] = 'Toto jméno je již používáno pro jinou skupinu.';
+$lang['High definition'] = 'Vysoké rozlišení';
+$lang['jump to album'] = 'přejít na album';
+$lang['jump to photo'] = 'Přejít na obrázek';
+$lang['leave'] = 'Ponechat';
+$lang['Lock'] = 'Zamknout';
+$lang['Locked'] = 'Uzamknuto';
+$lang['manage album photos'] = 'Spravuj fotky alba';
+$lang['manage sub-albums'] = 'Správa sub-alb';
+$lang['Manage'] = 'Správa';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Vykonávání operace překročilo povolený čas, zvolte jestli chcete pokračovat [očekávaný čas: %d sekund].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Vykonávání překročilo maximální čas, zvolte jestli chcete pokračovat [očekávaný čas: %d sekund].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Nastavený čas pro zobrazení seznamu uživatelů byl překročen. Další uživatelé nebudou zobrazeni.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Nastavený čas pro odeslání zprávy byl překročen. Další zprávy nebudou odeslány.';
+$lang['To send ?'] = 'Odeslat?';
+$lang['Last send'] = 'Naposledy odesláno';
+$lang['email'] = 'E-mail';
+$lang['User'] = 'Uživatel';
+$lang['See you soon,'] = 'Nashledanou';
+$lang['Go to'] = 'Přejít na';
+$lang['Hello'] = 'Dobrý den ';
+$lang['New photos were added'] = 'Byly přidány nové fotografie';
+$lang['on'] = ' v ';
+$lang['between'] = 'mezi ';
+$lang['and'] = ' a ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Administrátor Vás přihlásil k odběru novinek e-mailem.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Přihlášení k odběru novinek e-mailem proběhlo úspěšně.';
+$lang['To subscribe'] = 'Pro přihlášení klikněte na %s .';
+$lang['If you encounter problems or have any question, please send a message to'] = 'V případě problémů nebo dotazů kontaktujte ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problémy a dotazy';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Administrátor Vás odhlásil z odběru novinek e-mailem.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Odhlášení od odebírání novinek e-mailem proběhlo úspěšně.';
+$lang[', click on'] = ', klikněte na ';
+$lang['To unsubscribe'] = 'Pro odhlášení klikněte na %s .';
+$lang['With blank value, gallery title will be used'] = 'Pokud není zadáno, použije se název galerie';
+$lang['Notification'] = 'Oznámení';
+$lang['Error when sending email to %s [%s].'] = 'Chyba při odesílání zprávy příjemci %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Zpráva odeslána příjemci %s [%s].';
+$lang['%d mail was sent.'] = '%d zpráva odeslána.';
+$lang['%d mails were sent.'] = '%d zpráv odesláno.';
+$lang['%d mail was not sent.'] = '%d zpráva nebyla odeslána.';
+$lang['%d mails were not sent.'] = '%d zpráv nebylo odesláno.';
+$lang['No mail to send.'] = 'Žádná zpráva k odeslání.';
+$lang['There is no available subscribers to mail.'] = 'Nejsou žádní odběratelé přihlášení pro příjem zprávy.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Přihlášení odběratelé mohou být zobrazeni pouze pokud existují novinky k upozornění.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Tato záložka se zobrazuje pouze administrátorovi.';
+$lang['No user to send notifications by mail.'] = 'Nebyl nalezen žádný uživatel pro odebírání novinek e-mailem.';
+$lang['New photos added'] = 'Nové položky byly přidány';
+$lang['Subscribe to notification by mail'] = 'Přihlásit k odběru novinek e-mailem';
+$lang['Unsubscribe from notification by mail'] = 'Odhlásit od odebírání novinek e-mailem';
+$lang['Parameter'] = 'Parametr';
+$lang['Continue processing treatment'] = 'Pokračovat v údržbě';
+$lang['Complementary mail content'] = 'Doplňkový obsah zprávy';
+$lang['Add detailed content'] = 'Odeslat obsah';
+$lang['Send mail as'] = 'Odeslat zprávu jako';
+$lang['Send mail to users'] = 'Odeslat e-mail uživateli';
+$lang['Send'] = 'Odeslat';
+$lang['Options'] = 'Volby';
+$lang['Subscribed'] = 'Přihlášení uživatelé';
+$lang['Subscribe'] = 'Přihlásit';
+$lang['Parameters'] = 'Parametry';
+$lang['Select recipients'] = 'Zvolte příjemce';
+$lang['Subscribe/unsubscribe users'] = 'Přihlásit/odhlásit uživatele';
+$lang['Unsubscribed'] = 'Nepřihlášení uživatelé';
+$lang['%d parameter was updated.'] = '%d parametrů aktualizováno.';
+$lang['%d parameters were updated.'] = '%d parametrů aktualizováno.';
+$lang['%d user was not updated.'] = '%d uživatel(ů) nebylo aktualizováno.';
+$lang['%d users were not updated.'] = '%d uživatelů nebylo aktualizováno.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Uživatel %s [%s] byl odhlášen od odebírání novinek e-mailem.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Uživatel %s [%s] byl přihlášen k odebírání novinek e-mailem.';
+$lang['%d user was updated.'] = '%d uživatel(ů) aktualizováno.';
+$lang['%d users were updated.'] = '%d uživatel(ů) aktualizováno.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Uživatel %s [%s] nebyl odebrán ze seznamu přihlášených k odebírání novinek.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Uživatel %s [%s] nebyl přidán do seznamu přihlášených  k odebírání novinek.';
+$lang['User %s [%s] added.'] = 'Uživatel %s [%s] přidán.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Upozornění: přihlášení nebo odhlášení má za následek odeslání e-mailů uživatelům';
+$lang['Send mail on HTML format'] = 'Odesílat zprávy v HTML formátu';
+$lang['Include display of recent photos grouped by dates'] = 'Zahrnout nové skupiny fotografií podle data';
+$lang['Available only with HTML format'] = 'Dostupné pouze pro zprávy ve formátu HTML';
+$lang['no write access'] = 'nemáte přístupová práva';
+$lang['Permissions'] = 'Oprávnění';
+$lang['private'] = 'soukromé';
+$lang['public'] = 'veřejné';
+$lang['Purge never used notification feeds'] = 'Provést údržbu nepoužitých RSS vláken';
+$lang['Purge sessions'] = 'Provést údržbu relací';
+$lang['randomly represented'] = 'náhodně reprezentovaní';
+$lang['registration date'] = 'datum registrace';
+$lang['clean'] = 'Vyčistit';
+$lang['Create this site'] = 'Vytvořit tuto stránku';
+$lang['test'] = 'Test';
+$lang['test this remote site'] = 'Otestovat vzdálenou stránku';
+$lang['remove tags'] = 'Přesunout klíčová slova';
+$lang['Repair and optimize database'] = 'Opravit a optimalizovat databázi';
+$lang['selection'] = 'Výběr';
+$lang['set to'] = 'Nastavit ';
+$lang['singly represented'] = 'samostatně reprezentován';
+$lang['This site already exists'] = 'Tato stránka již existuje';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Vytvořit novou stránku : (zadejte adresu do create_listing_file.php)';
+$lang['created'] = 'Vytvořeno';
+$lang['delete'] = 'Vymazat';
+$lang['delete this site and all its attached elements'] = 'Vymazat tuto stránku a všechny související položky';
+$lang['deleted'] = 'Vymazáno';
+$lang['an error happened'] = 'Došlo k chybě';
+$lang['Local'] = 'Místní';
+$lang['Remote'] = 'Vzdálený';
+$lang['update the database from files'] = 'Aktualizovat databázi ze souborů';
+$lang['status'] = 'Stav';
+$lang['Directory'] = 'Adresář';
+$lang['sub-albums'] = 'sub-alba';
+$lang['Synchronize metadata'] = 'Synchronizovat metadata';
+$lang['target'] = 'Cíl';
+$lang['Thumbnail'] = 'Náhled';
+$lang['title'] = 'Název';
+$lang['Album list management'] = 'Správa alb';
+$lang['Piwigo configuration'] = 'Nastavení aplikace Piwigo';
+$lang['Edit album'] = 'Edituj album';
+$lang['Group management'] = 'Správa skupin';
+$lang['User list'] = 'Seznam uživatelů';
+$lang['Edit photo information'] = 'Upravit informace o fotografii';
+$lang['Database synchronization with files'] = 'Synchronizace databáze se soubory';
+$lang['all'] = 'Vše';
+$lang['height must be a number superior to'] = 'Výška musí být větší než';
+$lang['width must be a number superior to'] = 'Šířka musí být větší než';
+$lang['for the file format'] = 'pro formát souboru';
+$lang['Photo unreachable or no support'] = 'Fotografie není dostupná nebo podporovaná';
+$lang['GD version'] = 'Verze GD knihovny';
+$lang['General statistics'] = 'Celková statistika';
+$lang['average time'] = 'průměrný čas';
+$lang['number of miniaturized photos'] = 'počet miniaturizovaných fotografií';
+$lang['total time'] = 'celkový čas';
+$lang['for this file format'] = 'pro tento formát souboru';
+$lang['unit mode'] = 'jednotlivě';
+$lang['Unlocked'] = 'Odemknuto';
+$lang['unset'] = 'Nenastavovat';
+$lang['Update albums informations'] = 'Aktualizuj informace alb';
+$lang['Update photos information'] = 'Aktualizovat informace o fotografiích';
+$lang['Synchronize'] = 'Synchronizace';
+$lang['reduce to single existing albums'] = 'zredukuj na stávající alba';
+$lang['Choose an option'] = 'Zvolit nastavení';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'zobrazit maximum informací (přidaná alba a elementy, odstraněná alba a elementy)';
+$lang['Error list'] = 'Seznam chyb';
+$lang['Errors caption'] = 'Chyby - legenda';
+$lang['Detailed informations'] = 'Detailní informace';
+$lang['File/directory read error'] = 'Chyba při čtení souboru/adresáře';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Soubor nebo adresář není přístupný nebo neexistuje';
+$lang['albums deleted in the database'] = 'alba odstraněna v databázi';
+$lang['photos deleted from the database'] = 'položek odstraněno z databáze';
+$lang['photos candidates for metadata synchronization'] = 'fotografií pro synchronizaci metadat';
+$lang['photos informations synchronized with files metadata'] = 'informace synchronizované z metadat souborů';
+$lang['errors during synchronization'] = 'chyb během synchronizace';
+$lang['albums added in the database'] = 'alba vložena do databáze';
+$lang['photos added in the database'] = 'položek přidáno do databáze';
+$lang['photos updated in the database'] = 'položek aktualizováno v databázi';
+$lang['Search for new images in the directories'] = 'Hledat nové obrázky v kategoriích';
+$lang['added'] = 'přidáno';
+$lang['deleted'] = 'smazáno';
+$lang['Metadata synchronization results'] = 'Výsledky synchronizace metadat';
+$lang['only perform a simulation (no change in database will be made)'] = 'pouze simulace přidání (nebudou učiněny žádné změny v databázi)';
+$lang['Simulation'] = 'Simulace';
+$lang['directories + files'] = 'adresáře + soubory';
+$lang['only directories'] = 'pouze adresáře';
+$lang['synchronize files structure with database'] = 'synchronizovat strukturu souborů s databází';
+$lang['synchronize files metadata with database photos informations'] = 'synchronizovat metadata souborů s databází';
+$lang['even already synchronized photos'] = 'zahrnout i dříve synchronizované položky';
+$lang['Used metadata'] = 'Použitá metadata';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Název adresářů a souborů musí být tvořen písmeny, čísly, "-", "_" nebo "."';
+$lang['wrong filename'] = 'chybný název souboru';
+$lang['Upload'] = 'Nahrát fotografie';
+$lang['user "%s" added'] = 'uživatel "%s" přidán';
+$lang['User status'] = 'Stav uživatele';
+$lang['user_status_admin'] = 'Administrátor';
+$lang['user_status_generic'] = 'Generic';
+$lang['user_status_guest'] = 'Host';
+$lang['user_status_normal'] = 'Uživatel';
+$lang['user_status_webmaster'] = 'Administrátor';
+$lang['Virtual album'] = 'Virtuální album';
+$lang['Waiting'] = 'Ke schválení';
+$lang['default'] = 'výchozí';
+$lang['Toggle \'default group\' property'] = 'Přepnout vlastnost \'základní skupina\'';
+$lang['Advanced features'] = 'Rozšířené vlastnosti';
+$lang['Overall'] = 'Celkově';
+$lang['Year'] = 'Rok';
+$lang['Month'] = 'Měsíc';
+$lang['Day'] = 'Den';
+$lang['Pages seen'] = 'Prohlédnuto stránek';
+$lang['Time'] = 'čas';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Fotografie';
+$lang['Section'] = 'sekce';
+$lang['An information email was sent to group "%s"'] = 'Informační e-mail byl poslán skupině "%s';
+$lang['Send an information email to group members'] = 'Poslat informační e-mail uživatelům skupiny';
+$lang['Group'] = 'Skupina';
+$lang['[%s] Visit album %s'] = '[%s] Navštivte album %s';
+$lang['Hello,'] = 'Dobrý den,';
+$lang['See you soon.'] = 'Nashledanou.';
+$lang['Discover album:'] = 'Objevit album:';
+$lang['Mail content'] = 'Obsah e-mailu';
+$lang['none'] = 'žádný';
+$lang['high'] = 'vysoký';
+$lang['other'] = 'jiný';
+$lang['Element type'] = 'Typ položky';
+$lang['Image id'] = 'ID fotografie';
+$lang['Summary'] = 'Souhrn';
+$lang['%d line filtered'] = '%d řádka filtrována';
+$lang['%d lines filtered'] = '%d řádek filtrováno';
+$lang['%d guest'] = '%d host';
+$lang['%d guests'] = '%d hostů';
+$lang['Hour'] = 'Hodina';
+$lang['guest'] = 'host';
+$lang['default values'] = 'výchozí hodnoty';
+$lang['Guest cannot be deleted'] = 'Uživatele host nelze vymazat';
+$lang['Default user cannot be deleted'] = 'Výchozího uživatele nelze vymazat';
+$lang['Purge history detail'] = 'Provést údržbu detailů historie';
+$lang['Purge history summary'] = 'Provést údržbu celé historie';
+$lang['Check integrity'] = 'Zkontrolovat integritu';
+$lang['Anomaly'] = 'Anomálie';
+$lang['Correction'] = 'Oprava';
+$lang['Automatic correction'] = 'Automatická oprava';
+$lang['Impossible automatic correction'] = 'Automatická oprava není možná';
+$lang['Correction applied with success'] = 'Oprava úspěšně provedena';
+$lang['Correction applied with error'] = 'Oprava se nezdařila';
+$lang['%d anomaly has been detected.'] = '%d anomálie detekována.';
+$lang['%d anomalies have been detected.'] = '%d anomálií detekováno.';
+$lang['%d anomaly has been corrected.'] = '%d anomálie byla opravena.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomálií bylo opraveno.';
+$lang['%d anomaly has not been corrected.'] = '%d anomálie byla opravena.';
+$lang['%d anomalies have not been corrected.'] = '%d anomálií nebylo opraveno.';
+$lang['Go to %s or %s for more informations'] = 'Více informací naleznete na %s a %s';
+$lang['the forum'] = 'fórum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s není korektní soubor - EXIF není podporován';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s musí být nastaven na false v souboru config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'Hlavní uživatel "host" neexistuje';
+$lang['Main "guest" user status is incorrect'] = 'Stav hlavního uživatele "host" je chybný';
+$lang['Default user does not exist'] = 'Výchozí hlavní uživatel neexistuje';
+$lang['Main "webmaster" user does not exist'] = 'Hlavní uživatel "administrátor" neexistuje';
+$lang['Main "webmaster" user status is incorrect'] = 'Stav hlavního uživatele "administrátor" je chybný';
+$lang['User "%s" created with "%s" like password'] = 'Uživatel "%s" vytvořen s heslem "%s"';
+$lang['Status of user "%s" updated'] = 'Stav uživatele "%s" aktualizován';
+$lang['add new photos to caddie'] = 'přidat nové položky do košíku';
+$lang['No display'] = 'Bez zobrazení';
+$lang['Classic display'] = 'Běžné zobrazení';
+$lang['Hoverbox display'] = 'Zobrazit při najetí myší';
+$lang['Mail address is obligatory for all users'] = 'E-mailová adresa je povinná pro všechny uživatele';
+$lang['Minimum privacy level'] = 'Nejnižší stupeň ochrany soukromí';
+$lang['Privacy level'] = 'Stupeň ochrany soukromí';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakty';
+$lang['Level 2'] = 'Přátelé';
+$lang['Level 4'] = 'Rodina';
+$lang['Level 8'] = 'Administrátoři';
+$lang['Reinitialize check integrity'] = 'Znovu spustit kontrolu integrity';
+$lang['Check all'] = 'Vybrat vše';
+$lang['Uncheck all'] = 'Zrušit výběr';
+$lang['Check automatic corrections'] = 'Vybrat automatické opravy';
+$lang['Apply selected corrections'] = 'Provést vybrané opravy';
+$lang['Ignore selected anomalies'] = 'Ignorovat vybrané anomálie';
+$lang['Refresh'] = 'Aktualizovat';
+$lang['The anomaly will be ignored until next application version'] = 'Anomálie bude ignorována do nové verze aplikace';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Provedením opravy anomálie se zruší její ignorace';
+$lang['%d anomaly has been ignored.'] = '%d anomálie byla ignorována.';
+$lang['%d anomalies have been ignored.'] = '%d anomálií bylo ignorováno.';
+$lang['Plugins which need upgrade'] = 'Doplňky vyžadující aktualizaci';
+$lang['Plugin list'] = 'Seznam doplňků';
+$lang['Check for updates'] = 'Zkontrolovat aktualizace';
+$lang['Other plugins'] = 'Další doplňky';
+$lang['Last revisions'] = 'Poslední revize';
+$lang['Are you sure you want to delete this plugin?'] = 'Přejete si odstranit tento doplněk?';
+$lang['Are you sure you want to install this plugin?'] = 'Přejete si nainstalovat tento doplněk?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Přejete si nainstalovat tuto aktualizaci? Je potřeba ověřit, jestli stávající verzi není nutné nejdříve odinstalovat.';
+$lang['Plugin has been successfully copied'] = 'Doplněk byl úspěšně nainstalován';
+$lang['You might go to plugin list to install and activate it.'] = 'Doplněk je potřeba aktivovat v seznamu doplňků.';
+$lang['Can\'t create temporary file.'] = 'Nelze vytvořit dočasný soubor.';
+$lang['Can\'t download archive.'] = 'Nelze stáhnout archiv.';
+$lang['Can\'t read or extract archive.'] = 'Archiv nelze rozbalit nebo přečíst.';
+$lang['An error occured during extraction (%s).'] = 'Během rozbalování došlo k chybě (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Prosím zkontrolujte oprávnění pro adresář "plugins" včetně podadresářů (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Nelze se připojit k serveru.';
+$lang['Purge compiled templates'] = 'Provést údržbu šablon';
+$lang['Upload'] = 'Nahrát fotografie';
+$lang['ACCESS_0'] = 'Volný přístup';
+$lang['ACCESS_1'] = 'Přístupné všem';
+$lang['ACCESS_2'] = 'Přístupné přihlášeným';
+$lang['ACCESS_3'] = 'Přístupné administrátorům';
+$lang['ACCESS_4'] = 'Přístupné správcům';
+$lang['ACCESS_5'] = 'Nepřístupné';
+$lang['Support'] = 'Podpora';
+$lang['Documentation'] = 'Dokumentace';
+$lang['A new version of Piwigo is available.'] = 'Je dostupná nová verze Piwigo.';
+$lang['Piwigo Administration'] = 'Administrace Piwigo';
+$lang['Piwigo version'] = 'Verze Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Používáte nejnovější verzi Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Používaná verze %s [%s] není kompatibilní s požadovanou verzí [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Je nutné aktualizovat systém pokud chcete využívat všechny funkce aplikace - jinak nemusí aplikace pracovat správně nebo vůbec';
+$lang['Deleted on'] = 'Vymazáno';
+$lang['Last hit'] = 'Poslední zobrazení';
+$lang['GD library is missing'] = 'GD knihovna neexistuje';
+$lang['Templates'] = 'Šablony';
+$lang['Extend for templates'] = 'Rozšířit pro šablony';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Nahradit původní šablony uživatelskými z podadresáře template-extension';
+$lang['Replacers (customized templates)'] = 'Nahradit uživatelskými šablonami';
+$lang['Original templates'] = 'Původní šablony';
+$lang['Optional URL keyword'] = 'Volitelné klíčové slovo URL';
+$lang['Templates configuration has been recorded.'] = 'Nastavení šablon bylo uloženo.';
+$lang['All optimizations have been successfully completed.'] = 'Všechny změny byly úspěšně dokončeny.';
+$lang['Optimizations have been completed with some errors.'] = 'Změny byly dokončeny s několika chybami.';
+$lang['Modify information'] = 'Upravit informace';
+$lang['nothing'] = 'prázdné';
+$lang['overrides existing values with empty ones'] = 'nahradit stávající hodnoty prázdnými';
+$lang['Manage photo ranks'] = 'Spravovat hodnocení fotografií';
+$lang['Edit ranks'] = 'Upravit hodnocení';
+$lang['No photo in this album'] = 'Žádný element v tomto albu';
+$lang['Images manual order was saved'] = 'Pořadí fotografií bylo uloženo';
+$lang['ranks'] = 'hodnocení';
+$lang['Drag to re-order'] = 'Pořadí změníte táhnutím myši';
+$lang['Quick Local Synchronization'] = 'Rychlá místní synchronizace';
+$lang['No photo can be deleted'] = 'Fotografie nemůže být vymazána';
+$lang['Delete selected photos'] = 'Vymazat vybrané fotografie';
+$lang['%d photo was deleted'] = '%d fotografie vymazána';
+$lang['%d photos were deleted'] = '%d fotografií vymazáno';
+$lang['Downloads'] = 'Staženo';
+$lang['Released on'] = 'Vydáno';
+$lang['Number of downloads'] = 'Počet stažení';
+$lang['Upload Photos'] = 'Nahrát fotografie';
+$lang['Drop into album'] = 'Dát do alba';
+$lang['+ Add an upload box'] = '+ Přidat pole';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Vytvořte "%s" adresáře v kořenovém adresáři instalace Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Povolte zápis (chmod 777,644,atd.) do "%s" adresáře v kořenovém adresáři instalace Piwigo';
+$lang['existing album'] = 'existující album';
+$lang['create a new album'] = 'vytvořit nové album';
+$lang['Album name'] = 'Název alba';
+$lang['Album "%s" has been added'] = 'Kategorie "%s" přidána';
+$lang['Uploaded Photos'] = 'Nahrát fotografie';
+$lang['%d photos uploaded'] = '%d fotografií nahráno';
+$lang['Privacy level set to "%s"'] = 'Uroveň soukromí údajú nastaven na "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategorie "%s" nyní obsahuje %d fotografií';
+$lang['Manage this set of %d photos'] = 'Spravovat tento soubor %d fotografií';
+$lang['Select files'] = 'Výběr souborů';
+$lang['Operation in progress'] = 'Provádím údržbu.';
+$lang['Please wait...'] = 'Prosím počkejte...';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Zpravodaj';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Přihlašte se k odběru Piwigo zpravodaje, aby jste byli informování o novinkách. Dostanete tak e-mail, když bude k dispozici nová verze Piwigo (která může obsahovat bezpečnostní záplatu, o čemž je důležité být informován) a nebo v případě důležitých novinek v projektu. Jedná se jen o několik mailů ročně.';
+$lang['Subscribe %s'] = 'Přihlásit %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Přihlásit %s k Zpravodaji Piwigo';
+$lang['Purge search history'] = 'Odstranit historii hledání';
+$lang['Hide'] = 'Skrýt';
+$lang['Password is missing. Please enter the password.'] = 'Chybí heslo. Prosím napište heslo.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Chybí potvrzení hesla. Prosím potvrďte vybrané heslo.';
+$lang['Allow users to edit their own comments'] = 'Povolit uzivatelům upravovat jejich vlastní komentáře';
+$lang['Allow users to delete their own comments'] = 'Povolit uzivatelům mazat jejich vlastní komentáře';
+$lang['Email administrators when a comment is modified'] = 'Informovat e-mailem administrátory, když je upraven komentář';
+$lang['Email administrators when a comment is deleted'] = 'Informovat e-mailem administrátory, když je smazán komentář';
+$lang['Cannot delete the old permalink !'] = 'Starý pernamentní odkaz nemůže být smazán!';
+$lang['Hit'] = 'Zobrazení';
+$lang['Tools'] = 'Nástroje';
+$lang['Photos'] = 'Fotografie';
+$lang['Themes'] = 'Témata';
+$lang['Instructions to use Piwigo'] = 'Informace jak používat Piwigo';
+$lang['Installed Themes'] = 'Instalovaná témata';
+$lang['Add New Theme'] = 'Přidat nové téma';
+$lang['Forbid this theme to users'] = 'Zakázat použití tohoto tématu uživatelům';
+$lang['Set as default theme for unregistered and new users'] = 'Nastavit výchozí téma pro nezaregistrované a nové uživatele';
+$lang['unknown'] = 'neznámý';
+$lang['Everybody'] = 'Každý';
+$lang['Who can see these photos?'] = 'Kdo může vidět tyto fotografie?';
+$lang['Who can see this photo?'] = 'Kdo může vidět tuto fotografii?'; 
+$lang['Pending Comments'] = 'Nevyřízené komentáře';
+$lang['Settings'] = 'Nastavení';
+$lang['Resize'] = 'Změnit velikost';
+$lang['Maximum Width'] = 'Maximální šířka';
+$lang['pixels'] = 'bodů';
+$lang['Maximum Height'] = 'Maximální výška';
+$lang['Image Quality'] = 'Kvalita formátu';
+$lang['Save Settings'] = 'Uložit nastavení';
+$lang['Your configuration settings are saved'] = 'Vaše nastavení bylo uloženo';
+$lang['Active Themes'] = 'Aktivní témata';
+$lang['Add write access to the "%s" directory'] = 'nastavte přístup pro zápis do adresáře "%s"';
+$lang['Administration Home'] = 'Úvodní stránka administrace';
+$lang['Change Admin Colors'] = 'Změňte barvy administrace';
+$lang['Delete this theme'] = 'Zrušte toto téma';
+$lang['Directory does not exist'] = 'Adresář neexistuje';
+$lang['Download,'] = 'Stáhnout,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronizace';
+$lang['Get Support on Piwigo Forum'] = 'Získat podporu na fóru Piwigo';
+$lang['Help Me'] = 'Pomoc';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Toto téma nemůže být aktivováno, protože chybí rodičovské téma: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Toto téma nemůže být zrušeno, protože na něm závisí další témata: %s';
+$lang['Inactive Themes'] = 'Neaktivní témata';
+$lang['Install on your computer,'] = 'Instalovat na Váš počítač,';
+$lang['Make this theme available to users'] = 'Zpřístupnit uživatelům';
+$lang['Page end'] = 'Konec stránky';
+$lang['Piwigo Uploader'] = 'Piwigo nahrávání fotografií';
+$lang['Read Piwigo Documentation'] = 'Čtěte Piwigo dokumentaci';
+$lang['Start pLoader and add your photos.'] = 'Spusťte pLoader a přidejte Vaše fotografie.';
+$lang['Switch to clear or dark colors for administration'] = 'Přepnout na světlé nebo tmavé barvy pro administraci';
+$lang['Theme has been successfully installed'] = 'Téma bylo úspěšně nainstalováno';
+$lang['Visit Gallery'] = 'Navštívit galerii';
+$lang['Visit Piwigo project website'] = 'Navštívit Piwigo projektový web portál';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader je <em>Piwigo nahrávání</em>. pLoader připraví Vaše fotografie na Vašem počítači a nahraje je na Vaši Piwigo foto galerii.';
+$lang['Guest Settings'] = 'Nastavení pro hosty';
+$lang['Main Page'] = 'Hlavní strana';
+$lang['Photo Page'] = 'Strana fotografie';
+$lang['Activate Navigation Bar'] = 'Aktivovat navigační lištu';
+$lang['Activate Navigation Thumbnails'] = 'Aktivovat navigační náhledy';
+$lang['Activate icon "%s"'] = 'Aktivovat ikonu "%s"';
+$lang['Photo Properties'] = 'Vlastnosti fotografie';
+$lang['Allow user customization'] = 'Povolit uživatelskou úpravu nastavení';
+$lang['Languages'] = 'Jazyky';
+$lang['Installed Languages'] = 'Instalované jazyky';
+$lang['Add New Language'] = 'Přidat nový jazyk';
+$lang['Language has been successfully installed'] = 'Jazyk byl úspěšně nainstalován';
+$lang['Select:'] = 'Vybrat:';
+$lang['None'] = 'Žádný';
+$lang['Invert'] = 'Obrátit';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Není možno deaktivovat toto téma, potřebujete alespoň jedno téma.';
+$lang['Webmaster status is required.'] = 'Je požadován status správce stránky.';
+$lang['Bound Theme'] = 'Svázat téma';
+$lang['Allow rating'] = 'Povolit hodnocení';
+$lang['Select at least one comment'] = 'Vyberte alespoň jeden komentář';
+$lang['Active Plugins'] = 'Aktivní doplňky';
+$lang['Inactive Plugins'] = 'Deaktivované doplňky';
+$lang['Missing Plugins'] = 'Chybějící doplňky';
+$lang['Uninstalled Plugins'] = 'Nenainstalované doplňky';
+$lang['By %s'] = 'od %s';
+$lang['Visit plugin site'] = 'navštivte web portál doplňku';
+$lang['Active Languages'] = 'Aktivní jazyky';
+$lang['Delete this language'] = 'Odstranit tento jazyk';
+$lang['Forbid this language to users'] = 'Znepřístupnit tento jazyk uživatelům';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Není možné deaktivovat tento jazyk, nejprve vyberte jiný výchozí jazyk.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Není možné deaktivovat tento jazyk, potřebujete alespoň jeden jazyk.';
+$lang['Inactive Languages'] = 'Deaktivované jazyky';
+$lang['Make this language available to users'] = 'Zpřístupnit tento jazyk uživatelům';
+$lang['Set as default language for unregistered and new users'] = 'Nastavit jako výchozí jazyk pro nezaregistrované a nové uživatele';
+$lang['Add Photos'] = 'Přidat fotografie';
+$lang['The following tag was deleted'] = 'Následující klíčové slovo byl odstraněn';
+$lang['Miscellaneous'] = 'Různé';
+$lang['Virtual Links'] = 'Virtuální odkazy';
+$lang['There is no other language available.'] = 'Není dostupný žádný další jazyk.';
+$lang['There is no other plugin available.'] = 'Není dostupný žádný další doplněk.';
+$lang['There is no other theme available.'] = 'Není dostupné žádné další téma.';
+$lang['Add another set of photos'] = 'Přidat další množinu fotografií';
+$lang['Unable to check for upgrade.'] = 'Není možno ověřit zda exituje nová verze.';
+$lang['user_status_generic'] = 'Všeobecné';
+$lang['IP'] = 'IP';
+$lang['By rank'] = 'Podle hodnoceni';
+$lang['Manual order'] = 'Řazeno ručně';
+$lang['Order of menubar items has been updated successfully.'] = 'Pořadí položek v menu bylo úspěšně aktualizováno.';
+$lang['This theme was not designed to be directly activated'] = 'Toto téma nebylo navrženo tak, aby bylo přímo aktivovatelné';
+$lang['Menu Management'] = 'Další funkce';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Ve vašem souboru php.ini, je nastavení upload_max_filesize (%sB) větší než nastavení post_max_size (%sB), ';
+$lang['Exif extension not available, admin should disable exif use'] = 'PHP rozšíření Exif není dostupné, admininstrátor by měl vypnout použití exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Velikost nahraváného souboru je větší než nastavení upload_max_filesize ve Vašem souboru php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Velikost nahraváného souboru je větší než nastavení post_max_size directive ve Vašem souboru php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Velikost nahraváného souboru je větší než nastavení MAX_FILE_SIZE definovaná v HTML form';
+$lang['The uploaded file was only partially uploaded'] = 'Nahrávaný soubor byl nahrán pouze částečně';
+$lang['No file was uploaded'] = 'Žádný soubor nebyl nahrán';
+$lang['Missing a temporary folder'] = 'Chybějící dočasný adresář';
+$lang['Failed to write file to disk'] = 'Nepodařilo se zapsat soubor na disk';
+$lang['File upload stopped by extension'] = 'Nahrávání souboru bylo zastaveno kvůlu přípony';
+$lang['Unknown upload error'] = 'Neznámá chyba při nahrávání';
+$lang['Error on file "%s" : %s'] = 'Chyba souboru "%s" : %s';
+$lang['automatic order'] = 'automatické řazení';
+$lang['manual order'] = 'ruční řazení';
+$lang['Albums automatically sorted'] = 'Alba jsou řazena automaticky';
+$lang['Batch Manager'] = 'Dávkové zpracování';
+$lang['include child albums'] = 'zahrnout podřízená alba';
+$lang['Selection'] = 'Výběr';
+$lang['Action'] = 'Akce';
+$lang['Set author'] = 'Nastavit autora';
+$lang['Set title'] = 'Nastavit název';
+$lang['Set creation date'] = 'Nastavit datum vytvoření';
+$lang['Apply action'] = 'Provést akci';
+$lang['on the %d selected photos'] = 'na %d vybraných fotografiích';
+$lang['%d of %d photos selected'] = '%d z %d fotografií vybráno';
+$lang['No photo selected, %d photos in current set'] = 'Žádná fotografie nebyla vybrána, %d fotografií v množině';
+$lang['All %d photos are selected'] = 'Všech %d fotografií bylo vybráno';
+$lang['remove this filter'] = 'smazat tento filtr';
+$lang['Duplicates'] = 'duplikáty';
+$lang['Add a filter'] = 'Přidat filtr';
+$lang['Remove all filters'] = 'Smazat všechny filtry';
+$lang['Refresh photo set'] = 'Obnovit množinu fotografií';
+$lang['The whole page'] = 'Celou stránku';
+$lang['The whole set'] = 'Celou množinu';
+$lang['No photo in the current set.'] = 'Žádná fotografie v aktuální množině.';
+$lang['No photo selected, no action possible.'] = 'Žádná fotografie není vybrána, žádná akce není možná.';
+$lang['Choose an action'] = 'Vyberte akci';
+$lang['remove author'] = 'smazat autora';
+$lang['Type here the author name'] = 'Napište zde jmého autora';
+$lang['remove title'] = 'smazat název';
+$lang['Type here the title'] = 'Napište zde název';
+$lang['remove creation date'] = 'smazat datum vytvoření';
+$lang['Album photos associated to the following albums: %s'] = 'Fotky alba přiřazeny k následujícím albům: %s';
+$lang['Delete orphan tags'] = 'Smazat tagy';
+$lang['delete photo'] = 'smazat fotky';
+$lang['Orphan tags deleted'] = 'Tagy odstraněny';
+$lang['Remove from caddie'] = 'Odebrat z caddie';
+$lang['Week starts on'] = 'Týden začíná v';
+$lang['You have %d orphan tags: %s.'] = 'Máte %d tagů: %s.';
+$lang['Themes which need upgrade'] = 'Šablony, které potřebují aktualizovat';
+$lang['Languages which need upgrade'] = 'Jazyky které potřebují aktualizovat';
+$lang['All themes are up to date.'] = 'Všechny šablony jsou akuální.';
+$lang['All plugins are up to date.'] = 'Všechny doplňky jsou akuální.';
+$lang['All languages are up to date.'] = 'Všechny překlady jsou akuální.';
+$lang['Visit theme site'] = 'Navštívit web šablony';
+$lang['Visit language site'] = 'Navštívit web překladu';
+$lang['New Version'] = 'Nová verze';
+$lang['Obsolete Plugins'] = 'Zastaralé Pluginy';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'POZOR! Tento plugin se zdá nekompatibilní s touto verzí Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Přejete si je přesto aktivovat?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TENTO PLUGIN JE NYNÍ SOUČÁSTÍ JÁDRA PIWIGO! ODINSTALUJTE HO!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'CHYBA: TENTO PLUGIN CHYBÍ, ALE JE NAINSTALOVÁN! ODINSTALUJTE HO.';
+$lang['display'] = 'zobrazit';
+$lang['new'] = 'nové';
+$lang['No results'] = 'Žádný výsledek';
+$lang['Searching...'] = 'Hledám...';
+$lang['Type in a search term'] = 'Zadejte hledaný výraz';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivovat ikonu "nové" vedle alb a obrázků';
+$lang['Deactivate all'] = 'Deaktivovat vše';
+$lang['Default photos order'] = 'Výchozí pořadí fotografií';
+$lang['Restore'] = 'Obnovit';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Obnovit výchozí konfiguraci. Přijdete o nastavení v pluginech!';
+$lang['Show menubar'] = 'Zobrazit menu';
+$lang['Thumbnails generation in progress...'] = 'Generování náhledů v přípravě...';
+$lang['Photos generation in progress...'] = 'Generování fotek v přípravě...';
+$lang['%s photos have been regenerated'] = '%s fotek bylo regenerováno';
+$lang['%s photos can not be regenerated'] = '%s fotek nemohlo být regenerováno';
+$lang['Updates'] = 'Aktualizace';
+$lang['Update in progress... Please wait.'] = 'Probíhá aktualizace... Prosím čekejte.';
+$lang['Ignore this update'] = 'Ignoruj tuto aktualizaci';
+$lang['Reset ignored updates'] = 'Resetuj ignorované aktualizace';
+$lang['Update All'] = 'Aktualizuj vše';
+$lang['ERROR'] = 'CHYBA';
+$lang['Update Complete'] = 'Aktualizace kompletní';
+$lang['Piwigo Update'] = 'Piwigo Aktualizace';
+$lang['Extensions Update'] = 'Aktualizace Doplňků';
+$lang['All extensions are up to date.'] = 'Veškerá rozšíření jsou aktuální.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Následující pluginy nemusejí být kompatibilní s novou verzí Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Následující šablony vzhledu nemusejí být kompatibilní s novou verzí Piwigo:';
+$lang['I decide to update anyway'] = 'Rozhodl jsem se aktualizovat';
+$lang['Update to Piwigo %s'] = 'Aktualizace na Piwigo %s';
+$lang['Two updates are available'] = 'dvě aktualizace jsou k dispozici';
+$lang['This is a minor update, with only bug corrections.'] = 'Toto je minoritní aktualizace, opravuje zejména chyby.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Toto je velká aktualizace, s <a href="%s">novými funkcemi</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Některé šablony vzhledu a pluginy nemusejí být dostupné.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Můžete aktualizovat na vyšší verzi Piwigo %s přímo, bez nutnosti upgradu na Piwigo %s (doporučeno).';
+$lang['Save Template Directory'] = 'Uložit složku šablony';
+$lang['Dump Database'] = 'Záloha (Dump) Databáze';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Ponech data historie (Upozornění: limit paměti serveru může být překročen)';
+$lang['Unable to dump database.'] = 'Nelze zálohovat databázi.';
+$lang['Some upgrades are available for extensions.'] = 'Pro některý z doplňků je připravena aktualizace.';
+$lang['Ignore All'] = 'Ignoruj Vše';
+$lang['Crop'] = 'Ořez';
+$lang['Width'] = 'Šířka';
+$lang['Height'] = 'Výška';
+$lang['Follow Orientation'] = 'Postupuj podle orientace';
+$lang['Graphics Library'] = 'Grafická knihovna';
+$lang['Average rate'] = 'Průměrné hodnocení';
+$lang['Rate'] = 'Hodnocení';
+$lang['Add a criteria'] = 'Přidání kritéria';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Nemužete definovat výchozí pořadí fotografií, protože máte nadefinováno vlastní nastavení v konfiguraci';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Specifikovali jste <i>$conf[\'order_by\']</i> v konfiguračním souboru, tento parametr je zastaralý, prosím odstraňte ho nebo přejmenujte na <i>$conf[\'order_by_custom\']</i> !';
+$lang['Learn more'] = 'Zjistit více';
+$lang['... or '] = '... nebo ';
+$lang['Create'] = 'Vytvořit';
+$lang['Start Upload'] = 'Zahájit Upload';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Nyní používáte Flash uploader. Problémy? Zkuste <a href="%s">Browser uploader</a> místo něj.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Používáte Browser uploader. Můžete zkusit <a href="%s">Flash uploader</a> místo něj.';
+$lang['Maximum file size: %sB.'] = 'Maximální velikost souboru: %sB.';
+$lang['Allowed file types: %s.'] = 'Povolené typy souborů: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Aproximované max. rozlišení: %dM pixelů (to je %dx%d pixelů).';
+$lang['Manage Permissions'] = 'Nastavení oprávnění';
+$lang['Photo %s of %s'] = 'Fotografií %s ze %s';
+$lang['show details'] = 'zobrazit detaily';
+$lang['hide details'] = 'skrýt detaily';
+$lang['Merge tags'] = 'Sloučit tagy';
+$lang['Select the destination tag'] = 'Vyberte cílový tag';
+$lang['(this tag will be deleted)'] = '(tento tag bude vymazán)';
+$lang['Confirm merge'] = 'Potvrdit sloučení';
+$lang['Merge selected tags'] = 'Sloučit vybrané tagy';
+$lang['No destination tag selected'] = 'Cílový tag nebyl vybrán';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tagy <em>%s</em> sloučeny do tagu <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Vyberte alespoň 2 tagy pro sloučení';
+$lang['Select an album'] = 'Vyberte album';
+$lang['An error has occured during upgrade.'] = 'Během aktualizace došlo k chybě.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'K chybě došlo během rozbalování. Prosím ověřte oprávnění na soubory Vaší instalace Piwigo.<br><a href="%s">Pro zobrazení chybového logu klikněte zde</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo nemùže získat novou verzi ze serveru';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Jako výchozí, Piwigo vytvoří nový rozměr(upraví rozlišení) vašich nahrávaných fotografií v HD rozlišení.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Pokud nemáte obrázek v HD rozlišení a pokud stávající webové rozlišení je větší než nastavené rozsahy dimenzí obrázku, Piwigo fotku vezme jako HD a vytvoří zmenšenou verzi obrázku pro web z originálu.';
+$lang['Zoom'] = 'Přiblížit';
+$lang['Add to caddie'] = 'Přidat do košíku';
+$lang['%s has been successfully updated.'] = '%s: úspěšně aktualizováno.';
+$lang['Add tags'] = 'Přidat tagy';
+$lang['Last import'] = 'Poslední import';
+$lang['Photo name'] = 'Název fotografie';
+$lang['Predefined filter'] = 'Předdefinovaný filtr';
+$lang['With no album'] = 'Bez alba';
+$lang['With no tag'] = 'Bez tagu';
+$lang['With no virtual album'] = 'Bez virtuálního alba';
+$lang['Activate comments'] = 'Aktivovat komentáře';
+$lang['Default comments order'] = 'Výchozí řazení komentářů';
+$lang['Send connection settings by email'] = 'Zaslat přístupové údaje emailem';
+$lang['The original image quality must be a number between %d and %d'] = 'Původní kvalita obrázku musí být mezi %d a %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Výška originálu musí být mezi %d a %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Šířka originálu musí být mezi %d a %d';
+$lang['Resize after upload'] = 'Změnit velikost po uploadu';
+$lang['Original Size'] = 'Původní velikost';
+$lang['A locked gallery is only visible to administrators'] = 'Zamčenou galerii může zobrazovat pouze administrátor';
+$lang['Unlock gallery'] = 'Odemknout galerii';
+$lang['Gallery unlocked'] = 'Galerie je odemčena';
+$lang['Notify administrators when a comment is'] = 'Upozornit administrátora na komentář když je';
+$lang['modified'] = 'modifikován';
+$lang['pending validation'] = 'čekající na ověření';
+$lang['Save visits in history for'] = 'Uložit historii návštěv pro';
+$lang['simple visitors'] = 'jednotlivé návštěvy';
+$lang['registered users'] = 'registrované uživatele';
+$lang['administrators'] = 'administrátory';
+$lang['This album contains %d photos, added on %s.'] = 'Album obsahuje %d fotek, přidaných v %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Album obsahuje %d fotky přidané mezi %s a %s.';
+$lang['This album contains no photo.'] = 'Album neobsahuje žádné fotografie.';
+$lang['Not cropped correctly?'] = 'Je ořez v pořádku?';
+$lang['Center of interest'] = 'Střed zájmu';
+$lang['Move to album'] = 'Přesunout do alba';
+$lang['You can activate only one mobile theme.'] = 'Jde aktivovat pouze v mobilním zobrazení.';
+$lang['Automatic sort order'] = 'Automatické pořadí';
+$lang['apply automatic sort order'] = 'Použij automatické pořadí';
+$lang['Save manual order'] = 'Ulož ruční uspořádání';
+$lang['cancel manual order'] = 'zruš ruční uspořádání';
+$lang['Cancel'] = 'Zruš';
+$lang['List'] = 'Přehled';
+$lang['Web Form'] = 'Webový Formulář';
+$lang['Applications'] = 'Aplikace';
+$lang['Available versions for'] = 'Dostupné verze pro';
+$lang['Available on'] = 'K dispozici na';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo pro iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo pro iOS</em> aplikace vám dává možnost se připojit do galerie Piwigo z vašeho iPhone, iPad nebo iPod Touch, vytvořit nějaké alba a nahrávat více fotografií najednou.';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo pro Android</em> aplikace vám dává možnost se připojit do galerie Piwigo z vašeho Android telefonu nebo tabletu, vytvořit nějaké alba a nahrávat více fotografií najednou.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publikační plugin pro Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom je fotografický software určený ke správě velkého množství digitálních fotografií a postprodukčních prací.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publikační Plug-in umožňuje export a synchronizaci fotek z Lightroom přímo do vaší Piwigo fotogalerie.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publikační plugin pro Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell je open source digitalní foto organizér pro Linux. Je to základní foto manažer v  distribucích Ubuntu a Fedora.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Na linuxu, jednoduše nainstalujte Shotwell s pomocí vašeho správce balíčků a potom aktivujte Piwigo publikační volbu.';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publikační plugin pro digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam je pokročilý správce fotografií free software pro Linux, Windows, and MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam je určen pro fotografy, kteří chtějí prohlížet, spravovat, upravovat, zlepšovat, uspořádávat, označovat a sdílet fotografie.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Chcete-li exportovat své fotografie z Digikam do Piwigo, jednoduše nainstalujte digiKam a Kipi-plugin.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo exportní plugin pro iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto je výchozí správce fotografií na MacOSX. Exportní Piwigo plugin vám umožní vytvořit nová alba a exportovat své fotografie přímo z iPhoto do fotogalerie Piwigo.';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo exportní plugin pro Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture je výkonný nástroj pro zdokonalení snímků a správu obrovských knihoven na Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture je navržen pro profesionální fotografy s jednoduchostí iPhoto.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo exportní plugin umožňuje vytvářet alba a exportovat fotografie.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery klient pro Android) je open source (GPL v3) Piwigo klient pro Android platformu.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funkce obsahuje prohlížení galerie, tvorbu alb a upload fotografií.';
+$lang['Generate multiple size images'] = 'Generovat více velikostí obrázků';
+$lang['Delete multiple size images'] = 'Odstranění více velikostí obrázků';
+$lang['any visitor can see this album'] = 'každý návštěvník může prohlížet toto album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'návštěvník se musí přihlásit a mít přidělena vhodná oprávnění pro prohlížení tohoto album';
+$lang['Groups and users'] = 'Skupiny a uživatelé';
+$lang['Permission granted for groups'] = 'Oprávnění udělená pro skupiny';
+$lang['Select groups...'] = 'Výběr skupiny...';
+$lang['There is no group in this gallery.'] = 'Nemáte žádnou skupinu v této galerii.';
+$lang['Permission granted for users'] = 'Oprávnění udělená pro uživatele';
+$lang['Select users...'] = 'Výběr uživatelů...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u uživatelé mají automatické oprávnění, protože patří do vybrané skupiny.';
+$lang['include photos with lower privacy level'] = 'zahrnuje fotky s nižší úrovní soukromí ';
+$lang['custom'] = 'Vlastní';
+$lang['No group is permitted to see this private album'] = 'Žádná ze skupin nemá oprávnění prohlížet toto soukromé album';
+$lang['Permission management'] = 'Správa pravidel přístupu';
+
+$lang['add a new watermark'] = 'Přidej vodoznak';
+$lang['Apply watermark if height is bigger than'] = 'Vlož vodoznak pokud je výška delší než';
+$lang['Apply watermark if width is bigger than'] = 'Vlož vodoznak pokud je šířka delší než';
+$lang['bottom left corner'] = 'Levý spodní roh';
+$lang['bottom right corner'] = 'Pravý spodní roh';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Podle púuvodního nastavení je střed zájmu umístěn doprostřed fotografie.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Pro fotografie s ořezem, jako třeba "čtverec", se Piwigo pokusí umístit střed zájmu do vysledného ořezu.';
+$lang['middle'] = 'střední';
+$lang['Opacity'] = 'Průhlednost';
+$lang['Photo sizes with crop'] = 'Fotografie s ořezem';
+$lang['Select a file'] = 'Vyber soubor';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Vyber myší zónu nového středu zájmu';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Střed zájmu je nejdůležitější část(zóna) fotky';
+$lang['top left corner'] = 'Levý horní roh';
+$lang['top right corner'] = 'Pravý horní roh';
+$lang['X Position'] = 'pozice X';
+$lang['X Repeat'] = 'X opakování';
+$lang['Y Position'] = 'pozice Y';
+$lang['Multiple Size'] = 'Více velikostí';
+?>
Index: tags/2.4.0RC3/language/cs_CZ/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/common.lang.php	(revision 14585)
@@ -0,0 +1,413 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Česky [CZ]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=414
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Čeština';
+$lang_info['country'] = 'Česká Republika';
+$lang_info['charset'] = 'UTF-8';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'cz';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d album aktualizováno';
+$lang['%d albums updated'] = '%d alba aktualizovány';
+$lang['%d comment to validate'] = '%d komentář k validaci';
+$lang['%d comments to validate'] = '%d komentářů k validaci';
+$lang['%d new comment'] = '%d nový komentář';
+$lang['%d new comments'] = '%d nových komentářů';
+$lang['%d comment'] = '%d komentář';
+$lang['%d comments'] = '%d komentářů';
+$lang['%d hit'] = '%d zobrazení';
+$lang['%d hits'] = '%d zobrazení';
+$lang['%d new photo'] = '%d nový objekt';
+$lang['%d new photos'] = '%d nových objektů';
+$lang['%d new user'] = '%d nový uživatel';
+$lang['%d new users'] = '%d nových uživatelů';
+$lang['About'] = 'O galerii';
+$lang['All tags'] = 'Všechna klíčová slova';
+$lang['Any tag'] = 'Kterékoliv klíčové slovo';
+$lang['At least one listed rule must be satisfied.'] = 'Alespoň jedno pravidlo ze seznamu musí být splněno.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Alba';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Zavřít okno';
+$lang['Complete RSS feed (photos, comments)'] = 'Kompletní RSS vlákno (fotografie, komentáře)';
+$lang['Confirm Password'] = 'Potvrdit heslo';
+$lang['Connection settings'] = 'Nastavení přihlašovacích údajů';
+$lang['Login'] = 'Přihlásit se';
+$lang['Contact webmaster'] = 'Kontaktovat administrátora';
+$lang['Create a new account'] = 'Vytvořit nový účet';
+$lang['Created on'] = 'Vytvořeno';
+$lang['Creation date'] = 'Datum vytvoření';
+$lang['Current password is wrong'] = 'Chybně zadané heslo';
+$lang['Dimensions'] = 'Rozměry';
+$lang['Display'] = 'Zobrazit';
+$lang['Each listed rule must be satisfied.'] = 'Všechna pravidla ze seznamu musí být splněna.';
+$lang['Email address is missing. Please specify an email address.'] = 'Chybí e-mailová adresa';
+$lang['Email address'] = 'E-mail';
+$lang['Enter your personnal informations'] = 'Vyplňte svá osobní data';
+$lang['Error sending email'] = 'Chyba při odesílání zprávy';
+$lang['File name'] = 'Název souboru';
+$lang['File'] = 'Soubor';
+$lang['Filesize'] = 'Velikost souboru';
+$lang['Filter and display'] = 'Zobrazit podle filtru';
+$lang['Filter'] = 'Filtr';
+$lang['Forgot your password?'] = 'Zapomenuté heslo?';
+$lang['Go through the gallery as a visitor'] = 'Procházet galerii jako host';
+$lang['Help'] = 'Nápověda';
+$lang['Identification'] = 'Identifikace';
+$lang['Photos only RSS feed'] = 'RSS vlákno jen s fotografiemi';
+$lang['Keyword'] = 'Klíčové slovo';
+$lang['Links'] = 'Odkazy';
+$lang['N/A'] = 'nezadáno';
+$lang['New on %s'] = 'Nový na %s';
+$lang['Notification'] = 'RSS vlákno';
+$lang['Number of items'] = 'Počet položek';
+$lang['Original dimensions'] = 'Původní rozměry';
+$lang['Password forgotten'] = 'Zapomenuté heslo';
+$lang['Password'] = 'Heslo';
+$lang['Post date'] = 'Datum zveřejnění';
+$lang['Posted on'] = 'Odesláno';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Rychlé přihlášení';
+$lang['RSS feed'] = 'RSS čtečka';
+$lang['Register'] = 'Zaregistrovat se';
+$lang['Registration'] = 'Registrace';
+$lang['Related tags'] = 'Související klíčová slova';
+$lang['Reset'] = 'Vynulovat';
+$lang['Retrieve password'] = 'Obnovit heslo';
+$lang['Search rules'] = 'Podmínky pro vyhledávání';
+$lang['Search tags'] = 'Hledat podle klíčových slov';
+$lang['Search'] = 'Vyhledat';
+$lang['display available tags'] = 'Ukázat dostupná klíčová slova';
+$lang['Since'] = 'Od';
+$lang['Sort by'] = 'Řadit podle';
+$lang['Sort order'] = 'Směr řazení';
+$lang['Tag'] = 'Klíčové slovo';
+$lang['Tags'] = 'Klíčová slova';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS zdroj obsahuje upozornění na nové události z tohoto webu: nové fotky, aktualizované galerie, nové komentáře. K použití se čtečkami RSS kanálů.';
+$lang['Unknown feed identifier'] = 'Neznámý identifikátor vlákna';
+$lang['User comments'] = 'Komentáře uživatelů';
+$lang['Username'] = 'Uživatelské jméno';
+$lang['Visits'] = 'Návštěv';
+$lang['Webmaster'] = 'Administrátor';
+$lang['Week %d'] = 'Týden %d';
+$lang['About Piwigo'] = 'O aplikaci Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Nemáte oprávnění k přístupu na požadovanou stránku';
+$lang['add this photo to your favorites'] = 'Přidat tuto fotografii k oblíbeným';
+$lang['Administration'] = 'Administrace';
+$lang['all'] = 'vše';
+$lang['ascending'] = 'vzestupně';
+$lang['author(s) : %s'] = 'autor : %s';
+$lang['Expand all albums'] = 'Rozbalit všechny alba';
+$lang['posted after %s (%s)'] = 'vloženo po %s (%s)';
+$lang['posted before %s (%s)'] = 'vloženo před %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'vloženo mezi %s (%s) a %s (%s)';
+$lang['posted on %s'] = 'vloženo %s';
+$lang['Best rated'] = 'Nejlépe hodnocené';
+$lang['display best rated photos'] = 'Zobrazit nejlépe hodnocené položky';
+$lang['Calendar'] = 'Kalendář';
+$lang['All'] = 'Vše';
+$lang['display each day with photos, month per month'] = 'Fotografie podle dnů, měsíc po měsíci';
+$lang['View'] = 'Zobrazit';
+$lang['chronology_monthly_calendar'] = 'Kalendář na měsíc';
+$lang['chronology_monthly_list'] = 'Seznam na měsíc';
+$lang['chronology_weekly_list'] = 'Týdenní seznam';
+$lang['Click here if your browser does not automatically forward you'] = 'Pokud neproběhlo automatické přesměrování, klikněte sem';
+$lang['comment date'] = 'Datum vložení komentáře';
+$lang['Comment'] = 'Komentář';
+$lang['Your comment has been registered'] = 'Váš komentář byl zaregistrován';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Ochrana proti zahlcení : prosím počkejte chvíli před vložením nového komentáře';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Váš komentář nebyl vložen, protože neprošel schválením';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Váš komentář nebude zobrazen dokud jej neschválí administrátor.';
+$lang['This login is already used by another user'] = 'Přihlašovací jméno je již používáno jiným uživatelem';
+$lang['Comments'] = 'Komentáře';
+$lang['Add a comment'] = 'Vložit komentář';
+$lang['created after %s (%s)'] = 'vytvořeno po %s (%s)';
+$lang['created before %s (%s)'] = 'vytvořeno před %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'vytvořeno mezi %s (%s) a %s (%s)';
+$lang['created on %s'] = 'vytvořeno %s';
+$lang['Customize'] = 'Upravit';
+$lang['Your Gallery Customization'] = 'Přizpůsobit galerii ';
+$lang['day'][0] = 'Neděle';
+$lang['day'][1] = 'Pondělí';
+$lang['day'][2] = 'Úterý';
+$lang['day'][3] = 'Středa';
+$lang['day'][4] = 'Čtvrtek';
+$lang['day'][5] = 'Pátek';
+$lang['day'][6] = 'Sobota';
+$lang['Default'] = 'Výchozí';
+$lang['delete this photo from your favorites'] = 'Odstranit fotografii z oblíbených';
+$lang['Delete'] = 'Smazat';
+$lang['descending'] = 'sestupně';
+$lang['Download'] = 'Stáhnout';
+$lang['Download this file'] = 'stáhnout tento soubor';
+$lang['edit'] = 'Editovat';
+$lang['wrong date'] = 'Chybné datum';
+$lang['excluded'] = 'Vyjmuto z výběru';
+$lang['Your favorites'] = 'Oblíbené';
+$lang['display your favorites photos'] = 'Zobrazí Vaše oblíbené fotografie';
+$lang['Favorites'] = 'Oblíbené';
+$lang['First'] = 'První';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerie je uzamčena z důvodu administrace. Zkuste to prosím později.';
+$lang['Page generated in'] = 'Stránka vytvořena ';
+$lang['guest'] = 'host';
+$lang['Hello'] = 'Přihlášen jako';
+$lang['available for administrators only'] = 'Přístupné pouze adminitrátorům';
+$lang['display this album'] = 'zobrazí fotky v rootu tohoto alba';
+$lang['display last user comments'] = 'Zobrazit nejnovější komentáře uživatelů';
+$lang['customize the appareance of the gallery'] = 'Přizpůsobit vzhled galerie';
+$lang['search'] = 'Hledat';
+$lang['Home'] = 'Úvodní stránka';
+$lang['Identification'] = 'Identifikace';
+$lang['in this album'] = 'v tomto albu';
+$lang['in %d sub-album'] = 'v %d sub-albu';
+$lang['in %d sub-albums'] = 'v %d sub-albech';
+$lang['included'] = 'včetně';
+$lang['Invalid password!'] = 'Špatné heslo!';
+$lang['Language'] = 'Jazyk';
+$lang['last %d days'] = 'posledních %d dnů';
+$lang['Last'] = 'Poslední';
+$lang['Logout'] = 'Odhlásit se';
+$lang['obligatory'] = 'povinné';
+$lang['Maximum photo height'] = 'Maximální výška fotografií';
+$lang['Maximum height must be a number superior to 50'] = 'Maximální výška musí být číslo vetší než 50';
+$lang['Maximum photo width'] = 'Maximální šířka fotografií';
+$lang['Maximum width must be a number superior to 50'] = 'Maximální šířka musí být číslo vetší než 50';
+$lang['display a calendar by creation date'] = 'Zobrazit v kalendáři podle datumu vytvoření';
+$lang['display all photos in all sub-albums'] = 'zobrazit všechny prvky ve všech albech a sub-albech';
+$lang['return to normal view mode'] = 'Návrat do normálního zobrazení';
+$lang['display a calendar by posted date'] = 'Zobrazit v kalendáři podle data vložení';
+$lang['month'][10] = 'Říjen';
+$lang['month'][11] = 'Listopad';
+$lang['month'][12] = 'Prosinec';
+$lang['month'][1] = 'Leden';
+$lang['month'][2] = 'Únor';
+$lang['month'][3] = 'Březen';
+$lang['month'][4] = 'Duben';
+$lang['month'][5] = 'Květen';
+$lang['month'][6] = 'Červen';
+$lang['month'][7] = 'Červenec';
+$lang['month'][8] = 'Srpen';
+$lang['month'][9] = 'Září';
+$lang['Most visited'] = 'Nejčastěji zobrazované';
+$lang['display most visited photos'] = 'Nejčastěji zobrazované fotografie';
+$lang['The number of photos per page must be a not null scalar'] = 'Počet fotografií v stránce musí být číslo větší než 0.';
+$lang['Number of photos per page'] = 'Počet fotografií v stránce';
+$lang['Unknown identifier'] = 'Neznámý identifikátor';
+$lang['New password'] = 'Nové heslo';
+$lang['Rate this photo'] = 'Ohodnotit tuto fotografii';
+$lang['Next'] = 'Následující';
+$lang['no rate'] = 'bez hodnocení';
+$lang['Photos posted within the last %d day.'] = 'Fotografie vložené během posledního %d dne.';
+$lang['Photos posted within the last %d days.'] = 'Fotografie vložené během posledních %d dnů.';
+$lang['password updated'] = 'heslo aktualizováno';
+$lang['Recent period must be a positive integer value'] = 'Aktuální interval musí být číslo větší než 0.';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'fotografie';
+$lang['Click on the photo to see it in high definition'] = 'Pro zobrazení ve vyšším rozlišení klikněte na fotografii';
+$lang['Show file metadata'] = 'Zobrazit metadata';
+$lang['Powered by'] = 'Publikováno pomocí aplikace';
+$lang['Preferences'] = 'Nastavení';
+$lang['Previous'] = 'Předchozí';
+$lang['Random photos'] = 'Náhodný výběr';
+$lang['display a set of random photos'] = 'Zobrazit sadu fotografií podle náhodného výběru';
+$lang['Recent albums'] = 'Poslední alba';
+$lang['display recently updated albums'] = 'zobraz poslední aktualizovaná alba';
+$lang['Recent period'] = 'Doba, po kterou jsou fotografie zobrazeny jako nově přidané';
+$lang['Recent photos'] = 'Nové fotografie';
+$lang['display most recent photos'] = 'Zobrazit nově přidané fotografie';
+$lang['Redirection...'] = 'Přesměrování...';
+$lang['Please, enter a login'] = 'Zadejte prosím přihlašovací údaje';
+$lang['login mustn\'t end with a space character'] = 'uživatelské jméno nesmí končit mezerou';
+$lang['login mustn\'t start with a space character'] = 'uživatelské jméno nesmí začínat mezerou';
+$lang['this login is already used'] = 'tyto přihlašovací údaje už jsou používány';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail musí být ve formátu xxx@yyy.eee (například : novak@seznam.cz)';
+$lang['please enter your password again'] = 'prosím zadejte znovu heslo ';
+$lang['Auto login'] = 'Automatické přihlášení';
+$lang['remove this tag from the list'] = 'odstranit toto klíčové slovo ze seznamu';
+$lang['representative'] = 'Reprezentant';
+$lang['Search for Author'] = 'Hledat autora';
+$lang['Search in albums'] = 'Hledat v albech';
+$lang['Search by date'] = 'Hledat podle data přidání';
+$lang['Date'] = 'Od';
+$lang['End-Date'] = 'Do';
+$lang['Kind of date'] = 'Datum:';
+$lang['Search for words'] = 'Hledat slova';
+$lang['Search for all terms'] = 'Hledat uvedené výrazy ';
+$lang['Search for any term'] = 'Hledat všechny výrazy';
+$lang['Empty query. No criteria has been entered.'] = 'Neúplný dotaz. Nebyly zadány žádné podmínky pro vyhledávání.';
+$lang['Search results'] = 'Výsledky vyhledávání';
+$lang['Search in sub-albums'] = 'Hledat v sub-albech';
+$lang['searched words : %s'] = 'hledat slova : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'nastavit jako zástupce alba';
+$lang['Show number of comments'] = 'Ukázat počet komentářů';
+$lang['Show number of hits'] = 'Ukázat počet zobrazení';
+$lang['slideshow'] = 'Automatické přehrávání';
+$lang['stop the slideshow'] = 'zastavit automatické přehrávání';
+$lang['Specials'] = 'Zobrazit';
+$lang['SQL queries in'] = 'SQL dotazů během';
+$lang['display only recently posted photos'] = 'Zobrazí pouze nově vložené fotografie';
+$lang['return to the display of all photos'] = 'návrat ke zobrazení všech fotografií';
+$lang['the beginning'] = 'začátku';
+$lang['Interface theme'] = 'Šablona vzhledu';
+$lang['Thumbnails'] = 'Náhledy';
+$lang['Menu'] = 'Další funkce';
+$lang['A comment on your site'] = 'komentář v Vašim stránkám';
+$lang['today'] = 'dnes';
+$lang['Update your rating'] = 'Aktualizovat hodnocení';
+$lang['the username must be given'] = 'Je nutné zadat uživatelské jméno';
+$lang['useful when password forgotten'] = 'užitečné při zapomenutí hesla';
+$lang['Quick search'] = 'Rychlé hledání';
+$lang['Connected user: %s'] = 'Připojený uživatel: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Prohlížeč: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Komentář: %s';
+$lang['Comment by %s'] = 'Komentář od %s';
+$lang['User: %s'] = 'Uživatel: %s';
+$lang['Email: %s'] = 'E-mail: %s';
+$lang['Admin: %s'] = 'Administrátor: %s';
+$lang['Registration of %s'] = 'Registrace %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Špatný stav pro uživatele "host", bude použit výchozí stav. Prosím informujte administrátora.';
+$lang['this email address is already in use'] = 'Tato e-mailová adresa je již používána';
+$lang['Album results for'] = 'Alba výsledky pro';
+$lang['Tag results for'] = 'Výsledky pro klíčová slova';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Spustit prezentaci';
+$lang['Pause of slideshow'] = 'Zastavit prezentaci';
+$lang['Repeat the slideshow'] = 'Opakovat prezentaci';
+$lang['Not repeat the slideshow'] = 'Neopakovat prezentaci';
+$lang['Reduce diaporama speed'] = 'Zpomalit';
+$lang['Accelerate diaporama speed'] = 'Zrychlit';
+$lang['Submit'] = 'Poslat';
+$lang['Yes'] = 'Ano';
+$lang['No'] = 'Ne';
+$lang['%d photo'] = '%d fotografie';
+$lang['%d photos'] = '%d fotografií';
+$lang['%d photo is also linked to current tags'] = '%d fotografie je také spojena s aktuálními klíčovými slovy';
+$lang['%d photos are also linked to current tags'] = '%d fotografií je také spojeno s aktuálními klíčovými slovy';
+$lang['display photos linked to this tag'] = 'Ukázat pouze fotografie spojené s aktuálním klíčovým slovem';
+$lang['photos posted during the last %d days'] = 'fotografie vložené za posledních %d dnů';
+$lang['Piwigo Help'] = 'Nápověda Piwigo';
+$lang['Rank'] = 'Hodnotit';
+$lang['group by letters'] = 'Seskupit podle písmen';
+$lang['letters'] = 'písmena';
+$lang['show tag cloud'] = 'Zobrazit klíčová slova v bublině';
+$lang['cloud'] = 'bublina';
+$lang['Are you sure?'] = 'Jste si jistý?';
+$lang['Reset to default values'] = 'Obnovit výchozí hodnoty';
+$lang['delete all photos from your favorites'] = 'vymazat všechny obrázky z Vašich oblíbených';
+$lang['Sent by'] = 'Posláno';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies jsou buď blokovány, nebo nejsou povoleny ve Vašem prohlížeči. Musíte povolit cookies, aby bylo možné se přihlásit.';
+$lang['Edit a comment'] = 'Upravit komentář';
+$lang['(!) This comment requires validation'] = '(!) Tento komentář vyžaduje kontrolu';
+$lang['Welcome'] = 'Vítejte';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Vítejte ve Vaší Piwigo foto galerii!';
+$lang['... or browse your empty gallery'] = '... nebo prohlížejte Vaši prázdnou galerii';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... nebo prosím zrušte tuto zprávu, program najde způsob sám';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Vítejte %s, Vaše Piwigo foto galerie je prázdná!';
+$lang['I want to add photos'] = 'Chci přidat fotografie';
+$lang['Manage this user comment: %s'] = 'Spravujte tento uživatelský komentář: %s';
+$lang['This author modified following comment:'] = 'Tento autor upravil následující komentář:';
+$lang['This author removed the comment with id %d'] = 'Tento autor smazal komentář s identifikátorem %d';
+$lang['%d Kb'] = '%d KB';
+$lang['IP: %s'] = 'IP: %s';
+$lang['html tags are not allowed in login'] = 'html značky nejsou povoleny v loginu';
+$lang['%d rates'] = '%d ohodnocení';
+$lang['Rating score'] = 'Bodové hodnocení';
+$lang['Invalid username or email'] = 'Neplatné uživatelské jméno nebo email';
+$lang['Password reset is not allowed for this user'] = 'Obnovení hesla není pro tohoto uživatele povoleno';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Uživatel "%s" nemá email adresu, obnova hesla není možná';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Někdo se dožadoval aby bylo heslo resetováno pro tento uživatelský účet:';
+$lang['Username "%s" on gallery %s'] = 'Uživatel "%s" na galerii %s';
+$lang['To reset your password, visit the following address:'] = 'Pro obnovu hesla, navštivte tento odkaz:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Pokud jste si obnovu hesla nevyžádal, jedná se o chybu a tento email prostě ignorujte, nic se nestane.';
+$lang['Password Reset'] = 'Reset hesla';
+$lang['Check your email for the confirmation link'] = 'Zkontrolujte si email jestli už dorazil potvrzovací odkaz';
+$lang['Invalid key'] = 'Neplatný klíč';
+$lang['The passwords do not match'] = 'Hesla se neshodují';
+$lang['Your password has been reset'] = 'Vaše heslo bylo resetováno';
+$lang['Return to home page'] = 'Návrat na hlavní stránku';
+$lang['Please enter your username or email address.'] = 'Prosím, zadejte uživatelské jméno nebo emailovou adresu.';
+$lang['You will receive a link to create a new password via email.'] = 'Brzy obdržíte odkaz pro vytvoření nového hesla na váš e-mail.';
+$lang['Username or email'] = 'Uživatelské jméno nebo email';
+$lang['Change my password'] = 'Změnit heslo';
+$lang['Enter your new password below.'] = 'Zadejte vaše nové heslo níže.';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Edit'] = 'Edituj';
+$lang['Hello %s,'] = 'Vítejte %s,';
+$lang['Send my connection settings by email'] = 'Zaslat přístupové údaje emailem';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrace proběhla úspěšně, Zanedlouho obdržíte email s přístupovými údaji. Vítejte!';
+$lang['Username modification'] = 'Změna uživatelského jména';
+$lang['Your username has been successfully changed to : %s'] = 'Vaše uživatelské jméno bylo úspěšně změněno na: %s';
+$lang['square'] = 'Čtverec';
+$lang['thumb'] = 'Náhled';
+$lang['small'] = 'Malý';
+$lang['medium'] = 'Střední';
+$lang['large'] = 'Velký';
+$lang['xlarge'] = 'Větší XL';
+$lang['xxlarge'] = 'Větší XXL';
+$lang['Original'] = 'Originál';
+$lang['Thank you for registering at %s!'] = 'Děkujeme za registraci na stránkách %s!';
+$lang['Here are your connection settings'] = 'Toto jsou vaše přístupové údaje';
+$lang['Password: %s'] = 'Heslo: %s';
+$lang['Username: %s'] = 'Uživatelské jméno: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Pokud myslíte, že jste tento mail obdržel omylem, kontaktujte nás na  %s';
+$lang['Show oldest comments first'] = 'Řadit od nejstarších komentářů';
+$lang['Show latest comments first'] = 'Řadit od nejnovějších komentářů';
+$lang['Photo sizes'] = 'Velikosti fotografií';
+$lang['View in'] = 'Zobrazení';
+$lang['Mobile'] = 'Mobilní';
+$lang['Desktop'] = 'Standardní';
+$lang['2small'] = 'XXS - nejmenší';
+$lang['xsmall'] = 'XS - extra malé';
+$lang['File name, A &rarr; Z'] = 'Název souboru, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Název souboru, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Nadpis fotky, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Nadpis fotky, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Datum vytvoření, nové &rarr; staré';
+$lang['Date created, old &rarr; new'] = 'Datum vytvoření, staré &rarr; nové';
+$lang['Date posted, new &rarr; old'] = 'Datum uveřejnění, nové &rarr; staré';
+$lang['Date posted, old &rarr; new'] = 'Datum uveřejnění, staré &rarr; nové';
+$lang['Rating score, high &rarr; low'] = 'Hodnocení, vyšší &rarr; nižší';
+$lang['Rating score, low &rarr; high'] = 'Hodnocení, nižší &rarr; vyšší';
+$lang['Visits, high &rarr; low'] = 'Zobrazení, vyšší &rarr; nižší';
+$lang['Visits, low &rarr; high'] = 'Zobrazení, nižší &rarr; vyšší';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Číselný ID, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Číselný ID, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Ruční výběr řazení';
+?>
Index: tags/2.4.0RC3/language/cs_CZ/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,115 @@
+<h2>Editovat kategorii</h2>
+
+<h3>Informace</h3>
+
+<ul>
+
+<li><strong>Adresář</strong>: přejmenování kategorie (virtuální kategorie se přejmenovává stejně jako fyzická).</li>
+
+<li><strong>popis</strong>: krátký text popisující obsah kategorie, který bude zobrazen vespod stránky s náhledy.</li>
+
+</ul>
+
+<h3>Přesun</h3>
+
+<p>Virtuální kategorii je možné přesunout. Přesunem kategorie se rozumí změna její rodičovské (nadřazené) kategorie.</p>
+
+<h3>Volby</h3>
+
+<ul>
+
+<li><strong>Druh přístupu</strong>: Povolení přístupu. nastavením kategorie jako soukromé, stávají se soukromé i všechny příslušné podkategorie. Nastavíte-li kategorii jako veřejnou, nastaví se jako veřejné i všechny kategorie nadřazené.</li>
+
+<li><strong>Zamknout</strong>: Kategorie včetně podkategorií bude zamčena z důvodu údržby.</li>
+
+<li><strong>Komentáře uživatelů</strong>: Umožní uživatelům přidávat komentáře k jednotlivým položkám kategorie.</li>
+
+<li><strong>Povolit nahrávání fotografií</strong>: Umožní uživatelům přidávat do kategorie obrázky. Tato volba je přístupná pouze pro fyzické (ne virtuální) kategorie.</li>
+
+</ul>
+
+<p>Tyto volby jsou také dostupné v nastavení "Vlastnosti" (záložky <span class="pwgScreen">Nahrát fotografie</span>, <span
+class="pwgScreen">Komentáře uživatelů</span>, <span class="pwgScreen">Zamknout</span>,
+<span class="pwgScreen">Veřejná/soukromá</span>, <span
+class="pwgScreen">Reprezentant</span> dostupné z <span
+class="pwgScreen">Administrace, Kategorie, Nastavení</span>).</p>
+
+<h3>Směr řazení</h3>
+
+<p>Použít výchozí řazení.</p>
+
+<p>Použít na podkategorie. Určí jestli toto řazení bude použito i na podkategorie.</p>
+
+<p>Vyberte specifická kriteria použitá pro řazení této kategorie.</p>
+<ul>
+<li><strong>Datum vytvoření</strong>: Datum pořízení obrázku</li>
+<li><strong>Datum zveřejnění</strong>: Datum provedení synchronizace.</li>
+<li><strong>Průměrné hodnocení (*)</strong>: průměr je ovlivněn návštěvnickým hodnocením.</li>
+<li><strong>Nejčastěji navštěvované (*)</strong>: Počet návštěv ovlivní řazení.</li>
+<li><strong>Název souboru</strong>: Jméno souboru určené v políčku informace.</li>
+<li><strong>Id</strong>: Vnitřní ID (Novější prvky mají vyšší hodnotu).</li>
+
+</ul>
+<p><strong>(*)</strong>Upozornění: Vlastní nastavení řazení určitě otestujte, ne vždy to může vypadat tak jak očekáváte.</p>
+
+
+<h3>Reprezentant</h3>
+
+<p>Reprezentant kategorie je náhled představující kategorii, zobrazený na hlavní stránce (<span class="pwgScreen">category.php</span>), v případě že kategorie obsahuje pouze podkategorie a nemá jiný obsah (stejně jako kořenová kategorie).</p>
+
+<p>Reprezentanta kategorie je možné nastavit čtyřmi způsoby:</p>
+
+<ul>
+
+<li><span class="pwgScreen">Stránka s obrázky</span>: Jedním tlačítkem u obrázku nastavíte reprezentanta kategorie. Tlačítko je dostupné pouze administrátorům.</li>
+
+<li><span class="pwgScreen">Úpravou informace u obrázku</span> v administraci. Dostupné v <span
+  class="pwgScreen">picture.php</span> nebo ve <span class="pwgScreen">správě dávkových úkonu (administrace/fotografie/košík)</span> v <em>módu jednotlivě</em>. Více v příslušné nápovědě.</li>
+
+<li><span class="pwgScreen">Administrace, Kategorie, Nastavení,
+  Reprezentant</span>. Viz nápověda v příslušném menu.</li>
+
+<li><span class="pwgScreen">Editace galerie</span> (zde v tomto nastavení).</li>
+
+</ul>
+
+<p>Volba reprezentanta záleží na
+<code>allow_random_representative</code> konfiguračním parametru (v souboru <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Výchozí hodnota (<code>allow_random_representative</code> je nastavena na "false"),
+každá kategorie obsahující alespoň jeden prvek má nastaveného fixního reprezentanta. Reprezentant je náhodně zvolen (jednou při vytvoření kategorie), další změna nastane pouze na vyžádání administrátorem. Pokud reprezentant nevyhovuje,
+můžete použít tlačítko <strong>Najít reprezentativní obrázek pomocí náhodného výběru</strong>.</p>
+
+<p>Pokud je konfigurační parametr <code>allow_random_representative</code> nastaven na "true", Kategorie nemusí obsahovat fixního reprezentanta. Stačí použít tlačítko <strong>Smazat reprezentanta</strong>.</p>
+
+<p>Jestliže kategorie obsahuje pouze podkategorie a žádný jiný obsah, může být reprezentována jakýmkoliv prvkem pomocí nastavení<span class="pwgScreen">Upravit informace o obrázku</span>. Jediná volba v tomto nastavení je tlačítko <strong>Smazat reprezentanta</strong>.</p>
+
+<h3>Napojit všechny položky na novou kategorii</h3>
+
+<ul>
+
+<li><strong>Název virtuální kategorie</strong>: jméno nově vytvořené virtuální kategorie,
+všechny obrázky aktuální kategorie budou přiřazeny do kategorie nově vzniklé.</li>
+
+<li><strong>Rodičovská kategorie</strong>: umístění nové kategorie. Prázdný výběr umístí novou kategorii do kořenové kategorie. </li>
+
+</ul>
+
+<h3>Napojit všechny položky na některé existující kategorie</h3>
+
+<ul>
+
+<li><strong>Kategorie</strong>: Vyberte cílovou kategorii.</li>
+
+</ul>
+
+<h3>Poslat informační e-mail uživatelům skupiny</h3>
+
+<ul>
+
+<li><strong>Skupina</strong>: skupina adresátů</li>
+
+<li><strong>Obsah e-mailu</strong>: Libovolný text e-mailu k odeslání.</li>
+
+</ul> 
Index: tags/2.4.0RC3/language/cs_CZ/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Přesun virtuálních kategorií</h2>
+
+<p>Novou rodičovskou kategorii mohou mít jen kategorie virtuální.</p>
+
+<h3>Virtuální kategorie k přesunu</h3>
+
+<p>Vyberte jednu nebo vice kategorií které chcete přesunout.
+Pokud je list prázdný, pravděpodobně zatím nebyla žádná virtuální kategorie vytvořena.</p>
+
+<h3>Nová rodičovská kategorie</h3>
+
+<p>Vyberte novou rodičovskou kategorii (virtuální nebo fyzickou).
+Pokud nevyberete žádnou rodičovskou kategorii bude virtuální kategorie přesunuta jako kořenová.
+Kategorii nelze přesunout sama do sebe případně do vlastních podkategorií.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/cat_options.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Vlastnosti kategorií</h2>
+
+<p>Zde je možno nastavovat vlastnosti více kategorií najednou.</p>
+
+<dl>
+
+<dt>Nahrát fotografie</dt>
+<dd>Učiní kategorii zapisovatelnou jejími návštěvníky. Volba je dostupná pouze pro fyzické kategorie.</dd>
+
+<dt>Komentáře uživatelů</dt>
+<dd>Umožní uživatelům zanechávat komentáře v určených kategoriích.
+Vyberte kategorie kde má být možno zanechávat komentáře.
+Komentář k obrázku je možné přidávat pokud je zařazen alespoň v jedné komentovatelné kategorii.</dd>
+
+<dt>Zamknout</dt>
+<dd>Zvolené kategorie budou dočasně pro údržbu nepřístupné. Pokud zamknete kategorii, budou zamčené i všechny její podkategorie. Pokud odemknete kategorii, odemknou se i všechny její nadřazené kategorie.</dd>
+
+<dt>Veřejná / soukromá</dt>
+<dd>Autorizovaný přístup je možný pouze do soukromých kategorií. Do soukromé kategorie je třeba nastavit přístupová práva uživateli nebo celé skupině uživatelů. Nastavením kategorie jako soukromé, stanou se soukromými a její podkategorie. Nastavením kategorie jako veřejné, budou jako veřejné nastaveny i všechny kategorie nadřazené.</dd>
+
+<dt>Reprezentativní</dt>
+<dd>Tato volba je přístupná pouze pokud je nastaveno
+<code>allow_random_representative</code> (v souboru <span
+  class="filename">include/config_defaults.inc.php</span>) jako
+<em>true</em>. Každá kategorie může být reprezentována náhodným obrázkem nebo obrázkem vámi určeným.</dd>
+
+</dl> 
Index: tags/2.4.0RC3/language/cs_CZ/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Nastavení oprávnění pro alba</h2>
+
+<p>Tyto nastavení jsou dostupné pouze pro privátní alba (galerie). Vyberte skupinu, které chcete umožnit/odebrat přístup do daného alba.</p>
+
+<h3>Skupiny</h3>
+
+<p>Prostou změnou oprávněné skupiny uživatelů můžete povolovat nebo zakazovat přístup do alba. Uživatel příslušný do dané skupiny automaticky získá přístupová práva nastavená pro jeho skupinu.</p>
+
+<h3>Uživatele</h3>
+
+<p>Přístup do alba je rovněž možno povolit/zakázat jednotlivým uživatelům nezávisle na skupině do které jsou zařazeni.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/configuration.html	(revision 14585)
@@ -0,0 +1,104 @@
+<h2>Konfigurace</h2>
+
+<p>Na této stránce lze provádět základní nastavení. Výběr nastavení by měl stačit většině správců. Další nastavení naleznete v souboru <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Stránka je rozdělena do několika záložek seskupujících jednotlivá nastavení podle typu.</p>
+
+
+<h3>Hlavní</h3>
+<ul>
+<li><strong>Název galerie</strong>: používá se v RSS vláknech emailových upozorněních.</li>
+
+<li><strong>Banner stránky</strong>: zobrazuje se nahoře na každé veřejné stránce.</li>
+
+<li><strong>URL galerie</strong>: používá se RSS vláknech.</li>
+
+<li><strong>Zamknout galerii</strong>: Uzavře galerii pro provedení údržby. Pouze uživatelé s oprávněním administrátor bude mít přístup ke galerii.</li>
+
+<li><strong>Povolit hodnocení</strong>: Hodnocení obrázků je povoleno.</li>
+
+<li><strong>Hodnocení hosty</strong>: Hodnotit obrázky může i neregistrovaný uživatel.</li>
+
+<li><strong>Povolit registraci uživatelů</strong>: Kdokoliv se může registrovat jako uživatel.</li>
+
+<li><strong>E-mailová adresa je povinná pro všechny uživatele</strong>: e-mailová adresa bude zkontrolována při registraci nebo aktualizaci profilu, vyjma situací kdy akci provedl administrátor.</li>
+
+<li><strong>Poslat e-mail administrátorovi při registraci nového uživatele</strong>: administrátoři budou upozorněni na každou novou registraci uživatele..</li>
+
+</ul>
+
+<h3>Historie</h3>
+
+<p>Návštěva stránek <span   class="pwgScreen">category.php</span> a <span class="pwgScreen">picture.php</span> bude uložena v tabulce <code>historie</code>.</p>
+
+<p>Návštěvy se zobrazují v menu:<span
+  class="pwgScreen">Administrace, Nástroje, Historie</span>.</p>
+
+<ul>
+<li><strong>Ukládat stránky navštívené hosty</strong>: uloží se návštěvy hostů.</li>
+
+<li><strong>Ukládat stránky navštívené uživateli</strong>: uloží se návštěvy registrovaných uživatelů.</li>
+
+<li><strong>Ukládat stránky navštívené administrátory</strong>: uloží se stránky navštívené administrátory.</li>
+
+</ul>
+
+<h3>Komentáře uživatelů</h3>
+<ul>
+
+<li><strong>Komentáře pro všechny</strong>: I neregistrovaný uživatel může zanechat komentář.</li>
+
+<li><strong>Počet komentářů na stránce</strong>.</li>
+
+<li><strong>Schválení</strong>: Před zobrazením na stránkách musí být každý komentář schválen administrátorem. Schvalování komentářů možno provést v menu<span class="pwgScreen">Administrace, nástroje, nevyřízené komentáře</span>.</li>
+
+<li><strong>Poslat e-mail administrátorovi při vložení nového komentáře</strong>:
+Pokud je zadán komentář nevyžadující schváleni pošle se administrátorovi email.</li>
+
+<li><strong>Poslat e-mail administrátorovi při vložení nového komentáře vyžadujícího schválení.</strong>:
+Pokud je zadán komentář nevyžadující schváleni pošle se administrátorovi email.
+Schvalování komentářů možno provést na stránce: <span class="pwgScreen">Administrace, nástroje, nevyřízené komentáře</span>.</li>
+
+</ul>
+
+<h3>Nahrát fotografie</h3>
+<ul>
+<li><strong>Vždy zobrazit odkaz pro nahrání fotografie</strong>: Pokud je do kategorie možno nahrát obrázek, zobrazí se odkaz nahraj obrázek.</li>
+<li><strong>Povolit uživatelům nahrávat fotografie na server</strong>: povolí nahrát obrázek na stránky jen vymezené skupině uživatelů.</li>
+<li><strong>Poslat e-mail administrátorovi při nahrání nové fotografie.</strong>: O každém nahrání nového obrázku uživatelem, bude administrátor informován emailem.</li>
+</ul>
+
+<h3>Nastavení pro hosty</h3>
+
+<p>Zde se nastavuje výchozí vzhled stránky pro hosty a nepřihlášené uživatele. Po přihlášení dojde k automatickému načtení hodnot nastavených přihlášeným uživatelem.
+(nastavení po přihlášení uživatele na hlavní stránce  <span class="pwgScreen">upravit</span>).</p>
+
+<p>Administrátor může měnit vzhled stránky pro jakéhokoliv registrovaného uživatele. <span class="pwgScreen">Administrace,
+uživatelé, Správa</span>: zde je možno vybrat ze seznamu uživatelů.</p>
+
+<ul>
+
+<li><strong>Jazyk</strong>: týká se pouze Piwigo systémových textů. Jména kategorii, jména obrázku a všechny popisná pole nejsou lokalizována.</li>
+
+<li><strong>Počet fotografií v řádku</strong></li>
+
+<li><strong>Počet řádků na stránce</strong></li>
+
+<li><strong>Vzhled uživatelského rozhraní</strong></li>
+
+<li><strong>Doba, po kterou jsou fotografie zobrazeny jako nově přidané</strong>: Ve dnech. musí být větší než jeden den.</li>
+
+<li><strong>Rozbalit všechny kategorie</strong>: Rozbalí všechny kategorie. <em>UPOZORNĚNÍ</em>: tato volba je náročná na systémové zdroje a pokud strom kategorií obsahuje velké množství položek, může vygenerovat rozsáhlé menu.</li>
+
+<li><strong>Ukázat počet komentářů</strong>: Na stránce s náhledy zobrazí počet komentářů u každého obrázku. Zpomaluje systém.</li>
+
+<li><strong>Ukázat počet zobrazení</strong>: zobrazí počet návštěv přímo pod náhledem obrázku. Volba je funkční pouze pokud je rozšířený konfigurační parametr: <br>
+  $conf['show_nb_hits'] = true; <br>
+  poznámka: výchozí hodnota je false.</li>
+
+<li><strong>Maximální šířka fotografií</strong>: maximální zobrazená šířka. Obrázky větší než tento parametr budou zmenšeny. Lepší, než-li používat tuto volbu, je rovnou před nahráním obrázky zmenšit, snižují se nároky na webový prostor a zrychluje načítání fotografie.</li>
+
+<li><strong>Maximální výška fotografií</strong>: maximální zobrazená výška. Obrázky větší než tento parametr budou zmenšeny. Lepší, než-li používat tuto volbu, je rovnou před nahráním obrázky zmenšit, snižují se nároky na webový prostor a zrychluje načítání fotografie..</li>
+
+</ul> 
Index: tags/2.4.0RC3/language/cs_CZ/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,88 @@
+<h2>Konfigurace rozšíření šablony</h2>
+
+<h3>Cíl</h3>
+<p>Nahradit původní šablony uživatelskými z podadresáře template-extension.
+(šablona s názvem "replacer").</p>
+
+<p>Pro nahrazení původní šablony (např. z ./themes/default/template) "replacerem" je potřeb obě šablony propojit.
+ (případně pokud volaná URL obsahuje volitelné klíčové slovo).</p>
+
+<p>"Volitelná klíčová slova" jsou slova která se zobrazují v URL za jménem modulu.</p>
+
+<p>Proto mohou být "volitelná klíčová slova" zadána jako aktivní permanentní spojení
+(viz. dokumentace permanetní spojení).</p>
+
+<p> `<a href="#warnings">Upozonění</a>` podmínky použití.</p>
+
+<h3>Co jsou rozšíření šablony?</h3>
+
+<p>
+Pomocí  FTP, může webmaster v adresáři "template extension" duplikovat většinu z předinstalovaných .tpl souborů ("původní šablona") různým jménem ("replacer").
+
+ "Originální šablony", podporované šablony:</p>
+<ul>
+<li><span class="filename">index.tpl</span></li>
+<li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+<li><span class="filename">menubar.tpl</span></li>
+<li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+<li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+<!-- <li><span class="filename">slideshow.tpl</span></li> -->
+<li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+<li><span class="filename">tags.tpl</span></li>
+<li><span class="filename">upload.tpl</span></li>
+<li><span class="filename">about.tpl</span></li>
+<li><span class="filename">popuphelp.tpl</span></li>
+<li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+<li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+<li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+<li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Kde najdu původní šablony?</h3>
+
+<p>Původní šablony jsou v /themes/default/template/
+(z duvodu možnosti upgrade šablon je není dobré editovat). Z původní šablony je možné vytvořit vlastní "replacer" (přizpůsobenou šablonu)".</p>
+
+<h3>Kam mohu uložit "replacer"?</h3>
+
+<p><strong>Replacer</strong> musí být umístěn v adresáři template-extension (nebo podadresáři).
+Replacer je možno pojmenovat libovolně, důležitá je koncovka .tpl. Například: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Jak aktivuju "replacer"?</h3>
+<p><strong>Původní šablona</strong> musí být přiřazena ke každému
+<strong>replaceru</strong> pro jeho aktivaci.
+ Toto je účelem "Rošíření šablony" v konfiguraci administrace.</p>
+
+<p>pokud vyberete <strong>volitelné klíčové slovo</strong> dojde k nahrazení pouze u stránek obsahující příslušné klíčové slovo. například: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+
+<p>Zkušení uživatelé mohou použít permanetní spojení jako <strong>volitelné klíčové slovo</strong>. </p>
+
+<p>Pokud vyberete <strong>svázané téma</strong> nahrazení se provede pouze s příslušným tématem.</p>
+
+<h3>Jak deaktivovat "replacery"?</h3>
+<ul>
+<li>Odvyberte navázané "původní šablony".</li>
+<li>Přes FTP smažte "replacery".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Upozornění</h3>
+<ul>
+
+<li><strong>Původní šablona</strong> musí být sktečně "původní" šablona, jinak nelze zaručit plnou funkčnost!</li>
+
+<li>Při použití několika <strong>replacerů</strong> se stejnou <strong>původní šablonou</strong> a stejným <strong>volitelným klíčovým slovem</strong> bude aktivní pouze poslední replacer.</li>
+
+<li>Odvybrání <strong>volitelného klíčového slova</strong> aktivuje replacer pri jakémkoliv použití původní šablony. Stejně jako v předchozím bodě, volba může potlačit předchozí replacery.</li>
+
+<li>Podadresáře:
+Podadresáře jsou igorovány ale hodí se na změnu současného uspořádání.<br>
+distribuované vzorky: určené pro účely testování!
+<strong>needitujte je</strong> vytvořte si vlastní.
+</li>
+
+<li>Smazáním replaceru se <strong>původní šablona</strong> ihned reaktivuje.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/cs_CZ/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Skupiny</h2>
+
+<p>Zde se spravují skupiny uživatelů.</p>
+
+<h3>Přidat skupinu</h3>
+
+<p>Skupinu mohou přidat administrátoři.</p>
+
+<h3>Seznam skupin</h3>
+
+<p>Každá položka umožňuje:</p>
+
+
+<ul>
+<li>přejít na seznam uživatelů</li>
+<li>přejít na administraci uživatelských oprávnění</li>
+<li>smazat skupinu (vyžaduje potvrzení)</li>
+<li>nastavit jako výchozí (vyžaduje potvrzení)</li>
+</ul>
+
+<h3>Výchozí skupiny</h3>
+<p>Výchozí skupina je automaticky přiřazena k novému uživateli po jeho registraci nebo při přidání administrátorem.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>Existuje několik možností, jak přidat fotografie do Vaší Piwigo galerie:</p>
+
+<ul>
+  <li><strong>Přímé nahrání</strong> ve Vašem web prohlížeči je nejjednodušší a nejpřímější cesta. Záleží na možnostech Vašeho prohlížeče a Vašeho web serveru.
+  Pro nahrání velkého množství fotografií, nebo v případě, že tento způsob selže, jsou zde další možnosti.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Přejděte na přímé nahrání</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> je aplikace, kterou musíte nainstalovat na Váš počítač. Přetáhněte fotografie do okna pLoader, klikněte na <em>"Upload to Piwigo"</em> a nechte pLoader nahrát fotografie na server. Existují také další aplikace jako <strong>WinToPiwigo</strong>, nebo <strong>Digikam</strong>, doplněk pro nahrávání fotografií do Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Přejděte na pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP přenos</strong> je nejvíce doporučená cesta, jak nahrát velké množství fotografií s minimálním úsilím. Následujte návod, jak připravit Vaše fotografie. Tato metoda Vám dává možnost přesně řídit uspořádání Vašich fotografií na Vašem serveru.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Přejděte na FTP přenos</a></p>
+</div>
Index: tags/2.4.0RC3/language/cs_CZ/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/help_groups.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Skupiny představují způsob, jak nastavit stejná oprávnění pro vícero uživatelů.</p>
+
+<p>Vytvořte skupinu pomocí <span class="pwgScreen">Administrace &raquo; Uživatelé &raquo; Skupiny</span> a přiřaďte uživatele do této skupiny pomocí
+<span class="pwgScreen">Administrace &raquo; Uživatelé &raquo;
+Správa</span>.</p>
+
+<p>Uživatel může patřit do vícero skupin. Uživatel potom získává práva součtem práv všech těchto skupin: pokud uživatel "honza" patří do skupin "rodina" i "přítelé" a jen "rodina" má oprávnění na kategorii "Vánoce 2003" tak 
+"honza" kategorii "Vánoce 2003" uvidí.</p>
Index: tags/2.4.0RC3/language/cs_CZ/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/help_misc.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Jakmile jste vytvořili Vaši galerii, nastavte vlastnosti zobrazení v 
+<span class="pwgScreen">Administraci &raquo; Konfigurace &raquo;
+Volby </span>. <br>Každý nově zaregistrovaný uživatel bude mít tyto základní nastavení po registraci.</p>
+
+<p>V případě jakýchkoliv otázek, navštivte Piwigo <a href="http://piwigo.org/forum">fórum</a>.</p>
Index: tags/2.4.0RC3/language/cs_CZ/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,54 @@
+<fieldset>
+<legend>Oprávnění na fotografiích</legend>
+
+<p>Každá fotografie má <strong>úroveň soukromí</strong> (zámek). Každý uživatel má úroveň přístupu (klíč). Existuje 5 úrovní:</p>
+<ol>
+  <li>Žádná</li>
+  <li><em>Kontakty</em></li>
+  <li><em>Přátelé (vyšší než kontakty)</em></li>
+  <li><em>Rodina (vyšší než přátelé)</em></li>
+  <li><em>Adminstrátoři (nejvyšší)</em></li>
+</ol>
+
+<p>Vyšší úrovně mají oprávnění na nižší úrovně. Pro daného uživatele to znamená, že čím vyšší úroveň přístupu má, tím více fotografií vidí.</p>
+
+<p>Například, pokud fotografie "svatba-0024.jpg" má úroveň soukromí <em>"Rodina"</em> tak:</p>
+<ul>
+  <li>Petr (který je <em>"Administrátor"</em>) jej uvidí, protože <em>"Administrátoři"</em> mohou vidět všechny fotografie</li>
+  <li>Bára (která je <em>"Rodina"</em>) také uvidí</li>
+  <li>Marie (která je jen <em>"Přítel"</em>) ale fotografii neuvidí</li>
+</ul>
+
+<p>Uživatel, který nemá právo vidět obsah kategorie, neuvidí ani kategorii jako takovou a tedy ani její název. Stejný princip platí pro klíčová slova.</p>
+
+<p>Úroveň přístupu (klíč) můžete nastavit na obrazovce <span class="pwgScreen">Administrace &raquo; Uživatelé &raquo; Správa</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Oprávnění na kategoriích</legend>
+
+<p>Pokud Vám výše popsané úrovně soukromí nevyhovují, můžete také spravovat oprávnění pro uživatele a pro skupiny. Můžete spravovat oprávnění pro uživatele i pro skupiny najednou, bez rizika, že by došlo ke konfliktům.</p>
+
+<p>Můžete zakázat přístup do kategorií. Přepněte přístup do kategorie na 
+"soukromý" pokud chcete řídit přístup.</p>
+
+<p>Můžete nastavit přístup do kategorie na "soukromý" při editaci jedné kategorie (<span class="pwgScreen">Administrace &raquo; Kategorie &raquo; Správa
+&raquo; editovat</span>), nebo nastavením vlastností pro celý strom kategorií 
+(<span class="pwgScreen">Administrace &raquo; Kategorie &raquo;
+Vlastnosti &raquo; Veřejná / Soukromá</span>).</p>
+
+<p>Když je přístup do kategorie nastven na "soukromý", můžete řídit přístup pro skupiny a uživatele na třech obrazovkách:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Administrace &raquo; Uživatelé &raquo; Správa &raquo;
+  akce oprávnění</span></li>
+
+  <li><span class="pwgScreen">Administrace &raquo; Uživatelé &raquo; Skupiny &raquo;
+  akce oprávnění</span></li>
+
+  <li><span class="pwgScreen">Administrace &raquo; Kategorie &raquo; Správa &raquo; editovat</span></li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/cs_CZ/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Fotografie jsou zobrazeny v kategorii, která odpovídá adresáři, ve kterém jsou uloženy.</p>
+
+<p>Můžete, ale také zobrazit stejnou fotografii ve vícero kategoriích, bez toho, že by musely být uloženy na serveru vícekrát. Provede te to tak, že spojíte fotografii s jakoukoliv jinou kategorií pomocí obrazovky <span class="pwgScreen">Upravit informace o fotografii</span>, kterou může administrátor vyvolat ze stránky zobrazení fotografie.</p>
+
+<p>Virtuální kategorie jsou založeny na tomto konceptu: nemají zádný odpovídající adresář na serveru. Virtuální kategorie můžete vytvořit pomocí <span class="pwgScreen">Administrace &raquo; Kategorie &raquo;
+Správa</span>.</p>
Index: tags/2.4.0RC3/language/cs_CZ/help/history.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/history.html	(revision 14585)
@@ -0,0 +1,37 @@
+<h2>Historie</h2>
+
+<p>Slouží k sledování historie návštěv vaší galerie v závislosti na zvoleném nastavení v administrace &raquo; konfigurace &raquo; volby &raquo; záložka historie</p>
+
+<h3>Statistiky</h3>
+<ul>
+<p>Pokud bylo nastaveno zaznamenávání (<span
+class="pwgScreen">index.php</span> a <span
+class="pwgScreen">picture.php</span>) navštívených stránek v tabu <code>historie</code>,
+je možné je sledovat v tomto tabu.</p>
+
+<li><strong>Celkové statistky</strong>: návštěvy za rok. </li>
+
+<li><strong>Roční statistiky</strong>: návštěvnost po měsících ve zvoleném roce.</li>
+
+<li><strong>Měsíční statistiky</strong>: denní návštěvnost v jednotlivých dnech zvoleného měsíce.</li>
+
+<li><strong>Denní statistiky</strong>: návštěvnost po hodinách během zvoleného dne.</li>
+
+</ul>
+
+<h3>Vyhledávání</h3>
+<ul>
+<p>Pokud bylo nastaveno zaznamenávání (<span
+class="pwgScreen">index.php</span> a <span
+class="pwgScreen">picture.php</span>) navštívených stránek v tabu <code>historie</code>,můžete procházet detaily navštívených stránek za pomocí různých filtrů.</p>
+
+<li><strong>Filtr podle data</strong>: vyberte časové rozpětí ve kterém chcete sledovat aktivitu na stránkách..</li>
+
+<li><strong>Filtr podle typu položky</strong>: vyberte typ položky u které chcete sledovat dění na stránce.</li>
+
+<li><strong>Filtr podle uživatele</strong>: vyberte uživatele jehož navštívené stránky vás zajímají.</li>
+
+<li><strong>Filtr podle názvu souboru</strong>: zvolte jméno souboru jehož návštěvnost vás zajímá.</li>
+
+<li><strong>Filtr podle ID fotografie</strong>: zadejte ID fotografie kterou chcete sledovat.</li>
+</ul> 
Index: tags/2.4.0RC3/language/cs_CZ/help/index.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/cs_CZ/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/maintenance.html	(revision 14585)
@@ -0,0 +1,26 @@
+<h2>&Uacute;držba</h2>
+
+<p>Pro optimalizaci času generov&aacute;n&iacute; str&aacute;nek využ&iacute;v&aacute; Piwigo informace uložen&eacute; v mezipaměti (v datab&aacute;zi). Např&iacute;klad, m&iacute;sto zji&scaron;ťov&aacute;n&iacute; počtu fotek obsažen&yacute;ch v jednotliv&yacute;ch albech při každ&eacute;m nahr&aacute;n&iacute; str&aacute;nky, je tato informace již uložena v datab&aacute;zi. Teoreticky by tato informace měla b&yacute;t vždy spr&aacute;vn&aacute;, nicm&eacute;ně občas se může vloudit chyba a informace uložen&aacute; v datab&aacute;zi je zastaral&aacute;.</p>
+
+<p>Někter&eacute; informace jak plyne čas se stanou nepotřebn&yacute;mi. Maz&aacute;n&iacute;m těchto informac&iacute; z datab&aacute;ze uvoln&iacute;te m&iacute;sto na disku a do značn&eacute; m&iacute;ry urychl&iacute;te pr&aacute;ci s datab&aacute;z&iacute;.</p>
+
+<ul>
+	<li><strong>Smazat tagy (nepřiřazen&yacute;ch kl&iacute;čov&yacute;ch - orphaned tags)</strong></li>
+</ul>
+<ul>
+  <li><strong>Aktualizuj informace alb:</strong> Pro každ&eacute; album jsou nasleduj&iacute;c&iacute; informace kontrolov&aacute;ny a aktualizov&aacute;ny pokud je potřeba : Seznam hlavn&iacute;ch alb, počet fotek, datum posledn&iacute; fotky, spojen&iacute; mezi sestersk&yacute;mi alby, spojen&iacute; mezi v&scaron;emi alby. Tato akce tak&eacute; kontroluje konzistenci reprezentativn&iacute;ch fotografi&iacute;.</li>
+  <li><strong>Aktualizovat informace o fotografi&iacute;ch:</strong> Pro každou fotku jsou nasleduj&iacute;c&iacute; informace kontrolov&aacute;ny a aktualizov&aacute;ny: pln&aacute; cesta k souboru, průměrn&eacute; hodnocen&iacute;. <em>Varov&aacute;n&iacute;</em>, nezapomeňte: Informace metadat mus&iacute; b&yacute;t synchronizov&aacute;na z <span class="pwgScreen">Administrace &raquo; N&aacute;stroje &raquo; Synchronizace</span>, nebo na str&aacute;nce &uacute;prav jednotl&iacute;ch fotografi&iacute; (skrz <span class="pwgScreen">Photo - Upravit Photo</span> na př&iacute;klad).</li>
+</ul>
+<ul>
+  <li><strong>Opravit a optimalizovat datab&aacute;zi:</strong>Provede operace Znovu seřazen&iacute;, Oprav a optamalizac&iacute; na každ&eacute; tabulce v datab&aacute;zi </li>
+  <li><strong>Znovu spustit kontrolu integrity</strong></li>
+</ul>
+
+<ul>
+  <li><strong>Prov&eacute;st &uacute;držbu detailů historie:</strong> Smaz&aacute;n&iacute; v&scaron;ech ř&aacute;dek z tabulky histori&iacute;. Str&aacute;nka <span class="pwgScreen">Administrace &raquo; N&aacute;stroje &raquo; Historie</span> pot&eacute; nezobraz&iacute; ž&aacute;dn&eacute; informace ohledně historie. <em>Upozorněn&iacute;:</em> v&scaron;echna data (historie a statistiky) budou NEN&Aacute;VRATNĚ smaz&aacute;na!!</li>
+  <li><strong>Prov&eacute;st &uacute;držbu cel&eacute; historie:</strong> Smaže ve&scaron;ker&eacute; informace o souhrn historie nav&scaron;těv. Tento souhrn je vygenerov&aacute;n podrobnost&iacute; historie.</li>
+  <li><strong>Prov&eacute;st &uacute;držbu relac&iacute;:</strong> Smaže pro&scaron;l&eacute; uživatelsk&eacute; sessions.</li>
+  <li><strong>Prov&eacute;st &uacute;držbu nepoužit&yacute;ch RSS vl&aacute;ken (smazat)</strong></li>
+  <li><strong>Odstranit historii hled&aacute;n&iacute;</strong></li>
+  <li><strong>Prov&eacute;st &uacute;držbu &scaron;ablon (smazat)</strong></li>  
+</ul>
Index: tags/2.4.0RC3/language/cs_CZ/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Emailová upozornění</h2>
+
+<p>Na tomto místě je možné spravovat maily upozorňující uživatele o změnách na vašich stránkách.</p>
+
+<p>K dipozici jsou tyto tři taby:</p>
+
+<h3>Parametry</h3>
+<p>Dostupné pouze pro webmastery. Slouží nastavování parametrů upozorňovacích mailů</p>
+
+<h3>Přihlášení k odběru</h3>
+<p>Dostupné pouze pro webmastery. Umožní přidat nebo odebrat uživatele z listu příjemců mailu.</p>
+
+<h3>Odeslání</h3>
+<p>Dostupné pro webmastery a administrátory. Slouží k odeslání upozorňovacího mailu.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permanetní spojení</h2>
+
+<p>Permanentní spojení jsou zde aby URL jednotlivých kategorii byla krásnější. Po definování permanentního spojení, není dále nutné mít ID kategorie v URL.</p>
+
+<p>Po smazání permanentního spojení, je možné ho uložit do historie pro zachování fungujících externích odkazů. V tabulce historie permanentních spojení je zobrazeno datum vymazání linku, čas posledního použití a počet použití.</p>
+
+<p>Každá kategorie musí mít unikátní název permanentního spojení. Stejně tak do historie není možné uložit stejný link vícekrát.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,102 @@
+<fieldset>
+  <legend>Rychlý návod</legend>
+
+<ol>
+  <li>Vytvořte kategorii (adresář) na Vašem počítači.</li>  
+
+  <li>Zkopírujte nějaké fotografije do tohoto adresáře, změňte jejich velikost pro zobrazení na web. <em>Varování</em>: názvy adresářů a souborů musí obsahovat pouze písmena, čísla, "-", "_" or ".". Žádné mezery nebo znaky s diakritikou.</li>
+
+  <li>Pomocí FTP, zkopírujte Váš adresář do adresáře "galleries" vaší instalace  Piwigo.</li>
+
+  <li>Přihlašte se do Vaší Piwigo galerie a přejděte na <span class="pwgScreen">Administrace &raquo; Nástroje &raquo; Náhledy</span> abyste vytvořili chybějící náhledy.</li>
+
+  <li>Jděte na <span class="pwgScreen">Adminstrace</span> a stiskněte velké tlačítko Rychlá místní synchronizace.</li>
+</ol>
+
+Gratulujeme! Právě jste vytvořili vaší první galerii fotografií ve Vaší Piwigo galerii.
+</fieldset>
+
+<fieldset>
+  <legend>Organizace souboru a adresářů</legend>
+
+<ul>
+
+  <li>
+
+    <p>Adresáře kategorií jsou v Piwigo adresáři 
+    "galleries". tady je ukázka malé adresářové struktury Piwigo (která ale využívá hodně vlastností Piwigo):</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- kategorie-1
+|   |   |-- kategorie-1.1
+|   |   |   |-- kategorie-1.1.1
+|   |   |   |   |-- kategorie-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- svatba.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-svatba.jpg
+|   |   |   |   |   +-- svatba.jpg
+|   |   |   |   +-- kategorie-1.1.1.2
+|   |   |   +-- kategorie-1.1.2
+|   |   |-- kategorie-1.2
+|   |   |   |-- slon.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-slon.jpg
+|   |   +-- kategorie-1.3
+|   +-- kategorie-2
+|       |-- selatko.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-selatko.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>Kromě adreářů pojmenovaných "thumbnail", "pwg_high" nebo "pwg_representative" (čtěte vysvětlení níže), každý adresář v "galleries" vytvoří kategorii. Není zde omezení hloubky adresářů.</li>
+
+  <li>Každý element kategorie je reprezentován souborem. Soubor může být elementem Piwigo pokud jeho přípona odpovídá parametru konfigurace <code>file_ext</code>
+  (viz. soubor <span
+  class="filename">include/config_default.inc.php</span>). Soubor může být obrázek (fotografie) pokud jeho přípona je uvedena v parametru <code>picture_ext</code>.</li>
+
+  <li>Obrázky musí mít přiřazen náhled (viz. sekce o náhledech níže)</li>
+
+  <li>Obrázky mohou mít přiřazenu verzi ve vysoké kvalitě. Jako například svatba.jpg v příkladu výše. Verze ve vysoké kvalitě nemá, na rozdíl od náhledu, žádný prefix v názvu.</li>
+
+  <li>Elementy které nejsou obrázky (video, zvuky, textové sobubory, cokoli chcete...) mají jako výchozí náhled ikonu, které odpovídá jejich příponě. Volitelně můžete přiřadit náhled a reprezentativní soubor (viz. video.avi v příkladu výše).</li>
+
+  <li><em>Varování</em>: názvy adresářů a souborů musí obsahovat pouze písmena, čísla, "-", "_" or ".". Žádné mezery nebo znaky s diakritikou.</li>
+
+  <li>Když jsou elementy, obrázky, náhledy a reprezentativní soubory umístěny v adresářové struktuře přejděte na: <span class="pwgScreen">Administrace &raquo; Kategorie &raquo;
+  Synchronizace</span></li>
+
+</ul>
+</fieldset>
+
+<fieldset>
+  <legend>Náhledy</legend>
+<ul>
+
+  <li>Všechny obrázky (fotografie) musí mít přiřazen náhled.</li>
+
+  <li>Náhledy jsou umístěny v podadresáři "thumbnail", který je v adresáři kategorie. Náhled má stejný název jako jemu odpovídající obrázek, s prefixem podle konfiguračního parametru <code>prefix_thumbnail</code> (viz. <span class="filename">include/config.inc.php</span>).</li>
+
+  <li>Náhled nemusí mít nutně stejnou příponu jako jemu odpovídající obrázek (například ".jpg" obrázek může mít náhled s ".GIF" příponou).</li>
+
+  <li>Doporučujeme použít externí aplikaci protvorbu náhledů.</li>
+
+  <li>Vytvářená náhledů pomocí Piwigo může vést ke špatné kvalitě vytvořených náhledů, protože ta závisí na zdrojích serveru (a toto může být na sdílených serverech (webhosting) problém).
+
+  <li>Pokud budete přesto vytvářet náhledy pomocí Piwigo na serveru, tak musíte povolit přístup pro zápis pro všechny v adresáři "galleries" a všech podadresářích.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/cs_CZ/help/search.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Vyhledávání</h2>
+
+<p>Tato stránka umožňuje vyhledávat obrázky z celé galerie.</p>
+
+<dl>
+
+<dt>Vyhledávání klíčových slov</dt>
+<dd> Vyhledání jedno nebo více slov podle atributu přiřazeného k obrazku v galerii. Pro vyhledání slov s částečnou shodou je možno použít * jako wildcard (zástupný znak).</dd>
+
+<dt>Vyhledávání podle autora</dt>
+<dd>Pro vyhledání slov s částečnou shodou je možno použít * jako wildcard (zástupný znak).</dd>
+
+<dt>Vyhledávání podle data</dt>
+<dd>Vyberte počáteční a/nebo koncové datum. Pole nechte prázdné pokud chcete vyhledávat "do teď". Formát letopočtu v posledním políčku musí být ve tvaru: RRRR (např. 2004)</dd>
+
+<dt>Vyhledávání v kategoriích</dt>
+<dd>Vyberte jednu nebo více kategorií ve kterých chcete vyhledávat. Ve všech podkategoriích se dá vyhledávat označením rodičovské kategorie a nastavením volby "umožnit prohledávání podkategorií"</dd>
+
+</dl> 
Index: tags/2.4.0RC3/language/cs_CZ/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/site_manager.html	(revision 14585)
@@ -0,0 +1,37 @@
+<h2>Vzdálené stránky</h2>
+
+<p>Piwigo umožňuje zakomponovat do galerie fotografie z více serverů. Výhodná to záležitost například v případě, že vaše galerie je hostována na serveru s omezeným místem a vy potřebujete zobrazovat velké množství fotografií.</p>
+
+<ol>
+
+  <li>v souboru<span class="filename">tools/create_listing_file_local.inc.php</span>,
+  upravte parametry v sekci:
+  <code>$conf['prefix_thumbnail']</code>  nebo
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>pomocí FTP umístěte soubory <span class="filename">tools/create_listing_file.php</span>
+  a <span class="filename">tools/create_listing_file_local.inc.php</span> (modifikovaný)
+  do stejného adresáře vaší vzdálené stránky, ve kterém se nachází album, které chcete zobrazovat (podobné adresáři <span class="filename">galleries</span> těchto stránek). (btw. vzdálený server musí mít podporu PHP, jinak to nebude fungovat) Příklad: řekněme, že výše uvedené soubory jsme nahráli na server example.com do následujícího umístění <span
+
+class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>pro přidání nové galerie běžte do <span class="pwgScreen">administrace&raquo; nástroje&raquo; správce stránky</span>. Do formulářového pole zadejte adresu vzdálené galerie (našem případě <span
+  class="filename">http://example.com/galleries</span>) a odešlete.</li>
+
+  <li>nová galerie je přidána. Nyní je možné provádět následující čtyři akce:
+
+    <ol>
+
+      <li><strong>generovat výpis souborů</strong>: spustí vzdálený příkaz k vytvoření seznamu souborů umístěných na vzdáleném serveru</li>
+
+      <li><strong>synchronizace</strong>: načte vzdálený seznam souborů <span
+      class="filename">listing.xml</span>  a synchronizuje ho s databází</li>
+
+      <li><strong>vyčistit</strong>: odstraní vzdálený seznam souborů <span
+      class="filename">listing.xml</span></li>
+
+      <li><strong>smazat</strong>: odstraní stránku a příslušná alba z databáze</li>
+
+    </ol>
+  </li>
+</ol> 
Index: tags/2.4.0RC3/language/cs_CZ/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/synchronize.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Synchronizace</h2>
+
+<p>Existují dva různé typy synchronizace: adresáře/soubory a jejich metadata. Adresáře/soubory slouží k synchronizaci stromu adresářů se stromem kategorií v databazi. Metadata doplní položky o informace jako například velikost souboru, rozměry v pixelech, EXIF nebo IPTC informace.</p>
+
+<p>Nejprve je třeba synchronizovat adresáře/soubory.</p>
+
+<p>Synchronizace může zabrat nějaký čas (v závislosti na vytížení a rychlosti serveru a počtu synchronizovaných položek), Pokud je to možné provádějte synchronizaci kategorii po kategorii.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Tvorba náhledů</h2>
+
+<p>Tato stránka umožňuje vytvořit chybějící náhledy.  Nedoporučuje se používat pokud je vaše galerie hostována na sdíleném serveru.</p>
+
+<dl>
+
+<dt>GD verze</dt>
+
+<dd>
+GD je PHP knihovna podporující práci s obrázky. Zvolte verzi instalovanou na vašem serveru. V případě chybně zvolené verze vás systém upozorní chybovým hlášením. Když se tak stane, prostě se vraťte na předchozí stránku a vyberte jinou verzi. Pokud žádná z možností nefunguje, váš server patrně nepodporuje GD knihovnu.</dd>
+
+<dt>Šířka a výška</dt>
+
+<dd>Maximální rozměry náhledu. Původní poměr stran bude zachován. Výchozí hodnoty je možno měnit konfiguračním nastavením <code>tn_width</code> a
+<code>tn_height</code> (v souboru: <span class="filename">include/config_default.inc.php</span>).</dd>
+
+<dt>Počet generovaných náhledů</dt>
+
+<dd>Nezkoušejte generovat příliš mnoho náhledů najednou. Zmenšování bere poměrně velké množství výkonu procesoru což, pokud galerii hostujete u free-poskytovatele, muže vést až k jejímu smazání (záleží na poskytovateli).</dd>
+
+<dt>Formát souboru</dt>
+
+<dd>Náhledy jsou generovány ve formátu JPEG a mohou být vytvářeny jen z souborů typu JPEG a PNG.</dd>
+
+</dl> 
Index: tags/2.4.0RC3/language/cs_CZ/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/help/user_list.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Seznam uživatelů</h2>
+
+<p>Na tomto místě můžete spravovat nastavení jednotlivých uživatelů.</p>
+
+<h3>Přidat uživatele</h3>
+
+<p>Administrátoři mohou uživatele přidávat ručně.</p>
+
+<h3>Filtr</h3>
+
+<p>Seznam uživatelů je možno filtrovat podle jména uživatele (wildcard * pro částečnou shodu), skupiny nebo stavu. Výpis můžete nechat seřadit podle data registrace nebo uživatelského jména a to vzestupně nebo sestupně.</p>
+
+<p>Zde je možno editovat více uživatelů najednou. Možné akce:</p>
+
+<ul>
+
+<li>smazání uživatele (vyžaduje potvrzení)</li>
+<li>změna stavu</li>
+<li>změna přiřazení ke skupině</li>
+<li>úprava vlastností zobrazení</li>
+<li>úprava doplňujících vlastností</li>
+
+</ul>
+
+<p>Předmětem úprav jsou vybraní uživatelé (výchozí nastavení) nebo všichni uživatelé vybraní provedením filtru.</p> 
Index: tags/2.4.0RC3/language/cs_CZ/index.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/cs_CZ/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/install.lang.php	(revision 14585)
@@ -0,0 +1,76 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Instalace';
+$lang['Basic configuration'] = 'Základní konfigurace';
+$lang['Default gallery language'] = 'Základní jazyk galerie';
+$lang['Database configuration'] = 'Databázová konfigurace';
+$lang['Admin configuration'] = 'Administrátorská konfigurace';
+$lang['Start Install'] = 'Spustit instalaci';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mailová adresa musí mít formát xxx@yyy.eee (například : novak@mail.cz)';
+$lang['Webmaster login'] = 'Uživatelské jméno správce';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bude zobrazen návštěvníkům. Je nutný pro administraci aplikace.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Spojení na server se podařilo, ale nebylo možné připojit databázi';
+$lang['Can\'t connect to server'] = 'Nebylo možné se připojit k serveru';
+$lang['Host'] = 'MySQL server';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.cz';
+$lang['User'] = 'Uživatel';
+$lang['user login given by your host provider'] = 'uživatelské jméno, které Vám přidělil provozovatel serveru';
+$lang['Password'] = 'Heslo';
+$lang['user password given by your host provider'] = 'heslo na tomto serveru';
+$lang['Database name'] = 'Jméno databáze';
+$lang['also given by your host provider'] = 'které na tomto serveru';
+$lang['Database table prefix'] = 'Předpona názvů databázových tabulek';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'názvy vytvořených databázových tabulek budou tuto předponu (pro jejich snadnější správu)';
+$lang['enter a login for webmaster'] = 'vložte uživatelské jméno správce';
+$lang['webmaster login can\'t contain characters \' or "'] = 'uživatelské jméno správce nemůže obsahovat znak \' nebo "';
+$lang['please enter your password again'] = 'prosím zadejte znovu heslo';
+$lang['Webmaster password'] = 'Heslo správce';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Heslo mějte utajeno, umožní Vám přístup do administrace aplikace';
+$lang['Password [confirm]'] = 'Heslo [potvrzení]';
+$lang['verification'] = 'kontrola';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potřebujete pomoc ? Zeptejte se na <a href="%s">Piwigo fóru</a>.';
+$lang['Webmaster mail address'] = 'E-mail správce';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Návštěvníci mohou pomocí tohoto e-mailu správce kontaktovat';
+$lang['PHP 5 is required'] = 'Je nutný PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Na Vašem webhostingu je PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo se může pokusit změnit Vaše nastavení na PHP 5 tím, že vytvoří nebo změní soubor .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Případně můžete změnit Vaši konfirguraci sami a potom restartovat Piwigo .';
+$lang['Try to configure PHP 5'] = 'Pokuste se změnit Vaše nastavení na PHP 5';
+$lang['Sorry!'] = 'Bohužel!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nebylo schopno změnit Vaše nastavení na PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Obraťte se na poskytovatele Vašeho webhostingu, aby jste zjistili, jak můžete změnit Vaše nastavení na PHP 5.';
+$lang['Hope to see you back soon.'] = 'Věříme, že se brzy uvidíme.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulujeme, Piwigo instalace je ukončena';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Náhradním řešením je zkopírovat text z boxu výše a vložit jej do souboru "local/config/database.inc.php" (Upozornění : soubor database.inc.php smí obsahovat jen to, co je v tomto boxu, žádné znaky odřádkování nebo mezery)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Vytvoření souboru local/config/database.inc.php se nepodařilo.';
+$lang['Download the config file'] = 'Stáhnout konfigurační soubor';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Můžete stáhnout konfigurační soubor a nahrát jej do adrešáře local/config Vaší instalace.';
+$lang['Just another Piwigo gallery'] = 'Jen další galerie Piwigo';
+$lang['Welcome to my photo gallery'] = 'Vítejte na mé fotogalerii';
+$lang['Welcome to your new installation of Piwigo!'] = 'Vítejte v nové instalaci Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Neváhejte navštívit naše fórum v případě jakýchkoliv dotazů: %s'; 
+?>
Index: tags/2.4.0RC3/language/cs_CZ/iso.txt
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Česky [CZ]
Index: tags/2.4.0RC3/language/cs_CZ/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/cs_CZ/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/cs_CZ/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,49 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Aktualizace';
+$lang['Upgrade from version %s to %s'] = 'Aktualizace z verze %s na %s';
+$lang['Statistics'] = 'Statistika';
+$lang['total upgrade time'] = 'celkový čas aktualizace';
+$lang['total SQL time'] = 'celkový čas SQL';
+$lang['SQL queries'] = 'SQL dotazy';
+$lang['Upgrade informations'] = 'Informace o aktualizaci';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Proveďte kontrolu údržby v [Administrace>Nástroje>Údržba] pokud dojde k problému.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Jen administrátor smí spustit aktualizaci: prosím přihlašte se níže.';
+$lang['You do not have access rights to run upgrade'] = 'nemáte přístupová práva na spuštění upgrade';
+
+// Upgrade informations from upgrade_1.3.1.php
+$lang['All sub-albums of private albums become private'] = 'Všechny sub-alba privátních alb zůstanou privatní';
+$lang['User permissions and group permissions have been erased'] = 'Uživatelská oprávnění a oprávnění skupin byla vymazána';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Z předchozí konfigurace byly zachovány pouze předpony náhledů a email adresa správce.';
+
+// missing translations 2.1.0
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Navrhujeme aktualizovat databázi Vaší galerie Piwigo ze starší na novou verzi.
+Asistent aktualizace se domnívá, že aktuálně používáte <strong>verzi %s</strong> (nebo odpovídající).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Jako předběžné opatření byly deaktivovány následující doplňky. Prosím zkontrolujte aktualizace těchto doplňků předtím než je znovu aktivujete:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'V <i>%s</i>, před <b>?></b>, vložením:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Jako preventivní opatření, byli náseldující šablony deaktivovány. Musíte zkontrolovat nejprve jestli není nová verze předtím než je reaktivujete:';
+?>
Index: tags/2.4.0RC3/language/da_DK/about.html
===================================================================
--- tags/2.4.0RC3/language/da_DK/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+<p>Dette foto-galleri er baseret på Piwigo.</p>
+
+<p>Piwigo er et foto galleri til webbrug, bygget af en aktiv gruppe af brugere og udviklere. Udvidelser gør at det er let at peronliggøre Piwigo. Piwigo er gratis og opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Besøg Piwigos website</a></p>
+
+<p>Udgivelsen af den danske  piwigo er vedligeholdt af (alfabetisk orden):
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16630">Egorip</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=4888">nile</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=14226">Rollike</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=11616">thomas1956</a></li>
+	</ul>
+           .... tak til dem</p>
Index: tags/2.4.0RC3/language/da_DK/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/da_DK/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/admin.lang.php	(revision 14585)
@@ -0,0 +1,901 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = '%d tilknytning';
+$lang['%d associations'] = '%d tilknytninger';
+$lang['%d album including'] = '%d Kategori inklusiv';
+$lang['%d albums including'] = '%d kategorier inklusiv';
+$lang['%d physical'] = '%d Fysisk';
+$lang['%d physical'] = '%d Fysisk';
+$lang[' and %d virtual'] = ' Og  %d virtuel';
+$lang[' and %d virtual'] = ' Og  %d virtuel';
+$lang['%d album moved'] = '%d Kategori flyttet';
+$lang['%d albums moved'] = ' %d kategorier flyttet';
+$lang['%d group'] = '%d Gruppe';
+$lang['%d groups'] = '%d grupper';
+$lang['%d member'] = '%d medlem';
+$lang['%d members'] = '%d medlemmer';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tags';
+$lang['%d user comment rejected'] = ' %d bruger kommentar afvist';
+$lang['%d user comments rejected'] = ' %d bruger bemærkninger avist';
+$lang['%d user comment validated'] = ' %d bruger kommentar valideret';
+$lang['%d user comments validated'] = ' %d bruger kommentarer valideret';
+$lang['%d user deleted'] = ' %d bruger slettet';
+$lang['%d users deleted'] = ' %d brugere slettet';
+$lang['%d user'] = ' %d bruger';
+$lang['%d users'] = ' %d brugere';
+$lang['%d waiting for validation'] = ' %d venter på validering';
+$lang['Actions'] = 'Handlinger';
+$lang['Activate'] = 'Aktiver';
+$lang['Add/delete a permalink'] = 'Tilføj / slette en permalink';
+$lang['Add a tag'] = 'Tilføj et tag';
+$lang['Add a user'] = 'Tilføj en bruger';
+$lang['Add group'] = 'Tilføj Gruppe';
+$lang['Add'] = 'Tilføj';
+$lang['Allow user registration'] = 'Tillad bruger registrering';
+$lang['Apply to sub-albums'] = 'Anvend på underkategorier';
+$lang['Associated'] = 'Associeret';
+$lang['Caddie management'] = 'Administration af kurv';
+$lang['Caddie'] = 'Kurv';
+$lang['Albums authorized thanks to group associations'] = 'Kategorier godkendt takket være gruppe tilknytninger';
+$lang['Album manual order was saved'] = 'Kategorier manual ordre er blevet gemt';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Check for opgradering mislykkedes af ukendte årsager.';
+$lang['Check for upgrade'] = 'Tjek for opgradering';
+$lang['Comments for all'] = 'Kommentarer til alle';
+$lang['Current name'] = 'Nuværende navn';
+$lang['Database'] = 'Database';
+$lang['Deactivate'] = 'Deaktiver';
+$lang['Delete Representant'] = 'Slet thumbnail for kategori';
+$lang['Delete selected tags'] = 'Slet valgte tags';
+$lang['Delete selected users'] = 'Slet valgte brugere';
+$lang['Deletions'] = 'Sletninger';
+$lang['Deny selected groups'] = 'Afvis udvalgte grupper';
+$lang['Deny selected users'] = 'Afvis valgte brugere';
+$lang['Description'] = 'Beskrivelse';
+$lang['Display options'] = 'Vis muligheder';
+$lang['Dissociated'] = 'Adskilt';
+$lang['Does not represent'] = 'Er ikke thumbnail for';
+$lang['Edit selected tags'] = 'Rediger valgte tags';
+$lang['Edit tags'] = 'Rediger tags';
+$lang['Email admins when a new user registers'] = 'Send email til admins, når en ny bruger registrerer sig';
+$lang['Email admins when a valid comment is entered'] = 'Send email til admins når en gyldig kommentar er opført';
+$lang['Email admins when a comment requires validation'] = 'Send email til admins, når en kommentar kræver validering';
+$lang['Environment'] = 'Miljø';
+$lang['Form'] = 'Form';
+$lang['Gallery title'] = 'Gallery titel';
+$lang['Grant selected groups'] = 'Tildel valgte grupper';
+$lang['Grant selected users'] = 'Tildel valgte brugere';
+$lang['Group name'] = 'Gruppe navn';
+$lang['Groups'] = 'Grupper';
+$lang['Guests'] = 'Gæster';
+$lang['History'] = 'Historie';
+$lang['Informations'] = 'Informationer';
+$lang['Install'] = 'Installer';
+$lang['Link all album photos to a new album'] = 'Link alle Kategori elementer til en ny Kategori';
+$lang['Link all album photos to some existing albums'] = 'Link alle Kategori elementer til nogle eksisterende kategorier';
+$lang['Linked albums'] = 'Linkede kategorier';
+$lang['Lock gallery'] = 'Lås galleri';
+$lang['Maintenance'] = 'Vedligeholdelse';
+$lang['Edit album permissions'] = 'Administrer tilladelser kategori';
+$lang['Manage permissions for group "%s"'] = 'Administrer tilladelser til gruppen \'% s \'';
+$lang['Manage permissions for user "%s"'] = 'Administrer tilladelser for brugeren \'% s \'';
+$lang['Manage tags'] = 'Administrer tags';
+$lang['Members'] = 'Medlemmer';
+$lang['Metadata synchronized from file'] = 'Metadata synkroniseret fra fil';
+$lang['Move albums'] = 'Flyt kategorier';
+$lang['Move'] = 'Flyt';
+$lang['Name'] = 'Navn';
+$lang['New name'] = 'Nyt navn';
+$lang['New parent album'] = 'Ny Kategori';
+$lang['New tag'] = 'Nyt tag';
+$lang['Number of comments per page'] = 'Antal kommentarer pr side';
+$lang['Number of rates'] = 'Antal af karakterer';
+$lang['Number of thumbnails to create'] = 'Antallet af miniaturebillederne der skal dannes';
+$lang['Only private albums are listed'] = 'Kun private kategorier er opført';
+$lang['Operating system'] = 'Operativsystem';
+$lang['Options'] = 'Muligheder';
+$lang['Other private albums'] = 'Andre private kategorier';
+$lang['Page banner'] = 'Side banner';
+$lang['Parent album'] = 'Overordnet Kategori';
+$lang['Path'] = 'Sti';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s er tidligere blevet brugt af Kategori %s Slet det fra permalinks historie første';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Det permalink navn skal bestå af az, AZ, 0-9, "-", "_" eller "/". Det må ikke være tal eller begynde med et tal efterfulgt af "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s bruges allerede af Kategori %s';
+$lang['Permalink history'] = 'Permalinks historie';
+$lang['Permalinks'] = 'Permalinks';
+$lang['Permission denied'] = 'Nægtet Tilladelse';
+$lang['Permission granted thanks to a group'] = 'Tilladelse givet takket være en Gruppe';
+$lang['Permission granted'] = 'Tilladelse givet';
+$lang['Photo informations updated'] = 'Billed information opdateret';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Position';
+$lang['Preferences'] = 'Indstillinger';
+$lang['Properties'] = 'Egenskaber';
+$lang['Random photo'] = 'Tilfældigt billede';
+$lang['Rate date'] = 'Bedømmelses dato';
+$lang['Rating by guests'] = 'Bedømmelse af gæster';
+$lang['Rating'] = 'Bedømmelse';
+$lang['Reject'] = 'Afvis';
+$lang['Representant'] = 'Album Minibillede';
+$lang['Representation of albums'] = 'Album minibillede';
+$lang['Representative'] = 'Album minibillede';
+$lang['Represents'] = 'Er minibillede for';
+$lang['Save order'] = 'Gem rækkefølge';
+$lang['Save to permalink history'] = 'Gem til permalinks historie';
+$lang['Select at least one album'] = 'Vælg mindst ét album';
+$lang['Select at least one photo'] = 'Vælg mindst et billede';
+$lang['Select at least one user'] = 'Vælg mindst én bruger';
+$lang['Show info'] = 'Vis info';
+$lang['Site manager'] = 'Site manager';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statistik';
+$lang['Storage album'] = 'Opbevaring Kategori';
+$lang['Sum of rates'] = 'Summen af bedømmelser';
+$lang['Tag "%s" already exists'] = 'Tag \'% s \'eksisterer allerede';
+$lang['Tag "%s" was added'] = 'Tag \'% s \'er blevet tilføjet';
+$lang['Tag selection'] = 'Tags valg';
+$lang['The %d following tags were deleted'] = 'Følgende %d tags er blevet slettet';
+$lang['Unable to check for upgrade.']     = 'Kunne ikke kontrollere for opgradering.';
+$lang['Uninstall'] = 'Afinstaller';
+$lang['Use the default photo sort order (defined in the configuration file)']  =  'Brug standard image sorteringsrækkefølge (defineret i konfigurationsfilen)';
+$lang['User comments validation']  =  'Bruger kommentarer validering';
+$lang['Users']  =  'Brugere';
+$lang['Validate']  =  'Godkend';
+$lang['Validation']  =  'Bekræftelse';
+$lang['Version']  =  'Version';
+$lang['Virtual albums to move'] = 'Virtuel album til at flytte';
+$lang['Virtual album name'] = 'Virtuel album navn';
+$lang['Webmaster cannot be deleted']  =  'Webmaster kan ikke slettes';
+$lang['You are running on development sources, no check possible.']  =  'Du kører på udviklings kilder, ingen tjek muligt.';
+$lang['You cannot delete your account']  =  'Du kan ikke slette din konto';
+$lang['You cannot move an album in its own sub album']  =  'Du kan ikke flytte en Kategori i dets eget under-kategori';
+$lang['You need to confirm deletion']  =  'Du skal bekræfte sletning';
+$lang['Add tags']  =  'Tilføj tags';
+$lang['Associate to album'] = 'Associeret til kategori';
+$lang['associate to group'] = 'Associeret til gruppe';
+$lang['Authorized']  =  'Autoriseret';
+$lang['Add a virtual album']  =  'Tilføj en virtuel Kategori';
+$lang['Authorize users to add comments on selected albums'] = 'Tillad brugere at tilføje kommentarer til udvalgte kategorier';
+$lang['The name of an album must not be empty'] = 'Navnet på et album, kan ikke ikke være tomt';
+$lang['Lock albums']  =  'Lås kategorier';
+$lang['Private'] = 'Privat Kategori';
+$lang['Public'] = 'Offentlig';
+$lang['Find a new representant by random'] = 'Find et nyt tilfældigt minibillede';
+$lang['Public / Private'] = 'Offentlig/Privat';
+$lang['Manage authorizations for selected albums']  =  'Administrer tilladelser for udvalgte kategorier';
+$lang['Virtual album added']  =  'Virtuel Kategori tilføjet';
+$lang['Virtual album deleted']  =  'Virtuel Kategori slettet';
+$lang['Access type']  =  'Adgang type';
+$lang['Information data registered in database']  =  'Oplysninger, der er registreret i databasen';
+$lang['Default display'] = 'Standard visning';
+$lang['The gallery URL is not valid.'] = 'Galleri URL er ikke gyldigt.';
+$lang['Main'] = 'Hoved';
+$lang['The number of comments a page must be between 5 and 50 included.']  =  'Antallet af kommentarer på en side skal være mellem 5 og 50 medtaget.';
+$lang['Configuration']  =  'Konfiguration';
+$lang['confirm'] = 'Bekræft';
+$lang['Date']  =  'Dato';
+$lang['delete album'] = 'slet kategori';
+$lang['Dissociate from album'] = 'Adskil fra kategori';
+$lang['dissociate from group'] = 'Adskil fra gruppe';
+$lang['Album updated successfully']  =  'Kategori informationer opdateret.';
+$lang['photos per page']  =  'Elementer pr side';
+$lang['High definition enabled']  =  'High definition er slået til';
+$lang['File'] = 'Fil';
+$lang['first photo added on %s']  =  'Første element tilføjet den %s';
+$lang['Forbidden']  =  'Forbudt';
+$lang['global mode']  =  'Global mode';
+$lang['group "%s" added']  =  'Gruppe \'% s \'tilføjet';
+$lang['group "%s" deleted']  =  'Gruppe \'% s \'slettet';
+$lang['group "%s" updated']  =  'Gruppe \'% s \'opdateret';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Navnet på en Gruppe må ikke indeholde \' eller \'eller være tomme. ';
+$lang['This name is already used by another group.']  =  'Dette navn bruges allerede af en anden Gruppe.';
+$lang['High definition']  =  'High definition';
+$lang['jump to album']  =  'Hop til Kategori';
+$lang['jump to photo']  =  'Hop til billedet';
+$lang['leave'] = 'Bevar';
+$lang['Lock'] = 'Lås';
+$lang['Locked'] = 'Låst';
+$lang['manage album photos'] = 'Administrer Kategori elementer';
+$lang['manage sub-albums'] = 'Administrer sub-kategorier';
+$lang['Manage'] = 'Administrer';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].']  =  'Gennemførelsestid er ude, skal behandlingen fortsætte [Forventet tid: %d sekunder].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].']  =  'Execution tid overskrides, skal behandlingen fortsætte [Forventet tid: %d sekunder].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.']  =  'Den tid til at opstille en liste over brugere, der vil blive sendt mail er begrænset. Andre brugere er ikke anført.';
+$lang['Time to send mail is limited. Others mails are skipped.']  =  'Tiden til at sende mail er begrænset. Andre mails er blevet sprunget over.';
+$lang['To send ?']  =  'Vil du sende?';
+$lang['Last send']  =  'Sidste sendt';
+$lang['email']  =  'Email';
+$lang['User']  =  'Bruger';
+$lang['See you soon,']  =  'Ses snart,';
+$lang['Go to']  =  'Gå til';
+$lang['Hello']  =  'Hej';
+$lang['New photos were added']  =  'Nye elementer er blevet tilføjet';
+$lang['on'] = 'på';
+$lang['between'] = 'mellem';
+$lang['and'] = 'og';
+$lang['The webmaster has subscribed you to receiving notifications by mail.']  =  'Webmaster har tilmeldt dig til at modtage meddelelser via mail.';
+$lang['You have subscribed to receiving notifications by mail.']  =  'Du har tilmeldt at modtage meddelelser via e-mail.';
+$lang['To subscribe']  =  'For at abonnere';
+$lang['If you encounter problems or have any question, please send a message to']  =  'Hvis du støder på problemer eller har spørgsmål, bedes du sende en besked til';
+$lang['[NBM] Problems or questions']  =  '[NBM] Problemer eller spørgsmål';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.']  =  'Det webmaster har afmeldt dig fra at modtage meddelelser via e-mail.';
+$lang['You have unsubscribed from receiving notifications by mail.']  =  'Du har afmeldt at være blevet underrettet af mail.';
+$lang[', click on']  =  ', Klik på';
+$lang['To unsubscribe']  =  'For at afmelde';
+$lang['With blank value, gallery title will be used']  =  'Hvis blank, vil galleriet titel bruges';
+$lang['Notification'] = 'Meddelelse';
+$lang['Error when sending email to %s [%s].']  =  'Fejl ved afsendelse af e-mail til% s [% s].';
+$lang['Mail sent to %s [%s].']  =  'Mail sendt til% s [% s].';
+$lang['%d mail was sent.']  =  ' %d mail er blevet sendt.';
+$lang['%d mails were sent.']  =  ' %d mails er blevet sendt.';
+$lang['%d mail was not sent.']  =  ' %d mail er ikke blevet sendt.';
+$lang['%d mails were not sent.']  =  ' %d mails ikke er blevet sendt.';
+$lang['No mail to send.']  =  'Ingen mails.';
+$lang['There is no available subscribers to mail.']  =  'Der er ingen abonnenter, som skal anmeldes via mail.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.']  =  'Abonnenter kunne være opført (tilgængelige) kun hvis der er nye elementer til at anmelde.';
+$lang['Anyway only webmasters can see this tab and never administrators.']  =  'Kun webmastere kan se dette faneblad, ingen administratorer.';
+$lang['No user to send notifications by mail.']  =  'Ingen bruger skal anmeldes via mail.';
+$lang['New photos added']  =  'Nye elementer tilføjet';
+$lang['Subscribe to notification by mail']  =  'Abonner på notfikation med mail';
+$lang['Unsubscribe from notification by mail']  =  'Afmeld fra notifikation med mail';
+$lang['Parameter'] = 'Indstillinger';
+$lang['Operation in progress']  =  'Behandling i gang';
+$lang['Continue processing treatment']  =  'Fortsæt igangværende behandling';
+$lang['Complementary mail content']  =  'Supplerende mail-indhold';
+$lang['Add detailed content']  =  'Tilføj nogle detaljerede indhold';
+$lang['Send mail as']  =  'Send e-mail som';
+$lang['Send mail to users']  =  'Send mail til brugere';
+$lang['Send']  =  'Send';
+$lang['Options']  =  'Muligheder';
+$lang['Subscribed']  =  'Tilmeldt';
+$lang['Subscribe']  =  'Abonner';
+$lang['Parameters']  =  'Parametre';
+$lang['Select recipients']  =  'Vælg modtagere';
+$lang['Subscribe/unsubscribe users']  =  'Tilmeld / afmeld brugere';
+$lang['Unsubscribed']  =  'Afmeldte';
+$lang['%d parameter was updated.']  =  ' %d parameter opdateret.';
+$lang['%d parameters were updated.']  =  ' %d parametre opdateret.';
+$lang['%d user was not updated.']  =  ' %d bruger ikke opdateret.';
+$lang['%d users were not updated.']  =  ' %d brugere ikke opdateret.';
+$lang['User %s [%s] was removed from the subscription list.']  =  'Bruger% s [%s] fjernet fra abonnementet listen.';
+$lang['User %s [%s] was added to the subscription list.']  =  'Bruger% s [%s] var tilføjet til abonnementet listen.';
+$lang['%d user was updated.']  =  ' %d bruger opdateret.';
+$lang['%d users were updated.']  =  ' %d brugere opdateret.';
+$lang['User %s [%s] was not removed from the subscription list.']  =  'Bruger% s [%s] var ikke fjernet fra abonnementet listen.';
+$lang['User %s [%s] was not added to the subscription list.']  =  'Bruger% s [%s] var ikke tilføjet til abonnementet listen.';
+$lang['User %s [%s] added.']  =  'Bruger% s [%s] tilføjet.';
+$lang['Warning: subscribing or unsubscribing will send mails to users']  =  'Advarsel: tilslutte eller afmelde vil sende mails til brugere';
+$lang['Send mail on HTML format']  =  'Send mail i HTML-format';
+$lang['Include display of recent photos grouped by dates']  =  'Medtag visning af de seneste billeder grupperet efter datoer';
+$lang['Available only with HTML format'] = 'Findes kun med HTML for½mat';
+$lang['no write access'] = 'ingen skrive adgang';
+$lang['Permissions']  =  'Tilladelser';
+$lang['private'] = 'Privat';
+$lang['public'] = 'offentlig';
+$lang['Purge never used notification feeds'] = 'Ryd aldrig anvendt anmeldelse feeds';
+$lang['Purge sessions'] = 'Ryd sessioner';
+$lang['randomly represented'] = 'Tilfældigt repræsentant';
+$lang['registration date'] = 'Registreringsdato';
+$lang['clean'] = 'oprydning';
+$lang['Create this site'] = 'Opret dette websted';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'test dette remote site';
+$lang['remove tags'] = 'Fjerne tags';
+$lang['Repair and optimize database'] = 'Reparation og optimere databasen';
+$lang['selection'] = 'udvælgelse';
+$lang['set to'] = 'Indstillet til';
+$lang['singly represented'] = 'fast album minibillede';
+$lang['This site already exists'] = 'Dette site eksisterer allerede';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Opret et nyt websted: (angiv URL til create_listing_file.php)';
+$lang['created'] = 'oprettet';
+$lang['delete'] = 'slet';
+$lang['delete this site and all its attached elements'] = 'Slet dette websted og alle relaterede oplysninger';
+$lang['an error happened'] = 'Der opstod en fejl';
+$lang['Local'] = 'Lokal';
+$lang['Remote'] = 'Remote';
+$lang['update the database from files'] = 'Opdatere databasen med filer';
+$lang['status'] = 'status';
+$lang['Directory']  =  'Mappe';
+$lang['sub-albums']  =  'Sub-kategorier';
+$lang['Synchronize metadata']  =  'Synkronisere metadata';
+$lang['target']  =  'Target';
+$lang['Thumbnail'] = 'Minibillede';
+$lang['title']  =  'Tittel';
+$lang['Album list management'] = 'Håndtering af kategoriliste';
+$lang['Piwigo configuration']  =  'Piwigo konfiguration';
+$lang['Edit album'] = 'Rediger kategori';
+$lang['Group management']  =  'Grupper forvaltning';
+$lang['User list'] = 'Brugere liste';
+$lang['Edit photo information'] = 'Rediger billed information';
+$lang['Database synchronization with files'] = 'Database synkronisering med filer';
+$lang['all'] = 'Alle';
+$lang['height must be a number superior to'] = 'Højde skal være et tal større end';
+$lang['width must be a number superior to'] = 'Bredde skal være et tal større end';
+$lang['for the file format'] = 'For filformatet';
+$lang['Photo unreachable or no support'] = 'Picture utilgængelig eller ikke understøttet format';
+$lang['GD version'] = 'GD version';
+$lang['General statistics'] = 'General statistikker';
+$lang['average time'] = 'Gennemsnitlig tid';
+$lang['number of miniaturized photos']  =  'Antal skabte thumbnails';
+$lang['total time']  =  'Total tid';
+$lang['for this file format']  =  'For denne fil format';
+$lang['unit mode']  =  'Single-mode';
+$lang['Unlocked'] = 'Låst op';
+$lang['unset'] = 'unset';
+$lang['Update albums informations'] = 'Update album informationer';
+$lang['Update photos information']  =  'Update billeder information';
+$lang['Synchronize']  =  'Synkroniser';
+$lang['reduce to single existing albums']  =  'Reduceres til én eksisterende kategorier';
+$lang['Choose an option'] = 'Vælg en mulighed';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'vis flest mulige oplysninger (tilføjede kategorier og fotos, slettede kategorier og fotos)';
+$lang['Error list']  =  'Liste over fejl';
+$lang['Errors caption'] = 'Fejl beskrivelser';
+$lang['Detailed informations']  =  'Detaljeret information';
+$lang['File/directory read error'] = 'Fil/mappe læse fejl';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)']  =  'Fil eller mappe ikke kan få adgang (enten det eksisterer ikke eller adgang nægtes)';
+$lang['albums deleted in the database']  =  'Kategorier slettet i databasen';
+$lang['photos deleted from the database']  =  'Elementer slettet i databasen';
+$lang['photos candidates for metadata synchronization']  =  'Billeder kandidater til metadata synkronisering';
+$lang['photos informations synchronized with files metadata']  =  'Elementer informationer synkroniseret med filer metadata';
+$lang['errors during synchronization']  =  'Fejl under synkroniseringen';
+$lang['albums added in the database']  =  'Kategorier tilføjet i databasen';
+$lang['photos added in the database']  =  'Elementer tilføjet i databasen';
+$lang['photos updated in the database']  =  'Elementer opdateret i databasen';
+$lang['Search for new images in the directories']  =  'Søg efter nye billeder i mapper';
+$lang['added']  =  'Tilføjet';
+$lang['deleted'] = 'slettet';
+$lang['Metadata synchronization results']  =  'Metadata synkronisering resultater';
+$lang['only perform a simulation (no change in database will be made)'] = 'kun udføre en simulering (intet vil blive ændret i databasen)';
+$lang['Simulation']  =  'Simulation';
+$lang['directories + files'] = 'mapper + filer';
+$lang['only directories'] = 'mapper kun';
+$lang['synchronize files structure with database']  =  'Synkronisere filer struktur med databasen';
+$lang['synchronize files metadata with database photos informations']  =  'Synkronisere database elementer med filer metadata';
+$lang['even already synchronized photos']  =  'Allerede synkroniserede elementer';
+$lang['Used metadata']  =  'Metadata anvendes';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Navnet på biblioteker og filer skal kun bestå af bogstaver, tal, \'- \', \'_\' eller \'.\'';
+$lang['wrong filename']  =  'Forkert filnavn';
+$lang['Upload']  =  'Upload';
+$lang['user "%s" added']  =  'User \'%s\' tilføjet';
+$lang['User status']  =  'Bruger status';
+$lang['user_status_admin']  =  'Administrator';
+$lang['user_status_generic']  =  'Generisk';
+$lang['user_status_guest']  =  'Gæst';
+$lang['user_status_normal']  =  'Bruger';
+$lang['user_status_webmaster']  =  'Webmaster';
+$lang['Virtual album'] = 'Virtuel album ';
+$lang['Waiting']  =  'Venter';
+$lang['default'] = 'Standard';
+$lang['Toggle \'default group\' property']  =  'Reverse \'default Gruppe\' ejendom ';
+$lang['Advanced features']  =  'Avancerede funktioner';
+$lang['Overall'] = 'Oversigt';
+$lang['Year'] = 'År';
+$lang['Month'] = 'Måned';
+$lang['Day'] = 'Dag';
+$lang['Pages seen']  =  'Sider set';
+$lang['Time'] = 'Tid';
+$lang['IP']  =  'IP';
+$lang['Element']  =  'Element';
+$lang['Section']  =  'Afsnit';
+$lang['An information email was sent to group "%s"']  =  'Information email sendt til gruppen "%s"';
+$lang['Send an information email to group members']  =  'Send en information e-mail til gruppen medlemmer';
+$lang['Group']  =  'Gruppe';
+$lang['[%s] Visit album %s']  =  '[% S] Besøg Kategori %s';
+$lang['Hello,']  =  'Hej,';
+$lang['See you soon.']  =  'Ses snart.';
+$lang['Discover album:'] = 'Gennemse kategori:';
+$lang['Mail content']  =  'Mail indhold';
+$lang['none'] = 'ingen';
+$lang['high']  =  'Høj';
+$lang['other'] = 'andre';
+$lang['Element type']  =  'Element type';
+$lang['Image id']  =  'Billede id';
+$lang['Summary'] = 'Opsummering';
+$lang['%d line filtered']  =  ' %d filtrerede line';
+$lang['%d lines filtered']  =  ' %d linjer filtreret';
+$lang['%d guest']  =  ' %d gæst';
+$lang['%d guests']  =  ' %d gæster';
+$lang['Hour']  =  'Time';
+$lang['guest']  =  'Gæst';
+$lang['default values'] = 'Standardværdier';
+$lang['Guest cannot be deleted']  =  'Gæst kan ikke slettes';
+$lang['Default user cannot be deleted'] = 'Standardbruger kan ikke slettes';
+$lang['Purge history detail']  =  'Ryd historie detaljer';
+$lang['Purge history summary']  =  'Ryd historie summary';
+$lang['Check integrity'] = 'Integritetskontrol';
+$lang['Anomaly']  =  'Uregelmæssig';
+$lang['Correction']  =  'Korrektion';
+$lang['Automatic correction']  =  'Automatisk korrektion';
+$lang['Impossible automatic correction']  =  'Automatisk korrektion ikke muligt';
+$lang['Correction applied with success']  =  'Korrektion anvendt med succes';
+$lang['Correction applied with error']  =  'Korrektion anvendes med fejl';
+$lang['%d anomaly has been detected.']  =  ' %d afvigelsen er konstateret.';
+$lang['%d anomalies have been detected.']  =  ' %d uregelmæssighed er påvist.';
+$lang['%d anomaly has been corrected.']  =  ' %d afvigelsen er korrigeret.';
+$lang['%d anomalies have been detected corrected.']  =  ' %d uregelmæssigheder er blevet opdaget og rettet.';
+$lang['%d anomaly has not been corrected.']  =  ' %d urelmæssighed er ikke blevet korrigeret.';
+$lang['%d anomalies have not been corrected.']  =  ' %d uregelmæssigheder har ikke været korrigeret.';
+$lang['Go to %s or %s for more informations']  =  'Gå til %s eller %s for mere information';
+$lang['the forum'] = 'forummet';
+$lang['the wiki']  =  'Wiki';
+$lang['%s value is not correct file because exif are not supported']  =  '%s værdi er forkert, fordi exif ikke er understøttet';
+$lang['%s must be to set to false in your local/config/config.inc.php file']  =  '%s skal være indstillet til false i dit lokale / config / config.inc.php fil';
+$lang['Main "guest" user does not exist'] = 'Hoved "gæst" bruger eksisterer ikke';
+$lang['Main "guest" user status is incorrect'] = 'Hoved "gæst" user status er forkert';
+$lang['Default user does not exist'] = 'Standardbruger findes ikke';
+$lang['Main "webmaster" user does not exist'] = 'Hoved "webmaster" bruger eksisterer ikke';
+$lang['Main "webmaster" user status is incorrect'] = 'Hoved "webmaster" user status er forkert';
+$lang['User "%s" created with "%s" like password']  =  'Bruger \'%s\' er oprettet med \'%s \' som password ';
+$lang['Status of user "%s" updated']  =  'Bruger \'%s\' opdateret status ';
+$lang['add new photos to caddie']  =  'Tilføje nye elementer til caddie';
+$lang['No display']  =  'Ingen display';
+$lang['Classic display'] = 'Klassisk visning';
+$lang['Hoverbox display']  =  'Hoverbox display';
+$lang['Mail address is obligatory for all users']  =  'Mail-adresse er obligatorisk for alle brugere';
+$lang['Minimum privacy level']  =  'Minimum privatliv niveau';
+$lang['Privacy level'] = 'Fortroligheds niveau';
+$lang['Level 0']  =  'Fri adgang';
+$lang['Level 1']  =  'Kontakter';
+$lang['Level 2']  =  'Venner';
+$lang['Level 4']  =  'Familie';
+$lang['Level 8']  =  'Admins';
+$lang['Reinitialize check integrity']  =  'Geninstaller integritet check';
+$lang['Check all']  =  'Check alle';
+$lang['Uncheck all']  =  'Fjern alle';
+$lang['Check automatic corrections']  =  'Check automatiske rettelser';
+$lang['Apply selected corrections']  =  'Anvend udvalgte korrektioner';
+$lang['Ignore selected anomalies']  =  'Ignorer valgte anomalier';
+$lang['Refresh']  =  'Opdater';
+$lang['The anomaly will be ignored until next application version']  =  'Den skævhed vil blive ignoreret, indtil næste version';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Korrigeret afvigelse vil efterfølgende ikke blive ignoreret';
+$lang['%d anomaly has been ignored.']  =  '%d uregelmæssighed er blevet ignoreret.';
+$lang['%d anomalies have been ignored.']  =  ' %d uregelmæssigheder er blevet ignoreret.';
+$lang['Plugins which need upgrade']  =  'Plugins skal opgraderes';
+$lang['Plugin list']  =  'Plugins liste';
+$lang['Check for updates']  =  'Check for opdateringer';
+$lang['Other plugins']  =  'Andre plugins tilgængelig';
+$lang['Last revisions']  =  'Sidste ændringer';
+$lang['Are you sure you want to delete this plugin?']  =  'Er du sikker på du vil slette denne plugin?';
+$lang['Are you sure you want to install this plugin?'] = 'Er du sikker på du vil installere denne plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Er du sikker på du vil installere denne opgradering? Du skal kontrollere, om denne version ikke skal afinstalleres først.';
+$lang['Plugin has been successfully copied']  =  'Dette plugin er blevet kopieret';
+$lang['You might go to plugin list to install and activate it.']  =  'Gå til plugins listen for at installere og aktivere det.';
+$lang['Can\'t create temporary file.']  =  'Midlertidige filer kan ikke oprettes.';
+$lang['Can\'t download archive.'] = 'Arkiv kan ikke hentes.';
+$lang['Can\'t read or extract archive.'] = 'Arkiv ikke kan læses eller udpakkes.';
+$lang['An error occured during extraction (%s).'] = 'En fejl opstod under fil (% s) ekstraktion.';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Check "plugins" mappe og under-mappe tilladelser (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Tilslutning til server ikke muligt.';
+$lang['Purge compiled templates'] = 'Ryd udarbejdet skabeloner';
+$lang['ACCESS_0']  =  'Fri adgang';
+$lang['ACCESS_1']  =  'Adgang til alle';
+$lang['ACCESS_2']  =  'Adgang til registrerede brugere';
+$lang['ACCESS_3']  =  'Adgang til administratorer';
+$lang['ACCESS_4']  =  'Adgang til webmastere';
+$lang['ACCESS_5']  =  'Ingen adgang';
+$lang['Support']  =  'Support';
+$lang['Documentation']  =  'Dokumentation';
+$lang['A new version of Piwigo is available.']  =  'En ny version af Piwigo er tilgængelig.';
+$lang['Piwigo Administration']  =  'Piwigo Administration';
+$lang['Piwigo version']  =  'Piwigo version';
+$lang['You are running the latest version of Piwigo.']  =  'Du kører Piwigo nyeste version.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Den version af %s [%s] er installeret ikke er kompatibel med den krævede version  [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Du bør opgradere dit system til at drage fuld fordel af programmet, ellers risikerer du at programmet virke forkert, eller slet ikke';
+$lang['Deleted on'] = 'Slettet den';
+$lang['Last hit']  =  'Sidste hit';
+$lang['GD library is missing']  =  'GD bibliotek mangler';
+$lang['Templates']  =  'Skabeloner';
+$lang['Extend for templates']  =  'Forlæng skabeloner';
+$lang['Replacement of original templates by customized templates from template-extension subfolder']  =  'Udskiftning af originale skabeloner af individuelle skabeloner fra skabelon-udvidelse undermappe';
+$lang['Replacers (customized templates)']  =  'Stedfortrædere (tilpassede skabeloner)';
+$lang['Original templates']  =  'Original templates';
+$lang['Optional URL keyword']  =  'Valgfrit URL keyword';
+$lang['Templates configuration has been recorded.']  =  'Skabeloner konfiguration er registreret.';
+$lang['All optimizations have been successfully completed.']  =  'Alle optimeringer er blevet afsluttet med succes.';
+$lang['Optimizations have been completed with some errors.']  =  'Optimeringer er afsluttet med nogle fejl.';
+$lang['Modify information']  =  'Rediger oplysninger';
+$lang['nothing'] = 'intet';
+$lang['overrides existing values with empty ones'] = 'tilsidesætter eksisterende værdier med tomme';
+$lang['Manage photo ranks']  =  'Administrer image ranking';
+$lang['Edit ranks'] = 'Rediger karakterer';
+$lang['No photo in this album']  =  'Ingen element i denne Kategori';
+$lang['Images manual order was saved'] = 'Billeder manual rækkefølge gemt';
+$lang['ranks'] = 'Placering';
+$lang['Drag to re-order'] = 'Klik-og-træk for at arrangere';
+$lang['Quick Local Synchronization'] = 'Hurtig Lokal synkronisering';
+$lang['No photo can be deleted']  =  'Intet foto kan slettes';
+$lang['Delete selected photos']  =  'Slet valgte billeder';
+$lang['%d photo was deleted']  =  ' %d billede slettet';
+$lang['%d photos were deleted']  =  ' %d billeder slettet';
+$lang['Downloads']  =  'Downloads';
+$lang['Released on']  =  'Frigivet på';
+$lang['Number of downloads']  =  'Antal af downloads';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Nyhedsbrev';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.']  =  'Hold kontakten med Piwigo projekt, abonnere på Piwigo  nyhedsbrev. Du vil blive sendt e-mails, når en ny udgivelse er tilgængelig (undertiden også en sikkerhed bug fix, er det vigtigt at kende og opgradering), og når større begivenheder ske med projektet. Kun nogle få emails om året. ';
+$lang['Subscribe %s']  =  'Abonner % s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter']  =  'Abonner % s til Piwigo Announcements Newsletter';
+$lang['Purge search history']  =  'Ryd søgeoversigt';
+$lang['Hide']  =  'Skjul';
+$lang['Password is missing. Please enter the password.']  =  'Kodeordet er savnet. Indtast venligst password.';
+$lang['Password confirmation is missing. Please confirm the chosen password.']  =  'Password bekræftelse mangler. Bekræft den valgte adgangskode.';
+$lang['Allow users to edit their own comments']  =  'Tillad brugere at redigere deres egne kommentarer';
+$lang['Allow users to delete their own comments']  =  'Tillad brugere at slette deres egne kommentarer';
+$lang['Email administrators when a comment is modified'] = 'Send email til administratorer, når en kommentar er modificeret';
+$lang['Email administrators when a comment is deleted'] = 'Send email til administratorer, når en kommentar er slettet';
+$lang['Cannot delete the old permalink !'] = 'Det eksisterende permalink kan ikke slettes!';
+$lang['Hit']  =  'Hit';
+$lang['Tools'] = 'Værktøjer';
+$lang['Photos']  =  'Billeder';
+$lang['Themes']  =  'Temaer';
+$lang['Instructions to use Piwigo']  =  'Vejledning til brug Piwigo';
+$lang['Installed Themes']  =  'Installerede temaer';
+$lang['Add New Theme']  =  'Tilføj et nyt tema';
+$lang['Forbid this theme to users']  =  'Forbyd dette tema til brugere';
+$lang['Set as default theme for unregistered and new users']  =  'Sæt som standard tema for uregistrerede og nye brugere';
+$lang['unknown']  =  'Ukendt';
+$lang['Upload Photos']  =  'Upload billeder ';
+$lang['Drop into album'] = 'Vælg en kategori ';
+$lang['+ Add an upload box']  =  '+ Tilføj en upload boks';
+$lang['Upload']  =  'Upload';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Opret \'%s\' bibliotek i roden af din Piwigo installation';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation']  =  'Giv skrive adgang (chmod 777) til \'%s\' bibliotek i roden af din Piwigo anlæg';
+$lang['existing album']  =  'Eksisterende Kategori ';
+$lang['create a new album'] = 'Opret en ny kategori ';
+$lang['Album name']  =  'Kategori navn ';
+$lang['Album "%s" has been added']  =  'Kategori \'%s\' er blevet tilføjet ';
+$lang['Uploaded Photos']  =  'Uploadede fotos ';
+$lang['%d photos uploaded']  =  ' %d uploaded billeder';
+$lang['Privacy level set to "%s"'] = 'Privat niveau sat til "%s"';
+$lang['Album "%s" now contains %d photos']     = 'Kategori \'%s\'indeholder nu %d billeder ';
+$lang['Manage this set of %d photos']  =  'Administrer dette sæt af %d billeder ';
+$lang['Select files']  =  'Vælg filer';
+$lang['Everybody']  =  'Alle';
+$lang['Who can see these photos?']  =  'Hvem kan se disse billeder? ';
+$lang['Settings']  =  'Indstillinger';
+$lang['Resize'] = 'Ændre størrelsen';
+$lang['Maximum Width']  =  'Maksimal bredde';
+$lang['pixels']  =  'Pixels';
+$lang['Maximum Height']  =  'Maksimal højde';
+$lang['Image Quality']  =  'Billedkvalitet ';
+$lang['Save Settings']  =  'Gem indstillinger ';
+$lang['Your configuration settings are saved']  =  'Din konfigurationsindstillinger gemmes';
+$lang['Active Themes']  =  'Aktiv Temaer';
+$lang['Add write access to the "%s" directory']  =  'Tilføj skrive adgang ti l \'%s\' bibliotek';
+$lang['Administration Home']  =  'Administration Hjem ';
+$lang['Change Admin Colors'] = 'Skift farver på administrationsmodul';
+$lang['Delete this theme']  =  'Slet dette tema';
+$lang['Directory does not exist'] = 'Mappe findes ikke ';
+$lang['Download,'] = 'Download,';
+$lang['FTP + Synchronization']  =  'FTP + Synchronization ';
+$lang['Get Support on Piwigo Forum']  =  'Få support på Piwigo forum ';
+$lang['Help Me']  =  'Hjælp mig';
+$lang['Impossible to activate this theme, the parent theme is missing: %s']  =  'Dette tema kunne ikke aktiveres, som moderselskabet tema mangler :% s ';
+$lang['Impossible to delete this theme. Other themes depends on it: %s']  =  'Dette tema kan ikke slettes, fordi andre temaer afhænger af det: % s ';
+$lang['Inactive Themes']  =  'Inaktive temaer';
+$lang['Install on your computer,']  =  'Installer på din computer,';
+$lang['Make this theme available to users']  =  'Gør dette tema til rådighed for brugerne';
+$lang['Page end']  =  'Side slut ';
+$lang['Piwigo Uploader']  =  'Piwigo Uploader ';
+$lang['Operation in progress']  =  'Behandler';
+$lang['Please wait...'] = 'Vent venligst...';
+$lang['Read Piwigo Documentation']  =  'Læs Piwigo dokumentation';
+$lang['Start pLoader and add your photos.']  =  'Start pLoader og tilføje dine billeder.';
+$lang['Switch to clear or dark colors for administration']  =  'Skift til klar eller mørke farver for administration';
+$lang['Theme has been successfully installed'] = 'Tema er blevet installeret med succes';
+$lang['Visit Gallery']  =  'Besøg galleriet';
+$lang['Visit Piwigo project website']  =  'Besøg Piwigo projektets hjemmeside';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.']     = 'PLoader står for <em> Piwigo Uploader </em>. Fra din computer, forbereder pLoader dine fotos og overføre dem til din Piwigo fotogalleri.'; 
+$lang['Guest Settings']  =  'Gæste indstillinger ';
+$lang['Main Page']  =  'Forside';
+$lang['Photo Page']  =  'Foto side ';
+$lang['Activate Navigation Bar']  =  'Aktiver navigation bar';
+$lang['Activate Navigation Thumbnails']  =  'Aktiver navigation thumbnails ';
+$lang['Activate icon "%s"']  =  'Aktiver ikonet \'%s\'';
+$lang['Photo Properties']  =  'Foto egenskaber';
+$lang['Allow user customization']  =  'Tillad brugertilpasning';
+$lang['Languages']  =  'Sprog';
+$lang['Installed Languages']  =  'Installeret sprog';
+$lang['Add New Language']  =  'Tilføj nyt sprog ';
+$lang['Language has been successfully installed']  =  'Sprog er blevet installeret';
+$lang['Select:']  =  'Vælg:';
+$lang['None']  =  'Ingen';
+$lang['Invert']  =  'Vend';
+$lang['Impossible to deactivate this theme, you need at least one theme.']  =  'Umuligt at deaktivere dette tema, du har brug for mindst ét tema';
+$lang['Webmaster status is required.']  =  'Webmaster status er nødvendig';
+$lang['Bound Theme'] = 'Tilknyttet tema';
+$lang['Allow rating']  =  'Tillad rating';
+$lang['Select at least one comment']  =  'Vælg mindst én kommentar';
+$lang['Active Plugins']  =  'Aktiv Plugins ';
+$lang['Inactive Plugins']  =  'Inaktive plugins ';
+$lang['Missing Plugins']  =  'Manglende Plugins';
+$lang['Uninstalled Plugins']  =  'Afinstalleret Plugins ';
+$lang['By %s']  =  'Ved %s';
+$lang['Visit plugin site']  =  'Besøg plugin websted ';
+$lang['By rank'] = 'Efter ranking';
+$lang['Manual order'] = 'Manuel rækkefølge';
+$lang['Who can see this photo?'] = 'Hvem kan se dette foto?';
+$lang['Active Languages'] = 'Aktive sprog';
+$lang['Delete this language'] = 'Slet dette sprog';
+$lang['Forbid this language to users'] = 'Forbyd dette sprog til brugere';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Ikke muligt at deaktivere dette sprog, du skal først vælge et andet sprog som default.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Ikke muligt at deaktivere dette sprog, du skal mindst have et sprog.';
+$lang['Inactive Languages'] = 'Inaktive sprog';
+$lang['Make this language available to users'] = 'Gør dette sprog tilgængelig for brugere';
+$lang['Set as default language for unregistered and new users'] = 'Vælg som default sprog for ikke registrerede og nye brugere';
+$lang['Add Photos'] = 'Tilføj fotos';
+$lang['The following tag was deleted'] = 'Følgende tag er slettet';
+$lang['Miscellaneous'] = 'Forskellig';
+$lang['Virtual Links'] = 'Virtual Links';
+$lang['There is no other language available.'] = 'Der er ikke andre sprog til rådighed.';
+$lang['There is no other plugin available.'] = 'Der er ikke andre plugins tilgængelige.';
+$lang['There is no other theme available.'] = 'Der er ikke andre temaer tilgængelige.';
+$lang['Add another set of photos'] = 'Tilføj en anden gruppe fotos';
+$lang['Order of menubar items has been updated successfully.'] = 'Bestilling på menubars er opdateret.';
+$lang['This theme was not designed to be directly activated'] = 'Dette tema er ikke designet til at blive aktiveret direkte';
+$lang['Pending Comments'] = 'Ventende kommentarer';
+$lang['Menu Management'] = 'Menu';
+$lang['new'] = 'ny';
+$lang['No file was uploaded'] = 'Ingen filer blev oploadet';
+$lang['No photo in the current set.'] = 'Ingen foto I det nuværende sæt.';
+$lang['No photo selected, %d photos in current set'] = 'Ingen fotos valgt, %d fotos i nuværende sæt';
+$lang['No photo selected, no action possible.'] = 'Ingen fotos valgt, ingen mulige handlinger.';
+$lang['No results'] = 'Ingen resultater';
+$lang['on the %d selected photos'] = 'på det %d valgte foto';
+$lang['Predefined filter'] = 'Foruddedineret filter';
+$lang['Refresh photo set'] = 'Opdater fotosættet';
+$lang['Remove all filters'] = 'Fjern alle filtre';
+$lang['remove author'] = 'fjern forfatter';
+$lang['remove creation date'] = 'fjern oprettelsesdato';
+$lang['Remove from caddie'] = 'Fjern fra caddie';
+$lang['remove this filter'] = 'fjern dette filter';
+$lang['remove title'] = 'fjern titel';
+$lang['Searching...'] = 'Søger...';
+$lang['Selection'] = 'Udvælgelse';
+$lang['Set author'] = 'Vælg forfatter';
+$lang['Set creation date'] = 'Vælg oprettelsesdato';
+$lang['Set title'] = 'Vælg titel';
+$lang['Learn more'] = 'Lær mere';
+$lang['Rate'] = 'Bedøm';
+$lang['Average rate'] = 'Gennemsnitlig karakter';
+$lang['An error has occured during upgrade.'] = 'Der opstod en fejl under opgraderingen.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Der opstod en fejl under udpakningen. Tjek fil tilladelserne i din piwigo installation.<br><a href="%s">Klik her for at vist fejl log</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kan ikke modtage opgraderings filer fra serveren';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inkluder historiske data (Advarsel: server hukommelses begrænsning kan blive overskredet)';
+$lang['Unable to dump database.'] = 'Det er ikke muligt at dumpe databasen.';
+$lang['Update in progress... Please wait.'] = 'Opgraderingen er i gang... Vent venligst.';
+$lang['Update to Piwigo %s'] = 'Opgradering til Piwigo %s';
+$lang['Two updates are available'] = 'Der er to opgraderinger til rådighed';
+$lang['%d of %d photos selected'] = '%d af %d fotos udvalgt';
+$lang['Action'] = 'Handling';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktiver icon "ny" ved siden af albums og billeder';
+$lang['Add a criteria'] = 'Tilføj kriterie';
+$lang['Add a filter'] = 'Tilføj et filter';
+$lang['Album photos associated to the following albums: %s'] = 'Album fotos tilhører følgende albums: %s';
+$lang['Albums automatically sorted'] = 'Albums er automatisk sorteret';
+$lang['All %d photos are selected'] = 'Alle %d fotos er udvalgte';
+$lang['Apply action'] = 'Godkend handling';
+$lang['automatic order'] = 'automatisk rækkefølge';
+$lang['Batch Manager'] = 'Batch Manager';
+$lang['Choose an action'] = 'Vælg en handling';
+$lang['Deactivate all'] = 'Deaktiver alle';
+$lang['Default photos order'] = 'Standard sorteringsrækkefølge for fotos';
+$lang['Delete orphan tags'] = 'Slet forældreløse tags';
+$lang['delete photo'] = 'slet foto';
+$lang['Duplicates'] = 'Dubletter';
+$lang['Error on file "%s" : %s'] = 'Fejl i fil "%s" :%s';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension er ikke tilgængelig, admin bør disable exif brug';
+$lang['Failed to write file to disk'] = 'Fejl i skrivning til disk';
+$lang['File upload stopped by extension'] = 'Fil upload er stoppet';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'I din php.ini fil, er upload_max_filestørrelse (%sB) større end post_maks_størrelsen (%sB), du bør ændre denne indstilling';
+$lang['include child albums'] = 'inkluder børne albums';
+$lang['Last import'] = 'Sidste import';
+$lang['manual order'] = 'manual rækkefølge';
+$lang['Missing a temporary folder'] = 'Mangler midlertidig mappe';
+$lang['Orphan tags deleted'] = 'Orphan tags slettet';
+$lang['Restore'] = 'Genopret';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Genopret default konfiguration. Du vil miste din plugin indstillinger!';
+$lang['Show menubar'] = 'Vis menubar';
+$lang['Add to caddie'] = 'tilføj til caddie';
+$lang['%s has been successfully updated.'] = '%s er blevet opdateret.';
+$lang['%s photos can not be regenerated'] = '%s Fotos kan ikke blive gendannet';
+$lang['%s photos have been regenerated'] = '%s fotos er blevet gendannet';
+$lang['(this tag will be deleted)'] = '(denne tag vil blive slettet)';
+$lang['... or '] = '... eller ';
+$lang['Activate comments'] = 'Aktiver kommentarer';
+$lang['All extensions are up to date.'] = 'Alle udvidelser er updaterede.';
+$lang['All languages are up to date.'] = 'Alle sprog er opdaterede.';
+$lang['All plugins are up to date.'] = 'Alle plugins er opdaterede.';
+$lang['All themes are up to date.'] = 'Alle themaer er opdaterede.';
+$lang['Allowed file types: %s.'] = 'Tilladte fil typer: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Cirka maksimum opløsning: %dM pixels (that\'s %dx%d pixels).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Som standard vil Piwigo danne en ny webstørrelse fra HD versionen af dit foto.';
+$lang['Confirm merge'] = 'Bekræft sammenlægning';
+$lang['Create'] = 'Dan';
+$lang['Crop'] = 'Beskær';
+$lang['Default comments order'] = 'Standard kommentar rækkefølge';
+$lang['display'] = 'vis';
+$lang['Do you want to activate anyway?'] = 'Vil du aktivere alligevel';
+$lang['Dump Database'] = 'Dump Database';
+$lang['ERROR'] = 'FEJL';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FEJL: DETTE PLUGIN MANGLER, MEN ER INSTALLERET! AFINSTILLER NU.';
+$lang['Extensions Update'] = 'Extensions opdatering';
+$lang['Follow Orientation'] = 'Følg orientering';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Følgende plugins er måske ikke kompatible med den nye version af Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Følgende temaer er måske ikke compatible med den nye version af Piwigo:';
+$lang['Height'] = 'Højde';
+$lang['hide details'] = 'skjul detaljer';
+$lang['Graphics Library'] = 'Grafisk Bibiliotejk';
+$lang['I decide to update anyway'] = 'Jeg vil updater alligevel';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Hvis der ikke er HD tilgængelig og hvis wesitet er større end mulighederne for resize, Piwioi vil flytte det som HD og lave en nedskaleret website foto af det.';
+$lang['Ignore All'] = 'Ignorer Alt';
+$lang['Ignore this update'] = 'Ignorer denne opdatering';
+$lang['Manage Permissions'] = 'Administrer tilladelsen';
+$lang['Maximum file size: %sB.'] = 'Maximum fil størrelse: %sB.';
+$lang['Merge selected tags'] = 'Flet udvalgte tags';
+$lang['Merge tags'] = 'Sammenlæg tags';
+$lang['New Version'] = 'Ny Version';
+$lang['No destination tag selected'] = 'Der er ikke valgt nogen destinations tag';
+$lang['Obsolete Plugins'] = 'Forældede Plugins';
+$lang['Photo %s of %s'] = 'Foto %s af %s'; 
+$lang['Photo name'] = 'Foto navn'; 
+$lang['Photos generation in progress...'] = 'Dannelse af foto igang...'; 
+$lang['Piwigo Update'] = 'Piwigo Update'; 
+$lang['Reset ignored updates'] = 'Reset ignorede opdateringer'; 
+$lang['Save Template Directory'] = 'Gem template bibliotek'; 
+$lang['Select an album'] = 'Vælg et album'; 
+$lang['Select at least two tags for merging'] = 'Vælg mindst to tags til sammenlægning';
+$lang['Select the destination tag'] = 'Vælg destination tag'; 
+$lang['Send connection settings by email'] = 'Send indstillinger på email'; 
+$lang['show details'] = 'vis detaljer'; 
+$lang['Some themes and plugins may be not available yet.'] = 'Nogle temaer og plugins er muligvis ikke klar endnu.'; 
+$lang['Some upgrades are available for extensions.'] = 'Nogle opgraderinger er klar til udvidelser.'; 
+$lang['Start Upload'] = 'Start Upload'; 
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tags <em>%s</em> merged ind i tag <em>%s</em>'; 
+$lang['The original image quality must be a number between %d and %d'] = 'Det originale foto kvalitet skal være et tal mellem %d og %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Det originale maksimum højde skal være et tal mellem %d og %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Den originale højde skal være et tal mellem %d og %d';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Dette er en stor opdatering, med<a href="%s">nye spændende features</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Dette er en mindre opdatering, med kun små rettelser.';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DETTE PLUGIN ER NU EN DEL AF PIWIGO CORE! AFINDSTALLER DET NU!';
+$lang['Thumbnails generation in progress...'] = 'Dannelse af minibillede er i gang...';
+$lang['Update All'] = 'Opdater alle';
+$lang['Update Complete'] = 'Opdatering er fuldført';
+$lang['Updates'] = 'Opdateringer';
+$lang['Visit language site'] = 'Besøg sprog side';
+$lang['Visit theme site'] = 'Besøg tema side';
+$lang['Width'] = 'Bredde';
+$lang['With no album'] = 'Uden album';
+$lang['With no tag'] = 'Uden tag';
+$lang['With no virtual album'] = 'Uden virtual album';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Du bruger Browser uploader. Prøv <a href="%s">Flash uploader</a> i stedet.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Du burger Flash uploader. Problemer? Prøv <a href="%s">Browser uploader</a> i stedet.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Du kan opdatere til Piwigo %s direkte, uden at opgradere Piwigo %s (anbefalet).';
+$lang['Zoom'] = 'Zoom';
+$lang['Resize after upload'] = 'Resize efter upload';
+$lang['Original Size'] = 'Original Størrelse';
+$lang['A locked gallery is only visible to administrators'] = 'Et låst gallery er kun synlig for administratorer';
+$lang['Unlock gallery'] = 'Lås galleri op';
+$lang['Gallery unlocked'] = 'Galleri er låst op';
+$lang['Notify administrators when a comment is'] = 'Giv administratorer besked når en kommentar er';
+$lang['modified'] = 'ændret';
+$lang['pending validation'] = 'venter validation';
+$lang['Save visits in history for'] = 'Gem besøg i historie for';
+$lang['simple visitors'] = 'simple besøgende';
+$lang['registered users'] = 'registerede burger';
+$lang['administrators'] = 'administratorer';
+$lang['This album contains %d photos, added on %s.'] = 'Dette album indeholder %d fotos, tilføjet den %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Dette album indeholder %d fotos, tilføjet mellem %s og %s.';
+$lang['This album contains no photo.'] = 'Dette album indeholder ingen fotos.';
+
+$lang['Move to album'] = 'Flyt til album';
+$lang['The whole page'] = 'Hele siden';
+$lang['The whole set'] = 'Hele sættet';
+$lang['Themes which need upgrade'] = 'Temaer som bør opgraderes';
+$lang['Type here the author name'] = 'Angiv forfatter';
+$lang['Type here the title'] = 'Angiv titel';
+$lang['Type in a search term'] = 'Angiv et søgeord';
+$lang['Unknown upload error'] = 'Ukendt fejl ved upload';
+$lang['Week starts on'] = 'Uge starter på';
+$lang['Apply watermark if height is bigger than'] = 'Tilføj vandmærke hvis højden er større end';
+$lang['Apply watermark if width is bigger than'] = 'Tilføj vandmærke hvis bredden er større end';
+$lang['Cancel'] = 'Fortryd';
+$lang['Delete multiple size images'] = 'Slet billeder i flere størrelser';
+$lang['Generate multiple size images'] = 'Generer billeder i flere størrelser';
+$lang['Groups and users'] = 'Grupper og brugere';
+$lang['Languages which need upgrade'] = 'Sprog der skal opdateres';
+$lang['Opacity'] = 'Gennemsigtighed';
+$lang['Permission granted for users'] = 'Adgang tildelt brugere';
+$lang['Permission management'] = 'Adgangsstyring';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo udgivet plugin for Lightroom';
+$lang['Select a file'] = 'Vælg en fil';
+$lang['Select groups...'] = 'Vælg grupper...';
+$lang['Select users...'] = 'Vælg bruger...';
+$lang['The uploaded file was only partially uploaded'] = 'Den uploadede fil blev kun delvist uploadet';
+$lang['There is no group in this gallery.'] = 'Der er ingen grupper i dette galleri';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ADVARSEL! Plugin er ikke kompatibelt med denne version af Piwigo';
+$lang['X Position'] = 'X position';
+$lang['X Repeat'] = 'X gentag';
+$lang['Y Position'] = 'Y position';
+$lang['add a new watermark'] = 'tilføj et nyt vandmærke';
+$lang['any visitor can see this album'] = 'enhver besøgende kan se dette album';
+$lang['bottom left corner'] = 'nederste venstre hjørne';
+$lang['bottom right corner'] = 'nederste højre hjørne';
+$lang['custom'] = 'Speciel';
+$lang['middle'] = 'midt';
+$lang['top left corner'] = 'øverste venstre hjørne';
+$lang['top right corner'] = 'øverste højre hjørne';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['Save manual order'] = 'Gem manuel sortering';
+$lang['Automatic sort order'] = 'Automatisk sorteringsrækkefølge';
+$lang['List'] = 'Liste';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo eksport plugin for Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo eksport plugin for iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['You can activate only one mobile theme.'] = 'Du kan kun aktivere et mobil tema';
+$lang['apply automatic sort order'] = 'aktiver automatisk sorteringsrækkefølge';
+$lang['cancel manual order'] = 'fortryd manuel rækkefølge';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam er et gratis avanceret program for organisering af digitale fotos for Linux, Windows, og MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam er designet for fotografer, der ønsker at se, organisere, redigere, optimere, indeksere og dele fotos.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em> plugin\'et gør det muligt for dig at logge på dit Piwigo galleri fra din iPhone, iPad eller iPod Touch, oprette albums og uploade billeder til galleriet.  ';
+$lang['Applications'] = 'Plugins';
+$lang['Available on'] = 'Tilgængelig den';
+$lang['Available versions for'] = 'Tilgængelige versioner for';
+$lang['Not cropped correctly?'] = 'Ikke beskåret korrekt?';
+$lang['Web Form'] = 'Web formular';
+$lang['You have %d orphan tags: %s.'] = 'Du har %d forældreløse tags: %s';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'besøgende skal logge ind og have de nødvendige tiladelser for at se denne kategori';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Filstørrelsen på den uploadede fil overstiger den aktuelle indstilling MAX_FILE_SIZE ';
+$lang['Multiple Size'] = 'Flere størrelser';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '% u brugere har automatisk tilladelse til, fordi de tilhører en tildelt gruppe.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em> Piwigo for Android </em> program giver dig mulighed for at tilslutte din Android-telefon eller et bord til din Piwigo galleri, skabe nogle albums og uploade flere billeder på én gang.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom er et fotografi software designet til at håndtere store mængder af digitale billeder og laver post production arbejde.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture er et kraftfuldt værktøj til at forfine billeder og administrere store biblioteker på Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture er udviklet til professionelle fotografer med iPhoto enkelhed.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Som standard er centrum af interesse placeret i midten af billedet.';
+$lang['Center of interest'] = 'Interesse center';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funktionerne omfatter galleri browsing, album skabelse og foto upload.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'For fotostørrelser med crop, som "Square", vil Piwigo gøre sit bedste for at inkludere centrum af interesse.';
+$lang['No group is permitted to see this private album'] = 'Ingen gruppe er tilladt at se denne private album';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'På din Linux, installere, bare Shotwell med din pakke manager og Aktivér Piwigo udgivelses mulighed.';
+$lang['Permission granted for groups'] = 'Tilladelse givet til grupper';
+$lang['Photo sizes with crop'] = 'Foto størrelser med crop';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo Udgivet plugin til Shotwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo Udgivet plugin til digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery klient til Android) er en open source (GPL v3) Piwigo klient til Android-platformen.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Vælg en zone med musen for at definere et nyt center af interesse.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell er en open source digital foto organisator, der kører på Linux. Det er standard Photo Manager i Ubuntu og Fedora.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Den Piwigo eksport-plugin tillader dig at oprette albums og eksport fotos.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Det Piwigo Udgivet Plugin giver dig mulighed for at eksportere og synkronisere billeder fra Lightroom direkte til din Piwigo fotogalleri.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Centrum af interesse er den mest meningsfyldte zone i billedet.';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Den uploadede fil overstiger upload_max_filesize directive i php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'en uploadede fil overstiger post_max_size directive i php.ini: %sB';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'For at eksportere dine billeder fra digiKam til Piwigo, skal du blot installere digiKam og KIPI-plugin.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Du kan ikke definere en standard foto rækkefølge, fordi du har en brugerdefineret indstilling i din lokale konfiguration.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Du har angivet <i>$conf[\'order_by\']</i> i din lokale konfigurationsfil, denne parameter i forældet, skal du fjerne den eller omdøbe den til <i>$conf[\'order_by_custom\']</i>!';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto er standard Photo Manager på MacOSX. Den Piwigo eksport-plugin kan du oprette nye album og eksportere dine billeder direkte fra iPhoto til din Piwigo fotogalleri.';
+$lang['include photos with lower privacy level'] = 'omfatter billeder med lavere privatliv niveau';
+?>
Index: tags/2.4.0RC3/language/da_DK/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/da_DK/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/common.lang.php	(revision 14585)
@@ -0,0 +1,408 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Dansk [DK]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=415
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Dansk';
+$lang_info['country'] = 'Danmark';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'da';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d kategori opdateret';
+$lang['%d albums updated'] = '%d kategorier opdateret';
+$lang['%d comment to validate'] = '%d kommentar til validering';
+$lang['%d comments to validate'] = '%d kommentarer til validering';
+$lang['%d new comment'] = '%d ny kommentar';
+$lang['%d new comments'] = '%d nye kommentarer';
+$lang['%d comment'] = '%d kommentar';
+$lang['%d comments'] = '%d kommentarer';
+$lang['%d hit'] = '%d hit';
+$lang['%d hits'] = '%d hits';
+$lang['%d new photo'] = '%d nyt element';
+$lang['%d new photos'] = '%d nye elementer';
+$lang['%d new user'] = '%d ny bruger';
+$lang['%d new users'] = '%d nye brugere';
+$lang['About'] = 'Om';
+$lang['All tags'] = 'Alle tags';
+$lang['Any tag'] = 'Enhver tag';
+$lang['At least one listed rule must be satisfied.'] = 'Mindst en af reglerne skal være opfyldt.';
+$lang['Author'] = 'Fotograf';
+$lang['Albums'] = 'kategorier';
+$lang['Album'] = 'kategori';
+$lang['Close this window'] = 'Luk dette vindue';
+$lang['Complete RSS feed (photos, comments)'] = 'Komplet RSS feed (fotos, kommentarer)';
+$lang['Confirm Password'] = 'Bekræft Password';
+$lang['Connection settings'] = 'Connection indstillinger';
+$lang['Login'] = 'Login';
+$lang['Contact webmaster'] = 'Kontakt webmaster';
+$lang['Create a new account'] = 'Opret en ny konto';
+$lang['Created on'] = 'Taget';
+$lang['Creation date'] = 'Oprettelses dato';
+$lang['Current password is wrong'] = 'Password er forkert';
+$lang['Dimensions'] = 'Dimensioner';
+$lang['Display'] = 'Display';
+$lang['Each listed rule must be satisfied.'] = 'Hver nævnt regel skal være opfyldt.';
+$lang['Email address is missing. Please specify an email address.'] = 'Email addresse mangler';
+$lang['Email address'] = 'Email addresse';
+$lang['Enter your personnal informations'] = 'Udfyld dine personlige informationer';
+$lang['Error sending email'] = 'Fejl email';
+$lang['File name'] = 'Fil navn';
+$lang['File'] = 'Fil';
+$lang['Filesize'] = 'Filstørrelse';
+$lang['Filter and display'] = 'Filter og vis';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Glemt dit password?';
+$lang['Go through the gallery as a visitor'] = 'Kig i galleriet som gæst';
+$lang['Help'] = 'Hjælp';
+$lang['Identification'] = 'Identifikation';
+$lang['Photos only RSS feed'] = 'Kun foto RSS feed';
+$lang['Keyword'] = 'Nøgleord';
+$lang['Links'] = 'Links';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Ny på %s';
+$lang['Notification'] = 'RSS feed';
+$lang['Number of items'] = 'Antal af fotos';
+$lang['Original dimensions'] = 'Originale dimensionser';
+$lang['Password forgotten'] = 'Glemt password';
+$lang['Password'] = 'Password';
+$lang['Post date'] = 'Oprettelses dato';
+$lang['Posted on'] = 'Oprettet';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Quick connect';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Register'] = 'Registrer';
+$lang['Registration'] = 'Registrering';
+$lang['Related tags'] = 'Relaterede tags';
+$lang['Reset'] = 'Reset';
+$lang['Retrieve password'] = 'Modtag password';
+$lang['Search rules'] = 'søge kriterier';
+$lang['Search tags'] = 'søg tags';
+$lang['Search'] = 'Søg';
+$lang['display available tags'] = 'vis tilgængelige tags';
+$lang['Since'] = 'Siden';
+$lang['Sort by'] = 'Sorter ';
+$lang['Sort order'] = 'Sorterings rækkefølge';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tags';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS feed giver besked om nyheder fra denne side : nye fotos, opdaterede kategorier, nye kommentarer. Brug em RSS læser.';
+$lang['Unknown feed identifier'] = 'Ukendt feed identifikation';
+$lang['User comments'] = 'Bruger kommentarer';
+$lang['Username'] = 'Brugernavn';
+$lang['Visits'] = 'Besøg';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Uge %d';
+$lang['About Piwigo'] = 'Om Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Du har ikke tilladelse til at besøge denne side';
+$lang['add this photo to your favorites'] = 'tilføj dette foto til dine favoritter';
+$lang['Administration'] = 'Administration';
+$lang['all'] = 'alle';
+$lang['ascending'] = 'venter';
+$lang['author(s) : %s'] = 'forfatter(e) : %s';
+$lang['Expand all albums'] = 'Udvid alle kategorier';
+$lang['posted after %s (%s)'] = 'posted efter %s (%s)';
+$lang['posted before %s (%s)'] = 'posted før %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'posted mellem %s (%s) og %s (%s)';
+$lang['posted on %s'] = 'Oprettet %s';
+$lang['Best rated'] = 'Bedst bedømte';
+$lang['display best rated photos'] = 'vis bedste bedømte fotos';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Alle';
+$lang['display each day with photos, month per month'] = 'vis alle dage med fotos, månedsvis';
+$lang['View'] = 'Vis';
+$lang['chronology_monthly_calendar'] = 'Månedlig Kalender';
+$lang['chronology_monthly_list'] = 'Månedlig liste';
+$lang['chronology_weekly_list'] = 'Ugentlig liste';
+$lang['Click here if your browser does not automatically forward you'] = 'Klik her hvis din browser ikke automatisk sender dig videre';
+$lang['comment date'] = 'kommentar dato';
+$lang['Comment'] = 'Kommentar';
+$lang['Your comment has been registered'] = 'Din kommentar er registreret';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood system : Vent et øjeblik før du prøver at oprette en kommentar mere';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Din kommentar er ikke blevet registreret, fordi den ikke opfyldte valideringsreglerne';
+$lang['An administrator must authorize your comment before it is visible.'] = 'En administrator skal godkende din kommentar, før den er synlig.';
+$lang['This login is already used by another user'] = 'Dette login anvendes allerede af en anden bruger';
+$lang['Comments'] = 'Kommentarer';
+$lang['Add a comment'] = 'Tilføj en kommentar';
+$lang['created after %s (%s)'] = 'oprettet efter %s (%s)';
+$lang['created before %s (%s)'] = 'oprettet før %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'oprettet mellem %s (%s) og %s (%s)';
+$lang['created on %s'] = 'oprettet den %s';
+$lang['Customize'] = 'Tilpas';
+$lang['Your Gallery Customization'] = 'Din Galleri tilpasning ';
+$lang['day'][0] = 'Søndag';
+$lang['day'][1] = 'Manday';
+$lang['day'][2] = 'Tirsdag';
+$lang['day'][3] = 'Onsdag';
+$lang['day'][4] = 'Torsdag';
+$lang['day'][5] = 'Fredag';
+$lang['day'][6] = 'Lørdag';
+$lang['Default'] = 'Standard';
+$lang['delete this photo from your favorites'] = 'slet dette foto fra dine favoritter';
+$lang['Delete'] = 'Slet';
+$lang['descending'] = 'faldende';
+$lang['Download'] = 'Download';
+$lang['Download this file'] = 'download denne fil';
+$lang['edit'] = 'rediger';
+$lang['wrong date'] = 'forkert dato';
+$lang['excluded'] = 'udelukket';
+$lang['Your favorites'] = 'Dine favoritter';
+$lang['display your favorites photos'] = 'Vis mine favorit fotos';
+$lang['Favorites'] = 'Favoritter';
+$lang['First'] = 'Første';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleriet er lukket pga. vedligeholdelse. Kom tilbage senere.';
+$lang['Page generated in'] = 'Siden er genereret på';
+$lang['guest'] = 'gæst';
+$lang['Hello'] = 'Hej';
+$lang['available for administrators only'] = 'kun tilgængelig for administrator';
+$lang['display this album'] = 'viser billeder til grund for denne kategori';
+$lang['display last user comments'] = 'Se sidste brugers kommentarer';
+$lang['customize the appareance of the gallery'] = 'tilpas visningen af dette galleri';
+$lang['search'] = 'søg';
+$lang['Home'] = 'Hjem';
+$lang['Identification'] = 'Identifikation';
+$lang['in this album'] = 'i denne kategori';
+$lang['in %d sub-album'] = 'i %d sub-kategori';
+$lang['in %d sub-albums'] = 'i %d sub-kategorier';
+$lang['included'] = 'inkuderet';
+$lang['Invalid password!'] = 'Forkert password!';
+$lang['Language']='Sprog';
+$lang['last %d days'] = 'sidste %d dage';
+$lang['Last'] = 'Sidste';
+$lang['Logout'] = 'Logout';
+$lang['obligatory'] = 'obligatorisk';
+$lang['Maximum photo height'] = 'Maksimum højde på fotos';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimum højde skal være højere end 50';
+$lang['Maximum photo width'] = 'Maksimum bredde på fotos';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimum bredde skal være højere end 50';
+$lang['display a calendar by creation date'] = 'viser en kalender med datoer for optagelse';
+$lang['display all photos in all sub-albums'] = 'viser alle elementer i alle sub-kategorier';
+$lang['return to normal view mode'] = 'tilbage til normal visning';
+$lang['display a calendar by posted date'] = 'viser en kalender med datoer for upload';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'December';
+$lang['month'][1] = 'Januar';
+$lang['month'][2] = 'Februar';
+$lang['month'][3] = 'Marts';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Maj';
+$lang['month'][6] = 'Juni';
+$lang['month'][7] = 'Juli';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['Most visited'] = 'Mest sete';
+$lang['display most visited photos'] = 'vis mest sete fotos';
+$lang['The number of photos per page must be a not null scalar'] = 'Antallet af fotos pr. side må ikke være nul';
+$lang['Number of photos per page'] = 'antallet af fotos pr. side';
+$lang['Unknown identifier'] = 'Ukendt identifikation';
+$lang['New password'] = 'Nyt password';
+$lang['Rate this photo'] = 'Bedøm dette foto';
+$lang['Next'] = 'Næste';
+$lang['no rate'] = 'ingen bedømmelse';
+$lang['Photos posted within the last %d day.'] = 'Elementer oprettet indenfor de %d dage.';
+$lang['Photos posted within the last %d days.'] = 'Elementer oprettet indenfor de %d dage.';
+$lang['password updated'] = 'password opdateret';
+$lang['Recent period must be a positive integer value'] = 'Seneste periode skal være et positivt heltal værdi';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'foto';
+$lang['Click on the photo to see it in high definition'] = 'klik på fotoet for at se det i høj opløsning';
+$lang['Show file metadata'] = 'Vis fotoets metadata';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Præferencer';
+$lang['Previous'] = 'Tidligere';
+$lang['Random photos'] = 'Tilfældig foto';
+$lang['display a set of random photos'] = 'Vis et sæt af tilfældigt valgte fotos';
+$lang['Recent albums'] = 'Nye kategorier';
+$lang['display recently updated albums'] = 'Vis nyopdaterede kategorier';
+$lang['Recent period'] = 'Sidste periode';
+$lang['Recent photos'] = 'Nye fotos';
+$lang['display most recent photos'] = 'vis de nyeste fotos';
+$lang['Redirection...'] = 'Omdirigering...';
+$lang['Please, enter a login'] = 'Indtast login';
+$lang['login mustn\'t end with a space character'] = 'login må ikke starte med mellemrum';
+$lang['login mustn\'t start with a space character'] = 'login må ikke starte med mellemrum';
+$lang['this login is already used'] = 'Dette login er allerede i brug';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse skal være xxx@yyy.eee (eksempel : jack@altern.org)';
+$lang['please enter your password again'] = 'Indtast dit password igen';
+$lang['Auto login'] = 'Auto login';
+$lang['remove this tag from the list'] = 'fjern dette tag fra denne liste';
+$lang['representative'] = 'repræsentativ';
+$lang['Search for Author'] = 'søg for Author';
+$lang['Search in albums'] = 'søg i album';
+$lang['Search by date'] = 'søg efter dato';
+$lang['Date'] = 'Dato';
+$lang['End-Date'] = 'Slut-Dato';
+$lang['Kind of date'] = 'Enhver dato';
+$lang['Search for words'] = 'søg efter ord';
+$lang['Search for all terms'] = 'søg efter alle ';
+$lang['Search for any term'] = 'søg efter alle';
+$lang['Empty query. No criteria has been entered.'] = 'Tom forespørgsel. Ingen kriterier er indtastet.';
+$lang['Search results'] = 'søge resulter';
+$lang['Search in sub-albums'] = 'søg i under-album';
+$lang['searched words : %s'] = 'søgte ord : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'set as kategori representative';
+$lang['Show number of comments'] = 'Vis antallet af kommentarer';
+$lang['Show number of hits'] = 'Vis antallet hits';
+$lang['slideshow'] = 'slideshow';
+$lang['stop the slideshow'] = 'stop slideshow';
+$lang['Specials'] = 'Specielle';
+$lang['SQL queries in'] = 'SQL queries in';
+$lang['display only recently posted photos'] = 'viser kun nye fotos';
+$lang['return to the display of all photos'] = 'tilbage til alle fotos';
+$lang['the beginning'] = 'starten';
+$lang['Interface theme'] = 'Interface thema';
+$lang['Thumbnails'] = 'Thumbnails';
+$lang['Menu'] = 'Menu';
+$lang['A comment on your site'] = 'En kommentar på din side';
+$lang['today'] = 'i dag';
+$lang['Update your rating'] = 'Opdater din bedømmelse';
+$lang['the username must be given'] = 'brugernavn skal være angivet';
+$lang['useful when password forgotten'] = 'nyttigt ved glemt password';
+$lang['Quick search'] = 'Hurtig søg';
+$lang['Connected user: %s'] = 'Tilsluttet bruger: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Browser: %s';
+$lang['Author: %s'] = 'Forfatter: %s';
+$lang['Comment: %s'] = 'Kommentar: %s';
+$lang['Comment by %s'] = 'Kommentar af %s';
+$lang['User: %s'] = 'Bruger: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Registrering af %s';
+$lang['Album: %s'] = 'kategori: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Forket status for gæste bruger. Kontakt webmaster.';
+$lang['this email address is already in use'] = 'email adressen anvendes af en anden bruger';
+$lang['Album results for'] = 'kategori resultater for';
+$lang['Tag results for'] = 'Tag resulter for';
+$lang['from %s to %s'] = 'fra %s til %s';
+$lang['Play of slideshow'] = 'Afspil slideshow';
+$lang['Pause of slideshow'] = 'Pause slideshow';
+$lang['Repeat the slideshow'] = 'Gentag slideshow';
+$lang['Not repeat the slideshow'] = 'Gentag ikke slideshow';
+$lang['Reduce diaporama speed'] = 'nedsæt slideshow hastighed';
+$lang['Accelerate diaporama speed'] = 'Forøg slideshow hastighed';
+$lang['Submit'] = 'Send';
+$lang['Yes'] = 'Ja';
+$lang['No'] = 'Nej';
+$lang['%d photo']='%d foto';
+$lang['%d photos']='%d fotos';
+$lang['%d photo is also linked to current tags'] = '%d foto er også linked til disse tags';
+$lang['%d photos are also linked to current tags'] = '%d fotos er også linked til disse tags';
+$lang['display photos linked to this tag'] = 'Se fotos linked kun til dette tag';
+$lang['photos posted during the last %d days'] = 'fotos oprettet de sidste %d dage';
+$lang['Piwigo Help'] = 'Piwigo Hjælp';
+$lang['Rank'] = 'Rank';
+$lang['group by letters'] = 'alfabetiske grupper';
+$lang['letters'] = 'bogstaver';
+$lang['show tag cloud'] = 'vis tag cloud';
+$lang['cloud'] = 'sky';
+$lang['Reset to default values'] = 'Reset til standard';
+$lang['delete all photos from your favorites'] = 'slet alle filer fra dine favoritter';
+$lang['Sent by'] = 'Sent af';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies er blokkeret eller ikke supporteret af din browser. Aktiver cookies for at logge på.';
+$lang['Edit a comment'] = 'Rediger en kommentar';
+$lang['Are you sure?'] = 'Er du sikker?';
+$lang['(!) This comment requires validation'] = '(!) Denne kommentar kræver godkendelse';
+$lang['Welcome'] = 'Velkommen';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Velkommen til dit Piwigo foto galleri!';
+$lang['... or browse your empty gallery'] = '... eller browse i dit tomme galleri';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eller deaktiver denne meddelelseor, jeg klarer det selv';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %s, dit Piwigo foto galleri er tomt!';
+$lang['I want to add photos'] = 'Jeg vil tilføje fotos';
+$lang['Manage this user comment: %s'] = 'Håndter denne bruger kommentar: %s';
+$lang['This author modified following comment:'] = 'Denne forfatter har ændret følgende kommentar:';
+$lang['This author removed the comment with id %d'] = 'Denne forfatter har fjernet denne kommentar med id %d';
+$lang['html tags are not allowed in login'] = 'html tags er ikke tilladt i login';
+$lang['%d rates'] = '%d rates';
+$lang['Rating score'] = 'Rating score';
+$lang['Invalid username or email'] = 'Forkert brugernavn eller email';
+$lang['Password reset is not allowed for this user'] = 'Password reset er ikke tilladt for denne bruger';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Bruger "%s" har ingen email adresse, nulstilling af password er ikke muligt';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Nogen har anmodet om at resette passwordet til den følgende brugerkonto:';
+$lang['Username "%s" on gallery %s'] = 'Brugernavn "%s" i galleri %s';
+$lang['To reset your password, visit the following address:'] = 'For at nulstille dit password, besøg følgende adresse:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Hvis dette var en fejl, ignorer denne email og der vil ikke ske noget.';
+$lang['Password Reset'] = 'Password Reset';
+$lang['Check your email for the confirmation link'] = 'Check din email for bekræftigelses link';
+$lang['Invalid key'] = 'Invalid key';
+$lang['The passwords do not match'] = 'Passwordet matcher ikke';
+$lang['Your password has been reset'] = 'Dit password er resat';
+$lang['Return to home page'] = 'Retur til forsiden';
+$lang['Please enter your username or email address.'] = 'Indtast dit brugernavn eller email adresse.';
+$lang['You will receive a link to create a new password via email.'] = 'Du vil modtage et link i din email for at danne et nyt password.';
+$lang['Username or email'] = 'Brugernavn eller email';
+$lang['Change my password'] = 'Skift mit password';
+$lang['Enter your new password below.'] = 'Indtast dit nye password herunder.';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Edit'] = 'Edit';
+$lang['Hello %s,'] = 'Hej %s,';
+$lang['Send my connection settings by email'] = 'Send mine instillinger med email';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Du er registreret, du vil snart modtage en mail med dine informationer. Velkommen!';
+$lang['Username modification'] = 'Ændring af brugernavn';
+$lang['Your username has been successfully changed to : %s'] = 'Dit brugernavn er ændret til: %s';
+$lang['square'] = 'Kvadrat';
+$lang['thumb'] = 'Thumbnail';
+$lang['small'] = 'S-Small';
+$lang['medium'] = 'M-Medium';
+$lang['large'] = 'L-Large';
+$lang['xlarge'] = 'XL-XLarge';
+$lang['xxlarge'] = 'XXL-XXLarge';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Tak for din registrering hos %s!';
+$lang['Here are your connection settings'] = 'Her er dine login informationer';
+$lang['Password: %s'] = 'Password: %s';
+$lang['Username: %s'] = 'Brugernavn: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Hvis du tror du har modtaget denne email ved en fejl kontakt os på %s';
+$lang['Show oldest comments first'] = 'Vis ældste kommentarer først';
+$lang['Show latest comments first'] = 'Vis sidste kommnetarer først';
+$lang['Photo sizes'] = 'Foto størrelser';
+$lang['View in'] = 'Vis i';
+$lang['Mobile'] = 'Mobil';
+$lang['Desktop'] = 'Desktop';
+$lang['2small'] = 'XXS-meget lille';
+$lang['xsmall'] = 'XS-ekstra lille';
+$lang['File name, A &rarr; Z'] = 'Fil navn, A &rarr; Z'; 
+$lang['File name, Z &rarr; A'] = 'Fil navn, Z &rarr; A'; 
+$lang['Photo title, A &rarr; Z'] = 'Foto titel, A &rarr; Z'; 
+$lang['Photo title, Z &rarr; A'] = 'Foto titel, Z &rarr; A'; 
+$lang['Date created, new &rarr; old'] = 'Dato oprettet, ny &rarr; gammel'; 
+$lang['Date created, old &rarr; new'] = 'Dato oprettet, gammel &rarr; ny'; 
+$lang['Date posted, new &rarr; old'] = 'Dato posted, ny &rarr; gammel'; 
+$lang['Date posted, old &rarr; new'] = 'Dato posted, gammel &rarr; ny'; 
+$lang['Rating score, high &rarr; low'] = 'bedømmelse score, høj &rarr; lav';
+$lang['Rating score, low &rarr; high'] = 'bedømmelse score, lav &rarr; høj';
+$lang['Visits, high &rarr; low'] = 'Besøgende, høj &rarr; lav'; 
+$lang['Visits, low &rarr; high'] = 'Besøgende, lav &rarr; høj'; 
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numerisk identifikation, 1 &rarr; 9'; 
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numerisk identifikation, 9 &rarr; 1'; 
+$lang['Manual sort order'] = 'Manuel sorterings orden';
+
+?>
Index: tags/2.4.0RC3/language/da_DK/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/da_DK/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Flyt virtuelle albums</h2>
+
+<p>Kun virtuelle albums kan have et nyt for&aelig;ldre album.</p>
+
+<h3>Virtuelle albums som &oslash;nskes flyttet</h3>
+
+<p>V&aelig;lg et eller flere virtuelle albums du &oslash;nsker at flytte. 
+Hvis listen er tom, betyder det at du ikke har oprettet nogen endnu.</p>
+
+<h3>Nyt for&aelig;ldre album</h3>
+
+<p>V&aelig;lg det nye for&aelig;ldre album (virtuelt eller fysisk). 
+If you do not select any parent, the virtual selected albums will be moved to the root.
+A album cannot be moved into itself or to one of its child.</p>
Index: tags/2.4.0RC3/language/da_DK/index.php
===================================================================
--- tags/2.4.0RC3/language/da_DK/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/da_DK/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/da_DK/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Installation';
+$lang['Basic configuration'] = 'Basic konfiguration';
+$lang['Default gallery language'] = 'Default galleri sprog';
+$lang['Database configuration'] = 'Database konfiguration';
+$lang['Admin configuration'] = 'Admin konfiguration';
+$lang['Start Install'] = 'Start Installation';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse skal være som xxx@yyy.eee (example : jack@altern.org)';
+$lang['Webmaster login'] = 'Webmaster login';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det vil blive vist til de besøgende. Det er nødvendigt for website administration';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Forbindelse til server oprettet, men det var ikke muligt at forbinde til databasen';
+$lang['Can\'t connect to server'] = 'Kan ikke forbinde til serveren';
+$lang['Host'] = 'MySQL host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Bruger';
+$lang['user login given by your host provider'] = 'bruger login som du har fra din udbyder';
+$lang['Password'] = 'Password';
+$lang['user password given by your host provider'] = 'bruger password som du har fra din udbyder';
+$lang['Database name'] = 'Database navn';
+$lang['also given by your host provider'] = 'som du også har fået af din udbyder';
+$lang['Database table prefix'] = 'Database tabel prefix';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'database tabel navne vil være forvalgt (giver dig bedre mulighed for at administrere tabellerne)';
+$lang['enter a login for webmaster'] = 'indtast et login  webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'webmaster login må ikke indeholde karakterernecan \' or "';
+$lang['please enter your password again'] = 'indtast dit password igen';
+$lang['Webmaster password'] = 'Webmaster password';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Hold det hemmeligt, det giver dig adgang til administrations panelet.';
+$lang['Password [confirm]'] = 'Password [bekræft]';
+$lang['verification'] = 'bekræftelse';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Hjælp ? Stil dine spørgsmål på <a href="%s">Piwigo message board</a>.';
+$lang['Webmaster mail address'] = 'Webmaster mail addresse';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Besøgende vil have mulighed for at kontakte administratoren med denne mail';
+$lang['PHP 5 is required'] = 'PHP 5 er nødvendig';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Din webhost har PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan prøve at skifte din konfiguration til PHP 5 ved at oprette eller ændre en. htaccess fil.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Bemærk at du kan ændre din konfiguration selv og derefter genstarte Piwigo.';
+$lang['Try to configure PHP 5'] = 'Prøv at konfigurere PHP 5';
+$lang['Sorry!'] = 'Hov!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo var ikke istand til af konfigurere PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Du henvises til din webhost for at se hvordan du selv kan skifte til PHP 5.";
+$lang['Hope to see you back soon.'] = 'Håber snart at se dig igen.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Tillykke, Piwigo installationen er slut';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'En alternativ måde er at kopiere teksten i boksen ovenover og sætte den ind i filen "local/config/database.inc.php" (Advarsel : database.inc.php må kun indeholde hvad der er i tekstfeltet, ingen linieskift eller andet.)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Oprettelsen af local/config/database.inc.php gik galt.';
+$lang['Download the config file'] = 'Download config filen';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan downloade config filen og uploade den til local/config i din installation.';
+$lang['Just another Piwigo gallery'] = 'Bare et andet Piwigo galleri';
+$lang['Welcome to my photo gallery'] = 'Velkommen til mit photo galleri';
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Husk at besøge vores forum for hjælp til Piwigo: %s';
+$lang['Welcome to your new installation of Piwigo!'] = 'Velkommen til din nye Piwigo installation';
+?>
Index: tags/2.4.0RC3/language/da_DK/iso.txt
===================================================================
--- tags/2.4.0RC3/language/da_DK/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Dansk [DK]
Index: tags/2.4.0RC3/language/da_DK/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/da_DK/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/da_DK/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Opgrader';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Denne side foreslår at opgradere databasen fra din gamle version af Piwigo til den nye version. Opgraderingsassistenten tror du burger en<strong>release %s</strong> (or equivalent).';
+$lang['Upgrade from version %s to %s'] = 'Opgrader fra version %s til %s';
+$lang['Statistics'] = 'Statistik';
+$lang['total upgrade time'] = 'total opgraderings tid';
+$lang['total SQL time'] = 'total SQL tid';
+$lang['SQL queries'] = 'SQL queries';
+$lang['Upgrade informations'] = 'Opgraderings information';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Udfør et vedligeholdelsescheck I [Administration>Tools>Maintenance] hvis du oplever problemer.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'For en sikkerheds skyld er følgende plugins blevet deaktiveret. Check dine plugins opgraderinger før du reaktiverer dem:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Kun en administrator kan lave en opgradering: Login in herunder.';
+$lang['You do not have access rights to run upgrade'] = 'Du har ikke adgangsrettighed til at køre en opgradering';
+$lang['All sub-albums of private albums become private'] = 'Alle under-kategorier af private kategorier bliver private';
+$lang['User permissions and group permissions have been erased'] = 'Bruger og gruppe tilladelser er blevet slettet';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Kun  thumbnails prefix og webmaster mail addresse er blevet gemt fra tidligere konfiguration. ';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'I <i>%s</i>, før <b>?></b>, indsæt:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Som en forholdsregel er følgende temaer blevet deaktiveret. Check for tema opgraderinger før du reaktiverer dem:';
+?>
Index: tags/2.4.0RC3/language/de_DE/about.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/about.html	(revision 14585)
@@ -0,0 +1,24 @@
+<p>Diese Fotogalerie basiert auf Piwigo.</p>
+
+<p>Piwigo ist eine Fotogaleriesoftware für das Internet, programmiert und
+entwickelt von einer aktiven Gemeinschaft aus Nutzern und Entwicklern.
+Extensionen (Erweiterungen) machen die Piwigo leicht anpassbar an die
+persönlichen Bedürfnisse. Das Sahnehäubchen auf dem Eis: Piwigo ist frei und
+Opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://de.piwigo.org">Besuchen Sie die Piwigo
+Webseite</a></p>
+
+<p>Die deutsche Übersetzung wird gepflegt von (in alphabetischer Reihenfolge):
+
+	<ul>
+		<li><a href="http://de.piwigo.org/forum/profile.php?id=4722">duke</a></li>
+		<li><a href="http://de.piwigo.org/forum/profile.php?id=2664">el ninjo</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=14037">fs101299</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=15244">Joergen</a></li>
+		<li><a href="http://de.piwigo.org/forum/profile.php?id=1106">Eric</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?section=essentials&id=16553">MigroMundus</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?section=essentials&id=5918">Polly</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?section=essentials&id=5628">Sugar888</a></li>
+	</ul>
+           .... herzlichen Dank an Sie</p>
Index: tags/2.4.0RC3/language/de_DE/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/admin.lang.php	(revision 14585)
@@ -0,0 +1,901 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d Element wird insgesamt angezeigt (physisch und virtuell)';
+$lang['%d associations'] = '%d Elemente werden insgesamt angezeigt (physisch und virtuell)';
+$lang['%d album including'] = '%d Album inbegriffen, ';
+$lang['%d albums including'] = '%d Alben inbegriffen, ';
+$lang['%d physical'] = 'davon %d physisch';
+$lang['%d physical'] = 'davon %d physische';
+$lang[' and %d virtual'] = ' und %d virtuell';
+$lang[' and %d virtual'] = ' und %d virtuelle';
+$lang['%d album moved'] = '%d Album verschoben';
+$lang['%d albums moved'] = '%d Alben verschoben';
+$lang['%d group'] = '%d Gruppe';
+$lang['%d groups'] = '%d Gruppe';
+$lang['%d member'] = '%d Mitglied';
+$lang['%d members'] = '%d Mitglieder';
+$lang['%d tag'] = '%d Stichwort';
+$lang['%d tags'] = '%d Stichworte';
+$lang['%d user comment rejected'] = '%d Benutzerkommentar abgewiesen';
+$lang['%d user comments rejected'] = '%d Benutzerkommentare abgewiesen';
+$lang['%d user comment validated'] = '%d Benutzerkommentar freigeschaltet';
+$lang['%d user comments validated'] = '%d Benutzerkommentare freigeschaltet';
+$lang['%d user deleted'] = '%d Benutzer gelöscht';
+$lang['%d users deleted'] = '%d Benutzer gelöscht';
+$lang['%d user'] = '%d Benutzer';
+$lang['%d users'] = '%d Benutzer';
+$lang['%d waiting for validation'] = '%d warten auf Freischaltung';
+$lang['Actions'] = 'Aktionen';
+$lang['Activate'] = 'Aktiviere';
+$lang['Add/delete a permalink'] = 'Hinzufügen/Löschen eines Permalinks';
+$lang['Add a tag'] = 'Stichwort hinzufügen';
+$lang['Add a user'] = 'Benutzer hinzufügen';
+$lang['Add group'] = 'Gruppe hinzufügen';
+$lang['Add to caddie'] = 'In den Sammelkorb';
+$lang['Add'] = 'Hinzufügen';
+$lang['Allow user registration'] = 'Erlaube die Neuregistrierung von Benutzern';
+$lang['Apply to sub-albums'] = 'Einstellungen auch für Unteralben übernehmen';
+$lang['Associated'] = 'ist verlinkt';
+$lang['Caddie management'] = 'Sammelkorb verwalten';
+$lang['Caddie'] = 'Sammelkorb';
+$lang['Albums authorized thanks to group associations'] = 'Für Alben freigeschaltet durch Gruppenzugehörigkeit';
+$lang['Album manual order was saved'] = 'Albumreihenfolgen wurde gespeichert';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Suche nach einem Upgrade nicht möglich.';
+$lang['Check for upgrade'] = 'Prüfe ob eine neue Version der Bildergalerie verfügbar ist.';
+$lang['Comments for all'] = 'Kommentare für alle erlaubt';
+$lang['Current name'] = 'Derzeitiger Name';
+$lang['Database'] = 'Datenbank';
+$lang['Deactivate'] = 'Deaktivieren';
+$lang['Delete Representant'] = 'Lösche Vorschaubild';
+$lang['Delete selected tags'] = 'Lösche markierte Stichworte';
+$lang['Delete selected users'] = 'Lösche markierte Benutzer';
+$lang['Deletions'] = 'Löschung';
+$lang['Deny selected groups'] = 'Ausgewählte Gruppen ablehnen';
+$lang['Deny selected users'] = 'Ausgewählte Benutzer ablehnen';
+$lang['Description'] = 'Beschreibung';
+$lang['Display options'] = 'Anzeigeeinstellungen';
+$lang['Dissociated'] = 'ist nicht verlinkt';
+$lang['Does not represent'] = 'Ist nicht Vorschaubild für dieses Album';
+$lang['Edit selected tags'] = 'Bearbeite markierte Stichworte';
+$lang['Edit tags'] = 'Bearbeite Stichworte';
+$lang['Email admins when a new user registers'] = 'sende eine Email an den(die) Adminstrator(en) wenn sich ein neuer Benutzer registriert hat';
+$lang['Email admins when a valid comment is entered'] = 'sende eine Email an den(die) Adminstrator(en) wenn ein Kommentar hinterlassen wurde';
+$lang['Email admins when a comment requires validation'] = 'sende eine Email an den(die) Adminstrator(en) wenn ein Kommentar die Freischaltung durch den Admin erfordert';
+$lang['Environment'] = 'Server-Daten';
+$lang['Form'] = 'Formular';
+$lang['Gallery title'] = 'Galerietitel';
+$lang['Grant selected groups'] = 'Ausgewählte Gruppen zulassen';
+$lang['Grant selected users'] = 'Ausgewählte Benutzer zulassen';
+$lang['Group name'] = 'Gruppenname';
+$lang['Groups'] = 'Gruppen';
+$lang['Guests'] = 'Gäste';
+$lang['History'] = 'Statistik';
+$lang['Informations'] = 'Kategorieinformation';
+$lang['Install'] = 'Installiere';
+$lang['Link all album photos to a new album'] = 'Verbinde alle Album Elemente mit einem neuen Album';
+$lang['Link all album photos to some existing albums'] = 'Verbinde alle Album Elemente mit einem existierenden Album';
+$lang['Linked albums'] = 'Verlinktes Album';
+$lang['Lock gallery'] = 'Blockiere den Zugriff auf die Datenbank';
+$lang['Maintenance'] = 'Wartung';
+$lang['Edit album permissions'] = 'Zugriffsrechte für ein privates Album verwalten';
+$lang['Manage permissions for group "%s"'] = 'Verwalte die Zugriffsrechte auf private Alben für die Gruppe "%s"';
+$lang['Manage permissions for user "%s"'] = 'Verwalte die Zugriffsrechte auf private Alben für den Benutzer "%s"';
+$lang['Manage tags'] = 'Verwalte Stichworte';
+$lang['Members'] = 'Mitglieder';
+$lang['Metadata synchronized from file'] = 'Metadaten synchronisiert von Datei';
+$lang['Move albums'] = 'Die Alben verschieben';
+$lang['Move'] = 'Bewege';
+$lang['Name'] = 'Name';
+$lang['New name'] = 'Neuer Name';
+$lang['New parent album'] = 'Neues übergeordnetes Album';
+$lang['New tag'] = 'Neues Stichwort';
+$lang['Number of comments per page'] = 'Anzahl von Kommentaren pro Seite';
+$lang['Number of rates'] = 'Anzahl von Bewertungen';
+$lang['Number of thumbnails to create'] = 'Anzahl von zu erstellenden Vorschaubildern';
+$lang['Only private albums are listed'] = 'Nur als "privat" markierte Alben werden aufgelistet.';
+$lang['Operating system'] = 'Betriebssystem';
+$lang['Options'] = 'Optionen';
+$lang['Other private albums'] = 'Weitere private Alben';
+$lang['Page banner'] = 'Seitenbanner';
+$lang['Parent album'] = 'Übergeordnetes Album';
+$lang['Path'] = 'Pfad';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s wurde vorher dem Album %s zugewiesen. Lösche ihn zuerst aus der History';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Ein Permalink darf nur aus folgenden Zeichen bestehen: a-z, A-Z, 0-9, "-" or "_". Er darf nicht nur aus Zahlen bestehen oder mit einer Zahl beginnen mit einem darauffolgenden "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s wird zurzeit vom Album %s benutzt';
+$lang['Permalink history'] = 'Permalink-Historie';
+$lang['Permalinks'] = 'Permalinks';
+$lang['Permission denied'] = 'Zugriff verweigert';
+$lang['Permission granted thanks to a group'] = 'Benutzern durch Zugehörigkeit in einer Gruppe ist der Zugriff erlaubt';
+$lang['Permission granted'] = 'Zugriff erlaubt';
+$lang['Photo informations updated'] = 'Fotoinformationen aktualisiert';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Position';
+$lang['Preferences'] = 'Einstellungen';
+$lang['Properties'] = 'Eigenschaften';
+$lang['Random photo'] = 'Zufälliges Foto';
+$lang['Rate date'] = 'Bewertungsdatum';
+$lang['Rating by guests'] = 'Erlaube Bewertung(en) durch Gäste';
+$lang['Rating'] = 'Bewertungen';
+$lang['Reject'] = 'abweisen';
+$lang['Representant'] = 'Vorschaubild';
+$lang['Representation of albums'] = 'Galerievorschaubild';
+$lang['Representative'] = 'Vorschaubild';
+$lang['Represents'] = 'Ist Vorschaubild für diese Kategorien';
+$lang['Save order'] = 'Reihenfolge speichern';
+$lang['Save to permalink history'] = 'Speichere in der Permalink-Historie';
+$lang['Select at least one album'] = 'Mindestens ein Album auswählen';
+$lang['Select at least one photo'] = 'Wähle mindestens ein Fhoto';
+$lang['Select at least one user'] = 'Mindestens einen Benutzer auswählen';
+$lang['Show info'] = 'Info anzeigen';
+$lang['Site manager'] = 'Seitenmanager';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statistik';
+$lang['Storage album'] = 'Speicherort des Albums';
+$lang['Sum of rates'] = 'Summe der Bewertungen';
+$lang['Tag "%s" already exists'] = 'Stichwort "%s" existiert bereits';
+$lang['Tag "%s" was added'] = 'Stichwort "%s" wurde hinzugefügt';
+$lang['Tag selection'] = 'Stichwortauswahl';
+$lang['The %d following tags were deleted'] = 'Die %d folgenden Stichworte werden gelöscht :';
+$lang['Unable to check for upgrade.'] = 'Update-Prüfung ist nicht möglich.';
+$lang['Uninstall'] = 'Deinstallieren';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Nutze die Standard-Sortierreihenfolge (Definiert in der Konfigurationsdatei)';
+$lang['User comments validation'] = 'Kommentare warten auf Freigabe';
+$lang['Users'] = 'Benutzer';
+$lang['Validate'] = 'Freigeben';
+$lang['Validation'] = 'Freigabe der Kommentare durch den Administrator';
+$lang['Version'] = 'Version';
+$lang['Virtual albums to move'] = 'Wähle einen oder mehrere Virtuelle Alben aus um sie zu verschieben';
+$lang['Virtual album name'] = 'Virtueller Albumname';
+$lang['Webmaster cannot be deleted'] = 'Webmaster kann nicht gelöscht werden';
+$lang['You are running on development sources, no check possible.'] = 'Sie benutzen eine Entwicklerversion von Piwigo, es kann keine Suche nach Aktualisierungen vorgenommen werden.';
+$lang['You cannot delete your account'] = "Du kannst deinen eigenen Acount nicht löschen";
+$lang['You cannot move an album in its own sub album'] = 'Sie können ein Album nicht in seinem eigenen Sub-Album verschieben.';
+$lang['You need to confirm deletion'] = 'Löschen bitte bestätigen';
+$lang['Associate to album'] = 'Mit einem Album verbinden';
+$lang['associate to group'] = 'Mit Gruppe verbinden';
+$lang['Authorized'] = 'Zugriff erlaubt';
+$lang['Add a virtual album'] = 'Virtuelles Album hinzufügen';
+$lang['Authorize users to add comments on selected albums'] = 'Benutzern erlauben, in ausgewählten Alben Kommentare zu schreiben';
+$lang['The name of an album must not be empty'] = 'Der Name eines Albums darf nicht leer sein.';
+$lang['Lock albums'] = 'Alben sperren';
+$lang['Private'] = 'Privat';
+$lang['Public'] = 'Öffentlich';
+$lang['Find a new representant by random'] = 'Bestimme ein neues zufälliges Vorschaubild';
+$lang['Public / Private'] = 'Öffentlich / Privat';
+$lang['Manage authorizations for selected albums'] = 'Zugriffsrechte durch private Alben verwalten';
+$lang['Virtual album added'] = 'Virtuelles Album hinzugefügt';
+$lang['Virtual album deleted'] = 'Virtuelles Album entfernt';
+$lang['Access type'] = 'Zugangsart';
+$lang['Information data registered in database'] = 'Änderungen wurden gespeichert';
+$lang['Default display'] = 'Standarddarstellung';
+$lang['The gallery URL is not valid.'] = 'Die URL der Galerie ist falsch.';
+$lang['Main'] = 'Grundeinstellungen';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Anzahl der Kommentare pro Seite muss zwischen 5 und 50 liegen.';
+$lang['Configuration'] = 'Konfiguration';
+$lang['confirm'] = 'bestätigen';
+$lang['Date'] = 'Datum';
+$lang['delete album'] = 'Album löschen';
+$lang['Dissociate from album'] = 'Von Album abtrennen';
+$lang['dissociate from group'] = 'Von Gruppe abtrennen';
+$lang['Album updated successfully'] = 'Informationen des Albums wurden erfolgreich aktualisiert.';
+$lang['photos per page'] = 'Fotos je Seite';
+$lang['High definition enabled'] = 'High definition eingeschaltet';
+$lang['File'] = 'Datei';
+$lang['first photo added on %s'] = 'erstes Foto am %s hinzugefügt';
+$lang['Forbidden'] = 'Zugriff verweigert';
+$lang['global mode'] = 'Globaler Modus';
+$lang['group "%s" added'] = 'Gruppe "%s" hinzugefügt';
+$lang['group "%s" deleted'] = 'Gruppe "%s" gelöscht';
+$lang['group "%s" updated'] = 'Gruppe "%s" aktualisiert';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Der Gruppenname darf kein " oder \' enthalten oder leer bleiben.';
+$lang['This name is already used by another group.'] = 'Diesen Gruppenname gibt es schon.';
+$lang['High definition'] = 'High definition';
+$lang['jump to album'] = 'gehe zum Album';
+$lang['jump to photo'] = 'springe zu Foto';
+$lang['leave'] = 'Beibehalten';
+$lang['Lock'] = 'Sperren';
+$lang['Locked'] = 'Gesperrt';
+$lang['manage album photos'] = 'verwalte Fotos im Album';
+$lang['manage sub-albums'] = 'Verwalten Sie die Sub-Alben';
+$lang['Manage'] = 'Verwalten';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Ausführungszeit ist beendet, Vorgang muss manuell fortgesetzt werden [Verstrichene Zeit: %d Sekunde].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Die vorgesehene Zeit zum versenden von E-Mail ist begrenzt. Andere Benutzer werden nicht aufgelistet.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Die Zeit zum E-Mail versenden ist begrenzt. Nicht abgearbeitete Mails werden übersprungen';
+$lang['To send ?'] = 'Info-Mail senden?';
+$lang['Last send'] = 'Letzter Versand';
+$lang['email'] = 'E-mail';
+$lang['User'] = 'Benutzer';
+$lang['See you soon,'] = 'Bis bald,';
+$lang['Go to'] = 'Gehe zu ';
+$lang['Hello'] = 'Hallo ';
+$lang['New photos were added'] = 'Neue Fotos wurden hinzugefügt';
+$lang['on'] = ' am ';
+$lang['between'] = 'zwischen dem';
+$lang['and'] = ' und dem ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Der Webmaster hat dich für die E-Mailbenachrichtigung eingetragen. Das bedeutet nicht, das du "zugemüllt" wirst, sondern gelegentlich eine E-Mail über aktualisierte Bilder/Kategorien in der Bildergalerie. Die E-Mail wird nicht vom System, sondern vom Webmaster selbst ausgelöst. Falls du das als Belästigung empfindest, klicke unten einfach auf den Link "Austragen".';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Sie sind eingetragen für die Benachrichtigung per E-Mail';
+$lang['To subscribe'] = 'Zum wieder anmelden';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Bei Problemen oder Fragen sende eine E-Mail an ';
+$lang['[NBM] Problems or questions'] = '[NBM] Probleme oder Fragen';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Der Webmaster hat dich für die E-Mailbenachrichtigung ausgetragen';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Sie haben sich ausgetragen für die Benachrichtigung per E-Mail';
+$lang[', click on'] = ', klicke auf diesen Link:';
+$lang['To unsubscribe'] = 'Zum austragen';
+$lang['With blank value, gallery title will be used'] = 'Bei leerem Inhalt wird der Galerietitel benutzt';
+$lang['Notification'] = 'Benachrichtigung';
+$lang['Error when sending email to %s [%s].'] = 'Fehler beim Versand an %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'E-Mail versendet an %s [%s].';
+$lang['%d mail was sent.'] = '%d E-Mail wurde gesendet.';
+$lang['%d mails were sent.'] = '%d E-Mails wurden gesendet.';
+$lang['%d mail was not sent.'] = '%d E-Mail wurde nicht gesendet.';
+$lang['%d mails were not sent.'] = '%d E-Mails wurden nicht gesendet.';
+$lang['No mail to send.'] = 'Keine E-Mail zu versenden.';
+$lang['There is no available subscribers to mail.'] = 'Kein Benutzer verfügbar um eine E-Mail zu senden.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Ein Benutzer ist dann auswählbar wenn es neue Fotos gibt.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Wenn niemand in der Mailingliste eingetragen ist, kannst du keine E-Mails versenden. (Nur der Webmaster erscheint bei Aktualisierungen in dieser Liste).';
+$lang['No user to send notifications by mail.'] = 'Kein Benutzer da um Aktualisierungen zu senden.';
+$lang['New photos added'] = 'Neue Fotos hinzugefügt';
+$lang['Subscribe to notification by mail'] = 'Eintragen zur E-Mailbenachrichtigung';
+$lang['Unsubscribe from notification by mail'] = 'Austragen zur E-Mailbenachrichtigung';
+$lang['Parameter'] = 'Parameter';
+$lang['Continue processing treatment'] = 'Prozess fortsetzen';
+$lang['Complementary mail content'] = 'Zusätzlicher Inhalt der E-Mail';
+$lang['Add detailed content'] = 'Sende detallierten Inhalt';
+$lang['Send mail as'] = 'Sende E-Mail als';
+$lang['Send mail to users'] = 'Sende Mail an';
+$lang['Send'] = 'Sende';
+$lang['Options'] = 'Optionen';
+$lang['Subscribed'] = 'Bestätigt';
+$lang['Subscribe'] = 'Bestätigen';
+$lang['Parameters'] = 'Parameter';
+$lang['Select recipients'] = 'Wähle Empfänger';
+$lang['Subscribe/unsubscribe users'] = 'Hinzufügen/Entfernen von Benutzern für die E-Mailbenachrichtigung';
+$lang['Unsubscribed'] = 'Entfernt';
+$lang['%d parameter was updated.'] = '%d Parameter aktualisiert.';
+$lang['%d parameters were updated.'] = '%d Parameter aktualisiert.';
+$lang['%d user was not updated.'] = '%d Benutzer nicht aktualisiert.';
+$lang['%d users were not updated.'] = '%d Benutzer nicht aktualisiert.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Benutzer %s [%s] entfernt von der Benachrichtigungsliste.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Benutzer %s [%s] hinzugefügt zur Benachrichtigungsliste.';
+$lang['%d user was updated.'] = '%d Benutzer aktualisiert.';
+$lang['%d users were updated.'] = '%d Benutzer aktualisiert.';;
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Benutzer %s [%s] nicht entfernt von der Benachrichtigungsliste.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Benutzer %s [%s] nicht hinzugefügt zur Benachrichtigungsliste.';
+$lang['User %s [%s] added.'] = 'Benutzer %s [%s] hinzugefügt.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'WARNUNG: Hinzufügen oder Entfernen von Benutzern zur Mailingliste erwirkt sofort eine automatische E-Mail an den Betreffenden';
+$lang['Send mail on HTML format'] = 'Sende E-Mail im HTML-Format';
+$lang['Include display of recent photos grouped by dates'] = 'Binde die neuesten Bilder, gruppiert nach Datum, in die Email ein';
+$lang['Available only with HTML format'] = 'Nur verfügbar, wenn die Benachrichtigungen im HTML-Format verschickt werden';
+$lang['no write access'] = 'kein Schreibzugriff';
+$lang['Permissions'] = 'Zugriffsrechte';
+$lang['private'] = 'private';
+$lang['public'] = 'öffentlich';
+$lang['Purge never used notification feeds'] = 'Lösche alle noch nicht verschickten Benachrichtigungen';
+$lang['Purge sessions'] = 'Lösche Sitzungen';
+$lang['randomly represented'] = 'zufälliges Vorschaubild';
+$lang['registration date'] = 'Registrierungsdatum';
+$lang['clean'] = 'reinigen';
+$lang['Create this site'] = 'Erstellen dieser Website';
+$lang['test'] = 'Test';
+$lang['test this remote site'] = 'testen Remote-Site';
+$lang['remove tags'] = 'Stichworte entfernen';
+$lang['Repair and optimize database'] = 'Reparieren und Optimierung der Datenbank';
+$lang['selection'] = 'Auswahl';
+$lang['set to'] = 'Setze auf';
+$lang['singly represented'] = 'festgelegtes Vorschaubild';
+$lang['This site already exists'] = 'Diese Seite gibt es bereits';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Erstellen Sie eine neue Remote-Seite: (genaue URL zur create_listing_file.php der Remote-Seite)';
+$lang['created'] = 'erstellt';
+$lang['delete this site and all its attached elements'] = 'Entfernen dieser Seite und alle damit zusammenhängenden Daten';
+$lang['an error happened'] = 'ein Fehler ist aufgetreten';
+$lang['Local'] = 'Lokal';
+$lang['Remote'] = 'Remote';
+$lang['update the database from files'] = 'aktualisiert die Datenbank aus den Dateien';
+$lang['status'] = 'Status';
+$lang['Directory'] = 'Verzeichnis';
+$lang['sub-albums'] = 'Sub-Album';
+$lang['Synchronize metadata'] = 'Synchronisieren von Meta-Daten';
+$lang['target'] = 'Ziel:';
+$lang['Thumbnail'] = 'Vorschaubild';
+$lang['title'] = 'Titel';
+$lang['Album list management'] = 'Albumverwaltung';
+$lang['Piwigo configuration'] = 'Konfiguration der Piwigo';
+$lang['Edit album'] = 'Einen Album bearbeiten';
+$lang['Group management'] = 'Gruppenliste und -verwaltung';
+$lang['User list'] = 'Benutzerliste und -verwaltung';
+$lang['Edit photo information'] = 'Bearbeite Fotoinformation';
+$lang['Database synchronization with files'] = 'Synchronisierung der Datenbank';
+$lang['all'] = 'alle';
+$lang['height must be a number superior to'] = 'die Höhe muss größer sein als';
+$lang['width must be a number superior to'] = 'die Breite muss größer sein als';
+$lang['for the file format'] = 'für das Format der Datei';
+$lang['Photo unreachable or no support'] = 'Foto unerreichbar oder nicht unterstützt';
+$lang['GD version'] = 'Version von GD Library';
+$lang['General statistics'] = 'Allgemeine Statistiken';
+$lang['average time'] = 'durchschnittliche Zeit';
+$lang['number of miniaturized photos'] = 'Anzahl verkleinerter Fotos';
+$lang['total time'] = 'Gesamtzeit';
+$lang['for this file format'] = 'für dieses Dateiformat';
+$lang['unit mode'] = 'Einzelmodus';
+$lang['Unlocked'] = 'Entsperrt';
+$lang['unset'] = 'Lösche Einstellung';
+$lang['Update albums informations'] = 'Informationen der Alben aktualisieren';
+$lang['Update photos information'] = 'Aktualisiere Fotoinformation';
+$lang['Synchronize'] = 'Synchronisieren';
+$lang['reduce to single existing albums'] = 'Auf einzelne bestehende Alben reduzieren';
+$lang['Choose an option'] = 'Eine Option auswählen';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'zeige alle Informationen (hinzugefügte Alben und Fotos, gelöschte Alben und Fotos)';
+$lang['Error list'] = 'Error Liste';
+$lang['Errors caption'] = 'Fehlerüberschrift';
+$lang['Detailed informations'] = 'Detallierte Informationen';
+$lang['File/directory read error'] = 'Datei/Ordner Lesefehler';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Auf diese Datei/Ordner kann nicht zugegriffen werden (Entweder es existiert nicht oder der Zugriff wurde verwehrt)';
+$lang['albums deleted in the database'] = 'Alben von der Datenbank entfernt';
+$lang['photos deleted from the database'] = 'von der Datenbank gelöschte Fotos';
+$lang['photos candidates for metadata synchronization'] = 'Fotos zur Metadata Synchronisation';
+$lang['photos informations synchronized with files metadata'] = 'Fotoinformationen mit den Metadaten der Datei synchronisiert';
+$lang['errors during synchronization'] = 'Fehler während der Synchronisation';
+$lang['albums added in the database'] = 'Alben in der Datenbank hinzugefügt';
+$lang['photos added in the database'] = 'der Datenbank hinzugefügte Fotos';
+$lang['photos updated in the database'] = 'in der Datenbank aktualisierte Fotos';
+$lang['Search for new images in the directories'] = 'Suche nach neuen Fotos in den vorhandenen Ordnern';
+$lang['added'] = 'hinzugefügt';
+$lang['deleted'] = 'gelöscht';
+$lang['Metadata synchronization results'] = 'Metadata Synchronisierung Ergebnisse';
+$lang['only perform a simulation (no change in database will be made)'] = 'nur Simulation (es werden keine Änderungen in der Datenbank vorgenommen)';
+$lang['Simulation'] = 'Simulation';
+$lang['directories + files'] = 'Ordner und Dateien';
+$lang['only directories'] = 'Nur Ordner';
+$lang['synchronize files structure with database'] = 'Syncronisiere Dateistruktur mit der Datenbank';
+$lang['synchronize files metadata with database photos informations'] = 'synchronisiere Metadaten der Datei mit den Fotoinformationen der Datenbank';
+$lang['even already synchronized photos'] = 'auch bereits synchronisierte Fotos';
+$lang['Used metadata'] = 'Benutzte Metadaten';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Der Verzeichnis- und der Dateiname muß aus Buchstaben oder den Zeichen "-", "_" oder "." bestehen';
+$lang['wrong filename'] = 'Falscher Dateiname';
+$lang['Upload'] = 'Upload';
+$lang['user "%s" added'] = 'Benutzer "%s" hinzugefügt';
+$lang['User status'] = 'Status des Benutzers';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Generischer Status';
+$lang['user_status_guest'] = 'Gast';
+$lang['user_status_normal'] = 'Benutzer';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Virteller Album';
+$lang['Waiting'] = 'Wartend auf Freigabe';
+$lang['default'] = 'Standard';
+$lang['Toggle \'default group\' property'] = 'Setzt die Gruppe als Standardgruppe. (Neu registrierte Benutzer gehören automatisch dieser Gruppe an!)';
+$lang['Advanced features'] = 'Erweiterte Einstellungen';
+$lang['Overall'] = 'Gesamt';
+$lang['Year'] = 'Jahr';
+$lang['Month'] = 'Monat';
+$lang['Day'] = 'Tag';
+$lang['Pages seen'] = 'Seitenzugriffe';
+$lang['Time'] = 'Zeit';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Bilder';
+$lang['Section'] = 'Abschnitt';
+$lang['An information email was sent to group "%s"'] = 'Eine Info-E-Mail wurde gesendet an die Gruppe "%s"';
+$lang['Send an information email to group members'] = 'Sende eine Info-E-Mail an die Mitglieder dieser Gruppe';
+$lang['Group'] = 'Gruppe';
+$lang['[%s] Visit album %s'] = '[%s] Besuchen sie den Album %s';
+$lang['Hello,'] = 'Hallo,';
+$lang['See you soon.'] = 'Bis bald.';
+$lang['Discover album:'] = 'Folgen Sie den Link und entdecken Sie den Album:';
+$lang['Mail content'] = 'Text der E-Mail';
+$lang['none'] = 'egal';
+$lang['high'] = 'hoch';
+$lang['other'] = 'anderes';
+$lang['Element type'] = 'Element Typ';
+$lang['Image id'] = 'Element-ID';
+$lang['Summary'] = 'Zusammenfassung';
+$lang['%d line filtered'] = '%d Zeile gefiltert';
+$lang['%d lines filtered'] = '%d Zeilen gefiltert';
+$lang['%d guest'] = '%d Gast';
+$lang['%d guests'] = '%d Gäste';
+$lang['Hour'] = 'Stunde';
+$lang['guest'] = 'Gast';
+$lang['default values'] = 'Standardwerte';
+// --------- Starting below: New or revised $lang ---- from version 1.7.1
+$lang['Guest cannot be deleted'] = 'Der Gast kann nicht gelöscht werden';
+$lang['Default user cannot be deleted'] = 'Der Standardbenutzer kann nicht gelöscht werden';
+$lang['Purge history detail'] = 'Lösche History detailliert';
+$lang['Purge history summary'] = 'Lösche History gesamt';
+$lang['Check integrity'] = 'überprüfung der Integrität';
+$lang['Anomaly'] = 'Anomalie';
+$lang['Correction'] = 'Korrektur';
+$lang['Automatic correction'] = 'Automatische Korrektur';
+$lang['Impossible automatic correction'] = 'Automatische Korrektur nicht möglich';
+$lang['Correction applied with success'] = 'Korrektur erfolgreich';
+$lang['Correction applied with error'] = 'Korrektur mit Fehler';
+$lang['%d anomaly has been detected.'] = '%d Anomalie entdeckt wurde.';
+$lang['%d anomalies have been detected.'] = '%d Anomalien festgestellt wurden.';
+$lang['%d anomaly has been corrected.'] = '%d Anomalie wurde behoben.';
+$lang['%d anomalies have been detected corrected.'] = '%d Anomalien wurde behoben.';
+$lang['%d anomaly has not been corrected.'] = '%d Anomalie konnte nicht behoben werden.';
+$lang['%d anomalies have not been corrected.'] = '%d Anomalien konnte nicht behoben werden.';
+$lang['Go to %s or %s for more informations'] = 'Gehen Sie %s oder %s für weitere Informationen';
+$lang['the forum'] = 'das Forum';
+$lang['the wiki'] = 'das wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'Der Wert %s ist nicht korrekt weil EXIF nicht unterstützt wird';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s muss auf "false" in Ihrer Datei config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'Der Benutzer "Gast" Haupt nicht mehr';
+$lang['Main "guest" user status is incorrect'] = 'Der Status der Benutzer "Gast" ist falsch';
+$lang['Default user does not exist'] = 'Der Benutzer standardmäßig nicht mehr';
+$lang['Main "webmaster" user does not exist'] = 'Der Benutzer "Webmaster" Haupt nicht mehr';
+$lang['Main "webmaster" user status is incorrect'] = 'Der Status des Benutzers "Webmaster" ist falsch';
+$lang['User "%s" created with "%s" like password'] = 'Benutzer "%s" erstellt mit dem Passwort "%s"';
+$lang['Status of user "%s" updated'] = 'Status des Benutzers "%s" aktualisiert';
+$lang['add new photos to caddie'] = 'füge neue Fotos zum Sammelordner hinzu';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = 'Keine Anzeige';
+$lang['Classic display'] = 'Klassische Ansicht';
+$lang['Hoverbox display'] = 'Anzeige beim überflug';
+$lang['Mail address is obligatory for all users'] = 'Die Angabe einer gültigen E-Mail-Adresse ist für alle Benutzer verpflichtend';
+$lang['Minimum privacy level'] = 'Minimale Datenschutzstufe';
+$lang['Privacy level'] = 'Datenschutzstufe';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakt';
+$lang['Level 2'] = 'Freunde';
+$lang['Level 4'] = 'Familie';
+$lang['Level 8'] = 'Administratoren';
+$lang['Reinitialize check integrity'] = 'prüfe erneut die Integrität';
+$lang['Check all'] = 'Alle auswählen';
+$lang['Uncheck all'] = 'Alles entfernen';
+$lang['Check automatic corrections'] = 'überprüfen Sie automatische Korrekturen';
+$lang['Apply selected corrections'] = 'Die entsprechenden ausgewählten';
+$lang['Ignore selected anomalies'] = 'Ignorieren Sie gewählte Anomalien';
+$lang['Refresh'] = 'Aktualisieren';
+$lang['The anomaly will be ignored until next application version'] = 'Der Fehler wird ignoriert bis die nächste Version der Anwendung';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Die Korrektur der Anomalie macht die Tatsache sie ignoriert ist';
+$lang['%d anomaly has been ignored.'] = '%d Anomalie ignoriert wurde.';
+$lang['%d anomalies have been ignored.'] = '%d Anomalien ignoriert wurden.';
+$lang['Plugins which need upgrade'] = 'Für diese Plugins ist ein Update verfügbar';
+$lang['Plugin list'] = 'Liste der Plugins';
+$lang['Check for updates'] = 'Auf Updates überprüfen';
+$lang['Other plugins'] = 'Weitere Plugins';
+$lang['Last revisions'] = 'Aktuelle änderungen';
+$lang['Are you sure you want to delete this plugin?'] = 'Sind Sie sicher dass Sie dieses Plugin löschen möchten?';
+$lang['Are you sure you want to install this plugin?'] = 'Sind Sie sicher dass Sie dieses Plugin installieren möchten?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Sind Sie sicher dass Sie dieses Plugin installieren möchten? Stellen sicher, dass die vorhergehende Version nicht deinstalliert werden muss.';
+$lang['Plugin has been successfully copied'] = 'Das Plugin wurde erfolgreich installiert.';
+$lang['You might go to plugin list to install and activate it.'] = 'Gehen Sie in die "Liste der Plugins" um installierte Plugins zu aktivieren.';
+$lang['Can\'t create temporary file.'] = 'Temporäre Datei kann nicht erstellt .';
+$lang['Can\'t download archive.'] = 'Kann Archiv nicht downloaden.';
+$lang['Can\'t read or extract archive.'] = 'Kann das Archiv nicht lesen oder entpacken.';
+$lang['An error occured during extraction (%s).'] = 'Fehler beim entpacken des Archives(%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Überprüfen Sie die Berechtigungen des Ordners "Plugins" und dessen Unterordner (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Es konnte keine Verbindung zum Server hergestellt werden.';
+$lang['Purge compiled templates'] = 'Löschen der kompilierten Templates';
+$lang['ACCESS_0'] = 'Frei';
+$lang['ACCESS_1'] = 'Alle';
+$lang['ACCESS_2'] = 'Mitglieder';
+$lang['ACCESS_3'] = 'Administratoren';
+$lang['ACCESS_4'] = 'Webmaster';
+$lang['ACCESS_5'] = 'Keine Benutzer';
+$lang['Support'] = 'Support';
+$lang['Documentation'] = 'WIKI / Dokumentation';
+$lang['A new version of Piwigo is available.'] = 'Es steht eine neue Version von Piwigo zur Verfügung.';
+$lang['Piwigo Administration'] = 'Verwaltung von Piwigo';
+$lang['Piwigo version'] = 'Version von Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Sie verwenden die neueste Version von Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Die Version %s [%s] ist installiert und ist nicht mit der erforderlichen Version kompatibel [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Sie müssen Ihr System zu aktualisieren, um vollen Nutzen aus der Anwendung nicht die Anwendung funktioniert nicht richtig oder gar nicht';
+$lang['Deleted on'] = 'Gelöscht am';
+$lang['Last hit'] =  'Letzter Zugriff';
+$lang['GD library is missing'] = 'die GD-Library ist nicht auf dem Server installiert, bitte frage den Administrator oder Provider.';
+$lang['Templates'] = 'Templates (Modelle)';
+$lang['Extend for templates'] = 'Vorlagenerweiterung';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Ersetzen von Originalvorlagen durch angepasste Vorlagen im Ordner template-extension';
+$lang['Replacers (customized templates)'] = 'Replacer (angepasste Vorlagen)';
+$lang['Original templates'] = 'Originales Templates';
+$lang['Optional URL keyword'] = 'Optionale Parameter in der URL';
+$lang['Templates configuration has been recorded.'] = 'Die Konfiguration der Templates gespeichert wurde.';
+$lang['All optimizations have been successfully completed.'] = 'Alle Optimierungen wurden erfolgreich abgeschlossen.';
+$lang['Optimizations have been completed with some errors.'] = 'Einige Optimierungen endeten mit Fehlern.';
+$lang['Modify information'] = 'Informationen ändern';
+$lang['nothing'] = 'nichts';
+$lang['overrides existing values with empty ones'] = 'Überschreibt alle existierenden Werte in der Datenbank mit leeren!!  (filesize, width, height, high_filesize, date_creation, keywords, date_creation, author, name, comment)';
+$lang['Manage photo ranks'] = 'Verwalte Foto Rangordnung';
+$lang['Edit ranks'] = 'Die Reihenfolge ändern';
+$lang['No photo in this album'] = 'Keine Fotos in diesem Album';
+$lang['Images manual order was saved'] = 'Die manuelle Reihenfolge der Bilder wurde gespeichert';
+$lang['ranks'] = 'Reihenfolge';
+$lang['Drag to re-order'] = 'Klicken und Ziehen um eine neue Reihenfolge festzulegen';
+$lang['Quick Local Synchronization'] = 'Schnelle Synchronisierung';
+$lang['No photo can be deleted'] = 'Kein Foto kann gelöscht werden';
+$lang['Delete selected photos'] = 'Lösche ausgewählte Fotos';
+$lang['%d photo was deleted'] = '%d Foto wurde gelöscht';
+$lang['%d photos were deleted'] = '%d Fotos wurden gelöscht';
+$lang['Downloads'] = 'Downloads';
+$lang['Released on'] = 'Veröffentlicht am';
+$lang['Number of downloads'] = 'Anzahl der Downloads';
+
+
+// --------- Starting below: New or revised $lang ---- from Colibri
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Newsletter';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Abonniere den Piwigo Newsletter. Du bekommst eine E-Mail wenn eine neue Version verfügbar ist (manchmal wird ein Bug gefixt, der die Sicherheit der Piwigo erhöht, es ist dann wichtig das Upgrade zu installieren) und wenn es wichtige Ereignisse rund um das Projekt gibt. Es sind nur ein paar E-Mails im Jahr.';
+$lang['Subscribe %s'] = 'Abonnieren %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonniere %s zum Piwigo Newsletter';
+$lang['Purge search history'] = 'Lösche die Such-Historie';
+$lang['Hide'] = 'Verstecken';
+$lang['Operation in progress'] = 'Arbeite daran.';
+$lang['Please wait...'] = 'Bitte warten...';
+$lang['Password is missing. Please enter the password.'] = 'Das Kennwort fehlt. Bitte geben sie ihr Kennwort ein.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Das Kennwort zum überprüfen fehlt. Bitte geben Sie ihr gewähltes Kennwort noch einmal ein.';
+$lang['Allow users to edit their own comments'] = 'Erlaube Benutzern ihre eigenen Kommentare zu editieren';
+$lang['Allow users to delete their own comments'] = 'Erlaube Benutzern ihre eigenen Kommentare zu löschen';
+$lang['Email administrators when a comment is modified'] = 'Schicke den Administratoren eine E-mail wenn ein Kommentar verändert wurde';
+$lang['Email administrators when a comment is deleted'] = 'Schicke den Administratoren eine E-mail wenn ein Kommentar gelöscht wurde';
+$lang['Cannot delete the old permalink !'] = 'Kann den alten Permalink nicht löschen !';
+$lang['Hit'] = 'Treffer';
+$lang['Tools'] = 'Werkzeuge';
+$lang['Photos'] = 'Fotos';
+$lang['Themes'] = 'Themen';
+$lang['Instructions to use Piwigo'] = 'Instruktionen um die Piwigo zu benutzen';
+$lang['Installed Themes'] = 'Installierte Themen';
+$lang['Add New Theme'] = 'Füge ein neues Thema hinzu';
+$lang['Forbid this theme to users'] = 'Verbieten Sie dieses Thema den Benutzern';
+$lang['Set as default theme for unregistered and new users'] = 'Setze als Standardthema für unregistrierte und neue Benutzer';
+$lang['unknown'] = 'unbekannt';
+$lang['Upload Photos'] = 'Lade Fotos hoch';
+$lang['Drop into album'] = 'In das Album hochladen';
+$lang['+ Add an upload box'] = '+ eine weitere Uploadbox';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Erstelle den  "%s" Ordner im Hauptordner (root) deiner Piwigoinstallation';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Gebe Schreibrechte (chmod 777) dem Ordner "%s" im Hauptordner (root) deiner Piwigoinstallation';
+$lang['existing album'] = 'Existierendes Album';
+$lang['create a new album'] = 'Ein neues Album erstellen';
+$lang['Album name'] = 'Albumname';
+$lang['Album "%s" has been added'] = 'Album "%s" wurde hinzugefügt';
+$lang['Uploaded Photos'] = 'Lade Fotos hoch';
+$lang['%d photos uploaded'] = '%d Fotos hochgeladen';
+$lang['Privacy level set to "%s"'] = 'Datenschutzstufe auf "%s" gesetzt';
+$lang['Album "%s" now contains %d photos'] = 'Das Album "%s" enthält nun %d Fotos';
+$lang['Manage this set of %d photos'] = 'Verwalte dieses Set von %d Fotos';
+$lang['Select files'] = 'Wähle Dateien aus';
+$lang['Everybody'] = 'Jedermann';
+$lang['Who can see these photos?'] = 'Wer soll die Fotos sehen können?';
+$lang['Who can see this photo?'] = 'Wer soll dieses Foto sehen können?';
+$lang['Settings'] = 'Einstellungen';
+$lang['Resize'] = 'Größe verändern';
+$lang['Maximum Width'] = 'Maximale Breite';
+$lang['pixels'] = 'Pixel';
+$lang['Maximum Height'] = 'Maximale  Höhe';
+$lang['Image Quality'] = 'Bildqualität';
+$lang['Save Settings'] = 'Speichere Einstellungen';
+$lang['Your configuration settings are saved'] = 'Die Konfigurationseinstellungen wurden gespeichert';
+$lang['Active Themes'] = 'Aktive Themen';
+$lang['Add write access to the "%s" directory'] = 'Gebe dem Ordner "%s" Schreibrechte';
+$lang['Administration Home'] = 'Startseite der Administration';
+$lang['Change Admin Colors'] = 'Ändere die Administrationsfarben ';
+$lang['Delete this theme'] = 'Lösche dieses Thema';
+$lang['Directory does not exist'] = 'Ordner existiert nicht';
+$lang['Download,'] = 'Download,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronisieren';
+$lang['Get Support on Piwigo Forum'] = 'Bekomme Hilfe im Piwigo Forum';
+$lang['Help Me'] = 'Hilf mir';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Es ist nicht möglich dieses Thema zu aktivieren da das Elternthema %s fehlt';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Es ist nicht möglich dieses Thema zu löschen. Andere Themen basieren darauf: %s';
+$lang['Inactive Themes'] = 'Inaktive Themen';
+$lang['Install on your computer,'] = 'Installiere auf deinem Computer,';
+$lang['Make this theme available to users'] = 'Stelle dieses Thema den Benutzern zur Verfügung';
+$lang['Page end'] = 'Ende der Seite';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Lese die Piwigo Dokumentation';
+$lang['Start pLoader and add your photos.'] = 'Starte pLoader und füge deine Fotos hinzu.';
+$lang['Switch to clear or dark colors for administration'] = 'Wechsle zwischen hellen und dunklen Farben für die Administration';
+$lang['Theme has been successfully installed'] = 'Thema wurde erfolgreich installiert';
+$lang['Visit Gallery'] = 'Besuche die Galerie';
+$lang['Visit Piwigo project website'] = 'Besuche die Piwigo Projekthomepage';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader bedeutet <em>Piwigo Uploader</em>. Auf deinem Computer bereitet der pLoader die Fotos vor und transferiert sie in die Piwigo Fotogalerie.';
+$lang['Guest Settings'] = 'Einstellungen für Gäste';
+$lang['Main Page'] = 'Hauptseite';
+$lang['Photo Page'] = 'Fotoseite';
+$lang['Activate Navigation Bar'] = 'Aktiviere Navigationsleiste';
+$lang['Activate Navigation Thumbnails'] = 'Aktiviere Navigationsvorschaubilder';
+$lang['Activate icon "%s"'] = 'Aktiviere Icon "%s"';
+$lang['Photo Properties'] = 'Fotoeigenschaften';
+$lang['Allow user customization'] = 'Erlaube Anpassungen durch Benutzer';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Zeit für die Ausführung ist abgelaufen, der Prozess muss fortgesetzt werden [Noch benötigte Zeit: %d Sekunden].';
+$lang['Languages'] = 'Sprachen';
+$lang['Installed Languages'] = 'Installierte Sprachen';
+$lang['Add New Language'] = 'Füge eine neue Sprache hinzu';
+$lang['Language has been successfully installed'] = 'Sprachdateien wurden erfolgreich installiert';
+$lang['Select:'] = 'Auswahl:';
+$lang['None'] = 'Nichts';
+$lang['Invert'] = 'Umkehren';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Es ist nicht möglich dieses Thema zu deaktivieren, du benötigst mindestens ein Thema.';
+$lang['Miscellaneous'] = 'Verschiedenes';
+$lang['Virtual Links'] = 'Virtuelle Verbindungen';
+$lang['Webmaster status is required.'] = 'Sie benötigen Webmaster-berechtigung.';
+$lang['Bound Theme'] = 'Zugewiesene Vorlage';
+$lang['Allow rating'] = 'Bewertung von Fotos erlauben';
+$lang['Select at least one comment'] = 'Wählen Sie mindestens ein Kommentar aus';
+$lang['Active Plugins'] = 'Aktivierte Plugins';
+$lang['Inactive Plugins'] = 'Deaktivierte Plugins';
+$lang['Missing Plugins'] = 'Fehlende Plugins';
+$lang['Uninstalled Plugins'] = 'Deinstallierte Plugins';
+$lang['By %s'] = 'Von %s';
+$lang['Visit plugin site'] = 'Besuche die Plugin Website';
+$lang['Active Languages'] = 'Aktivierte Sprachen';
+$lang['Delete this language'] = 'Lösche diese Sprache';
+$lang['Forbid this language to users'] = 'Verbiete Benutzern, diese Sprache auszuwählen';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Sie müssen zuerst eine neue Standardsprache wählen, bevor Sie diese Sprache deaktivieren.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Sie können diese Sprache nicht deaktvieren, da mindestens eine Sprache benötigt wird.';
+$lang['Inactive Languages'] = 'Deaktivierte Sprachen';
+$lang['Make this language available to users'] = 'Aktiviere diese Sprache für Benutzer';
+$lang['Set as default language for unregistered and new users'] = 'Als Standardsprache für neue und unregistrierte User festlegen';
+$lang['delete'] = 'Löschen:';
+$lang['Add Photos'] = 'Fotos hinzufügen';
+$lang['The following tag was deleted'] = 'Folgendes Stichwort wurde gelöscht';
+$lang['There is no other language available.'] = 'Es ist keine weitere Sprache verfügbar.';
+$lang['There is no other plugin available.'] = 'Es ist kein weiteres Plugin verfügbar.';
+$lang['There is no other theme available.'] = 'Es ist kein weiteres Thema verfügbar.';
+$lang['Add another set of photos'] = 'Füge eine weitere Fotoserie hinzu';
+$lang['By rank'] = 'Nach Rangfolge';
+$lang['Manual order'] = 'Manuelle Sortierung';
+$lang['Order of menubar items has been updated successfully.'] = 'Die Reihenfolge der Menüelemente wurde erfolgreich angepasst.';
+$lang['This theme was not designed to be directly activated'] = 'Dieses Layout kann nicht direkt aktiviert werden';
+$lang['Pending Comments'] = 'Freizugebende Kommentare';
+$lang['Menu Management'] = 'Menü';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'In Ihrer php.ini Datei ist der upload_max_filesize (%sB) größer als post_max_size (%sB), Sie sollten diese Einstellung ändern';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif Erweiterung nicht verfügbar, der Admin sollte die Exif-Verwendung deaktivieren';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Die hochgeladene Datei überschreitet die upload_max_filesize Einstellung in der php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Die hochgeladenen Dateien überschreiten die post_max_size Einstellung in php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Die hochgeladene Datei überschreitet die MAX_FILE_SIZE Einstellung, die in der HTML-Form angegeben wurde';
+$lang['The uploaded file was only partially uploaded'] = 'Die hochgeladene Datei wurde nur teilweise übertragen';
+$lang['No file was uploaded'] = 'Keine Datei wurde hochgeladen';
+$lang['Missing a temporary folder'] = 'Ein temporärer Ordner wird vermisst';
+$lang['Failed to write file to disk'] = 'Es ist nicht möglich die Datei zu schreiben';
+$lang['File upload stopped by extension'] = 'Das Hochladen der Datei wurde infolgedessen gestoppt';
+$lang['Unknown upload error'] = 'Unbekannter Fehler beim hochladen';
+$lang['Error on file "%s" : %s'] = 'Fehler bei Datei "%s" : %s';
+$lang['automatic order'] = 'automatische Sortierung';
+$lang['manual order'] = 'manuelle Sortierung';
+$lang['Albums automatically sorted'] = 'Alben automatisch sortiert';
+$lang['Batch Manager'] = 'Stapelverarbeitungsmanager';
+$lang['include child albums'] = 'inclusive Unteralben';
+$lang['Selection'] = 'Auswahl';
+$lang['Action'] = 'Aktion';
+$lang['Set author'] = 'Setze den Autor';
+$lang['Set title'] = 'Setze den Titel';
+$lang['Set creation date'] = 'Setze das Erstellungsdatum';
+$lang['Apply action'] = 'Bestätige die Aktion';
+$lang['on the %d selected photos'] = 'der %d ausgewählten Fotos';
+$lang['%d of %d photos selected'] = '%d von %d Fotos ausgewählt';
+$lang['No photo selected, %d photos in current set'] = 'Kein Foto ausgewählt, %d Fotos im gegenwärtigen Set';
+$lang['All %d photos are selected'] = 'Alle %d Fotos ausgewählt';
+$lang['remove this filter'] = 'entferne diesen Filter';
+$lang['Duplicates'] = 'doppelte';
+$lang['Add a filter'] = 'Füge einen Filter hinzu';
+$lang['Remove all filters'] = 'Entferne alle Filter';
+$lang['Refresh photo set'] = 'Aktualisiere das Fotoset';
+$lang['The whole page'] = 'Die ganze Seite';
+$lang['The whole set'] = 'Das ganze Set';
+$lang['No photo in the current set.'] = 'Keine Fotos im gegenwärtigen Set.';
+$lang['No photo selected, no action possible.'] = 'Kein Foto ausgewählt, keine Aktion möglich.';
+$lang['Choose an action'] = 'Wähle eine Aktion';
+$lang['remove author'] = 'entferne den Autor';
+$lang['Type here the author name'] = 'Geben Sie hier den Name des Autors ein';
+$lang['remove title'] = 'Entferne Titel';
+$lang['Type here the title'] = 'Geben Sie hier den Titel ein';
+$lang['remove creation date'] = 'Entferne das Erstellungsdatum';
+$lang['Album photos associated to the following albums: %s'] = 'Albumfotos findet man in folgenden Alben: %s';
+$lang['Delete orphan tags'] = 'Lösche nichtbenutzte Stichworte';
+$lang['delete photo'] = 'lösche Foto';
+$lang['Orphan tags deleted'] = 'Nichtbenutzte Stichworte wurden gelöscht';
+$lang['Week starts on'] = 'Die Woche beginnt mit';
+$lang['You have %d orphan tags: %s.'] = 'Sie haben %d nichtbenutzte Stichworte: %s.';
+$lang['Remove from caddie'] = 'Vom Sammelkorb entfernen';
+$lang['Themes which need upgrade'] = 'Themen, welche einen update brauchen';
+$lang['Languages which need upgrade'] = 'Sprachen, welche einen update brauchen';
+$lang['All themes are up to date.'] = 'Alle Themen sind auf dem neuesten Stand.';
+$lang['All plugins are up to date.'] = 'Alle Plug-Ins sind auf dem neuesten Stand.';
+$lang['All languages are up to date.'] = 'Alle Sprachen sind auf dem neuesten Stand.';
+$lang['Visit theme site'] = 'Die Themenseite besuchen';
+$lang['Visit language site'] = 'Die Sprachenseite besuchen';
+$lang['New Version'] = 'Neue Version';
+$lang['display'] = 'Zeige';
+$lang['Obsolete Plugins'] = 'Veraltete Plugins'; 
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'WARNUNG! Dieses Plugin ist nicht kompatibel mit dieser Version der Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Wollen Sie es wirklich wieder aktivieren?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DIESES PLUGIN IST JETZT IN DEN KERN DER PIWIGO INTEGRIERT! BITTE UNBEDINGT DEINSTALLIEREN!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERROR: DIESES PLUGIN FEHLT OBWOHL ES INSTALLIERT IST! BITTE UNBEDINGT DEINSTALLIEREN! ';
+$lang['Thumbnails generation in progress...'] = 'Vorschaubilder werden neu erstellt...';
+$lang['Photos generation in progress...'] = 'Fotos werden neu erstellt...';
+$lang['%s photos have been regenerated'] = '%s Fotos wurden neu erstellt';
+$lang['%s photos can not be regenerated'] = '%s Fotos konnten nicht neu erstellt werden';
+$lang['new'] = 'neu';
+$lang['No results'] = 'Keine Ergebnisse';
+$lang['Searching...'] = 'Suche...';
+$lang['Type in a search term'] = 'Geben Sie bitte einen Suchbegriff ein';
+$lang['Activate icon "new" next to albums and pictures'] = ' Aktivieren Sie das Icon "Neu" neben Alben und Fotos ';
+$lang['Deactivate all'] = 'Deaktiviere alle';
+$lang['Default photos order'] = 'Voreingestellte Fotoanordnung';
+$lang['Restore'] = 'Zurücksetzen';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Zurücksetzen auf Standardkonfiguration. Alle Einstellungen in diesem Plugin gehen verloren!';
+$lang['Show menubar'] = 'Zeige die Menübar';
+$lang['Updates'] = 'Aktualisierungen';
+$lang['Update in progress... Please wait.'] = 'Aktualisierung in Arbeit…Bitte warten.';
+$lang['Ignore this update'] = 'Ignoriere diese Aktualisierung';
+$lang['Reset ignored updates'] = 'Zurücksetzen der ignorierten Aktualisierungen';
+$lang['Update All'] = 'Aktualisiere alles';
+$lang['ERROR'] = 'FEHLER';
+$lang['Update Complete'] = 'Aktualisierung komplett';
+$lang['Piwigo Update'] = 'Piwigo Aktualisierung';
+$lang['Extensions Update'] = 'Aktualisierung der Erweiterungen';
+$lang['All extensions are up to date.'] = 'Alle Erweiterungen sind aktuell.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Folgende Erweiterungen sind möglicherweise nicht kompatibel mit der neuen Version der Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = ' Folgende Themen sind möglicherweise nicht kompatibel mit der neuen Version der Piwigo:';
+$lang['I decide to update anyway'] = 'Ich möchte trotzdem aktualisieren';
+$lang['Update to Piwigo %s'] = 'Aktualisierung auf Piwigo %s';
+$lang['Two updates are available'] = 'Zwei Aktualisierungen sind verfügbar';
+$lang['This is a minor update, with only bug corrections.'] = 'Dies ist eine kleine Aktualisierung nur zur Fehlerbeseitigung.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Dies ist eine größere Aktualisierung  mit <a href="%s">neuen Funktionen </a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Einigen Themen und Erweiterungen sind nun leider nicht mehr verfügbar.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Sie können direkt auf Piwigo %s aktualisieren ohne vorher auf Piwigo %s zu aktualisieren (empfohlen).';
+$lang['Save Template Directory'] = 'Sichere den Template-Ordner';
+$lang['Dump Database'] = 'Sichere die Datenbank';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Sichere auch die Daten der History (Warnung: kann das Speicherlimit des Servers überschreiten)';
+$lang['Unable to dump database.'] = 'Es ist nicht möglich die Datenbank zu sichern.';
+$lang['Some upgrades are available for extensions.'] = 'Einige Aktualisierungen für Erweiterungen sind verfügbar.';
+$lang['Ignore All'] = 'Ignoriere alle';
+$lang['Crop'] = 'Zuschneiden';
+$lang['Width'] = 'Breite';
+$lang['Height'] = 'Höhe';
+$lang['Follow Orientation'] = 'Folgen Sie der Orientierung';
+$lang['Graphics Library'] = ' Grafikbibliothek';
+$lang['Add a criteria'] = 'Ein Kriterium hinzufügen'; 
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = ' Sie können keine Standardsortierung festlegen da Sie eine benutzerdefinierte Einstellung in Ihrer lokalen Konfiguration festgelegt haben.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Sie haben <i>$conf[\'order_by\']</i> in ihrer lokalen Konfigurationsdatei festgelegt, dieser Parameter wird abgelehnt, bitte entfernen sie ihn oder benennen sie ihn um in <i>$conf[\'order_by_custom\']</i> !';
+$lang['Average rate'] = 'Durchschnittliche Bewertung';
+$lang['Rate'] = 'Bewertung';
+$lang['Learn more'] = 'Mehr Informationen';
+$lang['An error has occured during upgrade.'] = 'Ein Fehler trat während des Aktualisierens auf.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Ein Fehler trat während des Entpackens auf. Bitte prüfen Sie die Schreibrechte ihrer Piwigo Installation.<br><a href="%s">Klicken Sie hier für das Fehlerprotokoll</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kann die Aktualisierungsdatei nicht vom Server laden';
+$lang['Zoom'] = 'Zoom';
+$lang['(this tag will be deleted)'] = '(dieser Tag wird gelöscht!)';
+$lang['... or '] = '... oder';
+$lang['Allowed file types: %s.'] = 'Erlaubte Dateitypen: %s.';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Standardmäßig erstellt Piwigo eine für Web optimierete Ansicht der HD-Version (hochaufgelösten Version) deines Fotos';
+$lang['Confirm merge'] = 'Zusammenführen bestätigen';
+$lang['Create'] = 'Erstellen';
+$lang['hide details'] = 'Details verbergen';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Wenn das Bild nicht HD (hochaufgelöst) ist und das Bild kleiner ist als die für Web optimierte Größe, verwendet Piwigo dieses als HD und erstellt eine verkleinerte Web optimierten Version';
+$lang['Manage Permissions'] = 'Zugriff verwalten';
+$lang['Maximum file size: %sB.'] = 'Max. Dateigröße: %sB.';
+$lang['Merge selected tags'] = 'Gewählte Tags zusammenführen';
+$lang['Merge tags'] = 'Tags zusammenführen';
+$lang['No destination tag selected'] = 'Keinen Ziel-Tag gewählt';
+$lang['Photo %s of %s'] = 'Bild %s of %s';
+$lang['Select an album'] = 'Wähle ein Album';
+$lang['Select at least two tags for merging'] = 'Wahle 2 Tags zum Zusammenführen';
+$lang['Select the destination tag'] = 'Wähle Ziel-Tag';
+$lang['show details'] = 'Details zeigen';
+$lang['Start Upload'] = 'Upload starten';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tags <em>%s</em> in <em>%s</em> zusammengeführt';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Du benutzt den einfachen Uploader. Benutze den <a href="%s">Flash uploader</a> stattdessen.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Probleme mit dem Flash Uploader. Benutze den <a href="%s">Browser uploader</a>';
+$lang['A locked gallery is only visible to administrators'] = 'Eine gesperrte Gallerie kann nur von Administratoren betrachtet werden';
+$lang['Activate comments'] = 'Kommentare aktivieren';
+$lang['administrators'] = 'Administratoren';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Maximale Auflösung (ca.): %dM Pixel (das sind %dx%d Pixel).';
+$lang['Default comments order'] = 'Standard Sortierreihenfolge für Kommentare';
+$lang['Gallery unlocked'] = 'Gallerie entsperrt';
+$lang['modified'] = 'verändert';
+$lang['Move to album'] = 'Verschiebe ins Album';
+$lang['Notify administrators when a comment is'] = 'Administratoren bei folgenden Kommentaränderungen benachrichtigen';
+$lang['Original Size'] = 'Originalgröße';
+$lang['pending validation'] = 'Auf Bestätigung wartend';
+$lang['Photo name'] = 'Bildname';
+$lang['registered users'] = 'Registrierte Besucher';
+$lang['Resize after upload'] = 'Größe nach dem Upload anpassen';
+$lang['Save visits in history for'] = 'Besuche in der History speichern für';
+$lang['Send connection settings by email'] = 'Verbindungseinstellungen als E-mail senden';
+$lang['simple visitors'] = 'Einfache Besucher';
+$lang['The original image quality must be a number between %d and %d'] = 'Die original Bildqualität muss eine Zahl zwischen %d und %d sein';
+$lang['The original maximum height must be a number between %d and %d'] = 'Die original Maximalhöhe muss eine Zahl zwischen %d und %d sein';
+$lang['The original maximum width must be a number between %d and %d'] = 'Die original Maximalbreite muss eine Zahl zwischen %d und %d sein';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Die %d Fotos dieses Albums wurden zwischen %s und %s hochgeladen.';
+$lang['This album contains %d photos, added on %s.'] = 'Die %d Fotos dieses Albums wurden am %s hochgeladen.';
+$lang['This album contains no photo.'] = 'Dieses Album enthält keine Fotos.';
+$lang['Unlock gallery'] = 'Gallerie entsperren';
+$lang['Center of interest'] = 'Interessensmittelpunkt';
+$lang['Not cropped correctly?'] = 'Nicht richtig zugeschnitten?';
+$lang['apply automatic sort order'] = 'Automatische Sortierreihenfolge anwenden';
+$lang['Automatic sort order'] = 'Automatische Sortierreihenfolge';
+$lang['Cancel'] = 'Abbrechen';
+$lang['cancel manual order'] = 'Manuelle Reihenfolge abbrechen';
+$lang['List'] = 'Liste';
+$lang['Save manual order'] = 'Manuelle Reihenfolge speichern';
+$lang['You can activate only one mobile theme.'] = 'Sie können nur ein Mobile Layout aktivieren';
+$lang['%s has been successfully updated.'] = '%s wurde erfolgreich aktualisiert.';
+$lang['Add tags'] = 'Tag hinzufügen';
+$lang['Applications'] = 'Applikationen';
+$lang['Last import'] = 'Letzter Import';
+$lang['Predefined filter'] = 'Vordefinierte Filter';
+$lang['Web Form'] = 'Webformular';
+$lang['With no album'] = 'Ohne Album';
+$lang['With no tag'] = 'Ohne Tag';
+$lang['With no virtual album'] = 'Ohne virtuelles Album';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'Die <em>Piwigo für Android</em> App ermöglicht es Dir, dich auf Deine Piwigo Gallerie zu verbinden, Alben zu erstellen und mehrere Fotos gleichzeitig hochzuladen.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Die <em>Piwigo für iOS</em> App ermöglicht es Dir, dich auf Deine Piwigo Gallerie zu verbinden, Alben zu erstellen und mehrere Fotos gleichzeitig hochzuladen.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom ist eine Bildbearbeitungssoftware, die entwickelt wurde, um eine grosse Anzahl an Bildern zu verwalten und zu bearbeiten.';
+$lang['Available on'] = 'Verfügbar am';
+$lang['Available versions for'] = 'Verfügbare Versionen für';
+$lang['Piwigo for Android'] = 'Piwigo für Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo für iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Veröffentlichungsplugin für Lightroom';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Der Piwigo Veröffentlichungsplugin erlaubt es Dir, Bilder direkt aus Lightroom mit Deiner Piwigo Gallerie zu synchronisieren.';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u Benutzer haben automatisch Zugriff weil sie zu einer Gruppe mit entsprechenden Zugriffrechten gehören.';
+$lang['any visitor can see this album'] = 'jeder Besucher kann das Album sehen';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture für Mac ist ein mächtiges Werkzeug um Bilder zu bearbeiten und grpße Sammlungen zu verwalten';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture ist für professionelle Photographen mit der einfach von iPhoto';
+$lang['Groups and users'] = 'Gruppen und Benutzer';
+$lang['include photos with lower privacy level'] = 'Photos mit geringerer Privatsphäre einschließen';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto ist standard Photoverwaltungs-Programm  in MacOSX. Das Piwigo Export Plugin ermöglicht das Erstellen von Alben und das Exportieren von Fotos direkt aus iPhoto in die Piwigo Galery';
+$lang['Permission granted for users'] = 'Zugriff für Benutzer erlaubt';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo Export Plugin für Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo Export Plugin für iPhoto';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo ';
+$lang['Select groups...'] = 'Wähle Gruppen...';
+$lang['Select users...'] = 'Wähle Benutzer...';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Das Piwigo Export Plugin erlaubt es Alben zu erstellen und Photos zu exportieren';
+$lang['There is no group in this gallery.'] = 'Es gibt keine Gruppe in dieser Gallery';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Besucher müssen sich einloggen um das Album zu sehen (Zugriffsrechte)';
+$lang['Delete multiple size images'] = 'Merhfache Bildgrößen löschen';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam ist ein fortschrittliches, kostenfreies Bildverwaltungsprogramm für Linux, Windows und MacOSX';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam ist für Photographen, die Bilder anschauen, verwalten, bearbeiten, verbessern, verschlagworten oder teilen wollen.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funktionen inklusive Galery durchblättern, Alben erstellen und Bilder hochladen.';
+$lang['Generate multiple size images'] = 'Merhfache Bildgrößen generieren';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'In Linux kann Shotwell ganze einfach mit dem Paketmanager mit der Piwigo Publishing option installieren.';
+$lang['Permission granted for groups'] = 'Zugriff für Gruppen erlaubt';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo Veröffentlichungs-Plugin für digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery App für Android) is ein Open-Source (GPL v3) Piwigo Client für Android.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell ist eine Open-Source Bildverwaltung für Linux. Es ist das standard Bildverwaltungsprogramm unter Ubuntu und Fedora.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Um deine Bilder von didiKam nach Piwigo zu exportieren, installiere einfach digiKam mit den Kipi-Plugins';
+$lang['No group is permitted to see this private album'] = 'Keine Gruppe hat Zugriff um das private Album anzusehen';
+$lang['Permission management'] = 'Zugriffsverwaltung';
+$lang['custom'] = 'Anpassung';
+$lang['Photo sizes with crop'] = 'Bildgrößen nach Zuschnitt';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Der Mittelpunkt ist der bedeutungsvollste Bereich im Bild.';
+$lang['add a new watermark'] = 'ein neues Wasserzeichen hinzufügen';
+$lang['Apply watermark if height is bigger than'] = 'Wasserzeichen anwenden, wenn die Höhe größer ist als';
+$lang['Apply watermark if width is bigger than'] = 'Wasserzeichen anwenden, wenn die Breite größer ist als';
+$lang['bottom left corner'] = 'linke untere Ecke';
+$lang['bottom right corner'] = 'rechte untere Ecke';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Standardmäßig wird der Interessenschwerpunkt in der Mitte des Fotos platziert.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Für Foto-Größen mit einem Schnitt, wie zum Beispiel "quadratisch", wird Piwigo sein Bestes tun, um den Interessenschwerpunkt einzubeziehen.';
+$lang['middle'] = 'Mitte';
+$lang['Opacity'] = 'Deckkraft';
+$lang['Select a file'] = 'Wählen Sie eine Datei';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Wählen Sie eine Zone mit Ihrer Maus, um ein neues Interessenschwerpunkt zu definieren.';
+$lang['top left corner'] = 'obere linke Ecke';
+$lang['top right corner'] = 'obere rechte Ecke';
+$lang['X Position'] = 'X Position';
+$lang['X Repeat'] = 'X Wiederholen';
+$lang['Y Position'] = 'Y Position';
+$lang['Multiple Size'] = 'Mehrfache Größe';
+?>
Index: tags/2.4.0RC3/language/de_DE/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Deutsch [DE]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=416
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Deutsch';
+$lang_info['country'] = 'Deutschland';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'de';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d Album aktualisiert';
+$lang['%d albums updated'] = '%d Alben aktualisiert';
+$lang['%d comment to validate'] = '%d Kommentar freizuschalten';
+$lang['%d comments to validate'] = '%d Kommentare freizuschalten';
+$lang['%d new comment'] = '%d neuer Kommentar';
+$lang['%d new comments'] = '%d neue Kommentare';
+$lang['%d comment'] = '%d Kommentar';
+$lang['%d comments'] = '%d Kommentare';
+$lang['%d hit'] = '%d Aufruf';
+$lang['%d hits'] = '%d Aufrufe';
+$lang['%d new photo'] = '%d neues Foto';
+$lang['%d new photos'] = '%d neue Fotos';
+$lang['%d new user'] = '%d neuer Benutzer';
+$lang['%d new users'] = '%d neue Benutzer';
+$lang['About'] = 'Über uns';
+$lang['All tags'] = 'Alle Stichworte';
+$lang['Any tag'] = 'Beliebiges Stichwort';
+$lang['At least one listed rule must be satisfied.'] = 'Mindestens eine aufgelistete Regel muss übereinstimmen.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Alben';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Dieses Fenster schließen';
+$lang['Complete RSS feed (photos, comments)'] = 'Vollständiger RSS-Feed (Fotos, Kommentare)';
+$lang['Confirm Password'] = 'Neues Passwort bestätigen';
+$lang['Connection settings'] = 'Login-Einstellungen';
+$lang['Login'] = 'Anmeldung';
+$lang['Contact webmaster'] = 'Mail an den Webmaster';
+$lang['Create a new account'] = 'Erstellen Sie ein neues Konto';
+$lang['Created on'] = 'Erstellt am';
+$lang['Creation date'] = 'Erstellungsdatum';
+$lang['Current password is wrong'] = 'Aktuelles Passwort ist falsch';
+$lang['Dimensions'] = 'Abmessungen';
+$lang['Display'] = 'Anzeige';
+$lang['Each listed rule must be satisfied.'] = 'Jede aufgelistete Regel muss erfüllt sein';
+$lang['Email address is missing. Please specify an email address.'] = 'Die E-Mail-Adresse fehlt.';
+$lang['Email address'] = 'E-Mail-Adresse';
+$lang['Enter your personnal informations'] = 'Geben Sie Ihre persönlichen Daten an';
+$lang['Error sending email'] = 'Fehler beim Senden der Mail';
+$lang['File name'] = 'Name der Datei';
+$lang['File'] = 'Datei';
+$lang['Filesize'] = 'Dateigröße';
+$lang['Filter and display'] = 'Filtern und anzeigen';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Passwort vergessen?';
+$lang['Go through the gallery as a visitor'] = 'Besuche die Galerie mit Besucherrechten';
+$lang['Help'] = 'Hilfe';
+$lang['Identification'] = 'Anmeldung';
+$lang['Photos only RSS feed'] = 'Nur Foto RSS-Feed';
+$lang['Keyword'] = 'Stichwort';
+$lang['Links'] = 'Links';
+$lang['N/A'] = 'nicht vorhanden';
+$lang['New on %s'] = 'Neu am %s';
+$lang['Notification'] = 'RSS-Feed';
+$lang['Number of items'] = 'Anzahl der Elemente';
+$lang['Original dimensions'] = 'Ursprüngliche Abmessungen';
+$lang['Password forgotten'] = 'Passwort vergessen';
+$lang['Password'] = 'Passwort';
+$lang['Post date'] = 'Einstellungsdatum';
+$lang['Posted on'] = 'Eingetragen am';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Schnelle Anmeldung';
+$lang['RSS feed'] = 'RSS-Feed';
+$lang['Register'] = 'Registrieren';
+$lang['Registration'] = 'Registrierung';
+$lang['Related tags'] = 'Mit den Stichworten';
+$lang['Reset'] = 'Abbrechen';
+$lang['Retrieve password'] = 'Passwort abrufen';
+$lang['Search rules'] = 'Suchkriterien';
+$lang['Search tags'] = 'Stichworte suchen';
+$lang['Search'] = 'Suchen';
+$lang['display available tags'] = 'alle verfügbaren Stichworte';
+$lang['Since'] = 'Seit';
+$lang['Sort by'] = 'Sortieren nach';
+$lang['Sort order'] = 'Sortierreihenfolge';
+$lang['Tag'] = 'Stichwort';
+$lang['Tags'] = 'Stichworte';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Die RSS Mittteilung beinhaltet Neuigkeiten von dieser Website: neue Fotos, aktualisierte Alben, neue Kommentare. Benutze einen RSS feed reader.';
+$lang['Unknown feed identifier'] = 'Feed-ID unbekannt';
+$lang['User comments'] = 'Benutzerkommentare';
+$lang['Username'] = 'Benutzername';
+$lang['Visits'] = 'Besuche';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Woche %d';
+$lang['About Piwigo'] = 'Über Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Sie sind nicht berechtigt die gewünschte Seite aufzurufen';
+$lang['add this photo to your favorites'] = 'füge dieses Foto den Favoriten hinzu';
+$lang['Administration'] = 'Administration';
+$lang['all'] = 'alle';
+$lang['ascending'] = 'wachsende';
+$lang['author(s) : %s'] = 'Autor(en) : %s';
+$lang['Expand all albums'] = 'Albenbaum komplett ausklappen';
+$lang['posted after %s (%s)'] = 'eingestellt nach dem %s (%s)';
+$lang['posted before %s (%s)'] = 'eingestellt vor dem %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'eingestellt zwischen %s (%s) und %s (%s)';
+$lang['posted on %s'] = 'eingestellt am %s';
+$lang['Best rated'] = 'Am besten bewertet';
+$lang['display best rated photos'] = 'zeige die am besten bewerteten Fotos';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Alles';
+$lang['display each day with photos, month per month'] = 'zeige jeden Tag mit Fotos, Monat für Monat';
+$lang['View'] = 'Ansicht';
+$lang['chronology_monthly_calendar'] = 'Monatskalender';
+$lang['chronology_monthly_list'] = 'Monatliche Liste';
+$lang['chronology_weekly_list'] = 'Wöchentliche Liste';
+$lang['Click here if your browser does not automatically forward you'] = 'Klicken Sie hier, wenn Sie nicht durch ihren Browser weitergeleitet werden.';
+$lang['comment date'] = 'Datum des Kommentars';
+$lang['Comment'] = 'Kommentar';
+$lang['Your comment has been registered'] = 'Ihr Kommentar wurde gespeichert';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-Spam-Sperre, bitte warte eine Weile, bis du den nächsten Kommentar abgibst';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Dein Kommentar wurde abgelehnt da er evtl. gesetzte Regeln verletzt';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Ein Administrator muss deinen Beitrag freischalten bevor er sichtbar wird.';
+$lang['This login is already used by another user'] = 'Dieser Benutzername ist bereits vergeben';
+$lang['Comments'] = 'Kommentare';
+$lang['Add a comment'] = 'Kommentar hinzufügen';
+$lang['created after %s (%s)'] = 'erstellt nach dem %s (%s)';
+$lang['created before %s (%s)'] = 'erstellt vor dem %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'erstellt zwischen %s (%s) und %s (%s)';
+$lang['created on %s'] = 'erstellt am %s';
+$lang['Customize'] = 'Benutzerdaten / Layout';
+$lang['Your Gallery Customization'] = 'Anpassung des Seitentitels ';
+$lang['day'][0] = 'Sonntag';
+$lang['day'][1] = 'Montag';
+$lang['day'][2] = 'Dienstag';
+$lang['day'][3] = 'Mittwoch';
+$lang['day'][4] = 'Donnerstag';
+$lang['day'][5] = 'Freitag';
+$lang['day'][6] = 'Samstag';
+$lang['Default'] = 'Standardmäßig';
+$lang['delete this photo from your favorites'] = 'lösche dieses Foto von den Favoriten';
+$lang['Delete'] = 'Löschen';
+$lang['descending'] = 'absteigend';
+$lang['Download'] = 'Herunterladen';
+$lang['Download this file'] = 'Download dieser Datei';
+$lang['edit'] = 'bearbeiten';
+$lang['wrong date'] = 'Datum falsch';
+$lang['excluded'] = 'ausgeschlossen';
+$lang['Your favorites'] = 'Meine Favoriten';
+$lang['display your favorites photos'] = 'zeige die Favoriten-Fotos';
+$lang['Favorites'] = 'Favoriten';
+$lang['First'] = 'Erste Seite';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Der Schreibzugriff auf die Datenbank ist wegen Wartungsarbeiten blockiert. Bitte besuchen Sie uns später wieder.';
+$lang['Page generated in'] = 'Seite erstellt in';
+$lang['guest'] = 'Besucher';
+$lang['Hello'] = 'Hallo';
+$lang['available for administrators only'] = 'verfügbar nur für Administratoren';
+$lang['display this album'] = 'zeige dieses Album';
+$lang['display last user comments'] = 'zeige die letzten Benutzerkommentare';
+$lang['customize the appareance of the gallery'] = 'anpassen des Erscheinungsbildes der Galerie';
+$lang['search'] = 'suchen';
+$lang['Home'] = 'Startseite';
+$lang['Identification'] = 'Identifikation';
+$lang['in this album'] = 'in diesem Album';
+$lang['in %d sub-album'] = 'in %d Sub-Album';
+$lang['in %d sub-albums'] = 'in %d Sub-Alben';
+$lang['included'] = 'enthalten';
+$lang['Invalid password!'] = 'Passwort ungültig!';
+$lang['Language'] = 'Sprache';
+$lang['last %d days'] = '%d letzte Tage';
+$lang['Last'] = 'Letzte Seite';
+$lang['Logout'] = 'Abmelden';
+$lang['obligatory'] = 'obligatorisch';
+$lang['Maximum photo height'] = 'Maximale Fotohöhe';
+$lang['Maximum height must be a number superior to 50'] = 'Die maximale Höhe der Bilder größer als 50 sein';
+$lang['Maximum photo width'] = 'Maximale Fotobreite';
+$lang['Maximum width must be a number superior to 50'] = 'Die Breite der Bilder muss größer als 50 sein';
+$lang['display a calendar by creation date'] = 'zeige einen Kalender nach Erstellungsdatum';
+$lang['display all photos in all sub-albums'] = 'zeige alle Fotos in allen Sub-Alben';
+$lang['return to normal view mode'] = 'zurück zur normalen Ansicht';
+$lang['display a calendar by posted date'] = 'zeige einen Kalender nach Einstellungsdatum';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'Dezember';
+$lang['month'][1] = 'Januar';
+$lang['month'][2] = 'Februar';
+$lang['month'][3] = 'März';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Juni';
+$lang['month'][7] = 'Juli';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['Most visited'] = 'Am häufigsten gesehen';
+$lang['display most visited photos'] = 'zeige die meistbesuchten Fotos';
+$lang['Unknown identifier'] = 'ID unbekannt';
+$lang['New password'] = 'Neues Passwort';
+$lang['Rate this photo'] = 'Bewerte dieses Foto';
+$lang['Next'] = 'Vorwärts';
+$lang['no rate'] = 'noch keine Bewertung';
+$lang['Photos posted within the last %d day.'] = 'Fotos eingestellt im letzen %d Tag.';
+$lang['Photos posted within the last %d days.'] = 'Fotos eingestellt in den letzen %d Tagen.';
+$lang['password updated'] = 'Passwort aktualisiert';
+$lang['Recent period must be a positive integer value'] = 'Der Zeitraum muss eine positive ganze Zahl sein';
+$lang['photo'] = 'Foto';
+$lang['Click on the photo to see it in high definition'] = 'Klicke auf das Foto um es in hoher Auflösung zu sehen';
+$lang['Show file metadata'] = 'Zeige die Meta-Daten in der Datei';
+$lang['Powered by'] = 'Unterstützt von';
+$lang['Preferences'] = 'Einstellungen';
+$lang['Previous'] = 'Zurück';
+$lang['Random photos'] = 'Zufällige Fotos';
+$lang['display a set of random photos'] = 'zeige einen Satz von zufälligen Fotos';
+$lang['Recent albums'] = 'Neueste Alben';
+$lang['display recently updated albums'] = 'Zeigt kürzlich aktualisierte Alben an';
+$lang['Recent period'] = 'Wieviele Tage sollen Bilder als "neu" markiert werden?';
+$lang['Recent photos'] = 'Neueste Fotos';
+$lang['display most recent photos'] = 'zeige die neuesten Fotos';
+$lang['Redirection...'] = 'Umleitung ...';
+$lang['Please, enter a login'] = 'Bitte geben Sie einen Benutzernamen ein';
+$lang['login mustn\'t end with a space character'] = 'Benutzername darf nicht mit einem Leerzeichen enden';
+$lang['login mustn\'t start with a space character'] = 'Benutzername darf nicht mit einem Leerzeichen anfangen';
+$lang['this login is already used'] = 'dieser Benutzername ist bereits vergeben';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-Mail-Adresse muss in der Form xxx@yyy.eee (Beispiel: jack@altern.org) sein';
+$lang['please enter your password again'] = 'bitte geben Sie erneut Ihr Passwort ein';
+$lang['Auto login'] = 'Auto-Login';
+$lang['remove this tag from the list'] = 'entfernen dieses Stichwort von der Liste';
+$lang['representative'] = 'repräsentativ';
+$lang['Search for Author'] = 'Suche nach Autor';
+$lang['Search in albums'] = 'Suche in den Alben';
+$lang['Search by date'] = 'Suche nach Datum';
+$lang['Date'] = 'Datum';
+$lang['End-Date'] = 'Enddatum';
+$lang['Kind of date'] = 'Datumstyp';
+$lang['Search for words'] = 'Suche nach Wörtern';
+$lang['Search for all terms'] = 'Suche alle Wörter';
+$lang['Search for any term'] = 'Wörter suchen';
+$lang['Empty query. No criteria has been entered.'] = 'Abfrage leer. Kein Kriterium eingegeben.';
+$lang['Search results'] = 'Suchergebnisse';
+$lang['Search in sub-albums'] = 'Suche in den Sub-Alben';
+$lang['searched words : %s'] = 'Suchbegriffe : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'als Vorschaubild des Albums setzen';
+$lang['Show number of comments'] = 'Zeige die Anzahl der Kommentare';
+$lang['Show number of hits'] = 'Zeige die Anzahl der Bildaufrufe';
+$lang['slideshow'] = 'Diashow';
+$lang['stop the slideshow'] = 'Diashow beenden';
+$lang['Specials'] = 'Erweitert';
+$lang['SQL queries in'] = 'SQL-Abfragen in';
+$lang['display only recently posted photos'] = 'zeige nur kürzlich eingestellte Fotos';
+$lang['return to the display of all photos'] = 'zurück zu allen Fotos';
+$lang['the beginning'] = 'Beginn';
+$lang['Interface theme'] = 'Galerie-Layout';
+$lang['Thumbnails'] = 'Vorschaubilder';
+$lang['Menu'] = 'Menü';
+$lang['A comment on your site'] = 'Ein Kommentar auf der Website';
+$lang['today'] = 'heute';
+$lang['Update your rating'] = 'Aktualisieren Sie Ihre Bewertung';
+$lang['the username must be given'] = 'Benutzername fehlt';
+$lang['useful when password forgotten'] = 'nützlich, wenn Sie ihr Passwort vergessen';
+$lang['Quick search'] = 'Schnellsuche';
+$lang['Connected user: %s'] = 'Verbundene Benutzer: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Browser: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Kommentar: %s';
+$lang['Comment by %s'] = 'Kommentar von %s';
+$lang['User: %s'] = 'Benutzer: %s';
+$lang['Email: %s'] = 'E-Mail: %s';
+$lang['Admin: %s'] = 'Verwaltung: %s';
+$lang['Registration of %s'] = 'Registrierung von %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status, der Benutzer "guest" nicht entspricht, Verwendung des Standardstatus. Bitte kontaktieren Sie den Webmaster.';
+$lang['this email address is already in use'] = 'diese E-Mail-Adresse wird bereits verwendet';
+$lang['Album results for'] = 'Albumresultate für';
+$lang['Tag results for'] = 'Stichwort-Ergebnisse für';
+$lang['from %s to %s'] = 'von %s bis %s';
+$lang['Play of slideshow'] = 'Start der Diashow';
+$lang['Pause of slideshow'] = 'Pause der Diashow';
+$lang['Repeat the slideshow'] = 'Wiederholen der Diashow';
+$lang['Not repeat the slideshow'] = 'Diashow nicht wiederholen';
+$lang['Reduce diaporama speed'] = 'Diashow langsamer anzeigen';
+$lang['Accelerate diaporama speed'] = 'Diashow schneller anzeigen';
+$lang['Submit'] = 'Bestätigen';
+$lang['Yes'] = 'Ja';
+$lang['No'] = 'Nein';
+$lang['%d photo'] = '%d Foto';
+$lang['%d photos'] = '%d Fotos';
+$lang['%d photo is also linked to current tags'] = '%d Foto ist auch mit diesen Stichworten verbunden';
+$lang['%d photos are also linked to current tags'] = '%d Fotos sind auch mit diesen Stichworten verbunden';
+$lang['display photos linked to this tag'] = 'Zeige Fotos, die mit diesem Stichwort verbunden sind';
+$lang['photos posted during the last %d days'] = 'Fotos eingestellt während der letzten %d Tage';
+$lang['Piwigo Help'] = 'Piwigo Hilfe';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'Gruppieren nach Buchstaben';
+$lang['letters'] = 'Buchstaben';
+$lang['show tag cloud'] = 'zeige die Stichwortwolke';
+$lang['cloud'] = 'Wolke';
+$lang['Reset to default values'] = 'Zurücksetzen auf Standardwerte';
+$lang['delete all photos from your favorites'] = 'lösche alle Fotos von der Favoritenliste';
+$lang['Sent by'] = 'Gesendet von';
+$lang['Are you sure?'] = 'Sind Sie sicher?';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies werden geblockt oder nicht von ihrem Browser unterstützt. Sie müssen sie erlauben um sich zu verbinden.';
+$lang['Edit a comment'] = 'Bearbeite einen Kommentar';
+$lang['(!) This comment requires validation'] = '(!) Dieser Kommentar muss berprüft werden';
+$lang['Welcome'] = 'Willkommen';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Willkommen in deiner Piwigo-Fotogalerie!';
+$lang['... or browse your empty gallery'] = '... oder durchsuche deine leere Galerie';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... oder deaktiviere diese Nachricht, ich finde mich selbst zurecht';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %s, deine Piwigo-Fotogalerie ist leer!';
+$lang['I want to add photos'] = 'Ich möchte Fotos hinzufügen';
+$lang['Manage this user comment: %s'] = 'Verwalte diesen Benutzerkommentar: %s';
+$lang['This author modified following comment:'] = 'Dieser Autor veränderte folgenden Kommentar:';
+$lang['This author removed the comment with id %d'] = 'Dieser Autor löschte den Kommentar mit der ID %d';
+$lang['html tags are not allowed in login'] = 'HTML-Tags sind im Benutzername nicht erlaubt';
+$lang['The number of photos per page must be a not null scalar'] = ' Die Anzahl der Fotos pro Seite muss eine ganze Zahl größer als Null sein ';
+$lang['Number of photos per page'] = 'Anzahl der Fotos pro Seite';
+$lang['%d rates'] = '%d Bewertungen';
+$lang['Rating score'] = 'Bewertungs-Stand';
+$lang['Change my password'] = 'Mein Passwort ändern';
+$lang['Check your email for the confirmation link'] = 'Prüfe dein E-Mail Postfach auf die E-Mail mit  Bestätigungs-Link';
+$lang['Enter your new password below.'] = 'Neues Passwort unten eingeben';
+$lang['EXIF Metadata'] = 'EXIF Metadaten';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Wenn das nicht beabsichtigt war, ignoriere diese E-Mail';
+$lang['Invalid key'] = 'Ungültiger Schlüsssel';
+$lang['Invalid username or email'] = 'Falscher Benutzername oder E-Mail';
+$lang['IPTC Metadata'] = 'IPTC Metadaten';
+$lang['Password Reset'] = 'Passwort zurücksetzen';
+$lang['Password reset is not allowed for this user'] = 'Dieser benutzer darf das Passwort nicht zurücksetzen';
+$lang['Please enter your username or email address.'] = 'Bitte Benutzername oder E-Mail Adresse eingeben';
+$lang['Return to home page'] = 'Zurück zur Startseite';
+$lang['The passwords do not match'] = 'Das Passwort stimmt nicht überein';
+$lang['To reset your password, visit the following address:'] = 'Um das Passwort zurückzusetzen, klicke folgenden Link:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Der Benutzer "%s" hat keine E-Mail Adresse, zurücksetzen des Passworts nicht möglich';
+$lang['Username or email'] = 'Benutzername oder E-Mail';
+$lang['You will receive a link to create a new password via email.'] = 'Per E-Mail erhältst du einen Link um ein neues Passwort zu erstellen';
+$lang['Your password has been reset'] = 'Dein Passwort wurde zurückgesetzt';
+$lang['Edit'] = 'Bearbeiten';
+$lang['Hello %s,'] = 'Hallo %s,';
+$lang['Here are your connection settings'] = 'Das sind deine Verbindungseinstellungen';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Solltest du die E-Mail unerwünscht erhalten haben, kontaktiere uns unter %s';
+$lang['large'] = 'groß';
+$lang['medium'] = 'mittel';
+$lang['Original'] = 'Original';
+$lang['Password: %s'] = 'Passwort: %s';
+$lang['Send my connection settings by email'] = 'Verbindungseinstellungen per E-Mail versenden';
+$lang['small'] = 'klein';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Eine Anfrage zum Zurücksetzen des Passworts für den folgenden Benutzer wurde gestellt:';
+$lang['square'] = 'quadratisch';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Erfolgreich registriert, du wirst in Kürze eine E-Mail mit deinen Zugangdaten erhalten. Herzlich Willkommen!';
+$lang['Thank you for registering at %s!'] = 'Danke für Deine Registrierung bei %s';
+$lang['thumb'] = 'miniatur';
+$lang['Username "%s" on gallery %s'] = 'Benutzername "%s" bei Galerie %s';
+$lang['Username modification'] = 'Benutzername ändern';
+$lang['Username: %s'] = 'Benutzername: %s';
+$lang['xlarge'] = 'xgroß';
+$lang['xxlarge'] = 'xxgroß';
+$lang['Your username has been successfully changed to : %s'] = 'Dein Benutzername ist jetzt:';
+$lang['Photo sizes'] = 'Bildgrößen';
+$lang['Desktop'] = 'Desktop';
+$lang['Mobile'] = 'Mobil';
+$lang['Show latest comments first'] = 'Neuesten Kommentar zuerst anzeigen';
+$lang['Show oldest comments first'] = 'Ältesten Kommentar zuerst anzeigen';
+$lang['View in'] = 'Anzeigen in';
+$lang['2small'] = 'XXS - winzig';
+$lang['xsmall'] = 'XS - sehr klein';
+$lang['Date created, new &rarr; old'] = 'Datum erstellt, neu &rarr; alt';
+$lang['Date created, old &rarr; new'] = 'Datum erstellt, alt &rarr; neu';
+$lang['Date posted, new &rarr; old'] = 'Datum veröffentlicht, neu &rarr; alt';
+$lang['Date posted, old &rarr; new'] = 'Datum veröffentlicht, alt &rarr; neu';
+$lang['File name, A &rarr; Z'] = 'Dateiname, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Dateiname, Z &rarr; A';
+$lang['Manual sort order'] = 'Manuelle Sortierung';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numerischer Bezeichner, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numerischer Bezeichner, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Bildname, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Bildname, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Bewertung, hoch &rarr; niedrig';
+$lang['Rating score, low &rarr; high'] = 'Bewertung, niedrig &rarr; hoch';
+$lang['Visits, high &rarr; low'] = 'Besuche, hoch &rarr; niedrig';
+$lang['Visits, low &rarr; high'] = 'Besuche, hoch &rarr; niedrig';
+?>
Index: tags/2.4.0RC3/language/de_DE/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,131 @@
+<h2>Ein Album bearbeiten</h2>
+
+<h3>Informationen</h3>
+
+<ul>
+
+   <li><strong>Name</strong>: Umbenennen eines Albums (oder Erstellen eines virtuellen Names für ein physisches Album).</li>
+
+   <li><strong>Beschreibung</strong>: kurze Beschreibung des Inhalts.
+   Dieser Text wird am unteren Rand der Vorschauseite angezeigt.</li>
+
+</ul>
+
+<h3>Verschieben</h3>
+
+<p>Sie können virtuelle Alben verschieben. Verschieben bedeutet, dass Sie dem Album ein
+neues Vorgängeralbum zuweisen.</p>
+
+<h3>Optionen</h3>
+
+<ul>
+
+   <li><strong>Art des Zugriffs</strong>: Verwalten der Zugriffsrechte. Wenn Sie ein Album als privat markieren,
+  werden auch alle Unteralben als privat markiert. Ebenso werden alle Unteralben eines Albums als öffentlich markiert,
+  wenn sie es als öffentlich markieren.</li>
+
+   <li><strong>Sperren</strong>: Das Album und alle Unteralben werden temporär gesperrt (z.B. für Wartungsarbeiten).</li>
+
+   <li><strong>Kommentare</strong>: Erlauben Sie Benutzern, Fotos dieses Albums zu kommentieren.</li>
+
+</ul>
+
+<p>Sie können diese Optionen auch auf den Seiten zur Verwaltung der Eigenschaften
+(Seiten <span class = "pwgScreen">Kommentare</span>, <span
+class = "pwgScreen">Sperren</span>, <span
+class = "pwgScreen">Öffentlich/Privat</span>, <span
+class = "pwgScreen">Vertreter</span> zu finden unter <span
+class = "pwgScreen">Verwaltung &raquo; Alben &raquo; Eigenschaften</span >) verwalten.</p>
+
+<h3>Sortierreihenfolge</h3>
+
+<p>Verwenden Sie die Standardmethode zum Sortieren der Bilder.</p>
+
+<p>Geben Sie an, ob die Sortiermethode auch für Unteralben angewendet werden soll.</p>
+
+<p>Sortierkriterien für dieses Album auswählen.</p>
+<ul>
+<li><strong>Erstellungsdatum</strong>: Datum der Aufnahme</li>
+<li><strong>Datum:</strong>: Datum der Synchronisierung</li>
+<li><strong>Durchschnittswertung (*)</strong>: Wird durch die Besucherwertung beeinflusst</li>
+<li><strong>Am öftesten besucht (*)</strong>: Wird durch die Anzahl der Aufrufe beinflusst</li>
+<li><strong>Dateiname</strong>: Name der Datei</li>
+<li><strong>ID:</strong> Interne ID (Neuere Alben haben eine höhere ID als ältere).</li>
+
+</ul>
+<p><strong>(*)</strong> Achtung: Testen Sie die ausgewählte Sortiermethode, da sie unerwartete Ergebnisse liefern können.</p>
+
+
+<h3>Vorschau</h3>
+
+<p>Die Vorschau eines Albums ist die Miniaturansicht, die auf der Hauptseite
+(<span class = "pwgScreen">category.php</span>) angezeigt wird, wenn das Album selbst
+keine Bilder sondern nur Unteralben enthält.</p>
+
+<p>Es gibt 4 Möglichkeiten zur Auswahl:</p>
+
+<ul>
+
+   <li><span class="pwgScreen">Bilderseite</span>: Eine der Aktionen zu einem Bild erlaubt es Ihnen, das gerade
+  angezeigt Bild als Vorschau für das Album zu definieren. Diese Aktion steht nur Administratoren
+  zur Verfügung.</li>
+
+   <li><span class="pwgScreen">Bearbeiten von Bildinformationen</span>
+in der Verwaltung. Diese Funktion können Sie über <span
+class = "pwgScreen">picture.php</span> <span class="pwgScreen"> oder die Batchverwaltung
+</span> im <em>Einzelmodus</em> erreichen. Die Hilfe der angeführten Seiten bietet mehr Informationen
+  zu diesen Funktionen.</li>
+
+   <li><span class="pwgScreen">Verwaltung &raquo; Alben &raquo; Eigenschaften &raquo;
+Vorschaubild</span>. Details hierzu finden Sie in der Hilfe der angeführten Seite.</li>
+
+   <li><span class="pwgScreen">Bearbeiten eines Albums</span> (auf dieser Seite).</li>
+
+</ul>
+
+<p>Die Wahl des Vorschaubilds wird durch die Option
+<code>allow_random_representative</code> beinflusst (siehe <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In der Standardeinstellung (<code>allow_random_representative</code> auf false), wird jedes Album,
+dass mindestens ein Element enthält, durch ein definiertes Vorschaubild repräsentiert. Einmal gesetzt
+(während der Albenerstellung), kann das Vorschaubild nur durch einen Administrator geändert werden.
+Passt das definierte Vorschaubild nicht, wählen Sie einfach die Funktion <strong>Bestimme ein neues
+ zufälliges Vorschaubild</strong>.</p>
+
+<p>Ist die Option <code>allow_random_representative</code> auf true gesetzt, kann ein Album mit Bildern
+kein definiertes Vorschaubild haben. Verwenden Sie in diesem Fall die Funktion <strong>Lösche Vorschaubild</strong>.</p>
+
+<p>Wenn das Album keine Bilder sondern nur Unteralben enthält, kann es dennoch von einem Element repräsentiert werden.
+Verwenden Sie hierzu die Funktion <strong>Lösche Vorschaubild</strong> auf der Seite
+<span class="pwgScreen">Information eines Bildes bearbeiten</span>.</p>
+
+<h3>Verknüpfen aller Bilder eines Albums mit einem neuen Album</h3>
+
+<ul>
+
+<li><strong>Virtueller Albumname</strong>: Name des neuzuerstellenden Albums.
+Alle Bilder des aktuellen Albums werden mit dem neuen Album verknüpft.</li>
+
+<li><strong>Vorläuferalbum</strong>: Die Position des neuen Albums. Tragen Sie hier keinen Wert ein, um das Album
+an der Spitze Ihrer Alben einzufügen.</li>
+
+</ul>
+
+<h3>Verknüpfen aller Bilder eines Albums mit einem existieren Album</h3>
+
+<ul>
+
+<li><strong>Alben</strong>: Wählen Sie das Zielalbum.</li>
+
+</ul>
+
+<h3>Senden einer Informationsmail an die Gruppenmitglieder</h3>
+
+<ul>
+
+<li><strong>Gruppe</strong>: Empfängergruppe</li>
+
+<li><strong>Inhalt der E-Mail</strong>: Den zu sendendenen Text.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/de_DE/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/cat_move.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Verschieben von virtuellen Alben</h2>
+
+<p>Nur virtuelle Alben können ein neues Vorgängeralbum besitzen.</p>
+
+<h3>Virtuelle Alben verschieben</h3>
+
+<p>Wählen Sie eines oder mehrere virtuelle Alben, die Sie verschieben wollen.
+Die Liste ist leer, wenn Sie noch kein virtuelles Album erstellt haben.</p>
+
+<h3>Neues Vorgängeralbum</h3>
+
+<p>Wählen Sie das neue Vorgängeralbum (virtuell oder physisch).
+Wenn Sie kein Vorgängeralbum auswählen, wird Ihr neues, virtuelles Album an die Spitze
+der Alben verschoben.
+Ein Album kann nicht auf sich selbst oder in eines seiner Nachfolger verschoben werden.</p>
Index: tags/2.4.0RC3/language/de_DE/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Eigenschaften von Alben</h2>
+
+<p>Diese Seite erlaubt die Verwaltung der Eigenschaften mehrerer Alben zugleich.</p>
+
+<dl>
+
+  <dt>Öffentlich / Privat</dt>
+  <dd>Alben können als privat gekennzeichnet werden. Wenn ein Album als privat gekennzeichnet ist, können Sie erweiterte Zugriffsberechtigungen für Benutzer und Gruppen vergeben.</dd>
+
+  <dt>Sperren</dt>
+  <dd>Gesperrte Alben sind zu Wartungszwecken deaktiviert. Nur Administratoren können diese Alben in der Galerie betrachten.</dd>
+
+  <dt>Benutzerkommentare</dt>
+  <dd>Besucher können Bilder kommentieren, die zu Alben mit aktivierter Kommentaroption gehören.</dd>
+  
+  <dt>Vorschaubild</dt>
+  <dd>Diese Einstellung ist verfügbar, wenn Sie die Option <code>allow_random_representative</code>
+   (in der Datei <span class="Dateiname">include/config_defaults.inc.php</span>) auf
+   <em>true</em> gesetzt haben. Jedes Album kann durch ein zufälliges oder ein von Ihnen gewähltes Vorschaubild
+    repräsentiert werden.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/de_DE/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,24 @@
+<h2>Zugriffsrechte für ein privates Album verwalten</h2>
+
+<p>Diese Seite wird nur bei privaten Alben angezeigt. Hier können Sie definieren, welche
+Benutzer und Gruppen dieses Album betrachten dürfen. Diese Zugriffsrechte wirken zusätzlich 
+zu den Datenschutzstufen der einzelnen Bilder und der Benutzer.</p>
+
+<p>Siehe auch die Einführung in Gruppen in der Hilfe</p>.
+
+<h3>Gruppen</h3>
+
+<p>Sie können Gruppen den Zugriff auf dieses Album verbieten bzw. erlauben, wodurch allen Benutzer
+der Gruppe der Zugriff auf das Album ermöglicht oder verwehrt wird.</p>
+
+<h3>Benutzer</h3>
+
+<p>Sie können einzelnen Benutzern den Zugriff auf dieses Album ermöglichen
+oder verwehren.  Es wird eine Liste von Benutzern angezeigt, die
+Zugriff auf das Album durch deren Zugehörigkeit zu einer Gruppe mit
+Zugriff erhalten haben.  <!-- Benutzern, denen der Zugriff durch eine
+Gruppenzugehörigkeit erlaubt wurde, kann mit dieser Option der Zugriff
+wieder entzogen werden.-->
+<!-- unphysicalix: kann ich nicht nachvollziehen -->
+</p>
+
Index: tags/2.4.0RC3/language/de_DE/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/configuration.html	(revision 14585)
@@ -0,0 +1,117 @@
+<h2>Konfiguration</h2>
+
+<p>Auf dieser Seite kann der Administrator Grundkonfigurationen vornehmen. Sie beschränkt
+sich dabei auf die wesentlichsten Parameter, die die Anpassungswünsche der meisten
+Administratoren befriedigen sollten. Viele weitere Einstellungsmöglichkeiten finden
+Sie in der Datei <span class="filename">include/config_default.inc.php</span></p>
+
+<p>Die Konfigurationsseite ist in mehrere Sektionen unterteilt, die Einstellungen nach Thema
+gruppieren.</p>
+
+<h3>Grundeinstellungen</h3>
+<ul>
+
+  <li><strong>Galerietitel</strong>: Wird für RSS-Feeds und
+E-Mail-Benachrichtigungen genützt.</li>
+
+  <li><strong>Seitenbanner</strong>: wird im oberen Teil der
+Seiten angezeigt.</li>
+
+  <li><strong>genaue URL zur Galerie</strong>: wird für RSS-Feeds verwendet.</li>
+
+  <li><strong>Sperre den Zugriff auf die Galerie</strong>: Sperren der gesamten
+Galerie für Wartungsarbeiten. Nur Administratoren haben dann noch Zugriff.</li>
+
+  <li><strong>Abstimmung zulassen</strong>: Ermöglicht die Bewertung der Fotos.</li>
+
+  <li><strong>Erlaube Bewertung(en) durch Gäste</strong>: Auch nicht registrierte Benutzer können Bilder bewerten.</li>
+
+  <li><strong>Erlaube die Neuregistrierung von Benutzern</strong>: Die Registrierung ist für jeden möglich.</li>
+
+  <li><strong>Die Angabe einer gültigen E-Mail-Adresse ist für alle Benutzer verpflichtend</strong>: Die E-Mail Adresse wird bei der Registrierung oder beim Aktualisieren des Profils überprüft, außer wenn die Aktion von einem Administrator durchgeführt wurde.</li>
+
+  <li><strong>sende eine E-Mail an den(die) Adminstrator(en) wenn sich ein neuer Benutzer registriert hat</strong>: Administratoren erhalten eine E-mail, wenn sich ein neuer Benutzer registriert.</li>
+
+</ul>
+
+<h3>Statistik</h3>
+  <p>	
+Besuche auf den Seiten <span
+class="pwgScreen">category.php</span> und <span
+class="pwgScreen">picture.php</span> werden in der
+   <code>History</code> Tabelle gespeichert.</p>
+
+  <p>Besuche werden in <span class="pwgScreen">Administration &raquo; Werkzeuge &raquo; Statistik</span>.</p>
+<ul>
+  <li><strong>Speichere Seitenaufrufe von Gästen</strong>: Besuche von Gästen werden aufgezeichnet.</li>
+
+  <li><strong>Speichere Seitenaufrufe pro Benutzer</strong>: Besuche von registrierten Benutzern werden aufgezeichnet.</li>
+
+  <li><strong>Speichere auch Seitenaufrufe des Administrators</strong>: Besuche von Administratoren werden aufgezeichnet.</li>
+
+</ul>
+
+<h3>Benutzerkommentare</h3>
+<ul>
+
+  <li><strong>Kommentare für alle erlaubt</strong>: Auch nicht registrierte Gäste können 
+   Bemerkungen abgeben.</li>
+
+  <li><strong>Anzahl von Kommentaren pro Seite</strong>: Die Anzahl der pro Seite angezeigten Kommentare.</li>
+
+  <li><strong>Freigabe der Kommentare durch den Administrator</strong>: Ein Administrator muss die Kommentare der Benutzer überprüfen, bevor sie 
+in der Galerie sichtbar werden. Die Überprüfung der Benutzerkommentare erfolgt auf der Seite <span class="pwgScreen">Verwaltung, Fotos,
+Kommentare</span>.</li>
+
+  <li><strong>sende eine E-Mail an den(die) Adminstrator(en) wenn ein Kommentar hinterlassen wurde</strong>:
+Sende eine E-Mail an den/die Administrator(en), wenn ein überprüftes Kommentar gepostet wurde.</li>
+
+  <li><strong>sende eine E-Mail an den(die) Adminstrator(en) wenn ein Kommentar die Freischaltung durch den Admin erfordert</strong>:
+Sende eine E-Mail an den/die Administrator(en), wenn die Überprüfung eines Kommentars erforderlich ist. Die Überprüfung der Benutzerkommentare erfolgt auf der Seite <span class="pwgScreen">Verwaltung, Fotos, Kommentare</span>.</li>
+
+</ul>
+
+<h3>Upload</h3>
+<ul>
+  <li><strong>Den Uploadlink immer anzeigen</strong>: Wenn ein hochladbares Album existiert, wird der Uploadlink für jedes Album angezeigt.</li>
+  <li><strong>... dürfen Bilder hochladen</strong>: Welche Stufe muss ein Benutzer mindestens haben, um Fotos hochladen zu dürfen.</li>
+  <li><strong>sende eine E-Mail an den(die) Adminstrator(en) wenn ein Bild hochgeladen wurde</strong>: Administratoren erhalten eine E-mail, wenn ein Foto hochgeladen wurde.</li>
+</ul>
+
+<h3>Einstellungen für Gäste</h3>
+<p>Hier können sie die Anzeigeeinstellungen für Gäste festlegen. Registrierte Benutzer können diese Einstellungen
+selbst über ihr <span class="pwgScreen">Profil</span> anpassen.</p>
+
+<p>Es ist auch möglich, die Anzeigeeinstellungen aller Benutzer zu verändern. Besuchen sie zu diesem Zweck die Seite: <span class="pwgScreen">Administration &raquo; Benutzer &raquo; Verwaltung</span>.</p>
+
+<ul>
+
+  <li><strong>Sprache</strong>: bezieht sich nur auf die Beschriftungen von Piwigo selbst. Namen der Alben und Fotos, und
+  die Beschreibungen werden nicht übersetzt.</li>
+
+  <li><strong>Anzahl der Bilder pro Zeile</strong>Anzahl der Bilder, die pro Zeile angezeigt werden.</li>
+
+  <li><strong>Anzahl der Zeilen pro Seite</strong>Anzahl der Zeilen, die pro Seite angezeigt werden.</li>
+
+  <li><strong>Layout</strong>Das Layout der Seiten</li>
+
+  <li><strong>Wieviele Tage sollen Bilder als "neu" markiert werden?</strong>: Der Zeitraum in Tagen der definiert, wie lang Fotos als "neu"
+  angezeigt werden.</li>
+
+  <li><strong>Albenstruktur immer vollständig sichtbar</strong>: Soll die Albenstruktur immer vollständig angezeigt werden? <em>Vorsicht</em>:
+  Diese Option benötigt viel Ressourcen und kann ein sehr großes Menü generieren, wenn sie viele Alben besitzen.</li>
+
+  <li><strong>Zeige die Anzahl der Kommentare</strong>: Zeige für jedes Foto die Anzahl der Kommentare in der Übersichtsseite. Benötigt
+  viel Ressourcen!</li>
+
+  <li><strong>Zeige die Anzahl der Bildaufrufe</strong>: Zeige für jedes Foto die Anzahl der Aufrufe in der Übersichtsseite.
+   Wir nur angezeigt, wenn der Parameter: <br/>
+   $conf [ 'show_nb_hits'] = true; <br/>
+   gesetzt ist. Hinweis: Der Parameter ist in der Standardeinstellung deaktiviert.</li>
+
+  <li><strong>Maximale Breite der Bilder</strong>: Die maximal angezeigte Breite. Breitere Bilder werden für die Anzeige verkleinert. Bevor Sie diese
+   Option verwenden, sollten Sie darüber nachdenken, die Größe Ihrer Fotos zu verändern.</li>
+
+  <li><strong>Maximale Höhe der Bilder</strong>: Die maximal angezeigte Höhe (siehe Informationen zum Parameter Maximale Breite).</li>
+
+</ul>
Index: tags/2.4.0RC3/language/de_DE/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,95 @@
+<h2>Konfiguration Vorlagenerweiterung</h2>
+
+<h3>Ziel</h3>
+<p>Festlegung der Bedingungen zum Ersetzen jeder Vorlage mit einer sogenannten Vorlagenerweiterung ("Replacer" genannte Vorlage).</p>
+
+<p>Die "Originalvorlage" aus ./themes/default/template (oder jede andere Vorlage) wird mit dem sogenannten "Replacer" ersetzt,
+wenn dieser "Replacer" mit der "Originalvorlage" verlinked ist (oder wenn die URL ein definiertes Schlüsselwort enthält).</p>
+
+<p>Diese Schlüsselwörter befinden sich nach dem Modulnamen in der URL.</p>
+
+<p>Diese URL Schlüsselwörter können auch sogenannte "Permalinks" sein (Lesen Sie den Bereich über Permalinks in der Dokumentation für nähere Informationen).</p>
+
+<p>Lesen Sie das Kapitel `<a href="#warnings">Warnungen</a>` zum Thema Nutzungsbedingungen.</p>
+
+<h3>Was sind Vorlagenerweiterungen?</h3>
+
+<p>Vorlagenerweiterungen sind ein leistungsfähiges Werkzeug für Einsteiger und fortgeschrittene Anwender.
+Über einen FTP Zugang kann der Webmaster die mitgelieferten .tpl Dateien ("Originalvorlagen") unter einem neuen Namen
+in den Ordner template-extension kopieren ("Replacer").
+ 
+  "Originalvorlagen", aktuelle unterstützte Originalvorlagen sind:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> und/oder <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> und/oder <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> und/oder <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> und/oder <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> und/oder <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> und/oder <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> und/oder <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Wo finde ich "Originalvorlagen"?</h3>
+
+<p>Mitgelieferte Originalvorlagen befinden sich im Ordner /themes/default/template/ (Verändern Sie nie die
+mitgelieferten Vorlagen, da sonst Probleme bei späteren Upgrades auftreten können). Jeder Webmaster kann Kopien der
+Originalvorlagen anfertigen (sogenannte "Replacer (angepasste Vorlagen)") und diese nach seinen Wünschen anpassen.</p>
+
+<h3>Wo kann ich "Replacers" speichern?</h3>
+
+<p><strong>Replacers (angepasste Vorlagen)</strong> müssen sich im oder unterhalb des Ordners
+template-extension befinden. Replacers können einen beliebigen Dateinamen mit der Endung .tpl habe,
+zum Beispiel: <span class="Dateiname">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Wie aktiviere ich meinen "Replacer"?</h3>
+<p>Jedem <strong>Replacer (angepasste Vorlage)</strong> sollte eine <strong>Originalvorlage</strong> 
+zugewiesen werden, damit dieser Replacer aktiviert wird. 
+Diese Konfiguration wird im Administrationsmenü über die "Vorlagenerweiterung" durchgeführt.</p>
+
+<p>Wenn Sie ein <strong>URL Schlüsselwort</strong> definieren, wird der Replacer
+nur auf Seiten angewendet, die dieses Schlüsselwort in der URL enthalten. Zum Beispiel: <span 
+class="pwgScreen">index.php?/<strong> most_visited</strong></span></p>
+  
+<p>Fortgeschrittene Benutzer verwenden sogenannte Permalinks als <strong>URL Schlüsselwörter</strong>.</p>
+
+<p>Wenn Sie eine <strong>zugewiesene Vorlage</strong> ausgewählt haben, wird Ihr Replacer an dieser Vorlage angewendet.</p>
+
+<h3>Wie kann ich meine "Replacers" deaktivieren?</h3>
+<ul>
+<li>Deaktivieren Sie die Verbindung zwischen Ihrem Replacer und der "Originalvorlage".</li>
+<li>Löschen Sie Ihren "Replacer" über Ihren FTP Zugang.</li>
+</ul>
+<a name="warnings"></a>
+<h3>Warnhinweise</h3>
+<ul>
+
+  <li>Die definierte <strong>Originalvorlage</strong> muss wirklich die kopierte Vorlage des Replacers sein, sonst kann
+  der Einsatz des Replacers unvorhersehbare Auswirkungen haben!</li>
+
+  <li>Wenn Sie mehrere <strong>Replacers (angepasste Vorlagen)</strong> mit der
+   selben <strong>Originalvorlage</strong> und den selben <strong>URL Schlüsselwörtern</strong>
+  verwenden, wird nur der letzte Replacer der Liste angewendet.</li>
+
+  <li>Wird kein <strong>URL Schlüsselwort</strong> ausgewählt, wird der aktive Replacer
+   auf jede Vorlage angwendet. Wie vorhin angemerkt, kann die Reihenfolge der Replacer deren
+  Anwendung beeinflussen.</li>
+
+  <li>Unterordner:
+Unterordner werden ignoriert, aber sie können verwendet werden, um die Reihenfolge zu verändern. <br />
+distributed-samples: werden für Testzwecke mitgeliefert!
+<strong>Nicht bearbeiten</strong>, erstellen Sie Ihre eigenen!
+</li>
+
+  <li>Wenn Sie einen Replacer löschen, wird die <strong>Originalvorlage</strong> 
+   sofort reaktiviert.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/de_DE/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/group_list.html	(revision 14585)
@@ -0,0 +1,24 @@
+<h2>Gruppenliste und -verwaltung</h2>
+
+<p>Auf dieser Seite können Sie Gruppen verwalten. 
+
+<h3>Hinzufügen einer Gruppe</h3>
+
+<p>Der Administrator kann Gruppen mit frei wählbarem Namen hinzufügen.</p>
+
+<h3>Liste der Gruppen</h3>
+
+<p>In der Liste kann für jede Gruppe die Mitgliederliste anschauen. Es wird die Seite der Benutzerverwaltung mit einem automatischen Filter angezeigt.</p>
+
+<p>Darüberhinaus können drei Aktionen für jede Gruppe gewählt werden.
+<ul>
+  <li>Die Zugriffsrechte zu privaten Alben können verändert werden.</li>
+  <li>Eine Gruppe kann gelöscht werden (eine Bestätigung wird gefordert).</li>
+  <li>Eine Gruppe kann als Standardgruppe ausgewählt werden (eine Bestätigung wird gefordert).</li>
+</ul>
+
+<dl>
+
+<dt>Standard-Gruppen</dt>
+<dd>Neue Nutzer werden automatisch zur Standardgruppe hinzugefügt.</dd>
+</dl>
Index: tags/2.4.0RC3/language/de_DE/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,46 @@
+<p>Sie können Fotos zu Ihrer Galerie unter <a href="admin.php?page=photos_add"><span class="pwgScreen">Administration &raquo; Fotos &raquo; Hinzufügen</span></a> hinzufügen. Es gibt mehrere Möglichkeiten, dies zu tun: </p>
+
+<fieldset>
+<legend>Interne Möglichkeiten</legend>
+
+<ul>
+  <li><strong>Manueller Upload</strong> über Ihren Webbrowser ist die einfachste und
+  direkteste Methode. Der Funktionsumfang dieser Methode hängt im wesentlichen von
+  den Fähigkeiten Ihres Browsers und denen Ihres Webservers ab. Für den Upload größerer Mengen
+  sollten Sie jedoch auf die unten angeführten Möglichkeiten zurückgreifen.</li>
+</ul>
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Zum manuellen Upload </a></p>
+
+</fieldset>
+
+<fieldset>
+<legend>Externe Möglichkeiten</legend>
+<ul>
+  <li><strong>pLoader</strong> ist eine Anwendung, die Sie auf Ihrem Computer installieren können. Ziehen Sie Fotos in das pLoader Fenster und klicken Sie auf <em>"Upload zur Piwigo"</em>. Den Rest erledigt pLoader für Sie. Außerdem können Sie auch andere Anwendungen wie <strong>WinToPiwigo</strong> oder das <strong>Digikam</strong> Export-Plugin für Piwigo einsetzen.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Zum Piwigo Uploader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP Upload</strong> ist die empfohlene Methode, um große Mengen
+  an Fotos mit wenigen Mausklicks zu übertragen. Befolgen Sie die Anweisungen
+  im Handbuch um Ihre Fotos vorzubereiten und laden Sie sie mit dem FTP
+  Programm Ihrer Wahl hoch. Mit der FTP Methode können Sie selbst bestimmen, wie
+  Ihre Fotos auf Ihrem Server organisiert sind.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Zum FTP Upload</a></p>
+</div>
+
+</fieldset>
+
+<fieldset>
+<legend>Berechtigung zum Upload</legend>
+<p>In Standardfall darf nur der Administrator Fotos zu deiner Piwigo hochladen.</p>
+<ul>
+<li>Andere Benutzer können den Status eines Administrators erhalten. Den Status eines Benutzerkontos kannst du unter <a href="admin.php?page=user_list"><span class="pwgScreen">Administration &raquo; Benutzer &raquo; Verwalten</span></a> ändern</li>
+<li>Das Community-Plugin erlaubt eine explizite Rechteverwaltung für den Upload für normale Benutzer ohne Administratorstatus.</li>
+</ul>
+</fieldset>
+
Index: tags/2.4.0RC3/language/de_DE/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/help_groups.html	(revision 14585)
@@ -0,0 +1,16 @@
+<fieldset>
+<legend>Gruppierung von Benutzern</legend>
+
+<p>Benutzer können in Gruppen zusammengefasst werden. Der Name einer Gruppe kann frei gewählt werden. Erstellen Sie neue Gruppen unter
+<a href="admin.php?page=group_list"><span class="pwgScreen">Administration &raquo; Benutzer &raquo; Gruppen</span></a>
+und verknüpfen Sie Benutzer mit dieser Gruppe in <a href="admin.php?page=user_list"><span class="pwgScreen">Administration &raquo; Benutzer &raquo; Verwalten</span></a>.</p>
+
+<p>Zusammen mit den erweiterten Zugriffsrechten auf private Alben ergeben Gruppen eine komfortable Möglichkeit mehreren Benutzern zugleich Zugriffsrechte auf Alben zu geben und die grobe Struktur der Datenschutzstufen zu verfeinern.</p>
+
+<p>Ein Benutzer kann mehreren Gruppen angehören. Dabei hat die
+Erlaubnis Vorrang vor Verboten.  Wenn der Benutzer "Peter" zu den
+Gruppen "Firmenfreunde" und "Skatabendkumpels" gehört und nur die
+Gruppe "Firmenfreunde" kann sich das Album "Weihnachten 2010" ansehen,
+dann kann "Peter" kann sich dieses Album ansehen.</p>
+
+</fieldset>
Index: tags/2.4.0RC3/language/de_DE/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/help_misc.html	(revision 14585)
@@ -0,0 +1,17 @@
+<fieldset>
+<legend>Voreinstellungen für Benutzer festlegen</legend>
+
+<p>Nachdem Sie die Galerie erstellt haben, können sie diese nun für ihre Besucher konfigurieren.</p>
+<ul>
+    <li>Die von Ihnen gewünschte Standarddarstellung legen Sie in <a href="admin.php?page=configuration"><span class="pwgScreen">Administration &raquo; Konfiguration &raquo; Optionen</span></a> im Tab <span class="pwgScreen">Einstellungen für Gäste</span> fest.</li>
+    <li>Das Standardthema legen Sie in <a href="admin.php?page=themes"><span class="pwgScreen">Administration &raquo; Konfiguration &raquo; Themen</span></a> fest.</li>
+    <li>Die standardmäßig verwendete Sprache legen Sie in <a href="admin.php?page=languages"><span class="pwgScreen">Administration &raquo; Konfiguration &raquo; Sprachen</span></a> fest.</li>
+</ul>
+<p>Damit wird jedem neuen Benutzer diese Einstellung nach erfolgreicher Registrierung vorgegeben.</p>
+
+</fieldset>
+<fieldset>
+<legend>Weitere Hilfe</legend>
+<p>Piwigo hat viele weitere Features und noch mehr durch Erweiterung durch Plugins. Fast alle Administrationsseiten haben eigene Hilfeseiten, die über dieses <img src="admin/themes/clear/icon/help.png" class="button" alt="(?)"> Symbol erreichbar sind.
+<p>Falls Sie Fragen haben, heißt Sie die Piwigo Community in <a href="http://de.piwigo.org/forum">ihrem Forum</a> herzlich Willkommen.</p>
+</fieldset>
Index: tags/2.4.0RC3/language/de_DE/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,58 @@
+
+<fieldset>
+<legend>Zugriffsrechte auf Fotos</legend>
+
+<p>Jedem Foto ist eine <strong>Datenschutzstufe</strong> (entsprechend einem Türschloss) zugewiesen, genauso wie jeder Benutzer eine gewisse Datenschutzstufe besitzt (entsprechend einem Schlüssel). Es gibt fünf Datenschutzstufen:</p>
+<ol>
+  <li>Keine Berechtigung</li>
+  <li><em>Kontakte</em></li>
+  <li><em>Freunde (eine Stufe höher als Kontakte)</em></li>
+  <li><em>Familie (eine Stufe höher als Freunde)</em></li>
+  <li><em>Administratoren (die höchste Datenschutzstufe)</em></li>
+</ol>
+
+<p>Eine höhere Stufe erbt alle Berechtigungen der niedrigeren Stufen. Für einen Benutzer gilt: Je höher seine Datenschutzstufe, desto mehr Fotos kann er sehen. 
+Ein Benutzer, der in einem Album keine Berechtigungen für ein Foto hat, kann weder das Album selbst, noch den Titel des Albums sehen.</p>
+<!-- unphysicalix: Versteh ich nicht: -->
+<!--Das selbe Prinzip wird auch auf "Tags" angewandt. -->
+
+<p>Ein Beispiel: Wenn dem Foto "peter_hochzeit-0024.jpg" die Datenschutzstufe <em>"Familie"</em> zugewiesen ist, dann:</p>
+<ul>
+  <li>kann Peter (der die Stufe <em>"Administrator"</em> besitzt) das Foto sehen, weil <em>"Administratoren"</em> alle Fotos sehen können</li>
+  <li>kann Elisabeth (die die Einstufung <em>"Familie"</em> besitzt) das Foto ebenfalls sehen</li>
+  <li>kann Marie (die als <em>"Freund"</em> eingestuft ist) das Foto nicht sehen</li>
+</ul>
+
+<p>Die Datenschutzstufe eines Benutzers ist eine Eigenschaft des Benutzerkontos, die Sie in der Benutzerliste unter 
+<a href="admin.php?page=user_list"><span class="pwgScreen">Administration &raquo; Benutzer &raquo; Verwalten</span></a>
+sehen und bearbeiten können. Die Datenschutzstufe eines Fotos ist eine Eigenschaft, die beim Hochladen des Bildes oder auch später festgelegt werden kann.</p>
+</fieldset>
+
+<fieldset>
+<legend>Erweiterte Zugriffsrechte auf private Alben</legend>
+
+<p>Wenn die vordefinierten Datenschutzstufen nicht Ihren Bedürfnissen entsprechen, haben Sie auch die Möglichkeit, Benutzern oder Gruppen (siehe <a href="admin.php?page=help&section=groups">nächste Hilfeseite</a>) gesonderte Zugriffsrechte auf sogenannte <strong>private Alben</strong> zu vergeben.</p>
+
+<p> Sie können problemlos Berechtigungen für private Alben und Datenschutzstufen für Fotos parallel verwenden. Beachten Sie aber, dass ein Benutzer zu einer Berechtigung für ein privates Album ebenfalls die nötige Datenschutzstufe haben muss, um das Foto sehen zu können.</p>
+
+<p>Um Berechtigungen eines Albums gesondert zu verwalten, müssen Sie die Zugangsart des Albums auf <strong>privat</strong> setzen.
+Sie können entweder für ein einzelnes Album unter 
+<a href="admin.php?page=cat_list"><span class="pwgScreen">Administration &raquo; Alben &raquo; Verwalten </span></a>
+ die Albuminformationen bearbeiten und die Zugangsart ändern oder indem Sie diese Eigenschaft für mehrere Alben unter
+<a href="admin.php?page=cat_options"><span class="pwgScreen">Administration
+&raquo; Alben &raquo; Eigenschaften &raquo; Öffentlich /
+Privat</span></a> festlegen.</p>
+
+<p>Wenn ein Album als "privat" markiert ist, können Sie die Berechtigungen für Benutzer und Gruppen an drei unterschiedlichen Stellen vornehmen:</p>
+
+<ul>
+
+  <li>Unter <a href="admin.php?page=user_list"><span class="pwgScreen">Administration
+ &raquo; Benutzer &raquo; Verwalten</span></a> kann für jeden einzelnen Benutzer die Aktion "Zugriffsrechte" aufgerufen werden.</li>
+
+  <li>Unter <a href="admin.php?page=group_list"><span class="pwgScreen">Administration &raquo; Benutzer &raquo; Gruppen </span></a> kann für jede einzelne Gruppe die Aktion "Zugriffsrechte" aufgerufen werden.</li>
+
+  <li>Unter <a href="admin.php?page=cat_list"><span class="pwgScreen">Administration &raquo; Alben &raquo; Verwalten </span></a> kann für ein privates Album die Aktion "Zugriffsrechte auf das Album bearbeiten" aufgerufen werden.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/de_DE/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>Fotos werden normalerweise in dem Album angezeigt, in dem sie hochgeladen wurden.</p>
+
+<p>Man kann Fotos auch in einem zweiten Album anzeigen ohne sie zu duplizieren. Verbinden Sie das Bild einfach mit einem anderen Album auf der Seite "Information ändern" (den Link dazu kann jeder Administrator auf der Seite des Fotos selbst sehen).</p>
+
+<p>Virtuelle Alben basieren auf folgendem Konzept: sie haben keinen eigenen Ordner. Erstellen Sie ein virtuelles Album unter <span class="pwgScreen">Alben &raquo; Verwalten</span>.</p>
+
+
Index: tags/2.4.0RC3/language/de_DE/help/history.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/history.html	(revision 14585)
@@ -0,0 +1,52 @@
+<h2>Geschichte</h2>
+
+<p>Diese Bildschirme erlauben, die Browser-History in Piwigo
+  nach den Optionen, die Sie bestimmt in - Verwaltung - Allgemeine
+  - Registerkarte "Verlauf".</p>
+
+<h3>Statistik</h3>
+<ul>
+   <p>Wenn Sie sich entschieden haben, dass die Besucher der Seiten <span
+class = "pwgScreen">index.php</span> und <span
+class = "pwgScreen">picture.php</span> werden
+die in der Tabelle <code>history</code>,
+dieser Registerkarte können Sie die Anzahl der besuchten Seiten</p>
+
+<li><strong>Statistik insgesamt</strong>: Sie zeigen die Statistiken
+Pro Jahr</li>
+
+<li><strong>Statistik von einem Jahr</strong>: Sie zeigen die Statistiken
+Monaten des Jahres ausgewählt.</li>
+
+<li><strong>Statistik von einem Monat</strong>: Sie zeigen die Statistiken
+Tage des Monats gewählt.</li>
+
+<li><strong>Statistik eines Tages</strong>: Sie zeigen die Statistiken
+Stunden des Tages ausgewählt.</li>
+
+</ul>
+
+<h3>suchen</h3>
+<ul>
+   <p>Wenn Sie sich entschieden haben, dass die Besucher der Seiten <span
+class = "pwgScreen">index.php</span> und <span
+class = "pwgScreen">picture.php</span> werden
+die in der Tabelle <code>history</code>.
+  Auf dieser Registerkarte können Sie mehr über die Seiten erforscht
+  auf Ihrer Homepage mit Hilfe von verschiedenen Filtern.</p>
+ 
+<li><strong>Filter nach Datum</strong>: Wählen Sie den Bereich
+  Beobachtung, die Sie beobachten werden.</li>
+
+<li><strong>Filter Element-Art:</strong> auswählen
+Art von Element, das Sie betrachten die Tätigkeit.</li>
+
+<li><strong>Filter Benutzer</strong>: Wählen Sie den Teilnehmer aus, die Sie
+  möchten Beobachtung der Aktivität.</li>
+
+<li><strong> Filter Name der Datei</strong>: Wählen Sie den Namen der Datei, die Sie
+  möchten Beobachtung der Aktivität.</i>
+
+<li><strong>Filtern nach Bild-ID</strong>: Wählen Sie die Bild-ID, die Sie
+  möchten Beobachtung der Aktivität.</li>
+</ul>
Index: tags/2.4.0RC3/language/de_DE/help/index.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/de_DE/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/maintenance.html	(revision 14585)
@@ -0,0 +1,66 @@
+<h2>Wartung</h2>
+
+<p>Um die Ladezeiten der Seiten zu optimieren, verwendet Piwigo einen
+Cache. Zum Beispiel wird die Information über die Anzahl der Fotos in
+einem Album in der Datenbank zwischengespeichert, statt sie jedesmal
+zu zählen. In Normalfall sollte diese Information immer korrekt sein,
+jedoch kann es auch vorkommen, dass die zwischengespeicherte Information
+ungültig wird.</p>
+
+<p>Einige Informationen in der Datenbank werden mit der Zeit unbrauchbar. Durch Löschen dieser
+nutzlosen Informationen können Sie Plattenplatz sparen.</p>
+
+<ul>
+
+   <li>
+     <strong>Nicht verlinkte Elemente: </strong>
+     Zeigt die Bilder, die nicht mit einem virtuellen Album verlinkt, aber in realen Alben vorhanden sind.
+   </li>
+   <li>
+     <strong>Dateien mit dem selben Dateinamen in mehreren realen Alben:</strong>
+     Durchsucht alle Ordner und listet Dateien mit dem selben Dateinamen.
+   </li>
+
+</ul>
+
+<ul>
+
+   <li><strong>Aktualisierung der Albeninformationen:</strong>
+  Für jedes Album werden die folgenden Informationen überprüft und bei Bedarf angepasst :
+  Liste der übergeordneten Alben, Anzahl der Fotos, Datum des aktuellsten Fotos, Position relativ
+  zu anderen Alben auf der selben Ebene, Position im kompletten Albenbaum.
+  Diese Funktion überprüft auch die Korrektheit der Vorschaubilder.</li>
+
+   <li><strong>Aktualisierung der Fotoinformationen:</strong>
+  Für jedes Foto werden die folgenden Informationen überprüft und bei Bedarf angepasst :
+  der komplette Pfad zum Foto, Durchschnittsbewertung. <em>Achtung</em>: Diese Aktion ist
+  nicht mit der Synchronisierung der Metadaten zu verwechseln. Diese müssen über
+  <span class="pwgScreen">Verwaltung &raquo; Werkzeuge &raquo; Synchronisieren</span>,
+  oder auf der Bearbeitungsseite eines Bildes (zum Beispiel über <span class="pwgScreen">Foto
+  </span>) synchronisiert werden.</li>
+
+   <li><strong>Reparieren und Optimieren der Datenbank:</strong>
+  Jede Tabelle der Datenbank wird neu sortiert, repariert und optimiert.
+   </li>
+
+</ul>
+
+<ul>
+   <li><strong>Löschen der History-details:</strong> Löscht alle Einträge
+  der <code>history</code>-Tabelle. Die Seite <span class = "pwgScreen">
+  Verwaltung &raquo; Werkzeuge &raquo; History</span> zeigt dann
+keine Informationen mehr über vergangenen Einträge an. <em>Achtung</em>: alle Daten
+gehen verloren, und es gibt keine Möglichkeit, sie wiederherzustellen.</li>
+
+   <li><strong>Löschen der History-zusammenfassung:</strong> Löscht alle Zusammenfassungsinformationen der History.
+Diese Zusammenfassung wird aus den History-details errechnet.</li>
+
+   <li><strong>Löschen der Sessions:</strong> Löscht abgelaufene Usersessions.</li>
+
+   <li><strong>Löschen nie genutzte Benachrichtigungsfeeds</strong></li>
+   
+   <li><strong>Löschen des Suchverlaufs</strong></li>
+	
+   <li><strong>Löschen der kompilierten Templates</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/de_DE/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Anmeldung per E-Mail</h2>
+
+<p>Dieser Bildschirm erlaubt es die Einstellungen für die E-Mail-Benachrichtigungen an die Benutzer zu konfigurieren.</p>
+
+<p>Dieser Bildschirm besteht aus 3 Registerkarten:</p>
+
+<h3>Parameter</h3>
+<p>Zugänglich nur für Webmaster, diese Registerkarte enthält Parameter für die Anmeldung per E-Mail.</p>
+
+<h3>Bestätigen</h3>
+<p>Zugänglich nur für Webmaster, die Anmeldung / Abmeldung von Benutzern zur E-Mail-Benachrichtigungen wird hier verwaltet.</p>
+
+<h3>Sende</h3>
+<p>Zugänglich nur für Webmaster und Administratoren, dieser Registerkarte können Sie E-Mails versenden und ihren personalisierten Text der E-Mail hinzufügen.</p>
+
Index: tags/2.4.0RC3/language/de_DE/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permalinks</h2>
+
+<p>Sogenannte Permalinks werden verwendet, um die URLs zu den einzelnen Alben zu verschönern. Wenn einem Album ein Permalink zugeordnet wurde, benötigt man die ID des Album nicht mehr in der URL.</p>
+
+<p>Wenn ein Permalink gelöscht wird, können Sie diesen in der History speichern, sodass externe Links auf ihre Piwigo Gallerie weiterhin funktioniert. In der Permalink History sehen Sie außerdem das Löschdatum, das Datum der letzten Nutzung und die Anzahl der Zugriffe auf den Permalink.</p>
+
+<p>Bitte beachten Sie das ein Permalink nur einmal pro Album vergeben werden darf. Des weiteren kann ein Permalink nur einmal in der Permalink History existieren.</p>
Index: tags/2.4.0RC3/language/de_DE/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,129 @@
+<fieldset>
+  <legend>Schnellstart</legend>
+
+<ol>
+  <li>Erstelle einen neuen Ordner auf deinem Computer.</li>  
+  <li>Kopiere einige Fotos in diesen ordner und verkleinere Sie auf eine Web-taugliche Größe. <em>Achtung</em>: Im Datei- und Ordnername dürfen nur Buchstaben, Zahlen und folgende  Sonderzeichen verwendet werden: "-", "_" oder ".". Keine Leerzeichen und andere Sonderzeichen. Desweiterem dürfen "ä", "ü", "ö" und "ß" NICHT verwendet werden.</li>
+  <li>Kopiere den Ordner mit einem FTP Programm in den Ordner "galleries" deiner Piwigo Installation.</li>
+  <li>Melde dich in deiner Galerie an und gehe auf <span class="pwgScreen">Verwaltung &raquo; Bilder &raquo; Thumbnails</span> um fehlende Thumbnails vom Server erstellen zu lassen.</li>
+  <li>Gehe zu <span class="pwgScreen">Verwaltung</span> und klicke den großen "Schnelle Syncronisation" Button.</li>
+</ol>
+
+<p>Herzlichen Glückwunsch, du hast nun das erste Album in deiner Piwigo Bilder Galerie erstellt!</p>
+
+</fieldset>
+<fieldset>
+  <legend>Ordner und Dateiorganisation</legend>
+
+<ul>
+
+  <li>
+
+    <p>Die Ordner der Alben sind im Piwigo Verzeichnis "galleries" untergebracht. Hier siehst du ein Beispielverzeichnisbaum einer kleinen Galerie
+(aber mit vielen Features): </p>
+  
+<pre>
+.
+| - admin
+| - doc
+| - galleries
+| | - Album-1
+| | | - Album-1.1
+| | | | - Album-1.1.1
+| | | | | - Album-1.1.1.1
+| | | | | | - pwg_high
+| | | | | | + - hochzeit.jpg
+| | | | | | - thumbnail
+| | | | | | | - TN-hochzeit.jpg
+| | | | | | + - TN-hochzeit2.jpg
+| | | | | | - hochzeit.jpg
+| | | | | + - hochzeit2.jpg
+| | | | + - Album-1.1.1.2
+| | | + - Album-1.1.2
+| | | - Album-1.2
+| | | | - Pookie.jpg
+| | | + - thumbnail
+| | | + - TN-pookie.jpg
+| | + - Album-1.3
+| + - Album-2
+| | - Porcinet.gif
+| | - pwg_representative
+| | + - Video.jpg
+| | - thumbnail
+| | + - TN-porcinet.jpg
+| + - Video.avi
+| - include
+| - install
+| - language
++ - tool</pre>
+
+  </li>
+  
+<li>Außer den Ordnern "thumbnail", "pwg_high" und "pwg_representative" (siehe unten), erzeugt jeder Unterordner ein neues Album in der Galerie. 
+Es kann beliebig viele Unterverzeichnisse (Unteralben) geben.
+Im obigen Beispiel, ist "Album-1.1.1.1" auf dem Niveau 4.</li>
+
+   <li>Jedes Element besteht aus einer Datei. 
+   Eine Datei zählt als Element für Piwigo, wenn die Erweiterung des Dateinamens in den
+   Konfigurationsparametern festgelegt ist <code>file_ext</code> (siehe
+   <span class="filename">Datei include / config.inc.php</span>). 
+   Eine Datei zählt als Bild, wenn die Dateiendung mit dem Konfigurationsparameter
+   <code>picture_ext</code> festgelegt wird.</li>
+
+   <li>Elemente vom Typ Bild müssen ein Thumbnail (kleines Vorschaubild) (siehe
+Abschnitt Thumbnails) besitzen.</li>
+
+   <li>Elemente vom Typ Bild können Bilder im Grossformat hinterlegt haben (in einem Unterordner namens "pwg_high".
+   Im Beispiel hat die Datei <span class="filename">hochzeit.jpg</span> ein Bild im Großformat. Dem Dateinamen darf nichts vorangestellt werden.
+</li>
+
+   <li>Alle Elemente, die keine Bilder sind (Videos, Sounds, Textdateien, die alles, was du 
+   möchtest, ...) werden standardmäßig von einem Symbol für die Erweiterung des Dateinamens 
+   dargestellt. Optional kann selbst eine Miniaturansicht erstellt werden
+   (siehe die Datei <span
+   class = "filename">video.avi</span> im Beispiel).</li>
+
+   <li><em>Achtung</em>: der Namen für ein Verzeichnis oder eine Datei darf
+nur aus Buchstaben, Zahlen, "-", "_" oder "." bestehen. Umlaute und Sonderzeichen
+dürfen nicht verwendet werden.
+Groß- und Kleinschreibung wird unterschieden!</li>
+
+   <li><em>Empfehlung</em>: Ein Album kann Elemente und Unterkategorien enthalten,
+es ist aber empfehlenswert und übersichtlicher, wenn ein Album <strong>entweder</strong> Elemente 
+<strong>oder</strong>Unterkategorien enthält.</li>
+
+   <li>Wenn du die Dateien, Bilder und Thumbnails in die richtigen Ordner hochgeladen hast, 
+logge dich ein und gehen auf<span 
+class = "pwgScreen">Verwaltung &raquo; Alben &raquo; synchronisieren</span>.</li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Kleines Vorschaubild, Miniatur (Thumbnails)</legend>
+
+<ul>
+  
+   <li>Wie bereits erwähnt, gehört zu jedem Bild ein Thumbnail.</li>
+
+   <li>Thumbnails werden in einem Unterverzeichnis "thumbnail" jeder
+Album gespeichert. Ein zu einem Bild gehörendes Thumbnail hat den gleichen Namen wie das Bild 
+mit einem vorangestelltem Präfix (siehe TN- oben im Beispielverzeichnisbaum). Dieses Präfix ist in 
+der Konfiguration festgelegt <code>prefix_thumbnail</code>
+(siehe <span class="filename">include / config.inc.php</span >).</li>
+
+   <li>Die Miniaturen brauchen nicht die gleiche Dateiendung zu haben. Ein "jpg" Bild darf ein
+"gif" als Vorschaubild haben.</li>
+
+   <li> Es wird empfohlen, ein externes Programm für die Erstellung von
+Miniaturen zu verwenden.</li>
+
+   <li> Du kannst auch das Tool zum Erstellen von Thumbnails der Piwigo verwenden aber dies wird 
+   nicht empfohlen, da meistens die Qualität enttäuschend ist und der Server stark belastet wird.
+   Im Ernstfall kann es den Server überlasten.</li>
+
+   <li> Falls Sie doch den Webserver verwenden um Thumbnails generieren zu lassen, müssen Sie allen Albumordnern 
+   per CHMOD die entsprechenden Rechte zuweisen.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/de_DE/help/search.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/search.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Suche</h2>
+
+<p>Auf dieser Seite können Sie die gesamte Galerie nach Bildern durchsuchen</p>
+
+<dl>
+
+  <dt>Suche nach Wörtern</dt>
+  <dd>Sucht nach dem angegebenen Wort oder Wörtern in allen verfügbaren Attributen der Bilder
+   in der Galerie. Verwenden Sie * als Platzhalter.</dd>
+  
+  <dt>Suche nach Autor</dt>
+  <dd>Verwenden Sie * als Platzhalter.</dd>
+
+  <dt>Suche nach Datum</dt>
+  <dd>Wählen Sie ein Start- und/oder Enddatum für Ihre Suche. Lassen Sie das 
+  Datum leer, wenn Sie ein Element suchen, das vor einem bestimmten Zeitpunkt erstellt wurde.
+  Das Jahr muss im letzten Feld mit 4 Ziffern angegeben werden(zB 2005).</dd>
+
+  <dt>Suche in den Alben</dt>
+  <dd>Beschränken Sie die Suche auf ein oder mehrere Alben. Um auch in den Unteralben eines Albums
+  zu suchen, wählen Sie die Option "Suche in den Sub-Alben" aus.</dd>
+</dl>
Index: tags/2.4.0RC3/language/de_DE/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/site_manager.html	(revision 14585)
@@ -0,0 +1,56 @@
+<h2>Remote-Sites</h2>
+
+<p>Piwigo bietet die Möglichkeit, mehrere Websites für
+Speichern der Dateien, aus denen Ihre Galerie. Dies kann nützlich sein, wenn
+Ihre Galerie befindet sich auf einem Speicherplatz begrenzt ist und Sie
+haben viele Dateien zu zeigen.</p>
+
+
+<ol>
+
+   <li>Sie die Datei <span
+class = "filename">tools / create_listing_file.php</span> durch eine Änderung der
+Abschnitt Parameter wie <code>$ conf [ 'prefix_thumbnail']</code> oder
+<code>$ conf [ 'use_exif']</code>.</li>
+
+   <li>die Datei <span
+class = "filename">tools / create_listing_file.php</span> geändert auf Ihrer Website
+Remote, im selben Verzeichnis wie die Vertreter Ihrer Verzeichnisse
+Kategorien (wie das Verzeichnis <span class="filename">Galerien</span> von
+dieser Seite) per FTP. Zum Beispiel, dass Sie Zugriff auf <span
+class = "filename">http://exemple.com/galleries/create_listing_file.php</span>.</li>
+
+   <li>Bewußt auf <span class="pwgScreen">Verwaltung, Kategorien,
+Betreiber der Seite</span>. Verlangen eine neue Website, zB <span
+class = "filename"> http://exemple.com/galleries</span>.</li>
+
+   <li>
+
+     <p>eine neue Remote-Site gespeichert wird. 4 Aktionen möglich:</p>
+
+     <ol>
+
+       <li><strong>die Liste</strong>: startet eine Remote-Abfrage für
+Generieren Sie die Remote-Liste</li>
+
+       <li><strong>synchronisieren</strong>: Gibt die Remote-Datei <span
+class = "filename">listing.xml</span> und synchronisiert mit der Datenbank
+Ort</li>
+
+       <li><strong>reinigen</strong>: Der Remote-Datei von
+List</li>
+
+       <li><strong>zerstören</strong>: Der Standort (und alle Elemente
+die damit verbundenen) in der Datenbank</li>
+
+     </ol>
+
+   </li>
+
+</ol>
+
+<!--<p>Sie können auch ausführen, indem Sie
+Sie <span class="filename">listing.xml</span> in der Hand und in der
+Verschieben Ihrem Stammverzeichnis. Sich auf <span
+class = "pwgScreen">Verwaltung, Kategorien, Remote-Sites</span>:
+Piwigo erkennt die Datei und bietet damit einverstanden sind.</p> -->
Index: tags/2.4.0RC3/language/de_DE/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/synchronize.html	(revision 14585)
@@ -0,0 +1,17 @@
+<h2>Synchronisieren</h2>
+
+<ul>
+
+  <li>	
+Es gibt 2 verschiedene Synchronisationsmöglichkeiten: Verzeichnisse / Dateien und Datei-
+Metadaten. Verzeichnisse / Dateien synchronisiert die vorhandenen Dateien mit der Datenbank.
+Synchronisation von Metadaten aktualisiert die Dateiinformationen wie Dateigröße, Größe 
+in Pixeln und EXIF- oder IPTC-Informationen.</li>
+
+  <li>Zuerst müssen immer die Verzeichnis- und Dateiinformationen synchronisiert werden.</li>
+
+  <li>Die Synchronisierung kann einige Zeit in Anspruch nehmen (abhängig von
+der Belastung des Servers und der Menge der zu verwaltenden Dateien), daher ist es
+auch möglich, Alben einzeln zu synchronisieren.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/de_DE/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,36 @@
+<h2>Erstellen von Miniaturansichten (Thumbnails)</h2>
+
+<p>Erstellen von fehlenden Miniaturansichten. Die Verwendung dieser Funktion
+ist nicht zu empfehlen, wenn die Galerie ist auf einem Server gehostet
+ziert (Ressourcen des Servers sind begrenzt).</p>
+
+<dl>
+
+   <dt>Version von GD</dt>
+
+   <dd>GD ist eine Grafikbibliothek zur Manipulation von Bildern per
+PHP. Wählen Sie die Version, die auf Ihrem Server installiert ist. Wenn 
+Fehlermeldungen erscheinen, kehren Sie auf die vorherige Seite zurück
+und wählen Sie die andere Version der GD-Biliothek. Falls es überhaupt nicht
+funktionieret, ist  die GD-Biliothek nicht verfügbar.</dd>
+
+   <dt>Breite und Höhe</dt>
+
+   <dd>Bestimmt die maximale Größe der Miniaturen. Das Verhältnis
+Breite / Höhe des Originals wird beibehalten. Die Standardwerte sind
+veränderbar durch die Konfigurationseinstellungen <code>tn_width</code> und
+<code>tn_height</code> (siehe Datei <span
+class = "filename">include / config_default.inc.php</span >).</dd>
+  
+   <dt>Anzahl der zu erstellenden Miniaturen begrenzen</dt>
+
+   <dd>Bitte nicht alle Miniaturen auf einmal erstellen lassen, da
+   dies eine relativ hohe CPU-Last auf dem Server erzeugt.</dd>
+
+   <dt>Format der Datei</dt>
+
+   <dd>Die Miniaturen werden im JPEG-Format erstellt. Nur die Formate PNG und
+JPEG werden verarbeitet. Thumbnails für alle anderen Dateiformate müssen selbst 
+erstellt werden</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/de_DE/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/de_DE/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/help/user_list.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Benutzerliste und -verwaltung</h2>
+
+<p>Auf dieser Seite können Sie registrierte Benutzer verwalten. 
+</p>
+<p>Siehe auch die Einführung in Zugriffsrechte in der Hilfe</p>.
+
+<h3>Hinzufügen eines neuen Nutzers</h3>
+
+<p>Der Administrator kann manuell Benutzer hinzufügen.</p>
+
+<h3>Benutzer Liste</h3>
+
+<p>Die Liste kann nach Benutzernamen (Eingabe eines * als Platzhalter), Gruppe oder Status gefiltert werden. 
+Die Liste kann nach Datum der Registrierung oder Benutzername in aufsteigender
+oder absteigender Reihenfolge sortiert werden.</p>
+
+<p>In der Liste können Aktionen für einzelne Benutzer über Links ausgewählt werden. z.B. die Zugriffsrechte über private Alben oder die Profileinstellungen.</p>
+
+
+<h3>Änderungen an der Liste</h3>
+
+<p>Unterhalb der Liste können zunächst Benutzer (Häkchen bei
+"bestätigen" setzen) gelöscht werden. </p>
+<p>Darunter können auch Status,
+Gruppenzugehörigkeit, wichtige Eigenschaften und Profileinstellungen von
+mehreren Benutzern zugleich geändert werden.
+Bei Zielauswahl wird bestimmt, ob die Änderung für markierte Benutzer (Standard) oder alle Benutzer übernommen wird.</p>
Index: tags/2.4.0RC3/language/de_DE/index.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/de_DE/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/install.lang.php	(revision 14585)
@@ -0,0 +1,79 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Installation';
+$lang['Basic configuration'] = 'Basis-Konfiguration';
+$lang['Default gallery language'] = 'Standardsprache der Galerie';
+$lang['Database configuration'] = 'Konfiguration der Datenbank';
+$lang['Admin configuration'] = 'Konfiguration des Administrator-Kontos';
+$lang['Start Install'] = 'Start der Installation';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Die E-Mail-Adresse muss in der Form xxx@yyy.eee (Beispiel: jack@altern.org)';
+
+$lang['Webmaster login'] = 'Administrator';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Benutzername des Administrators';
+
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Die Verbindung zum Server ist OK, aber nicht die Verbindung zu dieser Datenbank';
+$lang['Can\'t connect to server'] = 'Es konnte keine Verbindung zum Datenbankserver aufgebaut werden';
+
+$lang['Host'] = 'MySQL Host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Benutzer';
+$lang['user login given by your host provider'] = 'Benutzernamen für die MySQL Datenbank';
+$lang['Password'] = 'Passwort';
+$lang['user password given by your host provider'] = 'Passwort für die MySQL Datenbank (von ihrem Hosting-Provider)';
+$lang['Database name'] = 'Name der Datenbank';
+$lang['also given by your host provider'] = '(bei MySQL auch von ihren Hosting-Provider gegeben)';
+$lang['Database table prefix'] = 'Präfix der Tabellen';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'die Namen der Tabellen mit diesem Präfix (ermöglicht eine bessere Verwaltung der Datenbank)';
+$lang['enter a login for webmaster'] = 'gib bitte einen Benutzernamen für den Webmaster an';
+$lang['webmaster login can\'t contain characters \' or "'] = 'der Benutzername des Webmasters darf nicht die Zeichen \' und " enthalten';
+$lang['please enter your password again'] = 'Bitte wählen Sie ein Passwort';
+$lang['Webmaster password'] = 'Passwort';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Administratorpasswort';
+$lang['Password [confirm]'] = 'Passwort [Bestätigung]';
+$lang['verification'] = 'Wiederholen Sie das eingegebene Passwort';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Brauchen Sie Hilfe? Stellen Sie Ihre Frage auf der <a href="%s"> Forum Piwigo </ a>.';
+$lang['Webmaster mail address'] = 'Webmaster Mail-Adresse';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Kontakt E-Mailadresse (nur für angemeldete Benutzer sichtbar)';
+
+$lang['PHP 5 is required'] = 'PHP 5 ist erforderlich';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Warscheinlich läuft auf ihrem Webhost die PHP-Version %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo wird versuchen ihre Konfiguration auf PHP 5 zu schalten durch die Erstellung oder Änderung einer .htaccess-Datei.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Hinweis: Sie können Ihre Konfiguration manuel ändern und die Piwigo danach neu starten.';
+$lang['Try to configure PHP 5'] = 'Versuche PHP 5 zu konfigurieren';
+$lang['Sorry!'] = 'Entschuldigung!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo ist nicht in der Lage PHP 5 zu konfigurieren.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Sie können Kontakt zu ihrem Hosting-Provider aufnehmen und um Unterstützung bitten zur Umstellung auf PHP 5.";
+$lang['Hope to see you back soon.'] = 'Wir hoffen, Sie sind bald wieder zurück.';
+
+$lang['Congratulations, Piwigo installation is completed'] = 'Glückwunsch, Sie haben Piwigo erfolgreich installiert';
+
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Eine andere Lösung ist, den Text im Kasten oben zu kopieren und ihn in die Datei "local/config/database.inc.php" einzufügen (Warnung: database.inc.php darf nur enthalten, was im Textbereich ist, keine Zeilenumbrüche (Enter) oder Leerzeichen)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Die Erstellung der Datei local/config/database.inc.php ist fehlgeschlagen.';
+$lang['Download the config file'] = 'Lade die Konfigurationsdatei herunter';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'SIe können die Konfigurationsdatei herunterladen und in den Ordner local/config ihrer Installation hochladen.';
+$lang['Just another Piwigo gallery'] = 'Nur eine neue Piwigo Bildgallerie';
+$lang['Welcome to my photo gallery'] = 'Willkommen bei meiner Bildgallerie';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Besuchen Sie unser Forum, wenn Sie Hilfe benötigen: %s';
+$lang['Welcome to your new installation of Piwigo!'] = 'Willkommen zu Ihrer neuen Piwigo Installation!';
+?>
Index: tags/2.4.0RC3/language/de_DE/iso.txt
===================================================================
--- tags/2.4.0RC3/language/de_DE/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Deutsch [DE]
Index: tags/2.4.0RC3/language/de_DE/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/de_DE/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/de_DE/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Upgrade';
+$lang['Upgrade from version %s to %s'] = 'Upgrade von der Version %s auf %s';
+$lang['Statistics'] = 'Statistik';
+$lang['total upgrade time'] = 'benötigte Aktualisierungszeit';
+$lang['total SQL time'] = 'gesamte SQL Zeit';
+$lang['SQL queries'] = 'SQL Anfragen';
+$lang['Upgrade informations'] = 'Upgrade Informationen';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Führen Sie eine Datenbanküberprüfung durch in [Verwaltung>Werkzeuge>Wartung] falls ein Problem auftritt.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Nur Administratoren dürfen ein Upgrade durchführen. Bitte loggen Sie sich ein';
+$lang['You do not have access rights to run upgrade'] = 'Sie haben nicht die erforderlichen Rechte ein Upgrade durchzuführen';
+$lang['All sub-albums of private albums become private'] = 'Alle Sub-Alben von privaten Alben werden auch privat eigestellt';
+$lang['User permissions and group permissions have been erased'] = 'Alle Benutzer- und Gruppenberechtigungen/beschränkungen wurden entfernt';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Es wurden nur die Thumbnail-Präfixe und die Mailadresse des Webmasters übernommen';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Diese Seite hat vor, Ihre Datenbank entsprechend Ihrer alten Version von Piwigo zur gegenwärtigen Version zu aktualisieren.
+Der Upgradeassistent ist der Meinung sie haben folgende Version installiert <strong>release %s</strong> (oder identisch).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Als Vorsichtsmaßnahme wurden folgende Plugins abgeschaltet. Prüfen Sie, ob ein Pluginupdate verfügbar ist, bevor Sie diese wieder aktivieren:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'In der Datei <i>%s</i>, vor <b>?></b> folgendes einfügen:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Als Vorsichtsmaßnahme wurden folgende Themen abgeschaltet. Prüfen Sie, ob ein Pluginupdate verfügbar ist, bevor Sie diese wieder aktivieren:';
+?>
Index: tags/2.4.0RC3/language/dv_MV/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/dv_MV/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/dv_MV/common.lang.php	(revision 14585)
@@ -0,0 +1,137 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Dhivehi [MV]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=570
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Dhivehi";
+$lang_info['country'] = "Maldives";
+$lang_info['direction'] = "rtl";
+$lang_info['code'] = "dv";
+$lang_info['zero_plural'] = false;
+
+$lang['%d album updated'] = '%d އަލްބަމް އާކުރެވިފަ';
+$lang['%d albums updated'] = '%d އަލްބަމްތައް އާކުރެވިފަ';
+$lang['%d comment to validate'] = '%d ޞައްހަކުރެއްވުމަށް ޙިޔާލެއް އެބައިން';
+$lang['%d comments to validate'] = '%d ޞައްހަކުރެއްވުމަށް ހުރި ޙިޔާލުތައް';
+$lang['%d new comment'] = '%d އާ ޙިޔާލު';
+$lang['%d new comments'] = '%d އާ ޙިޔާލުތައް';
+$lang['%d comment'] = '%d ޙިޔާލު';
+$lang['%d comments'] = '%d ޙިޔާލުތައް';
+$lang['%d hit'] = '%d ހިޓް';
+$lang['%d hits'] = '%d ހިޓްތައް';
+$lang['%d new photo'] = '%d އާ ފޮޓޯ';
+$lang['%d new photos'] = '%d އާ ފޮޓޯތައް';
+$lang['%d new user'] = '%d އާ ޔޫޒާ';
+$lang['%d new users'] = '%d އާ ޔޫޒާތައް';
+$lang['About'] = 'އާއި ބެހޭ';
+$lang['All tags'] = 'ހުރިހާ ޓެގުތައް';
+$lang['Any tag'] = 'އެއްވެސް ޓެގެއް';
+$lang['At least one listed rule must be satisfied.'] = '.އެންމެ މަދުވެގެން ބަޔާންކުރެވިފައިވާ އެއް ގަވާއިދާ އެއްގޮތްވާންވާނެ';
+$lang['Author'] = 'ޝާއިރު';
+$lang['Average rate'] = 'އެވެރެޖް ރޭޓް';
+$lang['Albums'] = 'އަލްބަމްތައް';
+$lang['Album'] = 'އަލްބަމް';
+$lang['Close this window'] = 'މި ވިންޑޯ ލައްޕާލާ';
+$lang['Complete RSS feed (photos, comments)'] = '(މުޅި އާރު.އެސް.އެސް. ފީޑް (ފޮޓޯތައް, ޙިޔާލުތައް';
+$lang['Confirm Password'] = 'ސިއްރުބަހުގެ ޞައްހަކަން ޔަގީންކުރައްވާ';
+$lang['Connection settings'] = 'ކަނެކްޝަން ސެޓިންގްސް';
+$lang['Login'] = 'ވަންނަވާ';
+$lang['Contact webmaster'] = 'ވެރިޔާ އާ ގުޅުއްވާ';
+$lang['Create a new account'] = 'އާ އެކައުންޓެއް ހައްދަވާ';
+$lang['Created on'] = 'އުފެދިފައިވަނީ';
+$lang['Creation date'] = 'އުފެދުނު ތާރިޚު';
+$lang['Current password is wrong'] = 'ތި ސިއްރުބަސް ރަންގަޅެއް ނޫން';
+$lang['Dimensions'] = 'ޑައިމެންޝަންތައް';
+$lang['Display'] = 'ދައްކަވާ';
+$lang['Each listed rule must be satisfied.'] = 'ހުރިހާ ޝަރުތުތައް ހުރިހަމަ ވާންވާނެ.';
+$lang['Email address'] = 'އީ-މެއިލް އެޑްރެސް';
+$lang['Enter your personnal informations'] = 'އަމިއްލަ މައުލޫމާތުތައް ފުރުއްވާ';
+$lang['Error sending email'] = 'އީ-މެއިލް ފޮނުވުމުގައި މައްސަލައެއް ޖެހިއްޖެ';
+$lang['File name'] = 'ފައިލްގެ ނަން';
+$lang['File'] = 'ފައިލް';
+$lang['Filesize'] = 'ފައިލްގެ ބޮޑުމިން';
+$lang['Filter and display'] = 'ބައިތަކަށް ބެހުމަށް ފަހު ދައްކަވާ';
+$lang['Filter'] = 'ބައިތަކަށް ބައްސަވާ';
+$lang['Forgot your password?'] = 'ސިއްރު ބަސް ހަންދާން ނެތުނީތޯ؟';
+$lang['Go through the gallery as a visitor'] = 'މެހެމާނެއްގެ ގޮތުގައި މައުރަޒު ބައްލަވާ ލައްވާ';
+$lang['Help'] = 'އެހީ';
+$lang['Identification'] = 'ކާކުކަން ވަކިކުރުން';
+$lang['Photos only RSS feed'] = 'ހަމައެކަނި ފޮޓޯ ހިމެނޭ އާރު.އެސް.އެސް. ފީޑް';
+$lang['Keyword'] = 'ކީވޯޑް';
+$lang['day'][0] = "އާދީއްތަ";
+$lang['day'][1] = "ހޯމަ";
+$lang['day'][2] = "އަންގާރަ";
+$lang['day'][3] = "ބުދަ";
+$lang['day'][4] = "ބުރާސްފަތި";
+$lang['day'][5] = "ހުކުރު";
+$lang['day'][6] = "ހޮނިހިރު";
+$lang['month'][10] = "އޮކްޓޯބަރ";
+$lang['month'][11] = "ނޮވެމްބަރ";
+$lang['month'][12] = "ޑިސެންބަރ";
+$lang['month'][1] = "ޖެނުއަރީ";
+$lang['month'][2] = "ފެބްރުއަރީ";
+$lang['month'][3] = "މާރޗް";
+$lang['month'][4] = "އޭޕްރީލް";
+$lang['month'][5] = "މޭ";
+$lang['month'][6] = "ޖޫން";
+$lang['month'][7] = "ޖުލައި";
+$lang['month'][8] = "އޮގަސްޓް";
+$lang['month'][9] = "ސެޕްޓެމްބަރ";
+$lang['Notification'] = 'އެންގުންތައް';
+$lang['Number of items'] = 'ތަކެތީގެ އަދަދު';
+$lang['Original dimensions'] = 'އޮރިޖިނަލް ޑައިމެންޝަންސް';
+$lang['Password forgotten'] = 'ސިއްރުބަސް ހަނދާންނެތިއްޖެ';
+$lang['Password'] = 'ސިއްރުބަސް';
+$lang['Post date'] = 'ތާރީޙު ޕޯސްޓްކުރޭ';
+$lang['Posted on'] = 'ޕޯސްޓްކުރި ތާރީޙު';
+$lang['Profile'] = 'ޕްރޮފައިލް';
+$lang['Quick connect'] = 'އަވަހަށް ގުޅާލުން';
+$lang['RSS feed'] = 'އާރު.އެސް.އެސް. ފީޑު';
+$lang['Rate'] = 'ރޭޓްކުރައްވާ';
+$lang['Register'] = 'ރެޖިސްޓާކުރައްވާ';
+$lang['Registration'] = 'ރެޖިސްޓާކުރުން';
+$lang['Related tags'] = 'ގުޅުންހުރި ޓެގުތައް';
+$lang['Reset'] = 'ރިސެޓް';
+$lang['Retrieve password'] = 'ސިއްރުބަސް ލިބިވަޑައިގަންނަވާ';
+$lang['Search rules'] = 'ހޯދުމުގެ ގަވާއިދުތައް';
+$lang['Search tags'] = 'ހޯދުމުގެ ޓެގްތައް';
+$lang['Search'] = 'ހޯދާ';
+$lang['display available tags'] = 'ހުރި ޓެގުތައް ދައްކަވާ';
+$lang['Since'] = 'އިން ފެށިގެން';
+$lang['Sort by'] = 'ގޮތަކަށް އަތުރާ';
+$lang['Sort order'] = 'އެތުރުމުގެ އޯޑަރު';
+$lang['Tag'] = 'ޓެގް';
+$lang['Tags'] = 'ޓެގުތައް';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'އާރް.އެސް.އެސް. ނޯޓިފިކޭޝަން ފީޑަކުން މިވެބްސައިޓުގެ: އާފޮޓޯ، އަލްބަމް އަޕްޑޭޓްތައް، އާޙިޔާލުތަކާބެހޭ އެންގުންތައް ލިބިވަޑައިގަންނަވާނެއެވެ. އެހެންކަމުން އާރް.އެސް.އެސް. ފީޑް ރީޑަރ އެއް ބޭނުން ކުރައްވާ.';
+$lang['Unknown feed identifier'] = 'އިނގިގެންނުވާ، ފީޑް އައިޑެންޓިފަޔާއެއް';
+$lang['User comments'] = 'ޔޫސާގެ ޙިޔާލު';
+$lang['Username'] = 'ޔޫސާނަން';
+$lang['Visits'] = 'ވަޑައިގެންނެވި ފަހަރު';
+
+
+?>
Index: tags/2.4.0RC3/language/dv_MV/index.php
===================================================================
--- tags/2.4.0RC3/language/dv_MV/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/dv_MV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/dv_MV/iso.txt
===================================================================
--- tags/2.4.0RC3/language/dv_MV/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/dv_MV/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Dhivehi [MV]
Index: tags/2.4.0RC3/language/el_GR/about.html
===================================================================
--- tags/2.4.0RC3/language/el_GR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/about.html	(revision 14585)
@@ -0,0 +1,18 @@
+<p>Αυτή η σελίδα χρησιμοποιεί το Piwigo.</p>
+
+<p> Το Piwigo είναι ένα λογισμικό για δημιουργία φωτογραφικών γκαλερί στο διαδίκτυο,
+χτισμένο από μια δραστήρια κοινότητα χρηστών και προγραμματιστών.
+Μπορείτε να το φέρετε εύκολα στα μέτρα σας με τη χρήση διάφορων -ελεύθερων- επεκτάσεων.
+Επιπλέον το Piwigo είναι λογισμικό ανοικτού κώδικα και διανέμεται ελεύθερα.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Επισκεφθείτε τη σελίδα του Piwigo</a></p>
+
+<p>Η Ελληνική μετάφραση συντηρείται από τους χρήστες (αλφαβητικά):
+
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=14047">andmarios</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=9661">bas_alba</a></li>
+        <li><a href="http://piwigo.org/forum/profile.php?id=5444">Elizap</a></li>
+		<li>Lamprianidis</li>
+    </ul>
+           ....    .... χάρη σε αυτούς</p>
Index: tags/2.4.0RC3/language/el_GR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/el_GR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/admin.lang.php	(revision 14585)
@@ -0,0 +1,333 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+// +                                                                       +
+// + Revised by AM on 18/04/2011                                           +
+// +                                                                       +
+// +-----------------------------------------------------------------------+
+
+$lang[' and %d virtual'] = " και %d εικονικό";
+$lang[' and %d virtual'] = " και %d εικονικά";
+$lang['%d album including'] = "%d λεύκωμα περιλαμβάνει";
+$lang['%d album moved'] = "%d λεύκωμα μετακινήθηκε";
+$lang['%d albums including'] = "%d λευκώματα περιλαμβάνουν";
+$lang['%d albums moved'] = "%d λευκώματα μετακινήθηκαν";
+$lang['%d anomalies have been detected corrected.'] = "%d ασυνέπειες εντοπίστηκαν και διορθώθηκαν.";
+$lang['%d anomalies have been detected.'] = "%d ασυνέπειες εντοπίστηκαν.";
+$lang['%d anomalies have been ignored.'] = "%d ασυνέπειες αγνοήθηκαν.";
+$lang['%d anomalies have not been corrected.'] = "%d ασυνέπειες δεν διορθώθηκαν.";
+$lang['%d anomaly has been corrected.'] = "%d ασυνέπεια εντοπίστηκε και διορθώθηκε.";
+$lang['%d anomaly has been detected.'] = "%d ασυνέπεια εντοπίστηκε.";
+$lang['%d anomaly has been ignored.'] = "%d ασυνέπεια αγνοήθηκε.";
+$lang['%d anomaly has not been corrected.'] = "%d ασυνέπεια δεν διορθώθηκε.";
+$lang['%d association'] = "%d συσχέτιση";
+$lang['%d associations'] = "%d συσχετίσεις";
+$lang['%d group'] = "%d ομάδα";
+$lang['%d groups'] = "%d ομάδες";
+$lang['%d guest'] = "%d επισκέπτης";
+$lang['%d guests'] = "%d επισκέπτης";
+$lang['%d line filtered'] = "%d γραμμή παραλείφθηκε";
+$lang['%d lines filtered'] = "%d γραμμές παραλείφθηκαν";
+$lang['%d mail was not sent.'] = "%d μήνυμα δεν εστάλη.";
+$lang['%d mail was sent.'] = "%d μήνυμα εστάλη.";
+$lang['%d mails were not sent.'] = "%d μηνύματα δεν εστάλησαν.";
+$lang['%d mails were sent.'] = "%d μηνύματα εστάλησαν.";
+$lang['%d member'] = "%d μέλος";
+$lang['%d members'] = "%d μέλη";
+$lang['%d of %d photos selected'] = '%d από %d φωτογραφίες επιλεγμένες';
+$lang['%d parameter was updated.'] = "%d παράμετρος ενημερώθηκε.";
+$lang['%d parameters were updated.'] = "%d παράμετροι ενημερώθηκαν.";
+$lang['%d photo was deleted'] = "%d φωτογραφία διαγράφηκε";
+$lang['%d photos uploaded'] = '%d φωτογραφίες ανέβηκαν';
+$lang['%d photos were deleted'] = "%d φωτογραφίες διαγράφηκαν";
+$lang['%d physical'] = " %d φυσικό";
+$lang['%d physical'] = " %d φυσικά";
+$lang['%d tag'] = "%d ετικέτα";
+$lang['%d tags'] = "%d ετικέτες";
+$lang['%d user comment rejected'] = "%d σχόλιο απορρίφθηκε";
+$lang['%d user comment validated'] = "%d σχόλιο επικυρώθηκε";
+$lang['%d user comments rejected'] = "%d σχόλια απορρίφθηκαν";
+$lang['%d user comments validated'] = "%d σχόλια επικυρώθηκαν";
+$lang['%d user deleted'] = "%d χρήστης διαγράφηκε";
+$lang['%d user was not updated.'] = "%d χρήστης δεν ενημερώθηκε.";
+$lang['%d user was updated.'] = "%d χρήστης ενημερώθηκε.";
+$lang['%d user'] = "%d χρήστης";
+$lang['%d users deleted'] = "%d χρήστες διαγράφηκαν";
+$lang['%d users were not updated.'] = "%d χρήστες δεν ενημερώθηκαν.";
+$lang['%d users were updated.'] = "%d χρήστες ενημερώθηκαν.";
+$lang['%d users'] = "%d χρήστες";
+$lang['%d waiting for validation'] = "%d περιμένουν επικύρωση";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s must be set to false in your local/config/config.inc.php file";
+$lang['%s value is not correct file because exif are not supported'] = "%s πεδίο είναι λάθος γιατί δεν υποστηρίζεται η πληροφορία EXIF";
+$lang['+ Add an upload box'] = '+ Προσθήκη και άλλου αρχείου για ανέβασμα';
+$lang[', click on'] = ", κάντε κλικ";
+$lang['Average rate'] = 'Μέσος όρος βαθμολογίας';
+$lang['Rate'] = 'Βαθμολογία';
+$lang['A new version of Piwigo is available.'] = 'Μια νέα έκδοση του Piwigo είναι διαθέσιμη.';
+$lang['Access type'] = 'Τύπος πρόσβασης';
+$lang['ACCESS_0'] = 'Ελεύθερη πρόσβαση';
+$lang['ACCESS_1'] = 'Πρόσβαση σε όλους';
+$lang['ACCESS_2'] = 'Πρόσβαση στους εγγεγραμμένους χρήστες';
+$lang['ACCESS_3'] = 'Πρόσβαση στους administrators';
+$lang['ACCESS_4'] = 'Πρόσβαση στους webmasters';
+$lang['ACCESS_5'] = 'Μη πρόσβαση';
+$lang['Action'] = 'Ενέργεια';
+$lang['Actions'] = 'Ενέργειες';
+$lang['Activate icon "%s"'] = 'Εικονίδιο ενεργοποίησης "%s"';
+$lang['Activate Navigation Bar'] = 'Ενεργοποίηση μπάρας πλοήγησης';
+$lang['Activate Navigation Thumbnails'] = 'Ενεργοποίηση εικονιδίων πλοήγησης'; 
+$lang['Activate'] = 'Eνεργοποίηση';
+$lang['Activate icon "new" next to albums and pictures'] = 'Ενεργοποίηση του εικονιδίου "νέο" μετά από τα άλμπουμς και εικόνες';
+$lang['Active Languages'] = 'Ενεργοποίηση Γλώσσων';
+$lang['Active Plugins'] = 'Ενεργοποίηση Προσθέτων';
+$lang['Active Themes'] = 'Ενεργοποίηση Θεμάτων';
+$lang['Add a criteria'] = 'Προσθήκη ενός κριτηρίου';
+$lang['Add a filter'] = 'Προσθήκη ενός φίλτρου';
+$lang['Add a tag'] = 'Προσθήκη μιας ετικέτας';
+$lang['Add a user'] = 'Προσθήκη ενός χρήστη';
+$lang['Add a virtual album'] = 'Προσθήκη ενός εικονικού άλμπουμ';
+$lang['Add another set of photos'] = 'Προσθήκη μιας άλλης ομάδας φωτογραφιών';
+$lang['Add detailed content'] = 'Προσθήκη μερικών λεπτομερών περιοχομένων';
+$lang['Add group'] = 'Προσθήκη γκρουπ';
+$lang['Add New Language'] = 'Προσθήκη Νέας Γλώσσας';
+$lang['add new photos to caddie'] = 'Προσθήκη νέας φωτογραφίας στο κουτί';
+$lang['Add New Theme'] = 'Προσθήκη ενός νέου θέματος';
+$lang['Add Photos'] = 'Προσθήκη φωτογραφιών';
+$lang['Add to caddie'] = 'προσθήκη στο καλάθι';
+$lang['Upload Photos'] = 'Ανέβασμα φωτογραφιών';
+$lang['Select an album'] = 'Επέλεξε άλμπουμ';
+$lang['... or '] = '... ή ';
+$lang['create a new album'] = 'δημιούργησε ένα νέο άλμπουμ';
+$lang['Select files'] = 'Επέλεξε αρχεία';
+$lang['Start Upload'] = 'Έναρξη ανεβάσματος';
+$lang['Learn more'] = 'Μάθε περισσότερα';
+$lang['Maximum file size: %sB.'] = 'Μέγιστο μέγεθος αρχείου: %sB.';
+$lang['Allowed file types: %s.'] = 'Επιτρεπόμενοι τύποι αρχείων: %s.';
+$lang['Photo %s of %s'] = 'Φωτογραφία  %s του %';
+$lang['All %d photos are selected'] = 'Όλεςl %d οι φωτογραφίες επιλέχθηκαν';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Χρησιμοποιείς τον Flash uploader. Προβλήματα; Προσπάθησε το <a href="%s">ανέβασμα μέσω φυλλομετρητή</a> instead.';
+$lang['Exif extension not available, admin should disable exif use'] = 'Η προέκταση για τα exif δεν είναι διαθέσιμη, ο διαχειριστής θα απενεργοποιήσει την χρήση του  exif';
+$lang['Hide'] = "Κρυφό";
+$lang['Level 1'] = "Επαφές";
+$lang['Level 2'] = "Φίλοι";
+$lang['Level 4'] = "Οικογένεια";
+$lang['Level 8'] = "Διαχειριστές";
+$lang['Set author'] = 'Ορισμός συντάκτη';
+$lang['Set creation date'] = 'Ορισμός ημέρας δημιουργίας';
+$lang['Set title'] = 'Ορισμός τίτλου';
+$lang['set to'] = 'Ορισμός σε';
+$lang['Settings'] = 'Ρυθμίσεις';
+$lang['show details'] = 'Εμφάνιση λεπτομερειών';
+$lang['Show info'] = 'Εμφάνιση πληροφοριών';
+$lang['Show menubar'] = 'Εμφάνιση γραμμής μενού';
+$lang['Simulation'] = 'Προσομείωση';
+$lang['singly represented'] = 'σταθερη μικρογραφία άλμπουμ';
+$lang['Site manager'] = 'Διαχείριση της ιστοσελίδας';
+$lang['Some themes and plugins may be not available yet.'] = 'Ορισμένα θέματα και πρόσθετα μπορεί να μην είναι διαθέσιμα ακόμα.';
+$lang['Some upgrades are available for extensions.'] = 'Μερικές αναβαθμίσεις είναι διαθέσιμες για τις επεκτάσεις.';
+$lang['Start pLoader and add your photos.'] = 'Εκκίνηση pLoader και προσθήκη φωτογραφιών.';
+$lang['Statistics'] = 'Στατιστικά';
+$lang['Status of user "%s" updated'] = 'Η κατάσταση του χρήστη "%s" ενημερώθηκε';
+$lang['Status'] = 'Κατάσταση';
+$lang['status'] = 'κατάσταση';
+$lang['Storage album'] = 'Αποθήκευση άλμπουμ';
+$lang['sub-albums'] = 'υπό-άλμπουμ';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Εγγραφή %s στο ενημερωτικό δελτίο ανακοινώσεων';
+$lang['Subscribe %s'] = 'Εγγραφή %s';
+$lang['Subscribe to notification by mail'] = 'Εγγραφή με κοινοποίηση μέσω ηλεκτρονικού ταχυδρομείου';
+$lang['Subscribe'] = 'Εγγραφή';
+$lang['Subscribe/unsubscribe users'] = 'Εγγραφή/διαγραφή χρηστών';
+$lang['Subscribed'] = 'Εγγεγραμένος';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Τα μέλη μπορεί να εμφανίζονται (διαθέσιμα) μόνο αν υπάρχουν νέα στοιχεία για ενημέρωση.';
+$lang['Sum of rates'] = 'Άθροισμα των τιμών';
+$lang['Summary'] = 'Περίληψη';
+$lang['Support'] = 'Υποστήριξη';
+$lang['Albums authorized thanks to group associations'] = 'Τα άλμπουμς εξουσιοδοτήθηκαν εξαιτίας των σχέσεων του γκρουπ.';
+$lang['Albums automatically sorted'] = 'Το άλμπουμ ταξινομήθηκε αυτόματα';
+$lang['albums deleted in the database'] = 'Το άλμπουμ διαγράφηκε από τη βάση δεδομένων.';
+$lang['All extensions are up to date.'] = 'Όλα τα πρόσθετα ενημερώθηκαν.';
+$lang['All languages are up to date.'] = 'Όλες οι γλώσσες έχουν ενημερωθεί.';
+$lang['All optimizations have been successfully completed.'] = 'Όλες οι βελτιώσεις έχουν ολοκληρωθεί επιτυχώς.';
+$lang['All plugins are up to date.'] = 'Όλα τα plugins έχουν ενημερωθεί.';
+$lang['All themes are up to date.'] = 'Όλα τα θέματα έχουν ενημερωθεί.';
+$lang['all'] = 'Όλα';
+$lang['Allow rating'] = 'Να επιτρέπεται η βαθμολογία';
+$lang['Allow user customization'] = 'Να επιτρέπεται η παραμετροποίηση από τους χρήστες';
+$lang['Allow user registration'] = 'Να επιτρέπεται η εγγραφή χρηστών';
+$lang['Allow users to delete their own comments'] = 'Αν επιτρέπεται οι χρήστες να σβήνουν τα δικά τους σχόλια';
+$lang['Allow users to edit their own comments'] = 'Να επιτρέπεται οι χρήστες να διορθώνουν τα δικά τους σχόλια';
+$lang['an error happened'] = 'Συνέβη ένα σφάλμα';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Συνέβη ένα λάθος κατά την εξαγωγή. Παρακαλούμε ελέγξτε τα δικαιώματα των αρχείων της εγκατάστασης του piwigo.<br><a href="%s">Πάτα εδώ να δεις τα λάθη</a>.';
+$lang['An error has occured during upgrade.'] = 'Συνέβη ένα λάθος κατά την αναβάθμιση.';
+$lang['An error occured during extraction (%s).'] = 'Συνέβη ένα λάθος κατά την διάρκεια της εξαγωγής των αρχείων (%s).';
+$lang['An information email was sent to group "%s"'] = 'Email πληροφόρησης έχουν αποσταλεί στην ομάδα "%s"';
+$lang['and'] = 'και';
+$lang['Anomaly'] = 'Ανωμαλία';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Τέλος πάντων μόνο οι webmasters μπορούν να δουν αυτήν την καρτέλα, όχι οι administrators.';
+$lang['Apply action'] = 'Εφαρμογή δράσης';
+$lang['Apply selected corrections'] = 'Εφαρμογή επιλεγμένων διορθώσεων';
+$lang['Apply to sub-albums'] = 'Επιλογή υπό-άλμπουμ';
+
+$lang['%s has been successfully updated.'] = '%s έχει ενημερωθεί με επιτυχία.';
+$lang['%s photos can not be regenerated'] = '%s φωτογραφίες δεν μπορούν να αναπαραχθούν';
+$lang['%s photos have been regenerated'] = '%s φωτογραφίες έχουν αναπαραχθεί';
+$lang['(this tag will be deleted)'] = '(αυτή η ετικέτα θα διαγραφεί)';
+$lang['Activate comments'] = 'Ενεργοποίηστε τα σχόλια';
+$lang['Add tags'] = 'Προσθέστε ετικέτες';
+$lang['Add write access to the "%s" directory'] = 'Προσθέστε δικαιώματα εγγραφής στον κατάλογο "%s"';
+$lang['Add/delete a permalink'] = 'Προσθέστε/Διαγράψτε μόνιμο σύνδεσμο';
+$lang['Add'] = 'Προσθέστε';
+$lang['Administration Home'] = 'Αρχική σελίδα διαχείρησης';
+$lang['Advanced features'] = 'Προηγμένες λειτουργίες';
+$lang['Album "%s" has been added'] = 'Το λεύκωμα "%s" έχει προστεθεί';
+$lang['Album "%s" now contains %d photos'] = 'Το λεύκωμα "%s" περιέχει τώρα  %d φωτογραφίες';
+$lang['Album list management'] = 'Διαχείριση Λίστας Λευκωμάτων';
+$lang['Album manual order was saved'] = 'Το εγχειρίδιο λευκώματος έχει αποθηκευτεί';
+$lang['Album name'] = 'Όνομα Λευκώματος';
+$lang['Album photos associated to the following albums: %s'] = 'Λευκώματα φωτογραφιών που σχετίζονται με τα ακόλουθα λευκώματα:% s';
+$lang['Album updated successfully'] = 'Το λεύκωμα ενημερώθηκε με επιτυχία';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Κατά προσέγγιση μέγιστη ανάλυση:  %dM pixels (αυτό είναι %dx%d pixels).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε αυτήν την αναβάθμιση; Θα πρέπει να ελέγξετε αν αυτή η έκδοση δεν χρειάζεται πριν απεγκατάσταση.';
+$lang['Are you sure you want to delete this plugin?'] = 'Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το πρόσθετο;';
+$lang['Are you sure you want to install this plugin?'] = 'Είστε βέβαιοι ότι θέλετε να εγκαταστήσετε αυτό το πρόσθετο;';
+$lang['Associate to album'] = 'Συσχετίστε με το λεύκωμα';
+$lang['Associated'] = 'Συσχετίζεται με';
+$lang['Authorize users to add comments on selected albums'] = 'Εξουσιοδοτήστε χρήστες να προσθέτουν σχόλια στα επιλεγμένα λευκώματα';
+$lang['Authorized'] = 'Εξουσιοδοτημένος';
+$lang['Automatic correction'] = 'Αυτόματη διόρθωση';
+$lang['Available only with HTML format'] = 'Διατίθεται μόνο με μορφή HTML';
+$lang['Batch Manager'] = 'Διαχείρηση ενεργειών κατά δέσμη';
+$lang['Bound Theme'] = 'Συνδεδεμένο Θέμα';
+$lang['By %s'] = 'Με %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Από προεπιλογή, το Piwigo θα δημιουργήσει μια νέα ιστοσελίδα από τη HD (υψηλής ευκρίνειας) έκδοση των φωτογραφιών σας.';
+$lang['By rank'] = 'Βάσει σειράς';
+$lang['Caddie management'] = 'Διαχείρηση Caddie';
+$lang['added'] = 'προστέθηκε';
+$lang['albums added in the database'] = 'το λεύκωμα προστεθηκε στη βάση δεδομένων';
+$lang['associate to group'] = 'Συσχετίστε με την ομάδα';
+$lang['automatic order'] = 'αυτόματη σειρά';
+$lang['average time'] = 'μέσος χρόνος';
+$lang['between'] = 'ανάμεσα';
+$lang['Caddie'] = 'Καλάθι';
+$lang['Can\'t connect to server.'] = 'Σύνδεση με τον διακομιστή αδύνατη.';
+$lang['Can\'t create temporary file.'] = 'Προσωρινό αρχείο δεν μπορεί να δημιουργηθεί.';
+$lang['Can\'t download archive.'] = 'Το συμπιεσμένο αρχείο δεν μπορεί να κατέβει.';
+$lang['Can\'t read or extract archive.'] = 'Το συμπιεσμένο αρχείο δεν μπορεί να διαβαστεί ή να εξαχθεί.';
+$lang['Cannot delete the old permalink !'] = 'Ο παλιός μόνιμος σύνδεσμος δεν μπορεί να διαγραφεί!';
+$lang['Change Admin Colors'] = 'Αλλαγή χρωμάτων στο περιβάλλον διαχείρησης';
+$lang['Check all'] = 'Ελέγξτε όλα';
+$lang['Check automatic corrections'] = 'Ελέγξτε τις αυτόματες διορθώσεις';
+$lang['Check for updates'] = 'Έλεγχος για ενημερώσεις';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Ο έλεγχος για αναβάθμιση απέτυχε για άγνωστους λόγους.';
+$lang['Check for upgrade'] = 'Έλεγχος για αναβάθμιση';
+$lang['Check integrity'] = 'Έλεγχος ακεραιότητας';
+$lang['Choose an action'] = 'Επιλέξτε μια ενέργεια';
+$lang['Choose an option'] = 'Επιλέξτε μια επιλογή';
+$lang['Classic display'] = 'Κλασική οθόνη';
+$lang['Comments for all'] = 'Σχόλια για όλους';
+$lang['Complementary mail content'] = 'Συμπληρωματικό περιεχόμενο ταχυδρομείου';
+$lang['Configuration'] = 'Διαμόρφωση';
+$lang['clean'] = 'εκκαθάριση';
+$lang['Confirm merge'] = 'Επιβεβαίωση συγχώνευσης';
+$lang['Continue processing treatment'] = 'Συνεχίστε με την παρούσα συμπεριφορά';
+$lang['Correction applied with error'] = 'Διόρθωση εφαρμόστηκε με λάθη';
+$lang['Correction applied with success'] = 'Διόρθωση εφαρμόστηκε επιτυχώς';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Η ανωμαλία που διορθώθηκε δεν μπορεί πλέον να αγνοηθεί';
+$lang['Correction'] = 'Διόρθωση ';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Δημιουργήστε ένα νέα ιστοσελίδα: (δώστε διεύθυνση URL  για το create_listing_file.php)';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Δημιουργία καταλόγου "%s" στη ρίζα της εγκατάστασης του Piwigo';
+$lang['Create this site'] = 'Δημιουργήστε την ιστοσελίδα';
+$lang['Create'] = 'Δημιουργήστε';
+$lang['Crop'] = 'ενσωμάτωση';
+$lang['Current name'] = 'Τρέχων όνομα';
+$lang['Database synchronization with files'] = 'Συγχρονισμός βάσης δεδομένων με τα αρχεία';
+$lang['Database'] = 'Βαση Δεδομένων';
+$lang['Date'] = 'Ημερομηνία';
+$lang['Day'] = 'Ημέρα';
+$lang['Deactivate all'] = 'Απενεργοποίηση όλων';
+$lang['Deactivate'] = 'Απενεργοποίηση';
+$lang['confirm'] = 'επιβεβαίωση';
+$lang['created'] = 'δημιουργήθηκε';
+$lang['Default comments order'] = 'προκαθορισμένη σειρά σχολίων';
+$lang['Default display'] = 'προκαθορισμένη προβολή οθόνης';
+$lang['Default photos order'] = 'προκαθορισμένη σειράς φωτογραφιών';
+$lang['Default user cannot be deleted'] = 'Ο προκαθορισμένος χρήστης δεν μπορεί να διαγραφεί';
+$lang['Default user does not exist'] = 'Ο προκαθορισμένος χρήστης δεν υπάρχει';
+$lang['Delete Representant'] = 'Διαγραφή μικρογραφίας λευκώματος';
+$lang['Delete orphan tags'] = 'Διαγραφή ορφανών ετικετών';
+$lang['Delete selected photos'] = 'Διαγραφή επιλεγμένων φωτογραφιών';
+$lang['Delete selected tags'] = 'Διαγραφή επιλεγμένων ετικετών';
+$lang['Delete selected users'] = 'Διαγραφή επιλεγμένων χρηστών';
+$lang['Delete this language'] = 'Διαγραφή αυτής της γλώσσας';
+$lang['Delete this theme'] = 'διαγράψετε αυτό το θέμα';
+$lang['Deleted on'] = 'διαγραφεί';
+$lang['Deletions'] = 'Διαγραφές';
+$lang['Deny selected groups'] = 'Άρνηση επιλεγμένων ομάδων';
+$lang['Deny selected users'] = 'Άρνηση επιλεγμένων ομάδων';
+$lang['Description'] = 'Περιγραφή';
+$lang['Detailed informations'] = 'Λεπτομερείς πληροφορίες';
+$lang['Directory does not exist'] = 'Ο Κατάλογος δεν υπάρχει';
+$lang['Directory'] = 'Κατάλογος';
+$lang['Discover album:'] = 'Ανακαλύψτε λεύκωμα:';
+$lang['Display options'] = 'Επιλογές εμφάνισης';
+$lang['Dissociate from album'] = 'Αποσυνδέστε από το λεύκωμα';
+$lang['Dissociated'] = 'Αποσυνδεδεμένο';
+$lang['Do you want to activate anyway?'] = 'Θέλετε να ενεργοποιήσετε ούτως ή άλλως;';
+$lang['Documentation'] = 'Τεκμηρίωση';
+$lang['Does not represent'] = 'Δεν είναι μικρογραφία για';
+$lang['Download,'] = 'Κατεβάστε,';
+$lang['Downloads'] = 'Λήψεις';
+$lang['Drag to re-order'] = 'Κάντε κλικ και σύρετε για εκ νέου στοίχηση';
+$lang['Drop into album'] = 'Επιλέξτε ένα λεύκωμα';
+$lang['Dump Database'] = 'Εξαγωγή Βάσης Δεδομένων';
+$lang['Duplicates'] = 'Διπλα Αντίγραφα';
+$lang['Edit album permissions'] = 'Επεξεργασία δικαιωμάτων λευκώματος';
+$lang['Edit album'] = 'Επεξεργασία λευκώματος';
+$lang['Edit photo information'] = 'Επεξεργασία πληροφοριών φωτογραφίας';
+$lang['Edit ranks'] = 'Επεξεργασία αξιολογίσεων';
+$lang['Edit selected tags'] = 'Επεξεργασία επιλεγμένων ετικετών';
+$lang['Edit tags'] = 'Επεξεργασία ετικετών';
+$lang['Element type'] = 'Τύπος στοιχείου';
+$lang['Element'] = 'Στοιχείο ';
+$lang['Email administrators when a comment is deleted'] = 'Αποστολή ηλ. ταχυδρομείου στούς διαχειριστές όταν ένα σχόλιο διαγράφεται';
+$lang['Email administrators when a comment is modified'] = 'Αποστολή ηλ. ταχυδρομείου στούς διαχειριστές όταν ένα σχόλιο επεξεργάστηκε';
+$lang['Email admins when a comment requires validation'] = 'Αποστολή ηλ. ταχυδρομείου στούς διαχειριστές όταν ένα σχόλιο χρειάζετε επικύρωση';
+$lang['Email admins when a new user registers'] = 'Αποστολή ηλ. ταχυδρομείου στούς διαχειριστές όταν ένας χρήστης εγγράφεται';
+$lang['Email admins when a valid comment is entered'] = 'Αποστολή ηλ. ταχυδρομείου στούς διαχειριστές όταν εισάγεται ένα έγκυρο σχόλιο';
+$lang['Environment'] = 'Περιβάλλον ';
+$lang['Error list'] = 'Λίστα των σφαλμάτων';
+$lang['Error on file "%s" : %s'] = 'Σφάλμα στο αρχείο "%s":%s';
+$lang['Error when sending email to %s [%s].'] = 'Σφάλμα κατά την αποστολή e-mail στο%s [%s].';
+$lang['default values'] = 'προκαθορισμένες τιμές';
+$lang['default'] = 'προκαθορισμένο';
+$lang['delete album'] = 'προκαθορισμένο λεύκωμα';
+$lang['delete photo'] = 'διαγραφή φωτογραφίας';
+$lang['delete this site and all its attached elements'] = 'διαγράψετε αυτό το site και όλες τις σχετικές πληροφορίες';
+$lang['deleted'] = 'διαγραμμένο';
+$lang['delete'] = 'διαγραφή';
+$lang['directories + files'] = 'κατάλογοι + αρχεία';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'εμφανίζονται μέγιστες πληροφορίες (λευκώματα που προστέθηκαν και φωτογραφίες, διαγραμένα λευκώματα και φωτογραφίες)';
+$lang['display'] = 'Εμφάνιση';
+$lang['dissociate from group'] = 'Αποσυνδέστε από την ομάδα';
+$lang['email'] = 'Ηλεκτρονικό ταχυδρομείο';
+?>
Index: tags/2.4.0RC3/language/el_GR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/el_GR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Ελληνικά [GR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=508
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Ελληνικά";
+$lang_info['country'] = "Ελλάδα";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "el";
+$lang_info['zero_plural'] = true;
+
+
+$lang['useful when password forgotten'] = "χρήσιμο σε περίπτωση απώλειας του κωδικού";
+$lang['Quick search'] = "Γρήγορη αναζήτηση";
+$lang['Connected user: %s'] = "Συνδεδεμένοι χρήστες: %s";
+$lang['IP: %s'] = "IP: %s";
+$lang['Browser: %s'] = "Φυλλομετρητής: %s";
+$lang['Author: %s'] = "Συντάκτης: %s";
+$lang['Comment: %s'] = "Σχόλιο: %s";
+$lang['Comment by %s'] = "Σχόλιο από %s";
+$lang['User: %s'] = "Χρήστης: %s";
+$lang['Email: %s'] = "Email: %s";
+$lang['Admin: %s'] = "Διαχειριστής: %s";
+$lang['Registration of %s'] = "Εγγραφή του %s";
+$lang['Album: %s'] = "Λεύκωμα: %s";
+$lang['Creation date'] = "Ημερομηνία λήψης";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Σφάλμα για το χρήστη \"επισκέπτης\", θα χρησιμοποιηθεί η προεπιλεγμένη ρύθμιση. Παρακαλώ ενημερώστε τον διαχειριστή.";
+$lang['Album results for'] = "Αποτελέσματα λευκωμάτων για ";
+$lang['Tag results for'] = "Αποτελέσματα ετικετών για";
+$lang['from %s to %s'] = "από %s σε %s";
+$lang['Play of slideshow'] = "Συνέχιση προβολής";
+$lang['Pause of slideshow'] = "Παύση προβολής";
+$lang['Repeat the slideshow'] = "Επανάληψη προβολής";
+$lang['Not repeat the slideshow'] = "Να μην επαναληφθεί η προβολή σλάιντ";
+$lang['Reduce diaporama speed'] = "Μείωση ταχύτητας προβολής (μεγαλύτερη παύση σε κάθε φωτογραφία)";
+$lang['Accelerate diaporama speed'] = "Αύξηση ταχύτητας προβολής (μικρότερη παύση σε κάθε φωτογραφία)";
+$lang['Submit'] = "Αποθήκευση";
+$lang['Yes'] = "Ναι";
+$lang['No'] = "Όχι";
+$lang['%d photo'] = "%d φωτογραφία";
+$lang['%d photos'] = "%d φωτογραφίες";
+$lang['%d photo is also linked to current tags'] = "%d η φωτογραφία είναι επίσης συνδεδεμένη με τις υπάρχοντες ετικέτες";
+$lang['%d photos are also linked to current tags'] = "%d οι φωτογραφίες είναι είναι επίσης συνδεδεμένες με τις υπάρχοντες ετικέτες";
+$lang['display photos linked to this tag'] = "εμφάνιση μόνο των φωτογραφιών που είναι συνδεδεμένες με αυτή την ετικέτα";
+$lang['photos posted during the last %d days'] = "φωτογραφίες που αναρτήθηκαν κατά την διάρκεια των τελευταίων %d ημερών";
+$lang['Piwigo Help'] = "Βοήθεια για το Piwigo";
+$lang['Rank'] = "Βαθμός";
+$lang['group by letters'] = "ομαδοποίηση κατά γράμμα";
+$lang['letters'] = "γράμματα";
+$lang['show tag cloud'] = "σύννεφο ετικετών";
+$lang['cloud'] = "σύννεφο";
+$lang['Reset to default values'] = "Επαναφορά αρχικών ρυθμίσεων";
+$lang['delete all photos from your favorites'] = "διαγραφή όλων των φωτογραφιών από τα αγαπημένα";
+$lang['Sent by'] = "Αποστολή με";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Τα cookies έχουν  μπλοκαριστεί ή δεν υποστηρίζονται από το φυλλομετρητή σας. Πρέπει να ενεργοποιήσετε τα cookies ώστε να συνδεθείτε.";
+$lang['Photos posted within the last %d days.'] = "Φωτογραφίες που αναρτήθηκαν τις τελευταίες %d μέρες.";
+$lang['password updated'] = "ο κωδικός ενημερώθηκε";
+$lang['Recent period must be a positive integer value'] = "Οι μέρες που μια νέα φωτογραφία θεωρείται πρόσφατη πρέπει να είναι θετικός ακέραιος αριθμός";
+$lang['photo'] = "φωτογραφία";
+$lang['Click on the photo to see it in high definition'] = "Κάντε κλικ στη φωτογραφία για να τη δείτε σε υψηλή ανάλυση";
+$lang['Show file metadata'] = "Εμφάνιση μεταδεδομένων εικόνας";
+$lang['Powered by'] = "Powered by";
+$lang['Preferences'] = "Προτιμήσεις";
+$lang['Previous'] = "Προηγούμενο";
+$lang['Random photos'] = "Τυχαίες φωτογραφίες";
+$lang['display a set of random photos'] = "προβολή μιας ομάδας τυχαίων φωτογραφιών";
+$lang['Recent albums'] = "Πρόσφατα λευκώματα";
+$lang['display recently updated albums'] = "εμφάνιση πρόσφατα ανανεωμένων λευκωμάτων";
+$lang['Recent period'] = "Οι νέες φωτογραφίες θεωρούνται πρόσφατες για";
+$lang['Recent photos'] = "Πρόσφατες φωτογραφίες";
+$lang['display most recent photos'] = "προβολή των πιο πρόσφατων φωτογραφιών";
+$lang['Redirection...'] = "Ανακατεύθυνση...";
+$lang['Please, enter a login'] = "Παρακαλώ εισάγετε όνομα χρήστη";
+$lang['login mustn\'t end with a space character'] = "το όνομα χρήστη δεν πρέπει να τελειώνει με κενό";
+$lang['login mustn\'t start with a space character'] = "το όνομα χρήστη δεν πρέπει να ξεκινάει με κενό";
+$lang['this login is already used'] = "αυτό το όνομα χρήστη χρησιμοποιείται ήδη";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "η διεύθυνση ηλεκτρονικού ταχυδρομείου πρέπει να είναι της μορφής xxx@yyy.eee (παράδειγμα: jack@altern.org)";
+$lang['please enter your password again'] = "παρακαλώ εισάγετε το κωδικό σας ξανά";
+$lang['Auto login'] = "Αυτόματη σύνδεση";
+$lang['remove this tag from the list'] = "αφαίρεση ετικέτας από τη λίστα";
+$lang['representative'] = "αντιπροσωπευτική";
+$lang['Search for Author'] = "Αναζήτηση συντάκτη";
+$lang['Search in albums'] = "Αναζήτηση στα λευκώματα";
+$lang['Search by date'] = "Αναζήτηση με ημερομηνία";
+$lang['Date'] = "Ημερομηνία";
+$lang['End-Date'] = 'Έως';
+$lang['Kind of date'] = "Είδος ημερομηνίας";
+$lang['Search for words'] = "Αναζήτηση λέξεων";
+$lang['Search for all terms'] = "Αναζήτηση για όλους τους όρους";
+$lang['Search for any term'] = "Αναζήτηση για οποιοδήποτε όρο";
+$lang['Empty query. No criteria has been entered.'] = "Κενή ερώτηση. Δεν έχει εισαχθεί κανένα κριτήριο.";
+$lang['Search results'] = "Αποτελέσματα αναζήτησης";
+$lang['Search in sub-albums'] = "Αναζήτηση στα υπο-λευκώματα";
+$lang['searched words : %s'] = "όροι αναζήτησης: %s";
+$lang['Contact'] = "Επικοινωνία";
+$lang['set as album representative'] = "Ορισμός ως αντιπροσωπευτικής φωτογραφίας για το λεύκωμα";
+$lang['Show number of comments'] = "Προβολή αριθμού σχολίων";
+$lang['Show number of hits'] = "Προβολή αριθμού εμφανίσεων";
+$lang['slideshow'] = 'προβολή σλάιντ';
+$lang['stop the slideshow'] = "παύση προβολής";
+$lang['Specials'] = 'Ξεχωρίζουν';
+$lang['SQL queries in'] = 'Ερωτήματα SQL στη';
+$lang['display only recently posted photos'] = "προβολή μόνο πρόσφατα αναρτηθέντων φωτογραφιών";
+$lang['return to the display of all photos'] = "επιστροφή στην προβολή όλων των φωτογραφιών";
+$lang['the beginning'] = "αρχή";
+$lang['Interface theme'] = "Στυλ εμφάνισης";
+$lang['Thumbnails'] = 'Μικρογραφίες';
+$lang['Menu'] = "Μενού";
+$lang['display a calendar by creation date'] = 'προβολή ημερολογίου κατά ημέρα λήψης';
+$lang['display all photos in all sub-albums'] = 'προβολή φωτογραφιών από όλα τα λευκώματα και υπο-λευκώματα';
+$lang['return to normal view mode'] = 'επιστροφή σε κανονική προβολή';
+$lang['display a calendar by posted date'] = 'προβολή ημερολογίου κατά ημέρα ανάρτησης';
+$lang['month'][10] = "Οκτώβριος";
+$lang['month'][11] = "Νοέμβριος";
+$lang['month'][12] = "Δεκέμβριος";
+$lang['month'][1] = "Ιανουάριος";
+$lang['month'][2] = "Φεβρουάριος";
+$lang['month'][3] = "Μάρτιος";
+$lang['month'][4] = "Απρίλιος";
+$lang['month'][5] = "Μάιος";
+$lang['month'][6] = "Ιούνιος";
+$lang['month'][7] = "Ιούλιος";
+$lang['month'][8] = "Αύγουστος";
+$lang['month'][9] = "Σεπτέμβριος";
+$lang['Most visited'] = 'Περισσότερες προβολές';
+$lang['display most visited photos'] = 'οι φωτογραφίες με τις περισσότερες επισκέψεις';
+$lang['Unknown identifier'] = 'Άγνωστο αναγνωριστικό';
+$lang['New password'] = 'Νέος κωδικός';
+$lang['Rate this photo'] = 'Βαθμολογήστε τη φωτογραφία';
+$lang['Next'] = 'Επόμενο';
+$lang['no rate'] = 'χωρίς βαθμό';
+$lang['Photos posted within the last %d day.'] = 'Αρχεία που έχουν αναρτηθεί τις τελευταίες  %d ημέρες.';
+$lang['A comment on your site'] = 'Ένα σχόλιο στη σελίδα σας';
+$lang['today'] = 'σήμερα';
+$lang['Update your rating'] = 'Αλλάξτε τη βαθμολογία σας';
+$lang['the username must be given'] = 'το όνομα χρήστη είναι απαραίτητο';
+$lang['Edit a comment'] = 'Επεξεργασία σχολίου';
+$lang['Are you sure?'] = 'Είστε σίγουρος;';
+$lang['(!) This comment requires validation'] = '(!) Αυτό το σχόλιο απαιτεί επικύρωση';
+$lang['Welcome'] = 'Καλώς ήρθατε';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Καλώς ήρθατε στο Piwigo και την γκαλερί σας!';
+$lang['... or browse your empty gallery'] = '... ή να περιηγηθείτε στην κενή σας γκαλερί';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ή, παρακαλώ απενεργοποιήστε αυτό το μήνυμα, θα βρω τον τρόπο μόνος μου';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Γεια %s, η γκαλερί σας είναι κενή!';
+$lang['I want to add photos'] = 'Θέλω να προσθέσω φωτογραφίες';
+$lang['Manage this user comment: %s'] = 'Διαχειριστείτε αυτό το σχόλιο: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Η διεύθυνση ηλεκτρονικού ταχυδρομείου είναι κενή. Παρακαλώ εισάγετε μία διεύθυνση ηλεκτρονικού ταχυδρομείου.';
+$lang['This author modified following comment:'] = 'Αυτός ο συγγραφέας τροποποίησε το ακόλουθο σχόλιο:';
+$lang['This author removed the comment with id %d'] = 'Αυτός ο συγγραφέας αφαίρεσε το σχόλιο με id %d';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Ένας διαχειριστής πρέπει να εγκρίνει το σχόλιό σας πριν γίνει ορατό.';
+$lang['This login is already used by another user'] = 'Αυτό το όνομα χρήστη χρησιμοποιείται ήδη από κάποιον άλλον χρήστη';
+$lang['Comments'] = 'Σχόλια';
+$lang['Add a comment'] = 'Αφήστε ένα σχόλιο';
+$lang['created after %s (%s)'] = 'δημιουργήθηκε μετά τις %s (%s)';
+$lang['created before %s (%s)'] = 'δημιουργήθηκε πριν τις %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'δημιουργήθηκε μεταξύ %s (%s) και %s (%s)';
+$lang['created on %s'] = 'δημιουργήθηκε στις %s';
+$lang['Customize'] = 'Προσαρμογή';
+$lang['Your Gallery Customization'] = 'Η προσαρμογή της γκαλερί σας';
+$lang['day'][0] = "Κυριακή";
+$lang['day'][1] = "Δευτέρα";
+$lang['day'][2] = "Τρίτη";
+$lang['day'][3] = "Τετάρτη";
+$lang['day'][4] = "Πέμπτη";
+$lang['day'][5] = "Παρασκευή";
+$lang['day'][6] = "Σάββατο";
+$lang['Default'] = 'Προεπιλεγμένη';
+$lang['delete this photo from your favorites'] = 'διαγράψτε αυτή τη φωτογραφία από τα αγαπημένα σας';
+$lang['Delete'] = 'Διαγραφή';
+$lang['descending'] = 'φθίνουσα';
+$lang['Download'] = 'μεταφόρτωση';
+$lang['Download this file'] = 'μεταφόρτωση αυτού του αρχείου';
+$lang['edit'] = 'επεξεργασία';
+$lang['wrong date'] = 'λάθος ημερομηνία';
+$lang['excluded'] = 'εξαιρέθηκαν';
+$lang['display your favorites photos'] = 'προβολή των αγαπημένων σας φωτογραφιών';
+$lang['Favorites'] = 'Αγαπημένα';
+$lang['First'] = 'Πρώτη';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Η γκαλερί είναι κλειστή για συντήρηση. Παρακαλώ επισκεφθείτε τη πάλι αργότερα.';
+$lang['Page generated in'] = 'Η σελίδα δημιουργήθηκε σε';
+$lang['guest'] = 'επισκέπτης';
+$lang['Hello'] = 'Γεια';
+$lang['available for administrators only'] = 'διαθέσιμο μόνο στους διαχειριστές';
+$lang['customize the appareance of the gallery'] = 'προσαρμογή της εμφάνισης της γκαλερί';
+$lang['search'] = 'αναζήτηση';
+$lang['Home'] = 'Αρχική';
+$lang['in this album'] = 'σε αυτό λεύκωμα';
+$lang['in %d sub-album'] = 'σε %d υπο-λεύκωμα';
+$lang['in %d sub-albums'] = 'σε %d υπο-λευκώματα';
+$lang['included'] = 'συμπεριλήφθηκαν';
+$lang['Invalid password!'] = 'Λάθος κωδικός!';
+$lang['Language'] = 'Γλώσσα';
+$lang['last %d days'] = 'τελευταίες %d ημέρες';
+$lang['Last'] = 'Τελευταία';
+$lang['Logout'] = 'Αποσύνδεση';
+$lang['obligatory'] = 'απαραίτητο';
+$lang['Maximum photo height'] = 'Μέγιστο ύψος εικόνας';
+$lang['Maximum height must be a number superior to 50'] = 'Το μέγιστο ύψος πρέπει να είναι μεγαλύτερο του 50';
+$lang['Maximum photo width'] = 'Μέγιστο πλάτος εικόνας';
+$lang['Maximum width must be a number superior to 50'] = 'Το μέγιστο πλάτος πρέπει να είναι μεγαλύτερο του 50';
+$lang['%d album updated'] = '%d λεύκωμα ενημερώθηκε';
+$lang['%d albums updated'] = '%d λευκώματα ενημερώθηκαν';
+$lang['%d comment to validate'] = '%d σχόλιο για επικύρωση';
+$lang['%d comments to validate'] = '%d σχόλια για επικύρωση';
+$lang['%d new comment'] = '%d νέο σχόλιο';
+$lang['%d new comments'] = '%d νέα σχόλια';
+$lang['%d comment'] = '%d σχόλιο';
+$lang['%d comments'] = '%d σχόλια';
+$lang['%d hit'] = '%d εμφάνιση';
+$lang['%d hits'] = '%d εμφανίσεις';
+$lang['%d new photo'] = '%d νέα φωτογραφία';
+$lang['%d new photos'] = '%d νέες φωτογραφίες';
+$lang['%d new user'] = '%d νέος χρήστης';
+$lang['%d new users'] = '%d νέοι χρήστες';
+$lang['About'] = 'Σχετικά';
+$lang['All tags'] = 'Όλες οι ετικέτες';
+$lang['Any tag'] = 'Οποιαδήποτε ετικέτα';
+$lang['At least one listed rule must be satisfied.'] = 'Πρέπει να τηρείται τουλάχιστον ένα κριτήριο της λίστας.';
+$lang['Author'] = 'Συντάκτης';
+$lang['Albums'] = 'Λευκώματα';
+$lang['Album'] = 'Λεύκωμα';
+$lang['Close this window'] = 'Κλείσιμο παραθύρου';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS feed για φωτογραφίες και σχόλια';
+$lang['Confirm Password'] = 'Επιβεβαίωση κωδικού';
+$lang['Connection settings'] = 'Ρυθμίσεις σύνδεσης';
+$lang['Login'] = 'Σύνδεση';
+$lang['Contact webmaster'] = 'Επικοινωνία με το διαχειριστή';
+$lang['Create a new account'] = 'Δημιουργία νέου λογαριασμού';
+$lang['Created on'] = 'Δημιουργήθηκε στις';
+$lang['Current password is wrong'] = 'Εισάγατε λάθος κωδικό';
+$lang['Dimensions'] = 'Διαστάσεις';
+$lang['Display'] = 'Εμφάνιση';
+$lang['Each listed rule must be satisfied.'] = 'Πρέπει να ικανοποιηθούν όλοι οι κανόνες.';
+$lang['Email address'] = 'Διεύθυνση ηλεκτρονικού ταχυδρομείου';
+$lang['Enter your personnal informations'] = 'Συμπληρώστε τα στοιχεία σας';
+$lang['Error sending email'] = 'Σφάλμα κατά την αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου';
+$lang['File name'] = 'Όνομα αρχείου';
+$lang['File'] = 'Αρχείο';
+$lang['Filesize'] = 'Μέγεθος αρχείου';
+$lang['Filter and display'] = 'Αναζήτηση';
+$lang['Filter'] = 'Φίλτρα';
+$lang['Forgot your password?'] = 'Ξεχάσατε το κωδικό σας;';
+$lang['Go through the gallery as a visitor'] = 'Περιήγηση ως επισκέπτης';
+$lang['Help'] = 'Βοήθεια';
+$lang['Identification'] = 'Λογαριασμός';
+$lang['Photos only RSS feed'] = 'RSS feed μόνο για φωτογραφίες';
+$lang['Keyword'] = 'Λέξη κλειδί';
+$lang['Links'] = 'Σύνδεσμοι';
+$lang['N/A'] = 'Δ/Υ';
+$lang['New on %s'] = 'Καινούργιο στις %s';
+$lang['Notification'] = 'Ενημερώσεις';
+$lang['Number of items'] = 'Αριθμός αντικειμένων';
+$lang['Original dimensions'] = 'Αρχικές διαστάσεις';
+$lang['Password forgotten'] = 'Χαμένος κωδικός';
+$lang['Password'] = 'Κωδικός';
+$lang['Profile'] = 'Προφίλ';
+$lang['Quick connect'] = 'Γρήγορη σύνδεση';
+$lang['RSS feed'] = 'Τροφοδοσία RSS';
+$lang['Register'] = 'Εγγραφείτε';
+$lang['Registration'] = 'Εγγραφή';
+$lang['Related tags'] = 'Σχετικές ετικέτες';
+$lang['Reset'] = 'Επαναφορά';
+$lang['Retrieve password'] = 'Ανάκτηση κωδικού';
+$lang['Search rules'] = 'Αναζήτηση με κριτήρια';
+$lang['Search tags'] = 'Αναζήτηση στις ετικέτες';
+$lang['Search'] = 'Αναζήτηση';
+$lang['display available tags'] = 'εμφάνιση διαθέσιμων ετικετών';
+$lang['Since'] = 'Από';
+$lang['Sort by'] = 'Ταξινόμηση βάση';
+$lang['Sort order'] = 'Ταξινόμηση';
+$lang['Tag'] = 'Ετικέτα';
+$lang['Tags'] = 'Ετικέτες';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Το RSS βοηθά να είστε πάντα ενήμεροι για τα νέα της σελίδας: ανάρτηση νέων φωτογραφιών, ανανεώσεις των λευκωμάτων, νέα σχόλια. Χρειάζεται ένα λογισμικό ανάγνωσης RSS feeds (RSS reader).';
+$lang['Unknown feed identifier'] = 'Άγνωστο αναγνωριστικό RSS feed';
+$lang['User comments'] = 'Σχόλια χρηστών';
+$lang['Username'] = 'Όνομα χρήστη';
+$lang['Visits'] = 'Επισκέψεις';
+$lang['Webmaster'] = 'Υπεύθυνος σελίδας';
+$lang['Week %d'] = 'Εβδομάδα %d';
+$lang['About Piwigo'] = 'Σχετικά με το Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Δεν έχετε δικαίωμα να δείτε αυτή τη σελίδα';
+$lang['add this photo to your favorites'] = 'προσθέστε αυτή τη φωτογραφία στις αγαπημένες';
+$lang['Administration'] = 'Διαχείριση';
+$lang['all'] = 'όλα';
+$lang['ascending'] = 'αύξουσα';
+$lang['author(s) : %s'] = 'συντάκτες : %s';
+$lang['Expand all albums'] = 'Να φαίνονται πάντα και τα υπο-λευκώματα';
+$lang['posted after %s (%s)'] = 'αναρτήθηκε μετά τις %s (%s)';
+$lang['posted before %s (%s)'] = 'αναρτήθηκε πριν τις %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'αναρτήθηκε ανάμεσα στις %s (%s) και %s (%s)';
+$lang['posted on %s'] = 'αναρτήθηκε στις %s';
+$lang['Best rated'] = 'Υψηλότερες βαθμολογίες';
+$lang['display best rated photos'] = 'προβολή φωτογραφιών με την υψηλότερη βαθμολογία';
+$lang['Calendar'] = 'Ημερολόγιο';
+$lang['All'] = 'Όλα';
+$lang['display each day with photos, month per month'] = 'εμφάνιση φωτογραφιών σε μορφή ημερολογίου';
+$lang['View'] = 'Εμφάνιση';
+$lang['chronology_monthly_calendar'] = 'Ημερολόγιο';
+$lang['chronology_monthly_list'] = 'Μηνιαία λίστα';
+$lang['chronology_weekly_list'] = 'Εβδομαδιαία λίστα';
+$lang['Click here if your browser does not automatically forward you'] = 'Κάντε κλικ εδώ αν δεν μεταφερθείτε αυτόματα';
+$lang['comment date'] = 'ημερομηνία σχολίου';
+$lang['Comment'] = 'Σχόλιο';
+$lang['Your comment has been registered'] = 'Το σχόλιό σας καταχωρήθηκε';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Παρακαλώ περιμένετε λίγο πριν προσπαθήσετε να στείλετε ένα ακόμη σχόλιο';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Το σχόλιο σας δεν καταχωρήθηκε επειδή δεν πέρασε τα κριτήρια επικύρωσης';
+$lang['Your favorites'] = 'Αγαπημένες';
+$lang['display this album'] = 'εμφάνιση λευκώματος';
+$lang['display last user comments'] = 'εμφάνιση πρόσφατων σχολίων';
+$lang['this email address is already in use'] = 'αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη';
+$lang['html tags are not allowed in login'] = 'δεν επιτρέπεται κώδικας html στο όνομα χρήστη';
+$lang['%d Kb'] = '%d Kb';
+$lang['Post date'] = 'Ημερομηνία ανάρτησης';
+$lang['Posted on'] = 'Αναρτήθηκε στις';
+$lang['%d rates'] = '%d Κατατάξεις';
+$lang['Rating score'] = 'Βαθμολογία κατάταξης';
+$lang['The number of photos per page must be a not null scalar'] = 'Ο αριθμός των φωτογραφιών ανά σελίδα πρέπει να είναι ακέραιος και διάφορος του μηδενός';
+$lang['Number of photos per page'] = 'Αριθμός φωτογραφιών ανά σελίδα';
+$lang['Invalid username or email'] = 'Μη έγκυρο όνομα χρήστη ή email';
+$lang['Password reset is not allowed for this user'] = 'Η επαναφορά του κωδικού δεν επιτρέπεται για αυτόν τον χρήστη';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Ο χρήστης "%s" δεν έχει email, η επαναφορά του κωδικού δεν είναι δυνατή';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Κάποιος ζήτησε την επαναφορά του κωδικού για τον παρακάτω λογαριασμό χρήστη:';
+$lang['Username "%s" on gallery %s'] = 'Όνομα χρήστη "%s" στην γκάλλερι %s';
+$lang['To reset your password, visit the following address:'] = 'Για την επαναφορά του κωδικού επισκέψου την παρακάτω διεύθυνση:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Αν αυτό ήταν ένα λάθος, απλά αγνοείστε αυτό το email και τίποτα δεν θα συμβεί.';
+$lang['Password Reset'] = 'Ο κωδικός επανήλθε';
+$lang['Check your email for the confirmation link'] = 'Έλεγξε το email σου για το link επιβεβαιώσης';
+$lang['Invalid key'] = 'Λάθος κλειδί';
+$lang['The passwords do not match'] = 'Ο κωδικός δεν ταιριάζει';
+$lang['Your password has been reset'] = 'Ο κωδικός έχει επεναφερθεί';
+$lang['Return to home page'] = 'Επιστροφή στην αρχική σελίδα';
+$lang['Please enter your username or email address.'] = 'Παρακαλώ εισάγεται το όνομα χρήσης ή το email σας.';
+$lang['You will receive a link to create a new password via email.'] = 'Θα λάβεις ένα link για να δημιουργήσεις ένα κωδικό μέσω email.';
+$lang['Username or email'] = 'Όνομα χρήστη ή email';
+$lang['Change my password'] = 'Αλλαγή του κωδικού';
+$lang['Enter your new password below.'] = 'Πληκτρολόγησε τον νέο κωδικό παρακάτω.';
+$lang['EXIF Metadata'] = 'EXIF μεταδεδομένα';
+$lang['IPTC Metadata'] = 'IPTC μεταδεδομένα';
+$lang['Edit'] = 'Επεξεργασία';
+$lang['Hello %s,'] = 'Γεια σου %s,';
+$lang['Send my connection settings by email'] = 'Αποστολή ρυθμίσεων σύνδεσης μέσω ηλεκτρονικού ταχυδρομείου';
+$lang['Show oldest comments first'] = 'Εμφάνιση των παλιών σχολίων πρώτα';
+$lang['Show latest comments first'] = 'Εμφάνιση των νεώτερων σχολίων πρώτα';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Επιτυχημένη εγγραφή, σύντομα θα λάβεις ένα email με τις ρυθμίσεις σύνδεσης. Καλώς ήλθες!';
+$lang['Username modification'] = 'Μετατροπή του ονόματος σύνδεσης';
+$lang['Your username has been successfully changed to : %s'] = 'Το όνομα σύνδεσης έχει αλλάξει σε : %s';
+$lang['square'] = 'Τετράγωνο';
+$lang['thumb'] = 'Μικρογραφία';
+$lang['small'] = 'Μικρό';
+$lang['medium'] = 'Ενδιάμεσο';
+$lang['large'] = 'Μεγάλο';
+$lang['xlarge'] = 'Πολύ μεγάλο';
+$lang['xxlarge'] = 'Εξαιρετικά μεγάλο';
+$lang['Original'] = 'Γνήσιοl';
+$lang['Thank you for registering at %s!'] = 'Ευχαριστούμε για την εγγραφή στο %s!';
+$lang['Here are your connection settings'] = 'Οι ρυθυμίσεις σύνδεσης σας';
+$lang['Password: %s'] = 'Κωδικός: %s';
+$lang['Username: %s'] = 'Όνομα χρήσης: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Αν νομίζεις ότι έχεις λάβει ηλεκτρονικό μήνυμα κατά λάθος, επικοινήστε μαζί μας στο %s';
+$lang['Photo sizes'] = 'Μέγεθος φωτογραφιών';
+$lang['View in'] = 'Εμφάνιση στο';
+$lang['Mobile'] = 'Κινητό';
+$lang['Desktop'] = 'Επιφάνεια εργασίας';
+$lang['2small'] = 'XXS - εξαιρετικά μικρό';
+$lang['xsmall'] = 'XS - πολύ μικρό';
+$lang['File name, A &rarr; Z'] = 'Όνομα αρχείου, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Όνομα αρχείου, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Όνομα φωτογραφίας, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Όνομα φωτογραφίας, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Ημέρα δημιουργίας, νεότερη &rarr; παλαιότερη';
+$lang['Date created, old &rarr; new'] = 'Ημέρα δημιουργίας, παλαιότερη &rarr; νεότερη';
+$lang['Date posted, new &rarr; old'] = 'Ημέρα καταχώρησης, πρόσφατη &rarr; παλαιότερη';
+$lang['Date posted, old &rarr; new'] = 'Ημέρα καταχώρησης, παλαιότερη &rarr; πρόσφατη';
+$lang['Rating score, high &rarr; low'] = 'Βαθμολογία κατάταξης, υψηλή &rarr; χαμηλή';
+$lang['Rating score, low &rarr; high'] = 'Βαθμολογία κατάταξης, χαμηλή &rarr; υψηλή';
+$lang['Visits, high &rarr; low'] = 'Επισκέψεις, περισσότερες &rarr; λιγότερες';
+$lang['Visits, low &rarr; high'] = 'Επισκέψεις, λιγότερες &rarr; περισσότερες';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Αριθμητικό αναγνωριστικό, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Αριθμητικό αναγνωριστικό, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Χειροκίνητη ταξινόμηση'; 
+
+?>
Index: tags/2.4.0RC3/language/el_GR/index.php
===================================================================
--- tags/2.4.0RC3/language/el_GR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/el_GR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/el_GR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/install.lang.php	(revision 14585)
@@ -0,0 +1,78 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "τα ονόματα των πινάκων της βάσης δεδομένων θα πάρουν αυτό το πρόθεμα (σας επιτρέπει να διαχειρίζεστε τους πίνακες σας καλύτερα)";
+$lang['enter a login for webmaster'] = "Εισάγετε ένα όνομα χρήστη για τον webmaster";
+$lang['webmaster login can\'t contain characters \' or "'] = "Το όνομα χρήστη δεν μπορεί να περιέχει τους χαρακτήρες ' ή \"";
+$lang['please enter your password again'] = "Παρακαλώ εισάγετε τον κωδικό πάλι";
+$lang['Webmaster password'] = "Ο κωδικός του Webmaster";
+$lang['Keep it confidential, it enables you to access administration panel'] = "Κρατήστε το εμπιστευτικό, επιτρέπει να έχετε πρόσβαση σε πίνακα διαχείρισης";
+$lang['Password [confirm]'] = "Κωδικός [επιβεβαίωση]";
+$lang['verification'] = "Επιβεβαίωση";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Χρειάζεστε βοήθεια; Ρωτήστε στο <a href=\"%s\">Πίνακα μηνυμάτων του Piwigo</a>.";
+$lang['Webmaster mail address'] = "Διεύθυνση ταχυδρομείου του Webmaster";
+$lang['Visitors will be able to contact site administrator with this mail'] = "Οι επισκέπτες θα μπορούν να χρησιμοποιήσουν αυτό το email για να επικοινωνήσουν με τον διαχειριστή του site";
+$lang['PHP 5 is required'] = "Aπαιτείτε PHP 5";
+$lang['It appears your webhost is currently running PHP %s.'] = "Φαίνετται ότι ο webhost τώρα τρέχει PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Το Piwigo θα προσπαθήσει να αλλάξει την διαμόρφωση της PHP 5 δημιουργώντας ή τροποποιώντας ένα .htaccess αρχείο.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "Λάβε υπ' όψη ότι μπορείς να αλλάξεις την διαμόρφωση και να επανεκκινήσεις το Piwigo μετά από αυτό.";
+$lang['Try to configure PHP 5'] = "Προσπάθησε να διαμορφώσεις την PHP 5";
+$lang['Sorry!'] = "Συγγνώμη!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Το Piwigo δεν είναι σε θέση να διαμορφώσει την PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Πρέπει να αναφέρετε στην υποστήριξη του παροχέα ςσας για να διαπιστώσετε πως μπορείτε να αλλάξετε σε PHP 5 μόνοι σας.";
+$lang['Hope to see you back soon.'] = "Ελπίζουμε να σας δούμε πάλι σύντομα.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Συγχαρητήρια, η εγκατάσταση του Piwigo ολοκληρώθηκε';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Μια εναλλακτική λύση είναι να αντιγράψετε το κείμενο σε στο πλαίσιο παρακάτω και να το επικολλήστε στο αρχείο "local/config/database.inc.php" (Προειδοποίηση : το database.inc.php πρέπει να περιέχει ότι είναι στην περιοχή κειμένου, χωρίς enter ή κενό)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Η δημιουργία του αρχείου local/config/database.inc.php απέτυχε.';
+$lang['Download the config file'] = 'Κατέβασμα του αρχείου διαμόρωσης';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Μπορείς να κατεβάσεις το αρχείο διαμόρφωσης και να το ανεβάσεις στο local/config κατάλογο της εγκατάστασης σου.';
+$lang['Just another Piwigo gallery'] = 'Ακόμα μια γκαλερί Piwigo';
+$lang['Welcome to my photo gallery'] = 'Καλώς ήλθατε στη φωτογραφική μου γκαλερί'; 
+
+
+
+$lang['Admin configuration'] = 'Ρυθμίσεις Διαχειριστή της ιστοσελίδας';
+$lang['Basic configuration'] = 'Βασικές διαμόρφωση';
+$lang['Can\'t connect to server'] = 'Δεν είναι δυνατή η σύνδεση με τον διακομιστή';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Σύνδεση με διακομιστή επιτυχής, αλλά η σύνδεση με τη βάση δεδομένων είναι αδύνατη';
+$lang['Database configuration'] = 'Διαμόρφωση Βάσης Δεδομένων';
+$lang['Database name'] = 'Όνομα Βάσης Δεδομένων';
+$lang['Database table prefix'] = 'πρόθεμα πίνακα της βάσης δεδομένων ';
+$lang['Default gallery language'] = 'Γλώσσας προεπιλεγμένης γκαλερί';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Μην διστάσετε να συμβουλευτείτε το φόρουμ μας για οποιαδήποτε βοήθεια:%s';
+$lang['Host'] = 'διακομιστήw υποδοχής';
+$lang['Installation'] = 'Εγκατάσταση';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Έτσι Θα δείχνει στους επισκέπτες. Είναι απαραίτητο για την διαχείριση της ιστοσελίδας';
+$lang['Password'] = 'Κωδικός προσβασης';
+$lang['Start Install'] = 'Ξεκινήστε την εγκατάσταση';
+$lang['User'] = 'Χρήστης';
+$lang['Webmaster login'] = 'Σύνδεση Υπεύθυνου';
+$lang['Welcome to your new installation of Piwigo!'] = 'Καλώς ήρθατε στην νέα σας εγκατάσταση του Piwigo!';
+$lang['also given by your host provider'] = 'Επίσης, δίνεται από την εταιρία φιλοξενίας σας';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Η διεύθυνση ηλεκτρονικού ταχυδρομείου πρέπει να είναι σαν xxx@yyy.eee (παράδειγμα: jack@altern.org)';
+$lang['user login given by your host provider'] = 'Όνομα χρήστη που έχει λάβει από το φορέα υποδοχής σας';
+$lang['user password given by your host provider'] = 'Κωδικός προσβασης χρήστη που έχει λάβει από το φορέα υποδοχής σας';
+?>
Index: tags/2.4.0RC3/language/el_GR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/el_GR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Ελληνικά [GR]
Index: tags/2.4.0RC3/language/el_GR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/el_GR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/el_GR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['All sub-albums of private albums become private'] = 'Όλα τα υπο-άλμπουμ των ιδιωτικών άλμπουμ γίνονται ιδιωτικά';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ως προληπτικό μέτρο, οι παρακάτω επεκτάσεις έχουν απενεργοποιηθεί. Θα πρέπει να ελέγξετε για αναβαθμίσεις επεκτάσεων πριν από την επανενεργοποίηση τους:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Ως προληπτικό μέτρο, τα ακόλουθα Θέματα έχουν απενεργοποιηθεί. Θα πρέπει να ελέγξετε για  αναβάθμιση Θεμάτων πριν από την επανενεργοποίηση τους:';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'Σε <i>%s</ i>, πριν <b></b>, εισάγετε:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Μόνο ένας διαχειριστής μπορεί να τρέξει αναβάθμιση: Παρακαλώ συνδεθείτε παρακάτω. ';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Μόνο τα προθέματα μικρογραφιών και η διεύθυνση ηλεκτρονικού ταχυδρομείου του webmaster έχουν σωθεί από προηγούμενες διαμορφώσεις';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Εκτελέστε έναν έλεγχο συντήρησης [Διαχείριση>Εργαλεία>Συντήρηση] Αν αντιμετωπίζετε κάποιο πρόβλημα.';
+$lang['SQL queries'] = 'ερωτήματα SQL';
+$lang['Statistics'] = 'Στατιστικά';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Η σελίδα αυτή προτείνει την αναβάθμιση της βάσης δεδομένων από την παλιά έκδοση Piwigo σας στη νέα έκδοση. Ο βοηθός αναβάθμισης νομίζει ότι τρέχετε την <strong>έκδοση %s</strong> (ή κάτι τέτοιο).';
+$lang['Upgrade from version %s to %s'] = 'Αναβάμηση απο έκδοση %s σε %s';
+$lang['Upgrade informations'] = 'Πληροφορίες Αναβάθμησης';
+$lang['Upgrade'] = 'Αναβάθμηση';
+$lang['User permissions and group permissions have been erased'] = 'Τα δικαιώματα χρηστών και ομάδων έχουν διαγραφτεί';
+$lang['You do not have access rights to run upgrade'] = 'Δεν έχετε δικαιώματα πρόσβασης για την εκτέλεση αναβάθμισης';
+$lang['total SQL time'] = 'Συνολικός χρόνος SQL';
+$lang['total upgrade time'] = 'Συνολικός χρόνος αναβάθμησης';
+?>
Index: tags/2.4.0RC3/language/en_UK/about.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/about.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>This photo gallery is based on Piwigo.</p>
+
+<p>Piwigo is a photo gallery software for the web, built by an active
+community of users and developers. Extensions make Piwigo easily
+customizable. Icing on the cake, Piwigo is free and opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Visit Piwigo website</a></p>
Index: tags/2.4.0RC3/language/en_UK/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/admin.lang.php	(revision 14585)
@@ -0,0 +1,899 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang[' and %d virtual'] = " and %d virtual";
+$lang[' and %d virtual'] = " and %d virtual";
+$lang['%d album including'] = "%d album including";
+$lang['%d album moved'] = "%d album moved";
+$lang['%d albums including'] = "%d albums including";
+$lang['%d albums moved'] = "%d albums moved";
+$lang['%d anomalies have been detected corrected.'] = "%d anomalies have been detected and corrected.";
+$lang['%d anomalies have been detected.'] = "%d anomalies have been detected.";
+$lang['%d anomalies have been ignored.'] = "%d anomalies have been ignored.";
+$lang['%d anomalies have not been corrected.'] = "%d anomalies have not been corrected.";
+$lang['%d anomaly has been corrected.'] = "%d anomaly has been corrected.";
+$lang['%d anomaly has been detected.'] = "%d anomaly has been detected.";
+$lang['%d anomaly has been ignored.'] = "%d anomaly has been ignored.";
+$lang['%d anomaly has not been corrected.'] = "%d anomaly has not been corrected.";
+$lang['%d association'] = "%d association";
+$lang['%d associations'] = "%d associations";
+$lang['%d group'] = "%d group";
+$lang['%d groups'] = "%d groups";
+$lang['%d guest'] = "%d guest";
+$lang['%d guests'] = "%d guests";
+$lang['%d line filtered'] = "%d line filtered";
+$lang['%d lines filtered'] = "%d lines filtered";
+$lang['%d mail was not sent.'] = "%d mail has not been sent.";
+$lang['%d mail was sent.'] = "%d mail has been sent.";
+$lang['%d mails were not sent.'] = "%d mails have not been sent.";
+$lang['%d mails were sent.'] = "%d mails have been sent.";
+$lang['%d member'] = "%d member";
+$lang['%d members'] = "%d members";
+$lang['%d of %d photos selected'] = '%d of %d photos selected';
+$lang['%d parameter was updated.'] = "%d parameter updated.";
+$lang['%d parameters were updated.'] = "%d parameters updated.";
+$lang['%d photo was deleted'] = "%d photo deleted";
+$lang['%d photos uploaded'] = '%d photos uploaded';
+$lang['%d photos were deleted'] = "%d photos deleted";
+$lang['%d physical'] = " %d physical";
+$lang['%d physical'] = " %d physical";
+$lang['%d tag'] = "%d tag";
+$lang['%d tags'] = "%d tags";
+$lang['%d user comment rejected'] = "%d user comment rejected";
+$lang['%d user comment validated'] = "%d user comment validated";
+$lang['%d user comments rejected'] = "%d user comments rejected";
+$lang['%d user comments validated'] = "%d user comments validated";
+$lang['%d user deleted'] = "%d user deleted";
+$lang['%d user was not updated.'] = "%d user not updated.";
+$lang['%d user was updated.'] = "%d user updated.";
+$lang['%d user'] = "%d user";
+$lang['%d users deleted'] = "%d users deleted";
+$lang['%d users were not updated.'] = "%d users not updated.";
+$lang['%d users were updated.'] = "%d users updated.";
+$lang['%d users'] = "%d users";
+$lang['%d waiting for validation'] = "%d waiting for validation";
+$lang['%s has been successfully updated.'] = "%s has been successfully updated.";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s must be set to false in your local/config/config.inc.php file";
+$lang['%s photos can not be regenerated'] = '%s photos can not be regenerated';
+$lang['%s photos have been regenerated'] = '%s photos have been regenerated';
+$lang['%s value is not correct file because exif are not supported'] = "%s value is incorrect because exif are not supported";
+$lang['(this tag will be deleted)'] = '(this tag will be deleted)';
+$lang['+ Add an upload box'] = '+ Add an upload box';
+$lang[', click on'] = ", click on";
+$lang['... or '] = '... or ';
+$lang['A new version of Piwigo is available.'] = "A new version of Piwigo is available.";
+$lang['Access type'] = "Access type";
+$lang['ACCESS_0'] = "Free access";
+$lang['ACCESS_1'] = "Access to all";
+$lang['ACCESS_2'] = "Access to registered users";
+$lang['ACCESS_3'] = "Access to administrators";
+$lang['ACCESS_4'] = "Access to webmasters";
+$lang['ACCESS_5'] = "No access";
+$lang['Action'] = 'Action';
+$lang['Actions'] = "Actions";
+$lang['Activate icon "%s"'] = 'Activate icon "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activate icon "new" next to albums and pictures';
+$lang['Activate Navigation Bar'] = 'Activate navigation bar';
+$lang['Activate Navigation Thumbnails'] = 'Activate navigation thumbnails';
+$lang['Activate comments'] = 'Activate comments';
+$lang['Activate'] = "Activate";
+$lang['Active Languages'] = 'Active Languages';
+$lang['Active Plugins'] = 'Active Plugins';
+$lang['Active Themes'] = 'Active Themes';
+$lang['Add a criteria'] = 'Add a criteria';
+$lang['Add a filter'] = 'Add a filter';
+$lang['Add a tag'] = "Add a tag";
+$lang['Add a user'] = "Add a user";
+$lang['Add a virtual album'] = "Add a virtual album";
+$lang['Add another set of photos'] = 'Add another set of photos';
+$lang['Add detailed content'] = "Add some detailed content";
+$lang['Add group'] = "Add group";
+$lang['Add New Language'] = 'Add New Language';
+$lang['add new photos to caddie'] = "add new photos to caddie";
+$lang['Add New Theme'] = "Add a new theme";
+$lang['Add Photos'] = 'Add Photos';
+$lang['Add tags'] = 'Add tags';
+$lang['Add to caddie'] = "Add to caddie";
+$lang['Add write access to the "%s" directory'] = 'Add write access to the "%s" directory';
+$lang['Add'] = "Add";
+$lang['Add/delete a permalink'] = "Add/delete a permalink";
+$lang['added'] = "added";
+$lang['Administration Home'] = 'Administration Home';
+$lang['Advanced features'] = "Advanced features";
+$lang['Album "%s" has been added'] = 'Album "%s" has been added';
+$lang['Album "%s" now contains %d photos'] = 'Album "%s" now contains %d photos';
+$lang['Album list management'] = "Album list management";
+$lang['Album manual order was saved'] = "Album manual order was saved";
+$lang['Album name'] = 'Album name';
+$lang['Album photos associated to the following albums: %s'] = "Album photos associated to the following albums: %s";
+$lang['Album updated successfully'] = "Album updated successfully";
+$lang['albums added in the database'] = "albums added in the database";
+$lang['Albums authorized thanks to group associations'] = "Albums authorized thanks to group associations";
+$lang['Albums automatically sorted'] = 'Albums automatically sorted';
+$lang['albums deleted in the database'] = "albums deleted in the database";
+$lang['All %d photos are selected'] = 'All %d photos are selected';
+$lang['All extensions are up to date.'] = 'All extensions are up to date.';
+$lang['All languages are up to date.'] = 'All languages are up to date.';
+$lang['All optimizations have been successfully completed.'] = "All optimizations have been successfully completed.";
+$lang['All plugins are up to date.'] = 'All plugins are up to date.';
+$lang['All themes are up to date.'] = 'All themes are up to date.';
+$lang['all'] = "all";
+$lang['Allow rating'] = "Allow rating";
+$lang['Allow user customization'] = 'Allow user customization';
+$lang['Allow user registration'] = "Allow user registration";
+$lang['Allow users to delete their own comments'] = "Allow users to delete their own comments";
+$lang['Allow users to edit their own comments'] = "Allow users to edit their own comments";
+$lang['Allowed file types: %s.'] = 'Allowed file types: %s.';
+$lang['an error happened'] = "an error occurred";
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.';
+$lang['An error has occured during upgrade.'] = 'An error has occured during upgrade.';
+$lang['An error occured during extraction (%s).'] = "An error occured during the files (%s) extraction.";
+$lang['An information email was sent to group "%s"'] = "Information email sent to group \"%s\"";
+$lang['and'] = "and";
+$lang['Anomaly'] = "Anomaly";
+$lang['Anyway only webmasters can see this tab and never administrators.'] = "Anyway only webmasters can see this tab, no administrators.";
+$lang['Apply action'] = 'Apply action';
+$lang['Apply selected corrections'] = "Apply selected corrections";
+$lang['Apply to sub-albums'] = "Apply to sub-albums";
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "Are you sure you want to install this upgrade? You must verify if this version does not need prior uninstallation.";
+$lang['Are you sure you want to delete this plugin?'] = "Are you sure you want to delete this plugin?";
+$lang['Are you sure you want to install this plugin?'] = "Are you sure you want to install this plugin?";
+$lang['Associate to album'] = "Associate to album";
+$lang['associate to group'] = "associate to group";
+$lang['Associated'] = "Associated";
+$lang['Authorize users to add comments on selected albums'] = "Authorize users to add comments on selected albums";
+$lang['Authorized'] = "Authorized";
+$lang['Automatic correction'] = "Automatic correction";
+$lang['automatic order'] = 'automatic order';
+$lang['Available only with HTML format'] = "Available only with HTML format";
+$lang['Average rate'] = "Average rate";
+$lang['average time'] = "average time";
+$lang['Batch Manager'] = 'Batch Manager';
+$lang['between'] = "between";
+$lang['Bound Theme'] = 'Bound Theme';
+$lang['By %s'] = 'By %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'By default, Piwigo will create a new websize from the HD (high definition) version of your photo.';
+$lang['By rank'] = 'By rank';
+$lang['Caddie management'] = "Caddie management";
+$lang['Caddie'] = "Caddie";
+$lang['Cannot delete the old permalink !'] = "The old permalink cannot be deleted!";
+$lang['Can\'t connect to server.'] = "Connection to server impossible.";
+$lang['Can\'t create temporary file.'] = "Temporary file cannot be created.";
+$lang['Can\'t download archive.'] = "Archive cannot be downloaded.";
+$lang['Can\'t read or extract archive.'] = "Archive cannot be read or extracted.";
+$lang['Change Admin Colors'] = 'Change administration colors';
+$lang['Check all'] = "Check all";
+$lang['Check automatic corrections'] = "Check automatic corrections";
+$lang['Check for updates'] = "Check for updates";
+$lang['Check for upgrade failed for unknown reasons.'] = "Check for upgrade failed for unknown reasons.";
+$lang['Check for upgrade'] = "Check for upgrade";
+$lang['Check integrity'] = "Integrity check";
+$lang['Choose an action'] = 'Choose an action';
+$lang['Choose an option'] = "Choose an option";
+$lang['Classic display'] = "Classic display";
+$lang['clean'] = "clean up";
+$lang['Comments for all'] = "Comments for all";
+$lang['Complementary mail content'] = "Complementary mail content";
+$lang['Configuration'] = "Configuration";
+$lang['Confirm merge'] = 'Confirm merge';
+$lang['confirm'] = "confirm";
+$lang['Continue processing treatment'] = "Continue ongoing treatment";
+$lang['Correction applied with error'] = "Correction applied with error";
+$lang['Correction applied with success'] = "Correction successfully applied";
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = "Corrected  anomaly will no longer be ignored";
+$lang['Correction'] = "Correction";
+$lang['create a new album'] = 'create a new album';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = "Create a new site : (give its URL to create_listing_file.php)";
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Create the "%s" directory at the root of your Piwigo installation';
+$lang['Create this site'] = "Create this site";
+$lang['Create'] = 'Create';
+$lang['created'] = "created";
+$lang['Crop'] = 'Crop';
+$lang['Current name'] = "Current name";
+$lang['Database synchronization with files'] = "Database synchronization with files";
+$lang['Database'] = "Database";
+$lang['Date'] = "Date";
+$lang['Day'] = "Day";
+$lang['Deactivate all'] = "Deactivate all";
+$lang['Deactivate'] = "Deactivate";
+$lang['Default comments order'] = 'Default comments order';
+$lang['Default display'] = "Default display";
+$lang['Default photos order'] = "Default photos order";
+$lang['Default user cannot be deleted'] = "Default user cannot be deleted";
+$lang['Default user does not exist'] = "The default user does not exist";
+$lang['default values'] = "default values";
+$lang['default'] = "default";
+$lang['delete album'] = "delete album";
+$lang['Delete orphan tags'] = 'Delete orphan tags';
+$lang['delete photo'] = 'delete photo';
+$lang['Delete Representant'] = "Delete album thumbnail";
+$lang['Delete selected photos'] = "Delete selected photos";
+$lang['Delete selected tags'] = "Delete selected tags";
+$lang['Delete selected users'] = "Delete selected users";
+$lang['Delete this language'] = 'Delete this language';
+$lang['delete this site and all its attached elements'] = "delete this site and all the related information";
+$lang['Delete this theme'] = 'Delete this theme';
+$lang['delete'] = "delete";
+$lang['Deleted on'] = "Deleted on";
+$lang['deleted'] = "deleted";
+$lang['Deletions'] = "Deletions";
+$lang['Deny selected groups'] = "Deny selected groups";
+$lang['Deny selected users'] = "Deny selected users";
+$lang['Description'] = "Description";
+$lang['Detailed informations'] = "Detailed informations";
+$lang['directories + files'] = "directories + files";
+$lang['Directory does not exist'] = 'Directory does not exist';
+$lang['Directory'] = "Directory";
+$lang['Discover album:'] = "Discover album:";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = "display maximum information (added albums and photos, deleted albums and photos)";
+$lang['Display options'] = "Display options";
+$lang['display'] = 'display';
+$lang['Dissociate from album'] = "Dissociate from album";
+$lang['dissociate from group'] = "dissociate from group";
+$lang['Dissociated'] = "Dissociated";
+$lang['Do you want to activate anyway?'] = 'Do you want to activate anyway?';
+$lang['Documentation'] = "Documentation";
+$lang['Does not represent'] = "Is not thumbnail for";
+$lang['Download,'] = 'Download,';
+$lang['Downloads'] = "Downloads";
+$lang['Drag to re-order'] = "Click-and-drag to re-order";
+$lang['Drop into album'] = 'Select an album';
+$lang['Dump Database'] = 'Dump Database';
+$lang['Duplicates'] = 'Duplicates';
+$lang['Edit album permissions'] = "Edit album permissions";
+$lang['Edit album'] = "Edit album";
+$lang['Edit photo information'] = "Edit photo information";
+$lang['Edit ranks'] = "Edit ranks";
+$lang['Edit selected tags'] = "Edit selected tags";
+$lang['Edit tags'] = "Edit tags";
+$lang['Element type'] = "Element type";
+$lang['Element'] = "Element";
+$lang['Email administrators when a comment is deleted'] = "Email administrators when a comment is deleted";
+$lang['Email administrators when a comment is modified'] = "Email administrators when a comment is modified";
+$lang['Email admins when a comment requires validation'] = "Email admins when a comment requires validation";
+$lang['Email admins when a new user registers'] = "Email admins when a new user registers";
+$lang['Email admins when a valid comment is entered'] = "Email admins when a valid comment is entered";
+$lang['email'] = "Email";
+$lang['Environment'] = "Environment";
+$lang['Error list'] = "List of errors";
+$lang['Error on file "%s" : %s'] = 'Error on file "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = "Error when sending email to %s [%s].";
+$lang['ERROR'] = 'ERROR';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.';
+$lang['Errors caption'] = "Errors legends";
+$lang['errors during synchronization'] = "errors during synchronization";
+$lang['even already synchronized photos'] = "even already synchronized photos";
+$lang['Everybody'] = 'Everybody';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "Execution time exceeded, the treatment must continue [Estimated time: %d seconds].";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = "Execution time is out, treatment must be continue [Estimated time: %d second].";
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension not available, admin should disable exif use';
+$lang['existing album'] = 'existing album';
+$lang['Extend for templates'] = "Extend templates";
+$lang['Extensions Update'] = 'Extensions Update';
+$lang['Failed to write file to disk'] = 'Failed to write file to disk';
+$lang['File upload stopped by extension'] = 'File upload stopped by extension';
+$lang['File'] = "File";
+$lang['File/directory read error'] = "File/directory read error";
+$lang['Find a new representant by random'] = "Find a new random album thumbnail";
+$lang['first photo added on %s'] = "first photo added on %s";
+$lang['Follow Orientation'] = 'Follow Orientation';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Following plugins may not be compatible with the new version of Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Following themes may not be compatible with the new version of Piwigo:';
+$lang['for the file format'] = "for the file format";
+$lang['for this file format'] = "for this file format";
+$lang['Forbid this language to users'] = 'Forbid this language to users';
+$lang['Forbid this theme to users'] = "Forbid this theme to users";
+$lang['Forbidden'] = "Forbidden";
+$lang['Form'] = "Form";
+$lang['FTP + Synchronization'] = 'FTP + Synchronization';
+$lang['Gallery title'] = "Gallery title";
+$lang['GD library is missing'] = "GD library is missing";
+$lang['GD version'] = "GD version";
+$lang['General statistics'] = "General statistics";
+$lang['Get Support on Piwigo Forum'] = 'Get support on Piwigo forum';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation';
+$lang['global mode'] = "global mode";
+$lang['Go to %s or %s for more informations'] = "Go to %s or %s for more informations";
+$lang['Go to'] = "Go to";
+$lang['Grant selected groups'] = "Grant selected groups";
+$lang['Grant selected users'] = "Grant selected users";
+$lang['Graphics Library'] = 'Graphics Library';
+$lang['group "%s" added'] = "group \"%s\" added";
+$lang['group "%s" deleted'] = "group \"%s\" deleted";
+$lang['group "%s" updated'] = "group \"%s\" updated";
+$lang['Group management'] = "Groups management";
+$lang['Group name'] = "Group name";
+$lang['Group'] = "Group";
+$lang['Groups'] = "Groups";
+$lang['Guest cannot be deleted'] = "Guest cannot be deleted";
+$lang['Guest Settings'] = 'Guest settings';
+$lang['guest'] = "guest";
+$lang['Guests'] = "Guests";
+$lang['height must be a number superior to'] = "height must be a number greater than";
+$lang['Height'] = 'Height';
+$lang['Hello'] = "Hello";
+$lang['Hello,'] = "Hello,";
+$lang['Help Me'] = 'Help Me';
+$lang['hide details'] = 'hide details';
+$lang['Hide'] = "Hide";
+$lang['High definition enabled'] = "High definition enabled";
+$lang['High definition'] = "High definition";
+$lang['high'] = "high";
+$lang['History'] = "History";
+$lang['Hit'] = "Hit";
+$lang['Hour'] = "Hour";
+$lang['Hoverbox display'] = "Hoverbox display";
+$lang['I decide to update anyway'] = 'I decide to update anyway';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.';
+$lang['If you encounter problems or have any question, please send a message to'] = "If you encounter problems or have any question, please send a message to";
+$lang['Ignore All'] = 'Ignore All';
+$lang['Ignore selected anomalies'] = "Ignore selected anomalies";
+$lang['Ignore this update'] = 'Ignore this update';
+$lang['Image id'] = "Image id";
+$lang['Image Quality'] = 'Image quality';
+$lang['Images manual order was saved'] = "Images manual order saved";
+$lang['Impossible automatic correction'] = "Automatic correction impossible";
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'This theme could not be activated, as the parent theme is missing: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossible to deactivate this language, first set another language as default.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossible to deactivate this language, you need at least one language.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Impossible to deactivate this theme, you need at least one theme.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'This theme cannot be deleted, because other themes depends on it: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting';
+$lang['Inactive Languages'] = 'Inactive Languages';
+$lang['Inactive Plugins'] = 'Inactive Plugins';
+$lang['Inactive Themes'] = 'Inactive themes';
+$lang['include child albums'] = 'include child albums';
+$lang['Include display of recent photos grouped by dates'] = "Include display of recent photos grouped by dates";
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Include history data (Warning: server memory limit may be exceeded)';
+$lang['Information data registered in database'] = "Information data registered in database";
+$lang['Informations'] = "Information";
+$lang['Install on your computer,'] = 'Install on your computer,';
+$lang['Install'] = "Install";
+$lang['Installed Languages'] = 'Installed Languages';
+$lang['Installed Themes'] = "Installed Themes";
+$lang['Instructions to use Piwigo'] = "Instructions to use Piwigo";
+$lang['Invert'] = 'Invert';
+$lang['IP'] = "IP";
+$lang['jump to album'] = "jump to album";
+$lang['jump to photo'] = "jump to photo";
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = "Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will be sent emails when a new release is available (sometimes including a security bug fix, it is important to know and upgrade) and when major events happen to the project. Only a few emails a year.";
+$lang['Language has been successfully installed'] = 'Language has been successfully installed';
+$lang['Languages which need upgrade'] = 'Languages which need upgrade';
+$lang['Languages'] = 'Languages';
+$lang['Last hit'] = "Last hit";
+$lang['Last import'] = 'Last import';
+$lang['Last revisions'] = "Last revisions";
+$lang['Last send'] = "Last sent";
+$lang['Learn more'] = 'Learn more';
+$lang['leave'] = "leave";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "Contacts";
+$lang['Level 2'] = "Friends";
+$lang['Level 4'] = "Family";
+$lang['Level 8'] = "Admins";
+$lang['Link all album photos to a new album'] = "Link all album photos to a new album";
+$lang['Link all album photos to some existing albums'] = "Link all album photos to some existing albums";
+$lang['Linked albums'] = "Linked albums";
+$lang['Local'] = "Local";
+$lang['Lock albums'] = "Lock albums";
+$lang['Lock gallery'] = "Lock gallery";
+$lang['Lock'] = "Lock";
+$lang['Locked'] = "Locked";
+$lang['Mail address is obligatory for all users'] = "Mail address is mandatory for all users";
+$lang['Mail content'] = "Mail content";
+$lang['Mail sent to %s [%s].'] = "Mail sent to %s [%s].";
+$lang['Main "guest" user does not exist'] = "The main \"guest\" user does not exist";
+$lang['Main "guest" user status is incorrect'] = "The main \"guest\" user status is incorrect";
+$lang['Main "webmaster" user does not exist'] = "The main \"webmaster\" user does not exist";
+$lang['Main "webmaster" user status is incorrect'] = "The main \"webmaster\" user status is incorrect";
+$lang['Main Page'] = 'Main page';
+$lang['Main'] = "Main";
+$lang['Maintenance'] = "Maintenance";
+$lang['Make this language available to users'] = 'Make this language available to users';
+$lang['Make this theme available to users'] = 'Make this theme available to users';
+$lang['manage album photos'] = "manage album photos";
+$lang['Manage authorizations for selected albums'] = "Manage authorizations for selected albums";
+$lang['Manage permissions for group "%s"'] = "Manage permissions for the group \"%s\"";
+$lang['Manage permissions for user "%s"'] = "Manage permissions for the user \"%s\"";
+$lang['Manage Permissions'] = 'Manage Permissions';
+$lang['Manage photo ranks'] = "Manage photo ranks";
+$lang['manage sub-albums'] = "manage sub-albums";
+$lang['Manage tags'] = "Manage tags";
+$lang['Manage this set of %d photos'] = 'Manage this set of %d photos';
+$lang['Manage'] = "Manage";
+$lang['Manual order'] = 'Manual order';
+$lang['manual order'] = 'manual order';
+$lang['Maximum file size: %sB.'] = 'Maximum file size: %sB.';
+$lang['Maximum Height'] = 'Maximum height';
+$lang['Maximum Width'] = 'Maximum Width';
+$lang['Members'] = "Members";
+$lang['Menu Management'] = 'Menus';
+$lang['Merge selected tags'] = 'Merge selected tags';
+$lang['Merge tags'] = 'Merge tags';
+$lang['Metadata synchronization results'] = "Metadata synchronization results";
+$lang['Metadata synchronized from file'] = "Metadata synchronized from file";
+$lang['Minimum privacy level'] = "Minimum privacy level";
+$lang['Miscellaneous'] = 'Miscellaneous';
+$lang['Missing a temporary folder'] = 'Missing a temporary folder';
+$lang['Missing Plugins'] = 'Missing Plugins';
+$lang['Modify information'] = "Modify information";
+$lang['Month'] = "Month";
+$lang['Move albums'] = "Move albums";
+$lang['Move'] = "Move";
+$lang['Name'] = "Name";
+$lang['New name'] = "New name";
+$lang['New parent album'] = "New parent album";
+$lang['New photos added'] = "New photos added";
+$lang['New photos were added'] = "New photos have been added";
+$lang['New tag'] = "New tag";
+$lang['New Version'] = 'New Version';
+$lang['new'] = "new";
+$lang['No destination tag selected'] = 'No destination tag selected';
+$lang['No display'] = "No display";
+$lang['No file was uploaded'] = 'No file was uploaded';
+$lang['No mail to send.'] = "No mail to be sent.";
+$lang['No photo can be deleted'] = "No photo can be deleted";
+$lang['No photo in the current set.'] = 'No photo in the current set.';
+$lang['No photo in this album'] = "No photo in this album";
+$lang['No photo selected, %d photos in current set'] = 'No photo selected, %d photos in current set';
+$lang['No photo selected, no action possible.'] = 'No photo selected, no action possible.';
+$lang['No results'] = "No results";
+$lang['No user to send notifications by mail.'] = "No user to be notified by mail.";
+$lang['no write access'] = "no write access";
+$lang['none'] = "none";
+$lang['None'] = 'None';
+$lang['nothing'] = "nothing";
+$lang['Notification'] = "Notification";
+$lang['Number of comments per page'] = "Number of comments per page";
+$lang['Number of downloads'] = "Number of downloads";
+$lang['number of miniaturized photos'] = "number of thumbnails created";
+$lang['Number of rates'] = "Number of rates";
+$lang['Number of thumbnails to create'] = "Number of thumbnails to create";
+$lang['Obsolete Plugins'] = 'Obsolete Plugins';
+$lang['on the %d selected photos'] = 'on the %d selected photos';
+$lang['on'] = "on";
+$lang['only directories'] = "directories only";
+$lang['only perform a simulation (no change in database will be made)'] = "only perform a simulation (nothing will be changed in the database)";
+$lang['Only private albums are listed'] = "Only private albums are listed";
+$lang['Operating system'] = "Operating system";
+$lang['Operation in progress'] = 'Treatment in progress.';
+$lang['Optimizations have been completed with some errors.'] = "Optimizations have been completed with some errors.";
+$lang['Optional URL keyword'] = "Optional URL keyword";
+$lang['Options'] = "Options";
+$lang['Options'] = "Options";
+$lang['Order of menubar items has been updated successfully.'] = 'Order of menubar items has been updated successfully.';
+$lang['Original templates'] = "Original templates";
+$lang['Orphan tags deleted'] = 'Orphan tags deleted';
+$lang['Other plugins'] = "Other plugins available";
+$lang['Other private albums'] = "Other private albums";
+$lang['other'] = "other";
+$lang['Overall'] = "Overview";
+$lang['overrides existing values with empty ones'] = "overrides existing values with empty ones";
+$lang['Page banner'] = "Page banner";
+$lang['Page end'] = 'Page end';
+$lang['Pages seen'] = "Pages seen";
+$lang['Parameter'] = "Settings";
+$lang['Parameters'] = "Parameters";
+$lang['Parent album'] = "Parent album";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "Password confirmation is missing. Please confirm the chosen password.";
+$lang['Password is missing. Please enter the password.'] = "Password is missing. Please enter the password.";
+$lang['Path'] = "Path";
+$lang['Pending Comments'] = 'Pending Comments';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = "Permalink %s has previously been used by album %s. Delete it from the permalinks history first";
+$lang['Permalink %s is already used by album %s'] = "Permalink %s is already used by album %s";
+$lang['Permalink history'] = "Permalinks history";
+$lang['Permalink'] = "Permalink";
+$lang['Permalinks'] = "Permalinks";
+$lang['Permission denied'] = "Permission denied";
+$lang['Permission granted thanks to a group'] = "Permission granted thanks to a group";
+$lang['Permission granted'] = "Permission granted";
+$lang['Permissions'] = "Permissions";
+$lang['Photo %s of %s'] = 'Photo %s of %s';
+$lang['Photo informations updated'] = "Photo informations updated";
+$lang['Photo Page'] = 'Photo page';
+$lang['Photo Properties'] = 'Photo properties';
+$lang['Photo name'] = 'Photo name';
+$lang['Photo unreachable or no support'] = "Photo unreachable or unsupported format";
+$lang['photos added in the database'] = "photos added in the database";
+$lang['photos candidates for metadata synchronization'] = "photos candidates for metadata synchronization";
+$lang['photos deleted from the database'] = "photos deleted from the database";
+$lang['Photos generation in progress...'] = 'Photos generation in progress...';
+$lang['photos informations synchronized with files metadata'] = "photos informations synchronized with files metadata";
+$lang['photos per page'] = "photos per page";
+$lang['photos updated in the database'] = "photos updated in the database";
+$lang['Photos'] = "Photos";
+$lang['Piwigo Administration'] = "Piwigo Administration";
+$lang['Piwigo Announcements Newsletter'] = "Piwigo Announcement Newsletter";
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo cannot retrieve upgrade file from server';
+$lang['Piwigo configuration'] = "Piwigo configuration";
+$lang['Piwigo Update'] = 'Piwigo Update';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Piwigo version'] = "Piwigo version";
+$lang['pixels'] = 'pixels';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "Please check \"plugins\" folder and sub-folders permissions (CHMOD).";
+$lang['Please wait...'] = 'Please wait...';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.';
+$lang['Plugin has been successfully copied'] = "The plugin has been successfully copied";
+$lang['Plugin list'] = "Plugins list";
+$lang['Plugins which need upgrade'] = "Plugins to be upgraded";
+$lang['Plugins'] = "Plugins";
+$lang['Position'] = "Position";
+$lang['Predefined filter'] = 'Predefined filter';
+$lang['Preferences'] = "Preferences";
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = "The time to prepare the list of users who will be sent mail is limited. Others users are not listed.";
+$lang['Privacy level set to "%s"'] = 'Privacy level set to "%s"';
+$lang['Privacy level'] = "Privacy level";
+$lang['private'] = "private";
+$lang['Private'] = "Private";
+$lang['Properties'] = "Properties";
+$lang['Public / Private'] = "Public / Private";
+$lang['Public'] = "Public";
+$lang['public'] = "public";
+$lang['Purge compiled templates'] = "Purge compiled templates";
+$lang['Purge history detail'] = "Purge history details";
+$lang['Purge history summary'] = "Purge history summary";
+$lang['Purge never used notification feeds'] = "Purge never used notification feeds";
+$lang['Purge search history'] = "Purge search history";
+$lang['Purge sessions'] = "Purge sessions";
+$lang['Quick Local Synchronization'] = "Quick Local Synchronization";
+$lang['Random photo'] = "Random photo";
+$lang['randomly represented'] = "random album thumbnail";
+$lang['ranks'] = "ranks";
+$lang['Rate date'] = "Rate date";
+$lang['Rate'] = "Rate";
+$lang['Rating by guests'] = "Rating by guests";
+$lang['Rating'] = "Rating";
+$lang['Read Piwigo Documentation'] = 'Read Piwigo Documentation';
+$lang['reduce to single existing albums'] = "reduce to single existing albums";
+$lang['Refresh photo set'] = 'Refresh photo set';
+$lang['Refresh'] = "Refresh";
+$lang['registration date'] = "registration date";
+$lang['Reinitialize check integrity'] = "Reinitialize integrity check";
+$lang['Reject'] = "Reject";
+$lang['Released on'] = "Released on";
+$lang['Remote'] = "Remote";
+$lang['Remove all filters'] = 'Remove all filters';
+$lang['remove author'] = 'remove author';
+$lang['remove creation date'] = 'remove creation date';
+$lang['Remove from caddie'] = 'Remove from caddie';
+$lang['remove tags'] = "remove tags";
+$lang['remove this filter'] = 'remove this filter';
+$lang['remove title'] = 'remove title';
+$lang['Repair and optimize database'] = "Repair and optimize database";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "Replacement of original templates by customized templates from the template-extension subfolder";
+$lang['Replacers (customized templates)'] = "Substitutes (customized templates)";
+$lang['Representant'] = "Album Thumbnail";
+$lang['Representation of albums'] = "Album thumbnail";
+$lang['Representative'] = 'Album thumbnail';
+$lang['Represents'] = 'Is thumbnail for';
+$lang['Reset ignored updates'] = 'Reset ignored updates';
+$lang['Resize'] = 'Resize';
+$lang['Restore default configuration. You will lose your plugin settings!'] = "Restore default configuration. You will lose your plugin settings!";
+$lang['Restore'] = "Restore";
+$lang['Save order'] = "Save order";
+$lang['Save Settings'] = 'Save Settings';
+$lang['Save Template Directory'] = 'Save template directory';
+$lang['Save to permalink history'] = "Save to permalinks history";
+$lang['Search for new images in the directories'] = "Search for new images in the directories";
+$lang['Searching...'] = "Searching...";
+$lang['Section'] = "Section";
+$lang['See you soon,'] = "See you soon,";
+$lang['See you soon.'] = "See you soon.";
+$lang['Select an album'] = 'Select an album';
+$lang['Select at least one album'] = "Select at least one album";
+$lang['Select at least one comment'] = 'Select at least one comment';
+$lang['Select at least one photo'] = "Select at least one photo";
+$lang['Select at least one user'] = "Select at least one user";
+$lang['Select at least two tags for merging'] = 'Select at least two tags for merging';
+$lang['Select files'] = 'Select files';
+$lang['Select recipients'] = "Select recipients";
+$lang['Select the destination tag'] = 'Select the destination tag';
+$lang['Select:'] = 'Select:';
+$lang['selection'] = "selection";
+$lang['Selection'] = 'Selection';
+$lang['Send an information email to group members'] = "Send an information email to group members";
+$lang['Send mail as'] = "Send mail as";
+$lang['Send mail on HTML format'] = "Send mail in HTML format";
+$lang['Send mail to users'] = "Send mail to users";
+$lang['Send connection settings by email'] = 'Send connection settings by email';
+$lang['Send'] = "Send";
+$lang['Set as default language for unregistered and new users'] = 'Set as default language for unregistered and new users';
+$lang['Set as default theme for unregistered and new users'] = "Set as default theme for unregistered and new users";
+$lang['Set author'] = 'Set author';
+$lang['Set creation date'] = 'Set creation date';
+$lang['Set title'] = 'Set title';
+$lang['set to'] = "set to";
+$lang['Settings'] = 'Settings';
+$lang['show details'] = 'show details';
+$lang['Show info'] = "Show info";
+$lang['Show menubar'] = "Show menubar";
+$lang['Simulation'] = "Simulation";
+$lang['singly represented'] = 'fixed album thumbnail';
+$lang['Site manager'] = "Site manager";
+$lang['Some themes and plugins may be not available yet.'] = 'Some themes and plugins may be not available yet.';
+$lang['Some upgrades are available for extensions.'] = 'Some upgrades are available for extensions.';
+$lang['Start pLoader and add your photos.'] = 'Start pLoader and add your photos.';
+$lang['Start Upload'] = 'Start Upload';
+$lang['Statistics'] = "Statistics";
+$lang['Status of user "%s" updated'] = "User \"%s\" status updated";
+$lang['Status'] = "Status";
+$lang['status'] = "status";
+$lang['Storage album'] = "Storage album";
+$lang['sub-albums'] = "sub-albums";
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = "Subscribe %s to Piwigo Announcements Newsletter";
+$lang['Subscribe %s'] = "Subscribe %s";
+$lang['Subscribe to notification by mail'] = "Subscribe to notification by mail";
+$lang['Subscribe'] = "Subscribe";
+$lang['Subscribe/unsubscribe users'] = "Subscribe/unsubscribe users";
+$lang['Subscribed'] = "Subscribed";
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "Subscribers could be listed (available) only if there is new elements to notify.";
+$lang['Sum of rates'] = "Sum of rates";
+$lang['Summary'] = "Summary";
+$lang['Support'] = "Support";
+$lang['Switch to clear or dark colors for administration'] = 'Switch to clear or dark colors for administration';
+$lang['synchronize files metadata with database photos informations'] = "synchronize database photos with files metadata";
+$lang['synchronize files structure with database'] = "synchronize files structure with database";
+$lang['Synchronize metadata'] = "Synchronize metadata";
+$lang['Synchronize'] = "Synchronize";
+$lang['Tag "%s" already exists'] = "Tag \"%s\" already exists";
+$lang['Tag "%s" was added'] = "Tag \"%s\" has been added";
+$lang['Tag selection'] = "Tags selection";
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tags <em>%s</em> merged into tag <em>%s</em>';
+$lang['target'] = "target";
+$lang['Templates configuration has been recorded.'] = "Templates configuration has been recorded.";
+$lang['Templates'] = "Templates";
+$lang['test this remote site'] = "test this remote site";
+$lang['test'] = "test";
+$lang['The %d following tags were deleted'] = "The following %d tags have been deleted";
+$lang['The anomaly will be ignored until next application version'] = "The anomaly will be ignored until next application version";
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = "The file or directory cannot be accessed (either it does not exist or the access is denied)";
+$lang['The following tag was deleted'] = 'The following tag was deleted';
+$lang['the forum'] = "the forum";
+$lang['The gallery URL is not valid.'] = "The gallery URL is not valid.";
+$lang['The original image quality must be a number between %d and %d'] = 'The original image quality must be a number between %d and %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'The original maximum height must be a number between %d and %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'The original maximum width must be a number between %d and %d';
+$lang['The name of a group must not contain " or \' or be empty.'] = "The name of a group must not contain \" or ' or be empty.";
+$lang['The name of an album must not be empty'] = "The name of an album must not be empty";
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = "The name of directories and files must comprise only letters, numbers, \"-\", \"_\" or \".\"";
+$lang['The number of comments a page must be between 5 and 50 included.'] = "The number of comments on a page must be between 5 and 50 included.";
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "The permalink name must be composed of a-z, A-Z, 0-9, \"-\", \"_\" or \"/\". It must not be numeric or begin with a number followed by \"-\"";
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'The uploaded file was only partially uploaded';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'The uploaded files exceed the post_max_size directive in php.ini: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = "The version of %s [%s] installed is not compatible with the version required [%s]";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "The webmaster has subscribed you to be notified by mail.";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "The webmaster has unsubscribed you from receiving notifications by mail.";
+$lang['The whole page'] = 'The whole page';
+$lang['The whole set'] = 'The whole set';
+$lang['the wiki'] = "the wiki";
+$lang['Theme has been successfully installed'] = 'Theme has been successfully installed';
+$lang['Themes which need upgrade'] = 'Themes which need upgrade';
+$lang['Themes'] = "Themes";
+$lang['There is no available subscribers to mail.'] = "There is no subscribers to be notified by mail.";
+$lang['There is no other language available.'] = 'There is no other language available.';
+$lang['There is no other plugin available.'] = 'There is no other plugin available.';
+$lang['There is no other theme available.'] = 'There is no other theme available.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'This is a major update, with <a href="%s">new exciting features</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'This is a minor update, with only bug corrections.';
+$lang['This name is already used by another group.'] = "This name is already used by another group.";
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'THIS PLUGIN IS NOW PART OF PIWIGO CORE! UNINSTALL IT NOW!';
+$lang['This site already exists'] = "This site already exists";
+$lang['This theme was not designed to be directly activated'] = 'This theme was not designed to be directly activated';
+$lang['Thumbnail'] = "Thumbnail";
+$lang['Thumbnails generation in progress...'] = 'Thumbnails generation in progress...';
+$lang['Time to send mail is limited. Others mails are skipped.'] = "The time to send mail is limited. Others mails have been skipped.";
+$lang['Time'] = "Time";
+$lang['title'] = "title";
+$lang['To send ?'] = "To send?";
+$lang['To subscribe'] = "To subscribe";
+$lang['To unsubscribe'] = "To unsubscribe";
+$lang['Toggle \'default group\' property'] = "Reverse 'default group' property";
+$lang['Tools'] = "Tools";
+$lang['total time'] = "total time";
+$lang['Two updates are available'] = 'Two updates are available';
+$lang['Type here the author name'] = 'Type here the author name';
+$lang['Type here the title'] = 'Type here the title';
+$lang['Type in a search term'] = "Type in a search term";
+$lang['Unable to check for upgrade.'] = "Unable to check for upgrade.";
+$lang['Unable to dump database.'] = 'Unable to dump database.';
+$lang['Uncheck all'] = "Uncheck all";
+$lang['Uninstall'] = "Uninstall";
+$lang['Uninstalled Plugins'] = 'Uninstalled Plugins';
+$lang['unit mode'] = "single mode";
+$lang['Unknown upload error'] = 'Unknown upload error';
+$lang['unknown'] = 'unknown';
+$lang['Unlocked'] = "Unlocked";
+$lang['unset'] = "unset";
+$lang['Unsubscribe from notification by mail'] = "Unsubscribe from notification by mail";
+$lang['Unsubscribed'] = "Unsubscribed";
+$lang['Update albums informations'] = "Update albums information";
+$lang['Update All'] = 'Update All';
+$lang['Update Complete'] = 'Update Complete';
+$lang['Update in progress... Please wait.'] = 'Update in progress... Please wait.';
+$lang['Update photos information'] = "Update photos information";
+$lang['update the database from files'] = "update the database with files";
+$lang['Update to Piwigo %s'] = 'Update to Piwigo %s';
+$lang['Updates'] = 'Updates';
+$lang['Upload Photos'] = 'Upload Photos';
+$lang['Upload'] = "Upload";
+$lang['Uploaded Photos'] = 'Uploaded Photos';
+$lang['Use the default photo sort order (defined in the configuration file)'] = "Use the default photo sort order (defined in the configuration file)";
+$lang['Used metadata'] = "Metadata used";
+$lang['user "%s" added'] = "user \"%s\" added";
+$lang['User "%s" created with "%s" like password'] = "User \"%s\" created with \"%s\" as password";
+$lang['User %s [%s] added.'] = "User %s [%s] added.";
+$lang['User %s [%s] was added to the subscription list.'] = "User %s [%s] added to the subscription list.";
+$lang['User %s [%s] was not added to the subscription list.'] = "User %s [%s] not added to the subscription list.";
+$lang['User %s [%s] was not removed from the subscription list.'] = "User %s [%s] not removed from the subscription list.";
+$lang['User %s [%s] was removed from the subscription list.'] = "User %s [%s] removed from the subscription list.";
+$lang['User comments validation'] = "User comments validation";
+$lang['User list'] = "Users list";
+$lang['User status'] = "User status";
+$lang['User'] = "User";
+$lang['Users'] = "Users";
+$lang['user_status_admin'] = "Administrator";
+$lang['user_status_generic'] = "Generic";
+$lang['user_status_guest'] = "Guest";
+$lang['user_status_normal'] = "User";
+$lang['user_status_webmaster'] = "Webmaster";
+$lang['Validate'] = "Validate";
+$lang['Validation'] = "Validation";
+$lang['Version'] = "Version";
+$lang['Virtual album added'] = "Virtual album added";
+$lang['Virtual album deleted'] = "Virtual album deleted";
+$lang['Virtual album name'] = "Virtual album name";
+$lang['Virtual album'] = "Virtual album";
+$lang['Virtual albums to move'] = "Virtual albums to move";
+$lang['Virtual Links'] = 'Virtual Links';
+$lang['Visit Gallery'] = 'Visit the gallery';
+$lang['Visit language site'] = 'Visit language site';
+$lang['Visit Piwigo project website'] = 'Visit Piwigo project website';
+$lang['Visit plugin site'] = 'Visit plugin site';
+$lang['Visit theme site'] = 'Visit theme site';
+$lang['Waiting'] = "Pending";
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'WARNING! This plugin does not seem to be compatible with this version of Piwigo.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = "Warning: subscribing or unsubscribing will send mails to users";
+$lang['Webmaster cannot be deleted'] = "Webmaster cannot be deleted";
+$lang['Webmaster status is required.'] = 'Webmaster status is required.';
+$lang['Week starts on'] = 'Week starts on';
+$lang['Who can see these photos?'] = 'Who can see these photos?';
+$lang['Who can see this photo?'] = 'Who can see this photo?';
+$lang['width must be a number superior to'] = "width must be a number greater than";
+$lang['Width'] = 'Width';
+$lang['With blank value, gallery title will be used'] = "If blank, the gallery title will be used";
+$lang['With no album'] = 'With no album';
+$lang['With no tag'] = 'With no tag';
+$lang['With no virtual album'] = 'With no virtual album';
+$lang['wrong filename'] = "wrong filename";
+$lang['Year'] = "Year";
+$lang['You are running on development sources, no check possible.'] = "You are running on development sources, no check possible.";
+$lang['You are running the latest version of Piwigo.'] = "You are running Piwigo latest version.";
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).';
+$lang['You cannot delete your account'] = "You cannot delete your account";
+$lang['You cannot move an album in its own sub album'] = "You cannot move an album in its own sub album";
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'You can\'t define a default photo order because you have a custom setting in your local configuration.';
+$lang['You have %d orphan tags: %s.'] = 'You have %d orphan tags: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = "You have subscribed to receive notifications by mail.";
+$lang['You have unsubscribed from receiving notifications by mail.'] = "You have unsubscribed from being notified by mail.";
+$lang['You might go to plugin list to install and activate it.'] = "Go to the plugins list to install and activate it.";
+$lang['You need to confirm deletion'] = "You must confirm deletion";
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "You should upgrade your system to take full advantage of the application, otherwise the application could work improperly, or not at all";
+$lang['Your configuration settings are saved'] = 'Your configuration settings are saved';
+$lang['Zoom'] = 'Zoom';
+$lang['[%s] Visit album %s'] = "[%s] Visit album %s";
+$lang['[NBM] Problems or questions'] = "[NBM] Problems or questions";
+$lang['Resize after upload'] = 'Resize after upload';
+$lang['Original Size'] = 'Original Size';
+$lang['A locked gallery is only visible to administrators'] = 'A locked gallery is only visible to administrators';
+$lang['Unlock gallery'] = 'Unlock gallery';
+$lang['Gallery unlocked'] = 'Gallery unlocked';
+$lang['Notify administrators when a comment is'] = 'Notify administrators when a comment is';
+$lang['modified'] = 'modified';
+$lang['deleted'] = 'deleted';
+$lang['pending validation'] = 'pending validation';
+$lang['Save visits in history for'] = 'Save visits in history for';
+$lang['simple visitors'] = 'simple visitors';
+$lang['registered users'] = 'registered users';
+$lang['administrators'] = 'administrators';
+$lang['This album contains %d photos, added on %s.'] = 'This album contains %d photos, added on %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'This album contains %d photos, added between %s and %s.';
+$lang['This album contains no photo.'] = 'This album contains no photo.';
+$lang['Not cropped correctly?'] = 'Not cropped correctly?';
+$lang['Center of interest'] = 'Center of interest';
+$lang['Move to album'] = 'Move to album';
+$lang['You can activate only one mobile theme.'] = 'You can activate only one mobile theme.';
+$lang['Automatic sort order'] = 'Automatic sort order';
+$lang['apply automatic sort order'] = 'apply automatic sort order';
+$lang['Save manual order'] = 'Save manual order';
+$lang['cancel manual order'] = 'cancel manual order';
+$lang['Cancel'] = 'Cancel';
+$lang['List'] = 'List';
+$lang['Web Form'] = 'Web Form';
+$lang['Applications'] = 'Applications';
+$lang['Available versions for'] = 'Available versions for';
+$lang['Available on'] = 'Available on';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish plugin for Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publish plugin for Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publish plugin for digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo export plugin for iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo export plugin for Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture is a powerful tool to refine images and manage massive libraries on Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture is designed for professional photographers with iPhoto simplicity.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'The Piwigo export plugin allows you to create albums and export photos.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Features include gallery browsing, album creation and photo upload.';
+$lang['Generate multiple size images']='Generate multiple size images';
+$lang['Delete multiple size images']='Delete multiple size images';
+$lang['any visitor can see this album'] = 'any visitor can see this album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'visitors need to login and have the appropriate permissions to see this album';
+$lang['Groups and users'] = 'Groups and users';
+$lang['Permission granted for groups'] = 'Permission granted for groups';
+$lang['Select groups...'] = 'Select groups...';
+$lang['There is no group in this gallery.'] = 'There is no group in this gallery.';
+$lang['Permission granted for users'] = 'Permission granted for users';
+$lang['Select users...'] = 'Select users...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u users have automatic permission because they belong to a granted group.';
+$lang['include photos with lower privacy level'] = 'include photos with lower privacy level';
+$lang['custom']='Custom';
+$lang['No group is permitted to see this private album'] = 'No group is permitted to see this private album';
+$lang['Permission management'] = 'Permission management';
+$lang['Photo sizes with crop'] = 'Photo sizes with crop';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'The center of interest is the most meaningful zone in the photo.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'By default, the center of interest is placed in the middle of the photo.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Select a zone with your mouse to define a new center of interest.';
+$lang['X Position'] = 'X Position';
+$lang['Y Position'] = 'Y Position';
+$lang['X Repeat'] = 'X Repeat';
+$lang['Opacity'] = 'Opacity';
+$lang['top left corner'] = 'top left corner';
+$lang['top right corner'] = 'top right corner';
+$lang['middle'] = 'middle';
+$lang['bottom left corner'] = 'bottom left corner';
+$lang['bottom right corner'] = 'bottom right corner';
+$lang['Select a file'] = 'Select a file';
+$lang['add a new watermark'] = 'add a new watermark';
+$lang['Apply watermark if width is bigger than'] = 'Apply watermark if width is bigger than';
+$lang['Apply watermark if height is bigger than'] = 'Apply watermark if height is bigger than';
+$lang['Multiple Size'] = 'Multiple Size';
+?>
Index: tags/2.4.0RC3/language/en_UK/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: English [UK]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=417
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "English";
+$lang_info['country'] = "Great Britain";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "en";
+$lang_info['zero_plural'] = true;
+
+
+$lang['%d album updated'] = "%d album updated";
+$lang['%d albums updated'] = "%d albums updated";
+$lang['%d comment to validate'] = "%d comment to validate";
+$lang['%d comment'] = "%d comment";
+$lang['%d comments to validate'] = "%d comments to validate";
+$lang['%d comments'] = "%d comments";
+$lang['%d hit'] = "%d hit";
+$lang['%d hits'] = "%d hits";
+$lang['%d Kb'] = "%d Kb";
+$lang['%d new comment'] = "%d new comment";
+$lang['%d new comments'] = "%d new comments";
+$lang['%d new photo'] = "%d new photo";
+$lang['%d new photos'] = "%d new photos";
+$lang['%d new user'] = "%d new user";
+$lang['%d new users'] = "%d new users";
+$lang['%d photo is also linked to current tags'] = "%d photo is also linked to current tags";
+$lang['%d photo'] = "%d photo";
+$lang['%d photos are also linked to current tags'] = "%d photos are also linked to current tags";
+$lang['%d photos'] = "%d photos";
+$lang['%d rates'] = "%d rates";
+$lang['(!) This comment requires validation'] = '(!) This comment requires validation';
+$lang['... or browse your empty gallery'] = '... or browse your empty gallery';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... or please deactivate this message, I will find my way by myself';
+$lang['A comment on your site'] = "A comment on your site";
+$lang['About Piwigo'] = "About Piwigo";
+$lang['About'] = "About";
+$lang['Accelerate diaporama speed'] = "Increase slideshow speed";
+$lang['Add a comment'] = "Add a comment";
+$lang['add this photo to your favorites'] = "add this photo to your favorites";
+$lang['Admin: %s'] = "Admin: %s";
+$lang['Administration'] = "Administration";
+$lang['Album results for'] = "Album results for";
+$lang['Album'] = "Album";
+$lang['Album: %s'] = "Album: %s";
+$lang['Albums'] = "Albums";
+$lang['All tags'] = "All tags";
+$lang['all'] = "all";
+$lang['All'] = "All";
+$lang['An administrator must authorize your comment before it is visible.'] = "An administrator must authorize your comment before it becomes visible.";
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "Anti-flood system : please wait for a moment before trying to post another comment";
+$lang['Any tag'] = "Any tag";
+$lang['Are you sure?'] = "Are you sure?";
+$lang['ascending'] = "ascending";
+$lang['At least one listed rule must be satisfied.'] = "At least one listed criterion must be satisfied.";
+$lang['Author'] = "Author";
+$lang['author(s) : %s'] = "author(s) : %s";
+$lang['Author: %s'] = "Author: %s";
+$lang['Auto login'] = "Auto login";
+$lang['available for administrators only'] = "available for administrators only";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Bad status for user \"guest\", default status will be used. Please notify the webmaster.";
+$lang['Best rated'] = "Best rated";
+$lang['Browser: %s'] = "Browser: %s";
+$lang['Calendar'] = "Calendar";
+$lang['Change my password'] = 'Change my password';
+$lang['Check your email for the confirmation link'] = 'Check your email for the confirmation link';
+$lang['chronology_monthly_calendar'] = "Monthly calendar";
+$lang['chronology_monthly_list'] = "Monthly list";
+$lang['chronology_weekly_list'] = "Weekly list";
+$lang['Click here if your browser does not automatically forward you'] = "Click here if your browser does not automatically forward you";
+$lang['Click on the photo to see it in high definition'] = "Click on the photo to see it in high definition";
+$lang['Close this window'] = "Close this window";
+$lang['cloud'] = "cloud";
+$lang['Comment by %s'] = "Comment by %s";
+$lang['comment date'] = "comment date";
+$lang['Comment'] = "Comment";
+$lang['Comment: %s'] = "Comment: %s";
+$lang['Comments'] = "Comments";
+$lang['Complete RSS feed (photos, comments)'] = "Complete RSS feed (photos, comments)";
+$lang['Confirm Password'] = "Confirm Password";
+$lang['Connected user: %s'] = "Connected user: %s";
+$lang['Connection settings'] = "Connection settings";
+$lang['Contact webmaster'] = "Contact webmaster";
+$lang['Contact'] = "Contact";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Cookies are blocked or not supported by your browser. You must enable cookies to log in.";
+$lang['Create a new account'] = "Create a new account";
+$lang['created after %s (%s)'] = "created after %s (%s)";
+$lang['created before %s (%s)'] = "created before %s (%s)";
+$lang['created between %s (%s) and %s (%s)'] = "created between %s (%s) and %s (%s)";
+$lang['created on %s'] = "created on %s";
+$lang['Created on'] = "Created on";
+$lang['Creation date'] = "Creation date";
+$lang['Current password is wrong'] = "Current password is wrong";
+$lang['customize the appareance of the gallery'] = "customize the look of the gallery";
+$lang['Customize'] = "Customize";
+$lang['Date'] = "Date";
+$lang['day'][0] = "Sunday";
+$lang['day'][1] = "Monday";
+$lang['day'][2] = "Tuesday";
+$lang['day'][3] = "Wednesday";
+$lang['day'][4] = "Thursday";
+$lang['day'][5] = "Friday";
+$lang['day'][6] = "Saturday";
+$lang['Default'] = "Default";
+$lang['delete all photos from your favorites'] = "delete all photos from your favorites";
+$lang['delete this photo from your favorites'] = "delete this photo from your favorites";
+$lang['Delete'] = "Delete";
+$lang['descending'] = "descending";
+$lang['Dimensions'] = "Dimensions";
+$lang['display a calendar by creation date'] = "display a calendar by creation date";
+$lang['display a calendar by posted date'] = "display a calendar by posted date";
+$lang['display a set of random photos'] = "display a set of random photos";
+$lang['display all photos in all sub-albums'] = "display all photos in all sub-albums";
+$lang['display available tags'] = "display available tags";
+$lang['display best rated photos'] = "display best rated photos";
+$lang['display each day with photos, month per month'] = "display each day with photos, month per month";
+$lang['display last user comments'] = "display last user comments";
+$lang['display most recent photos'] = "display most recent photos";
+$lang['display most visited photos'] = "display most visited photos";
+$lang['display only recently posted photos'] = "display only recently posted photos";
+$lang['display photos linked to this tag'] = "display photos linked to this tag";
+$lang['display recently updated albums'] = "display recently updated albums";
+$lang['display this album'] = "display this album";
+$lang['display your favorites photos'] = "display your favorites photos";
+$lang['Display'] = "Display";
+$lang['Download this file'] = "Download this file";
+$lang['Download'] = "download";
+$lang['Each listed rule must be satisfied.'] = "Each listed criterion must be satisfied.";
+$lang['Edit a comment'] = "Edit a comment";
+$lang['edit'] = "edit"; //TO remove
+$lang['Edit'] = 'Edit';
+$lang['Email address is missing. Please specify an email address.'] = "Email address is missing. Please specify an email address.";
+$lang['Email address'] = "Email address";
+$lang['Email: %s'] = "Email: %s";
+$lang['Empty query. No criteria has been entered.'] = "Empty query. No criteria has been entered.";
+$lang['End-Date'] = "End date";
+$lang['Enter your new password below.'] = 'Enter your new password below.';
+$lang['Enter your personnal informations'] = "Enter your personal data";
+$lang['Error sending email'] = "Error when sending email";
+$lang['excluded'] = "excluded";
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['Expand all albums'] = "Expand all albums";
+$lang['Favorites'] = "Favorites";
+$lang['File name'] = "File name";
+$lang['File'] = "File";
+$lang['Filesize'] = "Filesize";
+$lang['Filter and display'] = "Filter and display";
+$lang['Filter'] = "Filter";
+$lang['First'] = "First";
+$lang['Forgot your password?'] = "Forgot your password?";
+$lang['from %s to %s'] = "from %s to %s";
+$lang['Go through the gallery as a visitor'] = "Navigate the gallery as a visitor";
+$lang['group by letters'] = "group by letters";
+$lang['guest'] = "guest";
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hello %s, your Piwigo photo gallery is empty!';
+$lang['Hello'] = "Hello";
+$lang['Hello %s,'] = 'Hello %s,';
+$lang['Help'] = "Help";
+$lang['Home'] = "Home";
+$lang['html tags are not allowed in login'] = 'html tags are not allowed in login';
+$lang['I want to add photos'] = 'I want to add photos';
+$lang['Identification'] = "Identification";
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'If this was a mistake, just ignore this email and nothing will happen.';
+$lang['in %d sub-album'] = "in %d sub-album";
+$lang['in %d sub-albums'] = "in %d sub-albums";
+$lang['in this album'] = "in this album";
+$lang['included'] = "included";
+$lang['Interface theme'] = "Interface theme";
+$lang['Invalid key'] = 'Invalid key';
+$lang['Invalid password!'] = "Invalid password!";
+$lang['Invalid username or email'] = 'Invalid username or email';
+$lang['IP: %s'] = "IP: %s";
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Keyword'] = "Keyword";
+$lang['Kind of date'] = "Kind of date";
+$lang['Language'] = "Language";
+$lang['last %d days'] = "last %d days";
+$lang['Last'] = "Last";
+$lang['letters'] = "letters";
+$lang['Links'] = "Links";
+$lang['login mustn\'t end with a space character'] = "login must not end with a space character";
+$lang['login mustn\'t start with a space character'] = "login must not start with a space character";
+$lang['Login'] = "Login";
+$lang['Logout'] = "Logout";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "mail address must be like xxx@yyy.eee (example : jack@altern.org)";
+$lang['Manage this user comment: %s'] = 'Manage this user comment: %s';
+$lang['Maximum height must be a number superior to 50'] = "Maximum height must be a number greater than 50";
+$lang['Maximum photo height'] = "Maximum photo height";
+$lang['Maximum photo width'] = "Maximum photo width";
+$lang['Maximum width must be a number superior to 50'] = "Maximum width must be a number greater than 50";
+$lang['Menu'] = "Menu";
+$lang['month'][10] = "October";
+$lang['month'][11] = "November";
+$lang['month'][12] = "December";
+$lang['month'][1] = "January";
+$lang['month'][2] = "February";
+$lang['month'][3] = "March";
+$lang['month'][4] = "April";
+$lang['month'][5] = "May";
+$lang['month'][6] = "June";
+$lang['month'][7] = "July";
+$lang['month'][8] = "August";
+$lang['month'][9] = "September";
+$lang['Most visited'] = "Most visited";
+$lang['N/A'] = "N/A";
+$lang['New on %s'] = "New on %s";
+$lang['New password'] = "New password";
+$lang['Next'] = "Next";
+$lang['no rate'] = "no rate";
+$lang['No'] = "No";
+$lang['Not repeat the slideshow'] = "Do not repeat slideshow";
+$lang['Notification'] = "Notification";
+$lang['Number of items'] = "Number of items";
+$lang['Number of photos per page'] = "Number of photos per page";
+$lang['obligatory'] = "mandatory";
+$lang['Original dimensions'] = "Original dimensions"; //unused?
+$lang['Page generated in'] = "Page generated in";
+$lang['Password forgotten'] = "Password forgotten";
+$lang['Password reset is not allowed for this user'] = 'Password reset is not allowed for this user';
+$lang['Password Reset'] = 'Password Reset';
+$lang['password updated'] = "password updated";
+$lang['Password'] = "Password";
+$lang['Pause of slideshow'] = "Pause slideshow";
+$lang['photo'] = "photo";
+$lang['Photos only RSS feed'] = "Photos only RSS feed";
+$lang['photos posted during the last %d days'] = "photos posted during the last %d days";
+$lang['Photos posted within the last %d day.'] = "Photos posted within the last %d day only.";
+$lang['Photos posted within the last %d days.'] = "Photos posted within the last %d days only.";
+$lang['Piwigo Help'] = "Piwigo help";
+$lang['Play of slideshow'] = "Play slideshow";
+$lang['please enter your password again'] = "please enter your password again";
+$lang['Please enter your username or email address.'] = 'Please enter your username or email address.';
+$lang['Please, enter a login'] = "Please, enter a login";
+$lang['Post date'] = "Post date";
+$lang['posted after %s (%s)'] = "posted after %s (%s)";
+$lang['posted before %s (%s)'] = "posted before %s (%s)";
+$lang['posted between %s (%s) and %s (%s)'] = "posted between %s (%s) and %s (%s)";
+$lang['posted on %s'] = "posted on %s";
+$lang['Posted on'] = "Posted on";
+$lang['Powered by'] = "Powered by";
+$lang['Preferences'] = "Preferences";
+$lang['Previous'] = "Previous";
+$lang['Profile'] = "Profile";
+$lang['Quick connect'] = "Quick connect";
+$lang['Quick search'] = "Quick search";
+$lang['Random photos'] = "Random photos";
+$lang['Rank'] = "Rank";
+$lang['Rate this photo'] = "Rate this photo";
+$lang['Rating score'] = "Rating score";
+$lang['Recent albums'] = "Recent albums";
+$lang['Recent period must be a positive integer value'] = "Recent period must be a positive integer value";
+$lang['Recent period'] = "Recent period";
+$lang['Recent photos'] = "Recent photos";
+$lang['Redirection...'] = "Redirection...";
+$lang['Reduce diaporama speed'] = "Reduce slideshow speed";
+$lang['Register'] = "Register";
+$lang['Registration of %s'] = "Registration of %s";
+$lang['Registration'] = "Registration";
+$lang['Related tags'] = "Related tags";
+$lang['remove this tag from the list'] = "remove this tag from the list";
+$lang['Repeat the slideshow'] = "Repeat slideshow";
+$lang['representative'] = 'album thumbnail';
+$lang['Reset to default values'] = "Reset to default values";
+$lang['Reset'] = "Reset";
+$lang['Retrieve password'] = "Retrieve password";
+$lang['Return to home page'] = 'Return to home page';
+$lang['return to normal view mode'] = "return to normal view mode";
+$lang['return to the display of all photos'] = "return to the display of all photos";
+$lang['RSS feed'] = "RSS feed";
+$lang['Search by date'] = "Search by date";
+$lang['Search for all terms'] = "Search for all terms";
+$lang['Search for any term'] = "Search for any term";
+$lang['Search for Author'] = "Search for an author";
+$lang['Search for words'] = "Search for words";
+$lang['Search in albums'] = "Search in albums";
+$lang['Search in sub-albums'] = "Search in sub-albums";
+$lang['Search results'] = "Search results";
+$lang['Search rules'] = "Search criteria";
+$lang['Search tags'] = "Search tags";
+$lang['Search'] = "Search";
+$lang['search'] = "search";
+$lang['searched words : %s'] = "searched words : %s";
+$lang['Sent by'] = "Sent by";
+$lang['Send my connection settings by email'] = 'Send my connection settings by email';
+$lang['set as album representative'] = "set as album thumbnail";
+$lang['Show file metadata'] = "Show file metadata";
+$lang['Show number of comments'] = "Show number of comments";
+$lang['Show number of hits'] = "Show number of hits";
+$lang['Show oldest comments first'] = 'Show oldest comments first';
+$lang['Show latest comments first'] = 'Show latest comments first';
+$lang['show tag cloud'] = "show tags cloud";
+$lang['Since'] = "Since";
+$lang['slideshow'] = "slideshow";
+$lang['Someone requested that the password be reset for the following user account:'] = 'Someone requested that the password be reset for the following user account:';
+$lang['Sort by'] = "Sort by";
+$lang['Sort order'] = "Sort order";
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Successfully registered, you will soon receive an email with your connection settings. Welcome!';
+$lang['Specials'] = "Specials";
+$lang['SQL queries in'] = "SQL queries in";
+$lang['stop the slideshow'] = "stop the slideshow";
+$lang['Submit'] = "Submit";
+$lang['Tag results for'] = "Tag results for";
+$lang['Tag'] = "Tag";
+$lang['Tags'] = "Tags";
+$lang['the beginning'] = "the beginning";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = "The gallery is locked for maintenance. Please, come back later.";
+$lang['The number of photos per page must be a not null scalar'] = "The number of photos per page must be a nonzero integer";
+$lang['The passwords do not match'] = 'The passwords do not match';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = "The RSS feed provides notification on new events from this website: new photos, updated albums, new comments. To be used with a RSS feed reader.";
+$lang['the username must be given'] = "the username is required";
+$lang['This author modified following comment:'] = 'This author modified following comment:';
+$lang['This author removed the comment with id %d'] = 'This author removed the comment with id %d';
+$lang['this email address is already in use'] = "this email address is already in use";
+$lang['This login is already used by another user'] = "This login is already used by another user";
+$lang['this login is already used'] = "this login is already used";
+$lang['Thumbnails'] = "Thumbnails";
+$lang['To reset your password, visit the following address:'] = 'To reset your password, visit the following address:';
+$lang['today'] = "today";
+$lang['Unknown feed identifier'] = "Unknown feed identifier";
+$lang['Unknown identifier'] = "Unknown identifier";
+$lang['Update your rating'] = "Update your rating";
+$lang['useful when password forgotten'] = "useful in case password is forgotten";
+$lang['User "%s" has no email address, password reset is not possible'] = 'User "%s" has no email address, password reset is not possible';
+$lang['User comments'] = "User comments";
+$lang['User: %s'] = "User: %s";
+$lang['Username "%s" on gallery %s'] = 'Username "%s" on gallery %s';
+$lang['Username or email'] = 'Username or email';
+$lang['Username'] = "Username";
+$lang['Username modification'] = 'Username modification';
+$lang['View'] = "View";
+$lang['Visits'] = "Visits";
+$lang['Webmaster'] = "Webmaster";
+$lang['Week %d'] = "Week %d";
+$lang['Welcome to your Piwigo photo gallery!'] = 'Welcome to your Piwigo photo gallery!';
+$lang['Welcome'] = 'Welcome';
+$lang['wrong date'] = "wrong date";
+$lang['Yes'] = "Yes";
+$lang['You are not authorized to access the requested page'] = "You are not authorized to access the requested page";
+$lang['You will receive a link to create a new password via email.'] = 'You will receive a link to create a new password via email.';
+$lang['Your comment has been registered'] = "Your comment has been registered";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "Your comment has NOT been registered because it did not pass the validation rules";
+$lang['Your favorites'] = "Your favorites";
+$lang['Your Gallery Customization'] = "Your gallery customization";
+$lang['Your username has been successfully changed to : %s'] = 'Your username has been successfully changed to : %s';
+$lang['Your password has been reset'] = 'Your password has been reset';
+$lang['square'] = 'Square';
+$lang['thumb'] = 'Thumbnail';
+$lang['2small'] = 'XXS - tiny';
+$lang['xsmall'] = 'XS - extra small';
+$lang['small'] = 'S - small';
+$lang['medium'] = 'M - medium';
+$lang['large'] = 'L - large';
+$lang['xlarge'] = 'XL - extra large';
+$lang['xxlarge'] = 'XXL - huge';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Thank you for registering at %s!';
+$lang['Here are your connection settings'] = 'Here are your connection settings';
+$lang['Password: %s'] = 'Password: %s';
+$lang['Username: %s'] = 'Username: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'If you think you\'ve received this email in error, please contact us at %s';
+$lang['Photo sizes'] = 'Photo sizes';
+$lang['View in'] = 'View in';
+$lang['Mobile'] = 'Mobile';
+$lang['Desktop'] = 'Desktop';
+$lang['File name, A &rarr; Z'] = 'File name, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'File name, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Photo title, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Photo title, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Date created, new &rarr; old';
+$lang['Date created, old &rarr; new'] = 'Date created, old &rarr; new';
+$lang['Date posted, new &rarr; old'] = 'Date posted, new &rarr; old';
+$lang['Date posted, old &rarr; new'] = 'Date posted, old &rarr; new';
+$lang['Rating score, high &rarr; low'] = 'Rating score, high &rarr; low';
+$lang['Rating score, low &rarr; high'] = 'Rating score, low &rarr; high';
+$lang['Visits, high &rarr; low'] = 'Visits, high &rarr; low';
+$lang['Visits, low &rarr; high'] = 'Visits, low &rarr; high';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numeric identifier, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numeric identifier, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Manual sort order';
+?>
Index: tags/2.4.0RC3/language/en_UK/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,133 @@
+<h2>Edit album</h2>
+
+<h3>Informations</h3>
+
+<ul>
+
+  <li><strong>name</strong>: rename the album (a virtual rename in case 
+  of a physical album).</li>
+
+  <li><strong>description</strong>: short text giving a general idea of the content,
+  this text will be displayed at the bottom of the thumbnails page.</li>
+
+</ul>
+
+<h3>Move</h3>
+
+<p>If the album is virtual, you can move it. Moving a album means
+changing its parent album.</p>
+
+<h3>Options</h3>
+
+<ul>
+
+  <li><strong>Access type</strong>: Permissions management. If you make a
+  album private, all its child albums becomes private. If you make a
+  album public, all its parent albums becomes public.</li>
+
+  <li><strong>Lock</strong>: The album and its sub-albums will
+  be temporary disabled for maintenance.</li>
+
+  <li><strong>Comments</strong>: Authorize users to comment photos of this
+  album.</li>
+
+</ul>
+
+<p>You can also manage these options on the "Properties"
+management screen (screens <span
+class="pwgScreen">Comments</span>, <span class="pwgScreen">Lock</span>,
+<span class="pwgScreen">Public/Private</span>, <span
+class="pwgScreen">Representative</span> available from <span
+class="pwgScreen">Administration &raquo; Albums &raquo; Properties</span>).</p>
+
+<h3>Sort order</h3>
+
+<p>Use the default images sort order.</p>
+
+<p>Indicate whether this sort order will apply to subalbums also.</p>
+
+<p>Select specific sorting criteria to be used with this album.</p>
+<ul>
+<li><strong>Creation date</strong>: Photo shooting date</li>
+<li><strong>Post date</strong>: Synchronization date</li>
+<li><strong>Average rate (*)</strong>: Average rate could be changed by the visitor rating</li>
+<li><strong>Most visited (*)</strong>: The current visit might change the most visited order</li>
+<li><strong>File name</strong>: Name given in information field</li>
+<li><strong>Id</strong>: Internal Id (recent categories have an higher id than previous ones.</li>
+
+</ul>
+<p><strong>(*)</strong>Warning: Be sure to test these sort orders by yourself as they can give unexpected results.</p>
+
+
+<h3>Representant</h3>
+
+<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
+the album when
+it contains only sub-albums and no direct photo (just as the root album).</p>
+photo of a album :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
+  displayed album. This button is available only for administrators.</li>
+
+  <li><span class="pwgScreen">Modify informations about a photo</span> in
+  administration. This screen can be reached from <span
+  class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
+  management</span> in <em>unit mode</em>. See the help of this screen for
+  details.</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
+  Representative</span>. See the help of this screen for details.</li>
+
+  <li><span class="pwgScreen">Edit album</span> (the present screen).</li>
+
+</ul>
+
+<p>The choice of a representative depends on the 
+<code>allow_random_representative</code> configuration parameter (see <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In default mode (<code>allow_random_representative</code> set to false),
+each album containing at least one element is represented by a fixed
+element. Once set (at album creation), the representative changes only
+when an administrator ask for it. If the representative is not appropriate,
+you can ask to <strong>Find a new representant by random</strong>.</p>
+
+<p>If the <code>allow_random_representative</code> configuration parameter is
+set to true, a category containing photos may have no fixed
+representant. Just use <strong>Delete representant</strong> button.</p>
+
+<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
+informations about a photo</span> screen. The only option on the current screen
+is the <strong>Delete representant</strong> button.</p>
+
+<h3>Link all album photos to a new album</h3>
+
+<ul>
+
+<li><strong>Virtual album name</strong>: Name of the new album to be created, 
+all photos of the current category will be linked to the new one.</li>
+
+<li><strong>Parent album</strong>: Where the new album will be, 
+leave empty to create it at root.</li>
+
+</ul>
+
+<h3>Link all album photos to existing albums</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Choose the destination album.</li>
+
+</ul>
+
+<h3>Send an information email to group members</h3>
+
+<ul>
+
+<li><strong>Group</strong>: recipients group</li>
+
+<li><strong>Mail content</strong>: Free text to send to them.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/en_UK/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Moving virtual Albums</h2>
+
+<p>Only virtual albums can have a new parent album.</p>
+
+<h3>Virtual albums to move</h3>
+
+<p>Select one or several virtual albums you want to move. 
+If the list is empty, that mean you have not created one yet.</p>
+
+<h3>New parent album</h3>
+
+<p>Select the new parent album (virtual or physical). 
+If you do not select any parent, the virtual selected albums will be moved to the root.
+A album cannot be moved into itself or to one of its child.</p>
Index: tags/2.4.0RC3/language/en_UK/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Album options</h2>
+
+<p>Options management for several albums at once.</p>
+
+<dl>
+
+<dt>Comments</dt>
+<dd>A photo can receive comments from your visitors if it belongs to an album with comments activated.</dd>
+
+<dt>Lock</dt>
+<dd>Locked albums are disabled for maintenance. Only administrators can view them in the gallery.</dd>
+
+<dt>Public / private</dt>
+<dd>Once an album become private, give access rights to users and groups</dd>
+
+<dt>Representative</dt>
+<dd>This option is available when you set the configuration setting
+<code>allow_random_representative</code> (see <span
+ class="filename">include/config_defaults.inc.php</span>) to
+<em>true</em>. Each album can be represented by a random photo or by a photo chosen as a unique representative.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/en_UK/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,13 @@
+<h2>Edit album permissions</h2>
+
+<p>This screen is only available for private albums. Here you can select
+users and groups authorized for a album.</p>
+
+<h3>Groups</h3>
+
+<p>You can deny or grant groups access for the current album. By modifying
+groups authorizations, the users belonging to these groups will be denied or granted access to the album.</p>
+
+<h3>Users</h3>
+
+<p>You can deny or grant access to individual users. Users that have access through a group can be denied access by exception.</p>
Index: tags/2.4.0RC3/language/en_UK/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/configuration.html	(revision 14585)
@@ -0,0 +1,101 @@
+<h2>Configuration</h2>
+
+<p>This screen let the administrator do basic gallery configuration. Indeed, this screen only shows simple configuration parameters that should be enough for the vast majority of administrators. If you want to see other numerous (and advanced) configuration parameters, read the default configuration file <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>The screen is divided into different sections, grouping configuration parameters by theme.</p>
+
+
+<h3>Main</h3>
+<ul>
+  <li><strong>Gallery title</strong>: used in RSS feed and notifications by email.</li>
+
+  <li><strong>Page banner</strong>: displayed on top of each public page.</li>
+
+  <li><strong>Gallery URL</strong>: used for the RSS feed.</li>
+
+  <li><strong>Lock gallery</strong>: Lock the entire gallery for maintenance. Only administrator users will be able to reach the gallery.</li>
+
+  <li><strong>Rating</strong>: Photo rating feature is enabled.</li>
+
+  <li><strong>Rating by guests</strong>: Even unregistered users can rate images.</li>
+
+  <li><strong>Allow user registration</strong>: Anybody can register.</li>
+
+  <li><strong>Mail address is mandatory for all users</strong>: mail address will be checked on registration or profile update, except if the action is done by an administrator.</li>
+
+  <li><strong>Email admins when a new user registers</strong>: administrators will be notified by mail for each registration.</li>
+  
+  <li><strong>Default photos order</strong>: you can define a personalized order with these drop-down menus.</li>
+
+</ul>
+
+<h3>History</h3>
+
+  <p>Visits on pages <span
+  class="pwgScreen">category.php</span> and <span
+  class="pwgScreen">picture.php</span> will be saved in the <code>history</code> table.</p>
+  
+  <p>Visits will be shown in <span  class="pwgScreen">Administration &raquo; Tools &raquo; History</span>.</p>
+
+<ul>
+  <li><strong>Save page visits by guests</strong>: page visits by guests will be recorded.</li>
+
+  <li><strong>Save page visits by users</strong>: visits by registrered users will be recorded.</li>
+
+  <li><strong>Save page visits by administrators</strong>: page visits by administrators will be recorded.</li>
+
+</ul>
+
+<h3>Comments</h3>
+<ul>
+
+  <li><strong>Comments for all</strong>: Even unregistered guest can post comments.</li>
+
+  <li><strong>Number of comments per page</strong>.</li>
+
+  <li><strong>Validation</strong>: an administrator must validate users comments before they become visible on the site. User comments validation
+  takes place in screen <span class="pwgScreen">Administration &raquo; Tools &raquo; Pending Comments</span>.</li>
+
+  <li><strong>Email admins when a valid comment is entered</strong>: Sends an email to the administrators when a user enters a comment and this comment is validated.</li>
+
+  <li><strong>Email admins when a comment requires validation</strong>:
+Sends an email to the administrators when a user enters a comment that requires validation by the admin.
+User comments validation takes place in the screen <span class="pwgScreen">Administration &raquo; Tools &raquo; Pending Comments</span>.</li>
+
+</ul>
+
+<h3>Default display</h3>
+
+<p>Here you can change display options used by guest, the default user that is not connected. Once connected, these options are overridden by the user's own options
+(modifiable in <span class="pwgScreen">profile</span>).</p>
+
+<p>It is possible to change the display options for all existing users on the <span class="pwgScreen">Administration &raquo;
+Users &raquo; Manage</span> screen where you can select a list of users.</p>
+
+<ul>
+
+  <li><strong>Language</strong>: Apply to Piwigo labels only. Album names, photo names and all descriptions fields are not localized.</li>
+
+  <li><strong>Number of photos per row</strong></li>
+
+  <li><strong>Number of rows per page</strong></li>
+
+  <li><strong>Interface theme</strong></li>
+
+  <li><strong>Recent period</strong>: By days. Period during which a photo is shown as new. Must be greater than 1 day.</li>
+
+  <li><strong>Expand all albums</strong>: Expand all albums by
+  default in the menu <em>Warning</em>: this option is resources intensive and may generate a huge menu if your album tree contains many albums.</li>
+
+  <li><strong>Show number of comments</strong>: Show the number of comments for each photo on the thumbnails page. Resource intensive.</li>
+
+  <li><strong>Show hits count</strong>: Display hits observed on photo just under its thumbnail on the thumbnails page. Only when advanced configuration parameter is: <br>
+  $conf['show_nb_hits'] = true; <br>
+  Notice: false by default.</li>
+
+  <li><strong>Maximum width of the photos</strong>: maximum displayed width.  Photos larger than this setting will be resized on display.  Rather than choosing this option, you might consider modifying the width of your photos; that would be a better practice.</li>
+
+  <li><strong>Maximum height of the photos</strong>: Same as for the maximum width setting.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/en_UK/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Template Extension Configuration</h2>
+
+<h3>About</h3>
+<p>Your Piwigo gallery can be customised by replacing existing template files with customised versions.  For example, the default header template (header.tpl) can be replaced by a customised header template (my-header.tpl).  After submitting the changes to the database the gallery will display the customised header instead of the original header.<br>
+Template extensions are a powerful way to create customised themes for both new and advanced users.  Used together with the LocalFiles Editor you can create your own child themes.</p>
+
+<h3>Original Template</h3>
+<p>A theme contains a number of template files that make up the gallery pages.  These are the original templates.</p>
+
+<h3>Optional URL Keyword</h3>
+<p>These are words found in the gallery URL after the module name.  They can also be active permalinks  (See the permalink documentation for more information).  <a href="#warnings">WARNING:</a> if the same original template and same keyword is used on more than one customised template only the last one is active.</p>
+
+<h3>Bound Theme</h3>
+<p>The bound theme is the theme from which the template files are being replaced.</p>
+
+<h3>Where are the original templates?</h3>
+<p>Original templates are the template files shipped with each theme.  These are saved in <em>/themes/default/template</em> (or <em>themes/<theme name>/template</em>).  These template files should not be edited in place as changes will be lost with theme upgrades.<br>
+Supported original templates include:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+<h3>Saving customised templates</h3>
+<p>Customised templates should be saved in the template-extension folder or subfolders.  For example, <em>/template-extension/my-default/header.tpl</em> (or <em>/template-extension/<my-theme-name>/header.tpl</em>)  Template files can have any name with a .tpl extension.  The template files in subfolders appear in the Template configuration screen as available custom templates.</p>
+<h3>Activating customised templates</h3>
+<p>Select the original template to replace.  Optionally choose a URL keyword to ensure that the customised template is only shown on pages with that keyword.  Select a bound theme and the changes will be effective on that theme.  Submit the changes to the database.</p>
+<h3>Deactivating customised templates</h3>
+<p>Unselect the original template and submit the changes to the database.<br>
+Delete the customised template files from the template-extension folder.</p>
+
+<a name="warnings"></a>
+<h3>Warnings</h3>
+<ul>
+  <li><strong>The original template</strong> must be the original template otherwise you may have unpredictable results.</li>
+  <li>If the same original template and same URL keyword is used on more than one customised template only the last one is active.</li>
+  <li>Distributed sample template files are for test purposes only.  Do not edit them.  Create your own ones or copy existing theme template files into <em>/template-extension/<my-theme>/</em></li>
+  <li>When the customised template is deleted the original template file is immediately reactivated.</li>
+</ul>
Index: tags/2.4.0RC3/language/en_UK/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Groups list</h2>
+
+<p>This is the place where you manage groups.</p>
+
+<h3>Add a group</h3>
+
+<p>Administrator can add groups.</p>
+
+<h3>Groups list</h3>
+
+<p>For each group the following actions can be applied:</p>
+
+
+<ul>
+  <li>go to user management (Admin &raquo; Users &raquo; Manage)</li>
+  <li>go to permissions management screen to grant or deny access to private albums.</li>
+  <li>delete the group (requires a confirmation)</li>
+  <li>toggle status "default" (requires a confirmation)</li>
+</ul>
+
+<h3>Default groups</h3>
+<p>Default groups are groups that are automatically associated to each new user upon registration or creation by an administrator.</p>
Index: tags/2.4.0RC3/language/en_UK/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,27 @@
+<p>Several ways to add your photos in your gallery:</p>
+
+<ul>
+  <li><strong>Direct upload</strong> inside your web browser is the
+  simplest and most immediate way. It depends on your browser capabilities
+  and your web server. For a huge quantity of photos or in case you encounter some problem,
+  the other methods are just waiting for you!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Go to Direct Upload </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> is a desktop application, to be installed on your computer. Drag &amp; drop photos into pLoader window, click on <em>"Upload to Piwigo"</em> and let pLoader do the job. You can find other desktop applications such as <strong>WinToPiwigo</strong> or the <strong>Digikam</strong> export plugin to Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Go to pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP transfer</strong> is the most recommended way to add a
+  very large collection of photos with a minimum number of clicks. Follow
+  the guide to prepare your photos. The FTP method let you control precisely
+  the physical organization of your photos on your server.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Go to FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/en_UK/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/help_groups.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p>Groups are a convenient way to set permissions for a list of users.</p>
+
+<p>Create groups in <span class="pwgScreen">Administration &raquo; Users
+&raquo; Groups</span> and associate users to this group
+in <span class="pwgScreen">Administration &raquo; Users &raquo;
+Manage</span>.</p>
+
+<p>A user can belong to several groups. Authorization takes precedence over
+interdiction : if user "jack" belongs to groups "family" and "friends", and
+that only group "family" can see album "Christmas 2010" album then
+"jack" will be able to see "Christmas 2010".</p>
Index: tags/2.4.0RC3/language/en_UK/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Once you created your gallery you can configure it for your visitor
+<ul>
+	<li>The default display as you like in <span class="pwgScreen">Administration &raquo; Configuration &raquo; Options</span> tab <span class="pwgScreen">Guest Settings</span></li>
+	<li>The default theme in <span class="pwgScreen">Administration &raquo; Configuration &raquo; Themes</span></li>
+	<li>The default language in <span class="pwgScreen">Administration &raquo; Configuration &raquo; Languages</span></li>
+ </ul>
+ By default, each new user will inherit these properties upon registration.
+</p>
+<p>If you have any question, Piwigo community will welcome you on <a href="http://piwigo.org/forum">its forum</a>.</p>
Index: tags/2.4.0RC3/language/en_UK/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,57 @@
+<fieldset>
+<legend>Permissions on photos</legend>
+
+<p>Each photo has a <strong>privacy level</strong> (a lock). Each user also has a privacy level (a key). There are 5 privacy levels:</p>
+<ol>
+  <li>None</li>
+  <li><em>Contacts</em></li>
+  <li><em>Friends (which is higher than a contact)</em></li>
+  <li><em>Family (which is higher than a friend)</em></li>
+  <li><em>Admins (which is higher than any other level)</em></li>
+</ol>
+
+<p>Higher levels have permissions on lower levels. For a given user, the higher the privacy level, the more photos he can see.</p>
+
+<p>For example, if photo "peter_wedding-0024.jpg" has <em>"Family"</em> privacy level, then:</p>
+<ul>
+  <li>Peter (who is an <em>"Admin"</em>) will see the photo because <em>"Admins"</em> can see all photos</li>
+  <li>Beth (who is a <em>"Family"</em> member) will also see the photo</li>
+  <li>Mary (who is just a <em>"Friend"</em>) won't see the photo</li>
+</ul>
+
+<p>A user that has no permission to see the content of a album won't see the album itself, not even its title. The same principle applies to a tag.</p>
+
+<p>You can set the privacy level of a user on <span class="pwgScreen">Administration &raquo; Users &raquo; Manage</span> screen.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Permissions on albums</legend>
+
+<p>If privacy levels do not fit your needs, you can also manage permissions on albums for a user or a group. You can manage permissions on photos and albums at the same time, without conflict.</p>
+
+<p>You can forbid access to albums. Switch the album access type to
+"private" if you want to manage permissions.</p>
+
+<p>You can set a album to private by editing a single album
+(<span class="pwgScreen">Administration &raquo; Albums &raquo; Manage
+&raquo; edit</span>) or by setting options to your whole album tree
+(<span class="pwgScreen">Administration &raquo; Albums &raquo;
+Properties &raquo; Public / Private</span>).</p>
+
+<p>Once the album is private, you can manage permissions for groups and
+users with 3 screens:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Administration &raquo; Users &raquo; Manage &raquo;
+  permissions action</span> (one link per user)</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Users &raquo; Groups &raquo;
+  permissions action</span> (one link per group)</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Manage &raquo; edit
+  album permissions action</span> (one link per album)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/en_UK/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,12 @@
+<p>Photos are displayed in the album corresponding to their file
+directory.</p>
+
+<p>You can also display a photo in several albums, without duplicating
+the file on your web server. Associate the photo to any album from the
+photo editing screen (that any administrator can reach from the photo page
+on the gallery side).</p>
+
+<p>Virtual albums are based on this concept: they have no corresponding
+directory. Create virtual albums
+from <span class="pwgScreen">Administration &raquo; Albums &raquo;
+Manage</span>.</p>
Index: tags/2.4.0RC3/language/en_UK/help/history.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/history.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>History</h2>
+
+<p>On these screens, you can monitor your gallery visits history according to the options you have chosen in: Administration &raquo; Configuration &raquo; Options &raquo; History</p>
+	
+<h3>Statistics</h3>
+<ul>
+  <p>If you have chosen to record the pages visited (<span class="pwgScreen">index.php</span> and <span class="pwgScreen">picture.php</span>), you can monitor them from this tab.</p>
+	<li><strong>Global statistics</strong>: visits per year. </li>
+	<li><strong>Yearly statistics</strong>: visits per month in the selected year .</li>
+	<li><strong>Monthly statistics</strong>: visits per days in the selected month .</li>
+	<li><strong>Daily statistics</strong>: visits per hours in the selected day.</li>
+</ul>
+
+<h3>Search</h3>
+<ul>
+  <p>If you have chosen to record the pages visited (<span class="pwgScreen">index.php</span> and <span class="pwgScreen">picture.php</span>), you can browse the details  from this tab with the help of different filters.</p>
+	<li><strong>Filter by date:</strong> select the date range to search by setting start and end dates.</li>
+	<li><strong>Filter by type of element:</strong> select the type of element for statistics on that element.</li>
+	<li><strong>Filter by user:</strong> select the user for statistics on that user.</li>
+	<li><strong>Filter by image identifier:</strong> select the image identifier for statistics on that image.</li>
+	<li><strong>Filter by name of the file:</strong> select the file name for statistics on that file..</li>
+</ul>
Index: tags/2.4.0RC3/language/en_UK/help/index.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/en_UK/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/maintenance.html	(revision 14585)
@@ -0,0 +1,26 @@
+<h2>Maintenance</h2>
+
+<p>To optimise page generation time Piwigo uses cached information. For example, instead of counting the number of photos contained in each album at each page reload this information is stored in the database. In theory this information should always be correct but sometimes an error can occur and cached information becomes out of date.</p>
+
+<p>Some information becomes less useful as time goes by.  Deleting this useless information from the database will save you some disk space.</p>
+
+<ul>
+	<li><strong>Delete orphan tags</strong></li>
+</ul>
+<ul>
+  <li><strong>Update albums informations:</strong> For each album, the following information is checked, and updated if necessary : list of parent albums, number of photos, last photo date, position among brother albums, position among all albums. This action also checks the representative photos consistency.</li>
+  <li><strong>Update photos information:</strong> For each photo, information updated is : full path to file, average rate. <em>Warning</em>, do not mix up: metadata information must be synchronised from <span class="pwgScreen">Administration &raquo; Tools &raquo; synchronise</span>, or on the modification screen of a single photo (through <span class="pwgScreen">Photo</span> for example).</li>
+</ul>
+<ul>
+  <li><strong>Repair and optimise the database:</strong>Perform re-order, repair and optimise operations on each table of the database.</li>
+  <li><strong>Reinitialize integrity check</strong></li>
+</ul>
+
+<ul>
+  <li><strong>Purge history details:</strong> Delete all lines from the history table. Screen <span class="pwgScreen">Administration &raquo; Tools &raquo; History</span> will not longer show information for the past history. <em>Warning:</em> all data will be lost, without any way to get them back.</li>
+  <li><strong>Purge history summary:</strong> Delete all the summary information about visit history. This summary is calculated from the history details.</li>
+  <li><strong>Purge sessions:</strong> Delete expired user sessions.</li>
+  <li><strong>Purge never used notification feeds</strong></li>
+  <li><strong>Purge searches history</strong></li>
+  <li><strong>Purge compiled templates</strong></li>  
+</ul>
Index: tags/2.4.0RC3/language/en_UK/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Notification By Mail (NBM)</h2>
+
+<p>Configure and manage email notifications to users notifying them of changes to your site.</p>
+
+<p>This screen comprises three tabs:</p>
+
+<h3>Settings</h3>
+<p>Available only for webmasters, this tab sets the notification by mail parameters.</p>
+
+<h3>Subscribe</h3>
+<p>Available only for webmasters, this tab manages a user's subscription to email notifications.  Add users to the subscribed box for them to receive notifications by mail.</p>
+
+<h3>Send</h3>
+<p>Available only for webmasters and administrators, this tab allows administrators to send notification emails to subscribed users.</p>
+
Index: tags/2.4.0RC3/language/en_UK/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permalinks</h2>
+
+<p>Permalinks are used to make album urls nicer. When a album has a permalink defined, the id of the album is not required anymore in the url.</p>
+
+<p>When a permalink is deleted, you can save it in the permalink history, so that external links to Piwigo pages still work. In the permalink history table you can see the date when the permalink has been deleted, the last time it was used and the number of times this permalink has been used.</p>
+
+<p>Note that permalinks must be unique per album. Also in the permalink history you cannot have the same permalink defined more than once.</p>
Index: tags/2.4.0RC3/language/en_UK/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,70 @@
+<fieldset>
+  <legend>Quick Start</legend>
+
+<ol>
+  <li>Create a directory on your computer.</li>  
+
+  <li>Copy some photos inside this directory, resize them for web display. <em>Warning</em>: the name of directories and files must contain only letters, figures, "-", "_" or ".". No blank space, nor accentuated characters.</li>
+
+  <li>With a FTP client, copy your directory in the "galleries" directory of your Piwigo installation.</li>
+
+  <li>Logon your gallery and go to <span class="pwgScreen">Administration</span> and click on the big Synchronization button.</li>
+</ol>
+
+<p>Congratulations! You have successfully created the first album of your photo gallery.</p>
+</fieldset>
+
+<fieldset>
+  <legend>Directories and files organization</legend>
+
+<ul>
+
+  <li>
+
+    <p>Album directories are in the Piwigo directory
+    "galleries". Here follows the directory tree of a very small gallery (but
+    using many features):</p>
+
+    <pre>
+galleries
+|-- wedding
+|   |-- celebration
+|   |   |-- arrival
+|   |   |   |-- paul-alone.jpg
+|   |   |   +-- sarah-alone.jpg
+|   |   +-- departure
+|   |       +-- paul-and-sarah.jpg
+|   +-- party
+|       |-- dancers001.jpg
+|       |-- dancers002.jpg
+|       +-- dancers003.jpg
++-- honeymoon
+    |-- hotel.png
+    |-- video-from-plane.avi
+    +-- pwg_representative
+        +-- video-from-plane.jpg
+</pre>
+
+  </li>
+
+  <li>Except for "pwg_representative" (see explanations below), each directory under "galleries" produces a album. There is no limit on deepness.</li>
+
+  <li>Basically, an element is represented by a file. A file can be a
+  Piwigo element if its extension is among <code>file_ext</code>
+  configuration parameter possibilities (see <span
+  class="filename">include/config_default.inc.php</span> file). A file can
+  be a picture if its extension is among <code>picture_ext</code>
+  configuration parameter possibilities.</li>
+
+  <li>No photo elements (video, sounds, file texts, whatever you want...) are represented by default by an icon corresponding to the filename
+  extension. Optionally, you can associate a thumbnail and a representative
+  file (see video.avi in the example above).</li>
+
+  <li><em>Warning</em>: the name of directories and files must contain only letters, figures, "-", "_" or ".". No blank space, nor accentuated characters.</li>
+
+  <li>Once photos are correctly placed in the
+  directories, go to: <span class="pwgScreen">Administration &raquo; Tools &raquo;
+  Synchronize</span></li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/en_UK/help/search.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/search.html	(revision 14585)
@@ -0,0 +1,24 @@
+<h2>Search</h2>
+
+<p>This page let you search photos among the whole gallery.</p>
+
+<dl>
+
+  <dt>Search for words</dt>
+  <dd>Search for one or several words among the attributes related to the photos
+  of the gallery. Use * as a wildcard for partial matches.</dd>
+
+  <dt>Search for an author</dt>
+  <dd>Use * as a wildcard for partial matches.</dd>
+
+  <dt>Search by date</dt>
+  <dd>Select a date and/or an ending date for your query. Leave date field empty
+  if you want to make a "before" query. The year in the last
+  field must be entered in the following format : AAAA (i.e. 2004)</dd>
+
+  <dt>Search in albums</dt>
+  <dd>Select album or albums you wish to search. All
+  sub-albums can be searched by selecting the parent album and setting enable
+  search sub-albums below.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/en_UK/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/site_manager.html	(revision 14585)
@@ -0,0 +1,17 @@
+<h2>Remote sites</h2>
+
+<p>Piwigo offers the possibility to use several servers to store the photos which will fill your gallery. It can be useful if your gallery is installed on a server with limited space and you have a huge number of images to display.</p>
+
+<ol>
+  <li>Edit the file <span class="filename">tools/create_listing_file_local.inc.php</span>, by modifying the parameters section such as <code>$conf['prefix_thumbnail']</code> or <code>$conf['use_exif']</code>.</li>
+  <li>Using FTP, place the files <span class="filename">tools/create_listing_file.php</span> and <span class="filename">tools/create_listing_file_local.inc.php</span> (modified) on your remote website, in the same directory as your album directories (as the directory <span class="filename">galleries</span> of this website). For example, let's say that you can access <span class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+  <li>Go to Administration &raquo; Tools &raquo; Site manager. Create a new site, for example <span class="filename">http://example.com/galleries</span>.</li>
+  <li>A new remote site is registered. You can perform 4 actions:
+    <ol>
+      <li><strong>Generate listing:</strong> launches a remote request to generate a remote file listing</li>
+      <li><strong>Synchronise:</strong> reads the remote <span class="filename">listing.xml</span> file and synchronises with database information</li>
+      <li><strong>Clean:</strong>removes remote <span class="filename">listing.xml</span> file</li>
+      <li><strong>Delete:</strong> deletes the site (and all related albums and photos) in the databas</li>
+    </ol>
+  </li>
+</ol>
Index: tags/2.4.0RC3/language/en_UK/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/synchronize.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Synchronise</h2>
+
+<p>There are two different types of synchronisation:</p>
+<ul>
+	<li>directories/files</li>
+	<li>file metadata</li>
+</ul>
+
+<p>Synchronising directories and files is about updating your directories tree with the album tree in the database. 
+Synchronising file metadata is about updating photo information, such as filesize, dimensions in pixels, EXIF or IPTC information, in the database.</p>
+
+<p>When synchronising your uploads with your gallery you must first synchronise directories and files.</p>
+
+<p>The synchronisation process may take a long time (depending on server load and the number of elements to manage) so it is possible to do it album by album.</p>
Index: tags/2.4.0RC3/language/en_UK/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Thumbnails Creation</h2>
+
+<p>This page let you create missing thumbnails.  It is advised not to use this functionality if your gallery is hosted on a shared server.  To regenerate thumbnails use the Batch Manager.</p>
+
+<dl>
+
+  <dt>GD version</dt>
+
+  <dd>GD is the image manipulation library for PHP. Choose the version installed on your server. You will be warned by an error message should you choose the wrong one; just come back to the previous page with your browser and choose another version. If no version works, then your server does not support GD.  PHP will need to be compiled with GD image library functions for this to work.</dd>
+
+  <dt>Width and height</dt>
+
+  <dd>Maximum thumbnail dimensions. Original aspect ratio is preserved. Default values can be modified using configuration settings <code>tn_width</code> and <code>tn_height</code> (see <span class="filename">include/config_default.inc.php</span> file).</dd>
+
+  <dt>Number of thumbnails to create</dt>
+
+  <dd>Do not try to process too many photos at once. The thumbnail creation process does use a lot of CPU. If your Piwigo gallery is hosted by a free provider, too high a load on the CPU might lead to the withdrawal of your website.</dd>
+
+  <dt>File format</dt>
+
+  <dd>Thumbnails are created in JPEG file format. They can be created from PNG and JPEG photos only.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/en_UK/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/en_UK/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/help/user_list.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Users list</h2>
+
+<p>This is where you manage the users of your Piwigo gallery.</p>
+
+<h3>Add a user</h3>
+
+<p>An administrator can add users manually.  For each user create a username, a password and submit a valid email address.</p>
+
+<h3>Users list</h3>
+
+<p>The list of existing users can be filtered on username (use * as wildcard), group or status. It can be ordered by registration date or username, in ascending or descending order.</p>
+
+<p>This screen allows the management of several users at once, using different actions:</p>
+
+<ul>
+  <li>delete users (requires confirmation)</li>
+  <li>change the status of the user</li>
+  <li>associate or dissociate from groups</li>
+  <li>modify display properties</li>
+  <li>modify additional preferences</li>
+</ul>
+
+<p>The target is the selected user (by default) or all users as displayed in the filtered list.</p>
Index: tags/2.4.0RC3/language/en_UK/index.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/en_UK/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/install.lang.php	(revision 14585)
@@ -0,0 +1,76 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "Installation";
+$lang['Basic configuration'] = "Basic configuration";
+$lang['Default gallery language'] = "Default gallery language";
+$lang['Database configuration'] = "Database configuration";
+$lang['Admin configuration'] = "Admin configuration";
+$lang['Start Install'] = "Start installation";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "mail address must be like xxx@yyy.eee (example : jack@altern.org)";
+$lang['Webmaster login'] = "Webmaster login";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "It will be shown to the visitors. It is necessary for website administration";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "Connection to server successful, but the connection to the database is impossible";
+$lang['Can\'t connect to server'] = "Cannot connect to server";
+$lang['Host'] = "Host";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "User";
+$lang['user login given by your host provider'] = "user login given by your host provider";
+$lang['Password'] = "Password";
+$lang['user password given by your host provider'] = "user password given by your host provider";
+$lang['Database name'] = "Database name";
+$lang['also given by your host provider'] = "also given by your host provider";
+$lang['Database table prefix'] = "Database tables prefix";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "database tables names will be prefixed with it (enables you to manage your tables better)";
+$lang['enter a login for webmaster'] = "enter a login for webmaster";
+$lang['webmaster login can\'t contain characters \' or "'] = "webmaster login can't contain characters ' or \"";
+$lang['please enter your password again'] = "please enter your password again";
+$lang['Webmaster password'] = "Webmaster password";
+$lang['Keep it confidential, it enables you to access administration panel'] = "Keep it confidential, it enables you to access administration panel";
+$lang['Password [confirm]'] = "Password [confirm]";
+$lang['verification'] = "verification";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Need help? Ask your question on <a href=\"%s\">Piwigo message board</a>.";
+$lang['Webmaster mail address'] = "Webmaster mail address";
+$lang['Visitors will be able to contact site administrator with this mail'] = "Visitors will be able to use this mail to contact the site administrator";
+$lang['PHP 5 is required'] = "PHP 5 is required";
+$lang['It appears your webhost is currently running PHP %s.'] = "It appears your webhost is currently running PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "Note you can change your configuration by yourself and restart Piwigo after that.";
+$lang['Try to configure PHP 5'] = "Try to configure PHP 5";
+$lang['Sorry!'] = "Sorry!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo was not able to configure PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "You should refer to your hosting provider's support and see how you can switch to PHP 5 by yourself.";
+$lang['Hope to see you back soon.'] = "Hope to see you back soon.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Congratulations, Piwigo installation is completed';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Creation of config file local/config/database.inc.php failed.';
+$lang['Download the config file'] = 'Download the config file';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'You can download the config file and upload it to local/config directory of your installation.';
+$lang['Just another Piwigo gallery'] = 'Just another Piwigo gallery';
+$lang['Welcome to my photo gallery'] = 'Welcome to my photo gallery';
+$lang['Welcome to your new installation of Piwigo!'] = 'Welcome to your new installation of Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Don\'t hesitate to consult our forums for any help: %s';
+
+?>
Index: tags/2.4.0RC3/language/en_UK/iso.txt
===================================================================
--- tags/2.4.0RC3/language/en_UK/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+English [UK]
Index: tags/2.4.0RC3/language/en_UK/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/en_UK/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/en_UK/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Upgrade";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "This page proposes to upgrade the database from your Piwigo old version to the new version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).";
+$lang['Upgrade from version %s to %s'] = "Upgrade from version %s to %s";
+$lang['Statistics'] = "Statistics";
+$lang['total upgrade time'] = "total upgrade time";
+$lang['total SQL time'] = "total SQL time";
+$lang['SQL queries'] = "SQL queries";
+$lang['Upgrade informations'] = "Upgrade information";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "As a precaution, the following plugins have been deactivated. You must check for plugins upgrades before reactivating them:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Only an administrator can run upgrade: please sign in below.";
+$lang['You do not have access rights to run upgrade'] = "You do not have access rights to run upgrade";
+$lang['All sub-albums of private albums become private'] = "All sub-albums of private albums become private";
+$lang['User permissions and group permissions have been erased'] = "Users and groups permissions have been erased";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Only thumbnails prefix and webmaster mail address have been saved from previous configuration";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'In <i>%s</i>, before <b>?></b>, insert:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:';
+?>
Index: tags/2.4.0RC3/language/eo_EO/about.html
===================================================================
--- tags/2.4.0RC3/language/eo_EO/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/eo_EO/about.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Tiu galerio funkcias per Piwigo.</p>
+
+<p>Piwigo estas programo de reta fota galerio. Ĝin kontruis aktiva komunumo de uzantoj kaj programistoj. Kromprogramoj povas facile personigi la galerion. Bonuso : Piwigo estas libera kaj senpaga.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Vizitu la retejon de Piwigo</a></p>
Index: tags/2.4.0RC3/language/eo_EO/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/eo_EO/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/eo_EO/admin.lang.php	(revision 14585)
@@ -0,0 +1,66 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['Add to caddie'] = 'Aldoni al la fot-stoko';
+$lang['Caddie'] = 'Fot-stoko';
+$lang['Notification'] = "Sciigo";
+$lang['Upload Photos'] = 'Alsuti fotojn';
+$lang['Select an album'] = 'Elekti fotaron';
+$lang['... or '] = '... au ';
+$lang['create a new album'] = 'krei novan fotaron';
+$lang['Select files'] = 'Elekti dosierojn';
+$lang['Start Upload'] = 'Ek-alsuti';
+$lang['Learn more'] = 'Scii pli';
+$lang['Maximum file size: %sB.'] = 'Maksimuma grando de la fotoj: %sB.';
+$lang['Allowed file types: %s.'] = 'dosiertipo permesita: %s.';
+$lang['+ Add an upload box'] = '+ Aldoni alsutan fenestron';
+$lang['Add another set of photos'] = 'Aldoni plian aron de fotoj';
+$lang['Photo %s of %s'] = 'Foto %s de %s';
+$lang['%d photos uploaded'] = '%d fotoj alsutitaj';
+$lang['All %d photos are selected'] = 'Ciuj %d fotoj estas elektitaj';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Vi uzas la foliumilan alsutilon, kaze de problemo, provu la <a href="%s">Flash alsutilon</a> anstatau.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Vi uzas la Flash-alsutilon, kaze de problemo, provu la <a href="%s">Foliumilan alsutilon</a> anstatau.';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif funkcioj ne disponeblas, administranto malvalidigu EXIF-uzon';
+$lang['Hide'] = "Kasita";
+$lang['Photo Properties'] = 'Fotaj ecoj';
+$lang['Photo name'] = 'Foto-nomo';
+$lang['Name'] = 'Nomo';
+$lang['Description'] = 'Priskribo';
+$lang['Parent album'] = 'Patra fotaro';
+$lang['Album name'] = 'Fotara nomo';
+$lang['Create'] = 'Krei';
+$lang['ACCESS_0'] = "Libera atingo";
+$lang['ACCESS_1'] = "Atingo por ciuj";
+$lang['ACCESS_2'] = "Atingo por registritaj uzantoj";
+$lang['ACCESS_3'] = "Atingo por administrantoj";
+$lang['ACCESS_4'] = "Atingo por retestroj";
+$lang['ACCESS_5'] = "Neniu atingo";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "Kontakto";
+$lang['Level 2'] = "Amikoj";
+$lang['Level 4'] = "Familio";
+$lang['Level 8'] = "Administranto";
+
+
+?>
Index: tags/2.4.0RC3/language/eo_EO/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/eo_EO/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/eo_EO/common.lang.php	(revision 14585)
@@ -0,0 +1,408 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Esperanto [EO]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=596
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Esperanto';
+$lang_info['country'] = 'Esperantio';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'eo';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Ko';
+$lang['%d album updated'] = '%d fotaro ĝisdatigita';
+$lang['%d albums updated'] = '%d fotaroj ĝisdatigitaj';
+$lang['%d comment to validate'] = '%d validigenda komento';
+$lang['%d comments to validate'] = '%d validigendaj komentoj';
+$lang['%d new comment'] = '%d nova komento';
+$lang['%d new comments'] = '%d novaj komentoj';
+$lang['%d comment'] = '%d komento';
+$lang['%d comments'] = '%d komentoj';
+$lang['%d hit'] = 'vidi %d foje';
+$lang['%d hits'] = 'vidi %d foje';
+$lang['%d new photo'] = '%d nova foto';
+$lang['%d new photos'] = '%d novaj fotoj';
+$lang['%d new user'] = '%d nova uzanto';
+$lang['%d new users'] = '%d novaj fotoj';
+$lang['About'] = 'Pri';
+$lang['All tags'] = 'Ĉiuj etikedoj';
+$lang['Any tag'] = 'Iu ajn etikedo';
+$lang['At least one listed rule must be satisfied.'] = 'Almenaŭ unu regulo plenumiĝas.';
+$lang['Albums'] = 'Fotaroj';
+$lang['Album'] = 'Fotaro';
+$lang['Close this window'] = 'Fermi la fenestron';
+$lang['Complete RSS feed (photos, comments)'] = 'Plena RSS Fadeno (fotoj kaj komentoj)';
+$lang['Confirm Password'] = 'Konfirmi pasvorton';
+$lang['Connection settings'] = 'Konekta agordo';
+$lang['Login'] = 'Konekto';
+$lang['Contact webmaster'] = 'Kontakti la respondeculon';
+$lang['Create a new account'] = 'Krei novan konton';
+$lang['Created on'] = 'Kreita je la ';
+$lang['Creation date'] = 'Kreita dato';
+$lang['Current password is wrong'] = 'Neĝusta pasvorto';
+$lang['Dimensions'] = 'Grandeco';
+$lang['Display'] = 'Ekrano';
+$lang['Each listed rule must be satisfied.'] = 'Ĉiuj reguloj devas kongrui';
+$lang['Email address'] = 'Retadreso';
+$lang['Enter your personnal informations'] = 'Entajpi viajn personajn informojn';
+$lang['Error sending email'] = 'Eraro sendanta la retmesaĝon';
+$lang['File name'] = 'Dosiernomo';
+$lang['File'] = 'Dosiero';
+$lang['Filesize'] = 'Dosierpezo';
+$lang['Filter and display'] = 'Filtri kaj surekranigi';
+$lang['Filter'] = 'Filtrilo';
+$lang['Forgot your password?'] = 'Ĉu vi forgesis vian pasvorton ?';
+$lang['Go through the gallery as a visitor'] = 'Trairi la galerion kiel vizitanto';
+$lang['Help'] = 'Helpo';
+$lang['Identification'] = 'Identigado';
+$lang['Photos only RSS feed'] = 'Nur fota RSS Fadeno';
+$lang['Keyword'] = 'Ŝlosilvorto';
+$lang['Links'] = 'Ligiloj';
+$lang['N/A'] = 'ne disponeblas';
+$lang['New on %s'] = 'Nova je la %s';
+$lang['Notification'] = 'Sciigo';
+$lang['Number of items'] = 'Nombro de ero';
+$lang['Original dimensions'] = 'Originala grandeco';
+$lang['Password forgotten'] = 'Forgesita pasvorto';
+$lang['Password'] = 'Pasvorto';
+$lang['Post date'] = 'Aldonita dato';
+$lang['Posted on'] = 'Aldonita je la';
+$lang['Profile'] = 'Profilo';
+$lang['Quick connect'] = 'Rapida konekto';
+$lang['RSS feed'] = 'RSS fadeno';
+$lang['Register'] = 'Registri';
+$lang['Registration'] = 'Registrado';
+$lang['Related tags'] = 'Ligitaj etikedoj';
+$lang['Reset'] = 'Rekomenci';
+$lang['Retrieve password'] = 'Ricevi pasvorton';
+$lang['Search rules'] = 'Serĉadaj reguloj';
+$lang['Search tags'] = 'Serĉi etikedojn';
+$lang['Search'] = 'Serĉi';
+$lang['display available tags'] = 'Montri la disponeblajn etikedojn';
+$lang['Since'] = 'De';
+$lang['Sort by'] = 'Ordigi laŭ';
+$lang['Sort order'] = 'Ordigo';
+$lang['Tag'] = 'Etikedo';
+$lang['Tags'] = 'Etikedoj';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'La RSS fadeno sciigas pri eventoj de la galerio : novaj fotoj, ĝisdatigitaj fotaroj, novaj komentoj de uzantoj. Tio uziĝas per RSS legilo.';
+$lang['Unknown feed identifier'] = 'Nekonata fadena identigilo';
+$lang['User comments'] = 'Uzantaj komentoj';
+$lang['Username'] = 'Uzantnomo';
+$lang['Visits'] = 'Vizitoj';
+$lang['Webmaster'] = 'Retestro';
+$lang['Week %d'] = 'Semajno %d';
+$lang['About Piwigo'] = 'Pri Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Vi ne rajtas legi tiun paĝon. Forfikiĝu !';
+$lang['add this photo to your favorites'] = 'Aldoni tiun foton al via legosigno';
+$lang['Administration'] = 'Administrado';
+$lang['all'] = 'ĉio';
+$lang['ascending'] = 'kreskanta';
+$lang['author(s) : %s'] = 'aŭtoro(j) : %s';
+$lang['Expand all albums'] = 'Etendi ĉiujn fotarojn';
+$lang['posted after %s (%s)'] = 'aldonita post la %s (%s)';
+$lang['posted before %s (%s)'] = 'aldonita antaŭ la %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'aldonita inter la %s (%s) kaj la %s (%s)';
+$lang['posted on %s'] = 'aldonita je la %s';
+$lang['Best rated'] = 'Plej bonaj';
+$lang['display best rated photos'] = 'Montri la plej bonajn fotojn';
+$lang['Calendar'] = 'Kalendaro';
+$lang['All'] = 'Ĉiuj';
+$lang['display each day with photos, month per month'] = 'Montri ĉiujn tagojn, laŭ monatoj';
+$lang['View'] = 'Vido';
+$lang['chronology_monthly_calendar'] = 'Monata kalendaro';
+$lang['chronology_monthly_list'] = 'Monata listo';
+$lang['chronology_weekly_list'] = 'Semajna listo';
+$lang['Click here if your browser does not automatically forward you'] = 'Musklaku tien se via foliumilo ne mem plusendas vin.';
+$lang['comment date'] = 'dato de la komento';
+$lang['Comment'] = 'Komento';
+$lang['Your comment has been registered'] = 'Via komento estis registrita';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Kontraŭ-fekula sistemo : bonvolu pacienciĝi antaŭ aldoni novan komenton';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Via komento ne validiĝis ĉar ĝi ne kongruas al nia striktaj reguloj';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administranto devas validigi vian komenton antaŭ ke ĝi iĝu videbla.';
+$lang['This login is already used by another user'] = 'Tiu uzanta nomo jam ekzistas';
+$lang['Comments'] = 'Komentoj';
+$lang['Add a comment'] = 'Aldoni komenton';
+$lang['created after %s (%s)'] = 'kreita post la %s (%s)';
+$lang['created before %s (%s)'] = 'kreita antaŭ la %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'kreita antaŭ la %s (%s) kaj la %s (%s)';
+$lang['created on %s'] = 'kreita la %s';
+$lang['Customize'] = 'Personigi';
+$lang['Your Gallery Customization'] = 'Personigado de via galerio ';
+$lang['day'][0] = 'Dimanĉo';
+$lang['day'][1] = 'Lundo';
+$lang['day'][2] = 'Mardo';
+$lang['day'][3] = 'Merkredo';
+$lang['day'][4] = 'Ĵaŭdo';
+$lang['day'][5] = 'Vendredo';
+$lang['day'][6] = 'Sabato';
+$lang['Default'] = 'Apriora';
+$lang['delete this photo from your favorites'] = 'Forigi tiun foton el viaj legosignoj';
+$lang['Delete'] = 'Forigi';
+$lang['descending'] = 'malkreskante';
+$lang['edit'] = 'redakti';
+$lang['wrong date'] = 'maltaŭga dato';
+$lang['excluded'] = 'eksigita';
+$lang['Your favorites'] = 'Miaj legosignoj';
+$lang['display your favorites photos'] = 'montri fotojn de miaj legosignoj';
+$lang['Favorites'] = 'Legosignoj';
+$lang['First'] = 'Unua';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Ni ŝlosis la galerion por plibonigi ĝin, bonvolu reveni poste.';
+$lang['Page generated in'] = 'Paĝo kreita je la';
+$lang['guest'] = 'Vizitanto';
+$lang['Hello'] = 'Saluton';
+$lang['available for administrators only'] = 'disponeblaj nur por la administrantoj';
+$lang['display this album'] = 'montri tiun fotaron';
+$lang['display last user comments'] = 'Montri la lasatjn komentoj';
+$lang['customize the appareance of the gallery'] = 'Personigi aspekton de la galerio';
+$lang['search'] = 'serĉi';
+$lang['Home'] = 'Akceptejo';
+$lang['in this album'] = 'en tiu fotaro';
+$lang['in %d sub-album'] = 'en %d sub-fotaro';
+$lang['in %d sub-albums'] = 'en %d sub-fotaroj';
+$lang['included'] = 'inkluzivita';
+$lang['Invalid password!'] = 'Nevalidat pasvorto !';
+$lang['Language'] = 'Lingvo';
+$lang['last %d days'] = '%d lastaj tagoj';
+$lang['Last'] = 'Lasta';
+$lang['Logout'] = 'Elsaluti';
+$lang['obligatory'] = 'devigata';
+$lang['Maximum photo height'] = 'Maksimuma alteco de la fotoj';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimuma alteco devas esti pli ol 50';
+$lang['Maximum photo width'] = 'Maksimuma larĝeco de la fotoj';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimuma larĝeco devas esti pli ol 50';
+$lang['display a calendar by creation date'] = 'montri kalendaron laŭ kreigita dato';
+$lang['display all photos in all sub-albums'] = 'montri ĉiujn fotojn en ĉiuj sub-fotaroj';
+$lang['return to normal view mode'] = 'reiri al la normala vido';
+$lang['display a calendar by posted date'] = 'montri kalendaron laŭ aldonita dato';
+$lang['month'][10] = 'Oktobro';
+$lang['month'][11] = 'Novembro';
+$lang['month'][12] = 'Decembro';
+$lang['month'][1] = 'Januaro';
+$lang['month'][2] = 'Februaro';
+$lang['month'][3] = 'Marto';
+$lang['month'][4] = 'Aprilo';
+$lang['month'][5] = 'Majo';
+$lang['month'][6] = 'Junio';
+$lang['month'][7] = 'Julio';
+$lang['month'][8] = 'Aŭgusto';
+$lang['month'][9] = 'Septembro';
+$lang['Most visited'] = 'Plej ofte vizitita';
+$lang['display most visited photos'] = 'montri la plej ofte vizititajn fotojn';
+$lang['The number of photos per page must be a not null scalar'] = 'Nombro de fotoj en unu paĝo devas esti ne-nula nombro';
+$lang['Number of photos per page'] = 'Nombro de miniaturo';
+$lang['Unknown identifier'] = 'Nekonata identigilo';
+$lang['New password'] = 'Nova pasvorto';
+$lang['Rate this photo'] = 'Taksu tiun foton';
+$lang['Next'] = 'Venonta';
+$lang['no rate'] = 'neniu taksado';
+$lang['Photos posted within the last %d day.'] = 'Montri nur fotojn aldonitaj dum la lasta %d tago.';
+$lang['Photos posted within the last %d days.'] = 'Montri nur fotojn aldonitaj dum la lastaj %d tagoj.';
+$lang['password updated'] = 'ĝisdatigita pasvorto';
+$lang['Recent period must be a positive integer value'] = 'Tiu periodo devas esti pozitiva nombro';
+$lang['photo'] = 'foto';
+$lang['Click on the photo to see it in high definition'] = 'Musklaku la foton por grandigi ĝin (aŭ proksimiĝu la ekranon)';
+$lang['Show file metadata'] = 'Montri dosiermetadatumojn';
+$lang['Powered by'] = 'potencigita per';
+$lang['Preferences'] = 'Agordo';
+$lang['Previous'] = 'Lasta';
+$lang['Random photos'] = 'Hazarda foto';
+$lang['display a set of random photos'] = 'montri hazarde plurajn fotojn';
+$lang['Recent albums'] = 'Lastaj fotaroj';
+$lang['display recently updated albums'] = 'montri la plej freŝajn fotarojn';
+$lang['Recent period'] = 'Lasta periodo';
+$lang['Recent photos'] = 'Lastaj fotoj';
+$lang['display most recent photos'] = 'montri la plej lastajn fotojn';
+$lang['Redirection...'] = 'Alidirektado...';
+$lang['Please, enter a login'] = 'Bonvolu entajpi uzantnomon';
+$lang['login mustn\'t end with a space character'] = 'Uzantnomo ne finiĝu per spaceto';
+$lang['login mustn\'t start with a space character'] = 'Uzantnomo ne komenciĝu per spaceto';
+$lang['this login is already used'] = 'Tiu uzantnomo jam uziĝas';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'La retadreso devas simili al xxx@yyy.eee (ekzemple : zamenhof@bialistoko.pl)';
+$lang['please enter your password again'] = 'Bonvolu tajpi vian pasvorton denove (aŭ kopi-gluu ĝin)';
+$lang['Auto login'] = 'Aŭtomata konekto';
+$lang['remove this tag from the list'] = 'forigi tiun etikedon de la listo';
+$lang['representative'] = 'delegito';
+$lang['Search for Author'] = 'Serĉi aŭtoron';
+$lang['Search in albums'] = 'Serĉi en la fotaroj';
+$lang['Date'] = 'Dato';
+$lang['End-Date'] = 'Fin-dato';
+$lang['Kind of date'] = 'Type de date';
+$lang['Search for words'] = 'Serĉi vorton';
+$lang['Search for all terms'] = 'Serĉi ĉiujn vortojn';
+$lang['Empty query. No criteria has been entered.'] = 'Malplena demando, neniu kritero entajpigita.';
+$lang['Search results'] = 'Serĉa rezulto';
+$lang['Search in sub-albums'] = 'Serĉi en la sub-fotaroj';
+$lang['searched words : %s'] = 'serĉitaj vortoj : %s';
+$lang['Contact'] = 'Kontakto';
+$lang['set as album representative'] = 'Elekti kiel delegito de tiu fotaro';
+$lang['Show number of comments'] = 'Montri la nombron de komentoj';
+$lang['Show number of hits'] = 'Montri la nombron de vidoj';
+$lang['slideshow'] = 'bildoserio';
+$lang['stop the slideshow'] = 'halti la bildoserion';
+$lang['Specials'] = 'Apartaj';
+$lang['SQL queries in'] = 'SQL peto en';
+$lang['display only recently posted photos'] = 'n\'montri nur la lastaj fotoj';
+$lang['return to the display of all photos'] = 'reiri al ĉiuj fotoj';
+$lang['the beginning'] = 'la komenco';
+$lang['Interface theme'] = 'Etoso';
+$lang['Thumbnails'] = 'Miniaturo';
+$lang['Menu'] = 'Menuo';
+$lang['A comment on your site'] = 'Komento sur via retejo';
+$lang['today'] = 'Hodiaŭ';
+$lang['Update your rating'] = 'Ĝisdatigu vian taksadon';
+$lang['the username must be given'] = 'vi devas indiki la uzantnomon';
+$lang['useful when password forgotten'] = 'helpinda se vi forgesas vian pasvorton';
+$lang['Quick search'] = 'Rapida serĉo';
+$lang['Connected user: %s'] = 'Konektita uzanto : %s';
+$lang['IP: %s'] = 'IP : %s';
+$lang['Browser: %s'] = 'Foliumilo: %s';
+$lang['Author: %s'] = 'Aŭtoro: %s';
+$lang['Comment: %s'] = 'Komento: %s';
+$lang['Comment by %s'] = 'Komentis %s';
+$lang['User: %s'] = 'Uzanto: %s';
+$lang['Email: %s'] = 'Retadreso: %s';
+$lang['Admin: %s'] = 'Administrado: %s';
+$lang['Registration of %s'] = 'Registris %s';
+$lang['Album: %s'] = 'Fotaro: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Malbona stato por la uzanto "Vizitanto", uzo de la apriora stato. Bonvolu averti la retestro.';
+$lang['this email address is already in use'] = 'tiu retadreso jam uziĝas';
+$lang['Album results for'] = 'Rezulto de fotaro por';
+$lang['Tag results for'] = 'Rezulto de la etikedoj por';
+$lang['from %s to %s'] = 'de %s al %s';
+$lang['Play of slideshow'] = 'Legi la bildoserion';
+$lang['Pause of slideshow'] = 'Paŭzi la bildserion';
+$lang['Repeat the slideshow'] = 'Ripeti la bildserion';
+$lang['Not repeat the slideshow'] = 'Ne ripeti la bildoserion';
+$lang['Reduce diaporama speed'] = 'Malrapidigi la bildoserion';
+$lang['Accelerate diaporama speed'] = 'Rapidigi la bildoserion';
+$lang['Submit'] = 'Validigi';
+$lang['Yes'] = 'Jes';
+$lang['No'] = 'Ne';
+$lang['%d photo'] = '%d foto';
+$lang['%d photos'] = '%d fotoj';
+$lang['%d photo is also linked to current tags'] = '%d foto ankaŭ ligiĝas al la kurantaj etikedoj';
+$lang['%d photos are also linked to current tags'] = '%d fotoj ankaŭ ligiĝas al la kurantaj etikedoj';
+$lang['display photos linked to this tag'] = 'montri fotojn ligita al tiu etikedo';
+$lang['photos posted during the last %d days'] = 'fotoj aldonitaj tiuj lastaj %d tagoj';
+$lang['Piwigo Help'] = 'Helpo de Piwigo';
+$lang['Rank'] = 'Rango';
+$lang['group by letters'] = 'grupigi per literoj';
+$lang['letters'] = 'literoj';
+$lang['show tag cloud'] = 'montri etikedoj nube';
+$lang['cloud'] = 'nubo';
+$lang['Reset to default values'] = 'reŝarĝi la apriorajn valuojn';
+$lang['delete all photos from your favorites'] = 'Forigi ĉiujn fotojn el viaj legosignoj';
+$lang['Sent by'] = 'Senditaj de';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'La kuketoj ne disponeblas sur mia komputilo. Aktivu ilin por konektiĝi.';
+$lang['Edit a comment'] = "redakti komenton";
+$lang['Are you sure?'] = "Ĉu vi certas ?";
+$lang['(!) This comment requires validation'] = '(!) Tiu komento validigendas';
+$lang['Welcome'] = 'Bonvenon';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bonvenon en via Galerio Piwigo !';
+$lang['... or browse your empty gallery'] = '... aŭ foliumu en via malplenan galerion';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... aŭ kaŝu tiun mesaĝon, mi mem elturniĝos';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Saluton %s, via galerio Piwigo estas malplena !';
+$lang['I want to add photos'] = 'Mi deziras aldoni fotojn';
+$lang['Manage this user comment: %s'] = 'Mastrumi tiun uzantan komenton : %s';
+$lang['Email address is missing. Please specify an email address.'] = "Retadreso mankas. Bonvolu specifi retadreson.";
+$lang['This author modified following comment:'] = 'Tiu aŭtoro ŝanĝis la jenan komenton:';
+$lang['This author removed the comment with id %d'] = 'Tiu aŭtoro forviŝis la komenton kies identigilo estas  %d';
+$lang['html tags are not allowed in login'] = 'html etikedoj ne estas rajtigitaj en la salutnomo';
+$lang['Invalid username or email'] = 'Nevalida salutnomo aŭ retadreso';
+$lang['Password reset is not allowed for this user'] = 'La renovigo de la pasvorto ne estas permesita por tiu uzanto';
+$lang['User "%s" has no email address, password reset is not possible'] = 'La uzanto "%s" ne havas retadreson, la renovigo de ŝlia pasvorto ne eblas';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Iu petis renovigon de la pasvorto por la jena uzanto: ';
+$lang['Username "%s" on gallery %s'] = 'Uzanto "%s" ĉe la galerio  %s';
+$lang['To reset your password, visit the following address:'] = 'Por renovigi vian pasvorton, musklaku la jenan ligilon:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se vi erare petis, nur ignoru tiun mesaĝon kaj nenio okazos.';
+$lang['Password Reset'] = 'Renovigo de via pasvorto';
+$lang['Check your email for the confirmation link'] = 'Kontrolu viajn retmesaĝojn por trovi la konfirman ligilon';
+$lang['Invalid key'] = 'Nevalida ŝlosilo';
+$lang['The passwords do not match'] = 'La pasvortoj ne kongruas';
+$lang['Your password has been reset'] = 'Via pasvorto estis renovigita';
+$lang['Return to home page'] = 'Reiri al la akceptejo';
+$lang['Please enter your username or email address.'] = 'Bonvolu entajpi vian salutnomon aŭ vian retadreson.';
+$lang['You will receive a link to create a new password via email.'] = 'Vi ricevos retmesaĝe musklakendan ligilon por renovigi vian pasvorton.';
+$lang['Username or email'] = 'Salutnomon aŭ retadreso';
+$lang['Change my password'] = 'Ŝanĝi mian pasvorton';
+$lang['Enter your new password below.'] = 'Entajpu suben vian novan pasvorton.';
+$lang['Author'] = 'Aŭtoro';
+$lang['%d rates'] = '%d taksado';
+$lang['Rating score'] = 'Poento';
+$lang['EXIF Metadata'] = 'Datumoj EXIF';
+$lang['IPTC Metadata'] = 'Datumoj IPTC';
+$lang['Download this file'] = 'Elŝuti tiun dosieron';
+$lang['Download'] = 'elŝuti';
+$lang['Edit'] = 'Redakti';
+$lang['Hello %s,'] = 'Saluton %s,';
+$lang['Search by date'] = 'Serĉi laŭ dato';
+$lang['Search for any term'] = 'Serĉi por iu ajn vorto';
+$lang['Send my connection settings by email'] = 'Sendi mian konektan agordon per retmesaĝo';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Vi sukcese registris, vi baldaŭ ricevos retmesaĝe viajn konektajn agordojn. Bonvenon !';
+$lang['Username modification'] = 'ŝanĝo de uzantnomo';
+$lang['Your username has been successfully changed to : %s'] = 'Via uzantnomo sukcese ŝanĝiĝis por : %s';
+$lang['square'] = 'Kvadrata';
+$lang['thumb'] = 'miniaturo';
+$lang['small'] = 'Malgranda';
+$lang['medium'] = 'Mezgranda';
+$lang['large'] = 'Larĝa';
+$lang['xlarge'] = 'Larĝega';
+$lang['xxlarge'] = 'Giganta';
+$lang['Original'] = 'Originala';
+$lang['Thank you for registering at %s!'] = 'Dankon pro via registrado ĉe %s!';
+$lang['Here are your connection settings'] = 'Jen viaj konektaj agordoj';
+$lang['Password: %s'] = 'Pasvorto: %s';
+$lang['Username: %s'] = 'Uzantnomo: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Se vi erare ricevis tiun mesaĝon, bonvolu kontakti na %s';
+$lang['Show latest comments first'] = 'Montru unue la plej freŝajn komentojn';
+$lang['Show oldest comments first'] = 'Montru unue la plej malnovaj komentojn';
+$lang['View in'] = 'Montrado';
+$lang['Mobile'] = 'Portebla';
+$lang['Desktop'] = 'Komputila';
+$lang['Photo sizes'] = 'Grandeco de la fotoj';
+$lang['2small'] = 'XXS - malgrandega';
+$lang['xsmall'] = 'XS - tre malgranda';
+$lang['File name, A &rarr; Z'] = 'Dosiernomo, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Dosiernomo, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Fota titolo, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Fota titolo, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Kreita dato, nova &rarr; malnova';
+$lang['Date created, old &rarr; new'] = 'Kreita dato, malnova &rarr; nova';
+$lang['Date posted, new &rarr; old'] = 'Aldonita dato, nova &rarr; malnova';
+$lang['Date posted, old &rarr; new'] = 'Aldonita dato, malnova &rarr; nova';
+$lang['Rating score, high &rarr; low'] = 'Poento, alta &rarr; malalta';
+$lang['Rating score, low &rarr; high'] = 'Poento, malalta &rarr; alta';
+$lang['Visits, high &rarr; low'] = 'Vizitoj, alta &rarr; malalta';
+$lang['Visits, low &rarr; high'] = 'Vizitoj, malalta &rarr; alta';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identigilo, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identigilo, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Permana ordigado';
+
+
+?>
Index: tags/2.4.0RC3/language/eo_EO/iso.txt
===================================================================
--- tags/2.4.0RC3/language/eo_EO/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/eo_EO/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Esperanto [EO]
Index: tags/2.4.0RC3/language/es_AR/about.html
===================================================================
--- tags/2.4.0RC3/language/es_AR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_AR/about.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Esta galería de fotos está basada en Piwigo.</p>
+
+<p>Piwigo es un programa para presentar una galería de fotos en Internet, construído por una comunidad activa de usuarios y desarroladores. Las extensiones hacen que Piwigo sea facilmente personalizable. Y como si esto fuera poco, Piwigo es libre y gratuito.</p>
+
+<p id="linkToPiwigo"><a href="http://es.piwigo.org">Visitá el sitio web de Piwigo en castellano</a></p>
Index: tags/2.4.0RC3/language/es_AR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/es_AR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_AR/common.lang.php	(revision 14585)
@@ -0,0 +1,408 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Argentina [AR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=418
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Castellano';
+$lang_info['country'] = 'Argentina';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'es';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d categoría actualizada';
+$lang['%d albums updated'] = '%d categorías actualizadas';
+$lang['%d comment to validate'] = '%d comentario de usuario para aprobar';
+$lang['%d comments to validate'] = '%d comentarios de usuario para aprobar';
+$lang['%d new comment'] = '%d nuevo comentario de usuario';
+$lang['%d new comments'] = '%d nuevos comentarios de usuario';
+$lang['%d comment'] = '%d comentario';
+$lang['%d comments'] = '%d comentarios';
+$lang['%d hit'] = 'vista %d veces';
+$lang['%d hits'] = 'vista %d veces';
+$lang['%d new photo'] = '%d nueva imagen';
+$lang['%d new photos'] = '%d nuevas imágenes';
+$lang['%d new user'] = '%d nuevo usuario';
+$lang['%d new users'] = '%d nuevos usuarios';
+$lang['About'] = 'Acerca de';
+$lang['All tags'] = 'Todos los tags';
+$lang['Any tag'] = 'Cualquier tag';
+$lang['At least one listed rule must be satisfied.'] = 'Uno de los criterios por lo menos debe satisfacerse.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Categorías';
+$lang['Album'] = 'Categoría';
+$lang['Close this window'] = 'Cierre esta ventana';
+$lang['Complete RSS feed (photos, comments)'] = 'Flujo RSS completo (imágenes, comentarios)';
+$lang['Confirm Password'] = 'Confirme su contraseña';
+$lang['Connection settings'] = 'Parámetros de conexión';
+$lang['Login'] = 'Conexión';
+$lang['Contact webmaster'] = 'Ponerse en contacto con el webmaster';
+$lang['Create a new account'] = 'Crear una cuenta nueva';
+$lang['Created on'] = 'Creada el';
+$lang['Creation date'] = 'Fecha de creación';
+$lang['Current password is wrong'] = 'Contraseña actual incorrecta';
+$lang['Dimensions'] = 'Dimensiones';
+$lang['Display'] = 'Mostrar';
+$lang['Each listed rule must be satisfied.'] = 'Cada uno de los criterios debe ser satisfecho';
+$lang['Email address is missing. Please specify an email address.'] = 'Falta la dirección de correo electrónico';
+$lang['Email address'] = 'Dirección de correo electrónico';
+$lang['Enter your personnal informations'] = 'Escriba sus datos personales';
+$lang['Error sending email'] = 'Error al enviar correo electrónico';
+$lang['File name'] = 'Nombre del archivo';
+$lang['File'] = 'Archivo';
+$lang['Filesize'] = 'Tamaño';
+$lang['Filter and display'] = 'Filtrar y mostrar';
+$lang['Filter'] = 'Filtro';
+$lang['Forgot your password?'] = 'Olvidó su contraseña?';
+$lang['Go through the gallery as a visitor'] = 'Recorrer la galería como visitante';
+$lang['Help'] = 'Ayuda';
+$lang['Photos only RSS feed'] = 'Flujo RSS de las imágenes';
+$lang['Keyword'] = 'Palabra clave';
+$lang['Links'] = 'Enlaces';
+$lang['N/A'] = 'no disponible';
+$lang['New on %s'] = 'Nuevo el %s';
+$lang['Notification'] = 'Notificación';
+$lang['Number of items'] = 'Cantidad de elementos';
+$lang['Original dimensions'] = 'Dimensiones originales';
+$lang['Password forgotten'] = 'Contraseña olvidada';
+$lang['Password'] = 'Contraseña';
+$lang['Post date'] = 'Fecha de envío';
+$lang['Posted on'] = 'Agregado el';
+$lang['Profile'] = 'Perfil';
+$lang['Quick connect'] = 'Conexión rápida';
+$lang['RSS feed'] = 'flujo RSS';
+$lang['Register'] = 'Registrarse';
+$lang['Registration'] = 'Registro';
+$lang['Related tags'] = 'Tags relacionados';
+$lang['Reset'] = 'Anular';
+$lang['Retrieve password'] = 'Recuperar una contraseña';
+$lang['Search rules'] = 'Criterios de búsqueda';
+$lang['Search tags'] = 'Buscar tags';
+$lang['Search'] = 'Buscar';
+$lang['display available tags'] = 'Ver tags disponibles';
+$lang['Since'] = 'Desde';
+$lang['Sort by'] = 'Clasificar por';
+$lang['Sort order'] = 'Orden de clasificación';
+$lang['Tag'] = 'Etiqueta';
+$lang['Tags'] = 'Etiquetas';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'El flujo RSS notifica eventos de la galería: imágenes nuevas, categorías actualizadas, nuevos comentarios de usuarios. Debe usarse con un lector de flujos RSS.';
+$lang['Unknown feed identifier'] = 'Identificador de flujo desconocido';
+$lang['User comments'] = 'Comentarios de usuario';
+$lang['Username'] = 'Nombre de usuario';
+$lang['Visits'] = 'Visitas';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Semane %d';
+$lang['About Piwigo'] = 'Acerca de Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Acceso denegaso';
+$lang['add this photo to your favorites'] = 'agregar esta imagen a sus favoritos';
+$lang['Administration'] = 'Administración';
+$lang['all'] = 'todo';
+$lang['ascending'] = 'creciente';
+$lang['author(s) : %s'] = 'autor(es) : %s';
+$lang['Expand all albums'] = 'Mostrar todas las categorías';
+$lang['posted after %s (%s)'] = 'a disposición después del %s (%s)';
+$lang['posted before %s (%s)'] = 'a disposición antes del %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'a disposición entre el %s (%s) y el %s (%s)';
+$lang['posted on %s'] = 'a disposición el %s';
+$lang['Best rated'] = 'Con mejor calificación';
+$lang['display best rated photos'] = 'mostrar las imágenes con mejor calificación';
+$lang['Calendar'] = 'Calendario';
+$lang['All'] = 'Todo';
+$lang['display each day with photos, month per month'] = 'mostrar año por año, mes por mes, día por día';
+$lang['View'] = 'Vista calendario';
+$lang['chronology_monthly_calendar'] = 'Calendario mensual';
+$lang['chronology_monthly_list'] = 'Lista mensual';
+$lang['chronology_weekly_list'] = 'Lista semanal';
+$lang['Click here if your browser does not automatically forward you'] = 'Haga clic acá si su navegador no lo redirige correctamente.';
+$lang['comment date'] = 'fecha del comentario';
+$lang['Comment'] = 'Comentario';
+$lang['Your comment has been registered'] = 'Su comentario ha sido grabado';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema anti-abuso: por favor espere antes de agregar otro comentario';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Su comentario no se grabó por infringir las reglas de aceptación';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un administrador debe comprobar su caomentario para que sea visible.';
+$lang['This login is already used by another user'] = 'Ya existe ese nombre de usuario';
+$lang['Comments'] = 'Comentarios';
+$lang['Add a comment'] = 'Agregar un comentario';
+$lang['created after %s (%s)'] = 'creada después del %s (%s)';
+$lang['created before %s (%s)'] = 'creada antes del %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'creada entre el %s (%s) y el %s (%s)';
+$lang['created on %s'] = 'creada el %s';
+$lang['Customize'] = 'Personalizar';
+$lang['Your Gallery Customization'] = 'Personalización de su interfaz gráfica ';
+$lang['day'][0] = 'Domingo';
+$lang['day'][1] = 'Lunes';
+$lang['day'][2] = 'Martes';
+$lang['day'][3] = 'Miércoles';
+$lang['day'][4] = 'Jueves';
+$lang['day'][5] = 'Viernes';
+$lang['day'][6] = 'Sábado';
+$lang['Default'] = 'Por defecto';
+$lang['delete this photo from your favorites'] = 'Borrar esta imagen de sus favoritos';
+$lang['Delete'] = 'Borrar';
+$lang['descending'] = 'decreciente';
+$lang['Download'] = 'descargar';
+$lang['Download this file'] = 'descargar este archivo';
+$lang['edit'] = 'editar';
+$lang['wrong date'] = 'fecha equivocada';
+$lang['excluded'] = 'excluídos';
+$lang['Your favorites'] = 'Mis favoritos';
+$lang['display your favorites photos'] = 'mostrar mis imágenes favoritas';
+$lang['Favorites'] = 'Favoritos';
+$lang['First'] = 'Primera página';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'La galería está cerrada por acuasa de mantenimiento. Por favor vuelva a visitarnos más tarde.';
+$lang['Page generated in'] = 'Página generada en ';
+$lang['guest'] = 'visitante';
+$lang['Hello'] = '¡Hola!';
+$lang['available for administrators only'] = 'sólo disponible para administradores';
+$lang['display this album'] = 'muestra las imágenes a la raíz de esta categoría';
+$lang['display last user comments'] = 'Ver los últimos comentarios de usuarios';
+$lang['customize the appareance of the gallery'] = 'personalizar la apariencia de la galería';
+$lang['search'] = 'búsqueda';
+$lang['Home'] = 'Inicio';
+$lang['Identification'] = 'Identificación';
+$lang['in this album'] = 'en esta categoría';
+$lang['in %d sub-album'] = 'en %d sub-categoría';
+$lang['in %d sub-albums'] = 'en %d sub-categorías';
+$lang['included'] = 'incluídos';
+$lang['Invalid password!'] = 'Contraseña incorrecta!';
+$lang['Language'] = 'Idioma';
+$lang['last %d days'] = '%d últimos días';
+$lang['Last'] = 'Última';
+$lang['Logout'] = 'Desconectarse';
+$lang['obligatory'] = 'obligatorio';
+$lang['Maximum photo height'] = 'Altura máxima de las imágenes';
+$lang['Maximum height must be a number superior to 50'] = 'La altura de las imágenes debe ser superior a 50';
+$lang['Maximum photo width'] = 'Ancho máximo de las imágenes';
+$lang['Maximum width must be a number superior to 50'] = 'El ancho de las imágenes debe ser superior a 50';
+$lang['display a calendar by creation date'] = 'mostrar un calendario por fecha de creación';
+$lang['display all photos in all sub-albums'] = 'mostrar de plano los elementos de categorías y sub-categorías';
+$lang['return to normal view mode'] = 'volver a la apariencia inicial';
+$lang['display a calendar by posted date'] = 'mostrar un calendario por fecha de agregado';
+$lang['month'][10] = 'Octubre';
+$lang['month'][11] = 'Noviembre';
+$lang['month'][12] = 'Diciembre';
+$lang['month'][1] = 'Enero';
+$lang['month'][2] = 'Febrero';
+$lang['month'][3] = 'Marzo';
+$lang['month'][4] = 'Abril';
+$lang['month'][5] = 'Mayo';
+$lang['month'][6] = 'Junio';
+$lang['month'][7] = 'Julio';
+$lang['month'][8] = 'Agosto';
+$lang['month'][9] = 'Septiembre';
+$lang['Most visited'] = 'Las más vistas';
+$lang['display most visited photos'] = 'mostrar las imágenes más vistas';
+$lang['The number of photos per page must be a not null scalar'] = 'La cantidad de imágenes por página debe ser un número entero superior a cero';
+$lang['Number of photos per page'] = 'Cantidad de diapositivas por página';
+$lang['Unknown identifier'] = 'Identificador desconocido';
+$lang['New password'] = 'Nueva contraseña';
+$lang['Rate this photo'] = 'Votar esta imagen';
+$lang['Next'] = 'Siguiente';
+$lang['no rate'] = 'sin calificar';
+$lang['Photos posted within the last %d day.'] = 'Se han filtrado los elementos para mostrar sólo los recientes de menos de %d día.';
+$lang['Photos posted within the last %d days.'] = 'Se han filtrado los elementos para mostrar sólo los recientes de menos de %d días.';
+$lang['password updated'] = 'contraseña actualizada';
+$lang['Recent period must be a positive integer value'] = 'El período debe ser un número entero positivo';
+$lang['photo'] = 'imagen';
+$lang['Click on the photo to see it in high definition'] = 'Haga clic en la imagen para verla en alta resolución';
+$lang['Show file metadata'] = 'Mostrar los meta-datos del archivo';
+$lang['Powered by'] = 'Puesto en página por';
+$lang['Preferences'] = 'Preferencias';
+$lang['Previous'] = 'Página anterior';
+$lang['Random photos'] = 'Imágenes al azar';
+$lang['display a set of random photos'] = 'mostrar un conjunto aleatorio de imágenes';
+$lang['Recent albums'] = 'Categorías recientes';
+$lang['display recently updated albums'] = 'mostrar las categorías creadas o actualizadas recientemente';
+$lang['Recent period'] = 'Período reciente';
+$lang['Recent photos'] = 'Imágenes recientes';
+$lang['display most recent photos'] = 'mostrar las imágenes más recientes';
+$lang['Redirection...'] = 'Redirección...';
+$lang['Please, enter a login'] = 'Por favor, ingrese su nombre de usuario';
+$lang['login mustn\'t end with a space character'] = 'el nombre de usuario no debe terminarse por un espacio';
+$lang['login mustn\'t start with a space character'] = 'el nombre de usuario no debe empezar por un espacio';
+$lang['this login is already used'] = 'ese nombre de usuario ya existe';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'la dirección de correo electrónico debe tener esta forma: xxx@yyy.eee (ejemplo : jack@altern.org)';
+$lang['please enter your password again'] = 'Por favor vuelva a ingresar su contraseña';
+$lang['Auto login'] = 'Connexión automática';
+$lang['remove this tag from the list'] = 'borrar este tag de la lista';
+$lang['representative'] = 'Representante';
+$lang['Search for Author'] = 'Buscar un autor';
+$lang['Search in albums'] = 'Buscar en las categorías';
+$lang['Search by date'] = 'Buscar por fecha';
+$lang['Date'] = 'Fecha';
+$lang['End-Date'] = 'Fecha fin';
+$lang['Kind of date'] = 'Tipo de fecha';
+$lang['Search for words'] = 'Buscar por palabras clave';
+$lang['Search for all terms'] = 'Buscar todas las palabras';
+$lang['Search for any term'] = 'Buscar una de las palabras';
+$lang['Empty query. No criteria has been entered.'] = 'Búsqueda vacía: no ha sido indicado ningún criterio.';
+$lang['Search results'] = 'Resultados de la búsqueda';
+$lang['Search in sub-albums'] = 'Buscar en sub-categorías';
+$lang['searched words : %s'] = 'palabras buscadas : %s';
+$lang['Contact'] = 'Contacto';
+$lang['set as album representative'] = 'Elegir como representante de esta categoría';
+$lang['Show number of comments'] = 'Mostrar la cantidad de comentarios';
+$lang['Show number of hits'] = 'Mostrar la cantidad de visualizaciones';
+$lang['slideshow'] = 'Proyección';
+$lang['stop the slideshow'] = 'detener la proyección';
+$lang['Specials'] = 'Especiales';
+$lang['SQL queries in'] = 'pedidos SQL en';
+$lang['display only recently posted photos'] = 'mostrar sólo los elementos recientes';
+$lang['return to the display of all photos'] = 'volver a mostrar todos los elementos';
+$lang['the beginning'] = 'principio';
+$lang['Interface theme'] = 'Tema de la interfaz';
+$lang['Thumbnails'] = 'Diapositivas';
+$lang['Menu'] = 'Menú';
+$lang['A comment on your site'] = 'Hay un comentario en el sitio';
+$lang['today'] = 'hoy';
+$lang['Update your rating'] = 'Actualizar su calificación';
+$lang['the username must be given'] = 'falta el nombre de usuario';
+$lang['useful when password forgotten'] = 'útil en caso de contraseña olvidada';
+$lang['Quick search'] = 'Búsqueda rápida';
+$lang['Connected user: %s'] = 'Usuario conectado: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Navegador: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Comentario: %s';
+$lang['Comment by %s'] = 'Comentario por %s';
+$lang['User: %s'] = 'Usuario: %s';
+$lang['Email: %s'] = 'Correo electrónico: %s';
+$lang['Admin: %s'] = 'Administración: %s';
+$lang['Registration of %s'] = 'Registro de %s';
+$lang['Album: %s'] = 'Categoría: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'El estatuto de usuario "huésped" no corresponde, se utilizará el estatuto por defecto. Por favor avísele al webmaster.';
+$lang['this email address is already in use'] = 'ya existe un usuario con esa misma dirección de correo electrónico';
+$lang['Album results for'] = 'Resultados de categorías para';
+$lang['Tag results for'] = 'Resultados de tags para';
+$lang['from %s to %s'] = 'del %s al %s';
+$lang['Play of slideshow'] = 'Lectura de la proyección';
+$lang['Pause of slideshow'] = 'Pausa de la proyección';
+$lang['Repeat the slideshow'] = 'Repetir la proyección';
+$lang['Not repeat the slideshow'] = 'No repetir la proyección';
+$lang['Reduce diaporama speed'] = 'Disminuir la velocidad de proyección';
+$lang['Accelerate diaporama speed'] = 'Acelerar la velocidad de proyección';
+$lang['Submit'] = 'Enviar';
+$lang['Yes'] = 'Sí';
+$lang['No'] = 'No';
+$lang['%d photo']='%d imagen';
+$lang['%d photos']='%d imágenes';
+$lang['%d photo is also linked to current tags'] = '%d imagen también está relacionada con los tags actuales';
+$lang['%d photos are also linked to current tags'] = '%d imágenes también están relacionadas con los tags actuales';
+$lang['display photos linked to this tag'] = 'Ver únicamente las imágenes relacionadas a ese tag';
+$lang['photos posted during the last %d days'] = 'imágenes agregadas los últimos días';
+$lang['Piwigo Help'] = 'Ayuda de Piwigo';
+$lang['Rank'] = 'Rango';
+$lang['group by letters'] = 'reagrupar por letras';
+$lang['letters'] = 'letras';
+$lang['show tag cloud'] = 'mostrar la nube de tags';
+$lang['cloud'] = 'nube';
+$lang['Reset to default values'] = 'Resetear a los valores por defecto';
+$lang['delete all photos from your favorites'] = 'borrar todas las imágenes de tus favoritos';
+$lang['Sent by'] = 'Enviado por';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Tu navegador web bloquea las cookies o no las sopporta. Para conectarse es necesario activar las cookies.';
+$lang['Edit a comment'] = 'Editar un comentario';
+$lang['Are you sure?'] = 'Seguro?';
+$lang['(!) This comment requires validation'] = '(!) Este comentario necesita ser aprobado';
+$lang['Welcome'] = 'Bienvenida';
+$lang['Welcome to your Piwigo photo gallery!'] = '¡Bienvenido/a a tu galería de fotos Piwigo!';
+$lang['... or browse your empty gallery'] = '... o navegá por tu galería vacía';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... o desactivá este mensaje, me las voy a arreglar solo';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hola %s, ¡tu galería de fotos está vacía!';
+$lang['I want to add photos'] = 'Quiero agregar fotos';
+$lang['Manage this user comment: %s'] = 'Administrar este comentario: %s';
+$lang['This author modified following comment:'] = 'Este autor modificó el comentario siguiente:';
+$lang['This author removed the comment with id %d'] = 'Este autor suprimió el comentario identificado como %d';
+$lang['%d rates'] = '%d calificaciones';
+$lang['Change my password'] = 'Cambiar mi contraseña';
+$lang['Check your email for the confirmation link'] = 'Consultá tu correo para el enlace de confirmación';
+$lang['Edit'] = 'Editar';
+$lang['Enter your new password below.'] = 'Escribí tu nueva contraseña.';
+$lang['EXIF Metadata'] = 'Metadatos EXIF';
+$lang['Hello %s,'] = 'Hola %s,';
+$lang['html tags are not allowed in login'] = 'no se permiten etiquetas HTML en el inicio de sesión';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Si esto fue un error, ignorá este mensaje y no pasará nada';
+$lang['Invalid key'] = 'clave no válida';
+$lang['Invalid username or email'] = 'nombre de usuario inválido o dirección de correo equivocada';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Password reset is not allowed for this user'] = 'No se permite el restablecimiento de la contraseña para este usuario';
+$lang['Password Reset'] = 'Restablecimiento de la contraseña';
+$lang['Please enter your username or email address.'] = 'Por favor, ingresá tu nombre de usuario o dirección de correo electrónico.';
+$lang['Rating score'] = 'Valoración de resultados';
+$lang['Return to home page'] = 'Volver a la página de inicio';
+$lang['Send my connection settings by email'] = 'Enviar mis opciones de conexión por correo electrónico';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Alguien pidió que se restablezca la contraseña para la cuenta del usuario siguiente';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Has sido registrado con éxito, pronto recibirás un correo electrónico con la configuración de tu conexión. ¡Bienvenido! ¡Bienvenida!';
+$lang['The passwords do not match'] = 'Las contraseñas no coinciden';
+$lang['To reset your password, visit the following address:'] = 'Para restablecer tu contraseña, visitá la dirección siguiente:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'El usuario "%s" no tiene correo electrónico, imposible restablecer la contraseña';
+$lang['Username "%s" on gallery %s'] = 'El nombre de usuario "%s" en la galería %s';
+$lang['Username or email'] = 'Nombre de uauario o dirección de correo electrónico';
+$lang['Username modification'] = 'Modificación del nombre de usuario';
+$lang['You will receive a link to create a new password via email.'] = 'Recibirás un enlace para crear una nueva contraseña por correo electrónico.';
+$lang['Your username has been successfully changed to : %s'] = 'Tu nombre de usuario fue cambiado con éxito por el siguiente: %s';
+$lang['Your password has been reset'] = 'Tu contraseña ha sido restablecida';
+$lang['IPTC Metadata'] = 'Metadatos IPTC';
+$lang['square'] = 'Cuadrado';
+$lang['thumb'] = 'Miniatura';
+$lang['small'] = 'Pequeño';
+$lang['medium'] = 'Mediano';
+$lang['large'] = 'Grande';
+$lang['xlarge'] = 'Muy grande';
+$lang['xxlarge'] = 'Enorme';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Gracias por registrarse en %s!';
+$lang['Here are your connection settings'] = 'Estos son tus ajustes de conexión';
+$lang['Password: %s'] = 'Contraseña: %s';
+$lang['Username: %s'] = 'Nombre de usuario: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Si recibiste este correo por error, contactanos en %s';
+$lang['Photo sizes'] = 'Tamaños de foto';
+$lang['Show oldest comments first'] = 'Mostrar primero los comentarios más antiguos';
+$lang['Show latest comments first'] = 'Mostrar primero el último comentario';
+$lang['View in'] = 'Ver en';
+$lang['Mobile'] = 'Móvil';
+$lang['Desktop'] = 'Escritorio';
+$lang['2small'] = 'XXS - diminuto';
+$lang['xsmall'] = 'XS - muy pequeño';
+$lang['File name, A &rarr; Z'] = 'Nombre de archivo, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nombre de archivo, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Título de la foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Título de la foto, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Fecha de creación, más reciente &rarr; más antigua';
+$lang['Date created, old &rarr; new'] = 'Fecha de creación, más antigua &rarr; más reciente';
+$lang['Date posted, new &rarr; old'] = 'Fecha de publicación, más reciente &rarr; más antigua';
+$lang['Date posted, old &rarr; new'] = 'Fecha de publicación, más antigua &rarr; más reciente';
+$lang['Rating score, high &rarr; low'] = 'Puntuación, mayor &rarr; menor';
+$lang['Rating score, low &rarr; high'] = 'Puntuación, menor &rarr; mayor';
+$lang['Visits, high &rarr; low'] = 'Visitas, alta &rarr; baja';
+$lang['Visits, low &rarr; high'] = 'Visitas, baja &rarr; alta';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identificador numérico, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identificador numérico, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Orden manual';
+
+?>
Index: tags/2.4.0RC3/language/es_AR/index.php
===================================================================
--- tags/2.4.0RC3/language/es_AR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_AR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/es_AR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/es_AR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/es_AR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Argentina [AR]
Index: tags/2.4.0RC3/language/es_ES/about.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/about.html	(revision 14585)
@@ -0,0 +1,17 @@
+<p>Esta galeria foto esta basada en Piwigo</p>
+
+<p>Piwigo es un programa de galeria foto para la web, desarollado por una comunidad activa de 
+usuarios y desarolladores. Las  extensiones hacen que Piwigo sea facilmente personalisable. 
+Ginda sobre el pastel, Piwigo es libre y gratis.</p><p id="linkToPiwigo"><a href="http://es.piwigo.org">Visita el sitio web de Piwigo</a></p> 
+
+<p>La traducción al español de Piwigo esta mantenida por :
+
+  <ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=4937">AM</a></li>
+		<li><a href="http://fr.piwigo.org/forum/profile.php?id=16626">crazydark</a></li>
+		<li><a href="http://fr.piwigo.org/forum/profile.php?id=5339">jpr928</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=15900">opinador</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=15398">petaqui</a></li>
+	</ul>
+	...Gracias a ellos</p>
+  
Index: tags/2.4.0RC3/language/es_ES/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/admin.lang.php	(revision 14585)
@@ -0,0 +1,897 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d asociación';
+$lang['%d associations'] = '%d asociaciones';
+$lang['%d album including'] = '%d incluidos en el álbum';
+$lang['%d albums including'] = '%d incluidos en los álbumes';
+$lang['%d physical'] = '%d físico';
+$lang['%d physical'] = '%d físicos';
+$lang[' and %d virtual'] = ' y %d virtuales.';
+$lang[' and %d virtual'] = ' et %d virtuales';
+$lang['%d album moved'] = '%d álbum movido';
+$lang['%d albums moved'] = '%d álbumes movidos';
+$lang['%d group'] = '%d grupo';
+$lang['%d groups'] = '%d grupos';
+$lang['%d member'] = '%d miembro';
+$lang['%d members'] = '%d miembros';
+$lang['%d tag'] = '%d etiqueta';
+$lang['%d tags'] = '%d etiquetas';
+$lang['%d user comment rejected'] = '%d comentario de usuario rechazado';
+$lang['%d user comments rejected'] = '%d comentarios de usuarios rechazados';
+$lang['%d user comment validated'] = '%d comentario de usuario validado';
+$lang['%d user comments validated'] = '%d comentarios de usuarios validados';
+$lang['%d user deleted'] = '%d usuario borrado';
+$lang['%d users deleted'] = '%d usuarios borrados';
+$lang['%d user'] = '%d usuario';
+$lang['%d users'] = '%d usuarios';
+$lang['%d waiting for validation'] = '%d en espera de aprobación';
+$lang['Actions'] = 'Acciones';
+$lang['Activate'] = 'Activar';
+$lang['Add/delete a permalink'] = 'Añadir / borrar un enlace permanente';
+$lang['Add a tag'] = 'Añadir una etiqueta';
+$lang['Add a user'] = 'Añadir un usuario';
+$lang['Add group'] = 'Añadir un grupo';
+$lang['Add'] = 'Subir';
+$lang['Allow user registration'] = 'Permitir el registro de usuarios';
+$lang['Apply to sub-albums'] = 'Aplicar a los sub-álbumes';
+$lang['Associated'] = 'Asociada a';
+$lang['Caddie management'] = 'Gestión del carrito';
+$lang['Caddie'] = 'Carrito';
+$lang['Albums authorized thanks to group associations'] = 'Álbum disponible por partenecer al grupo';
+$lang['Album manual order was saved'] = 'El orden manual de los albumes se guardó con exito';
+$lang['Check for upgrade failed for unknown reasons.'] = 'La comprobación de la última versión sobre el servidor fue fallida por una razón desconocida.';
+$lang['Check for upgrade'] = 'Comprobar si hay una actualización';
+$lang['Comments for all'] = 'Comentarios para todos';
+$lang['Current name'] = 'Nombre actual';
+$lang['Database'] = 'Base de datos';
+$lang['Deactivate'] = 'Desactivar';
+$lang['Delete Representant'] = 'Suprimir al representante';
+$lang['Delete selected tags'] = 'Suprimir las etiquetas seleccionadas';
+$lang['Delete selected users'] = 'Suprimir los usuarios seleccionados';
+$lang['Deletions'] = 'Supresiones';
+$lang['Deny selected groups'] = 'Prohibir el acceso a los grupos seleccionados';
+$lang['Deny selected users'] = 'Prohibirles el acceso a los usuarios seleccionados';
+$lang['Description'] = 'Descripción';
+$lang['Display options'] = 'Opciones de visualización';
+$lang['Dissociated'] = 'Separada de';
+$lang['Does not represent'] = 'No representa';
+$lang['Email admins when a new user registers'] = 'Notificar a los administradores en el momento de inscripción de un usuario';
+$lang['Email admins when a valid comment is entered'] = 'Notificar a los administradores cuando un comentario es registrado';
+$lang['Email admins when a comment requires validation'] = 'Notificar a los administradores cuando un comentario requiere su validación';
+$lang['Environment'] = 'Entorno';
+$lang['Form'] = 'Formulario';
+$lang['Gallery title'] = 'Título de la galería';
+$lang['Grant selected groups'] = 'Dar acceso a los grupos seleccionados';
+$lang['Grant selected users'] = 'Darles acceso a los usuarios seleccionados';
+$lang['Group name'] = 'Nombre del grupo';
+$lang['Groups'] = 'Grupos';
+$lang['Guests'] = 'Invitados';
+$lang['History'] = 'histórico';
+$lang['Informations'] = 'Informaciones';
+$lang['Install'] = 'Instalar';
+$lang['Link all album photos to a new album'] = 'Asociar todas las fotos del álbum a un nuevo álbum';
+$lang['Link all album photos to some existing albums'] = 'Asociar  todas las fotos del álbum a los álbumes existentes';
+$lang['Linked albums'] = 'Álbumes asociados';
+$lang['Lock gallery'] = 'Bloquear la galería';
+$lang['Maintenance'] = 'Mantenimiento';
+$lang['Manage permissions for group "%s"'] = 'Administrar los permisos para el grupo "%s"';
+$lang['Manage permissions for user "%s"'] = 'Administrar los permisos para el usuario "%s"';
+$lang['Manage tags'] = 'Administrar las etiquetas';
+$lang['Members'] = 'Miembros';
+$lang['Metadata synchronized from file'] = 'Meta-datos sincronizadas a partir del fichero';
+$lang['Move albums'] = 'Mover los álbumes';
+$lang['Move'] = 'Mover';
+$lang['Name'] = 'Nombre';
+$lang['New name'] = 'Nuevo nombre';
+$lang['New parent album'] = 'Nuevo álbum superior';
+$lang['New tag'] = 'Nueva etiqueta';
+$lang['Number of comments per page'] = 'Número de comentarios por página';
+$lang['Number of rates'] = 'Número de notas';
+$lang['Number of thumbnails to create'] = 'Número de miniaturas que hay que crear';
+$lang['Only private albums are listed'] = 'Listado de los albumes privados';
+$lang['Operating system'] = 'Sistema operativo';
+$lang['Options'] = 'Opciones';
+$lang['Other private albums'] = 'Otros álbumes privados';
+$lang['Page banner'] = 'Banners de las páginas';
+$lang['Parent album'] = 'Álbum superior';
+$lang['Path'] = 'Ruta';
+$lang['Permalink'] = 'Enlace permanente';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'El enlace permanente %s se utilizo par elàlbum %s. Borrarlo del historico de los enlaces permanentes';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'El enlace permanente debe contener sólo carácteres entre " - zA-Z0-9 ", "-" o "_". No debe ser numérico o comenzar con un número seguido por "-"';
+$lang['Permalink %s is already used by album %s'] = 'El enlace permanente %s ya se utilizo par el àlbum %s';
+$lang['Permalink history'] = 'Histórico de los enlaces permanentes';
+$lang['Permalinks'] = 'Enlaces permanentes';
+$lang['Permission denied'] = 'Acceso prohibido';
+$lang['Permission granted thanks to a group'] = 'Acceso autorizado gracias a la pertenencia a los grupos';
+$lang['Permission granted'] = 'Acceso autorizado';
+$lang['Photo informations updated'] = 'Informaciones actualizada de la foto';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Posición';
+$lang['Preferences'] = 'Preferencias';
+$lang['Properties'] = 'Propiedades';
+$lang['Random photo'] = 'Al azar foto';
+$lang['Rate date'] = 'Fecha de notación';
+$lang['Rating by guests'] = 'Notación por los visitantes';
+$lang['Rating'] = 'Notación';
+$lang['Reject'] = 'Rechazar';
+$lang['Representant'] = 'Representante';
+$lang['Representation of albums'] = 'Représentacion de los àlbumes';
+$lang['Representative'] = 'Representante';
+$lang['Represents'] = 'Representa';
+$lang['Save order'] = 'Salvaguardar la orden';
+$lang['Save to permalink history'] = 'Salvaguardar en el histórico de los enlaces permanentes';
+$lang['Select at least one album'] = 'seleccionar al minimo un àlbum';
+$lang['Select at least one photo'] = "Seleccionar por lo menos una foto";
+$lang['Select at least one user'] = 'Seleccionar por lo menos a un usuario';
+$lang['Show info'] = 'Mostrar las informaciones';
+$lang['Site manager'] = 'Gestion de sitios';
+$lang['Status'] = 'Estatuto';
+$lang['Statistics'] = 'Estadísticas';
+$lang['Storage album'] = 'Album de almacenamiento';
+$lang['Sum of rates'] = 'Suma de las notas';
+$lang['Tag "%s" already exists'] = 'La etiqueta "%s" ya existe';
+$lang['Tag "%s" was added'] = 'La etiqueta "%s" ha sido añadida';
+$lang['Tag selection'] = 'Selección de las etiquetas';
+$lang['The %d following tags were deleted'] = 'Las %d etiquetas siguientes han sido suprimidas';
+$lang['Unable to check for upgrade.'] = 'Imposible conocer la última versión.';
+$lang['Uninstall'] = 'Desinstalar';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Utilizar la orden de selección de las fotos por defecto (definido en el fichero de configuración)';
+$lang['User comments validation'] = 'Validación de los comentarios de usuarios';
+$lang['Users'] = 'Usuarios';
+$lang['Validate'] = 'Validar';
+$lang['Validation'] = 'Validación';
+$lang['Version'] = 'Versión';
+$lang['Virtual albums to move'] = 'Albums virtuales para mover';
+$lang['Virtual album name'] = 'Nombre del àlbum virtual';
+$lang['Webmaster cannot be deleted'] = 'El webmestre no puede ser suprimido';
+$lang['You are running on development sources, no check possible.'] = 'Usted trabaja con las fuentes de desarrollo, imposible verificar la última versión.';
+$lang['You cannot delete your account'] = "Usted no puede suprimir su cuenta";
+$lang['You cannot move an album in its own sub album'] = 'No se puede mover un àlbum en  su proprio sub-àlbum';
+$lang['You need to confirm deletion'] = 'Usted debe confirmar la supresión';
+$lang['Associate to album'] = 'Asociar al álbum';
+$lang['associate to group'] = 'asociar con grupo';
+$lang['Authorized'] = 'Autorizados';
+$lang['Add a virtual album'] = 'Agregar un álbum virtual';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizar los usuarios a añadir comentarios a los álbumes seleccionados';
+$lang['The name of an album must not be empty'] = 'El nombre del àlbum no se puede quedar vacio';
+$lang['Lock albums'] = 'Bloquear los álbumes';
+$lang['Private'] = 'Album privado';
+$lang['Public'] = 'Album publico';
+$lang['Find a new representant by random'] = 'Encontrar a un nuevo representante al azar';
+$lang['Public / Private'] = 'Pública / Privada';
+$lang['Manage authorizations for selected albums'] = 'Administrar los permisos para los álbumes seleccionados';
+$lang['Virtual album added'] = 'Album virtual añadido';
+$lang['Virtual album deleted'] = 'Album virtual borrado';
+$lang['Access type'] = 'Tipo de acceso';
+$lang['Information data registered in database'] = 'Informacion registrada en la base de datos';
+$lang['Default display'] = 'Visualización por defecto';
+$lang['The gallery URL is not valid.'] = 'La dirección de la galería no es válida.';
+$lang['Main'] = 'Principal';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'El número de comentarios de usuarios por página debe ser comprendido entre 5 y 50.';
+$lang['Configuration'] = 'Configuración';
+$lang['confirm'] = 'Confirmar';
+$lang['Date'] = 'Del día ';
+$lang['delete album'] = 'Borrar el álbum';
+$lang['Dissociate from album'] = 'Separar del álbum';
+$lang['dissociate from group'] = 'Separar del grupo';
+$lang['Album updated successfully'] = 'Álbum actualizado con éxito.';
+$lang['photos per page'] = "Fotos por página";
+$lang['High definition enabled'] = 'Alta definición activado';
+$lang['File'] = 'Archivo';
+$lang['first photo added on %s'] = 'primera foto añadida %s';
+$lang['Forbidden'] = 'Prohibido';
+$lang['global mode'] = 'modo global';
+$lang['group "%s" added'] = 'grupo "%s" añadido';
+$lang['group "%s" deleted'] = 'grupo "%s" borrado';
+$lang['group "%s" updated'] = 'grupo "%s" actualizado';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'El nombre del grupo no debe contener "or \' y no debe estar vacío.';
+$lang['This name is already used by another group.'] = 'Este nombre es ya utilizado por otro grupo.';
+$lang['High definition'] = 'Alta definición';
+$lang['jump to album'] = 'Ir al álbum';
+$lang['jump to photo'] = "Ir a la foto";
+$lang['leave'] = 'dejar';
+$lang['Lock'] = 'Bloquear';
+$lang['Locked'] = 'Bloqueado';
+$lang['manage album photos'] = 'administrar las fotos del álbum';
+$lang['manage sub-albums'] = 'Administrar los sub-álbumes';
+$lang['Manage'] = 'Administrar';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Se sobrepaso el tiempo de ejecución, el tratamiento debe continuar [el Tiempo estimado: %d el segundo].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'El tiempo de preparación de la lista de los usuarios para el envío es limitado. Los otros usuarios no estan en una lista.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'El tiempo de envío del mails es limitado. Los otros envíos de mail han sido ignorados.';
+$lang['To send ?'] = '¿ Enviar?';
+$lang['Last send'] = 'Último envío';
+$lang['email'] = 'e-mail';
+$lang['User'] = 'Usuario';
+$lang['See you soon,'] = 'Hasta pronto,';
+$lang['Go to'] = 'Vaya a ';
+$lang['Hello'] = 'Hola ';
+$lang['New photos were added'] = 'Las nuevas fotos han sido añadidas';
+$lang['on'] = 'en ';
+$lang['between'] = 'entre el ';
+$lang['and'] = ' y ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Usted acaba de ser inscrito por el webmaster del sitio para recibir la notificación por mail.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Usted acaba de inscribirse para recibir la notificación por mail.';
+$lang['To subscribe'] = 'Para inscribirse';
+$lang['If you encounter problems or have any question, please send a message to'] = 'En caso de problemas o en caso de preguntas, enviar un mail a ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemas o de preguntas';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Usted acaba de ser dado de baja por el webmaster del sitio para recibir la notificación por mail.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Usted se ha dado de baja para no recibir mas la notificación por mail.';
+$lang[', click on'] = ', haga clic sobre ';
+$lang['To unsubscribe'] = 'Para darse de baja';
+$lang['With blank value, gallery title will be used'] = 'Sin valor, el título de la galería será utilizado';
+$lang['Notification'] = 'Notificación';
+$lang['Error when sending email to %s [%s].'] = 'Error en el envío del mail a %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Mail enviado a %s [%s].';
+$lang['%d mail was sent.'] = '%s mail ha sido enviado.';
+$lang['%d mails were sent.'] = '%s mails han sido enviados.';
+$lang['%d mail was not sent.'] = '%s mail no ha sido enviado.';
+$lang['%d mails were not sent.'] = '%s mails no han sido enviados.';
+$lang['No mail to send.'] = 'No hay ningún email por enviar.';
+$lang['There is no available subscribers to mail.'] = 'No hay ususario que notificar por mail.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Un ususario tiene que notificar si los nuevos elementos están disponibles para este ususario.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Puede que ningún ususario este inscrito (sólo el webmaster tiene acceso a esta pestaña).';
+$lang['No user to send notifications by mail.'] = 'Ningún ususario a quien enviar notificaciones por email.';
+$lang['New photos added'] = 'Nuevas fotos añadidas';
+$lang['Subscribe to notification by mail'] = 'Inscripción a la notificación por mail';
+$lang['Unsubscribe from notification by mail'] = 'Désinscription a la notificación por mail';
+$lang['Parameter'] = 'Parámetro';
+$lang['Continue processing treatment'] = 'Continuar el procesamiento';
+$lang['Complementary mail content'] = 'Contenido complementario del mail';
+$lang['Add detailed content'] = 'Añadir contenido detallado';
+$lang['Send mail as'] = 'Enviar el mail como';
+$lang['Send mail to users'] = 'Envío de mail a los ususarios';
+$lang['Send'] = 'Envío';
+$lang['Options'] = 'Opciones';
+$lang['Subscribed'] = 'Inscritos';
+$lang['Subscribe'] = 'Inscripción';
+$lang['Parameters'] = 'Parámetros';
+$lang['Select recipients'] = 'Selección de los envíos';
+$lang['Subscribe/unsubscribe users'] = 'Inscribir / dar de baja a los ususarios';
+$lang['Unsubscribed'] = 'Inscritos';
+$lang['%d parameter was updated.'] = '%d parámetro ha sido actualizado.';
+$lang['%d parameters were updated.'] = '%d parámetros han sido actualizados.';
+$lang['%d user was not updated.'] = '%d ususario no ha sido actualizado.';
+$lang['%d users were not updated.'] = '%d ususarios no han sido actualizados.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'El ususario %s [%s] ha sido suprimido por la lista de los inscritos.';
+$lang['User %s [%s] was added to the subscription list.'] = 'El ususario %s [%s] ha sido añadido a la lista de los inscritos.';
+$lang['%d user was updated.'] = '%d ususario ha sido actualizado.';
+$lang['%d users were updated.'] = '%d ususarios han sido actualizados.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'El ususario %s [%s] no ha sido suprimido por la lista de los inscritos.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'El ususario %s [%s] no ha sido añadido a la lista de los inscritos.';
+$lang['User %s [%s] added.'] = 'ususario %s [%s] añadido.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Cuidado, la inscripción o anulación de inscripción conlleva el envío de mails a los ususarios interesados';
+$lang['Send mail on HTML format'] = 'Enviar el mail al tamaño HTML';
+$lang['Include display of recent photos grouped by dates'] = "Incluir la visualización de las últimas fotos agrupadas por fechas";
+$lang['Available only with HTML format'] = 'Disponible únicamente en formato HTML';
+$lang['no write access'] = 'ningún acceso en escritura';
+$lang['Permissions'] = 'Permisos';
+$lang['private'] = 'Privacidad';
+$lang['public'] = 'público';
+$lang['Purge never used notification feeds'] = 'Purgar los flujos de notificación jamás utilizados';
+$lang['Purge sessions'] = 'Purgar las sesiones';
+$lang['randomly represented'] = 'Representando al azar';
+$lang['registration date'] = 'Fecha de registro';
+$lang['clean'] = 'limpiar';
+$lang['Create this site'] = 'Crear este sitio';
+$lang['test'] = 'probar';
+$lang['test this remote site'] = 'probar este sitio distante';
+$lang['remove tags'] = 'suprimir las etiquetas';
+$lang['Repair and optimize database'] = 'Reparar y optimizar la base de datos';
+$lang['selection'] = 'Selección';
+$lang['set to'] = 'Cambiarlo';
+$lang['singly represented'] = 'representante fijo';
+$lang['This site already exists'] = 'Este sitio ya existe';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Crear un nuevo sitio: (dar su URL hacia create_listing_file.php)';
+$lang['created'] = 'Creado';
+$lang['delete'] = 'suprimir';
+$lang['delete this site and all its attached elements'] = 'Suprimir este sitio y todas la informacion asociadas';
+$lang['an error happened'] = 'Ocurrió un error';
+$lang['Local'] = 'Local';
+$lang['Remote'] = 'Distante';
+$lang['update the database from files'] = 'actualizar la base de datos a partir de los ficheros';
+$lang['status'] = 'Estatuto';
+$lang['Directory'] = 'Directorio';
+$lang['sub-albums'] = 'sub-àlbumes';
+$lang['Synchronize metadata'] = 'Sincronizar los méta-datos';
+$lang['target'] = 'blanco';
+$lang['title'] = 'título';
+$lang['Album list management'] = 'Gestion de los álbumes';
+$lang['Piwigo configuration'] = 'Configuración de Piwigo';
+$lang['Group management'] = 'Gestión de los grupos';
+$lang['User list'] = 'Lista usuarios';
+$lang['Database synchronization with files'] = 'Sincronización de la base de datos a partir de los ficheros';
+$lang['all'] = 'todo';
+$lang['height must be a number superior to'] = 'La altura debe ser  un entero superior a';
+$lang['width must be a number superior to'] = 'La ancho debe ser un entero superior a';
+$lang['for the file format'] = 'para el formato de archivo';
+$lang['Photo unreachable or no support'] = 'foto inaccesible o  formato no soportado';
+$lang['GD version'] = 'versión de GD';
+$lang['General statistics'] = 'Estadísticas generales';
+$lang['average time'] = 'El tiempo medio';
+$lang['number of miniaturized photos'] = 'número de miniaturas creadas';
+$lang['total time'] = 'el tiempo total';
+$lang['for this file format'] = 'para este formato de archivo';
+$lang['unit mode'] = 'modo unitario';
+$lang['Unlocked'] = 'quitado el cierre';
+$lang['unset'] = 'Vaciar';
+$lang['Update albums informations'] = 'Actualizar las informaciones de los àlbumes';
+$lang['Update photos information'] = 'Actualizar las informaciones de las fotos';
+$lang['Synchronize'] = 'Sincronizar';
+$lang['reduce to single existing albums'] = 'Traitar solo un àlbum';
+$lang['Choose an option'] = 'Escoger una opción';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Mostrar toda la información (álbumes añadidos, fotos añadidas, álbumes y fotos borrados)';
+$lang['Error list'] = 'Lista errores';
+$lang['Errors caption'] = 'Leyenda de los errores';
+$lang['Detailed informations'] = 'Informaciones detalladas';
+$lang['File/directory read error'] = 'Error de abertura fichero / directorio';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'El fichero o el repertorio no puede ser accesible (o sea no existe, o sea el acceso esta negado)';
+$lang['albums deleted in the database'] = 'Álbumes borrados de la base de datos';
+$lang['photos deleted from the database'] = "fotos suprimidas de la base de datos";
+$lang['photos candidates for metadata synchronization'] = 'Fotos candidatas a la sincronización con los méta-datos';
+$lang['photos informations synchronized with files metadata'] = 'Informacion de las fotos sincronizadas con los méta-datos';
+$lang['errors during synchronization'] = 'hubo errores durante la sincronización';
+$lang['albums added in the database'] = 'Álbumes añadidos a la base de datos';
+$lang['photos added in the database'] = "fotos añadidas a la base de datos";
+$lang['photos updated in the database'] = "Fotos actualizadas en la base de datos";
+$lang['Search for new images in the directories'] = 'Buscar las nuevas imágenes en los repertorios';
+$lang['added'] = 'añadido';
+$lang['deleted'] = 'suprimido';
+$lang['Metadata synchronization results'] = 'Resultado de la sincronización de los meta-datos';
+$lang['only perform a simulation (no change in database will be made)'] = 'Únicamente simular (ningún cambio en la base de datos será efectuado)';
+$lang['Simulation'] = 'Simulación';
+$lang['directories + files'] = 'directorios + ficheros';
+$lang['only directories'] = 'únicamente directorios';
+$lang['synchronize files structure with database'] = 'sincronizar la estructura de los ficheros con la base de datos';
+$lang['synchronize files metadata with database photos informations'] = 'sincronizar las informaciones de las fotos en la base de datos a partir de los méta-datos de los ficheros';
+$lang['even already synchronized photos'] = 'tambien las fotos ya sincronizadas';
+$lang['Used metadata'] = 'Méta-datos empleados';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'El nombre de los repertorios y de los ficheros debe estar constituido sólo por letras, por cifras, de "-", "_" y "."';
+$lang['wrong filename'] = 'nombre de fichero erróneo';
+$lang['Upload'] = 'subir';
+$lang['user "%s" added'] = 'usuario "%s" añadido';
+$lang['User status'] = 'Estatuto del usuario';
+$lang['user_status_admin'] = 'Administrador';
+$lang['user_status_generic'] = 'Genérico';
+$lang['user_status_guest'] = 'Invitado';
+$lang['user_status_normal'] = 'Visitante';
+$lang['user_status_webmaster'] = 'Webmestre';
+$lang['Virtual album'] = 'Album virtual';
+$lang['Waiting'] = 'En espera';
+$lang['default'] = 'por defecto';
+$lang['Toggle \'default group\' property'] = 'Invertir la propiedad \'grupo por defecto\'';
+$lang['Advanced features'] = 'Funciones avanzadas';
+$lang['Overall'] = 'Vista global';
+$lang['Year'] = 'Año';
+$lang['Month'] = 'Mes';
+$lang['Day'] = 'Día';
+$lang['Pages seen'] = 'Páginas visitadas';
+$lang['Time'] = 'Hora';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Elemento';
+$lang['Section'] = 'sección';
+$lang['An information email was sent to group "%s"'] = 'Un mail de informacion ha sido enviado a los miembros del grupo "%s"';
+$lang['Send an information email to group members'] = 'Enviar un mail de informacion a los miembros de un grupo';
+$lang['Group'] = 'Grupo';
+$lang['[%s] Visit album %s'] = '[%s] Visitar el àlbum %s';
+$lang['Hello,'] = 'Hola,';
+$lang['See you soon.'] = 'Hasta pronto.';
+$lang['Discover album:'] = 'Descubrir el álbum:';
+$lang['Mail content'] = 'Contenido del email';
+$lang['none'] = 'Ninguno';
+$lang['high'] = 'alto';
+$lang['other'] = 'Otro';
+$lang['Element type'] = "Tipo de elemento";
+$lang['Image id'] = 'Identificador de la imagen';
+$lang['Summary'] = 'Resumen';
+$lang['%d line filtered'] = '%d línea filtrada';
+$lang['%d lines filtered'] = '%d Líneas filtradas';
+$lang['%d guest'] = '%d invitado';
+$lang['%d guests'] = '%d Invitados';
+$lang['Hour'] = 'Hora';
+$lang['guest'] = 'Invitado';
+$lang['default values'] = 'Valores por defecto';
+$lang['Guest cannot be deleted'] = 'No se puede borrar al invitado';
+$lang['Default user cannot be deleted'] = 'No se puede suprimir al usuario por defecto';
+$lang['Purge history detail'] = 'Vaciar el histórico';
+$lang['Purge history summary'] = 'Vaciar el sumario del histórico';
+$lang['Check integrity'] = 'Control de integridad';
+$lang['Anomaly'] = 'Anomalía';
+$lang['Correction'] = 'Corrección';
+$lang['Automatic correction'] = 'Corrección automática';
+$lang['Impossible automatic correction'] = 'Corrección automática imposible';
+$lang['Correction applied with success'] = 'Corrección realizada correctamente.';
+$lang['Correction applied with error'] = 'Corrección fallida.';
+$lang['%d anomaly has been detected.'] = '%d anomalía ha sido detectada.';
+$lang['%d anomalies have been detected.'] = '%d anomalías han sido detectadas.';
+$lang['%d anomaly has been corrected.'] = '%d anomalía ha sido corregida.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalías han sido corregidas.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalía no pudo ser corregida.';
+$lang['%d anomalies have not been corrected.'] = '%d anomalías no pudieron ser corregidas.';
+$lang['Go to %s or %s for more informations'] = 'Vaya sobre %s o %s para más informacion';
+$lang['the forum'] = 'El foro';
+$lang['the wiki'] = 'El wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'El valor %s no es correcto porque los datos Exif no están soportados';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s debe ser puesto a "false" en su fichero config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'El usuario "invitado" no existe.';
+$lang['Main "guest" user status is incorrect'] = 'El estado del usuario "invitado" principal es incorrecto';
+$lang['Default user does not exist'] = 'El usuario por defecto no existe';
+$lang['Main "webmaster" user does not exist'] = 'El usuario " webmaster " principal no existe';
+$lang['Main "webmaster" user status is incorrect'] = 'El estado del usuario " webmaster " es incorrecto';
+$lang['User "%s" created with "%s" like password'] = 'usuario "%s" creado con la contraseña "%s"';
+$lang['Status of user "%s" updated'] = 'Estatuto del usuario "%s" actualizado';
+$lang['add new photos to caddie'] = 'añadir nuevas fotos a la cesta';
+// --------- Starting below: New or revised $lang ---- from Butterfly (
+$lang['No display'] = 'Ninguna visualización';
+$lang['Classic display'] = 'Visualizacion clásica';
+$lang['Hoverbox display'] = 'Visualizacion en caja emergente';
+$lang['Mail address is obligatory for all users'] = 'La dirección de email es obligatoria para todos los usuarios';
+$lang['Minimum privacy level'] = 'Nivel mínimo de privacidad';
+$lang['Privacy level'] = 'Nivel de carácter confidencial';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contactos';
+$lang['Level 2'] = 'Amigos';
+$lang['Level 4'] = 'Familia';
+$lang['Level 8'] = 'Administradores';
+$lang['Reinitialize check integrity'] = 'Reinicializar los controles de integridad';
+$lang['Check all'] = 'Marcar todo';
+$lang['Uncheck all'] = 'Desmarcar todo';
+$lang['Check automatic corrections'] = 'Marcar las correcciones automáticas';
+$lang['Apply selected corrections'] = 'Aplicar las correcciones seleccionadas';
+$lang['Ignore selected anomalies'] = 'Ignorar las anomalías seleccionadas';
+$lang['Refresh'] = 'Refrescar';
+$lang['The anomaly will be ignored until next application version'] = 'La anomalía será ignorada hasta la versión próxima de la aplicación';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'La corrección de la anomalía anulará el hecho de que sea ignorada';
+$lang['%d anomaly has been ignored.'] = '%d anomalía ha sido ignorada.';
+$lang['%d anomalies have been ignored.'] = '%d anomalías han sido ignoradas.';
+$lang['Plugins which need upgrade'] = 'Plugins que necesita una actualizacion ';
+$lang['Plugin list'] = 'Lista plugins';
+$lang['Check for updates'] = 'Verificar las actualizaciones';
+$lang['Other plugins'] = 'Otros plugins disponible';
+$lang['Last revisions'] = 'Últimas revisiones';
+$lang['Are you sure you want to install this plugin?'] = '¿Esta seguro de querer instalar este plugin?';
+$lang['Are you sure you want to delete this plugin?'] = '¿Esta seguro de querer suprimir este plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = ' ¿ Esta seguro de querer instalar esta actualización? Debe comprobar que esta actualización no necesite una désinstalación previa del componente viejo.';
+$lang['Plugin has been successfully copied'] = 'El plugin ha sido copiado con éxito';
+$lang['You might go to plugin list to install and activate it.'] = 'Vaya a la lista de plugins para instalarlo y activarlo.';
+$lang['Can\'t create temporary file.'] = 'Imposible crear un fichero temporal.';
+$lang['Can\'t download archive.'] = 'Imposible recuperar el archivo.';
+$lang['Can\'t read or extract archive.'] = 'Imposible leer o extraer el archivo.';
+$lang['An error occured during extraction (%s).'] = 'Ocurrió un error durante la extracción de los ficheros (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Compruebe las autorizaciones del expediente " plugins " y de sus subexpedientes (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Imposible conectarse al servidor.';
+$lang['Purge compiled templates'] = 'purgar los templates compilados';
+$lang['ACCESS_0'] = 'Acceso libre';
+$lang['ACCESS_1'] = 'Acceso todos';
+$lang['ACCESS_2'] = 'Acceso registrados';
+$lang['ACCESS_3'] = 'Acceso administradores';
+$lang['ACCESS_4'] = 'Acceso webmaster';
+$lang['ACCESS_5'] = 'Ningún acceso';
+$lang['Support'] = 'Ayuda';
+$lang['Documentation'] = 'Documentación';
+$lang['A new version of Piwigo is available.'] = 'Una nueva versión de Piwigo está disponible.';
+$lang['Piwigo Administration'] = 'Administración de Piwigo';
+$lang['Piwigo version'] = 'Versión de Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Usted utiliza la última versión de Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'La versión de  %s [%s] instalada no es compatible con la versión requerida [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Usted debe actualizar su sistema para sacar plenamente provecho  de la aplicación si no la aplicación no funcionará correctamente, incluso en absoluto';
+$lang['Deleted on'] = 'Borrado el ';
+$lang['Last hit'] =  'Último acceso';
+$lang['GD library is missing'] = 'Falta la biblioteca GD';
+$lang['Templates'] = 'Templates (Modelos)';
+$lang['Extend for templates'] = 'Extender para los temas';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Sustitución del templates de origen por su templates adaptados por el expediente  template-extension';
+$lang['Replacers (customized templates)'] = 'Los sustitutos (templates modificados)';
+$lang['Original templates'] = 'Plantillas de origen';
+$lang['Optional URL keyword'] = 'Parámetro facultativo del URL';
+$lang['Templates configuration has been recorded.'] = 'La configuración del templates ha sido registrada.';
+$lang['All optimizations have been successfully completed.'] = 'Todas las optimizaciones han sido realizadas con éxito.';
+$lang['Optimizations have been completed with some errors.'] = 'Algunas optimizaciones se completaron con errores.';
+$lang['Modify information'] = 'Modificar la informacion';
+$lang['nothing'] = 'nada';
+$lang['overrides existing values with empty ones'] = 'Reemplazar los valores existentes con vacíos';
+$lang['Manage photo ranks'] = "Administrar el orden de las fotos";
+$lang['No photo in this album'] = 'Ninguna foto en este álbum';
+$lang['Images manual order was saved'] = 'El orden manual de las imágenes ha sido guardado';
+$lang['ranks'] = 'Filas';
+$lang['Drag to re-order'] = 'Hacer clic y arrastra para reorganizar';
+$lang['Quick Local Synchronization'] = 'Sincronización Rápida';
+$lang['No photo can be deleted'] = 'Ninguna foto puede ser suprimida';
+$lang['Delete selected photos'] = 'Suprimir las fotos seleccionadas';
+$lang['%d photo was deleted'] = '%d foto ha sido borrada';
+$lang['%d photos were deleted'] = '%d fotos han sido borradas';
+$lang['Downloads'] = 'Descargar';
+$lang['Released on'] = 'Añadido';
+$lang['Number of downloads'] = 'Número de descargas';
+$lang['Piwigo Announcements Newsletter'] = 'Boletín informativo Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Manténgase en contacto con el proyecto Piwigo, suscríbase al boletín de noticias. Usted recibirá un e-mail cuando una nueva versión esté disponible (a veces un bug de seguridad es corregido, es importante estar al tanto) o que un acontecimiento superior ocurra sobre el proyecto. Solamente serán algunos mensajes al año.';
+$lang['Subscribe %s'] = 'Abonar a la newsletter inglesa %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonar %s a la newsletter Piwigo';
+$lang['Purge search history'] = 'Purgar el historico de búsquedad';
+$lang['Hide'] = 'Esconder';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Sobrepasado el tiempo de ejecución, el procesamiento debe continuar [Tiempo estimado: %d secundas].';
+$lang['Operation in progress'] = 'Operación en progreso.';
+$lang['Please wait...'] = 'Por favor, espere...';
+$lang['Password is missing. Please enter the password.'] = 'La contraseña falta. Por favor, escoja la contraseña.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'La confirmación de la contraseña faltó. Por favor, confirme la contraseña elegida.';
+$lang['Allow users to edit their own comments'] = 'Autorizar a los usuarios a modificar sus propios comentarios';
+$lang['Allow users to delete their own comments'] = 'Autorizar a los usuarios a suprimir sus propios comentarios';
+$lang['Email administrators when a comment is modified'] = 'Notificar a los administradores cuando un comentario es modificado';
+$lang['Email administrators when a comment is deleted'] = 'Notificar a los administradores cuando un comentario es suprimido';
+$lang['Cannot delete the old permalink !'] = '¡Imposible suprimir este enlace permanente!';
+$lang['Hit'] = 'Acceso';
+$lang['Tools'] = 'herramientas';
+$lang['Photos'] = 'Fotos';
+$lang['Themes'] = 'Temas';
+$lang['Instructions to use Piwigo'] = 'Instrucciones para utilizar a Piwigo';
+$lang['Installed Themes'] = 'Temas instalados';
+$lang['Add New Theme'] = 'Añadir un tema';
+$lang['Forbid this theme to users'] = 'Prohibirles este tema a los usuarios';
+$lang['Set as default theme for unregistered and new users'] = 'Tema por defecto para los invitados y los nuevos usuarios';
+$lang['unknown'] = 'desconocido';
+$lang['Upload Photos'] = 'Agregar fotos';
+$lang['Drop into album'] = 'Arrastrar a un álbum';
+$lang['+ Add an upload box'] = '+ Añadir otra caja de transferencia';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Cree el directorio "%s" en la raíz de su instalación Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dé permisos de escritura (chmod 777) al directorio "%s"  en la raíz de su instalación Piwigo';
+$lang['existing album'] = 'Álbum existente';
+$lang['create a new album'] = 'crear un álbum nuevo';
+$lang['Album name'] = 'Nombre del álbum';
+$lang['Album "%s" has been added'] = 'el álbum "%s" se ha añadido';
+$lang['Uploaded Photos'] = 'Fotos añadidas';
+$lang['%d photos uploaded'] = '%d fotos añadidas';
+$lang['Privacy level set to "%s"'] = 'Nivel de confidencialidad "%s"';
+$lang['Album "%s" now contains %d photos'] = 'EL álbum "%s" ahora contiene %d fotos';
+$lang['Manage this set of %d photos'] = 'Administrar este lote de %d fotos';
+$lang['Select files'] = 'Escoger ficheros';
+$lang['Everybody'] = 'Todo el mundo';
+$lang['Who can see these photos?'] = '¿ Quién puede ver estas fotos?';
+$lang['Settings'] = 'Configuración';
+$lang['Resize'] = 'Redimensionar';
+$lang['Maximum Width'] = 'Ancho máxima';
+$lang['pixels'] = 'Píxeles';
+$lang['Maximum Height'] = 'Altura máxima';
+$lang['Image Quality'] = 'Calidad de la foto';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['Save Settings'] = 'Registrar los parámetros';
+$lang['Your configuration settings are saved'] = 'Sus parámetros de configuraciones son registrados';
+$lang['Active Themes'] = 'Temas activados';
+$lang['Add write access to the "%s" directory'] = 'Permitir escritura en la carpeta "%s"';
+$lang['Administration Home'] = 'Administración';
+$lang['Change Admin Colors'] = 'Modificar los colores de la administración';
+$lang['Delete this theme'] = 'Suprimir este tema';
+$lang['Directory does not exist'] = 'El directorio no existe';
+$lang['Download,'] = 'Descargar,';
+$lang['FTP + Synchronization'] = 'FTP + Sincronización';
+$lang['Get Support on Piwigo Forum'] = 'Conseguir la ayuda en el foro de Piwigo';
+$lang['Help Me'] = 'Ayuda';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Imposible activar el tema, falta el archivo %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Este tema no puede ser borrado, porque otros tema dependen de él: %s';
+$lang['Inactive Themes'] = 'Temas desactivadas';
+$lang['Install on your computer,'] = 'Instale en su ordenador,';
+$lang['Make this theme available to users'] = 'Volver este tema disponible para los usuarios';
+$lang['Page end'] = 'Fin de la página';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Leer la documentación Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Empiece pLoader y añada sus fotos.';
+$lang['Switch to clear or dark colors for administration'] = 'Elegir colores claros o sombríos como la administración';
+$lang['Theme has been successfully installed'] = 'El tema ha estado instalado con éxito';
+$lang['Visit Gallery'] = 'Visitar la galería';
+$lang['Visit Piwigo project website'] = 'Visitar el sitio Web del proyecto Piwigo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'PLoader significa <em>Piwigo Uploader</em>. Desde su ordenador, pLoader prepara sus fotos y los traslada hacia su galería foto Piwigo.';
+$lang['Guest Settings'] = 'Ajustes de los invitado';
+$lang['Main Page'] = 'Página principal';
+$lang['Photo Page'] = 'Página de la foto';
+$lang['Activate Navigation Bar'] = 'Activar la barra de navegación';
+$lang['Activate Navigation Thumbnails'] = 'Activar las miniaturas de navegación';
+$lang['Activate icon "%s"'] = 'Activado el icono "%s"';
+$lang['Photo Properties'] = 'Propiedades de la foto';
+$lang['Allow user customization'] = 'Permitir la personalización de la galería por el usuario';
+$lang['Languages'] = 'Idiomas';
+$lang['Installed Languages'] = 'Idiomas instaladas';
+$lang['Add New Language'] = 'Añadir un nuevo idioma';
+$lang['Language has been successfully installed'] = 'Se ha instalado con éxito el nuevo idioma';
+$lang['Select:'] = 'Seleccionar:';
+$lang['None'] = 'Nada';
+$lang['Invert'] = 'Invertir';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Imposible desactivar este tema, debe quedar por lo menos un tema activado.';
+$lang['Webmaster status is required.'] = 'Usted debe tener el status de "webmaster".';
+$lang['Bound Theme'] = 'Tema relacionado';
+$lang['Allow rating'] = 'Permitir las votaciones';
+$lang['Select at least one comment'] = 'Seleccione por lo menos un comentario';
+$lang['Active Plugins'] = 'Plugins activados';
+$lang['Inactive Plugins'] = 'Plugins desactivadas';
+$lang['Missing Plugins'] = 'Plugins ausentes';
+$lang['Uninstalled Plugins'] = 'Plugins no instalados';
+$lang['By %s'] = 'Para %s';
+$lang['Visit plugin site'] = 'Visite la sitio del plugin';
+$lang['Active Languages'] = 'Idiomas activados';
+$lang['Delete this language'] = 'Suprimir este idioma';
+$lang['Forbid this language to users'] = 'Prohibirles este idioma a los usuarios';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Imposible desactivar este idioma, debe definir otro idioma por defecto primero.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Imposible desactivar este idioma, se necesita al menos un idioma.';
+$lang['Inactive Languages'] = 'Idiomas desactivadas';
+$lang['Make this language available to users'] = 'Volver este idioma disponible para los usuarios';
+$lang['Set as default language for unregistered and new users'] = 'Idioma por defecto para los invitados y los nuevos usuarios';
+$lang['Miscellaneous'] = 'Mas informacion';
+$lang['Virtual Links'] = 'Enlaces virtuales';
+$lang['Add Photos'] = 'Añadir fotos';
+$lang['The following tag was deleted'] = 'La etiquetas siguiente ha sido suprimida';
+$lang['There is no other language available.'] = 'No hay otra idiomaa disponible';
+$lang['There is no other plugin available.'] = 'No hay otra plugin disponible';
+$lang['There is no other theme available.'] = 'No hay otra thema disponible';
+$lang['By rank'] = 'Por ranking';
+$lang['Manual order'] = 'Orden manual';
+$lang['Add another set of photos'] = 'Añadir unas fotos nuevas';
+$lang['Order of menubar items has been updated successfully.'] = 'El orden de los elementos del menú ha sido actualizada con éxito.';
+$lang['This theme was not designed to be directly activated'] = 'Este tema no es concebido por ser acelerado directamente';
+$lang['Who can see this photo?'] = '¿Quien puede ver esta foto?';
+$lang['Pending Comments'] = 'Comentarios pendientes';
+$lang['Menu Management'] = 'Administración del menú';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'En el archivo php.ini, la variable upload_max_filesize (% SB) es mayor que post_max_size (SB%), debe cambiar esta configuración';
+$lang['Exif extension not available, admin should disable exif use'] = 'La extension Exif no esta disponible, un administrador deberia deshabilitar el uso de metadatos Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'El peso del archivo subido excede el valor de upload_max_filesize en el archivo php.ini: sB%';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'El peso total de los archivos transferidos excede el valor de post_max_size en su archivo php.ini: sB%';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'El peso del archivo subido excede el MAX_FILE_SIZE definido en el formulario HTML';
+$lang['The uploaded file was only partially uploaded'] = 'El archivo fue sólo parcialmente subido';
+$lang['No file was uploaded'] = 'Ningun fichero ha sido subido';
+$lang['Missing a temporary folder'] = 'No se puede encontrar el directorio temporal';
+$lang['Failed to write file to disk'] = 'No se pudo escribir el archivo en el servidor';
+$lang['File upload stopped by extension'] = 'La transferencia de archivos fue detenido por una extensión';
+$lang['Unknown upload error'] = 'Error desconocido durante la transferencia';
+$lang['Error on file "%s" : %s'] = 'Error en el archivo "%s" : %s';
+$lang['automatic order'] = 'orden automático';
+$lang['manual order'] = 'orden manual';
+$lang['Albums automatically sorted'] = 'Las categorías han sido clasificadas automaticamente';
+$lang['Batch Manager'] = 'Gestor por lote';
+$lang['include child albums'] = 'Incluir los sub-albumes';
+$lang['Selection'] = 'Selección';
+$lang['Action'] = 'Acción';
+$lang['Set author'] = 'Definir el autor';
+$lang['Set title'] = 'Definir el titulo';
+$lang['Set creation date'] = 'Establecer la fecha de creación';
+$lang['Apply action'] = 'Aplicar la acción';
+$lang['on the %d selected photos'] = 'en las %d fotos seleccionadas';
+$lang['%d of %d photos selected'] = '%d fotos sobre %d estan selecciónadas';
+$lang['No photo selected, %d photos in current set'] = 'Ninguna foto selecciónada entre las %d fotos del lote';
+$lang['All %d photos are selected'] = 'Todas las %d fotos del lote han sido seleccionadas';
+$lang['remove this filter'] = 'eliminar este filtro';
+$lang['Duplicates'] = 'Duplicados';
+$lang['Add a filter'] = 'Agregar un filtro';
+$lang['Remove all filters'] = 'Eliminar todos los filtros';
+$lang['Refresh photo set'] = 'Actualizar el lote de fotos';
+$lang['The whole page'] = 'Página entera';
+$lang['The whole set'] = 'La totalidad del lote';
+$lang['No photo in the current set.'] = 'No hay imagen en el lote.';
+$lang['No photo selected, no action possible.'] = 'No hay foto seleccionada, no hay acción posible.';
+$lang['Choose an action'] = 'Seleccione una acción';
+$lang['remove author'] = 'eliminar el autor';
+$lang['Type here the author name'] = 'Escriba el nombre del autor';
+$lang['remove title'] = 'eliminar el título';
+$lang['Type here the title'] = 'Introduzca el título aquí';
+$lang['remove creation date'] = 'eliminar la fecha de creación';
+$lang['Album photos associated to the following albums: %s'] = 'Las fotos del álbum se han asociado con los àlbumes sigientes: %s';
+$lang['Delete orphan tags'] = 'Eliminar las etiquetas huerfanas ';
+$lang['delete photo'] = 'Eliminar la foto';
+$lang['Orphan tags deleted'] = 'Etiquetas huerfanas eliminadas';
+$lang['Week starts on'] = 'La semana empieza el';
+$lang['You have %d orphan tags: %s.'] = 'Tiene %d etiquetas huerfanas: %s.';
+$lang['Remove from caddie'] = 'Eliminar de la cesta';
+$lang['Themes which need upgrade'] = 'Temas por actualizar';
+$lang['Languages which need upgrade'] = 'Idiomas por actualizar';
+$lang['All themes are up to date.'] = 'Todos los temas están actualizados.';
+$lang['All plugins are up to date.'] = 'Todos los plugins están actualizados.';
+$lang['All languages are up to date.'] = 'Todos los idiomas están actualizados.';
+$lang['Visit theme site'] = 'Visita el sitio web del tema';
+$lang['Visit language site'] = 'Visita el sitio web del idioma';
+$lang['New Version'] = 'Nueva version';
+$lang['Obsolete Plugins'] = 'Estos plugins están obsoletos';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ADVERTENCIA! Este plugin no parece ser compatible con esta versión de Piwigo.';
+$lang['Do you want to activate anyway?'] = '¿Quiere activarlo de todos modos?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ESTE PLUGIN ES AHORA PARTE DEL CORE DE PIWIGO! PUEDE DESINSTALARLO AHORA! ';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERROR: Este plugin FALTA PERO ESTÁ INSTALADO! DESINSTALAR YA!.';
+$lang['Thumbnails generation in progress...'] = 'Generación de las miniaturas en curso...';
+$lang['Photos generation in progress...'] = 'Generación de las fotos en curso...';
+$lang['%s photos have been regenerated'] = '%s fotos fueron regeneradas.';
+$lang['%s photos can not be regenerated'] = '%s fotos no pueden ser regeneradas';
+$lang['display'] = 'Visualizar';
+$lang['Type in a search term'] = 'Introduce un término de búsqueda';
+$lang['new'] = 'nuevo';
+$lang['No results'] = 'Sin resultados';
+$lang['Searching...'] = 'Buscar...';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activar el icono "nuevo" al lado de álbumes y fotos';
+$lang['Add a criteria'] = 'Añadir un criterio';
+$lang['Deactivate all'] = 'Desactivar todo';
+$lang['Default photos order'] = 'Orden de las fotos por defecto';
+$lang['Restore'] = 'Restorar';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaurar la configuración por defecto. Usted perderá su configuración de plug-in!';
+$lang['Show menubar'] = 'Mostrar barra de menú';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'No se puede definir un orden de foto por defecto, ya que tienen una configuración personalizada en la configuración local.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Ha especificado <i> $ conf [\'order_by\'] </ i> en su archivo de configuración local, este parámetro esta obsoleto, retírelo o cambiarle el nombre a <i> $ conf [\'order_by_custom \'] </ i>!';
+$lang['Updates'] = 'Actualizaciones';
+$lang['Update in progress... Please wait.'] = 'Actualización en curso ... por favor espere.';
+$lang['Ignore this update'] = 'Ignore esta actualización';
+$lang['Reset ignored updates'] = 'Restablecer actualizaciones ignoradas';
+$lang['Update All'] = 'actualizar todo';
+$lang['ERROR'] = 'ERROR';
+$lang['Update Complete'] = 'actualización completa';
+$lang['Piwigo Update'] = 'Piwigo actualización';
+$lang['Extensions Update'] = 'actualización de las extensiones';
+$lang['All extensions are up to date.'] = 'Todas las extensiones están actualizadas.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Los siguientes plugins pueden no ser compatibles con la nueva versión de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Los siguientes temas pueden no ser compatibles con la nueva versión de Piwigo:';
+$lang['I decide to update anyway'] = 'Decido actualizar de todos modos';
+$lang['Update to Piwigo %s'] = 'actualización a Piwigo %s';
+$lang['Two updates are available'] = 'Dos actualizaciones están disponibles';
+$lang['This is a minor update, with only bug corrections.'] = 'Esta es una actualización menor, con sólo correcciones de errores.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Esta es una actualización importante, con <a href="%s">nuevas características emocionantes</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Algunos de los temas y plugins pueden aún no estár disponible.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Puede actualizar a Piwigo %s directamente, sin necesidad de actualizar a Piwigo %s (recomendado).';
+$lang['Save Template Directory'] = 'Guardar directorio de plantillas';
+$lang['Dump Database'] = 'volcar la base de datos';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Incluir los datos de la historia (Advertencia: el límite de memoria del servidor puede ser superado)';
+$lang['Unable to dump database.'] = 'No es posible volcar la base de datos.';
+$lang['Some upgrades are available for extensions.'] = 'Algunas actualizaciones están disponibles para las extensiones.';
+$lang['Ignore All'] = 'ignorar todo';
+$lang['Crop'] = 'Redimensionar ';
+$lang['Width'] = 'ancho';
+$lang['Height'] = 'altura';
+$lang['Follow Orientation'] = 'siguen la orientación';
+$lang['Graphics Library'] = 'librería gráfica';
+$lang['Learn more'] = 'Más información';
+$lang['Rate'] = 'Valoración';
+$lang['Average rate'] = 'Valoración promedio';
+$lang['... or '] = '... o ';
+$lang['Create'] = 'Crear';
+$lang['Start Upload'] = 'Iniciar la transferencia';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Utiliza el formulario de Flash. Problemas? intentar el <a href="%s">formulario HTML</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Se utiliza el formulario HTML. Intentar el <a href="%s">formulario Flash</a>';
+$lang['Maximum file size: %sB.'] = 'Peso máximo de los archivos : %sB.';
+$lang['Allowed file types: %s.'] = 'Tipos de archivos permitidos : %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Resolución máxima aproximada : %dM pixeles (o sea %dx%d pixeles).';
+$lang['Manage Permissions'] = 'Administrar los permisos';
+$lang['Photo %s of %s'] = 'Foto %s de %s';
+$lang['show details'] = 'Mostrar detalles';
+$lang['hide details'] = 'ocultar los detalles';
+$lang['Merge tags'] = 'Fusionar etiquetas';
+$lang['Select the destination tag'] = 'Seleccione la etiqueta de destino';
+$lang['(this tag will be deleted)'] = '(esta etiqueta se eliminará)';
+$lang['Confirm merge'] = 'Confirman la fusión';
+$lang['Merge selected tags'] = 'Fusionar las etiquetas seleccionadas';
+$lang['No destination tag selected'] = 'No ha seleccionado una etiqueta de destino';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Las etiquetas <em>%s</em> fueron combinados en la etiqueta <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Seleccione al menos dos etiquetas para la fusión';
+$lang['Select an album'] = 'Seleccionar un álbum';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Por defecto Piwigo creara el nuevo tamaño web a partir de la HD (alta definición).';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Si la HD no esta disponible y que la version actual del tamaño web es mas grande que les dimensiones abajo mensionadas, entonces Piwigo la considerara como HD y creara un nuevo tamaño web a partir de esta misma.';
+$lang['An error has occured during upgrade.'] = 'Un error sobrevino durante la actualización.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Imposible extraer los ficheros. Por favor, verifique los permisos de los ficheros de su instalación. <Br> <a href="%s"> Haga clic aquí para ver el informe de error</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo no puede recuperar el fichero de actualización desde el servidor';
+$lang['Zoom'] = 'Zoom';
+$lang['%s has been successfully updated.'] = '% se ha actualizado correctamente.';
+$lang['Add tags'] = 'Añadir etiquetas';
+$lang['Add to caddie'] = 'Añadir al carrito';
+$lang['Last import'] = 'Última importación';
+$lang['Predefined filter'] = 'Filtro predefinido';
+$lang['With no album'] = 'Sin álbum';
+$lang['With no tag'] = 'Sin etiqueta';
+$lang['With no virtual album'] = 'Sin álbum virtual';
+$lang['Activate comments'] = 'Activar comentarios';
+$lang['Default comments order'] = 'Orden por defecto de los comentarios';
+$lang['Edit selected tags'] = 'Editar etiquetas seleccionadas';
+$lang['Edit tags'] = 'Editar etiquetas';
+$lang['Original Size'] = 'Tamaño original';
+$lang['Photo name'] = 'Nombre de la foto';
+$lang['Resize after upload'] = 'Redimensionar después de subir';
+$lang['Send connection settings by email'] = 'Enviar datos de conexión por email';
+$lang['The original image quality must be a number between %d and %d'] = 'La calidad de la foto original ha de ser un número entre %d y %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'La altura máxima de la foto original ha de ser un número entre %d y %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'La anchura máxima de la foto original ha de ser un número entre %d y %d';
+$lang['A locked gallery is only visible to administrators'] = 'Una galería bloqueada solo la pueden ver los administradores';
+$lang['administrators'] = 'administradores';
+$lang['Gallery unlocked'] = 'Galería desbloqueada';
+$lang['modified'] = 'modifcado';
+$lang['Notify administrators when a comment is'] = 'Notificar a los administradores cuando un comentario';
+$lang['pending validation'] = 'validación pendiente';
+$lang['registered users'] = 'usuarios registrados';
+$lang['Save visits in history for'] = 'Guardar visitas en el historial por';
+$lang['simple visitors'] = 'visitantes simples';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Este álbum contiene %d fotos, añadidas entre %s y %s';
+$lang['This album contains %d photos, added on %s.'] = 'Este álbum contiene %d fotos, añadidas el %s';
+$lang['This album contains no photo.'] = 'Este álbum no contiene ninguna foto';
+$lang['Unlock gallery'] = 'Desbloquear galería';
+$lang['Applications'] = 'Aplicaciones';
+$lang['apply automatic sort order'] = 'Aplicar orden automático.';
+$lang['Automatic sort order'] = 'Orden automático.';
+$lang['cancel manual order'] = 'Cancelar orden manual';
+$lang['Cancel'] = 'Cancelar';
+$lang['Center of interest'] = 'Centro de interes';
+$lang['Edit album permissions'] = 'Editar los permisos de los álbums';
+$lang['Edit album'] = 'Editar álbum';
+$lang['Edit photo information'] = 'Editar información de la foto';
+$lang['List'] = 'Lista';
+$lang['Move to album'] = 'Mover a un álbum';
+$lang['Not cropped correctly?'] = '¿No se ha cortado correctamente?';
+$lang['Save manual order'] = 'Guardar orden manual';
+$lang['Web Form'] = 'Formulario web';
+$lang['You can activate only one mobile theme.'] = 'Solo se puede activar un tema móvil.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'La aplicacion de <em>Piwigo para Android</em> te permite conectar tu galería Piwigo a tu dispositivo Android y poder crear álbums y subir fotos desde estos dispositivos.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Las aplicaciones de <em>Piwigo para iOS</em> te permiten conectar tu galería Piwigo a tu iPhone, iPad o iPod Touch y poder crear álbums y subir fotos desde estos dispositivos.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Lightroom es un software fotográfico diseñado para administrar grandes cantidades de imágenes y realizar el procesado de las mismas.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture es una herramienta potente para editar imagenes y administrar colecciones en Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture está diseñado para fotógrafos profesionales con la simplicidad de iPhoto.';
+$lang['Available on'] = 'Disponible el';
+$lang['Available versions for'] = 'Versión disponible para';
+$lang['Delete multiple size images'] = 'Borrar múltiples tamaños de imagen.';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam es un avanzado gestor de fotos gratuito para Linux, Windows y MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam está diseñado para fotógrafos que quieren ver, administrar, editar, mejorar, organizar, etiquetar y compartir sus fotos.';
+$lang['Edit ranks'] = 'Editar puntuaciones';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Características que incluye son navegación, creación de álbums y subida de fotos.';
+$lang['Generate multiple size images'] = 'Generar múltiples tamaños de imagen.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto es el gestor por defecto de fotos para MacOSX. El plugin para exportar de Piwigo permite crear nuevos álbums y exportar directamente las fotos desde iPhoto a tu galería Piwigo.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'En tu Linux simplemente instala Shotwell con el gestor de paquetes y activa la opción de publicación en Piwigo.';
+$lang['Piwigo export plugin for Aperture'] = 'Plugin de Piwigo para Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin de Piwigo para iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo para Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo para iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for digiKam'] = 'Plugin de Piwigo para digiKam';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin de publicación de Piwigo para Lightroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Plugin de Piwigo para Shotwell';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery para Android) es un software de código abierto (GPL v3) cliente de Piwigo para tu dispositivo Android.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell es un software de código abierto que sirve para organizar colecciones de fotos y que corre en Linux. Es el software fotográfico por defecto en Ubuntu y Fedora.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'El plugin de Piwigo permite crear álbums y exportar fotos.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'El plugin de Piwigo te permite exportar y sincronizar fotos de Lightroom directamente con tu galería fotográfica.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Para exportar tus fotos desde digiKam a Piwigo, simplemente instala digiKam y los Kipi-plugins.';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '&u usuarios tienen permiso automáticamente por pertenecer a grupos.';
+$lang['any visitor can see this album'] = 'cualquier visitante puede ver este álbum';
+$lang['Groups and users'] = 'Grupos y usuarios';
+$lang['Permission granted for groups'] = 'Permisos para grupos';
+$lang['Permission granted for users'] = 'Permisos garantizados para usuarios';
+$lang['Select groups...'] = 'Selecciona grupos';
+$lang['Select users...'] = 'Selecciona usuarios';
+$lang['There is no group in this gallery.'] = 'No hay grupos en esta galería';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'los visitantes necesitan iniciar sesión y tener permiso para ver este álbum';
+$lang['add a new watermark'] = 'Añadir una nueva marca de agua';
+$lang['Apply watermark if height is bigger than'] = 'Aplicar marca de agua si el alto es más grande de';
+$lang['Apply watermark if width is bigger than'] = 'Aplicar marca de agua si el ancho es más grande de';
+$lang['bottom left corner'] = 'Esquina inferior izquierda';
+$lang['bottom right corner'] = 'Esquina inferior derecha';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Por defecto, el centro de interés está situado en el centro de la foto.';
+$lang['custom'] = 'Propio';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Para tamaños de fotos con recorte, como "Cuadrado", Piwigo hará lo posible para incluir el centro de interés.';
+$lang['include photos with lower privacy level'] = 'incluir fotos con un nivel de privacidad más bajo';
+$lang['middle'] = 'Centro';
+$lang['No group is permitted to see this private album'] = 'Ningún grupo tiene permiso para ver este álbum privado';
+$lang['Opacity'] = 'Opacidad';
+$lang['Permission management'] = 'Administración de permisos';
+$lang['Photo sizes with crop'] = 'Tamaño de las fotos con el recorte.';
+$lang['Select a file'] = 'Seleccionar un archivo';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Selecciona una zona con el ratón para definir un nuevo centro de interés.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'El centro de interés es la zona más significativa en la foto.';
+$lang['top left corner'] = 'Esquina superior izquierda';
+$lang['top right corner'] = 'Esquina superior derecha';
+$lang['X Position'] = 'X Posición';
+$lang['X Repeat'] = 'X Repetir';
+$lang['Y Position'] = 'Y Posición';
+$lang['Multiple Size'] = 'Tamaños múltiples';
+?>
Index: tags/2.4.0RC3/language/es_ES/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Español [ES]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=169
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Español';
+$lang_info['country'] = 'España';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'es';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Ko';
+$lang['%d album updated'] = '%d àlbum actualizado';
+$lang['%d albums updated'] = '%d àlbumes actualizados';
+$lang['%d comment to validate'] = '%d Comentario usuario que hay que validar';
+$lang['%d comments to validate'] = '%d comentarios de usuario que hay que validar';
+$lang['%d new comment'] = '%d Nuevo comentario usuario';
+$lang['%d new comments'] = '%d nuevos comentarios del usuario';
+$lang['%d comment'] = '%d Comentario';
+$lang['%d comments'] = '%d Comentarios';
+$lang['%d hit'] = '%d visitas';
+$lang['%d hits'] = '%d visitas';
+$lang['%d new photo'] = '%d nueva fotos';
+$lang['%d new photos'] = '%d nuevas fotos';
+$lang['%d new user'] = '%d nuevo usuario';
+$lang['%d new users'] = '%d nuevos usuarios';
+$lang['About'] = 'Acerca de';
+$lang['All tags'] = 'Todas las etiquetas';
+$lang['Any tag'] = 'Cualquier etiqueta';
+$lang['At least one listed rule must be satisfied.'] = 'Debe elegir al menos una de las reglas que se listan.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Albums';
+$lang['Album'] = 'Álbum';
+$lang['Close this window'] = 'Cerrar la ventana';
+$lang['Complete RSS feed (photos, comments)'] = 'Flujo RSS completo (fotos, comentarios)';
+$lang['Confirm Password'] = 'Confirmar la contraseña';
+$lang['Connection settings'] = 'Datos de conexión';
+$lang['Login'] = 'Identificarse';
+$lang['Contact webmaster'] = 'Contactar el webmastre';
+$lang['Create a new account'] = 'Crear una nueva cuenta';
+$lang['Created on'] = 'Creada el';
+$lang['Creation date'] = 'Fecha de creación';
+$lang['Current password is wrong'] = 'La contraseña actual es incorrecta';
+$lang['Dimensions'] = 'Dimensiones';
+$lang['Display'] = 'Monstrar';
+$lang['Each listed rule must be satisfied.'] = 'Debe cumplimentar cada una de las reglas';
+$lang['Email address is missing. Please specify an email address.'] = 'Falta su dirección electrónica';
+$lang['Email address'] = 'Dirección electrónica';
+$lang['Enter your personnal informations'] = 'Cumplimente sus datos personales';
+$lang['Error sending email'] = 'Error de envío';
+$lang['File name'] = 'Nombre del archivo';
+$lang['File'] = 'Fichero';
+$lang['Filesize'] = 'Tamaño';
+$lang['Filter and display'] = 'Filtrar y mostrar';
+$lang['Filter'] = 'Filtro';
+$lang['Forgot your password?'] = '¿Olvidó su contraseña?';
+$lang['Go through the gallery as a visitor'] = 'Recorrer la galería como visitante';
+$lang['Help'] = 'Ayuda';
+$lang['Identification'] = 'Identificación';
+$lang['Photos only RSS feed'] = 'Flujo RSS sólo las fotos';
+$lang['Keyword'] = 'Palabra clave';
+$lang['Links'] = 'Enlaces';
+$lang['N/A'] = 'no disponible';
+$lang['New on %s'] = 'Nuevo el %s';
+$lang['Notification'] = 'Notificación RSS';
+$lang['Number of items'] = 'Número de artículos';
+$lang['Original dimensions'] = 'Dimensiones originales';
+$lang['Password forgotten'] = 'Contraseña olvidada';
+$lang['Password'] = 'Contraseña';
+$lang['Post date'] = 'Añadido el día';
+$lang['Posted on'] = 'Añadido el';
+$lang['Profile'] = 'Perfil';
+$lang['Quick connect'] = 'Conexión rápida';
+$lang['RSS feed'] = 'flujo RSS';
+$lang['Register'] = 'Regístrarse';
+$lang['Registration'] = 'Registro';
+$lang['Related tags'] = 'Etiquetas relacionadas';
+$lang['Reset'] = 'Cancelar';
+$lang['Retrieve password'] = 'Recuperar la contraseña';
+$lang['Search rules'] = 'Criterios de búsqueda';
+$lang['Search tags'] = 'Buscar etiquetas';
+$lang['Search'] = 'Búsqueda';
+$lang['display available tags'] = 'Ver las etiquetas disponibles';
+$lang['Since'] = 'Desde';
+$lang['Sort by'] = 'Clasificar según';
+$lang['Sort order'] = 'Orden de Clasificación';
+$lang['Tag'] = 'Etiqueta';
+$lang['Tags'] = 'Etiquetas';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'El flujo RSS notifica eventos de la galería:fotos nuevas, categorías actualizadas, nuevos comentarios de usuarios. Debe usarse con un lector de flujos RSS.';
+$lang['Unknown feed identifier'] = 'Identificador de RSS desconocido';
+$lang['User comments'] = 'Comentarios del usuario';
+$lang['Username'] = 'Nombre de usuario';
+$lang['Visits'] = 'Visitas';
+$lang['Webmaster'] = 'Webmastre';
+$lang['Week %d'] = 'Semana %d';
+$lang['About Piwigo'] = 'Acerca de Piwigo';
+$lang['You are not authorized to access the requested page'] = 'No dispone de autorización para ver la página solicitada';
+$lang['add this photo to your favorites'] = 'agregar esta foto a sus favoritos';
+$lang['Administration'] = 'Administración';
+$lang['all'] = 'todo';
+$lang['ascending'] = 'ascendiente';
+$lang['author(s) : %s'] = 'autor(es) : %s';
+$lang['Expand all albums'] = 'Ver todos los àlbumes';
+$lang['posted after %s (%s)'] = 'disponible con posterioridad al %s (%s)';
+$lang['posted before %s (%s)'] = 'disponible antes del %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'disponible entre él %s (%s) y el %s (%s)';
+$lang['posted on %s'] = 'disponible el %s';
+$lang['Best rated'] = 'Mejor valoracion';
+$lang['display best rated photos'] = 'mostrar las fotos con mejor calificación';
+$lang['Calendar'] = 'Calendario';
+$lang['All'] = 'Todo';
+$lang['display each day with photos, month per month'] = 'Visualizacíon año por año,  mes por mes, día por dia,';
+$lang['View'] = 'Vista';
+$lang['chronology_monthly_calendar'] = 'Calendario mensual';
+$lang['chronology_monthly_list'] = 'Lista mensual';
+$lang['chronology_weekly_list'] = 'Lista semanal';
+$lang['Click here if your browser does not automatically forward you'] = 'Pulse aquí si su navegador no le reenvía a la página solicitada.';
+$lang['comment date'] = 'Fecha de comentario';
+$lang['Comment'] = 'Comentario';
+$lang['Your comment has been registered'] = 'Su comentario ha sido añadido';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Systema anti-abuso : por favor, aguarde unos momentos antes de agregar un nuevo comentario';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Su comentario no ha sido registrado porque no ha superado las reglas de validación';
+$lang['An administrator must authorize your comment before it is visible.'] = 'El administrador debe validar su comentario antes de que sea visible.';
+$lang['This login is already used by another user'] = 'Este nombre de usuario ya ha sido registrado con anterioridad, por favor inténtelo con otro';
+$lang['Comments'] = 'Comentarios';
+$lang['Add a comment'] = 'Agregar comentario';
+$lang['created after %s (%s)'] = 'Creado después del %s (%s)';
+$lang['created before %s (%s)'] = 'creado antes del %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'creado entre el %s (%s) y el %s (%s)';
+$lang['created on %s'] = 'creado el %s';
+$lang['Customize'] = 'Personalizar';
+$lang['Your Gallery Customization'] = 'Personalización de su pantalla ';
+$lang['day'][0] = 'Domingo';
+$lang['day'][1] = 'Lunes';
+$lang['day'][2] = 'Martes';
+$lang['day'][3] = 'Miércoles';
+$lang['day'][4] = 'Jueves';
+$lang['day'][5] = 'Viernes';
+$lang['day'][6] = 'Sábado';
+$lang['Default'] = 'Por defecto';
+$lang['delete this photo from your favorites'] = 'Borrar esta foto de sus favoritos';
+$lang['Delete'] = 'Suprimir';
+$lang['descending'] = 'descendente';
+$lang['Download'] = 'Descargar';
+$lang['Download this file'] = 'descargar este fichero';
+$lang['edit'] = 'Editar';
+$lang['wrong date'] = 'Fecha errónea';
+$lang['excluded'] = 'Excluidos';
+$lang['Your favorites'] = 'Mis favoritos';
+$lang['display your favorites photos'] = 'mostrar mis fotos favoritas';
+$lang['Favorites'] = 'Favoritas';
+$lang['First'] = 'Primera página';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Se están realizando operaciones de mantenimiento, regrese más tarde.';
+$lang['Page generated in'] = 'Página generada en';
+$lang['guest'] = 'Visitante';
+$lang['Hello'] = 'Hola';
+$lang['available for administrators only'] = 'disponible sólo para los administradores';
+$lang['display this album'] = 'muestra las fotos en el directorio raíz de este àlbum';
+$lang['display last user comments'] = 'Ver los últimos comentarios de los usuarios';
+$lang['customize the appareance of the gallery'] = 'personalizar el aspecto de la galería';
+$lang['search'] = 'Buscar';
+$lang['Home'] = 'Inicio';
+$lang['in this album'] = 'en este àlbum';
+$lang['in %d sub-album'] = 'en este %d sub-àlbum';
+$lang['in %d sub-albums'] = 'en estos %d sub-àlbumes';
+$lang['included'] = 'incluidos';
+$lang['Invalid password!'] = 'Contraseña incorrecta !';
+$lang['Language'] = 'Idioma';
+$lang['last %d days'] = '%d últimos días';
+$lang['Last'] = 'Última página';
+$lang['Logout'] = 'Desconexión';
+$lang['obligatory'] = 'obligatorio';
+$lang['Maximum photo height'] = 'Altura máxima de las fotos';
+$lang['Maximum height must be a number superior to 50'] = 'La altura de las fotos debe ser superior a 50';
+$lang['Maximum photo width'] = 'Ancho máximo de las fotos';
+$lang['Maximum width must be a number superior to 50'] = 'El ancho de las fotos debe ser superior a 50';
+$lang['display a calendar by creation date'] = 'mostrar las imágenes en un calendario, por fecha de subida';
+$lang['display all photos in all sub-albums'] = 'Ver todas las fotos de los abumes y sub-albumes';
+$lang['return to normal view mode'] = 'Volver a la vista normal';
+$lang['display a calendar by posted date'] = 'Mostrar las imágenes en un calendario por fecha de agregación';
+$lang['month'][10] = 'Octubre';
+$lang['month'][11] = 'Noviembre';
+$lang['month'][12] = 'Diciembre';
+$lang['month'][1] = 'Enero';
+$lang['month'][2] = 'Febrero';
+$lang['month'][3] = 'Marzo';
+$lang['month'][4] = 'Abril';
+$lang['month'][5] = 'Mayo';
+$lang['month'][6] = 'Junio';
+$lang['month'][7] = 'Julio';
+$lang['month'][8] = 'Agosto';
+$lang['month'][9] = 'Septiembre';
+$lang['Most visited'] = 'Las más visitadas';
+$lang['display most visited photos'] = 'mostrar las fotos más vistas';
+$lang['The number of photos per page must be a not null scalar'] = 'La cantidad de fotos por pagina debe ser un número entero superior a cero';
+$lang['Number of photos per page'] = 'Número de miniaturas por pagina';
+$lang['Unknown identifier'] = 'Identificador desconocido';
+$lang['New password'] = 'Nueva contraseña';
+$lang['Rate this photo'] = 'Votar esta foto';
+$lang['Next'] = 'Página siguiente';
+$lang['no rate'] = 'no valorada';
+$lang['Photos posted within the last %d day.'] = 'Sólo muestra las fotos incorporadas desde el %d día.';
+$lang['Photos posted within the last %d days.'] = 'Sólo se muestran las imágenes incorporadas durante los últimos %d dias.';
+$lang['password updated'] = 'contraseña actualizada';
+$lang['Recent period must be a positive integer value'] = 'El período debe ser un número entero positivo';
+$lang['photo'] = 'Foto';
+$lang['Click on the photo to see it in high definition'] = 'Haga clic en la foto para verla en alta resolución';
+$lang['Show file metadata'] = 'Mostrar los meta-datos del fichero';
+$lang['Powered by'] = 'Desarrollado por';
+$lang['Preferences'] = 'Preferencias';
+$lang['Previous'] = 'Página anterior';
+$lang['Random photos'] = 'Foto al azar';
+$lang['display a set of random photos'] = 'mostrar un conjunto aleatorio de fotos';
+$lang['Recent albums'] = 'Álbumes recientes';
+$lang['display recently updated albums'] = 'Ver los àlbumes recien creados o actualizados';
+$lang['Recent period'] = 'Número de imágenes recientes';
+$lang['Recent photos'] = 'Fotos recientes';
+$lang['display most recent photos'] = 'mostrar las fotos más recientes';
+$lang['Redirection...'] = 'Redirección...';
+$lang['Please, enter a login'] = 'Por favor, indique un nombre de usuario';
+$lang['login mustn\'t end with a space character'] = 'el nombre de usuario no debe terminar por un espacio';
+$lang['login mustn\'t start with a space character'] = 'el nombre de usuario no debe empezar por un espacio';
+$lang['this login is already used'] = 'Este nombre de usuario ya ha sido escogido con anterioridad';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'El formato de la dirección e-mail debe ser xxx@yyy.eee (ejemplo: jack@altern.org)';
+$lang['please enter your password again'] = 'Por favor, escriba de nuevo su contraseña';
+$lang['Auto login'] = 'Conexión automática';
+$lang['remove this tag from the list'] = 'quitar este tag de la lista';
+$lang['representative'] = 'representante';
+$lang['Search for Author'] = 'Buscar por autor';
+$lang['Search in albums'] = 'Buscar en los àlbumes';
+$lang['Search by date'] = 'Buscar por fecha';
+$lang['Date'] = 'del dia';
+$lang['End-Date'] = 'Hasta el dia';
+$lang['Kind of date'] = 'Tipo de fecha';
+$lang['Search for words'] = 'Buscar por palabra';
+$lang['Search for all terms'] = 'Buscar todas las palabras';
+$lang['Search for any term'] = 'Buscar una de las palabras';
+$lang['Empty query. No criteria has been entered.'] = 'Demanda vacía. Ningún criterio surtido..';
+$lang['Search results'] = 'Resultados de la búsqueda';
+$lang['Search in sub-albums'] = 'Buscar en los sub-àlbumes';
+$lang['searched words : %s'] = 'Palabras de búsqueda : %s';
+$lang['Contact'] = 'Contactar';
+$lang['set as album representative'] = 'Elegir como cabeza de este àlbum';
+$lang['Show number of comments'] = 'Mostrar el número de comentarios';
+$lang['Show number of hits'] = 'Mostrar el número de visualizaciones';
+$lang['slideshow'] = 'Diaporama';
+$lang['stop the slideshow'] = 'Detener el diaporama';
+$lang['Specials'] = 'Herramientas';
+$lang['SQL queries in'] = 'búsquedas SQL en';
+$lang['display only recently posted photos'] = 'Seleccionar sólo las fotos incorporados recientemente';
+$lang['return to the display of all photos'] = 'Volver a mostrar todos los fotos';
+$lang['the beginning'] = 'el principio';
+$lang['Interface theme'] = 'Tema';
+$lang['Thumbnails'] = 'Miniaturas';
+$lang['Menu'] = 'Menú';
+$lang['A comment on your site'] = 'Una opinión sobre esta pagina';
+$lang['today'] = 'hoy';
+$lang['Update your rating'] = 'Actualizar la valoración';
+$lang['the username must be given'] = 'Indique el nombre de usuario';
+$lang['useful when password forgotten'] = 'Útil en caso de que olvideis la contraseña';
+$lang['Quick search'] = 'Búsqueda rápida';
+$lang['Connected user: %s'] = 'Usuario conectado: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Navegador: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Comentario: %s';
+$lang['Comment by %s'] = 'Comentario de %s';
+$lang['User: %s'] = 'Usuario: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Administración: %s';
+$lang['Registration of %s'] = 'Registro de %s';
+$lang['Album: %s'] = 'Álbum : %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'El estatus del usuario "guest" no es conforme, se utilizará el estatus por defecto. Por favor, informe al administrador del sitio.';
+$lang['this email address is already in use'] = 'Otro usuario ya utiliza esta dirección e-mail';
+$lang['Album results for'] = 'Résultados de los  àlbumes por';
+$lang['Tag results for'] = 'Resultados de las etiquetas para';
+$lang['from %s to %s'] = 'de %s a %s';
+$lang['Play of slideshow'] = 'Lectura del diaporama';
+$lang['Pause of slideshow'] = 'Pausa del diaporama';
+$lang['Repeat the slideshow'] = 'Repetir el diaporama';
+$lang['Not repeat the slideshow'] = 'No repetir el diaporama ';
+$lang['Reduce diaporama speed'] = 'Disminuir la velocidad del diaporama';
+$lang['Accelerate diaporama speed'] = 'Acelerar la velocidad del diaporama';
+$lang['Submit'] = 'Validar';
+$lang['Yes'] = 'Si';
+$lang['No'] = 'No';
+$lang['%d photo'] = '%d Foto';
+$lang['%d photos'] = '%d Fotos';
+$lang['%d photo is also linked to current tags'] = '%d foto también está relacionada con los tags actuales';
+$lang['%d photos are also linked to current tags'] = '%d fotos también están relacionada con los tags actuales';
+$lang['display photos linked to this tag'] = 'Ver únicamente las fotos relacionadas a ese tag';
+$lang['photos posted during the last %d days'] = 'fotos agregadas los últimos %d días';
+$lang['Piwigo Help'] = 'Ayuda de Piwigo';
+$lang['Rank'] = 'Fila';
+$lang['group by letters'] = 'Reagrupar por letras';
+$lang['letters'] = 'letras';
+$lang['show tag cloud'] = 'mostrar la nube de tags';
+$lang['cloud'] = 'nube';
+$lang['Reset to default values'] = 'Restablecer los valores predeterminados';
+$lang['Sent by'] = 'Enviado por';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'El cookies están bloqueados o sostenidos por su navegador Web. Usted debe acelerar el cookies para conectarse.';
+$lang['delete all photos from your favorites'] = 'borrar todas las fotos de tus favoritos';
+$lang['Are you sure?'] = '¿Seguro?';
+$lang['Edit a comment'] = 'Editar un comentario';
+$lang['(!) This comment requires validation'] = '(!) Este comentario debe ser validado';
+$lang['Welcome'] = 'Bienvenida';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bienvenidos a su galería foto Piwigo!';
+$lang['... or browse your empty gallery'] = '... o navegue por su galería vacía';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... o desactive este mensaje, yo mismo me desenredaré';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = '¡Buenos días %s, su galería foto Piwigo está vacía!';
+$lang['I want to add photos'] = 'Quiero subir fotos';
+$lang['Manage this user comment: %s'] = 'Administrar este comentario: %s';
+$lang['This author modified following comment:'] = 'Este autor modificó el comentario siguiente:';
+$lang['This author removed the comment with id %d'] = 'Este autor suprimió el comentario sustentador al que él identificaba %d';
+$lang['html tags are not allowed in login'] = 'Etiquetas HTML no están permitidas en el area de conección';
+$lang['%d rates'] = '%d Notas';
+$lang['Rating score'] = 'Puntuación';
+$lang['Invalid username or email'] = 'Nombre de usuario o dirección de correo electrónico no válida';
+$lang['Password reset is not allowed for this user'] = 'La renovación de la contraseña no se permite para este usuario';
+$lang['User "%s" has no email address, password reset is not possible'] = 'El usuario "% s" \'s no tiene dirección de correo electrónico, la renovación de la contraseña no es posible';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Alguien ha solicitado la renovación de su contraseña para el siguiente usuario :';
+$lang['Username "%s" on gallery %s'] = 'El usuario "%s" en la galería %s';
+$lang['To reset your password, visit the following address:'] = 'Para renovar su contraseña, haga clic en el siguiente enlace :';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Si se trata de un error, ignorar este mensaje y la solicitud no será tomada en cuenta.';
+$lang['Password Reset'] = 'Renovar su contraseña';
+$lang['Check your email for the confirmation link'] = 'Revise su correo electrónico para encontrar el enlace de confirmación';
+$lang['Invalid key'] = 'clave no válida';
+$lang['The passwords do not match'] = 'Las contraseñas no coinciden';
+$lang['Your password has been reset'] = 'Su contraseña se ha restablecida';
+$lang['Return to home page'] = 'Volver a la página de inicio';
+$lang['Please enter your username or email address.'] = 'Gracias por introducir su nombre de usuario o dirección de correo electrónico.';
+$lang['You will receive a link to create a new password via email.'] = 'Recibira por email un enlace para renovar su contraseña.';
+$lang['Username or email'] = 'Nombre de usuario o dirección de correo electrónico';
+$lang['Change my password'] = 'Cambiar mi contraseña';
+$lang['Enter your new password below.'] = 'Ingrese su nueva contraseña abajo.';
+$lang['EXIF Metadata'] = 'Datos EXIF';
+$lang['IPTC Metadata'] = 'Datos IPTC';
+
+$lang['Edit'] = 'Editar';
+$lang['Hello %s,'] = 'Hola &s,';
+$lang['Here are your connection settings'] = 'Aquí tiene sus detalles de acceso';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Si cree que ha recibido este email por error contacte con nosotros en %s';
+$lang['large'] = 'grande';
+$lang['medium'] = 'mediano';
+$lang['Original'] = 'Original';
+$lang['Password: %s'] = 'Contraseña: %s';
+$lang['Send my connection settings by email'] = 'Enviar mis datos de conexión por email';
+$lang['small'] = 'pequeño';
+$lang['square'] = 'cuadrado';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Se ha registrado correctamente, recibirá pronto un email con los detalles de su cuenta. ¡Bienvenid@!';
+$lang['Thank you for registering at %s!'] = '¡Gracias por registrarse en %s!';
+$lang['thumb'] = 'pulgar';
+$lang['Username modification'] = 'Cambio del nombre de usuario';
+$lang['Username: %s'] = 'Nombre de usuario: %s';
+$lang['xlarge'] = 'extragrande';
+$lang['xxlarge'] = 'XXL';
+$lang['Your username has been successfully changed to : %s'] = 'Su nombre de usuario se ha cambiado correctamente a %s';
+$lang['Desktop'] = 'Escritorio';
+$lang['Mobile'] = 'Móvil';
+$lang['Photo sizes'] = 'Tamaño de las fotos';
+$lang['Show latest comments first'] = 'Mostrar los últimos comentarios primero.';
+$lang['Show oldest comments first'] = 'Mostrar comentarios antiguos primero.';
+$lang['View in'] = 'Ver en';
+$lang['2small'] = 'XXS - enano';
+$lang['Date created, new &rarr; old'] = 'Fecha de creación, nuevo &rarr; viejo';
+$lang['Date created, old &rarr; new'] = 'Fecha de creación, viejo &rarr; nuevo';
+$lang['Date posted, new &rarr; old'] = 'Fecha de subida, nuevo &rarr; viejo';
+$lang['Date posted, old &rarr; new'] = 'Fecha de subida, viejo &rarr; nuevo';
+$lang['File name, A &rarr; Z'] = 'Nombre de archivo, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nombre de archivo , Z &rarr; A';
+$lang['Manual sort order'] = 'Orden manual';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Número de identificación, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Número de identificación, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Título de foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Título de foto, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Puntuación, más alta &rarr; más baja';
+$lang['Rating score, low &rarr; high'] = 'Puntuación, más baja &rarr; más alta';
+$lang['Visits, high &rarr; low'] = 'Visitas,  más &rarr; menos';
+$lang['Visits, low &rarr; high'] = 'Visitas, menos  &rarr; más';
+$lang['xsmall'] = 'XS - muy pequeño';
+?>
Index: tags/2.4.0RC3/language/es_ES/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,117 @@
+<h2>Modificar una categoría</h2>
+
+<h3>Informaciones</h3>
+
+<ul>
+
+  <li><strong>nombre</strong>: renombrar la categoría (virtualmente para una categoría física).</li>
+
+  <li><strong>descripción</strong>: dar una idea del contenido de la categoría, esta indicación figurará bajo la página de las miniaturas.</li>
+
+</ul>
+
+<h3>Desplazar</h3>
+
+<p>Si la categoría es virtual, usted puede desplazarla. Desplazar una categoría significa cambiar su categoría padre.</p>
+
+<h3>Opciones</h3>
+
+<ul>
+
+  <li><strong>Tipo de acceso</strong>: gestión de los permisos. Si usted cambie una categoría a particular, todas sus categorías niños se vuelven particulares. Si usted cambie una categoría a pública, todas sus categorías madres se vuelven públicas.</li>
+
+  <li><strong>Bloquear</strong>: la categoría y todas sus categorías chicas se vuelven temporalmente inaccesibles para mantenimiento.</li>
+
+  <li><strong>Comentarios</strong>: autoriza a los usuarios a comentar los elementos de esta categoría.</li>
+
+  <li><strong>Autorizar el añadido de imágenes</strong>: autoriza a los usuarios a cargar ficheros. Esta opción está disponible sólo si la categoría es física (y no virtual).</li>
+
+</ul>
+
+<p>Usted puede también administrar estas opciones por la gestión de las "Propiedades"  
+(pantallas <span class="pwgScreen">Añadido</span>, <span
+class="pwgScreen">Comentarios</span>, <span
+class="pwgScreen">Bloquear</span>, <span
+class="pwgScreen">Pública / particular</span>, <span
+class="pwgScreen">Representante</span> Disponibles a partir de <span
+class="pwgScreen">Administración, Categorías, Propiedades</span>).</p>
+
+<h3>Orden de selección</h3>
+
+<p>Utilizar la orden de selección de las imágenes por defecto.</p>
+
+<p>Indicar si la selección también se aplica las subcategorías.</p>
+
+<p>Seleccionar las columnas de la selección que hay que utilizar para esta categoría.</p>
+<ul>
+<li><strong>Fecha de creación</strong>: Fecha de grabación</li>
+<li><strong>Fecha de añadido</strong>: Fecha de la sincronización</li>
+<li><strong>Nota media (*)</strong>: la cual podría ser modificada por el visitante</li>
+<li><strong>Más vistas (*)</strong>: La vista actual puede cambiar la orden de las más vistas</li>
+<li><strong>Nombre del fichero</strong>: Nombre del fichero dado en los campos de informaciones más arriba</li>
+<li><strong>Id</strong>: Id Interna (las categorías recientes tienen la "Id" mayor que las precedentes).</li>
+
+</ul>
+<p><strong>(*)</strong>Atención: Testee usted mismo estas selecciones que podian dar resultados imprevisibles.</p>
+
+
+<h3>Representante</h3>
+
+<p>El representante de una categoría es la miniatura visualizada para representar la categoría en la página principal (<span
+class="pwgScreen">category.php</span>) Cuando una categoría contiene únicamente  subcategorías y ningun elementos directos (como a la raíz)</p>
+
+<p>Existen 4 medios de escoger al representante de una categoría:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Página de visualización de las imágenes</span>: En la barra de los botones de acción, uno de ellos permite escoger el elemento visualizado como representante de la categoría visualizada. Este botón de acción está disponible sólo para los administradores</li>
+
+  <li><span class="pwgScreen">Modificar las informaciones de una imagen</span>
+en la administración. Se puede acceder a esta pantalla desde <span
+class="pwgScreen">picture.php</span> o <span class="pwgScreen">Gestión por lote</span> en él <em>Modo unitario</em>. Ver el ayudante de esta pantalla para los detalles.</li>
+
+  <li><span class="pwgScreen">Administración, Categorías, Propiedades, Representante</span>. Ver el ayudante de esta pantalla para los detalles.</li>
+
+  <li><span class="pwgScreen">Modificar una categoría</span> ( La pantalla actual).</li>
+
+</ul>
+
+<p>La representación depende del parámetro de configuración
+<code>allow_random_representative</code> (ver <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Por defecto (<code>allow_random_representative</code> à false) cada categoría que contiene por lo menos un elemento es representada por un elemento fijo. Una vez fijado (a la creación de la categoría), el representante únicamente cambia cuando el administrador lo pide. Si el representante no conviene, usted puede pedir a <strong>Encontrar a un nuevo representante al azar</strong>.</p>
+
+<p>Si el parámetro de configuración <code>allow_random_representative</code>
+es a true, una categoría que contiene elementos puede no tener representante fijo. Simplemente utilizar el botón <strong>Suprimir al representante</strong>.</p>
+
+<p>Si la categoría no contiene ningún elemento (sino únicamente subcategorías) puede ser representada a pesar de todo por cualquier elemento gracias a la pantalla <span class="pwgScreen">Modificar las informaciones de una imagen</span>. La unica opción de la pantalla presente es el botón
+<strong>Suprimir al representante</strong>.</p>
+
+<h3>Asociar todos los elementos de la categoría con una nueva categoría</h3>
+
+<ul>
+
+<li><strong>Nombre de la categoría virtual</strong>: Nombre de la nueva categoría que hay que crear, todas las imágenes de la categoría corriente serán atadas a la nueva.</li>
+
+<li><strong>Categoría padre</strong>: Donde la nueva categoría debe estar, dejar vacío para crearle sobre la página inicial.</li>
+
+</ul>
+
+<h3>Asociar todos los elementos de la categoría con categorías existentes</h3>
+
+<ul>
+
+<li><strong>Categorías</strong>: Escoger la categoría de destino.</li>
+
+</ul>
+
+<h3>Enviarles un mail de informaciones a los miembros de un grupo</h3>
+
+<ul>
+
+<li><strong>Grupo</strong>: Grupo de destinatarios</li>
+
+<li><strong>Contenido del mail</strong>: Texto libre de enviarles.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/es_ES/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/cat_move.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>Desplazamiento de categorías virtuales</h2>
+
+<p>Usted puede cambiar al pariente de una categoría virtual.</p>
+
+<h3>Categorías virtuales que hay que desplazar</h3>
+
+<p>Seleccione una o varias categorías virtual a desplazar. Si la lista está vacía, es porque usted todavía no la a  creada.</p>
+
+<h3>Nueva categoría padre</h3>
+
+<p>Seleccione la nueva categoría padre (virtual o física). Si usted no selecciona ninguna, las categorías que hay que desplazar habrán subido a la raíz de las categorías.
+Usted no puede desplazar una categoría dentro de ella misma o sus niños.</p>
Index: tags/2.4.0RC3/language/es_ES/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/cat_options.html	(revision 14585)
@@ -0,0 +1,30 @@
+<h2>Opciones de las categorías</h2>
+
+<p>Gestión de las opciones para varias categorías a la vez.</p>
+
+<dl>
+
+  <dt>Autorización al añadido</dt>
+
+  <dd>Devolver las categorías autorizadas al añadido por los visitantes. Esta opción no está disponible para las categorías virtuales y distantes.</dd>
+  
+  <dt>Comentarios usuarios</dt>
+
+  <dd>Autorizar los usuarios a añadir comentarios en las categorías seleccionadas.
+Por herencia, una imagen es commentable si pertenece por lo menos a una categoría commentable.</dd>
+  
+  <dt>Bloquear</dt>
+
+  <dd>Las categorías seleccionadas se vuelven temporalmente inactivas para mantenimiento. Cuando una categoría es bloqueada, todas las categorías niño son bloqueadas. Cuando a una categoría se le quita el cierre, todas las categorías bloqueadas se vuelven abiertas.</dd>
+
+  <dt>Pública / Particular</dt>
+
+  <dd>Gestión del estatuto de las categorías. Los permisos son posibles sólo para las categorías particulares. En cuanto una categoría es privada, usted explícitamente debe autorizar a los usuarios o los grupos a acceder a eso. Cuando una categoría se vuelve particular, todas las categorías niño se vuelven particulares. Cuando una categoría se vuelve pública, todas las categorías padres se vuelven públicas.</dd>
+
+  <dt>Representante</dt>
+
+  <dd>Esta opción únicamente está disponible si el parámetro de configuración <code>allow_random_representative</code> (Ver <span
+class="filename">include/config_default.inc.php</span>) es
+<em>true</em>. Cada categoría puede ser representada al azar o por una miniatura fija única.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/es_ES/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Administrar los permisos para una categoría</h2>
+
+<p>Esta pantalla está disponible sólo para las categorías particulares. Aquí usted podrá seleccionar a los usuarios y a los grupos autorizados para esta categoría.</p>
+
+<h3>Grupos</h3>
+
+<p>Usted puede autorizar o prohibir el acceso a los grupos. Modificando las autorizaciones de los grupos, usted probablemente modificará la lista de los usuarios autorizados gracias a la pertenencia a los grupos.</p>
+
+<h3>Usuarios</h3>
+
+<p>Usted puede autorizar o prohibirles el acceso a los usuarios individualmente.</p>
Index: tags/2.4.0RC3/language/es_ES/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/configuration.html	(revision 14585)
@@ -0,0 +1,102 @@
+<h2>Configuración</h2>
+
+<p>Esta pantalla permite administrar la configuración básica. En efecto, sólo son mostrados los parámetros de configuración que deben ser sufisientes para la mayoría de los administradores. Si usted desea ver la lista de los numerosos (y avanzados) parámetros, leer el fichero <span
+class="filename">include/config_default.inc.php</span></p>
+
+<p>Esta pantalla es dividida en varias secciones, reagrupando los parámetros por tema.</p>
+
+<h3>Principale</h3>
+<ul>
+
+  <li><strong>Título de la galería</strong>: utilizado para el flujo RSS y la notificación por e-mail.</li>
+
+  <li><strong>Bandera de las páginas</strong>: código html visible en lo alto de las páginas.</li>
+
+  <li><strong>URL de la galería</strong>: utilizado para el flujo RSS.</li>
+
+  <li><strong>Bloquear la galería</strong>: Bloquear el conjunto de las galerías para mantenimiento. Sólo los administradores podrán acceder a la galería.</li>
+
+  <li><strong>Notación</strong>: La notación de las fotos es posible.</li>
+
+  <li><strong>Notación por los visitantes</strong>: Hasta los usuarios no registrados pueden anotar las imágenes.</li>
+
+  <li><strong>Notificar a los administradores en el momento de la inscripción de un usuario</strong>: Los administradores recibirán un mensaje a cada inscripción.</li>
+
+  <li><strong>Permitir el registro de los usuarios</strong>: La inscripción es libre para todos ellos.</li>
+
+</ul>
+
+<h3>Histórial</h3>
+
+  <p>Las visitas de las páginas <span
+class="pwgScreen">index.php</span> y <span
+class="pwgScreen">picture.php</span> Estan registrados en la tabla <code>history</code>.</p>
+
+  <p>Las visitas estan visualizadas en la pantalla <span class="pwgScreen">Administración, Classes de matemáticas superiores, Histórial</span>.</p>
+
+<ul>
+  <li><strong>Registrar las páginas visitadas por los invitados</strong>: las visitas de las páginas por los invitados estan registradas.</li>
+
+  <li><strong>Registrar las páginas visitadas por los usuarios</strong>: las visitas del las paginas por los usuarios registrados estan registradas.</li>
+
+  <li><strong>Registrar las páginas visitadas por los administradores</strong>: Las visitas de las páginas por los administradores son registradas.</li>
+
+</ul>
+
+<h3>Comentarios</h3>
+<ul>
+
+  <li><strong>Comentarios usuarios para todos</strong>: hasta los usuarios no registrados pueden registrar comentarios.</li>
+
+  <li><strong>Número de comentarios usuarios por página</strong>.</li>
+
+  <li><strong>Validación</strong>: Un administrador debe validar los comentarios usuarios antes de que puedan volverse visibles en la partida pública. La validación de los comentarios usuarios se efectua en la pantalla <span class="pwgScreen">Administración, Imágenes, Comentarios</span>.</li>
+
+  <li><strong>Notificar a los administradores cuando un comentario es registrado</strong>:
+Envía un courriel a los administradores cuando un usuarios registra un comentario que es validado.</li>
+
+  <li><strong>Notificar a los administradores cuando un comentario requiere su validación </strong>:
+Envía un courriel a los administradores cuando un usuarios registra un comentario que necesita una validación por parte de los administradores.
+La validación de los comentarios usuarios se efectua en la pantalla <span class="pwgScreen">Administración, Imágenes, Comentarios</span>.</li>
+
+</ul>
+
+<h3>Descargar</h3>
+<ul>
+  <li><strong>Visualizar el lazo de añadido de imagen todo el tiempo</strong>: Si existen unas categorías que permiten el añadido, el lazo de añadido de imagen será visualizado sea cual sea la categoría.</li>
+  <li><strong>Nivel de acceso usuario para cargar</strong>: Permite restringirles el añadido a ciertos usuarios</li>
+  <li><strong>Notificar a los administradores cuando una imagen es cargada</strong>: Los administradores recibirán un mensaje por cada imagen añadida por un usuario.</li>
+</ul>
+
+<h3>Visualización por defecto</h3>
+<p>Modificar las opciones de visualización por defecto: para los visitantes no conectados. Una vez conectado, estas opciones son sobrecargadas por las del usuario, a las que puede modificar en la pantalla <span
+class="pwgScreen">perfil</span>.</p>
+
+<p>Es posible cambiar estas opciones para los usuarios existentes, pero se trata de una otra pantalla : <span class="pwgScreen">Administración, Identificación, Usuarios</span>, en la cual usted puede modificar estas opciones para una lista de usuarios seleccionados.</p>
+
+<ul>
+
+  <li><strong>Idioma</strong>: Concierne sólo a las redacciones de Piwigo. Los nombres de categorías, de imagen y las descripciones no son localizados (ie multilingüe).</li>
+
+  <li><strong>Número de miniaturas por línea</strong></li>
+
+  <li><strong>Número de líneas por página</strong></li>
+
+  <li><strong>Tema de la interfaz</strong></li>
+
+  <li><strong>Período reciente</strong>: En días. El período durante el cual una imagen es considerada cómo noticia. Este período debe ser superior a 1 día.</li>
+
+  <li><strong>Desarrollar todas las categorías</strong>: ¿ Desarrollar todas las categorías en el menú? <em>Attention</em>: Esta opción es susceptible de consumir inútilmente recursos si su árbol de categorías contiene numerosos elementos.</li>
+
+  <li><strong>Mostrar el número de comentarios</strong>: Mostrar número  de comentarios usuario debajo de cada miniatura. Consume recursos.</li>
+
+  <li><strong>Mostrar el número de visualizaciones  </strong>: Fija los "hits" rehechos sobre una imagen bajo su miniatura en la página de miniaturas.
+  Únicamente válido si el parámetro de configuración avanzada es:<br />
+  $conf['show_nb_hits'] = true; <br />
+  N.B.: por defaut es a false.</li>
+
+  <li><strong>Anchura máxima de las imágenes</strong>: A la visualización. Si la imagen es más ancha que este parámetro, entonces será redimensionada a la visualización. Si usted piensa en la necesidad de modificar este parametraje (pues para una visualización por defecto), sería pertinente  redimensionar directamente sus imágenes almacenadas.</li>
+
+  <li><strong>Altura máxima de las imágenes</strong>: misma observación que por la anchura.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/es_ES/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,103 @@
+<h2>Configuración para "extender" los templates</h2>
+
+<h3>Objetivo</h3>
+<p>Definir las condiciones de sustitución de cada template (modelo) a partir de template-extensión
+ (template llamado "a reemplasar " (sustituto)).</p>
+
+<p>" Templates de origen " proviniendo de . / template / yoga (o de otra carpeta que "yoga")
+ son reemplazados por el sustituto si éste es vinculado a su template de origen 
+ (y de modo facultativo, cuando la dirección (URL) contiene un URL contains un 
+ " Parámetro facultativo del URL ").</p>
+
+<p>Los " Parámetros facultativo del URL " son aquellos a los que usted puede encontrar después del nombre del módulo en la dirección (URL).</p>
+
+<p>Así un " Parámetro facultativo del URL " puede ser un "permalink" (lazo permanente) activo 
+(ver el permalinks en nuestra documentación para más información).</p>
+
+<p>Leer las `<a href="#warnings">advertencias</a>` sobre las condiciones de utilización.</p>
+
+<h3>¿ Qué son las extensiones de los modelos?</h3>
+
+<p>Este instrumento de configuración es a la vez poderoso para los principiantes y para los usuarios avanzados.
+Por FTP, en el expediente template-extensión, Webmaster podrá duplicar una buena parte de los ficheros 
+.tpl distribuidos (" Templates de origen ") 
+con un nombre diferente ("reemplasar" (a sustituto)).
+ 
+ "Templates de origen ", actualmente los modelos sostenidos de origen son:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>¿ Dónde puedo encontrar los " Templates de origen "?</h3>
+
+<p>Los modelos distribuidos de origen son en template / yoga / 
+( no modificarlos directamente en este lugar por razones de evolución).
+ Así a partir de " templates de origen ", todo webmaster podrá crear su " replacers 
+ (modelos personalisés) ".</p>
+
+<h3>¿ Dónde debo registrar a los "sustitutos"?</h3>
+
+<p>Los <strong>sustitutos (templates modificados)</strong> pueden estar colocados en 
+el expediente template-extensión (o sus subexpedientes).
+Los sustitutos pueden tener cualquier nombre de fichero con la extensión .tpl. Por ejemplo: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>¿ Cómo puedo activar mis "sustitutos"?</h3>
+<p>Un<strong>Template de origen </strong> debería ser asociado con cada <strong>
+ reemplaso </strong> con el fin de activar las sustituciones correspondientes.
+ Activar los sustitutos es la función de " Extender el templates " en los menús de
+ Configuración de la Administración. </p>
+
+<p>Si usted selecciona un <strong> Define parámetros facultativo del URL </strong>
+ entonces las sustituciones serán realizadas sólo sobre las páginas que utilizarán 
+ esta palabra clave. Por ejemplo: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Los usuarios avanzados utilizarán los permalinks (permaliens, lazos permanentes) como strong> parámetro facultativo del URL </strong>. </p>
+
+<!-- TODO -->
+<p>Si usted selecciona un<strong>template atado</strong> entonces los cambios se realizaran solo sobre ese template.</p>
+
+<h3>¿ Cómo puedo desactivar mis "sustitutos"?</h3>
+<ul>
+<li>Desmarcar " template de origen ".</li>
+<li>Por FTP suprimir "sustitutos".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Advertencias</h3>
+<ul>
+
+  <li>El <strong> template de origen </strong> debe ser el verdadero 
+  template " de origen " de otro modo usted podría tener resultados imprevisibles!</li>
+
+  <li>Si varios <strong> sustitutos ( templates modoficados) </strong> tienen el mismo <strong>
+  template de origen </strong> y el mismo <strong> parámetro facultativo del URL </strong> entonces solamente el último sustituto será activo.</li>
+
+  <li>No seleccionar <strong> parámetro facultativo del URL </strong> activará el template de sustitución a cada utilización del template.
+  Así como mencionado más arriba, la orden puede inhibir los sustitutos precedentes.</li>
+
+  <li>Subexpedientes :
+  Los subexpedientes son ignorados pero son útiles para modificar la orden de los sustitutos. <br />
+  distributed-samples: ¡ para sus pruebas son distribuidos! 
+<strong>No modificarlos :</strong>¡ Haga los suyos!
+</li>
+
+  <li>A la supresión del sustituto el <strong> template de origen </strong> inmediatamente será
+  reactivado.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/es_ES/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/group_list.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Lista grupos</h2>
+
+<p> Manipulación de las propiedades de los grupos definidos.</p>
+
+<h3>Añadir un grupo</h3>
+
+<p>El administrador puede añadir grupos.</p>
+
+<h3>Lista grupos</h3>
+
+<p>La lista permite para cada grupo:</p>
+
+<ul>
+  <li>de acceder a la lista de los miembros</li>
+  <li>de acceder a los permisos</li>
+  <li>de suprimir el grupo (necesita una confirmación)</li>
+  <li>de invertir el estatuto " por defecto " (necesita una confirmación)</li>
+</ul>
+
+<h3>Grupos por defecto</h3>
+<p>Los grupos por defecto son los grupos asociados automáticamente con cada nuevo usuario.</p>
Index: tags/2.4.0RC3/language/es_ES/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,27 @@
+<p>Existen varios métodos para añadir fotos en vuestro galería:</p>
+
+<ul>
+
+  <li><strong>El añadido directo</strong> en su navegador Web es el método más simple y más inmediato. Depende de capacidades de su navegador y de su servidor. ¡ Para gruesos volúmenes o en caso de problemas, los métodos alternativos le esperan!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Utilizar el añadido directo</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> es un software que hay que instalar sobre su ordenador.
+  Resbale sus fotos en la ventana de pLoader, haga clic sobre
+  <em>"Trasladar hacia Piwigo"</em> y pLoader se ocupa además.
+  Otros softwares clientes existen, como <strong>WinToPiwigo</strong> o el módulo
+  de expuerto Piwigo de <strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Utilizar pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>El FTP</strong> es el método ideal para añadir una colección importante en un mínimo de operaciones.
+ Siga al guía para preparar sus fotos. Este método le permite controlar con precision la organización física de su fotos sobre su servidor.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Utilizar FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/es_ES/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/help_groups.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>Los grupos de usuarios permiten asignar permisos a una lista de usuarios.</p>
+
+<p>Usted puede crear grupos y añadir usuarios en ello
+<span class="pwgScreen">Administración &raquo; Usuarios &raquo; Grupos</span>.</p>
+
+<p>Un usuarios puede pertenecer a varios grupos. La autorización es más fuerte que la interdicción: si el usuario "piedra" pertenece a los grupos "familia" y "los amigos", y si sólo el grupo "familia" puede visitar la categoría " Navidad 2003 ", entonces "piedra" puede visitar esta categoría.</p>
+
Index: tags/2.4.0RC3/language/es_ES/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/help_misc.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Una vez creado su galería, configure la visualización por defecto tal como deseado en
+  <span class="pwgScreen">Administración &raquo; Configuración &raquo; Opciones &raquo; Parámetros invitado</span>. En efecto, cada nuevo usuario heredará de estas propiedades de visualización.</p>
+
+<p>Para cualquier pregunta, la comunidad Piwigo está a la escucha en el <a href="http://es.piwigo.org/forum">foro</a>.</p>
+
Index: tags/2.4.0RC3/language/es_ES/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,46 @@
+<fieldset>
+<legend>Permisos para fotos</legend>
+
+<p>Cada foto tiene un <strong>nivel de privacidad</strong> (un cierre). Igual que cada usuario tiene su nivel de privacidad(una llave).Hay 5 niveles de privacidad:</p>
+<ol>
+  <li>Ninguno</li>
+  <li><em>Contactos</em></li>
+  <li><em>Amigos (que es superior al de un contacto)</em></li>
+  <li><em>Familia (que es superior al de un amigo)</em></li>
+  <li><em>Admins (que es superior al de otros niveles)</em></li>
+</ol>
+
+<p>Los niveles altos tienen permisos sobre los niveles bajos. Para  un usuario dado, mas alto sera el nivel de privacidad,  mas fotos pueda ver.</p>
+
+<p>Por ejemplo, si la foto "Boda_pedro-0024.jpg"tiene el nivel de privacidad<em>"Familia"</em>, entonces:</p>
+<ul>
+  <li>Pedro (que es un <em>"Admin"</em>) puede ver la foto porque<em>"Admins"</em> puede ver todas las fotos</li>
+  <li>Beth (que es un miembro de<em>"Familia"</em>) puede ver también la foto</li>
+  <li>Maria (que solo es <em>"Amigos"</em>) no puede ver la foto</li>
+</ul>
+
+<p>Un usuario que no tiene permiso para ver el contenido de una categoría no verá la categoría en sí misma, ni siquiera su título. El mismo principio se aplica a una etiqueta.</p>
+
+<p>Puede establecer el nivel de privacidad de un usuario en <span class="pwgScreen">Administración &raquo; Usuarios &raquo; Gestion</span> pantalla.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Permisos de las categorías</legend>
+
+<p>Si los niveles de privacidad no se ajustan a sus necesidades, también puede administrar los permisos de las categorías para un usuario o un grupo. Puede administrar los permisos en las fotos y las categorías al mismo tiempo, sin conflicto.</p>
+
+<p>Usted puede prohibir el acceso a las categorías. Pase el tipo de acceso a "intimidad" si usted desea administrar los permisos</p>
+
+<p>Usted puede devolver una categoría particular editándola (<span
+class="pwgScreen">Administración &raquo; Categorías &raquo; Administrar &raquo; Editar</span>) O administrando las opciones para su árbol completo de categorías (<span
+class="pwgScreen">Administración &raquo; Categorías &raquo; Propiedades &raquo; Pública / particular</span>).</p>
+
+<p>Cuando ciertas categorías estan privadas, usted puede administrar los permisos con 3 pantallas:</p>
+
+<ul>
+  <li><span class="pwgScreen">Administración &raquo; Usuarios &raquo; Administrar &raquo; Acciones Permisos</span> (1 lazo por usuario)</li>
+  <li><span class="pwgScreen">Administración &raquo; Usuarios &raquo; Grupos &raquo; Acciones Permisos</span> (1 lazo por grupo)</li>
+  <li><span class="pwgScreen">Administración &raquo; Categorías &raquo; Administrar &raquo; Modificar los permisos</span> (1 lazo por categoría)</li>
+</ul>
+
Index: tags/2.4.0RC3/language/es_ES/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>Las fotos son visualizadas en las categorías que corresponden a los repertorios.</p>
+
+<p>Usted también puede visualizar una foto en varias categorías, sin duplicar el fichero sobre su servidor web. Asocie la foto con cualquier otra categoría desde la pantalla de edición de la foto (al cual pude acceder desde la página de visualización de la foto lado galería, cuando esta conectado como administrador)</p>
+
+<p>Las categorías virtuales parten de este principio : no tienen repertorio asociado. Cree categorías virtuales después <span class="pwgScreen">Administración &raquo; Categorías  &raquo; Administrar</span>.</p>
+
+
Index: tags/2.4.0RC3/language/es_ES/help/history.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/history.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Histórico</h2>
+
+<p>Estas pantallas permiten seguir el histórico de navegación en Piwigo
+ en función de las opciones que ha determinado en 
+Administración - General - pestaña  Histórico.</p>
+	
+<h3>Estadísticas</h3>
+<ul>
+  <p>Si quiere que las visitas de las páginas <span
+class="pwgScreen">index.php</span> y <span
+class="pwgScreen">picture.php</span> sean 
+registradas en el cuadro <code>history</code>,
+esta pestaña permite seguir el número de páginas visitadas</p>
+	
+	<li><strong>Estadísticas totales</strong> : visualiza las estadísticas por año.</li>
+	
+	<li><strong>Estadísticas de un año</strong> : visualiza las estadísticas de los
+	meses del año seleccionado.</li>
+	
+	<li><strong>Estadísticas de un mes</strong> : visualiza las estadísticas
+	de los días del mes seleccionado.</li>
+	
+	<li><strong>Estadísticas de un día</strong> : visualiza las estadísticas
+	de las horas del día seleccionado.</li>
+	
+</ul>
+
+<h3>Buscar</h3>
+<ul>
+  <p>Si quiere que las visitas de las páginas <span
+class="pwgScreen">index.php</span> y <span
+class="pwgScreen">picture.php</span> sean 
+registradas en el cuadro <code>history</code>, esta pestaña permite 
+seguir más detalladamente las páginas exploradas en su sitio con ayuda 
+de distintos filtros..</p>
+ 
+	<li><strong>Filtrar por fecha</strong> : seleccionar la zona de observación cuya 
+	actividad quiere observar.</li>
+	
+	<li><strong>Filtrar por tipo de elemento</strong> : seleccionar el tipo de 
+	elemento cuya actividad quiere observar .</li>
+	
+	<li><strong>Filtrar por usuario</strong> : seleccionar el usuario cuya actividad
+	quiere observar.</li>
+	
+	<li><strong>Filtrar por nombre del fichero</strong> : seleccionar el nombre del 
+	fichero cuya actividad quiere observar.</li>
+	
+	<li><strong>Filtrar por identificador de la imagen</strong> : seleccionar el 
+	identificador de la imagen cuya actividad quiere observar.</li>
+</ul>
Index: tags/2.4.0RC3/language/es_ES/help/index.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/es_ES/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/maintenance.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Mantenimiento</h2>
+
+<p>Para optimizar el tiempo de generación de las páginas, Piwigo utiliza informaciones en viñeta. Por ejemplo, en lugar de contar el número de elementos contenidos en cada categoría a cada nueva carga de página, esta información es almacenada en la base de datos. Teóricamente, esta información debe siempre estar correcta, pero a veces un error puede sobrevenir y la información en viñeta se vuelve falsa.</p>
+
+<p>Informaciones se vuelven inútiles con tiempo. Suprimirlas de la base de datos liberara espacio en el disco.</p>
+
+<ul>
+
+  <li>
+    <strong>Elementos no atados :</strong>
+   Visualiza las imágenes que no son asociadas con una categoría virtual
+  </li>
+  <li>
+    <strong>Ficheros que llevan el mismo nombre en varias categorías físicas :</strong>
+    Visualiza las imágenes o los ficheros que  eventualemente podrían estar encontrados en varias categorías.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Poner al día las informaciones de las categorías:</strong> Para cada categoría, las informaciones a controllar y\o poner al día son las siguientes: lista de las categorías madres, número de elementos, fecha del último elemento, la posición entre las categorías hermana, posición en el árbol completo de las categorías. Esta acción también verifica la coherencia de los representantes.</li>
+
+  <li><strong>Poner al día las informaciones de las imágenes:</strong> Para cada imagen, las informaciones que hay que poner al día son: camino completo hacia el fichero, la nota media. <em>Atención</em>: No confundir con los méta-datos que son sincronizados sobre la pantalla <span
+class="pwgScreen">Administración, Categorías, Sincronizar</span> O sobre la pantalla <span class="pwgScreen">Modificar las informaciones de una imagen</span>
+(accesible desde la página de visualización de una imagen <span
+class="pwgScreen">picture.php</span>).</li>
+
+  <li><strong>Reparar y optimizar la base de datos :</strong>
+Para cada tabla de la base de datos Piwigo efectua operaciones de ré-planificación, de reparación y de optimización.
+  </li>
+
+</ul>
+
+<ul>
+  <li><strong>Vaciar el histórico :</strong>
+Suprime todas las líneas de la tabla <code>history</code>. La pantalla <span class="pwgScreen">
+Administración, Especiales, histórico</span> no muestrara ninguna información sobre el pasado. <Em>Atención</em>: todos los datos estarán perdidos y no existe ningún medio de recuperarlos.
+  </li>
+  
+  <li><strong>Vaciar el sumario del histórico</strong>Suprime todas las informaciones recapitulativas (obtenidas a partir del detalle de la peataña histórico).</li>
+
+  <li><strong>Purgar las sesiones:</strong> Suprimir las sesiones espiradas..</li>
+
+  <li><strong>Purgar los flujos jamás utilizados de notificación</strong></li>
+
+  <li><strong>Purgar la pestaña histórico de las búsquedas</strong></li>
+  
+  <li><strong>Purgar el templates compilado</strong></li>
+  
+</ul>
Index: tags/2.4.0RC3/language/es_ES/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Notificación por mail</h2>
+
+<p>Esta pantalla permite configurar, administrar las notificaciónes a los usuarios de cambios por el envío de un mail.</p>
+
+<p>Esta pantalla consta de 3 pestañas:</p>
+
+<h3>Paramètrage</h3>
+<p>Accésible únicamente por el webmestres, esta pestaña permite situar los parámetros de la notificación por mail.</p>
+
+<h3>Inscripción</h3>
+<p>Accésible únicamente por el webmestres, esta pestaña permite administrar las inscripciones / désinscriptions a la notificación por mail.</p>
+
+<h3>Envío</h3>
+<p>Accésible por el webmestres y los administradores, este pestaña permite efectuar los envíos de los mails para notificar los cambios.</p>
+
Index: tags/2.4.0RC3/language/es_ES/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Lazos permanentes</h2>
+
+<p>Los lazos permanentes son utilizados para devolver el url de las categorías. Cuando una categoría tiene un lazo permanente asociado, identificándolo de la categoría no es necesario más en el url.</p>
+
+<p>Cuando un lazo permanente es borrado, usted puede salvaguardarlo en la pestaña histórico de los lazos permanentes, de modo que los lazos externos tienen PWG todavía funcionan. En la pestaña histórico de los lazos permanentes usted puede ver la fecha de eliminación del lazo, así como la fecha de la última utilización y el número de utilizaciones de este lazo.</p>
+
+<p>Por favor, anote que los lazos permanentes deben ser únicos. Deben también ser únicos en la pestaña histórico de los lazos permanentes.</p>
Index: tags/2.4.0RC3/language/es_ES/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,108 @@
+<fieldset>
+  <legend>Comienzo rápido</legend>
+
+<ol>
+  <li>Cree un repertorio en su ordenador.</li>
+
+  <li>Copie las fotos dentro de este repertorio, luego redimensione para una visualización en la web. <em>Atención</em> : El nombre de los repertorios y de los ficheros debe contener sólo letras, cifras y los carácteres  "-", "_" y ".". Ningún espacio o carácteres acentuados.</li>
+
+  <li>Con un cliente FTP, copie el repertorio en el repertorio " galleries " de su instalación de Piwigo.</li>
+
+  <li>Conecte usted a su instalación de Piwigo y vaya a<span class="pwgScreen">Administración &raquo; Imágenes &raquo; Miniaturas</span> para crear las miniaturas que faltan.</li>
+
+  <li>Vaya a <span class="pwgScreen">Administración</span> y haga clic en el botón de sincronización.</li>
+</ol>
+
+<p>¡ Bravo! Usted creó con éxito la primera categoría de su galería.</p>
+
+</fieldset>
+<fieldset>
+  <legend>Organización de los repertorios y de los ficheros</legend>
+
+<ul>
+
+  <li>
+
+    <p>Los repertorios que representan las categorías están en el repertorio " galleries ". Más abajo el árbol de los repertorios de una galería muy pequeña (pero utilizando numerosos carácteres funcionales): </p>
+  
+<pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- categoría-1
+|   |   |-- categoría-1.1
+|   |   |   |-- categoría-1.1.1
+|   |   |   |   |-- categoría-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- mariage.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-mariage.jpg
+|   |   |   |   |   +-- mariage.jpg
+|   |   |   |   +-- categoría-1.1.1.2
+|   |   |   +-- categoría-1.1.2
+|   |   |-- categoría-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- categoría-1.3
+|   +-- categoría-2
+|       |-- porcinet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-porcinet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>Fundamentalmente, una categoría es representada por un repertorio a cualquier nivel bajo el repertorio " galleries " de su instalación de Piwigo. Cada categoría puede contener tantos subniveles como deseado. En el ejemplo más arriba, categoría-1.1.1.1 está en un nivel 4 de profundidad.</li>
+
+  <li>Fundamentalmente, un elemento es representado por un fichero. Un fichero puede ser un elemento para Piwigo si la extensión del nombre del fichero está entre la lista del parámetro de configuración <code>file_ext</code> (Ver 
+  fichero <span class="filename">include/config.inc.php</span>). Un fichero puede ser una imagen si su extensión está entre el parámetro de configuración
+<code>picture_ext</code>.</li>
+
+  <li>Los elementos de tipo llena de imágenes deben tener una miniatura asociada (ver la sección siguiente a propósito de las miniaturas).</li>
+
+  <li>Los elementos de tipo imágenes pueden tener unas imágenes de gran tamaño asociado. Así como para el fichero <span class="filename">mariage.jpg</span>
+En el ejemplo más arriba. Ningún prefijo es necesario sobre el nombre del fichero.</li>
+
+  <li>Los elementos no imagen (vídeos, sonidos, archivos de texto, todo lo que usted quiere) por defecto son representado por icono que corresponde a la extensión del nombre del fichero. Optionalmente, una miniatura y un representante pueden ser asociados (ver el fichero <span
+class="filename">video.avi</span> en el ejemplo).</li>
+
+  <li><em>Atención</em> : El nombre de un repertorio o de un fichero debe ser constuitido sólo por letras, cifras, de "-", "_" o ".". Ningún espacio o carácteres acentuados.</li>
+
+  <li><em>Consejo</em> : Una categoría puede contener elementos y subcategorías a la vez. Sin embargo, es fuertemente aconsejado para cada categoría escoger entre: contener elementos <strong>o bien</strong>
+Subcategorías.</li>
+
+  <li>En cuanto los ficheros, las miniaturas y los representantes están correctamente colocados en los repertorios, ir a <span
+class="pwgScreen">Administración &raquo; Categorías &raquo; Sincronizar</span>.</li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Miniaturas</legend>
+
+<ul>
+  
+  <li>Así como mencionado anteriormente, cada elemento de tipo imágenes debe ser asociado con una miniatura.</li>
+
+  <li>Las miniaturas son almacenadas en el subdirectorio " thumbnail " de cada repertorio que representa una categoría. Una miniatura es un fichero de tipo  imágenes (la misma extensión del nombre del fichero) cuyo nombre de fichero es prefijado por el parámetro de configuración <code>prefix_thumbnail</code>
+(ver <span class="filename">include/config.inc.php</span>).</li>
+
+  <li>Las miniaturas no necesitan tener la misma extensión que las imágenes asociada (una imagen con ".jpg" como extensión puede tener una miniatura .GIF " por ejemplo).</li>
+
+  <li>Es aconsejado utilizar un programa externo para la creación de las miniaturas</li>
+
+  <li>Usted también puede utilizar el programa de creación de miniatura integrado a Piwigo pero esto es desaconsejado porque la calidad corre peligro de ser decepcionante y esto utiliza inútilmente los recursos del servidor (lo que puede ser un problema grave sobre un servidor mutualisado).</li>
+
+  <li>Si usted escoge utilizar al servidor web para generar las miniaturas, usted debe dar los derechos en escritura a los repertorios.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/es_ES/help/search.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/search.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Búsqueda</h2>
+
+<p>Búsqueda de imágenes a través del conjunto de la galería.</p>
+
+<dl>
+
+  <dt>Buscar una palabra</dt>
+
+  <dd>Búsquar una o varias palabras en todos los atributos atados a las imágenes. Utilizar * como jocker para las búsquedas parciales.</dd>
+  
+  <dt>Búsqueda de un autor</dt>
+
+  <dd>Utilizar * como jocker para las búsquedas parciales.</dd>
+
+  <dt>Búsqueda por fecha</dt>
+
+  <dd>Seleccionar una fecha y/o una fecha de fin. Dejar la fecha vacía si desea hacer una búsqueda "antes". El año debe escribirse en el último campo en forma de 4 cifras (2005 por ejemplo).</dd>
+
+  <dt>Búsqueda en las categorías</dt>
+
+  <dd>Seleccionar las categorías sobre las cuales restringir la búsqueda.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/es_ES/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/site_manager.html	(revision 14585)
@@ -0,0 +1,42 @@
+<h2>Sitios distantes</h2>
+
+<p>Piwigo ofrece la posibilidad de utilizar varios sitios para almacenar los ficheros que compondrán su galería. Esto puede ser útil si su galería está instalada sobre un espacio de almacenamiento limitado y si usted tiene numerosos ficheros que hay que mostrar.</p>
+
+
+<ol>
+
+  <li>editar el fichero <span
+class="filename">tools/create_listing_file.php</span> modificando la sección de los parámetros como <code>$conf['prefix_thumbnail']</code> or
+<code>$conf['use_exif']</code>.</li>
+
+  <li>colocar el fichero <span
+class="filename">tools/create_listing_file.php</span> modificado sobre su sitio distante, en el mismo repertorio que los repertorios que representan sus categorías (como el repertorio <span class="filename">galleries</span> de
+ce site) para FTP. Por ejemplo, digamos que usted puede acceder a  <span
+class="filename">http://exemple.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>Ir a<span class="pwgScreen">Administración, Categorías, Gestion de las sitios</span>. Pedir por crear un nuevo sitio, por ejemplo <span
+class="filename">http://exemple.com/galleries</span>.</li>
+
+  <li>
+
+    <p>Un nuevo sitio distante esta registrado. 4 acciones posibles :</p>
+
+    <ol>
+
+      <li><strong>generar la lista</strong> : lanza una demanda distante para generar el fichero de listado distante</li>
+
+      <li><strong>sincronizar</strong> : lee el fichero distante <span
+class="filename">listing.xml</span> y sincroniza con la base de datos local</li>
+
+      <li><strong>limpiar</strong> : Suprime el fichero distante de listado</li>
+
+      <li><strong>destruir</strong> : suprime el sitio (y todos los elementos que estan asociados con el) en la base de datos</li>
+
+    </ol>
+
+  </li>
+
+</ol>
+
+<!--<p>Usted también puede efectuar estas operaciones manualmente editando el fichero <span class = filename "> listing.xml </span> en la mano y desplazándolo hacia su repertorio raíz. Hacerse sobre <span class = pwgScreen "> Administración, Categorías, Ubicaciones(Sitios) distante </span>:
+Piwigo detecta el fichero y propone servirse de eso.</p>-->
Index: tags/2.4.0RC3/language/es_ES/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/synchronize.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Sincronizar</h2>
+
+<ul>
+
+  <li>Existen 2 tipos de sincronizaciones: estructura y meta-datos. Sincronizar la estructura vuelve a sincronizar su árbol de los repertorios y los ficheros con la representación de la estructura en la base de datos. Sincronizar los méta-datos permite actualizar las informaciones como el peso del fichero, las dimensiones, los datos EXIF o IPTC.</li>
+
+  <li>La primira sincronización a efectuar es la de la estructura</li>
+
+  <li>El proceso de sincronización puede llevar tiempo (en proporción a la carga del servidor y la cantidad de ficheros por administrar), tambien es posible avanzar paso a paso: categoría por categoría.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/es_ES/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Creación de las miniaturas</h2>
+
+<p>Creación de las miniaturas que faltan. La utilización de esta funcion no es aconsejada si su galería es albergada sobre un servidor mutualisado (resources máquina compartidas).</p>
+
+<dl>
+
+  <dt>Versión de GD</dt>
+
+  <dd>GD es una librería gráfica de manipulación de imágenes para PHP. Escoja la versión instalada sobre su servidor. Si usted se equivoca, mensajes de errores aparecerán, vuelva a la página precedente y escoja la otra versión. Si ninguna versión funcciona, esto significa que GD no está disponible.</dd>
+
+  <dt>Anchura y altura</dt>
+
+  <dd>Dimensiones máximas que las miniaturas pueden tener. El ratio anchura / altura original es conservado. Los valores por defecto son modificables gracias a los parámetros de configuración <code>tn_width</code> y
+<code>tn_height</code> (ver el fichero <span
+class="filename">include/config_default.inc.php</span>).</dd>
+  
+  <dt>Número de miniaturas que hay que crear</dt>
+
+  <dd>No intentar de miniaturizar un número demasiado grande de imágenes a la vez. En efecto, la miniaturización requiere una utilización relativamente importante del procesador.</dd>
+
+  <dt>Tamaño de fichero</dt>
+
+  <dd>Las miniaturas son creadas al tamaño JPEG. Sólo el tamaño PNG y JPEG pueden ser miniaturizados.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/es_ES/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/es_ES/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/help/user_list.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Lista usuarios</h2>
+
+<p>Manipulación de las propiedades de los usuarios registrados. Solo los permisos son administrados en una pantalla diferente.</p>
+
+<h3>Añadir un usuario</h3>
+
+<p>El administrador puede añadir manualmente a usuarios.</p>
+
+<h3>Lista usuarios</h3>
+
+<p>La lista puede ser filtrada con nombre de usuario (* = mono), con grupo o el estatuto. La lista puede ser ordenada según la fecha de registro o el nombre de usuario, por orden ascendente al descendente.</p>
+
+<p>Esta pantalla funciona por modificación de varios usuarios simultáneamente:</p>
+
+<ul>
+  <li>suprimir a usuarios (necesita una confirmación)</li>
+  <li>cambiar el estatuto</li>
+  <li>asociar o disociar grupos</li>
+  <li>modificar las propiedades de visualización</li>
+  <li>modificar las propiedades anexas</li>
+</ul>
+
+<p>El blanco es la lista de los usuarios seleccionados (por defecto) o bien todos los usuarios de la lista filtrada.</p>
Index: tags/2.4.0RC3/language/es_ES/index.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/es_ES/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/install.lang.php	(revision 14585)
@@ -0,0 +1,81 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Instalación';
+$lang['Basic configuration'] = 'Configuración de Base';
+$lang['Default gallery language'] = 'Idioma por defecto de la galería';
+$lang['Database configuration'] = 'Configuración de la Base de datos';
+$lang['Admin configuration'] = 'Configuración de la cuenta Administrador';
+$lang['Start Install'] = 'Empezar la instalación';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'La dirección mail debe ser de la forma xxx@yyy.eee (ejemplo: jack@altern.org)';
+
+$lang['Webmaster login'] = 'Administrador';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Este identificador aparecerá a todos sus visitantes. Le sirvira para administrar el sitio';
+
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'La conexión al servidor es O.K., pero es imposible conectarse a esta base de datos';
+$lang['Can\'t connect to server'] = 'Imposible conectarse al servidor';
+
+$lang['Host'] = 'Huésped MySQL';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Usuario';
+$lang['user login given by your host provider'] = 'Nombre de usuario para su alojador web';
+$lang['Password'] = 'Palabra de paso';
+$lang['user password given by your host provider'] = 'El proporcionado por su alojador web';
+$lang['Database name'] = 'Nombre de la base';
+$lang['also given by your host provider'] = 'El proporcionado por su alojador web';
+$lang['Database table prefix'] = 'Prefijo nombres de mesa';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'El nombre de las tablas aparecerá con este prefijo (permite administrar mejor su base de datos)';
+$lang['enter a login for webmaster'] = 'Por favor, escriba un pseudo para el webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'El pseudo del webmaster no debe contener carácter " y \'';
+$lang['please enter your password again'] = 'Por favor, ponga su contraseña';
+$lang['Webmaster password'] = 'Contraseña';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Debe quedar confidencial, permite acceder al panel de administración.';
+$lang['Password [confirm]'] = 'Contraseña [Confirmar]';
+$lang['verification'] = 'Comprobación';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '¿ Necesidad de ayuda? Plantee su pregunta sobre él <a href="%s">foro de Piwigo</a>.';
+$lang['Webmaster mail address'] = 'E-mail del Administrador';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Los visitantes podrán ponerse en contacto con usted por este mail';
+
+$lang['PHP 5 is required'] = 'PHP 5  requerido';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Aparentemente, la versión PHP de su alojador web es PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo va a tratar de pasar en PHP 5 creando o modificando el fichero .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Note que usted mismo puede cambiar la configuración PHP y volver a lanzar  Piwigo después.';
+$lang['Try to configure PHP 5'] = 'Trate de configurar PHP 5';
+$lang['Sorry!'] = 'Lo siento!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo no pudo configurar PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = 'Usted debe ponerse en contacto con su alojador web con el fin de saber cómo configurar PHP 5';
+$lang['Hope to see you back soon.'] = 'Esperando verle  muy pronto...';
+
+
+$lang['Congratulations, Piwigo installation is completed'] = 'Félicitation, Piwigo está completamente instalado';
+
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Una solución alternativa es copiar el texto en la zona más abajo and de pegarlo en el fichero  "local/config/database.inc.php" (Atención: database.inc.php debe contener sólo lo que se encuentra en la zona, no de regreso a la línea, ningún espacio';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'La creación del fichero de configuración local/config/database.inc.php fue suspendido.';
+$lang['Download the config file'] = 'Descargar el fichero de configuración';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Usted puede descargar el fichero de configuración y carga en el repertorio local/config de su instalación Piwigo.';
+$lang['Just another Piwigo gallery'] = 'Una galería Piwigo más ';
+$lang['Welcome to my photo gallery'] = 'Bienvenido a mi galería de fotos';
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'No dudes en escribir en nuestros foros para cualquier duda: %s';
+$lang['Welcome to your new installation of Piwigo!'] = '¡Bienvenid@ a la instalación de Piwigo!';
+?>
Index: tags/2.4.0RC3/language/es_ES/iso.txt
===================================================================
--- tags/2.4.0RC3/language/es_ES/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Español [ES]
Index: tags/2.4.0RC3/language/es_ES/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/es_ES/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/es_ES/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Actualización';
+$lang['Upgrade from version %s to %s'] = 'Actualización de la versión %s a %s';
+$lang['Statistics'] = 'Estadísticas';
+$lang['total upgrade time'] = 'tiempo total de la actualización';
+$lang['total SQL time'] = 'tiempo total de la demanda SQL';
+$lang['SQL queries'] = 'número de demanda SQL';
+$lang['Upgrade informations'] = 'Informaciones sobre la actualización';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Por favor, efectúes un mantenimiento en [Administración>herramientas>Mantenimiento] si usted encuentra problemas.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaución, el plugins siguiente han sido desactivados. Verifique si existen unas actualización antes de reactivarlos:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Sólo un administrador puede lanzar la actualización: por favor, identifiqúese más abajo.';
+$lang['You do not have access rights to run upgrade'] = 'Usted no tiene los derechos necessaires para lanzar la actualización.';
+$lang['All sub-albums of private albums become private'] = 'Todos los sub-àlbumes de los àlbumes privados son privados';
+$lang['User permissions and group permissions have been erased'] = 'Las autorizaciones de los usuarios y de los grupos han sido borradas';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Sólo el prefijo de las miniaturas y el email  del webmestre han sido salvaguardados por la configuración precedente';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Esta página le propone poner al día la base de datos de su antigua versión de piwigo hacia la nueva versión.
+El asistente de postura al día piensa que usted dispone actualmente del <strong>versión %s</strong> (o equivalente).';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'En <i>%s</i>, antes <b>?></b>, insertar:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Como medida de precaución, los siguientes temas han sido desactivados. Compruebe si existe actualizaciones  antes de reactivar:';
+?>
Index: tags/2.4.0RC3/language/et_EE/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/et_EE/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/et_EE/admin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Add to caddie'] = 'lisa caddie-sse';
+$lang['Average rate'] = 'Keskmine hinne';
+$lang['Rate'] = 'Hinda';
+$lang['Caddie'] = 'Korv';
+
+?>
Index: tags/2.4.0RC3/language/et_EE/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/et_EE/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/et_EE/common.lang.php	(revision 14585)
@@ -0,0 +1,281 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Estonian [EE]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=569
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Estonian";
+$lang_info['country'] = "Estonia";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "et";
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d album uuendatud';
+$lang['%d albums updated'] = '%d albumit uuendatud';
+$lang['%d comment to validate'] = '%d kommentaar kinnitada';
+$lang['%d comments to validate'] = '%d kommentaari kinnitada';
+$lang['%d new comment'] = '%d uus kommentaar';
+$lang['%d new comments'] = '%d uut kommentaari';
+$lang['%d comment'] = '%d kommentaar';
+$lang['%d comments'] = '%d kommentaari';
+$lang['%d hit'] = '%d tabamus';
+$lang['%d hits'] = '%d tabamust';
+$lang['%d new photo'] = '%d uus foto';
+$lang['%d new photos'] = '%d uut fotot';
+$lang['%d new user'] = '%d uus kasutaja';
+$lang['%d new users'] = '%d uut kasutajat';
+$lang['About'] = 'About';
+$lang['All tags'] = 'Kõik sildid';
+$lang['Any tag'] = 'Mistahes silt';
+$lang['At least one listed rule must be satisfied.'] = 'Vähemalt üks loetletud reeglitest peab olema rahuldatud.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Albumid';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Sule see aken';
+$lang['Complete RSS feed (photos, comments)'] = 'Täielik RSS voog (pildid, kommentaarid)';
+$lang['Confirm Password'] = 'Kinnita parool';
+$lang['Connection settings'] = 'Ühenduse seaded';
+$lang['Login'] = 'Kasutajanimi';
+$lang['Contact webmaster'] = 'Kontakteeru webmasteriga';
+$lang['Create a new account'] = 'Loo uus konto';
+$lang['Created on'] = 'Loodud';
+$lang['Creation date'] = 'Koostamise kuupäev';
+$lang['Current password is wrong'] = 'Praegune parool on vale';
+$lang['Dimensions'] = 'Dimensioonid';
+$lang['Display'] = 'Näita';
+$lang['Each listed rule must be satisfied.'] = 'Kõik loetletud reeglid peavad olema rahuldatud.';
+$lang['Email address'] = 'E-posti aadress';
+$lang['Enter your personnal informations'] = 'Sisesta isiklikud andmed';
+$lang['Error sending email'] = 'Viga e-posti saatmisel';
+$lang['File name'] = 'Faili nimi';
+$lang['File'] = 'Fail';
+$lang['Filesize'] = 'Failisuurus';
+$lang['Filter and display'] = 'Filtreeri ja kuva';
+$lang['Filter'] = 'Filtreeri';
+$lang['Forgot your password?'] = 'Unustasid parooli?';
+$lang['Go through the gallery as a visitor'] = 'Vaata galerii läbi külastajana';
+$lang['Help'] = 'Abi';
+$lang['Identification'] = 'Identiditseerimine';
+$lang['Photos only RSS feed'] = 'Ainult piltide RSS voog';
+$lang['Keyword'] = 'Märksõna';
+$lang['day'][0] = 'Pühapäev';
+$lang['day'][1] = 'Esmaspäev';
+$lang['day'][2] = 'Teisipäev';
+$lang['day'][3] = 'Kolmapäev';
+$lang['day'][4] = 'Neljapäev';
+$lang['day'][5] = 'Reede';
+$lang['day'][6] = 'Laupäev';
+$lang['month'][10] = 'Oktoober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'Detsember';
+$lang['month'][1] = 'Jaanuar';
+$lang['month'][2] = 'Veebruar';
+$lang['month'][3] = 'Märts';
+$lang['month'][4] = 'Aprill';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Juuni';
+$lang['month'][7] = 'Juuli';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['Notification'] = 'Teadaanne';
+$lang['Number of items'] = 'Ühikute arv';
+$lang['Original dimensions'] = 'Originaal mõõtmed';
+$lang['Password forgotten'] = 'Unustatud parool';
+$lang['Password'] = 'Parool';
+$lang['Post date'] = 'Postituse kuupäev';
+$lang['Posted on'] = 'Postitatud';
+$lang['Profile'] = 'Profiil';
+$lang['Quick connect'] = 'Kiirühendus';
+$lang['RSS feed'] = 'RSS voog';
+$lang['Register'] = 'Registreeru';
+$lang['Registration'] = 'Registreerimine';
+$lang['Related tags'] = 'Seotud märksõnad';
+$lang['Reset'] = 'Algseadista';
+$lang['Retrieve password'] = 'Tagasta parool';
+$lang['Search rules'] = 'Otsingu eeskirjad';
+$lang['Search tags'] = 'Otsingu märksõnad';
+$lang['Search'] = 'Otsi';
+$lang['display available tags'] = 'kuva võimalikud märksõnad';
+$lang['Since'] = 'Alates';
+$lang['Sort by'] = 'Sorteeri';
+$lang['Sort order'] = 'Sorteerimisjärjestus';
+$lang['Tag'] = 'Märksõna';
+$lang['Tags'] = 'Märksõnad';
+$lang['Unknown feed identifier'] = 'Tundmatu voog';
+$lang['User comments'] = 'Kasutaja kommetaarid';
+$lang['Username'] = 'Kasutajanimi';
+$lang['Visits'] = 'Külastused';
+$lang['Webmaster'] = 'Veebihaldur';
+$lang['Week %d'] = 'Nädal %d';
+$lang['About Piwigo'] = 'Piwigo-st';
+$lang['You are not authorized to access the requested page'] = 'Teil puudub juurdepääs soovitud leheküljele';
+$lang['add this photo to your favorites'] = 'lisa see foto oma lemmikuks';
+$lang['Administration'] = ' Administratsioon';
+$lang['all'] = 'kõik';
+$lang['ascending'] = 'kasvavalt';
+$lang['author(s) : %s'] = 'autor(id) : %s';
+$lang['Expand all albums'] = 'Laienda kõik albumid';
+$lang['posted after %s (%s)'] = 'postitatud peale %s (%s)';
+$lang['posted before %s (%s)'] = 'postitatud enne %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'postitatud %s (%s) ja %s (%s) vahel';
+$lang['posted on %s'] = 'postitatud %s';
+$lang['Best rated'] = 'Parimalt hinnatud';
+$lang['display best rated photos'] = 'Kuva parimalt hinnatud fotod';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Kõik';
+$lang['display each day with photos, month per month'] = 'kuva iga päev fotodega, iga kuu kohta';
+$lang['View'] = 'Vaata';
+$lang['Unknown feed identifier'] = 'Tundmatu voo identifikaator';
+$lang['User comments'] = 'Kasutaja kommentaarid';
+$lang['Username'] = 'Kasutajanimi';
+$lang['Visits'] = 'Külastust';
+$lang['Webmaster'] = 'Veebmaster';
+$lang['Week %d'] = 'Nädal %d';
+$lang['About Piwigo'] = 'Piwigost lähemalt';
+$lang['You are not authorized to access the requested page'] = 'Sa ei ole autoriseeritud sellele lehele juurdepääsuks';
+$lang['add this photo to your favorites'] = 'lisa see foto oma lemmikutesse';
+$lang['Administration'] = 'Administreerimine';
+$lang['all'] = 'kõik';
+$lang['ascending'] = 'kasvav';
+$lang['author(s) : %s'] = 'autor(it) : %s';
+$lang['Expand all albums'] = 'Laienda kõik albumid';
+$lang['posted after %s (%s)'] = 'postitatud peale %s (%s)';
+$lang['posted before %s (%s)'] = 'postitatud enne %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'postitatud %s (%s) ja %s (%s) vahel';
+$lang['posted on %s'] = 'postitatud %s';
+$lang['Best rated'] = 'Kõrgeimalt hinnatud';
+$lang['display best rated photos'] = 'kuva kõrgeimalt hinnatud fotod';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Kõik';
+$lang['display each day with photos, month per month'] = 'kuva iga fotodega päev, kuust kuusse';
+$lang['View'] = 'Vaade';
+$lang['chronology_monthly_calendar'] = 'Kuukalender';
+$lang['chronology_monthly_list'] = 'Kuu nimekiri';
+$lang['chronology_weekly_list'] = 'Nädala nimekiri';
+$lang['Click here if your browser does not automatically forward you'] = 'Kui su internetilehitseja ei suuna sind automaatselt edasi, vajuta siia';
+$lang['comment date'] = 'kommentaari kuupäev';
+$lang['Comment'] = 'Kommentaar';
+$lang['Your comment has been registered'] = 'Sinu kommentaar on registreeritud';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Kuritarvitusvastane süsteem : palun oota natuke, enne kui proovid uut kommentaari postitada';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Sinu kommentaari ei registreeritud, kuna see EI vasta valideerimisreeglitele.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administraator peab sinu kommentaari enne avalikustamist heaks kiitma.';
+$lang['This login is already used by another user'] = 'See kasutajanimi on kasutusel juba teise kasutaja poolt';
+$lang['Comments'] = 'Kommentaarid';
+$lang['Add a comment'] = 'Lisa kommentaar';
+$lang['created after %s (%s)'] = 'loodud peale %s (%s)';
+$lang['created before %s (%s)'] = 'loodud enne %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'loodud %s (%s) ja %s (%s) vahel';
+$lang['created on %s'] = 'loodud %s';
+$lang['Customize'] = 'Kohanda';
+$lang['Your Gallery Customization'] = 'Sinu galerii kohandamine';
+$lang['Default'] = 'Vaikimisi';
+$lang['delete this photo from your favorites'] = 'kustuta see foto oma lemmikutest';
+$lang['Delete'] = 'Kustuta';
+$lang['descending'] = 'kahanev';
+$lang['Download'] = 'allalaadimine';
+$lang['Download this file'] = 'lae see fail alla';
+$lang['edit'] = 'redigeeri';
+$lang['wrong date'] = 'vale kuupäev';
+$lang['excluded'] = 'välja arvatud';
+$lang['Your favorites'] = 'Sinu lemmikud';
+$lang['display your favorites photos'] = 'kuva oma lemmikfotod';
+$lang['Favorites'] = 'Lemmikud';
+$lang['First'] = 'Esimene';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerii on hoolduse ajaks lukustatud. Palun proovi natukese aja pärast uuesti.';
+$lang['Page generated in'] = 'Leht genereeritud';
+$lang['guest'] = 'külaline';
+$lang['Hello'] = 'Tere';
+$lang['available for administrators only'] = 'saadaval vaid administraatoritele';
+$lang['display this album'] = 'kuva see album';
+$lang['display last user comments'] = 'kuva viimased kasutajate kommentaarid';
+$lang['customize the appareance of the gallery'] = 'kohanda galerii välimust';
+$lang['search'] = 'otsi';
+$lang['Home'] = 'Avaleht';
+$lang['in this album'] = 'selles albumis';
+$lang['in %d sub-album'] = '%d alamalbumis';
+$lang['in %d sub-albums'] = '%d alamalbumites';
+$lang['included'] = 'kaasa arvatud';
+$lang['Invalid password!'] = 'Vigane salasõna!';
+$lang['Language'] = 'Keel';
+$lang['last %d days'] = 'viimased %d päeva';
+$lang['Last'] = 'Viimane';
+$lang['Logout'] = 'Logi välja';
+$lang['obligatory'] = 'kohustuslik';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Tere tulemast oma Piwigo fotogaleriisse!';
+$lang['... or browse your empty gallery'] = '... või sirvi oma tühja galeriid';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... või palun deaktiveeri see teade, leian ise lahenduse';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Tere %s, sinu Piwigo fotogalerii on tühi!';
+$lang['I want to add photos'] = 'Tahan lisada fotosid';
+$lang['Manage this user comment: %s'] = 'Halda selle kasutaja kommentaari: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'E-posti aadress on puudu. Palun täpsusta e-posti aadressi.';
+$lang['This author modified following comment:'] = 'See autor muutis järgnevat kommentaari:';
+$lang['This author removed the comment with id %d'] = 'See autor eemaldas kommentaari ID-ga: %d';
+$lang['html tags are not allowed in login'] = 'html tagid ei ole kasutajanimes lubatud';
+$lang['Invalid username or email'] = 'Vigane kasutajanimi või e-post';
+$lang['Password reset is not allowed for this user'] = 'Salasõna algseadistamine pole sellele kasutajale lubatud';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Kasutajal "%s" puudub e-posti aadress, salasõna algseadistamine pole võimalik';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Keegi taotles alljärgneva kasutajakonto salasõna algseadistamist:';
+$lang['Username "%s" on gallery %s'] = 'Kasutajanimi "%s" galeriis %s';
+$lang['To reset your password, visit the following address:'] = 'Salasõna algseadistamiseks külasta järgnevat aadressi:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Kui see on eksitus, siis lihtsalt ignoreeri seda kirja ja midagi ei juhtu.';
+$lang['Password Reset'] = 'Salasõna algseadistamine';
+$lang['Maximum photo height'] = 'Maksimaalne foto kõrgus';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimaalne kõrgus peab olema suurem kui 50';
+$lang['Maximum photo width'] = 'Maksimaalne foto laius';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimaalne laius peab olema suurem kui 50';
+$lang['display a calendar by creation date'] = 'kuva kalender loomiskuupäeva järgi';
+$lang['display all photos in all sub-albums'] = 'kuva kõik fotod kõikidest alamalbumitest';
+$lang['return to normal view mode'] = 'naase tavalisse kuvarežiimi';
+$lang['display a calendar by posted date'] = 'kuva kalender postitamiskuupäeva järgi';
+$lang['Most visited'] = 'Enim vaadatud';
+$lang['display most visited photos'] = 'kuva enim vaadatud fotod';
+$lang['The number of photos per page must be a not null scalar'] = 'Fotode arv ühel leheküljel peab olema nullist suurem arvsümbol';
+$lang['Number of photos per page'] = 'Fotode arv leheküljel';
+$lang['Unknown identifier'] = 'Tundmatu identifikaator';
+$lang['New password'] = 'Uus salasõna';
+$lang['Rate this photo'] = 'Hinda seda fotot';
+$lang['Next'] = 'Järgmine';
+$lang['no rate'] = 'hindamata';
+$lang['Photos posted within the last %d day.'] = 'Ainult viimase %d päeva jooksul postitatud fotod.';
+$lang['Photos posted within the last %d days.'] = 'Ainult viimase %d päeva jooksul postitatud fotod.';
+$lang['password updated'] = 'salasõna uuendatud';
+$lang['Recent period must be a positive integer value'] = 'Viimatine periood peab omama positiivset arvsümboli väärtust';
+$lang['photo'] = 'foto';
+$lang['Click on the photo to see it in high definition'] = 'Klikka fotol selle kõrgeralduses vaatamiseks';
+$lang['Show file metadata'] = 'Näita faili metaandmeid';
+$lang['Powered by'] = 'Toob teieni';
+$lang['Preferences'] = 'Eelistused';
+$lang['Previous'] = 'Eelmine';
+$lang['Random photos'] = 'Juhuvalikus fotod';
+$lang['display a set of random photos'] = 'kuva juhufotode kogum';
+$lang['Recent albums'] = 'Hiljutised albumid';
+$lang['display recently updated albums'] = 'kuva viimati uuendatud albumid';
+$lang['Recent period'] = 'Viimatine periood';
+$lang['Recent photos'] = 'Viimased fotod';
+$lang['display most recent photos'] = 'kuva kõige viimased fotod';
+$lang['Redirection...'] = 'Ümbersuunamine...';
+?>
Index: tags/2.4.0RC3/language/et_EE/iso.txt
===================================================================
--- tags/2.4.0RC3/language/et_EE/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/et_EE/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Estonian [EE]
Index: tags/2.4.0RC3/language/fa_IR/about.html
===================================================================
--- tags/2.4.0RC3/language/fa_IR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/about.html	(revision 14585)
@@ -0,0 +1,17 @@
+<p>اين گالري عکس توسط Piwigo به قدرت رسيده است.</p>
+
+<p>Piwigo يک گالري تصوير آنلاين است که براي وب طراحي شده .
+Piwigo با کمک عموم ، کاربران و گشترش دهندگان به اين جايگاه رسيده است. 
+گسترش‌دهنده‌ها(Extensions)ی 
+Piwigo به راحتي قابل سفارشي کردن گالري شما هستند.
+Piwigo يک اسکريپت رايگان و يک پروژه کدباز است.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">نمايش وب‌سايت پشتيباني Piwigo انگليسي</a></p>
+
+<p>The persian translation is maintained by (in alphabetical order):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=15764">Garcia</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=8812">mohammadN</a></li>
+</ul>
+.... Many thanks to you</p> 
Index: tags/2.4.0RC3/language/fa_IR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/fa_IR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/admin.lang.php	(revision 14585)
@@ -0,0 +1,764 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = "%d association";
+$lang['%d associations'] = "%d associations";
+$lang['%d album including'] = "%d دسته ضميمه شد";
+$lang['%d albums including'] = "%d دسته ضميمه شدند";
+$lang['%d physical'] = " %d فيزيکي";
+$lang['%d physical'] = " %d فيزيکي";
+$lang[' and %d virtual'] = " و %d مجازي";
+$lang[' and %d virtual'] = " و %d مجازي";
+$lang['%d album moved'] = "%d دسته منتقل شد";
+$lang['%d albums moved'] = "%d دسته منتقل شدند";
+$lang['%d group'] = "%d گروه";
+$lang['%d groups'] = "%d گروه";
+$lang['%d member'] = "%d کاربر";
+$lang['%d members'] = "%d کاربر";
+$lang['%d tag'] = "%d برچسب";
+$lang['%d tags'] = "%d برچسب";
+$lang['%d user comment rejected'] = "%d نظر کاربر رد شد";
+$lang['%d user comments rejected'] = "%d نظر کاربر رد شدند";
+$lang['%d user comment validated'] = "%d نظر کاربر تاييد شد";
+$lang['%d user comments validated'] = "%d نظر کاربر تاييد شد";
+$lang['%d user deleted'] = "%d کاربر حذف شد";
+$lang['%d users deleted'] = "%d کاربر حذف شد";
+$lang['%d user'] = "%d کاربر";
+$lang['%d users'] = "%d کاربر";
+$lang['%d waiting for validation'] = "%d در انتظار تاييد هستند";
+$lang['Actions'] = "اعمال";
+$lang['Activate'] = "فعال‌کردن";
+$lang['Add/delete a permalink'] = "افزودن/حذف لينک ثابت";
+$lang['Add a tag'] = "افزودن برچسب";
+$lang['Add a user'] = "افزودن کاربر";
+$lang['Add group'] = "افزوددن گروه";
+$lang['Add'] = "افزودن";
+$lang['Allow user registration'] = "فعال بودن ثبت‌نام کاربر";
+$lang['Apply to sub-albums'] = "براي زيردسته‌ها همين عمل را انجام بده!";
+$lang['Associated'] = "وابسته";
+$lang['Caddie management'] = "مدیریت سبد";
+$lang['Caddie'] = "سبد";
+$lang['Albums authorized thanks to group associations'] = "Categories authorized thanks to group associations";
+$lang['Album manual order was saved'] = "ترتيب دستي دسته‌ها با موفقيت ذخيره شد";
+$lang['Check for upgrade failed for unknown reasons.'] = "Check for upgrade failed for unknown reasons.";
+$lang['Check for upgrade'] = "چک براي بروزرساني";
+$lang['Comments for all'] = "يادداشت براي همه";
+$lang['Current name'] = "نام کنوني";
+$lang['Database'] = "پايگاه داده";
+$lang['Deactivate'] = "از کار انداختن";
+$lang['Delete Representant'] = "حذف نماينده";
+$lang['Delete selected tags'] = "حذف برچسب‌هاي انتخاب شده";
+$lang['Delete selected users'] = "حذف کاربران مشخص شده";
+$lang['Deletions'] = "حذف";
+$lang['Deny selected groups'] = "رد کردن گروه‌هاي انتخاب شده";
+$lang['Deny selected users'] = "رد کردن کاربران انتخاب شده";
+$lang['Description'] = "توضيحات";
+$lang['Display options'] = "نمايش گزينه‌ها";
+$lang['Dissociated'] = "جدا";
+$lang['Does not represent'] = "Does not represent";
+$lang['Edit selected tags'] = "ويرايش برچسب‌هاي انتخاب شده";
+$lang['Edit tags'] = "ويرايش برچسب‌ها";
+$lang['Email admins when a new user registers'] = "ارسال ايميل به به مديران زماني که يک کاربر جديد ثبت نام مي‌کند";
+$lang['Email admins when a valid comment is entered'] = "ارسال ايميل به مديران زماني که يک نظر تاييد شده وارد سيستم مي‌شود.";
+$lang['Email admins when a comment requires validation'] = "ارسال ايميل به مديران زماني که يک نظر نياز به تاييد دارد";
+$lang['Environment'] = "محيط(Environment)";
+$lang['Form'] = "فرم";
+$lang['Gallery title'] = "عنوان گالري";
+$lang['Grant selected groups'] = "Grant selected groups";
+$lang['Grant selected users'] = "Grant selected users";
+$lang['Group name'] = "نام گروه";
+$lang['Groups'] = "گروه‌ها";
+$lang['Guests'] = "ميهمانان";
+$lang['History'] = "تاريخچه";
+$lang['Informations'] = "اطلاعات";
+$lang['Install'] = "نصب";
+$lang['Link all album photos to a new album'] = "متصل کردن تمام عناصر دسته به يک دسته جديد";
+$lang['Link all album photos to some existing albums'] = "متصل کردن تمام عناصر دسته به دسته‌(ها)ي موجود";
+$lang['Linked albums'] = "دسته‌ها متصل شدند";
+$lang['Lock gallery'] = "قفل کردن گالري";
+$lang['Maintenance'] = "نگهداري";
+$lang['Edit album permissions'] = "مديريت مجوزهاي دسته";
+$lang['Manage permissions for group "%s"'] = "مديريت محوزهاي دسته‌ي \"%s\"";
+$lang['Manage permissions for user "%s"'] = "مديريت مجوزهاي کاربر \"%s\"";
+$lang['Manage tags'] = "مديريت برچسب‌ها";
+$lang['Members'] = "اعضا";
+$lang['Metadata synchronized from file'] = "Metadata synchronized from file";
+$lang['Move albums'] = "انتقال دسته‌ها";
+$lang['Move'] = "انتقال";
+$lang['Name'] = "نام";
+$lang['New name'] = "نام جديد";
+$lang['New parent album'] = "دسته والد جديد";
+$lang['New tag'] = "برچسب جديد";
+$lang['Number of comments per page'] = "تعداد نظرات در هر صفحه";
+$lang['Number of rates'] = "تعداد امتيازها";
+$lang['Number of thumbnails to create'] = "تعداد عکس‌ريزه (thumbnails) ايجاد شده";
+$lang['Only private albums are listed'] = "فقط دسته‌هاي شخصي ررا نمايش بده";
+$lang['Operating system'] = "سيستم عامل";
+$lang['Options'] = "گزينه‌ها";
+$lang['Other private albums'] = "دسته‌هاي شخصي ديگر";
+$lang['Page banner'] = "بنر صفحه";
+$lang['Parent album'] = "دسته والد";
+$lang['Path'] = "آدرس";
+$lang['Permalink'] = "لينک ثابت";
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = "لينک‌ثابت %s قبلا براي دسته %s تعيين شده بوده. لطفا اول اين لينک‌ثابت را از تاريخچه حذف نماييد";
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "لينک‌ثابت مي‌تواند فقط ترکيبي از a-z, A-Z, 0-9, \"-\", \"_\" يا \"/\" باشد. اين نبايد فقط داراي عدد باشد يا با عدد شروع شود. مي توانيد  از \"-\" در ابتدای آن استفاده نمایید.";
+$lang['Permalink %s is already used by album %s'] = "لينک‌ثابت %s در حال استفاد دسته %s مي‌باشد.";
+$lang['Permalink history'] = "Pتاريخچه لينک‌ثابت";
+$lang['Permalinks'] = "لینک‌های‌ثابت";
+$lang['Permission denied'] = "شما مجوز دسترسی را ندارید";
+$lang['Permission granted thanks to a group'] = "Permission granted thanks to a group";
+$lang['Permission granted'] = "Permission granted";
+$lang['Photo informations updated'] = "اطلاعات تصویر بروز رسانی شد";
+$lang['Plugins'] = "پلاگین‌ها";
+$lang['Position'] = "موقعیت";
+$lang['Preferences'] = "تنظیمات";
+$lang['Properties'] = "خواص";
+$lang['Random photo'] = "تصاویر تصادفی";
+$lang['Rate date'] = "تاریخ امتیازدهی";
+$lang['Rating by guests'] = "دادن امتیاز توسط میهمان";
+$lang['Rating'] = "امتیازدهی";
+$lang['Reject'] = "رد کردن";
+$lang['Representant'] = "نماینده";
+$lang['Representation of albums'] = "نماینده دسته‌ها";
+$lang['Representative'] = "نماینده";
+$lang['Represents'] = "نمایندگی";
+$lang['Save order'] = "ذخیره این ترتیب";
+$lang['Save to permalink history'] = "ذخیره در تاریخچه لینک‌ثابت";
+$lang['Select at least one album'] = "حداقل یک دسته انتخاب نمایید";
+$lang['Select at least one photo'] = "حداقل یک عکس انتخاب نمایید";
+$lang['Select at least one user'] = "حداقل یک کاربر انتخاب نمایید";
+$lang['Show info'] = "نمایش اطلاعات";
+$lang['Site manager'] = "مدیریت سایت";
+$lang['Status'] = "وضعیت";
+$lang['Statistics'] = "آمار";
+$lang['Storage album'] = "ذخیره دسته";
+$lang['Sum of rates'] = "مجموع امتیازها";
+$lang['Tag "%s" already exists'] = "برچسب \"%s\" در سیستم موجود است";
+$lang['Tag "%s" was added'] = "برچسب \"%s\" افزوده شد";
+$lang['Tag selection'] = "انتخاب برچسب‌ها";
+$lang['The %d following tags were deleted'] = "%d برچسب حذف شد.";
+$lang['Unable to check for upgrade.'] = "سیستم قادر به به روز رسانی نیست";
+$lang['Uninstall'] = "حذف";
+$lang['Use the default photo sort order (defined in the configuration file)'] = "استفاده از پیش‌فرض برای مرتب کردن تصاویر (پیش‌فرض در فایل پیکربندی(Configuration) است";
+$lang['User comments validation'] = "تایید نظرات کاربر";
+$lang['Users'] = "کاربران";
+$lang['Validate'] = "تایید";
+$lang['Validation'] = "تایید";
+$lang['Version'] = "نسخه";
+$lang['Virtual albums to move'] = "انتقال دسته‌های مجازی";
+$lang['Virtual album name'] = "نام دسته مجازی";
+$lang['Webmaster cannot be deleted'] = "شما نمی‌توانید وب‌مستر(مدیر) را حذف کنید";
+$lang['You are running on development sources, no check possible.'] = "شما از نسخه development(توسعه) استفاده می‌کنید ؛ امکان چک کردن نیست";
+$lang['You cannot delete your account'] = "شما نمی‌توانید حساب خود را حذف کنید";
+$lang['You cannot move an album in its own sub album'] = "شما نمی‌توانید دسته والد را به زیردسته خودش انتقال دهید.";
+$lang['You need to confirm deletion'] = "شما باید حذف را تایید کنید";
+$lang['add tags'] = "add tags";
+$lang['Associate to album'] = "پیوستن به دسته";
+$lang['associate to group'] = "پیوستن به گروه";
+$lang['Authorized'] = "مجاز";
+$lang['Add a virtual album'] = "افزودن یک دسته مجازی";
+$lang['Authorize users to add comments on selected albums'] = "مجاز کردن کاربران برای افزودن نظر به دسته‌های انتخاب شده";
+$lang['The name of an album must not be empty'] = "نام دسته نمی‌تواند خالی باشد";
+$lang['Lock albums'] = "قفل‌کردن دسته‌ها";
+$lang['Private'] = "دسته‌های شخصی";
+$lang['Public'] = "دسته‌های عمومی";
+$lang['Find a new representant by random'] = "پیداکردن یک نماینده جدید به صورت تصادفی";
+$lang['Public / Private'] = "عمومی / خصوصی";
+$lang['Manage authorizations for selected albums'] = "مدیریت مجوزهای دسته‌های انتخاب شده";
+$lang['Virtual album added'] = "دسته مجازی افزوده شد";
+$lang['Virtual album deleted'] = "دسته مجازی حذف شد";
+$lang['Access type'] = "نوع دسترسی";
+$lang['Information data registered in database'] = "اطلاعات داده در پایگاه داده ثبت شد";
+$lang['Default display'] = "نمایش پیش‌فرض";
+$lang['The gallery URL is not valid.'] = "آدرس URL گالری اشتباه است.";
+$lang['Main'] = "صفحه اصلی";
+$lang['The number of comments a page must be between 5 and 50 included.'] = "تعداد نظرات در هر صفحه باید عددی بین 5 تا 50 باشد.";
+$lang['Configuration'] = "پیکربندی";
+$lang['confirm'] = "تایید";
+$lang['Date'] = "تاریخ";
+$lang['delete album'] = "حذف دسته";
+$lang['Dissociate from album'] = "جداکردن از دسته";
+$lang['dissociate from group'] = "جدا کردن از گروه";
+$lang['Album updated successfully'] = "اطلاعات دسته با موفقیت به‌روزرسانی شد.";
+$lang['photos per page'] = "تعداد آیتم‌ها در صفحه";
+$lang['High definition enabled'] = "High definition enabled";
+$lang['File'] = "فایل";
+$lang['first photo added on %s'] = "شی اول به %s افزوده شد";
+$lang['Forbidden'] = "غیرمجاز";
+$lang['global mode'] = "حالت کلی";
+$lang['group "%s" added'] = "گروه \"%s\" افزوده شد";
+$lang['group "%s" deleted'] = "گروه \"%s\" حذف شد";
+$lang['group "%s" updated'] = "گروه \"%s\" به‌روزرسانی شد";
+$lang['The name of a group must not contain " or \' or be empty.'] = "نام گروه نباید دارای علامت \" یا  ' باشد و نمی‌تواند خالی باشد";
+$lang['This name is already used by another group.'] = "این نام قبلا برای یک گروه ثبت شده‌ است";
+$lang['High definition'] = "High definition";
+$lang['jump to album'] = "رفتن به این دسته";
+$lang['jump to photo'] = "رفتن به این تصویر";
+$lang['leave'] = "بدون‌تغییر";
+$lang['Lock'] = "قفل کردن";
+$lang['Locked'] = "قفل";
+$lang['manage album photos'] = "مدیریت اشیا دسته";
+$lang['manage sub-albums'] = "مدیریت زیردسته‌ها";
+$lang['Manage'] = "مدیریت";
+$lang['maximum height'] = "حداکثر طول";
+$lang['maximum width'] = "حداکثر عرض";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = "Execution time is out, treatment must be continue [Estimated time: %d second].";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "Execution time exceeded, the treatment must continue [Estimated time: %d seconds].";
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = "The time to prepare the list of users who will be sent mail is limited. Others users are not listed.";
+$lang['Time to send mail is limited. Others mails are skipped.'] = "The time to send mail is limited. Others mails have been skipped.";
+$lang['To send ?'] = "ارسال به؟";
+$lang['Last send'] = "آخرین ارسال";
+$lang['email'] = "ایمیل";
+$lang['User'] = "کاربر";
+$lang['See you soon,'] = "زود می‌بینمت،";
+$lang['Go to'] = "برو به";
+$lang['Hello'] = "سلام";
+$lang['New photos were added'] = "اشیا جدید افزوده شد";
+$lang['on'] = "فعال";
+$lang['between'] = "بین";
+$lang['and'] = "و";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "وبمستر شما را برای دریافت آخرین اطلاعات بوسیله ایمیل عضو خبرنامه کرده است.";
+$lang['You have subscribed to receiving notifications by mail.'] = "شما در خبرنامه Piwigo عضو شدید و آخرین تغییرات بوسیله ایمیل به اطلاع شما خواهد رسید.";
+$lang['To subscribe'] = "مشترک شدن";
+$lang['If you encounter problems or have any question, please send a message to'] = "اگر به مشکلی برخورد کردید یا سوالی داشتید ، می‌توانید یک پیام به این آدرس ارسال نمایید:";
+$lang['[NBM] Problems or questions'] = "مشکل یا سوال";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "اشتراک شما در خبرنامه بوسیله‌ی ایمیل لغو گردید";
+$lang['You have unsubscribed from receiving notifications by mail.'] = "شما از اشتراک در خبرنامه‌ای که شروع کردید لغو شدید.";
+$lang[', click on'] = "، کلیک کنید";
+$lang['To unsubscribe'] = "حذف اشتراک";
+$lang['With blank value, gallery title will be used'] = "اگر خالی بگذارید ، عنوان گالری جای آن می‌نشیند";
+$lang['Notification'] = "اشتراک";
+$lang['Error when sending email to %s [%s].'] = "خطا در ارسال ایمیل به %s [%s].";
+$lang['Mail sent to %s [%s].'] = "ایمیل به %s [%s] ارسال شد.";
+$lang['%d mail was sent.'] = "%d ایمیل ارسال شد.";
+$lang['%d mails were sent.'] = "%d ایمیل ارسال شد.";
+$lang['%d mail was not sent.'] = "%d ایمیل ارسال نشدند";
+$lang['%d mails were not sent.'] = "%d ایمیل ارسال نشد.";
+$lang['No mail to send.'] = "هیچ ایمیلی برای ارسال نیست";
+$lang['There is no available subscribers to mail.'] = "هیچ اشتراک ایمیلی موجود نیست.";
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "اشتراک‌هایی که موجود است لیست می‌شوند ، در صورتی که چیزهای جدیدی برای اعلام کردن داشته باشند.";
+$lang['Anyway only webmasters can see this tab and never administrators.'] = "در هر صورت فقط وبمستر می‌تواند به این قسمت وارد شود و مدیران نمی‌توانند داخل این قسمت شوند.";
+$lang['No user to send notifications by mail.'] = "کاربری برای ارسال خخبرنامه به‌وسیله ایمیل وجود ندارد.";
+$lang['New photos added'] = "اشیا جدید اضافه شدند";
+$lang['Subscribe to notification by mail'] = "اشتراک به‌وسیله ایمیل";
+$lang['Unsubscribe from notification by mail'] = "حذف اشتراک به‌وسیله ایمیل";
+$lang['Parameter'] = "تنظیمات";
+$lang['Operation in progress'] = 'درخواست در حال پردازش.';
+$lang['Continue processing treatment'] = "ادامه پردازش درخواست";
+$lang['Complementary mail content'] = "مکمل محتوای ایمیل";
+$lang['Add detailed content'] = "تعدادی از جزئیات حذف شد";
+$lang['Send mail as'] = "ارسال ایمیل از";
+$lang['Send mail to users'] = "ارسال ایمیل به کاربران";
+$lang['Send'] = "ارسال";
+$lang['Options'] = "گزینه‌ها";
+$lang['Subscribed'] = "مشترک‌شده";
+$lang['Subscribe'] = "اشتراک";
+$lang['Parameters'] = "پارامترها";
+$lang['Select recipients'] = "انتخاب گیرنده‌ها";
+$lang['Subscribe/unsubscribe users'] = "مشترک/لغو اشتراک کاربران";
+$lang['Unsubscribed'] = "لغو اشتراک";
+$lang['%d parameter was updated.'] = "%d پارامتر به‌روزرسانی شد.";
+$lang['%d parameters were updated.'] = "%d پارامتر به‌روزرسانی شد.";
+$lang['%d user was not updated.'] = "%d کاربر به‌روز رسانی شد.";
+$lang['%d users were not updated.'] = "%d کاربر به‌روز رسانی نشد";
+$lang['User %s [%s] was removed from the subscription list.'] = "کاربر %s [%s] از لیست مشترکان خبرنامه حذف شد.";
+$lang['User %s [%s] was added to the subscription list.'] = "کاربر %s [%s] به لیست مشترکان خبرنامه اضافه شد.";
+$lang['%d user was updated.'] = "%d کاربر به‌روز رسانی شد.";
+$lang['%d users were updated.'] = "%d کاربر به‌روز رسانی شد.";
+$lang['User %s [%s] was not removed from the subscription list.'] = "کاربر %s [%s] از لیست اعضا خبرنامه حذف شد.";
+$lang['User %s [%s] was not added to the subscription list.'] = "کاربر %s [%s] به لیست اعضا خبرنامه اضافه نشد.";
+$lang['User %s [%s] added.'] = "کاربر %s [%s] اضافه شد.";
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = "اخطار: اشتراک یا لغو اشتراک با ارسال ایمیل به کاربران صورت می‌گیرد.";
+$lang['Send mail on HTML format'] = "ارسال ایمیل در فرمت HTML";
+$lang['Include display of recent photos grouped by dates'] = "ضمیمه کردن آخرین تصاویر گروه با مرتب سازی تاریخ";
+$lang['Available only with HTML format'] = "فقط برای فرمت HTML موجود است";
+$lang['no write access'] = "دسترسی نوشتن را ندارید";
+$lang['Permissions'] = "مجوزها";
+$lang['private'] = "شخصی";
+$lang['public'] = "عمومی";
+$lang['Purge never used notification feeds'] = "Purge never used notification feeds";
+$lang['Purge sessions'] = "حذف جلسه‌ها(sessions)";
+$lang['randomly represented'] = "نماینده تصادفی";
+$lang['registration date'] = "تاریخ ثبت نام";
+$lang['clean'] = "پاک‌سازی";
+$lang['remove remote listing.xml file'] = "حذف ریموت فایل listing.xml";
+$lang['generate listing'] = "تولید فهرست";
+$lang['generate file listing.xml on remote site'] = "تولید فایل listing.xml در ریموت سایت";
+$lang['Create this site'] = "ایجاد این سایت";
+$lang['A local listing.xml file has been found for'] = "A local listing.xml file has been found for";
+$lang['read local listing.xml and update'] = "read local listing.xml and update";
+$lang['test'] = "تست";
+$lang['test this remote site'] = "تست ریمت این سایت";
+$lang['remove tags'] = "حذف برچسب‌ها";
+$lang['Repair and optimize database'] = "بازسازی و بهینه سازی پایگاه‌داده";
+$lang['selection'] = "انتخاب";
+$lang['set to'] = "تنظیم به";
+$lang['singly represented'] = "نماینده ثابت";
+$lang['This site already exists'] = "این سایت در حال حاضر موجود است";
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = "ایجاد یک سایت جدید : (این URL را در فایل create_listing_file.php ذخیره می‌کند.)";
+$lang['created'] = "ایجادشد";
+$lang['delete'] = "حذف‌شد";
+$lang['delete this site and all its attached elements'] = "این سایت با تمام اطلاعات مربوط به آن حذف شد.";
+$lang['deleted'] = "حذف‌شد";
+$lang['an error happened'] = "یک خطا رخ داده است";
+$lang['file create_listing_file.php on remote site was not found'] = "فایل create_listing_file.php در ریموت این سایت موجود نیست";
+$lang['Local'] = "محلی";
+$lang['Remote'] = "ریموت";
+$lang['update the database from files'] = "به روز رسانی پایگاه داده از فایل‌ها";
+$lang['status'] = "وضعیت";
+$lang['Directory'] = "دایرکتوری";
+$lang['sub-albums'] = "زیر دسته‌ها";
+$lang['Synchronize metadata'] = "همگام سازی ابرداده(metadata)";
+$lang['target'] = "هدف";
+$lang['title'] = "عنوان";
+$lang['Album list management'] = "مدیریت دسته‌ها";
+$lang['Piwigo configuration'] = "پیکربندی Piwigo";
+$lang['Edit album'] = "ویرایش یک دسته";
+$lang['Group management'] = "مدیریت گروه‌ها";
+$lang['User list'] = "لیست کاربران";
+$lang['Edit photo information'] = "تغییر اطلاعات تصویر";
+$lang['Thumbnail creation'] = "ایجاد عکس‌ریزه(Thumbnail)";
+$lang['Database synchronization with files'] = "همگام‌سازی پایگاه‌داده با فایل‌ها";
+$lang['all'] = "همه";
+$lang['photos without thumbnail (jpeg and png only)'] = "تصاویر بدون عکس‌ریزه(thumbnail) (فقط jpeg و png)";
+$lang['height must be a number superior to'] = "طول باید عددی بزرگتر از";
+$lang['width must be a number superior to'] = "عرض باید عددی بزرگتر از";
+$lang['for the file format'] = "برای نوع فایل(file format)";
+$lang['No missing thumbnail'] = "No missing thumbnail";
+$lang['Photo unreachable or no support'] = "تصاویر غیرقابل دسترسی یا بدون پشتیبانی سیستم";
+$lang['GD version'] = "نصخه GD";
+$lang['generated in'] = "تولید در";
+$lang['Results of miniaturization'] = "نتیج پردازش کوچک‌سازی";
+$lang['General statistics'] = "آمار عمومی";
+$lang['max time'] = "حداکثر زمان";
+$lang['average time'] = "زمان متوسط";
+$lang['min time'] = "کمترین زمان";
+$lang['number of miniaturized photos'] = "تعداد عکس‌ریزه‌های(thumbnails) ایجاد شده";
+$lang['total time'] = "تمام زمان";
+$lang['for this file format'] = "برای این نوع فایل (file format)";
+$lang['unit mode'] = "حالت تکی";
+$lang['Unlocked'] = "باز";
+$lang['unset'] = "unset";
+$lang['Update albums informations'] = "به روز رسانی اطلاعات دسته‌ها";
+$lang['Update photos information'] = "به روز رسانی اطلاعات تصاویر";
+$lang['Synchronize'] = "همگام‌سازی";
+$lang['reduce to single existing albums'] = "reduce to single existing categories";
+$lang['Choose an option'] = "انتخاب یک گزینه";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = "نمایش حداکثر اطلاعات (افزودن دسته‌ها و اشیا ، حذف دسته‌ها و اشیا)";
+$lang['Piwigo version differs on the remote site'] = "نسخه Piwigo که اینجا نصب شده با نسخه Piwigo در ریموت سایت متفاویت است!";
+$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = "نسخه فایل create_listing_file.php در ریموت سایت با نسخه Piwigo باید یکسان باشد.";
+$lang['listing.xml file was not found'] = "فایل listing.xml موجود نیست!";
+$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = "فایل listing.xml در ریموت سایت موجود نمی‌باشد. این فایل در  \"generate listing\" مدیریت سایت تولید می‌شود.";
+$lang['Error list'] = "فهرست خطاها";
+$lang['Errors caption'] = "عنوان خطاها";
+$lang['Detailed informations'] = "جزئیات";
+$lang['File/directory read error'] = "خطا در خواندن فایل/دایرکتوری";
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = "این فایل یا دایرکتوری غیرقابل دسترسی است (این به خطا با این دلیل است که یا فایل موجود نیست و یا دسترسی به آن برای شما ممنوع است)";
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = "هر تصویری نیاز به یک عکس‌ریزه(thumbnail) دارد. عکس‌ریزه‌ها باید در زیر دایرکتوری \"thumbnail\" در دایرکتوری دسته باید وجود داشته باشد. نام‌فایل عکس‌ریزه(thumbnail) باید با پیشوندی که پیکربندی و فرمت آن باید مانند لیست زیر باشد :";
+$lang['missing thumbnail'] = "عکس‌ریزه(thumbnail) موجود نیست.";
+$lang['albums deleted in the database'] = "دسته‌ها از پایگاه داده حذف شدند";
+$lang['photos deleted from the database'] = "اشیا از پایگاه داده حذف شدند";
+$lang['photos candidates for metadata synchronization'] = "تصاویری که می‌خواهند ابرداده(metadata) خودر را همگام‌سازی کنند";
+$lang['photos informations synchronized with files metadata'] = "اشیائی کهاطلاعات آن‌ها با فایل‌های ابرداده(metadata) همگام‌سازی شدند";
+$lang['errors during synchronization'] = "خطا در همگام‌سازی";
+$lang['albums added in the database'] = "دسته‌ها در پایگاه‌داده اضافه شدند";
+$lang['photos added in the database'] = "اشیا در پایگاه‌داده اضافه شدند";
+$lang['photos updated in the database'] = "اشیا در پایگاه‌داده بروز شدند";
+$lang['Search for new images in the directories'] = "جستجو برای تصاویر جدید در دایرکتوری‌ها";
+$lang['added'] = "افزوده شد";
+$lang['deleted'] = "حذف شد";
+$lang['Metadata synchronization results'] = "نتیج همگام‌سازی ابرداده(metadata)";
+$lang['only perform a simulation (no change in database will be made)'] = "فقط انجام یک شبیه‌سازی (هیچ چیزی در پایگاه داده تغییر نمی‌کند)";
+$lang['Simulation'] = "شبیه‌سازی";
+$lang['directories + files'] = "دایرکتوری + فایل‌ها";
+$lang['only directories'] = "فقط دایرکتوری‌ها";
+$lang['synchronize files structure with database'] = "همگام‌سازی ساختار(structure) فایل‌ها با پایگاه‌داده";
+$lang['synchronize files metadata with database photos informations'] = "همگام‌سازی اشیا پایگاه‌داده با استفاده از فایل ابرداده(metadata)";
+$lang['even already synchronized photos'] = "even already synchronized photos";
+$lang['Used metadata'] = "استفاده از ابرمتن(Metadata)";
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = "نام دایرکتوری‌ها و فایل‌ها فقط می تواند شامل اعداد ، حروف و \"-\" ، \"_\" یا \".\" باشد.";
+$lang['wrong filename'] = "نام‌فایل نادرست است";
+$lang['Upload'] = "آپلود";
+$lang['user "%s" added'] = "کاربر \"%s\" افزوده شد";
+$lang['User status'] = "وضعیت کاربر";
+$lang['user_status_admin'] = "مدیر";
+$lang['user_status_generic'] = "عمومی";
+$lang['user_status_guest'] = "میهمان";
+$lang['user_status_normal'] = "کاربر";
+$lang['user_status_webmaster'] = "وب‌مستر";
+$lang['Virtual album'] = "دسته مجازی";
+$lang['Waiting'] = "در انتظار";
+$lang['default'] = "پیش‌فرض";
+$lang['Toggle \'default group\' property'] = "معکوش کردن خواص 'گروه پیش‌فرض'";
+$lang['Advanced features'] = "امکانات پیشرفته";
+$lang['Overall'] = "دید کلی";
+$lang['Year'] = "سال";
+$lang['Month'] = "ماه";
+$lang['Day'] = "روز";
+$lang['Pages seen'] = "صفحات دیده شده";
+$lang['Time'] = "دفعه";
+$lang['IP'] = "IP";
+$lang['Element'] = "اشیا";
+$lang['Section'] = "بخش";
+$lang['Save page visits by guests'] = "صفحات دیده‌شده توسط میهمانان ذخیره شود";
+$lang['Save page visits by users'] = "صفحات دیده‌شده توسط کاربران ذخیره شود";
+$lang['Save page visits by administrators'] = "صفحات دیده‌شده توسط مدیران ذخیره شود";
+$lang['An information email was sent to group "%s"'] = "Information email sent to group \"%s\"";
+$lang['Send an information email to group members'] = "Send an information email to group members";
+$lang['Group'] = "'v,i";
+$lang['[%s] Visit album %s'] = "[%s] درحال مشاهده دسته %s می‌باشد.";
+$lang['Hello,'] = "سلام ،";
+$lang['See you soon.'] = "زود به گالری ما برگرد.";
+$lang['Discover album:'] = "دسته‌های موجود:";
+$lang['Mail content'] = "محتویات ایمیل";
+$lang['none'] = "هیچ‌کدام";
+$lang['high'] = "زیاد";
+$lang['other'] = "دیگر";
+$lang['Element type'] = "نوع شی";
+$lang['Image id'] = "شناسه تصویر";
+$lang['Summary'] = "خلاصه";
+$lang['%d line filtered'] = "%d سطر فیلتر شد";
+$lang['%d lines filtered'] = "%d سطر فیلتر شد";
+$lang['%d guest'] = "%d میهمان";
+$lang['%d guests'] = "%d میهمان";
+$lang['Hour'] = "ساعت";
+$lang['guest'] = "میهمان";
+$lang['default values'] = "مقدارهای پیش‌فرض";
+$lang['High filesize'] = "بیشترین مقدار حجم‌فایل";
+$lang['Guest cannot be deleted'] = "میهمان را نمی‌توانید حذف کنید.";
+$lang['Default user cannot be deleted'] = "کاربر پیش‌فرض قابل حذف کردن نیست";
+$lang['Purge history detail'] = "پاک‌کردن جزئیات تاریخچه";
+$lang['Purge history summary'] = "پاک‌کردن خلاصه تاریخچه";
+$lang['Check integrity'] = "چک کامل";
+$lang['Anomaly'] = "Anomaly";
+$lang['Correction'] = "اصلاح";
+$lang['Automatic correction'] = "اصلاح اتوماتیک";
+$lang['Impossible automatic correction'] = "Automatic correction impossibl";
+$lang['Correction applied with success'] = "اصلاح با موفقیت صورت گرفت";
+$lang['Correction applied with error'] = "اصلاح با چند خطا صورت گرفت";
+$lang['%d anomaly has been detected.'] = "%d anomaly has been detected.";
+$lang['%d anomalies have been detected.'] = "%d anomalies have been detected.";
+$lang['%d anomaly has been corrected.'] = "%d anomaly has been corrected.";
+$lang['%d anomalies have been detected corrected.'] = "%d anomalies have been detected and corrected.";
+$lang['%d anomaly has not been corrected.'] = "%d anomaly has not been corrected.";
+$lang['%d anomalies have not been corrected.'] = "%d anomalies have not been corrected.";
+$lang['Go to %s or %s for more informations'] = "برای دریافت اطلاعات بیشتر به %s یا %s مراجعه نمایید";
+$lang['the forum'] = "تالارگفتگو";
+$lang['the wiki'] = "ویکی";
+$lang['%s value is not correct file because exif are not supported'] = "%s value is incorrect because exif are not supported";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s در فایل local/config/config.inc.php باید مقدار 'false' داشته باشد.";
+$lang['Main "guest" user does not exist'] = "در سیستم کاربر \"میهمان\" وجود ندارد";
+$lang['Main "guest" user status is incorrect'] = "وضعیت کاربر \"میهمان\" نادرست است.";
+$lang['Default user does not exist'] = "کاربر پیش‌فرض موجود نیست";
+$lang['Main "webmaster" user does not exist'] = "کاربر \"وب‌مستر\" موجود نیست";
+$lang['Main "webmaster" user status is incorrect'] = "وضعیت کاربر \"وب‌مستر\" نادرست است.";
+$lang['User "%s" created with "%s" like password'] = "کاربر \"%s\" با گذرواژه \"%s\" ایجاد شد";
+$lang['Status of user "%s" updated'] = "وضعیت کاربر \"%s\" به روز شد";
+$lang['add new photos to caddie'] = "افزودن آیتم‌های جدید به سبد";
+$lang['No display'] = "بدون نمایش";
+$lang['Classic display'] = "نمایش کلاسیک";
+$lang['Hoverbox display'] = "نمایش Hoverbox";
+$lang['Mail address is obligatory for all users'] = "آدرس ایمیل برای تمام کاربران اجباری است";
+$lang['Minimum privacy level'] = "پایین‌ترین سطح ‌خصوصی";
+$lang['Privacy level'] = "سطح خصوصی";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "ارتباطها";
+$lang['Level 2'] = "دوستان";
+$lang['Level 4'] = "خانواده";
+$lang['Level 8'] = "مدیران";
+$lang['Reinitialize check integrity'] = "Reinitialize integrity check";
+$lang['Check all'] = "علامت‌زدن همه";
+$lang['Uncheck all'] = "برداشتن علامت همه";
+$lang['Check automatic corrections'] = "بررسی اتوماتیک اصلاحات";
+$lang['Apply selected corrections'] = "تایید اصلاحات انتخاب شده";
+$lang['Ignore selected anomalies'] = "Ignore selected anomalies";
+$lang['Refresh'] = "تازه‌کردن(Refresh)";
+$lang['The anomaly will be ignored until next application version'] = "The anomaly will be ignored until next application version";
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = "Corrected  anomaly will no longer be ignored";
+$lang['%d anomaly has been ignored.'] = "%d anomaly has been ignored.";
+$lang['%d anomalies have been ignored.'] = "%d anomalies have been ignored.";
+$lang['Plugins which need upgrade'] = "آپگرید پلاگین‌ها";
+$lang['Plugin list'] = "فهرست پلاگین‌ها";
+$lang['Check for updates'] = "چک آپدیت";
+$lang['Other plugins'] = "دیگر پلاگین‌های موجود";
+$lang['Last revisions'] = "آخرین بررسی";
+$lang['Delete'] = "حذف";
+$lang['Are you sure you want to delete this plugin?'] = "شما مطمئن هستید که ‌می‌خواهید این پلاگین را حذف کنید؟";
+$lang['Are you sure you want to install this plugin?'] = "شما مطمئن هستید که می‌خواهید این پلاگین را نصب کنید؟";
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "شما مطمئن هستید که می‌خواهید این آپگرید را نصب کنید؟ . شما باید این را تایید کنید زیرا ممکن است نیاز به حذف پلاگین داشته باشد.";
+$lang['%s has been successfully upgraded.'] = "%s با موفقیت آپگرید شد.";
+$lang['Plugin has been successfully copied'] = "پلاگین با موفقیت کپی شد";
+$lang['You might go to plugin list to install and activate it.'] = "به فهرست پلاگین‌ها بروید، پلاگین را نصب کنید و سپس ان را فعال نمایید.";
+$lang['Can\'t create temporary file.'] = "Piwigo قادر به ایجاد فایل موقت نیست.";
+$lang['Can\'t download archive.'] = "Piwigo نمی‌تواند فایل آرشیو را دریافت کند.";
+$lang['Can\'t read or extract archive.'] = "آرشیو قابل خواندن و یا بازکردن نیست.";
+$lang['An error occured during extraction (%s).'] = "یک خطا در بازکردن فایل‌های (%s) رخ داده است.";
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "لطفا سطح دسترسی پوشه \"plugins\" و پوشه‌های زیر مجموعه آن را چک کنید (CHMOD).";
+$lang['Can\'t connect to server.'] = "ارتباط با سرور ممکن نیست.";
+$lang['Purge compiled templates'] = "پاک‌ازی قالب واردشده(کامپایل شده)";
+$lang['ACCESS_0'] = "دسترسی آزاد";
+$lang['ACCESS_1'] = "دسترسی برای همه";
+$lang['ACCESS_2'] = "دستری برای کاربران ثبت‌نام شذه";
+$lang['ACCESS_3'] = "دسترسی برای مدیران";
+$lang['ACCESS_4'] = "دسترسی برای وب‌مستر";
+$lang['ACCESS_5'] = "بدون مجوز دسترسی";
+$lang['Support'] = "پشتیبانی";
+$lang['Documentation'] = "مستندات";
+$lang['A new version of Piwigo is available.'] = "نسخه جدید Piwigo موجود است.";
+$lang['Piwigo Administration'] = "مدیریت Piwigo";
+$lang['Piwigo version'] = "نسخه Piwigo";
+$lang['You are running the latest version of Piwigo.'] = "شما آخرین نسخه Piwigo را دارید.";
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = "نسخه %s [%s] نصب شده با نسخه نصب شده سازگار نیست، نسخه مورد نیاز [%s] می‌باشد.";
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "شما برای استفاده از تمام مزیت‌های پلاگین‌ها باید گالری خود را آپگرید کنید. در غیر این‌ صورت ممکن است که پلاگین‌ها به درستی اجرا نشود و یا اصلا اجرا نشود.";
+$lang['Deleted on'] = "حذف در";
+$lang['Last hit'] = "آخرین بازدید";
+$lang['GD library is missing'] = "کتابخانه GD یافت نشد!";
+$lang['Templates'] = "ویرایش قالب‌ها";
+$lang['Extend for templates'] = "بازکردن(گسترش) قالب‌ها";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "Replacement of original templates by customized templates from the template-extension subfolder";
+$lang['Replacers (customized templates)'] = "جایگزینی (سفارشی کردن قالب)";
+$lang['Original templates'] = "قالب‌های اصلی";
+$lang['Optional URL keyword'] = "کلیدواژه URL اختیاری";
+$lang['Templates configuration has been recorded.'] = "پیکربندی قالب ثبت شد.";
+$lang['All optimizations have been successfully completed.'] = "بهینه‌سازی با موفقیت کامل شد.";
+$lang['Optimizations have been completed with some errors.'] = "بهینه‌سازی پایان با وجود چند خطا تمام شد.";
+$lang['Modify information'] = "ویرایش اطلاعات";
+$lang['nothing'] = "هیچ‌چیز";
+$lang['overrides existing values with empty ones'] = "overrides existing values with empty ones";
+$lang['Manage photo ranks'] = "مدیریت امتیاز تصاویر";
+$lang['Edit ranks'] = "ویرایش امتیازها";
+$lang['No photo in this album'] = "هیچ چیزی در این دسته موجمود نیست.";
+$lang['Images manual order was saved'] = "ترتیب دستی تصاویر ذخیره شد.";
+$lang['ranks'] = "امتیازها";
+$lang['By rank'] = "به وسیله امتیاز";
+$lang['Manual order'] = "مرتب کردن دستی";
+$lang['Drag to re-order'] = "کلیک کنید و بکشید برای تغییر مکان";
+$lang['Quick Local Synchronization'] = "همگام‌سازی سریع محلی";
+$lang['No photo can be deleted'] = "هیچ عکسی را نمی‌توان حذف کرد";
+$lang['Delete selected photos'] = "حذف تصاویر انتخاب‌شده";
+$lang['%d photo was deleted'] = "%d تصویر حذف شد";
+$lang['%d photos were deleted'] = "%d تصویر حذف شد";
+$lang['Downloads'] = "دانلودها";
+$lang['Released on'] = "انتشار در";
+$lang['Number of downloads'] = "دفعات دانلود";
+$lang['Piwigo Announcements Newsletter'] = "اعلان خبرنامه Piwigo";
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = "Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will be sent emails when a new release is available (sometimes including a security bug fix, it is important to know and upgrade) and when major events happen to the project. Only a few emails a year.";
+$lang['Subscribe %s'] = "اشتراک %s";
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = "اشتراک %s برای اعلان خبرنامه Piwigo";
+$lang['Purge search history'] = "پاک‌کردن تاریخچه جستجو";
+$lang['Hide'] = "مخفی‌کردن";
+$lang['Password is missing. Please enter the password.'] = "گذرواژه گم‌شده. لطفا گذرواژه جدید را وارد نممایید.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "تایید گذرواژه با گذرواژه هم‌خوانی ندارد. لطفا همان گذرواژه‌ای که وارد نموده‌اید را در تایید گذرواژه وارد نمایید.";
+$lang['Password confirmation error.'] = "خطا در تایید گذرواژه.";
+$lang['Allow users to edit their own comments'] = "کاربران اجازه‌ی ویرایش نظرات خود را داشته باشند";
+$lang['Allow users to delete their own comments'] = "کاربران اجازه‌ی حذف نظرات خود را داشته باشند";
+$lang['Email administrators when a comment is modified'] = "وقتی‌که یک نظر تغییر می‌یابد به مدیر(ان) ایمیل ارسال شود.";
+$lang['Email administrators when a comment is deleted'] = "وقتی‌که یک نظر حذف می‌شود به مدیران ایمیل ارسال شود.";
+$lang['Cannot delete the old permalink !'] = "لینک‌ثابت قدیمی را نمی‌توان حذف کرد.";
+$lang['Hit'] = "نمایش";
+$lang['Tools'] = "ابزارها";
+$lang['Photos'] = "تصاویر";
+$lang['Themes'] = "قالب‌ها";
+$lang['Instructions to use Piwigo'] = "راهنمای استفاده از Piwigo";
+$lang['Installed Themes'] = "قالب‌ها نصب شدند";
+$lang['Add New Theme'] = "افزودن یک قالب جدید";
+$lang['Forbid this theme to users'] = "کاربران نتوانند این قالب را انتخاب کنند";
+$lang['Set as default theme for unregistered and new users'] = "قالب پیش‌فرض برای میهمانان و کاربرانی که تازه ثبت‌نام کرده‌اند باشد";
+$lang['unknown'] = 'نامعلوم';
+$lang['Upload Photos'] = 'آپلود تصاویر';
+$lang['Drop into album'] = 'انداختن به داخل دسته';
+$lang['+ Add an upload box'] = 'اضافه کردن یک محل آپلودفایل جدید';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'ایجاد دایرکتوری "%s" در دایرکتوری اصلی Piwigo نصب شده شما.';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'دریافت مجوز نوشتن (chmod 777) در دایرکتوری "%s" در دایرکتوری اصلی Piwigo نصب شده‌ی شما';
+$lang['existing album'] = 'دسته‌ موجود است';
+$lang['create a new album'] = 'افزودن یک دسته جدید';
+$lang['Album name'] = 'نام دسته';
+$lang['Album "%s" has been added'] = 'دسته "%s" با موفقیت اضافه شد';
+$lang['Uploaded Photos'] = 'تصاویر آپلود شد';
+$lang['%d photos uploaded'] = '%d تصویر آپلود شد';
+$lang['Privacy level set to "%s"'] = 'Privacy level set to "%s"';
+$lang['Album "%s" now contains %d photos'] = 'دسته "%s" شامل %d تصویر است';
+$lang['Manage this set of %d photos'] = 'Manage this set of %d photos';
+$lang['Select files'] = 'انتخاب فایل‌ها';
+$lang['Everybody'] = 'همه';
+$lang['Who can see these photos?'] = 'چه کسی قادر به مشاهده این تصاویر باشد؟';
+$lang['Who can see this photo?'] = 'چه کسی قادر به مشاهده این تصویر باشد';
+$lang['Settings'] = 'تنظیمات';
+$lang['Resize'] = 'تغییر اندازه';
+$lang['Maximum Width'] = 'بیشترین عرض';
+$lang['pixels'] = 'پیکسل';
+$lang['Maximum Height'] = 'بیشترین طول';
+$lang['Image Quality'] = 'کیفیت تصویر';
+$lang['Thumbnail'] = 'عکس‌ریزه(Thumbnail)';
+$lang['Save Settings'] = 'ذخیره تنظیمات';
+$lang['Your configuration settings are saved'] = 'تنظیمات شما ذخیره شد';
+$lang['Active Themes'] = 'فعال کردن قالب(ها)';
+$lang['Add write access to the "%s" directory'] = 'لطفا دسترسی برای نوشتن در دایرکتوری "%s" را فعال نمایید';
+$lang['Administration Home'] = 'صفحه مدیریت';
+$lang['Change Admin Colors'] = 'تغییر رنگ‌های صفحه مدیریت';
+$lang['Delete this theme'] = 'حذف این قالب';
+$lang['Directory does not exist'] = 'دایرکتوری موجود نیست';
+$lang['Download,'] = 'دانلود یکی‌از نسخه‌های زیر ،';
+$lang['FTP + Synchronization'] = 'FTP + همگام‌سازی';
+$lang['Get Support on Piwigo Forum'] = 'گرفتن پشتیبانی از انجمن پشتیبانی Piwigo';
+$lang['Help Me'] = 'راهنمایی';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'شما نمی‌توانید این قالب را فعال کنید زیرا قبل از فعال کردن این قالب باید  %s را نصب نمایید.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'شما نمی‌توانید این قالب را حذف کنید ، زیرا قالب(های) %s به این قالب نیاز دارند';
+$lang['Inactive Themes'] = 'قالب‌های غیرفعال';
+$lang['Install on your computer,'] = 'نصب نرم‌افزار pLoader ؛';
+$lang['Make this theme available to users'] = 'فعال کردن این قالب برای انتخاب کردن کاربران';
+$lang['Page end'] = 'پایان صفحه';
+$lang['Piwigo Uploader'] = 'آپلودر Piwigo';
+$lang['Please wait...'] = 'لطفا کمی صبر کنید ...';
+$lang['Read Piwigo Documentation'] = 'خواندن مستندات Piwigo';
+$lang['Start pLoader and add your photos.'] = 'اکنون می‌توانید با استفاده از pLoader تصاویر خود راروی گالری خود آپلود کنید.';
+$lang['Switch to clear or dark colors for administration'] = 'تعویض برای سفید یا سیاه کردن قالب مدیریت';
+$lang['Theme has been successfully installed'] = 'قالب با موفقیت نصب شد';
+$lang['Visit Gallery'] = 'نمایش گالری';
+$lang['Visit Piwigo project website'] = 'نمایش وب‌سایت پروژه Piwigo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'نرم‌افزار pLoader یک <em>Piwigo Uploader</em> است. از رایانه شما، pLoader تصاویر را برای قرار گرفتن ر روی سایت آماده می‌کند و آن‌ها را با گالری شما انتقال می‌دهد.';
+$lang['Guest Settings'] = 'تنظیمات میهمان';
+$lang['Main Page'] = 'صفحه اصلی';
+$lang['Photo Page'] = 'صفحه تصاویر';
+$lang['Activate Navigation Bar'] = 'فعال کردن هدایت‌گر';
+$lang['Activate Navigation Thumbnails'] = 'فعال کردن هدایت‌گر عکس‌ریزه‌ها(thumbnails)';
+$lang['Activate icon "%s"'] = 'فعال‌کردن آیکن "%s"';
+$lang['Activate field "%s"'] = 'فعال‌کردن فیلد "%s"';
+$lang['Photo Properties'] = 'خواص تصاویر';
+$lang['Allow user customization'] = 'اجازه دادن به کاربر برای سفارشی کردن';
+$lang['Languages'] = 'زیان‌ها(Languages)';
+$lang['Installed Languages'] = 'زبان‌های نصب شده';
+$lang['Add New Language'] = 'افزودن یک زبان جدید';
+$lang['Language has been successfully installed'] = 'زبان با موفقیت نصب شد';
+$lang['Select:'] = 'انتخاب:';
+$lang['None'] = 'هیچ‌کدام';
+$lang['Invert'] = 'معکوس کردن';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'این قالب را نمی‌توانیداز کار بیندازید ، زیرا شما حداقل نیاز به یک قالب دارید.';
+$lang['Webmaster status is required.'] = 'وضعیت وب‌مستر ضروری است.';
+$lang['Bound Theme'] = 'Bound Theme';
+$lang['Allow rating'] = "فعال بودن سیستم امتیازدهی";
+$lang['Select at least one comment'] = 'حداقل یک نظر را انتخاب نمایید';
+$lang['Active Plugins'] = 'فعال‌کردن پلاگین‌ها';
+$lang['Inactive Plugins'] = 'از کار انداختن پلاگین‌ها';
+$lang['Missing Plugins'] = 'Missing Plugins';
+$lang['Uninstalled Plugins'] = 'پلاگین‌های نصب نشده';
+$lang['By %s'] = 'به‌وسیله‌ی %s';
+$lang['Visit plugin site'] = 'بازدید از پایگاه این پلاگین';
+$lang['Active Languages'] = 'زبان‌های فعال';
+$lang['Delete this language'] = 'حذف این زبان';
+$lang['Forbid this language to users'] = 'کاربران نتوانند این زبان را انتخاب نمایند';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'از کار انداختن این زبان غیرممکن است ؛ شما باید ایتدا یک زبان دیگر را به عنوان پیش‌فرض انتخاب نمایید سپس این زبان را از کار بیندازید.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'شما نمی‌توانید این زبان را غیرفعال کنید ، شما باید حداقل یک زبان برای وب‌سایت خود داشته باشید.';
+$lang['Inactive Languages'] = 'زبان‌های ازکارانداخته‌شده';
+$lang['Make this language available to users'] = 'در دسترس قرار دادن این زبان برای کاربران';
+$lang['Set as default language for unregistered and new users'] = 'انتخاب این زبان به عنوان پیش‌فرض برای کاربرانی که ثبت نام نکرده‌اند یا تازه ثبت‌نام کرده‌اند.';
+$lang['Add Photos'] = 'افزودن تصاویر';
+$lang['The following tag was deleted'] = 'برچسب حذف شد.';
+$lang['Miscellaneous'] = 'متفرقه';
+$lang['Virtual Links'] = 'ارتباط مجازی';
+$lang['There is no other language available.'] = 'در حال حاضر هیچ زبان دیگری موجود نیست.';
+$lang['There is no other plugin available.'] = 'در حال حاضر پلاگین دیگری موجود نیست.';
+$lang['There is no other theme available.'] = 'در حال حاضر هیچ قالب دیگری موجود نیست.';
+$lang['Add another set of photos'] = 'Add another set of photos';
+$lang['Order of menubar items has been updated successfully.'] = 'ترتیب آیتم‌های منو با موفقیت بروز شد.';
+$lang['This theme was not designed to be directly activated'] = 'این قالب برای فعال کردن مستقیم طراحی نشده ، بلکه قالب‌های دیگر از این قالب برای نمایش خود استفاده می‌کنند.';
+$lang['Pending Comments'] = 'نظرات در انتظار تایید';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'در فایل php.ini شما ،  مقدار upload_max_filesize (%sB) از post_max_size (%sB) بزرگتر است؛  شما باید این تنظیمات را تغییر دهید.';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension not available, admin should disable exif use';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'مقدار فایل قابل آپلود که در فایل php.ini تنظیم شده با نام :upload_max_filesize = %sB است';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'میزان فایل قابل آپلود به‌وسیله فرم که در فایل php.ini تنظیم شده با نام: post_max_size = %sB است';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'بیشترین میزان آپلود فایل به‌وسیله فرم‌های HTML که در یک فیلد hidden در فرم با نام MAX_FILE_SIZE است.';
+$lang['The uploaded file was only partially uploaded'] = 'The uploaded file was only partially uploaded';
+$lang['No file was uploaded'] = 'هیچ فایلی آپلود نشد';
+$lang['Missing a temporary folder'] = 'دایرکتوری موقت موجود نیست';
+$lang['Failed to write file to disk'] = 'نمی‌توان روی دیسک چیزی اضافه کرد';
+$lang['File upload stopped by extension'] = 'آپلود فایل به‌وسیله یک افزونه(پلاگین) متوقف شد.';
+$lang['Unknown upload error'] = 'یک خطا نامعلوم در آپلود فایل';
+$lang['Error on file "%s" : %s'] = 'خطا در فایل "%s" : %s';
+$lang['Menu Management'] = 'منوها';
+$lang['automatic order'] = 'مرتب کردن به صورت اتوماتیک';
+$lang['manual order'] = 'مرتب کردن به صورت سفارشی';
+$lang['Albums automatically sorted'] = 'آلبوم ها به صورت اتوماتیک مرتب شد';
+$lang['Batch Manager'] = 'مدیریت دسته‌ای';
+$lang['include child albums'] = 'آلبوم ‌های زیرمیجموعه این را نیز ضمیمه کن';
+$lang['Selection'] = 'انتخاب';
+$lang['Action'] = 'Action';
+$lang['Set author'] = 'Set author';
+$lang['Set title'] = 'تعیین عنوان';
+$lang['Set creation date'] = 'تعیین تاریخ';
+$lang['Apply action'] = 'Apply action';
+$lang['on the %d selected photos'] = 'on the %d selected photos';
+$lang['%d of %d photos selected'] = '%d تصویر از %d تصویر انتخاب شد';
+$lang['No photo selected, %d photos in current set'] = 'No photo selected, %d photos in current set';
+$lang['All %d photos are selected'] = 'تمام %d تصویر انتخاب شد';
+$lang['remove this filter'] = 'حذف این فیلتر';
+$lang['predefined filter'] = 'predefined filter';
+$lang['last import'] = 'last import';
+$lang['with no virtual album'] = 'بدون آلبوم مجازی';
+$lang['Duplicates'] = 'Duplicates';
+$lang['Add a filter'] = 'اضافه کردن فیلتر جدید';
+$lang['Remove all filters'] = 'حذف تمام فیلترها';
+$lang['Refresh photo set'] = 'Refresh photo set';
+$lang['The whole page'] = 'The whole page';
+$lang['The whole set'] = 'The whole set';
+$lang['No photo in the current set.'] = 'No photo in the current set.';
+$lang['No photo selected, no action possible.'] = 'No photo selected, no action possible.';
+$lang['Choose an action'] = 'Choose an action';
+$lang['remove author'] = 'remove author';
+$lang['Type here the author name'] = 'Type here the author name';
+$lang['remove title'] = 'حذف عنوان';
+$lang['Type here the title'] = 'عنوان را اینحا تایپ نمایید';
+$lang['remove creation date'] = 'remove creation date';
+$lang['with no album'] = 'بدون آلبوم';
+$lang['with no tag'] = 'بدون برچسب';
+$lang['Album photos associated to the following albums: %s'] = 'تصاویر آلبوم جاری با آلبوم های زیر نیز مرتبط شدند: %s';
+$lang['Delete orphan tags'] = 'حذف برچسب های بی ریشه';
+$lang['delete photo'] = 'حذف عکس';
+$lang['Orphan tags deleted'] = 'برچسب های بی ریشه حذف گردید';
+$lang['Remove from caddie'] = 'حذف از سبد';
+$lang['Week starts on'] = 'روز شروع هفته';
+$lang['You have %d orphan tags: %s.'] = 'You have %d orphan tags: %s.';
+$lang['Themes which need upgrade'] = 'پوسته های نیازمند بروزرسانی';
+$lang['Languages which need upgrade'] = 'زبان های نیازمند بروزرسانی';
+$lang['All themes are up to date.'] = 'تمام پوسته ها بروز می باشند.';
+$lang['All plugins are up to date.'] = 'تمام ابزارها بروز می باشند.';
+$lang['All languages are up to date.'] = 'تمام زبان ها بروز می باشند.';
+$lang['Visit theme site'] = 'پوسته سایت در سمت کاربر';
+$lang['Visit language site'] = 'زبان سایت در سمت کاربر';
+$lang['New Version'] = 'نسخه جدید';
+$lang['new'] = 'جدید';
+$lang['No results'] = 'نتیجه ای پیدا نشد';
+$lang['Searching...'] = 'جستجو...';
+$lang['Type in a search term'] = 'عبارت مورد جستجو را تایپ نمائید';
+$lang['Obsolete Plugins'] = 'افزونه منسوخ شده';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'هشدار! این افزونه به نظر نمی رسد با این نسخه سازگار باشد';
+$lang['Do you want to activate anyway?'] = 'آیا به هر طریقی قصد فعال کردن دارید؟';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'این پلاگین در حال حاضر بخشی از هسته PIWIGO! میباشد. هم الکنون از حالت نصب خارج نمائید!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'خطا : این پلاگین گم شده است اما آن نصب شده است! اکنون از نصب خارجش کنید.';
+$lang['display'] = 'نمایش';
+$lang['Learn more'] = 'اطلاعات بيشتر در اين‌باره';
+$lang['Rate'] = "امتیاز";
+$lang['Average rate'] = "Average rate";
+?>
Index: tags/2.4.0RC3/language/fa_IR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/fa_IR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/common.lang.php	(revision 14585)
@@ -0,0 +1,366 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: پارسی [IR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=419
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "پارسی";
+$lang_info['country'] = "ایران";
+$lang_info['direction'] = "rtl";
+$lang_info['code'] = "fa";
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d کیلوبایت';
+$lang['%d album updated'] = "%d آلبوم بروزرسانی شد";
+$lang['%d albums updated'] = "%d آلبوم بروزرسانی شدند";
+$lang['%d comment to validate'] = "%d دیدگاه منتظر تایید است.";
+$lang['%d comments to validate'] = "%d دیدگاه منتظر تایید هستند.";
+$lang['%d new comment'] = "%d دیدگاه تازه";
+$lang['%d new comments'] = "%d دیدگاه تازه";
+$lang['%d comment'] = "%d دیدگاه";
+$lang['%d comments'] = "%d دیدگاه";
+$lang['%d hit'] = "%d بازدید";
+$lang['%d hits'] = "%d بازدید";
+$lang['%d new photo'] = "%d عکس تازه";
+$lang['%d new photos'] = "%d عکس تازه";
+$lang['%d new user'] = "%d کاربر تازه";
+$lang['%d new users'] = "%d کاربر تازه";
+$lang['About'] = "درباره";
+$lang['All tags'] = 'همه ی برچسب ها';
+$lang['Any tag'] = "هر برچسبی";
+$lang['At least one listed rule must be satisfied.'] = 'دست کم یکی از معیارهای بیان شده باید هم خوانی داشته باشد.';
+$lang['Author'] = "نویسنده";
+$lang['Albums'] = "آلبوم ها";
+$lang['Album'] = "آلبوم";
+$lang['Close this window'] = "بستن این پنجره";
+$lang['Complete RSS feed (photos, comments)'] = 'خوراک RSS کامل (عکس ها و دیدگاه ها)';
+$lang['Confirm Password'] = "تایید گذرواژه";
+$lang['Connection settings'] = "تنظیمات اتصال";
+$lang['Login'] = "ورود";
+$lang['Contact webmaster'] = 'تماس با مدیرکل';
+$lang['Create a new account'] = "ایجاد حساب تازه";
+$lang['Created on'] = "ایجاد شده در";
+$lang['Creation date'] = "تاریخ ایجاد";
+$lang['Current password is wrong'] = "گذرواژه وارد شده اشتباه است.";
+$lang['Dimensions'] = "ابعاد";
+$lang['Display'] = "نمایش";
+$lang['Each listed rule must be satisfied.'] = 'همه ی معیارهای بیان شده باید کامل شوند.';
+$lang['Email address'] = "آدرس های ایمیل";
+$lang['Enter your personnal informations'] = "داده های خصوصی خود را وارد نمایید";
+$lang['Error sending email'] = "خطا در فرستادن ایمیل";
+$lang['File name'] = "نام فایل";
+$lang['File'] = "فایل";
+$lang['Filesize'] = "اندازه ی فایل";
+$lang['Filter and display'] = "فیلتر کن و نمایش بده";
+$lang['Filter'] = "فیلتر";
+$lang['Forgot your password?'] = 'گذرواژه خود را فراموش کرده اید ؟';
+$lang['Go through the gallery as a visitor'] = "بازدید از گالری به عنوان مهمان";
+$lang['Help'] = "کمک";
+$lang['Identification'] = "شناسایی";
+$lang['Photos only RSS feed'] = 'خوراک RSS عکس ها';
+$lang['Keyword'] = 'کلیدواژه';
+$lang['Links'] = "لینک ها";
+$lang['N/A'] = "N/A";
+$lang['New on %s'] = "تازه در %s";
+$lang['Notification'] = "خبرنامه";
+$lang['Number of items'] = "تعداد آیتم ها";
+$lang['Original dimensions'] = "ابعاد اصلی";
+$lang['Password forgotten'] = "گذرواژه فراموش شده";
+$lang['Password'] = "گذرواژه";
+$lang['Post date'] = 'تاریخ فرستاده شدن';
+$lang['Posted on'] = "فرستاده شده در";
+$lang['Profile'] = "پروفایل";
+$lang['Quick connect'] = "اتصال سریع";
+$lang['RSS feed'] = 'خوراک RSS';
+$lang['Register'] = "نام نویسی";
+$lang['Registration'] = "نام نویسی";
+$lang['Related tags'] = "برچسب های مربوط";
+$lang['Reset'] = 'بازنشانی';
+$lang['Retrieve password'] = "بازیابی گذرواژه";
+$lang['Search rules'] = "قوانین جستجو";
+$lang['Search tags'] = "جستجوی برچسب ها";
+$lang['Search'] = "جستجو";
+$lang['display available tags'] = "نمایش برچسب های موجود";
+$lang['Since'] = "از";
+$lang['Sort by'] = 'مرتب سازی بر اساس';
+$lang['Sort order'] = "مرتب سازی بر اساس";
+$lang['Tag'] = "برچسب";
+$lang['Tags'] = "برچسب ها";
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'سرویس دهنده RSS، تازه های سایت از جمله: عکس‌های جدید، آلبوم های بروزشده ‌و دیدگاه های تازه را به کمک یک RSS خوان اطلاع رسانی می کند.';
+$lang['Unknown feed identifier'] = 'RSS خوان شناسایی نشد';
+$lang['User comments'] = 'دیدگاه های کاربر';
+$lang['Username'] = "نام کاربری";
+$lang['Visits'] = "بازدید ها";
+$lang['Webmaster'] = 'مدیرکل';
+$lang['Week %d'] = 'هفته ی %d';
+$lang['About Piwigo'] = "درباره ی Piwigo";
+$lang['You are not authorized to access the requested page'] = 'شما مجاز به مشاهده این صفحه نیستید';
+$lang['add this photo to your favorites'] = "افزودن این عکس به علاقه مندی های من";
+$lang['Administration'] = "مدیریت";
+$lang['all'] = "همه";
+$lang['ascending'] = "بالا رونده";
+$lang['author(s) : %s'] = "نویسنده(ها) : %s";
+$lang['Expand all albums'] = "بازکردن تمام آلبوم ها";
+$lang['posted after %s (%s)'] = 'فرستاده شده بعد از %s (%s)';
+$lang['posted before %s (%s)'] = 'فرستاده شده قبل از %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'فرستاده شده بین %s (%s) و %s (%s)';
+$lang['posted on %s'] = "فرستاده شده در %s";
+$lang['Best rated'] = "بهترین امتیاز داده شده";
+$lang['display best rated photos'] = 'نمایش عکس هایی که بیشترین امتیاز را داشته اند';
+$lang['Calendar'] = "تقویم";
+$lang['All'] = "همه";
+$lang['display each day with photos, month per month'] = 'نمایش هر روز با عکس های تازه، ماه به ماه';
+$lang['View'] = "نمایش";
+$lang['chronology_monthly_calendar'] = "تقویم ماهانه";
+$lang['chronology_monthly_list'] = "لیست ماهانه";
+$lang['chronology_weekly_list'] = "لیست هفتگی";
+$lang['Click here if your browser does not automatically forward you'] = 'اگر مرورگر شما به صورت اتوماتیک هدایت نشد، اینجا کلیک کنید.';
+$lang['comment date'] = "تاریخ دیدگاه";
+$lang['Comment'] = "دیدگاه";
+$lang['Your comment has been registered'] = "دیدگاه شما در سیستم ثبت شد";
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "سیستم ضد هرزنامه: خواهشمندم قبل از فرستادن دوباره ی دیدگاه چند لحظه شکیبا باشید";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "دیدگاه شما در سیستم ثبت نشد زیرا قوانین آن تأیید نشد";
+$lang['An administrator must authorize your comment before it is visible.'] = 'یک مدیر باید دیدگاه شما را تایید کند تا قابل نمایش شود.';
+$lang['This login is already used by another user'] = "این نام کاربری برای کاربر دیگری ثبت شده است";
+$lang['Comments'] = "دیدگاه ها";
+$lang['Add a comment'] = "دیدگاهی بگذارید";
+$lang['created after %s (%s)'] = "ایجاد شده بعد از %s (%s)";
+$lang['created before %s (%s)'] = "ایجاد شده قبل از %s (%s)";
+$lang['created between %s (%s) and %s (%s)'] = "ایجاد شده بین %s (%s) و %s (%s)";
+$lang['created on %s'] = "ایجاد شده در %s";
+$lang['Customize'] = "سفارشی کردن";
+$lang['Your Gallery Customization'] = "سفارشی کردن گالری";
+$lang['day'][0] = "یک‌شنبه";
+$lang['day'][1] = "دوشنبه";
+$lang['day'][2] = "سه‌شنبه";
+$lang['day'][3] = "چهارشنبه";
+$lang['day'][4] = "پنج‌شنبه";
+$lang['day'][5] = "جمعه";
+$lang['day'][6] = "شنبه";
+$lang['Default'] = "پیشفرض";
+$lang['delete this photo from your favorites'] = 'پاک کردن این عکس از علاقه مندی های شما';
+$lang['Delete'] = "پاک کردن";
+$lang['descending'] = "پایین رونده";
+$lang['edit'] = "ویرایش";
+$lang['wrong date'] = "تاریخ اشتباه است";
+$lang['excluded'] = "محروم";
+$lang['Your favorites'] = 'علاقه مندی های شما';
+$lang['display your favorites photos'] = "نمایش عکس های مورد علاقه‌ شما";
+$lang['Favorites'] = 'علاقه مندی ها';
+$lang['First'] = "نخستین";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'این گالری برای بروز رسانی قفل شده‌ است؛ زمان دیگری بازدید کنید.';
+$lang['Page generated in'] = "صفحه ایجاد شده در";
+$lang['guest'] = 'مهمان';
+$lang['Hello'] = "درود";
+$lang['available for administrators only'] = 'فقط در دسترس مدیران';
+$lang['display this album'] = 'نمایش این آلبوم';
+$lang['display last user comments'] = 'نمایش آخرین دیدگاه های کاربر';
+$lang['customize the appareance of the gallery'] = "سفارشی کردن نمایش گالری";
+$lang['search'] = "جستجو";
+$lang['Home'] = 'صفحه اصلی';
+$lang['in this album'] = "در این آلبوم";
+$lang['in %d sub-album'] = "در %d زیرآلبوم";
+$lang['in %d sub-albums'] = "در %d زیرآلبوم ";
+$lang['included'] = 'شامل می شود';
+$lang['Invalid password!'] = 'گذرواژه نامعتبر است!';
+$lang['Language'] = "زبان";
+$lang['last %d days'] = "%d روز گذشته";
+$lang['Last'] = "آخرین";
+$lang['Logout'] = "بیرون رفتن";
+$lang['obligatory'] = "اجباری";
+$lang['Maximum photo height'] = "بیشترین بلندای عکس";
+$lang['Maximum height must be a number superior to 50'] = "بیشترین بلندای عکس باید عددی بزرگتر از 50 باشد";
+$lang['Maximum photo width'] = "بیشترین پهنای عکس";
+$lang['Maximum width must be a number superior to 50'] = "بیشترین پهنای عکس باید عددی بزرگتر از 50 باشد";
+$lang['display a calendar by creation date'] = "نمایش یک تقویم بر اساس تاریخ ایجاد";
+$lang['display all photos in all sub-albums'] = 'نمایش همه ی عکس ها در همه ی زیرآلبوم ها';
+$lang['return to normal view mode'] = "بازگشت به حالت عادی";
+$lang['display a calendar by posted date'] = "نمایش یک تقویم براساس تاریخ فرستاده شدن";
+$lang['month'][10] = "اکتبر";
+$lang['month'][11] = "نوامبر";
+$lang['month'][12] = "دسامبر";
+$lang['month'][1] = "ژانویه";
+$lang['month'][2] = "فبریه";
+$lang['month'][3] = "مارس";
+$lang['month'][4] = "آوریل";
+$lang['month'][5] = "مِی";
+$lang['month'][6] = "ژوئن";
+$lang['month'][7] = "جولای";
+$lang['month'][8] = "آگوست";
+$lang['month'][9] = "سپتامبر";
+$lang['Most visited'] = 'بیشترین بازدید شده';
+$lang['display most visited photos'] = 'نمایش عکس هایی که بیشترین بازدید را داشته اند';
+$lang['Unknown identifier'] = "ناشناخته";
+$lang['New password'] = "گذرواژه تازه";
+$lang['Rate this photo'] = "امتیاز دادن به این عکس";
+$lang['Next'] = "بعدی";
+$lang['no rate'] = "بدون امتیاز";
+$lang['Photos posted within the last %d day.'] = 'فقط عکس هایی که در %d روز قبل فرستاده شده.';
+$lang['Photos posted within the last %d days.'] = 'فقط عکس هایی که در %d روز قبل فرستاده شده اند.';
+$lang['password updated'] = "گذرواژه بروزرسانی شد";
+$lang['Recent period must be a positive integer value'] = "Recent period must be a positive integer value";
+$lang['photo'] = "عکس";
+$lang['Click on the photo to see it in high definition'] = "برای مشاهده هر عکس در اندازه ی اصلی روی آن کلیک کنید.";
+$lang['Show file metadata'] = "نمایش فایل ابرداده (metadata)";
+$lang['Powered by'] = "قدرت گرفته از";
+$lang['Preferences'] = "تنظیمات";
+$lang['Previous'] = "قبلی";
+$lang['Random photos'] = 'عکس های تصادفی';
+$lang['display a set of random photos'] = "نمایش تعدادی عکس تصادفی";
+$lang['Recent albums'] = "آلبوم های تازه";
+$lang['display recently updated albums'] = "نمایش آلبوم های تازه بروز رسانی شده";
+$lang['Recent period'] = "Recent period";
+$lang['Recent photos'] = "عکس های تازه";
+$lang['display most recent photos'] = 'نمایش تازه ترین عکس ها';
+$lang['Redirection...'] = "در حال هدایت ...";
+$lang['Please, enter a login'] = 'یک نام کاربری وارد کنید.';
+$lang['login mustn\'t end with a space character'] = 'اطلاعات ورود نباید دارای فاصله در آخرشان باشند';
+$lang['login mustn\'t start with a space character'] = 'اطلاعات ورود نباید با فاصله آغاز شوند';
+$lang['this login is already used'] = "این اطلاعات ورود از قبل وجود دارد";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'آدرس ایمیل باید چیزی شبیه به xxx@yyy.eee باشد. (مانند: jack@altern.org)';
+$lang['please enter your password again'] = "خواهشمند است گذرواژه خود را دوباره وارد نمایید";
+$lang['Auto login'] = "ورود اتوماتیک";
+$lang['remove this tag from the list'] = "پاک کردن این برچسب از لیست";
+$lang['representative'] = 'عکس بندانگشتی آلبوم';
+$lang['Search for Author'] = 'جستجوی نویسنده';
+$lang['Search in albums'] = "جستجو در آلبوم ها";
+$lang['Date'] = "تاریخ";
+$lang['End-Date'] = "تاریخ پایان";
+$lang['Kind of date'] = 'نوع تاریخ';
+$lang['Search for words'] = 'جستجوی واژه ها';
+$lang['Search for all terms'] = 'جستجوی همه ی واژه ها';
+$lang['Empty query. No criteria has been entered.'] = 'شما هیچ معیاری برای جستجو تأیین نکرده اید.';
+$lang['Search results'] = "نتایج جستجو";
+$lang['Search in sub-albums'] = "جستجو در زیرآلبوم ها";
+$lang['searched words : %s'] = 'واژه های جستجو شده: %s';
+$lang['Contact'] = "تماس";
+$lang['set as album representative'] = 'تنظیم بعنوان عکس بندانگشتی آلبوم';
+$lang['Show number of comments'] = "نمایش تعداد دیدگاه ها";
+$lang['Show number of hits'] = "نمایش تعداد بازدید ها";
+$lang['slideshow'] = "نمایش به صورت اسلاید";
+$lang['stop the slideshow'] = "توقف اسلاید";
+$lang['Specials'] = "پنل ویژه";
+$lang['SQL queries in'] = "SQL queries in";
+$lang['display only recently posted photos'] = "فقط آخرین عکس های فرستاده شده را نمایش بده";
+$lang['return to the display of all photos'] = "بازگشت به نمایش همه ی عکس ها";
+$lang['the beginning'] = "آغاز";
+$lang['Interface theme'] = "رابط قالب";
+$lang['Thumbnails'] = 'عکس بندانگشتی';
+$lang['Menu'] = "منو";
+$lang['A comment on your site'] = "یادداشتی روی سایت شما";
+$lang['today'] = "امروز";
+$lang['Update your rating'] = "بروزرسانی امتیاز";
+$lang['the username must be given'] = "نام کاربری ضروری است";
+$lang['useful when password forgotten'] = "قابل استفاده برای زمانی که گذرواژه فراموش می شود";
+$lang['Quick search'] = "جستجوی سریع";
+$lang['Connected user: %s'] = 'کاربر متصل شده : %s';
+$lang['IP: %s'] = "آی پی: %s";
+$lang['Browser: %s'] = "مرورگر: %s";
+$lang['Author: %s'] = "نویسنده: %s";
+$lang['Comment: %s'] = "دیدگاه: %s";
+$lang['Comment by %s'] = "دیدگاهی از %s";
+$lang['User: %s'] = 'کاربر: %s';
+$lang['Email: %s'] = "ایمیل: %s";
+$lang['Admin: %s'] = "مدیرکل: %s";
+$lang['Registration of %s'] = "نام نویسیِ %s";
+$lang['Album: %s'] = 'آلبوم: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'وضعیت بد برای کاربر "مهمان"، وضعیت پیشفرض استفاده خواهد شد . خواهشمند است این موضوع را با مدیر‌کل در میان بگذارید.';
+$lang['this email address is already in use'] = 'یک کاربر دیگر این آدرس ایمیل را در سیستم ثبت کرده است';
+$lang['Album results for'] = "نتایج آلبوم برای";
+$lang['Tag results for'] = "نتایج برچسب برای";
+$lang['from %s to %s'] = "از %s تا %s";
+$lang['Play of slideshow'] = 'آغاز نمایش اسلاید';
+$lang['Pause of slideshow'] = 'توقف اسلاید';
+$lang['Repeat the slideshow'] = 'بازپخش اسلاید';
+$lang['Not repeat the slideshow'] = "اسلاید را بازپخش نکن";
+$lang['Reduce diaporama speed'] = "کاهش سرعت اسلاید";
+$lang['Accelerate diaporama speed'] = "افزایش سرعت اسلاید";
+$lang['Submit'] = "ثبت";
+$lang['Yes'] = "بله";
+$lang['No'] = "خیر";
+$lang['%d photo'] = "%d عکس";
+$lang['%d photos'] = "%d عکس";
+$lang['%d photo is also linked to current tags'] = "%d عکس هم به این برچسب مربوط است.";
+$lang['%d photos are also linked to current tags'] = '%d عکس هم به این برچسب مربوط هستند.';
+$lang['display photos linked to this tag'] = "نمایش عکس هایی که مربوط به این برچسب هستند";
+$lang['photos posted during the last %d days'] = 'عکس هایی که در %d روز گذشته فرستاده شده اند';
+$lang['Piwigo Help'] = "راهنمای Piwigo";
+$lang['Rank'] = "مقام";
+$lang['group by letters'] = "گروه بندی براساس حرف";
+$lang['letters'] = "حروف";
+$lang['show tag cloud'] = 'نمایش ابر برچسب ها (Tags cloud)';
+$lang['cloud'] = "ابر (Cloud)";
+$lang['Reset to default values'] = "بازگرداندن به مقدارهای پیشفرض";
+$lang['delete all photos from your favorites'] = "پاک کردن همه ی عکس ها از علاقه مندی های شما";
+$lang['Sent by'] = "فرستاده شده به وسیله";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "شما در تنظیمات مرورگر خود کوکی ها را مسدود کرده اید و یا مرورگر شما از کوکی پشتیبانی نمی‌کند. برای ورود به محیط کاربری باید کوکی‌ها فعال باشند.";
+$lang['Edit a comment'] = "ویرایش یک دیدگاه";
+$lang['Are you sure?'] = "مطمئن هستید ؟";
+$lang['(!) This comment requires validation'] = '(!) این دیدگاه نیاز به تایید دارد';
+$lang['Welcome'] = 'خوش آمدید';
+$lang['Welcome to your Piwigo photo gallery!'] = 'به گالری عکس Piwigo خود خوش آمدید!';
+$lang['... or browse your empty gallery'] = '... یا گالری خالی خود را مشاهده کنید';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... یا لطفاً این پیام را غیرفعال نمایید، من راهم را پیدا خواهم کرد';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'درود %s، گالری عکس شما خالی است!';
+$lang['I want to add photos'] = 'می‌خواهم عکس تازه اضافه کنم';
+$lang['Manage this user comment: %s'] = 'مدیریت دیدگاه های %s';
+$lang['Email address is missing. Please specify an email address.'] = "کاربر آدرس ایمیل ندارد. خواهشمند است یک آدرس ایمیل مشخص کنید.";
+$lang['This author modified following comment:'] = 'این نویسنده دیدگاه زیر را تغییر داده است:';
+$lang['This author removed the comment with id %d'] = 'این نویسنده، دیدگاهی با شناسه ی %d را پاک کرده است';
+$lang['html tags are not allowed in login'] = 'شما در فرم ورود مجاز به استفاده از كدهای HTML نیستید';
+$lang['%d rates'] = '%d امتیاز';
+$lang['Change my password'] = 'ویرایش گذرواژه';
+$lang['Check your email for the confirmation link'] = 'برای مشاهده ی لینک تأیید ایمیل خود را چک کنید';
+$lang['Download this file'] = 'دانلود این فایل';
+$lang['Download'] = 'دانلود';
+$lang['Edit'] = 'ویرایش';
+$lang['Enter your new password below.'] = 'گذرواژه ی تازه ی خود را در زیر وارد کنید.';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'اگر اشتباهی رخ داده است، این ایمیل را نادیده بگیرید و به آن پاسخ ندهید.';
+$lang['Invalid key'] = 'کلید اشتباه است';
+$lang['Invalid username or email'] = 'نام کاربری یا ایمیل نامعتبر است';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Number of photos per page'] = 'تعداد عکس ها در هر صفحه';
+$lang['Password reset is not allowed for this user'] = 'بازنشانی گذرواژه برای این کاربر ممکن نیست';
+$lang['Password Reset'] = 'بازنشانی گذرواژه';
+$lang['Please enter your username or email address.'] = 'نام کاربری یا ایمیل خود را وارد کنید.';
+$lang['Rating score'] = 'مقدار امتیاز';
+$lang['Return to home page'] = 'بازگشت به صفحه اصلی';
+$lang['Search by date'] = "جستجو با تاریخ";
+$lang['Search for any term'] = 'جستجوی هر واژه ای';
+$lang['Someone requested that the password be reset for the following user account:'] = 'یک نفر برای این حساب کاربری درخواست بازنشانی گذرواژه کرده است:';
+$lang['The number of photos per page must be a not null scalar'] = 'تعداد عکس ها در هر صفحه باید یک عدد صحیح بجز 0 باشد';
+$lang['The passwords do not match'] = 'گذرواژه ها یکسان نمی باشند';
+$lang['To reset your password, visit the following address:'] = 'برای بازنشانی گذرواژتان، به آدرس زیر بروید:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'حساب کاربری "%s" دارای ایمیل نمی باشد، بازنشانی گذرواژه امکان پذیر نیست';
+$lang['Username "%s" on gallery %s'] = 'نام کاربری "%s" در گالری %s';
+$lang['Username or email'] = 'نام کاربری یا ایمیل';
+$lang['You will receive a link to create a new password via email.'] = 'بزودی یک لینک برای ایجاد گذرواژه ی تازه در ایمیلتان دریافت خواهید کرد.';
+$lang['Your password has been reset'] = 'گذرواژه ی شما با موفقیت بازنشانی شد';
+
+$lang['Hello %s,'] = 'درود %s،';
+?>
Index: tags/2.4.0RC3/language/fa_IR/index.php
===================================================================
--- tags/2.4.0RC3/language/fa_IR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/fa_IR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/fa_IR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/install.lang.php	(revision 14585)
@@ -0,0 +1,71 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "نصب";
+$lang['Basic configuration'] = "پيکربندي ساده";
+$lang['Default gallery language'] = "زبان پيش‌فرض گالري";
+$lang['Database configuration'] = "پيکربندي پايگاه داده";
+$lang['Admin configuration'] = "تنظيمات مديريت";
+$lang['Start Install'] = "شروع نصب";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "آدرس ايميل بايد چيزي شبیه به xxx@yyy.eee باشد  (مانند : jack@altern.org)";
+$lang['Webmaster login'] = "ورود وب‌مستر";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "این برای بازدیدکنندگان نمایش‌داده و برای مدیریت وب‌سایت ضروری است";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "ارتباط با سرور با موفقيت انجام شد اما ارتباط با سرور پايگاه داده با مشکل مواجه شد.";
+$lang['Can\'t connect to server'] = "ارتباط با سرور ممکن نيست";
+$lang['Host'] = "ميزبان";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "نام‌کاربري";
+$lang['user login given by your host provider'] = "نام کاربري خود را بايد از سرويس‌دهنده ميزباني(هاست) دريافت نماييد";
+$lang['Password'] = "گذرواژه";
+$lang['user password given by your host provider'] = "گذرواژه را بايد از سرويس‌دهنده ميزباني(هاست) دريافت نماييد";
+$lang['Database name'] = "نام پايگاه‌داده";
+$lang['also given by your host provider'] = "اين را هم بايد از سرويس‌دهنده ميزباني(هاست) دريافت نماييد";
+$lang['Database table prefix'] = "پيشوند جدول پايگاه داده";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "تمام جدول‌های پایگاه داده با این پیشوند شروع خواهند شد.(این گزینه برای مدیریت بهتر پایگاه داده مفید است)";
+$lang['enter a login for webmaster'] = "مشخصات ورود وب‌مستر را وارد نماييد";
+$lang['webmaster login can\'t contain characters \' or "'] = "نبايد مشخصات ورود داراي کاراکترهاي  ' و \" باشد";
+$lang['please enter your password again'] = "لطفا گذرواژه خود را مجددا وارد نماييد";
+$lang['Webmaster password'] = "گذرواژه وب‌مستر";
+$lang['Keep it confidential, it enables you to access administration panel'] = "این دسترسی شما را به مدیریت فراهم می‌آورد";
+$lang['Password [confirm]'] = "تاييد گذرواژه";
+$lang['verification'] = "تاييد";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "به کمک نياز داريد؟ سوال خود را در <a href=\"%s\">تالارهاي پشتيباني Piwigo</a> مطرح نماييد .";
+$lang['Webmaster mail address'] = "آدرس ايميل وب‌مستر";
+$lang['Visitors will be able to contact site administrator with this mail'] = "بازديدکنندگان مي‌توانند با اين ايميل با مدير ارتباط برقرار کنند";
+$lang['PHP 5 is required'] = "PHP 5 براي نصب گالري ضروري است";
+$lang['It appears your webhost is currently running PHP %s.'] = "به نظر می‌رسد نسخه‌ی اجرا شده از PHP %s باشد.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo می‌تواند تنظیمات PHP شما را با ایجاد و ویرایش یک فایل .htaccess به PHP5 تغییر دهد.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "شما می‌توانید خودتان پیکربندی را انجام دهید و Piwigo را مجددا راه‌اندازی کنید.";
+$lang['Try to configure PHP 5'] = "پيکربندي PHP 5 را انجام دهيد";
+$lang['Sorry!'] = "شرمنده!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo قادر به پيکربندي PHP 5 نيست.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "شما باید با سرویس‌دهنده میزبانی(web hosting) خود تماس بگیرید و از آن‌ا بپرسید که چگونه می‌توانید تنظیمات خود را به PHP5 تغییر دهید.";
+$lang['Hope to see you back soon.'] = "به امید دیدار";
+$lang['Congratulations, Piwigo installation is completed'] = 'Piwigo با موفقیت نصب شد.';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'یک راه دیگر این است که شما این متن را کپی کنید وبا نام database.inc.php در آدرس :"local/config/database.inc.php" قرار دهید.';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'اشکال در ایجاد فایل local/config/database.inc.php.';
+$lang['Download the config file'] = 'دريافت فايل پيکربندي';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'شما مي‌توانيد فايل پيکربندي را دانلود کنيد و آن را در دايرکتوري local/config در محلي که گالري را نصب کرديد آپلود کنيد.';
+?>
Index: tags/2.4.0RC3/language/fa_IR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/fa_IR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+پارسی [IR]
Index: tags/2.4.0RC3/language/fa_IR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/fa_IR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fa_IR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = 'آپگرید';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'پیشنهاد می‌شود که با استفاده از این صفحه بانک اطلاعاتی نگارش قدیمی Piwigo خود را به نگارش تازه ی آن ارتقا دهید. سیستم آپگرید نگارش کنونی گالری شما را <strong>نگارش %s </strong> تشخیص داده است.';
+$lang['Upgrade from version %s to %s'] = 'آپگرید از نگارش %s به نگارش %s';
+$lang['Statistics'] = "آمار";
+$lang['total upgrade time'] = 'زمان کل آپگرید';
+$lang['total SQL time'] = 'زمان کل SQL';
+$lang['SQL queries'] = 'کوئری(Query) های SQL';
+$lang['Upgrade informations'] = 'اطلاعات آپگرید';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'اگر به مشکلی برخوردید به [مدیریت > ابزار ها > نگهداری] مراجعه نمایید.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'هشدار، پلاگین های زیر در حال حاضر از کار افتاده اند. برای امنیت بیشتر، قبل از فعال کردن دوباره ی آن ها باید آپگرید های تازه آنها را بررسی کنید:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'فقط مدیران می توانند سیستم را آپگرید کنند.';
+$lang['You do not have access rights to run upgrade'] = "شما دسترسی لازم برای آپگرید را ندارید";
+$lang['All sub-albums of private albums become private'] = 'تمام زیرآلبوم های مربوط به آلبوم های شخصی، شخصی شدند';
+$lang['User permissions and group permissions have been erased'] = 'مجوز های کاربران و گروه ها پاک شد';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'فقط پیشوند عکس های بندانگشتی و آدرس ایمیل مدیرکل از تنظیمات قدیمی باقی خواهد ماند';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'در <i>%s</i>, قبل از <b>?></b>, اضافه کنید:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'هشدار، قالب های زیر در حال حاضر از کار افتاده اند. برای امنیت بیشتر، قبل از فعال کردن دوباره ی آن ها باید آپگرید های تازه آنها را بررسی کنید:';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'در <i>%s</i>، قبل از <b></b>، اضافه کنید:';
+?>
Index: tags/2.4.0RC3/language/fi_FI/about.html
===================================================================
--- tags/2.4.0RC3/language/fi_FI/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/fi_FI/about.html	(revision 14585)
@@ -0,0 +1,18 @@
+<p>Tämä kuvagalleria on luotu käyttäen Piwigoa.</p>
+
+<p>Piwigo on Web -pohjainen kuvagalleria, jonka on luonut käyttäjien ja
+kehittäjien aktiivinen yhteisö. Laajennusten avulla Piwigoa on helppo muokata.
+Pisteenä iin päälle, Piwigo on ilmainen ja käyttää avointa lähdekoodia.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Vieraile Piwigon kotisivuilla</a></p>
+
+<p>Suomenkielistä käännöstä ylläpitää (Aakkosjärjestyksessä):
+
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=16627">Rinnaus</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16548">streen</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16160">Tome-</a></li>
+    </ul>
+
+                .... Suuri kiitos sinulle
+</p>
Index: tags/2.4.0RC3/language/fi_FI/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/fi_FI/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fi_FI/common.lang.php	(revision 14585)
@@ -0,0 +1,409 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Finnish [FI]
+Version: 2.4.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Finnish";
+$lang_info['country'] = "Suomi";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "fi";
+$lang_info['zero_plural'] = "1";
+
+$lang['%d album updated'] = '%d albumi päivitetty';
+$lang['%d albums updated'] = '%d albumit päivitetty';
+$lang['%d comment to validate'] = '%d kommentin vahvistus';
+$lang['%d comments to validate'] = '%d kommentien vahvistus';
+$lang['%d new comment'] = '%d uusi kommentti';
+$lang['%d new comments'] = '%d uudet kommentit';
+$lang['%d comment'] = '%d kommentti';
+$lang['%d comments'] = '%d kommentit';
+$lang['%d hit'] = '%d osuma';
+$lang['%d hits'] = '%d osumat';
+$lang['%d new photo'] = '%d uusi kuva';
+$lang['%d new photos'] = '%d uudet kuvat';
+$lang['%d new user'] = '%d uusi käyttäjä';
+$lang['%d new users'] = '%d uudet käyttäjät';
+$lang['About'] = 'Yleistä';
+$lang['All tags'] = 'Kaikki tunnisteet';
+$lang['Any tag'] = 'Tunniste';
+$lang['At least one listed rule must be satisfied.'] = 'Vähintään yksi listattu kriteeti on täytyttävä.';
+$lang['Author'] = 'Tekijä';
+$lang['Albums'] = 'Albumit';
+$lang['Album'] = 'Albumi';
+$lang['Close this window'] = 'Sulje tämä ikkuna';
+$lang['Complete RSS feed (photos, comments)'] = 'Täydellinen RSS-syöte (kuvat, kommentit)';
+$lang['Confirm Password'] = 'Vahvista salasana';
+$lang['Connection settings'] = 'Yhteysasetukset';
+$lang['Login'] = 'Kirjaudu';
+$lang['Contact webmaster'] = 'Ota yhteys Ylläpitäjään';
+$lang['Create a new account'] = 'Luo uusi tili';
+$lang['Created on'] = 'Luotu';
+$lang['Creation date'] = 'Luontipäivä';
+$lang['Current password is wrong'] = 'Salasana on väärä';
+$lang['Dimensions'] = 'Koko';
+$lang['Display'] = 'Näytä';
+$lang['Each listed rule must be satisfied.'] = 'Kaikkien kohtien on oltava täytetty oikein.';
+$lang['Email address'] = 'Sähköpostiosoite';
+$lang['Enter your personnal informations'] = 'Kirjoita henkilökohtaiset tietosi';
+$lang['Error sending email'] = 'Virhe sähköpostin lähettämisessä';
+$lang['File name'] = 'Tiedostonimi';
+$lang['File'] = 'Tiedosto';
+$lang['Filesize'] = 'Tiedoston koko';
+$lang['Filter and display'] = 'Suodatin ja näyttö';
+$lang['Filter'] = 'Suodatin';
+$lang['Forgot your password?'] = 'Unohditko salasanasi?';
+$lang['Go through the gallery as a visitor'] = 'Selaa galleriaa vieraana';
+$lang['Help'] = 'Apua';
+$lang['Identification'] = 'Tunnistus';
+$lang['Photos only RSS feed'] = 'RSS -syöte (vain kuvat)';
+$lang['Keyword'] = 'Avainsana';
+$lang['day'][0] = "Sunnuntai";
+$lang['day'][1] = "Maanantai";
+$lang['day'][2] = "Tiistai";
+$lang['day'][3] = "Keskiviikko";
+$lang['day'][4] = "Torstai";
+$lang['day'][5] = "Perjantai";
+$lang['day'][6] = "Lauantai";
+$lang['month'][10] = "Lokakuu";
+$lang['month'][11] = "Marraskuu";
+$lang['month'][12] = "Joulukuu";
+$lang['month'][1] = "Tammikuu";
+$lang['month'][2] = "Helmikuu";
+$lang['month'][3] = "Maaliskuu";
+$lang['month'][4] = "Huhtikuu";
+$lang['month'][5] = "Toukokuu";
+$lang['month'][6] = "Kesäkuu";
+$lang['month'][7] = "Heinäkuu";
+$lang['month'][8] = "Elokuu";
+$lang['month'][9] = "Syyskuu";
+$lang['Date'] = 'Päivämäärä';
+$lang['Default'] = 'Oletus';
+$lang['Download'] = 'lataa';
+$lang['Edit a comment'] = 'Muokkaa kommenttia';
+$lang['edit'] = 'muokkaa';
+$lang['Edit'] = 'Muokkaa';
+$lang['First'] = 'Ensimmäinen';
+$lang['from %s to %s'] = 'alkaen %s päättyen %s';
+$lang['group by letters'] = 'järjestä kirjainten mukaan';
+$lang['guest'] = 'vieras';
+$lang['Hello'] = 'Hei';
+$lang['Home'] = 'Etusivu';
+$lang['Search'] = 'Etsi';
+$lang['search'] = 'Tarkka haku';
+$lang['Sent by'] = 'Lähettäjä';
+
+
+//works
+$lang['A comment on your site'] = 'Palaute sivultasi';
+$lang['About Piwigo'] = 'Yleistä Piwigosta';
+$lang['Accelerate diaporama speed'] = 'Kasvata diaesityksen nopeutta';
+$lang['Add a comment'] = 'Lisää kommentti';
+$lang['add this photo to your favorites'] = 'lisää tämä kuva suosikkeihisi';
+$lang['Admin: %s'] = 'Ylläpitäjä: %s';
+$lang['Administration'] = 'Hallinta';
+$lang['Album results for'] = 'Albumin tulokset';
+$lang['Album: %s'] = 'Albumi: %s';
+$lang['all'] = 'all';
+$lang['All'] = 'Kaikki';
+$lang['Are you sure?'] = 'Oletko varma?';
+$lang['ascending'] = 'nouseva';
+$lang['author(s) : %s'] = 'Tekijä(t) : %s';
+$lang['Author: %s'] = 'Tekijä: %s';
+$lang['Auto login'] = 'Muista minut';
+$lang['available for administrators only'] = 'Vain ylläpitäjille';
+$lang['Best rated'] = 'Parhaiten arvioidut';
+$lang['Browser: %s'] = 'Selain: %s';
+$lang['Calendar'] = 'Kalenteri';
+$lang['Change my password'] = 'Vaihda salasana';
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d photo'] = '%d kuva';
+$lang['%d photos'] = '%d kuvaa';
+$lang['Comment'] = 'Kommentti';
+$lang['Comment: %s'] = 'Kommentti: %s';
+$lang['Comments'] = 'Kommentit';
+$lang['Contact'] = 'Ota yhteyttä';
+$lang['created before %s (%s)'] = 'luotu ennen %s (%s)';
+$lang['created on %s'] = 'Luotu %s';
+$lang['Customize'] = 'Muokkaa';
+$lang['customize the appareance of the gallery'] = 'muokkaa gallerian ulkoasua';
+$lang['Delete'] = 'Poista';
+$lang['delete all photos from your favorites'] = 'poista kaikki kuvat suosikeista';
+$lang['descending'] = 'laskeva';
+$lang['Expand all albums'] = 'Laajenna kaikki albumit';
+$lang['Favorites'] = 'Suosikit';
+$lang['Hello %s,'] = 'Hei %s,';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hei %s, Piwigo kuvagalleriasi on tyhjä!';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Language'] = 'Kieli';
+$lang['large'] = 'Iso';
+$lang['letters'] = 'kirjaimet';
+$lang['Links'] = 'Linkit';
+$lang['Logout'] = 'Kirjaudu ulos';
+$lang['Maximum photo height'] = 'Kuvan maksimikorkeus';
+$lang['Maximum photo width'] = 'Kuvan maksimileveys';
+$lang['medium'] = 'Keskikokoinen';
+$lang['Menu'] = 'Valikko';
+$lang['Most visited'] = 'Suosituimmat kuvat';
+$lang['New password'] = 'Uusi salasana';
+$lang['Next'] = 'Seuraava';
+$lang['No'] = 'Ei';
+$lang['Notification'] = 'Tiedoksi';
+$lang['Number of photos per page'] = 'Kuvien määrä sivulla';
+$lang['obligatory'] = 'pakollinen';
+$lang['Original'] = 'Alkuperäinen';
+$lang['Original dimensions'] = 'Alkuperäinen koko';
+$lang['Password'] = 'Salasana';
+$lang['Password forgotten'] = 'Unohdettu salasana';
+$lang['Password Reset'] = 'Salasanan palautus';
+$lang['password updated'] = 'salasana uusittu';
+$lang['Pause of slideshow'] = 'Pysäytä diaesitys';
+$lang['photo'] = 'kuva';
+$lang['Photo sizes'] = 'Kuvien koot';
+$lang['Previous'] = 'Edellinen';
+$lang['Profile'] = 'Profiili';
+$lang['Recent albums'] = 'Viimeisimmät albumit';
+$lang['Recent photos'] = 'Viimeisimmät kuvat';
+$lang['Registration'] = 'Rekisteröityminen';
+$lang['Repeat the slideshow'] = 'Toista diaesitys';
+$lang['representative'] = 'albumin esikatselukuva';
+$lang['Search in albums'] = 'Etsi albumeista';
+$lang['Search results'] = 'Hakutulos';
+$lang['searched words : %s'] = 'haetut sanat: %s';
+$lang['set as album representative'] = 'aseta albumin esikatselukuvaksi';
+$lang['slideshow'] = 'diaesitys';
+$lang['small'] = 'Pieni';
+$lang['Sort by'] = 'Lajitteluperuste';
+$lang['Sort order'] = 'Lajittelujärjestys';
+$lang['Thumbnails'] = 'Esikatselukuvat';
+$lang['Visits'] = 'Vierailut';
+$lang['Webmaster'] = 'Ylläpitäjä';
+$lang['Week %d'] = 'Viikko %d';
+$lang['Welcome'] = 'Tervetuloa';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Tervetuloa Piwigo kuvagalleriaasi!';
+$lang['xlarge'] = 'Isompi';
+$lang['xxlarge'] = 'Isoin';
+$lang['Yes'] = 'Kyllä';
+$lang['Your favorites'] = 'Suosikit';
+$lang['Your password has been reset'] = 'Salasanasi on nollattu';
+$lang['display this album'] = 'näytä tämä albumi';
+$lang['Download this file'] = 'Lataa tämä tiedosto';
+$lang['%d photo is also linked to current tags'] = '%d valokuva on liitetty myös nykyisiin tunnisteisiin';
+$lang['%d photos are also linked to current tags'] = '%d valokuvat on liitetty myös nykyisiin tunnisteisiin';
+$lang['%d rates'] = '%d arvostelut';
+$lang['(!) This comment requires validation'] = '(!) Tämä kommentti vaatii hyväksynnän';
+$lang['... or browse your empty gallery'] = '...tai selaa tyhjää kuvagalleriaasi';
+$lang['... or please deactivate this message, I will find my way by myself'] = '...tai poista tämä viesti käytöstä, otan itse selvää';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Ylläpitäjän on hyväksyttävä kommenttisi ennen kuin se tulee näkyviin.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Floodauksen esto: Odota hetki ennen kuin yrität lähettää uuden kommentin';
+$lang['Check your email for the confirmation link'] = 'Tarkista sähköpostistasi vahvistuslinkki';
+$lang['chronology_monthly_calendar'] = 'Kuukausikalenteri';
+$lang['chronology_monthly_list'] = 'Kuukausittainen lista';
+$lang['chronology_weekly_list'] = 'Viikottainen lista';
+$lang['Click here if your browser does not automatically forward you'] = 'Paina tästä mikäli selain ei automaattisesti siirrä sinua eteenpäin';
+$lang['Click on the photo to see it in high definition'] = 'Paina kuvaa nähdäksesi sen korkealaatuisena';
+$lang['cloud'] = 'pilvi';
+$lang['Comment by %s'] = 'Kommentti käyttäjältä %s';
+$lang['comment date'] = 'kommentin päivämäärä';
+$lang['Connected user: %s'] = 'Kytketty käyttäjä: %s';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Evästeet eivät ole sallittu tai selaimesi ei tue niitä. Evästeet on laitettava päälle kirjautuaksesi sisään.';
+$lang['created after %s (%s)'] = 'luotu %s (%s) jälkeen';
+$lang['created between %s (%s) and %s (%s)'] = 'luotu %s(%s) ja %s (%s) välissä';
+$lang['delete this photo from your favorites'] = 'poista tämä kuva suosikeista';
+$lang['display a calendar by creation date'] = 'näytä kalenteri luomispäivän mukaan';
+$lang['display a calendar by posted date'] = 'näytä kalenteri lähetyspäivän mukaan';
+$lang['display a set of random photos'] = 'näytä satunnaisia kuvia';
+$lang['display all photos in all sub-albums'] = 'näytä kaikki kuvat kaikista ala-albumeista';
+$lang['display available tags'] = 'näytä käytettävissä olevat tunnisteet';
+$lang['display best rated photos'] = 'näytä parhaiten arvioidut kuvat';
+$lang['display last user comments'] = 'näytä viimeisimmät käyttäjien kommentit';
+$lang['display most recent photos'] = 'näytä viimeisimmät kuvat';
+$lang['display most visited photos'] = 'näytä useimmin katsotut kuvat';
+$lang['display only recently posted photos'] = 'näytä vain viimeisimmäksi lähetetyt kuvat';
+$lang['display photos linked to this tag'] = 'näytä tähän tunnisteeseen linkitetyt kuvat';
+$lang['display recently updated albums'] = 'näytä viimeisimmäksi päivitetyt albumit';
+$lang['display your favorites photos'] = 'näytä suosikkikuvat';
+$lang['Email address is missing. Please specify an email address.'] = 'Sähköpostiosoite puuttuu. Määritä sähköpostiosoite.';
+$lang['Email: %s'] = 'Sähköposti: %s';
+$lang['Empty query. No criteria has been entered.'] = 'Tyhjä haku. Mitään ei haettu.';
+$lang['End-Date'] = 'Päättymispäivä';
+$lang['Enter your new password below.'] = 'Kirjoita uusi salasanasi alapuolelle.';
+$lang['EXIF Metadata'] = 'EXIF Metatiedot';
+$lang['html tags are not allowed in login'] = 'html tunnisteet eivät ole sallittuja käyttäjätunnuksessa';
+$lang['I want to add photos'] = 'Haluan lisätä kuvia';
+$lang['in %d sub-album'] = '%d ala-albumissa';
+$lang['in %d sub-albums'] = '%d ala-albumeissa';
+$lang['in this album'] = 'tässä albumissa';
+$lang['included'] = 'sisältyy';
+$lang['Interface theme'] = 'Käyttöliittymän teema';
+$lang['Invalid key'] = 'Väärä avain';
+$lang['Invalid password!'] = 'Väärä salasana!';
+$lang['Invalid username or email'] = 'Väärä käyttäjätunnus tai sähköpostiosoite';
+$lang['IPTC Metadata'] = 'IPTC Metatiedot';
+$lang['Last'] = 'Viimeinen';
+$lang['last %d days'] = 'viimeisimmät %d päivät';
+$lang['Here are your connection settings'] = 'Tässä on rekisteröitymistietosi';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Sähköpostiosoitteen tulee olla muotoa xxx@yyy.eee (esimerkiksi jack@altern.org)';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimikorkeuden tulee olla isompi kuin 50';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimileveyden tulee olla isompi kuin 50';
+$lang['no rate'] = 'ei arvosteltu';
+$lang['Not repeat the slideshow'] = 'Älä toista diaesitystä';
+$lang['Page generated in'] = 'Sivu luotu';
+$lang['Password reset is not allowed for this user'] = 'Salasanan palautus ei ole sallittu tälle käyttäjälle';
+$lang['Password: %s'] = 'Salasana:%s';
+$lang['Play of slideshow'] = 'Käynnistä diaesitys';
+$lang['please enter your password again'] = 'kirjoita salasanasi uudelleen';
+$lang['Please enter your username or email address.'] = 'Kirjoita käyttäjätunnus tai sähköpostiosoite';
+$lang['posted after %s (%s)'] = 'lähetetty %s(%s) jälkeen';
+$lang['posted before %s (%s)'] = 'lähetetty ennen %s(%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'lähetetty %s(%s) ja %s(%s) välissä';
+$lang['Posted on'] = 'Lähetetty';
+$lang['posted on %s'] = 'lähetetty %s';
+$lang['Preferences'] = 'Asetukset';
+$lang['Quick search'] = 'Pikahaku';
+$lang['Random photos'] = 'Satunnaiset valokuvat';
+$lang['Rank'] = 'Sijoitus';
+$lang['Rate this photo'] = 'Arvostele tämä kuva';
+$lang['Recent period'] = 'Viimeisin ajanjakso';
+$lang['Redirection...'] = 'Uudelleenohjaus...';
+$lang['Reduce diaporama speed'] = 'Vähennä diaesityksen nopeutta';
+$lang['Register'] = 'Rekisteröidy';
+$lang['remove this tag from the list'] = 'poista tämä tunniste listasta';
+$lang['Reset'] = 'Tyhjennä';
+$lang['Reset to default values'] = 'Palauta alkuperäisasetukset';
+$lang['Return to home page'] = 'Palaa etusivulle';
+$lang['return to normal view mode'] = 'palaa normaaliin katselunäkymään';
+$lang['RSS feed'] = 'RSS syöte';
+$lang['Search by date'] = 'Hae päivämäärän mukaan';
+$lang['Search for Author'] = 'Hae tekijän mukaan';
+$lang['Search for words'] = 'Hae sanoja';
+$lang['Search in sub-albums'] = 'Etsi ala-albumeista';
+$lang['Send my connection settings by email'] = 'Lähetä rekisteröitymistiedot sähköpostiini';
+$lang['Show file metadata'] = 'Näytä kuvan metatiedot';
+$lang['Show latest comments first'] = 'Näytä viimeisin kommentti ensin';
+$lang['Show number of comments'] = 'Näytä kommenttien lukumäärä';
+$lang['Show oldest comments first'] = 'Näytä vanhin kommentti ensin';
+$lang['Since'] = 'Alkaen';
+$lang['SQL queries in'] = 'SQL haut';
+$lang['stop the slideshow'] = 'pysäytä diaesitys';
+$lang['Submit'] = 'Lähetä';
+$lang['Tag'] = 'Tunniste';
+$lang['Tags'] = 'Tunnisteet';
+$lang['the beginning'] = 'alku';
+$lang['The number of photos per page must be a not null scalar'] = 'Kuvien lukumäärä sivulla on oltava enemmän kuin nolla';
+$lang['The passwords do not match'] = 'Salasanat eivät täsmää';
+$lang['the username must be given'] = 'käyttäjätunnus vaaditaan';
+$lang['This author modified following comment:'] = 'Tekijä on muokannut seuraavaa kommenttia:';
+$lang['This author removed the comment with id %d'] = 'Tekijä poisti kommentin id: %d';
+$lang['this email address is already in use'] = 'sähköpostiosoite on jo käytössä';
+$lang['today'] = 'tänään';
+$lang['User comments'] = 'Käyttäjien kommentit';
+$lang['User: %s'] = 'Käyttäjä:%s';
+$lang['Username'] = 'Käyttäjätunnus';
+$lang['Username modification'] = 'Käyttäjätunnuksen muokkaaminen';
+$lang['Username or email'] = 'Käyttäjätunnus tai sähköpostiosoite';
+$lang['Username: %s'] = 'Käyttäjätunnus:%s';
+$lang['View'] = 'Katso';
+$lang['View in'] = 'Katso';
+$lang['wrong date'] = 'väärä päivämäärä';
+$lang['Your comment has been registered'] = 'Kommenttisi on kirjattu';
+$lang['Your Gallery Customization'] = 'Kuvagallerian muokkaus';
+$lang['Your username has been successfully changed to : %s'] = 'Käyttäjätunnuksesi on vaihdettu, uusi käyttäjätunnus on: %s';
+$lang['Desktop'] = 'Työpöytä';
+$lang['display each day with photos, month per month'] = 'näytä joka päivä kuvia, kuukausi kuukaudelta';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Jos tämä oli vahinko, älä huomioi viestiä niin mitään ei tapahdu.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Jos sait tämän sähköpostin vahingossa, otathan yhteyttä %s';
+$lang['login mustn\'t end with a space character'] = 'käyttäjätunnus ei voi päättyä välilyöntiin';
+$lang['login mustn\'t start with a space character'] = 'käyttäjätunnus ei voi alkaa välilyönnillä';
+$lang['Manage this user comment: %s'] = 'Muokkaa käyttäjän kommenttia: %s';
+$lang['Mobile'] = 'Mobiili';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Uusi %s';
+$lang['photos posted during the last %d days'] = 'kuvat lisätty viimeisen %d päivän aikana';
+$lang['Photos posted within the last %d day.'] = 'Kuvat lisätty vain viimeisen %d päivän aikana.';
+$lang['Photos posted within the last %d days.'] = 'Kuvat lisätty vain viimeisten %d päivien aikana.';
+$lang['Piwigo Help'] = 'Piwigo help';
+$lang['Please, enter a login'] = 'Kirjoita käyttäjätunnuksesi';
+$lang['Post date'] = 'Lähetyspäivä';
+$lang['Powered by'] = 'Powered by';
+$lang['Quick connect'] = 'Pikayhteys';
+$lang['Rating score'] = 'Pisteet';
+$lang['Recent period must be a positive integer value'] = 'Viimeisimmän ajanjakson tulee olla positiivinen kokonaisluku';
+$lang['Registration of %s'] = '%s Rekisteröinti';
+$lang['Related tags'] = 'Samankaltaiset tunnisteet';
+$lang['Retrieve password'] = 'Palauta salasana';
+$lang['return to the display of all photos'] = 'palaa kaikkien kuvien näkymään';
+$lang['Search for all terms'] = 'Hae kaikkia sanoja';
+$lang['Search for any term'] = 'Hae mitä tahansa sanaa';
+$lang['Search rules'] = 'Hakukriteeri';
+$lang['Search tags'] = 'Haettavat tunnisteet';
+$lang['Show number of hits'] = 'Näytä osumien lukumäärä';
+$lang['show tag cloud'] = 'näytä tunnistepilvi';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Salasanan nollausta on pyytänyt käyttäjätili:';
+$lang['square'] = 'Neliö';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Rekisteröinti onnistui, saat kohta sähköpostissa rekisteröitymistietosi. Tervetuloa käyttäjäksi!';
+$lang['Tag results for'] = 'Tunnisteen tulokset';
+$lang['Thank you for registering at %s!'] = 'Kiitos rekisteröitymisestäsi %s!';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleria on suljettu huollon ajaksi. Tule takaisin myöhemmin.';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS-syöte tarjoaa ilmoitukset uusista tapahtumista tältä sivustolta: uudet kuvat, päivitetyt albumit ja uudet kommentit. Käytä RSS -lukijaa.';
+$lang['This login is already used by another user'] = 'Käyttäjätunnus on jo käytössä';
+$lang['this login is already used'] = 'käyttäjätunnus on jo käytössä';
+$lang['thumb'] = 'Kuvake';
+$lang['To reset your password, visit the following address:'] = 'Palauttaaksesi salasanan, mene seuraavaan osoitteeseen:';
+$lang['Unknown feed identifier'] = 'Tuntematon syötteen tunniste';
+$lang['Unknown identifier'] = 'Tuntematon tunniste';
+$lang['Update your rating'] = 'Päivitä arvostelut';
+$lang['useful when password forgotten'] = 'hyödyllinen jos unohdat salasanasi';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Käyttäjällä "%s" ei ole sähköpostiosoitetta, salasanan palautus ei ole mahdollista';
+$lang['Username "%s" on gallery %s'] = 'Käyttäjätunnus "%s" galleriassa %s';
+$lang['You are not authorized to access the requested page'] = 'Käyttöoikeutesi ei riitä sivun avaamiseen';
+$lang['You will receive a link to create a new password via email.'] = 'Saat sähköpostiisi ohjeet uuden salasanan luomiseksi.';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Kommenttiasi EI ole kirjattu, koska se ei läpäissyt tarkistus sääntöjä';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Tunnusta "vieras" ei voida käyttää, käytetään oletustunnusta. Ilmoitathan ylläpitäjälle.';
+$lang['Kind of date'] = 'Päivän valinta';
+$lang['Number of items'] = 'Tiedostojen lukumäärä';
+$lang['Specials'] = 'Ekstrat';
+$lang['2small'] = 'XXS - pikkuinen';
+$lang['Date created, new &rarr; old'] = 'Luontipäivä, uusi &rarr; vanha';
+$lang['Date created, old &rarr; new'] = 'Luontipäivä, vanha &rarr; uusi';
+$lang['Date posted, new &rarr; old'] = 'Lähetyspäivä, uusi &rarr; vanha';
+$lang['Date posted, old &rarr; new'] = 'Lähetyspäivä, vanha &rarr; uusi';
+$lang['File name, A &rarr; Z'] = 'Tiedoston nimi, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Tiedoston nimi, Z &rarr; A';
+$lang['Manual sort order'] = 'Manuaalinen lajittelujärjestys';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numerotunniste, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numerotunniste, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Kuvan otsikko, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Kuvan otsikko, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Arvostelu, korkea &rarr; matala';
+$lang['Rating score, low &rarr; high'] = 'Arvostelu, matala &rarr; korkea';
+$lang['Visits, high &rarr; low'] = 'Käynnit, korkea &rarr; matala';
+$lang['Visits, low &rarr; high'] = 'Käynnit, matala &rarr; korkea';
+$lang['excluded'] = 'pois jätetty';
+$lang['xsmall'] = 'XS - extra pieni';
+?>
Index: tags/2.4.0RC3/language/fi_FI/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/fi_FI/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fi_FI/install.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['Admin configuration'] = 'Pääkäyttäjän konfiguroiminen';
+$lang['Basic configuration'] = 'Perusasetukset';
+$lang['Can\'t connect to server'] = 'Ei pysty yhdistämään palvelimeen';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Yhteys palvelimeen onnistui, mutta yhteys tietokantaan on mahdotonta.';
+$lang['Database configuration'] = 'Tietokannan konfiguroiminen';
+$lang['Database name'] = 'Tietokannan nimi';
+$lang['Database table prefix'] = 'Tietokannan taulun etuliite';
+$lang['Default gallery language'] = 'Gallerian oletuskieli';
+$lang['Host'] = 'Isäntäkone';
+$lang['Installation'] = 'Asennus';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Tullaan näyttämään vierailijoille. Olennainen sivuston hallintaa ajatellen';
+$lang['Password'] = 'Salasana';
+$lang['Start Install'] = 'Aloita asennus';
+$lang['User'] = 'Käyttäjä';
+$lang['Webmaster login'] = 'Webmaster -kirjatuminen';
+$lang['also given by your host provider'] = 'myöskin palveluntarjoajan määrittelemä';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'paikallinen isäntäkone';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'sähköpostin tulee olla muodossa xxx@yyy.eee (esim. jack@altern.org)';
+$lang['user login given by your host provider'] = 'käyttäjänimi, jonka palveluntarjoaja on määrittänyt';
+$lang['user password given by your host provider'] = 'käyttäjän salasana, jonka palveluntarjoaja on määrittänyt';
+?>
Index: tags/2.4.0RC3/language/fi_FI/iso.txt
===================================================================
--- tags/2.4.0RC3/language/fi_FI/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/fi_FI/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Finnish [FI]
Index: tags/2.4.0RC3/language/fr_CA/about.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+<p>Cette galerie photo est basée sur Piwigo.</p>
+
+<p>Piwigo est un logiciel de galerie photo pour le web, bâti par une
+communauté active d'utilisateurs et de développeurs. Les extensions rendent
+Piwigo facilement personnalisable. Cerise sur le gâteau, Piwigo est libre et
+gratuit.</p>
+
+<p id="linkToPiwigo"><a href="http://fr.piwigo.org">Visiter le site web de Piwigo</a></p>
+
+<p>La traduction québécoise est maintenu par (ordre alphabétique) :
+<ul>
+<li><a href="http://fr.piwigo.org/forum/profile.php?id=5557">TiOger</a></li>
+</ul>
+         .... Merci à lui</p> 
Index: tags/2.4.0RC3/language/fr_CA/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/admin.lang.php	(revision 14585)
@@ -0,0 +1,909 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = "%d association";
+$lang['%d associations'] = "%d associations";
+$lang['%d album including'] = "%d catégorie dont";
+$lang['%d albums including'] = "%d catégories dont";
+$lang['%d physical'] = " %d physique";
+$lang['%d physical'] = " %d physiques";
+$lang[' and %d virtual'] = " et %d virtuelle";
+$lang[' and %d virtual'] = " et %d virtuelles";
+$lang['%d album moved'] = "%d catégorie déplacée";
+$lang['%d albums moved'] = "%d catégories déplacées";
+$lang['%d group'] = "%d groupe";
+$lang['%d groups'] = "%d groupes";
+$lang['%d member'] = "%d membre";
+$lang['%d members'] = "%d membres";
+$lang['%d tag'] = "%d mot clé";
+$lang['%d tags'] = "%d mots clés";
+$lang['%d user comment rejected'] = "%d commentaire d'utilisateur rejeté";
+$lang['%d user comments rejected'] = "%d commentaires d'utilisateurs rejetés";
+$lang['%d user comment validated'] = "%d commentaire d'utilisateur validé";
+$lang['%d user comments validated'] = "%d commentaires d'utilisateurs validés";
+$lang['%d user deleted'] = "%d utilisateur supprimé";
+$lang['%d users deleted'] = "%d utilisateurs supprimés";
+$lang['%d user'] = "%d utilisateur";
+$lang['%d users'] = "%d utilisateurs";
+$lang['%d waiting for validation'] = "%d en attente de validation";
+$lang['Actions'] = "Actions";
+$lang['Activate'] = "Activer";
+$lang['Add/delete a permalink'] = "Ajouter/effacer un lien permanent";
+$lang['Add a tag'] = "Ajouter un mot clé";
+$lang['Add a user'] = "Ajouter un utilisateur";
+$lang['Add group'] = "Ajouter un groupe";
+$lang['Add'] = "Ajouter";
+$lang['Allow user registration'] = "Permettre l'enregistrement des utilisateurs";
+$lang['Apply to sub-albums'] = "Appliquer aux sous-catégories";
+$lang['Associated'] = "Associée à";
+$lang['Caddie management'] = "Gestion du panier";
+$lang['Caddie'] = "Panier";
+$lang['Albums authorized thanks to group associations'] = "Catégories accessibles grâce à l'appartenance aux groupes";
+$lang['Album manual order was saved'] = "L'ordre manuel des catégories a été sauvegardé";
+$lang['Check for upgrade failed for unknown reasons.'] = "La vérification de la dernière version sur le serveur a échouée pour une raison inconnue.";
+$lang['Check for upgrade'] = "Dernière version ?";
+$lang['Comments for all'] = "Commentaires pour tous";
+$lang['Current name'] = "Nom courant";
+$lang['Database'] = "Base de données";
+$lang['Deactivate'] = "Désactiver";
+$lang['Delete Representant'] = "Supprimer le représentant";
+$lang['Delete selected tags'] = "Supprimer les mots clés sélectionnés";
+$lang['Delete selected users'] = "Supprimer les utilisateurs sélectionnés";
+$lang['Deletions'] = "Suppressions";
+$lang['Deny selected groups'] = "Interdire l'accès aux groupes sélectionnés";
+$lang['Deny selected users'] = "Interdire l'accès aux utilisateurs sélectionnés";
+$lang['Description'] = "Description";
+$lang['Display options'] = "Options d'affichage";
+$lang['Dissociated'] = "Dissociée de";
+$lang['Does not represent'] = "Ne représente pas";
+$lang['Edit selected tags'] = "Éditer les mots clés sélectionnés";
+$lang['Edit tags'] = "Éditer les mots clés";
+$lang['Email admins when a new user registers'] = "Notifier les administrateurs lors de l'inscription d'un utilisateur";
+$lang['Email admins when a valid comment is entered'] = "Notifier les administrateurs quand un commentaire est enregistré";
+$lang['Email admins when a comment requires validation'] = "Notifier les administrateurs quand un commentaire requiert leur validation";
+$lang['Environment'] = "Environnement";
+$lang['Form'] = "Formulaire";
+$lang['Gallery title'] = "Titre de la galerie";
+$lang['Grant selected groups'] = "Donner l'accès aux groupes sélectionnés";
+$lang['Grant selected users'] = "Donner l'accès aux utilisateurs sélectionnés";
+$lang['Group name'] = "Nom du groupe";
+$lang['Groups'] = "Groupes";
+$lang['Guests'] = "Invités";
+$lang['History'] = "Historique";
+$lang['Informations'] = "Informations";
+$lang['Install'] = "Installer";
+$lang['Link all album photos to a new album'] = "Associer tous les éléments de la catégorie à une nouvelle catégorie";
+$lang['Link all album photos to some existing albums'] = "Associer tous les éléments de la catégorie à des catégories existantes";
+$lang['Linked albums'] = "Catégories associées";
+$lang['Lock gallery'] = "Verrouiller la galerie";
+$lang['Maintenance'] = "Maintenance";
+$lang['Edit album permissions'] = "Gérer les permissions pour une catégorie";
+$lang['Manage permissions for group "%s"'] = "Gérer les permissions pour le groupe \"%s\"";
+$lang['Manage permissions for user "%s"'] = "Gérer les permissions pour l'utilisateur \"%s\"";
+$lang['Manage tags'] = "Gérer les mots clés";
+$lang['Members'] = "Membres";
+$lang['Metadata synchronized from file'] = "Méta-données synchronisées à partir du fichier";
+$lang['Move albums'] = "Déplacer les catégories";
+$lang['Move'] = "Déplacer";
+$lang['Name'] = "Nom";
+$lang['New name'] = "Nouveau nom";
+$lang['New parent album'] = "Nouvelle catégorie parente";
+$lang['New tag'] = "Nouveau mot clé";
+$lang['Number of comments per page'] = "Nombre de commentaires par page";
+$lang['Number of rates'] = "Nombre de notes";
+$lang['Number of thumbnails to create'] = "Nombre de miniatures à créer";
+$lang['Only private albums are listed'] = "Seules les catégories privées sont listées";
+$lang['Operating system'] = "Système d'exploitation";
+$lang['Options'] = "Options";
+$lang['Other private albums'] = "Autres catégories privées";
+$lang['Page banner'] = "Bannière des pages";
+$lang['Parent album'] = "Catégorie parente";
+$lang['Path'] = "Chemin";
+$lang['Permalink'] = "Lien permanent";
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = "Le lien permanent %s a été précédemment utilisé par la catégorie %s. Veuillez l'effacer de l'historique des liens permanents";
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "Le lien permanent ne doit contenir des caractères que parmi \"a-zA-Z0-9\", \"-\", \"_\" ou \"/\". Il ne doit pas être numérique ou commencer par un nombre suivi par \"-\"";
+$lang['Permalink %s is already used by album %s'] = "Le lien permanent %s est déja utilisé par la catégorie %s";
+$lang['Permalink history'] = "Historique des liens permanents";
+$lang['Permalinks'] = "Liens permanents";
+$lang['Permission denied'] = "Accès interdit";
+$lang['Permission granted thanks to a group'] = "Accès autorisé grâce à l'appartenance aux groupes";
+$lang['Permission granted'] = "Accès autorisé";
+$lang['Photo informations updated'] = "Informations de l'image mises à jour";
+$lang['Plugins'] = "Plugins";
+$lang['Position'] = "Position";
+$lang['Preferences'] = "Préférences";
+$lang['Properties'] = "Propriétés";
+$lang['Random photo'] = "Image au hasard";
+$lang['Rate date'] = "Date de notation";
+$lang['Rating by guests'] = "Notation par les invités";
+$lang['Rating'] = "Notation";
+$lang['Reject'] = "Rejeter";
+$lang['Representant'] = "Représentant";
+$lang['Representation of albums'] = "Représentation des catégories";
+$lang['Representative'] = "Représentant";
+$lang['Represents'] = "Représente";
+$lang['Save order'] = "Sauvegarder l'ordre";
+$lang['Save to permalink history'] = "Sauvegarder dans l'historique des liens permanents";
+$lang['Select at least one album'] = "Sélectionner au moins une catégorie";
+$lang['Select at least one photo'] = "Sélectionner au moins une image";
+$lang['Select at least one user'] = "Sélectionner au moins un utilisateur";
+$lang['Show info'] = "Montrer les informations";
+$lang['Site manager'] = "Gestionnaire des sites";
+$lang['Status'] = "Statut";
+$lang['Statistics'] = "Statistiques";
+$lang['Storage album'] = "Catégorie de stockage";
+$lang['Sum of rates'] = "Somme des notes";
+$lang['Tag "%s" already exists'] = "Le mot clé \"%s\" existe déjà";
+$lang['Tag "%s" was added'] = "Le mot clé \"%s\" a été ajouté";
+$lang['Tag selection'] = "Sélection de mots clés";
+$lang['The %d following tags were deleted'] = "Les %d mots clés suivants ont été supprimés";
+$lang['Unable to check for upgrade.'] = "Impossible de connaître la dernière version.";
+$lang['Uninstall'] = "Désinstaller";
+$lang['Use the default photo sort order (defined in the configuration file)'] = "Utiliser l'ordre de tri des images par défaut (défini dans le fichier de configuration)";
+$lang['User comments validation'] = "Validation des commentaires d'utilisateurs";
+$lang['Users'] = "Utilisateurs";
+$lang['Validate'] = "Valider";
+$lang['Validation'] = "Validation";
+$lang['Version'] = "Version";
+$lang['Virtual albums to move'] = "Catégories virtuelles à déplacer";
+$lang['Virtual album name'] = "Nom de la catégorie virtuelle";
+$lang['Webmaster cannot be deleted'] = "Le webmestre ne peut pas être supprimé";
+$lang['You are running on development sources, no check possible.'] = "Vous travaillez avec les sources de développement, impossible de vérifier la dernière version.";
+$lang['You cannot delete your account'] = "Vous ne pouvez pas supprimer votre compte";
+$lang['You cannot move an album in its own sub album'] = "Vous ne pouvez pas déplacer une catégorie dans sa propre sous-catégorie";
+$lang['You need to confirm deletion'] = "Vous devez confirmer la suppression";
+$lang['Associate to album'] = "Associer à la catégorie";
+$lang['associate to group'] = "Associer au groupe";
+$lang['Authorized'] = "Autorisés";
+$lang['Add a virtual album'] = "Ajouter une catégorie virtuelle";
+$lang['Authorize users to add comments on selected albums'] = "Autoriser les utilisateurs à ajouter des commentaires dans les catégories sélectionnées";
+$lang['The name of an album must not be empty'] = "Le nom de la catégorie ne doit pas être vide";
+$lang['Lock albums'] = "Verrouiller les catégories";
+$lang['Private'] = "Catégorie privée";
+$lang['Public'] = "Catégorie publique";
+$lang['Find a new representant by random'] = "Trouver un nouveau représentant au hasard";
+$lang['Public / Private'] = "Publique / Privée";
+$lang['Manage authorizations for selected albums'] = "Gérer le type d'accès pour les catégories sélectionnées";
+$lang['Virtual album added'] = "Catégorie virtuelle ajoutée";
+$lang['Virtual album deleted'] = "Catégorie virtuelle supprimée";
+$lang['Access type'] = "Type d'accès";
+$lang['Information data registered in database'] = "Informations enregistrées dans la base de données";
+$lang['Default display'] = "Affichage par défaut";
+$lang['The gallery URL is not valid.'] = "L'adresse de la galerie n'est pas valide.";
+$lang['Main'] = "Principale";
+$lang['The number of comments a page must be between 5 and 50 included.'] = "Le nombre de commentaires d'utilisateurs par page doit être compris entre 5 et 50.";
+$lang['Configuration'] = "Configuration";
+$lang['confirm'] = "Confirmer";
+$lang['Date'] = "Date";
+$lang['delete album'] = "supprimer la catégorie";
+$lang['Dissociate from album'] = "Dissocier de la catégorie";
+$lang['dissociate from group'] = "Dissocier du groupe";
+$lang['Album updated successfully'] = "Les informations de la catégorie ont été mises à jour avec succès.";
+$lang['photos per page'] = "Nombre d'éléments par page à afficher";
+$lang['High definition enabled'] = "Haute définition actif";
+$lang['File'] = "Fichier";
+$lang['first photo added on %s'] = "premier élément ajouté le %s";
+$lang['Forbidden'] = "Interdits";
+$lang['global mode'] = "Mode global";
+$lang['group "%s" added'] = "groupe \"%s\" ajouté";
+$lang['group "%s" deleted'] = "groupe \"%s\" supprimé";
+$lang['group "%s" updated'] = "groupe \"%s\" mis à jour";
+$lang['The name of a group must not contain " or \' or be empty.'] = "Le nom du groupe ne doit pas contenir \" ou ' et ne doit pas être vide.";
+$lang['This name is already used by another group.'] = "Ce nom est déjà utilisé par un autre groupe.";
+$lang['Groups'] = "Groupes";
+$lang['High definition'] = "Haute définition";
+$lang['jump to album'] = "Se rendre dans la catégorie";
+$lang['jump to photo'] = "Se rendre à l'image";
+$lang['leave'] = "laisser";
+$lang['Lock'] = "Verrouiller";
+$lang['Locked'] = "Verrouillées";
+$lang['manage album photos'] = "Gérer les éléments de la catégorie";
+$lang['manage sub-albums'] = "Gérer les sous-catégories";
+$lang['Manage'] = "Gérer";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = "Le temps d'exécution étant dépassé, le traitement doit continuer [Temps estimé: %d second].";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "Le temps d'exécution étant dépassé, le traitement doit continuer [Temps estimé: %d secondes].";
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = "Le temps de préparation de la liste des utilisateurs pour l'envoi est limité. Les autres utilisateurs ne sont pas listés.";
+$lang['Time to send mail is limited. Others mails are skipped.'] = "Le temps d'envoi des courriels est limité. Les autres envois de courriel ont été ignorés.";
+$lang['To send ?'] = "À envoyer ?";
+$lang['Last send'] = "Dernier envoi";
+$lang['email'] = "Courriel";
+$lang['User'] = "Utilisateur";
+$lang['See you soon,'] = "À bientôt,";
+$lang['Go to'] = "Rendez-vous sur";
+$lang['Hello'] = "Bonjour";
+$lang['New photos were added'] = "De nouveaux éléments ont été ajoutés";
+$lang['on'] = "le";
+$lang['between'] = "entre le";
+$lang['and'] = "et le";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "Vous venez d'être inscrit par le webmestre du site pour recevoir des notifications par courriel.";
+$lang['You have subscribed to receiving notifications by mail.'] = "Vous venez de vous inscrire pour recevoir des notifications par courriel.";
+$lang['To subscribe'] = "Pour vous inscrire";
+$lang['If you encounter problems or have any question, please send a message to'] = "En cas de problèmes ou de questions, envoyer un courriel à";
+$lang['[NBM] Problems or questions'] = "[NBM] Problèmes ou questions";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "Vous venez d'être désinscrit par le webmestre du site pour ne plus recevoir la notification par courriel.";
+$lang['You have unsubscribed from receiving notifications by mail.'] = "Vous venez de vous désinscrire pour ne plus recevoir la notification par courriel.";
+$lang[', click on'] = ", cliquez sur";
+$lang['To unsubscribe'] = "Pour vous désinscrire";
+$lang['With blank value, gallery title will be used'] = "Si non renseigné, le titre de la galerie sera utilisé";
+$lang['Notification'] = "Notification";
+$lang['Error when sending email to %s [%s].'] = "Erreur lors de l'envoi du courriel à %s [%s].";
+$lang['Mail sent to %s [%s].'] = "Courriel envoyé à %s [%s].";
+$lang['%d mail was sent.'] = "%s courriel a été envoyé.";
+$lang['%d mails were sent.'] = "%s courriels ont été envoyés.";
+$lang['%d mail was not sent.'] = "%s courriel n'a pas été envoyé.";
+$lang['%d mails were not sent.'] = "%s courriels n'ont pas été envoyés.";
+$lang['No mail to send.'] = "Pas de courriel à envoyer.";
+$lang['There is no available subscribers to mail.'] = "Il n'y a pas d'utilisateur à notifier par courriel.";
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "Un utilisateur peut être notifié seulement si de nouveaux éléments sont disponibles pour cet utilisateur.";
+$lang['Anyway only webmasters can see this tab and never administrators.'] = "Seul le webmaster a accès à cet onglet, pas les administrateurs.";
+$lang['No user to send notifications by mail.'] = "Pas d'utilisateur pour envoyer des notifications par courriels.";
+$lang['New photos added'] = "Nouveaux éléments ajoutés";
+$lang['Subscribe to notification by mail'] = "Inscription à la notification par courriel";
+$lang['Unsubscribe from notification by mail'] = "Désinscription à la notification par courriel";
+$lang['Parameter'] = "Paramétrage";
+$lang['Operation in progress'] = "Traitement en cours.";
+$lang['Continue processing treatment'] = "Continuer le traitement en cours";
+$lang['Complementary mail content'] = "Contenu complémentaire du courriel";
+$lang['Add detailed content'] = "Ajout d'un contenu détaillé";
+$lang['Send mail as'] = "Envoyer le courriel en tant que";
+$lang['Send mail to users'] = "Envoie de courriel aux utilisateurs";
+$lang['Send'] = "Envoie";
+$lang['Options'] = "Options";
+$lang['Send'] = "Envoyer";
+$lang['Subscribed'] = "Inscrits";
+$lang['Subscribe'] = "S'inscrire";
+$lang['Parameters'] = "Paramètres";
+$lang['Select recipients'] = "Sélection des destinataires";
+$lang['Subscribe/unsubscribe users'] = "Inscrire/désinscrire les utilisateurs";
+$lang['Unsubscribed'] = "Non inscrits";
+$lang['%d parameter was updated.'] = "%d paramètre a été mis à jour.";
+$lang['%d parameters were updated.'] = "%d paramètres ont été mis à jour.";
+$lang['%d user was not updated.'] = "%d utilisateur n'a pas été mis à jour.";
+$lang['%d users were not updated.'] = "%d utilisateurs n'ont pas été mis à jour.";
+$lang['User %s [%s] was removed from the subscription list.'] = "L'utilisateur %s [%s] a été supprimé de la liste des inscrits.";
+$lang['User %s [%s] was added to the subscription list.'] = "L'utilisateur %s [%s] a été ajouté à la liste des inscrits.";
+$lang['%d user was updated.'] = "%d utilisateur a été mis à jour.";
+$lang['%d users were updated.'] = "%d utilisateurs ont été mis à jour.";
+$lang['User %s [%s] was not removed from the subscription list.'] = "L'utilisateur %s [%s] n'a pas été supprimé de la liste des inscrits.";
+$lang['User %s [%s] was not added to the subscription list.'] = "L'utilisateur %s [%s] n'a pas été ajouté à la liste des inscrits.";
+$lang['User %s [%s] added.'] = "Utilisateur %s [%s] ajouté.";
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = "Attention, l'inscription ou la désincription génère l'envoi de courriel aux utilisateurs concernés";
+$lang['Send mail on HTML format'] = "Envoyer le courriel au format HTML";
+$lang['Include display of recent photos grouped by dates'] = "Inclure l'affichage des dernières images groupées par dates";
+$lang['Available only with HTML format'] = "Disponible uniquement avec le format HTML";
+$lang['no write access'] = "Pas d'accès en écriture";
+$lang['Permissions'] = "Permissions";
+$lang['private'] = "privé";
+$lang['Properties'] = "Propriétés";
+$lang['public'] = "public";
+$lang['Purge never used notification feeds'] = "Purger les flux de notification jamais utilisés";
+$lang['Purge sessions'] = "Purger les sessions";
+$lang['randomly represented'] = "représentant au hasard";
+$lang['registration date'] = "date d'enregistrement";
+$lang['clean'] = "nettoyer";
+$lang['Create this site'] = "Créer ce site";
+$lang['test'] = "tester";
+$lang['test this remote site'] = "tester ce site distant";
+$lang['remove tags'] = "supprimer les tags";
+$lang['Repair and optimize database'] = "Réparer et optimiser la base de données";
+$lang['selection'] = "sélection";
+$lang['set to'] = "changer en";
+$lang['singly represented'] = "représentant fixe";
+$lang['This site already exists'] = "Ce site existe déjà";
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = "Créer un nouveau site distant : (donner son URL vers create_listing_file.php)";
+$lang['created'] = "créé";
+$lang['delete this site and all its attached elements'] = "supprimer ce site et toutes les informations associées";
+$lang['an error happened'] = "une erreur est survenue";
+$lang['Local'] = "Local";
+$lang['Remote'] = "Distant";
+$lang['update the database from files'] = "met à jour la base de données à partir des fichiers";
+$lang['status'] = "Statut";
+$lang['Directory'] = "Répertoire";
+$lang['sub-albums'] = "sous-catégories";
+$lang['Synchronize metadata'] = "Synchroniser les méta-données";
+$lang['target'] = "Cible";
+$lang['title'] = "Titre";
+$lang['Album list management'] = "Gestion des catégories";
+$lang['Piwigo configuration'] = "Configuration de Piwigo";
+$lang['Edit album'] = "Modifier une catégorie";
+$lang['Group management'] = "Gestion des groupes";
+$lang['User list'] = "Liste des utilisateurs";
+$lang['Edit photo information'] = "Modifier les informations d'une image";
+$lang['Database synchronization with files'] = "Synchronisation de la base à partir des fichiers de";
+$lang['all'] = "Tout";
+$lang['height must be a number superior to'] = "la hauteur doit un entier supérieur à";
+$lang['width must be a number superior to'] = "la largeur doit être un entier supérieur à";
+$lang['for the file format'] = "pour le format de fichier";
+$lang['Photo unreachable or no support'] = "Image inaccessible ou format non supporté";
+$lang['GD version'] = "version de GD";
+$lang['General statistics'] = "Statistiques générales";
+$lang['average time'] = "temps moyen";
+$lang['number of miniaturized photos'] = "nombre de miniatures créées";
+$lang['total time'] = "temps total";
+$lang['for this file format'] = "pour ce format de fichier";
+$lang['unit mode'] = "Mode unitaire";
+$lang['Unlocked'] = "Déverrouillées";
+$lang['unset'] = "vider";
+$lang['Update albums informations'] = "Mettre à jour les informations des catégories";
+$lang['Update photos information'] = "Mettre à jour les informations des images";
+$lang['Synchronize'] = "Synchroniser";
+$lang['reduce to single existing albums'] = "Traiter uniquement une catégorie";
+$lang['Choose an option'] = "Choisir une option";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = "Afficher un maximum d'informations (catégories ajoutées, éléments ajoutés, catégories et éléments supprimés)";
+$lang['Error list'] = "Liste des erreurs";
+$lang['Errors caption'] = "Légende des erreurs";
+$lang['Detailed informations'] = "Informations détaillées";
+$lang['File/directory read error'] = "Erreur d'ouverture fichier/répertoire";
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = "Le fichier ou répertoire ne peut pas être accessible (soit il n'existe pas, soit l'accès est refusé)";
+$lang['albums deleted in the database'] = "catégories supprimées de la base de données";
+$lang['photos deleted from the database'] = "éléments supprimés de la base de données";
+$lang['photos candidates for metadata synchronization'] = "images candidates à la synchronisation avec les méta-données";
+$lang['photos informations synchronized with files metadata'] = "informations des images synchronisées avec les méta-données";
+$lang['errors during synchronization'] = "erreurs survenues durant la synchronisation";
+$lang['albums added in the database'] = "catégories ajoutées dans la base de données";
+$lang['photos added in the database'] = "éléments ajoutés dans la base de données";
+$lang['photos updated in the database'] = "éléments mis à jour dans la base de données";
+$lang['Search for new images in the directories'] = "Chercher les nouvelles images dans les répertoires";
+$lang['added'] = "ajouté";
+$lang['deleted'] = "supprimé";
+$lang['Metadata synchronization results'] = "Résultat de la synchronisation des méta-données";
+$lang['only perform a simulation (no change in database will be made)'] = "Simuler uniquement (aucun changement ne sera fait dans la base de données)";
+$lang['Simulation'] = "Simulation";
+$lang['directories + files'] = "Répertoires + fichiers";
+$lang['only directories'] = "Répertoires uniquement";
+$lang['synchronize files structure with database'] = "Synchroniser la structure des fichiers avec la base de données";
+$lang['synchronize files metadata with database photos informations'] = "Synchroniser les informations des éléments de la base de données à partir des méta-données des fichiers";
+$lang['even already synchronized photos'] = "Même les éléments déjà synchronisés";
+$lang['Used metadata'] = "Méta-données employées";
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = "Le nom des répertoires et des fichiers ne doit être constitué que de lettres, de chiffres, de \"-\", \"_\" et \".\"";
+$lang['wrong filename'] = "nom de fichier erroné";
+$lang['Upload'] = "Ajout";
+$lang['user "%s" added'] = "utilisateur \"%s\" ajouté";
+$lang['User status'] = "Statut de l'utilisateur";
+$lang['user_status_admin'] = "Administrateur";
+$lang['user_status_generic'] = "Générique";
+$lang['user_status_guest'] = "Invité";
+$lang['user_status_normal'] = "Visiteur";
+$lang['user_status_webmaster'] = "Webmestre";
+$lang['Users'] = "Utilisateurs";
+$lang['Virtual album'] = "Catégorie virtuelle";
+$lang['Waiting'] = "En attente";
+$lang['default'] = "par défaut";
+$lang['Toggle \'default group\' property'] = "Inverser la propriété 'groupe par défaut'";
+$lang['Advanced features'] = "Fonctions avancées";
+$lang['Overall'] = "Vue globale";
+$lang['Year'] = "Année";
+$lang['Month'] = "Mois";
+$lang['Day'] = "Jour";
+$lang['Pages seen'] = "Pages vues";
+$lang['Time'] = "Heure";
+$lang['User'] = "Utilisateur";
+$lang['IP'] = "IP";
+$lang['Element'] = "Élément";
+$lang['Section'] = "Section";
+$lang['Properties'] = "Propriétés";
+$lang['An information email was sent to group "%s"'] = "Un courriel d'informations a été envoyé aux membres du groupe \"%s\"";
+$lang['Send an information email to group members'] = "Envoyer un courriel d'informations aux membres d'un groupe";
+$lang['Group'] = "Groupe";
+$lang['[%s] Visit album %s'] = "[%s] Venez visiter la catégorie %s";
+$lang['Hello,'] = "Bonjour,";
+$lang['See you soon.'] = "À bientôt.";
+$lang['Discover album:'] = "Venez découvrir la catégorie:";
+$lang['Mail content'] = "Contenu du courriel";
+$lang['none'] = "aucun";
+$lang['high'] = "élevé";
+$lang['other'] = "autre";
+$lang['Element type'] = "Type d'élément";
+$lang['User'] = "Utilisateur";
+$lang['Image id'] = "Identifiant image";
+$lang['Summary'] = "Résumé";
+$lang['%d line filtered'] = "%d ligne filtrée";
+$lang['%d lines filtered'] = "%d lignes filtrées";
+$lang['%d guest'] = "%d invité";
+$lang['%d guests'] = "%d invités";
+$lang['Hour'] = "Heure";
+$lang['guest'] = "invité";
+$lang['default values'] = "valeurs par défaut";
+$lang['Guest cannot be deleted'] = "L'invité ne peut pas être supprimé";
+$lang['Default user cannot be deleted'] = "L'utilisateur par défaut ne peut pas être supprimé";
+$lang['Purge history detail'] = "Purger le détail de l'historique";
+$lang['Purge history summary'] = "Purger le récapitulatif de l'historique";
+$lang['Check integrity'] = "Contrôle d'intégrité";
+$lang['Anomaly'] = "Anomalie";
+$lang['Correction'] = "Correction";
+$lang['Automatic correction'] = "Correction automatique";
+$lang['Impossible automatic correction'] = "Correction automatique impossible";
+$lang['Correction applied with success'] = "Correction appliquée avec succès";
+$lang['Correction applied with error'] = "Correction appliquée avec erreur";
+$lang['%d anomaly has been detected.'] = "%d anomalie a été détectée.";
+$lang['%d anomalies have been detected.'] = "%d anomalies ont été détectées.";
+$lang['%d anomaly has been corrected.'] = "%d anomalie a été corrigée.";
+$lang['%d anomalies have been detected corrected.'] = "%d anomalies ont été détectées et corrigées.";
+$lang['%d anomaly has not been corrected.'] = "%d anomalie n'a pu être corrigée.";
+$lang['%d anomalies have not been corrected.'] = "%d anomalies n'ont pu être corrigées.";
+$lang['Go to %s or %s for more informations'] = "Allez sur %s ou %s pour plus d'informations";
+$lang['the forum'] = "le forum";
+$lang['the wiki'] = "le wiki";
+$lang['%s value is not correct file because exif are not supported'] = "La valeur de %s est incorrecte parce que les exif ne sont pas supportés";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s doit être mis à \"false\" dans votre fichier local/config/config.inc.php";
+$lang['Main "guest" user does not exist'] = "L'utilisateur \"invité\" principal n'existe plus";
+$lang['Main "guest" user status is incorrect'] = "Le statut de l'utilisateur \"invité\" principal est incorrect";
+$lang['Default user does not exist'] = "L'utilisateur par défaut n'existe pas";
+$lang['Main "webmaster" user does not exist'] = "L'utilisateur \"Webmestre\" principal n'existe pas";
+$lang['Main "webmaster" user status is incorrect'] = "Le statut de l'utilisateur \"Webmestre\" principal est incorrect";
+$lang['User "%s" created with "%s" like password'] = "Utilisateur \"%s\" créé avec le mot de passe \"%s\"";
+$lang['Status of user "%s" updated'] = "Statut de l'utilisateur \"%s\" mis à jour";
+$lang['add new photos to caddie'] = "Ajouter les nouveaux éléments au panier";
+$lang['No display'] = "Pas d'affichage";
+$lang['Classic display'] = "Affichage classique";
+$lang['Hoverbox display'] = "Affichage lors du survol";
+$lang['Mail address is obligatory for all users'] = "L'adresse courriel est obligatoire pour tous les utilisateurs";
+$lang['Minimum privacy level'] = "Niveau minimal de confidentialité";
+$lang['Privacy level'] = "Niveau de confidentialité";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "Contacts";
+$lang['Level 2'] = "Amis";
+$lang['Level 4'] = "Famille";
+$lang['Level 8'] = "Admins";
+$lang['Reinitialize check integrity'] = "Réinitialiser les contrôles d'intégrité";
+$lang['Check all'] = "Tout cocher";
+$lang['Uncheck all'] = "Tout décocher";
+$lang['Check automatic corrections'] = "Cocher les corrections automatiques";
+$lang['Apply selected corrections'] = "Appliquer les corrections sélectionnées";
+$lang['Ignore selected anomalies'] = "Ignorer les anomalies sélectionnées";
+$lang['Refresh'] = "Rafraîchir";
+$lang['The anomaly will be ignored until next application version'] = "L'anomalie sera ignorée jusqu'à la prochaine version de l'application";
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = "L'anomalie ne sera plus ignorée du fait de sa correction";
+$lang['%d anomaly has been ignored.'] = "%d anomalie a été ignorée.";
+$lang['%d anomalies have been ignored.'] = "%d anomalies ont été ignorées.";
+$lang['Plugins which need upgrade'] = "Plugins à mettre à jour";
+$lang['Plugin list'] = "Liste des plugins";
+$lang['Check for updates'] = "Rechercher les mises à jour";
+$lang['Other plugins'] = "Autres plugins disponibles";
+$lang['Last revisions'] = "Dernières révisions";
+$lang['Are you sure you want to delete this plugin?'] = "Êtes-vous sûr de vouloir supprimer ce plugin?";
+$lang['Are you sure you want to install this plugin?'] = "Êtes-vous sûr de vouloir installer ce plugin?";
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "Êtes-vous sur de vouloir installer cette mise à jour? Vous devez vérifiez que cette mise à jour ne nécessite pas de désinstallation préalable.";
+$lang['Plugin has been successfully copied'] = "Le plugin a été copié avec succès.";
+$lang['You might go to plugin list to install and activate it.'] = "Rendez-vous dans la liste des plugins pour l'installer et l'activer.";
+$lang['Can\'t create temporary file.'] = "Impossible de créer un fichier temporaire.";
+$lang['Can\'t download archive.'] = "Impossible de télécharger l'archive.";
+$lang['Can\'t read or extract archive.'] = "Impossible de lire ou d'extraire l'archive.";
+$lang['An error occured during extraction (%s).'] = "Une erreur est survenue pendant l'extraction des fichiers (%s).";
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "Vérifiez les permissions du dossier \"plugins\" et de ses sous-dossiers (CHMOD).";
+$lang['Can\'t connect to server.'] = "Impossible de se connecter au serveur.";
+$lang['Purge compiled templates'] = "Purger les templates compilés";
+$lang['Upload'] = "Ajout";
+$lang['ACCESS_0'] = "Accès libre";
+$lang['ACCESS_1'] = "Accès à tous";
+$lang['ACCESS_2'] = "Accès aux utilisateurs inscrits";
+$lang['ACCESS_3'] = "Accès aux administrateurs";
+$lang['ACCESS_4'] = "Accès aux webmestres";
+$lang['ACCESS_5'] = "Pas d'accès";
+$lang['Support'] = "Support";
+$lang['Documentation'] = "Documentation";
+$lang['A new version of Piwigo is available.'] = "Une nouvelle version de Piwigo est disponible.";
+$lang['Piwigo Administration'] = "Administration de Piwigo";
+$lang['Piwigo version'] = "Version de Piwigo";
+$lang['You are running the latest version of Piwigo.'] = "Vous utilisez la dernière version de Piwigo.";
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = "La version de %s [%s] installée est incompatible avec la version requise [%s]";
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "Vous devez mettre à jour votre système pour profiter pleinement de l'application, sinon l'application ne fonctionnera pas correctement, voire pas du tout";
+$lang['Deleted on'] = "Supprimés sur";
+$lang['Last hit'] = "dernier score";
+$lang['GD library is missing'] = "la bibliothèque GD est manquante";
+$lang['Templates'] = "Templates (modèles)";
+$lang['Extend for templates'] = "Étendre les templates";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "Remplacement des templates d'origine par vos templates personnalisés issus du dossier template-extension";
+$lang['Replacers (customized templates)'] = "Remplaçants (templates modifiés)";
+$lang['Original templates'] = "Templates d'origine";
+$lang['Optional URL keyword'] = "Paramètre facultatif de l'URL";
+$lang['Templates configuration has been recorded.'] = "La configuration des templates a été enregistrée.";
+$lang['All optimizations have been successfully completed.'] = "Toutes les optimisations ont été réalisées avec succès.";
+$lang['Optimizations have been completed with some errors.'] = "Les optimisations réalisées comportent certaines erreurs.";
+$lang['Modify information'] = "Modifier les informations";
+$lang['nothing'] = "Rien";
+$lang['overrides existing values with empty ones'] = "Écraser les données existantes avec des données vides";
+$lang['Manage photo ranks'] = "Gérer l'ordre des images";
+$lang['Edit ranks'] = "Modifier l'ordre";
+$lang['No photo in this album'] = "Aucun élément dans cette catégorie";
+$lang['Images manual order was saved'] = "L'ordre manuel des images a été sauvegardé";
+$lang['ranks'] = "rangs";
+$lang['By rank'] = "Par le rang";
+$lang['Manual order'] = 'Ordre manuel';
+$lang['Drag to re-order'] = "Cliquer-glisser pour ré-organiser";
+$lang['Quick Local Synchronization'] = "Synchronisation rapide";
+$lang['No photo can be deleted'] = "Aucune photo ne peut être supprimée";
+$lang['Delete selected photos'] = "Supprimer les photos sélectionnées";
+$lang['%d photo was deleted'] = "%d photo a été supprimée";
+$lang['%d photos were deleted'] = "%d photos ont été supprimées";
+$lang['Downloads'] = "Téléchargements";
+$lang['Released on'] = "Publié le";
+$lang['Number of downloads'] = "Nombre de téléchargements";
+$lang['Piwigo Announcements Newsletter'] = "Newsletter Piwigo";
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = "Gardez le contact avec le projet Piwigo, abonnez-vous à la newsletter. Vous recevrez un ecourriel lorsqu'une nouvelle version est disponible (parfois un bug de sécurité est corrigé, il est important de le savoir et de mettre à jour) ou qu'un événement majeur survient sur le projet. Quelques messages par an seulement.";
+$lang['Subscribe %s'] = "Abonner %s";
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = "Abonner %s à la newsletter Piwigo";
+$lang['Purge search history'] = "Purger l'historique des recherches";
+$lang['Hide'] = "Masquer";
+$lang['Password is missing. Please enter the password.'] = "Le mot de passe manque. Veuillez saisir le mot de passe.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "La confirmation du mot de passe manque. Veuillez confirmer le mot de passe choisi.";
+$lang['Allow users to edit their own comments'] = "Autoriser les utilisateurs à modifier leurs propres commentaires";
+$lang['Allow users to delete their own comments'] = "Autoriser les utilisateurs à supprimer leurs propres commentaires";
+$lang['Email administrators when a comment is modified'] = "Notifier les administrateurs quand un commentaire est modifié";
+$lang['Email administrators when a comment is deleted'] = "Notifier les administrateurs quand un commentaire est supprimé";
+$lang['Cannot delete the old permalink !'] = "Impossible de supprimer cet ancien lien permanent !";
+$lang['Hit'] = "Pointage";
+$lang['Tools'] = "Outils";
+$lang['Photos'] = "Photos";
+$lang['Themes'] = "Thèmes";
+$lang['Instructions to use Piwigo'] = "Instructions pour utiliser Piwigo";
+$lang['Installed Themes'] = "Thèmes installés";
+$lang['Add New Theme'] = "Ajouter un thème";
+$lang['Forbid this theme to users'] = "Interdire ce thème aux utilisateurs";
+$lang['Set as default theme for unregistered and new users'] = "Thème par défaut pour les invités et les nouveaux utilisateurs";
+$lang['unknown'] = 'inconnu';
+$lang['Upload Photos'] = 'Ajoutez des photos';
+$lang['Drop into album'] = 'Mettre dans une catégorie';
+$lang['+ Add an upload box'] = '+ Ajouter une autre boîte de transfert';
+$lang['Upload'] = 'Transférer';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Créez le répertoire "%s" à la racine de votre installation Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Donnez les droits en écriture (chmod 777) sur le répertoire "%s" à la racine de votre installation Piwigo';
+$lang['existing album'] = 'catégorie existante';
+$lang['create a new album'] = 'créer une nouvelle catégorie';
+$lang['Album name'] = 'Nom de la catégorie';
+$lang['Album "%s" has been added'] = 'La catégorie "%s" a été ajoutée';
+$lang['Uploaded Photos'] = 'Photos ajoutées ';
+$lang['%d photos uploaded'] = '%d photos ajoutées';
+$lang['Privacy level set to "%s"'] = 'Niveau de confidentialité "%s"';
+$lang['Album "%s" now contains %d photos'] = 'La catégorie "%s" contient désormais %d photos';
+$lang['Manage this set of %d photos'] = 'Gérer ce lot de %d photos';
+$lang['Select files'] = 'Choisir des fichiers';
+$lang['Everybody'] = 'Tout le monde';
+$lang['Who can see these photos?'] = 'Qui peut voir ces photos ?';
+$lang['Who can see this photo?'] = 'Qui peut voir cette photo ?';
+$lang['Settings'] = 'Configuration';
+$lang['Resize'] = 'Redimensionner';
+$lang['Maximum Width'] = 'Largeur maximum';
+$lang['pixels'] = 'pixels';
+$lang['Maximum Height'] = 'Hauteur maximum';
+$lang['Image Quality'] = 'Qualité d\'image';
+$lang['Thumbnail'] = 'Miniature';
+$lang['Save Settings'] = 'Enregistrer les paramètres';
+$lang['Your configuration settings are saved'] = 'Vos paramètres de configurations sont enregistrés';
+$lang['Active Themes'] = 'Thèmes activés';
+$lang['Add write access to the "%s" directory'] = 'Ajoutez l\'accès en écriture pour le répertoire "%s"';
+$lang['Administration Home'] = 'Accueil administration';
+$lang['Change Admin Colors'] = 'Modifier les couleurs de l\'administration';
+$lang['Delete this theme'] = 'Supprimer ce thème';
+$lang['Directory does not exist'] = 'Le répertoire n\'existe pas';
+$lang['Download,'] = 'Téléchargez,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronisation';
+$lang['Get Support on Piwigo Forum'] = 'Obtenir de l\'aide sur le forum Piwigo';
+$lang['Help Me'] = 'À l\'aide';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'L\'activation de ce thème est impossible, car le thème parent est manquant : %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ce thème ne peut être supprimé, car d\'autres thème dépendent de lui : %s';
+$lang['Inactive Themes'] = 'Thèmes désactivés';
+$lang['Install on your computer,'] = 'Installez sur votre ordinateur,';
+$lang['Make this theme available to users'] = 'Rendre ce thème disponible aux utilisateurs';
+$lang['Page end'] = 'Fin de la page';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Operation in progress'] = 'Traitement en cours.';
+$lang['Please wait...'] = 'Veuillez patienter ...';
+$lang['Read Piwigo Documentation'] = 'Lire la documentation Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Démarrez pLoader et ajoutez vos photos.';
+$lang['Switch to clear or dark colors for administration'] = 'Choisir des couleurs claires ou sombres pour l\'administration';
+$lang['Theme has been successfully installed'] = 'Le thème a été installé avec succès';
+$lang['Visit Gallery'] = 'Visiter la galerie';
+$lang['Visit Piwigo project website'] = 'Visiter le site web du projet Piwigo';
+$lang['Guest Settings'] = 'Paramètres visiteur';
+$lang['Main Page'] = 'Page principale';
+$lang['Photo Page'] = 'Page de la photo';
+$lang['Activate Navigation Bar'] = 'Activer la barre de navigation';
+$lang['Activate Navigation Thumbnails'] = 'Activer les miniatures de navigation';
+$lang['Activate icon "%s"'] = 'Activer l\'icône "%s"';
+$lang['Photo Properties'] = 'Propriétés de la photo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader signifie <em>Piwigo Uploader</em>. Depuis votre ordinateur, pLoader prépare vos photos et les transfert vers votre galerie photo Piwigo.';
+$lang['Languages'] = 'Langues';
+$lang['Installed Languages'] = 'Langues installées';
+$lang['Add New Language'] = 'Ajouter une langue';
+$lang['Language has been successfully installed'] = 'La langue a été installée avec succès';
+$lang['Allow user customization'] = "Permettre la personnalisation de l'affichage";
+$lang['Select:'] = 'Sélectionner :';
+$lang['None'] = 'Rien';
+$lang['Invert'] = 'Inverser';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Impossible de désactiver ce thème, il doit rester au moins un thème activé.';
+$lang['Webmaster status is required.'] = 'Vous devez avoir le status de "webmaster".';
+$lang['Bound Theme'] = 'Thème rattaché';
+$lang['Allow rating'] = "Permettre les notations";
+$lang['Select at least one comment'] = 'Sélectionnez au moins un commentaire';
+$lang['Active Plugins'] = 'Plugins activés';
+$lang['Inactive Plugins'] = 'Plugins désactivés';
+$lang['Missing Plugins'] = 'Plugins manquants';
+$lang['Uninstalled Plugins'] = 'Plugins non installés';
+$lang['By %s'] = 'Par %s';
+$lang['Visit plugin site'] = 'Visitez le site du plugin';
+$lang['Active Languages'] = 'Langues activées';
+$lang['Delete this language'] = 'Supprimer cette langue';
+$lang['Forbid this language to users'] = 'Interdire cette langue aux utilisateurs';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossible de désactiver cette langue, commencez par définir une autre langue par défaut.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossible de désactiver cette langue, il doit rester au moins une langue.';
+$lang['Inactive Languages'] = 'Langues désactivées';
+$lang['Make this language available to users'] = 'Rendre cette langue disponible aux utilisateurs';
+$lang['Set as default language for unregistered and new users'] = 'Langue par défaut pour les invités et les nouveaux utilisateurs';
+$lang['Add Photos'] = 'Ajouter des photos';
+$lang['Miscellaneous'] = 'Divers';
+$lang['The following tag was deleted'] = 'Le mot clé suivant a été supprimé';
+$lang['Virtual Links'] = 'Liens virtuels';
+$lang['There is no other language available.'] = 'Il n\'y a pas d\'autre langue disponible.';
+$lang['There is no other plugin available.'] = 'Il n\'y a pas d\'autre plugin disponible.';
+$lang['There is no other theme available.'] = 'Il n\'y a pas d\'autre thème disponible.';
+$lang['delete'] = 'effacer';
+$lang['Add another set of photos'] = 'Ajouter d\'autres photos';
+$lang['Order of menubar items has been updated successfully.'] = 'L\'ordre des éléments du menu a été mis à jour avec succès.';
+$lang['This theme was not designed to be directly activated'] = 'Ce thème n\'est pas conçu pour être activé directement';
+$lang['Pending Comments'] = 'Commentaires en attente';
+$lang['Menu Management'] = 'Menus';
+$lang['%d of %d photos selected'] = '%d photos sur %d sont sélectionnées';
+$lang['Action'] = 'Action';
+$lang['Add a filter'] = 'Ajouter un filtre';
+$lang['Album photos associated to the following albums: %s'] = 'Les photos de l\'album ont été associées aux albums suivants : %s';
+$lang['Albums automatically sorted'] = 'Les albums ont été triés automatiquement';
+$lang['All %d photos are selected'] = 'Toutes les %d photos du lot sont sélectionnées';
+$lang['Apply action'] = 'Appliquer l\'action';
+$lang['automatic order'] = 'ordre automatique';
+$lang['Batch Manager'] = 'Gestion par lot';
+$lang['Choose an action'] = 'Choisir une action';
+$lang['Delete orphan tags'] = 'Supprimer les mots clés orphelins';
+$lang['delete photo'] = 'supprimer la photo';
+$lang['Duplicates'] = 'Doublons';
+$lang['Error on file "%s" : %s'] = 'Erreur sur le fichier "%s" : %s';
+$lang['Exif extension not available, admin should disable exif use'] = 'L\'extension Exif n\'est pas disponible, un administrateur devrait désactiver l\'utilisation des métadonnées Exif';
+$lang['Failed to write file to disk'] = 'Échec à l\'écriture du fichier sur le serveur';
+$lang['File upload stopped by extension'] = 'Le transfert du fichier a été arrêté par une extension';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Dans votre fichier php.ini, la variable upload_max_filesize (%sB) est plus grande que post_max_size (%sB), vous devriez modifier ce paramètre';
+$lang['include child albums'] = 'inclure les sous-albums';
+$lang['manual order'] = 'ordre manuel';
+$lang['Missing a temporary folder'] = 'Impossible de trouver le répertoire temporaire';
+$lang['No file was uploaded'] = 'Aucun fichier n\'a été transféré';
+$lang['No photo in the current set.'] = 'Aucune photo dans le lot.';
+$lang['No photo selected, %d photos in current set'] = 'Aucune photo sélectionnée parmi les %d photos du lot';
+$lang['No photo selected, no action possible.'] = 'Aucune photo sélectionnée, aucune action possible.';
+$lang['on the %d selected photos'] = 'sur les %d photos sélectionnées';
+$lang['Orphan tags deleted'] = 'Mots clés orphelins supprimés';
+$lang['Refresh photo set'] = 'Rafraîchir le lot de photos';
+$lang['Remove all filters'] = 'Supprimer tous les filtres';
+$lang['remove author'] = 'supprimer l\'auteur';
+$lang['remove creation date'] = 'supprimer la date de création';
+$lang['Remove from caddie'] = 'Retirer du panier';
+$lang['remove this filter'] = 'supprimer ce filtre';
+$lang['remove title'] = 'supprimer le titre';
+$lang['Selection'] = 'Sélection';
+$lang['Set author'] = 'Définir l\'auteur';
+$lang['Set creation date'] = 'Définir la date de création';
+$lang['Set title'] = 'Définir le titre';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Le poids du fichier transféré dépasse la valeur de MAX_FILE_SIZE définie dans le formulaire HTML';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Le poids du fichier transféré dépasse la valeur de upload_max_filesize définie dans votre fichier php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Le fichier n\'a été que partiellement transféré';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Le poids total des fichiers transférés dépasse la valeur de post_max_size dans votre fichier php.ini: %sB';
+$lang['The whole page'] = 'Toute la page';
+$lang['The whole set'] = 'Tout le lot';
+$lang['Type here the author name'] = 'Entrez ici le nom de l\'auteur';
+$lang['Type here the title'] = 'Entrez ici le titre';
+$lang['Unknown upload error'] = 'Erreur inconnue survenue lors du transfert';
+$lang['Week starts on'] = 'La semaine commence le';
+$lang['You have %d orphan tags: %s.'] = 'Vous avez %d mots clés orphelins: %s.';
+$lang['Themes which need upgrade'] = 'Thèmes à mettre à jour';
+$lang['Languages which need upgrade'] = 'Langues à mettre à jour';
+$lang['All themes are up to date.'] = 'Tous les thèmes sont à jour.';
+$lang['All plugins are up to date.'] = 'Tous les greffons sont à jour.';
+$lang['All languages are up to date.'] = 'Toutes les langues sont à jour.';
+$lang['Visit theme site'] = 'Visitez le site du thème';
+$lang['Visit language site'] = 'Visitez le site de la langue';
+$lang['New Version'] = 'Nouvelle version';
+$lang['Obsolete Plugins'] = 'Greffons périmés';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATTENTION! Ce greffon n\'a pas l\'air d\'être compatible avec votre version de Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Voulez-vous l\'activer quand même?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'CE GREFFON FAIT DÉSORMAIS PARTIE DU CŒUR DE PIWIGO! SUPPRIMEZ-LE.';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERREUR: CE GREFFON EST MANQUANT MAIS TOUJOURS INSTALLÉ! DÉSINSTALLEZ-LE.';
+$lang['display'] = 'Afficher';
+$lang['Restore'] = "Restaurer";
+$lang['Restore default configuration. You will lose your plugin settings!'] = "Restaurer la configuration par défaut? Vous perdrez vos réglages personnels !";
+$lang['Show menubar'] = "Afficher le menu";
+$lang['Learn more'] = 'En savoir plus';
+$lang['Rate'] = 'Note';
+$lang['Average rate'] = 'Note moyenne';
+$lang['Activate icon "new" next to albums and pictures'] = 'Afficher l\'icône "nouveau" à côté des albums et des photos';
+$lang['Add a criteria'] = 'Ajouter un critère';
+$lang['Deactivate all'] = 'Désactiver tout';
+$lang['Default photos order'] = 'Ordre par défaut des photos';
+$lang['new'] = 'nouveau';
+$lang['No results'] = 'Pas de résultat';
+$lang['Searching...'] = 'Recherche...';
+$lang['Type in a search term'] = 'Entrez un terme de recherche';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Vous ne pouvez définir l\'ordre par défaut des photos car vous avez un paramètre personnalisé dans votre configuration locale.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Vous avez spécifié <i>$conf[\'order_by\']</i> dans votre fichier de configuration, ce paramètre est obsolète, veuillez le supprimer ou le renommer en <i>$conf[\'order_by_custom\']</i> !';
+$lang['Thumbnails generation in progress...'] = 'Génération des miniatures en cours...';
+$lang['Photos generation in progress...'] = 'Génération des photos en cours...';
+$lang['%s photos have been regenerated'] = '%s photos ont été régénérées';
+$lang['%s photos can not be regenerated'] = '%s photos ne peuvent pas être régénérées';
+$lang['Updates'] = 'Mises à jour';
+$lang['Update in progress... Please wait.'] = 'Mise à jour en cours... Veuillez patienter.';
+$lang['Ignore this update'] = 'Ignorer cette mise à jour';
+$lang['Reset ignored updates'] = 'Réinitialiser les mises à jour ignorées';
+$lang['Update All'] = 'Tout mettre à jour';
+$lang['ERROR'] = 'ERREUR';
+$lang['Update Complete'] = 'Mise à jour effectuée';
+$lang['Piwigo Update'] = 'Mise à jour de Piwigo';
+$lang['Extensions Update'] = 'Mise à jour des extensions';
+$lang['All extensions are up to date.'] = 'Toutes les extensions sont à jour.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Les greffons suivants ne seront peut-être pas compatibles avec la nouvelle version de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Les thèmes suivants ne seront peut-être pas compatibles avec la nouvelle version de Piwigo:';
+$lang['I decide to update anyway'] = 'Je décide de migrer quand même';
+$lang['Update to Piwigo %s'] = 'Mettre à jour vers Piwigo %s';
+$lang['Two updates are available'] = 'Deux mises à jour sont disponibles';
+$lang['This is a minor update, with only bug corrections.'] = 'Ceci est une mise à jour mineure, avec uniquement des corrections de bugs.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Ceci est une mise à jour majeure, qui contient <a href="%s">un tas de nouveautés</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Certains thèmes ou greffons ne sont peut-être pas encore disponibles.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Vous pouvez mettre à jour vers Piwigo %s directement, sans passer par Piwigo %s (recommandé).';
+$lang['Save Template Directory'] = 'Sauvegarder le dossier template';
+$lang['Dump Database'] = 'Sauvegarder la base de données';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inclure les données de l\'historique (Attention: risque de dépassement de la limite mémoire du serveur)';
+$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['Ignore All'] = 'Tout ignorer';
+$lang['Crop'] = 'Retailler';
+$lang['Width'] = 'Largeur';
+$lang['Height'] = 'Hauteur';
+$lang['Follow Orientation'] = 'Respecter l\'orientation';
+$lang['Graphics Library'] = 'Bibliothèque graphique';
+$lang['... or '] = '... ou bien ';
+$lang['Create'] = 'Créer';
+$lang['Start Upload'] = 'Démarrer le transfert';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Vous utilisez le formulaire Flash. Des problèmes ? Essayez le <a href="%s">formulaire HTML</a> à la place.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Vous utilisez le formulaire HTML. Essayez le <a href="%s">formulaire Flash</a> à la place.';
+$lang['Maximum file size: %sB.'] = 'Poids maximum des fichiers : %sB.';
+$lang['Allowed file types: %s.'] = 'Types de fichiers autorisés : %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Résolution maximum approximative : %dM pixels (soit %dx%d pixels).';
+$lang['Manage Permissions'] = 'Gérer les permissions';
+$lang['Photo %s of %s'] = 'Photo %s sur %s';
+$lang['show details'] = 'montrer les détails';
+$lang['hide details'] = 'cacher les détails';
+$lang['Merge tags'] = 'Fusionner les mots clés';
+$lang['Select the destination tag'] = 'Sélectionnez le mot clé de destination';
+$lang['(this tag will be deleted)'] = '(ce mot clé sera supprimé)';
+$lang['Confirm merge'] = 'Confirmez la fusion';
+$lang['Merge selected tags'] = 'Fusionner les mots clés sélectionnés';
+$lang['No destination tag selected'] = 'Vous n\'avez pas sélectionné de mot clé de destination';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Les mots clés <em>%s</em> ont été fusionnés dans le mot clé <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Sélectionnez au moins deux mots clés pour la fusion';
+$lang['Select an album'] = 'Selectionnez un album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Par défaut, Piwigo créera la nouvelle taille web à partir de la HD (haute définition).';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Si la HD n\'est pas disponible et que la version actuelle de la taille web est plus grande que les dimensions ci-dessous, alors Piwigo la considérera comme HD et créera la nouvelle taille web à partir de celle-ci.';
+$lang['An error has occured during upgrade.'] = 'Une erreur est survenue pendant la mise à jour.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Impossible d\'extraire les fichiers. Veuillez vérifier les permissions des fichiers de votre installation.<br><a href="%s">Cliquez ici pour voir le rapport d\'erreur</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne peut pas récupérer le fichier de mise à jour depuis le serveur';
+$lang['Send connection settings by email'] = 'Envoyer les identifiants par email';
+$lang['Activate comments'] = 'Activer les commentaires';
+$lang['Default comments order'] = 'Ordre par défaut des commentaires';
+$lang['%s has been successfully updated.'] = '%s a été mis à jour avec succès.';
+$lang['Add tags'] = 'Ajouter les mots clés';
+$lang['Add to caddie'] = 'Ajouter au panier';
+$lang['Last import'] = 'Dernière importation';
+$lang['Photo name'] = 'Nom de la photo';
+$lang['Predefined filter'] = 'Filtre prédéfini';
+$lang['The original image quality must be a number between %d and %d'] = 'La qualité d\'image pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'La hauteur maximum pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'La largeur maximum pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['With no album'] = 'Sans album';
+$lang['With no tag'] = 'Sans mot clé';
+$lang['With no virtual album'] = 'Sans album virtuel';
+$lang['Zoom'] = 'Zoom';
+$lang['Resize after upload'] = 'Redimensionner après transfert';
+$lang['Original Size'] = 'Taille originale';
+$lang['A locked gallery is only visible to administrators'] = 'Une galerie verrouillée n\'est visible que par les administrateurs';
+$lang['Unlock gallery'] = 'Déverouiller la galerie';
+$lang['Gallery unlocked'] = 'Galerie déverouillée';
+$lang['Notify administrators when a comment is'] = 'Notifier les administrateurs lorsqu\'un commentaire est';
+$lang['modified'] = 'modifié';
+$lang['pending validation'] = 'en attente de validation';
+$lang['Save visits in history for'] = 'Sauvegarder les visites dans l\'historique ';
+$lang['simple visitors'] = 'simple visiteurs';
+$lang['registered users'] = 'utilisateurs enregistrés';
+$lang['administrators'] = 'administrateurs';
+$lang['This album contains %d photos, added on %s.'] = 'Cet album contient %d photos, ajoutées le %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Cet album contient %d photos, ajoutées entre le %s et le %s.';
+$lang['This album contains no photo.'] = 'Cet album ne contient pas de photo.';
+$lang['Not cropped correctly?'] = 'La photo n\'est pas recadrée correctement ?';
+$lang['Center of interest'] = 'Centre d\'interêt';
+$lang['Move to album'] = 'Déplacer vers l\'album';
+$lang['You can activate only one mobile theme.'] = 'Vous ne pouvez activer qu\'un seul thème mobile.';
+$lang['Automatic sort order'] = 'Ordre de tri automatique';
+$lang['apply automatic sort order'] = 'appliquer un ordre de tri automatique';
+$lang['Save manual order'] = 'Sauvegarder l\'ordre manuel';
+$lang['cancel manual order'] = 'annuler l\'ordre manuel';
+$lang['Cancel'] = 'Annuler';
+$lang['List'] = 'Liste';
+$lang['Web Form'] = 'Formulaire web';
+$lang['Applications'] = 'Applications';
+$lang['Available versions for'] = 'Versions disponibles pour';
+$lang['Available on'] = 'Disponible sur';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo pour iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'L\'application <em>Piwigo pour iOS</em> vous permet de connecter votre iPhone, iPad ou iPod Touch à votre galerie Piwigo pour y créer des albums et envoyer plusieurs photos à la fois.';
+$lang['Piwigo for Android'] = 'Piwigo pour Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'L\'application <em>Piwigo pour Android</em> vous permet de connecter votre smartphone ou votre tablette Android à votre galerie Piwigo pour y créer des albums et envoyer plusieurs photos à la fois.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin de publication Piwigo pour Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom est un logiciel de photographie conçu pour gérer d\'importantes collections de photos numériques et les post-traiter.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Le plugin de publication Piwigo pour Lightroom vous permet d\'exporter et synchroniser vos photos de Lightroom vers votre galerie Piwigo.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Greffon de publication Piwigo pour Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell est un gestionnaire de photos opensource pour Linux. Il a été sélectionné comme gestionnaire par défaut sur Ubuntu et Fedora.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Sur votre Linux, installez simplement Shotwell avec votre gestionnaire de paquet et activez l\'option de publication Piwigo.';
+$lang['Piwigo publish plugin for digiKam'] = 'Greffon de publication Piwigo pour digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam est un logiciel libre de gestion avancée de photos numériques pour Linux, Windows et MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam est conçu pour les photographes qui souhaitent visualiser, gérer, éditer, améliorer, organiser, tagger et partager leurs photos.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Pour exporter vos photos de digiKam vers Piwigo, installez simplement digiKam et les kipi-plugins.';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin d\'export Piwigo export pour iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto est le gestionnaire de photos disponible par défaut sur MacOSX. Le plugin d\'export Piwigo se connecter à votre galerie Piwigo et vous permet de créer des albums et d\'y ajouter vos photos.';
+$lang['Piwigo export plugin for Aperture'] = 'Greffon d\'exportation Piwigo pour Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture est un outil puissant pour post-traiter vos photos et gérer votre photothèque sur Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture est conçu pour les photographes professionnels avec la simplicité d\'iPhoto.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Le greffon d\'exportation Piwigo vous permet de créer des albums et d\'y ajouter vos photos.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery Android) est un client libre (GPL v3) pour Piwigo sur Android.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Ses fonctionnalités incluent la navigation sur la galerie, la création d\'albums et l\'ajout de photos.';
+$lang['Generate multiple size images'] = 'Générer les tailles multiples des photos';
+$lang['Delete multiple size images'] = 'Supprimer les tailles multiples des photos';
+$lang['any visitor can see this album'] = 'n\'importe quel visiteur peut voir cet album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'les visiteurs doivent se connecter et avoir les permissions nécessaires pour voir cet album';
+$lang['Groups and users'] = 'Groupes et utilisateurs';
+$lang['Permission granted for groups'] = 'Permission accordée pour les groupes';
+$lang['Select groups...'] = 'Sélectionnez les groupes...';
+$lang['There is no group in this gallery.'] = 'Il n\'y a pas de groupe dans cette galerie.';
+$lang['Permission granted for users'] = 'Permission accordée pour les utilisateurs';
+$lang['Select users...'] = 'Sélectionnez les utilisateurs...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u utilisateurs ont automatiquement la permission car ils appartiennent à un groupe autorisé.';
+$lang['include photos with lower privacy level'] = 'inclure les photos d\'un niveau de confidentialité inférieur';
+$lang['custom'] = 'Personnalisé';
+$lang['No group is permitted to see this private album'] = 'Aucun groupe n\'est autorisé à voir cet album privé';
+$lang['Permission management'] = 'Gestion des permissions';
+$lang['Photo sizes with crop'] = 'Tailles de photo avec retaillage';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Le centre d\'intérêt est la zone la plus représentative de la photo.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Pour les tailles de photo avec retaillage, comme la taille "Carré", Piwigo essaiera d\'inclure au mieux ce centre d\'intérêt.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Par défaut, le centre d\'intérêt est placé au milieu de la photo.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Sélectionnez une zone avec votre souris pour définir un nouveau centre d\'intérêt.';
+$lang['X Position'] = 'Position X';
+$lang['Y Position'] = 'Position Y';
+$lang['X Repeat'] = 'Répétition X';
+$lang['Opacity'] = 'Opacité';
+$lang['top left corner'] = 'coin supérieur gauche';
+$lang['top right corner'] = 'coin supérieur droit';
+$lang['middle'] = 'milieu';
+$lang['bottom left corner'] = 'coin inférieur gauche';
+$lang['bottom right corner'] = 'coin inférieur droit';
+$lang['Select a file'] = 'Sélectionnez un fichier';
+$lang['add a new watermark'] = 'Ajouter un nouveau filigrane';
+$lang['Apply watermark if width is bigger than'] = 'Appliquer le filigrane si la largeur est supérieure à';
+$lang['Apply watermark if height is bigger than'] = 'Appliquer le filigrane si la hauteur est supérieure à';
+$lang['Multiple Size'] = 'Tailles multiples';
+
+?>
Index: tags/2.4.0RC3/language/fr_CA/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/common.lang.php	(revision 14585)
@@ -0,0 +1,410 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Français [QC]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=420
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Français';
+$lang_info['country'] = 'Québec';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'fr';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Ko';
+$lang['%d album updated'] = '%d catégorie mise à jour';
+$lang['%d albums updated'] = '%d catégories mises à jour';
+$lang['%d comment to validate'] = '%d commentaire utilisateur à valider';
+$lang['%d comments to validate'] = '%d commentaires utilisateurs à valider';
+$lang['%d new comment'] = '%d nouveau commentaire utilisateur';
+$lang['%d new comments'] = '%d nouveaux commentaires utilisateurs';
+$lang['%d comment'] = '%d commentaire';
+$lang['%d comments'] = '%d commentaires';
+$lang['%d hit'] = 'vue %d fois';
+$lang['%d hits'] = 'vue %d fois';
+$lang['%d new photo'] = '%d nouvelle image';
+$lang['%d new photos'] = '%d nouvelles images';
+$lang['%d new user'] = '%d nouvel utilisateur';
+$lang['%d new users'] = '%d nouveaux utilisateurs';
+$lang['About'] = 'À propos';
+$lang['All tags'] = 'Tous les mots clés';
+$lang['Any tag'] = 'N\'importe quel mot clé';
+$lang['At least one listed rule must be satisfied.'] = 'Au moins un des critères doit être satisfait.';
+$lang['Author'] = 'Auteur';
+$lang['Albums'] = 'Catégories';
+$lang['Album'] = 'Catégorie';
+$lang['Close this window'] = 'Fermer cette fenêtre';
+$lang['Complete RSS feed (photos, comments)'] = 'Flux RSS complet (images, commentaires)';
+$lang['Confirm Password'] = 'Confirmer le mot de passe';
+$lang['Connection settings'] = 'Paramètres de connexion';
+$lang['Login'] = 'Connexion';
+$lang['Contact webmaster'] = 'Contacter le webmestre';
+$lang['Create a new account'] = 'Créer un nouveau compte';
+$lang['Created on'] = 'Créée le';
+$lang['Creation date'] = 'Date de création';
+$lang['Current password is wrong'] = 'Erreur sur le mot de passe actuel';
+$lang['Dimensions'] = 'Dimensions';
+$lang['Display'] = 'Affichage';
+$lang['Each listed rule must be satisfied.'] = 'Chaque critère doit être satisfait';
+$lang['Email address'] = 'Adresse de courriel';
+$lang['Enter your personnal informations'] = 'Entrer vos informations personnelles';
+$lang['Error sending email'] = 'Erreur à l\'envoi du courriel';
+$lang['File name'] = 'Nom du fichier';
+$lang['File'] = 'Fichier';
+$lang['Filesize'] = 'Poids';
+$lang['Filter and display'] = 'Filtrer et afficher';
+$lang['Filter'] = 'Filtre';
+$lang['Forgot your password?'] = 'Mot de passe oublié ?';
+$lang['Go through the gallery as a visitor'] = 'Parcourir la galerie en tant que visiteur';
+$lang['Help'] = 'Aide';
+$lang['Identification'] = 'Identification';
+$lang['Photos only RSS feed'] = 'Flux RSS des images uniquement';
+$lang['Keyword'] = 'Mot-clef';
+$lang['Links'] = 'Liens';
+$lang['N/A'] = 'non disponible';
+$lang['New on %s'] = 'Nouveau le %s';
+$lang['Notification'] = 'Notifications RSS';
+$lang['Number of items'] = 'Nombre d\'élément';
+$lang['Original dimensions'] = 'Dimensions d\'origine';
+$lang['Password forgotten'] = 'Mot de passe oublié';
+$lang['Password'] = 'Mot de passe';
+$lang['Post date'] = 'Date d\'ajout';
+$lang['Posted on'] = 'Ajoutée le';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Connexion rapide';
+$lang['RSS feed'] = 'flux RSS';
+$lang['Register'] = 'S\'enregistrer';
+$lang['Registration'] = 'Enregistrement';
+$lang['Related tags'] = 'Mots clés liés';
+$lang['Reset'] = 'Annuler';
+$lang['Retrieve password'] = 'Récupérer un mot de passe';
+$lang['Search rules'] = 'Critères de recherche';
+$lang['Search tags'] = 'Rechercher les mots clés';
+$lang['Search'] = 'Rechercher';
+$lang['display available tags'] = 'Voir les mots clés disponibles';
+$lang['Since'] = 'Depuis';
+$lang['Sort by'] = 'Trier selon';
+$lang['Sort order'] = 'Ordre de tri';
+$lang['Tag'] = 'Mot clé';
+$lang['Tags'] = 'Mots clés';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Le flux RSS notifie les événements de la galerie : nouvelles images, catégories mises à jour, nouveaux commentaires utilisateurs. À utiliser avec un lecteur de flux RSS.';
+$lang['Unknown feed identifier'] = 'Identifiant de flux inconnu';
+$lang['User comments'] = 'Commentaires utilisateur';
+$lang['Username'] = 'Nom d\'utilisateur';
+$lang['Visits'] = 'Visites';
+$lang['Webmaster'] = 'Webmestre';
+$lang['Week %d'] = 'Semaine %d';
+$lang['About Piwigo'] = 'À propos de Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Vous n\'êtes pas autorisé à accéder à la page demandée';
+$lang['add this photo to your favorites'] = 'ajouter cette image à vos favoris';
+$lang['Administration'] = 'Administration';
+$lang['all'] = 'tout';
+$lang['ascending'] = 'croissant';
+$lang['author(s) : %s'] = 'auteur(s) : %s';
+$lang['Expand all albums'] = 'Développer toutes les catégories';
+$lang['posted after %s (%s)'] = 'mis en ligne après le %s (%s)';
+$lang['posted before %s (%s)'] = 'mis en ligne avant le %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'mis en ligne entre le %s (%s) et le %s (%s)';
+$lang['posted on %s'] = 'mis en ligne le %s';
+$lang['Best rated'] = 'Mieux notées';
+$lang['display best rated photos'] = 'afficher les images les mieux notées';
+$lang['Calendar'] = 'Calendrier';
+$lang['All'] = 'Tout';
+$lang['display each day with photos, month per month'] = 'affichage année par année, mois par mois, jour par jour';
+$lang['View'] = 'Vue';
+$lang['chronology_monthly_calendar'] = 'Calendrier mensuel';
+$lang['chronology_monthly_list'] = 'Liste mensuelle';
+$lang['chronology_weekly_list'] = 'Liste hebdomadaire';
+$lang['Click here if your browser does not automatically forward you'] = 'Cliquez ici si votre navigateur ne vous redirige pas.';
+$lang['comment date'] = 'date du commentaire';
+$lang['Comment'] = 'Commentaire';
+$lang['Your comment has been registered'] = 'Votre commentaire a été enregistré';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Système anti-abus : merci de patienter avant d\'ajouter un nouveau commentaire';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Votre commentaire n\'a pas été enregistré parce qu\'il ne satisfait aux règles de validation';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un administrateur doit valider votre commentaire pour qu\'il devienne visible.';
+$lang['This login is already used by another user'] = 'Ce nom d\'utilisateur est déjà pris';
+$lang['Comments'] = 'Commentaires';
+$lang['Add a comment'] = 'Ajouter un commentaire';
+$lang['created after %s (%s)'] = 'créée après le %s (%s)';
+$lang['created before %s (%s)'] = 'créée avant le %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'créée entre le %s (%s) et le %s (%s)';
+$lang['created on %s'] = 'créée le %s';
+$lang['Customize'] = 'Personnaliser';
+$lang['Your Gallery Customization'] = 'Personnalisation de votre affichage ';
+$lang['day'][0] = 'Dimanche';
+$lang['day'][1] = 'Lundi';
+$lang['day'][2] = 'Mardi';
+$lang['day'][3] = 'Mercredi';
+$lang['day'][4] = 'Jeudi';
+$lang['day'][5] = 'Vendredi';
+$lang['day'][6] = 'Samedi';
+$lang['Default'] = 'Par défaut';
+$lang['delete this photo from your favorites'] = 'supprimer cette image de vos favoris';
+$lang['Delete'] = 'Supprimer';
+$lang['descending'] = 'décroissant';
+$lang['Download'] = 'Télécharger';
+$lang['Download this file'] = 'télécharger ce fichier';
+$lang['edit'] = 'éditer';
+$lang['wrong date'] = 'date erronée';
+$lang['excluded'] = 'exclus';
+$lang['Your favorites'] = 'Mes favorites';
+$lang['display your favorites photos'] = 'afficher mes images favorites';
+$lang['Favorites'] = 'Favoris';
+$lang['First'] = 'Première';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'La galerie est verrouillée pour cause de maintenance. Merci de revenir plus tard.';
+$lang['Page generated in'] = 'Page fabriquée en';
+$lang['guest'] = 'visiteur';
+$lang['Hello'] = 'Bonjour';
+$lang['available for administrators only'] = 'disponible uniquement pour les administrateurs';
+$lang['display this album'] = 'montre les images à la racine de cette catégorie';
+$lang['display last user comments'] = 'Voir les derniers commentaires utilisateurs';
+$lang['customize the appareance of the gallery'] = 'personnaliser l\'apparence de la galerie';
+$lang['search'] = 'recherche';
+$lang['Home'] = 'Accueil';
+$lang['in this album'] = 'dans cette catégorie';
+$lang['in %d sub-album'] = 'dans %d sous-catégorie';
+$lang['in %d sub-albums'] = 'dans %d sous-catégories';
+$lang['included'] = 'inclus';
+$lang['Invalid password!'] = 'Mot de passe invalide !';
+$lang['Language'] = 'Langue';
+$lang['last %d days'] = '%d derniers jours';
+$lang['Last'] = 'Dernière';
+$lang['Logout'] = 'Déconnexion';
+$lang['obligatory'] = 'obligatoire';
+$lang['Maximum photo height'] = 'Hauteur maximum des images';
+$lang['Maximum height must be a number superior to 50'] = 'La hauteur maximum des images doit être supérieure à 50';
+$lang['Maximum photo width'] = 'Largeur maximum des images';
+$lang['Maximum width must be a number superior to 50'] = 'La largeur des images doit être supérieure à 50';
+$lang['display a calendar by creation date'] = 'afficher un calendrier par date de création';
+$lang['display all photos in all sub-albums'] = 'afficher à plat les éléments des catégories et des sous-catégories';
+$lang['return to normal view mode'] = 'retourner à la vue normale';
+$lang['display a calendar by posted date'] = 'afficher un calendrier par date d\'ajout';
+$lang['month'][10] = 'Octobre';
+$lang['month'][11] = 'Novembre';
+$lang['month'][12] = 'Décembre';
+$lang['month'][1] = 'Janvier';
+$lang['month'][2] = 'Février';
+$lang['month'][3] = 'Mars';
+$lang['month'][4] = 'Avril';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Juin';
+$lang['month'][7] = 'Juillet';
+$lang['month'][8] = 'Août';
+$lang['month'][9] = 'Septembre';
+$lang['Most visited'] = 'Plus vues';
+$lang['display most visited photos'] = 'afficher les images les plus vues';
+$lang['The number of photos per page must be a not null scalar'] = 'Le nombre d\'images par page doit être un entier non nul';
+$lang['Number of photos per page'] = 'Nombre de miniatures par page';
+$lang['Unknown identifier'] = 'Identifiants inconnus';
+$lang['New password'] = 'Nouveau mot de passe';
+$lang['Rate this photo'] = 'Votez pour cette image';
+$lang['Next'] = 'Suivante';
+$lang['Home'] = 'Accueil';
+$lang['no rate'] = 'pas de note';
+$lang['Photos posted within the last %d day.'] = 'N\'afficher que les éléments récents de moins de %d jour.';
+$lang['Photos posted within the last %d days.'] = 'N\'afficher que les éléments récents de moins de %d jours.';
+$lang['password updated'] = 'mot de passe mis à jour';
+$lang['Recent period must be a positive integer value'] = 'La période de nouveautés doit être un entier positif';
+$lang['photo'] = 'image';
+$lang['Click on the photo to see it in high definition'] = 'Cliquer sur l\'image pour la visualiser en haute définition';
+$lang['Show file metadata'] = 'Montrer les méta-données du fichier';
+$lang['Powered by'] = 'Propulsé par';
+$lang['Preferences'] = 'Préférences';
+$lang['Previous'] = 'Précédente';
+$lang['Random photos'] = 'Images au hasard';
+$lang['display a set of random photos'] = 'afficher un ensemble d\'images prises au hasard';
+$lang['Recent albums'] = 'Catégories récentes';
+$lang['display recently updated albums'] = 'afficher les catégories récemment mises à jour ou créées';
+$lang['Recent period'] = 'Période récente';
+$lang['Recent photos'] = 'Images récentes';
+$lang['display most recent photos'] = 'afficher les images les plus récentes';
+$lang['Redirection...'] = 'Redirection...';
+$lang['Please, enter a login'] = 'S\'il vous plaît, entrez un nom d\'utilisateur';
+$lang['login mustn\'t end with a space character'] = 'le nom d\'utilisateur ne doit pas se terminer par un espace';
+$lang['login mustn\'t start with a space character'] = 'le nom d\'utilisateur ne doit pas commencer par un espace';
+$lang['this login is already used'] = 'ce nom d\'utilisateur est déjà pris';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'adresse de courriel doit être de la forme xxx@yyy.eee (exemple : luc@altern.org)';
+$lang['please enter your password again'] = 'Merci d\'entrer à nouveau votre mot de passe';
+$lang['Auto login'] = 'Connexion auto';
+$lang['remove this tag from the list'] = 'retirer ce mot clé de la liste';
+$lang['representative'] = 'représentante';
+$lang['Search for Author'] = 'Rechercher un auteur';
+$lang['Search in albums'] = 'Rechercher dans les catégories';
+$lang['Search by date'] = 'Recherche par date';
+$lang['Date'] = 'Date';
+$lang['End-Date'] = 'Date de fin';
+$lang['Kind of date'] = 'Type de date';
+$lang['Search for words'] = 'Recherche de mots';
+$lang['Search for all terms'] = 'Rechercher tous les mots';
+$lang['Search for any term'] = 'Rechercher un des mots';
+$lang['Empty query. No criteria has been entered.'] = 'Requête vide. Aucun critère saisi.';
+$lang['Search results'] = 'Résultats de recherche';
+$lang['Search in sub-albums'] = 'Rechercher dans les sous-catégories';
+$lang['Search'] = 'Recherche';
+$lang['searched words : %s'] = 'mots recherchés : %s';
+$lang['Contact'] = 'Contacter';
+$lang['set as album representative'] = 'Choisir comme représentante de cette catégorie';
+$lang['Show number of comments'] = 'Montrer le nombre de commentaires';
+$lang['Show number of hits'] = 'Montrer le nombre de visualisations';
+$lang['slideshow'] = 'diaporama';
+$lang['stop the slideshow'] = 'arrêter le diaporama';
+$lang['Specials'] = 'Spéciales';
+$lang['SQL queries in'] = 'requêtes SQL en';
+$lang['display only recently posted photos'] = 'n\'afficher que les éléments publiés récemment';
+$lang['return to the display of all photos'] = 'retourner à l\'affichage de tous les éléments';
+$lang['the beginning'] = 'le début';
+$lang['Interface theme'] = 'Thème de l\'interface';
+$lang['Thumbnails'] = 'Miniatures';
+$lang['Menu'] = 'Menu';
+$lang['A comment on your site'] = 'Un commentaire sur le site';
+$lang['today'] = 'aujourd\'hui';
+$lang['Update your rating'] = 'Mettre à jour votre note';
+$lang['Author'] = 'Auteur';
+$lang['the username must be given'] = 'le nom d\'utilisateur doit être indiqué';
+$lang['useful when password forgotten'] = 'utile en cas d\'oubli de mot de passe';
+$lang['Quick search'] = 'Recherche rapide';
+$lang['Connected user: %s'] = 'Utilisateur connecté : %s';
+$lang['IP: %s'] = 'IP : %s';
+$lang['Browser: %s'] = 'Navigateur : %s';
+$lang['Author: %s'] = 'Auteur : %s';
+$lang['Comment: %s'] = 'Commentaire : %s';
+$lang['Comment by %s'] = 'Commentaire par %s';
+$lang['User: %s'] = 'Utilisateur: %s';
+$lang['Email: %s'] = 'Courriel : %s';
+$lang['Admin: %s'] = 'Administration : %s';
+$lang['Registration of %s'] = 'Enregistrement de %s';
+$lang['Album: %s'] = 'Catégorie : %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Statut de l\'utilisateur "guest" non conforme, utilisation du statut par défaut. Veuillez prévenir le webmestre.';
+$lang['this email address is already in use'] = 'un autre utilisateur utilise déjà cette adresse de courriel';
+$lang['Album results for'] = 'Résultats des catégories pour';
+$lang['Tag results for'] = 'Résultats des mots clés pour';
+$lang['from %s to %s'] = 'du %s au %s';
+$lang['Play of slideshow'] = 'Lecture du diaporama';
+$lang['Pause of slideshow'] = 'Pause du diaporama';
+$lang['Repeat the slideshow'] = 'Répéter le diaporama';
+$lang['Not repeat the slideshow'] = 'Ne pas répéter le diaporama';
+$lang['Reduce diaporama speed'] = 'Ralentir la vitesse du diaporama';
+$lang['Accelerate diaporama speed'] = 'Accélerer la vitesse du diaporama';
+$lang['Submit'] = 'Valider';
+$lang['Yes'] = 'Oui';
+$lang['No'] = 'Non';
+$lang['%d photo']='%d photo';
+$lang['%d photos']='%d photos';
+$lang['%d photo is also linked to current tags'] = '%d image est également liée aux mots clés courants';
+$lang['%d photos are also linked to current tags'] = '%d photos sont également liées aux mots clés courants';
+$lang['display photos linked to this tag'] = 'Voir les images liées uniquement à ce mot clé';
+$lang['photos posted during the last %d days'] = 'images ajoutées au cours des %d derniers jours';
+$lang['Piwigo Help'] = 'Aide de Piwigo';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'regrouper par lettres';
+$lang['letters'] = 'lettres';
+$lang['show tag cloud'] = 'montrer le nuage de mots clés';
+$lang['cloud'] = 'nuage';
+$lang['Reset to default values'] = 'Rétablir les valeurs par défaut';
+$lang['delete all photos from your favorites'] = 'supprimer toutes les images de vos favoris';
+$lang['Sent by'] = 'Envoyé par';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Les cookies sont bloqués ou non supportés par votre navigateur web. Vous devez activer les cookies pour vous connecter.';
+$lang['Edit a comment'] = "Éditer un commentaire";
+$lang['Are you sure?'] = "Êtes-vous sûr ?";
+$lang['(!) This comment requires validation'] = '(!) Ce commentaire doit être validé';
+$lang['Welcome'] = 'Bienvenue';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bienvenue sur votre galerie photo Piwigo !';
+$lang['... or browse your empty gallery'] = '... ou naviguez sur votre galerie vide';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ou désactivez ce message, je me débrouillerai par moi-même';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Bonjour %s, votre galerie photo Piwigo est vide !';
+$lang['I want to add photos'] = 'Je veux ajouter des photos';
+$lang['Manage this user comment: %s'] = 'Gérer ce commentaire : %s';
+$lang['Email address is missing. Please specify an email address.'] = "L'adresse de courriel manque. Veuillez spécifier une adresse de courriel.";
+$lang['This author modified following comment:'] = 'Cet auteur a modifié le commentaire suivant :';
+$lang['This author removed the comment with id %d'] = 'Cet auteur a supprimé le commentaire portant l\'identifiant %d';
+$lang['html tags are not allowed in login'] = 'les balises html ne sont pas autorisées à l\'identification';
+$lang['%d rates'] = '%d notes';
+$lang['Rating score'] = 'Bilan';
+$lang['Invalid username or email'] = 'Nom d\'utilisateur ou adressede courriel  invalide';
+$lang['Password reset is not allowed for this user'] = 'Le renouvellement du mot de passe n\'est pas permis pour cet utilisateur';
+$lang['User "%s" has no email address, password reset is not possible'] = 'L\'utilisateur "%s" n\'a pas d\'adresse de courriel, le renouvellement du mot de passe est impossible';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Quelqu\'un a demandé le renouvellement de votre mot de passe pour l\'utilisateur suivant :';
+$lang['Username "%s" on gallery %s'] = 'Utilisateur "%s" sur la galerie %s';
+$lang['To reset your password, visit the following address:'] = 'Pour renouveler votre mot de passe, cliquez sur le lien suivant :';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'S\'il s\'agit d\'une erreur, ignorez ce message et la demande ne sera pas prise en compte.';
+$lang['Password Reset'] = 'Renouvellement de votre mot de passe';
+$lang['Check your email for the confirmation link'] = 'Vérifiez vos courriels pour trouver le lien de confirmation';
+$lang['Invalid key'] = 'Clef invalide';
+$lang['The passwords do not match'] = 'Les mots de passe ne correspondent pas';
+$lang['Your password has been reset'] = 'Votre mot de passe a été réinitialisé';
+$lang['Return to home page'] = 'Retourner sur la page d\'accueil';
+$lang['Please enter your username or email address.'] = 'Merci d\'entrer votre nom d\'utilisateur ou votre adresse courriel.';
+$lang['You will receive a link to create a new password via email.'] = 'Vous recevrez, par courriel, un lien à cliquer pour renouveler votre mot de passe.';
+$lang['Username or email'] = 'Nom d\'utilisateur ou adresse de courriel';
+$lang['Change my password'] = 'Changer mon mot de passe';
+$lang['Enter your new password below.'] = 'Entrez votre nouveau mot de passe ci-dessous.';
+$lang['EXIF Metadata'] = 'Données EXIF';
+$lang['IPTC Metadata'] = 'Données IPTC';
+$lang['Your username has been successfully changed to : %s'] = 'Votre nom d\'utilisateur a bien été changé par : %s';
+$lang['Username modification'] = 'Modification du nom d\'utilisateur';
+$lang['Hello %s,'] = 'Bonjour %s,';
+$lang['Thank you for registering at %s!'] = 'Merci pour votre inscription sur %s !';
+$lang['Here are your connection settings'] = 'Voici vos identifiants';
+$lang['Password: %s'] = 'Mot de passe : %s';
+$lang['Username: %s'] = 'Nom d\'utilisateur : %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Si vous pensez avoir reçu cet email par erreur, veuillez nous contacter %s';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Inscription réussie, vous recevrez bientôt un email avec vos identifiants. Bienvenue !';
+$lang['Send my connection settings by email'] = 'Recevoir mes identifiants par email';
+$lang['Edit'] = 'Éditer';
+$lang['Show oldest comments first'] = 'Montrer les commentaires les plus anciens en premier';
+$lang['Show latest comments first'] = 'Montrer les commentaires les plus récents en premier';
+$lang['square'] = 'Carré';
+$lang['thumb'] = 'Miniature';
+$lang['2small'] = 'XXS - minuscule';
+$lang['xsmall'] = 'XS - très petit';
+$lang['small'] = 'S - petit';
+$lang['medium'] = 'M - moyen';
+$lang['large'] = 'L - grand';
+$lang['xlarge'] = 'XL - très grand';
+$lang['xxlarge'] = 'XXL - énorme';
+$lang['Original'] = 'Original';
+$lang['Photo sizes'] = 'Tailles de photo';
+$lang['View in'] = 'Affichage';
+$lang['Mobile'] = 'Mobile';
+$lang['Desktop'] = 'Classique';
+$lang['File name, A &rarr; Z'] = 'Nom du fichier, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nom du fichier, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Titre de la photo, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Titre de la photo, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Date de création, récent &rarr; ancien';
+$lang['Date created, old &rarr; new'] = 'Date de création, ancien &rarr; récent';
+$lang['Date posted, new &rarr; old'] = 'Date d\'ajout, récent &rarr; ancien';
+$lang['Date posted, old &rarr; new'] = 'Date d\'ajout, ancien &rarr; récent';
+$lang['Rating score, high &rarr; low'] = 'Note, haute &rarr; basse';
+$lang['Rating score, low &rarr; high'] = 'Note, basse &rarr; haute';
+$lang['Visits, high &rarr; low'] = 'Nombre de visites, haut &rarr; bas';
+$lang['Visits, low &rarr; high'] = 'Nombre de visites, bas &rarr; haut';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identifiant, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identifiant, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Ordre manuel';
+?>
Index: tags/2.4.0RC3/language/fr_CA/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,147 @@
+<h2>Modifier une catégorie</h2>
+
+<h3>Informations</h3>
+
+<ul>
+
+  <li><strong>nom</strong>: renommer la catégorie (virtuellement pour 
+  une catégorie physique).</li>
+
+  <li><strong>description</strong>: un texte bref donnant une idée du contenu de la catégorie,
+  cette indication figurera en bas de la page des miniatures.</li>
+
+</ul>
+
+<h3>Déplacer</h3>
+
+<p>Si la catégorie est virtuelle, vous pouvez la déplacer. Déplacer une
+catégorie signifie changer sa catégorie parente.</p>
+
+<h3>Options</h3>
+
+<ul>
+
+  <li><strong>Type d'accès</strong>: gestion des permissions. Si vous rendez
+une catégorie privée, toutes ses catégories filles deviennent privées. Si
+vous rendez une catégorie publique, toutes ses catégories mères deviennent
+publiques.</li>
+
+  <li><strong>Verrouiller</strong>: la catégorie et toutes ses catégories
+filles deviennent temporairement inaccessibles pour maintenance.</li>
+
+  <li><strong>Commentaires</strong>: autorise les utilisateurs à commenter
+les éléments de cette catégorie.</li>
+
+  <li><strong>Autoriser l'ajout d'images</strong>: autorise les utilisateurs
+à télécharger des fichiers. Cette option n'est disponible que si la
+catégorie est physique (et non virtuelle).</li>
+
+</ul>
+
+<p>Vous pouvez aussi gérer ces options par la gestion des "Propriétés" 
+(écrans <span class="pwgScreen">Ajout</span>, <span
+class="pwgScreen">Commentaires</span>, <span
+class="pwgScreen">Verrouiller</span>, <span
+class="pwgScreen">Publique/Privée</span>, <span
+class="pwgScreen">Représentant</span> disponibles à partir d' <span
+class="pwgScreen">Administration, Catégories, Propriétés</span>).</p>
+
+<h3>Ordre de tri</h3>
+
+<p>Utiliser l'ordre de tri des images par défaut.</p>
+
+<p>Indiquer si le tri s'applique également aux sous-catégories.</p>
+
+<p>Sélectionner les critères de tri à utiliser pour cette catégorie.</p>
+<ul>
+<li><strong>Date de création</strong>: Date de prise de vue</li>
+<li><strong>Date d'ajout</strong>: Date de la synchronisation</li>
+<li><strong>Note moyenne (*)</strong>: cette moyenne peut être modifiée par la notation du visiteur</li>
+<li><strong>Plus vues (*)</strong>: La visite en cours peut changer l'ordre des plus vues</li>
+<li><strong>Nom du fichier</strong>: Nom du fichier donné dans les champs d'informations ci-dessus</li>
+<li><strong>Id</strong>: Id interne (les catégories récentes ont un "Id" plus grand que les précédentes).</li>
+
+</ul>
+<p><strong>(*)</strong>Attention: testez-vous même ces tris qui peuvent donner des résultats imprévus.</p>
+
+
+<h3>Représentant</h3>
+
+<p>Le représentant d'une catégorie est la miniature affichée sur la page principale (<span
+class="pwgScreen">category.php</span>) pour
+représenter la catégorie lorsque celle-ci ne contient
+que des sous-catégories et aucun élément direct (comme à la
+racine)</p>
+
+<p>Il existe 4 moyens différents de choisir le représentant d'une catégorie:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Page d'affichage des images</span>: un des boutons d'action permet de choisir l'élément courant comme représentant
+de la catégorie affichée. Ce bouton d'action n'est disponible que pour les
+administrateurs.</li>
+
+  <li><span class="pwgScreen">Modifier les informations d'une image</span>
+dans l'administration. Cet écran peut être atteint depuis <span
+class="pwgScreen">picture.php</span> ou <span class="pwgScreen">Gestion par
+lot</span> dans le <em>mode unitaire</em>. Voir l'aide de cet écran pour les
+détails.</li>
+
+  <li><span class="pwgScreen">Administration, Catégories, Propriétés,
+Représentant</span>. Voir l'aide de cet écran pour les détails.</li>
+
+  <li><span class="pwgScreen">Modifier une catégorie</span> (le présent
+écran).</li>
+
+</ul>
+
+<p>Le choix d'un représentant dépend du paramètre de configuration
+<code>allow_random_representative</code> (voir <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Par défaut (<code>allow_random_representative</code> à false), chaque
+catégorie contenant au moins un élément est représenté par un élément
+fixe. Une fois fixé (à la création de la catégorie), le représentant change
+uniquement lorsque l'administrateur le demande. Si le représentant ne
+convient pas, vous pouvez demander à <strong>Trouver un nouveau représentant
+au hasard</strong>.</p>
+
+<p>Si le paramètre de configuration <code>allow_random_representative</code>
+est à true, une catégorie contenant des éléments peut ne pas avoir de
+représentant fixe. Utiliser simplement le bouton <strong>Supprimer le
+représentant</strong>.</p>
+
+<p>Si la catégorie ne contient que des sous-catégories et aucun élément, elle peut cependant être représentée par n'importe quel 
+élément grâce à l'écran <span class="pwgScreen">Modifier les informations 
+d'une image</span>. La seule option disponible sur le présent écran est le bouton
+<strong>Supprimer le représentant</strong>.</p>
+
+<h3>Associer tous les éléments de la catégorie à une nouvelle catégorie</h3>
+
+<ul>
+
+<li><strong>Nom de la catégorie virtuelle</strong>: Nom de la nouvelle catégorie à créer, 
+toutes les images de la catégorie en cours seront liées à la nouvelle.</li>
+
+<li><strong>Catégorie parente</strong>: À quel endroit la nouvelle catégorie doit être placée, 
+laisser vide pour la créer sur la page d'accueil.</li>
+
+</ul>
+
+<h3>Associer tous les éléments de la catégorie à des catégories existantes</h3>
+
+<ul>
+
+<li><strong>Catégories</strong>: Choisir la catégorie de destination.</li>
+
+</ul>
+
+<h3>Envoyer un courriel d'informations aux membres d'un groupe</h3>
+
+<ul>
+
+<li><strong>Groupe</strong>: Groupe de destinataires</li>
+
+<li><strong>Contenu du courriel</strong>: Texte libre à leur envoyer.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/fr_CA/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/cat_move.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Déplacement de catégories virtuelles</h2>
+
+<p>Vous pouvez changer le parent d'une catégorie virtuelle.</p>
+
+<h3>Catégories virtuelles à déplacer</h3>
+
+<p>Sélectionnez une ou plusieurs catégories virtuelle à déplacer. 
+Si la liste est vide, c'est que vous n'en avez pas encore créé.</p>
+
+<h3>Nouvelle catégorie parente</h3>
+
+<p>Sélectionnez la nouvelle catégorie parente (virtuelle ou physique). 
+Si vous n'en sélectionnez aucune, 
+les catégories à déplacer seront remontées à la racine des catégories.
+Vous ne pouvez déplacer une catégorie dans elle-même ou ses enfants.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/cat_options.html	(revision 14585)
@@ -0,0 +1,39 @@
+<h2>Options des catégories</h2>
+
+<p>Gestion des options pour plusieurs catégories à la fois.</p>
+
+<dl>
+
+  <dt>Autorisation à l'ajout</dt>
+
+  <dd>Rendre les catégories autorisées à l'ajout par les visiteurs. Cette
+option n'est disponible que pour les catégories physiques locales.</dd>
+  
+  <dt>Commentaires utilisateurs</dt>
+
+  <dd>Autoriser les utilisateurs à ajouter des commentaires dans les catégories sélectionnées.
+Une image sera commentable si elle appartient à au moins une catégorie commentable.</dd>
+  
+  <dt>Verrouiller</dt>
+
+  <dd>Les catégories sélectionnées deviennent temporairement inactives pour
+maintenance. Lorsqu'une catégorie est verrouillée, toutes les catégories
+enfant sont verrouillées. Lorsqu'une catégorie est déverrouillée, toutes les
+catégories parentes sont déverrouillées.</dd>
+
+  <dt>Publique / Privée</dt>
+
+  <dd>Les permissions n'existent que pour les catégories privées. Une fois qu'une catégorie est privée, il vous faut
+explicitement autoriser les utilisateurs ou les groupes à y
+accéder. Lorsqu'une catégorie devient privée, toutes les catégories enfants
+deviennent privées. Lorsqu'une catégorie devient publique, toutes les
+catégories parentes deviennent publiques.</dd>
+
+  <dt>Représentant</dt>
+
+  <dd>Cette option est disponible uniquement si le paramètre de
+configuration <code>allow_random_representative</code> (voir <span
+class="filename">include/config_default.inc.php</span>) vaut
+<em>true</em>. Chaque catégorie peut-être représentée par une image prise au hasard ou par une seule miniature fixe.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_CA/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Gérer les permissions pour une catégorie</h2>
+
+<p>Cet écran n'est disponible que pour les catégories privées. Ici vous
+pourrez sélectionner les utilisateurs et les groupes autorisés pour une
+catégorie.</p>
+
+<h3>Groupes</h3>
+
+<p>Vous pouvez autoriser ou interdire l'accès des groupes à la catégorie courante. Les utilisateurs appartenant à ces groupes se verront autoriser ou interdire l'accès à la catégorie.</p>
+
+<h3>Utilisateurs</h3>
+
+<p>Vous pouvez autoriser ou interdire l'accès aux utilisateurs
+individuellement. Les utilisateurs autorisés par ailleurs grâce à leur appartenance à un groupe peuvent se voir supprimer l'accès par exception.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/configuration.html	(revision 14585)
@@ -0,0 +1,138 @@
+<h2>Configuration</h2>
+
+<p>Cet écran permet de gérer la configuration basique. En effet, seuls sont
+montrés les paramètres de configuration qui doivent suffire à la majorité
+des administrateurs. Si vous souhaitez voir la liste des nombreux (et
+avancés) paramètres, lire le fichier <span
+class="filename">include/config_default.inc.php</span></p>
+
+<p>Cet écran est divisié en plusieurs sections, regroupant les paramètres
+par thème.</p>
+
+<h3>Principale</h3>
+<ul>
+
+  <li><strong>Titre de la galerie</strong>: utilisé pour le flux RSS et
+la notification par email.</li>
+
+  <li><strong>Bannière des pages</strong>: code html affiché en haut des
+pages.</li>
+
+  <li><strong>URL de la galerie</strong>: utilisé pour le flux RSS.</li>
+
+  <li><strong>Verrouiller la galerie</strong>: Verrouiller l'ensemble de la
+galerie pour maintenance. Seul les administrateurs pourront accéder à la
+galerie.</li>
+
+  <li><strong>Notation</strong>: La notation des photos est possible.</li>
+
+  <li><strong>Notation par les visiteurs</strong>: Même les utilisateurs non enregistrés peuvent noter les images.</li>
+
+  <li><strong>Permettre l'enregistrement des utilisateurs</strong>: L'inscription est libre pour tous.</li>
+
+  <li><strong>L'adresse de courriel est obligatoire pour tous les utilisateurs</strong>: L'adresse de courriel sera vérifiée lors des inscriptions ou de la mise à jour des profils sauf si l'action est effectuée dans la partie administration.</li>
+
+  <li><strong>Notifier les administrateurs lors de l'inscription d'un utilisateur</strong>: Les administrateurs recevront un courriel à chaque inscription.</li>
+
+</ul>
+
+<h3>Historique</h3>
+
+  <p>les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> sont
+enregistrées dans la table <code>history</code>.</p>
+
+  <p>Les visites sont affichées dans l'écran <span class="pwgScreen">Administration, Spéciales, Historique</span>.</p>
+
+<ul>
+  <li><strong>Enregistrer les pages visitées par les invités</strong>: les visites des pages par les invités sont enregistrées.</li>
+
+  <li><strong>Enregistrer les pages visitées par les utilisateurs</strong>: les visites des pagespar les utilisateurs enregistrés sont enregistrées.</li>
+
+  <li><strong>Enregistrer les pages visitées par les administrateurs</strong>: les visites des pages par les administrateurs sont enregistrées.</li>
+
+</ul>
+
+<h3>Commentaires</h3>
+<ul>
+
+  <li><strong>Commentaires utilisateur pour tous</strong>: même les
+utilisateurs non enregistrés peuvent enregistrer des commentaires.</li>
+
+  <li><strong>Nombre de commentaires utilisateur par page</strong>.</li>
+
+  <li><strong>Validation</strong>: un administrateur doit valider les
+commentaires utilisateurs avant qu'ils puissent devenir visibles dans la
+partie publique. La validation des commentaires utilisateurs a lieu dans
+l'écran <span class="pwgScreen">Administration, Images,
+Commentaires</span>.</li>
+
+  <li><strong>Notifier les administrateurs quand un commentaire est enregistré</strong>:
+Envoi un courriel aux administrateurs lorsqu'un utilisateur enregistre un commentaire qui est validé.</li>
+
+  <li><strong>Notifier les administrateurs quand un commentaire requiert sa validation </strong>:
+Envoi un courriel aux administrateurs lorsqu'un utilisateur enregistre un commentaire qui demande une validation de la part des administrateurs.
+La validation des commentaires utilisateurs a lieu dans l'écran <span class="pwgScreen">Administration, Images, Commentaires</span>.</li>
+
+</ul>
+
+<h3>Ajout de photos</h3>
+<ul>
+  <li><strong>Afficher le lien d'ajout de photo tout le temps</strong>: S'il existe des catégories permettant l'ajout de photo, le lien correspondant sera affiché quelque soit la catégorie.</li>
+  <li><strong>Niveau d'accès utilisateur pour ajouter des photos</strong>: Permet de restreindre l'ajout à certains utilisateurs</li>
+  <li><strong>Notifier les administrateurs quand une image est ajoutée</strong>: Les administrateurs recevront un courriel à chaque image ajoutée par un utilisateur.</li>
+</ul>
+
+<h3>Affichage par défaut</h3>
+<p>Modifier les options d'affichage par défaut: pour les visiteurs non
+connectés. Une fois connecté, ces options sont surchargées par celles de
+l'utilisateur, qu'il peut modifier dans l'écran <span
+class="pwgScreen">profile</span>.</p>
+
+<p>Il est possible de changer ces options pour les utilisateurs existants,
+mais il s'agit d'un autre écran : <span class="pwgScreen">Administration,
+Identification, Utilisateurs</span>, dans lequel vous pouvez modifier ces
+options pour une liste d'utilisateurs sélectionnés.</p>
+
+<ul>
+
+  <li><strong>Langue</strong>: ne concerne que les libellés de
+Piwigo. Les noms de catégories, d'image et les descriptions ne sont
+pas localisés (ie multilingue).</li>
+
+  <li><strong>Nombre de miniatures par ligne</strong></li>
+
+  <li><strong>Nombre de lignes par page</strong></li>
+
+  <li><strong>Thème de l'interface</strong></li>
+
+  <li><strong>Période récente</strong>: en jours. Période pendant laquelle
+une image est considérée comment nouvelle. Cette période doit être
+supérieure à 1 jour.</li>
+
+  <li><strong>Développer toutes les catégories</strong>: développer toutes
+les catégories dans le menu? <em>Attention</em>: cette option est
+susceptible de consommer inutilement des ressources si votre arbre de
+catégories contient de nombreux éléments.</li>
+
+  <li><strong>Montrer le nombre de commentaires</strong>: montrer les nombre
+de commentaires utilisateur en dessous de chaque miniature. Consomme des
+ressources.</li>
+
+  <li><strong>Montrer le nombre de visualisations  </strong>: affiche les 
+  « hits » relevés sur une image sous sa miniature dans la page de miniatures.
+  Uniquement valable si le paramètre de configuration avancée est :<br>
+  $conf['show_nb_hits'] = true; <br>
+  N.B.: par defaut il est à false.</li>
+
+  <li><strong>Largeur maximum des images</strong>: à l'affichage. Si l'image
+est plus large que ce paramètre, alors elle sera redimensionnée à
+l'affichage. Si vous pensez nécessaire de modifier ce paramétrage (donc pour
+un affichage par défaut), il serait pertinent de redimensionner directement
+vos images stockées.</li>
+
+  <li><strong>Hauteur maximum des images</strong>: même remarque que pour la
+largeur.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_CA/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,101 @@
+<h2>Configuration pour "étendre" les templates</h2>
+
+<h3>Objectif</h3>
+<p>Définir les conditions de remplacement de chaque template (modèle) à partir de template-extension
+(template appelé "replacer" (remplaçant)).</p>
+
+<p>Les "Templates d'origine" provenant de ./template/yoga (ou de tout autre dossier que "yoga")
+ sont remplacés par un remplaçant si celui-ci est lié à son template d'origine
+ (et de façon facultative, quand l'adresse (URL) demandée contient un URL contains un "Paramètre facultatif de l'URL").</p>
+
+<p>Les "Paramètres facultatif de l'URL" sont ceux que vous pouvez trouver après le nom du module dans l'adresse (URL).</p>
+
+<p>Ainsi un "Paramètre facultatif de l'URL" peut être un "permalink" (lien permanent) actif
+(voir les permalinks dans notre documentation pour plus d'information).</p>
+
+<p>Lire les `<a href="#warnings">mises en garde</a>` sur les conditions d'utilisation.</p>
+
+<h3>Qu'est-ce que les extensions des modèles?</h3>
+
+<p>Cet outil de configuration est à la fois puissant pour les débutants et pour les utilisateurs avancés.
+Par FTP, dans le dossier template-extension, le Webmaster pourra dupliquer une bonne partie des fichiers
+ .tpl distribués ("Templates d'origine") avec un nom différent  
+ ("replacer" (remplaçant)).
+ 
+ "Templates d'origine", actuellement les modèles d'origine supportés sont:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Où puis-je trouver les "Templates d'origine"?</h3>
+
+<p>Les modèles distribués d'origine sont dans template/yoga/ 
+(ne pas les modifier directement à cet endroit pour des raisons d'évolution). Ainsi à partir des "templates d'origine", 
+tout webmaster pourra créer ses "replacers (modèles personalisés)".</p>
+
+<h3>Où dois-je enregistrer les "remplaçants"?</h3>
+
+<p>Les <strong>Replacers (templates modifiés)</strong> peuvent être placés dans le dossier 
+template-extension (ou ses sous-dossiers).
+Les remplaçants peuvent avoir n'importe quel nom de fichier avec l'extension .tpl. Par exemple: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Comment puis-je activer mes "remplaçants"?</h3>
+<p>Un <strong>template d'origine</strong> devrait être associé à chaque
+ <strong>replacer (modèle modifié)</strong> à fin d'activer les remplacements correspondants.
+ Activer les remplaçants est la fonction de "Etendre les templates" dans les menus de Configuration de l'Administration.</p>
+
+<p>Si vous sélectionnez un <strong>Paramètre facultatif de l'URL</strong> alors les remplacements 
+ne seront réalisés que sur les pages utilisant ce mot clé. Par exemple: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Les utilisateurs avancés utiliseront les permalinks (permaliens, liens permanents) en tant que 
+<strong>paramètre facultatif de l'URL</strong>. </p>
+
+<p>Si vous sélectionnez un <strong>Template rattaché</strong> alors les remplacements ne seront réalisés que sur ce template.</p>
+
+<h3>Comment puis-je désactiver mes "replacers"?</h3>
+<ul>
+<li>Déselectionner le "template d'origine".</li>
+<li>Par FTP supprimer le "remplaçant".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Mises en garde</h3>
+<ul>
+
+  <li>Le <strong>template d'origine</strong> doit être le véritable template "d'origine"
+  autrement vous pourriez avoir des résultats imprévisibles!</li>
+
+  <li>Si plusieurs <strong>remplaçants (templates modifiés)</strong> ont le même
+  <strong>template d'origine</strong> et le même <strong>paramètre facultatif
+  de l'URL</strong> alors seulement le dernier remplaçant sera actif.</li>
+
+  <li>Ne pas sélectionner de <strong>paramètre facultatif de l'URL</strong> 
+  activera le template de remplacement à chaque utilisation du template.
+  Comme mentionné ci-dessus, l'ordre peut inhiber les remplaçants précédents.</li>
+
+  <li>Sous-dossiers:
+  Les sous-dossiers sont ignorés mais ils sont utiles pour modifier l'ordre des remplaçants.<br>
+distributed-samples: pour vos tests sont distributés! 
+<strong>Ne pas les modifier</strong>, créez les votres!
+</li>
+
+  <li>A la suppression d'un remplaçant le <strong>template d'origine</strong> sera 
+  immédiatement réactivé.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_CA/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/group_list.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Liste des groupes</h2>
+
+<p>Administration des propriétés des groupes.</p>
+
+<h3>Ajouter un groupe</h3>
+
+<p>L'administrateur peut ajouter des groupes.</p>
+
+<h3>Liste des groupes</h3>
+
+<p>La liste permet pour chaque groupe:</p>
+
+<ul>
+  <li>d'accéder à la liste des membres</li>
+  <li>d'accéder aux permissions</li>
+  <li>de supprimer le groupe (nécessite une confirmation)</li>
+  <li>d'inverser le statut "par défaut" (nécessite une confirmation)</li>
+</ul>
+
+<h3>Groupes par défaut</h3>
+<p>Les groupes par défaut sont des groupes associés automatiquement à chaque nouvel utilisateur lors de son enregistrement ou de sa création par un administrateur.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,31 @@
+<p>Il existe plusieurs méthodes pour ajouter des photos dans votre
+galerie :</p>
+
+<ul>
+
+  <li><strong>L'ajout direct</strong> dans votre navigateur web est la
+  méthode la plus simple et la plus immédiate. Elle dépend des capacités de
+  votre navigateur et de votre serveur. Pour des gros volumes ou en cas de
+  problèmes, les méthodes alternatives vous attendent !</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Utiliser l'ajout direct</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> est un logiciel à installer sur votre
+  ordinateur. Glissez vos photos dans la fenêtre de pLoader, cliquez
+  sur <em>"Transférer vers Piwigo"</em> et pLoader s'occupe du reste. D'autres logiciels clients existent, comme <strong>WinToPiwigo</strong> ou le module
+  d'export Piwigo de <strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Utiliser pLoader</a></p>
+
+<ul>
+  <li><strong>Le transfert FTP</strong>
+  est la méthode idéale pour ajouter une collection importante en un minimum
+  d'opérations. Suivez le guide pour préparer vos photos. Cette méthode vous
+  permet de contrôler avec précision l'organisation physique de vos photos
+  sur votre serveur.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Utiliser FTP</a></p>
Index: tags/2.4.0RC3/language/fr_CA/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/help_groups.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Les groupes d'utilisateurs permettent d'assigner des permissions à une liste d'utilisateurs.</p>
+
+<p>Vous pouvez créer des groupes et y ajouter des utilisateurs dans 
+<span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Groupes</span>.</p>
+
+<p>Un utilisateur peut appartenir à plusieurs groupes. L'autorisation l'emporte sur l'interdiction : si l'utilisateur "pierre" appartient aux
+groupes "famille" et "amis", et que seul le groupe "famille" peut visiter la
+catégorie "Noël 2003", alors "pierre" peut visiter cette catégorie.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/help_misc.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Une fois votre galerie créée, configurez l'affichage par
+défaut tel que désiré dans <span class="pwgScreen">Administation &raquo; Configuration &raquo; Affichage par défaut</span>. Chaque nouvel
+utilisateur héritera de ces propriétés d'affichage dès son enregistrement.</p>
+
+<p>Pour toute question, la communauté francophone Piwigo est à l'écoute sur le <a href="http://fr.piwigo.org/forum">forum</a>.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,48 @@
+<fieldset>
+<legend>Permissions par photo</legend>
+
+<p>Chaque photo a un <strong>niveau de confidentialité</strong> (un verrou). Chaque utilisateur a également un niveau de confidentialité (une clef). Il y a 5 niveaux de confidentialité :
+<ol>
+  <li>Aucun</li>
+  <li><em>Contacts</em></li>
+  <li><em>Amis</em> (qui est davantage qu'un contact)</li>
+  <li><em>Famille</em> (qui est davantage qu'un ami)</li>
+  <li><em>Admins</em> (qui recouvre tous les autres niveaux)</li>
+</ol>
+
+<p>Les niveaux supérieurs disposent des droits pour accéder aux niveaux inférieurs. Pour un utilisateur donné, plus haut est son niveau de confidentialité, plus il peut voir de photos.</p>
+
+<p>Par exemple, si la photo "mariage_pierre-0024.jpg" a le niveau de confidentialité <em>"Famille"</em>, alors :</p>
+<ul>
+  <li>Pierre (qui est un <em>Admin</em>) peut la voir car <em>"Admins"</em> donne tous les droits</li>
+  <li>Vanessa (qui est une membre de la <em>Famille</em>) peut la voir également</li>
+  <li>Marie (qui n'est qu'une <em>Amie</em>) elle ne peut pas la voir</li>
+</ul>
+
+<p>Un utilisateur qui ne dispose pas des permissions pour voir le contenu d’une catégorie ne verra pas du tout la catégorie, pas même son titre. Même principe pour un tag.</p>
+
+<p>Vous pouvez assigner le niveau de confidentialité d'un utilisateur sur l'écran <span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Gérer</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Permissions par catégorie</legend>
+
+<p>Si les niveaux de confidentialité ne correspondent pas exactement à vos besoins, vous pouvez également gérer les permissions par catégorie et pour un utilisateur ou un groupe donné. Vous pouvez gérer les permissions par photo et par catégorie en même temps, sans conflit.</p>
+
+<p>Vous pouvez interdire l'accès aux catégories. Passez le type d'accès de la catégorie à "privée" si vous souhaitez gérer les permissions.</p>
+  
+<p>Vous pouvez rendre une catégorie privée en l'éditant (<span
+class="pwgScreen">Administration &raquo; Catégories &raquo; Gérer &raquo; Éditer</span>) ou en
+gérant les options pour votre arbre complet des catégories (<span
+class="pwgScreen">Administration &raquo; Catégories &raquo; Propriétés &raquo; Publique/Privée</span>).</p>
+
+<p>Lorsqu'une catégorie est privée, vous pouvez gérer les permissions par groupes et utilisateurs avec 3 écrans :</p>
+
+<ul>
+  <li><span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Gérer &raquo; action Permissions</span> (1 lien par utilisateur)</li>
+  <li><span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Groupes &raquo; action Permissions</span> (1 lien par groupe)</li>
+  <li><span class="pwgScreen">Administration &raquo; Catégories &raquo; Gérer &raquo; Modifier les permissions</span> (1 lien par catégorie)</li>
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/fr_CA/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Les photos sont affichées dans les catégories correspondant aux répertoires dans lesquels elles sont stockées.</p>
+
+<p>Vous pouvez également afficher une photo dans plusieurs catégories, sans dupliquer le fichier sur votre serveur web. Associez la photo à n'importe quelle autre catégorie depuis l'écran d'édition de la photo (auquel vous accéder depuis la page de visualisation de la photo côté galerie, lorsque vous êtes connecté en tant qu'administrateur)</p>
+
+<p>Les catégories virtuelles sont basées sur ce principe : elles n'ont pas de répertoire associé. Créez des catégories virtuelles depuis <span class="pwgScreen">Administration &raquo; Catégories &raquo; Gérer</span>.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/history.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/history.html	(revision 14585)
@@ -0,0 +1,46 @@
+<h2>Historique</h2>
+
+<p>Ces écrans permettent de suivre l'historique de navigation dans Piwigo
+ suivant les options que vous avez déterminées dans - Administration - Générale 
+ - Onglet "Historique".</p>
+	
+<h3>Statistiques</h3>
+<ul>
+  <p>Si vous avez choisi que les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> soient
+enregistrées dans la table <code>history</code>,
+cet onglet permet de suivre le nombre de pages visitées</p>
+	
+	<li><strong>Statistiques totales</strong> : visites par année</li>
+	
+	<li><strong>Statistiques d'une année</strong> : visites par mois de l’année sélectionnée.</li>
+	
+	<li><strong>Statistiques d'un mois</strong> : visites par jour du mois sélectionné.</li>
+	
+	<li><strong>Statistiques d'une journée</strong> : visites par heures de la journée sélectionnée.</li>
+	
+</ul>
+
+<h3>Rechercher</h3>
+<ul>
+  <p>Si vous avez choisi que les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> soient
+enregistrées dans la table <code>history</code>, cet onglet permet de suivre plus en détail les pages visitées avec l'aide de différents filtres.</p>
+ 
+	<li><strong>Filtrer par date</strong> : sélectionner la plage
+de dates dont vous souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par type d'élément</strong> : sélectionner le
+type d'élément dont vous souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par utilisateur</strong> : sélectionner l'utilisateur dont vous
+ souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par nom du fichier</strong> : sélectionner le nom du fichier dont vous
+ souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par identifiant image</strong> : sélectionner l'identifiant de l'image dont vous
+ souhaitez observer l’activité.</li>
+</ul>
Index: tags/2.4.0RC3/language/fr_CA/help/index.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/fr_CA/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/maintenance.html	(revision 14585)
@@ -0,0 +1,64 @@
+<h2>Maintenance</h2>
+
+<p>Pour optimiser le temps de génération des pages, Piwigo utilise des informations en cache.
+ Par exemple, au lieu de compter le nombre d'éléments contenus dans chaque catégorie à 
+ chaque rechargement de page, cette information est stockée dans la base de données. 
+ En théorie, cette information doit toujours être correcte, mais parfois une erreur peut 
+ survenir et l'information en cache devient fausse.</p>
+
+<p>Certaines informations deviennent inutiles avec le temps. 
+Les supprimer de la base de données libère de l'espace disque.</p>
+
+<ul>
+
+  <li>
+    <strong>Eléments non liés:</strong>
+    Affiche les images qui ne sont associées à aucune catégorie virtuelle
+  </li>
+  <li>
+    <strong>Fichiers portant le même nom dans plusieurs catégories physiques :</strong>
+    Affiche les images ou les éventuels fichiers qui pourraient être trouvés dans plusieurs catégories.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Mettre à jour les informations des catégories :</strong> 
+  Pour chaque catégorie, les informations suivantes sont contrôlées, et mises à jour le cas échéant : 
+  liste des catégories mères, nombre d'éléments, date du dernier élément, position parmi les 
+  catégories soeurs, position dans l'arbre complet des catégories. Cette action vérifie 
+  également la cohérence des représentants.</li>
+
+  <li><strong>Mettre à jour les informations des images :</strong>
+Pour chaque image, les informations mises àjour sont : chemin complet vers le 
+fichier et note moyenne. Attention, ne pas confondre : les méta-données sont 
+synchronisées sur l'écran <span class="pwgScreen">Administration, Catégories, Synchroniser</span> 
+ou sur l'écran <span class="pwgScreen">Modifier les informations d'une image</span> (accessible depuis la page de visualisation d'une image <span class="pwgScreen">picture.php</span>).</li>
+
+  <li><strong>Réparer et optimiser la base de données :</strong>
+Effectue des opérations de ré-ordonnancement, réparation et optimisation sur  chaque table de la base de données.
+  </li>
+
+</ul>
+
+<ul>
+  <li><strong>Purger le détail de l'historique :</strong>
+Supprime toutes les lignes de la table <code>history</code>. L'écran <span class="pwgScreen">
+Administration, Spéciales, Historique</span> ne montre alors plus aucune information sur le passé. 
+<em>Attention</em> : toutes les données seront perdues, sans aucun possibilité de récupération.
+  </li>
+
+  <li><strong>Purger la synthèse de l'historique :</strong>
+Supprime toutes les informations  récapitulatives (obtenues à partir du détail de l'historique).
+  </li>
+
+  <li><strong>Purger les sessions :</strong> Supprimer les sessions expirées.</li>
+
+  <li><strong>Purger les flux de notification jamais utilisés</strong></li>
+  
+  <li><strong>Purger l'historique des recherches</strong></li>
+  
+  <li><strong>Purger les templates compilés</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_CA/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Notification par courriel</h2>
+
+<p>Cet écran permet de configurer et de gérer les envois de courriels aux utilisateurs, pour les aviser de changements intervenus sur votre site.</p>
+
+<p>Cet écran est composé de 3 onglets:</p>
+
+<h3>Paramétrage</h3>
+<p>Accessible uniquement aux webmestres, cet onglet permet de positionner les paramètres de la notification par courriel.</p>
+
+<h3>Inscription</h3>
+<p>Accessible uniquement aux webmestres, cet onglet permet de gérer les inscriptions/désinscriptions à la notification par courriel.</p>
+
+<h3>Envoi</h3>
+<p>Accessible aux webmestres et aux administrateurs, cet onglet permet d'effectuer les envois de courriels pour notifier les changements.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Liens permanents</h2>
+
+<p>Les liens permanents sont utilisés pour rendre plus jolis les urls des catégories. Lorsqu'une catégorie dispose d'un lien permanent associée, son identifiant n'est plus nécessaire dans l'url.</p>
+
+<p>Quand un lien permanent est effacé, vous pouvez le sauvegarder dans l'historique des liens permanents, de sorte que les liens externes à Piwigo puissent continuer à fonctionner. Dans l'historique des liens permanents vous pouvez voir la date d'effacement du lien, ainsi que la date de la dernière utilisation et le nombre d'utilisations de ce lien.</p>
+
+<p>Veuillez noter que les liens permanents doivent être uniques. Ils doivent aussi être uniques dans l'historique des liens permanents.</p>
Index: tags/2.4.0RC3/language/fr_CA/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,135 @@
+<fieldset>
+  <legend>Démarrage rapide</legend>
+
+<ol>
+  <li>Créez un répertoire sur votre ordinateur.</li>
+
+  <li>Copiez des photos à l'intérieur de ce répertoire, puis redimensionnez-les pour un affichage sur le web. <em>Attention</em> : le nom des répertoires et des fichiers ne doit contenir que des lettres, des chiffres et les caractères  "-", "_" ou ".". Pas d'espace ou de caractères accentués.</li>
+
+  <li>Avec un client FTP, copiez le répertoire dans le répertoire "galleries" de votre installation de Piwigo.</li>
+
+  <li>Connectez-vous à votre galerie Piwigo et rendez-vous sur <span class="pwgScreen">Administration &raquo; Images &raquo; Miniatures</span> pour créer les miniatures manquantes.</li>
+
+  <li>Rendez-vous sur <span class="pwgScreen">Administration</span> et cliquez sur le gros bouton de synchronisation.</li>
+</ol>
+
+<p>Bravo ! Vous avez créé avec succès la première catégorie de votre galerie.</p>
+
+</fieldset>
+
+<fieldset>
+  <legend>Organisation des répertoires et des fichiers</legend>
+
+<ul>
+
+  <li>
+
+    <p>Les répertoires représentant les catégories se trouvent dans le répertoire "galleries". Ci-dessous l'arbre des répertoires d'une très petite galerie (mais utilisant de nombreuses fonctionnalités) : </p>
+  
+<pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- categorie-1
+|   |   |-- categorie-1.1
+|   |   |   |-- categorie-1.1.1
+|   |   |   |   |-- categorie-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- mariage.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-mariage.jpg
+|   |   |   |   |   +-- mariage.jpg
+|   |   |   |   +-- categorie-1.1.1.2
+|   |   |   +-- categorie-1.1.2
+|   |   |-- categorie-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- categorie-1.3
+|   +-- categorie-2
+|       |-- porcinet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-porcinet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>A l'exception de ceux appelés "thumbnail", "pwg_high" ou "pwg_representative" (voir explications ci-dessous), chaque répertoire dans "galleries" génère une catégorie. Le nombre de niveaux (profondeur) n'est pas limité.</li>
+
+  <li>Fondamentalement, un élément est représenté par un fichier. Pour Piwigo, un fichier peut être un élément si son extension figure dans la liste du paramètre de configuration <code>file_ext</code> (voir
+fichier <span class="filename">include/config.inc.php</span>). Un fichier
+peut être une image si son extension figure dans la liste du paramètre de configuration
+<code>picture_ext</code>.</li>
+
+  <li>Les éléments de type image doivent avoir une miniature associée (voir la
+section suivante à propos des miniatures).</li>
+
+  <li>Les éléments de type image peuvent avoir un image en grand format
+associé. Comme pour le fichier <span class="filename">mariage.jpg</span>
+dans l'exemple ci-dessus. Aucun préfixe n'est nécessaire sur le nom du
+fichier.</li>
+
+  <li>Les éléments autres que les images (vidéos, sons, fichiers texte, tout ce que vous
+voulez...) sont représentés par défaut par une icône correspondant à
+l'extension du nom du fichier. Optionnellement, une miniature et un
+représentant peuvent être associés (voir le fichier <span
+class="filename">video.avi</span> dans l'exemple).</li>
+
+  <li><em>Attention</em> : le nom d'un répertoire ou d'un fichier ne doit
+être composé que de lettres, de chiffres, de "-", "_" ou ".". Pas d'espace
+ou de caractères accentués.</li>
+
+  <li><em>Conseil</em> : une catégorie peut contenir des éléments et des
+sous-catégories à la fois. Néanmoins, il est fortement conseillé pour chaque
+catégorie de choisir entre contenir des éléments <strong>ou bien</strong>
+des sous-catégories.</li>
+
+  <li>Une fois que les fichiers, les miniatures et les représentants sont
+correctement placés dans les répertoires, se rendre sur l'écran <span
+class="pwgScreen">Administration &raquo; Catégories &raquo; Synchroniser</span>.</li>
+
+</ul>
+
+</fieldset>
+
+<fieldset>
+  <legend>Miniatures</legend>
+
+<ul>
+  
+  <li>Comme mentionné précédemment, chaque élément de type image doit être
+associé à une miniature.</li>
+
+  <li>Les miniatures sont stockées dans le sous-répertoire "thumbnail" de
+chaque répertoire représentant une catégorie. Une miniature est un fichier
+de type image (même extension du nom du fichier) dont le nom de fichier est
+préfixé par le paramètre de configuration <code>prefix_thumbnail</code>
+(voir <span class="filename">include/config.inc.php</span>).</li>
+
+  <li>Les miniatures n'ont pas besoin d'avoir la même extension que leur
+image associée (une image avec ".jpg" comme extension peut avoir une
+miniature en ".GIF" par exemple).</li>
+
+  <li>Il est conseillé d'utiliser un outil externe pour la création des
+miniatures.</li>
+
+  <li>Vous pouvez également utiliser l'outil de création de miniatures
+intégré à Piwigo mais cela est déconseillé car la qualité risque
+d'être décevante et cela utilise inutilement les ressources du serveur (ce
+qui peut être un grave problème sur un serveur mutualisé).</li>
+
+  <li>Si vous choisissez d'utiliser le serveur web pour générer les
+miniatures, vous devez donner les droits en écriture sur les
+répertoires.</li>
+
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/fr_CA/help/search.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/search.html	(revision 14585)
@@ -0,0 +1,26 @@
+<h2>Recherche</h2>
+
+<p>Recherche d'images dans l'ensemble de la galerie.</p>
+
+<dl>
+
+  <dt>Rechercher un mot</dt>
+
+  <dd>Recherche un ou plusieurs mots dans tous les attributs des images de la galerie
+images. Utiliser * comme passe-partout pour les recherches partielles.</dd>
+  
+  <dt>Recherche d'un auteur</dt>
+
+  <dd>Utiliser * comme passe-partout pour les recherches partielles.</dd>
+
+  <dt>Recherche par date</dt>
+
+  <dd>Sélectionner une date et/ou une date de fin. Laisser la date vide si
+vous souhaitez faire une recherche "avant". Dans le dernier champ, l'année doit être saisie avec 4 chiffres (2005 par exemple).</dd>
+
+  <dt>Recherche dans les catégories</dt>
+
+  <dd>Sélectionner les catégories sur lesquelles restreindre la
+recherche. Il est possible de chercher dans toutes les catégories en sélectionnant la catégorie parente, et en autorisant la recherche dans les sous-catégories.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_CA/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/site_manager.html	(revision 14585)
@@ -0,0 +1,57 @@
+<h2>Sites distants</h2>
+
+<p>Piwigo offre la possibilité d'utiliser plusieurs sites pour
+stocker les fichiers qui composeront votre galerie. Cela peut être utile si
+votre galerie est installée sur un espace de stockage limité et que vous
+ayez de nombreux fichiers à montrer.</p>
+
+
+<ol>
+
+  <li>éditer le fichier <span
+class="filename">tools/create_listing_file_local.inc.php</span> en modifiant la
+section des paramètres comme <code>$conf['prefix_thumbnail']</code> ou
+<code>$conf['use_exif']</code>.</li>
+
+  <li>par FTP, placer les fichiers <span
+class="filename">tools/create_listing_file.php</span> et <span
+class="filename">tools/create_listing_file_local.inc.php</span> (modifié) sur votre site
+distant, dans le même répertoire que les répertoires représentant vos
+catégories (comme le répertoire <span class="filename">galleries</span> de
+ce site). Par exemple, disons que vous pouvez accéder à <span
+class="filename">http://exemple.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>se rendre sur <span class="pwgScreen">Administration, Catégories,
+Gestionnaire des sites</span>. Demander à créer un nouveau site, par exemple <span
+class="filename">http://exemple.com/galleries</span>.</li>
+
+  <li>
+
+    <p>un nouveau site distant est enregistré. 4 actions sont possibles :</p>
+
+    <ol>
+
+      <li><strong>générer la liste</strong> : lance une requête distante pour
+générer le fichier de listing distant</li>
+
+      <li><strong>synchroniser</strong> : lit le fichier distant <span
+class="filename">listing.xml</span> et synchronise avec la base de données
+locale</li>
+
+      <li><strong>nettoyer</strong> : supprime le fichier distant de
+listing</li>
+
+      <li><strong>détruire</strong> : supprime le site (et tous les éléments
+qui y sont associés) dans la base de données</li>
+
+    </ol>
+
+  </li>
+
+</ol>
+
+<!--<p>Vous pouvez également effectuer ces opérations manuellement en éditant
+le fichier <span class="filename">listing.xml</span> à la main et en le
+déplaçant vers votre répertoire racine. Se rendre sur <span
+class="pwgScreen">Administration, Catégories, Sites distant</span> :
+Piwigo détecte le fichier et propose de s'en servir.</p>-->
Index: tags/2.4.0RC3/language/fr_CA/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/synchronize.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Synchroniser</h2>
+
+<ul>
+
+  <li>Il existe 2 types de synchronisations : structure (répertoires/fichiers) et
+meta-données. Synchroniser la structure consiste à synchroniser l'arborescence
+de vos répertoires et fichiers avec leur représentation dans la
+base de données. La synchronisation des méta-données assure la mise à jour des
+informations telles que le poids du fichier, les dimensions, les données EXIF ou
+IPTC.</li>
+
+  <li>La première synchronisation à effectuer doit être celle sur la
+structure.</li>
+
+  <li>Le processus de synchronisation peut prendre du temps (en fonction de
+la charge du serveur et de la quantité de fichiers à gérer), il est donc
+possible de procéder catégorie par catégorie.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_CA/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Création des miniatures</h2>
+
+<p>Création des miniatures manquantes. L'utilisation de cette fonctionnalité
+est déconseillée si votre galerie est hébergée sur un serveur
+mutualisé (ressources machine partagées).</p>
+
+<dl>
+
+  <dt>Version de GD</dt>
+
+  <dd>GD est une librairie graphique de manipulation d'images pour
+PHP. Choisissez la version installée sur votre serveur. Le système vous signalera par un message d'erreur si vous choisissez une mauvaise version ; revenez alors sur la page précédente et choisissez l'autre version. Si aucune version ne fonctionne, cela
+signifie que GD n'est pas disponible.</dd>
+
+  <dt>Largeur et hauteur</dt>
+
+  <dd>Dimensions maximales des miniatures peuvent prendre. Le rapport
+largeur/hauteur original est conservé. Les valeurs par défaut sont
+modifiables grâce aux paramètres de configuration <code>tn_width</code> et
+<code>tn_height</code> (voir le fichier <span
+class="filename">include/config_default.inc.php</span>).</dd>
+  
+  <dt>Nombre de miniatures à créer</dt>
+
+  <dd>N'essayez pas de miniaturiser un trop grand nombre d'images à la
+fois. Le traitement de miniaturisation nécessite en effet une utilisation intensive du processeur. Si votre galerie Piwigo est chez un hébergeur gratuit, une charge processeur trop importante est susceptible d'entraîner la suppression de votre site.</dd>
+
+  <dt>Format de fichier</dt>
+
+  <dd>Les miniatures sont créées au format JPEG. Seuls les images aux formats PNG et
+JPEG peuvent être miniaturisées.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_CA/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/fr_CA/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/help/user_list.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Liste des utilisateurs</h2>
+
+<p>Permet la gestion des propriétés des utilisateurs enregistrés, à l'exception des permissions, qui sont gérées via d'autres écrans.</p>
+
+<h3>Ajouter un utilisateur</h3>
+
+<p>L'administrateur peut ajouter manuellement des utilisateurs.</p>
+
+<h3>Liste des utilisateurs</h3>
+
+<p>La liste peut être filtrée avec le nom d'utilisateur (* = passe-partout), avec le
+groupe ou encore le statut. La liste peut être triée par date
+d'enregistrement ou nom d'utilisateur, en ordre croissant ou
+décroissant.</p>
+
+<p>Cet écran permet la modification simultanée de plusieurs utilisateurs
+avec les actions suivantes :</p>
+
+<ul>
+  <li>supprimer des utilisateurs (nécessite une confirmation)</li>
+  <li>changer le statut</li>
+  <li>associer ou dissocier des groupes</li>
+  <li>modifier les propriétés d'affichage</li>
+  <li>modifier les propriétés annexes</li>
+</ul>
+
+<p>Les utilisateurs modifiés sont ceux sélectionnés (comportement par défaut) ou l'ensemble des utilisateurs de la liste filtrée.</p>
Index: tags/2.4.0RC3/language/fr_CA/index.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/fr_CA/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/install.lang.php	(revision 14585)
@@ -0,0 +1,76 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "Installation";
+$lang['Basic configuration'] = "Configuration de base";
+$lang['Default gallery language'] = "Langue par défaut de la galerie";
+$lang['Database configuration'] = "Configuration de la base de données";
+$lang['Admin configuration'] = "Configuration du compte administrateur";
+$lang['Start Install'] = "Démarrer l'installation";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "L'adresse de courriel doit être de la forme xxx@yyy.eee (exemple : jack@altern.org)";
+$lang['Webmaster login'] = "Identifiant de l'administrateur";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "Cet identifiant apparaîtra à tous vos visiteurs. Il vous sert pour administrer le site";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "La connexion au serveur est OK, mais la connection à cette base de données est impossible";
+$lang['Can\'t connect to server'] = "Impossible de se connecter au serveur";
+$lang['Host'] = "Hôte";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "Utilisateur";
+$lang['user login given by your host provider'] = "nom d'utilisateur communiqué par votre hébergeur";
+$lang['Password'] = "Mot de passe";
+$lang['user password given by your host provider'] = "mot de passe utilisateur communiqué par votre hébergeur";
+$lang['Database name'] = "Nom de la base de données";
+$lang['also given by your host provider'] = "également fourni par votre hébergeur";
+$lang['Database table prefix'] = "Préfixe des noms de tables";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "le nom des tables sera précédé de ce préfixe (permet de mieux gérer sa base de données)";
+$lang['enter a login for webmaster'] = "veuillez rentrer un pseudo pour le webmaster";
+$lang['webmaster login can\'t contain characters \' or "'] = "le pseudo du webmaster ne doit pas comporter les caractères \" et '";
+$lang['please enter your password again'] = "veuillez resaisir votre mot de passe";
+$lang['Webmaster password'] = "Mot de passe du webmaster";
+$lang['Keep it confidential, it enables you to access administration panel'] = "Il doit rester confidentiel, il permet d'accéder à l'écran d'administration.";
+$lang['Password [confirm]'] = "Mot de passe [Confirmer]";
+$lang['verification'] = "vérification";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Besoin d'aide ? Posez votre question sur le <a href=\"%s\">forum de Piwigo</a>.";
+$lang['Webmaster mail address'] = "Adresse de courriel de l'administrateur";
+$lang['Visitors will be able to contact site administrator with this mail'] = "Les visiteurs pourront contacter l'administrateur du site par ce courriel";
+$lang['PHP 5 is required'] = "PHP 5 est requis";
+$lang['It appears your webhost is currently running PHP %s.'] = "Apparemment, la version PHP de votre hébergeur est PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo va essayer de passer en PHP 5 en créant ou modifiant le fichier .htaccess.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "Notez que vous pouvez modifier vous-même la configuration PHP et re-lancer Piwigo ensuite.";
+$lang['Try to configure PHP 5'] = "Essayer de configurer PHP 5";
+$lang['Sorry!'] = "Désolé!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo n'a pas pu configurer PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Il vous faut contacter le support de votre hébergeur pour savoir comment configurer vous-même PHP 5.";
+$lang['Hope to see you back soon.'] = "En espérant vous revoir très prochainement.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Félicitations, l\'installation de Piwigo est terminée';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Une solution alternative est de copier le texte dans la zone ci-dessous et de le coller dans le fichier "local/config/database.inc.php" (Attention: database.inc.php ne doit contenir que ce qui se trouve dans la zone, pas de retour à la ligne, pas d\'espace)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'La création du fichier de configuration local/config/database.inc.php a échoué.';
+$lang['Download the config file'] = 'Télécharger le fichier de configuration';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Vous pouvez télécharger le fichier de configuration et le transférer dans le répertoire local/config de votre installation Piwigo.';
+$lang['Just another Piwigo gallery'] = 'Une galerie Piwigo de plus';
+$lang['Welcome to my photo gallery'] = 'Bienvenue sur ma galerie photo';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bienvenue sur votre nouvelle installtion de Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'N\'hésitez pas à consulter bos forums si vous avez le moindre problème : %s';
+
+?>
Index: tags/2.4.0RC3/language/fr_CA/iso.txt
===================================================================
--- tags/2.4.0RC3/language/fr_CA/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Français [QC]
Index: tags/2.4.0RC3/language/fr_CA/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_CA/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_CA/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Mise à jour";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Cette page vous propose de mettre à jour la base de données de votre ancienne version de piwigo vers la nouvelle version.
+L'assistant de mise à jour pense que vous disposez actuellement de la <strong>version %s</strong> (ou équivalente).";
+$lang['Upgrade from version %s to %s'] = "Mise à jour de la version %s à %s";
+$lang['Statistics'] = "Statistiques";
+$lang['total upgrade time'] = "temps total de la mise à jour";
+$lang['total SQL time'] = "temps total des requêtes SQL";
+$lang['SQL queries'] = "nombre de requêtes SQL";
+$lang['Upgrade informations'] = "Informations sur la mise à jour";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Veuillez effectuer une maintenance dans [Administration>Outils>Maintenance] si vous rencontrez des problèmes.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Par précaution, les plugins suivants ont été désactivés. Vérifiez s'il existe des mises à jour avant de les réactiver:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Seul un administrateur peut lancer la mise à jour: veuillez vous identifier ci-dessous.";
+$lang['You do not have access rights to run upgrade'] = "Vous n'avez pas les droits nécessaires pour lancer la mise à jour.";
+$lang['All sub-albums of private albums become private'] = "Toutes les sous-catégories de catégories privées deviennent privées";
+$lang['User permissions and group permissions have been erased'] = "Les permissions des utilisateurs et des groupes ont été effacées";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Seuls le préfixe des miniatures et l'adresse de courriel du webmestre ont étés conservés de la précédente configuration";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Dans le fichier <i>%s</i>, avant <b>?></b>, insérez:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Par précaution, les thèmes suivants ont été désactivés. Vérifiez s\'il existe des mises à jour avant de les réactiver:';
+
+?>
Index: tags/2.4.0RC3/language/fr_FR/about.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/about.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Cette galerie photo est basée sur Piwigo.</p>
+
+<p>Piwigo est un logiciel de galerie photo pour le web, bâti par une
+communauté active d'utilisateurs et de développeurs. Les extensions rendent
+Piwigo facilement personnalisable. Cerise sur le gâteau, Piwigo est libre et
+gratuit.</p>
+
+<p id="linkToPiwigo"><a href="http://fr.piwigo.org">Visiter le site web de Piwigo</a></p>
Index: tags/2.4.0RC3/language/fr_FR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/admin.lang.php	(revision 14585)
@@ -0,0 +1,900 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = "%d association";
+$lang['%d associations'] = "%d associations";
+$lang['%d album including'] = '%d album dont';
+$lang['%d albums including'] = '%d albums dont';
+$lang['%d physical'] = " %d physique";
+$lang['%d physical'] = " %d physiques";
+$lang[' and %d virtual'] = " et %d virtuel";
+$lang[' and %d virtual'] = " et %d virtuels";
+$lang['%d album moved'] = '%d album déplacé';
+$lang['%d albums moved'] = '%d albums déplacés';
+$lang['%d group'] = "%d groupe";
+$lang['%d groups'] = "%d groupes";
+$lang['%d member'] = "%d membre";
+$lang['%d members'] = "%d membres";
+$lang['%d tag'] = "%d tag";
+$lang['%d tags'] = "%d tags";
+$lang['%d user comment rejected'] = "%d commentaire d'utilisateur rejeté";
+$lang['%d user comments rejected'] = "%d commentaires d'utilisateurs rejetés";
+$lang['%d user comment validated'] = "%d commentaire d'utilisateur validé";
+$lang['%d user comments validated'] = "%d commentaires d'utilisateurs validés";
+$lang['%d user deleted'] = "%d utilisateur supprimé";
+$lang['%d users deleted'] = "%d utilisateurs supprimés";
+$lang['%d user'] = "%d utilisateur";
+$lang['%d users'] = "%d utilisateurs";
+$lang['%d waiting for validation'] = "%d en attente de validation";
+$lang['Actions'] = "Actions";
+$lang['Activate'] = "Activer";
+$lang['Add/delete a permalink'] = "Ajouter/effacer un lien permanent";
+$lang['Add a tag'] = "Ajouter un tag";
+$lang['Add a user'] = "Ajouter un utilisateur";
+$lang['Add group'] = "Ajouter un groupe";
+$lang['Add'] = "Ajouter";
+$lang['Allow user registration'] = "Permettre l'enregistrement des utilisateurs";
+$lang['Apply to sub-albums'] = 'Appliquer aux sous-albums';
+$lang['Associated'] = "Associée à";
+$lang['Caddie management'] = "Gestion du panier";
+$lang['Caddie'] = "Panier";
+$lang['Albums authorized thanks to group associations'] = 'Albums accessibles grâce à l\'appartenance aux groupes';
+$lang['Album manual order was saved'] = 'L\'ordre manuel des albums a été sauvegardé';
+$lang['Album photos associated to the following albums: %s'] = 'Les photos de l\'album ont été associées aux albums suivants : %s';
+$lang['Check for upgrade failed for unknown reasons.'] = "La vérification de la dernière version sur le serveur a échouée pour une raison inconnue.";
+$lang['Check for upgrade'] = "Dernière version ?";
+$lang['Comments for all'] = "Commentaires pour tous";
+$lang['Current name'] = "Nom courant";
+$lang['Database'] = "Base de données";
+$lang['Deactivate'] = "Désactiver";
+$lang['Deactivate all'] = "Désactiver tout";
+$lang['Delete Representant'] = "Supprimer le représentant";
+$lang['Delete selected tags'] = "Supprimer les tags sélectionnés";
+$lang['Delete selected users'] = "Supprimer les utilisateurs sélectionnés";
+$lang['Deletions'] = "Suppressions";
+$lang['Deny selected groups'] = "Interdire l'accès aux groupes sélectionnés";
+$lang['Deny selected users'] = "Interdire l'accès aux utilisateurs sélectionnés";
+$lang['Description'] = "Description";
+$lang['Display options'] = "Options d'affichage";
+$lang['Dissociated'] = "Dissociée de";
+$lang['Does not represent'] = "Ne représente pas";
+$lang['Edit selected tags'] = "Editer les tags sélectionnés";
+$lang['Edit tags'] = "Editer les tags";
+$lang['Email admins when a new user registers'] = "Notifier les administrateurs lors de l'inscription d'un utilisateur";
+$lang['Email admins when a valid comment is entered'] = "Notifier les administrateurs quand un commentaire est enregistré";
+$lang['Email admins when a comment requires validation'] = "Notifier les administrateurs quand un commentaire requiert leur validation";
+$lang['Environment'] = "Environnement";
+$lang['Form'] = "Formulaire";
+$lang['Gallery title'] = "Titre de la galerie";
+$lang['Grant selected groups'] = "Donner l'accès aux groupes sélectionnés";
+$lang['Grant selected users'] = "Donner l'accès aux utilisateurs sélectionnés";
+$lang['Group name'] = "Nom du groupe";
+$lang['Groups'] = "Groupes";
+$lang['Guests'] = "Invités";
+$lang['History'] = "Historique";
+$lang['Informations'] = "Informations";
+$lang['Install'] = "Installer";
+$lang['Link all album photos to a new album'] = 'Associer toutes les photos de l\'album à un nouvel album';
+$lang['Link all album photos to some existing albums'] = 'Associer toutes les photos de l\'album à des albums existants';
+$lang['Linked albums'] = 'Albums associés';
+$lang['Lock gallery'] = "Verrouiller la galerie";
+$lang['Maintenance'] = "Maintenance";
+$lang['Edit album permissions'] = 'Gérer les permissions pour un album';
+$lang['Manage permissions for group "%s"'] = "Gérer les permissions pour le groupe \"%s\"";
+$lang['Manage permissions for user "%s"'] = "Gérer les permissions pour l'utilisateur \"%s\"";
+$lang['Manage tags'] = "Gérer les tags";
+$lang['Members'] = "Membres";
+$lang['Metadata synchronized from file'] = "Méta-données synchronisées à partir du fichier";
+$lang['Move albums'] = 'Déplacer les albums';
+$lang['Move'] = "Déplacer";
+$lang['Name'] = "Nom";
+$lang['New name'] = "Nouveau nom";
+$lang['New parent album'] = 'Nouvel album parent';
+$lang['New tag'] = "Nouveau tag";
+$lang['Number of comments per page'] = "Nombre de commentaires par page";
+$lang['Number of rates'] = "Nombre de notes";
+$lang['Number of thumbnails to create'] = "Nombre de miniatures à créer";
+$lang['Only private albums are listed'] = 'Seuls les albums privés sont listés';
+$lang['Operating system'] = "Système d'exploitation";
+$lang['Options'] = "Options";
+$lang['Other private albums'] = 'Autres albums privés';
+$lang['Page banner'] = "Bannière des pages";
+$lang['Parent album'] = 'Album parent';
+$lang['Path'] = "Chemin";
+$lang['Permalink'] = "Lien permanent";
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Le lien permanent %s a été précédemment utilisé par l\'album %s. Veuillez l\'effacer de l\'historique des liens permanents';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "Le lien permanent ne doit contenir des caractères que parmi \"a-zA-Z0-9\", \"-\", \"_\" ou \"/\". Il ne doit pas être numérique ou commencer par un nombre suivi par \"-\"";
+$lang['Permalink %s is already used by album %s'] = 'Le lien permanent %s est déja utilisé par l\'album %s';
+$lang['Permalink history'] = "Historique des liens permanents";
+$lang['Permalinks'] = "Liens permanents";
+$lang['Permission denied'] = "Accès interdit";
+$lang['Permission granted thanks to a group'] = "Accès autorisé grâce à l'appartenance aux groupes";
+$lang['Permission granted'] = "Accès autorisé";
+$lang['Photo informations updated'] = 'Informations de la photo mises à jour';
+$lang['Plugins'] = "Plugins";
+$lang['Position'] = "Position";
+$lang['Preferences'] = "Préférences";
+$lang['Properties'] = "Propriétés";
+$lang['Random photo'] = 'Photo au hasard';
+$lang['Rate date'] = "Date de notation";
+$lang['Rating by guests'] = "Notation par les invités";
+$lang['Rating'] = "Notation";
+$lang['Reject'] = "Rejeter";
+$lang['Representant'] = "Représentant";
+$lang['Representation of albums'] = 'Représentation des albums';
+$lang['Representative'] = "Représentant";
+$lang['Represents'] = "Représente";
+$lang['Save order'] = "Sauvegarder l'ordre";
+$lang['Save to permalink history'] = "Sauvegarder dans l'historique des liens permanents";
+$lang['Select at least one album'] = 'Sélectionnez au moins un album';
+$lang['Select at least one photo'] = "Sélectionnez au moins une photo";
+$lang['Select at least one user'] = "Sélectionnez au moins un utilisateur";
+$lang['Show info'] = "Montrer les informations";
+$lang['Site manager'] = "Gestionnaire des sites";
+$lang['Status'] = "Statut";
+$lang['Statistics'] = "Statistiques";
+$lang['Storage album'] = 'Album de stockage';
+$lang['Sum of rates'] = "Somme des notes";
+$lang['Tag "%s" already exists'] = "Le tag \"%s\" existe déjà";
+$lang['Tag "%s" was added'] = "Le tag \"%s\" a été ajouté";
+$lang['Tag selection'] = "Sélection de tags";
+$lang['The %d following tags were deleted'] = "Les %d tags suivants ont été supprimés";
+$lang['Unable to check for upgrade.'] = "Impossible de connaître la dernière version.";
+$lang['Uninstall'] = "Désinstaller";
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Utiliser l\'ordre de tri des photos par défaut (défini dans le fichier de configuration)';
+$lang['User comments validation'] = "Validation des commentaires d'utilisateurs";
+$lang['Users'] = "Utilisateurs";
+$lang['Validate'] = "Valider";
+$lang['Validation'] = "Validation";
+$lang['Version'] = "Version";
+$lang['Virtual albums to move'] = 'Albums virtuels à déplacer';
+$lang['Virtual album name'] = 'Nom de l\'album virtuel';
+$lang['Webmaster cannot be deleted'] = "Le webmestre ne peut pas être supprimé";
+$lang['You are running on development sources, no check possible.'] = "Vous travaillez avec les sources de développement, impossible de vérifier la dernière version.";
+$lang['You cannot delete your account'] = "Vous ne pouvez pas supprimer votre compte";
+$lang['You cannot move an album in its own sub album'] = 'Vous ne pouvez pas déplacer un album dans son propre sous-album';
+$lang['You need to confirm deletion'] = "Vous devez confirmer la suppression";
+$lang['Associate to album'] = 'Associer à l\'album';
+$lang['associate to group'] = "Associer au groupe";
+$lang['Authorized'] = "Autorisés";
+$lang['Add a virtual album'] = 'Ajouter un album virtuel';
+$lang['Authorize users to add comments on selected albums'] = 'Autoriser les utilisateurs à ajouter des commentaires dans les albums sélectionnés';
+$lang['The name of an album must not be empty'] = 'Le nom de l\'album ne doit pas être vide';
+$lang['Lock albums'] = 'Verrouiller les albums';
+$lang['Private'] = 'Album privé';
+$lang['Public'] = 'Album public';
+$lang['Find a new representant by random'] = "Trouver un nouveau représentant au hasard";
+$lang['Public / Private'] = "Publique / Privée";
+$lang['Manage authorizations for selected albums'] = 'Gérer le type d\'accès pour les albums sélectionnés';
+$lang['Virtual album added'] = 'Album virtuel ajouté';
+$lang['Virtual album deleted'] = 'Album virtuel supprimé';
+$lang['Access type'] = "Type d'accès";
+$lang['Information data registered in database'] = "Informations enregistrées dans la base de données";
+$lang['Default display'] = "Affichage par défaut";
+$lang['The gallery URL is not valid.'] = "L'adresse de la galerie n'est pas valide.";
+$lang['Main'] = "Principale";
+$lang['The number of comments a page must be between 5 and 50 included.'] = "Le nombre de commentaires d'utilisateurs par page doit être compris entre 5 et 50.";
+$lang['Configuration'] = "Configuration";
+$lang['confirm'] = "Confirmer";
+$lang['Date'] = "Date";
+$lang['delete album'] = 'supprimer l\'album';
+$lang['Dissociate from album'] = 'Dissocier de l\'album';
+$lang['dissociate from group'] = "Dissocier du groupe";
+$lang['Album updated successfully'] = 'Les informations de l\'album ont été mises à jour avec succès.';
+$lang['photos per page'] = "photos par page";
+$lang['High definition enabled'] = "Haute définition actif";
+$lang['File'] = "Fichier";
+$lang['first photo added on %s'] = "première photo ajoutée le %s";
+$lang['Forbidden'] = "Interdits";
+$lang['global mode'] = "Mode global";
+$lang['group "%s" added'] = "groupe \"%s\" ajouté";
+$lang['group "%s" deleted'] = "groupe \"%s\" supprimé";
+$lang['group "%s" updated'] = "groupe \"%s\" mis à jour";
+$lang['The name of a group must not contain " or \' or be empty.'] = "Le nom du groupe ne doit pas contenir \" ou ' et ne doit pas être vide.";
+$lang['This name is already used by another group.'] = "Ce nom est déjà utilisé par un autre groupe.";
+$lang['High definition'] = "Haute définition";
+$lang['jump to album'] = 'Se rendre dans l\'album';
+$lang['jump to photo'] = 'Voir la photo';
+$lang['leave'] = "laisser";
+$lang['Lock'] = "Verrouiller";
+$lang['Locked'] = "Verrouillées";
+$lang['manage album photos'] = 'Gérer les photos de l\'album';
+$lang['manage sub-albums'] = 'Gérer les sous-albums';
+$lang['Manage'] = "Gérer";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = "Le temps d'exécution étant dépassé, le traitement doit continuer [Temps estimé: %d second].";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "Le temps d'exécution étant dépassé, le traitement doit continuer [Temps estimé: %d secondes].";
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = "Le temps de préparation de la liste des utilisateurs pour l'envoi est limité. Les autres utilisateurs ne sont pas listés.";
+$lang['Time to send mail is limited. Others mails are skipped.'] = "Le temps d'envoi des mails est limité. Les autres envois de mail ont été ignorés.";
+$lang['To send ?'] = "A envoyer ?";
+$lang['Last send'] = "Dernier envoi";
+$lang['email'] = "Email";
+$lang['User'] = "Utilisateur";
+$lang['See you soon,'] = "A bientôt,";
+$lang['Go to'] = "Rendez-vous sur";
+$lang['Hello'] = "Bonjour";
+$lang['New photos were added'] = 'De nouvelles photos ont été ajoutées';
+$lang['on'] = "le";
+$lang['between'] = "entre le";
+$lang['and'] = "et le";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "Vous venez d'être inscrit par le webmestre du site pour recevoir des notifications par mail.";
+$lang['You have subscribed to receiving notifications by mail.'] = "Vous venez de vous inscrire pour recevoir des notifications par mail.";
+$lang['To subscribe'] = "Pour vous inscrire";
+$lang['If you encounter problems or have any question, please send a message to'] = "En cas de problèmes ou de questions, envoyer un mail à";
+$lang['[NBM] Problems or questions'] = "[NBM] Problèmes ou questions";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "Vous venez d'être désinscrit par le webmestre du site pour ne plus recevoir la notification par mail.";
+$lang['You have unsubscribed from receiving notifications by mail.'] = "Vous venez de vous désinscrire pour ne plus recevoir la notification par mail.";
+$lang[', click on'] = ", cliquez sur";
+$lang['To unsubscribe'] = "Pour vous désinscrire";
+$lang['With blank value, gallery title will be used'] = "Si non renseigné, le titre de la galerie sera utilisé";
+$lang['Notification'] = "Notification";
+$lang['Error when sending email to %s [%s].'] = "Erreur lors de l'envoi du mail à %s [%s].";
+$lang['Mail sent to %s [%s].'] = "Mail envoyé à %s [%s].";
+$lang['%d mail was sent.'] = "%s mail a été envoyé.";
+$lang['%d mails were sent.'] = "%s mails ont été envoyés.";
+$lang['%d mail was not sent.'] = "%s mail n'a pas été envoyé.";
+$lang['%d mails were not sent.'] = "%s mails n'ont pas été envoyés.";
+$lang['No mail to send.'] = "Pas de mail à envoyer.";
+$lang['There is no available subscribers to mail.'] = "Il n'y a pas d'utilisateur à notifier par mail.";
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "Un utilisateur peut être notifié seulement si de nouveaux éléments sont disponibles pour cet utilisateur.";
+$lang['Anyway only webmasters can see this tab and never administrators.'] = "Seul le webmaster a accès à cet onglet, pas les administrateurs.";
+$lang['No user to send notifications by mail.'] = "Pas d'utilisateur pour envoyer des notifications par mails.";
+$lang['New photos added'] = 'Nouvelles photos ajoutées';
+$lang['Subscribe to notification by mail'] = "Inscription à la notification par mail";
+$lang['Unsubscribe from notification by mail'] = "Désinscription à la notification par mail";
+$lang['Parameter'] = "Paramétrage";
+$lang['Operation in progress'] = "Traitement en cours.";
+$lang['Continue processing treatment'] = "Continuer le traitement en cours";
+$lang['Complementary mail content'] = "Contenu complémentaire du mail";
+$lang['Add detailed content'] = "Ajout d'un contenu détaillé";
+$lang['Send mail as'] = "Envoyer le mail en tant que";
+$lang['Send mail to users'] = "Envoi de mail aux utilisateurs";
+$lang['Send'] = "Envoi";
+$lang['Options'] = "Options";
+$lang['Subscribed'] = "Inscrits";
+$lang['Subscribe'] = "S'inscrire";
+$lang['Parameters'] = "Paramètres";
+$lang['Select recipients'] = "Sélection des destinataires";
+$lang['Subscribe/unsubscribe users'] = "Inscrire/désinscrire les utilisateurs";
+$lang['Unsubscribed'] = "Non inscrits";
+$lang['%d parameter was updated.'] = "%d paramètre a été mis à jour.";
+$lang['%d parameters were updated.'] = "%d paramètres ont été mis à jour.";
+$lang['%d user was not updated.'] = "%d utilisateur n'a pas été mis à jour.";
+$lang['%d users were not updated.'] = "%d utilisateurs n'ont pas été mis à jour.";
+$lang['User %s [%s] was removed from the subscription list.'] = "L'utilisateur %s [%s] a été supprimé de la liste des inscrits.";
+$lang['User %s [%s] was added to the subscription list.'] = "L'utilisateur %s [%s] a été ajouté à la liste des inscrits.";
+$lang['%d user was updated.'] = "%d utilisateur a été mis à jour.";
+$lang['%d users were updated.'] = "%d utilisateurs ont été mis à jour.";
+$lang['User %s [%s] was not removed from the subscription list.'] = "L'utilisateur %s [%s] n'a pas été supprimé de la liste des inscrits.";
+$lang['User %s [%s] was not added to the subscription list.'] = "L'utilisateur %s [%s] n'a pas été ajouté à la liste des inscrits.";
+$lang['User %s [%s] added.'] = "Utilisateur %s [%s] ajouté.";
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = "Attention, l'inscription ou la désincription génère l'envoi de mail aux utilisateurs concernés";
+$lang['Send mail on HTML format'] = "Envoyer le mail au format HTML";
+$lang['Include display of recent photos grouped by dates'] = "Inclure l'affichage des dernières photos groupées par dates";
+$lang['Available only with HTML format'] = "Disponible uniquement avec le format HTML";
+$lang['no write access'] = "Pas d'accès en écriture";
+$lang['Permissions'] = "Permissions";
+$lang['private'] = "privé";
+$lang['public'] = "public";
+$lang['Purge never used notification feeds'] = "Purger les flux de notification jamais utilisés";
+$lang['Purge sessions'] = "Purger les sessions";
+$lang['randomly represented'] = "représentant au hasard";
+$lang['registration date'] = "date d'enregistrement";
+$lang['clean'] = "nettoyer";
+$lang['Create this site'] = "Créer ce site";
+$lang['test'] = "tester";
+$lang['test this remote site'] = "tester ce site distant";
+$lang['remove tags'] = "Supprimer les tags";
+$lang['Repair and optimize database'] = "Réparer et optimiser la base de données";
+$lang['selection'] = "Sélection";
+$lang['set to'] = "changer en";
+$lang['singly represented'] = "représentant fixe";
+$lang['This site already exists'] = "Ce site existe déjà";
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = "Créer un nouveau site distant : (donner son URL vers create_listing_file.php)";
+$lang['created'] = "créé";
+$lang['delete this site and all its attached elements'] = "supprimer ce site et toutes les informations associées";
+$lang['an error happened'] = "une erreur est survenue";
+$lang['Local'] = "Local";
+$lang['Remote'] = "Distant";
+$lang['update the database from files'] = "met à jour la base de données à partir des fichiers";
+$lang['status'] = "Statut";
+$lang['Directory'] = "Répertoire";
+$lang['sub-albums'] = 'sous-albums';
+$lang['Synchronize metadata'] = "Synchroniser les méta-données";
+$lang['target'] = "Cible";
+$lang['title'] = "Titre";
+$lang['Album list management'] = 'Gestion des albums';
+$lang['Piwigo configuration'] = "Configuration de Piwigo";
+$lang['Edit album'] = 'Modifier un album';
+$lang['Group management'] = "Gestion des groupes";
+$lang['User list'] = "Liste des utilisateurs";
+$lang['Edit photo information'] = 'Modifier les informations de cette photo';
+$lang['Database synchronization with files'] = "Synchronisation de la base à partir des fichiers de";
+$lang['all'] = "Tout";
+$lang['height must be a number superior to'] = "la hauteur doit un entier supérieur à";
+$lang['width must be a number superior to'] = "la largeur doit être un entier supérieur à";
+$lang['for the file format'] = "pour le format de fichier";
+$lang['Photo unreachable or no support'] = 'Photo inaccessible ou format non supporté';
+$lang['GD version'] = "version de GD";
+$lang['General statistics'] = "Statistiques générales";
+$lang['average time'] = "temps moyen";
+$lang['number of miniaturized photos'] = 'nombre de miniatures créées';
+$lang['total time'] = "temps total";
+$lang['for this file format'] = "pour ce format de fichier";
+$lang['unit mode'] = "Mode unitaire";
+$lang['Unlocked'] = "Déverrouillées";
+$lang['unset'] = "vider";
+$lang['Update albums informations'] = 'Mettre à jour les informations des albums';
+$lang['Update photos information'] = 'Mettre à jour les informations des photos';
+$lang['Synchronize'] = "Synchroniser";
+$lang['reduce to single existing albums'] = 'Traiter uniquement un album';
+$lang['Choose an option'] = "Choisir une option";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Afficher un maximum d\'informations (albums ajoutés, photos ajoutées, albums et photos supprimés)';
+$lang['Error list'] = "Liste des erreurs";
+$lang['Errors caption'] = "Légende des erreurs";
+$lang['Detailed informations'] = "Informations détaillées";
+$lang['File/directory read error'] = "Erreur d'ouverture fichier/répertoire";
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = "Le fichier ou répertoire ne peut pas être accessible (soit il n'existe pas, soit l'accès est refusé)";
+$lang['albums deleted in the database'] = 'albums supprimés de la base de données';
+$lang['photos deleted from the database'] = "photos supprimées de la base de données";
+$lang['photos candidates for metadata synchronization'] = 'photos candidates à la synchronisation avec les méta-données';
+$lang['photos informations synchronized with files metadata'] = 'informations des photos synchronisées avec les méta-données';
+$lang['errors during synchronization'] = "erreurs survenues durant la synchronisation";
+$lang['albums added in the database'] = 'albums ajoutés dans la base de données';
+$lang['photos added in the database'] = "photos ajoutées dans la base de données";
+$lang['photos updated in the database'] = "photos mises à jour dans la base de données";
+$lang['Search for new images in the directories'] = "Chercher les nouvelles images dans les répertoires";
+$lang['added'] = "ajouté";
+$lang['deleted'] = "supprimé";
+$lang['Metadata synchronization results'] = "Résultat de la synchronisation des méta-données";
+$lang['only perform a simulation (no change in database will be made)'] = "Simuler uniquement (aucun changement ne sera fait dans la base de données)";
+$lang['Simulation'] = "Simulation";
+$lang['directories + files'] = "Répertoires + fichiers";
+$lang['only directories'] = "Répertoires uniquement";
+$lang['synchronize files structure with database'] = "Synchroniser la structure des fichiers avec la base de données";
+$lang['synchronize files metadata with database photos informations'] = 'Synchroniser les informations des photos de la base de données à partir des méta-données des fichiers';
+$lang['even already synchronized photos'] = "Même les photos déjà synchronisées";
+$lang['Used metadata'] = "Méta-données employées";
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = "Le nom des répertoires et des fichiers ne doit être constitué que de lettres, de chiffres, de \"-\", \"_\" et \".\"";
+$lang['wrong filename'] = "nom de fichier erroné";
+$lang['Upload'] = "Ajout";
+$lang['user "%s" added'] = "utilisateur \"%s\" ajouté";
+$lang['User status'] = "Statut de l'utilisateur";
+$lang['user_status_admin'] = "Administrateur";
+$lang['user_status_generic'] = "Générique";
+$lang['user_status_guest'] = "Invité";
+$lang['user_status_normal'] = "Visiteur";
+$lang['user_status_webmaster'] = "Webmestre";
+$lang['Virtual album'] = 'Album virtuel';
+$lang['Waiting'] = "En attente";
+$lang['default'] = "par défaut";
+$lang['Toggle \'default group\' property'] = "Inverser la propriété 'groupe par défaut'";
+$lang['Advanced features'] = "Fonctions avancées";
+$lang['Overall'] = "Vue globale";
+$lang['Year'] = "Année";
+$lang['Month'] = "Mois";
+$lang['Day'] = "Jour";
+$lang['Pages seen'] = "Pages vues";
+$lang['Time'] = "Heure";
+$lang['IP'] = "IP";
+$lang['Element'] = "Elément";
+$lang['Section'] = "Section";
+$lang['An information email was sent to group "%s"'] = "Un mail d'informations a été envoyé aux membres du groupe \"%s\"";
+$lang['Send an information email to group members'] = "Envoyer un mail d'informations aux membres d'un groupe";
+$lang['Group'] = "Groupe";
+$lang['[%s] Visit album %s'] = '[%s] Venez visiter l\'album %s';
+$lang['Hello,'] = "Bonjour,";
+$lang['See you soon.'] = "A bientôt.";
+$lang['Discover album:'] = 'Venez découvrir l\'album:';
+$lang['Mail content'] = "Contenu du mail";
+$lang['none'] = "aucun";
+$lang['high'] = "high";
+$lang['other'] = "autre";
+$lang['Element type'] = "Type d'élément";
+$lang['Image id'] = "Identifiant image";
+$lang['Summary'] = "Résumé";
+$lang['%d line filtered'] = "%d ligne filtrée";
+$lang['%d lines filtered'] = "%d lignes filtrées";
+$lang['%d guest'] = "%d invité";
+$lang['%d guests'] = "%d invités";
+$lang['Hour'] = "Heure";
+$lang['guest'] = "invité";
+$lang['default values'] = "valeurs par défaut";
+$lang['Guest cannot be deleted'] = "L'invité ne peut pas être supprimé";
+$lang['Default user cannot be deleted'] = "L'utilisateur par défaut ne peut pas être supprimé";
+$lang['Purge history detail'] = "Purger le détail de l'historique";
+$lang['Purge history summary'] = "Purger le récapitulatif de l'historique";
+$lang['Check integrity'] = "Contrôle d'intégrité";
+$lang['Anomaly'] = "Anomalie";
+$lang['Correction'] = "Correction";
+$lang['Automatic correction'] = "Correction automatique";
+$lang['Impossible automatic correction'] = "Correction automatique impossible";
+$lang['Correction applied with success'] = "Correction appliquée avec succès";
+$lang['Correction applied with error'] = "Correction appliquée avec erreur";
+$lang['%d anomaly has been detected.'] = "%d anomalie a été détectée.";
+$lang['%d anomalies have been detected.'] = "%d anomalies ont été détectées.";
+$lang['%d anomaly has been corrected.'] = "%d anomalie a été corrigée.";
+$lang['%d anomalies have been detected corrected.'] = "%d anomalies ont été détectées et corrigées.";
+$lang['%d anomaly has not been corrected.'] = "%d anomalie n'a pu être corrigée.";
+$lang['%d anomalies have not been corrected.'] = "%d anomalies n'ont pu être corrigées.";
+$lang['Go to %s or %s for more informations'] = "Allez sur %s ou %s pour plus d'informations";
+$lang['the forum'] = "le forum";
+$lang['the wiki'] = "le wiki";
+$lang['%s value is not correct file because exif are not supported'] = "La valeur de %s est incorrecte parce que les exif ne sont pas supportés";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s doit être mis à \"false\" dans votre fichier local/config/config.inc.php";
+$lang['Main "guest" user does not exist'] = "L'utilisateur \"invité\" principal n'existe plus";
+$lang['Main "guest" user status is incorrect'] = "Le statut de l'utilisateur \"invité\" principal est incorrect";
+$lang['Default user does not exist'] = "L'utilisateur par défaut n'existe pas";
+$lang['Main "webmaster" user does not exist'] = "L'utilisateur \"webmestre\" principal n'existe pas";
+$lang['Main "webmaster" user status is incorrect'] = "Le statut de l'utilisateur \"webmestre\" principal est incorrect";
+$lang['User "%s" created with "%s" like password'] = "Utilisateur \"%s\" créé avec le mot de passe \"%s\"";
+$lang['Status of user "%s" updated'] = "Statut de l'utilisateur \"%s\" mis à jour";
+$lang['add new photos to caddie'] = "Ajouter les nouvelles photos au panier";
+$lang['No display'] = "Pas d'affichage";
+$lang['Classic display'] = "Affichage classique";
+$lang['Hoverbox display'] = "Affichage lors du survol";
+$lang['Mail address is obligatory for all users'] = "L'adresse mail est obligatoire pour tous les utilisateurs";
+$lang['Minimum privacy level'] = "Niveau minimal de confidentialité";
+$lang['Privacy level'] = "Niveau de confidentialité";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "Contacts";
+$lang['Level 2'] = "Amis";
+$lang['Level 4'] = "Famille";
+$lang['Level 8'] = "Admins";
+$lang['Reinitialize check integrity'] = "Réinitialiser les contrôles d'intégrité";
+$lang['Check all'] = "Tout cocher";
+$lang['Uncheck all'] = "Tout décocher";
+$lang['Check automatic corrections'] = "Cocher les corrections automatiques";
+$lang['Apply selected corrections'] = "Appliquer les corrections sélectionnées";
+$lang['Ignore selected anomalies'] = "Ignorer les anomalies sélectionnées";
+$lang['Refresh'] = "Rafraîchir";
+$lang['The anomaly will be ignored until next application version'] = "L'anomalie sera ignorée jusqu'à la prochaine version de l'application";
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = "L'anomalie ne sera plus ignorée du fait de sa correction";
+$lang['%d anomaly has been ignored.'] = "%d anomalie a été ignorée.";
+$lang['%d anomalies have been ignored.'] = "%d anomalies ont été ignorées.";
+$lang['Plugins which need upgrade'] = "Plugins à mettre à jour";
+$lang['Plugin list'] = "Liste des plugins";
+$lang['Check for updates'] = "Rechercher les mises à jour";
+$lang['Other plugins'] = "Autres plugins disponibles";
+$lang['Last revisions'] = "Dernières révisions";
+$lang['Are you sure you want to delete this plugin?'] = "Etes-vous sûr de vouloir supprimer ce plugin?";
+$lang['Are you sure you want to install this plugin?'] = "Etes-vous sûr de vouloir installer ce plugin?";
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "Etes-vous sur de vouloir installer cette mise à jour? Vous devez vérifiez que cette mise à jour ne nécessite pas de désinstallation préalable.";
+$lang['Plugin has been successfully copied'] = "Le plugin a été copié avec succès.";
+$lang['You might go to plugin list to install and activate it.'] = "Rendez-vous dans la liste des plugins pour l'installer et l'activer.";
+$lang['Can\'t create temporary file.'] = "Impossible de créer un fichier temporaire.";
+$lang['Can\'t download archive.'] = "Impossible de télécharger l'archive.";
+$lang['Can\'t read or extract archive.'] = "Impossible de lire ou d'extraire l'archive.";
+$lang['An error occured during extraction (%s).'] = "Une erreur est survenue pendant l'extraction des fichiers (%s).";
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "Vérifiez les permissions du dossier \"plugins\" et de ses sous-dossiers (CHMOD).";
+$lang['Can\'t connect to server.'] = "Impossible de se connecter au serveur.";
+$lang['Purge compiled templates'] = "Purger les templates compilés";
+$lang['ACCESS_0'] = "Accès libre";
+$lang['ACCESS_1'] = "Accès à tous";
+$lang['ACCESS_2'] = "Accès aux utilisateurs inscrits";
+$lang['ACCESS_3'] = "Accès aux administrateurs";
+$lang['ACCESS_4'] = "Accès aux webmestres";
+$lang['ACCESS_5'] = "Pas d'accès";
+$lang['Support'] = "Support";
+$lang['Documentation'] = "Documentation";
+$lang['A new version of Piwigo is available.'] = "Une nouvelle version de Piwigo est disponible.";
+$lang['Piwigo Administration'] = "Administration de Piwigo";
+$lang['Piwigo version'] = "Version de Piwigo";
+$lang['You are running the latest version of Piwigo.'] = "Vous utilisez la dernière version de Piwigo.";
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = "La version de %s [%s] installée est incompatible avec la version requise [%s]";
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "Vous devez mettre à jour votre système pour profiter pleinement de l'application, sinon l'application ne fonctionnera pas correctement, voire pas du tout";
+$lang['Deleted on'] = "Supprimés sur";
+$lang['Last hit'] = "dernier score";
+$lang['GD library is missing'] = "la bibliothèque GD est manquante";
+$lang['Templates'] = "Templates (modèles)";
+$lang['Extend for templates'] = "Etendre les templates";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "Remplacement des templates d'origine par vos templates personnalisés issus du dossier template-extension";
+$lang['Replacers (customized templates)'] = "Remplaçants (templates modifiés)";
+$lang['Original templates'] = "Templates d'origine";
+$lang['Orphan tags deleted'] = 'Tags orphelins supprimés';
+$lang['Optional URL keyword'] = "Paramètre facultatif de l'URL";
+$lang['Templates configuration has been recorded.'] = "La configuration des templates a été enregistrée.";
+$lang['All optimizations have been successfully completed.'] = "Toutes les optimisations ont été réalisées avec succès.";
+$lang['Optimizations have been completed with some errors.'] = "Les optimisations réalisées comportent certaines erreurs.";
+$lang['Modify information'] = "Modifier les informations";
+$lang['nothing'] = "Rien";
+$lang['overrides existing values with empty ones'] = "Ecraser les données existantes avec des données vides";
+$lang['Manage photo ranks'] = 'Gérer l\'ordre des photos';
+$lang['Edit ranks'] = "Modifier l'ordre (le rang)";
+$lang['No photo in this album'] = 'Aucune photo dans cet album';
+$lang['Images manual order was saved'] = "L'ordre manuel des images a été sauvegardé";
+$lang['ranks'] = "rangs";
+$lang['By rank'] = "Par le rang";
+$lang['Manual order'] = 'Ordre manuel';
+$lang['Drag to re-order'] = "Cliquer-glisser pour ré-organiser";
+$lang['Quick Local Synchronization'] = "Synchronisation Rapide";
+$lang['No photo can be deleted'] = "Aucune photo ne peut être supprimée";
+$lang['Delete selected photos'] = "Supprimer les photos sélectionnées";
+$lang['%d photo was deleted'] = "%d photo a été supprimée";
+$lang['%d photos were deleted'] = "%d photos ont été supprimées";
+$lang['Downloads'] = "Téléchargements";
+$lang['Released on'] = "Publié le";
+$lang['Number of downloads'] = "Nombre de téléchargements";
+$lang['Piwigo Announcements Newsletter'] = "Newsletter Piwigo";
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = "Gardez le contact avec le projet Piwigo, abonnez-vous à la newsletter. Vous recevrez un email lorsqu'une nouvelle version est disponible (parfois un bug de sécurité est corrigé, il est important de le savoir et de mettre à jour) ou qu'un événement majeur survient sur le projet. Quelques messages par an seulement.";
+$lang['Subscribe %s'] = "Abonner %s";
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = "Abonner %s à la newsletter Piwigo";
+$lang['Purge search history'] = "Purger l'historique des recherches";
+$lang['Hide'] = "Masquer";
+$lang['Password is missing. Please enter the password.'] = "Le mot de passe manque. Veuillez saisir le mot de passe.";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "La confirmation du mot de passe manque. Veuillez confirmer le mot de passe choisi.";
+$lang['Allow users to edit their own comments'] = "Autoriser les utilisateurs à modifier leurs propres commentaires";
+$lang['Allow users to delete their own comments'] = "Autoriser les utilisateurs à supprimer leurs propres commentaires";
+$lang['Email administrators when a comment is modified'] = "Notifier les administrateurs quand un commentaire est modifié";
+$lang['Email administrators when a comment is deleted'] = "Notifier les administrateurs quand un commentaire est supprimé";
+$lang['Cannot delete the old permalink !'] = "Impossible de supprimer cet ancien lien permanent !";
+$lang['Hit'] = "score";
+$lang['Tools'] = "Outils";
+$lang['Photos'] = "Photos";
+$lang['Themes'] = "Thèmes";
+$lang['Instructions to use Piwigo'] = "Instructions pour utiliser Piwigo";
+$lang['Installed Themes'] = "Thèmes installés";
+$lang['Add New Theme'] = "Ajouter un thème";
+$lang['Forbid this theme to users'] = "Interdire ce thème aux utilisateurs";
+$lang['Set as default theme for unregistered and new users'] = "Thème par défaut pour les invités et les nouveaux utilisateurs";
+$lang['unknown'] = 'inconnu';
+$lang['Upload Photos'] = 'Ajoutez des photos';
+$lang['Drop into album'] = 'Choisir un album';
+$lang['+ Add an upload box'] = '+ Ajouter une autre boîte de transfert';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Créez le répertoire "%s" à la racine de votre installation Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Donnez les droits en écriture (chmod 777) sur le répertoire "%s" à la racine de votre installation Piwigo';
+$lang['existing album'] = 'album existant';
+$lang['create a new album'] = 'créer un nouvel album';
+$lang['Album name'] = 'Nom de l\'album';
+$lang['Album "%s" has been added'] = 'l\'album "%s" a été ajouté';
+$lang['Uploaded Photos'] = 'Photos ajoutées ';
+$lang['%d photos uploaded'] = '%d photos ajoutées';
+$lang['Privacy level set to "%s"'] = 'Niveau de confidentialité "%s"';
+$lang['Album "%s" now contains %d photos'] = 'l\'album "%s" contient désormais %d photos';
+$lang['Manage this set of %d photos'] = 'Gérer ce lot de %d photos';
+$lang['Select files'] = 'Choisir des fichiers';
+$lang['Everybody'] = 'Tout le monde';
+$lang['Who can see these photos?'] = 'Qui peut voir ces photos ?';
+$lang['Who can see this photo?'] = 'Qui peut voir cette photo ?';
+$lang['Settings'] = 'Configuration';
+$lang['Resize'] = 'Redimensionner';
+$lang['Maximum Width'] = 'Largeur maximum';
+$lang['pixels'] = 'pixels';
+$lang['Maximum Height'] = 'Hauteur maximum';
+$lang['Image Quality'] = 'Qualité d\'image';
+$lang['Thumbnail'] = 'Miniature';
+$lang['Save Settings'] = 'Enregistrer les paramètres';
+$lang['Your configuration settings are saved'] = 'Vos paramètres de configuration sont enregistrés';
+$lang['Active Themes'] = 'Thèmes activés';
+$lang['Add write access to the "%s" directory'] = 'Ajoutez l\'accès en écriture pour le répertoire "%s"';
+$lang['Administration Home'] = 'Accueil administration';
+$lang['Change Admin Colors'] = 'Modifier les couleurs de l\'administration';
+$lang['Delete this theme'] = 'Supprimer ce thème';
+$lang['Directory does not exist'] = 'Le répertoire n\'existe pas';
+$lang['Download,'] = 'Téléchargez,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronisation';
+$lang['Get Support on Piwigo Forum'] = 'Obtenir de l\'aide sur le forum Piwigo';
+$lang['Help Me'] = 'A l\'aide';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'L\'activation de ce thème est impossible, car le thème parent est manquant : %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ce thème ne peut être supprimé, car d\'autres thème dépendent de lui : %s';
+$lang['Inactive Themes'] = 'Thèmes désactivés';
+$lang['Install on your computer,'] = 'Installez sur votre ordinateur,';
+$lang['Make this theme available to users'] = 'Rendre ce thème disponible aux utilisateurs';
+$lang['Page end'] = 'Fin de la page';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Lire la documentation Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Démarrez pLoader et ajoutez vos photos.';
+$lang['Switch to clear or dark colors for administration'] = 'Choisir des couleurs claires ou sombres pour l\'administration';
+$lang['Theme has been successfully installed'] = 'Le thème a été installé avec succès';
+$lang['Visit Gallery'] = 'Visiter la galerie';
+$lang['Visit Piwigo project website'] = 'Visiter le site web du projet Piwigo';
+$lang['Guest Settings'] = 'Paramètres invité';
+$lang['Main Page'] = 'Page principale';
+$lang['Photo Page'] = 'Page de la photo';
+$lang['Activate Navigation Bar'] = 'Activer la barre de navigation';
+$lang['Activate Navigation Thumbnails'] = 'Activer les miniatures de navigation';
+$lang['Activate icon "%s"'] = 'Activer l\'icône "%s"';
+$lang['Photo Properties'] = 'Propriétés de la photo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader signifie <em>Piwigo Uploader</em>. Depuis votre ordinateur, pLoader prépare vos photos et les transfère vers votre galerie photo Piwigo.';
+$lang['Languages'] = 'Langues';
+$lang['Installed Languages'] = 'Langues installées';
+$lang['Add New Language'] = 'Ajouter une langue';
+$lang['Language has been successfully installed'] = 'La langue a été installée avec succès';
+$lang['Allow user customization'] = "Permettre la personnalisation de l'affichage";
+$lang['Select:'] = 'Sélectionner :';
+$lang['None'] = 'Rien';
+$lang['Invert'] = 'Inverser';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Impossible de désactiver ce thème, il doit rester au moins un thème activé.';
+$lang['Webmaster status is required.'] = 'Vous devez avoir le status de "webmaster".';
+$lang['Bound Theme'] = 'Thème rattaché';
+$lang['Allow rating'] = "Permettre les notations";
+$lang['Select at least one comment'] = 'Sélectionnez au moins un commentaire';
+$lang['Active Plugins'] = 'Plugins activés';
+$lang['Inactive Plugins'] = 'Plugins désactivés';
+$lang['Missing Plugins'] = 'Plugins manquants';
+$lang['Uninstalled Plugins'] = 'Plugins non installés';
+$lang['By %s'] = 'Par %s';
+$lang['Visit plugin site'] = 'Visitez le site du plugin';
+$lang['Active Languages'] = 'Langues activées';
+$lang['Delete this language'] = 'Supprimer cette langue';
+$lang['Forbid this language to users'] = 'Interdire cette langue aux utilisateurs';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossible de désactiver cette langue, commencez par définir une autre langue par défaut.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossible de désactiver cette langue, il doit rester au moins une langue.';
+$lang['Inactive Languages'] = 'Langues désactivées';
+$lang['Make this language available to users'] = 'Rendre cette langue disponible aux utilisateurs';
+$lang['Set as default language for unregistered and new users'] = 'Langue par défaut pour les invités et les nouveaux utilisateurs';
+$lang['Add Photos'] = 'Ajouter des photos';
+$lang['Miscellaneous'] = 'Divers';
+$lang['The following tag was deleted'] = 'Le tag suivant a été supprimé';
+$lang['Virtual Links'] = 'Liens virtuels';
+$lang['There is no other language available.'] = 'Il n\'y a pas d\'autre langue disponible.';
+$lang['There is no other plugin available.'] = 'Il n\'y a pas d\'autre plugin disponible.';
+$lang['There is no other theme available.'] = 'Il n\'y a pas d\'autre thème disponible.';
+$lang['delete'] = 'effacer';
+$lang['Add another set of photos'] = 'Ajouter d\'autres photos';
+$lang['Order of menubar items has been updated successfully.'] = 'L\'ordre des éléments du menu a été mis à jour avec succès.';
+$lang['This theme was not designed to be directly activated'] = 'Ce thème n\'est pas conçu pour être activé directement';
+$lang['Pending Comments'] = 'Commentaires en attente';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Dans votre fichier php.ini, la variable upload_max_filesize (%sB) est plus grande que post_max_size (%sB), vous devriez modifier ce paramétrage';
+$lang['Exif extension not available, admin should disable exif use'] = 'L\'extension Exif n\'est pas disponible, un administrateur devrait désactiver l\'utilisation des métadonnées Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Le poids du fichier transféré dépasse la valeur de upload_max_filesize définie dans votre fichier php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Le poids total des fichiers transférés dépasse la valeur de post_max_size dans votre fichier php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Le poids du fichier transféré dépasse la valeur de MAX_FILE_SIZE définie dans le formulaire HTML';
+$lang['The uploaded file was only partially uploaded'] = 'Le fichier n\'a été que partiellement transféré';
+$lang['No file was uploaded'] = 'Aucun fichier n\'a été transféré';
+$lang['Missing a temporary folder'] = 'Impossible de trouver le répertoire temporaire';
+$lang['Failed to write file to disk'] = 'Échec à l\'écriture du fichier sur le serveur';
+$lang['File upload stopped by extension'] = 'Le transfert du fichier a été arrêté par une extension';
+$lang['Unknown upload error'] = 'Erreur inconnue survenue lors du transfert';
+$lang['Error on file "%s" : %s'] = 'Erreur sur le fichier "%s" : %s';
+$lang['Menu Management'] = 'Menus';
+$lang['automatic order'] = 'ordre automatique';
+$lang['manual order'] = 'ordre manuel';
+$lang['Albums automatically sorted'] = 'Les albums ont été triés automatiquement';
+$lang['The original maximum width must be a number between %d and %d'] = 'La largeur maximum pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'La hauteur maximum pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['The original image quality must be a number between %d and %d'] = 'La qualité d\'image pour le redimensionnement de la photo originale doit être un chiffre compris entre %d et %d';
+$lang['Batch Manager'] = 'Gestion par lot';
+$lang['include child albums'] = 'inclure les sous-albums';
+$lang['Selection'] = 'Sélection';
+$lang['Action'] = 'Action';
+$lang['Set author'] = 'Définir l\'auteur';
+$lang['Set title'] = 'Définir le titre';
+$lang['Set creation date'] = 'Définir la date de création';
+$lang['Apply action'] = 'Appliquer l\'action';
+$lang['on the %d selected photos'] = 'sur les %d photos sélectionnées';
+$lang['%d of %d photos selected'] = '%d photos sur %d sont sélectionnées';
+$lang['No photo selected, %d photos in current set'] = 'Aucune photo sélectionnée parmi les %d photos du lot';
+$lang['All %d photos are selected'] = 'Toutes les %d photos du lot sont sélectionnées';
+$lang['remove this filter'] = 'supprimer ce filtre';
+$lang['Duplicates'] = 'Doublons';
+$lang['Add a filter'] = 'Ajouter un filtre';
+$lang['Remove all filters'] = 'Supprimer tous les filtres';
+$lang['Refresh photo set'] = 'Rafraîchir le lot de photos';
+$lang['The whole page'] = 'Toute la page';
+$lang['The whole set'] = 'Tout le lot';
+$lang['No photo in the current set.'] = 'Aucune photo dans le lot.';
+$lang['No photo selected, no action possible.'] = 'Aucune photo sélectionnée, aucune action possible.';
+$lang['Choose an action'] = 'Choisir une action';
+$lang['remove author'] = 'supprimer l\'auteur';
+$lang['Type here the author name'] = 'Entrez ici le nom de l\'auteur';
+$lang['remove title'] = 'supprimer le titre';
+$lang['Type here the title'] = 'Entrez ici le titre';
+$lang['remove creation date'] = 'supprimer la date de création';
+$lang['Week starts on'] = 'La semaine commence le';
+$lang['You have %d orphan tags: %s.'] = 'Vous avez %d tags orphelins: %s.';
+$lang['Delete orphan tags'] = 'Supprimer les tags orphelins';
+$lang['delete photo'] = 'supprimer la photo';
+$lang['Remove from caddie'] = 'Retirer du panier';
+$lang['Themes which need upgrade'] = 'Thèmes à mettre à jour';
+$lang['Languages which need upgrade'] = 'Langues à mettre à jour';
+$lang['All themes are up to date.'] = 'Tous les thèmes sont à jour.';
+$lang['All plugins are up to date.'] = 'Tous les plugins sont à jour.';
+$lang['All languages are up to date.'] = 'Toutes les langues sont à jour.';
+$lang['Visit theme site'] = 'Visitez le site du thème';
+$lang['Visit language site'] = 'Visitez le site de la langue';
+$lang['New Version'] = 'Nouvelle version';
+$lang['Obsolete Plugins'] = 'Plugins obsolètes';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATTENTION! Ce plugin n\'a pas l\'air d\'être compatible avec votre version de Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Voulez-vous l\'activer quand même?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'CE PLUGIN FAIT DÉSORMAIS PARTIE DU CORE DE PIWIGO! SUPPRIMEZ-LE.';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERREUR: CE PLUGIN EST MANQUANT MAIS TOUJOURS INSTALLÉ! DÉSINSTALLEZ-LE.';
+$lang['display'] = 'Afficher';
+$lang['Restore'] = "Restaurer";
+$lang['Restore default configuration. You will lose your plugin settings!'] = "Restaurer la configuration par défaut? Vous perdrez vos réglages personnels !";
+$lang['Thumbnails generation in progress...'] = 'Génération des miniatures en cours...';
+$lang['Photos generation in progress...'] = 'Génération des photos en cours...';
+$lang['%s photos have been regenerated'] = '%s photos ont été régénérées';
+$lang['%s photos can not be regenerated'] = '%s photos ne peuvent pas être régénérées';
+$lang['Updates'] = 'Mises à jour';
+$lang['Update in progress... Please wait.'] = 'Mise à jour en cours... Veuillez patienter.';
+$lang['Ignore this update'] = 'Ignorer cette mise à jour';
+$lang['Reset ignored updates'] = 'Réinitialiser les mises à jour ignorées';
+$lang['Update All'] = 'Tout mettre à jour';
+$lang['ERROR'] = 'ERREUR';
+$lang['Update Complete'] = 'Mise à jour effectuée';
+$lang['Piwigo Update'] = 'Mise à jour de Piwigo';
+$lang['Extensions Update'] = 'Mise à jour des extensions';
+$lang['All extensions are up to date.'] = 'Toutes les extensions sont à jour.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Les plugins suivants ne seront peut-être pas compatibles avec la nouvelle version de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Les thèmes suivants ne seront peut-être pas compatibles avec la nouvelle version de Piwigo:';
+$lang['I decide to update anyway'] = 'Je décide de migrer quand même';
+$lang['Update to Piwigo %s'] = 'Mettre à jour vers Piwigo %s';
+$lang['Two updates are available'] = 'Deux mises à jour sont disponibles';
+$lang['This is a minor update, with only bug corrections.'] = 'Ceci est une mise à jour mineure, avec uniquement des corrections de bugs.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Ceci est une mise à jour majeure, qui contient <a href="%s">un tas de nouveautés</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Certains thèmes ou plugins ne sont peut-être pas encore disponibles.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Vous pouvez mettre à jour vers Piwigo %s directement, sans passer par Piwigo %s (recommandé).';
+$lang['Save Template Directory'] = 'Sauvegarder le dossier template';
+$lang['Dump Database'] = 'Sauvegarder la base de données';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inclure les données de l\'historique (Attention: risque de dépassement de la limite mémoire du serveur)';
+$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...'] = 'Veuillez patienter...';
+$lang['Ignore All'] = 'Tout ignorer';
+$lang['Crop'] = 'Retailler';
+$lang['Width'] = 'Largeur';
+$lang['Height'] = 'Hauteur';
+$lang['Follow Orientation'] = "Respecter l'orientation";
+$lang['Graphics Library'] = 'Bibliothèque graphique';
+$lang['Show menubar'] = 'Afficher le menu';
+$lang['No results'] = 'Pas de résultat';
+$lang['Type in a search term'] = 'Entrez un terme de recherche';
+$lang['Searching...'] = 'Recherche...';
+$lang['new'] = 'nouveau';
+$lang['Default photos order'] = "Ordre par défaut des photos";
+$lang['Activate icon "new" next to albums and pictures'] = 'Afficher l\'icône "nouveau" à côté des albums et des photos';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Vous ne pouvez définir l\'ordre par défaut des photos car vous avez un paramètre personnalisé dans votre configuration locale.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Vous avez spécifié <i>$conf[\'order_by\']</i> dans votre fichier de configuration, ce paramètre est obsolète, veuillez le supprimer ou le renommer en <i>$conf[\'order_by_custom\']</i> !';
+$lang['Add a criteria'] = 'Ajouter un critère';
+$lang['... or '] = '... ou bien ';
+$lang['Create'] = 'Créer';
+$lang['Start Upload'] = 'Démarrer le transfert';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Vous utilisez le formulaire Flash. Des problèmes ? Essayez le <a href="%s">formulaire HTML</a> à la place.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Vous utilisez le formulaire HTML. Essayez le <a href="%s">formulaire Flash</a> à la place.';
+$lang['Maximum file size: %sB.'] = 'Poids maximum des fichiers : %sB.';
+$lang['Allowed file types: %s.'] = 'Types de fichiers autorisés : %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Résolution maximum approximative : %dM pixels (soit %dx%d pixels).';
+$lang['Manage Permissions'] = 'Gérer les permissions';
+$lang['Photo %s of %s'] = 'Photo %s sur %s';
+$lang['show details'] = 'montrer les détails';
+$lang['hide details'] = 'cacher les détails';
+$lang['Merge tags'] = 'Fusionner les tags';
+$lang['Select the destination tag'] = 'Sélectionnez le tag de destination';
+$lang['(this tag will be deleted)'] = '(ce tag sera supprimé)';
+$lang['Confirm merge'] = 'Confirmez la fusion';
+$lang['Merge selected tags'] = 'Fusionner les tags sélectionnés';
+$lang['No destination tag selected'] = 'Vous n\'avez pas sélectionné de tag de destination';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Les tags <em>%s</em> ont été fusionnés dans le tag <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Sélectionnez au moins deux tags pour la fusion';
+$lang['Average rate'] = 'Note moyenne';
+$lang['Rate'] = 'Note';
+$lang['Learn more'] = 'En savoir plus';
+$lang['Select an album'] = 'Selectionnez un album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Par défaut, Piwigo créera la nouvelle taille web à partir de la HD (haute définition).';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Si la HD n\'est pas disponible et que la version actuelle de la taille web est plus grande que les dimensions ci-dessous, alors Piwigo la considérera comme HD et créera la nouvelle taille web à partir de celle-ci.';
+$lang['An error has occured during upgrade.'] = 'Une erreur est survenue pendant la mise à jour.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Impossible d\'extraire les fichiers. Veuillez vérifier les permissions des fichiers de votre installation.<br><a href="%s">Cliquez ici pour voir le rapport d\'erreur</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne peut pas récupérer le fichier de mise à jour depuis le serveur';
+$lang['Last import'] = 'Dernier import';
+$lang['With no album'] = 'Sans album';
+$lang['With no tag'] = 'Sans tag';
+$lang['With no virtual album'] = 'Sans album virtuel';
+$lang['Predefined filter'] = 'Filtre prédéfini';
+$lang['Add tags'] = "Ajouter les tags";
+$lang['Synchronize metadata'] = "Synchroniser les méta-données";
+$lang['Add to caddie'] = 'Ajouter au panier';
+$lang['Zoom'] = 'Zoom';
+$lang['Resize after upload'] = 'Redimensionner après transfert';
+$lang['Original Size'] = 'Taille originale';
+$lang['Send connection settings by email'] = 'Envoyer les identifiants par email';
+$lang['Activate comments'] = 'Activer les commentaires';
+$lang['Default comments order'] = 'Ordre par défaut des commentaires';
+$lang['A locked gallery is only visible to administrators'] = 'Une galerie verrouillée n\'est visible que des administrateurs';
+$lang['Unlock gallery'] = 'Déverouiller la galerie';
+$lang['Gallery unlocked'] = 'Galerie déverouillée';
+$lang['Notify administrators when a comment is'] = 'Notifier les administrateurs lorsqu\'un commentaire est';
+$lang['modified'] = 'modifié';
+$lang['deleted'] = 'supprimé';
+$lang['pending validation'] = 'en attente de validation';
+$lang['Save visits in history for'] = 'Historiser les visites des ';
+$lang['simple visitors'] = 'simple visiteurs';
+$lang['registered users'] = 'utilisateurs enregistrés';
+$lang['administrators'] = 'administrateurs';
+$lang['This album contains %d photos, added on %s.'] = 'Cet album contient %d photos, ajoutées le %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Cet album contient %d photos, ajoutées entre le %s et le %s.';
+$lang['This album contains no photo.'] = 'Cet album ne contient pas de photo.';
+$lang['%s has been successfully updated.'] = '%s a été mis à jour avec succès.';
+$lang['Move to album'] = 'Déplacer vers l\'album';
+$lang['You can activate only one mobile theme.'] = 'Vous ne pouvez activer qu\'un seul thème mobile.';
+$lang['Center of interest'] = 'Centre d\'interêt';
+$lang['Not cropped correctly?'] = 'La photo n\'est pas recadrée correctement ?';
+$lang['Photo name'] = 'Nom de la photo';
+$lang['Automatic sort order'] = 'Ordre de tri automatique';
+$lang['apply automatic sort order'] = 'appliquer un ordre de tri automatique';
+$lang['Save manual order'] = 'Sauvegarder l\'ordre manuel';
+$lang['cancel manual order'] = 'annuler l\'ordre manuel';
+$lang['Cancel'] = 'Annuler';
+$lang['List'] = 'Liste';
+$lang['Web Form'] = 'Formulaire web';
+$lang['Applications'] = 'Applications';
+$lang['Available versions for'] = 'Versions disponibles pour';
+$lang['Available on'] = 'Disponible sur';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo pour iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'L\'application <em>Piwigo pour iOS</em> vous permet de connecter votre iPhone, iPad ou iPod Touch à votre galerie Piwigo pour y créer des albums et envoyer plusieurs photos à la fois.';
+$lang['Piwigo for Android'] = 'Piwigo pour Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'L\'application <em>Piwigo pour Android</em> vous permet de connecter votre smartphone ou votre tablette Android à votre galerie Piwigo pour y créer des albums et envoyer plusieurs photos à la fois.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin de publication Piwigo pour Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom est un logiciel de photographie conçu pour gérer d\'importantes collections de photos numériques et les post-traiter.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Le plugin de publication Piwigo pour Lightroom vous permet d\'exporter et synchroniser vos photos de Lightroom vers votre galerie Piwigo.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Plugin de publication Piwigo pour Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell est un gestionnaire de photos opensource pour Linux. Il a été sélectionné comme gestionnaire par défaut sur Ubuntu et Fedora.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Sur votre Linux, installez simplement Shotwell avec votre gestionnaire de paquet et activez l\'option de publication Piwigo.';
+$lang['Piwigo publish plugin for digiKam'] = 'Plugin de publication Piwigo pour digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam est un logiciel libre de gestion avancée de photos numériques pour Linux, Windows et MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam est conçu pour les photographes qui souhaitent visualiser, gérer, éditer, améliorer, organiser, tagger et partager leurs photos.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Pour exporter vos photos de digiKam vers Piwigo, installez simplement digiKam et les kipi-plugins.';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin d\'export Piwigo export pour iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto est le gestionnaire de photos disponible par défaut sur MacOSX. Le plugin d\'export Piwigo se connecter à votre galerie Piwigo et vous permet de créer des albums et d\'y ajouter vos photos.';
+$lang['Piwigo export plugin for Aperture'] = 'Plugin d\'export Piwigo pour Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture est un outil puissant pour post-traiter vos photos et gérer votre photothèque sur Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture est conçu pour les photographes professionnels avec la simplicité d\'iPhoto.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Le plugin d\'export Piwigo vous permet de créer des albums et d\'y ajouter vos photos.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery Android) est un client libre (GPL v3) pour Piwigo sur Android.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Ses fonctionnalités incluent la navigation sur la galerie, la création d\'albums et l\'ajout de photos.';
+$lang['any visitor can see this album'] = 'n\'importe quel visiteur peut voir cet album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'les visiteurs doivent se connecter et avoir les permissions nécessaires pour voir cet album';
+$lang['Groups and users'] = 'Groupes et utilisateurs';
+$lang['Permission granted for groups'] = 'Permission accordée pour les groupes';
+$lang['Select groups...'] = 'Sélectionnez les groupes...';
+$lang['There is no group in this gallery.'] = 'Il n\'y a pas de groupe dans cette galerie.';
+$lang['Permission granted for users'] = 'Permission accordée pour les utilisateurs';
+$lang['Select users...'] = 'Sélectionnez les utilisateurs...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u utilisateurs ont automatiquement la permission car ils appartiennent à un groupe autorisé.';
+$lang['include photos with lower privacy level'] = 'inclure les photos d\'un niveau de confidentialité inférieur';
+$lang['No group is permitted to see this private album'] = 'Aucun groupe n\'est autorisé à voir cet album privé';
+$lang['Permission management'] = 'Gestion des permissions';
+$lang['Photo sizes with crop'] = 'Tailles de photo avec retaillage';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Le centre d\'intérêt est la zone la plus représentative de la photo.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Pour les tailles de photo avec retaillage, comme la taille "Carré", Piwigo essaiera d\'inclure au mieux ce centre d\'intérêt.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Par défaut, le centre d\'intérêt est placé au milieu de la photo.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Sélectionnez une zone avec votre souris pour définir un nouveau centre d\'intérêt.';
+$lang['custom'] = 'Personnalisé';
+$lang['Delete multiple size images'] = 'Supprimer les tailles multiples des photos';
+$lang['Generate multiple size images'] = 'Générer les tailles multiples des photos';
+$lang['add a new watermark'] = 'Ajouter un nouveau filigrane';
+$lang['Apply watermark if height is bigger than'] = 'Appliquer le filigrane si la hauteur est supérieure à';
+$lang['Apply watermark if width is bigger than'] = 'Appliquer le filigrane si la largeur est supérieure à';
+$lang['bottom left corner'] = 'coin inférieur gauche';
+$lang['bottom right corner'] = 'coin inférieur droit';
+$lang['middle'] = 'milieu';
+$lang['Opacity'] = 'Opacité';
+$lang['Select a file'] = 'Sélectionnez un fichier';
+$lang['top left corner'] = 'coin supérieur gauche';
+$lang['top right corner'] = 'coin supérieur droit';
+$lang['X Position'] = 'Position X';
+$lang['X Repeat'] = 'Répétition X';
+$lang['Y Position'] = 'Position Y';
+$lang['Multiple Size'] = 'Tailles multiples';
+?>
Index: tags/2.4.0RC3/language/fr_FR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Français [FR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=421
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Français';
+$lang_info['country'] = 'France';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'fr';
+$lang_info['zero_plural'] = false;
+
+$lang['%d album updated'] = '%d album mis à jour';
+$lang['%d albums updated'] = '%d albums mis à jour';
+$lang['%d comment to validate'] = '%d commentaire utilisateur à valider';
+$lang['%d comment'] = '%d commentaire';
+$lang['%d comments to validate'] = '%d commentaires utilisateurs à valider';
+$lang['%d comments'] = '%d commentaires';
+$lang['%d hit'] = 'vue %d fois';
+$lang['%d hits'] = 'vue %d fois';
+$lang['%d Kb'] = '%d Ko';
+$lang['%d new comment'] = '%d nouveau commentaire utilisateur';
+$lang['%d new comments'] = '%d nouveaux commentaires utilisateurs';
+$lang['%d new photo'] = '%d nouvelle photo';
+$lang['%d new photos'] = '%d nouvelles photos';
+$lang['%d new user'] = '%d nouvel utilisateur';
+$lang['%d new users'] = '%d nouveaux utilisateurs';
+$lang['%d photo is also linked to current tags'] = '%d photo est également liée aux tags courants';
+$lang['%d photo'] = '%d photo';
+$lang['%d photos are also linked to current tags'] = '%d photos sont également liées aux tags courants';
+$lang['%d photos'] = '%d photos';
+$lang['%d rates'] = '%d notes';
+$lang['(!) This comment requires validation'] = '(!) Ce commentaire doit être validé';
+$lang['... or browse your empty gallery'] = '... ou naviguez sur votre galerie vide';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ou désactivez ce message, je me débrouillerai par moi-même';
+$lang['A comment on your site'] = 'Un commentaire sur le site';
+$lang['About Piwigo'] = 'À propos de Piwigo';
+$lang['About'] = 'À propos';
+$lang['Accelerate diaporama speed'] = 'Accélerer la vitesse du diaporama';
+$lang['Add a comment'] = 'Ajouter un commentaire';
+$lang['add this photo to your favorites'] = 'ajouter cette photo à vos favoris';
+$lang['Admin: %s'] = 'Administration : %s';
+$lang['Administration'] = 'Administration';
+$lang['Album results for'] = 'Résultats des albums pour';
+$lang['Album'] = 'Album';
+$lang['Album: %s'] = 'Album : %s';
+$lang['Albums'] = 'Albums';
+$lang['All tags'] = 'Tous les tags';
+$lang['All'] = 'Tout';
+$lang['all'] = 'tout';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un administrateur doit valider votre commentaire pour qu\'il devienne visible.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Système anti-abus : merci de patienter avant d\'ajouter un nouveau commentaire';
+$lang['Any tag'] = 'N\'importe quel tag';
+$lang['Are you sure?'] = "Etes-vous sûr ?";
+$lang['ascending'] = 'croissant';
+$lang['At least one listed rule must be satisfied.'] = 'Au moins un des critères doit être satisfait.';
+$lang['Author'] = 'Auteur';
+$lang['author(s) : %s'] = 'auteur(s) : %s';
+$lang['Author: %s'] = 'Auteur : %s';
+$lang['Auto login'] = 'Connexion auto';
+$lang['available for administrators only'] = 'disponible uniquement pour les administrateurs';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Statut de l\'utilisateur "guest" non conforme, utilisation du statut par défaut. Veuillez prévenir le webmestre.';
+$lang['Best rated'] = 'Mieux notées';
+$lang['Browser: %s'] = 'Navigateur : %s';
+$lang['Calendar'] = 'Calendrier';
+$lang['Change my password'] = 'Changer mon mot de passe';
+$lang['Check your email for the confirmation link'] = 'Vérifiez vos emails pour trouver le lien de confirmation';
+$lang['chronology_monthly_calendar'] = 'Calendrier mensuel';
+$lang['chronology_monthly_list'] = 'Liste mensuelle';
+$lang['chronology_weekly_list'] = 'Liste hebdomadaire';
+$lang['Click here if your browser does not automatically forward you'] = 'Cliquez ici si votre navigateur ne vous redirige pas.';
+$lang['Click on the photo to see it in high definition'] = 'Cliquer sur la photo pour la visualiser en haute définition';
+$lang['Close this window'] = 'Fermer cette fenêtre';
+$lang['cloud'] = 'nuage';
+$lang['Comment by %s'] = 'Commentaire par %s';
+$lang['comment date'] = 'date du commentaire';
+$lang['Comment'] = 'Commentaire';
+$lang['Comment: %s'] = 'Commentaire : %s';
+$lang['Comments'] = 'Commentaires';
+$lang['Complete RSS feed (photos, comments)'] = 'Flux RSS complet (photos, commentaires)';
+$lang['Confirm Password'] = 'Confirmer le mot de passe';
+$lang['Connected user: %s'] = 'Utilisateur connecté : %s';
+$lang['Connection settings'] = 'Paramètres de connexion';
+$lang['Contact webmaster'] = 'Contacter le webmestre';
+$lang['Contact'] = 'Contacter';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Les cookies sont bloqués ou non supportés par votre navigateur web. Vous devez activer les cookies pour vous connecter.';
+$lang['Create a new account'] = 'Créer un nouveau compte';
+$lang['created after %s (%s)'] = 'créée après le %s (%s)';
+$lang['created before %s (%s)'] = 'créée avant le %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'créée entre le %s (%s) et le %s (%s)';
+$lang['created on %s'] = 'créée le %s';
+$lang['Created on'] = 'Créée le';
+$lang['Creation date'] = 'Date de création';
+$lang['Current password is wrong'] = 'Erreur sur le mot de passe actuel';
+$lang['customize the appareance of the gallery'] = 'personnaliser l\'apparence de la galerie';
+$lang['Customize'] = 'Personnaliser';
+$lang['Date'] = 'Date';
+$lang['day'][0] = 'Dimanche';
+$lang['day'][1] = 'Lundi';
+$lang['day'][2] = 'Mardi';
+$lang['day'][3] = 'Mercredi';
+$lang['day'][4] = 'Jeudi';
+$lang['day'][5] = 'Vendredi';
+$lang['day'][6] = 'Samedi';
+$lang['Default'] = 'Par défaut';
+$lang['delete all photos from your favorites'] = 'supprimer toutes les photos de vos favoris';
+$lang['delete this photo from your favorites'] = 'supprimer cette photo de vos favoris';
+$lang['Delete'] = 'Supprimer';
+$lang['descending'] = 'décroissant';
+$lang['Dimensions'] = 'Dimensions';
+$lang['display a calendar by creation date'] = 'afficher un calendrier par date de création';
+$lang['display a calendar by posted date'] = 'afficher un calendrier par date d\'ajout';
+$lang['display a set of random photos'] = 'afficher un ensemble de photos prises au hasard';
+$lang['display all photos in all sub-albums'] = 'afficher à plat les photos des albums et des sous-albums';
+$lang['display available tags'] = 'Voir les tags disponibles';
+$lang['display best rated photos'] = 'afficher les photos les mieux notées';
+$lang['display each day with photos, month per month'] = 'affichage année par année, mois par mois, jour par jour';
+$lang['display last user comments'] = 'Voir les derniers commentaires utilisateurs';
+$lang['display most recent photos'] = 'afficher les photos les plus récentes';
+$lang['display most visited photos'] = 'afficher les photos les plus vues';
+$lang['display only recently posted photos'] = 'n\'afficher que les photos publiées récemment';
+$lang['display photos linked to this tag'] = 'Voir les photos liées uniquement à ce tag';
+$lang['display recently updated albums'] = 'afficher les albums récemment mis à jour ou créés';
+$lang['display this album'] = 'montre les photos à la racine de cet album';
+$lang['display your favorites photos'] = 'afficher mes photos favorites';
+$lang['Display'] = 'Affichage';
+$lang['Download this file'] = 'Télécharger ce fichier';
+$lang['Download'] = 'Télécharger';
+$lang['Each listed rule must be satisfied.'] = 'Chaque critère doit être satisfait';
+$lang['Edit a comment'] = "Éditer un commentaire";
+$lang['edit'] = 'éditer';
+$lang['Edit'] = 'Editer';
+$lang['Email address is missing. Please specify an email address.'] = "L'adresse email manque. Veuillez spécifier une adresse email.";
+$lang['Email address'] = 'Adresse e-mail';
+$lang['Email: %s'] = 'Email : %s';
+$lang['Empty query. No criteria has been entered.'] = 'Requête vide. Aucun critère saisi.';
+$lang['End-Date'] = 'Date de fin';
+$lang['Enter your new password below.'] = 'Entrez votre nouveau mot de passe ci-dessous.';
+$lang['Enter your personnal informations'] = 'Entrer vos informations personnelles';
+$lang['Error sending email'] = 'Erreur à l\'envoi du mail';
+$lang['excluded'] = 'exclus';
+$lang['EXIF Metadata'] = 'Données EXIF';
+$lang['Expand all albums'] = 'Développer tous les albums';
+$lang['Favorites'] = 'Favoris';
+$lang['File name'] = 'Nom du fichier';
+$lang['File'] = 'Fichier';
+$lang['Filesize'] = 'Poids';
+$lang['Filter and display'] = 'Filtrer et afficher';
+$lang['Filter'] = 'Filtre';
+$lang['First'] = 'Première';
+$lang['Forgot your password?'] = 'Mot de passe oublié ?';
+$lang['from %s to %s'] = 'du %s au %s';
+$lang['Go through the gallery as a visitor'] = 'Parcourir la galerie en tant que visiteur';
+$lang['group by letters'] = 'regrouper par lettres';
+$lang['guest'] = 'visiteur';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Bonjour %s, votre galerie photo Piwigo est vide !';
+$lang['Hello'] = 'Bonjour';
+$lang['Hello %s,'] = 'Bonjour %s,';
+$lang['Help'] = 'Aide';
+$lang['Home'] = 'Accueil';
+$lang['html tags are not allowed in login'] = 'les balises html ne sont pas autorisées dans le login';
+$lang['I want to add photos'] = 'Je veux ajouter des photos';
+$lang['Identification'] = 'Identification';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'S\'il s\'agit d\'une erreur, ignorez ce message et la demande ne sera pas prise en compte.';
+$lang['in %d sub-album'] = 'dans %d sous-album';
+$lang['in %d sub-albums'] = 'dans %d sous-albums';
+$lang['in this album'] = 'dans cet album';
+$lang['included'] = 'inclus';
+$lang['Interface theme'] = 'Thème de l\'interface';
+$lang['Invalid key'] = 'Clef invalide';
+$lang['Invalid password!'] = 'Mot de passe invalide !';
+$lang['Invalid username or email'] = 'Nom d\'utilisateur ou adresse email invalide';
+$lang['IP: %s'] = 'IP : %s';
+$lang['IPTC Metadata'] = 'Données IPTC';
+$lang['Keyword'] = 'Mot-clef';
+$lang['Kind of date'] = 'Type de date';
+$lang['Language'] = 'Langue';
+$lang['last %d days'] = '%d derniers jours';
+$lang['Last'] = 'Dernière';
+$lang['letters'] = 'lettres';
+$lang['Links'] = 'Liens';
+$lang['login mustn\'t end with a space character'] = 'le nom d\'utilisateur ne doit pas se terminer par un espace';
+$lang['login mustn\'t start with a space character'] = 'le nom d\'utilisateur ne doit pas commencer par un espace';
+$lang['Login'] = 'Connexion';
+$lang['Logout'] = 'Déconnexion';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'adresse e-mail doit être de la forme xxx@yyy.eee (exemple : jack@altern.org)';
+$lang['Manage this user comment: %s'] = 'Gérer ce commentaire : %s';
+$lang['Maximum height must be a number superior to 50'] = 'La hauteur maximum des photos doit être supérieure à 50';
+$lang['Maximum photo height'] = 'Hauteur maximum des photos';
+$lang['Maximum photo width'] = 'Largeur maximum des photos';
+$lang['Maximum width must be a number superior to 50'] = 'La largeur des photos doit être supérieure à 50';
+$lang['Menu'] = 'Menu';
+$lang['month'][10] = 'Octobre';
+$lang['month'][11] = 'Novembre';
+$lang['month'][12] = 'Décembre';
+$lang['month'][1] = 'Janvier';
+$lang['month'][2] = 'Février';
+$lang['month'][3] = 'Mars';
+$lang['month'][4] = 'Avril';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Juin';
+$lang['month'][7] = 'Juillet';
+$lang['month'][8] = 'Août';
+$lang['month'][9] = 'Septembre';
+$lang['Most visited'] = 'Plus vues';
+$lang['N/A'] = 'non disponible';
+$lang['New on %s'] = 'Nouveau le %s';
+$lang['New password'] = 'Nouveau mot de passe';
+$lang['Next'] = 'Suivante';
+$lang['no rate'] = 'pas de note';
+$lang['No'] = 'Non';
+$lang['Not repeat the slideshow'] = 'Ne pas répéter le diaporama';
+$lang['Notification'] = 'Notifications RSS';
+$lang['Number of items'] = 'Nombre d\'élément';
+$lang['Number of photos per page'] = 'Nombre de miniatures par page';
+$lang['obligatory'] = 'obligatoire';
+$lang['Original dimensions'] = 'Dimensions d\'origine';
+$lang['Page generated in'] = 'Page fabriquée en';
+$lang['Password forgotten'] = 'Mot de passe oublié';
+$lang['Password reset is not allowed for this user'] = 'Le renouvellement du mot de passe n\'est pas permise pour cet utilisateur';
+$lang['Password Reset'] = 'Renouvellement de votre mot de passe';
+$lang['password updated'] = 'mot de passe mis à jour';
+$lang['Password'] = 'Mot de passe';
+$lang['Pause of slideshow'] = 'Pause du diaporama';
+$lang['photo'] = 'photo';
+$lang['Photos only RSS feed'] = 'Flux RSS des photos uniquement';
+$lang['photos posted during the last %d days'] = 'photos ajoutées au cours des %d derniers jours';
+$lang['Photos posted within the last %d day.'] = 'N\'afficher que les photos récentes de moins de %d jour.';
+$lang['Photos posted within the last %d days.'] = 'N\'afficher que les photos récentes de moins de %d jours.';
+$lang['Piwigo Help'] = 'Aide de Piwigo';
+$lang['Play of slideshow'] = 'Lecture du diaporama';
+$lang['please enter your password again'] = 'Merci d\'entrer à nouveau votre mot de passe';
+$lang['Please enter your username or email address.'] = 'Merci d\'entrer votre nom d\'utilisateur ou votre adresse email.';
+$lang['Please, enter a login'] = 'S\'il vous plaît, entrez un nom d\'utilisateur';
+$lang['Post date'] = 'Date d\'ajout';
+$lang['posted after %s (%s)'] = 'mis en ligne après le %s (%s)';
+$lang['posted before %s (%s)'] = 'mis en ligne avant le %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'mis en ligne entre le %s (%s) et le %s (%s)';
+$lang['posted on %s'] = 'mis en ligne le %s';
+$lang['Posted on'] = 'Ajoutée le';
+$lang['Powered by'] = 'Propulsé par';
+$lang['Preferences'] = 'Préférences';
+$lang['Previous'] = 'Précédente';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Connexion rapide';
+$lang['Quick search'] = 'Recherche rapide';
+$lang['Random photos'] = 'Photos au hasard';
+$lang['Rank'] = 'Rang';
+$lang['Rate this photo'] = 'Votez pour cette photo';
+$lang['Rating score'] = 'Score';
+$lang['Recent albums'] = 'Albums récents';
+$lang['Recent period must be a positive integer value'] = 'La période de nouveautés doit être un entier positif';
+$lang['Recent period'] = 'Période récente';
+$lang['Recent photos'] = 'Photos récentes';
+$lang['Redirection...'] = 'Redirection...';
+$lang['Reduce diaporama speed'] = 'Ralentir la vitesse du diaporama';
+$lang['Register'] = 'S\'enregistrer';
+$lang['Registration of %s'] = 'Enregistrement de %s';
+$lang['Registration'] = 'Enregistrement';
+$lang['Related tags'] = 'Tags liés';
+$lang['remove this tag from the list'] = 'retirer ce tag de la liste';
+$lang['Repeat the slideshow'] = 'Répéter le diaporama';
+$lang['representative'] = 'représentante';
+$lang['Reset to default values'] = 'Rétablir les valeurs par défaut';
+$lang['Reset'] = 'Annuler';
+$lang['Retrieve password'] = 'Récupérer un mot de passe';
+$lang['Return to home page'] = 'Retourner sur la page d\'accueil';
+$lang['return to normal view mode'] = 'retourner à la vue normale';
+$lang['return to the display of all photos'] = 'retourner à l\'affichage de toutes les photos';
+$lang['RSS feed'] = 'flux RSS';
+$lang['Search by date'] = 'Recherche par date';
+$lang['Search for all terms'] = 'Rechercher tous les mots';
+$lang['Search for any term'] = 'Rechercher un des mots';
+$lang['Search for Author'] = 'Rechercher un auteur';
+$lang['Search for words'] = 'Recherche de mots';
+$lang['Search in albums'] = 'Rechercher dans les albums';
+$lang['Search in sub-albums'] = 'Rechercher dans les sous-albums';
+$lang['Search results'] = 'Résultats de recherche';
+$lang['Search rules'] = 'Critères de recherche';
+$lang['Search tags'] = 'Rechercher les tags';
+$lang['search'] = 'recherche';
+$lang['Search'] = 'Recherche';
+$lang['searched words : %s'] = 'mots recherchés : %s';
+$lang['Sent by'] = 'Envoyé par';
+$lang['Send my connection settings by email'] = 'Recevoir mes identifiants par email';
+$lang['set as album representative'] = 'Choisir comme représentante de cet album';
+$lang['Show file metadata'] = 'Montrer les méta-données du fichier';
+$lang['Show number of comments'] = 'Montrer le nombre de commentaires';
+$lang['Show number of hits'] = 'Montrer le nombre de visualisations';
+$lang['show tag cloud'] = 'montrer le nuage de tags';
+$lang['Since'] = 'Depuis';
+$lang['slideshow'] = 'diaporama';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Quelqu\'un a demandé le renouvellement de votre mot de passe pour l\'utilisateur suivant :';
+$lang['Sort by'] = 'Trier selon';
+$lang['Sort order'] = 'Ordre de tri';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Inscription réussie, vous recevrez bientôt un email avec vos identifiants. Bienvenue !';
+$lang['Specials'] = 'Spéciales';
+$lang['SQL queries in'] = 'requêtes SQL en';
+$lang['stop the slideshow'] = 'arrêter le diaporama';
+$lang['Submit'] = 'Valider';
+$lang['Tag results for'] = 'Résultats des tags pour';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tags';
+$lang['the beginning'] = 'le début';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'La galerie est verrouillée pour cause de maintenance. Merci de revenir plus tard.';
+$lang['The number of photos per page must be a not null scalar'] = 'Le nombre de photos par page doit être un entier non nul';
+$lang['The passwords do not match'] = 'Les mots de passe ne correspondent pas';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Le flux RSS notifie les événements de la galerie : nouvelles photos, albums mis à jour, nouveaux commentaires utilisateur. À utiliser avec un lecteur de flux RSS.';
+$lang['the username must be given'] = 'le nom d\'utilisateur doit être indiqué';
+$lang['This author modified following comment:'] = 'Cet auteur a modifié le commentaire suivant :';
+$lang['This author removed the comment with id %d'] = 'Cet auteur a supprimé le commentaire portant l\'identifiant %d';
+$lang['this email address is already in use'] = 'un autre utilisateur utilise déjà cette adresse e-mail';
+$lang['This login is already used by another user'] = 'Ce nom d\'utilisateur est déjà pris';
+$lang['this login is already used'] = 'ce nom d\'utilisateur est déjà pris';
+$lang['Thumbnails'] = 'Miniatures';
+$lang['To reset your password, visit the following address:'] = 'Pour renouveler votre mot de passe, cliquez sur le lien suivant :';
+$lang['today'] = 'aujourd\'hui';
+$lang['Unknown feed identifier'] = 'Identifiant de flux inconnu';
+$lang['Unknown identifier'] = 'Identifiants inconnus';
+$lang['Update your rating'] = 'Mettre à jour votre note';
+$lang['useful when password forgotten'] = 'utile en cas d\'oubli de mot de passe';
+$lang['User "%s" has no email address, password reset is not possible'] = 'L\'utilisateur "%s" n\'a pas d\'adresse email, le renouvellement du mot de passe est impossible';
+$lang['User comments'] = 'Commentaires utilisateur';
+$lang['User: %s'] = 'Utilisateur: %s';
+$lang['Username "%s" on gallery %s'] = 'Utilisateur "%s" sur la galerie %s';
+$lang['Username or email'] = 'Nom d\'utilisateur ou adresse email';
+$lang['Username'] = 'Nom d\'utilisateur';
+$lang['Username modification'] = 'Modification du nom d\'utilisateur';
+$lang['View'] = 'Vue';
+$lang['Visits'] = 'Visites';
+$lang['Webmaster'] = 'Webmestre';
+$lang['Week %d'] = 'Semaine %d';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bienvenue sur votre galerie photo Piwigo !';
+$lang['Welcome'] = 'Bienvenue';
+$lang['wrong date'] = 'date erronée';
+$lang['Yes'] = 'Oui';
+$lang['You are not authorized to access the requested page'] = 'Vous n\'êtes pas autorisé à accéder à la page demandée';
+$lang['You will receive a link to create a new password via email.'] = 'Par email, vous recevrez un lien à cliquer pour renouveler votre mot de passe.';
+$lang['Your comment has been registered'] = 'Votre commentaire a été enregistré';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Votre commentaire n\'a pas été enregistré parce qu\'il ne satisfait aux règles de validation';
+$lang['Your favorites'] = 'Mes favorites';
+$lang['Your Gallery Customization'] = 'Personnalisation de votre affichage ';
+$lang['Your username has been successfully changed to : %s'] = 'Votre nom d\'utilisateur a bien été changé par : %s';
+$lang['Your password has been reset'] = 'Votre mot de passe a été réinitialisé';
+$lang['Original'] = "Original";
+$lang['Thank you for registering at %s!'] = 'Merci pour votre inscription sur %s !';
+$lang['Here are your connection settings'] = 'Voici vos identifiants';
+$lang['Password: %s'] = 'Mot de passe : %s';
+$lang['Username: %s'] = 'Nom d\'utilisateur : %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Si vous pensez avoir reçu cet email par erreur, veuillez nous contacter %s';
+$lang['Photo sizes'] = 'Tailles de photo';
+$lang['square'] = 'Carré';
+$lang['thumb'] = 'Miniature';
+$lang['2small'] = 'XXS - minuscule';
+$lang['xsmall'] = 'XS - très petit';
+$lang['small'] = 'S - petit';
+$lang['medium'] = 'M - moyen';
+$lang['large'] = 'L - grand';
+$lang['xlarge'] = 'XL - très grand';
+$lang['xxlarge'] = 'XXL - énorme';
+$lang['Show latest comments first'] = 'Montrer les commentaires les plus récents en premier';
+$lang['Show oldest comments first'] = 'Montrer les commentaires les plus anciens en premier';
+$lang['View in'] = 'Affichage';
+$lang['Mobile'] = 'Mobile';
+$lang['Desktop'] = 'Classique';
+$lang['Date created, new &rarr; old'] = 'Date de création, récent &rarr; ancien';
+$lang['Date created, old &rarr; new'] = 'Date de création, ancien &rarr; récent';
+$lang['Date posted, new &rarr; old'] = 'Date d\'ajout, récent &rarr; ancien';
+$lang['Date posted, old &rarr; new'] = 'Date d\'ajout, ancien &rarr; récent';
+$lang['File name, A &rarr; Z'] = 'Nom du fichier, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nom du fichier, Z &rarr; A';
+$lang['Manual sort order'] = 'Ordre manuel';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identifiant, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identifiant, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Titre de la photo, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Titre de la photo, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Note, haute &rarr; basse';
+$lang['Rating score, low &rarr; high'] = 'Note, basse &rarr; haute';
+$lang['Visits, high &rarr; low'] = 'Nombre de visites, élevé &rarr; faible';
+$lang['Visits, low &rarr; high'] = 'Nombre de visites, faible &rarr; élevé';
+?>
Index: tags/2.4.0RC3/language/fr_FR/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,141 @@
+<h2>Modifier un album</h2>
+
+<h3>Informations</h3>
+
+<ul>
+
+  <li><strong>nom</strong>: renommer l'album (virtuellement pour 
+  un album physique).</li>
+
+  <li><strong>description</strong>: un texte bref donnant une idée du contenu de l'album,
+  cette indication figurera en bas de la page des miniatures.</li>
+
+</ul>
+
+<h3>Déplacer</h3>
+
+<p>Si l'album est virtuel, vous pouvez le déplacer. Déplacer un
+album signifie changer son album parent.</p>
+
+<h3>Options</h3>
+
+<ul>
+
+  <li><strong>Type d'accès</strong>: gestion des permissions. Si vous rendez
+un album privé, tous ses albums fils deviennent privés. Si
+vous rendez un album publique, tous ses albums parents deviennent
+publiques.</li>
+
+  <li><strong>Verrouiller</strong>: l'album et tous ses sous-album deviennent temporairement inaccessibles pour maintenance.</li>
+
+  <li><strong>Commentaires</strong>: autorise les utilisateurs à commenter
+les photos de cet album.</li>
+  
+</ul>
+
+<p>Vous pouvez aussi gérer ces options par la gestion des "Propriétés" 
+(écrans <span class="pwgScreen">Commentaires</span>, <span
+class="pwgScreen">Verrouiller</span>, <span
+class="pwgScreen">Publique/Privée</span>, <span
+class="pwgScreen">Représentant</span> disponibles à partir d' <span
+class="pwgScreen">Administration &raquo; Albums &raquo; Propriétés</span>).</p>
+
+<h3>Ordre de tri</h3>
+
+<p>Utiliser l'ordre de tri des photos par défaut.</p>
+
+<p>Indiquer si le tri s'applique également aux sous-albums.</p>
+
+<p>Sélectionner les critères de tri à utiliser pour cet album.</p>
+<ul>
+<li><strong>Date de création</strong>: Date de prise de vue</li>
+<li><strong>Date d'ajout</strong>: Date de la synchronisation</li>
+<li><strong>Note moyenne (*)</strong>: cette moyenne peut être modifiée par la notation du visiteur</li>
+<li><strong>Plus vues (*)</strong>: La visite en cours peut changer l'ordre des plus vues</li>
+<li><strong>Nom du fichier</strong>: Nom du fichier donné dans les champs d'informations ci-dessus</li>
+<li><strong>Id</strong>: Id interne (les albums récents ont un "Id" plus grand que les précédentes).</li>
+
+</ul>
+<p><strong>(*)</strong>Attention: testez-vous même ces tris qui peuvent donner des résultats imprévus.</p>
+
+
+<h3>Représentant</h3>
+
+<p>Le représentant d'un album est la miniature affichée sur la page principale (<span
+class="pwgScreen">category.php</span>) pour
+représenter l'album lorsque celui-ci ne contient
+que des sous-albums et aucune photo direct (comme à la
+racine)</p>
+
+<p>Il existe 4 moyens différents de choisir le représentant d'un album:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Page d'affichage des photos</span>: un des boutons d'action permet de choisir la photo courante comme représentant
+de l'album affiché. Ce bouton d'action n'est disponible que pour les
+administrateurs.</li>
+
+  <li><span class="pwgScreen">Modifier les informations d'une photo</span>
+dans l'administration. Cet écran peut être atteint depuis <span
+class="pwgScreen">picture.php</span> ou <span class="pwgScreen">Gestion par
+lot</span> dans le <em>mode unitaire</em>. Voir l'aide de cet écran pour les
+détails.</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Propriétés &raquo;
+Représentant</span>. Voir l'aide de cet écran pour les détails.</li>
+
+  <li><span class="pwgScreen">Modifier un album</span> (le présent
+écran).</li>
+
+</ul>
+
+<p>Le choix d'un représentant dépend du paramètre de configuration
+<code>allow_random_representative</code> (voir <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Par défaut (<code>allow_random_representative</code> à false), chaque
+album contenant au moins une photo est représenté par un élément
+fixe. Une fois fixé (à la création de l'album), le représentant change
+uniquement lorsque l'administrateur le demande. Si le représentant ne
+convient pas, vous pouvez demander à <strong>Trouver un nouveau représentant
+au hasard</strong>.</p>
+
+<p>Si le paramètre de configuration <code>allow_random_representative</code>
+est à true, l'album contenant des photos peut ne pas avoir de
+représentant fixe. Utiliser simplement le bouton <strong>Supprimer le
+représentant</strong>.</p>
+
+<p>Si l'album ne contient que des sous-albums et aucune photo, il peut cependant être représentée par n'importe quel 
+photo grâce à l'écran <span class="pwgScreen">Modifier les informations 
+d'une photo</span>. La seule option disponible sur le présent écran est le bouton
+<strong>Supprimer le représentant</strong>.</p>
+
+<h3>Associer toutes les photos de l'album à un nouvel album</h3>
+
+<ul>
+
+<li><strong>Nom de l'album virtuel</strong>: Nom du nouvel album à créer, 
+toutes les photos de l'album en cours seront liées à celui-ci.</li>
+
+<li><strong>Album parent</strong>: A quel endroit le nouvel album doit être placé, 
+laisser vide pour le créer sur la page d'accueil.</li>
+
+</ul>
+
+<h3>Associer toutes les photos de l'album à des albums existants</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Choisir l'album de destination.</li>
+
+</ul>
+
+<h3>Envoyer un mail d'informations aux membres d'un groupe</h3>
+
+<ul>
+
+<li><strong>Groupe</strong>: Groupe de destinataires</li>
+
+<li><strong>Contenu du mail</strong>: Texte libre à leur envoyer.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/fr_FR/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/cat_move.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Déplacement d'albums virtuels</h2>
+
+<p>Vous pouvez changer le parent d'un album virtuel.</p>
+
+<h3>Albums virtuels à déplacer</h3>
+
+<p>Sélectionnez un ou plusieurs album virtuels à déplacer. 
+Si la liste est vide, c'est que vous n'en avez pas encore créé.</p>
+
+<h3>Nouvel album parent</h3>
+
+<p>Sélectionnez le nouvel album parent (virtuel ou physique). 
+Si vous n'en sélectionnez aucun, 
+les albums à déplacer seront remontés à la racine des albums.
+Vous ne pouvez déplacer un album dans lui-même ou ses fils.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/cat_options.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>Options des albums</h2>
+
+<p>Gestion des options pour plusieurs albums à la fois.</p>
+
+<dl>
+  
+  <dt>Commentaires utilisateurs</dt>
+
+  <dd>Autoriser les utilisateurs à ajouter des commentaires dans les albums sélectionnés.
+Une photo sera commentable si elle appartient à au moins un album commentable.</dd>
+  
+  <dt>Verrouiller</dt>
+
+  <dd>Les albums sélectionnés deviennent temporairement inactifs pour
+maintenance. Lorsqu'un album est verrouillé, tous les sous-albums sont verrouillés. 
+Lorsqu'un album est déverrouillé, toutes les albums parents sont déverrouillés.</dd>
+
+  <dt>Publique / Privé</dt>
+
+  <dd>Les permissions n'existent que pour les albums privés. Une fois qu'un album est privé, il vous faut
+explicitement autoriser les utilisateurs ou les groupes à y
+accéder. Lorsqu'un album devient privé, tous les sous-Album deviennent privés. 
+Lorsqu'un album devient publique, tous les albums parents deviennent publiques.</dd>
+
+  <dt>Représentant</dt>
+
+  <dd>Cette option est disponible uniquement si le paramètre de
+configuration <code>allow_random_representative</code> (voir <span
+class="filename">include/config_default.inc.php</span>) vaut
+<em>true</em>. Chaque album peut-être représenté par une photo prise au hasard ou par une seule miniature fixe.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_FR/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,13 @@
+<h2>Gérer les permissions pour un album</h2>
+
+<p>Cet écran n'est disponible que pour les albums privés. Ici vous
+pourrez sélectionner les utilisateurs et les groupes autorisés pour un album</p>
+
+<h3>Groupes</h3>
+
+<p>Vous pouvez autoriser ou interdire l'accès des groupes à l'album courant. Les utilisateurs 
+appartenant à ces groupes se verront autoriser ou interdire l'accès à l'album.</p>
+
+<h3>Utilisateurs</h3>
+
+<p>Vous pouvez autoriser ou interdire l'accès aux utilisateurs individuellement. Les utilisateurs autorisés par ailleurs grâce à leur appartenance à un groupe peuvent se voir supprimer l'accès par exception.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/configuration.html	(revision 14585)
@@ -0,0 +1,132 @@
+<h2>Configuration</h2>
+
+<p>Cet écran permet de gérer la configuration basique. En effet, seuls sont
+montrés les paramètres de configuration qui doivent suffire à la majorité
+des administrateurs. Si vous souhaitez voir la liste des nombreux (et
+avancés) paramètres, lire le fichier <span
+class="filename">include/config_default.inc.php</span></p>
+
+<p>Cet écran est divisié en plusieurs sections, regroupant les paramètres
+par thème.</p>
+
+<h3>Principale</h3>
+<ul>
+
+  <li><strong>Titre de la galerie</strong>: utilisé pour le flux RSS et
+la notification par email.</li>
+
+  <li><strong>Bannière des pages</strong>: code html affiché en haut des
+pages.</li>
+
+  <li><strong>URL de la galerie</strong>: utilisé pour le flux RSS.</li>
+
+  <li><strong>Verrouiller la galerie</strong>: Verrouiller l'ensemble de la
+galerie pour maintenance. Seul les administrateurs pourront accéder à la
+galerie.</li>
+
+  <li><strong>Notation</strong>: La notation des photos est possible.</li>
+
+  <li><strong>Notation par les visiteurs</strong>: Même les utilisateurs non enregistrés peuvent noter les photos</li>
+
+  <li><strong>Permettre l'enregistrement des utilisateurs</strong>: L'inscription est libre pour tous.</li>
+
+  <li><strong>L'adresse mail est obligatoire pour tous les utilisateurs</strong>: L'adresse mail sera vérifié lors des inscriptions ou de la mise à jour des profils sauf si l'action est effectuée dans la partie administration.</li>
+
+  <li><strong>Notifier les administrateurs lors de l'inscription d'un utilisateur</strong>: Les administrateurs recevront un courriel à chaque inscription.</li>
+  
+  <li><strong>Ordre par défaut des photos</strong>: vous pouvez définir un ordre personnalisé grace à ces menus déroulants.</li>
+
+</ul>
+
+<h3>Historique</h3>
+
+  <p>les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> sont
+enregistrées dans la table <code>history</code>.</p>
+
+  <p>Les visites sont affichées dans l'écran <span class="pwgScreen">Administration &raquo; Outils &raquo; Historique</span>.</p>
+
+<ul>
+  <li><strong>Enregistrer les pages visitées par les invités</strong>: les visites des pages par les invités sont enregistrées.</li>
+
+  <li><strong>Enregistrer les pages visitées par les utilisateurs</strong>: les visites des pagespar les utilisateurs enregistrés sont enregistrées.</li>
+
+  <li><strong>Enregistrer les pages visitées par les administrateurs</strong>: les visites des pages par les administrateurs sont enregistrées.</li>
+
+</ul>
+
+<h3>Commentaires</h3>
+<ul>
+
+  <li><strong>Commentaires utilisateur pour tous</strong>: même les
+utilisateurs non enregistrés peuvent enregistrer des commentaires.</li>
+
+  <li><strong>Nombre de commentaires utilisateur par page</strong>.</li>
+
+  <li><strong>Validation</strong>: un administrateur doit valider les
+commentaires utilisateurs avant qu'ils puissent devenir visibles dans la
+partie publique. La validation des commentaires utilisateurs a lieu dans
+l'écran <span class="pwgScreen">Administration &raquo; Outils &raquo; Commentaires en attente</span>.</li>
+
+  <li><strong>Notifier les administrateurs quand un commentaire est enregistré</strong>:
+Envoi un courriel aux administrateurs lorsqu'un utilisateur enregistre un commentaire qui est validé.</li>
+
+  <li><strong>Notifier les administrateurs quand un commentaire requiert sa validation </strong>:
+Envoi un courriel aux administrateurs lorsqu'un utilisateur enregistre un commentaire qui demande une validation de la part des administrateurs.
+La validation des commentaires utilisateurs a lieu dans l'écran <span class="pwgScreen">Administration &raquo; Outils &raquo; Commentaires en attente</span>.</li>
+
+</ul>
+
+<h3>Affichage par défaut</h3>
+<p>Modifier les options d'affichage par défaut: pour les visiteurs non
+connectés. Une fois connecté, ces options sont surchargées par celles de
+l'utilisateur, qu'il peut modifier dans l'écran <span
+class="pwgScreen">profile</span>.</p>
+
+<p>Il est possible de changer ces options pour les utilisateurs existants,
+mais il s'agit d'un autre écran : <span class="pwgScreen">Administration &raquo; 
+Utilisateurs &raquo; Gérer</span>, dans lequel vous pouvez modifier ces
+options pour une liste d'utilisateurs sélectionnés.</p>
+
+<ul>
+
+  <li><strong>Langue</strong>: ne concerne que les libellés de
+Piwigo. Les noms d'albums, de photo et les descriptions ne sont
+pas localisés (ie multilingue).</li>
+
+  <li><strong>Nombre de miniatures par ligne</strong></li>
+
+  <li><strong>Nombre de lignes par page</strong></li>
+
+  <li><strong>Thème de l'interface</strong></li>
+
+  <li><strong>Période récente</strong>: en jours. Période pendant laquelle
+une photo est considérée comment nouvelle. Cette période doit être
+supérieure à 1 jour.</li>
+
+  <li><strong>Développer tous les albums</strong>: développer tous
+les albums dans le menu? <em>Attention</em>: cette option est
+susceptible de consommer inutilement des ressources si votre arbre d'album
+ contient de nombreux éléments.</li>
+
+  <li><strong>Montrer le nombre de commentaires</strong>: montrer les nombre
+de commentaires utilisateur en dessous de chaque miniature. Consomme des
+ressources.</li>
+
+  <li><strong>Montrer le nombre de visualisations  </strong>: affiche les 
+  « hits » relevés sur une photo sous sa miniature dans la page de miniatures.
+  Uniquement valable si le paramètre de configuration avancée est :<br>
+  $conf['show_nb_hits'] = true; <br>
+  N.B.: par defaut il est à false.</li>
+
+  <li><strong>Largeur maximum des photos</strong>: à l'affichage. Si la photo
+est plus large que ce paramètre, alors elle sera redimensionnée à
+l'affichage. Si vous pensez nécessaire de modifier ce paramétrage (donc pour
+un affichage par défaut), il serait pertinent de redimensionner directement
+vos photos stockées.</li>
+
+  <li><strong>Hauteur maximum des photos</strong>: même remarque que pour la
+largeur.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_FR/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,101 @@
+<h2>Configuration pour "étendre" les templates</h2>
+
+<h3>Objectif</h3>
+<p>Définir les conditions de remplacement de chaque template (modèle) à partir de template-extension
+(template appelé "replacer" (remplaçant)).</p>
+
+<p>Les "Templates d'origine" provenant de ./themes/default/template (ou de tout autre thème)
+ sont remplacés par un remplaçant si celui-ci est lié à son template d'origine
+ (et de façon facultative, quand l'adresse (URL) demandée contient un URL contains un "Paramètre facultatif de l'URL").</p>
+
+<p>Les "Paramètres facultatif de l'URL" sont ceux que vous pouvez trouver après le nom du module dans l'adresse (URL).</p>
+
+<p>Ainsi un "Paramètre facultatif de l'URL" peut être un "permalink" (lien permanent) actif
+(voir les permalinks dans notre documentation pour plus d'information).</p>
+
+<p>Lire les `<a href="#warnings">mises en garde</a>` sur les conditions d'utilisation.</p>
+
+<h3>Qu'est-ce que les extensions des modèles?</h3>
+
+<p>Cet outil de configuration est à la fois puissant pour les débutants et pour les utilisateurs avancés.
+Par FTP, dans le dossier template-extension, le Webmaster pourra dupliquer une bonne partie des fichiers
+ .tpl distribués ("Templates d'origine") avec un nom différent  
+ ("replacer" (remplaçant)).
+ 
+ "Templates d'origine", actuellement les modèles d'origine supportés sont:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Où puis-je trouver les "Templates d'origine"?</h3>
+
+<p>Les modèles distribués d'origine sont dans /themes/default/template/ 
+(ne pas les modifier directement à cet endroit pour des raisons d'évolution). Ainsi à partir des "templates d'origine", 
+tout webmaster pourra créer ses "replacers (modèles personalisés)".</p>
+
+<h3>Où dois-je enregistrer les "remplaçants"?</h3>
+
+<p>Les <strong>Replacers (templates modifiés)</strong> peuvent être placés dans le dossier 
+template-extension (ou ses sous-dossiers).
+Les remplaçants peuvent avoir n'importe quel nom de fichier avec l'extension .tpl. Par exemple: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Comment puis-je activer mes "remplaçants"?</h3>
+<p>Un <strong>template d'origine</strong> devrait être associé à chaque
+ <strong>replacer (modèle modifié)</strong> à fin d'activer les remplacements correspondants.
+ Activer les remplaçants est la fonction de "Etendre les templates" dans les menus de Configuration de l'Administration.</p>
+
+<p>Si vous sélectionnez un <strong>Paramètre facultatif de l'URL</strong> alors les remplacements 
+ne seront réalisés que sur les pages utilisant ce mot clé. Par exemple: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Les utilisateurs avancés utiliseront les permalinks (permaliens, liens permanents) en tant que 
+<strong>paramètre facultatif de l'URL</strong>. </p>
+
+<p>Si vous sélectionnez un <strong>Template rattaché</strong> alors les remplacements ne seront réalisés que sur ce template.</p>
+
+<h3>Comment puis-je désactiver mes "replacers"?</h3>
+<ul>
+<li>Déselectionner le "template d'origine".</li>
+<li>Par FTP supprimer le "remplaçant".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Mises en garde</h3>
+<ul>
+
+  <li>Le <strong>template d'origine</strong> doit être le véritable template "d'origine"
+  autrement vous pourriez avoir des résultats imprévisibles!</li>
+
+  <li>Si plusieurs <strong>remplaçants (templates modifiés)</strong> ont le même
+  <strong>template d'origine</strong> et le même <strong>paramètre facultatif
+  de l'URL</strong> alors seulement le dernier remplaçant sera actif.</li>
+
+  <li>Ne pas sélectionner de <strong>paramètre facultatif de l'URL</strong> 
+  activera le template de remplacement à chaque utilisation du template.
+  Comme mentionné ci-dessus, l'ordre peut inhiber les remplaçants précédents.</li>
+
+  <li>Sous-dossiers:
+  Les sous-dossiers sont ignorés mais ils sont utiles pour modifier l'ordre des remplaçants.<br>
+distributed-samples: pour vos tests sont distributés! 
+<strong>Ne pas les modifier</strong>, créez les votres!
+</li>
+
+  <li>A la suppression d'un remplaçant le <strong>template d'origine</strong> sera 
+  immédiatement réactivé.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_FR/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/group_list.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Liste des groupes</h2>
+
+<p>Administration des propriétés des groupes.</p>
+
+<h3>Ajouter un groupe</h3>
+
+<p>L'administrateur peut ajouter des groupes.</p>
+
+<h3>Liste des groupes</h3>
+
+<p>La liste permet pour chaque groupe:</p>
+
+<ul>
+  <li>d'accéder à la liste des membres</li>
+  <li>d'accéder aux permissions</li>
+  <li>de supprimer le groupe (nécessite une confirmation)</li>
+  <li>d'inverser le statut "par défaut" (nécessite une confirmation)</li>
+</ul>
+
+<h3>Groupes par défaut</h3>
+<p>Les groupes par défaut sont des groupes associés automatiquement à chaque nouvel utilisateur lors de son enregistrement ou de sa création par un administrateur.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,33 @@
+<p>Il existe plusieurs méthodes pour ajouter des photos dans votre
+galerie :</p>
+
+<ul>
+
+  <li><strong>L'ajout direct</strong> dans votre navigateur web est la
+  méthode la plus simple et la plus immédiate. Elle dépend des capacités de
+  votre navigateur et de votre serveur. Pour des gros volumes ou en cas de
+  problèmes, les méthodes alternatives vous attendent !</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Utiliser l'ajout direct</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> est un logiciel à installer sur votre
+  ordinateur. Glissez vos photos dans la fenêtre de pLoader, cliquez
+  sur <em>"Transférer vers Piwigo"</em> et pLoader s'occupe du reste. D'autres logiciels clients existent, comme <strong>WinToPiwigo</strong> ou le module
+  d'export Piwigo de <strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Utiliser pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>Le transfert FTP</strong>
+  est la méthode idéale pour ajouter une collection importante en un minimum
+  d'opérations. Suivez le guide pour préparer vos photos. Cette méthode vous
+  permet de contrôler avec précision l'organisation physique de vos photos
+  sur votre serveur.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Utiliser FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/fr_FR/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/help_groups.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>Les groupes d'utilisateurs permettent d'assigner des permissions à une liste d'utilisateurs.</p>
+
+<p>Vous pouvez créer des groupes et y ajouter des utilisateurs dans 
+<span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Groupes</span>.</p>
+
+<p>Un utilisateur peut appartenir à plusieurs groupes. L'autorisation l'emporte sur l'interdiction : si l'utilisateur "pierre" appartient aux
+groupes "famille" et "amis", et que seul le groupe "famille" peut visiter l'album "Noël 2010", alors "pierre" peut visiter cet album.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Une fois votre galerie créée vous pouvez configurer pour vos visiteur
+ <ul>
+	<li>L'affichage par défaut tel que désiré dans  menu <span class="pwgScreen">Administation &raquo; Configuration &raquo; Options</span> onglet <span class="pwgScreen">Paramètres invité</span></li>
+	<li>Le thème par défaut dans <span class="pwgScreen">Administation &raquo; Configuration &raquo; Thèmes</span></li>
+	<li>La langue par défaut dans <span class="pwgScreen">Administation &raquo; Configuration &raquo; Langues</span></li>
+ </ul>
+ Par défaut, chaque nouvel utilisateur héritera de ces propriétés dès son enregistrement.
+</p>
+<p>Pour toute question, la communauté francophone Piwigo est à l'écoute sur le <a href="http://fr.piwigo.org/forum">forum</a>.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,48 @@
+<fieldset>
+<legend>Permissions par photo</legend>
+
+<p>Chaque photo a un <strong>niveau de confidentialité</strong> (un verrou). Chaque utilisateur a également un niveau de confidentialité (une clef). Il y a 5 niveaux de confidentialité :
+<ol>
+  <li>Aucun</li>
+  <li><em>Contacts</em></li>
+  <li><em>Amis</em> (qui est davantage qu'un contact)</li>
+  <li><em>Famille</em> (qui est davantage qu'un ami)</li>
+  <li><em>Admins</em> (qui recouvre tous les autres niveaux)</li>
+</ol>
+
+<p>Les niveaux supérieurs disposent des droits pour accéder aux niveaux inférieurs. Pour un utilisateur donné, plus haut est son niveau de confidentialité, plus il peut voir de photos.</p>
+
+<p>Par exemple, si la photo "mariage_pierre-0024.jpg" a le niveau de confidentialité <em>"Famille"</em>, alors :</p>
+<ul>
+  <li>Pierre (qui est un <em>Admin</em>) peut la voir car <em>"Admins"</em> donne tous les droits</li>
+  <li>Vanessa (qui est une membre de la <em>Famille</em>) peut la voir également</li>
+  <li>Marie (qui n'est qu'une <em>Amie</em>) elle ne peut pas la voir</li>
+</ul>
+
+<p>Un utilisateur qui ne dispose pas des permissions pour voir le contenu d’un album ne verra pas du tout l'album, pas même son titre. Même principe pour un tag.</p>
+
+<p>Vous pouvez assigner le niveau de confidentialité d'un utilisateur sur l'écran <span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Gérer</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Permissions par album</legend>
+
+<p>Si les niveaux de confidentialité ne correspondent pas exactement à vos besoins, vous pouvez également gérer les permissions par album et pour un utilisateur ou un groupe donné. Vous pouvez gérer les permissions par photo et par album en même temps, sans conflit.</p>
+
+<p>Vous pouvez interdire l'accès aux albums. Passez le type d'accès de l'album à "privé" si vous souhaitez gérer les permissions.</p>
+  
+<p>Vous pouvez rendre un album privé en l'éditant (<span
+class="pwgScreen">Administration &raquo; Albums &raquo; Gérer &raquo; Editer</span>) ou en
+gérant les options pour votre arbre complet d'albums (<span
+class="pwgScreen">Administration &raquo; Albums &raquo; Propriétés &raquo; Publique/Privé</span>).</p>
+
+<p>Lorsqu'un album est privé, vous pouvez gérer les permissions par groupes et utilisateurs avec 3 écrans :</p>
+
+<ul>
+  <li><span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Gérer &raquo; action Permissions</span> (1 lien par utilisateur)</li>
+  <li><span class="pwgScreen">Administration &raquo; Utilisateurs &raquo; Groupes &raquo; action Permissions</span> (1 lien par groupe)</li>
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Gérer &raquo; Modifier les permissions</span> (1 lien par album)</li>
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/fr_FR/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Les photos sont affichées dans les albums correspondant aux répertoires dans lesquels elles sont stockées.</p>
+
+<p>Vous pouvez également afficher une photo dans plusieurs albums, sans dupliquer le fichier sur votre serveur web. Associez la photo à n'importe quelle autre album depuis l'écran d'édition de la photo (auquel vous accéder depuis la page de visualisation de la photo côté galerie, lorsque vous êtes connecté en tant qu'administrateur)</p>
+
+<p>Les albums virtuels sont basés sur ce principe : ils n'ont pas de répertoire associé. Créez des albums virtuels depuis <span class="pwgScreen">Administration &raquo; Albums &raquo; Gérer</span>.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/history.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/history.html	(revision 14585)
@@ -0,0 +1,44 @@
+<h2>Historique</h2>
+
+<p>Ces écrans permettent de suivre l'historique de navigation dans Piwigo suivant les options que vous avez déterminées dans - Administration &raquo; Configuration &raquo; Options &raquo; Onglet "Historique".</p>
+	
+<h3>Statistiques</h3>
+<ul>
+  <p>Si vous avez choisi que les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> soient
+enregistrées dans la table <code>history</code>,
+cet onglet permet de suivre le nombre de pages visitées</p>
+	
+	<li><strong>Statistiques totales</strong> : visites par année</li>
+	
+	<li><strong>Statistiques d'une année</strong> : visites par mois de l’année sélectionnée.</li>
+	
+	<li><strong>Statistiques d'un mois</strong> : visites par jour du mois sélectionné.</li>
+	
+	<li><strong>Statistiques d'une journée</strong> : visites par heures de la journée sélectionnée.</li>
+	
+</ul>
+
+<h3>Rechercher</h3>
+<ul>
+  <p>Si vous avez choisi que les visites des pages <span
+class="pwgScreen">index.php</span> et <span
+class="pwgScreen">picture.php</span> soient
+enregistrées dans la table <code>history</code>, cet onglet permet de suivre plus en détail les pages visitées avec l'aide de différents filtres.</p>
+ 
+	<li><strong>Filtrer par date</strong> : sélectionner la plage
+de dates dont vous souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par type d'élément</strong> : sélectionner le
+type d'élément dont vous souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par utilisateur</strong> : sélectionner l'utilisateur dont vous
+ souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par nom du fichier</strong> : sélectionner le nom du fichier dont vous
+ souhaitez observer l’activité.</li>
+	
+	<li><strong>Filtrer par identifiant image</strong> : sélectionner l'identifiant de l'image dont vous
+ souhaitez observer l’activité.</li>
+</ul>
Index: tags/2.4.0RC3/language/fr_FR/help/index.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/fr_FR/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/maintenance.html	(revision 14585)
@@ -0,0 +1,64 @@
+<h2>Maintenance</h2>
+
+<p>Pour optimiser le temps de génération des pages, Piwigo utilise des informations en cache.
+ Par exemple, au lieu de compter le nombre de photos contenus dans chaque album à 
+ chaque rechargement de page, cette information est stockée dans la base de données. 
+ En théorie, cette information doit toujours être correcte, mais parfois une erreur peut 
+ survenir et l'information en cache devient fausse.</p>
+
+<p>Certaines informations deviennent inutiles avec le temps. 
+Les supprimer de la base de données libère de l'espace disque.</p>
+
+<ul>
+
+  <li>
+    <strong>Eléments non liés:</strong>
+    Affiche les photos qui ne sont associées à aucun album virtuel
+  </li>
+  <li>
+    <strong>Fichiers portant le même nom dans plusieurs albums physiques :</strong>
+    Affiche les photos ou les éventuels fichiers qui pourraient être trouvés dans plusieurs albums.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Mettre à jour les informations des albums :</strong> 
+  Pour chaque album, les informations suivantes sont contrôlées, et mises à jour le cas échéant : 
+  liste des albums parents, nombre d'éléments, date de la dernière photo, position parmi les 
+  albums frères, position dans l'arbre complet des albums. Cette action vérifie 
+  également la cohérence des représentants.</li>
+
+  <li><strong>Mettre à jour les informations des photos :</strong>
+Pour chaque photo, les informations mises àjour sont : chemin complet vers le 
+fichier et note moyenne. Attention, ne pas confondre : les méta-données sont 
+synchronisées sur l'écran <span class="pwgScreen">Administration &raquo; Albums &raquo; Synchroniser</span> 
+ou sur l'écran <span class="pwgScreen">Modifier les informations d'une photo</span> (accessible depuis la page de visualisation d'une photo <span class="pwgScreen">picture.php</span>).</li>
+
+  <li><strong>Réparer et optimiser la base de données :</strong>
+Effectue des opérations de ré-ordonnancement, réparation et optimisation sur  chaque table de la base de données.
+  </li>
+
+</ul>
+
+<ul>
+  <li><strong>Purger le détail de l'historique :</strong>
+Supprime toutes les lignes de la table <code>history</code>. L'écran <span class="pwgScreen">
+Administration &raquo; Outils &raquo; Historique</span> ne montre alors plus aucune information sur le passé. 
+<em>Attention</em> : toutes les données seront perdues, sans aucun possibilité de récupération.
+  </li>
+
+  <li><strong>Purger la synthèse de l'historique :</strong>
+Supprime toutes les informations  récapitulatives (obtenues à partir du détail de l'historique).
+  </li>
+
+  <li><strong>Purger les sessions :</strong> Supprimer les sessions expirées.</li>
+
+  <li><strong>Purger les flux de notification jamais utilisés</strong></li>
+  
+  <li><strong>Purger l'historique des recherches</strong></li>
+  
+  <li><strong>Purger les templates compilés</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_FR/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Notification par mail</h2>
+
+<p>Cet écran permet de configurer et de gérer les envois de mails aux utilisateurs, pour les notifier de changements intervenus sur votre site.</p>
+
+<p>Cet écran est composé de 3 onglets:</p>
+
+<h3>Paramétrage</h3>
+<p>Accessible uniquement aux webmestres, cet onglet permet de positionner les paramètres de la notification par mail.</p>
+
+<h3>Inscription</h3>
+<p>Accessible uniquement aux webmestres, cet onglet permet de gérer les inscriptions/désinscriptions à la notification par mail.</p>
+
+<h3>Envoi</h3>
+<p>Accessible aux webmestres et aux administrateurs, cet onglet permet d'effectuer les envois des mails pour notifier les changements.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Liens permanents</h2>
+
+<p>Les liens permanents sont utilisés pour rendre plus jolis les urls des albums. Lorsqu'un album dispose d'un lien permanent associé, son identifiant n'est plus nécessaire dans l'url.</p>
+
+<p>Quand un lien permanent est effacé, vous pouvez le sauvegarder dans l'historique des liens permanents, de sorte que les liens externes à Piwigo puissent continuer à fonctionner. Dans l'historique des liens permanents vous pouvez voir la date d'effacement du lien, ainsi que la date de la dernière utilisation et le nombre d'utilisations de ce lien.</p>
+
+<p>Veuillez noter que les liens permanents doivent être uniques. Ils doivent aussi être uniques dans l'historique des liens permanents.</p>
Index: tags/2.4.0RC3/language/fr_FR/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,78 @@
+<fieldset>
+  <legend>Démarrage rapide</legend>
+
+<ol>
+  <li>Créez un répertoire sur votre ordinateur.</li>
+
+  <li>Copiez des photos à l'intérieur de ce répertoire. <em>Attention</em> : le nom des répertoires et des fichiers ne doit contenir que des lettres, des chiffres et les caractères  "-", "_" ou ".". Pas d'espace ou de caractères accentués.</li>
+
+  <li>Avec un client FTP, copiez le répertoire dans le répertoire "galleries" de votre installation de Piwigo.</li>
+
+  <li>Connectez-vous à votre galerie Piwigo, rendez-vous sur <span class="pwgScreen">Administration</span> et cliquez sur le gros bouton de synchronisation.</li>
+</ol>
+
+<p>Bravo ! Vous avez créé avec succès le premier album de votre galerie.</p>
+
+</fieldset>
+
+<fieldset>
+  <legend>Organisation des répertoires et des fichiers</legend>
+
+<ul>
+
+  <li>
+
+    <p>Les répertoires représentant les albums se trouvent dans le répertoire "galleries". Ci-dessous l'arbre des répertoires d'une très petite galerie (mais utilisant de nombreuses fonctionnalités) : </p>
+  
+<pre>
+galleries
+|-- mariage
+|   |-- ceremonie
+|   |   |-- entree
+|   |   |   |-- arrivee-de-paul.jpg
+|   |   |   +-- arrivee-de-virginie.jpg
+|   |   +-- sortie
+|   |       |-- sortie-enfants-honneur.jpg
+|   |       +-- sortie-de-paul-et-virginie.jpg
+|   +-- cocktail
+|       |-- discours001.jpg
+|       |-- discours002.jpg
+|       +-- discours003.jpg
++-- voyage-de-noces
+    |-- hotel.png
+    |-- video-decollage-avion.avi
+    +-- pwg_representative
+        +-- video-decollage-avion.jpg
+</pre>
+
+  </li>
+  
+  <li>A l'exception de celui appelé "pwg_representative", chaque répertoire dans "galleries" génère un album. Le nombre de niveaux (profondeur) n'est pas limité.</li>
+
+  <li>Fondamentalement, une photo est représentée par un fichier. Pour Piwigo, un fichier peut être une photo si son extension figure dans la liste du paramètre de configuration <code>file_ext</code> (voir
+fichier <span class="filename">include/config.inc.php</span>). Un fichier
+peut être une photo si son extension figure dans la liste du paramètre de configuration
+<code>picture_ext</code>.</li>
+
+  <li>Les éléments autres que les photos (vidéos, sons, fichiers texte, tout ce que vous
+voulez...) sont représentés par défaut par une icône correspondant à
+l'extension du nom du fichier. Optionnellement, un
+représentant peut être associé (voir le fichier <span
+class="filename">video-decollage-avion.avi</span> dans l'exemple).</li>
+
+  <li><em>Attention</em> : le nom d'un répertoire ou d'un fichier ne doit
+être composé que de lettres, de chiffres, de "-", "_" ou ".". Pas d'espace
+ou de caractères accentués.</li>
+
+  <li><em>Conseil</em> : un album peut contenir des photos et des
+sous-album à la fois. Néanmoins, il est fortement conseillé pour chaque
+album de choisir entre contenir des photos <strong>ou bien</strong>
+des sous-album.</li>
+
+  <li>Une fois que les fichiers sont
+correctement placés dans les répertoires, se rendre sur l'écran <span
+class="pwgScreen">Administration &raquo; Outils &raquo; Synchroniser</span>.</li>
+
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/fr_FR/help/search.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/search.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Recherche</h2>
+
+<p>Recherche de photos dans l'ensemble de la galerie.</p>
+
+<dl>
+
+  <dt>Rechercher un mot</dt>
+
+  <dd>Recherche un ou plusieurs mots dans tous les attributs des photos de la galerie. Utiliser * comme joker pour les recherches partielles.</dd>
+  
+  <dt>Recherche d'un auteur</dt>
+
+  <dd>Utiliser * comme joker pour les recherches partielles.</dd>
+
+  <dt>Recherche par date</dt>
+
+  <dd>Sélectionner une date et/ou une date de fin. Laisser la date vide si
+vous souhaitez faire une recherche "avant". Dans le dernier champ, l'année doit être saisie avec 4 chiffres (2011 par exemple).</dd>
+
+  <dt>Recherche dans les albums</dt>
+
+  <dd>Sélectionner les albums sur lesquels restreindre la
+recherche. Il est possible de chercher dans tous les albums en sélectionnant l'album parent, et en autorisant la recherche dans les sous-albums.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_FR/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/site_manager.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Sites distants</h2>
+
+<p>Piwigo offre la possibilité d'utiliser plusieurs sites pour
+stocker les fichiers qui composeront votre galerie. Cela peut être utile si
+votre galerie est installée sur un espace de stockage limité et que vous
+ayez de nombreux fichiers à montrer.</p>
+
+
+<ol>
+
+  <li>éditer le fichier <span
+class="filename">tools/create_listing_file_local.inc.php</span> en modifiant la
+section des paramètres comme <code>$conf['prefix_thumbnail']</code> ou
+<code>$conf['use_exif']</code>.</li>
+
+  <li>par FTP, placer les fichiers <span
+class="filename">tools/create_listing_file.php</span> et <span
+class="filename">tools/create_listing_file_local.inc.php</span> (modifié) sur votre site
+distant, dans le même répertoire que les répertoires représentant vos
+albums (comme le répertoire <span class="filename">galleries</span> de
+ce site). Par exemple, disons que vous pouvez accéder à <span
+class="filename">http://exemple.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>se rendre sur <span class="pwgScreen">Administration &raquo; Outils &raquo;
+Gestionnaire des sites</span>. Demander à créer un nouveau site, par exemple <span
+class="filename">http://exemple.com/galleries</span>.</li>
+
+  <li>
+
+    <p>un nouveau site distant est enregistré. 4 actions sont possibles :</p>
+
+    <ol>
+
+      <li><strong>générer la liste</strong> : lance une requête distante pour
+générer le fichier de listing distant</li>
+
+      <li><strong>synchroniser</strong> : lit le fichier distant <span
+class="filename">listing.xml</span> et synchronise avec la base de données
+locale</li>
+
+      <li><strong>nettoyer</strong> : supprime le fichier distant de
+listing</li>
+
+      <li><strong>détruire</strong> : supprime le site (et toutes les informations
+qui y sont associées) dans la base de données</li>
+
+    </ol>
+
+  </li>
+
+</ol>
Index: tags/2.4.0RC3/language/fr_FR/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/synchronize.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Synchroniser</h2>
+
+<ul>
+
+  <li>Il existe 2 types de synchronisations : structure (répertoires/fichiers) et
+meta-données. Synchroniser la structure consiste à synchroniser l'arborescence
+de vos répertoires et fichiers avec leur représentation dans la
+base de données. La synchronisation des méta-données assure la mise à jour des
+informations telles que le poids du fichier, les dimensions, les données EXIF ou
+IPTC.</li>
+
+  <li>La première synchronisation à effectuer doit être celle sur la
+structure.</li>
+
+  <li>Le processus de synchronisation peut prendre du temps (en fonction de
+la charge du serveur et de la quantité de fichiers à gérer), il est donc
+possible de procéder album par album.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/fr_FR/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Création des miniatures</h2>
+
+<p>Création des miniatures manquantes. L'utilisation de cette fonctionnalité
+est déconseillée si votre galerie est hébergée sur un serveur
+mutualisé (ressources machine partagées).</p>
+
+<dl>
+
+  <dt>Version de GD</dt>
+
+  <dd>GD est une librairie graphique de manipulation de photo pour
+PHP. Choisissez la version installée sur votre serveur. Le système vous signalera par un message d'erreur si vous choisissez une mauvaise version ; revenez alors sur la page précédente et choisissez l'autre version. Si aucune version ne fonctionne, cela
+signifie que GD n'est pas disponible.</dd>
+
+  <dt>Largeur et hauteur</dt>
+
+  <dd>Dimensions maximales des miniatures peuvent prendre. Le rapport
+largeur/hauteur original est conservé. Les valeurs par défaut sont
+modifiables grâce aux paramètres de configuration <code>tn_width</code> et
+<code>tn_height</code> (voir le fichier <span
+class="filename">include/config_default.inc.php</span>).</dd>
+  
+  <dt>Nombre de miniatures à créer</dt>
+
+  <dd>N'essayez pas de miniaturiser un trop grand nombre de photos à la
+fois. Le traitement de miniaturisation nécessite en effet une utilisation intensive du processeur. Si votre galerie Piwigo est chez un hébergeur gratuit, une charge processeur trop importante est susceptible d'entraîner la suppression de votre site.</dd>
+
+  <dt>Format de fichier</dt>
+
+  <dd>Les miniatures sont créées au format JPEG. Seuls les photos aux formats PNG et
+JPEG peuvent être miniaturisées.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/fr_FR/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/fr_FR/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/help/user_list.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Liste des utilisateurs</h2>
+
+<p>Permet la gestion des propriétés des utilisateurs enregistrés, à l'exception des permissions, qui sont gérées via d'autres écrans.</p>
+
+<h3>Ajouter un utilisateur</h3>
+
+<p>L'administrateur peut ajouter manuellement des utilisateurs.</p>
+
+<h3>Liste des utilisateurs</h3>
+
+<p>La liste peut être filtrée avec le nom d'utilisateur (* = joker), avec le
+groupe ou encore le statut. La liste peut être triée par date
+d'enregistrement ou nom d'utilisateur, en ordre croissant ou
+décroissant.</p>
+
+<p>Cet écran permet la modification simultanée de plusieurs utilisateurs
+avec les actions suivantes :</p>
+
+<ul>
+  <li>supprimer des utilisateurs (nécessite une confirmation)</li>
+  <li>changer le statut</li>
+  <li>associer ou dissocier des groupes</li>
+  <li>modifier les propriétés d'affichage</li>
+  <li>modifier les propriétés annexes</li>
+</ul>
+
+<p>Les utilisateurs modifiés sont ceux sélectionnés (comportement par défaut) ou l'ensemble des utilisateurs de la liste filtrée.</p>
Index: tags/2.4.0RC3/language/fr_FR/index.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/fr_FR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/install.lang.php	(revision 14585)
@@ -0,0 +1,77 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "Installation";
+$lang['Basic configuration'] = "Configuration de base";
+$lang['Default gallery language'] = "Langue par défaut de la galerie";
+$lang['Database configuration'] = "Configuration de la base de données";
+$lang['Admin configuration'] = "Configuration du compte administrateur";
+$lang['Start Install'] = "Démarrer l'installation";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "L'adresse mail doit être de la forme xxx@yyy.eee (exemple : jack@altern.org)";
+$lang['Webmaster login'] = "Identifiant de l'administrateur";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "Cet identifiant apparaîtra à tous vos visiteurs. Il vous sert pour administrer le site";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "La connexion au serveur est OK, mais la connection à cette base de données est impossible";
+$lang['Can\'t connect to server'] = "Impossible de se connecter au serveur";
+$lang['Host'] = "Hôte";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "Utilisateur";
+$lang['user login given by your host provider'] = "nom d'utilisateur communiqué par votre hébergeur";
+$lang['Password'] = "Mot de passe";
+$lang['user password given by your host provider'] = "mot de passe utilisateur communiqué par votre hébergeur";
+$lang['Database name'] = "Nom de la base de données";
+$lang['also given by your host provider'] = "également fourni par votre hébergeur";
+$lang['Database table prefix'] = "Préfixe des noms de tables";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "le nom des tables sera précédé de ce préfixe (permet de mieux gérer sa base de données)";
+$lang['enter a login for webmaster'] = "veuillez rentrer un pseudo pour le webmaster";
+$lang['webmaster login can\'t contain characters \' or "'] = "le pseudo du webmaster ne doit pas comporter les caractères \" et '";
+$lang['please enter your password again'] = "veuillez resaisir votre mot de passe";
+$lang['Webmaster password'] = "Mot de passe du webmaster";
+$lang['Keep it confidential, it enables you to access administration panel'] = "Il doit rester confidentiel, il permet d'accéder à l'écran d'administration.";
+$lang['Password [confirm]'] = "Mot de passe [Confirmer]";
+$lang['verification'] = "vérification";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Besoin d'aide ? Posez votre question sur le <a href=\"%s\">forum de Piwigo</a>.";
+$lang['Webmaster mail address'] = "Adresse e-mail de l'administrateur";
+$lang['Visitors will be able to contact site administrator with this mail'] = "Les visiteurs pourront contacter l'administrateur du site par ce mail";
+$lang['PHP 5 is required'] = "PHP 5 est requis";
+$lang['It appears your webhost is currently running PHP %s.'] = "Apparemment, la version PHP de votre hébergeur est PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo va essayer de passer en PHP 5 en créant ou modifiant le fichier .htaccess.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "Notez que vous pouvez modifier vous-même la configuration PHP et re-lancer Piwigo ensuite.";
+$lang['Try to configure PHP 5'] = "Essayer de configurer PHP 5";
+$lang['Sorry!'] = "Désolé!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo n'a pas pu configurer PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Il vous faut contacter le support de votre hébergeur pour savoir comment configurer vous-même PHP 5.";
+$lang['Hope to see you back soon.'] = "En espérant vous revoir très prochainement.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Félicitations, l\'installation de Piwigo est terminée';
+
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Une solution alternative est de copier le texte dans la zone ci-dessous et de le coller dans le fichier "local/config/database.inc.php" (Attention: database.inc.php ne doit contenir que ce qui se trouve dans la zone, pas de retour à la ligne, pas d\'espace)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'La création du fichier de configuration local/config/database.inc.php a échoué.';
+$lang['Download the config file'] = 'Télécharger le fichier de configuration';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Vous pouvez télécharger le fichier de configuration et le transférer dans le répertoire local/config de votre installation Piwigo.';
+$lang['Just another Piwigo gallery'] = 'Une galerie Piwigo de plus';
+$lang['Welcome to my photo gallery'] = 'Bienvenue sur ma galerie photo';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bienvenue sur votre nouvelle installtion de Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'N\'hésitez pas à consulter nos forums si vous avez le moindre problème : %s';
+
+?>
Index: tags/2.4.0RC3/language/fr_FR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/fr_FR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Français [FR]
Index: tags/2.4.0RC3/language/fr_FR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/fr_FR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/fr_FR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Mise à jour";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Cette page vous propose de mettre à jour la base de données de votre ancienne version de piwigo vers la nouvelle version.
+L'assistant de mise à jour pense que vous disposez actuellement de la <strong>version %s</strong> (ou équivalente).";
+$lang['Upgrade from version %s to %s'] = "Mise à jour de la version %s à %s";
+$lang['Statistics'] = "Statistiques";
+$lang['total upgrade time'] = "temps total de la mise à jour";
+$lang['total SQL time'] = "temps total des requêtes SQL";
+$lang['SQL queries'] = "nombre de requêtes SQL";
+$lang['Upgrade informations'] = "Informations sur la mise à jour";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Veuillez effectuer une maintenance dans [Administration>Outils>Maintenance] si vous rencontrez des problèmes.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Par précaution, les plugins suivants ont été désactivés. Vérifiez s'il existe des mises à jour avant de les réactiver:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Seul un administrateur peut lancer la mise à jour: veuillez vous identifier ci-dessous.";
+$lang['You do not have access rights to run upgrade'] = "Vous n'avez pas les droits nécessaires pour lancer la mise à jour.";
+$lang['All sub-albums of private albums become private'] = 'Tous les sous-albums des albums privés deviennent privés';
+$lang['User permissions and group permissions have been erased'] = "Les permissions des utilisateurs et des groupes ont été effacées";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Seuls le préfixe des miniatures et l'adresse email du webmestre ont étés conservés de la précédente configuration";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Dans le fichier <i>%s</i>, avant <b>?></b>, insérez:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Par précaution, les thèmes suivants ont été désactivés. Vérifiez s\'il existe des mises à jour avant de les réactiver:';
+?>
Index: tags/2.4.0RC3/language/he_IL/about.html
===================================================================
--- tags/2.4.0RC3/language/he_IL/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/about.html	(revision 14585)
@@ -0,0 +1,13 @@
+<p>גלריית תמונות זו מבוססת על Piwigo.</p>
+
+<p>Piwigo זה מערכת גלריית תמונות מוכנה לאתרים, נבנתה על ידי קהילת מפתחים ומשתמשים פעילה. ניתן להתאים אישית את piwigo בקלות, והדובדבן שבקצפת piwigo בחינם בקוד פתוח.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">בקר באתר של Piwigo</a></p>
+
+<p>תורגם לעברית על ידי (לפי סדר הא"ב): 
+
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=10115">ADIRBITON</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=14250">nitzanmor</a></li>
+	</ul>
+           ....תודו להם</p>
Index: tags/2.4.0RC3/language/he_IL/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/he_IL/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/admin.lang.php	(revision 14585)
@@ -0,0 +1,834 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = 'סך הכול %d';
+$lang['%d associations'] = 'סך הכול %d';
+$lang['%d album including'] = 'כולל הקטגוריה %d';
+$lang['%d albums including'] = 'כולל הקטגוריות %d';
+$lang['%d physical'] = 'פיזי %d';
+$lang['%d physical'] = 'פיזי %d';
+$lang[' and %d virtual'] = 'ו %d וירטואלי';
+$lang[' and %d virtual'] = 'ו %d וירטואלים';
+$lang['%d album moved'] = '%d קטגוריה עברה';
+$lang['%d albums moved'] = '%d קטגוריות עברו';
+$lang['%d group'] = '%d קבוצה';
+$lang['%d groups'] = '%d קבוצות';
+$lang['%d member'] = '%d חבר';
+$lang['%d members'] = '%d חברים';
+$lang['%d tag'] = '%d תג';
+$lang['%d tags'] = '%d תגיות';
+$lang['%d user comment rejected'] = '%d תגובת המשתמש נדחתה';
+$lang['%d user comments rejected'] = '%d תגובות המשתמש נדחו';
+$lang['%d user comment validated'] = '%d תגובת המשתמש אושרה';
+$lang['%d user comments validated'] = '%d תגובות המשתמש אושרו';
+$lang['%d user deleted'] = '%d המשתמש נמחק';
+$lang['%d users deleted'] = '%d המשתמשים נמחקו';
+$lang['%d user'] = '%d משתמש';
+$lang['%d users'] = '%d משתמשים';
+$lang['%d waiting for validation'] = '%d מחכה לאימות';
+$lang['Actions'] = 'פעולות';
+$lang['Activate'] = 'להפעיל';
+$lang['Add/delete a permalink'] = 'הוספה / מחיקה של קישורית';
+$lang['Add a tag'] = 'הוסף תגית';
+$lang['Add a user'] = 'הוסף משתמש';
+$lang['Add group'] = 'הוסף קבוצה';
+$lang['Add'] = 'הוסף';
+$lang['Allow user registration'] = 'אפשר רישום משתמשים';
+$lang['Apply to sub-albums'] = 'החל על קטגוריות משניות';
+$lang['Associated'] = 'שייך';
+$lang['Caddie management'] = 'ניהול סל';
+$lang['Caddie'] = 'סל';
+$lang['Albums authorized thanks to group associations'] = 'הקטגוריה מאושרת אודות לקבוצת האסוציאציות';
+$lang['Album manual order was saved'] = 'סדר הקטגוריות נשמר';
+$lang['Check for upgrade failed for unknown reasons.'] = 'בדוק אם השדרוג נכשל מסיבות לא ידועות.';
+$lang['Check for upgrade'] = 'חפש עדכונים שדרוגים';
+$lang['Comments for all'] = 'תגובות עבור כל';
+$lang['Current name'] = 'השם הנוכחי';
+$lang['Database'] = 'מסד נתונים';
+$lang['Deactivate'] = 'לא פעיל';
+$lang['Delete Representant'] = 'מחק הצגה';
+$lang['Delete selected tags'] = 'מחק את התגים שנבחרו';
+$lang['Delete selected users'] = 'מחק את המשתמשים שנבחרו';
+$lang['Deletions'] = 'מחיקות';
+$lang['Deny selected groups'] = 'אסור קבוצות שנבחרו';
+$lang['Deny selected users'] = 'אסור משתמשים שנבחרו';
+$lang['Description'] = 'תיאור';
+$lang['Display options'] = 'הצגת אפשרויות';
+$lang['Dissociated'] = 'מנותק';
+$lang['Does not represent'] = 'האם לא מייצג';
+$lang['Edit selected tags'] = 'ערוך את התגים הנבחרים';
+$lang['Edit tags'] = 'ערוך תגיות';
+$lang['Email admins when a new user registers'] = 'שלח מייל למנהל כאשר נרשם משתמש חדש';
+$lang['Email admins when a valid comment is entered'] = 'שלח מייל למנהל כאשר נרשמת תגובה';
+$lang['Email admins when a comment requires validation'] = 'שלח מייל למנהל כאשר נדרש אימות לתגובה';
+$lang['Environment'] = 'סביבה';
+$lang['Form'] = 'טופס';
+$lang['Gallery title'] = 'כותרת הגלריה';
+$lang['Grant selected groups'] = 'להעניק לקבוצות שנבחרו';
+$lang['Grant selected users'] = 'להענית למשתמשים שנבחרו';
+$lang['Group name'] = 'שם הקבוצה';
+$lang['Groups'] = 'קבוצות';
+$lang['Guests'] = 'האורחים';
+$lang['History'] = 'היסטוריה';
+$lang['Informations'] = 'מידע';
+$lang['Install'] = 'התקן';
+$lang['Link all album photos to a new album'] = 'קישור כל הפריטים בקטגוריה לקטגוריה חדשה';
+$lang['Link all album photos to some existing albums'] = 'קישור כל הפריטים בקטגוריה לקטגוריה קיימת';
+$lang['Linked albums'] = 'קטגוריות מקושרות';
+$lang['Lock gallery'] = 'גלריה נעולה';
+$lang['Maintenance'] = 'תחזוקה';
+$lang['Edit album permissions'] = 'ניהול הרשאות עבור קטגוריה';
+$lang['Manage permissions for group "%s"'] = 'ניהול הרשאות עבור קבוצה "%s"';
+$lang['Manage permissions for user "%s"'] = 'ניהול הרשאות עבור המשתמש "%s"';
+$lang['Manage tags'] = 'ניהול תגים';
+$lang['Members'] = 'חברים';
+$lang['Metadata synchronized from file'] = 'סנכרון מידע מקובץ';
+$lang['Move albums'] = 'העבר הקטגוריות';
+$lang['Move'] = 'העבר';
+$lang['Name'] = 'שם';
+$lang['New name'] = 'שם חדש';
+$lang['New parent album'] = 'קטגורית אם חדשה';
+$lang['New tag'] = 'תג חדש';
+$lang['Number of comments per page'] = 'מספר תגובות בעמוד';
+$lang['Number of rates'] = 'מספר שיעורי';
+$lang['Number of thumbnails to create'] = ' מספר של תמונות ממוזערות ליצור';
+$lang['Only private albums are listed'] = 'קטגוריה פרטים לרשומים בלבד';
+$lang['Operating system'] = 'מערכת הפעלה';
+$lang['Options'] = 'אפשרויות';
+$lang['Other private albums'] = 'קטגוריות פרטיות אחרות';
+$lang['Page banner'] = 'באנר הדף';
+$lang['Parent album'] = 'קטגורית אם';
+$lang['Path'] = 'נתיב';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'השתמשו בעבר ב Permalink "%s" "זה עבור הקטגוריה "%s". מחק אותו ההסטוריה של permalink';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'השם Permalink חייב להיות מורכב a-z, A-Z, 0-9, "-", "_" או "/".הוא חייב לא להיות מספרי או להתחיל עם מספר "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink "%s" "נמצא כבר בשימוש על ידי הקטגוריה "%s"';
+$lang['Permalink history'] = 'ההיסטוריה Permalinks';
+$lang['Permalinks'] = 'קישורים מפנים';
+$lang['Permission denied'] = 'ההרשאה נדחתה';
+$lang['Permission granted thanks to a group'] = 'ההרשאה ניתנה בזכות הקבוצה';
+$lang['Permission granted'] = 'ניתנה הרשאה';
+$lang['Photo informations updated'] = 'מידע עבור התמונות הועלה';
+$lang['Plugins'] = 'תוספים';
+$lang['Position'] = 'מיקום';
+$lang['Preferences'] = 'העדפות';
+$lang['Properties'] = 'נכסים';
+$lang['Random photo'] = 'תמונה אקראית';
+$lang['Rate date'] = 'תאריך דירוג';
+$lang['Rating by guests'] = 'דירוג על ידי אורחים';
+$lang['Rating'] = 'דירוג';
+$lang['Reject'] = 'דחה';
+$lang['Representant'] = 'נציג';
+$lang['Representation of albums'] = 'ייצוג קטגוריות';
+$lang['Representative'] = 'הנציג';
+$lang['Represents'] = 'מייצג';
+$lang['Save order'] = 'שמור סדר';
+$lang['Save to permalink history'] = 'שמור להיסטורית Permalinks';
+$lang['Select at least one album'] = 'בחר לפחות בקטגוריה אחת';
+$lang['Select at least one photo'] = 'בחר לפחות תמונה אחת';
+$lang['Select at least one user'] = 'בחר לפחות משתמש אחד';
+$lang['Show info'] = 'הצג מידע';
+$lang['Site manager'] = 'מנהל אתר';
+$lang['Status'] = 'סטטוס';
+$lang['Statistics'] = 'סטטיסטיקה';
+$lang['Storage album'] = 'מחסן קטגוריות';
+$lang['Sum of rates'] = 'סכום של דירוג';
+$lang['Tag "%s" already exists'] = 'התג "%s"" כבר קיים';
+$lang['Tag "%s" was added'] = 'התג "%s"" נוסף';
+$lang['Tag selection'] = 'בחירת תגית';
+$lang['The %d following tags were deleted'] = 'התגיות הבאות %d נמחקו';
+$lang['Unable to check for upgrade.'] = 'אין אפשרות לבדוק אם קיימים שדרוגים.';
+$lang['Uninstall'] = 'הסר';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'השתמש תמונת ברירת המחדל להרשמה קצרה (מוגדרים בקובץ התצורה)';
+$lang['User comments validation'] = 'תגובות מאושרות של המשתמש';
+$lang['Users'] = 'משתמשים';
+$lang['Validate'] = 'אמת';
+$lang['Validation'] = 'אימות';
+$lang['Version'] = 'גרסה';
+$lang['Virtual albums to move'] = 'הקטגוריות וירטואליות להעברה';
+$lang['Virtual album name'] = 'שם קטגוריה וירטואלית';
+$lang['Webmaster cannot be deleted'] = 'לא ניתן למחוק את מנהל האתר';
+$lang['You are running on development sources, no check possible.'] = 'אתה פועל על מקורות בפיתוח, לא ניתן לבדוק.';
+$lang['You cannot delete your account'] = 'אתה לא יכול למחוק את החשבון שלך';
+$lang['You cannot move an album in its own sub album'] = 'אתה לא יכול להעביר קטגוריה לתוך התת קטגוריה שלה';
+$lang['You need to confirm deletion'] = 'אתה חייב לאשר את המחיקה';
+$lang['add tags'] = 'להוסיף תגיות';
+$lang['Associate to album'] = 'לשייך לקטגוריה';
+$lang['associate to group'] = 'לשייך לקבוצה';
+$lang['Authorized'] = 'מורשה';
+$lang['Add a virtual album'] = 'הוספת קטגוריה וירטואלית';
+$lang['Authorize users to add comments on selected albums'] = 'הרשה למשתמשים להוסיף תגובות לקטגוריות שנבחרו';
+$lang['The name of an album must not be empty'] = 'השם של הקטגוריה לא יכול להיות ריק';
+$lang['Lock albums'] = 'נעל קטגוריות';
+$lang['Private'] = 'קטגוריה פרטית';
+$lang['Public'] = 'קטגוריה ציבורית';
+$lang['Find a new representant by random'] = 'מצא ייצוג אקראי חדש';
+$lang['Public / Private'] = 'ציבורי / פרטי';
+$lang['Manage authorizations for selected albums'] = 'נהל הרשאות עבור הקטגוריות שנבחרו';
+$lang['Virtual album added'] = 'קטגוריה וירטואלית נוספה';
+$lang['Virtual album deleted'] = 'קטגוריה וירטואלית נמחקה';
+$lang['Access type'] = 'סוג גישה';
+$lang['Information data registered in database'] = 'מידע הנתונים רשום במאגר נתונים';
+$lang['Default display'] = 'תצוגת ברירת המחדל';
+$lang['The gallery URL is not valid.'] = 'ה-URL בגלריה אינו חוקי.';
+$lang['Main'] = 'ראשי';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'מספר הערות בדף חייב להיות בין 5 ל 50 כולל.';
+$lang['Configuration'] = 'תצורה';
+$lang['confirm'] = 'לאשר';
+$lang['Date'] = 'תאריך';
+$lang['delete album'] = 'למחוק את הקטגוריה';
+$lang['Dissociate from album'] = 'נתק מהקטגוריה';
+$lang['dissociate from group'] = 'נתק מהקבוצה';
+$lang['Album updated successfully'] = 'מידע על הקטגוריה עודכן בהצלחה.';
+$lang['photos per page'] = 'פריטים בעמוד';
+$lang['High definition enabled'] = 'איכות גבוהה מופעלת';
+$lang['File'] = 'קובץ';
+$lang['first photo added on %s'] = 'הפריט הראשון התווסף ב"%s "';
+$lang['Forbidden'] = 'אסורה';
+$lang['global mode'] = 'מצב גלובלי';
+$lang['group "%s" added'] = 'הקבוצה "%s"" נוספה';
+$lang['group "%s" deleted'] = 'הקבוצה "%s"" נמחקה';
+$lang['group "%s" updated'] = 'הקבוצה "%s"" הועלתה';
+$lang['The name of a group must not contain " or \' or be empty.'] = "שם של קבוצה לא יכול להכיל מרחאות או ' או להיות ריק";
+$lang['This name is already used by another group.'] = 'שם זה נמצא כבר בשימוש על ידי קבוצה אחרת.'; 
+
+$lang['High definition'] = 'בחדות גבוהה';
+$lang['jump to album'] = 'לקפוץ לקטגוריה';
+$lang['jump to photo'] = 'קפיצה אל התמונה';
+$lang['leave'] = 'לעזוב';
+$lang['Lock'] = 'נעל';
+$lang['Locked'] = 'נעול';
+$lang['manage album photos'] = 'ניהול פריטים בקטגוריה';
+$lang['manage sub-albums'] = 'ניהול קטגוריות משנה';
+$lang['Manage'] = 'ניהול';
+$lang['maximum height'] = 'גובה מרבי';
+$lang['maximum width'] = 'רוחב מרבי';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'זמן ביצוע יוצא, הטיפול חייב להיות המשך [זמן משוער:% השני ד].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'זמן ביצוע חריגה, הטיפול חייב להמשיך [זמן משוער:% d שניות].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'הגיע הזמן להכין את רשימת המשתמשים אשר יישלח בדואר מוגבל למשתמשים אחרים אינם מפורטים..';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'הזמן כדי לשלוח דואר אלקטרוני מוגבל אחרים כבר דילג..';
+$lang['To send ?'] = 'כדי לשלוח?';
+$lang['Last send'] = 'לאחרונה שלחה';
+$lang['email'] = 'דואר אלקטרוני';
+$lang['User'] = 'משתמש';
+$lang['See you soon,'] = 'נתראה בקרוב';
+$lang['Go to'] = 'עבור';
+$lang['Hello'] = 'שלום';
+$lang['New photos were added'] = 'אלמנטים חדשים נוספו';
+$lang['on'] = 'על  Piwigo';
+$lang['between'] = 'בין';
+$lang['and'] = 'ו';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'שמנהל האתר רשום לך לקבל הודעות בדואר.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'יש לך מנוי כדי לקבל הודעות בדואר.';
+$lang['To subscribe'] = 'כדי להירשם';
+$lang['If you encounter problems or have any question, please send a message to'] = 'אם אתה נתקל בבעיות או יש לך שאלה, שילחו הודעה ל';
+$lang['[NBM] Problems or questions'] = '[NBM] בעיות או שאלות';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'שמנהל האתר הרשמתך ממך לקבל הודעות בדואר.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'ביטלת את המנוי מלהיות הודעה בדואר.';
+$lang[', click on'] = ', לחץ על';
+$lang['To unsubscribe'] = 'כדי לבטל את המינוי';
+$lang['With blank value, gallery title will be used'] = 'אם ריק, הכותרת בגלריה ישמש';
+$lang['Notification'] = 'עידכוני RSS';
+$lang['Error when sending email to %s [%s].'] = 'שגיאה בעת שליחת דוא"ל אל""%s" "["%s"].';
+$lang['Mail sent to %s [%s].'] = 'דואר שנשלח""%s" "["%s"].';
+$lang['%d mail was sent.'] = 'ד הדואר% נשלחה.';
+$lang['%d mails were sent.'] = 'ד אלקטרוני% נשלחו.';
+$lang['%d mail was not sent.'] = 'ד הדואר% לא נשלחה.';
+$lang['%d mails were not sent.'] = 'ד אלקטרוני% לא נשלחו.';
+$lang['No mail to send.'] = 'דואר לא יישלחו.';
+$lang['There is no available subscribers to mail.'] = 'אין נרשמים כדי לקבל הודעה בדואר.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'המנויים יכולים להיות רשומים (כניסה) רק אם יש אלמנטים חדשים כדי להודיע.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'מנהלי אתרים רק בכל אופן ניתן לראות את הכרטיסייה, לא מנהלים.';
+$lang['No user to send notifications by mail.'] = 'המשתמש לא כדי לקבל הודעה בדואר.';
+$lang['New photos added'] = 'אלמנטים חדשים שנוספו';
+$lang['Subscribe to notification by mail'] = 'מודלים הודעה בדואר';
+$lang['Unsubscribe from notification by mail'] = 'הסרה מרשימת הודעה בדואר';
+$lang['Parameter'] = 'הגדרות';
+$lang['Operation in progress'] = 'הטיפול מתבצעת.';
+$lang['Continue processing treatment'] = 'המשך הטיפול השוטף';
+$lang['Complementary mail content'] = 'דואר תוכן משלימים';
+$lang['Add detailed content'] = 'מוסיפים קצת תוכן מפורט';
+$lang['Send mail as'] = 'שלח דואר כ';
+$lang['Send mail to users'] = 'שלח דואר למשתמשים';
+$lang['Send'] = 'שלח';
+$lang['Options'] = 'אפשרויות';
+$lang['Subscribed'] = 'מנויים';
+$lang['Subscribe'] = 'הרשם';
+$lang['Parameters'] = 'פרמטרים';
+$lang['Select recipients'] = 'בחירת נמענים';
+$lang['Subscribe/unsubscribe users'] = 'להירשם / לבטל את המנוי משתמשים';
+$lang['Unsubscribed'] = 'המינוי';
+$lang['%d parameter was updated.'] = 'ד פרמטר% המעודכן.';
+$lang['%d parameters were updated.'] = 'ד הפרמטרים% המעודכן.';
+$lang['%d user was not updated.'] = 'המשתמש% d לא מעודכן.';
+$lang['%d users were not updated.'] = 'ד למשתמשים% לא מעודכן.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'המשתמש""%s" "["%s"] מרשימת המנויים.';
+$lang['User %s [%s] was added to the subscription list.'] = 'המשתמש""%s" "["%s"] לרשימת המנויים.';
+$lang['%d user was updated.'] = 'ד המשתמש% המעודכן.';
+$lang['%d users were updated.'] = 'ד למשתמשים% המעודכן.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'המשתמש""%s" "["%s"] לא יוסר מרשימת המנויים.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'המשתמש""%s" "["%s"] לא הוסיף לרשימה המנוי.';
+$lang['User %s [%s] added.'] = 'המשתמש""%s" "["%s"] הוסיף.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'אזהרה: מנוי או ביטול המנוי תשלח מיילים למשתמשים';
+$lang['Send mail on HTML format'] = 'שלח דואר בתבנית HTML';
+$lang['Include display of recent photos grouped by dates'] = 'להציג כלול התמונות האחרונות מקובצים לפי תאריכים';
+$lang['Available only with HTML format'] = 'ניתן להשיג רק עם פורמט HTML';
+$lang['no write access'] = 'אין גישה לכתוב';
+$lang['Permissions'] = 'הרשאות';
+$lang['private'] = 'פרטית';
+$lang['public'] = 'הציבור';
+$lang['Purge never used notification feeds'] = 'הטיהור מעולם ההודעה בשימוש הזנות';
+$lang['Purge sessions'] = 'מפגשים הטיהור';
+$lang['randomly represented'] = 'נציג אקראי';
+$lang['registration date'] = 'תאריך רישום';
+$lang['clean'] = 'לנקות';
+$lang['remove remote listing.xml file'] = 'להסיר את הקובץ listing.xml מרחוק';
+$lang['generate listing'] = 'לייצר רשימה';
+$lang['generate file listing.xml on remote site'] = 'לייצר listing.xml הקובץ באתר מרוחק';
+$lang['Create this site'] = 'צור את האתר הזה';
+$lang['A local listing.xml file has been found for'] = 'הקובץ listing.xml המקומית כבר מצאו עבור';
+$lang['read local listing.xml and update'] = 'לקרוא listing.xml עדכון המקומית';
+$lang['test'] = 'מבחן';
+$lang['test this remote site'] = 'מבחן זה באתר מרוחק'; 
+$lang['remove tags'] = 'להסיר את תגי';
+$lang['Repair and optimize database'] = 'תיקון מסד אופטימיזציה';
+$lang['selection'] = 'הבחירה';
+$lang['set to'] = 'מוגדר';
+$lang['singly represented'] = 'נציג קבוע';
+$lang['This site already exists'] = 'אתר זה כבר קיים';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'צור אתר חדש: (לתת את כתובת האתר שלו כדי create_listing_file.php)';
+$lang['created'] = 'יצר';
+$lang['delete'] = 'למחוק';
+$lang['delete this site and all its attached elements'] = 'למחוק את האתר הזה ואת כל המידע בנושא';
+$lang['an error happened'] = 'אירעה שגיאה';
+$lang['file create_listing_file.php on remote site was not found'] = 'Create_listing_file.php הקובץ לא נמצא באתר המרוחק';
+$lang['Local'] = 'מקומית';
+$lang['Remote'] = 'מרחוק';
+$lang['update the database from files'] = 'לעדכן את מסד הנתונים עם קבצים';
+$lang['status'] = 'מעמד';
+$lang['Directory'] = 'מדריך';
+$lang['sub-albums'] = 'קטגוריות משנה';
+$lang['Synchronize metadata'] = 'לסנכרן מטה';
+$lang['target'] = 'המטרה';
+$lang['title'] = 'כותרת';
+$lang['Album list management'] = 'ניהול קטגוריות';
+$lang['Piwigo configuration'] = 'תצורה Piwigo';
+$lang['Edit album'] = 'ערוך קטגוריה';
+$lang['Group management'] = 'ניהול קבוצות';
+$lang['User list'] = 'רשימת משתמשים';
+$lang['Edit photo information'] = 'שינוי פרטים בתמונה';
+$lang['Thumbnail creation'] = 'יצירת תמונה';
+$lang['Database synchronization with files'] = 'מסד נתונים לסינכרון עם קבצים';
+$lang['all'] = 'כל';
+$lang['photos without thumbnail (jpeg and png only)'] = 'תמונות ללא תמונה (JPEG ו-PNG בלבד)';
+$lang['height must be a number superior to'] = 'גובה חייב להיות מספר גדול יותר';
+$lang['width must be a number superior to'] = 'רוחב חייב להיות מספר גדול יותר';
+$lang['for the file format'] = 'עבור פורמט קובץ';
+$lang['No missing thumbnail'] = 'אין תמונה חסר';
+$lang['Photo unreachable or no support'] = 'תמונה בפורמט נגיש או נתמך';
+$lang['GD version'] = 'גרסת ה ';
+$lang['generated in'] = 'נוצר ב';
+$lang['Results of miniaturization'] = 'תהליך המזעור תוצאות';
+$lang['General statistics'] = 'סטטיסטיקה';
+$lang['max time'] = 'זמן מקסימום';
+$lang['average time'] = 'הזמן הממוצע';
+$lang['min time'] = 'בפעם דקות';
+$lang['number of miniaturized photos'] = 'מספר תמונות ממוזערות נוצר';
+$lang['total time'] = 'זמן מסך';
+$lang['for this file format'] = 'עבור פורמט קובץ זה';
+$lang['unit mode'] = 'מצב יחיד';
+$lang['Unlocked'] = 'נעולים';
+$lang['unset'] = 'Unset';
+$lang['Update albums informations'] = 'עדכון פרטים הקטגוריות';
+$lang['Update photos information'] = 'עדכון פרטים תמונות';
+$lang['Synchronize'] = 'סנכרן';
+$lang['reduce to single existing albums'] = 'כדי לצמצם את הקטגוריות הקיימות יחיד';
+$lang['Choose an option'] = 'בחר באפשרות';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'מקסימום מידע לתצוגה (קטגוריות הוסיף אלמנטים, קטגוריות שנמחקו אלמנטים)';
+$lang['Piwigo version differs on the remote site'] = 'גרסה שונה Piwigo באתר המרוחק';
+$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = 'גרסאות של create_listing_file.php באתר המרוחק Piwigo חייבים להיות זהים';
+$lang['listing.xml file was not found'] = 'הקובץ listing.xml לא נמצא';
+$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = 'הקובץ listing.xml לא נמצא באתר מרוחק זה הקובץ שנוצר עם ". לייצר רשימה  "הפקודה מנהל האתר';
+$lang['Error list'] = 'רשימת שגיאות';
+$lang['Errors caption'] = 'שגיאות אגדות';
+$lang['Detailed informations'] = 'ידיעות מפורט';
+$lang['File/directory read error'] = 'קובץ / ספרייה לקרוא שגיאה';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'הקובץ או הספרייה לא ניתן לגשת (או שזה לא קיים או הגישה נדחתה)';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'סוג הקובץ התמונה דורש תמונה תמונה חייב להיות נוכח במדריך קטן ". תמונה  "של המדריך את הקטגוריה תמונה שם הקובץ חייב להתחיל עם הקידומת תמונה מוגדר ההרחבה חייב להיות בין הרשימה הבאה:.';
+$lang['missing thumbnail'] = 'חסר תמונה';
+$lang['albums deleted in the database'] = 'קטגוריות שנמחקו באתר';
+$lang['photos deleted from the database'] = 'אלמנטים שנמחקו באתר';
+$lang['photos candidates for metadata synchronization'] = 'תמונות המועמדים לסינכרון מטה';
+$lang['photos informations synchronized with files metadata'] = 'אלמנטים ידיעות מסונכרן עם metadata קבצים';
+$lang['errors during synchronization'] = 'טעויות במהלך הסנכרון';
+$lang['albums added in the database'] = 'הקטגוריות הוסיף באתר';
+$lang['photos added in the database'] = 'רכיבים נוספים באתר';
+$lang['photos updated in the database'] = 'אלמנטים עודכן באתר';
+$lang['Search for new images in the directories'] = 'מחפש תמונות חדשות של ספריות';
+$lang['added'] = 'מוסף';
+$lang['deleted'] = 'נמחק';
+$lang['Metadata synchronization results'] = 'Metadata תוצאות סינכרון';
+$lang['only perform a simulation (no change in database will be made)'] = 'רק לבצע סימולציה (דבר יהיה שונה במסד הנתונים)';
+$lang['Simulation'] = 'הדמיה';
+$lang['directories + files'] = 'תמונות + תקיות';
+$lang['only directories'] = 'תקיות בלבד';
+$lang['synchronize files structure with database'] = 'לסנכרן מבנה קבצים עם מסד נתונים';
+$lang['synchronize files metadata with database photos informations'] = 'לסנכרן אלמנטים מסד נתונים עם metadata קבצים';
+$lang['even already synchronized photos'] = 'אפילו פריטים שסונכרנו כבר';
+$lang['Used metadata'] = 'Metadata בשימוש';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'השם של תיקיות וקבצים חייב לכלול רק אותיות, מספרים, " -  ", " _  "או "  "';
+$lang['wrong filename'] = 'שם קובץ שגוי';
+$lang['Upload'] = 'העלה';
+$lang['user "%s" added'] = 'המשתמש "%s" נוסף';
+$lang['User status'] = 'מצב משתמש';
+$lang['user_status_admin'] = 'מחובר כמשתמש כמנהל';
+$lang['user_status_generic'] = 'מחובר כמשתמש כללי';
+$lang['user_status_guest'] = 'מחובר כמשתמש אורח';
+$lang['user_status_normal'] = 'מחובר כמשתמש רגיל';
+$lang['user_status_webmaster'] = 'מחובר כמשתמש מנהל האתר';
+$lang['Virtual album'] = 'הקטגוריה וירטואלית';
+$lang['Waiting'] = 'בהמתנה';
+$lang['default'] = 'ברירת המחדל';
+$lang['Toggle \'default group\' property'] = "תייג 'קבוצת ברירת מחדל' ערך";
+$lang['Advanced features'] = 'תכונות מתקדמות';
+$lang['Specials'] = 'מבצעים';
+$lang['Overall'] = 'מבט';
+$lang['Year'] = 'שנה';
+$lang['Month'] = 'חודש';
+$lang['Day'] = 'יום';
+$lang['Pages seen'] = 'דפים שניצפו';
+$lang['Time'] = 'זמן';
+$lang['IP'] = 'אי פי';
+$lang['Element'] = 'מרכיב';
+$lang['Section'] = 'סעיף';
+$lang['Save page visits by guests'] = 'שמור דפים שניצפו על ידי אורחים';
+$lang['Save page visits by users'] = 'שמור דפים שנצפו על ידי משתמשים';
+$lang['Save page visits by administrators'] = 'שמור דפים שנצפו על ידי מנהל ראשי';
+$lang['An information email was sent to group "%s"'] = 'דואר אלקטרוני נשלח לקבוצה "%s"';
+$lang['Send an information email to group members'] = 'שלח הודעת דואר אלקטרוני מידע על חברי הקבוצה';
+$lang['Group'] = 'הקבוצה';
+$lang['%s value is not correct file because exif are not supported'] = '%s התמונה לא הועלתה כיוון שהאתר לא תומך בפורמט תמונה זה';
+$lang['Hello,'] = 'שלום,';
+$lang['See you soon.'] = 'נתראה בקרוב.';
+$lang['Discover album:'] = 'גלה את הקטגוריה:';
+$lang['Mail content'] = 'דואר תוכן';
+$lang['none'] = 'אף אחד';
+$lang['high'] = 'גבוהה';
+$lang['other'] = 'אחרים';
+$lang['Element type'] = 'סוג מרכיב';
+$lang['Image id'] = 'מזהה תמונה';
+$lang['Summary'] = 'סיכום';
+$lang['%d line filtered'] = '%d שורה מסומנת';
+$lang['%d lines filtered'] = '%d שורות מסומנות';
+$lang['%d guest'] = '%d אורח';
+$lang['%d guests'] = '%d אורחים';
+$lang['Hour'] = 'שעה';
+$lang['guest'] = 'האורח';
+$lang['default values'] = 'ערכי ברירת המחדל';
+$lang['High filesize'] = 'High גודל הקובץ ברזולוציה';
+$lang['Guest cannot be deleted'] = 'חוות דעת לא ניתן למחוק';
+$lang['Default user cannot be deleted'] = 'המשתמש ברירת מחדל ולא ניתן למחוק';
+$lang['Purge history detail'] = 'ההיסטוריה פרטים הטיהור';
+$lang['Purge history summary'] = 'ההיסטוריה סיכום הטיהור';
+$lang['Check integrity'] = 'בדיקת תקינות';
+$lang['Anomaly'] = 'אנומליה';
+$lang['Correction'] = 'תיקון';
+$lang['Automatic correction'] = 'תיקון אוטומטי';
+$lang['Impossible automatic correction'] = 'אוטומטיים impossibl תיקון';
+$lang['Correction applied with success'] = 'תיקון מיושם בהצלחה';
+$lang['Correction applied with error'] = 'תיקון להחיל עם שגיאה';
+$lang['%d anomaly has been detected.'] = '%d חריגה זוהתה.';
+$lang['%d anomalies have been detected.'] = '%d חריגות זוהו.';
+$lang['%d anomaly has been corrected.'] = '%d חריגה תוקנה.';
+$lang['%d anomalies have been detected corrected.'] = '%d חריגות תוקנו.';
+$lang['%d anomaly has not been corrected.'] = '%d תריגה לא תוקנה.';
+$lang['%d anomalies have not been corrected.'] = '%d חריגות לא תוקנו.';
+$lang['[%s] Visit album %s'] = 'עבור אל "%s" או "%s" למידע';
+$lang['the forum'] = 'הפורום';
+$lang['the wiki'] = 'המילון';
+$lang['Go to %s or %s for more informations'] = 'הערך "%s" חייב להיות מדוייק כיוון שלא ניתן להשתמש ב exif';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '"%s" "חייב להיות מוגדר שווא בקובץ המקומי שלך / / config config.inc.php';
+$lang['Main "guest" user does not exist'] = 'המשתמש "אורח" לא קיים';
+$lang['Main "guest" user status is incorrect'] = 'הסטטוס של ה"אורח" לא נכון';
+$lang['Default user does not exist'] = 'המשתמש של ברירת המחדל אינה קיימת';
+$lang['Main "webmaster" user does not exist'] = 'המשתמש "מנהל האתר" לא קיים';
+$lang['Main "webmaster" user status is incorrect'] = 'המשתמש "מנהל האתר" לא נכון';
+$lang['User "%s" created with "%s" like password'] = 'המשתמש "%s" נוצר עם "%s" ואותה סיסמה';
+$lang['Status of user "%s" updated'] = 'הסטטוס של המשתמש "%s" עודכן';
+$lang['add new photos to caddie'] = 'הוסף פריט חדש לסל';
+$lang['No display'] = 'לא להציג';
+$lang['Classic display'] = 'תצוגה קלאסית';
+$lang['Hoverbox display'] = 'להציג Hoverbox';
+$lang['Mail address is obligatory for all users'] = 'כתובת דואר הוא חובה עבור כל המשתמשים';
+$lang['Minimum privacy level'] = 'מינימום רמת הפרטיות';
+$lang['Privacy level'] = 'פרטיות ברמה';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'אנשי קשר';
+$lang['Level 2'] = 'החברים';
+$lang['Level 4'] = 'משפחה';
+$lang['Level 8'] = 'מנהלים';
+$lang['Reinitialize check integrity'] = 'Reinitialize בדיקת תקינות';
+$lang['Check all'] = 'בדוק את כל';
+$lang['Uncheck all'] = 'בטל את כל';
+$lang['Check automatic corrections'] = 'בדוק תיקונים אוטומטיים';
+$lang['Apply selected corrections'] = 'תיקונים שנבחר החל';
+$lang['Ignore selected anomalies'] = 'התעלם אנומליות נבחר';
+$lang['Refresh'] = 'רענון';
+$lang['The anomaly will be ignored until next application version'] = 'האנומליה תתעלם עד לגרסה הבאה הבקשה';
+$lang["Correction the anomaly will cancel the fact that it's ignored"] = 'תיקן האנומליה לא יהיה עוד להתעלם ממנו';
+$lang['%d anomaly has been ignored.'] = '%d חריגה שהתעלמתה ממנה.';
+$lang['%d anomalies have been ignored.'] = '%d חריגות שהתעלמה מהן.';
+$lang['Plugins which need upgrade'] = 'תוספים שיש לעדכן';
+$lang['Plugin list'] = 'רשימת תוספים';
+$lang['Check for updates'] = 'בדוק עדכונים';
+$lang['Other plugins'] = 'תוספים נוספים זמינים';
+$lang['Last revisions'] = 'התיקונים האחרונים';
+$lang['Delete'] = 'מחק';
+$lang['Are you sure you want to delete this plugin?'] = 'האם אתה בטוח שאתה רוצה למחוק את התוסף הזה?';
+$lang['Are you sure you want to install this plugin?'] = 'האם אתה בטוח שאתה רוצה להתקין את התוסף הזה?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'האם אתה בטוח שאתה רוצה להתקין את השדרוג, עליך לוודא אם הגרסה הזאת לא צריך ההסרה לפני?.';
+$lang['%s has been successfully upgraded.'] = '"%s" "שודרג בהצלחה.';
+$lang['Plugin has been successfully copied'] = 'תוסף הועתקה בהצלחה';
+$lang['You might go to plugin list to install and activate it.'] = 'עבור אל רשימת התוספים להתקין ולהפעיל אותו.';
+$lang["Can't create temporary file."] = 'קובץ זמני אינו יכול להיווצר.';
+$lang["Can't download archive."] = 'ארכיון לא ניתן להוריד.';
+$lang["Can't read or extract archive."] = 'ארכיון לא ניתן לקרוא או חילוץ.';
+$lang['An error occured during extraction (%s).'] = 'אירעה שגיאה במהלך קבצים ("%s") החילוץ.';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'בבקשה בדוק את ההרשאות לתיקיה "plugins" ולתת תיקיות שלה (CHMOD)';
+$lang["Can't connect to server."] = 'החיבור לשרת בלתי אפשרי.';
+$lang['Purge compiled templates'] = 'הידור הטיהור תבניות';
+$lang['ACCESS_0'] = 'גישה חופשית';
+$lang['ACCESS_1'] = 'גישה לכל';
+$lang['ACCESS_2'] = 'גישה למשתמשים רשומים';
+$lang['ACCESS_3'] = 'גישה למנהלים';
+$lang['ACCESS_4'] = 'גישה למנהל האתר';
+$lang['ACCESS_5'] = 'אין גישה';
+$lang['Support'] = 'תמיכה';
+$lang['Documentation'] = 'תיעוד';
+$lang['A new version of Piwigo is available.'] = 'הגרסה החדשה של Piwigo זמין.';
+$lang['Piwigo Administration'] = 'המינהל Piwigo';
+$lang['Piwigo version'] = 'הגרסה Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'אתה מפעיל את הגירסה העדכנית Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'הגרסה של""%s" "["%s"] התקנת אינו תואם לגרסה הנדרש ["%s"]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'אתה צריך לשדרג את המערכת שלך כדי לנצל את מלוא היתרונות של הבקשה, אחרת הבקשה יכול לעבוד כראוי, או בכלל לא';
+$lang['Deleted on'] = 'נמחק על';
+$lang['Last hit'] = 'מכה אחרונה';
+$lang['GD library is missing'] = 'ספריית GD חסר';
+$lang['Templates'] = 'תבניות';
+$lang['Extend for templates'] = 'הרחב תבניות';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'החלפת המקורי תבניות ידי אישית תבניות מ-תיקיית משנה סיומת התבנית';
+$lang['Replacers (customized templates)'] = 'ותחליפיו (אישית תבניות)';
+$lang['Original templates'] = 'מקורי תבניות';
+$lang['Optional URL keyword'] = 'מילת המפתח תכנית אופציונלית';
+$lang['Templates configuration has been recorded.'] = 'תצורה תבניות נרשמה.';
+$lang['All optimizations have been successfully completed.'] = 'אופטימיזציות כל הושלמו בהצלחה.';
+$lang['Optimizations have been completed with some errors.'] = 'אופטימיזציות הושלמו עם שגיאות כמה.';
+$lang['Modify information'] = 'שינוי פרטים';
+$lang['nothing'] = 'שום דבר';
+$lang['overrides existing values with empty ones'] = 'מלא ערכים קיימים עם ערכים ריקים';
+$lang['Manage photo ranks'] = 'נהל את דירוג התמונות';
+$lang['Edit ranks'] = 'ערוך דירוג';
+$lang['No photo in this album'] = 'אין פריט בקטגוריה זו';
+$lang['Images manual order was saved'] = 'סדר התמונות נשמה';
+$lang['ranks'] = 'דירוגים';
+$lang['By rank'] = 'לפי דירוג';
+$lang['Manual order'] = 'סדר ידני ';
+$lang['Drag to re-order'] = 'גרור כדי לסדר מחדש';
+$lang['Quick Local Synchronization'] = 'סנכרון מקומי מהיר';
+$lang['No photo can be deleted'] = 'לא ניתן למחוק את התמונה';
+$lang['Delete selected photos'] = 'מחק רת בתמונות שנבחרו';
+$lang['%d photo was deleted'] = '%d תמונה נמחקה';
+$lang['%d photos were deleted'] = '%d תמונות נמחקו';
+$lang['Downloads'] = 'הורדות';
+$lang['Released on'] = 'יצא';
+$lang['Number of downloads'] = 'מספר הורדות';
+$lang['Piwigo Announcements Newsletter'] = 'עלון Piwigo';
+$lang["Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it's important to know and upgrade) and when major events happen to the project. Only a few emails a year."] = 'שמור על קשר עם פרויקט Piwigo, ההירשם לעלון של Piwigo. תישלח אליך הודעות דוא"ל כאשר מהדורה חדשה תיהיה זמינה (לפעמים כולל תיקון באג אבטחה, חשוב לדעת ולשדרג) וכאשר ישנם אירועים מרכזיים הפרויקט. רק כמה הודעות דוא"ל בשנה ';
+$lang['Subscribe %s'] = 'הירשם "%s"';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'הרשם""%s" "כדי Piwigo עלון הכרזות';
+$lang['Purge search history'] = 'נקה את היסטורית החיפוש';
+$lang['Hide'] = 'הסתר';
+$lang['Password is missing. Please enter the password.'] = 'סיסמה חסרה, נה להזין סיסמה..';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'אישור סיסמה חסר, נה להזיר אישור סיסמה..';
+$lang['Password confirmation error.'] = 'שגיאה באישור הסיסמה.';
+$lang['Allow users to edit their own comments'] = 'אפשר למשתמשים לערוך הערות משלהם';
+$lang['Allow users to delete their own comments'] = 'אפשר למשתמשים למחוק את התגובות שלהם';
+$lang['Email administrators when a comment is modified'] = 'שלח מייל למנהלים כאשר תגובה שונתה';
+$lang['Email administrators when a comment is deleted'] = 'שלח מייל למנהלים כאשר תגובה נמחקה';
+$lang['Cannot delete the old permalink !'] = 'אל תמחק את הPermalink הישן';
+$lang['Hit'] = 'לחיצה'; 
+$lang['Tools'] = 'כלים';
+$lang['Photos'] = 'תמונות';
+$lang['Themes'] = 'ערכות נושא';
+$lang['Instructions to use Piwigo'] = 'הוראות שימוש Piwigo';
+$lang['Installed Themes'] = 'ערכות נושא מותקנות';
+$lang['Add New Theme'] = 'הוסף נושא חדש';
+$lang['Forbid this theme to users'] = 'לאסור על הנושא הזה למשתמשים';
+$lang['Set as default theme for unregistered and new users'] = 'Set as הנושא ברירת המחדל עבור משתמשים רשומים ו החדש';
+$lang['unknown'] = 'לא ידוע';
+$lang['Upload Photos'] = 'העלאת תמונות';
+$lang['Drop into album'] = 'צניחה לתוך הקטגוריה';
+$lang['+ Add an upload box'] = '+ הוספת להעלות תיבת ';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'יצירת"%s "ספרייה בשורש של ההתקנה שלך Piwigo ';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'תן הרשאות (chmod 777) ל"%s" בתקיית שורש איפה שההתקנה שלך נמצאת';
+$lang['existing album'] = 'הקטגוריה הקיימת';
+$lang['create a new album'] = 'ליצור קטגוריה חדשה ';
+$lang['Album name'] = 'שם קטגוריה ';
+$lang['Album "%s" has been added'] = 'הקטגוריה "%s" נוספה';
+$lang['Uploaded Photos'] = 'התמונות העלאה ';
+$lang['%d photos uploaded'] = '%d תמונות הועלו';
+$lang['Privacy level set to "%s"'] = 'רמת פרטיות מוגדרת ל "%s"';
+$lang['Album "%s" now contains %d photos'] = 'הקטגוריה "%s" מכילה כעט %d תמונות';
+$lang['Manage this set of %d photos'] = 'נהל את קבוצת התמונות הזאת (%d תמונות)';
+$lang['Select files'] = 'בחר קבצים';
+$lang['Everybody'] = 'כולם';
+$lang['Who can see these photos?'] = 'מי יכול לראות את התמונות?';
+$lang['Who can see this photo?'] = 'מי יכול לראות את התמונה?';
+$lang['Settings'] = 'הגדרות';
+$lang['Resize'] = 'גודל';
+$lang['Maximum Width'] = 'רוחב מרבי';
+$lang['pixels'] = 'פיקסלים';
+$lang['Maximum Height'] = 'גובה מרבי';
+$lang['Image Quality'] = 'איכות תמונה';
+$lang['Thumbnail'] = 'תמונה';
+$lang['Save Settings'] = 'שמור הגדרות';
+$lang['Your configuration settings are saved'] = 'הגדרות התצורה שלך נשמרות ';
+$lang['Active Themes'] = 'רקעים פעילים ';
+$lang['Add write access to the "%s" directory'] = 'הוסף הרשאת כתיבה לתיקית "%s"';
+$lang['Administration Home'] = 'ממשק ניהול';
+$lang['Change Admin Colors'] = 'שנה צבעים לתפריט הניהול';
+$lang['Delete this theme'] = 'מחק את הנושא הזה';
+$lang['Directory does not exist'] = 'הספרייה לא קיימת';
+$lang['Download,'] = 'הורדה,';
+$lang['FTP + Synchronization'] = 'סנכרון + FTP';
+$lang['Get Support on Piwigo Forum'] = 'קבל תמיכה בפורום Piwigo ';
+$lang['Help Me'] = 'עזור לי';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'נושא זה לא יכול להיות מופעל, כפי הנושא הורה חסר:"%s" "';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'נושא זה לא ניתן למחוק, כי נושאים אחרים תלוי בו:"%s" "';
+$lang['Inactive Themes'] = 'נושאים פעילים';
+$lang['Install on your computer,'] = 'להתקין במחשב שלך,';
+$lang['Make this theme available to users'] = 'הפוך את הנושא הזה לזמין למשתמשים';
+$lang['Page end'] = 'סוף עמוד ';
+$lang['Piwigo Uploader'] = 'מעלה Piwigo';
+$lang['Operation in progress'] = 'הטיפול עיבוד.';
+$lang['Please wait...'] = 'אנא המתן ...';
+$lang['Read Piwigo Documentation'] = 'קרא את התיעוד של Piwigo';
+$lang['Start pLoader and add your photos.'] = 'התחל להוסיף תמונות שלך.';
+$lang['Switch to clear or dark colors for administration'] = 'מעבר צבעים בהיר או כהה עבור ממשק ניהול';
+$lang['Theme has been successfully installed'] = 'נושאים הותקן בהצלחה ';
+$lang['Visit Gallery'] = 'לבקר בגלריה';
+$lang['Visit Piwigo project website'] = 'בקר באתר Piwigo פרוייקט';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'PLoader יטען <em> Piwigo Uploader </em>. מהמחשב שלך, pLoader יכין את התמונות שלך ןיעביר אותם אל גלרית ה Piwigo שלך';
+$lang['Guest Settings'] = 'הגדרות אורחים';
+$lang['Main Page'] = 'דף ראשי';
+$lang['Photo Page'] = 'מקור תמונה';
+$lang['Activate Navigation Bar'] = 'להפעיל את סרגל הניווט';
+$lang['Activate Navigation Thumbnails'] = 'הפעל ממוזערות ניווט';
+$lang['Activate icon "%s"'] = 'להפעיל את סמל"%s "';
+$lang['Activate field "%s"'] = 'להפעיל את השדה"%s"';
+$lang['Photo Properties'] = 'מאפייני תמונה';
+$lang['Allow user customization'] = 'לאפשר התאמה אישית למשתמש';
+$lang['Languages'] = 'שפות';
+$lang['Installed Languages'] = 'מהשפות המותקנות';
+$lang['Add New Language'] = 'הוספת שפה חדשה';
+$lang['Language has been successfully installed'] = 'שפה הותקן בהצלחה';
+$lang['Select:'] = 'בחר:';
+$lang['None'] = 'אף אחד';
+$lang['Invert'] = 'מרחב';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'אי אפשר לנטרל את הנושא הזה, אתה צריך לפחות נושא אחד.';
+$lang['Webmaster status is required.'] = 'מצב Webmaster נדרשת.';
+$lang['Bound Theme'] = 'נושאים Bound';
+$lang['Allow rating'] = 'אפשר דירוג';
+$lang['Select at least one comment'] = 'בחר אחת לפחות להגיב';
+$lang['Active Plugins'] = 'תוספים פעילים';
+$lang['Inactive Plugins'] = 'תוספים פעילים';
+$lang['Missing Plugins'] = 'תוספים חסרים';
+$lang['Uninstalled Plugins'] = 'תוספים הוסר';
+$lang['By %s'] = 'הועלה ע"י "%s"';
+$lang['Visit plugin site'] = 'בקר תוסף האתר';
+$lang['Active Languages'] = 'שפות פעילים';
+$lang['Delete this language'] = 'מחק את השפה הזאת';
+$lang['Forbid this language to users'] = 'לאסור על השפה הזו למשתמשים';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'אי אפשר לבטל את השפה הזו, הראשון להגדיר שפה אחרת כברירת המחדל.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'אי אפשר לבטל את השפה הזאת, אתה צריך לפחות שפה אחת.';
+$lang['Inactive Languages'] = 'שפות לא פעילה';
+$lang['Make this language available to users'] = 'הפוך את השפה הזו זמינה למשתמשים';
+$lang['Set as default language for unregistered and new users'] = 'הפוך שפת ברירת מחדל עבור משתמשים רשומים ו החדש';
+$lang['Add Photos'] = 'הוספת תמונות';
+$lang['The following tag was deleted'] = 'התווית הבאה נמחקה';
+$lang['Miscellaneous'] = 'שונות';
+$lang['Virtual Links'] = 'קישורים וירטואלית';
+$lang['There is no other language available.'] = 'אין שפה אחרת זמינה.';
+$lang['There is no other plugin available.'] = 'אין שום תוספים אחרים זמינים.';
+$lang['There is no other theme available.'] = 'אין שום נושא אחר זמין.';
+$lang['Add another set of photos'] = 'הוספת קבוצה נוספת של אוהדים';
+$lang['Order of menubar items has been updated successfully.'] = 'סדר הפריטים Menubar עודכנו בהצלחה.';
+$lang['This theme was not designed to be directly activated'] = 'הנושא הזה לא נועד להיות מופעל באופן ישיר';
+$lang['Pending Comments'] = 'תגובות בהמתנה';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'בקובץ php.ini שלך, upload_max_filesize (SB%) הוא גדול יותר post_max_size (SB%), עליך לשנות הגדרה זו';
+$lang['Exif extension not available, admin should disable exif use'] = 'סיומת Exif לא נתמכת, פנה למנהל על מנת שיאשר שימוש בסיומת Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'The uploaded file exceeds the upload_max_filesize directive in php.ini: "%s "B';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'The uploaded files exceed the post_max_size directive in php.ini: "%s "B';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'הקובץ שבועלה חורג מה MAX_FILE_SIZE האפשרי שצויין בקובץ html';
+$lang['The uploaded file was only partially uploaded'] = 'הקובץ הועלה חלקית';
+$lang['No file was uploaded'] = 'לא הועלה קובץ';
+$lang['Missing a temporary folder'] = 'חסר תיקיה זמנית';
+$lang['Failed to write file to disk'] = 'נכשל בכתיבת הקובץ בדיסק';
+$lang['File upload stopped by extension'] = 'העלאת קובץ נכשלה ובמשתמע';
+$lang['Unknown upload error'] = 'שגיאה בהעלאה לא ידועה';
+$lang['Error on file "%s" : %s'] = 'שגיאה בקובץ "%s" : %s';
+$lang['Menu Management'] = 'נהל תפריטים';
+$lang['automatic order'] = 'סדר אוטומטי';
+$lang['manual order'] = 'סדר ידני';
+$lang['Albums automatically sorted'] = 'מיון אלבומים אוטומטי';
+$lang['Batch Manager'] = 'מנהל קבוצה';
+$lang['include child albums'] = 'כולל אלבום ילד';
+$lang['Selection'] = 'מבחר';
+$lang['Action'] = 'פעולה';
+$lang['Set author'] = 'הגדר מחבר';
+$lang['Set title'] = 'הגדר כותרת';
+$lang['Set creation date'] = 'הגדר תאריך יצירה';
+$lang['Apply action'] = 'החל';
+$lang['on the %d selected photos'] = 'ב %d תמונות נבחרות';
+$lang['%d of %d photos selected'] = '%d מ %d תמונות נבחרו';
+$lang['No photo selected, %d photos in current set'] = 'לא נבחרו תמונות, %d תמונות בסט הנוכחי';
+$lang['All %d photos are selected'] = 'כל %d התמונות נבחרו';
+$lang['remove this filter'] = 'הסר מסנן זה';
+$lang['predefined filter'] = 'סנן מראש';
+$lang['last import'] = 'הגיעה לאחרונה';
+$lang['with no virtual album'] = 'ללא אלבום וירטואלי';
+$lang['Duplicates'] = 'כפילויות';
+$lang['Add a filter'] = 'הוסף מסנן';
+$lang['Remove all filters'] = 'מחק את כל המסננים';
+$lang['Refresh photo set'] = 'רענן את סט התמונות';
+$lang['The whole page'] = 'העמוד המלא';
+$lang['The whole set'] = 'הסט המלא';
+$lang['No photo in the current set.'] = 'אין תמונות בסט הנוכחי.';
+$lang['No photo selected, no action possible.'] = 'לא נבחרו תמונות, אין פעולות אפשריות.';
+$lang['Choose an action'] = 'בחר פעולה';
+$lang['remove author'] = 'הסר מחבר';
+$lang['Type here the author name'] = 'כתוב כאן את שם המחבר';
+$lang['remove title'] = 'הסר כותרת';
+$lang['Type here the title'] = 'כתוב כאן את הכותרת';
+$lang['remove creation date'] = 'הסר את תאריך היצירה';
+$lang['with no album'] = 'ללא אלבום';
+$lang['with no tag'] = 'ללא תיוג';
+$lang['Album photos associated to the following albums: %s'] = 'אלבום תמונות משוייך לאלבום הבא: %s';
+$lang['Delete orphan tags'] = 'מחק תגים יתומים';
+$lang['delete photo'] = 'מחק תמונה';
+$lang['new'] = 'חדש';
+$lang['No results'] = 'אין תוצאות';
+$lang['Orphan tags deleted'] = 'תגים יתומים נמחקו';
+$lang['Remove from caddie'] = 'הוסר מהנושא';
+$lang['Searching...'] = 'מחפש...';
+$lang['Type in a search term'] = 'הקלד את ערך החיפוש';
+$lang['Week starts on'] = 'שבוע מתחיל';
+$lang['You have %d orphan tags: %s.'] = 'יש לך %d תגים יתומים: %s.';
+$lang['Themes which need upgrade'] = 'ערכות נושא שצריכות שידרוג';
+$lang['Languages which need upgrade'] = 'שפות שצריכות שידרוג';
+$lang['All themes are up to date.'] = 'כל ערכות הנושא מעודכנות';
+$lang['All plugins are up to date.'] = 'כל התוספים מעודכנים.';
+$lang['All languages are up to date.'] = 'כל השפות מעודכנות.';
+$lang['Visit theme site'] = 'בקר באתר ערכת הנושא';
+$lang['Visit language site'] = 'בקר באתר השפה';
+$lang['New Version'] = 'גרסה חדשה';
+$lang['Obsolete Plugins'] = 'תוסף מיושן';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'אזהרה! נראה כי תוסף זה לא מתאים ל Piwigo.';
+$lang['Do you want to activate anyway?'] = 'אתה רוצה להפעיל בכל מיקרה?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'תוסף זה הוא לא חלק מליבת PIWIGO ! הסר אותו מייד!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'שגיאה: תוסף זה נראה חסר אבל מותקן! הסר אותו מייד.';
+$lang['display'] = 'הצג';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'אתה יכול לעדכן ל Piwigo %s ישירות, מבלי לשדרג ל Piwigo %s (מומלץ).';
+$lang['Save Template Directory'] = 'שמור בספרייה תבנית';
+$lang['Dump Database'] = 'זרוק מסד נתונים';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'כלול נתוני היסטוריה אזהרה:עלולה להיות חריגת זיכרון השרת';
+$lang['Unable to dump database.'] = 'אין אפשרות לזרות מסד נתונים.';
+$lang['Some upgrades are available for extensions.'] = 'כמה שידרוגים זמינים להרחבות.';
+$lang['Ignore All'] = 'התעלם מהכל';
+$lang['Crop'] = 'להניב';
+$lang['Width'] = 'רוחב';
+$lang['Height'] = 'גובה';
+$lang['Follow Orientation'] = 'עקוב אחר ההדרכה';
+$lang['If you want to regenerate thumbnails, please go to the <a href="%s">Batch Manager</a>.'] = 'אם ברצונך לחדש את התמונות הממוזערות נווט בבקשה ל <a href="%s">מנהל אצווה</a>.';
+$lang['Graphics Library'] = 'ספריית גרפיקה';
+$lang['Activate icon "new" next to albums and pictures'] = 'הפעל כפתו "חדש" ליד אלבומים';
+$lang['Deactivate all'] = 'בטל פעולה להכל';
+$lang['Default photos order'] = 'סדר ברירת מחדל לתמונות';
+$lang['Restore'] = 'שחזר';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'שחזר להגדרות ברירת מחדל. הגדרות ההתקן יאבדו!';
+$lang['Show menubar'] = 'הצג תפריט';
+$lang['Regenerate Thumbnails'] = 'חידוש תמונות ממוזערות';
+$lang['Regenerate Websize Photos'] = 'חידוש גודל תמונות באתר';
+$lang['Thumbnails generation in progress...'] = 'חידוש תמונות ממוזערות בתהליך...';
+$lang['Photos generation in progress...'] = 'חידוש תמונות בתהליך...';
+$lang['%s thumbnails have been regenerated'] = '%s תמונות ממוזערות חודשו';
+$lang['%s thumbnails can not be regenerated'] = '%s תמונות ממוזערות לא יכלו להתחדש';
+$lang['%s photos have been regenerated'] = '%s תמונות חודשו';
+$lang['%s photos can not be regenerated'] = '%s תמונות לא יכלו להתחדש';
+$lang['Updates'] = 'עדכונים';
+$lang['Update in progress... Please wait.'] = 'עדכון בתהליך... המתן.';
+$lang['Ignore this update'] = 'התעלם מעידכון זה';
+$lang['Reset ignored updates'] = 'אפס התעלמות מעידכונים';
+$lang['Update All'] = 'עדכן הכל';
+$lang['ERROR'] = 'שגיאה';
+$lang['Update Complete'] = 'עידכון הושלם';
+$lang['Piwigo Update'] = 'Piwigo עדכון';
+$lang['Extensions Update'] = 'עדכון הרחבה';
+$lang['All extensions are up to date.'] = 'כל ההרחבות מעודכנות.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'יכול להיות שההתקן לא תואם לגירסה החדשה של Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'יכול להיות שהערכת הנושא לא תואמת לגירסה החדשה של Piwigo:';
+$lang['I decide to update anyway'] = 'החלתי לעדכן בכל מיקרה';
+$lang['Update to Piwigo %s'] = 'עדכן ל Piwigo %s';
+$lang['Two updates are available'] = 'שני עידכונים זמינים';
+$lang['This is a minor update, with only bug corrections.'] = 'זהו עידכון שולי, תיקון באגים שנמצאו.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'עדכון חשוב, עם <a href="%s">מאפיינים חדשים ומלהיבים</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'יכול להיות שחלק מההתקנים וערכות הנושא לא זמינים עדיין .';
+$lang['Learn more'] = 'למד עוד';
+$lang['Rate'] = "דרג";
+$lang['Average rate'] = "דירוג ממוצע";
+$lang['(this tag will be deleted)'] = ')התג הזה ימחק(';
+$lang['... or '] = 'או ...';
+$lang['Add a criteria'] = 'הוסף קריטריון';
+$lang['Allowed file types: %s.'] = 'סוגי קבצים מותרים:%s';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'רזולוציה מקסימלית: %dM פקסלים(שזה %dx%d פקסלים).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'כברירת מחדל, Piwigo יצור גודל חדש לתמונות ה HD שלך.';
+$lang['Confirm merge'] = 'אשר איחוד';
+$lang['Create'] = 'צור';
+$lang['hide details'] = 'הסתר פרטים';
+$lang['Manage Permissions'] = 'ניהול הרשאות';
+$lang['Maximum file size: %sB.'] = 'גודל קובץ מקסימאלי: %sB.';
+$lang['Merge selected tags'] = 'אחד תגים מסומנים';
+$lang['Merge tags'] = 'איחוד תגים';
+$lang['No destination tag selected'] = 'לא ניבחרו תגי יעד';
+$lang['Photo %s of %s'] = 'תמונה %s מ %s';
+$lang['Select an album'] = 'בחר אלבום';
+$lang['Select at least two tags for merging'] = 'בחר לפחות שני תגים לאיחוד';
+$lang['Select the destination tag'] = 'בחר תגים ביעד';
+$lang['show details'] = 'הצג פרטים';
+$lang['Start Upload'] = 'התחל העלאה';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'התג <em>%s</em> אוחד כעם תג <em>%s</em>';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'אתה משתמש בהעלאה מהדפדפן. נסה <a href="%s">העלאת פלאש</a> במקום.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'אתה משתמש בהעלאת פלאש. ישנה בעיה? נסה <a href="%s">העלאה מהדפדפן</a> במקום.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'אין באפשרותך לקבוע סדר תמונות ברירת מחדל מכיוון שאתה משתמש בהגדרות מותאמות אישית';
+$lang['Add to caddie'] = 'הוסף לסל';
+$lang['Permalink'] = 'קישורית';
+?>
Index: tags/2.4.0RC3/language/he_IL/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/he_IL/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/common.lang.php	(revision 14585)
@@ -0,0 +1,343 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: עברית [IL]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=457
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Hebrew";
+$lang_info['country'] = "Israel";
+$lang_info['direction'] = "rtl";
+$lang_info['code'] = "he";
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d קילובייט';
+$lang['%d album updated'] = "%d קטגוריה מעודכנת";
+$lang['%d albums updated'] = "%d קטגוריות מעודכנות";
+$lang['%d comment to validate'] = "%d תגובה לאמת";
+$lang['%d comments to validate'] = "%d תגובות לאמת";
+$lang['%d new comment'] = "%d תגובה חדשה";
+$lang['%d new comments'] = "%d תגובות חדשות";
+$lang['%d comment'] = "%d תגובה";
+$lang['%d comments'] = "%d תגובות";
+$lang['%d hit'] = "%d לחיצה";
+$lang['%d hits'] = "%d לחיצות";
+$lang['%d new photo'] = "%d תמונה חדשה";
+$lang['%d new photos'] = "%d תמונות חדשות";
+$lang['%d new user'] = "%d משתמש חדש";
+$lang['%d new users'] = "%d משתמשים חדשים";
+$lang['About'] = "על";
+$lang['All tags'] = "כל התוויות";
+$lang['Any tag'] = "כל תווית";
+$lang['At least one listed rule must be satisfied.'] = "חייב להיות לפחות קריטריון אחד ברשימה .";
+$lang['Author'] = "מחבר";
+$lang['Albums'] = "קטגוריות";
+$lang['Album'] = "קטגוריה";
+$lang['Close this window'] = "סגור חלון זה";
+$lang['Complete RSS feed (photos, comments)'] = "עדכון RSS (תמונות, הערות)";
+$lang['Confirm Password'] = "אשר סיסמה";
+$lang['Connection settings'] = "הגדרות חיבור";
+$lang['Login'] = "התחברות";
+$lang['Contact webmaster'] = "צור קשר עם מנהל האתר";
+$lang['Create a new account'] = "צור חשבון חדש";
+$lang['Created on'] = "נוצר על";
+$lang['Creation date'] = "תאריך יצירה";
+$lang['Current password is wrong'] = "הסיסמה שגויה";
+$lang['Dimensions'] = "מימדים";
+$lang['Display'] = "להציג";
+$lang['Each listed rule must be satisfied.'] = "כל רשימת קריטריונים חייבת להיות שלמה.";
+$lang['Email address'] = "כתובת דואר אלקטרוני";
+$lang['Enter your personnal informations'] = "הזן את הנתונים האישיים שלך";
+$lang['Error sending email'] = "שגיאה בעת שליחת דואר אלקטרוני";
+$lang['File name'] = "שם קובץ";
+$lang['File'] = "קובץ";
+$lang['Filesize'] = "גודל הקובץ";
+$lang['Filter and display'] = "סנן והצג";
+$lang['Filter'] = "מסנן";
+$lang['Forgot your password?'] = "שכחת את הסיסמה?";
+$lang['Go through the gallery as a visitor'] = "נווט בגלריה כמבקר";
+$lang['Help'] = "עזרה";
+$lang['Identification'] = "הזדהות";
+$lang['Photos only RSS feed'] = "תמונות בלבד RSS ";
+$lang['Keyword'] = "מילות מפתח";
+$lang['Links'] = "קישורים";
+$lang['N/A'] = "N/A לא ידוע";
+$lang['New on %s'] = "חדש ב %s";
+$lang['Notification'] = "הודעה";
+$lang['Number of items'] = "מספר הפריטים";
+$lang['Original dimensions'] = "מידות מקוריות";
+$lang['Password forgotten'] = "שכחתי את הסיסמה";
+$lang['Password'] = "סיסמה";
+$lang['Post date'] = "תאריך פרסום";
+$lang['Posted on'] = "פורסם ב";
+$lang['Profile'] = "פרופיל";
+$lang['Quick connect'] = "גישה מהירה";
+$lang['RSS feed'] = 'הזנות (RSS)';
+$lang['Register'] = "הירשם";
+$lang['Registration'] = "הרשמה";
+$lang['Related tags'] = "תוויות קשורות";
+$lang['Reset'] = "איפוס";
+$lang['Retrieve password'] = "לאחזר את הסיסמה";
+$lang['Search rules'] = "חיפוש קריטריונים";
+$lang['Search tags'] = "חיפוש תוויות";
+$lang['Search'] = "חיפוש";
+$lang['display available tags'] = "ראה תוויות אפשריות";
+$lang['Since'] = "מ";
+$lang['Sort by'] = "מיין לפי";
+$lang['Sort order'] = "לפי הסדר";
+$lang['Tag'] = "תווית";
+$lang['Tags'] = "תוויות";
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = "ה-RSS מספק התראה על אירועים חדשים מאתר זה: תמונות חדשות, קטגוריות מעודכן, הערות חדשות. כדי להשתמש עם קורא RSS.";
+$lang['Unknown feed identifier'] = 'מזהה לא ידוע';
+$lang['User comments'] = 'תגובות משתמש';
+$lang['Username'] = 'שם משתמש';
+$lang['Visits'] = 'מבקר';
+$lang['Webmaster'] = 'מנהל אתר';
+$lang['Week %d'] = 'שבוע %d';
+$lang['About Piwigo'] = 'אודות Piwigo';
+$lang['You are not authorized to access the requested page'] = 'אינך מורשה לגשת לדף זה';
+$lang['add this photo to your favorites'] = 'הוסף תמונה זאת למועדפים שלך';
+$lang['Administration'] = 'מנהל ראשי';
+$lang['all'] = 'הכול';
+$lang['ascending'] = 'עולה';
+$lang['author(s) : %s'] = 'מחבר/ים : %';
+$lang['Expand all albums'] = 'הרחב את כל הקטגוריות';
+$lang['posted after %s (%s)'] = 'פורסם אחרי %s (%s)';
+$lang['posted before %s (%s)'] = 'פורסם לפני %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'פורסם בין %s (%s) ו %s (%s)';
+$lang['posted on %s'] = 'פורסם ב %';
+$lang['Best rated'] = 'מדורג הכי גבוהה';
+$lang['display best rated photos'] = 'הצג את התמונה המדורגת הכי גבוהה';
+$lang['Calendar'] = 'לוח שנה';
+$lang['All'] = 'הכול';
+$lang['display each day with photos, month per month'] = 'הצג כל יום עם תמונה, חודש אחרי חודש';
+$lang['View'] = 'צפה';
+$lang['chronology_monthly_calendar'] = 'חודשי לוח שנה';
+$lang['chronology_monthly_list'] = 'רשימת חודשים';
+$lang['chronology_weekly_list'] = 'רשימת שבועות';
+$lang['Click here if your browser does not automatically forward you'] = 'לחץ כאן אם הדפדפן לא העביר אותך אוטומטית';
+$lang['comment date'] = 'תאריך תגובה';
+$lang['Comment'] = 'תגובה';
+$lang['Your comment has been registered'] = 'התגובה שלך נרשמה';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'מערכת למניעת קריסה : המתן מספר שניות בין תגובה לתגובה';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'התגובה שלך לא נרשמה כיוון שלא עמדה באחד הכללים';
+$lang['An administrator must authorize your comment before it is visible.'] = 'המנהל הראשי חייב לאשר את התגובה שלך לפני שהיא תופיעה.';
+$lang['This login is already used by another user'] = 'אתה מחובר כבר על משתמש אחר';
+$lang['Comments'] = 'תגובות';
+$lang['Add a comment'] = 'הוסף תגובה';
+$lang['created after %s (%s)'] = 'נוצר אחרי %s (%s)';
+$lang['created before %s (%s)'] = 'נוצר לפני %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'נוצר בין %s (%s) ל %s (%s)';
+$lang['created on %s'] = 'נוצר ב %s';
+$lang['Customize'] = 'התאמה אישית';
+$lang['Your Gallery Customization'] = 'הגלריה האישית שלך';
+$lang['day'][0] = "יום ראשון";
+$lang['day'][1] = "יום שני";
+$lang['day'][2] = "יום שלישי";
+$lang['day'][3] = "יום רביעי";
+$lang['day'][4] = "יום חמישי";
+$lang['day'][5] = "יום שישי";
+$lang['day'][6] = "יום שבת";
+$lang['Default'] = 'ברירת מחדל';
+$lang['delete this photo from your favorites'] = 'מחק את התמונה מהמועדפים שלך';
+$lang['Delete'] = 'מחק';
+$lang['descending'] = 'מתנתק';
+$lang['Download'] = 'הורד';
+$lang['Download this file'] = 'הורד את הקובץ';
+$lang['edit'] = 'ערוך';
+$lang['wrong date'] = 'תאריך לא נכון';
+$lang['excluded'] = 'נשלל';
+$lang['Your favorites'] = 'המועדפים שלי';
+$lang['display your favorites photos'] = 'הצג את התמונות המועדפות שלך';
+$lang['Favorites'] = 'מועדפים';
+$lang['First'] = 'ראשון';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'הגלריה סגורה לצורכי תחזוקה. בבקשהה, תחזור מאוחר יותר.';
+$lang['Page generated in'] = 'הדף נוצר ב';
+$lang['guest'] = 'אורח';
+$lang['Hello'] = 'שלום';
+$lang['available for administrators only'] = 'זמין למנהל ראשי בלבד';
+$lang['display this album'] = 'הצג תמונות בשורש הקטגוריה';
+$lang['display last user comments'] = 'ראה את התגובות האחרונות של המשתמשים';
+$lang['customize the appareance of the gallery'] = 'התאם אישית את מראה הקטגוריה';
+$lang['search'] = 'חפש';
+$lang['Home'] = 'בית';
+$lang['Identification'] = "הזדהה";
+$lang['in this album'] = "בקטגוריה הזאת";
+$lang['in %d sub-album'] = "ב %d תת קטגוריה";
+$lang['in %d sub-albums'] = "ב %d תת קטגוריות";
+$lang['included'] = "כולל";
+$lang['Invalid password!'] = "סיסמה לא חוקית!";
+$lang['Language'] = "שפה";
+$lang['last %d days'] = "ה %d ימים אחרונים";
+$lang['Last'] = "אחרון";
+$lang['Logout'] = "התנתק";
+$lang['obligatory'] = "הכרחי";
+$lang['Maximum photo height'] = "גובה מקסימלי לתמונה";
+$lang['Maximum height must be a number superior to 50'] = "הגובהה המקסימלי חייב להיות מעל 50";
+$lang['Maximum photo width'] = "רוחב  מקסימלי לתמונה";
+$lang['Maximum width must be a number superior to 50'] = "הרוחב המקסימלי חייב להיות מעל 50";
+$lang['display a calendar by creation date'] = "הצג לוח שנה לפי תאריך יצירה";
+$lang['display all photos in all sub-albums'] = "הצג את כל הפריטים בכל הקטגוריות ובכל התת קטגוריות";
+$lang['return to normal view mode'] = "חזור לתצוגה רגילה";
+$lang['display a calendar by posted date'] = "הצג לוח שנה לפי תאריך פרסום";
+$lang['month'][10] = "אוקטובר";
+$lang['month'][11] = "נובמבר";
+$lang['month'][12] = "דצמבר";
+$lang['month'][1] = "ינואר";
+$lang['month'][2] = "פברואר";
+$lang['month'][3] = "מרץ";
+$lang['month'][4] = "אפריל";
+$lang['month'][5] = "מאי";
+$lang['month'][6] = "יוני";
+$lang['month'][7] = "יולי";
+$lang['month'][8] = "אוגוסט";
+$lang['month'][9] = "ספטמבר";
+$lang['Most visited'] = "הכי נצפה";
+$lang['display most visited photos'] = "הצג את התמונות הנצפות ביותר";
+$lang['Unknown identifier'] = 'מזהה לא ידוע';
+$lang['New password'] = "סיסמה חדשה";
+$lang['Rate this photo'] = "דרג תמונה זאת";
+$lang['Next'] = "הבא";
+$lang['no rate'] = "לא דורג";
+$lang['Photos posted within the last %d day.'] = "פריטים שנוספו ב %d ימים האחרונים.";
+$lang['Photos posted within the last %d days.'] = "פריטים שנוספו ב %d ימים האחרונים.";
+$lang['password updated'] = "הסיסמה עודכנה";
+$lang['Recent period must be a positive integer value'] = 'התמונות האחרונות חייב להיות מספר שלם חיובי';
+$lang['photo'] = "תמונה";
+$lang['Click on the photo to see it in high definition'] = "לחץ על הצמונה על מנת לראות אותה באיכות גבוהה";
+$lang['Show file metadata'] = "הראה את המידע על הקובץ";
+$lang['Powered by'] = "נוצר על ידי";
+$lang['Preferences'] = "העדפות";
+$lang['Previous'] = "קודם";
+$lang['Random photos'] = "תמונה אקראית";
+$lang['display a set of random photos'] = "הראה מספר תמונות אקראיות";
+$lang['Recent albums'] = "הקטגוריות האחרונות";
+$lang['display recently updated albums'] = "הראה את הקטגוריות שעודכנו לאחרונה";
+$lang['Recent period'] = "בתקופה האחרונה";
+$lang['Recent photos'] = "תמונות אחרונות";
+$lang['display most recent photos'] = "הראה את התמונות הכי חדשות";
+$lang['Redirection...'] = "מעביר...";
+$lang['Please, enter a login'] = "הכנס שם משתמש";
+$lang['login mustn\'t end with a space character'] = "שם משתמש לא יכול להיגמר ברווח";
+$lang['login mustn\'t start with a space character'] = "שם משתמש לא יכול להתחיל עם רווח";
+$lang['this login is already used'] = "השם משתמש הזה קיים כבר";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "דואר אלקטרוני חייב להיות כמו adir@biton.com (לדוגמה : adir@gmail.com)";
+$lang['please enter your password again'] = "הכנס בבקשה את הסיסמה שוב";
+$lang['Auto login'] = "התחברות אוטומטית";
+$lang['remove this tag from the list'] = "מחק את התווית הזאת מהרשימה";
+$lang['representative'] = "נבחר";
+$lang['Search for Author'] = "חפש את המחבר";
+$lang['Search in albums'] = "חפש בקטגוריה";
+$lang['Search by date'] = "חפש לפי תאריך";
+$lang['Date'] = "תאריך";
+$lang['End-Date'] = "תאריך סיום";
+$lang['Kind of date'] = "סוג של תאריך";
+$lang['Search for words'] = "חפש את המילה";
+$lang['Search for all terms'] = "חפש את כל התנאים";
+$lang['Search for any term'] = "חפש לפי כל תנאי";
+$lang['Empty query. No criteria has been entered.'] = "שאילתה ריקה. לא הוכנסו קריטריונים.";
+$lang['Search results'] = "חפש תוצאות";
+$lang['Search in sub-albums'] = "חפש בתת קטגוריות";
+$lang['searched words : %s'] = "חפש מילה : %s";
+$lang['Contact'] = "צור קשר";
+$lang['set as album representative'] = "סמן כמייצג הקטגוריה";
+$lang['Show number of comments'] = "הראה מספר תגובות";
+$lang['Show number of hits'] = "הראה מספר לחיצות";
+$lang['slideshow'] = "מצגת";
+$lang['stop the slideshow'] = "עצור את המצגת";
+$lang['Specials'] = "מיוחדים";
+$lang['SQL queries in'] = "שאילתות SQL";
+$lang['display only recently posted photos'] = "הראה רק תמונות שפורסמו לאחרונה";
+$lang['return to the display of all photos'] = "חזור להצגת כל התמונות";
+$lang['the beginning'] = "ההתחלה";
+$lang['Interface theme'] = "ממשק הערכה";
+$lang['Thumbnails'] = "תמונות ממוזערות";
+$lang['Menu'] = "תפריט";
+$lang['A comment on your site'] = "תגובה באתר שלך";
+$lang['today'] = "היום";
+$lang['Update your rating'] = "עדכן את הדירוג שלך";
+$lang['the username must be given'] = "דרוש שם משתמש";
+$lang['useful when password forgotten'] = "שימושי במקרה ששכחת את הסיסמה";
+$lang['Quick search'] = "חיפוש מהיר";
+$lang['Connected user: %s'] = "משתמש מחובר: %s";
+$lang['IP: %s'] = "אי פי: %s";
+$lang['Browser: %s'] = "דפדפן: %s";
+$lang['Author: %s'] = "מחבר: %s";
+$lang['Comment: %s'] = "תגובה: %s";
+$lang['Comment by %s'] = "התגובה נרשמה על ידי %s";
+$lang['User: %s'] = "שם משתמש: %s";
+$lang['Email: %s'] = "דואר אלקטרוני: %s";
+$lang['Admin: %s'] = "מנהל: %s";
+$lang['Registration of %s'] = "רישום של %s";
+$lang['Album: %s'] = "קטגוריה: %s";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'מצב לא טוב עבור המשתמש "האורח", השתמש במצב ברירת מחדל. עדכן בבקשה את מנהל האתר.';
+$lang['this email address is already in use'] = "משתמש אחר כבר משתמש בדואר האלקטרוני הזה";
+$lang['Album results for'] = "תוצאות עבור הקטגוריה";
+$lang['Tag results for'] = "תוצאות עבור התוויות";
+$lang['from %s to %s'] = "מ %s עד %s";
+$lang['Play of slideshow'] = "הפעל מצגת";
+$lang['Pause of slideshow'] = "עצור מצגת";
+$lang['Repeat the slideshow'] = "חזור על אותם שקופיות";
+$lang['Not repeat the slideshow'] = "אל תחזור על אותם שקופיות";
+$lang['Reduce diaporama speed'] = "הורד את מהירות הצגת המצגת";
+$lang['Accelerate diaporama speed'] = "העלה את מהירות הצגת המצגת";
+$lang['Submit'] = "שלח";
+$lang['Yes'] = "כן";
+$lang['No'] = "לא";
+$lang['%d photo'] = "%d תמונה";
+$lang['%d photos'] = "%d תמונות";
+$lang['%d photo is also linked to current tags'] = "%d התמונוה כבר מקושרת לתווית זאת";
+$lang['%d photos are also linked to current tags'] = "%d התמונה כבר מקושרת לתוויות אלה";
+$lang['display photos linked to this tag'] = "הראה תמונות המקושרות לתווית זאת בלבד";
+$lang['photos posted during the last %d days'] = "תמונות שפורסמו במשך %d ימים אחרונים";
+$lang['Piwigo Help'] = "עזרת Piwigo";
+$lang['Rank'] = "דירוג";
+$lang['group by letters'] = "קבוצה לפי אותיות";
+$lang['letters'] = "אותיות";
+$lang['show tag cloud'] = "הצג ענן תוויות";
+$lang['cloud'] = "ענן";
+$lang['Reset to default values'] = "אפס לערך ברירת מחדל";
+$lang['delete all photos from your favorites'] = "מחק את כל התמונות מהמועדפים שלך";
+$lang['Sent by'] = "נשלח על ידי";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "הדפדפן שלך חוסם קוקיז או לא תומך בהם. אתה חייב להפעיל את ה קוקיז בשביל להתחבר.";
+$lang['Edit a comment'] = "ערוך תגובה";
+$lang['Are you sure?'] = "האם אתה בטוח?";
+$lang['(!) This comment requires validation'] = '(!) תגובה זאת דורשת אישור מנהל';
+$lang['Welcome'] = 'ברוך הבא';
+$lang['Welcome to your Piwigo photo gallery!'] = 'ברוך הבא לגלריית ה Piwigo שלך!';
+$lang['... or browse your empty gallery'] = '... או גלוש בגלריה הריקה שלך';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... אן התעלם מהודעה זאת, אני ימצא את דרכי לבד';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'שלום %s, גלרית הPiwigo שלך ריקה!';
+$lang['I want to add photos'] = 'אני רוצה להוסיף תמונות';
+$lang['Manage this user comment: %s'] = 'נהל את תגובות משתמש זה: %s';
+$lang['Email address is missing. Please specify an email address.'] = "חסר כתובת דואר אלקטרוני. הכנס בבקשה כתובת דואר אלקטרוני זמינה.";
+$lang['This author modified following comment:'] = 'מחבר זה, ערך את התגובה שלו:';
+$lang['This author removed the comment with id %d'] = 'מחבר זה מחק את התגובה עם השם משתמש %d';
+$lang['html tags are not allowed in login'] = 'לא ניתן להשתמש בתגי html בהתחברות';
+$lang['The number of photos per page must be a not null scalar'] = 'מספר התמונות בד חייב להיות גדול מאפס';
+$lang['Number of photos per page'] = 'מספר תמונות בדף';
+
+?>
Index: tags/2.4.0RC3/language/he_IL/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/he_IL/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>מספר דרכים להוסיף תמונות לגלריה שלך:</p>
+
+<ul>
+  <li><strong>העלאה ישירה</strong> דרך דפדפן האינטרנט שלך היא הדרך המהירה והפשוטה ביותר. זה תלוי ביכולות הדפדפן והשרת שלך. אם אתה צריך להעלות כמות גדולה של תמונות, תמונות באיכות גבוהה או שאתה נתקל בבעיה כלשהי, הדרכים הבאות בידיוק בשבילך!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">עבור להעלאה ישירה </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> זו תוכנה בשולחן העבודה שלך, להתקנה במחשבך האישי. גרור &amp; ושחרר תמונות לתוך חלון הpLoader, הלחץ על <em>"Upload to Piwigo"</em> ותן לpLoader לעשות את העבודה. אתה יכול למצוא תוכנות אחרות כמו <strong>WinToPiwigo</strong> או <strong>Digikam</strong> לייצא לגלרית Piwigo שלך.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">עבור אל pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>העברה דרך FTP</strong> זו הדרך המומלצת ביותר להעלות כמות גדולה של תמונות עם מספר מינימלי של מהלכים. עבור על המדריך הכנת התמונות שלך. שיטת ה-FTP מאפשרות שליטה מדויקת
+  בארגון הפיזי של התמונות בשרת שלך.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">עבור אל FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/he_IL/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/he_IL/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "התקנה";
+$lang['Basic configuration'] = "הגדרות בסיסיות";
+$lang['Default gallery language'] = "שפת גלריה ברירת מחדל";
+$lang['Database configuration'] = "הגדרות בסיס נתונים";
+$lang['Admin configuration'] = "הגדרות מנהל";
+$lang['Start Install'] = "התחל התקנה";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "כתובת דואר אלקטרוני xxx@yyy.eee (example : jack@altern.com)";
+$lang['Webmaster login'] = "התחברות מנהל האתר";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "יוצג בפני המבקרים. נחוץ בשביל מנהל האתר";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "התחבר לשרת בהצלחה, אך לא הצליח להתחבר לבסיס נתונים";
+$lang['Can\'t connect to server'] = "לא מצליח להתחבר לשרת";
+$lang['Host'] = "שרת מארח";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "משתמש";
+$lang['user login given by your host provider'] = "המשתמש שניתן לך על ידי השרת המארח שלך";
+$lang['Password'] = "סיסמה";
+$lang['user password given by your host provider'] = "הסיסמה שניתנה לך על ידיד השרת המארח שלך";
+$lang['Database name'] = "שם בסיס הנתונים";
+$lang['also given by your host provider'] = "גם ניתן על ידי השרת המארח שלך";
+$lang['Database table prefix'] = "קידומת טבלאות מסד הנתונים";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "שם טבלאות בסיס הנתונים יוצגו לאחר קידומת זאת (מאפשר לך לנהל את טבלאות בסיס הנתונים שלך טוב יותר)";
+$lang['enter a login for webmaster'] = "הזן פרטי התחברות עבור מהל האתר";
+$lang['webmaster login can\'t contain characters \' or "'] = "משתמש מנהל האתר לא יכול להחיל את התווים \' או מרחאות";
+$lang['please enter your password again'] = "הכנס בבקשה את הסיסמה שוב";
+$lang['Webmaster password'] = "ססמת מנהל האתר";
+$lang['Keep it confidential, it enables you to access administration panel'] = "שמור זאת בסוד, זה מאפשר לך להיכנס לפאנל ניהול האתר";
+$lang['Password [confirm]'] = "סיסמה [אושרה]";
+$lang['verification'] = "אימות";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "צריך עזרה? היעזר ב <a href=\"%s\">הפורום של Piwigo</a>.";
+$lang['Webmaster mail address'] = "דואר אלקטרוני של מנהל האתר";
+$lang['Visitors will be able to contact site administrator with this mail'] = "אורחים יוכלו להשתמש בדואר האלקטרוני הזה כדי ליצור קשר עם מנהל האתר";
+$lang['PHP 5 is required'] = "נדרש גירסת PHP 5";
+$lang['It appears your webhost is currently running PHP %s.'] = "שרת המארח שלך רץ על גירסת PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo תנסה להחליף את התצורה שלך ל PHP 5 על ידי יצירת או שינוי קובץ .htaccess";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "אתה יכול לשנות את התצורה שלך לבד ולהריץ את Piwigo לאחר מכן.";
+$lang['Try to configure PHP 5'] = "נסה להגדיר PHP 5";
+$lang['Sorry!'] = "סליחה!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo לא יכולה להגדיר את PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "אתה צריך לפנות לתמיכת השרת המאחר שלך ולראות איך אתה יכול להחליף ל PHP 5 לבד.";
+$lang['Hope to see you back soon.'] = "מקווה לראות אותך שוב בקרוב.";
+$lang['Congratulations, Piwigo installation is completed'] = 'מזל טוב,התקנת Piwigo הושלמה';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'הפתרון החלופי הוא להעתיק את הטקסט בתיבה מעל ולהדביק אותו בקובץ "local/config/database.inc.php" (אזהרה : database.inc.php חייב להחיל רק את התווים שבתיבת טקסט, לא לחזור על שורות או לעשות רווח)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'יצירת קובץ config local/config/database.inc.php ניכשל.';
+$lang['Download the config file'] = 'הורד את קובץ config';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'אתה יכול להוריד את קובץ config ולהעלות אותו אל local/config בתיקיית ההתקנה שלך.';
+$lang['Just another Piwigo gallery'] = 'עוד גלריה מבית Piwigo';
+$lang['Welcome to my photo gallery'] = 'ברוכים הבאים לגלרית התמונות שלי';
+?>
Index: tags/2.4.0RC3/language/he_IL/iso.txt
===================================================================
--- tags/2.4.0RC3/language/he_IL/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+עברית [IL]
Index: tags/2.4.0RC3/language/he_IL/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/he_IL/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/he_IL/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = "שדרג";
+$lang['Upgrade from version %s to %s'] = "שדרג מגירסה %s ל %s";
+$lang['Statistics'] = "סטטיסטיקה";
+$lang['total upgrade time'] = "זמן שידרוג כולל";
+$lang['total SQL time'] = "זמןSQLכולל";
+$lang['SQL queries'] = "SQLשאילתות";
+$lang['Upgrade informations'] = "מידע לשידרוג";
+?>
Index: tags/2.4.0RC3/language/hr_HR/about.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/about.html	(revision 14585)
@@ -0,0 +1,13 @@
+  <p>Ova galerija slika koristi Piwigo.</p>
+
+<p>Piwigo je sustav za izradu web galerija slika, stvaran aktivnom zajednicom
+korisnika i programera. Proširenja čine Piwigo lako prilagodljivim. Piwigo je besplatan i opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Posjetite Piwigo web mjesto</a></p>
+
+Hrvatski prijevod Piwigo-a održavaju (abecedno složeni):
+
+           nantic <http://piwigo.org/forum/profile.php?id=2561>
+
+
+          .... zahvaljujemo 
Index: tags/2.4.0RC3/language/hr_HR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/admin.lang.php	(revision 14585)
@@ -0,0 +1,777 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d poveznica';
+$lang['%d associations'] = '%d poveznica';
+$lang['%d album including'] = '%d skupina obuhvata ';
+$lang['%d albums including'] = '%d skupine obuhvata ';
+$lang['%d physical'] = '%d stvarna';
+$lang['%d physical'] = '%d stvarnih';
+$lang[' and %d virtual'] = ' i %d nestvrana';
+$lang[' and %d virtual'] = ' i %d nestvarnih';
+$lang['%d album moved'] = '%d skupina premještena';
+$lang['%d albums moved'] = '%d skupina premješteno';
+$lang['%d group'] = '%d grupa';
+$lang['%d groups'] = '%d grupa';
+$lang['%d member'] = '%d član';
+$lang['%d members'] = '%d članova';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tagova';
+$lang['%d user comment rejected'] = '%d korisnički komentar odbačen';
+$lang['%d user comments rejected'] = '%d korisničkih komentara odbačeno';
+$lang['%d user comment validated'] = '%d korisnički kometar odobren';
+$lang['%d user comments validated'] = '%d korisničkih komentara odobreno';
+$lang['%d user deleted'] = '%d korisnik izbrisan';
+$lang['%d users deleted'] = '%d korisnika izbrisano';
+$lang['%d user'] = '%d korisnik';
+$lang['%d users'] = '%d korisnika';
+$lang['%d waiting for validation'] = '%d čekanje na ovjeri';
+$lang['Actions'] = 'Postupci';
+$lang['Activate'] = 'Uključi';
+$lang['Add/delete a permalink'] = 'Dodaj/izbriši stalnu poveznicu';
+$lang['Add a tag'] = 'Dodaj';
+$lang['Add a user'] = 'Dodaj korisnika';
+$lang['Add group'] = 'Dodaj grupu';
+$lang['Add'] = 'Dodaj';
+$lang['Allow user registration'] = 'Odobri upis korisnika';
+$lang['Apply to sub-albums'] = 'Primjeni na podskupine';
+$lang['Associated'] = 'Povezanost';
+$lang['Caddie management'] = 'Uprava ladice';
+$lang['Caddie'] = 'Ladica';
+$lang['Albums authorized thanks to group associations'] = 'Skupine ovjerene zahvaljujući grupnoj povezanosti';
+$lang['Album manual order was saved'] = 'Stvarni redoslijed skupina je pohranjen';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Provjera nadogradnje neuspješna iz nepoznatog razloga.';
+$lang['Check for upgrade'] = 'Provjera nadogradnje';
+$lang['Comments for all'] = 'Komentari za sve';
+$lang['Current name'] = 'Trenutni naziv';
+$lang['Database'] = 'Baza podataka';
+$lang['Deactivate'] = 'Isključi';
+$lang['Delete Representant'] = 'Izbriši Predstavnika';
+$lang['Delete selected tags'] = 'Izbriši odabrane tagove';
+$lang['Delete selected users'] = 'Izbriši odabrane korisnike';
+$lang['Deletions'] = 'Brisanja';
+$lang['Deny selected groups'] = 'Zabrani odabrane grupe';
+$lang['Deny selected users'] = 'Zabrani odabrane korisnike';
+$lang['Description'] = 'Opis';
+$lang['Display options'] = 'Mogućnosti prikaza';
+$lang['Dissociated'] = 'Odvojeno';
+$lang['Does not represent'] = 'Ne predstavlja';
+$lang['Edit selected tags'] = 'Uredi odabrane tagove';
+$lang['Edit tags'] = 'Uredi tagove';
+$lang['Email admins when a new user registers'] = 'E-mail upraviteljima pri upisu novih korisnika';
+$lang['Email admins when a valid comment is entered'] = 'E-mail upraviteljima pri upisu novih komentara';
+$lang['Email admins when a comment requires validation'] = 'Email upraviteljima kada komentar treba ovjeru';
+$lang['Environment'] = 'Okruženje';
+$lang['Form'] = 'Oblik';
+$lang['Gallery title'] = 'Naziv galerije';
+$lang['Grant selected groups'] = 'Ovlasti odabrane grupe';
+$lang['Grant selected users'] = 'Ovlasti odabrane korisnike';
+$lang['Group name'] = 'Naziv grupe';
+$lang['Groups'] = 'Grupa';
+$lang['Guests'] = 'Gostiju';
+$lang['History'] = 'Povijest';
+$lang['Informations'] = 'Obavijesti';
+$lang['Install'] = 'Ugradi';
+$lang['Link all album photos to a new album'] = 'Poveži sve stavke skupine sa novom skupinom';
+$lang['Link all album photos to some existing albums'] = 'Poveži sve stavke skupine sa nekom postojećom skupinom';
+$lang['Linked albums'] = 'Povezane skupine';
+$lang['Lock gallery'] = 'Zaključaj galeriju';
+$lang['Maintenance'] = 'Održavanje';
+$lang['Edit album permissions'] = 'Upravljanje ovlastima za skupinu';
+$lang['Manage permissions for group "%s"'] = 'Upravljanje ovlastima za grupu "%s"';
+$lang['Manage permissions for user "%s"'] = 'Upravljanje ovlastima za korisnika "%s"';
+$lang['Manage tags'] = 'Upravljanje tagovima';
+$lang['Members'] = 'Članovi';
+$lang['Metadata synchronized from file'] = 'Usklađivanje meta podataka iz zapisa';
+$lang['Move albums'] = 'Premjesti skupine';
+$lang['Move'] = 'Premjesti';
+$lang['Name'] = 'Naziv';
+$lang['New name'] = 'Novi naziv';
+$lang['New parent album'] = 'Nova nadređena skupina';
+$lang['New tag'] = 'Novi tag';
+$lang['Number of comments per page'] = 'Broj komentara po stranici';
+$lang['Number of rates'] = 'Broj ocjena';
+$lang['Number of thumbnails to create'] = 'broj poveznih sličica za izradu';
+$lang['Only private albums are listed'] = 'Samo osobne skupine su ispisane';
+$lang['Operating system'] = 'Operativni sustav';
+$lang['Options'] = 'Mogućnosti';
+$lang['Other private albums'] = 'Ostale osobne skupine';
+$lang['Page banner'] = 'Baner stranice';
+$lang['Parent album'] = 'Nadređena skupina';
+$lang['Permalink'] = 'Stalna poveznica';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Stalna poveznica %s je prethodno korištena od skupine %s. Prvo je izbrišite iz starih zapisa';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Stalna poveznica mora biti sastavljena od znakova a-z, A-Z, 0-9, "-", "_" ili "/". Ne smije biti brojčana vrijednost ili počinjati brojem pa znakom "-"';
+$lang['Permalink %s is already used by album %s'] = 'Stalnu poveznicu %s već koristi skupina %s';
+$lang['Permalink history'] = 'Povijest stalnih poveznica';
+$lang['Permalinks'] = 'Stalne poveznice';
+$lang['Permission denied'] = 'Dozvola uskraćena';
+$lang['Permission granted thanks to a group'] = 'Dozvola odobrena zahvaljujući grupi';
+$lang['Permission granted'] = 'Dozvola odobrena';
+$lang['Photo informations updated'] = 'Podaci o slikama obnovljeni';
+$lang['Plugins'] = 'Dodaci';
+$lang['Position'] = 'Položaj';
+$lang['Preferences'] = 'Postavke';
+$lang['Properties'] = 'Svojstva';
+$lang['Random photo'] = 'Slika slučajnog odabira';
+$lang['Rate date'] = 'Nadnevak ocjene';
+$lang['Rating by guests'] = 'Ocjene gostiju';
+$lang['Rating'] = 'Ocjenjivanje';
+$lang['Reject'] = 'Odbaci';
+$lang['Representant'] = 'Predstavnik';
+$lang['Representation of albums'] = 'Predstavljanje skupina';
+$lang['Representative'] = 'Predstavljeno';
+$lang['Represents'] = 'Predstavlja';
+$lang['Save order'] = 'Redoslijed pohrane';
+$lang['Save to permalink history'] = 'Pohrani u povjest stalnih poveznica';
+$lang['Select at least one album'] = 'Odaberite najmanje jednu skupinu';
+$lang['Select at least one photo'] = 'Odaberite najmanje jednu sliku';
+$lang['Select at least one user'] = 'Odaberite najmanje jednog korisnika';
+$lang['Show info'] = 'Prikaz podataka';
+$lang['Site manager'] = 'Upravnik galerije';
+$lang['Status'] = 'Stanje';
+$lang['Statistics'] = 'Statistika';
+$lang['Storage album'] = 'Skupina pohrane';
+$lang['Sum of rates'] = 'Zbroj ocjena';
+$lang['Tag "%s" already exists'] = 'Tag "%s" već postoji';
+$lang['Tag "%s" was added'] = 'Tag "%s" dodan';
+$lang['Tag selection'] = 'Odabir tagova';
+$lang['The %d following tags were deleted'] = 'Slijedeći %d tagovi su izbrisani';
+$lang['Unable to check for upgrade.'] = 'Ne mogu provjeriti za nadogradnju.';
+$lang['Uninstall'] = 'Ukloni';
+$lang['Use the default photo sort order (defined in the configuration file)']='Koristi pretpostavljeni redoslijed slaganja slika (određeno u zapisu postave)';
+$lang['User comments validation'] = 'Ovjera korisničkih komentara';
+$lang['Users'] = 'Korisnici';
+$lang['Validate'] = 'Ovjeri';
+$lang['Validation'] = 'Ovjera';
+$lang['Version'] = 'Inačica';
+$lang['Virtual albums to move'] = 'Nestvarne skupine za premještaj';
+$lang['Virtual album name'] = 'Naziv nestvarne skupine';
+$lang['Webmaster cannot be deleted'] = 'Webmaster ne može biti izbrisan';
+$lang['You are running on development sources, no check possible.'] = 'Vi koristite razvojni izvorni kod, provjera nemoguća.';
+$lang['You cannot delete your account'] = "Ne možete izbrisati svoj račun";
+$lang['You cannot move an album in its own sub album'] = 'Ne možete premjestiti skupinu u njenu vlastitu podskupinu';
+$lang['You need to confirm deletion'] = 'trebate potvrditi brisanje';
+$lang['Associate to album'] = 'poveži sa skupinom';
+$lang['associate to group'] = 'poveži sa grupom';
+$lang['Authorized'] = 'Ovlašteno';
+$lang['Add a virtual album'] = 'Dodaj nestvarnu skupinu';
+$lang['Authorize users to add comments on selected albums'] = 'Ovlastite korisnike za davanje komentara u odabranim skupinama';
+$lang['The name of an album must not be empty'] = 'Naziv skupine ne bi trebao biti prazan';
+$lang['Lock albums'] = 'Zaključaj skupine';
+$lang['Private'] = 'Osobna skupina';
+$lang['Public'] = 'Javna skupina';
+$lang['Find a new representant by random'] = 'Izbor novog predstavnika slučajnim odabirom';
+$lang['Public / Private'] = 'Javno / Osobno';
+$lang['Manage authorizations for selected albums'] = 'Upravljanje ovlastima za odabrane skupine';
+$lang['Virtual album added'] = 'Nestvarna skupina dodana';
+$lang['Virtual album deleted'] = 'Nestvarna skupina izbrisana';
+$lang['Access type'] = 'Vrsta pristupa';
+$lang['Information data registered in database'] = 'Podaci upisani u bazu podataka';
+$lang['Default display'] = 'Pretpostavljeni prikaz';
+$lang['The gallery URL is not valid.'] = 'URL galerije nije valjan.';
+$lang['Main'] = 'Glavno';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Broj komentara po stranici mora biti između 5 i 50 uključivo.';
+$lang['Configuration'] = 'Postavljanje';
+$lang['confirm'] = 'potvrdi';
+$lang['Date'] = 'Nadnevak';
+$lang['delete album'] = 'izbriši skupinu';
+$lang['Dissociate from album'] = 'odspoji od skupine';
+$lang['dissociate from group'] = 'odspoji od grupe';
+$lang['Album updated successfully'] = 'Podaci skupine uspješno obnovljeni.';
+$lang['photos per page'] = 'stavaka po stranici';
+$lang['High definition enabled'] = 'Visoka razlučljivost omogućena';
+$lang['File'] = 'Zapis';
+$lang['first photo added on %s'] = 'prva stavka dodana %s';
+$lang['Forbidden'] = 'Zabranjeno';
+$lang['global mode'] = 'sveopći način';
+$lang['group "%s" added'] = 'grupa "%s" dodana';
+$lang['group "%s" deleted'] = 'grupa "%s" izbrisana';
+$lang['group "%s" updated'] = 'grupa "%s" obnovljena';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Naziv grupe ne može sadržavati  " ili \' ili biti prazan.';
+$lang['This name is already used by another group.'] = 'Ovaj naziv već koristi druga grupa.';
+$lang['High definition'] = 'Visoka razlučljivost';
+$lang['jump to album'] = 'skok u skupina';
+$lang['jump to photo'] = 'skok na sliku';
+$lang['leave'] = 'ostavi';
+$lang['Lock'] = 'Zaključaj';
+$lang['Locked'] = 'Zaključanp';
+$lang['manage album photos'] = 'upravljanje stavkama skupine';
+$lang['manage sub-albums'] = 'upravljanje podskupinama';
+$lang['Manage'] = 'Uprava';
+$lang['maximum height'] = 'najveća visina';
+$lang['maximum width'] = 'najveća širina';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Predviđeno vrijeme za popis korisnika za slanje poruka je ograničeno. Ostali korisnici nisu izlistani.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Vrijeme za slanje poruke je ograničeno. Ostale poruke su preskočene.';
+$lang['To send ?'] = 'Poslati ?';
+$lang['Last send'] = 'Zadnje poslano';
+$lang['email'] = 'e-mail';
+$lang['User'] = 'Korisnik';
+$lang['See you soon,'] = 'Vidimo se uskoro,';
+$lang['Go to'] = 'Idi na ';
+$lang['Hello'] = 'Pozdrav ';
+$lang['New photos were added'] = 'Nove stavke su dodane ';
+$lang['on'] = ' na ';
+$lang['between'] = 'između ';
+$lang['and'] = ' i ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster vas je pretlatio na primanje e-mail obavijesti.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Pretplatili ste se na primanje e-mail obavijesti.';
+$lang['To subscribe'] = 'Pretplata';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Ukoliko ste naišli na probleme ili imate pitanja, molimo pošaljite poruku za ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemi ili pitanja';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster vas je uklonio sa popisa za primanje e-mail obavijesti.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Uklonili ste se sa popisa za primanje e-mail obavijesti.';
+$lang[', click on'] = ', kliknite na ';
+$lang['To unsubscribe'] = 'Za uklanjanje';
+$lang['With blank value, gallery title will be used'] = 'Sa praznim poljem, koristiti će se naziv galerijeg';
+$lang['Notification'] = 'Obavijest';
+$lang['Error when sending email to %s [%s].'] = 'Greška prilikom slanja e-mail poruke za %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Poruka poslana za %s [%s].';
+$lang['%d mail was sent.'] = '%d poruka poslana.';
+$lang['%d mails were sent.'] = '%d poruke poslane.';
+$lang['%d mail was not sent.'] = '%d poruka nije poslane.';
+$lang['%d mails were not sent.'] = '%d poruke nisu poslane.';
+$lang['No mail to send.'] = 'Nema poruke za slanje.';
+$lang['There is no available subscribers to mail.'] = 'Nema dostupnih primatelja za slanje poruka.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Pretplatnici mogu biti izlistani (dostupni) samo ako ima novih stavki za obavijest.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'U svakom slučaju samo webmaster može pristupiti ovoj ploči a nikad upravitelji.';
+$lang['No user to send notifications by mail.'] = 'Nema korisnika za slanje e-mail obavijesti.';
+$lang['New photos added'] = 'Nove stavke dodane';
+$lang['Subscribe to notification by mail'] = 'Pretplatite se za e-mail obavijesti';
+$lang['Unsubscribe from notification by mail'] = 'Uklonite se iz sustava primanja e-mail obavijesti';
+$lang['Parameter'] = 'Stavka';
+$lang['Continue processing treatment'] = 'Nastavi obradu postupka';
+$lang['Complementary mail content'] = 'Cjelokupni sadržaj poruke';
+$lang['Add detailed content'] = 'Dodaj cjeli sadržaj';
+$lang['Send mail as'] = 'Pošalji poruku kao ';
+$lang['Send mail to users'] = 'Pošalji poruku korisnicima';
+$lang['Send'] = 'Pošalji';
+$lang['Options'] = 'Mogućnosti';
+$lang['Subscribed'] = 'Pretplaćen';
+$lang['Subscribe'] = 'Pretplatite se';
+$lang['Parameters'] = 'Stavke';
+$lang['Select recipients'] = 'Odaberite primatelje';
+$lang['Subscribe/unsubscribe users'] = 'Pretplati/poništi pretplatu korosnika';
+$lang['Unsubscribed'] = 'Pretplata poništena';
+$lang['%d parameter was updated.'] = '%d stavka je obnovljena.';
+$lang['%d parameters were updated.'] = '%d stavke su poništene.';
+$lang['%d user was not updated.'] = '%d korisnik nije obnovljen.';
+$lang['%d users were not updated.'] = '%d korisnici nisu obnovljeni.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'User %s [%s] je uklonjen iz popisa pretplatnika.';
+$lang['User %s [%s] was added to the subscription list.'] = 'User %s [%s] je dodan na popis pretplatnika.';
+$lang['%d user was updated.'] = '%d korisnik je obnovljen.';
+$lang['%d users were updated.'] = '%d korisnici su obnovljeni.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Korisnik %s [%s] nije uklonjen iz popisa pretplatnika.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Korisnik %s [%s] nije dodan na popis pretplatnika.';
+$lang['User %s [%s] added.'] = 'Korisnik %s [%s] dodan.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Upozorenje: pretplata ili ukidanje pretplate će poslati e-mail poruke korisnicima';
+$lang['Send mail on HTML format'] = 'Pošalji poruku u HTML obliku';
+$lang['Include display of recent photos grouped by dates'] = 'Uključi prikaz nedavnih slika složenih po nadnevcima';
+$lang['Available only with HTML format'] = 'Dostupno samo u HTML obliku';
+$lang['no write access'] = 'nema dozvole upisa';
+$lang['Permissions'] = 'Dozvole';
+$lang['private'] = 'osobno';
+$lang['public'] = 'javno';
+$lang['Purge never used notification feeds'] = 'Isprazni nikad korištene obavijesne izvore';
+$lang['Purge sessions'] = 'Isprazni sjednice';
+$lang['randomly represented'] = 'predstavljen slučajnim odabirom';
+$lang['registration date'] = 'nadnevak upisa';
+$lang['clean'] = 'čisto';
+$lang['remove remote listing.xml file'] = 'ukloni udaljeni listing.xml zapis';
+$lang['generate listing'] = 'izradi popis';
+$lang['generate file listing.xml on remote site'] = 'izradi listing.xml zapis na udaljenom mjestu';
+$lang['Create this site'] = 'Izgradi ovo mjesto';
+$lang['A local listing.xml file has been found for'] = 'Mjesni listing.xml zapis je pronađen za ';
+$lang['read local listing.xml and update'] = 'čitam mjesni listing.xml i obnavljam';
+$lang['test'] = 'proba';
+$lang['test this remote site'] = 'isprobajte ovo udaljeno mjesto';
+$lang['remove tags'] = 'ukloni tagove';
+$lang['Repair and optimize database'] = 'Popravi i ugodi bazu podataka';
+$lang['selection'] = 'odabir';
+$lang['set to'] = 'postavljeno na';
+$lang['singly represented'] = 'jednoznačno predstavljeno';
+$lang['This site already exists'] = 'Ovo mjesto već postoji';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Izradi novo mjesto : (odreite njegov URL za izradu create_listing_file.php)';
+$lang['created'] = 'izrađeno';
+$lang['delete'] = 'izbriši';
+$lang['delete this site and all its attached elements'] = 'izbriši ovo mjesto i sve njegove pridodane stavke';
+$lang['an error happened'] = 'došlo je do greške';
+$lang['file create_listing_file.php on remote site was not found'] = 'zapis create_listing_file.php na udaljenom mjestu nije pronađen';
+$lang['Local'] = 'Mjesno';
+$lang['Remote'] = 'Udaljeno';
+$lang['update the database from files'] = 'obnovi bazu podataka pomoću zapisa';
+$lang['status'] = 'stanje';
+$lang['Directory'] = 'Mapa';
+$lang['sub-albums'] = 'podskupine';
+$lang['Synchronize metadata'] = 'uskladi meta podatke';
+$lang['target'] = 'odredište';
+$lang['Thumbnail'] = 'Povezne sličice';
+$lang['title'] = 'naslov';
+$lang['Album list management'] = 'Upravljanje skupinama';
+$lang['Piwigo configuration'] = 'Piwigo postave';
+$lang['Edit album'] = 'Uredi skupinu';
+$lang['Group management'] = 'Upravljanje grupama';
+$lang['User list'] = 'Popis korisnika';
+$lang['Edit photo information'] = 'Promjena podataka o slici';
+$lang['Thumbnail creation'] = 'Izrada poveznij sličica';
+$lang['Database synchronization with files'] = 'Usklađivanje baze podataka sa zapisima';
+$lang['all'] = 'sve';
+$lang['photos without thumbnail (jpeg and png only)'] = 'slike bez poveznih sličica (samo jpeg i png)';
+$lang['height must be a number superior to'] = 'visina mora biti broj veći od ';
+$lang['width must be a number superior to'] = 'širina mora biti broj veći od';
+$lang['for the file format'] = 'za zapisni oblik';
+$lang['No missing thumbnail'] = 'Nema nedostajućih poveznih sličica';
+$lang['Photo unreachable or no support'] = 'Slika nedohvatna ili bez podrške';
+$lang['GD version'] = 'GD inačica';
+$lang['generated in'] = 'izrađena u';
+$lang['Results of miniaturization'] = 'ishodi umanjivanja';
+$lang['General statistics'] = 'Glavna statistika';
+$lang['max time'] = 'najveće vrijeme';
+$lang['average time'] = 'prosječno vrijeme';
+$lang['min time'] = 'najmanje vrijeme';
+$lang['number of miniaturized photos'] = 'broj umanjenih slika';
+$lang['total time'] = 'sveukupno vrijeme';
+$lang['for this file format'] = 'za ovu vrstu zapisa';
+$lang['unit mode'] = 'jedinični način';
+$lang['Unlocked'] = 'Otključano';
+$lang['unset'] = 'razdešeno';
+$lang['Update albums informations'] = 'Obnovi podatke o skupinama';
+$lang['Update photos information'] = 'Obnovi podatke o slikama';
+$lang['Synchronize'] = 'Uskladi';
+$lang['reduce to single existing albums'] = 'suzi na jednu postojeću skupinu-e';
+$lang['Choose an option'] = 'Izaberite mogućnost';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'najopširniji mogući prikaz podataka (dodane skupine i stavke, izbrisane  skupine i stavke)';
+$lang['Piwigo version differs on the remote site'] = 'Piwigo inačica na udaljenom mjestu se razlikuje';
+$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = 'Inačica create_listing_file.php na udaljenom mjestu i Piwigo-u mora biti jednaka';
+$lang['listing.xml file was not found'] = 'listing.xml zapis nije pronađen';
+$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = 'listing.xml zapis nije pronađen na udaljenom mjestu. Ovaj zapis se izrađuje odabirom "izradi popis" mogućnosti u Upravi mjesta';
+$lang['Error list'] = 'Greška popisa';
+$lang['Errors caption'] = 'Zaglavlja grešaka';
+$lang['Detailed informations'] = 'Podrobnije obavjesti';
+$lang['File/directory read error'] = 'Greška čitanja zapisa/mape';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Zapisu ili mapi se ne može pristupiti (ne postoji ili je pristup zabranjen)';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'tip slikovnog zapisa zahtjeva poveznu sličicu. Povezna sličica mora biti prisutna u podmapi "thumbnail" mape skupine. Naziv povezne sličice mora počinjati sa pretpostavljenim predznakom i nastavak mora biti jedan od popisanih :';
+$lang['missing thumbnail'] = 'nedostajuće povezne sličice';
+$lang['albums deleted in the database'] = 'skupine izbrisane iz baze podataka';
+$lang['photos deleted from the database'] = 'stavke izbrisane iz baze podataka';
+$lang['photos candidates for metadata synchronization'] = 'slika kandidata za usklađivanje meta podataka';
+$lang['photos informations synchronized with files metadata'] = 'podataka stavaka usklađeno sa meta podacima zapisa';
+$lang['errors during synchronization'] = 'grešaka tijekom usklađivanja';
+$lang['albums added in the database'] = 'skupina dodano u bazu podataka';
+$lang['photos added in the database'] = 'stavaka dodano u bazu podataka';
+$lang['photos updated in the database'] = 'stavaka obnovljeno u bazi podataka';
+$lang['Search for new images in the directories'] = 'Pretraživanje novih slika u mapama';
+$lang['added'] = 'dodano';
+$lang['deleted'] = 'izbrisano';
+$lang['Metadata synchronization results'] = 'Ishodi usklađivanja meta podataka';
+$lang['only perform a simulation (no change in database will be made)'] = 'izvrši samo oponašanje (nema promjena u bazi podataka)';
+$lang['Simulation'] = 'Oponašanje';
+$lang['directories + files'] = 'mape + zapise';
+$lang['only directories'] = 'samo mape';
+$lang['synchronize files structure with database'] = 'uskladi sastav zapisa sa bazom podataka';
+$lang['synchronize files metadata with database photos informations'] = 'uskladi meta podatke zapisa sa podacima stavki baze podataka';
+$lang['even already synchronized photos'] = 'čak i već usklađene stavke';
+$lang['Used metadata'] = 'Korišteni meta podaci';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Nazivi mapa i zapisa moraju biti sastavljeni od slova, brojva, "-", "_" ili "."';
+$lang['wrong filename'] = 'krivi naziv zapisa';
+$lang['Upload'] = 'Prebaci';
+$lang['user "%s" added'] = 'korisnik "%s" dodan';
+$lang['User status'] = 'Stanje korisnika';
+$lang['user_status_admin'] = 'Upravnik';
+$lang['user_status_generic'] = 'Općenit';
+$lang['user_status_guest'] = 'Gost';
+$lang['user_status_normal'] = 'Korisnik';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Nestvarna skupina';
+$lang['Waiting'] = 'Čekanje';
+$lang['default'] = 'pretpostavljeno';
+$lang['Toggle \'default group\' property'] = 'Promijeni \'pretpostavljena grupa\' svojstva';
+$lang['Advanced features'] = 'Napredne mogućnosti';
+$lang['Overall'] = 'Sveukupno';
+$lang['Year'] = 'Godina';
+$lang['Month'] = 'Mjesec';
+$lang['Day'] = 'Dan';
+$lang['Pages seen'] = 'Stranica viđeno';
+$lang['Time'] = 'Vrijeme';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Stavka';
+$lang['Section'] = 'Odjeljak';
+$lang['Save page visits by guests'] = 'Pohrani posjete stranicama po gostima';
+$lang['Save page visits by users'] = 'Pohrani posjete stranicama po korisnicima';
+$lang['Save page visits by administrators'] = 'Pohrani posjete stranicama upraviteljima';
+$lang['An information email was sent to group "%s"'] = 'Obavijesna e-mail poruka je poslana grupi "%s';
+$lang['Send an information email to group members'] = 'Pošalji obavijesni e-mail članovima grupe';
+$lang['Group'] = 'Grupa';
+$lang['[%s] Visit album %s'] = '[%s] Dođite i pogledajte skupinu %s';
+$lang['Hello,'] = 'Pozdrav,';
+$lang['See you soon.'] = 'Do skorog viđenja.';
+$lang['Discover album:'] = 'Dođite i otkrijte skupinu:';
+$lang['Mail content'] = 'sadržaj e-mail poruke';
+$lang['none'] = 'ni jedan';
+$lang['high'] = 'visoko';
+$lang['other'] = 'ostalo';
+$lang['Element type'] = 'Tip stavke';
+$lang['Image id'] = 'ID slike';
+$lang['Summary'] = 'Zbirno';
+$lang['%d line filtered'] = '%d linija pročišćena';
+$lang['%d lines filtered'] = '%d linija pročišćeno';
+$lang['%d guest'] = '%d gost';
+$lang['%d guests'] = '%d gostiju';
+$lang['Hour'] = 'Sat';
+$lang['guest'] = 'gost';
+$lang['default values'] = 'pretpostavljene vrijednosti';
+$lang['High filesize'] = 'Visoka veličina zapisa';
+$lang['Guest cannot be deleted'] = 'Gost ne može biti izbrisan';
+$lang['Default user cannot be deleted'] = 'Pretpostavljeni korisnik ne može biti izbrisan';
+$lang['Purge history detail'] = 'Isprazni povijesne pojedinosti';
+$lang['Purge history summary'] = 'Isprazni povijesni zbir';
+$lang['Check integrity'] = 'Provjera cjelovitosti';
+$lang['Anomaly'] = 'Nepravilnost';
+$lang['Correction'] = 'Ispravak';
+$lang['Automatic correction'] = 'Samostalno ispravljanje';
+$lang['Impossible automatic correction'] = 'Samostalno ispravljanje nemoguće';
+$lang['Correction applied with success'] = 'Ispravka uspješno ugrađena';
+$lang['Correction applied with error'] = 'Ispravka ugrađena s greškom';
+$lang['%d anomaly has been detected.'] = '%d nepravilnost je otkrivena.';
+$lang['%d anomalies have been detected.'] = '%d nepravilnosti su otkrivene.';
+$lang['%d anomaly has been corrected.'] = '%d nepravilnost je ispravljena.';
+$lang['%d anomalies have been detected corrected.'] = '%d nepravilnosti je ispravljeno.';
+$lang['%d anomaly has not been corrected.'] = '%d nepravilnost nije ispravljena.';
+$lang['%d anomalies have not been corrected.'] = '%d nepravilnosti nije ispravljeno.';
+$lang['Go to %s or %s for more informations'] = 'Idite na %s ili %s za više pojedinosti';
+$lang['the forum'] = 'forum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s vrijednost nije valjani zapis jer exif nije podržan';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s mora biti postavljeno na false u config_local.inc.php file';
+$lang['Main "guest" user does not exist'] = 'Glavni "guest" korisnik ne postoji';
+$lang['Main "guest" user status is incorrect'] = 'Stanje glavnog "guest" korisnika je neispravno';
+$lang['Default user does not exist'] = 'Pretpostavljeni korisnik ne postojit';
+$lang['Main "webmaster" user does not exist'] = 'Glavni "webmaster" korisnik ne postoji';
+$lang['Main "webmaster" user status is incorrect'] = 'Stanje glavnog "webmaster" korisnika je neispravno';
+$lang['User "%s" created with "%s" like password'] = 'Korisnik "%s" izrađen sa "%s" kao zaporkom';
+$lang['Status of user "%s" updated'] = 'Stanje korisnika "%s" obnovljeno';
+$lang['add new photos to caddie'] = 'dodaj nove stavke u ladicu';
+$lang['No display'] = 'Bez prikaza';
+$lang['Classic display'] = 'Klasični prikaz';
+$lang['Hoverbox display'] = 'Prikaz lebdećim prozorom';
+$lang['Mail address is obligatory for all users'] = 'E-mail adresa je obavezna za sve korisnike';
+$lang['Minimum privacy level'] = 'Najniža razina privatnosti';
+$lang['Privacy level'] = 'Razina privatnosti';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Poznanici';
+$lang['Level 2'] = 'Prijatelji';
+$lang['Level 4'] = 'Obitelj';
+$lang['Level 8'] = 'Upravnici';
+$lang['Reinitialize check integrity'] = 'Ponovi provjeru cjelovitosti';
+$lang['Check all'] = 'Označi sve';
+$lang['Uncheck all'] = 'Odznači sve';
+$lang['Check automatic corrections'] = 'Označi samoispravke';
+$lang['Apply selected corrections'] = 'Primjeni odabrane ispravke';
+$lang['Ignore selected anomalies'] = 'Zanemari odabrane nepravilnosti';
+$lang['Refresh'] = 'Osvježi';
+$lang['The anomaly will be ignored until next application version'] = 'Nepravilnost će se zanemariti do slijedeće inačice galerije';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Ispravak nepravilnosti će poništiti činjenicu da je zanemarena';
+$lang['%d anomaly has been ignored.'] = '%d nepravilnost je zanemarena.';
+$lang['%d anomalies have been ignored.'] = '%d nepravilnosti su zanemarene.';
+$lang['Plugins which need upgrade'] = 'Dodaci koji trebaju nadogradnju';
+$lang['Plugin list'] = 'Popis dodataka';
+$lang['Check for updates'] = 'Provjera nadogradnji';
+$lang['Other plugins'] = 'Ostali dodaci';
+$lang['Last revisions'] = 'Zadnja izdanja';
+$lang['Are you sure you want to delete this plugin?'] = 'Sigurno želite ukloniti ovaj dodatak?';
+$lang['Are you sure you want to install this plugin?'] = 'Sigurno želite ugraditi ovaj dodatak?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Sigurno želite ugraditi ovaj dodatak? Morate ovjeriti ako ova inačica ne treba uklanjanje.';
+$lang['Plugin has been successfully copied'] = 'Dodatak je uspješno preslikan';
+$lang['You might go to plugin list to install and activate it.'] = 'Možete ići na popis dodataka za ugradbu i pokretanje.';
+$lang['Can\'t create temporary file.'] = 'Ne mogu napraviti privremeni zapis.';
+$lang['Can\'t download archive.'] = 'Ne mogu preuzeti zapis.';
+$lang['Can\'t read or extract archive.'] = 'Ne mogu očitati ili izlučiti zapis.';
+$lang['An error occured during extraction (%s).'] = 'Došlo je do greške prilikom izlučivanja (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Provjerite "plugins" mapu i dozvole podmapa (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Ne mogu se povezati na poslužitelj.';
+$lang['Purge compiled templates'] = 'Isprazni obrađene predloške';
+$lang['ACCESS_0'] = 'Slobodan pristup';
+$lang['ACCESS_1'] = 'Pristup svima';
+$lang['ACCESS_2'] = 'Pristup pretplatnicima';
+$lang['ACCESS_3'] = 'Pristup upraviteljima';
+$lang['ACCESS_4'] = 'Pristup webmaster-ima';
+$lang['ACCESS_5'] = 'Bez pristupa';
+$lang['Support'] = 'Podrška';
+$lang['Documentation'] = 'Dokumentacija';
+$lang['A new version of Piwigo is available.'] = 'Nova Piwigo inačica je dostupna.';
+$lang['Piwigo Administration'] = 'Piwigo Uprava';
+$lang['Piwigo version'] = 'Piwigo inačica';
+$lang['You are running the latest version of Piwigo.'] = 'Koristite najnoviju inačicu Piwigo-a.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Inačica od %s [%s] postavljene nije sukladna potrebnoj inačici [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'trebate nadograditi vaš sustav da biste imali sve pogodnosti u protivnom sustav neće raditi uredno ili uopće neće raditi';
+$lang['Deleted on'] = 'Izbrisan na';
+$lang['Last hit'] =  'Zadnji posjet';
+$lang['GD library is missing'] = 'Nedostaje GD biblioteka';
+$lang['Templates'] = 'Predlošci';
+$lang['Extend for templates'] = 'Proširenje za predloške';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'Zamjena izvornih predložaka prilagođenima iz podmape template-extension';
+$lang['Replacers (customized templates)'] = 'Zamjene (prilagođeni predlošci)';
+$lang['Original templates'] = 'Izvorni predlošci';
+$lang['Optional URL keyword'] = 'Izborna URL ključna riječ';
+$lang['Templates configuration has been recorded.'] = 'Postava predložaka je pohranjena.';
+$lang['All optimizations have been successfully completed.'] = 'Sva poboljšanja su uspješno dovršena.';
+$lang['Optimizations have been completed with some errors.'] = 'Poboljšanja su izvršena uz neke greške.';
+$lang['Modify information'] = 'Promijeni podatak';
+$lang['nothing'] = 'ništa';
+$lang['overrides existing values with empty ones'] = 'prekucava postojeće vrijednosti praznim poljima';
+$lang['Manage photo ranks'] = 'Uprava poretkom';
+$lang['Edit ranks'] = 'Uredi poredak';
+$lang['No photo in this album'] = 'Nema stavke u ovoj skupini';
+$lang['Images manual order was saved'] = 'Pohranjen je izvorni redoslijed slika';
+$lang['ranks'] = 'poretci';
+$lang['Drag to re-order'] = 'Povuci za preslagivanje';
+$lang['Quick Local Synchronization'] = 'Brzo Mjesno Usklađivanje';
+$lang['No photo can be deleted'] = 'Nema slike koja se može brisati';
+$lang['Delete selected photos'] = 'Briši odabrane slike';
+$lang['%d photo was deleted'] = '%d slika je izbrisana';
+$lang['%d photos were deleted'] = '%d slike su izbrisane';
+$lang['Downloads'] = 'Preuzimanja';
+$lang['Released on'] = 'Objavljeno dana';
+$lang['Number of downloads'] = 'Broj preuzimanja';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Announcements e-Novine';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Ostanite u vezi sa projektom, pretplatite se na Piwigo Announcement e-Novine. Primati ćete e-mail poruke po izlasku novih inačica (ponekad sa sigurnosnim zakrpama, važno je znati da su dostupne i treba ih što prije ugraditi) te o svim važnijim zbivanjima i događanjima u vezi sa projektom. Svega par e-mail poruka godišnje.';
+$lang['Subscribe %s'] = 'Pretplatite %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Pretplatite %s na Piwigo English Announcements e-Novine';
+$lang['Purge search history'] = 'Pročisti povijest pretraživanja';
+$lang['Hide'] = 'Sakrij';
+$lang['Operation in progress'] = 'Obrada postupka.';
+$lang['Please wait...'] = 'Sačekajte molim...';
+$lang['Password is missing. Please enter the password.'] = 'Nedostaje zaporka. Molimo unesite zaporku.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nedostaje potvrda zaporke. Molimo potvrdite odabranu zaporku.';
+$lang['Allow users to edit their own comments'] = 'Dozvoliti korisnicima uređivanje vlastitih komentara';
+$lang['Allow users to delete their own comments'] = 'Dozvoliti korisnicima brisanje vlastitih komentara';
+$lang['Email administrators when a comment is modified'] = 'E-mail poruka upravnicima kada je komentar promijenjen';
+$lang['Email administrators when a comment is deleted'] = 'E-mail poruka upravnicima kada je komentar izbrisan';
+$lang['Cannot delete the old permalink !'] = 'Stare stalne poveznice ne mogu se brisati!';
+$lang['Hit'] = 'Posjeta';
+$lang['Tools'] = 'Alati';
+$lang['Photos'] = 'Slike';
+$lang['Themes'] = 'Teme';
+$lang['Instructions to use Piwigo'] = 'Upute za korištenje Piwigo-a';
+$lang['Installed Themes'] = 'Ugrađene Teme';
+$lang['Add New Theme'] = 'Dodaj novu temu';
+$lang['Forbid this theme to users'] = 'Zabrani ovu temu korisnicima';
+$lang['Set as default theme for unregistered and new users'] = 'Postavi za pretpostavljenu temu za nepoznate i nove korisnike';
+$lang['unknown'] = 'nepoznat';
+$lang['Upload Photos'] = 'Prebaci Slike';
+$lang['Drop into album'] = 'Spusti u skupinu';
+$lang['+ Add an upload box'] = '+ Dodaj kutiju prebacivanja';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Izradi "%s" mapu u korijenu vaše Piwigo galerije';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dozvoli pravo upisa (chmod 777) za "%s" mapu u korijenu Piwigo galerije';
+$lang['existing album'] = 'postojeća skupina';
+$lang['create a new album'] = 'stvori novu skupinu';
+$lang['Album name'] = 'Naziv skupine';
+$lang['Album "%s" has been added'] = 'Skupina "%s" je dodana';
+$lang['Uploaded Photos'] = 'Prebačene Slike';
+$lang['%d photos uploaded'] = '%d slika prebačeno';
+$lang['Privacy level set to "%s"'] = 'Razina privatnosti postavljena na "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Skupina "%s" sada sadržava %d slika';
+$lang['Manage this set of %d photos'] = 'Upravljanje ovim skupom od %d slika';
+$lang['Select files'] = 'Odaberi zapise';
+$lang['Everybody'] = 'Svi';
+$lang['Who can see these photos?'] = 'Tko može pregledavati ove slike?';
+$lang['Settings'] = 'Postavke';
+$lang['Resize'] = 'Pronijeni veličinu';
+$lang['Maximum Width'] = 'Najveća Širina';
+$lang['pixels'] = 'piksela';
+$lang['Maximum Height'] = 'Najveća Visina';
+$lang['Image Quality'] = 'Kakvoća slike';
+$lang['Save Settings'] = 'Pohrani Postavke';
+$lang['Your configuration settings are saved'] = 'Vaše postavke su pohranjene';
+$lang['Active Themes'] = 'Aktivne Teme';
+$lang['Add write access to the "%s" directory'] = 'Dodaj dozvolu upisa za "%s" mapu';
+$lang['Administration Home'] = 'Upravna Ploča';
+$lang['Change Admin Colors'] = 'Promijeni boje upravnog dijela';
+$lang['Delete this theme'] = 'izbriši ovu temu';
+$lang['Directory does not exist'] = 'Mapa ne postoji';
+$lang['Download,'] = 'Preuzmi,';
+$lang['FTP + Synchronization'] = 'FTP + Usklađivanje';
+$lang['Get Support on Piwigo Forum'] = 'Potražite pomoć u Piwigo forumu';
+$lang['Help Me'] = 'Pomozite Mi';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ova tema se ne može postaviti, jer nedostaje nadređena tema: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ova tema se ne može brisati, zbog drugih tema ovisnih o njoj: %s';
+$lang['Inactive Themes'] = 'Nekorištene teme';
+$lang['Install on your computer,'] = 'Ugradite na svoje računalo,';
+$lang['Make this theme available to users'] = 'Očinite ovu teme dostumon korisnicima';
+$lang['Page end'] = 'Kraj stranice';
+$lang['Piwigo Uploader'] = 'Piwigo Prebacivač';
+$lang['Read Piwigo Documentation'] = 'Pročitajte Piwigo Dokimentaciju';
+$lang['Start pLoader and add your photos.'] = 'Pokreni pLoader i dodajte svoje slike.';
+$lang['Switch to clear or dark colors for administration'] = 'Prebaci na svijetle ili tamne boje za upravljanje';
+$lang['Theme has been successfully installed'] = 'Tema je uspješno ugrađena';
+$lang['Visit Gallery'] = 'Posjetite galeriju';
+$lang['Visit Piwigo project website'] = 'Posjetite web stranicu Piwigo projekta';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader znači <em>Piwigo Uploader</em>. Sa vašeg računala, pLoader priprema vaše slike i prebacuje ih u vašu Piwigo galeriju.';
+$lang['Guest Settings'] = 'Postavke Gost računa';
+$lang['Main Page'] = 'Glavna stranica';
+$lang['Photo Page'] = 'Stranica Slika';
+$lang['Activate Navigation Bar'] = 'Uključiti navigacijsku traku';
+$lang['Activate Navigation Thumbnails'] = 'Uključiti navigacijske povezne sličice';
+$lang['Activate icon "%s"'] = 'Uključiti ikonu "%s"';
+$lang['Activate field "%s"'] = 'Uključiti polje "%s"';
+$lang['Photo Properties'] = 'Svojstva slika';
+$lang['Allow user customization'] = 'Dozvoliti korisničku prilagodbu';
+$lang['Languages'] = 'Jezici';
+$lang['Installed Languages'] = 'Ugrađeni Jezici';
+$lang['Add New Language'] = 'Dodaj Novi Jezik';
+$lang['Language has been successfully installed'] = 'Jezik uspješno ugrađen';
+$lang['Select:'] = 'Odaberi:';
+$lang['None'] = 'Nijedan';
+$lang['Invert'] = 'Obrnuto';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Nemoguće je isključiti ovu temu, potrebna je najmanje jedna tema.';
+$lang['Webmaster status is required.'] = 'Potrebne su Webmaster ovlasti.';
+$lang['Bound Theme'] = 'Prikači Temu';
+$lang['Allow rating'] = 'Dozvoli ocjenjivanje';
+$lang['Select at least one comment'] = 'Odaberite najmanje jedan komentar';
+$lang['Active Plugins'] = 'Uključeni Dodaci';
+$lang['Inactive Plugins'] = 'Isključeni Dodaci';
+$lang['Missing Plugins'] = 'Nedostajući Dodaci';
+$lang['Uninstalled Plugins'] = 'Uklonjeni Dodaci';
+$lang['By %s'] = 'Po %s';
+$lang['Visit plugin site'] = 'Posjetite strancu dodataka';
+$lang['Active Languages'] = 'Uključeni Jezici';
+$lang['Delete this language'] = 'Izbrišite ovaj jezik';
+$lang['Forbid this language to users'] = 'Zabranite ovaj jezik korisnicima';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Nemoguće je isključenje ovog jezika, prvo postavite neki drugi jezik kao pretpostavljen.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Nemoguće je isključenje ovog jezika, trebate imati najmanje jedan jezik.';
+$lang['Inactive Languages'] = 'Isključeni Jezici';
+$lang['Make this language available to users'] = 'Učinite ovaj jezik dostupnim korisnicima';
+$lang['Set as default language for unregistered and new users'] = 'Postavi kao pretpostavljen jezik za nove i nepoznate korisnike';
+$lang['Add Photos'] = 'Dodaj Slike';
+$lang['The following tag was deleted'] = 'Slijedeći tag je izbrisan';
+$lang['Miscellaneous'] = 'Razno';
+$lang['Virtual Links'] = 'Prividne Poveznice';
+$lang['There is no other language available.'] = 'Neme dostupnih drugih jezika.';
+$lang['There is no other plugin available.'] = 'Nema dostupnih drugih dodataka.';
+$lang['There is no other theme available.'] = 'Nema dostupnih drugih tema.';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Vrijeme izvršenja je isteklo, postupak se mora nastaviti [Procijenjeno vrijeme: %d sekunda].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Vrijeme izvršenja je premašeno, postupak se mora nastaviti [Procijenjeno vrijeme: %d sekunda].';
+$lang['By rank'] = 'Po poretku';
+$lang['Manual order'] = 'Ručni poredak';
+$lang['Add another set of photos'] = 'Dodaj još jedan skup slika';
+$lang['Path'] = 'Putanja';
+$lang['Order of menubar items has been updated successfully.'] = 'Redoslijed  stavki izborne trake je uspješno obnovljen.';
+$lang['This theme was not designed to be directly activated'] = 'Ova tema nije zamišljena za neposrednu postavu'; 
+$lang['Menu Management'] = 'Izbornik';
+$lang['Action'] = 'Akcija';
+$lang['Add a filter'] = 'Dodaj filter';
+$lang['Album photos associated to the following albums: %s'] = 'Fotografije vezane uz sljedeće albume: %s';
+$lang['Albums automatically sorted'] = 'Automatski poredak albuma';
+$lang['All %d photos are selected'] = 'Označeno %d fotografija';
+$lang['Apply action'] = 'Potvrdi akciju';
+$lang['automatic order'] = 'automatski poredak';
+$lang['Batch Manager'] = 'Skupno uređivanje';
+$lang['Choose an action'] = 'Odaberi akciju';
+$lang['Delete orphan tags'] = 'Briši nekorištene oznake';
+$lang['delete photo'] = 'briši fotografiju';
+$lang['Duplicates'] = 'duplići';
+$lang['Error on file "%s" : %s'] = 'Greška na datoteci "%s" : %s';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif ekstenzija nije dostupna, administrator bi trebao onemogućiti korištenje exif-a';
+$lang['Failed to write file to disk'] = 'Nije uspjelo zapisivanje na disk';
+$lang['File upload stopped by extension'] = 'Upload datoteke je zaustavljen od strane ekstenzije';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Vrijednost upload_max_filesize (%sB) u vašoj php.ini datoteci je veća od post_max_size (%sB), trebali biste podesiti te postavke';
+$lang['include child albums'] = 'uključi podalbume';
+$lang['manual order'] = 'ručni poredak';
+$lang['%d of %d photos selected'] = 'označeno %d od %d fotografija';
+$lang['Missing a temporary folder'] = 'Nedostaje privremena mapa';
+$lang['new'] = 'novo';
+$lang['No file was uploaded'] = 'Datoteka nije poslana';
+$lang['No photo in the current set.'] = 'U trenutnoj grupi nema fotografija.';
+$lang['No photo selected, %d photos in current set'] = 'Fotografije nisu označene, %d fotografija u trenutnoj grupi';
+$lang['No photo selected, no action possible.'] = 'Nijedna fotografija nije označena.';
+$lang['No results'] = 'Nema rezultata';
+$lang['on the %d selected photos'] = 'na %d označenih fotografija';
+$lang['Orphan tags deleted'] = 'Nekorištene oznake su izbrisane';
+$lang['Pending Comments'] = 'Neriješeni komentari';
+$lang['Refresh photo set'] = 'Osvježi grupu fotografija';
+$lang['Remove all filters'] = 'Ukloni sve filtre';
+$lang['remove author'] = 'ukloni autora';
+$lang['remove creation date'] = 'ukloni datum nastanka';
+$lang['Remove from caddie'] = 'Ukloni iz caddie';
+$lang['remove this filter'] = 'ukloni ovaj filter';
+$lang['remove title'] = 'ukloni naslov';
+$lang['Searching...'] = 'Tražim ...';
+$lang['Selection'] = 'Odabir';
+$lang['Set author'] = 'Postavi autora';
+$lang['Set creation date'] = 'Postavi datum nastanka';
+$lang['Set title'] = 'Postavi naslov';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Veličina poslane datoteke prelazi MAX_FILE_SIZE postavku definiranu unutar HTML obrasca';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Veličina poslane datoteke prelazi uload_max_filesize postavku u php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Poslana datoteka je djelomično upload-ana';
+$lang['Rate'] = 'Ocjena';
+$lang['Average rate'] = 'Prosječna ocjena';
+$lang['An error has occured during upgrade.'] = 'Došlo je do greške tijekon postupka nadogradnje.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Greška se dogodila tijekom izlučivanja. Molimo provjerite upisne dozvole vaše piwigo postave.<br><a href="%s">Kliknite za prikaz dnevnika greške</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne može dohvatiti zapis nadogradnje sa poslužitelja';
+$lang['Dump Database'] = 'Isprazni bazu podataka';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Uključi povijest posjeta (Pozor: memorijsko ograničenje poslužitelja može biti premašeno)';
+$lang['Unable to dump database.'] = 'Nemoguće pražnjenje baze podataka.';
+$lang['Save Template Directory'] = 'Sačuvaj mapu predložaka';
+$lang['Some themes and plugins may be not available yet.'] = 'Neke teme i dodaci možda nisu još dostupni.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Možete nadograditi Piwigo na inačicu %s neposredno, bez nadograđivanja na inačicu Piwigo %s (preporučeno).';
+$lang['Update to Piwigo %s'] = 'Nadogradnja na Piwigo inačicu %s';
+$lang['Two updates are available'] = 'Dvije su nadogradnje dostupne';
+$lang['This is a minor update, with only bug corrections.'] = 'Ovo je manja nadogradnja, samo popravke grešeaka.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Ovo je veća nadogradnja, sa <a href="%s">novim uzbudljivim mogućnostima</a>.';
+$lang['Update in progress... Please wait.'] = 'Nadogradnja u tijeku... Molimo sačekajte.';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivirajte sličicu "Novo" pored albuma i slika';
+$lang['Add a criteria'] = 'Dodaj uvjet';
+$lang['Deactivate all'] = 'Sve deaktiviraj';
+$lang['Default photos order'] = 'Zadani poredak fotografija';
+$lang['Restore'] = 'Vrati';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Vrati zadane postavke. Postojeće postve dodataka će se izgubiti!';
+$lang['Show menubar'] = 'Prikaži liniju izbornika';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Poslana datoteka prelazi post_max_size direktivu u php.ini: %sB';
+$lang['The whole page'] = 'Cijela stranica';
+$lang['The whole set'] = 'Cijeli set';
+$lang['Type here the author name'] = 'Unesi ime autora';
+$lang['Type here the title'] = 'Unesi naslov';
+$lang['Type in a search term'] = 'Traži ..';
+$lang['Unknown upload error'] = 'Nepoznata greška prilikom slanja datoteke';
+$lang['Add to caddie'] = 'dodaj u ladicu';
+$lang['%s has been successfully updated.'] = '%s je uspješno ažurirano.';
+$lang['%s photos can not be regenerated'] = '%s fotografija nije moguće regenerirati';
+$lang['%s photos have been regenerated'] = '%s fotografija regenerirano';
+$lang['%s thumbnails can not be regenerated'] = '%s malih sličica nije moguće regenerirati';
+$lang['%s thumbnails have been regenerated'] = '%s malih sličica je generirano';
+$lang['(this tag will be deleted)'] = '(ova oznaka je izbrisana)';
+$lang['... or '] = '... ili ';
+$lang['Add tags'] = 'Dodaj oznake';
+$lang['All extensions are up to date.'] = 'Svi dodaci su "up-to-date".';
+$lang['All languages are up to date.'] = 'Svi jezici su "up-to-date".';
+$lang['All plugins are up to date.'] = 'Svi plugin-ovi su "up-to-date".';
+$lang['All themes are up to date.'] = 'Sve teme su "up-to-date".';
+$lang['Allowed file types: %s.'] = 'Dozvoljeni tipovi datoteka: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Približna maksimalna rezolucija: %dM px (to je %dx%d px).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Prema zadanim vrijednostima, Piwino će kreirati nove veličine od vaših originalnih verzija fotografija..';
+$lang['Confirm merge'] = 'Potvrdi spajanje';
+$lang['Create'] = 'Kreiraj';
+$lang['Crop'] = 'Izreži';
+$lang['display'] = 'prikaz';
+
+?>
Index: tags/2.4.0RC3/language/hr_HR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/common.lang.php	(revision 14585)
@@ -0,0 +1,366 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Hrvatski [HR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=422
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Hrvatski';
+$lang_info['country'] = 'Hrvatska';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'hr';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d skupina obnovljena';
+$lang['%d albums updated'] = '%d skupine obnovljene';
+$lang['%d comment to validate'] = '%d komentar za ovjeru';
+$lang['%d comments to validate'] = '%d komentari za ovjeru';
+$lang['%d new comment'] = '%d novi komentar';
+$lang['%d new comments'] = '%d novi komentari';
+$lang['%d comment'] = '%d komentar';
+$lang['%d comments'] = '%d komentari';
+$lang['%d hit'] = '%d posjet';
+$lang['%d hits'] = '%d posjeta';
+$lang['%d new photo'] = '%d nova slika';
+$lang['%d new photos'] = '%d nove slike';
+$lang['%d new user'] = '%d novi korisnik';
+$lang['%d new users'] = '%d novi korisnici';
+$lang['About'] = 'O...';
+$lang['All tags'] = 'Svi tagovi';
+$lang['Any tag'] = 'Bilo koji tag';
+$lang['At least one listed rule must be satisfied.'] = 'Najmanje jedno od navedenih pravila mora biti zadovoljeno.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Skupine';
+$lang['Album'] = 'Skupina';
+$lang['Close this window'] = 'Zatvori prozor';
+$lang['Complete RSS feed (photos, comments)'] = 'Potpuni RSS izvori (slike, komentari)';
+$lang['Confirm Password'] = 'Potvrdi Zaporku';
+$lang['Connection settings'] = 'Postavke povezivanja';
+$lang['Login'] = 'Prijava';
+$lang['Contact webmaster'] = 'Pišite webmaster-u';
+$lang['Create a new account'] = 'Izradi novi račun';
+$lang['Created on'] = 'Izrađen na';
+$lang['Creation date'] = 'Nadnevak izrade';
+$lang['Current password is wrong'] = 'Trenutna zaporka je neispravna';
+$lang['Dimensions'] = 'Veličine';
+$lang['Display'] = 'Prikaz';
+$lang['Each listed rule must be satisfied.'] = 'Svako navedeno pravilo mora biti zadovoljeno.';
+$lang['Email address is missing. Please specify an email address.'] = 'Nedostaje E-mail adresa';
+$lang['Email address'] = 'E-mail adresa';
+$lang['Enter your personnal informations'] = 'Upišite svoje osobne podatke';
+$lang['Error sending email'] = 'Greška prilikom slanja e-mail poruke';
+$lang['File name'] = 'Naziv zapisa';
+$lang['File'] = 'Zapis';
+$lang['Filesize'] = 'Veličina zapisa';
+$lang['Filter and display'] = 'Filter i prikaz';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Zaboravili ste zaporku?';
+$lang['Go through the gallery as a visitor'] = 'Pregledajte galeriju kao posjetitelj';
+$lang['Help'] = 'Pomoć';
+$lang['Identification'] = 'Prijavnica';
+$lang['Photos only RSS feed'] = 'RSS izvor samo za slike';
+$lang['Keyword'] = 'Ključna riječ';
+$lang['Links'] = 'Poveznice';
+$lang['N/A'] = 'N/D';
+$lang['New on %s'] = 'Novi na on %s';
+$lang['Notification'] = 'Obavijest';
+$lang['Number of items'] = 'Broj stavki';
+$lang['Original dimensions'] = 'Izvorne veličine';
+$lang['Password forgotten'] = 'Zaboravljena zaporka';
+$lang['Password'] = 'Zaporka';
+$lang['Post date'] = 'Nadnevak objave';
+$lang['Posted on'] = 'Objavljeno u';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Brza veza';
+$lang['RSS feed'] = 'RSS izvor';
+$lang['Register'] = 'Upišite se';
+$lang['Registration'] = 'Upis';
+$lang['Related tags'] = 'Odnosni tagovi';
+$lang['Reset'] = 'Poništi';
+$lang['Retrieve password'] = 'Dohvati zaporku';
+$lang['Search rules'] = 'Pravila pretrage';
+$lang['Search tags'] = 'Tagovi pretrage';
+$lang['Search'] = 'Pretraživanje';
+$lang['display available tags'] = 'Pogledaj dostupne tagove';
+$lang['Since'] = 'Od';
+$lang['Sort by'] = 'Složeno po';
+$lang['Sort order'] = 'Redoslijed slaganja';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tagovi';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS obavijesni izvor omogućava obavještavanje o novostima sa ovog web mjesta : nove slike, obnovljene skupine, nove komentare. Koristite čitač RSS izvora.';
+$lang['Unknown feed identifier'] = 'Nepoznata oznaka izvora';
+$lang['User comments'] = 'Korisnički komentari';
+$lang['Username'] = 'Korisničko ime';
+$lang['Visits'] = 'Posjeta';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Tjedan %d';
+$lang['About Piwigo'] = 'O Piwigo-u';
+$lang['You are not authorized to access the requested page'] = 'Niste ovlašteni za pristup zatraženoj stranici';
+$lang['add this photo to your favorites'] = 'dodaj ovu sliku u omiljene';
+$lang['Administration'] = 'Uprava';
+$lang['all'] = 'sve';
+$lang['ascending'] = 'uzlazno';
+$lang['author(s) : %s'] = 'autor(i) : %s';
+$lang['Expand all albums'] = 'Proširi sve skupine';
+$lang['posted after %s (%s)'] = 'objavljeno nakon %s (%s)';
+$lang['posted before %s (%s)'] = 'objavljeno prije %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'objavljeno između %s (%s) i %s (%s)';
+$lang['posted on %s'] = 'objavljeno na %s';
+$lang['Best rated'] = 'Najbolje ocijenjeno';
+$lang['display best rated photos'] = 'prikaz najbolje ocijenjenih stavki';
+$lang['Calendar'] = 'Kalendar';
+$lang['All'] = 'Sve';
+$lang['display each day with photos, month per month'] = 'prikaz svakog dana sa slikama, mjesec po mjesec';
+$lang['View'] = 'Pogledaj';
+$lang['chronology_monthly_calendar'] = 'Mjesečni kalendar';
+$lang['chronology_monthly_list'] = 'Mjesečni popis';
+$lang['chronology_weekly_list'] = 'Tjedni popis';
+$lang['Click here if your browser does not automatically forward you'] = 'Kliknite ovdje ako niste samostalno prebačeni';
+$lang['comment date'] = 'nadnevak komentara';
+$lang['Comment'] = 'Komentar';
+$lang['Your comment has been registered'] = 'Vaš je komentar upisan';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sustav : molimo sačekajte malo prije objave novog komentara';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Vaš komentar NIJE upisan jer nije prošao pravila ovjere';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Upravnik mora odobriti vaš komentar prije objave.';
+$lang['This login is already used by another user'] = 'Ovo korisničko ime se već koristi';
+$lang['Comments'] = 'Komentari';
+$lang['Add a comment'] = 'Dodaj komentar';
+$lang['created after %s (%s)'] = 'izrađen nakon %s (%s)';
+$lang['created before %s (%s)'] = 'izrađen prije %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'izrađen između %s (%s) i %s (%s)';
+$lang['created on %s'] = 'izrađen na %s';
+$lang['Customize'] = 'Prilagodi';
+$lang['Your Gallery Customization'] = 'Prilagodba Vaše Galerije ';
+$lang['day'][0] = 'Nedjelja';
+$lang['day'][1] = 'Ponedjeljak';
+$lang['day'][2] = 'Utorak';
+$lang['day'][3] = 'Srijeda';
+$lang['day'][4] = 'Četvrtak';
+$lang['day'][5] = 'Petak';
+$lang['day'][6] = 'Subota';
+$lang['Default'] = 'Pretpostavljeno';
+$lang['delete this photo from your favorites'] = 'uklonite ovu sliku iz omiljenih';
+$lang['Delete'] = 'Ukloni';
+$lang['descending'] = 'silazno';
+$lang['Download'] = 'Preuzmi';
+$lang['Download this file'] = 'preuzmi ovaj zapis';
+$lang['edit'] = 'uredi';
+$lang['wrong date'] = 'krivi nadnevak';
+$lang['excluded'] = 'isključeno';
+$lang['Your favorites'] = 'Moji omiljeni';
+$lang['display your favorites photos'] = 'prikaz mojih omiljenih slika';
+$lang['Favorites'] = 'Omiljeni';
+$lang['First'] = 'Prvi';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerija je zaključana zbog održavanja. Molimo, navratite kasnije.';
+$lang['Page generated in'] = 'Stranica izrađena u ';
+$lang['guest'] = 'gost';
+$lang['Hello'] = 'Pozdrav';
+$lang['available for administrators only'] = 'dostupno samo upraviteljima';
+$lang['display this album'] = 'prikazuje slike u korijenu skupine';
+$lang['display last user comments'] = 'Pregled zadnjih korisničkih komentara';
+$lang['customize the appareance of the gallery'] = 'prilagodite izgled vaše galerije';
+$lang['search'] = 'pretraži';
+$lang['Home'] = 'Naslovnica';
+$lang['in this album'] = 'u ovoj skupini';
+$lang['in %d sub-album'] = 'u %d podskupini';
+$lang['in %d sub-albums'] = 'u %d podskupinama';
+$lang['included'] = 'uključeno';
+$lang['Invalid password!'] = 'Nevaljana zaporka!';
+$lang['Language']='Jezik';
+$lang['last %d days'] = 'zadnjih %d dana';
+$lang['Last'] = 'Zadnji';
+$lang['Logout'] = 'Odjava';
+$lang['obligatory'] = 'obvezno';
+$lang['Maximum photo height'] = 'Najveća dozvoljena visina slika';
+$lang['Maximum height must be a number superior to 50'] = 'Najveća visina mora biti broj veći od 50';
+$lang['Maximum photo width'] = 'Najveća dozvoljena širina slika';
+$lang['Maximum width must be a number superior to 50'] = 'Najveća širina mora biti broj veći od 50';
+$lang['display a calendar by creation date'] = 'prikaz kalendara po nadnevku izrade';
+$lang['display all photos in all sub-albums'] = 'prikaz svih stavki u svim podskupinama';
+$lang['return to normal view mode'] = 'povratak u uobičajeni način pregleda';
+$lang['display a calendar by posted date'] = 'prikaz kalendara po nadnevku objave';
+$lang['month'][10] = 'Listopad';
+$lang['month'][11] = 'Studeni';
+$lang['month'][12] = 'Prosinac';
+$lang['month'][1] = 'Siječanj';
+$lang['month'][2] = 'Veljača';
+$lang['month'][3] = 'Ožujak';
+$lang['month'][4] = 'Travanj';
+$lang['month'][5] = 'Svibanj';
+$lang['month'][6] = 'Lipanj';
+$lang['month'][7] = 'Srpanj';
+$lang['month'][8] = 'Kolovoz';
+$lang['month'][9] = 'Rujan';
+$lang['Most visited'] = 'Najposjećenije';
+$lang['display most visited photos'] = 'prikaz najposjećenijih slika';
+$lang['The number of photos per page must be a not null scalar'] = 'broj slika po stranici mora biti cjelobrojna vrijednost';
+$lang['Number of photos per page'] = 'Broj slika po stranici';
+$lang['Unknown identifier'] = 'Nepoznata oznaka';
+$lang['New password'] = 'Nova zaporka';
+$lang['Rate this photo'] = 'Ocjeni ovu sliku';
+$lang['Next'] = 'Slijedeći';
+$lang['no rate'] = 'bez ocjene';
+$lang['Photos posted within the last %d day.'] = 'Stavke objavljene u zadnjem %d danu.';
+$lang['Photos posted within the last %d days.'] = 'Stavke objavljene između zadnjih %d dana.';
+$lang['password updated'] = 'zaporka obnovljena';
+$lang['Recent period must be a positive integer value'] = 'Nedavno razdoblje mora biti pozitivna cjelobrojna vrijednost';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'slika';
+$lang['Click on the photo to see it in high definition'] = 'Klikni na sliku za pregled u visokoj razlučljivosti';
+$lang['Show file metadata'] = 'Prikaži meta podatke zapisa';
+$lang['Powered by'] = 'Osnaženo sa';
+$lang['Preferences'] = 'Postavke';
+$lang['Previous'] = 'Prethodni';
+$lang['Random photos'] = 'Slike slučajnog odabira';
+$lang['display a set of random photos'] = 'prikaz slika slučajnim odabirom';
+$lang['Recent albums'] = 'Nedavne skupine';
+$lang['display recently updated albums'] = 'prikaz nedavno obnovljenih skupina';
+$lang['Recent period'] = 'Nedavno razdoblje';
+$lang['Recent photos'] = 'Nedavne slike';
+$lang['display most recent photos'] = 'prikaz najnovijih slika';
+$lang['Redirection...'] = 'Preusmjeravanje...';
+$lang['Please, enter a login'] = 'Molimo, prijavite se';
+$lang['login mustn\'t end with a space character'] = 'prijava ne smije završavati razmakom';
+$lang['login mustn\'t start with a space character'] = 'prijava ne smije počinjati razmakom';
+$lang['this login is already used'] = 'ovo korisničko ime se već koristi';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti oblika xxx@yyy.eee (npr : pasko@stranica.org)';
+$lang['please enter your password again'] = 'molimo unesite zaporku ponovo';
+$lang['Auto login'] = 'Samoprijava';
+$lang['remove this tag from the list'] = 'ukloni  ovaj tag iz popisa';
+$lang['representative'] = 'predstavnik';
+$lang['Search for Author'] = 'Pretraživanje po Autoru';
+$lang['Search in albums'] = 'Pretraživanje u Skupinama';
+$lang['Search by date'] = 'Pretraživanje po Nadnevku';
+$lang['Date'] = 'Nadnevak';
+$lang['End-Date'] = 'Krajnji Nadnevak';
+$lang['Kind of date'] = 'Vrsta nadnevka';
+$lang['Search for words'] = 'Pretraživanje po riječima';
+$lang['Search for all terms'] = 'Pretraživanje po svim uvjetima ';
+$lang['Search for any term'] = 'Pretraživanje po bilo kojem uvjetu';
+$lang['Empty query. No criteria has been entered.'] = 'Prazni upit. Nije uneseno ni jedno obilježje.';
+$lang['Search results'] = 'Ishodi pretraživanja';
+$lang['Search in sub-albums'] = 'Pretraga u podskupinama';
+$lang['searched words : %s'] = 'tražene riječi : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'postavi za predstavnika skupine';
+$lang['Show number of comments'] = 'Prikaži broj komentara';
+$lang['Show number of hits'] = 'Prikaži broj posjeta';
+$lang['slideshow'] = 'klizni prikaz';
+$lang['stop the slideshow'] = 'zaustavi klizni prikaz';
+$lang['Specials'] = 'Posebnosti';
+$lang['SQL queries in'] = 'SQL upita u ';
+$lang['display only recently posted photos'] = 'prikaz samo nedavno objavljenih slika';
+$lang['return to the display of all photos'] = 'povratak u prikaz svih slika';
+$lang['the beginning'] = 'početak';
+$lang['Interface theme'] = 'tema sučelja';
+$lang['Thumbnails'] = 'Povezne sličice';
+$lang['Menu'] = 'Izbornik';
+$lang['A comment on your site'] = 'Komentar na vašem web mjestu';
+$lang['today'] = 'danas';
+$lang['Update your rating'] = 'Obnovite svoju ocjenu';
+$lang['the username must be given'] = 'mora se upisati korisničko ime';
+$lang['useful when password forgotten'] = 'korisno kada se zaboravi zaporka';
+$lang['Quick search'] = 'Brzo pretraživanje';
+$lang['Connected user: %s'] = 'Spojeni korisnik: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Preglednik: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Komentar: %s';
+$lang['Comment by %s'] = 'Komentirao-la %s';
+$lang['User: %s'] = 'Korisnik: %s';
+$lang['Email: %s'] = 'E-mail: %s';
+$lang['Admin: %s'] = 'Upravitelj: %s';
+$lang['Registration of %s'] = 'Upis od %s';
+$lang['Album: %s'] = 'Skupina: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Loš status za korisnika "guest", koristi se pretpostavljeni status. Molimo obavjestite webmaster-a.';
+$lang['this email address is already in use'] = 'korisnik već koristi ovu e-mail adresu';
+$lang['Album results for'] = 'Ishodi skupine za ';
+$lang['Tag results for'] = 'Ishodi tagova za';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Pokreni klizni prikaz';
+$lang['Pause of slideshow'] = 'Zaustavi klizni prikaz';
+$lang['Repeat the slideshow'] = 'Ponovi klizni prikaz';
+$lang['Not repeat the slideshow'] = 'Ne ponavljaj klizni prikaz';
+$lang['Reduce diaporama speed'] = 'Smanji brzinu diaporama-e';
+$lang['Accelerate diaporama speed'] = 'Povećaj brzinu diaporama-e';
+$lang['Submit'] = 'Pošalji';
+$lang['Yes'] = 'Da';
+$lang['No'] = 'Ne';
+$lang['%d photo']='%d slika';
+$lang['%d photos']='%d slike';
+$lang['%d photo is also linked to current tags'] = '%d slika također povezana sa trenutnim tagovima';
+$lang['%d photos are also linked to current tags'] = '%d slike također povezana sa trenutnim tagovima';
+$lang['display photos linked to this tag'] = 'Pregledaj slike povezane samo sa ovim tag-om';
+$lang['photos posted during the last %d days'] = 'slike objavljene tijekon zadnjih %d dana';
+$lang['Piwigo Help'] = 'Piwigo Pomoć';
+$lang['Rank'] = 'Redoslijed';
+$lang['group by letters'] = 'složeno po slovima';
+$lang['letters'] = 'slova';
+$lang['show tag cloud'] = 'prikaži tag oblak';
+$lang['cloud'] = 'oblak';
+$lang['Are you sure?'] = 'Sigurni ste?';
+$lang['Reset to default values'] = 'Povratak na pretpostavljene vrijednosti';
+$lang['delete all photos from your favorites'] = 'izbriši sve slike iz omiljenih';
+$lang['Sent by'] = 'Poslano od';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Kolačići su onemogućeni ili nisu podržani od vašeg preglednika. Morate ih omogućiti za prijavu.';
+$lang['Edit a comment'] = 'Uredi komentar';
+$lang['(!) This comment requires validation'] = '(!) Ovaj komentar zahtijeva ovjeru';
+$lang['Welcome'] = 'Dobrodošli';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Dobrodošli u vašu Piwigo galeriju slika!';
+$lang['... or browse your empty gallery'] = '... ili pregledajte praznu galeriju';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ili možete isključiti ovu poruku, nekako ću se snaći sam';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Zdravo %s, vaša Piwigo galerija je prazna!';
+$lang['I want to add photos'] = 'Želim dodati slike';
+$lang['Manage this user comment: %s'] = 'Upravljanje ovim korisničkim komentarom: %s';
+$lang['This author modified following comment:'] = 'Ovaj autor je promijenio slijedeći komentar:';
+$lang['This author removed the comment with id %d'] = 'Ovaj autor je uklonio komentar sa id %d';
+$lang['html tags are not allowed in login'] = 'u korisničkim podacima nisu dozvoljene html oznake';
+$lang['%d rates'] = '%d ocjena';
+$lang['Rating score'] = 'Rezultat ocjenjivanja';
+$lang['Invalid username or email'] = 'Korisničko ime ili email nisu valjani';
+$lang['Password reset is not allowed for this user'] = 'Ovom korisniku nije dozvoljeno ponovno postavljanje lozinke';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Korisnik "%s" nema email adresu, ponovno postavljanje lozinke nije moguće';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Netko je zatražio ponovno postavljanje zaboravljene lozinke za korisnički račun:';
+$lang['Username "%s" on gallery %s'] = 'Korisničko ime "%s" na galeriji %s';
+$lang['To reset your password, visit the following address:'] = 'Za izmjenu zaboravljene lozinke posjetite:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ukoliko ste greškom dobili ovu poruku slobodno je zanemarite i ništa se neće desiti.';
+$lang['Password Reset'] = 'Zaboravili ste lozinku?';
+$lang['Check your email for the confirmation link'] = 'Provjerite svoj email, naći ćete link za potvrdu.';
+$lang['Invalid key'] = 'Ključ nije valjan';
+$lang['The passwords do not match'] = 'Lozinke se ne podudaraju';
+$lang['Your password has been reset'] = 'Lozinka vam je izmijenjena';
+$lang['Return to home page'] = 'Povratak na početnu stranicu';
+$lang['Please enter your username or email address.'] = 'Molimo vas da unesete vaše korisničko ime ili email adresu.';
+$lang['You will receive a link to create a new password via email.'] = 'Link za izmjenu lozinke poslan vam je u email poruci.';
+$lang['Username or email'] = 'Korisničko ime ili lozinka';
+$lang['Change my password'] = 'Promjena lozinke';
+$lang['Enter your new password below.'] = 'Unesite vašu novu lozinku.';
+$lang['EXIF Metadata'] = 'EXIF metapodaci';
+$lang['IPTC Metadata'] = 'IPTC metapodaci';
+$lang['Edit'] = 'Uredi';
+
+?>
Index: tags/2.4.0RC3/language/hr_HR/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,121 @@
+<h2>Uredi skupinu</h2>
+
+<h3>Obavijesti</h3>
+
+<ul>
+
+  <li><strong>naziv</strong>: preimenuj skupinu (nestvarno preimenovanje u slučaju stvarne skupine).</li>
+
+  <li><strong>opis</strong>: prikažite uopćeni opis sadržaja, ovaj tekst će se prikazati ispod stranice poveznih sličica.</li>
+
+</ul>
+
+<h3>Premjesti</h3>
+
+<p>Ako je skupina nestvarna, možete je premjestiti. Premještanje skupine znači promjenu njene nadređene skupine.</p>
+
+<h3>Mogućnosti</h3>
+
+<ul>
+
+  <li><strong>Vrsta pristupa</strong>: Upravljanje dozvolama. Ako postavite skupinu kao osobnu, sve njoj podređene skupine postaju osobne. Ako postavite
+  skupinu kao javnu, sve njoj nadređene skupine postaju javne.</li>
+
+  <li><strong>Zaključavanje</strong>: Skupina i njene podskupine postaju nedostupne zbog poslova održavanja.</li>
+
+  <li><strong>Komentari</strong>: Dozvoli korisnicima da mogu komentirati stavke ove skupine.</li>
+
+  <li><strong>Dozvoli prebacivanje</strong>: Dozvoli korisnicima da mogu prebacivati zapise na poslužitelj. Ova mogućnost je dostupna samo za stvarne skupine (ne i za nestvarne skupine).</li>
+
+</ul>
+
+<p>Ovim mogućnostima možete upravljati i preko "Svojstva" upravnog prozora
+ (prozori <span class="pwgScreen">Prebaci</span>, <span
+class="pwgScreen">Komentari</span>, <span class="pwgScreen">Zaključaj</span>,
+<span class="pwgScreen">Javno/Osobno</span>, <span
+class="pwgScreen">Predstavnik</span> dostupnih preko <span
+class="pwgScreen">Uprava, Skupine, Svojstva</span>).</p>
+
+<h3>Redoslijed slaganja</h3>
+
+<p>Odaberite ako će se koristiti pretpostavljeni redoslijed slaganja.</p>
+
+<p>Označite ako će se taj redoslijed primjeniti i na podskupine.</p>
+
+<p>Odaberite posebno slaganje po stupcima za korištenje kod ove skupine.</p>
+<ul>
+<li><strong>Nadnevak izrade</strong>: Nadnevak stvaranja slike</li>
+<li><strong>Nadnevak postavljanja</strong>: Nadnevak usklađivanja</li>
+<li><strong>Prosječna ocjena (*)</strong>: Prosječna ocjena se može mijenjati od strane posjetitelja</li>
+<li><strong>Najposjećenije (*)</strong>: Trenutna posjeta mijenja redoslijed najposjećenijih</li>
+<li><strong>Naziv zapisa</strong>: Dano ime u obavijesnim poljima</li>
+<li><strong>Id</strong>: Unutarnja Id oznaka (novije skupine imaju veći id nego starije.</li>
+
+</ul>
+<p><strong>(*)</strong>Budite oprezni i prethodno isprobajte jer možete dobiti neočekivane ishode.</p>
+
+
+<h3>Predstavnik</h3>
+
+<p>Predstavnik skupine je povezna sličica postavljena da predstavlja
+skupinu na glavnoj stranici (<span class="pwgScreen">category.php</span>) kada skupina
+sadrži samo podskupine (kao korijenska skupina).</p>
+
+<p>Postoje 4 načina za postavljanje slike predstavnika skupine :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Stranica Slika</span>: dugmad na traci postupaka,
+  jedan od njih omogućava postavljanje prikazane slike kao predstavnika skupine. ovo dugme je dostupno samo upravnicima.</li>
+
+  <li><span class="pwgScreen">Izmjena podataka o slici</span> u upravnom dijelu. Ovaj prozor dostupan preko <span
+  class="pwgScreen">picture.php</span> ili <span class="pwgScreen">Slijedna obrada </span> u <em>pojedinačnom načinu</em>. Pogledajte sustav pomoći u ovom prozoru za pojedinosti.</li>
+
+  <li><span class="pwgScreen">Uprava, Skupine, Svojstva, Predstavnik</span>. Pogledajte sustav pomoći u ovom prozoru za pojedinosti.</li>
+
+  <li><span class="pwgScreen">Uredi skupinu</span> (ovaj prozor).</li>
+
+</ul>
+
+<p>Predstavljanje ovisi o postavkama stavke <code>allow_random_representative</code> (vidi <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>U pretpostavljenom načinu (<code>allow_random_representative</code> postavljen na false)
+svaka skupina koja sadrži najmanje jednu stavku je predstavljena određenim predstavnikom. Jednom postavljen (pri stvaranju skupine), predstavnik se mijenja jedino 
+kada upravnik to zatraži. Ako predstavnik nije odgovarajući možete zatražiti <strong>Odabir novog predstavnika slučajnim pristupom</strong>.</p>
+
+<p>Ako je postavka <code>allow_random_representative</code> postavljena na true, skupina koja ima sadržaj ne može imati prepostavljenog prestavnika. 
+Jednostavno upotrijebite <strong>Izbriši predstavnika</strong> dugme.</p>
+
+<p>Ako skupina nema stavki (nego samo podskupine) može biti predstavljena bilo kojom 
+stavkom podskupina zahvaljujući prozoru  <span class="pwgScreen">Promijeni podatke o slici</span>. Jedina mogućnost na trenutnom prozou je 
+ <strong>Izbriši predstavnika</strong> dugme, a nakon birisanja, odabir predstavnika nije više dostupan.</p>
+
+<h3>Poveži sve stavke skupine u novu skupinu</h3>
+
+<ul>
+
+<li><strong>Naziv nestvarne skupine</strong>: Novi naziv skupine će se odrediti, 
+sve slike trenutne skupine će se povezati sa novonastalom.</li>
+
+<li><strong>Nadređena skupina</strong>: Gdje će se nova skupina nalaziti, ostavi prazno za postavu iz polazišta.</li>
+
+</ul>
+
+<h3>Poveži sve stavke skupine sa nekim postojećim skupinama</h3>
+
+<ul>
+
+<li><strong>Skupine</strong>: Odaberite odredišnu skupinu.</li>
+
+</ul>
+
+<h3>Pošalji e-mail obavijest članovima grupe</h3>
+
+<ul>
+
+<li><strong>Grupa</strong>: adrese grupe</li>
+
+<li><strong>Sadržaj e-mail poruke</strong>: sadržaj po volji koji će se poslati.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/hr_HR/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Premještanje nestvarnih skupina</h2>
+
+<p>Samo nestvarne skupine mogu imati novu nadređenu skupinu.</p>
+
+<h3>Nestvarne skupine za premještaj</h3>
+
+<p>Odaberite bilo koje nestvarne skupine koje želite premjestiti. 
+Ako je popis prazan, to znači da niste izradili ni jednu.</p>
+
+<h3>Nova nadređena skupina</h3>
+
+<p>Odaberite novu nadređenu skupinu (nestvarnu ili stvarnu). 
+Ukoliko ne odaberete, odabrane nestvarne skupine će se prebaciti u korijensku mapu.
+Ne možete premještati skupinu u  nju samu ili njoj podređenu skupinu.</p>
Index: tags/2.4.0RC3/language/hr_HR/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/cat_options.html	(revision 14585)
@@ -0,0 +1,31 @@
+<h2>Mogućnosti skupine</h2>
+
+<p>Ovaj prozor omogućava upravniku upravljanje mogućnostima skupina za više njih odjednom.</p>
+
+<dl>
+
+  <dt>Prebačaj</dt>
+  <dd>Postavi skupine otvorene za prebačaj slika posjetiteljima galerije. Prikazane su samo stvarne i mjesne skupine.</dd>
+
+  <dt>Komentari</dt>
+  <dd>Ovlasti korisnicima za dodavanje komentara u odabranim skupinama.
+Odabire skupine koje su otvorene za komentare. 
+Slika se može komentirati ako pripada najmanje jednoj skupini sa odobrenim komentiranjem.</dd>
+
+  <dt>Zaključaj</dt>
+  <dd>Odabrane skupine će privremeno biti nedostupne zbog održavanja. Ako
+  zaključate skupinu, sve njoj podređene skupine se također zaključavaju. Ako otključavate
+  skupinu, sve njoj nadređene skupine se također otključavaju.</dd>
+
+  <dt>Javno / osobno</dt>
+  <dd>Upravljanje ovlastima za odabrane skupine. Ako su odabrane skupine osobne
+   : trebate ovlastiti korisnike i/ili grupe za pristup. Ako postavite skupinu za osobnu, sve njoj nadređene skupine postaju osobne
+ . Ako postavite skupinu kao javnu, sve njene podređene skupine postaju javne.</dd>
+
+  <dt>Prestavnik</dt>
+  <dd>Ovom mogučnošću se može upravljati samo ako je postavljena stavka
+  <code>allow_random_representative</code> (vidi <span
+  class="filename">include/config_defaults.inc.php</span>) na 
+  <em>true</em>. Svaka skupina se može predstaviti slikom slučajnog odabira ili baš određenom slikom.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hr_HR/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Upravljanje dozvolama (ovlastima) za skupinu</h2>
+
+<p>Ovaj prozor je dostupan samo za osobne skupine. Ovdje možete odabrati korisnike
+i grupe koji imaju dozvolu pristupa.</p>
+
+<h3>Grupe</h3>
+
+<p>Možete dati ili uskratiti dozvole grupama za trenutnu skupinu. Promjenom 
+grupnih ovlasti vjerojatno će te promijeniti popis odobrenih korisnika zahvaljujući grupnoj pripadnosti.</p>
+
+<h3>Korisnici</h3>
+
+<p>Možete dati ili uskratiti dozvole pojedinim korisnicima. Korisnici dozvoljeni grupnom pripadnošću mogu biti posebno
+odobreni ili zabranjeni.</p>
Index: tags/2.4.0RC3/language/hr_HR/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/configuration.html	(revision 14585)
@@ -0,0 +1,111 @@
+<h2>Podešavanje</h2>
+
+<p>Ovaj prozor omogućava upravniku obavljanje osnovnih podešavanja. Zaista, ovaj
+prozor prikazuje samo najosnovnije postavke podešavanja koje bi trebale biti dovoljne za
+veliku većinu upravnika. Ako želite proučiti ostale brojne (i napredne) 
+postavke podešavanja, pregledajte zapis <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Ovaj prozor je podijeljen u nekoliko odjeljaka, tematski preslaguje postavke podešavanja.</p>
+
+
+<h3>Glavo</h3>
+<ul>
+  <li><strong>Naslov galerije</strong>: koristi se za RSS izvore i e-mail obavijesti.</li>
+
+  <li><strong>Baner stranice</strong>: prikazan na svakoj javnoj stranici.</li>
+
+  <li><strong>URL galerije</strong>: koristi se za RSS izvore.</li>
+
+  <li><strong>Zaključavanje galerije</strong>: Zaključavanje cjelokupne galerije zbog poslova održavanja. Jedino upravni korisnici mogu pristupiti galeriji.</li>
+
+  <li><strong>Ocjene</strong>: POcjenjivanje slika je omogućeno.</li>
+
+  <li><strong>Ocjenjivanje od gostiju</strong>: Čak i nepoznati posjetitelji mogu ocjenjivati slike.</li>
+
+  <li><strong>Dozvoli upis korisnika</strong>: Upis je odobren za sve.</li>
+
+  <li><strong>E-mail adresa je obvezna za sve korisnike</strong>: E-mail adresa će se provjeravati pri upisu ili izmjeni profila osim ako se postupak vrši preko upravnog dijela.</li>
+
+  <li><strong>E-mail poruka upravniku pri upisu novog korisnika</strong>: Upravnik će dobiti obavijesnu e-mail poruku pri svakom novom upisu.</li>
+
+</ul>
+
+<h3>Povijest</h3>
+
+  <p>Posjete stranicama <span
+  class="pwgScreen">category.php</span> i <span
+  class="pwgScreen">picture.php</span> će biti pohranjene u
+  <code>povijest</code> tabeli.</p>
+  
+  <p>Posjete će biti vidljive u <span
+  class="pwgScreen">Uprava, Posebnosti, Povijest</span>.</p>
+
+<ul>
+  <li><strong>Pohrani posjete stranicama po gostima</strong>: posjete stranicama se vode po gostima.</li>
+
+  <li><strong>Pohrani posjete stranicama po korisnicima</strong>: posjete stranicama se vode po korisnicima.</li>
+
+  <li><strong>Pohrani posjete stranicama po upravnicima</strong>: posjete stranicama se vode po upravnicima.</li>
+
+</ul>
+
+<h3>Komentari</h3>
+<ul>
+
+  <li><strong>Komentari za sve</strong>: Čak i obični posjetitelji mogu pisati komentare.</li>
+
+  <li><strong>Broj komentara po stranici</strong>.</li>
+
+  <li><strong>Ovjera</strong>: upravnik ovjerava komentare posjetitelja prije javne objave. Ovjera korisničkih kometara 
+  se vrši u <span class="pwgScreen">Uprava, Slike, Komentari</span>.</li>
+
+  <li><strong>Pošalji e-mail obavijest po upisu kometara</strong>:
+Šalje e-mail obavijesnu poruku upravnicima kada korisnici upišu komentare koji su već ovjereni.</li>
+
+  <li><strong>Pošalji e-mail obavijest kada komentar treba ovjeru</strong>:
+Šalje e-mail obavijesnu poruku upravnicima kada korisnici upišu komentare koji trebaju biti ovjereni.
+Ovjeri korisničkih komentara se pristupa preko <span class="pwgScreen">Uprava, Slike, Komentari</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>Prebacivanje</h3>
+<ul>
+<!--TODO -->  <li><strong>Prikaži poveznicu prebacivanja svaki put</strong>: Ako postoje skupine za prebacivanje, poveznica DODAJ će biti prikazana za svaku skupinu.</li>
+<!--TODO -->  <li><strong>Korisnička razina pristupa za prebacivanje</strong>: Omogućava ograničavanje prebacivanja od korisnika</li>
+  <li><strong>E-mail poruka upraviteljima po prebacivanju zapisa</strong>: Upravitelji će dobiti e-mail poruku za svaku prebačenu korisničku sliku.</li>
+</ul>
+
+<h3>Pretpostavljeni prikaz</h3>
+
+<p>Ovdje možete mijenjati postavke prikaza korištene kao zadane, kada gost nije prijavljen. Jednom kada se prijavi, ove mogućnosti će biti promijenjene korisnički izabranima (izmjenjivo u <span class="pwgScreen">profili</span>).</p>
+
+<p>Moguće je promijeniti mogućnosti prikaza za sve korisnike, ali preko prozora is <span class="pwgScreen">Uprava, Prijavnica, Korisnici</span>, gdje prikaz možete odrediti za odabrani popis korisnika.</p>
+
+<ul>
+
+  <li><strong>Jezik</strong>: zahvaća samo sučelje Piwigo galerije. Nazivi skupina, slika i svi opisi nisu obuhvaćeno prijevodom.</li>
+
+  <li><strong>Broj slika po redu</strong></li>
+
+  <li><strong>Broj redova po stranici</strong></li>
+
+  <li><strong>Tema sučelja</strong></li>
+
+  <li><strong>Nedavno razdoblje</strong>: Po danima. Razdoblje u kojem se prikazana slika smatra novom. Mora biti veće od 1 dan.</li>
+
+  <li><strong>Razgranaj sve skupine</strong>: Pretpostavljeno razgranati sve skupine u 
+  izbornik? <em>Pozor</em>: ova mogućnost može opteretiti računalo poslužitelj i stvoriti ogromni izbornik ako vaše sustav sadrži mnogo skupina.</li>
+
+  <li><strong>Prikaži broj komentara</strong>: prikazuje broj komentara za svaku sliku na stranici poveznih sličica. Zahtjevno za poslužitelja.</li>
+
+  <li><strong>Prikaži broj posjeta</strong>: prikaži broj posjeta slici pravo ispod povezne sličice na stranici. 
+  Samo kada je napredna postavka : <br />  $conf['show_nb_hits'] = true; <br />
+  Obavijest: pretpostavljeno je false .</li>
+
+  <li><strong>Najveća širina slika</strong>: najveća dozvoljena širina. Ako je slika veča od ove postavke, biti će prilagođena pri prikazu. Ukoliko razmišljate o određivanju ove vrijednosti, možda bi bilo
+  bolje prilagoditi širinu vaših slika pri izradi umjesto ovog.</li>
+
+  <li><strong>Najveća visina slika</strong>: iste primjedbe kao ikod prethodne stavke.</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/hr_HR/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,100 @@
+<h2>Extend for templates configuration</h2>
+
+<h3>Goal</h3>
+<p>Define replacement conditions for each template from template-extension
+(template called "replacer").</p>
+
+<p>"original template" from ./template/yoga (or any other than yoga)
+ will be replaced by a "replacer" if the replacer is linked to this "original template"
+ (and optionally, when the requested URL contains an "optional URL keyword").</p>
+
+<p>"Optional URL keywords" are those you can find after the module name in URLs.</p>
+
+<p>Therefore "Optional URL keywords" can be an active "permalink" 
+(see permalinks in our documentation for further explanation).</p>
+
+<p>Read: `<a href="#warnings">Warning</a>` usage conditions.</p>
+
+<h3>What are template extensions?</h3>
+
+<p>This configuration tool is powerfull for beginners and advanced users.
+By FTP, in the template-extension folder, the Webmaster can duplicate a lot of
+ the distributed .tpl files ("original template") with a different name 
+ ("replacer").
+ 
+ "Original templates", current original supported templates are:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Where can I find "original templates"?</h3>
+
+<p>Distributed original templates are in template/yoga/ 
+(don't edit them in place for upgrade perspectives). So with "original templates", 
+any webmaster can create his "replacers (customized templates)".</p>
+
+<h3>Where should I save "replacers"?</h3>
+
+<p><strong>Replacers (customized templates)</strong> must be placed in the 
+template-extension folder (or its subfolders).
+Replacers can have any filename with the .tpl extension. For example: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>How can I activate my "replacers"?</h3>
+<p>An <strong>original template</strong> should be assigned to each
+ <strong>replacer (customized templates)</strong> to activate the related replacements.
+ This is the goal of "Extend for templates" in the Configuration Administration menu.</p>
+
+<p>If you select an <strong>optional URL keyword</strong> then replacements 
+will be operate only on pages with this keyword. For example: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Advanced users will use permalinks as <strong>optional URL keyword</strong>. </p>
+
+<p>If you select a <strong>Bound template</strong> then replacements will be operate only on this template.</p>
+
+<h3>How can I deactivate my "replacers"?</h3>
+<ul>
+<li>Unselect related "Original templates".</li>
+<li>By FTP delete of "replacers".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Warnings</h3>
+<ul>
+
+  <li><strong>Original template</strong> must be the "original" template 
+  otherwise you could have unpredictable results!</li>
+
+  <li>On several <strong>replacers (customized templates)</strong> with the
+  same<strong>Original template</strong> and the same <strong>optional URL 
+  keyword</strong> only the last replacer is active.</li>
+
+  <li>Unselected <strong>optional URL keyword</strong> will active the replacer
+  on any template usage. As previous point, order can override previous
+  selected replacers.</li>
+
+  <li>Subfolders:
+Subfolders are ignored but they are usefull to change current order.<br />
+distributed-samples: for test purpose are distributed! 
+<strong>Don't edit them</strong> create your own ones.
+</li>
+
+  <li>On delete of a replacer the <strong>Original template</strong> is 
+  immediately reactivated.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/hr_HR/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Popis grupa</h2>
+
+<p>ovo je mjesto gdje možete upravljati postojećim grupama.</p>
+
+<h3>Dodaj grupu</h3>
+
+<p>Upravnik može dodavati grupe.</p>
+
+<h3>Popis grupa</h3>
+
+<p>Popis dozvoljava za svaku stavku da:</p>
+
+
+<ul>
+  <li>idi na popis članova</li>
+  <li>idi na ovlasti</li>
+  <li>izbriši grupu (zahtijeva odabir potvrdne kućice)</li>
+  <li>promijeni "default" tj. pretpostavljeno stanje(zahtijeva odabir potvrdne kućice)</li>
+</ul>
+
+<h3>Pretpostavljene grupe</h3>
+<p>Pretpostavljene grupe su grupe koje se same povezuju sa novim korisnikom.</p>
Index: tags/2.4.0RC3/language/hr_HR/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,27 @@
+﻿<p>Several ways to add your photos in your gallery:</p>
+
+<ul>
+<li><strong>Direct upload</strong> inside your web browser is the
+simplest and most immediate way. It depends on your browser capabilities
+and your web server. For a huge quantity of photos or in case you encounter some problem,
+the other methods are just waiting for you!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Go to Direct Upload </a></p>
+
+<ul>
+<li><strong>pLoader</strong> is a desktop application, to be installed on your computer. Drag &amp; drop photos into pLoader window, click on <em>"Upload to Piwigo"</em> and let pLoader do the job. You can find other desktop applications such as <strong>WinToPiwigo</strong> or the <strong>Digikam</strong> export plugin to Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Go to pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+<li><strong>FTP transfer</strong> is the most recommended way to add a
+very large collection of photos with a minimum number of clicks. Follow
+the guide to prepare your photos. The FTP method let you control precisely
+the physical organization of your photos on your server.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Go to FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/hr_HR/help/history.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/history.html	(revision 14585)
@@ -0,0 +1,45 @@
+<h2>History</h2>
+
+<p>These screens allows you to follow the historical navigation en Piwigo
+according to the options yo have chosen in - Administration - General - History index.</p>
+	
+<h3>Statistics</h3>
+<ul>
+  <p>If you have chosen to keep the pages visited (<span
+class="pwgScreen">index.php</span> and <span
+class="pwgScreen">picture.php</span>) in the table <code>history. </code>
+This index allow you to follow the pages visited.</p>
+	
+	<li><strong>Global statistics</strong> : you can visualize per year. </li>
+	
+	<li><strong>Yearly statistics</strong> : you can visualize per month in the year selected.</li>
+	
+	<li><strong>Monthly statistics</strong> : you can visualize per days in the month selected.</li>
+	
+	<li><strong>Dayly statistics</strong> : you can visualize per hours in the day selected.</li>
+	
+</ul>
+
+<h3>Search</h3>
+<ul>
+  <p>If you have chosen to keep the pages visited (<span
+class="pwgScreen">index.php</span> and <span
+class="pwgScreen">picture.php</span>) in the table <code>history. </code>
+This index allow to follow en details the pages visited on the site with 
+the help of different filters.</p>
+ 
+	<li><strong>Filter per date</strong> : chose interval of date you wisk
+	to observe the activity.</li>
+	
+	<li><strong>Filter per type of element</strong> : chose the type 
+	of element you wisk to observe the activity.</li>
+	
+	<li><strong>Filter per user</strong> : chose user you wisk to 
+	observe the activity.</li>
+	
+	<li><strong>Filter per name of the file</strong> : chose name of the file 
+	you	wisk to observe the activity.</li>
+	
+	<li><strong>Filter per identifying image</strong> : chose identifying image 
+	you wisk to observe the activity.</li>
+</ul>
Index: tags/2.4.0RC3/language/hr_HR/help/index.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/hr_HR/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/maintenance.html	(revision 14585)
@@ -0,0 +1,62 @@
+<h2>Maintenance</h2>
+
+<p>To optimize page generation time, Piwigo uses cached
+information. For example, instead of counting the number of pictures
+contained in each category at each page reload, this information is stored
+in the database. In theory, this information should always be correct, but
+sometimes an error can occur and cached information becomes wrong.</p>
+
+<p>Some informations become useless with time. Deleting this useless
+information from database make you save disk space.</p>
+
+<ul>
+
+  <li>
+    <strong>Nepovezane stavke:</strong>
+    Prikaz slika koje nisu povezane ni s jednom nestvarnom skupinom.
+  </li>
+  <li>
+    <strong>Slike istog naziva u više od jednoj stvarnoj skupini:</strong>
+    Prikaz slika istog naziva koje se nalaze u više skupina.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Update categories informations:</strong> For each category,
+  informations to update or control are the following : list of parent
+  categories, number of pictures, date of the last picture, position among
+  brother categories, position among all categories. This action also checks
+  the coherence of representative picture.</li>
+
+  <li><strong>Update photos information:</strong> For each picture,
+  informations to update are : full path to file, average
+  rate. <em>Warning</em>: do not get confuse with metadata informations
+  which can be synchronized from <span class="pwgScreen">Administration,
+  Categories, Synchronize</span> or by reaching the modification screen of a
+  single picture (through <span class="pwgScreen">Picture</span> for
+  example).</li>
+
+  <li><strong>Repair and optimize database:</strong>
+  For each table, re-odrer, repair and optimize operations are done.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>Purge history detail:</strong> Delete all lines from
+  <code>history</code> table. Screen <span class="pwgScreen">Administration,
+  Specials, History</span> shows no informations anymore on past
+  history. <em>Warning</em>: all data will be lost and there is no way to
+  get informations back.</li>
+
+  <li><strong>Purge history summary:</strong> Delete all the summary information about visit history. This summary is calculated from the history detail.</li>
+
+  <li><strong>Purge sessions:</strong> Delete expired user sessions.</li>
+
+  <li><strong>Purge never used notification feeds</strong></li>
+
+  <li><strong>Purge search history</strong></li>
+  
+  <li><strong>Purge compiled templates</strong></li>  
+</ul>
Index: tags/2.4.0RC3/language/hr_HR/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Obavijesti e-mail porukama</h2>
+
+<p>Ovaj prozor omogućaa postavu i upravljanje e-mail obavijestima korisnicima o novostima u vašoj galeriji.</p>
+
+<p>Sastoji se od 3 kartice:</p>
+
+<h3>Parametri</h3>
+<p>Dostupno samo webmasterima, ova kartica postavlja parametre e-mail obavješćivanja.</p>
+
+<h3>Pretplata</h3>
+<p>Dostupno samo webmasterima, ova kartica upravlja pretplatom/prekidom pretplate korisnika na e-mail obavijesti.</p>
+
+<h3>Envoi</h3>
+<p>Dostupno samo webmasterima i upraviteljima, ova kartica omogućava slanje e-mail poruka za novosti.</p>
+
Index: tags/2.4.0RC3/language/hr_HR/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Stalne poveznice</h2>
+
+<p>Koriste se za ljepši prikaz URL-a skupine. Kada skupina ima određenu stalnu poveznicu, ID skupine nije više nužan u URL-u.</p>
+
+<p>Kada je stalna poveznica izbrisana, imate mogućnost pohraniti je u pismohrani poveznica, tako da vanjske poveznice na PWG stranice i dalje ispravno rade. U pismohrani stalnih poveznica možete vidjeti nadnevak kada je izbrisana, vrijeme posljednjeg korištenja i koliko puta.</p>
+
+<p>Zapamtite da stalna poveznica mora biti jedinstvena po skupini. Isto tako u pismohrani stalnih poveznica ne možete imati istu više puta.</p>
Index: tags/2.4.0RC3/language/hr_HR/help/search.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/search.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Pretraživanje</h2>
+
+<p>Ova stranica omogućava pretragu slika u cijeloj galeriji.</p>
+
+<dl>
+
+  <dt>Pretraga po riječima</dt>
+  <dd>Pretažuje po upisanim riječima po svim obilježjima povezanim sa slikama prikazanim u galeriji. Koristite * kao zamijenu za djelomična poklapanja.</dd>
+
+  <dt>Pretraga po autoru</dt>
+  <dd>Koristite * kao zamijenu za djelomična poklapanja.</dd>
+
+  <dt>Pretaga po nadnevku</dt>
+  <dd>Odaberite nadnevak i/ili završni nadnevak za vašu pretragu. Ostavite nadnevak prazan 
+  za pretragu "prethodnih" upita. Godina mora biti upisana u zadnje polje u slijedećem obliku : 0000 (i.e. 2009)</dd>
+
+  <dt>Pretraga u skupinama</dt>
+  <dd>Odaberite skupinu ili skupine koje želite pretražiti. Za bržu pretragu sve podskupine
+  mogu biti pretraživane odabirom nadređene skupine i uključenjem mogućnosti pretrage podskupina ispod.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hr_HR/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/site_manager.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Remote sites</h2>
+
+<p>Piwigo offers the possibility to use several servers to store the
+images which will compose your gallery. It can be useful if your gallery is
+installed on one limited space and that you have a big quantity of images to
+be shown.</p>
+
+<ol>
+
+  <li>edit file <span class="filename">tools/create_listing_file.php</span>,
+  by modifying parameters section such as
+  <code>$conf['prefix_thumbnail']</code> or
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>place file <span class="filename">tools/create_listing_file.php</span>
+  modified on your distant website, in the same directory than your category
+  directories (as the directory <span class="filename">galleries</span> of
+  this website) by ftp. For the example, let's say that you can access <span
+  class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>go to <span class="pwgScreen">administration panel, Categories, Site
+  manager</span>. Ask to create a new site, for example <span
+  class="filename">http://example.com/galleries</span>.</li>
+
+  <li>a new remote site is registered. You can perform 4 actions :
+
+    <ol>
+
+      <li><strong>generate listing</strong> : launches a distant request to
+      generate a distant file listing</li>
+
+      <li><strong>synchronize</strong> : reads the distant <span
+      class="filename">listing.xml</span> file and synchronizes with
+      database informations.</li>
+
+      <li><strong>clean</strong> : removes distant <span
+      class="filename">listing.xml</span> file.</li>
+
+      <li><strong>delete</strong> : deletes the site (and all related
+      categories and elements) in the database.</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>You can do all this by hand by generating yourself the <span
+class="filename">listing.xml</span> file, moving it from your distant server
+to you local Piwigo root directory and opening the remote site
+management screen : Piwigo will propose you to use the found
+listing.xml file.</p>-->
+
Index: tags/2.4.0RC3/language/hr_HR/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/synchronize.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Usklađivanje</h2>
+
+<p>Dvije su mogućnosti usklađivanja: mape/zapisi i meta podatci
+zapisa. mape/zapisi vrše usklađivanje stabla mapa sa skupinskim stablom u bazi podataka.
+Meta podatci usklađuju obavijesne stavke kao što su veličina zapisa, veličina slika u pikselima, EXIF ili IPTC
+podatke.</p>
+
+<p>Prvo usklađivanje mora biti ono od mape/zapisi vrste.</p>
+
+<p>Postupak usklađivanja može potrajati i malo duže (ovisno o opterećenju poslužitelja i količini
+stavaka za obradu) pa je omogućeno da se napreduje korak po korak: skupinu po skupinu.</p>
Index: tags/2.4.0RC3/language/hr_HR/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Izrada poveznih sličica</h2>
+
+<p>Ovdje možete obaviti izradu nedostajućih poveznih sličica.</p>
+
+<dl>
+
+  <dt>GD inačica</dt>
+
+  <dd>GD je sustavna biblioteka za upravljanje obradom slika PHP-a. Odaberite inačicu
+  postavljenu na vašem poslužitelju. Ako krivo odaberete, dobiti ćete poruku greške,
+  vratite se jedan korak unatrag sa vašim web preglednikom i odaberite neku drugu inačicu.
+  Ako ni jedna inačica ne radi, znači da vaš poslužitelj ne podržava GD.</dd>
+
+  <dt>Širina i visina</dt>
+
+  <dd>Najveće vrijednosti koje povezna sličica može imati. Razmjerni odnos se održava.</dd>
+
+  <dt>Broj sličica za izradu</dt>
+
+  <dd>Nemojte pokušavati izradu prevelikog broja sličica u isto vrijeme. Zaista, izrada koristi mnogo CPU snage. Ako ste postavili vašu Piwigo galeriju na besplatnom poslužitelju, preveliko CPU opterećenje može ponekad dovesti do brisanja vašeg web mjesta.</dd>
+
+  <dt>Oblik zapisa</dt>
+
+  <dd>Samo je JPEG oblik zapisa podržan u izradi sličica. Povezne sličice
+  mogu biti izrađene samo za slike oblika PNG i JPEG.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hr_HR/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/hr_HR/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/help/user_list.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Popis korisnika</h2>
+
+<p>Ovo je mjesto gdje možete upravljati upisanim korisnicima. Jedino se ovlastima
+upravlja u nekim drugim prozorima.</p>
+
+<h3>Dodaj korisnika</h3>
+
+<p>Upravnik može ručno dodavati korisnike.</p>
+
+<h3>Popis korisnika</h3>
+
+<p>Popis može biti pročišćen na korisničko ime (koristite * kao zamjenu), grupu ili
+stanje. Popis može biti poredan po nadnevku upisa ili korisničkom imenu, uzlaznim
+ili silaznim redoslijedom.</p>
+
+<p>Ovaj prozor omogućava upravljenje nekolicinom korisnika odjednom na različitim postupcima
+:</p>
+
+<ul>
+
+  <li>brisanje korisnika (zahtijeva potvrdnu kućicu)</li>
+
+  <li>promjena stanja</li>
+
+  <li>uklučenje ili isključenje u-iz grupa</li>
+
+  <li>prilagodba svojstava prikaza</li>
+
+  <li>promjena dodatnih svojstava</li>
+
+</ul>
+
+<p>Svrha je postaviti korisnike kao odabrane (pretpostavljeno) ili se svi korisnici pitaju.</p>
Index: tags/2.4.0RC3/language/hr_HR/index.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/hr_HR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/install.lang.php	(revision 14585)
@@ -0,0 +1,72 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Ugradba';
+$lang['Basic configuration'] = 'Osnovna postava';
+$lang['Default gallery language'] = 'Pretpostavljeni jezik galerije';
+$lang['Database configuration'] = 'Postava baze podataka';
+$lang['Admin configuration'] = 'Upravna postava';
+$lang['Start Install'] = 'Pokreni ugradbu';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti kao xxx@yyy.eee (example : jere@stranica.org)';
+$lang['Webmaster login'] = 'Webmaster-ova prijava';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Biti će prikazano posjetiteljima. Potrebno je za upravljanje web mjestom';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Povezivanje sa poslužiteljem uspješno, ali je nemoguće povezivanje sa bazom podataka';
+$lang['Can\'t connect to server'] = 'Ne mogu se povezati sa poslužiteljem';
+$lang['Host'] = 'MySQL poslužitelj';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Korisnik';
+$lang['user login given by your host provider'] = 'korisničko ime dobiveno od davatelja usluge smještaja';
+$lang['Password'] = 'Zaporka';
+$lang['user password given by your host provider'] = 'korisnička zaporka dobivena od davatelja usluge smještaja';
+$lang['Database name'] = 'Naziv baze podataka';
+$lang['also given by your host provider'] = 'također dobivena od davatelja usluge smještaja';
+$lang['Database table prefix'] = 'Predznak tabela baze podataka';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'nazivi tabela baze podataka će biti predznačeni sa time (omogućava vam bolje upravljanje tabelama)';
+$lang['enter a login for webmaster'] = 'upišite korisničko ime za webmaster-a';
+$lang['webmaster login can\'t contain characters \' or "'] = 'webmaster-ovo korisničko ime ne može sadržavati znakove \' ili "';
+$lang['please enter your password again'] = 'molimo upišite zaporku ponovo';
+$lang['Webmaster password'] = 'Webmaster-ova zaporka';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Čuvajte je na sigurnom mjestu, ona omogućava pristup upravnoj ploči';
+$lang['Password [confirm]'] = 'Zaporka [potvrdi]';
+$lang['verification'] = 'ovjera';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Trebate pomoć? Pitajte na <a href="%s">Piwigo message board</a>.';
+$lang['Webmaster mail address'] = 'Webmaster-ova e-mail adresa';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Posjetitelji će moći pisati upravitelju galerije preko ove adrese';
+$lang['PHP 5 is required'] = 'PHP 5 je obvezan';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Čini se da vaše web mjesto trenutno koristi PHP inačicu %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo će pokušati podesiti sustavne postavke na PHP 5 izradom ili prilagodbom .htaccess zapisa.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Ne zaboravite da možete i sami promijeniti postavke te potom ponovo pokrenuti Piwigo.';
+$lang['Try to configure PHP 5'] = 'Pokušaj podešavanja PHP 5';
+$lang['Sorry!'] = 'Nažalost!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nije u mogućnosti podesiti PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Trebate se obratiti vašem davatelju usluge smještaja za upute na koji se način možete prebaciti na PHP 5 samostalno.';
+$lang['Hope to see you back soon.'] = 'Do skorog viđenja.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Čestitamo, Piwigo ugradnja je dovršena';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Druga mogućnost je da kopirate tekst u prostoru poviše i prebacite ga u zapis "local/config/database.inc.php" (Pozor :u database.inc.php smije se prebaciti samo tekst iz kućice bez znakova novog reda ili praznog prostora)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Izrada local/config/database.inc.php nije uspjela.';
+$lang['Download the config file'] = 'Preuzmi zapis podešavanja';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Možete preuzeti zapis sustavnog podešavanja i prebaciti ga u local/config mapu vaše ugradnje.';
+$lang['Just another Piwigo gallery'] = 'Samo još jedna Piwigo galerija';
+$lang['Welcome to my photo gallery'] = 'Dobrodošli u moju fotogaleriju';
+
+?>
Index: tags/2.4.0RC3/language/hr_HR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/hr_HR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Hrvatski [HR]
Index: tags/2.4.0RC3/language/hr_HR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/hr_HR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hr_HR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Nadogradnja';
+$lang['Upgrade from version %s to %s'] = 'Nadogradnja sa inačice %s na %s';
+$lang['Statistics'] = 'Statistika';
+$lang['total upgrade time'] = 'sveukupno vrijeme nadogradnje';
+$lang['total SQL time'] = 'sveukupno SQL vrijeme';
+$lang['SQL queries'] = 'SQL upita';
+$lang['Upgrade informations'] = 'Podaci o nadogradnji';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Izvršite radnu provjeru [Uprava>Alati>Održavanje] u slučaju bilo kakvih problema.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Samo upravnik može pokrenuti nadogradnju: molimo, prijavite se dolje.';
+$lang['You do not have access rights to run upgrade'] = 'Nemate pristupna prava za pokretanje nadogradnje';
+$lang['All sub-albums of private albums become private'] = 'Sve podskupine osobnih skupina postaju osobne';
+$lang['User permissions and group permissions have been erased'] = 'Korisničke i grupne dozvole su izbrisane';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Jedino su predznaci poveznih sličica i webmaster-ova e-mail adresa sačuvane iz prethodne postave';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Na ovoj stranici imate prijedlog nadogradnje baze podataka sa vaše starije inačice na novu. Pomoćnik nadogradnje smatra da trenutno koristite <strong>inačicu %s</strong> (ili sličnu).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Kao mjera predostrožnosti, slijedeći dodaci su isključeni. Provjerite dostupne nadogradnje dodataka prije njihovog ponovnog uključenja:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'U <i>%s</i>, prije <b>?></b>, ubaci:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Sljedeće teme su preventivno deaktivirane. Prije ponovnog aktiviranja morate provjeriti postoje li nadogradnje:';
+
+?>
Index: tags/2.4.0RC3/language/hu_HU/README.txt
===================================================================
--- tags/2.4.0RC3/language/hu_HU/README.txt	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/README.txt	(revision 14585)
@@ -0,0 +1,6 @@
+Piwigo Hungarian language files
+author: Sámli  CMS Award .HU Team
+website: http://cmsaward.hu
+e-mail: info@cmsaward.hu
+
+update : 26/10/2009
Index: tags/2.4.0RC3/language/hu_HU/about.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/about.html	(revision 14585)
@@ -0,0 +1,15 @@
+<p>A képgaléria alapja a Piwigo galéria rendszer.</p>
+
+<p>A Piwigo egy aktív közösség (felhasználók és fejlesztők) által épülő webes képgaléria.
+ A Piwigo könnyű testreszabhatóságát extra bővítmények biztosítják.
+ A hab a tortán, hogy a Piwigo nyílt forráskódú és ingyenes.</p>
+
+<p id="linkToPiwigo"><a href="http://hu.piwigo.org">Látogasson el a Piwigo magyar nyelvű honlapjára</a></p>
+
+<p>A Piwigo magyar fordításának karbantartói (ABC sorrendben):
+
+	<ul>
+	  <li><a href="http://hu.piwigo.org/forum/profile.php?id=5424">sámli</a></li>
+	</ul>
+        .... köszönjük munkájukat</p>
+
Index: tags/2.4.0RC3/language/hu_HU/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/admin.lang.php	(revision 14585)
@@ -0,0 +1,887 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d hozzárendelés (fizikai és virtuális)';
+$lang['%d associations'] = '%d hozzárendelés (fizikai és virtuális)';
+$lang['%d album including'] = '%d album ';
+$lang['%d albums including'] = '%d album ';
+$lang['%d physical'] = '%d fizikai';
+$lang['%d physical'] = '%d fizikai';
+$lang[' and %d virtual'] = ' és %d virtuális';
+$lang[' and %d virtual'] = ' és %d virtuális';
+$lang['%d album moved'] = '%d Album áthelyezése';
+$lang['%d albums moved'] = '%d Album áthelyezése';
+$lang['%d group'] = '%d csoport';
+$lang['%d groups'] = '%d csoport';
+$lang['%d member'] = '%d tag';
+$lang['%d members'] = '%d tag';
+$lang['%d tag'] = '%d címke';
+$lang['%d tags'] = '%d címke';
+$lang['%d user comment rejected'] = '%d elutasított hozzászólás';
+$lang['%d user comments rejected'] = '%d elutasított hozzászólás';
+$lang['%d user comment validated'] = '%d jóváhagyott hozzászólás';
+$lang['%d user comments validated'] = '%d jóváhagyott hozzászólás';
+$lang['%d user deleted'] = '%d törölt felhasználó';
+$lang['%d users deleted'] = '%d törölt felhasználó';
+$lang['%d user'] = '%d felhasználó';
+$lang['%d users'] = '%d felhasználó';
+$lang['%d waiting for validation'] = '%d vár elfogadásra';
+$lang['Actions'] = 'Műveletek';
+$lang['Activate'] = 'Bekapcsolás';
+$lang['Add/delete a permalink'] = 'Közvetlen link hozzáadása/törlése';
+$lang['Add a tag'] = 'Címke hozzáadása';
+$lang['Add a user'] = 'Felhasználó hozzáadása';
+$lang['Add group'] = 'Csoport hozzáadása';
+$lang['Add'] = 'Hozzáadás';
+$lang['Allow user registration'] = 'Regisztráció engedélyezése';
+$lang['Apply to sub-albums'] = 'Belső albumokra is';
+$lang['Associated'] = 'Hozzárendelve';
+$lang['Caddie management'] = 'Kosár kezelése';
+$lang['Caddie'] = 'Kosár';
+$lang['Albums authorized thanks to group associations'] = 'Az albumok csoport tagsága';
+$lang['Album manual order was saved'] = 'Albumok sorrendjének mentése megtörtént';
+$lang['Check for upgrade failed for unknown reasons.'] = 'A program frissítése ismeretlen okból nem sikerült.';
+$lang['Check for upgrade'] = 'Frissítés keresése';
+$lang['Comments for all'] = 'Bárki hozzászólhat';
+$lang['Current name'] = 'Név';
+$lang['Database'] = 'Adatbázis';
+$lang['Deactivate'] = 'Kikapcsolás';
+$lang['Delete Representant'] = 'Album képviselő törlése';
+$lang['Delete selected tags'] = 'Kiválasztott címkék törlése';
+$lang['Delete selected users'] = 'Kiválasztott felhasználók törlése';
+$lang['Deletions'] = 'Törlések';
+$lang['Deny selected groups'] = 'Kiválasztott csoportok elutasítása';
+$lang['Deny selected users'] = 'Kiválasztott felhasználók elutasítása';
+$lang['Description'] = 'Leírás';
+$lang['Display options'] = 'Megjelenítés beállításai';
+$lang['Dissociated'] = 'Nincs hozzárendelve';
+$lang['Does not represent'] = 'Nem képviseli';
+$lang['Edit selected tags'] = 'Kiválasztott címkék szerkesztése';
+$lang['Edit tags'] = 'Címkék szerkesztése';
+$lang['Email admins when a new user registers'] = 'Email-küldés, ha egy új felhasználó regisztrál';
+$lang['Email admins when a valid comment is entered'] = 'Email-küldés, ha egy érvényes hozzászólás érkezik ';
+$lang['Email admins when a comment requires validation'] = 'Email-küldés, ha egy hozzászólás jóváhagyásra vár ';
+$lang['Environment'] = 'Környezet';
+$lang['Form'] = 'Űrlap';
+$lang['Gallery title'] = 'Galéria címe';
+$lang['Grant selected groups'] = 'Kiválasztott csoportok részére jogosultság adása';
+$lang['Grant selected users'] = 'Kiválasztott felhasználók részére jogosultság adása';
+$lang['Group name'] = 'Csoport neve';
+$lang['Groups'] = 'Csoportok';
+$lang['Guests'] = 'Vendégek';
+$lang['History'] = 'Statisztikák';
+$lang['Informations'] = 'Információk';
+$lang['Install'] = 'Telepítés';
+$lang['Link all album photos to a new album'] = 'Az album összes elemének új albumhoz rendelése';
+$lang['Link all album photos to some existing albums'] = 'Az album összes elemének már meglévő albumhoz rendelése';
+$lang['Linked albums'] = 'A képhez rendelt albumok';
+$lang['Lock gallery'] = 'Galéria lezárása';
+$lang['Maintenance'] = 'Karbantartás';
+$lang['Edit album permissions'] = 'Album jogosultságainak kezelése';
+$lang['Manage permissions for group "%s"'] = '"%s" csoport jogosultságainak kezelése';
+$lang['Manage permissions for user "%s"'] = '"%s" felhasználó jogosultságainak kezelése';
+$lang['Manage tags'] = 'Címkék kezelése';
+$lang['Members'] = 'Tagok';
+$lang['Metadata synchronized from file'] = 'Meta adatok fájlból történő szinkronizálása';
+$lang['Move albums'] = 'Albumok áthelyezése';
+$lang['Move'] = 'Áthelyezés';
+$lang['Name'] = 'Név';
+$lang['New name'] = 'Új név';
+$lang['New parent album'] = 'Új szülő album';
+$lang['New tag'] = 'Új címke';
+$lang['Number of comments per page'] = 'Hozzászólások száma oldalanként';
+$lang['Number of rates'] = 'Értékelések száma';
+$lang['Number of thumbnails to create'] = 'Elkészítendő bélyegképek száma';
+$lang['Only private albums are listed'] = 'Csak privát albumok megjelenítése';
+$lang['Operating system'] = 'Operációs rendszer';
+$lang['Options'] = 'Beállítások';
+$lang['Other private albums'] = 'Más privát albumok';
+$lang['Page banner'] = 'Oldal fejléc';
+$lang['Parent album'] = 'Szülő album';
+$lang['Path'] = 'Elérési út';
+$lang['Permalink'] = 'Közvetlen link';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'A(z) %s közvetlen link név korábban létrehozva a(z) %s album számára. Törölni kell a közvetlen link előzményekből.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'A közvetlen linkek a következő karakterekből állhatnak: a-z, A-Z, 0-9, "-" vagy "_". Nem kezdődhetnek számmal vagy "-" karakterrel';
+$lang['Permalink %s is already used by album %s'] = 'A(z) %s közvetlen link név a(z) %s album számára lefoglalva. Válasszon másikat!';
+$lang['Permalink history'] = 'Közvetlen link előzmények';
+$lang['Permalinks'] = 'Közvetlen linkek';
+$lang['Permission denied'] = 'Hozzáférés megtagadva';
+$lang['Permission granted thanks to a group'] = 'Hozzáférés engedélyezve, köszöntünk a csoportban';
+$lang['Permission granted'] = 'Hozzáférés engedélyezve';
+$lang['Photo informations updated'] = 'Kép információi frissítve';
+$lang['Plugins'] = 'Bővítmények';
+$lang['Position'] = 'Pozíció';
+$lang['Preferences'] = 'Beállítások';
+$lang['Properties'] = 'Tulajdonságok';
+$lang['Random photo'] = 'Véletlen kép';
+$lang['Rate date'] = 'Értékelés időpontja';
+$lang['Rating by guests'] = 'Vendégek által értékelhető';
+$lang['Rating'] = 'Értékelés';
+$lang['Reject'] = 'Elvetés';
+$lang['Representant'] = 'Képviseli';
+$lang['Representation of albums'] = 'Albumok képviselete';
+$lang['Representative'] = 'Reprezentatív';
+$lang['Represents'] = 'Képviseli';
+$lang['Save order'] = 'Sorrend mentése';
+$lang['Save to permalink history'] = 'Közvetlen link előzmények mentése';
+$lang['Select at least one album'] = 'Legalább egy albumot ki kell választani';
+$lang['Select at least one photo'] = 'Legalább egy képet ki kell választani';
+$lang['Select at least one user'] = 'Legalább egy felhasználót ki kell választani';
+$lang['Show info'] = 'Információ megjelenítése';
+$lang['Site manager'] = 'Oldalak';
+$lang['Status'] = 'Státusz';
+$lang['Statistics'] = 'Statisztika';
+$lang['Storage album'] = 'Album';
+$lang['Sum of rates'] = 'Pontszámok összege';
+$lang['Tag "%s" already exists'] = '"%s" címke már létezik!';
+$lang['Tag "%s" was added'] = '"%s" címke hozzáadva';
+$lang['Tag selection'] = 'Címke kiválasztása';
+$lang['The %d following tags were deleted'] = 'A következő %d címke törölve : %s';
+$lang['Uninstall'] = 'Eltávolítás';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Alapértelmezett kép sorrend (beállítva a konfigurációs fájlban)';
+$lang['User comments validation'] = 'Felhasználói hozzászólások engedélyezése';
+$lang['Users'] = 'Felhasználók';
+$lang['Validate'] = 'Engedélyezés';
+$lang['Validation'] = 'Engedélyezés szükséges';
+$lang['Version'] = 'Verzió';
+$lang['Virtual albums to move'] = 'Virtuális albumok kijelölése áthelyezésre';
+$lang['Virtual album name'] = 'Virtuális album neve';
+$lang['Webmaster cannot be deleted'] = 'Na jó...azért a webmestert ne töröljük...';
+$lang['You are running on development sources, no check possible.'] = 'Ez egy fejlesztői változat, keresés lehetetlen.';
+$lang['You cannot delete your account'] = "Nem törölheti a fiókját";
+$lang['You cannot move an album in its own sub album'] = 'Az albumot lehetetlen a belső albumjába helyezni';
+$lang['You need to confirm deletion'] = 'A törléshez megerősítés szükséges';
+$lang['Associate to album'] = 'Hozzárendelés albumhoz';
+$lang['associate to group'] = 'Hozzárendelés csoporthoz';
+$lang['Authorized'] = 'Engedélyezve';
+$lang['Add a virtual album'] = 'Virtuális album hozzáadása';
+$lang['Authorize users to add comments on selected albums'] = 'Hozzászólás engedélyezése a kiválasztott albumokhoz';
+$lang['The name of an album must not be empty'] = 'Az album nevét meg kell adni';
+$lang['Lock albums'] = 'Album lezárása';
+$lang['Private'] = 'Privát album';
+$lang['Public'] = 'Nyilvános album';
+$lang['Find a new representant by random'] = 'Új album-képviselő véletlenszerű kiválasztása';
+$lang['Public / Private'] = 'Nyilvános / Privát';
+$lang['Manage authorizations for selected albums'] = 'A kiválasztott albumok engedélyeinek kezelése';
+$lang['Virtual album added'] = 'Virtuális album hozzáadva';
+$lang['Virtual album deleted'] = 'Virtuális album törölve';
+$lang['Access type'] = 'Hozzáférés típusa';
+$lang['Information data registered in database'] = 'Az információk bekerültek az adatbázisba';
+$lang['Default display'] = 'Alapértelmezett megjelenítés';
+$lang['The gallery URL is not valid.'] = 'A galéria URL nem létezik.';
+$lang['Main'] = 'Általános';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'A felhasználói hozzászólások száma egy oldalon 5 és  50 között.';
+$lang['Configuration'] = 'Beállítások';
+$lang['confirm'] = 'Megerősítés';
+$lang['Date'] = 'Dátum';
+$lang['delete album'] = 'Album törlése';
+$lang['Dissociate from album'] = 'Eltávolítás az albumból';
+$lang['dissociate from group'] = 'Eltávolítás a csoportból';
+$lang['Album updated successfully'] = 'Az album információinak módosítása megtörtént.';
+$lang['photos per page'] = 'Képek száma oldalanként';
+$lang['High definition enabled'] = 'Kiemelt hozzáférés engedélyezése';
+$lang['File'] = 'Fájl';
+$lang['first photo added on %s'] = 'Az első kép hozzáadásának időpontja: %s';
+$lang['Forbidden'] = 'Tiltva';
+$lang['global mode'] = 'Globális mód';
+$lang['group "%s" added'] = '"%s" csoport hozzáadva';
+$lang['group "%s" deleted'] = '"%s" törölve';
+$lang['group "%s" updated'] = '"%s" frissítve';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'A csoportnév nem tartalmazhat " vagy \' karaktert, vagy nem lehet üres.';
+$lang['This name is already used by another group.'] = 'Ez a név már használatban van a másik csoportban.';
+$lang['High definition'] = 'Kiemelt hozzáférés';
+$lang['jump to album'] = 'Albumhoz ugrás';
+$lang['jump to photo'] = 'Képhez ugrás';
+$lang['leave'] = 'Nem változtat';
+$lang['Lock'] = 'Lezárás';
+$lang['Locked'] = 'Lezárt';
+$lang['manage album photos'] = 'Album elemeinek kezelése';
+$lang['manage sub-albums'] = 'Belső albumok kezelése';
+$lang['Manage'] = 'Kezelés';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Az átfutási idő lejárt, a műveletet folytatni kell [Idő: %d másodperc].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Az átfutási idő lejárt, a műveletet folytatni kell [Idő: %d másodperc].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'A listán szereplő felhasználóknak küldendő e-mail előkészítési ideje véges. Más felhasználók nem lesznek a listában.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Az e-mail küldési idő korlátozott. További e-mail küldés megszakításra kerül.';
+$lang['To send ?'] = 'Elküldjük?';
+$lang['Last send'] = 'Utolsó küldése';
+$lang['email'] = 'E-mail';
+$lang['User'] = 'Felhasználó';
+$lang['See you soon,'] = 'Viszont látásra,';
+$lang['Go to'] = 'Ugrás ';
+$lang['Hello'] = 'Helló ';
+$lang['New photos were added'] = 'Új elem került hozzáadásra.';
+$lang['on'] = ' Küldés időpontja ';
+$lang['between'] = 'között ';
+$lang['and'] = ' és ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Ezt az e-mailt a webmester küldte (nem automatikusan generált) mert értesítést kapott az egyik albumból/galériából.".';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Feliratkozott a bejelentések fogadására levélben.';
+$lang['To subscribe'] = 'Feliratkozáshoz';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Ha problémát észlel, vagy bármilyen kérdése van, kérjük, küldjön egy üzenetet ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problémák és kérdések';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'A webmester a leiratkozást érvényesítette';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Leiratkozott az e-mail értesítésről.';
+$lang[', click on'] = ' kattintson erre a linkre:';
+$lang['To unsubscribe'] = 'Leiratkozáshoz';
+$lang['With blank value, gallery title will be used'] = 'Ha nincs megadva, a galéria címét fogja használni';
+$lang['Notification'] = 'Értesítés';
+$lang['Error when sending email to %s [%s].'] = 'Hiba a %s [%s] levél küldése közben.';
+$lang['Mail sent to %s [%s].'] = 'E-mail elküldve %s [%s].';
+$lang['%d mail was sent.'] = '%d levelet küldtünk el.';
+$lang['%d mails were sent.'] = '%d levelet küldtünk el.';
+$lang['%d mail was not sent.'] = '%d levelet nem küldtünk el.';
+$lang['%d mails were not sent.'] = '%d levelet nem küldtünk el.';
+$lang['No mail to send.'] = 'Nem kell e-mailt küldeni.';
+$lang['There is no available subscribers to mail.'] = 'Nincs feliratkozott felhasználó akinek küldenünk kellene e-mailt.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Csak azok a feliratkozott felhasználók jelennek meg a listában, akik még nem kaptak értesítést az új elemekről.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Egyébként csak az adminisztrátori jogkörrel nem rendelkező webmesterek láthatók ezen a lapon.';
+$lang['No user to send notifications by mail.'] = 'Nincs felhasználó akinek a frissítéseket el lehetne küldeni.';
+$lang['New photos added'] = 'Új elemekkel bővült a galéria';
+$lang['Subscribe to notification by mail'] = 'Feliratkozás e-mail értesítőre';
+$lang['Unsubscribe from notification by mail'] = 'Leiratkozás e-mail értesítőről';
+$lang['Parameter'] = 'Paraméterek';
+$lang['Continue processing treatment'] = 'Tovább - feldolgozás';
+$lang['Complementary mail content'] = 'Kiegészítő E-mail tartalom';
+$lang['Add detailed content'] = 'Részletes tartalom';
+$lang['Send mail as'] = 'E-mail küldése, mint';
+$lang['Send mail to users'] = 'Levél a felhasználónak';
+$lang['Send'] = 'Küld';
+$lang['Options'] = 'Lehetőségek';
+$lang['Subscribed'] = 'Feliratkozott';
+$lang['Subscribe'] = 'Feliratkozás';
+$lang['Parameters'] = 'Paraméterek';
+$lang['Select recipients'] = 'Válassza ki a címzetteket';
+$lang['Subscribe/unsubscribe users'] = 'Feliratkozás/Leiratkozás (felhasználók)';
+$lang['Unsubscribed'] = 'Leiratkozott';
+$lang['%d parameter was updated.'] = '%d paraméter frissítve.';
+$lang['%d parameters were updated.'] = '%d paraméter frissítve.';
+$lang['%d user was not updated.'] = '%d felhasználót nem frissítettünk.';
+$lang['%d users were not updated.'] = '%d felhasználót nem frissítettünk.';
+$lang['User %s [%s] was removed from the subscription list.'] = '%s [%s] felhasználót töröltük az előfizetői listáról.';
+$lang['User %s [%s] was added to the subscription list.'] = '%s [%s] felhasználót felvettük az előfizetői listára.';
+$lang['%d user was updated.'] = '%d felhasználót frissítettünk.';
+$lang['%d users were updated.'] = '%d felhasználót frissítettünk.';
+$lang['User %s [%s] was not removed from the subscription list.'] = '%s [%s] felhasználót nem töröltük az előfizetői listáról.';
+$lang['User %s [%s] was not added to the subscription list.'] = '%s [%s] felhasználót nem adtuk hozzá az előfizetői listához.';
+$lang['User %s [%s] added.'] = '%s [%s] felhasználó hozzáadva.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Figyelem: Feliratkozás vagy Leiratkozás levelet küld a felhasználóknak';
+$lang['Send mail on HTML format'] = 'Levél küldése HTML formátumban';
+$lang['Include display of recent photos grouped by dates'] = 'Jelenítse meg a legújabb képeket, dátum szerint csoportosítva';
+$lang['Available only with HTML format'] = 'Csak HTML formátum';
+$lang['no write access'] = 'Nem írható';
+$lang['Permissions'] = 'Engedélyek';
+$lang['private'] = 'Privát';
+$lang['public'] = 'Nyilvános';
+$lang['Purge never used notification feeds'] = 'Nem használatos RSS-feedek törlése';
+$lang['Purge sessions'] = 'Folyamatok törlése';
+$lang['randomly represented'] = 'Randommódon képviselt';
+$lang['registration date'] = 'Regisztráció dátuma';
+$lang['clean'] = 'tiszta';
+$lang['Create this site'] = 'Oldal létrehozása';
+$lang['test'] = 'Teszt';
+$lang['test this remote site'] = 'Tesztelés távoli kiszolgálón';
+$lang['remove tags'] = 'Címkék eltávolítása';
+$lang['Repair and optimize database'] = 'Adatbázis javítása és optimalizálása';
+$lang['selection'] = 'kiválasztás';
+$lang['set to'] = 'Beállítás';
+$lang['singly represented'] = 'rögzített képviselője';
+$lang['This site already exists'] = 'Ilyen oldal már van';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Új galéria-oldal : ( URL hozzáadása a create_listing_file.php -hoz)';
+$lang['created'] = 'létrehozva';
+$lang['delete'] = 'törlés';
+$lang['delete this site and all its attached elements'] = 'oldal és elemeinek törlése';
+$lang['an error happened'] = 'hiba történt';
+$lang['Local'] = 'Helyi';
+$lang['Remote'] = 'Távoli';
+$lang['update the database from files'] = 'adatbázis frissítése fájlokból';
+$lang['status'] = 'Státusz';
+$lang['Directory'] = 'Könyvtár';
+$lang['sub-albums'] = 'Belső albumok';
+$lang['Synchronize metadata'] = 'Meta adatok szinkronizálása';
+$lang['target'] = 'Cél';
+$lang['title'] = 'Cím';
+$lang['Album list management'] = 'Albumok kezelése';
+$lang['Piwigo configuration'] = 'Piwigo konfiguráció';
+$lang['Edit album'] = 'Album szerkesztése';
+$lang['Group management'] = 'Csoportok kezelése';
+$lang['User list'] = 'Felhasználók listája';
+$lang['Edit photo information'] = 'Képinformációk módosítása';
+$lang['Database synchronization with files'] = 'Adatbázis szinkronizálása ezzel a mappával';
+$lang['all'] = 'összes';
+$lang['height must be a number superior to'] = 'a magasságnak ennél nagyobbnak kell lennie:';
+$lang['width must be a number superior to'] = 'a szélességnek ennél nagyobbnak kell lennie:';
+$lang['for the file format'] = 'fájl formátum';
+$lang['Photo unreachable or no support'] = 'Kép nem elérhető, vagy formátuma nem támogatott';
+$lang['GD version'] = 'GD verzió';
+$lang['General statistics'] = 'Általános statisztika';
+$lang['average time'] = 'átlagos idő';
+$lang['number of miniaturized photos'] = 'kicsinyített képek száma';
+$lang['total time'] = 'teljes idő';
+$lang['for this file format'] = 'formátum';
+$lang['unit mode'] = 'Képenként';
+$lang['Unlocked'] = 'Zárolatlan';
+$lang['unset'] = 'Eltávolítás';
+$lang['Update albums informations'] = 'Albumok információinak frissítése';
+$lang['Update photos information'] = 'Képek információinak frissítése';
+$lang['Synchronize'] = 'Szinkronizálás';
+$lang['reduce to single existing albums'] = 'Szűkítés egy már meglévő albumra';
+$lang['Choose an option'] = 'Válasszon az alábbi lehetőségek közül';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Összes információ megjelenítése (hozzáadott albumok és elemek, törölt albumok és elemek)';
+$lang['Error list'] = 'Hibalista';
+$lang['Errors caption'] = 'Címsor hiba';
+$lang['Detailed informations'] = 'Részletes információk';
+$lang['File/directory read error'] = 'Fájl/Mappa olvasási hiba';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'A fájl vagy mappa hozzáférhetetlen (vagy nem létezik, vagy hozzáférés megtagadva)';
+$lang['albums deleted in the database'] = 'album törölve az adatbázisból';
+$lang['photos deleted from the database'] = 'adatbázisból törölt elem';
+$lang['photos candidates for metadata synchronization'] = 'kép meta adatainak szinkronizálása';
+$lang['photos informations synchronized with files metadata'] = 'elem meta adatainak szinkronizálása';
+$lang['errors during synchronization'] = 'hiba történt a szinkronizálás során';
+$lang['albums added in the database'] = 'album hozzáadva az adatbázishoz';
+$lang['photos added in the database'] = 'elem hozzáadva az adatbázishoz';
+$lang['photos updated in the database'] = 'elem frissítve az adatbázisban';
+$lang['Search for new images in the directories'] = 'Új képek keresése a mappákban';
+$lang['added'] = 'hozzáadva';
+$lang['deleted'] = 'törölve';
+$lang['Metadata synchronization results'] = 'Meta adatok szinkronizálásának eredménye';
+$lang['only perform a simulation (no change in database will be made)'] = 'Csak szimuláció végrehajtása (az adatbázisban nem történik változás)';
+$lang['Simulation'] = 'Szimuláció';
+$lang['directories + files'] = 'Mappák + fájlok';
+$lang['only directories'] = 'Csak mappák';
+$lang['synchronize files structure with database'] = 'Fájlok-mappák szinkronizálása az adatbázissal';
+$lang['synchronize files metadata with database photos informations'] = 'Fájlok meta adatainak szinkronizálása az adatbázissal';
+$lang['even already synchronized photos'] = 'A korábban szinkronizáltakat is';
+$lang['Used metadata'] = 'Használt meta adatok';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'A könyvtár és fájlnevek betűket, számokat valamint "-", "_" vagy "." -ot tartalmazhatnak';
+$lang['wrong filename'] = 'rossz fájlnév';
+$lang['Upload'] = 'Feltöltés';
+$lang['user "%s" added'] = '"%s" felhasználó hozzáadva';
+$lang['User status'] = 'Felhasználói státusz';
+$lang['user_status_admin'] = 'Adminisztrátor';
+$lang['user_status_generic'] = 'Átlagos';
+$lang['user_status_guest'] = 'Vendég';
+$lang['user_status_normal'] = 'Felhasználó';
+$lang['user_status_webmaster'] = 'Webmester';
+$lang['Virtual album'] = 'Virtuális album';
+$lang['Waiting'] = 'Várakozó elemek';
+$lang['default'] = 'Alapértelmezett';
+$lang['Toggle \'default group\' property'] = '\'Alapértelmezett csoport\' tulajdonság megfordítása';
+$lang['Advanced features'] = 'Speciális funkciók';
+$lang['Overall'] = 'Teljes';
+$lang['Year'] = 'Év';
+$lang['Month'] = 'Hónap';
+$lang['Day'] = 'Nap';
+$lang['Pages seen'] = 'Megtekintett oldalak';
+$lang['Time'] = 'Idő';
+$lang['IP'] = 'IP cím';
+$lang['Element'] = 'Elem';
+$lang['Section'] = 'Szakasz';
+$lang['An information email was sent to group "%s"'] = 'Tájékoztató e-mailt küldtünk a következő csoportnak: "%s';
+$lang['Send an information email to group members'] = 'Küldjön egy információs e-mailt a csoport tagjainak';
+$lang['Group'] = 'Csoport';
+$lang['[%s] Visit album %s'] = '[%s] Új képek vannak az albumban %s';
+$lang['Hello,'] = 'Helló,';
+$lang['See you soon.'] = 'A mielőbbi viszont látásra.';
+$lang['Discover album:'] = 'Kövesse a linket és nézze meg a képeket az albumban:';
+$lang['Mail content'] = 'E-mail tartalma';
+$lang['none'] = 'nincs';
+$lang['high'] = 'magas';
+$lang['other'] = 'egyéb';
+$lang['Element type'] = 'Elem típus';
+$lang['Image id'] = 'Elem-ID';
+$lang['Summary'] = 'Összefoglaló';
+$lang['%d line filtered'] = '%d szűrt sor';
+$lang['%d lines filtered'] = '%d szűrt sor';
+$lang['%d guest'] = '%d vendég';
+$lang['%d guests'] = '%d vendég';
+$lang['Hour'] = 'Óra';
+$lang['guest'] = 'Vendég';
+$lang['default values'] = 'Alapértelmezett értékek';
+$lang['Guest cannot be deleted'] = 'A "vendég" felhasználót nem lehet törölni';
+$lang['Default user cannot be deleted'] = 'Alapértelmezett felhasználót nem lehet törölni';
+$lang['Purge history detail'] = 'Részletes előzmények törlése';
+$lang['Purge history summary'] = 'Összes előzmény törlése';
+$lang['Check integrity'] = 'integritás ellenőrzése';
+$lang['Anomaly'] = 'Rendellenesség';
+$lang['Correction'] = 'Hibajavítás';
+$lang['Automatic correction'] = 'Automatikus hibajavítás';
+$lang['Impossible automatic correction'] = 'Az automatikus hibajavítás nem lehetséges';
+$lang['Correction applied with success'] = 'A hibajavítás sikeres';
+$lang['Correction applied with error'] = 'A hibajavítás sikertelen';
+$lang['%d anomaly has been detected.'] = '%d rendellenességet mutatott ki.';
+$lang['%d anomalies have been detected.'] = '%d rendellenességet találtam.';
+$lang['%d anomaly has been corrected.'] = '%d rendellenesség javítva.';
+$lang['%d anomalies have been detected corrected.'] = '%d észlelt rendellenesség kijavítva.';
+$lang['%d anomaly has not been corrected.'] = '%d rendellenesség nem került javításra.';
+$lang['%d anomalies have not been corrected.'] = '%d észlelt rendellenesség javítása nem sikerült.';
+$lang['Go to %s or %s for more informations'] = 'Ugrás %s-ra vagy %s oldalra további információkért';
+$lang['the forum'] = 'a fórum';
+$lang['the wiki'] = 'a wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s érték helytelen, mert az EXIF nem támogatott';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s állítsa false értékre a local/config/config.inc.php fájlban';
+$lang['Main "guest" user does not exist'] = 'A "vendég" felhasználó nem létezik';
+$lang['Main "guest" user status is incorrect'] = 'A "vendég" felhasználó státusz hibás';
+$lang['Default user does not exist'] = 'Alapértelmezett felhasználó nem létezik';
+$lang['Main "webmaster" user does not exist'] = 'A "webmester" felhasználó nem létezik';
+$lang['Main "webmaster" user status is incorrect'] = 'A "webmester" felhasználó státusz hibás';
+$lang['User "%s" created with "%s" like password'] = '"%s" felhasználó által létrehozott jelszó: "%s"';
+$lang['Status of user "%s" updated'] = '"%s" felhasználói státuszának aktualizálása';
+$lang['add new photos to caddie'] = 'Az új elemeket gyűjtse a kosárba';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = 'Nincs kijelzés';
+$lang['Classic display'] = 'Hagyományos nézet';
+$lang['Hoverbox display'] = 'Hoverbox nézet';
+$lang['Mail address is obligatory for all users'] = 'Az e-mail cím kötelező minden felhasználó számára';
+$lang['Minimum privacy level'] = 'Minimum hozzáférési szint';
+$lang['Privacy level'] = 'Hozzáférési szint';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kapcsolattartók';
+$lang['Level 2'] = 'Barátok';
+$lang['Level 4'] = 'Család';
+$lang['Level 8'] = 'Adminisztrátor';
+$lang['Reinitialize check integrity'] = 'Integritások felülvizsgálata, Újrainicializálás';
+$lang['Check all'] = 'Összes kijelölése';
+$lang['Uncheck all'] = 'Összes kijelölés megszüntetése';
+$lang['Check automatic corrections'] = 'Automatikus hibajavítás a kijelölteken';
+$lang['Apply selected corrections'] = 'A kiválasztott hibajavítás alkalmazása';
+$lang['Ignore selected anomalies'] = 'Hagyja figyelmen kívül a kijelölt rendellenességeket';
+$lang['Refresh'] = 'Frissítés';
+$lang['The anomaly will be ignored until next application version'] = 'A rendellenesség figyelmen kívül hagyva a következő verzió alkalmazásáig';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Korrigált rendellenesség, már nem lehet figyelmen kívül hagyni';
+$lang['%d anomaly has been ignored.'] = '%d rendellenességet hagytunk figyelmen kívül.';
+$lang['%d anomalies have been ignored.'] = '%d rendellenesség figyelmen kívül hagyva.';
+$lang['Plugins which need upgrade'] = 'Az alábbi bővítményekhez frissítés érhető el';
+$lang['Plugin list'] = 'Bővítmény lista';
+$lang['Check for updates'] = 'Frissíthető';
+$lang['Other plugins'] = 'Telepíthető bővítmények';
+$lang['Last revisions'] = 'Utolsó módosítás';
+$lang['Are you sure you want to install this plugin?'] = 'Biztos, hogy telepíteni akarja a bővítményt?';
+$lang['Are you sure you want to delete this plugin?'] = 'Biztos, hogy törölni akarja a bővítményt?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Biztos, hogy telepíteni akarja a frissítést? Győződjön meg arról, hogy a korábbi verzió eltávolítható.';
+$lang['Plugin has been successfully copied'] = 'A bővítmény másolása sikeres.';
+$lang['You might go to plugin list to install and activate it.'] = 'Lépjen a "Bővítmény lista" menüpontra és aktiválja.';
+$lang['Can\'t create temporary file.'] = 'Temp fájl nem hozható létre .';
+$lang['Can\'t download archive.'] = 'Nem sikerült letölteni az Archívumot.';
+$lang['Can\'t read or extract archive.'] = 'Nem sikerült olvasni vagy kicsomagolni az Archívumot.';
+$lang['An error occured during extraction (%s).'] = 'Nem sikerült kitömöríteni az Archívumot(%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Ellenőrizze a "Plugins" mappa és az almappák jogosultságait (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Nem sikerült csatlakozni a szerverhez.';
+$lang['Purge compiled templates'] = 'Összeállított sablonok törlése';
+$lang['Support'] = 'Támogatás';
+$lang['Documentation'] = 'Dokumentációk';
+$lang['ACCESS_0'] = 'Ingyenes hozzáférés';
+$lang['ACCESS_1'] = 'Mindenki';
+$lang['ACCESS_2'] = 'Regisztráltak';
+$lang['ACCESS_3'] = 'Adminisztrátorok';
+$lang['ACCESS_4'] = 'Webmester';
+$lang['ACCESS_5'] = 'Nincs hozzáférés';
+$lang['A new version of Piwigo is available.'] = 'Új Piwigo verzió érhető el.';
+$lang['Piwigo Administration'] = 'Piwigo adminisztráció';
+$lang['Piwigo version'] = 'Piwigo verzió';
+$lang['You are running the latest version of Piwigo.'] = 'A legújabb verziójú Piwigo fut.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Jelenleg a %s [%s] verzió van telepítve, mely nem kompatibilis ezzel: [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Frissíteni kell a rendszert az alkalmazás adta lehetőségek teljes kihasználásához, ellenkező esetben az alkalmazás hibásan, vagy egyáltalán nem működik';
+$lang['Deleted on'] = 'Törölve a ';
+$lang['Last hit'] =  'Utolsó találat';
+$lang['GD library is missing'] = 'GD könyvtár hiányzik';
+$lang['Templates'] = 'Témák (Sablonok)';
+$lang['Extend for templates'] = 'Kiterjesztett témák';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Az eredeti sablon helyettesítése almappákra';
+$lang['Replacers (customized templates)'] = 'Módosított (testre-szabott) sablonok';
+$lang['Original templates'] = 'Eredeti sablonok';
+$lang['Optional URL keyword'] = 'Opcionális URL szerint';
+$lang['Templates configuration has been recorded.'] = 'Sablon konfiguráció rögzítve.';
+$lang['All optimizations have been successfully completed.'] = 'Minden optimalizálás sikeres.';
+$lang['Optimizations have been completed with some errors.'] = 'Néhány hiba fordult elő az optimalizáláskor.';
+$lang['Modify information'] = 'Információk módosítása';
+$lang['nothing'] = 'Nem';
+$lang['overrides existing values with empty ones'] = 'Felülírja a meglévő üres értékeket';
+$lang['Manage photo ranks'] = 'Kép rangok kezelése';
+$lang['Edit ranks'] = 'Rangok módosítása';
+$lang['No photo in this album'] = 'Nincs elem ebben az albumban';
+$lang['Images manual order was saved'] = 'Kép információk mentve';
+$lang['ranks'] = 'Rangok';
+$lang['Drag to re-order'] = 'Húzással átrendezheti';
+$lang['Quick Local Synchronization'] = 'Szinkronizálás';
+$lang['No photo can be deleted'] = 'Nincs törölhető kép';
+$lang['Delete selected photos'] = 'Kijelölt képek törlése';
+$lang['%d photo was deleted'] = '%d kép törölve';
+$lang['%d photos were deleted'] = '%d kép törölve';
+$lang['Released on'] = 'Felszabadítva';
+$lang['Number of downloads'] = 'Letöltések száma';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Hirdetmények Hírlevél';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Tartsa a kapcsolatot Piwigo projekttel, iratkozzon fel a Piwigo Hírlevélre. Levélben értesítjük ha újabb kiadás érhető el, (beleértve a biztonsági hibák javítását, valamint a frissítéseket) valamint ha nagyobb esemény történik a projektben. Csak néhány levél évente.';
+$lang['Subscribe %s'] = 'Feliratkozás %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Feliratkozás %s e-mail címmel a Piwigo hirdetésekre, hírlevelekre';
+$lang['Purge search history'] = 'Keresési előzmények törlése';
+$lang['Hide'] = 'Elrejt';
+$lang['Cannot delete the old permalink !'] = 'A régi közvetlen link nem törölhető !';
+$lang['Deleted on'] = 'Törölve';
+$lang['Last hit'] = 'Utolsó használat';
+$lang['Hit'] = 'Alkalommal';
+$lang['Password is missing. Please enter the password.'] = 'Jelszó hiányzik. Kérem írja be a jelszót.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Jelszó megerősítése hiányzik. Kérem erősítse meg a választott jelszót.';
+$lang['Allow users to edit their own comments'] = 'A felhasználók módosíthatják a hozzászólásaikat';
+$lang['Allow users to delete their own comments'] = 'A felhasználók törölhetik a hozzászólásaikat';
+$lang['Email administrators when a comment is modified'] = 'Email az adminisztrátornak, ha egy hozzászólást módosítottak';
+$lang['Email administrators when a comment is deleted'] = 'Email az adminisztrátornak, ha egy hozzászólást töröltek';
+$lang['Upload Photos'] = 'Képek feltöltése';
+$lang['Drop into album'] = 'Album választás:';
+$lang['+ Add an upload box'] = '+ További képek feltöltése...';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = '"%s" könyvtár létrehozása a telepített Piwigo galériában.';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Adjon írási jogot (chmod 777) a(z) "%s" gyökerének a telepített Piwigo galériában';
+$lang['existing album'] = 'létező album';
+$lang['create a new album'] = ' új album létrehozása';
+$lang['Album name'] = 'Album neve';
+$lang['Album "%s" has been added'] = '\'%s\' album hozzáadva';
+$lang['Uploaded Photos'] = 'Feltöltött képek';
+$lang['%d photos uploaded'] = '%d kép feltöltve';
+$lang['Privacy level set to "%s"'] = 'Minimum hozzáférési szint itt: "%s"';
+$lang['Album "%s" now contains %d photos'] = '\'%s\' albumban már %d kép található';
+$lang['Manage this set of %d photos'] = 'Szerkessze a készlet (%d elem) képeit';
+$lang['Select files'] = 'Képek kiválasztása';
+$lang['Everybody'] = 'Mindenki';
+$lang['Who can see these photos?'] = 'Ki láthatja a képeket?';
+$lang['Settings'] = 'Képméret beállítás';
+$lang['Resize'] = 'Átméretezés';
+$lang['Maximum Width'] = 'Legnagyobb szélesség';
+$lang['pixels'] = 'pixel';
+$lang['Maximum Height'] = 'Legnagyobb magasság';
+$lang['Image Quality'] = 'Kép minőség';
+$lang['Thumbnail'] = 'Bélyegkép';
+$lang['Save Settings'] = 'Beállítások mentése';
+$lang['Your configuration settings are saved'] = 'A beállítások mentése sikeres';
+$lang['Unable to check for upgrade.'] = 'A frissítés sikertelen.';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Időtúllépés esetén a műveletet folytatni kell [Becsült idő: %d másodperc].';
+$lang['Operation in progress'] = 'Feldolgozás.';
+$lang['Please wait...'] = 'Kérem várjon...';
+$lang['Tools'] = 'Eszközök';
+$lang['Photos'] = 'Képek';
+$lang['Themes'] = 'Témák';
+$lang['Instructions to use Piwigo'] = 'A Piwigo használata';
+$lang['Installed Themes'] = 'Telepített témák';
+$lang['Add New Theme'] = 'Új téma hozzáadása';
+$lang['Forbid this theme to users'] = 'A téma tiltása felhasználók részére';
+$lang['Set as default theme for unregistered and new users'] = 'Téma beállítása alapértelmezettként nem regisztrált és új felhasználók részére';
+$lang['unknown'] = 'ismeretlen';
+$lang['Active Themes'] = 'Aktív témák';
+$lang['Add write access to the "%s" directory'] = 'Adjon írási jogot a(z) "%s" könyvtárnak';
+$lang['Administration Home'] = 'Adminisztrációs oldal';
+$lang['Change Admin Colors'] = 'Adminisztrációs oldal színe';
+$lang['Delete this theme'] = 'Téma törlése';
+$lang['Directory does not exist'] = 'Könyvtár nem található';
+$lang['FTP + Synchronization'] = 'FTP + Szinkronizálás';
+$lang['Get Support on Piwigo Forum'] = 'Támogatást kap a Piwigo fórumon';
+$lang['Help Me'] = 'Segítség';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ez a téma nem aktiválható, mert a szülő téma nem létezik: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ez a téma nem törölhető, mert egy másik téma függ tőle: %s';
+$lang['Inactive Themes'] = 'Inaktív témák';
+$lang['Install on your computer,'] = 'Telepítse számítógépére,';
+$lang['Make this theme available to users'] = 'A téma elérhetővé tétele a felhasználók számára';
+$lang['Page end'] = 'Oldal vége';
+$lang['Piwigo Uploader'] = 'Piwigo Feltöltő';
+$lang['Read Piwigo Documentation'] = 'A Piwigo Dokumentációját itt érheti el';
+$lang['Start pLoader and add your photos.'] = 'Indítsa el a pLoader programot és töltse fel képeit.';
+$lang['Switch to clear or dark colors for administration'] = 'Átváltás a világos és sötét szín között';
+$lang['Theme has been successfully installed'] = 'A téma telepítése sikeresen megtörtént';
+$lang['Visit Gallery'] = 'Galéria megtekintése';
+$lang['Visit Piwigo project website'] = 'Ugrás a Piwigo projekt hivatalos oldalára';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'A pLoader a <em>Piwigo Uploader</em> rövidítése. A pLoader segítségével elvégezheti számítógépén a képek előkészítését, majd feltöltheti azokat a Piwigo galériájába.';
+$lang['Guest Settings'] = 'Vendég beállításai';
+$lang['Main Page'] = 'Főoldal';
+$lang['Photo Page'] = 'Kép oldal';
+$lang['Activate Navigation Bar'] = 'Navigációs sáv bekapcsolása';
+$lang['Activate Navigation Thumbnails'] = 'Navigációs bélyegképek bekapcsolása';
+$lang['Activate icon "%s"'] = 'Ikon bekapcsolása "%s"';
+$lang['Photo Properties'] = 'Kép tulajdonságok';
+$lang['Allow user customization'] = 'Testreszabás engedélyezése a felhasználóknak';
+$lang['Languages'] = 'Nyelvek';
+$lang['Installed Languages'] = 'Telepített nyelvek';
+$lang['Add New Language'] = 'Új nyelv hozzáadása';
+$lang['Language has been successfully installed'] = 'A nyelv telepítése sikeresen megtörtént';
+$lang['Select:'] = 'Kiválaszt:';
+$lang['None'] = 'Egyik sem';
+$lang['Invert'] = 'Felcserél';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Nem lehet kikapcsolni ezt a témát, szükség van legalább még egy aktív témára.';
+$lang['Webmaster status is required.'] = 'Webmester jogosultság szükséges.';
+$lang['Bound Theme'] = 'Fix Téma';
+$lang['Allow rating'] = 'Értékelés engedélyezése';
+$lang['Select at least one comment'] = 'Legalább egy hozzászólást ki kell választani';
+$lang['Active Plugins'] = 'Bekapcsolt bővítmények';
+$lang['Inactive Plugins'] = 'Kikapcsolt Bővítmények';
+$lang['Missing Plugins'] = 'Hiányzó bővítmények';
+$lang['Uninstalled Plugins'] = 'Törölt bővítmények';
+$lang['By %s'] = 'Szerző: %s';
+$lang['Visit plugin site'] = 'Ugrás a bővítmények weboldalra';
+$lang['Active Languages'] = 'Bekapcsolt nyelvek';
+$lang['Delete this language'] = 'Nyelv törlése';
+$lang['Forbid this language to users'] = 'A nyelv tiltása';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Ezt a nyelvet jelenleg nem lehet kikapcsolni, előbb válasszon egy másik nyelvet alapértelmezettnek.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Ezt a nyelvet jelenleg nem lehet kikapcsolni, legalább egy nyelvre szükség van.';
+$lang['Inactive Languages'] = 'Kikapcsolt nyelvek';
+$lang['Make this language available to users'] = 'A nyelv engedélyezése';
+$lang['Set as default language for unregistered and new users'] = 'Nyelv beállítása alapértelmezettként nem regisztrált és új felhasználók részére';
+$lang['Add Photos'] = 'Képek hozzáadása';
+$lang['The following tag was deleted'] = 'Címke törlése sikeres';
+$lang['Miscellaneous'] = 'Egyéb';
+$lang['Virtual Links'] = 'Virtuális linkek';
+$lang['There is no other language available.'] = 'Egyéb nyelv nem áll rendelkezésre.';
+$lang['There is no other plugin available.'] = 'Egyéb bővítmény nem áll rendelkezésre.';
+$lang['There is no other theme available.'] = 'Egyéb téma nem áll rendelkezésre.';
+$lang['Add another set of photos'] = 'További kép hozzáadása';
+$lang['By rank'] = 'Értékelés szerint';
+$lang['Manual order'] = 'Kézi rendezés';
+$lang['Order of menubar items has been updated successfully.'] = 'A menüsor elemei sikeresen frissítve.';
+$lang['This theme was not designed to be directly activated'] = 'Ezt a témát úgy tervezték, hogy közvetlenül nem aktiválható';
+$lang['Pending Comments'] = 'Hozzászólások (függőben)';
+$lang['Who can see this photo?'] = 'Ki láthatja ezt a képet?';
+$lang['Menu Management'] = 'Menü';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'A php.ini fájlban az upload_max_filesize (% sB) nagyobb, mint a post_max_size (% sB), módosítania kell a beállítást';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif-kiterjesztés nem érhető el, az adminisztrátor tiltsa le az exif használatát';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'A feltöltendő fájl meghaladja a php.ini-ben megadott upload_max_filesize értéket: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'A feltöltendő fájlok meghaladják a php.ini-ben megadott post_max_size értéket: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'A feltöltendő fájl meghaladja a HTML formában megadott MAX_FILE_SIZE értéket';
+$lang['The uploaded file was only partially uploaded'] = 'A feltöltendő fájl csak részben töltődött fel';
+$lang['No file was uploaded'] = 'A feltöltés sikertelen';
+$lang['Missing a temporary folder'] = 'Hiányzik a temporary mappa';
+$lang['Failed to write file to disk'] = 'Nem sikerült a fájlt a lemezre írni';
+$lang['File upload stopped by extension'] = 'Fájlfeltöltést leállította a kiterjesztés';
+$lang['Unknown upload error'] = 'Ismeretlen feltöltési hiba';
+$lang['Error on file "%s" : %s'] = 'Hibás a fájl "%s" : %s';
+$lang['automatic order'] = 'Automatikus rendezés';
+$lang['manual order'] = 'Kézi rendezés';
+$lang['Albums automatically sorted'] = 'Automatikusan rendezett albumok';
+$lang['Batch Manager'] = 'Kötegelt kezelés';
+$lang['include child albums'] = 'belső albumok is';
+$lang['Selection'] = 'Kiválasztás';
+$lang['Action'] = 'Művelet';
+$lang['Set author'] = 'Szerző hozzáadása';
+$lang['Set title'] = 'Cím hozzáadása';
+$lang['Set creation date'] = 'Készítés dátumának hozzáadása';
+$lang['Apply action'] = 'Művelet végrehajtása';
+$lang['on the %d selected photos'] = 'a kiválasztott %d képen';
+$lang['%d of %d photos selected'] = '%d kép kiválasztva, összes kép %d';
+$lang['No photo selected, %d photos in current set'] = 'Nincs kép kiválasztva, összes kép %d';
+$lang['All %d photos are selected'] = 'Összes, %d kép kiválasztva';
+$lang['remove this filter'] = 'a szűrő eltávolítása';
+$lang['Duplicates'] = 'Duplikált';
+$lang['Add a filter'] = 'Szűrő hozzáadása';
+$lang['Remove all filters'] = 'Összes szűrő törlése';
+$lang['Refresh photo set'] = 'Képek frissítése';
+$lang['The whole page'] = 'Összes kép az oldalon';
+$lang['The whole set'] = 'A teljes képkészlet';
+$lang['No photo in the current set.'] = 'Nem található a feltételnek megfelelő kép.';
+$lang['No photo selected, no action possible.'] = 'Nincs kép kiválasztva, nem lehet műveletet végezni.';
+$lang['Choose an action'] = 'Művelet kiválasztása';
+$lang['remove author'] = 'szerző törlése';
+$lang['Type here the author name'] = 'Írja be a szerző nevét';
+$lang['remove title'] = 'cím törlése';
+$lang['Type here the title'] = 'Írja be a kép címét';
+$lang['remove creation date'] = 'készítés időpontjának törlése';
+$lang['Album photos associated to the following albums: %s'] = 'Az albumban lévő képek hozzárendelve a következő albumokhoz: %s';
+$lang['Delete orphan tags'] = 'Árva címkék törlése';
+$lang['delete photo'] = 'Kép törlése';
+$lang['Orphan tags deleted'] = 'Árva címkék törölve';
+$lang['Week starts on'] = 'A hét első napja';
+$lang['You have %d orphan tags: %s.'] = '%d árva címke található: %s.';
+$lang['Remove from caddie'] = 'Eltávolítás a kosárból';
+$lang['Themes which need upgrade'] = 'Frissítést igénylő témák';
+$lang['Languages which need upgrade'] = 'Frissítést igénylő nyelvek';
+$lang['All themes are up to date.'] = 'Minden téma naprakész.';
+$lang['All plugins are up to date.'] = 'Minden bővítmény naprakész.';
+$lang['All languages are up to date.'] = 'Minden nyelv naprakész.';
+$lang['Visit theme site'] = 'Téma oldal meglátogatása';
+$lang['Visit language site'] = 'Nyelv oldal meglátogatása';
+$lang['New Version'] = 'Új verzió';
+$lang['Obsolete Plugins'] = 'Elavult bővítmények';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'FIGYELEM! Ez a bővítmény nem kompatibilis a Piwigo jelenleg futó verziójával.';
+$lang['Do you want to activate anyway?'] = 'Aktiváljuk mindenképp?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'EZ A BŐVÍTMÉNY MÁR BE VAN ÉPÍTVE A PIWIGO RENDSZERBE! ELTÁVOLÍTANDÓ!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'HIBA: EZ A BŐVÍTMÉNY NEM ELÉRHETŐ, DE TELEPÍTVE VAN! ELTÁVOLÍTANDÓ!';
+$lang['display'] = 'kijelző';
+$lang['Thumbnails generation in progress...'] = 'Bélyegképek generálása folyamatban...';
+$lang['new'] = 'új';
+$lang['No results'] = 'Nincs találat';
+$lang['Searching...'] = 'Keresés...';
+$lang['Type in a search term'] = 'Írja be a keresett kifejezést';
+// missing translations
+$lang['Deactivate all'] = 'Összes kikapcsolása';
+$lang['Restore'] = 'Visszaállítás';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Alapértelmezett beállítások visszaállítása. Figyelem, a bővítmény módosításai elvesznek!';
+$lang['Show menubar'] = 'Menüsáv megjelenítése';
+$lang['Photos generation in progress...'] = 'Képek újragenerálása folyamatban...';
+$lang['%s photos have been regenerated'] = '%s kép újragenerálva';
+$lang['%s photos can not be regenerated'] = '%s képet nem lehet újragenerálni';
+$lang['Updates'] = 'Frissítések';
+$lang['Update in progress... Please wait.'] = 'Frissítés folyamatban... Kérem várjon.';
+$lang['Ignore this update'] = 'Hagyja figyelmen kívül';
+$lang['Reset ignored updates'] = 'Mellőzés törlése';
+$lang['Update All'] = 'Összes frissítése';
+$lang['ERROR'] = 'HIBA';
+$lang['Update Complete'] = 'Frissítés kész';
+$lang['Piwigo Update'] = 'Piwigo frissítés';
+$lang['Extensions Update'] = 'Bővítmény frissítés';
+$lang['All extensions are up to date.'] = 'Az összes bővítmény naprakész.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'A következő bővítmények nem kompatibilisek az új Piwigo verzióval:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'A következő témák nem kompatibilisek az új Piwigo verzióval:';
+$lang['I decide to update anyway'] = 'Határozhat úgy, hogy frissít mindenképp';
+$lang['Update to Piwigo %s'] = 'Frissítés a Piwigo %s verziójára';
+$lang['Two updates are available'] = 'Kétféle frissítés érhető el';
+$lang['This is a minor update, with only bug corrections.'] = 'Egy kisebb frissítés, kizárólag hibajavítás.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Egy jelentős frissítés, <a href="%s">új, kibővített funkciókkal</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Lehet, hogy néhány téma és bővítmény még nem áll rendelkezésre.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Lehetőség van közvetlenül frissíteni a Piwigo %s verziójára, kihagyva a Piwigo %s verzióját (ajánlott).';
+$lang['Save Template Directory'] = 'Template könyvtár mentése';
+$lang['Dump Database'] = 'Adatbázis mentése';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Előzmények mentése (Figyelem: lehet, hogy a szerver beállított memória limitjét túllépi)';
+$lang['Unable to dump database.'] = 'Nem lehet biztonsági másolatot készíteni az adatbázisról.';
+$lang['Some upgrades are available for extensions.'] = 'Frissítéseket találtam egyes kiterjesztésekhez.';
+$lang['Ignore All'] = 'Összes mellőzése';
+$lang['Crop'] = 'Körbevágás';
+$lang['Width'] = 'Szélesség';
+$lang['Height'] = 'Magasság';
+$lang['Follow Orientation'] = 'Elforgatható';
+$lang['Graphics Library'] = 'Grafikus könyvtár';
+$lang['Activate icon "new" next to albums and pictures'] = '"új" ikon aktiválása az albumok és képek mellett';
+$lang['Default photos order'] = 'Alapértelmezett kép sorrend';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Az alapértelmezett kép sorrend nem határozható meg a helyi konfigurációban található egyéni beállítás miatt.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'A helyi konfigurációs fájlban lévő <i>$conf[\'order_by\']</i> paraméter elavult, távolítsa el, vagy nevezze át <i>$conf[\'order_by_custom\']</i>-ra !';
+$lang['Add a criteria'] = 'Feltétel hozzáadása';
+$lang['Average rate'] = 'Átlagos pontszám';
+$lang['Rate'] = 'Érték';
+$lang['... or '] = '... vagy';
+$lang['Create'] = 'Létrehoz';
+$lang['Start Upload'] = 'Feltöltés indítása';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Jelenleg a Flash alapú feltöltőt használja. Ha problémát észlel váltson át a <a href="%s">Böngésző alapú feltöltésre</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Jelenleg a Böngésző alapú feltöltőt használja. Próbálja ki a <a href="%s">Flash alapú feltöltőt</a>.';
+$lang['Maximum file size: %sB.'] = 'Maximális fájlméret: %sB.';
+$lang['Allowed file types: %s.'] = 'Engedélyezett fájltípusok: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Becsült maximális felbontás: %dMpixel (%dx%d pixel).';
+$lang['Manage Permissions'] = 'Jogosultságok kezelése';
+$lang['Photo %s of %s'] = '%s kép feltöltése, összes kép %s';
+$lang['show details'] = 'részletek megjelenítése';
+$lang['hide details'] = 'részletek elrejtése';
+$lang['Merge tags'] = 'Címkék összevonása';
+$lang['Select the destination tag'] = 'Válassza ki a kívánt címkét';
+$lang['(this tag will be deleted)'] = '(ez a címke törlésre kerül)';
+$lang['Confirm merge'] = 'Összevonás megerősítése';
+$lang['Merge selected tags'] = 'Kiválasztott címkék összevonása';
+$lang['No destination tag selected'] = 'Nincs kijelölt címke';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '<em>%s</em> címke (címkék) összevonva a(z) <em>%s</em> címkével';
+$lang['Select at least two tags for merging'] = 'Válasszon ki legalább két címkét';
+$lang['Learn more'] = 'Bővebben';
+$lang['Select an album'] = 'Válasszon ki egy albumot';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Alapértelmezésben a Piwigo a HD (high definition) képből létrehoz egy web méretű képet.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Amennyiben nincs HD kép és a rendelkezésre álló web méretű kép nagyobb mint az aktuális átméretezett kép méretek, a jelenlegi képet a rendszer átmozgatja HD képnek és létrehoz egy új web méretű képet.';
+$lang['An error has occured during upgrade.'] = 'Hiba történt frissítés közben.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Hibajelentés (Információ). Kérjük ellenőrizze a telepített fájlok jogosultságait.<br><a href="%s">További információkért kattintson ide</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Nem tudom letölteni a frissítést a Piwigo fájl szerverről';
+$lang['Zoom'] = 'Zoom';
+$lang['Downloads'] = 'Letöltés';
+$lang['Photo name'] = 'Képnév';
+$lang['Download,'] = 'Letöltés,';
+$lang['Activate comments'] = 'Hozzászólások aktiválása';
+$lang['Original Size'] = 'Eredeti méret';
+$lang['Resize after upload'] = 'Feltöltés után átméretezés';
+$lang['Send connection settings by email'] = 'Kapcsolat beállításainak küldése e-mailben';
+$lang['The original image quality must be a number between %d and %d'] = 'Az eredeti kép minősége %d és %d között lehet';
+$lang['The original maximum height must be a number between %d and %d'] = 'Az eredeti magasság %d és %d között lehet';
+$lang['The original maximum width must be a number between %d and %d'] = 'Az eredeti szélesség %d és %d között lehet';
+$lang['Default comments order'] = 'Alapértelmezett hozzászólás-rend';
+$lang['administrators'] = 'adminisztrátorok';
+$lang['registered users'] = 'regisztrált felhasználók';
+$lang['Save visits in history for'] = 'Látogatások előzményeinek mentése';
+$lang['simple visitors'] = 'egyszerű látogatók';
+$lang['A locked gallery is only visible to administrators'] = 'A lezárt galériát csak az adminisztrátorok láthatják';
+$lang['Gallery unlocked'] = 'Galéria feloldva';
+$lang['Notify administrators when a comment is'] = 'Adminisztrátor értesítése hozzászólás érkezésekor';
+$lang['Unlock gallery'] = 'Galéria lezárásának feloldása';
+$lang['modified'] = 'módosítva';
+$lang['pending validation'] = 'jóváhagyásra váró';
+$lang['This album contains no photo.'] = 'Ez az album nem tartalmaz képeket.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Az albumban %d kép található. Feltöltés időpontja: %s és %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Az albumban %d kép található. Feltöltés időpontja: %s.';
+$lang['%s has been successfully updated.'] = '%s frissítése sikeres';
+$lang['Applications'] = 'Alkalmazások';
+$lang['apply automatic sort order'] = 'automatikus rendezés alkalmazása';
+$lang['Automatic sort order'] = 'Automatikus rendezés';
+$lang['Cancel'] = 'Mégse';
+$lang['List'] = 'Lista';
+$lang['Move to album'] = 'Áthelyezés másik albumba';
+$lang['Web Form'] = 'Webes űrlap';
+$lang['Add tags'] = 'Címkék hozzáadása';
+$lang['Add to caddie'] = 'Kosárba tesz';
+$lang['Last import'] = 'Utolsó import';
+$lang['Predefined filter'] = 'Előre definiált szűrők';
+$lang['With no album'] = 'Nem albumban';
+$lang['With no tag'] = 'Nem címkézett';
+$lang['With no virtual album'] = 'Nem virtuális albumban';
+$lang['Center of interest'] = 'Fókuszban';
+$lang['custom'] = 'Egyéni';
+$lang['Delete multiple size images'] = 'Eltérő méretű képek törlése';
+$lang['Generate multiple size images'] = 'Eltérő méretű képek létrehozása';
+$lang['any visitor can see this album'] = 'mindenki láthatja az albumot';
+$lang['Groups and users'] = 'Csoportok és felhasználók';
+$lang['Permission granted for groups'] = 'Engedéllyel rendelkező csoportok';
+$lang['Permission granted for users'] = 'Engedéllyel rendelkező felhasználók';
+$lang['Select groups...'] = 'Csoportok kiválasztása...';
+$lang['Select users...'] = 'Felhasználók kiválasztása...';
+$lang['There is no group in this gallery.'] = 'Nincs csoport ebben a galériában.';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'a látogatóknak be kell jelentkezniük és megfelelő engedéllyel kell rendelkezniük az album megtekintéséhez';
+$lang['Apply watermark if height is bigger than'] = 'Vízjel alkalmazása, ha a magasság nagyobb mint';
+$lang['Apply watermark if width is bigger than'] = 'Vízjel alkalmazása, ha a szélesség nagyobb mint';
+$lang['bottom left corner'] = 'bal alsó sarokban';
+$lang['bottom right corner'] = 'jobb alsó sarokban';
+$lang['middle'] = 'középen';
+$lang['Opacity'] = 'Áttetszőség';
+$lang['Permission management'] = 'Engedélyek kezelése';
+$lang['Select a file'] = 'Válasszon ki egy fájlt';
+$lang['top left corner'] = 'bal felső sarokban';
+$lang['top right corner'] = 'jobb felső sarokban';
+$lang['X Position'] = 'X pozíció';
+$lang['X Repeat'] = 'X ismétlődés';
+$lang['Y Position'] = 'Y pozíció';
+$lang['Available on'] = 'Elérhető';
+$lang['Available versions for'] = 'Elérhető verziók';
+$lang['add a new watermark'] = 'új vízjel hozzáadása';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'A <em>Piwigo for Android</em> alkalmazás segítségével csatlakozhat Piwigo galériájához telefonjával vagy táblagépével, létrehozhat új albumokat, feltölthet képeket (egyszerre akár többet is) képgalériájába.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'A <em>Piwigo for iOS</em> alkalmazás segítségével csatlakozhat Piwigo galériájához iPhone, iPad vagy iPod Touch eszközével, létrehozhat új albumokat, feltölthet képeket (egyszerre akár többet is) képgalériájába.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Az Adobe Photoshop Lightroom egy képkezelő program, melyet nagy mennyiségű digitális kép utómunkálataihoz és kezeléséhet terveztek.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Jellemzői: galéria böngészés, album létrehozás, képek feltöltése.';
+$lang['Multiple Size'] = 'Képméretek';
+$lang['No group is permitted to see this private album'] = 'Nincs engedélyezett csoport a privát albumhoz';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Egyszerűen telepítheti a Linux csomagkezelője segítségével, majd könnyedén beállíthatja Piwigo galériájának eléréséhez.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Lightroom feltöltő';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo iPhoto feltöltő';
+$lang['Piwigo for Android'] = 'Piwigo Androidon';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo iOS-en (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo Shotwell feltöltő';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo digiKam feltöltő';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'A ReGalAndroid (RemoteGallery kliens Androidra) egy nyílt forráskódú (GPL v3) Piwigo kliens Android platformra.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'A Shotwell egy nyílt forráskódú képszerkesztő, melyet Linux alapú rendszerekhez terveztek. Alapértelmezett szerkesztő Ubuntun és Fedoran.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'A Piwigo export bővítmény lehetővé teszi albumok, képek feltöltését.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'A Piwigo publish Plug-in lehetőséget biztosít arra, hogy a Lightroom program segítségével töltsön fel képeket, szinkronizálja képeit Piwigo galériájába.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Ahhoz, hogy Piwigo rendszerébe exportálhassa fotóit a digiKam segítségével, telepítenie kell a Kipi-plugins bővítményt.';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'A digiKam egy fejlett, ingyenes képkezelő program Linux, Windows és MacOSX alá.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'A digiKam programot fotósoknak tervezték, megtekintheti, kezelheti, szerkesztheti, javíthatja, rendszerezheti, címkézheti és megoszthatja képeit.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'Az iPhoto a MacOSX rendszer alapértelmezett képszerkesztője. A Piwigo feltöltő modul segítségével létrehozhat új albumokat és feltöltheti képeit a Piwigo galériába.';
+?>
Index: tags/2.4.0RC3/language/hu_HU/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/common.lang.php	(revision 14585)
@@ -0,0 +1,411 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Magyar [HU]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=423
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Magyar';
+$lang_info['country'] = 'Hungary';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'hu';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Kbájt';
+$lang['%d album updated'] = '%d album frissítés';
+$lang['%d albums updated'] = '%d album frissítve';
+$lang['%d comment to validate'] = '%d hozzászólás engedélyezve';
+$lang['%d comments to validate'] = '%d hozzászólás vár engedélyezésre';
+$lang['%d new comment'] = '%d új hozzászólás';
+$lang['%d new comments'] = '%d új hozzászólás';
+$lang['%d comment'] = '%d hozzászólás';
+$lang['%d comments'] = '%d hozzászólás';
+$lang['%d hit'] = '%d találat';
+$lang['%d hits'] = '%d találat';
+$lang['%d new photo'] = '%d új elem';
+$lang['%d new photos'] = '%d új elem';
+$lang['%d new user'] = '%d új felhasználó';
+$lang['%d new users'] = '%d új felhasználó';
+$lang['%d rates'] = "%d értékelés";
+$lang['About'] = 'Impresszum';
+$lang['All tags'] = 'Összes címke';
+$lang['Any tag'] = 'Bármely címke';
+$lang['At least one listed rule must be satisfied.'] = 'Az alábbiakból legalább egy feltételnek teljesülni kell.';
+$lang['Author'] = 'Szerző';
+$lang['Albums'] = 'Albumok';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Ablak bezárása';
+$lang['Complete RSS feed (photos, comments)'] = 'Teljes RSS (képek, hozzászólások)';
+$lang['Confirm Password'] = 'Jelszó megerősítése';
+$lang['Connection settings'] = 'Kapcsolat beállításai';
+$lang['Login'] = 'Bejelentkezés';
+$lang['Contact webmaster'] = 'Levél a Webmesternek!';
+$lang['Create a new account'] = 'Új regisztráció';
+$lang['Created on'] = 'Létrehozva';
+$lang['Creation date'] = 'Létrehozás dátuma';
+$lang['Current password is wrong'] = 'Hibás jelszó';
+$lang['Dimensions'] = 'Képméret';
+$lang['Display'] = 'Megjelenítés';
+$lang['Each listed rule must be satisfied.'] = 'Az alábbi feltételek mindegyikének meg kell felelni.';
+$lang['Email address is missing. Please specify an email address.'] = 'Hiányzó e-mail cím';
+$lang['Email address'] = 'E-mail cím';
+$lang['Enter your personnal informations'] = 'Saját adatok megadása';
+$lang['Error sending email'] = 'E-mail küldése sikertelen';
+$lang['File name'] = 'Fájlnév';
+$lang['File'] = 'Fájl';
+$lang['Filesize'] = 'Fájlméret';
+$lang['Filter and display'] = 'Szűrő megjelenítés';
+$lang['Filter'] = 'Szűrő';
+$lang['Forgot your password?'] = 'Elfelejtette a jelszavát?';
+$lang['Go through the gallery as a visitor'] = 'Megtekintés látogatóként';
+$lang['Help'] = 'Segítség';
+$lang['Identification'] = 'Belépés';
+$lang['Photos only RSS feed'] = 'Képek RSS';
+$lang['Keyword'] = 'Kulcsszó';
+$lang['Links'] = 'Kapcsolódó linkek';
+$lang['N/A'] = 'Nincs adat';
+$lang['New on %s'] = 'Új %s';
+$lang['Notification'] = 'RSS';
+$lang['Number of items'] = 'Tételek száma';
+$lang['Original dimensions'] = 'Eredeti méret';
+$lang['Password forgotten'] = 'Elfelejtett jelszó';
+$lang['Password'] = 'Jelszó';
+$lang['Post date'] = 'Feltöltés dátuma';
+$lang['Posted on'] = 'Feltöltve';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Gyors kapcsolódás';
+$lang['RSS feed'] = 'RSS-Feed';
+$lang['Register'] = 'Regisztráció';
+$lang['Registration'] = 'Regisztráció';
+$lang['Related tags'] = 'Kapcsolódó címkék';
+$lang['Reset'] = 'Visszaállítás';
+$lang['Retrieve password'] = 'Jelszó igénylése';
+$lang['Search rules'] = 'Keresési szabályok';
+$lang['Search tags'] = 'Címke keresése';
+$lang['Search'] = 'Keresés';
+$lang['display available tags'] = 'Lehetséges címkék';
+$lang['Since'] = 'óta';
+$lang['Sort by'] = 'Rendezés';
+$lang['Sort order'] = 'Rendezési sorrend';
+$lang['Tag'] = 'Címke';
+$lang['Tags'] = 'Címkék';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Az RSS értesítő a következő -az oldallal kapcsolatos- információkat tartalmazza: új fotók, új albumok, új kommentek.';
+$lang['Unknown feed identifier'] = 'Ismeretlen RSS azonosító';
+$lang['User comments'] = 'Felhasználói hozzászólások';
+$lang['Username'] = 'Felhasználónév';
+$lang['Visits'] = 'Látogatás';
+$lang['Webmaster'] = 'Webmester';
+$lang['Week %d'] = '%d. hét';
+$lang['About Piwigo'] = 'Impresszum';
+$lang['You are not authorized to access the requested page'] = 'Önnek nincs jogosultsága a kívánt oldal megtekintéséhez';
+$lang['add this photo to your favorites'] = 'Kedvencekhez ad';
+$lang['Administration'] = 'Adminisztráció';
+$lang['all'] = 'összes';
+$lang['ascending'] = 'növekvő';
+$lang['author(s) : %s'] = 'Szerző(k) : %s';
+$lang['Expand all albums'] = 'Összes album kibontása';
+$lang['posted after %s (%s)'] = 'feltöltve %s (%s) után';
+$lang['posted before %s (%s)'] = 'feltöltve %s (%s) előtt';
+$lang['posted between %s (%s) and %s (%s)'] = 'feltöltve %s (%s) és %s (%s) között';
+$lang['posted on %s'] = 'elérhető %s';
+$lang['Best rated'] = 'Legjobbra  értékelt';
+$lang['display best rated photos'] = 'A legjobbra értékelt képek megjelenítése';
+$lang['Calendar'] = 'Naptár';
+$lang['All'] = 'Összes';
+$lang['display each day with photos, month per month'] = 'Napi képek megjelenítése hónapról-hónapra';
+$lang['View'] = 'Nézet';
+$lang['chronology_monthly_calendar'] = 'Havi naptár';
+$lang['chronology_monthly_list'] = 'Havi lista';
+$lang['chronology_weekly_list'] = 'Heti lista';
+$lang['Click here if your browser does not automatically forward you'] = 'Kattintson ide, ha a böngészője nem továbbítja automatikusan.';
+$lang['comment date'] = 'Hozzászólás időpontja';
+$lang['Comment'] = 'Hozzászólás';
+$lang['Your comment has been registered'] = 'Hozzászólás rögzítve';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood rendszer : várjon egy kicsit a következő hozzászólás előtt';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'A hozzászólás még nincs rögzítve. (érvényességi szabályok)';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Az adminisztrátornak még el kell fogadni a hozzászólást, hogy láthatóvá váljon.';
+$lang['This login is already used by another user'] = 'Ezt a nevet már valaki használja';
+$lang['Comments'] = 'Hozzászólások';
+$lang['Add a comment'] = 'Hozzászólás';
+$lang['created after %s (%s)'] = 'létrehozva %s (%s) után';
+$lang['created before %s (%s)'] = 'létrehozva %s (%s) előtt';
+$lang['created between %s (%s) and %s (%s)'] = 'létrehozva %s (%s) és %s (%s) között';
+$lang['created on %s'] = 'létrehozva %s';
+$lang['Customize'] = 'Testreszabás';
+$lang['Your Gallery Customization'] = 'A Galéria Testreszabása ';
+$lang['day'][0] = 'Vasárnap';
+$lang['day'][1] = 'Hétfő';
+$lang['day'][2] = 'Kedd';
+$lang['day'][3] = 'Szerda';
+$lang['day'][4] = 'Csütörtök';
+$lang['day'][5] = 'Péntek';
+$lang['day'][6] = 'Szombat';
+$lang['Default'] = 'Alapértelmezett';
+$lang['delete this photo from your favorites'] = 'Törlés a kedvencek közül';
+$lang['Delete'] = 'Törlés';
+$lang['descending'] = 'csökkenő';
+$lang['Download'] = 'letöltés';
+$lang['Download this file'] = 'Képfájl letöltése';
+$lang['edit'] = 'Javítás';
+$lang['wrong date'] = 'hibás dátum';
+$lang['excluded'] = 'kivétel';
+$lang['Your favorites'] = 'Kedvenceim';
+$lang['display your favorites photos'] = 'kedvenc képeimet jeleníti meg';
+$lang['Favorites'] = 'Kedvenceim';
+$lang['First'] = 'Első oldal';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Az oldal karbantartás miatt átmenetileg nem látható, kérjük látogasson vissza néhány perc múlva.';
+$lang['Page generated in'] = 'Oldal készült';
+$lang['guest'] = 'Vendég';
+$lang['Hello'] = 'Üdvözlet';
+$lang['available for administrators only'] = 'Csak adminisztrátoroknak';
+$lang['display this album'] = 'album képeinek, belső albumainak megjelenítése';
+$lang['display last user comments'] = 'Utolsó hozzászólások megjelenítése';
+$lang['customize the appareance of the gallery'] = 'A galéria megjelenésének testreszabása';
+$lang['search'] = 'Keresés';
+$lang['Home'] = 'Főoldal';
+$lang['Identification'] = 'Azonosító';
+$lang['in this album'] = 'ebben az albumban';
+$lang['in %d sub-album'] = '%d belső albumban';
+$lang['in %d sub-albums'] = '%d belső albumban';
+$lang['included'] = 'beleértve';
+$lang['Invalid password!'] = 'Hibás jelszó!';
+$lang['Language'] = 'Nyelv';
+$lang['last %d days'] = 'utolsó %d nap';
+$lang['Last'] = 'Utolsó oldal';
+$lang['Logout'] = 'Kijelentkezés';
+$lang['obligatory'] = 'szükséges';
+$lang['Maximum photo height'] = 'Maximális képmagasság';
+$lang['Maximum height must be a number superior to 50'] = 'A képmagasságnak 50-nél nagyobbnak kell lennie!';
+$lang['Maximum photo width'] = 'Maximális képszélesség';
+$lang['Maximum width must be a number superior to 50'] = 'A maximális képszélességnek 50-nél nagyobbnak kell lennie!';
+$lang['display a calendar by creation date'] = 'Naptár megjelenítése a készítés dátuma szerint';
+$lang['display all photos in all sub-albums'] = 'Megjelenik az összes elem (belső albumok is)';
+$lang['return to normal view mode'] = 'Visszatérés a normál kinézethez';
+$lang['display a calendar by posted date'] = 'Naptár megjelenítése a feltöltés dátuma szerint';
+$lang['month'][10] = 'Október';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'December';
+$lang['month'][1] = 'Január';
+$lang['month'][2] = 'Február';
+$lang['month'][3] = 'Március';
+$lang['month'][4] = 'Április';
+$lang['month'][5] = 'Május';
+$lang['month'][6] = 'Június';
+$lang['month'][7] = 'Július';
+$lang['month'][8] = 'Augusztus';
+$lang['month'][9] = 'Szeptember';
+$lang['Most visited'] = 'Legtöbbször nézett';
+$lang['display most visited photos'] = 'A leglátogatottabb képek megjelenítése';
+$lang['The number of photos per page must be a not null scalar'] = 'Az oldalankénti képek száma nem lehet 0!';
+$lang['Number of photos per page'] = 'Képek száma oldalanként';
+$lang['Unknown identifier'] = 'Ismeretlen azonosító';
+$lang['New password'] = 'Új jelszó';
+$lang['Rate this photo'] = 'Értékelje a képet';
+$lang['Next'] = 'Következő';
+$lang['no rate'] = 'még nincs értékelve';
+$lang['Photos posted within the last %d day.'] = 'Az alábbi elemek kerültek fel az elmúlt % d napban.';
+$lang['Photos posted within the last %d days.'] = 'Az alábbi elemek kerültek fel az elmúlt % d napban.';
+$lang['password updated'] = 'Jelszó frissítve';
+$lang['Recent period must be a positive integer value'] = 'Kell egy pozitív egész érték';
+$lang['photo'] = 'kép';
+$lang['Click on the photo to see it in high definition'] = 'Az eredeti méret megnyitásához kattintson a képre!';
+$lang['Show file metadata'] = 'Meta adatok megjelenítése';
+$lang['Powered by'] = 'Az oldal motorja:';
+$lang['Preferences'] = 'Beállítások';
+$lang['Previous'] = 'Előző';
+$lang['Random photos'] = 'Véletlenszerű képek';
+$lang['display a set of random photos'] = 'Véletlenszerű képek megjelenítése';
+$lang['Recent albums'] = 'Legfrissebb album';
+$lang['display recently updated albums'] = 'Utoljára feltöltött albumok megjelenítése';
+$lang['Recent period'] = 'Elmúlt napban';
+$lang['Recent photos'] = 'Legfrissebb képek';
+$lang['display most recent photos'] = 'Legfrissebb képek megjelenítése';
+$lang['Redirection...'] = 'Átirányítás...';
+$lang['Please, enter a login'] = 'Kérem, adja meg felhasználói nevét';
+$lang['login mustn\'t end with a space character'] = 'A felhasználói név nem végződhet SPACE karakterrel';
+$lang['login mustn\'t start with a space character'] = 'A felhasználói név nem kezdődhet SPACE karakterrel';
+$lang['this login is already used'] = 'Ilyen felhasználónk már van!';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail formátuma: xxx@yyy.eee (pl.: kedvenc@nyuszi.hu)';
+$lang['please enter your password again'] = 'Kérem, adja meg újra jelszavát';
+$lang['Auto login'] = 'Jegyezz meg';
+$lang['remove this tag from the list'] = 'Ezt a címkét távolítsa el a listáról';
+$lang['representative'] = 'képviselő';
+$lang['Search for Author'] = 'Szerző keresése';
+$lang['Search in albums'] = 'Album keresése';
+$lang['Search by date'] = 'Keresés dátum alapján';
+$lang['Date'] = 'Dátum';
+$lang['End-Date'] = 'Befejező dátum';
+$lang['Kind of date'] = 'Dátum típusa';
+$lang['Search for words'] = 'Keresés szavakra';
+$lang['Search for all terms'] = 'Keresés az összes kifejezésre';
+$lang['Search for any term'] = 'Keresés bármely kifejezésre';
+$lang['Empty query. No criteria has been entered.'] = 'Üres keresés. Nem lett megadva semmilyen keresési szempont.';
+$lang['Search results'] = 'Keresés eredménye';
+$lang['Search in sub-albums'] = 'Keresés a belső albumokban is';
+$lang['searched words : %s'] = 'Keresett kifejezések: %s';
+$lang['Contact'] = 'Kapcsolat:';
+$lang['set as album representative'] = 'Beállítás album-képviselőként';
+$lang['Show number of comments'] = 'Hozzászólások számának megjelenítése';
+$lang['Show number of hits'] = 'Találatok száma';
+$lang['slideshow'] = 'Diavetítés';
+$lang['stop the slideshow'] = 'Vetítés megállítása';
+$lang['Specials'] = 'Speciális';
+$lang['SQL queries in'] = 'adatbázis-lekérdezés';
+$lang['display only recently posted photos'] = 'Csak nemrégiben küldött képek';
+$lang['return to the display of all photos'] = 'Vissza (összes kép megjelenítése)';
+$lang['the beginning'] = 'Kezdet';
+$lang['Interface theme'] = 'Megjelenítés témája';
+$lang['Thumbnails'] = 'Bélyegképek';
+$lang['Menu'] = 'Menü';
+$lang['A comment on your site'] = 'Komment az oldalon';
+$lang['today'] = 'Mai';
+$lang['Update your rating'] = 'Értékelés frissítése';
+$lang['the username must be given'] = 'Felhasználói nevet meg kell adni';
+$lang['useful when password forgotten'] = 'hasznos, ha elfelejti a jelszavát';
+$lang['Quick search'] = 'Gyors-keresés';
+$lang['Connected user: %s'] = 'Kapcsolódás Felhasználó: %s';
+$lang['IP: %s'] = 'IP cím: %s';
+$lang['Browser: %s'] = 'Böngésző: %s';
+$lang['Author: %s'] = 'Szerző: %s';
+$lang['Comment: %s'] = 'Megjegyzés: %s';
+$lang['Comment by %s'] = 'Megjegyzés %s';
+$lang['User: %s'] = 'Felhasználó: %s';
+$lang['Email: %s'] = 'E-Mail: %s';
+$lang['Admin: %s'] = 'Adminisztrátor: %s';
+$lang['Registration of %s'] = 'Bejegyezte: %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Rossz felhasználói állapot "vendég", az alapértelmezett állapot. Kérjük, küldjön értesítést a webmesternek.';
+$lang['this email address is already in use'] = 'Ezt az e-mail címet már egy másik felhasználó használja.';
+$lang['Album results for'] = 'Album eredményei';
+$lang['Tag results for'] = 'Címke eredményei';
+$lang['from %s to %s'] = '%s-tól %s-ig';
+$lang['Play of slideshow'] = 'Diavetítés indítása';
+$lang['Pause of slideshow'] = 'Diavetítés szüneteltetése';
+$lang['Repeat the slideshow'] = 'Diavetítés újra indítása';
+$lang['Not repeat the slideshow'] = 'Ne ismételjük meg a diavetítést';
+$lang['Reduce diaporama speed'] = 'Képváltás lassítása';
+$lang['Accelerate diaporama speed'] = 'Képváltás gyorsítása';
+$lang['Submit'] = 'Küldés';
+$lang['Yes'] = 'Igen';
+$lang['No'] = 'Nem';
+$lang['%d photo']='%d kép';
+$lang['%d photos']='%d kép';
+$lang['%d photo is also linked to current tags'] = '%d kép kapcsolódik a címkéhez';
+$lang['%d photos are also linked to current tags'] = '%d kép kapcsolódik a címkéhez';
+$lang['display photos linked to this tag'] = 'A címkéhez kapcsolódó képek';
+$lang['photos posted during the last %d days'] = 'Képek az elmúlt %d napban';
+$lang['Piwigo Help'] = 'Piwigo segítség';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'Betűrendben';
+$lang['letters'] = 'Betűrendben';
+$lang['show tag cloud'] = 'Címkefelhő megjelenítése';
+$lang['cloud'] = 'Felhő';
+$lang['Reset to default values'] = 'Alap értékek visszaállítása';
+$lang['delete all photos from your favorites'] = 'Minden kép törlése a kedvencekből';
+$lang['Sent by'] = 'Küldte';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'A cookie-k le vannak tiltva vagy a böngésző nem támogatja. Engedélyezni kell a cookie-kat a csatlakozáshoz.';
+$lang['Are you sure?'] = 'Biztos benne?';
+$lang['Email address is missing. Please specify an email address.'] = 'E-mail cím hiányzik. Kérem írja be az e-mail címet.';
+$lang['Edit a comment'] = 'A hozzászólás módosítása';
+$lang['(!) This comment requires validation'] = '(!) Ezt a hozzászólást engedélyezni kell';
+$lang['Welcome'] = 'Üdvözlöm';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Üdvözlöm a Piwigo képgalériában!';
+$lang['... or browse your empty gallery'] = '... vagy tekintse meg az üres galériát';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... vagy kérem kikapcsolni ezt az üzenetet, eligazodom magam is';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Üdv %s, ez a Piwigo képgaléria üres!';
+$lang['I want to add photos'] = 'Szeretnék képeket feltölteni';
+$lang['Manage this user comment: %s'] = 'Itt kezelheti a felhasználó hozzászólását: %s';
+$lang['This author modified following comment:'] = 'A szerző a következő hozzászólást módosította:';
+$lang['This author removed the comment with id %d'] = 'A szerző a következő hozzászólást törölte id %d';
+$lang['html tags are not allowed in login'] = 'Belépéskor a html tag-ek nem engedélyezettek';
+$lang['The number of photos per page must be a not null scalar'] = 'Az oldalankénti képek száma nem lehet 0, és pozitív egész szám kell legyen.';
+$lang['Number of photos per page'] = 'Képek száma oldalanként';
+// missing translations
+$lang['Rating score'] = 'Átlagos pontszám';
+$lang['Invalid username or email'] = 'Érvénytelen felhasználónév vagy e-mail cím';
+$lang['Password reset is not allowed for this user'] = 'A felhasználói jelszó törlése nem engedélyezett';
+$lang['User "%s" has no email address, password reset is not possible'] = '"%s" felhasználó nem rendelkezik érvényes e-mail címmel, jelszó alaphelyzetbe állítása nem lehetséges';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Valaki a jelszó alaphelyzetbe állítását kérte a következő felhasználói fiókhoz:';
+$lang['Username "%s" on gallery %s'] = 'Felhasználónév: "%s" Galéria: %s';
+$lang['To reset your password, visit the following address:'] = 'Az új jelszó megadásához kattintson a következő linkre:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Amennyiben nem Ön kérte, vagy időközben meggondolta magát, kérjük hagyja figyelmen kívül ezt a levelet és nem történik semmi.';
+$lang['Password Reset'] = 'Jelszó törlése (Új jelszó)';
+$lang['Check your email for the confirmation link'] = 'Elküldtük levélben a megerősítő linket. Kérjük ellenőrizze postafiókját.';
+$lang['Invalid key'] = 'Érvénytelen kulcs';
+$lang['The passwords do not match'] = 'A jelszavak nem egyeznek';
+$lang['Your password has been reset'] = 'A jelszó módosítása megtörtént';
+$lang['Return to home page'] = 'Vissza a kezdőlapra';
+$lang['Please enter your username or email address.'] = 'Kérjük adja meg felhasználónevét, vagy e-mail címét.';
+$lang['You will receive a link to create a new password via email.'] = 'E-mailben kap egy linket, hogy létre tudja hozni új jelszavát.';
+$lang['Username or email'] = 'Felhasználónév vagy e-mail cím';
+$lang['Change my password'] = 'Jelszó módosítása';
+$lang['Enter your new password below.'] = 'Írja be az új jelszót.';
+$lang['EXIF Metadata'] = 'EXIF metaadatok';
+$lang['IPTC Metadata'] = 'IPTC metaadatok';
+$lang['Edit'] = 'Szerkesztés';
+$lang['large'] = 'L - nagy';
+$lang['medium'] = 'M - közepes';
+$lang['Original'] = 'Eredeti';
+$lang['small'] = 'S - kicsi';
+$lang['square'] = 'Négyzetes';
+$lang['thumb'] = 'Bélyegkép';
+$lang['xlarge'] = 'XL - nagyobb';
+$lang['xxlarge'] = 'XXL - legnagyobb';
+$lang['Hello %s,'] = 'Üdv %s,';
+$lang['Here are your connection settings'] = 'Kapcsolat adatai';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Amennyiben hibát észlel az e-mail továbbítása során, kérjük lépjen kapcsolatba velünk %s';
+$lang['Password: %s'] = 'Jelszó: %s';
+$lang['Send my connection settings by email'] = 'Kapcsolat beállításainak küldése e-mailben';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Sikeresen regisztrált, hamarosan kap egy e-mailt a kapcsolat adataival. Üdvözöljük!';
+$lang['Thank you for registering at %s!'] = 'Köszönjük, hogy regisztrált %s néven!';
+$lang['Username modification'] = 'Felhasználónév módosítása';
+$lang['Username: %s'] = 'Felhasználónév: %s';
+$lang['Your username has been successfully changed to : %s'] = 'Sikeres felhasználónév módosítás: %s';
+$lang['Photo sizes'] = 'Kép méretek';
+$lang['Desktop'] = 'Asztali';
+$lang['Mobile'] = 'Mobil';
+$lang['Show latest comments first'] = 'Új hozzászólások előre';
+$lang['Show oldest comments first'] = 'Régi hozzászólások előre';
+$lang['View in'] = 'Megjelenítés';
+$lang['Date created, new &rarr; old'] = 'Kép készült, újabb &rarr; korábbi';
+$lang['Date created, old &rarr; new'] = 'Kép készült, korábbi &rarr; újabb';
+$lang['Date posted, new &rarr; old'] = 'Feltöltve, újabb &rarr; korábbi';
+$lang['Date posted, old &rarr; new'] = 'Feltöltve, korábbi &rarr; újabb';
+$lang['File name, A &rarr; Z'] = 'Fájlnév, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Fájlnév, Z &rarr; A';
+$lang['Manual sort order'] = 'Kézi rendezés';
+$lang['Photo title, A &rarr; Z'] = 'Kép címe, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Kép címe, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Értékelés pontszám, magas &rarr; alacsony';
+$lang['Rating score, low &rarr; high'] = 'Értékelés pontszám, alacsony &rarr; magas';
+$lang['Visits, high &rarr; low'] = 'Megtekintések, több &rarr; kevesebb';
+$lang['Visits, low &rarr; high'] = 'Megtekintések, kevesebb &rarr; több';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Azonosító (ID), növekvő';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Azonosító (ID), csökkenő';
+$lang['2small'] = 'XXS - legkissebb';
+$lang['xsmall'] = 'XS - kissebb';
+?>
Index: tags/2.4.0RC3/language/hu_HU/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Virtuális albumok áthelyezése</h2>
+
+<p>Megváltoztatható egy virtuális album szülő albuma.</p>
+
+<h3>Virtuális albumok mozgatása</h3>
+
+<p>Válasszon ki egy vagy több virtuális albumot áthelyezésre. 
+Ha a lista üres, nem hozott létre egyetlen albumot sem.</p>
+
+<h3>Új szülő album</h3>
+
+<p>Válassza ki az új szülő albumot (virtuális vagy fizikai). 
+Ha nem választ ki szülő albumot, akkor az albumot a gyökérbe mozgatja.
+Nem mozgathatja az albumot önmagára, vagy valamelyik gyermek albumra.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/cat_options.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Album tulajdonságok</h2>
+
+<p>Ezen az oldalon lehetősége van az adminisztrátoroknak az albumok kezelésére. 
+Számos lehetőség áll rendelkezésére, kezelhet akár több albumot is egyszerre.</p>
+
+<dl>
+
+  <dt>Feltöltés</dt>
+  <dd>Kezelheti mely albumokba engedélyezi látogatóinak a feltöltést. Csak nem virtuális és nem távoli albumok esetén.</add>
+
+  <dt>Hozzászólások</dt>
+  <dd>Eldöntheti mely albumokhoz engedélyez hozzászólásokat.
+Válassza ki azokat az albumokat, melyekhez engedélyezni kívánja a hozzászólásokat. 
+Az engedélyezett albumok képei alatt elérhetővé válik a hozzászólás űrlap.</dd>
+
+  <dt>Lezárás</dt>
+  <dd>Lehetősége van az albumok ideiglenes zárolására. 
+  Ha zárol egy albumot, annak gyermek albumai is zárolva lesznek. 
+  Ha feloldja egy album zárolását, annak szülő albuma is feloldásra kerül.</dd>
+
+  <dt>Nyilvános / Privát</dt>
+  <dd>Kezelheti a kiválasztott albumokhoz tartozó engedélyeket. 
+  Kiválaszthatja a privát albumokat : összefüggésben van a látogatók és/vagy csoportok engedélyeinek beállításával. 
+  Ha egy album privát, a belső albumok is privát albumokká válnak. 
+  Ha egy album nyilvános, a szülő album is nyilvánossá válik.</dd>
+
+  <dt>Reprezentál</dt>
+  <dd>Ez a lehetőség csak akkor kezelhető, ha az
+  <code>allow_random_representative</code> konfigurációs paramétere <em>true</em> (lásd <span
+  class="filename">include/config_defaults.inc.php</span>). 
+  Minden album képviselő lehet véletlenszerű, vagy lehet egyedi (egy egyedi kép).</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hu_HU/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/configuration.html	(revision 14585)
@@ -0,0 +1,108 @@
+<h2>Beállítások</h2>
+
+<p>Az adminisztrátoroknak ezen az oldalon lehetőségük van a galéria alapvető jellemzőinek beállítására. Valójában itt tényleg csak az alapvető jellemzők megváltoztatására van lehetőség, ezek az adminisztrátorok túlnyomó többségét ki is elégítik. További (speciális) beállításokra is mód nyílik, melyek az <span
+class="filename">include/config_default.inc.php</span> fájlban találhatók.</p>
+
+<p>Az oldal több csoportba rendezve tartalmazza a beállítási lehetőségeket.</p>
+
+
+<h3>Általános</h3>
+<ul>
+  <li><strong>Galéria címe</strong>: RSS hírcsatornához és e-mailekhez.</li>
+
+  <li><strong>Oldal fejléc</strong>: Minden nyilvános oldal tetején megjelenik.</li>
+
+  <li><strong>Galéria URL</strong>: RSS hírcsatorna használatához.</li>
+
+  <li><strong>Galéria lezárása</strong>: Galéria zárolása karbantartás esetén. Csak az adminisztrátorok érik el az oldalt.</li>
+
+  <li><strong>Értékelés engedélyezése</strong>: Képek értékelésének engedélyezése.</li>
+
+  <li><strong>Vendégek által értékelhető</strong>: A nem regisztrált felhasználók is értékelhetik a képet.</li>
+
+  <li><strong>Regisztráció engedélyezése</strong>: A vendégek regisztrálhatnak.</li>
+
+  <li><strong>Az e-mail cím kötelező minden felhasználó számára</strong>: A regisztrációs profilban ill. profil módosításakor megadott e-mail cím ellenőrzésre kerül. Kivételt képez, ha az ellenőrzést az adminisztrátor hajtja végre.</li>
+
+  <li><strong>E-mail küldés, ha egy új felhasználó regisztrál</strong>: Az adminisztrátorok levélben kapnak értesítést ha egy új felhasználó regisztrált.</li>
+
+</ul>
+
+<h3>Statisztikák</h3>
+
+  <p>Az oldallátogatások (<span
+  class="pwgScreen">category.php</span> és <span
+  class="pwgScreen">picture.php</span>) mentésre kerülnek a
+  <code>history</code> táblába.</p>
+
+  <p>A látogatások megtekinthetők az <span
+  class="pwgScreen">Adminisztráció, Eszközök, Statisztikák</span> oldalon.</p>
+
+<ul>
+  <li><strong>Vendégek általi oldallátogatások mentése</strong>: A vendégek általi oldallátogatások kerülnek mentésre.</li>
+
+  <li><strong>Felhasználók általi oldallátogatások mentése</strong>: A regisztrált felhasználók általi oldallátogatások kerülnek mentésre.</li>
+
+  <li><strong>Adminisztrátorok általi oldallátogatások mentése</strong>: Az adminisztrátorok általi oldallátogatások kerülnek mentésre.</li>
+
+</ul>
+
+<h3>Hozzászólások</h3>
+<ul>
+
+  <li><strong>Bárki hozzászólhat</strong>: A nem regisztrált vendég felhasználók is írhatnak hozzászólásokat.</li>
+
+  <li><strong>Hozzászólások száma oldalanként</strong>.</li>
+
+  <li><strong>Engedélyezés szükséges</strong>: Egy adminisztrátornak jóvá kell hagynia a hozzászólást, mielőtt az a honlapon megjelenne. A felhasználói hozzászólások jóváhagyása az <span class="pwgScreen">Adminisztráció, Képek,
+  Hozzászólások</span> oldalon történik.</li>
+
+  <li><strong>E-mail küldés, ha egy érvényes hozzászólás érkezik</strong>: Az adminisztrátorok e-mailben értesítést kapnak amennyiben új hozzászólás érkezik és jóváhagyásra kerül.</li>
+
+  <li><strong>E-mail küldés, ha egy hozzászólás jóváhagyásra vár</strong>:
+Egy e-mail küldése az adminisztrátornak, amennyiben egy felhasználó hozzászólást küld, és azt az adminisztrátornak engedélyezni kell.
+A felhasználói hozzászólások jóváhagyása az <span class="pwgScreen">Adminisztráció, Képek, Hozzászólások</span> oldalon történik.</li>
+
+</ul>
+
+<h3>Feltöltés</h3>
+<ul>
+  <li><strong>Jelenjen meg a Kép hozzáadása menüpont</strong>: Ha léteznek feltölthető kategóriák, a feltöltő link megjelenik a Kategóriák menüben.</li>
+  <li><strong>Felhasználói szint beállítása a feltöltéshez</strong>: Azon felhasználói szint beállítása, akik feltölthetnek képeket az egyes kategóriákba.</li>
+  <li><strong>Email-küldés, ha valaki képet töltött fel</strong>: Az adminisztrátor e-mailben értesítést kap amennyiben a felhasználók képeket töltöttek fel.</li>
+</ul>
+
+<h3>Alapértelmezett megjelenítés</h3>
+
+<p>Itt lehet megváltoztatni a galéria alapértelmezett megjelenését. A látogatók a beállításoknak megfelető kinézetben látják a galériát. Regisztráció és bejelentkezés után a felhasználó egyéni beállításokat alkalmazhat
+(a beállítások módosíthatók a <span class="pwgScreen">profilban</span>).</p>
+
+<p>A regisztrált felhasználók beállításait az
+<span class="pwgScreen">Adminisztráció, Felhasználók, Kezelés</span> oldalon módosíthatjuk, ahol a felhasználói listából lehet kiválasztani a módosítani kívánt felhasználót.</p>
+
+<ul>
+
+  <li><strong>Nyelv</strong>: Csak a Piwigo felületre vonatkozik. Album neve, kép neve és leírása mező nem honosított.</li>
+
+  <li><strong>Képek száma soronként</strong></li>
+
+  <li><strong>Sorok száma oldalanként</strong></li>
+
+  <li><strong>Téma felület</strong></li>
+
+  <li><strong>Elmúlt napban</strong>: Napok száma. Az az időszak, mely alatt a feltöltött kép újként jelenik meg. A napok számának nagyobbnak kell lenni 1-nél.</li>
+
+  <li><strong>Összes album kibontása</strong>: Az albumok menüben az összes album alapértelmezésben kibontásra kerül. <em>Figyelem</em>: az opció nagy erőforrás fogyasztást valamint hatalmas menüt eredményez amennyiben sok album található a galériában.</li>
+
+  <li><strong>Hozzászólások számának mutatása</strong>: A megjelenítendő hozzászólások darabszáma a kép és bélyegképek oldalon. Erőforrásokat fogyaszt.</li>
+
+  <li><strong>Találatok számának megjelenítése</strong>: Képek megtekintésének száma a bélyegképek alatt a bélyegképek oldalon.
+  Csak abban az esetben, ha a speciális paraméter beállítás: <br>
+  $conf['show_nb_hits'] = true; <br>
+  Megjegyzés: alapértelmezés szerint false.</li>
+
+  <li><strong>Maximális képszélesség</strong>: A kép maximális szélessége megjelenítéskor. Amennyiben a kép szélessége nagyobb a megadottnál, megjelenítéskor átméretezésre kerül. Ezen lehetőség választása helyett javasoljuk inkább a képek átméretezését. Ez a megoldás javasolt.</li>
+
+  <li><strong>Maximális képmagasság</strong>: Értelmezése megegyezik a maximális képszélességnél leírtakkal.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/hu_HU/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/group_list.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Csoportok kezelése</h2>
+
+<p>Ezen a helyen lehetőség van a csoportok kezelésére.</p>
+
+<h3>Csoport hozzáadása</h3>
+
+<p>Adminisztrátor hozhat létre csoportokat.</p>
+
+<h3>Csoport lista</h3>
+
+<p>A lista elemei a következő lehetőségeket biztosítják:</p>
+
+
+<ul>
+  <li>tovább a tagok listájához</li>
+  <li>tovább az engedélyek kezelése oldalra</li>
+  <li>csoport törlése (megerősítés szükséges)</li>
+  <li>"alapértelmezett csoport" tulajdonság megváltoztatása (megerősítés szükséges)</li>
+</ul>
+
+<h3>Alapértelmezett csoport</h3>
+<p>Az alapértelmezett csoport egy olyan csoport, melyhez tagságot kap minden újonnan regisztrált, 
+illetve adminisztrátor által létrehozott felhasználó.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>A képek galériába történő feltöltéséhez több módszer áll rendelkezésedre:</p>
+
+<ul>
+  <li>A <strong>Közvetlen Feltöltés</strong> a legegyszerűbb és legkényelmesebb módja a képek feltöltésének. A módszer használata erősen függ a böngésződ képességeitől, valamint a tárhelyszolgáltató által biztosított lehetőségektől. Amennyiben nagyobb mennyiségű képet szeretnél egyszerre feltölteni, vagy ezzel a módszerrel probléma adódna, próbáld ki a következő két lehetőség valamelyikét!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Tovább a Közvetlen Feltöltés oldalra</a></p>
+
+<ul>
+  <li>A <strong>pLoader</strong> egy, a számítógépedre telepített asztali alkalmazás. Tedd be a feltöltendő képeket a "Húzd és dobd" módszerrel a pLoader bal oldali ablakába, majd kattints a <em>"Feltöltés Galériába"</em> gombra, hagyd, hogy a pLoader végezze a dolgát. Más asztali alkalmazások is szóba jöhetnek, például a <strong>WinToPiwigo</strong> vagy a <strong>Digikam</strong> export bővítmény.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Tovább a pLoader beszerzéséhez</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li>Nagy mennyiségű képek minimális munkával történő hozzáadásának legegyszerűbb módja a <strong>Feltöltés FTP-n keresztül</strong>. Feltöltés előtt el kell végezni a képek előkészítését. Az FTP módszer használata esetén a képek helyének előkészítését kézzel kell elvégezni a tárhelyen lévő könyvtárstruktúra kialakításával.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Tovább az FTP feltöltést bemutató oldalra</a></p>
+</div>
Index: tags/2.4.0RC3/language/hu_HU/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/help_groups.html	(revision 14585)
@@ -0,0 +1,10 @@
+<p>A felhasználók jogosultságainak kezelése egyszerűbbé válik csoportok létrehozásával.</p>
+
+<p>Csoportok létrehozhatók az <span class="pwgScreen">Adminisztráció &raquo; Felhasználók
+&raquo; Csoportok</span> útvonalon, majd az 
+<span class="pwgScreen">Adminisztráció &raquo; Felhasználók &raquo;
+Kezelés</span> útvonalon kapcsolhatók a felhasználók az egyes csoportokhoz.</p>
+
+<p>Egy felhasználó több csoportba is tartozhat. Engedélyezése felülbírálja a tiltásokat : 
+ha a "jack" nevű felhasználó a "család" és "barátok" csoportba is tartozik és a 
+"Karácsony 2003" albumot a "család" csoport láthatja, akkor "jack" látni fogja a "Karácsony 2003" albumot.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/help_misc.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Amint elkészült a galéria, lehetőség van az alapértelmezett megjelenítés tulajdonságainak beállítására az 
+<span class="pwgScreen">Adminisztráció &raquo; Beállítások &raquo; Lehetőségek</span> oldalon.</p>
+<p>Minden új regisztrált felhasználó regisztráláskor örökli az alapértelmezett konfigurációs beállításokat.</p>
+
+<p>További kérdések esetén a Piwigo közösség örömmel válaszol azokra a 
+<a href="http://hu.piwigo.org/forum">fórumon</a>.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,52 @@
+<fieldset>
+<legend>Jogosultságok a képekhez</legend>
+
+<p>Minden képhez tartozik <strong>hozzáférési szint</strong> (zárolás). Minden felhasználóhoz tartozik hozzáférési szint (egy kulcs). A jelenlegi 5 hozzáférési szint:</p>
+<ol>
+  <li>Egyik sem</li>
+  <li><em>Kapcsolattartók</em></li>
+  <li><em>Barátok (magasabb mint a Kapcsolattartók)</em></li>
+  <li><em>Család (magasabb mint a Barátok)</em></li>
+  <li><em>Adminisztrátor (magasabb minden más szintnél)</em></li>
+</ol>
+
+<p>Magasabb hozzáférési szint tulajdonosa jogosult az alacsonyabb hozzáférési szint megtekintésére. Minél magasabb a felhasználó hozzáférési szintje, annál több képet tekinthet meg.</p>
+
+<p>Például ha a "peter_wedding-0024.jpg" kép hozzáférési szintje <em>"Család"</em>, akkor:</p>
+<ul>
+  <li>Péter (aki <em>"Adminisztrátor"</em>) látni fogja a képet, mert az <em>"Adminisztrátorok"</em> láthatják az összes képet</li>
+  <li>Betti (aki a <em>"Család"</em> tagja) látni fogja a képet</li>
+  <li>Marika (aki a <em>"Barátok"</em> tagja) nem fogja látni a képet</li>
+</ul>
+
+<p>Egy felhasználó akinek nincs jogosultsága az album tartalmának megtekintéséhez, nem látja sem az albumot, sem az album címét. Ugyanez az elv érvényes a címkére is.</p>
+
+<p>Az egyes felhasználókhoz tartozó hozzáférési szint az <span class="pwgScreen">Adminisztráció &raquo; Felhasználók &raquo; Kezelés</span> lapon állítható be.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Jogosultságok az albumokhoz</legend>
+
+<p>Szabályozható az albumokhoz történő hozzáférés. Az albumokhoz történő hozzáférés jogosultjainak kezeléséhez az album típusát "Privát" szintre kell váltani.</p>
+
+<p>Egy album privát albummá történő módosítása elvégezhető az album szerkesztésével
+(<span class="pwgScreen">Adminisztráció &raquo; Albumok &raquo; Kezelés
+&raquo; javítás</span>), vagy a teljes album fa jogosultságainak beállításával
+(<span class="pwgScreen">Adminisztráció &raquo; Albumok &raquo;
+Tulajdonságok &raquo; Nyilvános / Privát</span>).</p>
+
+<p>Amint egy album bekerül a privát albumok közé, három módja van a csoport és felhasználói engedélyek módosításának:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Adminisztráció &raquo; Felhasználók &raquo; Kezelés &raquo;
+  Engedélyek</span> (soronként egy felhasználó)</li>
+
+  <li><span class="pwgScreen">Adminisztráció &raquo; Felhasználók &raquo; Csoportok &raquo;
+  Engedélyek</span> (soronként egy csoport)</li>
+
+  <li><span class="pwgScreen">Adminisztráció &raquo; Albumok &raquo; Kezelés &raquo; 
+  Engedélyek</span> (soronként egy album)</li>
+
+</ul>
Index: tags/2.4.0RC3/language/hu_HU/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,10 @@
+<p>A képek a fájlkönyvárakkal megegyező albumokban jelennek meg.</p>
+
+<p>A képek több albumban is megjeleníthetők a fájl tárhelyen történő megkettőzése nélkül. 
+A képek albumokhoz történő társítására a képek szerkesztés oldalán van lehetőség 
+(az adminisztrátor a képeket a "Galéria megtekintése" gomb segítségével érheti el).</p>
+
+<p>A megoldás a virtuális albumok rendszerén alapul, amennyiben nincs megfelelő album: 
+Virtuális albumok létrehozására az 
+<span class="pwgScreen">Adminisztráció &raquo; Albumok &raquo;
+Kezelés</span> útvonalon van lehetőség.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/history.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/history.html	(revision 14585)
@@ -0,0 +1,44 @@
+<h2>Események</h2>
+
+<p>Ezen az oldalon lehetősége van megtekinteni a a galéria eseményeit a választott beállítások szerint - Adminisztráció - Speciális összetevők - Statisztika.</p>
+	
+<h3>Statisztika</h3>
+<ul>
+  <p>Ha azt választotta, hogy a látogatott oldalak adatai (<span
+class="pwgScreen">index.php</span> és <span
+class="pwgScreen">picture.php</span>) maradjanak a <code>history</code> táblában.
+Ez a fül lehetővé teszi, hogy nyomon kövesse az oldal látogatásokat.</p>
+	
+	<li><strong>Teljes statisztika</strong> : Statisztika évekre. </li>
+	
+	<li><strong>Éves statisztika</strong> : Statisztika a választott év hónapjaira.</li>
+	
+	<li><strong>Havi statisztika</strong> : Statisztika a kiválasztott hónap napjaira.</li>
+	
+	<li><strong>Napi statisztika</strong> : Statisztika a kiválasztott nap óráira.</li>
+	
+</ul>
+
+<h3>Keresés</h3>
+<ul>
+  <p>Ha azt választotta, hogy a látogatott oldalak adatai (<span
+class="pwgScreen">index.php</span> és <span
+class="pwgScreen">picture.php</span>) maradjanak a <code>history</code> táblában.
+Ez a fül lehetővé teszi, hogy különböző szűrési feltételek használatával tekintse meg
+a honlap oldalainak látogatottságát.</p>
+ 
+	<li><strong>Szűrés dátum szerint</strong> : Dátum szerinti szűrést végezhet
+	a tevékenységek megtekintésére.</li>
+	
+	<li><strong>Szűrés adott típusú elemre</strong> : Meghatározott elemre történő
+	szűrést végezhet a tevékenységek megtekintésére.</li>
+	
+	<li><strong>Szűrés felhasználókra</strong> : Konkrét felhasználóra történő
+	szűrést végezhet a tevékenységek megtekintésére.</li>
+	
+	<li><strong>Szűrés fájlnévre</strong> : Fájlnévre történő szűrést végezhet
+	a tevékenységek megtekintésére.</li>
+	
+	<li><strong>Szűrés elem-ID-re</strong> : Kép ID-re történő szűrést végezhet
+	a tevékenységek megtekintésére.</li>
+</ul>
Index: tags/2.4.0RC3/language/hu_HU/help/index.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/hu_HU/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/maintenance.html	(revision 14585)
@@ -0,0 +1,12 @@
+<ul>
+
+  <li>
+    <strong>Nem kapcsolódó elemek:</strong>
+    Képek megjelenítése, melyek nem kapcsolódnak virtuális albumhoz.
+  </li>
+  <li>
+    <strong>Azonos nevű fájlok több fizikai albumban:</strong>
+    Képek vagy fájlok megjelenítése, melyekről bebizonyosodott, hogy azonos a fájlnevük az egyes albumokban.
+  </li>
+
+</ul>
Index: tags/2.4.0RC3/language/hu_HU/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Értesítés e-mailben</h2>
+
+<p>Ez az oldal lehetőséget biztosít a felhasználóknak küldendő e-mail értesítések beállítására és kezelésére, a webhelyen történt változásokról.</p>
+
+<p>Az oldal 3 lapot tartalmaz:</p>
+
+<h3>Paraméterek</h3>
+<p>Csak a webmesterek számára elérhető, lehetőséget biztosít az e-mail értesítések paramétereinek beállítására.</p>
+
+<h3>Feliratkozás</h3>
+<p>Csak a webmesterek számára elérhető, ezen a lapon kezelhetjük a regisztrált felhasználók feliratkozását/leiratkozását az e-mail értesítésekre.</p>
+
+<h3>Küld</h3>
+<p>Csak a webmesterek és adminisztrátorok számára elérhető, lehetővé teszi az értesítések elküldését az oldalon történt változásokról.</p>
+
Index: tags/2.4.0RC3/language/hu_HU/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Közvetlen linkek</h2>
+
+<p>A közvetlen linkekkel keresőbarát, átlátható URL-ek állíthatók elő. Amikor egy albumhoz közvetlen linket rendelünk, az URL-ben  nincs szükség az ID, vagy egyéb nehezen megjegyezhető karaktersorozat megjelenítésére.</p>
+
+<p>Ha egy közvetlen linket törlünk, lehetőségünk van menteni a közvetlen link előzményeket úgy, hogy a külső linkek továbbra is működnek a PWG lapokon. A közvetlen link előzmények táblában láthatja mikor töröltek egy közvetlen linket, illetve mikor használták utoljára, valamint azt is, hányszor használták a törlés óta.</p>
+
+<p>Ne feledje, hogy az albumokhoz rendelt közvetlen linkeknek egyedinek kell lenniük. Egy közvetlen linket nem lehet többször definiálni a közvetlen link előzményekben.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,112 @@
+<fieldset>
+  <legend>Kezdő lépések</legend>
+
+<ol>
+  <li>Hozz létre egy könyvtárat a számítógépen.</li>
+    
+  <li>Másolj be néhány képet a könyvtárba, a Weben engedélyezett méret figyelembe vételével. <em>Figyelem</em>: A fájl és mappa neve is csak betűket és számokat tartalmazhat az angol abc szerint, valamint a következő speciális karaktereket: "-", "_" vagy ".". Tilos szóközt (SPACE) valamint egyéb különleges karaktereket használni.</li>
+  
+  <li>Másold fel FTP program segítségével a "galeries" mappába az így létrehozott mappádat.</li>
+  
+  <li>Lépj be a galériába és menj az <span class="pwgScreen">Adminisztráció &raquo; Eszköszök &raquo; Bélyegképek</span> oldalra, hogy létrehozd a hiányzó bélyegképeket.</li>
+  
+  <li>Menj vissza az <span class="pwgScreen">Adminisztráció</span> menübe és kattints a "Szinkronizálás" gombra.</li>
+</ol>
+
+Gratulálunk, ezzel létrehoztad az első album képtárat.
+
+</fieldset>
+
+<fieldset>
+  <legend>Könyvtárak és fájlok szervezése</legend>
+
+<ul>
+
+  <li>
+
+    <p>A mappák és albumok listája a Piwigo "galeries" könyvtárban. 
+    Itt következik a könyvtárfa egy kis galériáról, (de számos funkcióval): </p>
+  
+<pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+<li>Minden új alkönyvtár a "galeries" könyvtárban létrehoz egy új albumot, kivételek a "thumbnail", "pwg_high" és "pwg_representative" (a magyarázatot lásd alább). A könyvtárak mélysége nincs korlátozva.
+    A fenti példában a Kategorie-1.1.1.1 könyvtár 4 mélység szintű.</li>
+
+  <li>Alapvetően, egy elemet egy fájl határoz meg. Egy fájl Piwigo elem lehet, ha kiterjesztése a <code>file_ext</code> 
+  konfigurációs paraméterek lehetőségei között van (lásd <span class="filename">include/config_default.inc.php</span> fájl). 
+  Egy fájl kép lehet, ha kiterjesztése a <code>picture_ext</code> konfigurációs paraméterek lehetőségei között van.</li>
+
+  <li>Minden képhez tartoznia kell egy bélyegképnek (lásd lejjebb a
+  bélyegképek szakaszban).</li>
+
+  <li>Képnek egy megfelelő felbontású, jó minőségű képet ajánlott választani (lásd a fenti példában a
+  wedding.jpg fájlt). Az eredeti kép fájlneve ne tartalmazzon előtagot.</li>
+
+  <li>Amennyiben a feltöltött elem nem képfájl, (video, hang, szöveges fájl, vagy egyéb...) 
+  alapértelmezés szerint a fájl kiterjesztéséhez illeszkedő ikon jelenik meg. 
+  Az ilyen fájlokhoz hozzárendelhető egy bélyegkép fájl (lásd a fenti példában a video.avi fájlt).</li>
+
+  <li><em>Figyelem</em>: a könyvtárak és fájlok nevei csak betűket és számokat, 
+  valamint a következő karaktereket tartalmazhatják: "-", "_" vagy ".". 
+  Nem lehet üres hely és soremelés karakter.</li>
+
+  <li>A bélyegképek és album képviselők helyükre tételének útvonala: <span class="pwgScreen">Adminisztráció &raquo; Eszközök &raquo;
+  Szinkronizálás</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Bélyegképek</legend>
+<ul>
+
+  <li>Minden képnek rendelkeznie kell egy hozzá tartozó bélyegképpel.</li>
+
+  <li>A bélyegképek az album könyvtár "thumbnail" alkönyvtárában kerülnek eltárolásra.
+   A bélyegkép neve megegyezik a kép fájlnevével, egy a konfigurációs paraméterekben <code>prefix_thumbnail</code> megadott előtaggal kiegészítve (lásd <span class="filename">include/config.inc.php</span>).</li>
+
+  <li>A kép és a hozzárendelt bélyegkép kiterjesztése eltérő lehet (például egy ".GIF" kiterjesztésű képhez tartozhat ".jpg" kiterjesztésű bélyegkép).</li>
+
+  <li><em>Javaslat</em>: külső modul használata a bélyegképek létrehozásához.</li>
+
+  <li>Használhatod, bár nem ajánlott (kép minőség, web szerver erőforrásainak terhelése): <span
+  class="pwgScreen">Adminisztráció &raquo; Eszközök &raquo; Bélyegképek</span> oldalon a bélyegképek létrehozását.</li>
+
+  <li>Adj írási jogot az összes album könyvtárnak.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/hu_HU/help/search.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/search.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Keresés</h2>
+
+<p>Ez az oldal lehetővé teszi képek keresését a teljes galériában.</p>
+
+<dl>
+
+  <dt>Keresés szavakra</dt>
+  <dd>Megkeresi az összes a keresett szóhoz kapcsolódó képet a galériában. 
+  Részleges egyezések megjelenítéséhez használhatja a * karaktert.</dd>
+
+  <dt>Szerző keresése</dt>
+  <dd>Részleges egyezések megjelenítéséhez használhatja a * karaktert.</dd>
+
+  <dt>Keresés dátum alapján</dt>
+  <dd>Válassza ki a kezdő és/vagy a befejező dátumot a kereséshez. 
+  Az utolsó mezőbe az évszámot kell beírnia a következő formában : 0000 (például 2004)</dd>
+
+  <dt>Keresés albumokban</dt>
+  <dd>Jelölje ki az albumot vagy albumokat, melyben keresni kíván. 
+  Kereshet az összes belső albumban a szülő album kijelölésével, 
+  ha engedélyezi a keresést a belső albumokban is.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hu_HU/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/synchronize.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>Szinkronizálás</h2>
+
+<p>Kétféle szinkronizálás hajtható végre : szinkorizálhatók a mappák/fájlok, 
+illetve a fájlok metaadatai. A mappák/fájlok szinkronizálásakor a könyvtár 
+fa adatai frissülnek az adatbázisban. Metaadatok frissítésekor az elemekhez kapcsolódó 
+információk frissülnek, fájlméret, méret adatok pixelben, EXIF vagy IPTC információk.</p>
+
+<p>Az első szinkronizálásnál a mappák/fájlok szinkronizálását egyszerre kell elvégezni.</p>
+
+<p>A szinkronizálási folyamat hossza elhúzódhat, (a szükséges idő erősen függ a szerver 
+terhelésétől valamint az elemek számától) ezért lehetőség van a szinkronizálás 
+albumonkénti végrehajtására.</p>
Index: tags/2.4.0RC3/language/hu_HU/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Bélyegképek létrehozása</h2>
+
+<p>Ezen az oldalon létrehozhatók a hiányzó bélyegképek. Amennyiben a galéria megosztott szerveren található, nem javasoljuk használatát.</p>
+
+<dl>
+
+  <dt>GD verzió</dt>
+
+  <dd>Könyvtárban lévő képek szerkesztése a PHP-ben telepített GD támogatással. Ki kell választani a szerverre telepített verziót. Hibaüzenet esetén csak vissza kell térni a böngészőben az előző oldalra és a másik verziót választani. Amennyiben egyik verzió sem működik, a szerveren nincs GD támogatás.</dd>
+
+  <dt>Szélesség és magasság</dt>
+
+  <dd>Bélyegképek maximális mérete. Az eredeti képarány megmarad. Az alapértelmezett értékek megváltoztathatók a konfigurációs fájlban <code>tn_width</code> és
+<code>tn_height</code> (lásd <span
+class="filename">include/config_default.inc.php</span> fájl).</dd>
+
+  <dt>Létrehozandó bélyegképek száma</dt>
+
+  <dd>Nem ajánlott egyszerre túl sok bélyegképet létrehozni. A bélyegképek létrehozásának folyamata magas CPU terheléssel jár. Amennyiben a Piwigo galéria ingyenes tárhelyre van telepítve, a nagy CPU terlelés akár a honlap szolgáltató általi tiltását is eredményezheti.</dd>
+
+  <dt>Fájl formátum</dt>
+
+  <dd>A létrehozott bélyegképek formátuma JPEG formátumú. Csak PNG és JPEG képekről készíthetők bélyegképek.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/hu_HU/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/hu_HU/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/help/user_list.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Felhasználók listája</h2>
+
+<p>Ezen az oldalon kezelhetők a regisztrált felhasználókhoz tartozó tulajdonságok, kivétel az egyéb oldalakon állítható jogosultságok.</p>
+
+<h3>Felhasználó hozzáadása</h3>
+
+<p>Adminisztrátor a regisztrációs folyamat végrehajtása nélkül is hozzáadhat felhasználókat.</p>
+
+<h3>Felhasználói lista</h3>
+
+<p>A lista felhasználónevekre szűrhető (használható a * helyettesítő karakter), 
+ezen belül státuszra és/vagy csoportra is szűkíthető. 
+Rendezhető dátumra, illetve növekvő vagy csökkenő sorrendre.</p>
+
+<p>Ezen az oldalon lehetőség van több felhasználó együttes kezelésére, a következő műveletek végrehajtásával:</p>
+
+<ul>
+
+  <li>felhasználók törlése (megerősítés szükséges)</li>
+  <li>státusz módosítása</li>
+  <li>csoportokhoz történő hozzárendelés, vagy eltávolítás</li>
+  <li>megjelenés tulajdonságainak módosítása</li>
+  <li>további tulajdonságok módosítása</li>
+
+</ul>
+
+<p>Célként a kijelölt felhasználó (alapértelmezés) vagy az összes felhasználó megjelenik a szűrt listában.</p>
Index: tags/2.4.0RC3/language/hu_HU/index.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/hu_HU/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/install.lang.php	(revision 14585)
@@ -0,0 +1,75 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = 'Telepítés';
+$lang['Basic configuration'] = 'Alap konfiguráció';
+$lang['Default gallery language'] = 'Galéria alapértelmezett nyelve';
+$lang['Database configuration'] = 'Adatbázis konfiguráció';
+$lang['Admin configuration'] = 'Rendszergazda fiókjának beállítása';
+$lang['Start Install'] = 'Telepítés indítása';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail formátuma: xxx@yyy.eee (pl.: kedvenc@nyuszi.hu)';
+$lang['Webmaster login'] = 'Webmester';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'A látogatók látni fogják. Szükséges a weboldal adminisztrációjához';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A kapcsolat a kiszolgálóval rendben, de nem sikerült csatlakozni az adatbázishoz';
+$lang['Can\'t connect to server'] = 'Nem sikerült kapcsolódni a szerverhez';
+$lang['Host'] = 'MySQL host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql, stb.';
+$lang['User'] = 'Felhasználó név';
+$lang['user login given by your host provider'] = 'a tárhelyszolgáltató által adott felhasználónév';
+$lang['Password'] = 'Jelszó';
+$lang['user password given by your host provider'] = 'a tárhelyen használt jelszó';
+$lang['Database name'] = 'Adatbázis neve';
+$lang['also given by your host provider'] = 'a szolgáltatótól kapott adatbázis név';
+$lang['Database table prefix'] = 'Adatbázis tábla előtag';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'az adatbázis táblák ezzel az előtaggal fognak kezdődni (lehetővé teszi a táblák jobb áttekinthetőségét)';
+$lang['enter a login for webmaster'] = 'írja be a webmester bejelentkezési adatokat';
+$lang['webmaster login can\'t contain characters \' or "'] = 'A webmester nevében nem használhatók a \' és " karakterek';
+$lang['please enter your password again'] = 'kérjük, adja meg újra a jelszót';
+$lang['Webmaster password'] = 'Webmester jelszó';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Kezelje bizalmasan az adatokat, ezek lehetővé teszik a hozzáférést az adminisztrációs felülethez';
+$lang['Password [confirm]'] = 'Jelszó [megerősítés]';
+$lang['verification'] = 'jelszó egyezőségének ellenőrzése';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Segítségre van szüksége ? Kérdéseit itt teheti fel: <a href="%s">Piwigo üzenőfal</a>.';
+$lang['Webmaster mail address'] = 'Webmester e-mail cím';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'A látogatók ezen az e-mail címen tudják felvenni a kapcsolatot az adminisztrátorral';
+$lang['PHP 5 is required'] = 'PHP 5 szükséges';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Úgy tűnik, a tárhelyszolgáltatójánál jelenleg futó PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo megpróbálhatja bekapcsolni a PHP 5-öt azáltal, hogy létrehoz vagy módosít egy .htaccess fájlt.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Figyelem: Ha meg tudja változtatni a PHP konfigurációt, indítsa újra a Piwigot.';
+$lang['Try to configure PHP 5'] = 'Próbálja meg beállítani a PHP 5-öt';
+$lang['Sorry!'] = 'Elnézést!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nem tudta beállítani a PHP 5-öt.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Lehet, hogy a tárhely szolgáltató támogatja a PHP 5-öt. A bekapcsoláshoz keresse meg őket.";
+$lang['Hope to see you back soon.'] = 'Remélem később viszontlátjuk.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulálunk, a Piwigo telepítése sikeresen befejeződött';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Egy lehetséges megoldás a szöveget az alul lévő dobozba másolni, és beilleszteni a "local/config/database.inc.php" fájlba. (Figyelem: database.inc.php csak azt tartalmazhatja amit a szövegterület, soremelés vagy üres karakterhely nélkül)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'A local/config/database.inc.php konfigurációs fájl létrehozása sikertelen.';
+$lang['Download the config file'] = 'Konfigurációs fájl letöltése';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Letöltheti a konfigurációs fájlt és töltse fel a telepítésének local/config könyvtárába.';
+$lang['Just another Piwigo gallery'] = 'Csak egy újabb Piwigo galéria';
+$lang['Welcome to my photo gallery'] = 'Üdvözöljük a képgalériában';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Kérdése van? Keresse fel fórumunkat : %s';
+$lang['Welcome to your new installation of Piwigo!'] = 'Köszönt a frissen telepített Piwigo galéria!';
+?>
Index: tags/2.4.0RC3/language/hu_HU/iso.txt
===================================================================
--- tags/2.4.0RC3/language/hu_HU/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Magyar [HU]
Index: tags/2.4.0RC3/language/hu_HU/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/hu_HU/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/hu_HU/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Frissítés';
+$lang['Upgrade from version %s to %s'] = 'Verziófrissítés %s verzióról %s verzióra';
+$lang['Statistics'] = 'Statisztikák';
+$lang['total upgrade time'] = 'teljes frissítési idő';
+$lang['total SQL time'] = 'teljes SQL idő';
+$lang['SQL queries'] = 'SQL lekérdezés';
+$lang['Upgrade informations'] = 'Frissítési információk';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Végezze el a karbantartás ellenőrzést [Adminisztráció>Eszközök>Karbantartás] ha bármilyen problémával találkozna.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'A frissítés csak rendszergazda jogosultsággal futtatható, kérjük jelentkezzen be.';
+$lang['You do not have access rights to run upgrade'] = 'Önnek nincs jogosultsága a frissítés elvégzéséhez';
+
+// Upgrade informations from upgrade_1.3.1.php
+$lang['All sub-albums of private albums become private'] = 'Az összes belső album privát albummá válik';
+$lang['User permissions and group permissions have been erased'] = 'A felhasználói és csoport jogosultságok törlésre kerültek';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Csak a bélyegképek prefixe és a webmester email címe került mentésre az előző konfigurációból.';
+// missing translations 2.1.0 RC1
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Ez az oldal felajánlja az adatbázis frissítését, frissítse a Piwigot a régi verzióról az új verzióra. A frissítési asszisztens szerint jelenleg a <strong>%s verzió</strong> fut (vagy azzal egyenértékű).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Elővigyázatosságból a bővítmények ki vannak kapcsolva. Újraaktiválás előtt a bővítmény frissítéseket ellenőrizni kell:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'A(z) <i>%s</i>, elé <b>?></b>, beszúrni:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Elővigyázatosságból az alábbi témák kikapcsolásra kerültek. Frissítés előtt a témákat ellenőrizni kell, majd aktiválásra kerülhetnek:';
+
+?>
Index: tags/2.4.0RC3/language/index.php
===================================================================
--- tags/2.4.0RC3/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/is_IS/about.html
===================================================================
--- tags/2.4.0RC3/language/is_IS/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/is_IS/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+<p>Þetta mynda gallerí er byggt á Piwigo.</p>
+
+<p>Piwigo er mynda hugbúnaður fyrir vefinn, byggt af virku
+samfélag notenda og þróunaraðila. Viðbætur gera Piwigo auðveldlega
+sérsníðanlegt.
+Rúsínan í pylsuendanum. Piwigo er óskeypis og opinn uppspretta.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Heimsækja heimasíðu Piwigo </a></p>
+
+<p>Íslensku þýðing er viðhaldið af Wallster:
+    <ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=10283">Wallster</a></li>
+    </ul>
+</p>
Index: tags/2.4.0RC3/language/is_IS/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/is_IS/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/is_IS/common.lang.php	(revision 14585)
@@ -0,0 +1,345 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Íslenska [IS]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Íslenska';
+$lang_info['country'] = 'Ísland';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'is';
+$lang_info['zero_plural'] = true;
+
+$lang['%.2f (rated %d times)'] = '%.2f (gefið einkun %d sinnum)';
+$lang['%d Kb'] = '%d Kb';
+$lang['%d comment to validate'] = '%d athugasemd til að staðfesta';
+$lang['%d comments to validate'] = '%d athugasemdir til að staðfesta';
+$lang['%d new comment'] = '%d ný athugasemt';
+$lang['%d new comments'] = '%d nýar athugasemtir';
+$lang['%d comment'] = '%d athugasemd';
+$lang['%d comments'] = '%d athugasemdir';
+$lang['%d hit'] = '%d ýtt á';
+$lang['%d hits'] = '%d ýtt á';
+$lang['%d new user'] = '%d nýr notandi';
+$lang['%d new users'] = '%d nýir notendur';
+$lang['About'] = 'Um';
+$lang['All tags'] = 'Öll merki';
+$lang['Any tag'] = 'Hvaða merki sem er';
+$lang['At least one listed rule must be satisfied.'] = 'Að minsta kosti einn flokkur verður að vera valinn.';
+$lang['Author'] = 'Höfundur';
+$lang['Average rate'] = 'Meðal einkun';
+$lang['Close this window'] = 'Loka þessum glugga';
+$lang['Confirm Password'] = 'Staðfesta Lykilorð';
+$lang['Connection settings'] = 'Stillingar fyrir tengingu';
+$lang['Login'] = 'Innskráning';
+$lang['Contact webmaster'] = 'Hafa samband við webmaster';
+$lang['Create a new account'] = 'Stofnan nýjan aðgang';
+$lang['Created on'] = 'Stofnað á';
+$lang['Creation date'] = 'Stofnunar dagur';
+$lang['Current password is wrong'] = 'Núverandi lykilorð er vitlaust';
+$lang['Dimensions'] = 'Stærð';
+$lang['Display'] = 'Sýna';
+$lang['Each listed rule must be satisfied.'] = 'Hver skráð viðmiðun verður að vera uppfyllt.';
+$lang['Email address'] = 'Tölvupóstur';
+$lang['Enter your personnal informations'] = 'Settu inn persónu upplýsingar';
+$lang['Error sending email'] = 'Villa við sendingu tölvupósts';
+$lang['File name'] = 'Nafn skjals';
+$lang['File'] = 'Skjal';
+$lang['Filesize'] = 'Stærð skjals';
+$lang['Filter and display'] = 'Sýja og sýna';
+$lang['Filter'] = 'Sýja';
+$lang['Forgot your password?'] = 'Gleymt lykilorð?';
+$lang['Go through the gallery as a visitor'] = 'Skoða myndasafn sem gestur';
+$lang['Help'] = 'Hjálp';
+$lang['Identification'] = 'Auðkenni';
+$lang['Keyword'] = 'Aðalorð';
+$lang['Links'] = 'Hlekkur';
+$lang['N/A'] = 'N/A';
+$lang['month'][10] = "Október";
+$lang['month'][11] = "Nóvember";
+$lang['month'][12] = "Desember";
+$lang['month'][1] = "Janúar";
+$lang['month'][2] = "Febrúar";
+$lang['month'][3] = "Mars";
+$lang['month'][4] = "Apríl";
+$lang['month'][5] = "Maí";
+$lang['month'][6] = "Júní";
+$lang['month'][7] = "Júlí";
+$lang['month'][8] = "Ágúst";
+$lang['month'][9] = "September";
+$lang['day'][0] = "Sunnudagur";
+$lang['day'][1] = "Mánudagur";
+$lang['day'][2] = "Þriðjudagur";
+$lang['day'][3] = "Miðvikudagur";
+$lang['day'][4] = "Fimmtudagur";
+$lang['day'][5] = "Föstudagur";
+$lang['day'][6] = "Laugardagur";
+$lang['Complete RSS feed (photos, comments)'] = 'Klára RSS flæði (myndir, athugasemdir)';
+$lang['Photos only RSS feed'] = 'aðeins myndir RSS flæði';
+$lang['New on %s'] = 'Nýtt á %s';
+$lang['Notification'] = 'Tilkynning';
+$lang['Number of items'] = 'fjöldi atriða';
+$lang['Original dimensions'] = 'Upprunaleg stærð';
+$lang['Password forgotten'] = 'Gleymdir þú lykilorðinu þínu?';
+$lang['Password'] = 'Lykilorð';
+$lang['Post date'] = 'Birt á';
+$lang['Posted on'] = 'Birt á';
+$lang['Profile'] = 'Síðan mín';
+$lang['Quick connect'] = 'Snögg tengjast';
+$lang['RSS feed'] = 'RSS flæði';
+$lang['Rate'] = 'Einkun';
+$lang['Register'] = 'Nýskráning';
+$lang['Registration'] = 'Skráning';
+$lang['Related tags'] = 'Svipuð merki';
+$lang['Reset'] = 'Endurstilla';
+$lang['Retrieve password'] = 'Sækja lykilorð';
+$lang['Search rules'] = 'Leitarskilyrði';
+$lang['Search tags'] = 'Leita að merki';
+$lang['Search'] = 'Leita';
+$lang['display available tags'] = 'Sýna tiltæk merki';
+$lang['Since'] = 'Frá';
+$lang['Sort by'] = 'Flokka eftir';
+$lang['Sort order'] = 'Flokkunar röð';
+$lang['Tag'] = 'Merki';
+$lang['Tags'] = 'Merki';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS flæði gefur tilkynningu um nýja atburði á þessari vefsíðu:  nýjar myndir, uppfærslur albúma, Nýjar athugasemdir. Til að nota með RSS flæða lesara.';
+$lang['Unknown feed identifier'] = 'Óþekkt flæði auðkenni';
+$lang['User comments'] = 'Athugasemdir notenda';
+$lang['Username'] = 'Notendanafn';
+$lang['Visits'] = 'Heimsóknir';
+$lang['Webmaster'] = 'Vefstjóri';                                             
+$lang['Week %d'] = 'Vika %d';
+$lang['About Piwigo'] = 'Um Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Þú hefur ekki leyfi til að fá aðgang að umbeðini síðu';
+$lang['Add to caddie'] = 'Bæta við caddie';
+$lang['add this photo to your favorites'] = 'bæta þessari mynd við uppáhalds';
+$lang['Administration'] = 'Stjórnun';
+$lang['all'] = 'allt';
+$lang['%d album updated'] = '%d albúm uppfært';
+$lang['%d albums updated'] = '%d albúm uppfærð';
+$lang['%d new photo'] = '%d ný mynd';
+$lang['%d new photos'] = '%d nýjar myndir';
+$lang['Albums'] = 'Albúm';
+$lang['Album'] = 'Albúm';
+$lang['ascending'] = 'hækkandi';
+$lang['author(s) : %s'] = 'höfundur/ar : %s';
+$lang['Expand all albums'] = 'Stækka öll albúm';
+$lang['posted after %s (%s)'] = 'Birt eftir %s (%s)';
+$lang['posted before %s (%s)'] = 'Birt fyrir %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'Birt milli %s (%s) og %s (%s)';
+$lang['posted on %s'] = 'Birt á %s';
+$lang['Best rated'] = 'Besta einkun';
+$lang['display best rated photos'] = 'sýna myndir með bestu einkun';
+$lang['caddie'] = 'Caddie';
+$lang['Calendar'] = 'Dagatal';
+$lang['All'] = 'Allt';
+$lang['display each day with photos, month per month'] = 'sýna hvern dag með myndum, hvern mánum';
+$lang['View'] = 'Skoða';
+$lang['chronology_monthly_calendar'] = 'Mánaðar dagatal';
+$lang['chronology_monthly_list'] = 'Mánaðalegur listi';
+$lang['chronology_weekly_list'] = 'Viku listi';
+$lang['Click here if your browser does not automatically forward you'] = 'Smelltu hér ef vafrinn sendir þig ekki áfram sjálfkrafa';
+$lang['comment date'] = 'dasetning athugasemdar';
+$lang['Comment'] = 'Athugasemd';
+$lang['Your comment has been registered'] = 'Athugasemd þín hefur verið skráð';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Vörn gegn spam : vinsamlegast bíðið augnablik áður en þið reynið að birta aðra athugasemd';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Athugasemd þín hefur ekki verið skráð vegna þess að hún stóðst ekki reglur';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Stjórnandi verður að heimila athugasemd þína áður en hún verður sýnileg.';
+$lang['This login is already used by another user'] = 'Þetta notendanafn er nú þegar í notkun';
+$lang['Comments'] = 'Athugasemdir';
+$lang['Add a comment'] = 'Bæta við athugasemd';
+$lang['created after %s (%s)'] = 'búið til eftir %s (%s)';
+$lang['created before %s (%s)'] = 'búið til fyrir %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'búið til milli %s (%s) og %s (%s)';
+$lang['created on %s'] = 'búið til á %s';
+$lang['Customize'] = 'Aðlaga';
+$lang['Your Gallery Customization'] = 'Aðlögun á þínu galleríi';
+$lang['Default'] = 'Upprunalegt';
+$lang['delete this photo from your favorites'] = 'eyða þessari mynd úr uppáhalds';
+$lang['Delete'] = 'Eyða';
+$lang['descending'] = 'lækkandi';
+$lang['Download'] = 'niðurhal';
+$lang['Download this file'] = 'sækja þessa skrá';
+$lang['edit'] = 'breyta';
+$lang['wrong date'] = 'vitlaus dagsetning';
+$lang['excluded'] = 'útilokað';
+$lang['Your favorites'] = 'Þínar uppáhalds';
+$lang['display your favorites photos'] = 'Sýna uppáhalsd myndirnar þínar';
+$lang['Favorites'] = 'Uppáhalds';
+$lang['First'] = 'Fyrsta';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleríið er lokað vegna viðhalds. Vinsamlegast reynið síðar.';
+$lang['Page generated in'] = 'Síða mynduð í';
+$lang['guest'] = 'gestur';
+$lang['Hello'] = 'Halló';
+$lang['available for administrators only'] = 'Aðeins í boði fyrir stjórnendur';
+$lang['display this album'] = 'sýna þetta albúm';
+$lang['display last user comments'] = 'sýna athugasemdir síðasta notenda';
+$lang['customize the appareance of the gallery'] = 'aðlaga útlit gallerís';
+$lang['search'] = 'leita';
+$lang['Home'] = 'Heim';
+$lang['in this album'] = 'í þessu albúmi';
+$lang['in %d sub-album'] = 'in %d undir flokkur';
+$lang['in %d sub-albums'] = 'in %d undir flokkar';
+$lang['included'] = 'innifalið';
+$lang['Invalid password!'] = 'ógilt lykilorð!';
+$lang['Language'] = 'Tungumál';
+$lang['last %d days'] = 'síðustu %d daga';
+$lang['Last'] = 'síðasta';
+$lang['Logout'] = 'Útsrá';
+$lang['obligatory'] = 'skylda';
+$lang['Maximum photo height'] = 'Hámark hæð myndar';
+$lang['Maximum height must be a number superior to 50'] = 'Hámarks hæð verður að vera hærri en 50';
+$lang['Maximum photo width'] = 'Hámark breidd myndar';
+$lang['Maximum width must be a number superior to 50'] = 'Hámarks beidd verður að vera hærri en 50';
+$lang['display a calendar by creation date'] = 'sýna dagatal hjá dagsetningu sem búið til var á';
+$lang['display all photos in all sub-albums'] = 'sýna allar myndir í undir flokki';
+$lang['return to normal view mode'] = 'aftur í venjulegan skjá';
+$lang['display a calendar by posted date'] = 'sýna dagatal hjá dagsetningu sem birt var á';
+$lang['Most visited'] = 'Oftast heimsótt';
+$lang['display most visited photos'] = 'sýna mest heimsóttar myndir';
+$lang['Unknown identifier'] = 'Óþekkt auðkenni';
+$lang['New password'] = 'Nýtt lykilorð';
+$lang['Rate this photo'] = 'Gefa þessari mynd einkunn';
+$lang['Next'] = 'Næsta';
+$lang['no rate'] = 'engin einkunn';
+$lang['Photos posted within the last %d day.'] = 'Aðeins myndir birtar á síðasta %d degi.';
+$lang['Photos posted within the last %d days.'] = 'Aðeins myndir birtar á síðustu %d dögum.';
+$lang['password updated'] = 'lykilorð uppfært';
+$lang['Recent period must be a positive integer value'] = 'Nýlegt tímabil verður að vera a jákvæð heiltala gildi';
+$lang['photo'] = 'mynd';
+$lang['Click on the photo to see it in high definition'] = 'Styðjið á myndina til að sjá hana í háskerpu';
+$lang['Show file metadata'] = 'Sýna skrá metadata';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Valmöguleikar';
+$lang['Previous'] = 'Fyrri';
+$lang['Random photos'] = 'Myndir af handahófi';
+$lang['display a set of random photos'] = 'sýna handahófskent sett af myndum';
+$lang['Recent albums'] = 'Nýleg albúm';
+$lang['display recently updated albums'] = 'sýna nýlega uppfærð albúm';
+$lang['Recent period'] = 'Nýlegt tímabil';
+$lang['Recent photos'] = 'Nýlegar myndir';
+$lang['display most recent photos'] = 'sýna nýkegustu myndirnar';
+$lang['Redirection...'] = 'Áframsending…';
+$lang['Please, enter a login'] = 'Vinsamlegast sáið inn notendanafn';
+$lang['login mustn\'t end with a space character'] = 'notendanafn má ekki enda á bili';
+$lang['login mustn\'t start with a space character'] = 'notendanafn má ekki byrja á bili';
+$lang['this login is already used'] = 'þetta notendanafn er nú þegar í notkun';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'netfang verður að vera xxx@yyy.eee (example : jack@altern.org)';
+$lang['please enter your password again'] = 'vinsamlegast sláið lykilorð aftur inn';
+$lang['Auto login'] = 'Sjálfvirk innskráning';
+$lang['remove this tag from the list'] = 'fjarlægja merki úr lista';
+$lang['representative'] = 'Fulltrúi';
+$lang['Search for Author'] = 'Leita að höfundi';
+$lang['Search in albums'] = 'Leita í albúmum';
+$lang['Search by date'] = 'Leita eftir dagsetningu';
+$lang['Date'] = 'Dagsetning';
+$lang['End-Date'] = 'loka dagsetning';
+$lang['Kind of date'] = 'Hvers konar dagsetning';
+$lang['Search for words'] = 'Leita að orðum';
+$lang['Search for all terms'] = 'Leita að öllum skilmálum';
+$lang['Search for any term'] = 'Leita að hvaða skilmálum sem er';
+$lang['Empty query. No criteria has been entered.'] = 'Tóm fyrirspurn. Engin viðmið hafa verið skráð.';
+$lang['Search results'] = 'Leitar niðurstöður';
+$lang['Search in sub-albums'] = 'Leita í undir flokkum';
+$lang['searched words : %s'] = 'Orð sem leitað er að :%s';
+$lang['Contact'] = 'Tengiliðir';
+$lang['set as album representative'] = 'setja sem forsíðu á albúmi';
+$lang['Show number of comments'] = 'Sýna fjölda athugasemda';
+$lang['Show number of hits'] = 'Sýna fjölda niðurstaða';
+$lang['slideshow'] = 'myndasýning';
+$lang['stop the slideshow'] = 'stoppa myndasýningu';
+$lang['Specials'] = 'Meira';
+$lang['SQL queries in'] = 'SQL spurningar inn';
+$lang['display only recently posted photos'] = 'aðeins sýna myndir sem nýlega voru settar inn';
+$lang['return to the display of all photos'] = 'aftur í sýningu á öllum myndum';
+$lang['the beginning'] = 'upphafið';
+$lang['Interface theme'] = 'Þema';
+$lang['Thumbnails'] = 'Smámyndir';
+$lang['Menu'] = 'Valmynd';
+$lang['A comment on your site'] = 'Athugasemd á síðuni þinni';
+$lang['today'] = 'í dag';
+$lang['Update your rating'] = 'uppfæra einkunn þína';
+$lang['the username must be given'] = 'notendanafnins er krafist';
+$lang['useful when password forgotten'] = 'gagnlegt ef lykilorð gleymist';
+$lang['Quick search'] = 'Hraðleit';
+$lang['Connected user: %s'] = 'Tengdur notandi: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Vafri: %s';
+$lang['Author: %s'] = 'Höfundur: %s';
+$lang['Comment: %s'] = 'Athugasemd: %s';
+$lang['Comment by %s'] = 'Athugasemd eftir %s';
+$lang['User: %s'] = 'Notandi: %s';
+$lang['Email: %s'] = 'Netfangl: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Skráning %s';
+$lang['Album: %s'] = 'Albúm: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Slæm staða fyrir notanda "gestur", sjálfgefin staða verðu notuð. Vinsamlegast tilkynnið til vefstjóra.';
+$lang['this email address is already in use'] = 'þetta netfange er nú þegar í notkun';
+$lang['Album results for'] = 'Albúm noðurstöðut fyrir';
+$lang['Tag results for'] = 'Merkja niðurstöður fyrir';
+$lang['from %s to %s'] = 'frá %s til %s';
+$lang['Play of slideshow'] = 'Spila myndasýningu';
+$lang['Pause of slideshow'] = 'setja hlé á myndasýningu';
+$lang['Repeat the slideshow'] = 'Endur taka myndasýningu';
+$lang['Not repeat the slideshow'] = 'Ekki endur taka myndasýningu';
+$lang['Reduce diaporama speed'] = 'Minnka hraða á myndasýningu';
+$lang['Accelerate diaporama speed'] = 'Auka hraða á myndasýningu';
+$lang['Submit'] = 'Senda inn';
+$lang['Yes'] = 'Já';
+$lang['No'] = 'Nei';
+$lang['%d photo'] = '%d mynd';
+$lang['%d photos'] = '%d myndir';
+$lang['%d photo is also linked to current tags'] = '%d mynd er einnig tengd við núverandi merkingar';
+$lang['%d photos are also linked to current tags'] = '%d myndir eru einnig tengdar við núverandi merkingar';
+$lang['display photos linked to this tag'] = 'sýna myndir tengdar við þetta merki';
+$lang['photos posted during the last %d days'] = 'myndir birtar síðustu %d daga';
+$lang['Piwigo Help'] = 'Piwigo hjáp';
+$lang['Rank'] = 'Staða';
+$lang['group by letters'] = 'hópa eftir bósktöfum';
+$lang['letters'] = 'bókstafir';
+$lang['show tag cloud'] = 'sýna merkingar ský';
+$lang['cloud'] = 'ský';
+$lang['Reset to default values'] = 'Endurstilla á sjálfgefinn gildi';
+$lang['delete all photos from your favorites'] = 'eyða öllum myndum úr uppáhalds';
+$lang['Sent by'] = 'Sent frá';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookie er lokað eða ekki stutt af vafranum þínum. Þú verður að virkaj cookie til að tengjast.n.';
+$lang['Edit a comment'] = 'Breyta athugasemd';
+$lang['Are you sure?'] = 'Ertu viss?';
+$lang['(!) This comment requires validation'] = '(!) Þessi athugasemd krefst staðfestingar';
+$lang['Welcome'] = 'Velkomin';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Velkomin í Piwigo myndasafnið þitt!';
+$lang['... or browse your empty gallery'] = '... eða skoða tóma myndasafnið þitt';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eða vinsamlegast slökkva á þessum skilaboðum, ég mun rata sjálf/ur';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Halló %s, Piwigo myndasafnið þitt er tómt!';
+$lang['I want to add photos'] = 'Ég vil bæta við myndum';
+$lang['Manage this user comment: %s'] = 'Stjórna athugasemd þessa notenda: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Netfang vantar. Vinsamlegast tilgreinið netfang.';
+$lang['This author modified following comment:'] = 'Þessi höfundur breytti eftirfarandi athugasemd:';
+$lang['This author removed the comment with id %d'] = 'Þessi höfundur fjarlægði athugasemdina með id %d';
+$lang['html tags are not allowed in login'] = 'html merkingar eru ekki leyfilegt við ínnskráningu';
+?>
Index: tags/2.4.0RC3/language/is_IS/index.php
===================================================================
--- tags/2.4.0RC3/language/is_IS/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/is_IS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/is_IS/iso.txt
===================================================================
--- tags/2.4.0RC3/language/is_IS/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/is_IS/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Íslenska [IS]
Index: tags/2.4.0RC3/language/it_IT/about.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/about.html	(revision 14585)
@@ -0,0 +1,18 @@
+<p>Questa galleria è basata su Piwigo.</p>
+
+<p>Piwigo è un software per creare gallerie fotografiche sul web, costruito 
+da una comunità attiva d'utenti e sviluppatori. Le estensioni rendono Piwigo 
+facilmente personalizzabile. Inoltre, ciliegina sulla torta, Piwigo è gratuito ed 
+open source.</p>
+
+<p id="linkToPiwigo"><a href="http://it.piwigo.org">Visitate il sito ufficiale di Piwigo</a></p>
+
+<p>The italian translation is maintained by (in alphabetical order):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=6864">Ericnet</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=10898">Gdvpixel</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=2365">rio</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=5628">Sugar888</a></li>
+</ul>
+.... Many thanks to you</p> 
Index: tags/2.4.0RC3/language/it_IT/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/admin.lang.php	(revision 14585)
@@ -0,0 +1,900 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = '%d associazione';
+$lang['%d associations'] = '%d associazioni';
+$lang['%d album including'] = '%d album incluso';
+$lang['%d albums including'] = '%d album inclusi';
+$lang['%d physical'] = '%d fisico';
+$lang['%d physical'] = '%d fisici';
+$lang[' and %d virtual'] = ' e %d virtuale';
+$lang[' and %d virtual'] = ' e %d virtuali';
+$lang['%d album moved'] = '%d album spostato';
+$lang['%d albums moved'] = '%d album spostati';
+$lang['%d group'] = '%d gruppo';
+$lang['%d groups'] = '%d gruppi';
+$lang['%d member'] = '%d utente';
+$lang['%d members'] = '%d utenti';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tags';
+$lang['%d user comment rejected'] = '%d commento utente rifiutato';
+$lang['%d user comments rejected'] = '%d commenti utente rifiutati';
+$lang['%d user comment validated'] = '%d commento utente accettato';
+$lang['%d user comments validated'] = '%d commenti utenti accettati';
+$lang['%d user deleted'] = '%d utente cancellato';
+$lang['%d users deleted'] = '%d utenti cancellati';
+$lang['%d user'] = '%d utente';
+$lang['%d users'] = '%d utenti';
+$lang['%d waiting for validation'] = '%d in attesa di accettazione';
+$lang['Actions'] = 'Azioni';
+$lang['Activate'] = 'Attivare';
+$lang['Add/delete a permalink'] = 'Aggiungere/cancellare un permalink';
+$lang['Add a tag'] = 'Aggiungere un tag';
+$lang['Add a user'] = 'Aggiungere un utente';
+$lang['Add group'] = 'Aggiungere un gruppo';
+$lang['Add'] = 'Aggiungere';
+$lang['Allow user registration'] = 'Consentire l\'iscrizione degli \'ospiti\'';
+$lang['Apply to sub-albums'] = 'Applicare al sub-album';
+$lang['Associated'] = 'Associato a';
+$lang['Caddie management'] = 'Gestione del cestino';
+$lang['Caddie'] = 'Cestino';
+$lang['Albums authorized thanks to group associations'] = 'Album accessibili grazie all\'appartenenza ai gruppi';
+$lang['Album manual order was saved'] = 'L\'ordinamento manuale degli album è stato salvato';
+$lang['Album photos associated to the following albums: %s'] = 'Le foto dell\'album sono stati associati agli album seguenti : %s';
+$lang['Check for upgrade failed for unknown reasons.'] = 'La verifica dell\'ultima versione sul server è fallita per le ragioni sconosciute.';
+$lang['Check for upgrade'] = 'Controllo aggiornamenti';
+$lang['Comments for all'] = 'Commenti per tutti';
+$lang['Current name'] = 'Nome attuale';
+$lang['Database'] = 'Database';
+$lang['Deactivate'] = 'Disattivare';
+$lang['Deactivate all'] = 'Disattivare tutto';
+$lang['Delete Representant'] = 'Cancellare la copertina';
+$lang['Delete selected tags'] = 'Cancellare i tags selezionati';
+$lang['Delete selected users'] = 'Cancellare gli utenti selezionati';
+$lang['Deletions'] = 'Eliminazione foto';
+$lang['Deny selected groups'] = 'Vietare l\'accesso ai gruppi selezionati';
+$lang['Deny selected users'] = 'Vietare l\'accesso agli utenti selezionati';
+$lang['Description'] = 'Descrizione';
+$lang['Display options'] = '0pzioni di visualizzazione';
+$lang['Dissociated'] = 'Dissociata da';
+$lang['Does not represent'] = 'Non rappresenta';
+$lang['Edit selected tags'] = 'Modificare i tags selezionati';
+$lang['Edit tags'] = 'Modificare i tags';
+$lang['Email admins when a new user registers'] = 'Notificare gli amministratori dell\'iscrizione di un nuovo utente';
+$lang['Email admins when a valid comment is entered'] = 'Notificare gli amministratori della presenza di un nuovo commento';
+$lang['Email admins when a comment requires validation'] = 'Notificare gli amministratori quando un commento richiede un\'approvazione';
+$lang['Environment'] = 'Ambiente';
+$lang['Form'] = 'Modulo';
+$lang['Gallery title'] = 'Titolo della galleria';
+$lang['Grant selected groups'] = 'Dare l\'accesso ai gruppi selezionati';
+$lang['Grant selected users'] = 'Dare l\'accesso agli utenti selezionati';
+$lang['Group name'] = 'Nome del gruppo';
+$lang['Groups'] = 'Gruppi';
+$lang['Guests'] = 'Ospiti';
+$lang['History'] = 'Cronologia';
+$lang['Informations'] = 'Informazioni';
+$lang['Install'] = 'Installare';
+$lang['Link all album photos to a new album'] = 'Associare tutte le foto dell\'album ad un nuovo album';
+$lang['Link all album photos to some existing albums'] = 'Associare tutte le foto dell\'album a degli album esistenti';
+$lang['Linked albums'] = 'Album associati';
+$lang['Lock gallery'] = 'Blocco della galleria';
+$lang['Maintenance'] = 'Manutenzione';
+$lang['Edit album permissions'] = 'Gestire i permessi di un album';
+$lang['Manage permissions for group "%s"'] = 'Gestire i permessi per il gruppo "%s"';
+$lang['Manage permissions for user "%s"'] = 'Gestire i permessi per l\'utente "%s"';
+$lang['Manage tags'] = 'Gestire i tags';
+$lang['Members'] = 'Membri';
+$lang['Metadata synchronized from file'] = 'Metadati sincronizzati dal file';
+$lang['Move albums'] = 'Spostare gli album';
+$lang['Move'] = 'Spostare';
+$lang['Name'] = 'Nome';
+$lang['New name'] = 'Nuovo nome';
+$lang['New parent album'] = 'Nuovo album principale';
+$lang['New tag'] = 'Nuovo tag';
+$lang['Number of comments per page'] = 'Numero di commenti per pagina';
+$lang['Number of rates'] = 'Numero di voti';
+$lang['Number of thumbnails to create'] = 'Numero di miniature da creare';
+$lang['Only private albums are listed'] = 'Solo gli album privati sono elencati';
+$lang['Operating system'] = 'Sistema operativo';
+$lang['Options'] = 'Opzioni';
+$lang['Other private albums'] = 'Altri album privati';
+$lang['Page banner'] = 'Banner di pagina';
+$lang['Parent album'] = 'Album principale';
+$lang['Path'] = 'Percorso';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Il permalink %s è stato usato precedentemente dall\'album %s. Cancellarlo prima dallo storico';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Il permalink deve essere composto unicamente dai caratteri seguenti : "a-zA-Z0-9", "-" o "_". Non deve essere numerico o iniziare con un numero seguito da "-"';
+$lang['Permalink %s is already used by album %s'] = 'Il permalink %s è già in uso nell\'album %s';
+$lang['Permalink history'] = 'Cronologia dei permalinks';
+$lang['Permalinks'] = 'Permalinks';
+$lang['Permission denied'] = 'Accesso non autorizzato';
+$lang['Permission granted thanks to a group'] = 'Accesso autorizzato grazie al\'appartenenza ai gruppi';
+$lang['Permission granted'] = 'Accesso autorizzato';
+$lang['Photo informations updated'] = 'Le informazioni della foto sono state aggiornate';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Posizione';
+$lang['Preferences'] = 'Preferenze';
+$lang['Properties'] = 'Proprietà ';
+$lang['Random photo'] = 'Foto a caso';
+$lang['Rate date'] = 'Data del voto';
+$lang['Rating by guests'] = 'Voti degli ospiti';
+$lang['Rating'] = 'Voto';
+$lang['Reject'] = 'Rifiutare';
+$lang['Representant'] = 'Copertina';
+$lang['Representation of albums'] = 'Rappresentazione degli album';
+$lang['Representative'] = 'Rappresentativa';
+$lang['Represents'] = 'Rappresenta';
+$lang['Save order'] = 'Salvare l\'ordine';
+$lang['Save to permalink history'] = 'Salvare nella cronologia dei permalinks';
+$lang['Select at least one album'] = 'Selezionare almeno un album';
+$lang['Select at least one photo'] = 'Scegliere almeno una foto';
+$lang['Select at least one user'] = 'Scegliere almeno un\'utente';
+$lang['Show info'] = 'Mostra le informazioni';
+$lang['Site manager'] = 'Gestione dei siti';
+$lang['Status'] = 'Stato';
+$lang['Statistics'] = 'Statistiche';
+$lang['Storage album'] = 'Album di memorizzazione';
+$lang['Sum of rates'] = 'Somma dei voti';
+$lang['Tag "%s" already exists'] = 'Il tag "%s" esiste già ';
+$lang['Tag "%s" was added'] = 'Il tag "%s" è stato aggiunto';
+$lang['Tag selection'] = 'Selezione dei tags';
+$lang['The %d following tags were deleted'] = 'I %d tags seguenti sono stati cancellati';
+$lang['Unable to check for upgrade.'] = 'Non è stato possibile controllare eventuali aggiornamenti.';
+$lang['Uninstall'] = 'Disinstallare';
+$lang['Use the default photo sort order (defined in the configuration file)']='Usare l\'ordinamento delle foto di default (cosi come definito nel file di configurazione)';
+$lang['User comments validation'] = 'Approvare i commenti degli utenti';
+$lang['Users'] = 'Utenti';
+$lang['Validate'] = 'Approvare';
+$lang['Validation'] = 'Richiedere l\'approvazione';
+$lang['Version'] = 'Versione';
+$lang['Virtual albums to move'] = 'Album virtuali da spostare';
+$lang['Virtual album name'] = 'Nome dell\'album virtuale';
+$lang['Webmaster cannot be deleted'] = 'Il Webmaster non può essere cancellato';
+$lang['You are running on development sources, no check possible.'] = 'State lavorando con una versione di sviluppo, impossibile verificare l\'ultima versione.';
+$lang['You cannot delete your account'] = 'Non potete cancellare il vostro account utente';
+$lang['You cannot move an album in its own sub album'] = 'Non si può spostare un album nel proprio sub-album';
+$lang['You need to confirm deletion'] = 'Dovete confermare la cancellazione';
+$lang['Associate to album'] = 'Associare all\'album';
+$lang['associate to group'] = 'Associare al gruppo';
+$lang['Authorized'] = 'Autorizzate';
+$lang['Add a virtual album'] = 'Aggiungere un album virtuale';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizzare gli utenti ad aggiungere dei commenti  nell\'album selezionato';
+$lang['The name of an album must not be empty'] = 'Il nome dell\'album non può rimanere vuoto';
+$lang['Lock albums'] = 'Bloccare gli album';
+$lang['Private'] = 'Album privato';
+$lang['Public'] = 'Album pubblico';
+$lang['Find a new representant by random'] = 'Scegliere una nuova copertina a caso';
+$lang['Public / Private'] = 'Pubblica / Privata';
+$lang['Manage authorizations for selected albums'] = 'Gestire le autorizzazioni per gli album selezionati';
+$lang['Virtual album added'] = 'Album virtuale aggiunto';
+$lang['Virtual album deleted'] = 'Album virtuale cancellato';
+$lang['Access type'] = 'Tipo di accesso';
+$lang['Information data registered in database'] = 'Informazioni registrate nel database';
+$lang['Default display'] = 'Visualizzazione di default';
+$lang['The gallery URL is not valid.'] = 'L\'URL della galleria non è valido.';
+$lang['Main'] = 'Principale';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Il numero di commenti per pagina deve essere compreso tra 5 e 50.';
+$lang['Configuration'] = 'Configurazione';
+$lang['confirm'] = 'Confermare';
+$lang['Date'] = 'Data';
+$lang['delete album'] = 'Cancellare l\'album';
+$lang['Dissociate from album'] = 'Dissociare dall\'album';
+$lang['dissociate from group'] = 'Dissociare dal gruppo';
+$lang['Album updated successfully'] = 'Le informazioni dell\'album sono state aggiornate con successo.';
+$lang['photos per page'] = 'foto per pagina';
+$lang['High definition enabled'] = 'Alta definizione attiva';
+$lang['File'] = 'File';
+$lang['first photo added on %s'] = 'prima foto aggiunta il %s';
+$lang['Forbidden'] = 'Vietati';
+$lang['global mode'] = 'Modalità globale';
+$lang['group "%s" added'] = 'Gruppo "%s" aggiunto';
+$lang['group "%s" deleted'] = 'Gruppo "%s" cancellato';
+$lang['group "%s" updated'] = 'Gruppo "%s" aggiornato';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Il nome del gruppo non deve contenere " o \' e non deve essere vuoto.';
+$lang['This name is already used by another group.'] = 'Questo nome è già  usato per un altro gruppo.';
+$lang['High definition'] = 'Alta definizione';
+$lang['jump to album'] = 'Andare all\'album';
+$lang['jump to photo'] = 'Visionare la foto';
+$lang['leave'] = 'Abbandonare';
+$lang['Lock'] = 'Bloccare';
+$lang['Locked'] = 'Bloccate';
+$lang['manage album photos'] = 'Gestire le foto dell\'album';
+$lang['manage sub-albums'] = 'Gestire i sub-album';
+$lang['Manage'] = 'Gestire';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Il tempo di esecuzione è scaduto, il processo deve continuare [Tempo stimato: %d secondo].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Il tempo di esecuzione è scaduto, il processo deve continuare [Tempo stimato: %d secondi].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Il tempo di preparazione dell\'elenco degli utenti per l\'invio dell\'email è limitato. Gli altri utenti non sono elencati';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Il tempo per l\'invio dell\'email è limitato. L\'invio delle altre email verra ignorato.';
+$lang['To send ?'] = 'Inviare?';
+$lang['Last send'] = 'Ultimo invio';
+$lang['email'] = 'Email';
+$lang['User'] = 'Utente';
+$lang['See you soon,'] = 'A presto,';
+$lang['Go to'] = 'Andare a';
+$lang['Hello'] = 'Ciao ';
+$lang['New photos were added'] = 'Delle nuove foto sono state aggiunte';
+$lang['on'] = ' il ';
+$lang['between'] = 'tra il ';
+$lang['and'] = ' e il ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Siete stati iscritti dal webmaster del sito per la ricezione di notifiche via email.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Vi siete iscritti per la ricezione di notifiche via email.';
+$lang['To subscribe'] = 'Per iscrivervi';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Per qualsiasi domanda o problema inviare un messaggio a ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemi o domande';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Siete stati cancellati dal webmaster dalla sottoscrizione alla ricezione di notifiche via email.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Vi siete cancellati dalla sottoscrizione alla ricezione di notifiche via email.';
+$lang[', click on'] = ', cliccare su ';
+$lang['To unsubscribe'] = 'Per cancellare la sottoscrizione ';
+$lang['With blank value, gallery title will be used'] = 'Lasciando vuoto verrà  inviato il titolo della galleria';
+$lang['Notification'] = 'Notifica';
+$lang['Error when sending email to %s [%s].'] = 'Errore durante l\'invio dell\'email a %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Email inviata a %s [%s].';
+$lang['%d mail was sent.'] = '%s email inviata.';
+$lang['%d mails were sent.'] = '%s email inviate.';
+$lang['%d mail was not sent.'] = '%s email non è stata inviata.';
+$lang['%d mails were not sent.'] = '%s email non sono state inviate.';
+$lang['No mail to send.'] = 'Nessuna email da inviare.';
+$lang['There is no available subscribers to mail.'] = 'Nessun utente da notificare via email.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Un utente è da notificare solamente se ci sono nuovi elementi disponibili.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Solo il webmaster può accedere a queste informazioni, non gli amministratori.';
+$lang['No user to send notifications by mail.'] = 'Nessun utente da notificare via email.';
+$lang['New photos added'] = 'Nuove foto aggiunte';
+$lang['Subscribe to notification by mail'] = 'Sottoscrivere alla notifica via email';
+$lang['Unsubscribe from notification by mail'] = 'Cancella dalla notifica via email';
+$lang['Parameter'] = 'Parametro';
+$lang['Operation in progress'] = 'Elaborazione in corso.';
+$lang['Continue processing treatment'] = 'Continuare il processo in corso...';
+$lang['Complementary mail content'] = 'Contenuto aggiuntivo dell\'email';
+$lang['Add detailed content'] = 'Invia contenuto dettagliato';
+$lang['Send mail as'] = 'Inviare l\'email come';
+$lang['Send mail to users'] = 'Invia un\'email agli utenti';
+$lang['Send'] = 'Invio';
+$lang['Options'] = 'Opzioni';
+$lang['Subscribed'] = 'Iscritti';
+$lang['Subscribe'] = 'Iscrizione';
+$lang['Parameters'] = 'Parametri';
+$lang['Select recipients'] = 'Selezionare i destinatari';
+$lang['Subscribe/unsubscribe users'] = 'Iscrivere/Cancellare utenti';
+$lang['Unsubscribed'] = 'Non iscritti';
+$lang['%d parameter was updated.'] = '%d parametro è stato aggiornato.';
+$lang['%d parameters were updated.'] = '%d parametri sono stati aggiornati.';
+$lang['%d user was not updated.'] = '%d utente non è stato aggiornato.';
+$lang['%d users were not updated.'] = '%d utenti non sono stati aggiornati.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'L\'utente %s [%s] è stato cancellato dall\'elenco degli iscritti.';
+$lang['User %s [%s] was added to the subscription list.'] = 'L\'utente %s [%s] è stato aggiunto all\'elenco degli iscritti.';
+$lang['%d user was updated.'] = '%d utente aggiornato.';
+$lang['%d users were updated.'] = '%d utenti aggiornati.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'L\'utente %s [%s] non è stato cancellato dall\'elenco degli iscritti.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'L\'utente %s [%s] non è stato aggiunto all\'elenco degli iscritti.';
+$lang['User %s [%s] added.'] = 'Utente %s [%s] aggiunto.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Attenzione: l\'iscrizione o la cancellazione invierà  un\'email agli utenti in questione';
+$lang['Send mail on HTML format'] = 'Invio dell\'email in formato HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Includere le ultime foto per data';
+$lang['Available only with HTML format'] = 'Disponibile unicamente con il formato HTML';
+$lang['no write access'] = 'Nessun accesso in scrittura';
+$lang['Permissions'] = 'Permessi';
+$lang['private'] = 'privato';
+$lang['public'] = 'pubblico';
+$lang['Purge never used notification feeds'] = '"Ripulire" i flussi di notifica mai usati';
+$lang['Purge sessions'] = '"Ripulire" le sessioni';
+$lang['randomly represented'] = 'Copertina a caso';
+$lang['registration date'] = 'Data di registrazione';
+$lang['clean'] = 'Ripulire';
+$lang['Create this site'] = 'Creare questo sito';
+$lang['test'] = 'Verificare';
+$lang['test this remote site'] = 'Verificare sito remoto';
+$lang['remove tags'] = 'Rimuovere i tags';
+$lang['Repair and optimize database'] = 'Riparare e ottimizzare il database';
+$lang['selection'] = 'Selezione';
+$lang['set to'] = 'Impostare a';
+$lang['singly represented'] = 'Copertina fissa';
+$lang['This site already exists'] = 'Questo sito esiste già ';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Creare un nuovo sito: (indicare URL verso "create_listing_file.php")';
+$lang['created'] = 'creato';
+$lang['delete this site and all its attached elements'] = 'Cancellare questo sito e tutte le informazioni ad esso connessi';
+$lang['an error happened'] = 'Si è verificato un\'errore';
+$lang['Local'] = 'Locale';
+$lang['Remote'] = 'Remoto';
+$lang['update the database from files'] = 'Aggiornare il database dai files';
+$lang['status'] = 'Stato';
+$lang['Directory'] = 'Directory';
+$lang['sub-albums'] = 'sub-album';
+$lang['Synchronize metadata'] = 'Sincronizzare i metadati';
+$lang['target'] = 'Target';
+$lang['title'] = 'Titolo';
+$lang['Album list management'] = 'Gestione degli album';
+$lang['Piwigo configuration'] = 'Configurazione di Piwigo';
+$lang['Edit album'] = 'Modificare un album';
+$lang['Group management'] = 'Gestione gruppi';
+$lang['User list'] = 'Elenco utenti';
+$lang['Edit photo information'] = 'Modificare le informazioni della foto';
+$lang['Database synchronization with files'] = 'Sincronizzazione database con i files';
+$lang['all'] = 'Tutto';
+$lang['height must be a number superior to'] = 'l\'altezza deve essere un numero superiore a';
+$lang['width must be a number superior to'] = 'la larghezza deve essere un numero superiore a';
+$lang['for the file format'] = 'per il formato del file';
+$lang['Photo unreachable or no support'] = 'Foto non trovata o non supportata';
+$lang['GD version'] = 'versione GD';
+$lang['General statistics'] = 'Statistiche generali';
+$lang['average time'] = 'tempo medio';
+$lang['number of miniaturized photos'] = 'numero di foto miniaturizzate';
+$lang['total time'] = 'tempo totale';
+$lang['for this file format'] = 'per questo formato di file';
+$lang['unit mode'] = 'Modalità singolo';
+$lang['Unlocked'] = 'Sbloccate';
+$lang['unset'] = 'Svuotare';
+$lang['Update albums informations'] = 'Aggiornare le informazioni degli album';
+$lang['Update photos information'] = 'Aggiornare le informazioni delle foto';
+$lang['Synchronize'] = 'Sincronizzare';
+$lang['reduce to single existing albums'] = 'Trattare un solo album';
+$lang['Choose an option'] = 'Scegli un\'opzione';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Mostrare tutte le informazioni possibili (album e foto aggiunti o eliminati)';
+$lang['Error list'] = 'Elenco degli errori';
+$lang['Errors caption'] = 'Significato degli errori';
+$lang['Detailed informations'] = 'Informazioni dettagliate';
+$lang['File/directory read error'] = 'Errore in letture del file/directory';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Non è possibile accedere al file o alla directory (probabilmente non esiste o l\'accesso è stato negato)';
+$lang['albums deleted in the database'] = 'album cancellati dal database';
+$lang['photos deleted from the database'] = 'foto cancellate dal database';
+$lang['photos candidates for metadata synchronization'] = 'foto in coda per la sincronizzazione dei metadati';
+$lang['photos informations synchronized with files metadata'] = 'informazioni sulle foto sincronizzate con i metadati';
+$lang['errors during synchronization'] = 'Si sono verificati errori durante la sincronizzazione';
+$lang['albums added in the database'] = 'album aggiunti al database';
+$lang['photos added in the database'] = 'foto aggiunte al database';
+$lang['photos updated in the database'] = 'foto aggiornate nel database';
+$lang['Search for new images in the directories'] = 'Cercare nuove immagini nelle directory';
+$lang['added'] = 'aggiunto';
+$lang['deleted'] = 'cancellato';
+$lang['Metadata synchronization results'] = 'Risultato della sincronizzazione dei metadati';
+$lang['only perform a simulation (no change in database will be made)'] = 'Solo simulazione (non sarà  fatta nessuna modifica nel database)';
+$lang['Simulation'] = 'Simulazione';
+$lang['directories + files'] = 'Directory + file';
+$lang['only directories'] = 'Solo directory';
+$lang['synchronize files structure with database'] = 'Sincronizzare la struttura dei files con il database';
+$lang['synchronize files metadata with database photos informations'] = 'Sincronizzare i metadati dei files con le informazioni delle foto del database';
+$lang['even already synchronized photos'] = 'Anche le foto già  sincronizzate';
+$lang['Used metadata'] = 'Metadati usati';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Il nome delle directory e dei files deve essere composto da lettere, numeri, "-", "_" o "."';
+$lang['wrong filename'] = 'Nome file errato';
+$lang['Upload'] = 'Caricare';
+$lang['user "%s" added'] = 'utente "%s" aggiunto';
+$lang['User status'] = 'Stato utente';
+$lang['user_status_admin'] = 'Amministratore';
+$lang['user_status_generic'] = 'Generico';
+$lang['user_status_guest'] = 'Ospite';
+$lang['user_status_normal'] = 'Utente';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Album virtuale';
+$lang['Waiting'] = 'In attesa';
+$lang['default'] = 'di default';
+$lang['Toggle \'default group\' property'] = 'Invertire la proprietà  "gruppo di default"';
+$lang['Advanced features'] = 'Funzioni avanzate';
+$lang['Overall'] = 'Vista globale';
+$lang['Year'] = 'Anno';
+$lang['Month'] = 'Mese';
+$lang['Day'] = 'Giorno';
+$lang['Pages seen'] = 'Pagine viste';
+$lang['Time'] = 'Ora';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Elemento';
+$lang['Section'] = 'Selezione';
+$lang['An information email was sent to group "%s"'] = 'Un\'email informativa è stata inviata agli utenti del gruppo "%s"';
+$lang['Send an information email to group members'] = 'Inviare un\'email informativa agli utenti di un gruppo';
+$lang['Group'] = 'Gruppo';
+$lang['[%s] Visit album %s'] = '[%s] Visita l\'album %s';
+$lang['Hello,'] = 'Ciao,';
+$lang['See you soon.'] = 'A presto.';
+$lang['Discover album:'] = 'Scoprite l\'album:';
+$lang['Mail content'] = 'Contenuto dell\'email';
+$lang['none'] = 'nessuno';
+$lang['high'] = 'high';
+$lang['other'] = 'altro';
+$lang['Element type'] = 'Tipo di elemento';
+$lang['Image id'] = 'Id immagine';
+$lang['Summary'] = 'Riassunto';
+$lang['%d line filtered'] = '%d linea filtrata';
+$lang['%d lines filtered'] = '%d linee filtrate';
+$lang['%d guest'] = '%d ospite';
+$lang['%d guests'] = '%d ospiti';
+$lang['Hour'] = 'Ora';
+$lang['guest'] = 'ospite';
+$lang['default values'] = 'valore di default';
+$lang['Guest cannot be deleted'] = 'L\'utente "ospite" non può essere cancellato';
+$lang['Default user cannot be deleted'] = 'L\'utente di default non può essere cancellato';
+$lang['Purge history detail'] = '"Ripulire" i dettagli dalla cronoligia';
+$lang['Purge history summary'] = '"Ripulire" il sommario dalla cronoligia';
+$lang['Check integrity'] = 'Controllo d\'integrità ';
+$lang['Anomaly'] = 'Anomalia';
+$lang['Correction'] = 'Correzione';
+$lang['Automatic correction'] = 'Correzione automatica';
+$lang['Impossible automatic correction'] = 'Correzione automatica impossibile';
+$lang['Correction applied with success'] = 'Correzione applicata con successo';
+$lang['Correction applied with error'] = 'Correzione applicata con errori';
+$lang['%d anomaly has been detected.'] = 'individuata %d anomalia.';
+$lang['%d anomalies have been detected.'] = 'individuate %d anomalie.';
+$lang['%d anomaly has been corrected.'] = '%d anomalia corretta.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalie corrette.';
+$lang['%d anomaly has not been corrected.'] = 'non è stato possibile correggere %d anomalia.';
+$lang['%d anomalies have not been corrected.'] = 'non è stato possibile correggere %d anomalie.';
+$lang['Go to %s or %s for more informations'] = 'Recarsi su : %s o %s per avere più informazioni';
+$lang['the forum'] = 'il Forum';
+$lang['the wiki'] = 'la Wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'Il valore %s non è corretto perchè i files con dati EXIF non sono supportati';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s deve essere impostato su "false" nel vostro file local/config/config.inc.php';
+$lang['Main "guest" user does not exist'] = 'L\'utente "ospite" principale non esiste';
+$lang['Main "guest" user status is incorrect'] = 'Lo stato del\'utente "ospite" principale non è corretto';
+$lang['Default user does not exist'] = 'L\'utente di default non esiste¹';
+$lang['Main "webmaster" user does not exist'] = 'L\'utente "webmaster" principale non esiste più';
+$lang['Main "webmaster" user status is incorrect'] = 'Lo stato dell\'utente "webmaster" principale non è corretto';
+$lang['User "%s" created with "%s" like password'] = 'L\'utente "%s" creato con la password "%s"';
+$lang['Status of user "%s" updated'] = 'Stato dell\'utente "%s" aggiornato';
+$lang['add new photos to caddie'] = 'Aggiungere le nuove foto al cestino';
+$lang['No display'] = 'Nessuna visualizzazione';
+$lang['Classic display'] = 'Visualizzazione classica';
+$lang['Hoverbox display'] = 'Visualizzazione durante il passaggio del mouse';
+$lang['Mail address is obligatory for all users'] = 'L\'indirizzo email è obligatorio per tutti gli utenti';
+$lang['Minimum privacy level'] = 'Livello minimo di privacy';
+$lang['Privacy level'] = 'Livello di privacy';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contatti';
+$lang['Level 2'] = 'Amici';
+$lang['Level 4'] = 'Famiglia';
+$lang['Level 8'] = 'Amministratori';
+$lang['Reinitialize check integrity'] = 'Reinizializzare controllo d\'integrità ';
+$lang['Check all'] = 'Selezionare tutto';
+$lang['Uncheck all'] = 'Deselezionare tutto';
+$lang['Check automatic corrections'] = 'Selezionare correzioni automatiche';
+$lang['Apply selected corrections'] = 'Applicare le correzioni selezionate';
+$lang['Ignore selected anomalies'] = 'Ignorare le anomalie selezionate';
+$lang['Refresh'] = 'Aggiornare';
+$lang['The anomaly will be ignored until next application version'] = 'L\'anomalia verrà ignorata fino alla prossima versione dell\'applicazione';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'La correzione dell\'anomalia annulerà il fatto che sia ignorata';
+$lang['%d anomaly has been ignored.'] = '%d anomalia è stata ignorata.';
+$lang['%d anomalies have been ignored.'] = '%d anomalie sono state ignorate.';
+$lang['Plugins which need upgrade'] = 'Plugins che necessitano di aggiornamento';
+$lang['Plugin list'] = 'Elenco dei plugins';
+$lang['Check for updates'] = 'Controllare aggiornamenti';
+$lang['Other plugins'] = 'Altri plugins disponibili';
+$lang['Last revisions'] = 'Ultimi aggiornamenti';
+$lang['Are you sure you want to install this plugin?'] = 'Siete sicuri di volere installare questo plugin?';
+$lang['Are you sure you want to delete this plugin?'] = 'Siete sicuri di volere cancellare questo plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Siete sicuri di volere installare questo aggiornamento? Dovete verificare che questo aggiornamento non necessiti una disinstallazione.';
+$lang['Plugin has been successfully copied'] = 'Il plugin è stato copiato con successo.';
+$lang['You might go to plugin list to install and activate it.'] = 'Recatevi nella lista dei plugins per installarlo ed attivarlo.';
+$lang['Can\'t create temporary file.'] = 'È impossibile creare un file temporaneo.';
+$lang['Can\'t download archive.'] = 'È impossibile scaricare l\'archivio.';
+$lang['Can\'t read or extract archive.'] = 'È impossibile leggere o estrarre l\'archivio.';
+$lang['An error occured during extraction (%s).'] = 'Si è verificato un\'errore durante l\'estrazione del file (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Verificate i permessi della cartella "plugins" e delle sue sotto cartelle (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Non è possibile connettersi al server.';
+$lang['Purge compiled templates'] = 'Ripulire i templates compilati';
+$lang['ACCESS_0'] = 'Accesso libero';
+$lang['ACCESS_1'] = 'Accesso a tutti';
+$lang['ACCESS_2'] = 'Accesso agli iscritti';
+$lang['ACCESS_3'] = 'Accesso agli amministratori';
+$lang['ACCESS_4'] = 'Accesso ai webmaster';
+$lang['ACCESS_5'] = 'Nessun accesso';
+$lang['Support'] = 'Forum';
+$lang['Documentation'] = 'Documentazione';
+$lang['A new version of Piwigo is available.'] = 'Una nuova versione di Piwigo è disponibile.';
+$lang['Piwigo Administration'] = 'Amministrazione di Piwigo';
+$lang['Piwigo version'] = 'Versione di Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'State già  usando l\'ultima versione di Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'La versione di %s [%s] installata non è compatible con la versione richiesta [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Dovete aggiornare il vostro sistema per poter sfruttare completamente l\'applicazione, altrimenti l\'applicazione non funzionerà correttamente, o non funzionerà per niente';
+$lang['Deleted on'] = 'Cancellati su';
+$lang['Last hit'] = 'Ultimo punteggio';
+$lang['GD library is missing'] = 'la biblioteca GD è mancante';
+$lang['Templates'] = 'Templates (modelli)';
+$lang['Extend for templates'] = 'Estendere i templates';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Sostituzione dei templates originali con i vostri templates personalizzati dalla sottodirectory template-extension';
+$lang['Replacers (customized templates)'] = 'Sostituzione (templates personalizzati)';
+$lang['Original templates'] = 'Templates d\'origine';
+$lang['Orphan tags deleted'] = 'Tag orfani cancellati';
+$lang['Optional URL keyword'] = 'URL keyword opzionale';
+$lang['Templates configuration has been recorded.'] = 'La configurazione dei templates è stata registrata.';
+$lang['All optimizations have been successfully completed.'] = 'Tutte le ottimizzazioni sono state completate con successo.';
+$lang['Optimizations have been completed with some errors.'] = 'Le ottimizzazioni sono state completate con alcuni errori.';
+$lang['Modify information'] = 'Modifica le informazioni';
+$lang['nothing'] = 'Niente';
+$lang['overrides existing values with empty ones'] = 'Sovrascrivere i valori esistenti con quelli vuoti';
+$lang['Manage photo ranks'] = 'Gestire l\'ordinamento delle foto';
+$lang['Edit ranks'] = 'Modificare l\'ordine';
+$lang['No photo in this album'] = 'Nessuna foto in quest\'album';
+$lang['Images manual order was saved'] = 'L\'ordinamento manuale delle immagini è stato salvato';
+$lang['ranks'] = 'posizioni';
+$lang['By rank'] = 'Per posizione';
+$lang['Manual order'] = 'Ordinamento manuale';
+$lang['Drag to re-order'] = 'Clicca e trascina per riorganizzare';
+$lang['Quick Local Synchronization'] = 'Sincronizzazione rapida';
+$lang['No photo can be deleted'] = 'Nessuna foto può essere eliminata';
+$lang['Delete selected photos'] = 'Eliminare le foto selezionate';
+$lang['%d photo was deleted'] = '%d foto è stata cancellata';
+$lang['%d photos were deleted'] = '%d foto sono state cancellate';
+$lang['Downloads'] = 'Downloads';
+$lang['Released on'] = 'Aggiunto il';
+$lang['Number of downloads'] = 'Totale downloads';
+$lang['Piwigo Announcements Newsletter'] = 'Newsletter Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Rimanete in contatto con il progetto Piwigo, iscrivetevi alla newsletter di Piwigo Announcement. Riceverete un\'email quando una nuova versione sarà disponibile (a volte un bug di sicurezza viene corretto, è importante saperlo e quindi aggiornare) e quando ci saranno grandi eventi del progetto. Sono solamente alcune emails all\'anno';
+$lang['Subscribe %s'] = 'Iscrivere %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Iscrivere %s alla newsletter Piwigo';
+$lang['Purge search history'] = '"Pulire" la cronologia delle ricerche';
+$lang['Hide'] = 'Nascondere';
+$lang['Password is missing. Please enter the password.'] = 'Campo password vuoto. Prego inserire la password.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Campo conferma della password vuoto. Si prega di confermare la password scelta';
+$lang['Allow users to edit their own comments'] = 'Autorizzare gli utenti a modificare i propri commenti';
+$lang['Allow users to delete their own comments'] = 'Autorizzare gli utenti a cancellare i propri commenti';
+$lang['Email administrators when a comment is modified'] = 'Inviare un\'email agli amministratori quando un commento viene modificato';
+$lang['Email administrators when a comment is deleted'] = 'Inviare un\'email agli amministratori quando un commento viene cancellato';
+$lang['Cannot delete the old permalink !'] = 'Non è possibile cancellare il vecchio permalink !';
+$lang['Hit'] = 'punteggio';
+$lang['Tools'] = 'Tools';
+$lang['Photos'] = 'Foto';
+$lang['Themes'] = 'Temi';
+$lang['Instructions to use Piwigo'] = 'Istruzioni per l\'uso di Piwigo';
+$lang['Installed Themes'] = 'Temi dettagliati';
+$lang['Add New Theme'] = 'Aggiungere un tema';
+$lang['Forbid this theme to users'] = 'Vietare questo tema agli utenti';
+$lang['Set as default theme for unregistered and new users'] = 'Tema di default per gli ospiti e i nuovi utenti';
+$lang['unknown'] = 'sconosciuto';
+$lang['Upload Photos'] = 'Aggiungere foto';
+$lang['Drop into album'] = 'Spostare nell\'album';
+$lang['+ Add an upload box'] = '+ Aggiungere un altro campo di upload';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Creare la directory "% s" nella radice della vostra installazione Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dare i permessi in scrittura (chmod 777) alla directory "% s" nella radice della vostra installazione Piwigo';
+$lang['existing album'] = 'album esistente';
+$lang['create a new album'] = 'creare un nuovo album';
+$lang['Album name'] = 'Nome dell\'album';
+$lang['Album "%s" has been added'] = 'L\'Album "%s" è stato aggiunto';
+$lang['Uploaded Photos'] = 'Foto aggiunte ';
+$lang['%d photos uploaded'] = '%d foto aggiunte';
+$lang['Privacy level set to "%s"'] = 'Livello di privacy "%s"';
+$lang['Album "%s" now contains %d photos'] = 'L\'Album "%s" contiene adesso %d foto';
+$lang['Manage this set of %d photos'] = 'Gestire questo set di %d foto';
+$lang['Select files'] = 'Scegliere i file';
+$lang['Everybody'] = 'Tutti';
+$lang['Who can see these photos?'] = 'Chi può vedere queste foto?';
+$lang['Who can see this photo?'] = 'Chi può vedere questa foto?';
+$lang['Settings'] = 'Configurazione';
+$lang['Resize'] = 'Ridimensionare';
+$lang['Maximum Width'] = 'Larghezza massima';
+$lang['pixels'] = 'pixels';
+$lang['Maximum Height'] = 'Altezza massima';
+$lang['Image Quality'] = 'Qualità  dell\'immagine';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['Save Settings'] = 'Salvare impostazioni';
+$lang['Your configuration settings are saved'] = 'La vostra configurazione è stata registrata';
+$lang['Active Themes'] = 'Temi attivati';
+$lang['Add write access to the "%s" directory'] = 'Aggiungere l\'accesso in scrittura per la directory "%s"';
+$lang['Administration Home'] = 'Home Amministrazione';
+$lang['Change Admin Colors'] = 'Modificare i colori dell\'amministrazione';
+$lang['Delete this theme'] = 'Cancellare questo tema';
+$lang['Directory does not exist'] = 'La directory non esiste';
+$lang['Download,'] = 'Scaricare,';
+$lang['FTP + Synchronization'] = 'FTP + Sincronizzazione';
+$lang['Get Support on Piwigo Forum'] = 'Ottenere assistenza sul forum di Piwigo';
+$lang['Help Me'] = 'Aiuto';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Non è stato possibile attivare questo tema, manca il tema principale (superiore): %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Impossibile cancellare questo tema. Altri temi dipendono da esso: %s';
+$lang['Inactive Themes'] = 'Temi disattivati';
+$lang['Install on your computer,'] = 'Installare sul vostro computer,';
+$lang['Make this theme available to users'] = 'Rendere questo tema disponibile agli utenti';
+$lang['Page end'] = 'Fine pagina';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Leggere la documentazione di Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Avviare pLoader e aggiungere le vostre foto.';
+$lang['Switch to clear or dark colors for administration'] = 'Scegliere il colore chiaro o scuro per l\'amministrazione';
+$lang['Theme has been successfully installed'] = 'Il tema è stato installato con successo';
+$lang['Visit Gallery'] = 'Visitare la galleria';
+$lang['Visit Piwigo project website'] = 'Visitare il sito web del progetto Piwigo';
+$lang['Guest Settings'] = 'Parametri ospite';
+$lang['Main Page'] = 'Pagina principale';
+$lang['Photo Page'] = 'Pagina della foto';
+$lang['Activate Navigation Bar'] = 'Attivare barra di navigazione';
+$lang['Activate Navigation Thumbnails'] = 'Attivare le miniature di navigazione';
+$lang['Activate icon "%s"'] = 'Attivare l\'icona "%s"';
+$lang['Photo Properties'] = 'Proprietà foto';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader significa <em>Piwigo Uploader</em>. Dal vostro computer, pLoader prepara le vostre foto e le trasferisce verso la vostra galleria foto Piwigo.';
+$lang['Languages'] = 'Lingue';
+$lang['Installed Languages'] = 'Lingue installate';
+$lang['Add New Language'] = 'Aggiungere una lingua';
+$lang['Language has been successfully installed'] = 'La lingua è stata installata con successo';
+$lang['Allow user customization'] = 'Permettere la personalizzazione della visualizzazione';
+$lang['Select:'] = 'Selezionare :';
+$lang['None'] = 'Niente';
+$lang['Invert'] = 'Invertire';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Non è possibile disattivare questo tema, ci deve essere almeno un tema attivo.';
+$lang['Webmaster status is required.'] = 'Dovete avere lo stato di webmaster.';
+$lang['Bound Theme'] = 'Tema legato';
+$lang['Allow rating'] = 'Autorizzare le votazioni';
+$lang['Select at least one comment'] = 'Selezionare almeno un commento';
+$lang['Active Plugins'] = 'Plugins attivati';
+$lang['Inactive Plugins'] = 'Plugins disabilitati';
+$lang['Missing Plugins'] = 'Plugins mancanti';
+$lang['Uninstalled Plugins'] = 'Plugins non installati';
+$lang['By %s'] = 'Da %s';
+$lang['Visit plugin site'] = 'Visitate il sito del plugin';
+$lang['Active Languages'] = 'Lingue attivate';
+$lang['Delete this language'] = 'Cancellare questa lingua';
+$lang['Forbid this language to users'] = 'Vietare questa lingua agli utenti';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossibile disattivare questa lingua, prima impostare come default un altra lingua.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossibile disattivare questa lingua. Deve essere attiva almeno una lingua.';
+$lang['Inactive Languages'] = 'Lingue disattivate';
+$lang['Make this language available to users'] = 'Rendere questa lingua disponibile agli utenti';
+$lang['Set as default language for unregistered and new users'] = 'Lingua di default per gli ospiti e nuovi utenti';
+$lang['Add Photos'] = 'Aggiungere delle foto';
+$lang['Miscellaneous'] = 'Informazioni';
+$lang['The following tag was deleted'] = 'Il tag seguente è stato cancellato';
+$lang['Virtual Links'] = 'Collegamenti virtuali';
+$lang['There is no other language available.'] = 'Non ci sono altre lingue disponibili.';
+$lang['There is no other plugin available.'] = 'Non ci sono altri plugin disponibili.';
+$lang['There is no other theme available.'] = 'Non ci sono altri temi disponibili.';
+$lang['delete'] = 'Cancellare';
+$lang['Add another set of photos'] = 'Aggiungi un altro set di foto';
+$lang['Order of menubar items has been updated successfully.'] = 'L\'ordine degli elementi della barra dei menu è stato aggiornato con successo.';
+$lang['This theme was not designed to be directly activated'] = 'Questo tema non è stato progettato per essere attivato direttamente';
+$lang['Pending Comments'] = 'Commenti in attesa';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Nel vostro file php.ini, la variabile upload_max_filesize (%sB) è più grande di post_max_size (%sB), è necessario modificare questa impostazione';
+$lang['Exif extension not available, admin should disable exif use'] = 'L\'estensione Exif non è disponibile, un amministratore deve disabilitare l\'uso dei metadati Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Il peso del file caricato supera il valore upload_max_filesize nel file php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Il peso totale dei file trasferiti supera il valore di post_max_size nel file php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Il peso del file caricato supera il valore di MAX_FILE_SIZE definito nel modulo HTML';
+$lang['The uploaded file was only partially uploaded'] = 'Il file è stato caricato solo parzialmente';
+$lang['No file was uploaded'] = 'Nessun file è stato caricato';
+$lang['Missing a temporary folder'] = 'Impossibile trovare la directory temporanea';
+$lang['Failed to write file to disk'] = 'Non è stato possibile scrivere il file sul server';
+$lang['File upload stopped by extension'] = 'Il trasferimento del file è stato fermato da un estenzione';
+$lang['Unknown upload error'] = 'Errore sconosciuto durante il trasferimento';
+$lang['Error on file "%s" : %s'] = 'Errore sul file "%s" : %s';
+$lang['Menu Management'] = 'Menu';
+$lang['automatic order'] = 'Ordinamento automatico';
+$lang['manual order'] = 'Ordinamento manuel';
+$lang['Albums automatically sorted'] = 'Gli album sono stati ordinati automaticamente';
+$lang['The original maximum width must be a number between %d and %d'] = 'La larghezza massima per il ridimenzionamento della foto originale deve essere un numero compreso tra %d e %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'L\'altezza massima per il ridimenzionamento della foto originale deve essere un numero compreso tra %d e %d';
+$lang['The original image quality must be a number between %d and %d'] = 'La qualità massima dell\'immagine per il ridimenzionamento della foto originale deve essere un numero compreso tra %d e %d';
+$lang['Batch Manager'] = 'Gestione dei lotti';
+$lang['include child albums'] = 'includere gli album dipendenti';
+$lang['Selection'] = 'Selezione';
+$lang['Action'] = 'Azione';
+$lang['Set author'] = 'Definire l\'autore';
+$lang['Set title'] = 'Impostare il titolo';
+$lang['Set creation date'] = 'Impostare la data di creazione';
+$lang['Apply action'] = 'Applicare l\'azione';
+$lang['on the %d selected photos'] = 'sulle % foto selezionate';
+$lang['%d of %d photos selected'] = '%d foto su %d sono selezionate';
+$lang['No photo selected, %d photos in current set'] = 'Nessuna foto selezionata tra le %d foto del lotto';
+$lang['All %d photos are selected'] = 'Tutte le %d foto del lotto sono selezionate';
+$lang['remove this filter'] = 'cancellare questo filtro';
+$lang['Duplicates'] = 'duplicati';
+$lang['Add a filter'] = 'Aggiungere un filtro';
+$lang['Remove all filters'] = 'Cancellare tutti i filtri';
+$lang['Refresh photo set'] = 'Aggiornare il lotto di foto';
+$lang['The whole page'] = 'Tutta la pagina';
+$lang['The whole set'] = 'L\'intero lotto';
+$lang['No photo in the current set.'] = 'Nessuna foto nel lotto.';
+$lang['No photo selected, no action possible.'] = 'Nessuna foto selezionata, nessuna azione possibile.';
+$lang['Choose an action'] = 'Selezionare un ricorso';
+$lang['remove author'] = 'cancellare l\'autore';
+$lang['Type here the author name'] = 'Inserire qui il nome dell\'autore';
+$lang['remove title'] = 'cancellare il titolo';
+$lang['Type here the title'] = 'Inserire qui il titolo';
+$lang['remove creation date'] = 'cancellare la data di creazione';
+$lang['Week starts on'] = 'La settimana comincia il';
+$lang['You have %d orphan tags: %s.'] = 'Avete %d tags orfani : %s.';
+$lang['Delete orphan tags'] = 'Cancellare i tags orfani';
+$lang['delete photo'] = 'cancellare la foto';
+$lang['Remove from caddie'] = 'Rimuovere dal cestino';
+$lang['Themes which need upgrade'] = 'Temi che necessitano un aggiornamento';
+$lang['Languages which need upgrade'] = 'Lingue che necessitano un aggiornamento ';
+$lang['All themes are up to date.'] = 'Tutti i temi sono aggiornati.';
+$lang['All plugins are up to date.'] = 'Tutti i plug-in sono aggiornati.';
+$lang['All languages are up to date.'] = 'Tutte le lingue sono aggiornate.';
+$lang['Visit theme site'] = 'Visitare il sito del tema';
+$lang['Visit language site'] = 'Visitare il sito della lingua';
+$lang['New Version'] = 'Nuova versione';
+$lang['Obsolete Plugins'] = 'Plugins obsoleti';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATTENZIONE! Questo plugin non sembra essere compatibile con questa versione di Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Volete attivarlo comunque?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'QUESTO PLUGIN FA ORMAI PARTIE DEL CORE DI PIWIGO! CANCELLATELO.';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERRORE: QUESTO PLUGIN È MANCANTE MA TUTTORA INSTALLATO! CANCELLATELO.';
+$lang['display'] = 'Visualizzare';
+$lang['Restore'] = 'Restaurare';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Reimpostare la configurazione di defaut? Perderete tutte le vostre impostazioni!';
+$lang['Thumbnails generation in progress...'] = 'Rigenerazione delle miniature in corso ...';
+$lang['Photos generation in progress...'] = 'Rigenerazione delle foto in corso ...';
+$lang['%s photos have been regenerated'] = '%s foto sono state rigenerate';
+$lang['%s photos can not be regenerated'] = '%s foto non possono essere rigenerate';
+$lang['Updates'] = 'Aggiornamento';
+$lang['Update in progress... Please wait.'] = 'Aggiornamento in corso ... Attendere prego';
+$lang['Ignore this update'] = 'Igniorare questo aggiornamento';
+$lang['Reset ignored updates'] = 'Ripristinare gli aggiornamenti igniorati';
+$lang['Update All'] = 'Applicare tutti gli aggiornamenti';
+$lang['ERROR'] = 'ERRORE';
+$lang['Update Complete'] = 'Aggiornamento completao';
+$lang['Piwigo Update'] = 'Aggiornamento di Piwigo';
+$lang['Extensions Update'] = 'Aggiornamento delle estenzioni';
+$lang['All extensions are up to date.'] = 'Tutte le estensioni sono aggiorno';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'I plugin seguenti potrebbero non essere compatibili con la nuova versione di Piwigo :';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'I temi seguenti potrebbero non essere compatibili con la nuova versione di Piwigo :';
+$lang['I decide to update anyway'] = 'Decido comunque di aggiornare';
+$lang['Update to Piwigo %s'] = 'Aggiornare a Piwigo %s';
+$lang['Two updates are available'] = 'Due aggiornamenti sono disponibili';
+$lang['This is a minor update, with only bug corrections.'] = 'Questo è un aggiornamento minore, con solo correzioni di bug';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Questo è un aggiornamento importante, con <a href="%s">nuove e interessanti funzionalità</a>';
+$lang['Some themes and plugins may be not available yet.'] = 'Alcuni temi e plugin possono non essere ancora disponibili';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'È possibile aggiornare direttamente a Piwigo %s, senza passare per Piwigo %s (consigliato)';
+$lang['Save Template Directory'] = 'Salvare la template directory';
+$lang['Dump Database'] = 'Salvare il database';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Includere la cronologia (Attenzione: può essere superato il limite di memoria del server)';
+$lang['Unable to dump database.'] = 'Impossibile eseguire il salvataggio del database';
+$lang['Some upgrades are available for extensions.'] = 'Degli aggiornamenti sono disponibili per le estenzioni';
+$lang['Please wait...'] = 'Attendere prego ...';
+$lang['Ignore All'] = 'Igniorare tutti gli aggiornamenti';
+$lang['Crop'] = 'Ridimenzionare';
+$lang['Width'] = 'Larghezza';
+$lang['Height'] = 'Altezza';
+$lang['Follow Orientation'] = 'Rispettare l\'orientamento';
+$lang['Graphics Library'] = 'Biblioteca grafica';
+$lang['Show menubar'] = 'Visualizzare il menu';
+$lang['No results'] = 'Nessun risultato';
+$lang['Type in a search term'] = 'Inserire un Entrez un termine di ricerca';
+$lang['Searching...'] = 'Ricerca ...';
+$lang['new'] = 'nuovo';
+$lang['Default photos order'] = 'Ordinamento di default delle foto';
+$lang['Activate icon "new" next to albums and pictures'] = 'Visualizzare l\'icona "nuovo" a fianco degli album e delle foto';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Non potete impostare l\'ordine predefinito delle foto perché avete un\'impostazione personalizzata nella configurazione locale';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Avete specificato <i>$conf[\'order_by\']</i> nel vostro file di configurazione, questo parametro è obsoleto, si prega di eliminarlo o rinominarlo in <i>$conf[\'order_by_custom\']</i> !';
+$lang['Add a criteria'] = 'Aggiungere un criterio';
+$lang['... or '] = '... oppure ';
+$lang['Create'] = 'Creare';
+$lang['Start Upload'] = 'Avviare il trasferimento';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Uzate il modulo Flash. Dei problemi? Provate allora con il <a href="%s">modulo HTML</a>';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Uzate il modulo HTML. Provate con il <a href="%s">modulo Flash</a>';
+$lang['Maximum file size: %sB.'] = 'Grandezza massima dei file : %sB.';
+$lang['Allowed file types: %s.'] = 'Tipi di file autorizzati : %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Risoluzione massima approssimativa : %dM pixels (sia %dx%d pixels)';
+$lang['Manage Permissions'] = 'Gestire i permessi';
+$lang['Photo %s of %s'] = 'Foto %s su %s';
+$lang['show details'] = 'mostrare i dettagli';
+$lang['hide details'] = 'nascondere i dettagli';
+$lang['Merge tags'] = 'Fusionare i tags';
+$lang['Select the destination tag'] = 'Selezionare il tag di destinazione';
+$lang['(this tag will be deleted)'] = '(questo tag sara cancellato)';
+$lang['Confirm merge'] = 'Confermare la fusione';
+$lang['Merge selected tags'] = 'Fusionare i tags selezionati';
+$lang['No destination tag selected'] = 'Non avete selezionato il tag di destinazione';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'i tags <em>%s</em> sono stati fuzionati nel tag <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Selezionare almeno due tag da fuzionare';
+$lang['Average rate'] = 'Voto medio';
+$lang['Rate'] = 'Voto';
+$lang['Learn more'] = 'Per saperne di più';
+$lang['Select an album'] = 'Selezionare un album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Di default, Piwigo creera la nuova foto dimensioni web a partire della foto HD (alta definizione)';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Se la foto HD non è disponibile e la foto dimensioni web è più grande delle dimensioni qui di seguito, allora Piwigo la considererà come una foto HD e creera la nuova foto dimensioni web';
+$lang['An error has occured during upgrade.'] = 'Si è verificato un\'errore durante l\'aggiornamento';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Non è stato possibile estrarre i file. Verificare i permessi dei file della vostra installazione.<br><a href="%s">Cliccare qui per visualizzare il rapporto d\'errore</a>';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo non può recuperare i file d\'aggiornamento dal server';
+$lang['Last import'] = 'Ultima importazione';
+$lang['With no album'] = 'senza album';
+$lang['With no tag'] = 'senza tag';
+$lang['With no virtual album'] = 'senza album virtuale';
+$lang['Predefined filter'] = 'filtro predefinito';
+$lang['Add tags'] = 'Aggiungere i tags';
+$lang['Synchronize metadata'] = 'Sincronizzare i metadati';
+$lang['Add to caddie'] = 'Aggiungere al cestino';
+$lang['Zoom'] = 'Zoom';
+$lang['Resize after upload'] = 'Ridimenzionare dopo il trasferimento';
+$lang['Original Size'] = 'Dimenzioni originali';
+$lang['Send connection settings by email'] = 'Inviare gli ID via email';
+$lang['Activate comments'] = 'Attivare i commenti';
+$lang['Default comments order'] = 'Ordinamento di default dei commenti';
+$lang['A locked gallery is only visible to administrators'] = 'Una galleria bloccata è visibile solo dagli amministratori';
+$lang['Unlock gallery'] = 'Sbloccare la galleria';
+$lang['Gallery unlocked'] = 'Galleria sbloccata';
+$lang['Notify administrators when a comment is'] = 'Notificare agli amministratori quando un commento viene';
+$lang['modified'] = 'modificato';
+$lang['deleted'] = 'cancellato';
+$lang['pending validation'] = 'in attesa di convalida';
+$lang['Save visits in history for'] = 'Storicizzare le visite dei ';
+$lang['simple visitors'] = 'singoli visitatori';
+$lang['registered users'] = 'utenti registrati';
+$lang['administrators'] = 'amministratori';
+$lang['This album contains %d photos, added on %s.'] = 'Questo album contiene %d foto, aggiunte il %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Questo album contiene %d foto, aggiunte tra il %s e il %s.';
+$lang['This album contains no photo.'] = 'Questo album non contiene nessuna foto.';
+$lang['%s has been successfully updated.'] = '%s è stato aggiornato con successo.';
+$lang['Move to album'] = 'Spostare verso l\'album';
+$lang['You can activate only one mobile theme.'] = 'Potete attivare un solo tema mobile.';
+$lang['Center of interest'] = 'Centro d\'interesse';
+$lang['Not cropped correctly?'] = 'La foto non è ritagliata correttamente?';
+$lang['Photo name'] = 'Nome foto';
+$lang['Automatic sort order'] = 'Ordinamento automatico';
+$lang['apply automatic sort order'] = 'applicare un criterio di ordinamento automatico';
+$lang['Save manual order'] = 'Salvare l\'ordinamento manuale';
+$lang['cancel manual order'] = 'Cancellare l\'ordinamento manuale';
+$lang['Cancel'] = 'Cancellare';
+$lang['List'] = 'Lista';
+$lang['Web Form'] = 'Modulo web';
+$lang['Applications'] = 'Applicazioni';
+$lang['Available versions for'] = 'Versioni disponibili per';
+$lang['Available on'] = 'Disponibile su';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo per iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'L\'applicazione <em>Piwigo per iOS</em> permette di collegarti alla tua galleria Piwigo dal tuo iPhone, iPad o iPod Touch, creando degli album e caricando le immagini';
+$lang['Piwigo for Android'] = 'Piwigo per Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'L\'applicazione <em>Piwigo per Android</em> permette di collegarti alla tua galleria di Piwigo dal tuo cellulare o tablet Android, creando degli album e caricando le immagini';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin Piwigo per Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom è un software fotografico specializzato per gestire grandi quantità di immagini ed eseguirne la post-produzione';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Il plugin di Piwigo permette di esportare e sincronizzare le immagini da Lightroom direttamente alla tua galleria di Piwigo';
+$lang['Piwigo publish plugin for Shotwell'] = 'Plugin Piwigo per Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell è un organizzatore di immagini digitali open-source che funziona sotto Linux. È il gestore di immagini predefinito di Ubuntu e Fedora';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Su Linux, semplicemente installa il pacchetto Shotwell e attiva l\'opzione di pubblicazione su Piwigo';
+$lang['Piwigo publish plugin for digiKam'] = 'Plugin Piwigo per digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'Shotwell è un software avanzato per l\'organizzatore di immagini digitali sotto Linux, Windows e MacOSX';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam è realizzato per i fotografi che vogliono vedere, gestire, modificare, migliorare, organizzare, taggare e condividere le loro immagini';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Per esportare le immagini da digiKam a Piwigo, semplicemente installa digiKam e il plugin Kipi';
+$lang['Piwigo export plugin for iPhoto'] = 'Plugin Piwigo per iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto è il gestore d\'immagini predefinito su MacOSX. Il plugin di Piwigo permette di creare nuovi album e esportare immagini direttamente da iPhoto sulla Galleria di Piwigo';
+$lang['Piwigo export plugin for Aperture'] = 'Plugin Piwigo per Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture è un potente programma per rifinire le immagini e gestire grandi librerie sotto Mac';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture è realizzato per fotografi professionisti con la semplicità di iPhoto';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Il plugin di esportazione Piwigo permette di creare album e caricare le immagini';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client per Android) è un client open-source (GPL v3) per Piwigo sotto piattaforma Android';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Le caratteristiche includono la navigazione nella galleria, la creazione di album e il caricamento di immagini';
+$lang['any visitor can see this album'] = 'qualsiasi visitatore può vedere questo album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'i visitatori devono registrarsi ed avere i permessi adeguati per vedere questo album';
+$lang['Groups and users'] = 'Gruppi e utenti';
+$lang['Permission granted for groups'] = 'Permessi ammessi ai gruppi';
+$lang['Select groups...'] = 'Selezione gruppi..';
+$lang['There is no group in this gallery.'] = 'Non c\'è nessun gruppo in questa galleria';
+$lang['Permission granted for users'] = 'Permessi ammessi agli utenti';
+$lang['Select users...'] = 'Selezione utenti..';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u utenti hanno automaticamente i permessi in quanto appartengono ad un gruppo ammesso';
+$lang['include photos with lower privacy level'] = 'includere le foto con un livello di confidenzialità inferiore';
+$lang['No group is permitted to see this private album'] = 'A nessun gruppo è permesso visualizzare questo album privato';
+$lang['Permission management'] = 'Gestione permessi';
+$lang['Photo sizes with crop'] = 'Dimensione immagini con ritaglio';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Il centro di interesse è la zona più significativa nella foto';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Per le foto con ritaglio, come "quadrato", Piwigo farà il meglio possibile per includere il centro d\'interesse';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Di default, il centro d\'interesse è posizionato nel mezzo della foto';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Seleziona una zona con il mouse in modo da definire un nuovo centro d\'interesse';
+$lang['custom'] = 'Personalizzato';
+$lang['Delete multiple size images'] = 'Elimina immagini con dimensioni diverse';
+$lang['Generate multiple size images'] = 'Genera immagini con dimensioni diverse';
+$lang['add a new watermark'] = 'Aggiungi un nuovo watermark';
+$lang['Apply watermark if height is bigger than'] = 'Aggiungi watermark se l\'altezza è maggiore di';
+$lang['Apply watermark if width is bigger than'] = 'Aggiungi watermark se la larghezza è maggiore di';
+$lang['bottom left corner'] = 'Angolo in basso a sinistra';
+$lang['bottom right corner'] = 'Angolo in basso a destra';
+$lang['middle'] = 'centro';
+$lang['Opacity'] = 'Opacità';
+$lang['Select a file'] = 'Scegli un file';
+$lang['top left corner'] = 'Angolo in alto a sinistra';
+$lang['top right corner'] = 'Angolo in alto a destra';
+$lang['X Position'] = 'Posizione X';
+$lang['X Repeat'] = 'Ripetizione X';
+$lang['Y Position'] = 'Posizione Y';
+$lang['Multiple Size'] = 'Dimensioni multiple';
+?>
Index: tags/2.4.0RC3/language/it_IT/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Italiano [IT]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=424
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Italiano';
+$lang_info['country'] = 'Italia';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'it';
+$lang_info['zero_plural'] = false;
+
+$lang['%d album updated'] = '%d album aggiornato';
+$lang['%d albums updated'] = '%d album aggiornati';
+$lang['%d comment to validate'] = '%d commento utente da approvare';
+$lang['%d comment'] = '%d commento';
+$lang['%d comments to validate'] = '%d commenti utente da approvare';
+$lang['%d comments'] = '%d commenti';
+$lang['%d hit'] = 'vista %d volte';
+$lang['%d hits'] = 'viste %d volte';
+$lang['%d Kb'] = '%d Ko';
+$lang['%d new comment'] = '%d nuovo commento utente';
+$lang['%d new comments'] = '%d nuovi commenti utente';
+$lang['%d new photo'] = '%d nuova foto';
+$lang['%d new photos'] = '%d nuove foto';
+$lang['%d new user'] = '%d nuovo utente';
+$lang['%d new users'] = '%d nuovi utenti';
+$lang['%d photo is also linked to current tags'] = '%d foto è anche connessa ai tag correnti';
+$lang['%d photo'] = '%d foto';
+$lang['%d photos are also linked to current tags'] = '%d foto sono anche connesse ai tag correnti';
+$lang['%d photos'] = '%d foto';
+$lang['%d rates'] = '%d voti';
+$lang['(!) This comment requires validation'] = '(!) Questo commento deve essere approvato';
+$lang['... or browse your empty gallery'] = '... o naviga nella nostra galleria vuota';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... oppure disattiva questo messaggio, voglio riuscirci da solo';
+$lang['A comment on your site'] = 'Un commento sul sito';
+$lang['About Piwigo'] = 'Informazioni su Piwigo';
+$lang['About'] = 'Informazioni su...';
+$lang['Accelerate diaporama speed'] = 'Accelerare la velocità proiezione';
+$lang['Add a comment'] = 'Aggiungi un commento';
+$lang['add this photo to your favorites'] = 'Aggiungi la pagina ai tuoi preferiti';
+$lang['Admin: %s'] = 'Amministrazione: %s';
+$lang['Administration'] = 'Amministrazione';
+$lang['Album results for'] = 'Risultati degli album per';
+$lang['Album'] = 'Album';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Albums'] = 'Album';
+$lang['All tags'] = 'Tutti i tags';
+$lang['All'] = 'Tutto';
+$lang['all'] = 'tutto';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un amministratore deve autorizzare il tuo commento affinchè sia visibile.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema di sicurezza anti-flood: attendere prima di aggiungere un nuovo commento';
+$lang['Any tag'] = 'Qualsiasi tag';
+$lang['Are you sure?'] = 'Sei sicuro?';
+$lang['ascending'] = 'ascendente';
+$lang['At least one listed rule must be satisfied.'] = 'Almeno una delle regole elencate deve essere soddisfatta.';
+$lang['Author'] = 'Autore';
+$lang['author(s) : %s'] = 'autore(i) : %s';
+$lang['Author: %s'] = 'Autore: %s';
+$lang['Auto login'] = 'Conessione automatica';
+$lang['available for administrators only'] = 'Disponibile solo per gli amministratori';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Lo status dell\'utente "guest" non è conforme, viene usato lo status di default. Per favore avvisa il webmaster.';
+$lang['Best rated'] = 'I più votati';
+$lang['Browser: %s'] = 'Browser: %s';
+$lang['Calendar'] = 'Calendario';
+$lang['Change my password'] = 'Cambiare la mia password';
+$lang['Check your email for the confirmation link'] = 'Controllare la posta elettronica per trovare il link di conferma';
+$lang['chronology_monthly_calendar'] = 'Calendario mensile';
+$lang['chronology_monthly_list'] = 'Lista mensile';
+$lang['chronology_weekly_list'] = 'Lista settimanale';
+$lang['Click here if your browser does not automatically forward you'] = 'Cliccare qui se non siete reindirizzati automaticamente.';
+$lang['Click on the photo to see it in high definition'] = 'Cliccare sulla foto per vederla in alta definizione';
+$lang['Close this window'] = 'Chiudi questa finestra';
+$lang['cloud'] = 'nuvola';
+$lang['Comment by %s'] = 'Commento per %s';
+$lang['comment date'] = 'data del commento';
+$lang['Comment'] = 'Commento';
+$lang['Comment: %s'] = 'Commento: %s';
+$lang['Comments'] = 'Commenti';
+$lang['Complete RSS feed (photos, comments)'] = 'Feed RSS completo (foto, commenti)';
+$lang['Confirm Password'] = 'Conferma la Password';
+$lang['Connected user: %s'] = 'Utente connesso : %s';
+$lang['Connection settings'] = 'Parametri di connessione';
+$lang['Contact webmaster'] = 'Contattare il webmaster';
+$lang['Contact'] = 'Contattare';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'I cookies sono bloccati o non supportati dal vostro browser. Dovete attivare i cookie per connettervi.';
+$lang['Create a new account'] = 'Creare un nuovo account utente?';
+$lang['created after %s (%s)'] = 'creata dopo il %s (%s)';
+$lang['created before %s (%s)'] = 'creata prima del %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'creata tra il %s (%s) e il %s (%s)';
+$lang['created on %s'] = 'creata il %s';
+$lang['Created on'] = 'Creato il';
+$lang['Creation date'] = 'Data di creazione';
+$lang['Current password is wrong'] = 'La password non è esatta';
+$lang['customize the appareance of the gallery'] = 'personalizzare l\'aspetto della galleria';
+$lang['Customize'] = 'Personalizzare';
+$lang['Date'] = 'Data';
+$lang['day'][0] = 'Domenica';
+$lang['day'][1] = 'Lunedì';
+$lang['day'][2] = 'Martedì';
+$lang['day'][3] = 'Mercoledì';
+$lang['day'][4] = 'Giovedì';
+$lang['day'][5] = 'Venerdì';
+$lang['day'][6] = 'Sabato';
+$lang['Default'] = 'Di default';
+$lang['delete all photos from your favorites'] = 'Cancellare tutte le foto dai vostri favoriti';
+$lang['delete this photo from your favorites'] = 'Cancellare questa foto dalle vostre preferite';
+$lang['Delete'] = 'Cancellare';
+$lang['descending'] = 'discendente';
+$lang['Dimensions'] = 'Dimensioni';
+$lang['display a calendar by creation date'] = 'Mostra il calendario per data di creazione';
+$lang['display a calendar by posted date'] = 'Mostra il calendario per data d\'inserimento nella galleria';
+$lang['display a set of random photos'] = 'Mostra un set di foto in modo casuale';
+$lang['display all photos in all sub-albums'] = 'Mostrare tutte le foto in tutti gli album e sub-album';
+$lang['display available tags'] = 'Mostra i tags disponibili';
+$lang['display best rated photos'] = 'Mostra le foto le più votate';
+$lang['display each day with photos, month per month'] = 'Mostra anno per anno, mese per mese, giorno per giorno';
+$lang['display last user comments'] = 'Mostra gli ultimi commenti degli utenti';
+$lang['display most recent photos'] = 'Mostra le foto più recenti';
+$lang['display most visited photos'] = 'Mostra le foto le più viste';
+$lang['display only recently posted photos'] = 'mostra solo le foto pubblicate di recente';
+$lang['display photos linked to this tag'] = 'Mostrare le foto connesse solo a questo tag';
+$lang['display recently updated albums'] = 'Mostrare gli album caricati di recente';
+$lang['display this album'] = 'Mostra le foto alle radici dell\'album';
+$lang['display your favorites photos'] = 'Mostra le mie foto preferite';
+$lang['Display'] = 'Visualizzazione';
+$lang['Download this file'] = 'Scaricare questo file';
+$lang['Download'] = 'Scaricare';
+$lang['Each listed rule must be satisfied.'] = 'Tutti i criteri devono essere soddisfatti';
+$lang['Edit a comment'] = 'Modificare un commento';
+$lang['edit'] = 'modificare';
+$lang['Edit'] = 'Modificare';
+$lang['Email address is missing. Please specify an email address.'] = 'Manca l\'indirizzo Email. Per favore specificarne uno.';
+$lang['Email address'] = 'Indirizzo email';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Empty query. No criteria has been entered.'] = 'Ricerca incompleta. Nessun criterio di ricerca inserito.';
+$lang['End-Date'] = 'Data di fine';
+$lang['Enter your new password below.'] = 'Immettere la nuova password qui sotto';
+$lang['Enter your personnal informations'] = 'Inserire le informazioni personali';
+$lang['Error sending email'] = 'Errore durante l\'invio dell\'email';
+$lang['excluded'] = 'Escluso';
+$lang['EXIF Metadata'] = 'Dati EXIF';
+$lang['Expand all albums'] = 'Espandere tutti gli album';
+$lang['Favorites'] = 'Preferite';
+$lang['File name'] = 'Nome file';
+$lang['File'] = 'File';
+$lang['Filesize'] = 'Dimensione';
+$lang['Filter and display'] = 'Filtra e visualizza';
+$lang['Filter'] = 'Filtro';
+$lang['First'] = 'Primo';
+$lang['Forgot your password?'] = 'Password dimenticata ?';
+$lang['from %s to %s'] = 'da %s a %s';
+$lang['Go through the gallery as a visitor'] = 'Visita la galleria come ospite';
+$lang['group by letters'] = 'ragruppare per lettera';
+$lang['guest'] = 'ospite';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Salve %s, la vostra galleria fotografica Piwigo è vuota!';
+$lang['Hello'] = 'Buongiorno';
+$lang['Hello %s,'] = 'Buongiorno %s,';
+$lang['Help'] = 'Aiuto';
+$lang['Home'] = 'Home';
+$lang['html tags are not allowed in login'] = 'I tag HTML non sono ammessi nel login';
+$lang['I want to add photos'] = 'Voglio aggiungere delle foto';
+$lang['Identification'] = 'Identificazione';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se si tratta di un\'errore, ignorare questo messaggio e la richiesta non sarà presa in considerazione';
+$lang['in %d sub-album'] = 'in %d sub-album';
+$lang['in %d sub-albums'] = 'in %d sub-album';
+$lang['in this album'] = 'In questo album';
+$lang['included'] = 'incluso';
+$lang['Interface theme'] = 'Tema dell\'interfaccia';
+$lang['Invalid key'] = 'Chiave non valida';
+$lang['Invalid password!'] = 'Password non valida !';
+$lang['Invalid username or email'] = 'Nome utente o indirizzo email non valido';
+$lang['IP: %s'] = 'IP: %s';
+$lang['IPTC Metadata'] = 'Dati IPTC';
+$lang['Keyword'] = 'Parola chiave';
+$lang['Kind of date'] = 'Tipo data';
+$lang['Language'] = 'Lingua';
+$lang['last %d days'] = 'Ultimi %d giorni';
+$lang['Last'] = 'Ultima';
+$lang['letters'] = 'lettere';
+$lang['Links'] = 'Links';
+$lang['login mustn\'t end with a space character'] = 'Il nome utente non deve finire con uno spazio';
+$lang['login mustn\'t start with a space character'] = 'Il nome utente non deve iniziare con uno spazio';
+$lang['Login'] = 'Connessione';
+$lang['Logout'] = 'Logout';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'l\'indirizzo email deve essere del tipo xxx@yyy.eee (ad esempio: cippalippa@libero.rio)';
+$lang['Manage this user comment: %s'] = 'Gestire questo commento: %s';
+$lang['Maximum height must be a number superior to 50'] = 'L\'altezza massima deve essere un numero superiore a 50';
+$lang['Maximum photo height'] = 'Altezza massima delle foto';
+$lang['Maximum photo width'] = 'Larghezza massima delle foto';
+$lang['Maximum width must be a number superior to 50'] = 'La larghezza massima deve essere un numero superiore a 50';
+$lang['Menu'] = 'Menu';
+$lang['month'][10] = 'Ottobre';
+$lang['month'][11] = 'Novembre';
+$lang['month'][12] = 'Dicembre';
+$lang['month'][1] = 'Gennaio';
+$lang['month'][2] = 'Febbraio';
+$lang['month'][3] = 'Marzo';
+$lang['month'][4] = 'Aprile';
+$lang['month'][5] = 'Maggio';
+$lang['month'][6] = 'Giugno';
+$lang['month'][7] = 'Luglio';
+$lang['month'][8] = 'Agosto';
+$lang['month'][9] = 'Settembre';
+$lang['Most visited'] = 'Le più viste';
+$lang['N/A'] = 'Non disponibile';
+$lang['New on %s'] = 'Nuovo il %s';
+$lang['New password'] = 'Nuova password';
+$lang['Next'] = 'Prossima';
+$lang['no rate'] = 'nessun voto';
+$lang['No'] = 'No';
+$lang['Not repeat the slideshow'] = 'Non ricominciare proiezione';
+$lang['Notification'] = 'Notifiche RSS';
+$lang['Number of items'] = 'Numero di elementi';
+$lang['Number of photos per page'] = 'Numero di miniature per pagina';
+$lang['obligatory'] = 'obbligatorio';
+$lang['Original dimensions'] = 'Dimensioni originali';
+$lang['Page generated in'] = 'Pagina generata in';
+$lang['Password forgotten'] = 'Password dimenticata';
+$lang['Password reset is not allowed for this user'] = 'Il rinnovo della password non è consentito per questo utente';
+$lang['Password Reset'] = 'Rinnovare la vostra password';
+$lang['password updated'] = 'password aggiornata';
+$lang['Password'] = 'Password';
+$lang['Pause of slideshow'] = 'Pausa proiezione';
+$lang['photo'] = 'foto';
+$lang['Photos only RSS feed'] = 'Feed RSS solo per le foto';
+$lang['photos posted during the last %d days'] = 'foto aggiunte durante gli ultimi %d giorni';
+$lang['Photos posted within the last %d day.'] = 'Foto pubblicate nelle ultime 24 ore.';
+$lang['Photos posted within the last %d days.'] = 'Foto pubblicate negli ultimi %d giorni.';
+$lang['Piwigo Help'] = 'Help di Piwigo';
+$lang['Play of slideshow'] = 'Avvia proiezione';
+$lang['please enter your password again'] = 'Reinserire la password, grazie.';
+$lang['Please enter your username or email address.'] = 'Grazie d\'inserire il nome utente o l\'indirizzo email';
+$lang['Please, enter a login'] = 'Inserire nome utente, grazie';
+$lang['Post date'] = 'Data d\'invio';
+$lang['posted after %s (%s)'] = 'disponibile dopo il %s (%s)';
+$lang['posted before %s (%s)'] = 'disponibile prima del %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'disponibile tra %s (%s) e il %s (%s)';
+$lang['posted on %s'] = 'disponibile il %s';
+$lang['Posted on'] = 'Inviato il';
+$lang['Powered by'] = 'Sito realizzato grazie a';
+$lang['Preferences'] = 'Preferenze';
+$lang['Previous'] = 'Precendente';
+$lang['Profile'] = 'Profilo';
+$lang['Quick connect'] = 'Connessione veloce';
+$lang['Quick search'] = 'Ricerca rapida';
+$lang['Random photos'] = 'Foto a caso';
+$lang['Rank'] = 'Rango';
+$lang['Rate this photo'] = 'Vota questa foto';
+$lang['Rating score'] = 'Punteggio';
+$lang['Recent albums'] = 'Album recenti';
+$lang['Recent period must be a positive integer value'] = 'Il periodo deve essere un valore intero positivo';
+$lang['Recent period'] = 'Periodo recente';
+$lang['Recent photos'] = 'Ultime foto';
+$lang['Redirection...'] = 'Reindirizzamento in corso...';
+$lang['Reduce diaporama speed'] = 'Ralentare la velocità proiezione';
+$lang['Register'] = 'Registrati';
+$lang['Registration of %s'] = 'Registrazione di %s';
+$lang['Registration'] = 'Registrazione';
+$lang['Related tags'] = 'Tags correlati';
+$lang['remove this tag from the list'] = 'Eliminare questo tag dall\'elenco';
+$lang['Repeat the slideshow'] = 'Ricominciare proiezione';
+$lang['representative'] = 'rappresentative';
+$lang['Reset to default values'] = 'Ripristinare le impostazioni predefinite';
+$lang['Reset'] = 'Cancellare';
+$lang['Retrieve password'] = 'Recuperare la password';
+$lang['Return to home page'] = 'Ritornare alla home page';
+$lang['return to normal view mode'] = 'Ritorna alla visualizzazione normale';
+$lang['return to the display of all photos'] = 'ritornare alla visualizzazione di tutte le foto';
+$lang['RSS feed'] = 'Feed RSS';
+$lang['Search by date'] = 'Cercare per data';
+$lang['Search for all terms'] = 'Cercare tutte le parole';
+$lang['Search for any term'] = 'Cercare una qualsiasi delle parole';
+$lang['Search for Author'] = 'Cercare un Autore';
+$lang['Search for words'] = 'Cercare le parole';
+$lang['Search in albums'] = 'Cercare negli album';
+$lang['Search in sub-albums'] = 'Cercare nei sub-album';
+$lang['Search results'] = 'Risultato della ricerca';
+$lang['Search rules'] = 'Criteri di ricerca';
+$lang['Search tags'] = 'Ricercare i tags';
+$lang['search'] = 'Cerca nella galleria';
+$lang['Search'] = 'Cerca';
+$lang['searched words : %s'] = 'parole cercate : %s';
+$lang['Sent by'] = 'Mandato da';
+$lang['Send my connection settings by email'] = 'Ricevere i miei ID via mail';
+$lang['set as album representative'] = 'Impostare come rappresentativa per l\'album';
+$lang['Show file metadata'] = 'Mostrare i metadati del file';
+$lang['Show number of comments'] = 'Mostrare il numero dei commenti';
+$lang['Show number of hits'] = 'Mostrare il numero di visualizzazioni';
+$lang['show tag cloud'] = 'mostrare la nuvola di tags';
+$lang['Since'] = 'Dal';
+$lang['slideshow'] = 'Avviare la proiezione di diapositive';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Qualcuno ha chiesto di rinnovare la propria password per l\'utente seguente :';
+$lang['Sort by'] = 'Ordina per';
+$lang['Sort order'] = 'Ordinamento';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Iscrizione riuscita, riceverete presto una email con il vostro ID. Benvenuto !';
+$lang['Specials'] = 'Speciale';
+$lang['SQL queries in'] = 'Queries SQL in';
+$lang['stop the slideshow'] = 'fermare le diapositive';
+$lang['Submit'] = 'Confermare';
+$lang['Tag results for'] = 'Risultato dei tag per';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tags';
+$lang['the beginning'] = 'L\'inizio';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'La galleria è chiusa per manutenzione. Torna più tardi.';
+$lang['The number of photos per page must be a not null scalar'] = 'Il numero di foto per pagina deve essere un intero non nullo';
+$lang['The passwords do not match'] = 'Le password non coincidono';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'L\'RSS Feed notifica delle novità della galleria: nuove foto, nuovi album, nuovi commenti. Da usare con un lettore RSS Feed.';
+$lang['the username must be given'] = 'nome utente obbligatorio';
+$lang['This author modified following comment:'] = 'Questo autore ha modificato il commento seguente:';
+$lang['This author removed the comment with id %d'] = 'Questo autore ha cancellato il commento con  l\'ID %d';
+$lang['this email address is already in use'] = 'un utente usa già questo indirizzo mail';
+$lang['This login is already used by another user'] = 'Questo nome utente esiste già';
+$lang['this login is already used'] = 'Nome utente già esistente';
+$lang['Thumbnails'] = 'Miniature';
+$lang['To reset your password, visit the following address:'] = 'Per rinnovare la vostra password, cliccare sul link qui sotto :';
+$lang['today'] = 'Oggi';
+$lang['Unknown feed identifier'] = 'Identificatore di flusso sconosciuto';
+$lang['Unknown identifier'] = 'Identificante sconosciuto';
+$lang['Update your rating'] = 'Aggiorna il tuo voto';
+$lang['useful when password forgotten'] = 'utile se si dimentica la password';
+$lang['User "%s" has no email address, password reset is not possible'] = 'L\'utente "%s" non ha nessun indirizzo email, il rinnovo della password è impossibile';
+$lang['User comments'] = 'Commenti utenti';
+$lang['User: %s'] = 'Utente: %s';
+$lang['Username "%s" on gallery %s'] = 'Utente "%s" sur la galerie %s';
+$lang['Username or email'] = 'Nome utente o indirizzo email';
+$lang['Username'] = 'Nome utente';
+$lang['Username modification'] = 'Modificare il nome utente';
+$lang['View'] = 'Vista';
+$lang['Visits'] = 'Visite';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Settimana %d';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Benvenuto nella vostra galleria fotografica Piwigo !';
+$lang['Welcome'] = 'Benvenuto';
+$lang['wrong date'] = 'data errata';
+$lang['Yes'] = 'Sì';
+$lang['You are not authorized to access the requested page'] = 'Non sei autorizzato a visualizzare la pagina richiesta';
+$lang['You will receive a link to create a new password via email.'] = 'Via email, riceverete un link da cliccare per rinnovare la vostra password';
+$lang['Your comment has been registered'] = 'Il vostro commento è stato registrato';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Il vostro commento NON è stato registrato perchè non rispetta le regole di convalidazione';
+$lang['Your favorites'] = 'Le mie preferite';
+$lang['Your Gallery Customization'] = 'Personalizzare la visualizzazione della Galleria ';
+$lang['Your username has been successfully changed to : %s'] = 'Il vostro nome d\'utente è stato cambiato con : %s';
+$lang['Your password has been reset'] = 'La password è stata reimpostata';
+$lang['Original'] = 'Originale';
+$lang['Thank you for registering at %s!'] = 'Grazie per esservi iscritti su %s !';
+$lang['Here are your connection settings'] = 'Eccovi i vostri ID';
+$lang['Password: %s'] = 'Password : %s';
+$lang['Username: %s'] = 'Nome utente : %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Se pensate avere ricevuto questa email per sbaglio, contattateci %s';
+$lang['Photo sizes'] = 'Dimenzioni delle foto';
+$lang['square'] = 'Quadrata';
+$lang['thumb'] = 'Miniatura';
+$lang['2small'] = 'XXS - Minuscola';
+$lang['xsmall'] = 'XS - Piccolissima';
+$lang['small'] = 'S - Piccola';
+$lang['medium'] = 'M - Media';
+$lang['large'] = 'L - Grande';
+$lang['xlarge'] = 'XL - Grandissima';
+$lang['xxlarge'] = 'XXL - Enorme';
+$lang['Show latest comments first'] = 'Visualizzare i commenti i più recenti prima';
+$lang['Show oldest comments first'] = 'Visualizzare i commenti i meno recenti prima';
+$lang['View in'] = 'Visualizzazione';
+$lang['Mobile'] = 'Mobile';
+$lang['Desktop'] = 'Classico';
+$lang['Date created, new &rarr; old'] = 'Data di creazione, recente &rarr; vecchia';
+$lang['Date created, old &rarr; new'] = 'Data di creazione, vecchia &rarr; recente';
+$lang['Date posted, new &rarr; old'] = 'Data di inserimento, recente &rarr; vecchia';
+$lang['Date posted, old &rarr; new'] = 'Data di inserimento, vecchia &rarr; recente';
+$lang['File name, A &rarr; Z'] = 'Nome file, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nome file, Z &rarr; A';
+$lang['Manual sort order'] = 'Ordine manuale';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numero identificativo, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numero identificativo, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Titolo immagine, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Titolo immagine, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Valutazione, alto &rarr; basso';
+$lang['Rating score, low &rarr; high'] = 'Valutazione, basso &rarr; alto';
+$lang['Visits, high &rarr; low'] = 'Visite, alto &rarr; basso';
+$lang['Visits, low &rarr; high'] = 'Visite, basso &rarr; alto';
+?>
Index: tags/2.4.0RC3/language/it_IT/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,141 @@
+<h2>Modificare un album</h2>
+
+<h3>Informazioni</h3>
+
+<ul>
+
+  <li><strong>nome</strong>: rinominare l'album (virtualmente in caso
+  di un album fisico).</li>
+
+  <li><strong>descrizione</strong>: da un'idea generale del contenuto,
+  questo testo verrà visualizzato nella parte inferiore della pagina miniature.</li>
+
+</ul>
+
+<h3>Spostare</h3>
+
+<p>Se l'album è virtuale, potete spostarlo. Spostare un
+album significa cambiarne l'album padre.</p>
+
+<h3>Opzioni</h3>
+
+<ul>
+
+  <li><strong>Tipo di accesso</strong>: Gestione dei permessi. Se rendete
+un album privato, tutti gli album figli diventono privati. Se
+rendete un album pubblico, tutti gli album genitori diventono
+pubblichi.</li>
+
+  <li><strong>Blocco</strong>: Gli album e i sub-album verranno disattivati temporaneamente per manutenzione.</li>
+
+<li><strong>Commenti</strong>: Autorizzare gli utenti a commentare
+le foto di quest'album.</li>
+  
+</ul>
+
+<p>Potete anche gestire queste opzioni con la gestione delle "Proprietà"
+(schermo <span class="pwgScreen">Commenti</span>, <span
+class="pwgScreen">Blocco</span>, <span
+class="pwgScreen">Pubblico/Privato</span>, <span
+class="pwgScreen">Rappresentativa</span> disponibile in <span
+class="pwgScreen">Amministrazione &raquo; Album &raquo; Proprietà</span>).</p>
+
+<h3>Ordine di apparizione</h3>
+
+<p>Scegliere se il tipo di ordinamento predefinito sarà usato.</p>
+
+<p>Indicare se quest'ordinamento sarà applicato ai sub-album.</p>
+
+<p>Scegliere le colonne per l'ordinamento da usare su quest'album.</p>
+<ul>
+<li><strong>Data di creazione</strong>: Data di creazione della foto</li>
+<li><strong>Aggiunto il</strong>: Data di sincronizzazione</li>
+<li><strong>Voto medio (*)</strong>: Media che potrebbe essere modificata dal voto di un utente</li>
+<li><strong>Le più viste (*)</strong>: La visita attuale potrebbe modificare l'ordine delle foto più viste</li>
+<li><strong>Nome file</strong>: Nome inserito nei campi precedenti</li>
+<li><strong>Id</strong>: Id interno (gli album più recenti hanno un "Id" più grande dei precedenti.</li>
+
+</ul>
+<p><strong>(*)</strong>Attenzione: Effettuare qualche test, l'ordinamento scelto potrebbe darvi qualche sorpresa.</p>
+
+
+<h3>Copertina</h3>
+
+<p>La copertina di un album è la miniatura che appare per rappresentare l'album sulla pagina principale (<span
+class="pwgScreen">category.php</span>) quando
+l'album contiene solo dei sub-album
+e non direttamente delle foto (come
+alla radice).</p>
+
+<p>Esistono quattro modi per scegliere la copertina di un album:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Pagina di visualizzazione delle foto</span>: nella barra delle azioni, uno dei pulsanti permette di scegliere
+la foto da visualizzare come copertina rappresentante l'album visualizzato. Il pulsante in questione è visibile solo
+agli amministratori.</li>
+
+  <li><span class="pwgScreen">Modicare le informazioni di una foto</span>
+in amministrazione. Questa pagina può essere raggiunta tramite <span
+class="pwgScreen">picture.php</span> o <span class="pwgScreen">Gestione per
+lotti</span> con il <em>modo unitario</em>. Per i dettagli, vedi l'aiuto per
+questa pagina.</li>
+
+  <li><span class="pwgScreen">Amministrazione &raquo; Album &raquo; Proprietà &raquo; 
+Copertina</span>. Per i dettagli, vedi l'aiuto per questa pagina.</li>
+
+  <li><span class="pwgScreen">Modificare un album</span> (questa
+pagina).</li>
+
+</ul>
+
+<p>La scelta della copertina dipende dal parametro di configurazione
+<code>allow_random_representative</code> (vedi <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Di default (<code>allow_random_representative</code> è impostato su "false"), ogni
+album contenente almeno una foto, è rappresentato da un elemento
+fisso (copertina). Una volta impostata (alla creazione del album), la copertina cambia
+solo se lo decide l'amministratore. Se la copertina
+non è appropriata, potete chiedere di <strong>Scegliere una copertina
+a caso</strong>.</p>
+
+<p>Se il parametro di configurazione <code>allow_random_representative</code>
+è impostato su "true", l'album contenente delle foto può non avere
+una copertina fissa. Usare semplicemente il pulsante <strong>Cancellare
+copertina</strong>.</p>
+
+<p>Se l'album non contiene nessuna foto (ma solo dei sub-album) può comunque essere rappresentata da un qualsiasi
+foto. Utilizzare la pagina <span class="pwgScreen">Modicare le informazioni
+di una foto</span>. L'unica opzione disponibile di questa pagina è il pulsante
+<strong>Cancellare copertina</strong>.</p>
+
+<h3>Associare tutte le foto di un album ad un nuovo album</h3>
+
+<ul>
+
+<li><strong>Nome del album virtuale</strong>: Nome del nuovo album da creare,
+tutte le foto dell'attuale album verranno associate al nuovo album.</li>
+
+<li><strong>Album padre</strong>: Dove deve essere creato il nuovo album,
+lasciare vuoto per crearlo alla radice (root) del sito.</li>
+
+</ul>
+
+<h3>Associare tutte le foto del album attuale a degli album esistenti</h3>
+
+<ul>
+
+<li><strong>Album</strong>: Scegliere l'album di destinazione.</li>
+
+</ul>
+
+<h3>Inviare un'email informativa ai membri del gruppo</h3>
+
+<ul>
+
+<li><strong>Gruppo</strong>: Gruppo dei destinatari</li>
+
+<li><strong>Contenuto dell'email</strong>: Testo libero da mandare.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/cat_move.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Spostare gli album virtuali</h2>
+
+<p>Solo gli album virtuali possono avere un nuovo album padre.</p>
+
+<h3>Album virtuali da spostare</h3>
+
+<p>Selezionare uno o più album virtuali da spostare. 
+Se l'elenco è vuoto, ciò vuole dire che non ne avete ancora creato uno.</p>
+
+<h3>Nuovo album padre</h3>
+
+<p>Selezionare un nuovo album padre (virtuale o fisico).
+Se non ne selezionate uno, 
+gli album da spostare verranno inserite nella root del sito.
+Non potete spostare un album verso se stesso o verso un proprio sub-album.</p>
Index: tags/2.4.0RC3/language/it_IT/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/cat_options.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>Opzioni degli album</h2>
+
+<p>Gestione delle opzioni di più album alla volta.</p>
+
+<dl>
+  
+  <dt>Commenti utenti</dt>
+
+  <dd>Permettere agli utenti di aggiungere dei commenti negli album selezionati.
+È possibile aggiungere un commento ad una foto se questa si trova in un album dove i commenti sono autorizzati.</dd>
+
+  <dt>Bloccare</dt>
+
+  <dd>Gli album selezionati sono temporaneamente bloccati
+per lavori di manutenzione. Se un album è bloccato per manutenzione, tutti i sub-album sono a loro volta bloccati.
+Se un album è sbloccato, tutti gli album padri vengono sbloccare.</dd>
+
+  <dt>Pubblico / Privato</dt>
+
+  <dd>La gestione dei permessi è possibile solo sugli album privati. Una volta reso un album privato, dovete
+in modo esplicito autorizzare gli utenti o i gruppi
+ad accedervi. Se un album è privato, tutti i sub-album diventono a loro volta privati.
+Se un album diventa pubblico, tutti gli album padri diventono pubblici.</dd>
+
+  <dt>Copertina</dt>
+
+  <dd>Questa opzione è disponibile solo se il parametro di
+configurazione <code>allow_random_representative</code> (vedi <span
+class="filename">include/config_defaults.inc.php</span>) è impostato su 
+<em>true</em>. Ogni album può essere rappresentato da una miniatura presa a caso o da una miniatura scelta come unica copertina.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/it_IT/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,13 @@
+<h2>Gestire i permessi per un album</h2>
+
+<p>Questa pagina è disponibile soltanto per gli album privati.
+Qui potete scegliere gli utenti e i gruppi autorizzati per quest'album.</p>
+
+<h3>Gruppi</h3>
+
+<p>Potete concedere o negare l'accesso dei gruppi per l'album corrente. Di conseguenza, gli utenti
+che appartengono a questi gruppi si vedranno autorizzati, o non autorizzati, ad accedere al suddetto album.</p>
+
+<h3>Utenti</h3>
+
+<p>Potete concedere o negare l'accesso agli utenti ad un album in modo individuale. Agli utenti autorizzati ad accedere ad un album, grazie all'appartenenza ad un gruppo, gli si può negare l'accesso attivando un'eccezione</p>
Index: tags/2.4.0RC3/language/it_IT/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/configuration.html	(revision 14585)
@@ -0,0 +1,132 @@
+<h2>Configurazione</h2>
+
+<p>Questa pagina permette di gestire la configurazione di base. 
+Infatti, questa pagina mostra soltanto i parametri che dovrebbero 
+bastare per la maggiore parte degli amministratori. Se volete 
+vedere gli altri numerosi parametri di configurazione, leggete il file <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Questa pagina è divisa in diverse sezioni, raggruppando i parametri 
+di configurazione per tema.</p>
+
+<h3>Principale</h3>
+<ul>
+
+  <li><strong>Titolo della galleria</strong>: usato per i Feed RSS e 
+la notifica via email.</li>
+
+  <li><strong>Banner delle pagine</strong>: Codice HTML presente in alto
+su tutte le pagine.</li>
+
+  <li><strong>URL della galleria</strong>: usato per i Feed RSS.</li>
+
+  <li><strong>Blocco galleria</strong>: Bloccare la galleria per 
+la manutenzione. Solo gli amministratori avranno accesso
+alla galleria.</li>
+
+  <li><strong>Voto</strong>: E' possibile dare un voto alle foto.</li>
+
+  <li><strong>Voto degli ospiti</strong>: Anche gli ospiti (utenti non registrati) possono dare un voto alle foto.</li>
+
+  <li><strong>Autorizzare l'iscrizione di nuovi utenti</strong>: Iscrizione libera per tutti.</li>
+
+  <li><strong>L'indirizzo email è obbligatorio per tutti gli utenti</strong>: L'indirizzo email sarà verificato durante l'iscrizione o durante l'aggiornamento dei profili, salvo il caso in cui l'iscrizione o l'aggiornamento venissero effettuati nel pannello di amministrazione, da parte dell'amministratore.</li>
+
+  <li><strong>Notificare agli amministratori quando un nuovo utente si registra</strong>: Gli amministratori riceveranno un'email ad ogni nuova iscrizione di utenti.</li>
+  
+  <li><strong>Ordinamento di default delle foto</strong> : Potete definire un'ordinamento personalizzato grazie a i menu a tendina.</li>
+
+</ul>
+
+<h3>Cronologia</h3>
+
+  <p>Le visite alle pagine <span
+class="pwgScreen">index.php</span> e <span
+class="pwgScreen">picture.php</span> sono
+registrate nella tabella <code>history</code>.</p>
+
+  <p>Le visite sono mostrate nella pagina <span class="pwgScreen">Amministrazione &raquo; tools &raquo; Cronologia</span>.</p>
+
+<ul>
+  <li><strong>Registrare le pagine visitate dagli ospiti</strong>: le pagine visitate dagli ospiti sono registrate.</li>
+
+  <li><strong>Registrare le pagine visitate dagli utenti</strong>: le pagine visitate dagli utenti sono registrate.</li>
+
+  <li><strong>Registrare le pagine visitate dagli amministratori</strong>: le pagine visitate dagli amministratori sono registrate.</li>
+
+</ul>
+
+<h3>Commenti</h3>
+<ul>
+
+  <li><strong>Commenti utenti per tutti</strong>: anche gli ospiti 
+possono scrivere commenti.</li>
+
+  <li><strong>Numero di commenti utente per pagina</strong>.</li>
+
+  <li><strong>Approvazione</strong>: un amministratore deve autorizzare 
+i commenti degli utenti prima che questi possano essere visibili nella
+parte pubblica. L'approvazione dei commenti utente avviene nella
+pagina <span class="pwgScreen">Amministrazione &raquo; Tools &raquo; Commenti in attesa</span>.</li>
+
+  <li><strong>Notificare agli amministratori quando un commento è stato scritto</strong>:
+Invio di un'email agli amministratori quando un utente scrive un commento.</li>
+
+  <li><strong>Notificare agli amministratori quando un commento richiede l'approvazione</strong>:
+Invio di un'email agli amministratori quando un utente scrive un commento che necessita di approvazione.
+L'approvazione dei commenti utente avviene nella pagina <span class="pwgScreen">Amministrazione &raquo; Tools &raquo; Commenti in attesa</span>.</li>
+
+</ul>
+
+<h3>Visualizzazione di default</h3>
+<p>Modificare le opzioni di visualizzazione di default per gli utenti non 
+connessi. Una volta effettuata la connessione, queste opzioni sono
+personalizzabili nella videata <span
+class="pwgScreen">profilo</span>).</p>
+
+<p>È possibile cambiare le impostazioni per gli utenti esistenti,
+in quest'altra pagina: <span class="pwgScreen">Amministrazione &raquo; 
+Utenti &raquo; Gestire</span>, in cui potete cambiare le impostazioni 
+degli utenti.</p>
+
+<ul>
+
+  <li><strong>Lingua</strong>: Solo per i titoli della galleria.
+Il nome degli album, delle foto e le descrizioni non sono compresi
+nella traduzione.</li>
+
+  <li><strong>Numero di miniature per riga</strong></li>
+
+  <li><strong>Numero di righe per pagina</strong></li>
+
+  <li><strong>Tema dell'interfaccia</strong></li>
+
+  <li><strong>Periodo recente</strong>: in giorni. Periodo durante il quale
+una foto è considerata come recente. Questo periodo deve essere superiore
+a 1 giorno.</li>
+
+  <li><strong>Espandere gli album</strong>: Espandere di default tutti
+gli album nel menu? <em>Attenzione</em>: questa opzione consuma molte
+risorse di sistema, se avete tanti album
+e sub-album.</li>
+
+  <li><strong>Mostrare il numero di commenti</strong>: Mostrare il numero
+di commenti sotto ogni miniatura. <em>Attenzione</em>: questa opzione consuma 
+delle risorse di sistema.</li>
+
+  <li><strong>Mostrare il numero di visite</strong>: Mostrare il numero 
+  di visualizzazioni della foto sotto la miniatura, nella pagina delle miniature. 
+  Valido solo se il parametro di configurazione avanzata è : <br>
+  $conf['show_nb_hits'] = true; <br>
+  N.B.: Di default il parametro è impostato su "false".</li>
+
+  <li><strong>Larghezza massima delle foto</strong>: larghezza massima di 
+  una foto visualizzata. Se la foto è più larga del parametro inserito, 
+  allora quest'ultima verrà ridimensionata. Se pensate che sia necessario cambiare 
+  questo parametro (per la visualizzazione di default), allora sarebbe meglio
+ridimensionare le foto prima di caricarle, specialmente se queste sono molto pesanti.</li>
+
+  <li><strong>Altezza massima delle foto</strong>: stessi consigli della 
+  voce precedente.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,101 @@
+<h2>Configurazione per "l'estensione" dei templates</h2>
+
+<h3>Scopo</h3>
+<p>Definire le condizioni di sostituzione per ogni template (modello) dalla directory template-extension
+(template chiamato il "replacer" ("modelli personalizzato" / "sostituto")).</p>
+
+<p>I "templates originali" provengono da ./themes/default/template (o qualunque altro tema)
+ saranno rimpiazzati da un sostituto se quest'ultimo è collegato al "template originale"
+ (e in modo facoltativo, quando l'URL richiesta contiene un "parametro facoltativo dell'URL").</p>
+
+<p>I "parametri facoltativi dell'URL" sono quelli che potete trovare dopo il nome del modulo nell'indirizzo (URL).</p>
+
+<p>Quindi un "parametro facoltativo dell'URL" può essere un "permalink" attivo (per maggiore informazioni 
+vedere i permalinks nella nostra documentazione).</p>
+
+<p>Leggere: `<a href="#warnings">Avvertimenti</a>` sulle condizioni d'uso.</p>
+
+<h3>Che cosa sono le estensioni dei template?</h3>
+
+<p>Questo tool di configurazione è potente sia per i principianti che per gli utenti esperti.
+Trammite FTP, nella directory template-estensione, il Webmaster può duplicare i file
+ .tpl ("template originali") con un nome diverso
+ (sostituto).
+
+ "Template originali", attualmente i modelli d'origine sopportati sono:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> e/o <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> e/o <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> e/o <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> e/o <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> e/o <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> e/o <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> e/o <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Dove posso trovare i "templates originali"?</h3>
+
+<p>I templates originali sono in /themes/default/template/
+(non modificare i templates originali per evitare problemi durante gli aggiornamenti futuri). Così, con
+i "templates originali", il webmaster può creare i suoi "replacers (modelli personalizzati)".</p>
+
+<h3>Dove posso salvare i "modelli personalizzati"?</h3>
+
+<p><strong>I templates personalizzati</strong> possono essere salvati nella directory 
+template-extension (o sottodirectory).
+I "modelli personalizzati" possono avere qualunque nome con l'estensione .tpl. Per esempio: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Come posso attivare i miei "modelli personalizzati"?</h3>
+<p>Un <strong>template originale</strong> dovrebbe essere assegnato a 
+ <strong>un replacer (modello personalizzato)</strong> per potere attivare i modelli personalizzati associati.
+ Attivare i modelli personalizzati è la funzione "Estende i templates" nel menu di Configurazione dell'Amministrazione.</p>
+
+<p>Se selezionate un <strong>Parametro facoltativo del URL</strong> i modelli personalizzati saranno utilizzati 
+unicamente sulle pagine con questa parola chiave. Per esempio: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Gli utenti esperti useranno i permalinks (link permanenti) come
+<strong>parametro facoltativo del URL</strong>. </p>
+
+<p>Se selezionate un <strong>template legato</strong>, i modelli personalizzati avranno luogo unicamente su questo template.</p>
+
+<h3>Come posso disattivare mio "sostituto"?</h3>
+<ul>
+<li>Deselezionare il "template originale".</li>
+<li>Con l'FTP cancellare il "sostituto".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Avvertenze</h3>
+<ul>
+
+  <li>Il <strong>template d'origine</strong> deve essere il vero template "originale"
+  altrimenti potreste avere dei risultati inattesi!</li>
+
+  <li>Se diversi <strong>replacers (templates personalizzati)</strong> hanno lo stesso 
+  <strong>template originale</strong> e lo stesso <strong>parametro facoltativo del URL</strong> 
+  solo l'ultimo sostituto satà attivo.</li>
+
+  <li>Non selezionare <strong>il parametro facoltativo del URL</strong> 
+  attiverà il sostituto ad ogni uso del template.
+  Come detto precedente, l'ordine può annullare i modelli personalizzati precedenti.</li>
+
+  <li>Le sottodirectory:
+  Le sottodirectory sono ignorate, ma sono utili per cambiare l'ordine dei modelli personalizzati.<br />
+distributed-samples: sono distribuite per le vostre prove! 
+<strong>Non modificateli</strong>, create i vostri! 
+</li>
+
+  <li>Alla cancellazione di un sostituto, il <strong>template originale</strong>
+  sarà immediatamente riattivato.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/group_list.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Elenco dei gruppi</h2>
+
+<p>Amministrazione delle proprietà dei gruppi.</p>
+
+<h3>Aggiungere un gruppo</h3>
+
+<p>L'amministratore può creare dei gruppi.</p>
+
+<h3>Elenco dei gruppi</h3>
+
+<p>Permette per ogni gruppo di:</p>
+
+<ul>
+  <li>accedere al elenco dei membri</li>
+  <li>accedere ai permessi</li>
+  <li>cancellare il gruppo (necessita di conferma)</li>
+  <li>cambiare lo stato "default" (necessita di conferma)</li>
+</ul>
+
+<h3>Gruppo di default</h3>
+<p>Il gruppo di default è associato automaticamente ad ogni nuovo utente.</p>
Index: tags/2.4.0RC3/language/it_IT/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,33 @@
+<p>Esistono diversi metodi per aggiungere delle foto nella vostra
+galleria :</p>
+
+<ul>
+
+  <li><strong>L'upload diretto</strong> dal vostro browser è il metodo più semplice ed
+  immediato. Questo metodo dipende molto dalle capacità del vostro browser e del vostro
+  server web. Ideale per caricare poche foto. Per grossi volumi di foto, oppure in
+  caso di problemi, potete utilizzare dei metodi alternativi.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Utilizzare l'upload diretto</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> è un software gratuito da installare sul vostro 
+  computer. Scegliete le foto che volete trasferire ed inseritele nella finestra
+  di pLoader, cliccate su <em>"Trasferire verso Piwigo"</em> e lasciate che pLoader si occupi del resto. Esistono anche altri software, come <strong>WinToPiwigo</strong> o il modulo
+  di esportazione Piwigo di <strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Utilizzare pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP</strong>
+  è il metodo ideale per aggiungere una vasta collezione
+  di foto con un numero minimo di click del mouse. Seguite la guida per preparare
+  le vostre foto. Questo metodo consente di controllare con precisione l'organizzazione
+  fisica dei files sul server.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Utilizzare FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/it_IT/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/help_groups.html	(revision 14585)
@@ -0,0 +1,7 @@
+<p>I gruppi sono un semplice metodo per impostare le autorizzazioni di un elenco di utenti.</p>
+
+<p>E' possibile creare gruppi ed aggiungere degli utenti in
+<span class="pwgScreen">Amministrazione &raquo; Utenti &raquo; Gruppi</span>.</p>
+
+<p>Un utente può appartenere a diversi gruppi. L'autorizzazione è prioritaria rispetto alla proibizione. Ad esempio, se l'utente "pippo" appartiene ai gruppi "famiglia"
+e "amici", e, tra questi gruppi, solo il gruppo "famiglia" può vedere l'album "Natale 2010", ne consegue che l'utente "pippo" sarà abilitato a visualizzare quest'album.</p>
Index: tags/2.4.0RC3/language/it_IT/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Dopo aver creato la vostra galleria potete configurarla per gli ospiti
+ <ul>
+	<li>La visualizzazione di default in <span class="pwgScreen">Amministrazione &raquo; Configurazione &raquo; Opzioni</span> scheda <span class="pwgScreen">Parametri ospite</span>.</li>
+	<li>Il tema di default in <span class="pwgScreen">Amministrazione &raquo; Configurazione &raquo; Temi</span></li>
+	<li>La lingua di default in <span class="pwgScreen">Amministrazione &raquo; Configurazione &raquo; Lingue</span></li>
+ </ul>
+ Di default, ogni nuovo utente erediterà queste proprietà al momento della registrazione.
+</p>
+<p>Se avete delle domande, la comunità di Piwigo sarà lieta di rispondervi sull'<a href="http://it.piwigo.org/forum">Forum</a>.</p>
Index: tags/2.4.0RC3/language/it_IT/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,48 @@
+<fieldset>
+<legend>Autorizzazioni per le foto</legend>
+
+<p>Ogni foto ha un <strong>livello di privacy</strong>. Anche ciascun utente ha un livello di privacy. Ci sono 5 livelli di privacy:
+<ol>
+  <li>Nessuno</li>
+  <li><em>Contatti</em></li>
+  <li><em>Amici</em> (superiore al livello Contatti)</li>
+  <li><em>Famiglia</em> (superiore al livello Amici)</li>
+  <li><em>Amministratori</em> (superiore a tutti gli altri livelli)</li>
+</ol>
+
+<p>I livelli superiori dispongono delle autorizzazioni per accedere ai livelli inferiori. Per un dato utente, maggiore è il suo livello di privacy, più foto potrà vedere.</p>
+
+<p>Ad esempio, se il livello di privacy della foto "matrimonio_pietro-0024.jpg" fosse impostato su <em>"Famiglia"</em>, allora potreste avere una situazione simile:</p>
+<ul>
+  <li>Pietro che ha livello di privacy impostato su <em>Amministratore</em>, può vederla visto che il livello <em>"Amministratori"</em> permette di vedere tutte le foto</li>;
+  <li>Vanessa che ha livello di privacy impostato su <em>Famiglia</em>, vedrà anche lei la foto, perchè il livello <em>Famiglia</em> è il livello minimo richiesto</li>;
+  <li>Maria che ha livello di privacy impostato su <em>Amica</em>, non potrà vederla, perchè il livello <em>Amica</em> è inferiore al livello <em>Famiglia</em> che è quello minimo necessario</li>.
+</ul>
+
+<p>Un utente che non dispone delle autorizzazioni per vedere il contenuto di un album, non vedrà l'album e nemmeno il suo titolo. Lo stesso principio si applica a un tag.</p>
+
+<p>E' possibile impostare il livello di privacy di un utente nella pagina <span class="pwgScreen">Amministrazione &raquo; Utenti &raquo; Gestire</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Autorizzazioni per gli album</legend>
+
+<p>Se i livelli di privacy non corrispondono esattamente ai vostri bisogni, potete anche gestire le autorizzazioni per album, per un utente o per un gruppo. E' possibile gestire le autorizzazioni per le foto e gli album contemporaneamente, senza conflitti.</p>
+
+<p>Potete vietare l'accesso agli album. Impostate il tipo d'accesso a "privato" se desiderate vietare l'accesso all'album.</p>
+  
+<p>Potete rendere un album privato modificando il singolo album (<span
+class="pwgScreen">Amministrazione &raquo; Album &raquo; Gestire &raquo; Modificare</span>) o 
+impostando l'opzione dell'albero completo degli album (<span
+class="pwgScreen">Amministrazione &raquo; Album &raquo; Proprietà &raquo; Pubblico/Privato</span>).</p>
+
+<p>Una volta che l'album è privato, potrete gestire le autorizzazioni per gruppi e gli utenti da 3 pagine :</p>
+
+<ul>
+  <li><span class="pwgScreen">Amministrazione &raquo; Utenti &raquo; Gestire &raquo; azione Permessi</span> (un link per utente)</li>
+  <li><span class="pwgScreen">Amministrazione &raquo; Utenti &raquo; Gruppi &raquo; azione Permessi</span> (un link per gruppo)</li>
+  <li><span class="pwgScreen">Amministrazione &raquo; Album &raquo; Gestire &raquo; Modificare i permessi</span> (un link per album)</li>
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/it_IT/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Le foto sono visualizzate nell'album corrispondente alla directory.</p>
+
+<p>Potete anche visualizzare una foto in più di un album, senza dupplicare il file. Associate la foto a un'altra o più album dallo schermo di modifica della foto (al quale accedete dalla pagina di visualizzazione della foto della vostra galleria, quando siete connessi come Amministratore).</p>
+
+<p>Gli album virtuali nascono da questo principio: non sono associate a nessuna directory fisica. Create degli album virtuali in <span class="pwgScreen">Amministrazione &raquo; Album &raquo; Gestire</span>.</p>
Index: tags/2.4.0RC3/language/it_IT/help/history.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/history.html	(revision 14585)
@@ -0,0 +1,44 @@
+<h2>Cronologia</h2>
+
+<p>Queste pagine vi permettono di controllare la cronologia delle visite del vostro sito, a seconda delle opzioni che avete attivato in - Amministrazione &raquo; Configurazione &raquo; Opzioni &raquo; Scheda "Cronologia".</p>
+
+<h3>Statistiche</h3>
+<ul>
+  <p>Se avete scelto che le visite alle pagine <span
+class="pwgScreen">index.php</span> e <span
+class="pwgScreen">picture.php</span> siano
+registrate nella tabella <code>history</code>,
+questa scheda vi permette di controllare il numero di visite</p>
+	
+	<li><strong>Statistiche totali</strong>: visualizzate le statistiche annuali</li>
+	
+	<li><strong>Statistiche di un anno</strong>: visualizzate le statistiche mensili dell'anno selezionato.</li>
+	
+	<li><strong>Statistiche di un mese</strong>: visualizzate le statistiche giornaliere del mese selezionato.</li>
+	
+	<li><strong>Statistiche di una giornata</strong>: visualizzate le statistiche orarie del giorno selezionato.</li>
+	
+</ul>
+
+<h3>Ricerca</h3>
+<ul>
+  <p>Se avete scelto che le visite delle pagine <span
+class="pwgScreen">index.php</span> e <span
+class="pwgScreen">picture.php</span> siano
+registrate nella tabella <code>history</code>, questa scheda vi permette di controllare in dettaglio le pagine visitate con l'aiuto di diversi filtri.</p>
+ 
+	<li><strong>Filtro per data</strong> : selezionate il periodo
+di cui volete verificare l’attività.</li>
+	
+	<li><strong>Filtro per tipo di elemento</strong> : selezionate
+il tipo di elemento di cui volete osservare l’attività.</li>
+	
+	<li><strong>Utente</strong> : selezionate l'utente di cui
+volete osservare l'attività.</li>
+	
+	<li><strong>Nome file</strong> : selezionate il nome del file di cui
+volete osservare l'attività.</li>
+	
+	<li><strong>Id immagine</strong> : selezionate l'Id dell'immagine di cui
+volete osservare l'attività.</li>
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/index.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/it_IT/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/maintenance.html	(revision 14585)
@@ -0,0 +1,64 @@
+<h2>Manutenzione</h2>
+
+<p>Per ottimizzare il tempo di generazione di una pagina, Piwigo utilizza una memoria cache.
+ Per esempio, invece di contare il numero di foto contenute in ogni album
+ ad ogni caricamento della pagina, queste informazioni vengono immagazzinate nel database.
+ In teoria, questa informazione dovrebbe essere sempre corretta, ma a volte si può verificare 
+ un errore e le informazioni memorizzate nella cache risulteranno errate.</p>
+
+<p>Alcune informazioni diventano inutili col tempo. Cancellare queste
+informazioni inutili dal database vi permette di liberare spazio sul disco.</p>
+
+<ul>
+
+  <li>
+    <strong>Elementi orfani:</strong>
+    Mostra le foto che non sono associate ad un album virtuale.
+  </li>
+  <li>
+    <strong>File con lo stesso nome in più album fisici:</strong>
+    Mostra le foto o altri file con lo stesso nome, trovati in più album.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Aggiornamento delle informazioni degli album :</strong> 
+  Per ogni album, sono controllate e, se necessario, aggiornate le seguenti informazioni: 
+  elenco degli album padri, numero di foto, data dell'ultima foto, posizione tra
+  gli album di stesso livello, posizione tra album padri e album figli.
+  Quest'azione controlla anche la presenza delle foto che fungono da copertina.</li>
+
+  <li><strong>Aggiornamento delle informazioni delle foto:</strong>
+Per ogni foto, le informazioni aggiornate sono: il percorso completo
+del file, il voto medio. Attenzione: da non confondere con i metadati
+sincronizzabili tramite la pagina <span class="pwgScreen">Amministrazione &raquo; Album &raquo; Sincronizzare</span>
+o nella pagina <span class="pwgScreen">Modificare le informazioni della foto</span> (accessibile dalla pagina di visualizzazione di una foto <span class="pwgScreen">picture.php</span>).</li>
+
+  <li><strong>Riparare e ottimizzare il database:</strong>
+Vengono eseguite le operazioni di riordinamento, riparazione ed ottimizzazione di ogni tabella del database.
+  </li>
+
+</ul>
+
+<ul>
+  <li><strong>Ripulire i dettagli dalla cronologia:</strong> 
+Cancella tutte le righe dalla tabella <code>history</code>. La pagina <span class="pwgScreen">
+Amministrazione &raquo; Tools &raquo; Cronologia</span> non mostrerà più nessuna informazione relativa alla cronologia. 
+<em>Attenzione</em>: Tutte le informazioni saranno definitivamente perse e non sarà più possibile recuperarle.
+  </li>
+
+  <li><strong>Ripulire il sommario della cronologia:</strong>
+Cancella tutte le informazioni del sommario (ottenute dal dettaglio della cronologia).
+  </li>
+
+  <li><strong>Ripulire le sessioni scadute:</strong> cancella tutte le sessioni scadute.</li>
+
+  <li><strong>Ripulire i flussi di notifica mai usati:</strong> cancella tutte le notifiche che non sono mai state usate.</li>
+  
+  <li><strong>Ripulire la cronologia delle ricerche:</strong> cancella tutte le informazioni sulle ricerche effettuate.</li>
+  
+  <li><strong>Ripulire i templates compilati:</strong> cancella le informazioni relative ai templates.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Notifiche tramite Email</h2>
+
+<p>Questa pagina consente di configurare e gestire le notifiche via Email sui cambiamenti e le novità del vostro sito.</p>
+
+<p>Questa pagina è composta di 3 schede:</p>
+
+<h3>Parametri</h3>
+<p>Disponibile soltanto per il Webmaster, questa scheda gestisce i parametri della notifica via email.</p>
+
+<h3>Iscrizione</h3>
+<p>Disponibile soltanto per il Webmaster, questa scheda gestisce l'iscrizione/disiscrizione alla notifica via email.</p>
+
+<h3>Invio</h3>
+<p>Disponibile per il Webmaster e gli Amministratori, questa scheda consente l'invio di email per notificare le novità del sito.</p>
Index: tags/2.4.0RC3/language/it_IT/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permalink</h2>
+
+<p>I Permalinks sono usati per rendere le url degli album più gradevoli. Quando un album ha un permalink associato, l'id dell'album nell'url non è più necessario.</p>
+
+<p>Quando un permalink è cancellato, potete salvarlo nello storico dei permalink, in modo che le fonti esterne alle pagine di PWG possano ancora farvi riferimento. Nella tabella della cronologia dei permalink potete trovare la data di cancellazione del permalink, oltre alla data dell'ultimo utilizzo ed il numero di volte che è stato utilizzato.</p>
+
+<p>Notare che i permalinks devono essere unici. Devono essere unici anche nella cronologia dei permalink.</p>
Index: tags/2.4.0RC3/language/it_IT/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,78 @@
+<fieldset>
+  <legend>Guida rapida</legend>
+
+<ol>
+  <li>Create una directory sul vostro PC.</li>
+
+  <li>Copiate qualche foto in questa directory. <em>Attenzione</em>: il nome delle directory e dei files deve essere solamente formato da lettere, cifre e/o i simboli "-", "_" o ".". Non utilizzare spazi o caratteri accentati.</li>
+
+  <li>Con un client FTP (tipo FIlezilla), caricate la directory in cui avete messo le foto, nella directory "galleries" della vostra galleria Piwigo.</li>
+
+  <li>Connettetevi alla vostra galleria Piwigo e andate in <span class="pwgScreen">Amministrazione</span> e cliccate sul pulsante Sincronizzazione</li>
+</ol>
+
+<p>Bene! Avete appena creato il primo album della vostra galleria.</p>
+
+</fieldset>
+
+<fieldset>
+  <legend>Organizzazione delle directory e dei files</legend>
+
+<ul>
+
+  <li>
+
+    <p>Nella directory "galleries" si trovano gli album di Piwigo. Qui di seguito potete vedere lo schema ad albero di una piccola galleria (ma che usa moltissime funzionalità) : </p>
+  
+<pre>
+galleries
+|-- matrimonio
+|   |-- cerimonia
+|   |   |-- in-chiesa
+|   |   |   |-- entrata-pietro.jpg
+|   |   |   +-- entrata-paola.jpg
+|   |   +-- uscita
+|   |   |   |-- uscita-pietro-paola.jpg
+|   |   |   +-- foto-gruppo-invitati.jpg
+|   +-- cocktail
+|       |-- discorso001.jpg
+|       |-- discorso002.jpg
+|       +-- discorso003.jpg
++-- viaggio-di-noze
+    |-- albergo.png
+    |-- video-decollaggio-aereo.avi
+    +-- pwg_representative
+        +-- video-decollaggio-aereo.jpg
+</pre>
+
+  </li>
+  
+  <li>Ad eccezzione di "pwg_representative", ogni directory inserita in "galleries" genera un album. Il numero di livelli (profondità) è illimitato.</li>
+
+  <li>Una foto è invece rappresentata da un file. Un file può essere una foto di Piwigo se la sua estensione è presente tra le possibilità previste nel parametro di configuarzione <code>file_ext</code> (vedi
+file <span class="filename">include/config.inc.php</span>). Un file è considerato come una foto
+se la sua estensione è presente tra quelle previste nel parametro di configurazione
+<code>picture_ext</code>.</li>
+
+  <li>Gli elementi che non sono delle foto (video, suoni, file di testo o
+altro) sono generalmente rappresentati con un'icona corrispondente
+all'estensione del file. In modo opzionale, è possibile associare una miniatura
+ed un file rappresentativo (come per il file <span 
+class="filename">video-decollaggio-aereo.avi</span> nell'esempio proposto).</li>
+
+  <li><em>Attenzione</em>: il nome di una directory o di un file deve essere
+composto da lettere, numeri o simboli come "-", "_" o ".". Non utilizzate spazio
+e caratteri accentati.</li>
+
+  <li><em>Suggerimento</em>: un album può contenere delle foto e
+dei sub-album. Tuttavia, è fortemente raccomandato scegliere,
+per ogni album, se inserire delle foto <strong>o</strong>
+dei sub-album.</li>
+
+  <li>Una volta che i file sono
+correttamente inseriti nelle directory, andare alla pagina <span
+class="pwgScreen">Amministrazione &raquo; Tools &raquo; Sincronizzare</span>.</li>
+
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/it_IT/help/search.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/search.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Ricerca</h2>
+
+<p>Cercare delle foto in tutta la galleria.</p>
+
+<dl>
+
+  <dt>Ricerca per parole</dt>
+
+  <dd>Cercare una o più parole in tutti gli attributi che riguardano le foto mostrate nella galleria. Usare * come carattere Jolly per ricerche parziali.</dd>
+  
+  <dt>Ricerca per Autore</dt>
+
+  <dd>Usare * come carattere Jolly per le ricerche parziali.</dd>
+
+  <dt>Ricerca per data</dt>
+
+  <dd>Selezionare una data e/o una data di fine. Lasciare la data vuota se
+volete fare una ricerca del tipo "prima di". L'anno deve essere inserito nell'ultimo campo come nel formato seguente : 0000 (per esempio 2010)</dd>
+
+  <dt>Ricerca negli album</dt>
+
+  <dd>Selezionare gli album in cui desiderate efettuare la ricerca.
+È possibile ricercare in tutti gli album selezionando l'album padre e autorizzando la ricerca ni tutti i sub-album.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/it_IT/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/site_manager.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Siti in remoto</h2>
+
+<p>Piwigo offre la possibilità di usare diversi server per
+immagazzinare i file della vostra galleria. Ciò può essere utile
+se la vostra galleria è installata su uno spazio limitato e avete
+una grande quantità di file da mostrare.</p>
+
+
+<ol>
+
+  <li>modificare il file <span
+class="filename">tools/create_listing_file_local.inc.php</span> agendo
+sui parametri come <code>$conf['prefix_thumbnail']</code> o
+<code>$conf['use_exif']</code>.</li>
+
+  <li>via FTP, caricare i file <span
+class="filename">tools/create_listing_file.php</span> e <span
+class="filename">tools/create_listing_file_local.inc.php</span> (modificato) sul Vostro sito
+remoto, nella stessa directory con gli album che compongono la vostra galleria
+(come la directory <span class="filename">galleries</span> di
+questo sito). Per esempio, supponiamo che possiate accedere a <span
+class="filename">http://esempio.it/galleries/create_listing_file.php</span>.</li>
+
+  <li>andate su <span class="pwgScreen">Amministrazione &raquo; Tools &raquo;
+Gestione dei siti</span>. Richiedete la creazione di un nuovo sito, per esempio <span
+class="filename">http://esempio.it/galleries</span>.</li>
+
+  <li>
+
+    <p>Un nuovo sito remoto è registrato. 4 azioni sono ora possibili :</p>
+
+    <ol>
+
+      <li><strong>generare la lista</strong> : lancia una richiesta remota
+per generare il file di listing remoto</li>
+
+      <li><strong>sincronizzare</strong> : legge il file remoto <span
+class="filename">listing.xml</span> e sincronizza con il database
+locale.</li>
+
+      <li><strong>pulire</strong> : cancella il file di listing 
+remoto.</li>
+
+      <li><strong>cancellare</strong> : cancella il sito remoto (e tutte le informazioni
+associate) dal database.</li>
+
+    </ol>
+
+  </li>
+
+</ol>
Index: tags/2.4.0RC3/language/it_IT/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/synchronize.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Sincronizzare</h2>
+
+<ul>
+
+  <li>Ci sono 2 typi di sincronizzazione possibili : struttura (directory/file) e
+metadati. Sincronizzare la struttura significa sincronizzare l'albero
+delle directory e dei file con il
+database. Sincronizzare i metadati permette di aggiornare
+le informazioni come le dimensioni, le informazioni EXIF o
+IPTC.</li>
+
+  <li>La prima sincronizzazione da effettuare deve essere quella della 
+struttura.</li>
+
+  <li>Il processo di sincronizzazione potrebbe essere più o meno lungo (dipende
+della carica del server e della quantità di file da gestire). È possibile eseguire
+la sincronizzazione album per album.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/it_IT/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Creazione delle miniature</h2>
+
+<p>Questa pagina vi permette di creare le miniature mancanti. L'utilizzo
+di questa funzionalità non è consigliato per i siti che si trovano su dei server
+condivisi (risorse condivise).</p>
+
+<dl>
+
+  <dt>Versione GD</dt>
+
+  <dd>GD è una biblioteca grafica per la manipolazione di foto per PHP.
+Scegliete la versione installata sul vostro server. Se scegliete quella sbagliata, dei messaggi d'errore appariranno. Ritornate allora sulla pagina precedente e scegliete un'altra versione. Se nessuna versione funziona,
+significa che GD non è disponibile sul server.</dd>
+
+  <dt>Larghezza ed altezza</dt>
+
+  <dd>Sono le dimensioni massime che le miniature possono prendere. Il rapporto
+larghezza/altezza è mantenuto. I valori di default sono modificabili 
+tramite i parametri di configurazione <code>tn_width</code> e 
+<code>tn_height</code> (vedi file <span
+class="filename">include/config_default.inc.php</span>).</dd>
+  
+  <dt>Numero di miniature da creare</dt>
+
+  <dd>Non tentate di miniaturizzare troppe foto contemporanamente: la miniaturizzazione usa molta CPU. 
+Se il sito Piwigo è installato su un server condiviso, un carico di CPU troppo alto potrebbe portare alla soppressione del sito web.</dd>
+
+  <dt>Formato file</dt>
+
+  <dd>Le miniature sono create in formato JPEG. Le miniature possono essere
+create solamente nei formati PNG e JPEG.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/it_IT/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/it_IT/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/help/user_list.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Elenco degli utenti</h2>
+
+<p>Permette la gestione dei parametri per gli utenti iscritti. Solo i permessi sono gestiti in una pagina diversa.</p>
+
+<h3>Aggiungere un utente</h3>
+
+<p>L'amministratore può aggiungere manualmente gli utenti. </p>
+
+<h3>Elenco degli utenti</h3>
+
+<p>L'elenco può essere filtrato sul nome utente (* = carattere jolly), il
+gruppo o lo stato. L'elenco può essere ordinato per data d'iscrizione o
+per nome utente, in ordine cronologico o
+decrescente.</p>
+
+<p>In questa pagina si possono modificare più utenti
+alla volta :</p>
+
+<ul>
+  <li>cancellare degli utenti (necessita di conferma)</li>
+  <li>modificare lo stato</li>
+  <li>associare o dissociare ai gruppi</li>
+  <li>modificare le propietà di visualizzazione</li>
+  <li>modificare le propietà annesse</li>
+</ul>
+
+<p>Gli utenti modificati sono quelli selezionati (di default) o gli utenti dell'elenco filtrato.</p>
Index: tags/2.4.0RC3/language/it_IT/index.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/it_IT/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/install.lang.php	(revision 14585)
@@ -0,0 +1,76 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = 'Installazione';
+$lang['Basic configuration'] = 'Configurazione di base';
+$lang['Default gallery language'] = 'Linguaggio di default della galleria';
+$lang['Database configuration'] = 'Configurazione database';
+$lang['Admin configuration'] = 'Configurazione dell\'utente "Amministratore"';
+$lang['Start Install'] = 'Inizia l\'installazione';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'L\'indirizzo email deve essere tipo xxx@yyy.eee (esempio: jack@altern.org)';
+$lang['Webmaster login'] = 'Nome utente webmaster';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Esso verrà mostrato ai visitatori. È necessario per amministrare il vostro sito';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Connessione al server riuscita, ma non è stato possibile connettersi al database';
+$lang['Can\'t connect to server'] = 'Impossibile connettersi al server';
+$lang['Host'] = 'Host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, pluto.libero.it';
+$lang['User'] = 'Utente';
+$lang['user login given by your host provider'] = 'login utente database fornito dal vostro provider';
+$lang['Password'] = 'Password';
+$lang['user password given by your host provider'] = 'Password d\'accesso al database fornita dal vostro provider';
+$lang['Database name'] = 'Nome del database';
+$lang['also given by your host provider'] = 'anche questo fornito dal vostro provider';
+$lang['Database table prefix'] = 'Prefisso tabelle database';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'I nomi delle tabelle del database saranno preceduti da questo prefisso (vi permette di gestire meglio le tabelle)';
+$lang['enter a login for webmaster'] = 'Inserire un nome utente per il webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'Il nome utente del webmaster non può contenere caratteri come \' o "';
+$lang['please enter your password again'] = 'Reinserire la password';
+$lang['Webmaster password'] = 'Password del webmaster';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Da conservare con cura. Permette l\'accesso al pannello d\'amministrazione';
+$lang['Password [confirm]'] = 'Password [confermare]';
+$lang['verification'] = 'verifica';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Avete bisogno di aiuto? Visitate il <a href=\"%s\">forum di Piwigo</a>.';
+$lang['Webmaster mail address'] = 'Indirizzo email del Webmaster';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'I visitatori saranno in grado di contattarvi usando questa email';
+$lang['PHP 5 is required'] = 'È richiesto PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Sembra che la versione PHP del vostro server sia %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo tenterà di cambiare la configurazione di PHP 5 creando o modificando il file .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Nota: potete cambiare manualmente la configurazione PHP e poi riavviare Piwigo.';
+$lang['Try to configure PHP 5'] = 'Provare a configurare PHP 5';
+$lang['Sorry!'] = 'Spiacente!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo non è stato in grado di configurare PHP 5';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Dovete contattare il votro provider per chiedere come passare a PHP 5.';
+$lang['Hope to see you back soon.'] = 'Speriamo di rivedervi presto.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Congratulazioni, l\'installazione di Piwigo è completata';
+
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Una soluzione alternativa è quella di copiare il testo nella casella sopra e incollarlo nel file "local/config/database.inc.php" (Attenzione: database.inc.php deve contenere solo quello che c\'è nel box sopra, senza nessun ritorno a capo o spazio)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Creazione del file di configurazione local/config/database.inc.php fallita.';
+$lang['Download the config file'] = 'Scaricare il file di configurazione';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'È possibile scaricare il file di configurazione e caricarlo in local/config della vostra installazione di Piwigo.';
+$lang['Just another Piwigo gallery'] = 'Una galleria Piwigo in più ';
+$lang['Welcome to my photo gallery'] = 'Benvenuti nella mia galleria fotografica';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bienvenuti sulla vostra nuova installazione di Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Non esitate a consultare i nostri forum se avete un qualunque problema : %s';
+?>
Index: tags/2.4.0RC3/language/it_IT/iso.txt
===================================================================
--- tags/2.4.0RC3/language/it_IT/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Italiano [IT]
Index: tags/2.4.0RC3/language/it_IT/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/it_IT/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/it_IT/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = 'Aggiornamento';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Questa pagina vi propone di aggiornare il vostro database corrispondente alla vecchia versione di Piwigo con la nuova versione.
+L\'assistente all\'aggiornamento ha identificato la vostra attuale <strong>versione %s</strong> (o equivalente).';
+$lang['Upgrade from version %s to %s'] = 'Aggiornamento dalla versione %s alla %s';
+$lang['Statistics'] = 'Statistiche';
+$lang['total upgrade time'] = 'tempo totale aggiornamento';
+$lang['total SQL time'] = 'tempo totale SQL';
+$lang['SQL queries'] = 'queries SQL';
+$lang['Upgrade informations'] = 'Informazioni aggiornamento';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Se riscontrate dei problemi, effettuate una manutenzione in [Amministrazione>Tools>Manutenzione].';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Per precauzione, i seguenti plugins sono stati disattivati. È necessario verificare se esistono degli aggiornamenti prima di riattivarli:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Solo l\'amministratore può eseguire l\'aggiornamento: fate login.';
+$lang['You do not have access rights to run upgrade'] = 'Non avete le autorizzazioni necessarie per effettuare l\'aggiornamento';
+$lang['All sub-albums of private albums become private'] = 'Tutti i sub-album degli album privati diventano privati';
+$lang['User permissions and group permissions have been erased'] = 'I permessi degli utenti e dei gruppi sono stati cancellati';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Solo il prefisso delle miniature e l\'indirizzo email del webmaster sono stati recuperati dalla precedente configurazione';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Nel file <i>%s</i>, prima di <b>?></b>, inserite:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Per precauzione, i seguenti temi sono stati disattivati. È necessario verificare se esistono degli aggiornamenti prima di riattivarli:';
+?>
Index: tags/2.4.0RC3/language/ja_JP/README.txt
===================================================================
--- tags/2.4.0RC3/language/ja_JP/README.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/README.txt	(revision 14585)
@@ -0,0 +1,4 @@
+Piwigo Japanese language files
+Translator Mitsuhiro Yoshida (http://mitstek.com/)
+Started 2008-12-21
+Updated 2009-05-02
Index: tags/2.4.0RC3/language/ja_JP/about.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+    <p>このフォトガラリーはPiwigoより作成されました。</p>
+
+    <p>Piwigo はユーザや開発者のコミュニティーにより作成し、ウェブのためのフォトガラリーのソフトウェアです。Piwigoのプラグインにより簡単にカスタマイズできます。Piwigoはオープンソースで無料です。</p>
+
+    <p id="linkToPiwigo"><a href="http://piwigo.org">Piwigoのホームページにどうぞ！
+
+    </a></p>
+
+    <p>Pigiwo日本語版の管理は
+      <ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=4725">irohaprojet</a></li>
+	    <li>Mit</li>
+	   </ul>
+    により感謝しています。</p>
Index: tags/2.4.0RC3/language/ja_JP/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/admin.lang.php	(revision 14585)
@@ -0,0 +1,689 @@
+$lang['%d associations'] = '関連:%d';
+$lang['%d album including'] = 'カテゴリ:%d  - ';
+$lang['%d albums including'] = 'カテゴリ:%d  - ';
+$lang['%d physical'] = '物理ディレクトリ:%d ';
+$lang['%d physical'] = '物理ディレクトリ:%d ';
+$lang[' and %d virtual'] = 'バーチャルディレクトリ:%d ';
+$lang[' and %d virtual'] = 'バーチャルディレクトリ:%d ';
+$lang['%d album moved'] = '%d 件のカテゴリが移動されました。';
+$lang['%d albums moved'] = '%d 件のカテゴリが移動されました。';
+$lang['%d group'] = 'グループ:%d';
+$lang['%d groups'] = 'グループ:%d';
+$lang['%d member'] = 'メンバー:%d';
+$lang['%d members'] = 'メンバー:%d';
+$lang['%d tag'] = 'タグ:%d';
+$lang['%d tags'] = 'タグ:%d';
+$lang['%d user comment rejected'] = '%d 件のユーザコメントが拒否されました。';
+$lang['%d user comments rejected'] = '%d 件のユーザコメントが拒否されました。';
+$lang['%d user comment validated'] = '%d 件のユーザコメントが承認されました。';
+$lang['%d user comments validated'] = '%d 件のユーザコメントが承認されました。';
+$lang['%d user deleted'] = '%d ユーザが削除されました。';
+$lang['%d users deleted'] = '%d ユーザが削除されました。';
+$lang['%d user'] = 'ユーザ:%d';
+$lang['%d users'] = 'ユーザ:%d';
+$lang['%d waiting for validation'] = '承認待ち: %d 件';
+$lang['Actions'] = '操作';
+$lang['Activate'] = '有効化';
+$lang['Add/delete a permalink'] = 'パーマリンクを追加/削除する';
+$lang['Add a tag'] = 'タグを追加する';
+$lang['Add a user'] = 'ユーザを追加する';
+$lang['Add group'] = 'グループを追加する';
+$lang['Add'] = '追加';
+$lang['Allow user registration'] = 'ユーザ登録を許可する';
+$lang['Apply to sub-albums'] = 'サブカテゴリに適用する';
+$lang['Associated'] = '関連';
+$lang['Caddie management'] = 'キャディ管理';
+$lang['Caddie'] = 'キャディ';
+$lang['Albums authorized thanks to group associations'] = 'グループの関連付けによりカテゴリが許可されました。';
+$lang['Album manual order was saved'] = 'カテゴリの手動順が保存されました。';
+$lang['Check for upgrade failed for unknown reasons.'] = '不明な理由により、アップグレードのチェックが失敗しました。';
+$lang['Check for upgrade'] = 'アップグレードをチェックする';
+$lang['Comments for all'] = 'すべてのユーザにコメントを許可する';
+$lang['Current name'] = '現在の名称';
+$lang['Database'] = 'データベース';
+$lang['Deactivate'] = '無効化';
+$lang['Delete Representant'] = '見本を削除する';
+$lang['Delete selected tags'] = '選択したタグを削除する';
+$lang['Delete selected users'] = '選択したユーザを削除する';
+$lang['Deletions'] = '削除';
+$lang['Deny selected groups'] = '選択したグループを拒否する';
+$lang['Deny selected users'] = '選択したユーザを拒否する';
+$lang['Description'] = '説明';
+$lang['Display options'] = '表示オプション';
+$lang['Dissociated'] = '関連なし';
+$lang['Does not represent'] = '非表示';
+$lang['Edit selected tags'] = '選択したタグを編集する';
+$lang['Edit tags'] = 'タグを編集する';
+$lang['Email admins when a new user registers'] = '新しいユーザ登録時、管理者にメールする';
+$lang['Email admins when a valid comment is entered'] = '有効なコメントが入力された場合、管理者にメールする';
+$lang['Email admins when a comment requires validation'] = 'コメントの承認が必要な場合、管理者にメールする';
+$lang['Environment'] = '環境';
+$lang['Form'] = 'フォーム';
+$lang['Gallery title'] = 'ギャラリータイトル';
+$lang['Grant selected groups'] = '選択したグループに付与する';
+$lang['Grant selected users'] = '選択したユーザに付与する';
+$lang['Group name'] = 'グループ名';
+$lang['Groups'] = 'グループ';
+$lang['Guests'] = 'ゲスト';
+$lang['History'] = '履歴';
+$lang['Informations'] = '情報';
+$lang['Install'] = 'インストール';
+$lang['Link all album photos to a new album'] = 'すべてのカテゴリエレメントを新しいカテゴリにリンクする';
+$lang['Link all album photos to some existing albums'] = 'すべてのカテゴリエレメントを既存のカテゴリにリンクする';
+$lang['Linked albums'] = 'リンクカテゴリ';
+$lang['Lock gallery'] = 'ギャラリーをロックする';
+$lang['Maintenance'] = 'メンテナンス';
+$lang['Edit album permissions'] = 'カテゴリのパーミッションを管理する';
+$lang['Manage permissions for group "%s"'] = 'グループ「 %s 」のパーミッションを管理する';
+$lang['Manage permissions for user "%s"'] = 'ユーザ「 %s 」のパーミッションを管理する';
+$lang['Manage tags'] = 'タグを管理する';
+$lang['Members'] = 'メンバー';
+$lang['Metadata synchronized from file'] = 'ファイルからメタデータを同期化する';
+$lang['Move albums'] = 'カテゴリを移動する';
+$lang['Move'] = '移動';
+$lang['Name'] = '名称';
+$lang['New name'] = '新しい名称';
+$lang['New parent album'] = '新しい親カテゴリ';
+$lang['New tag'] = '新しいタグ';
+$lang['Number of comments per page'] = '1ページあたりのコメント数';
+$lang['Number of rates'] = '評価数';
+$lang['Number of thumbnails to create'] = '作成サムネイル数';
+$lang['Only private albums are listed'] = 'プライベートカテゴリのみ表示されています。';
+$lang['Operating system'] = 'オペレーティングシステム';
+$lang['Options'] = 'オプション';
+$lang['Other private albums'] = '他のプライベートカテゴリ';
+$lang['Page banner'] = 'ページバナー';
+$lang['Parent album'] = '親カテゴリ';
+$lang['Path'] = 'パス';
+$lang['Permalink'] = 'パーマリンク';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'パーマリンク %s は、すでにカテゴリ %s で使用されています。最初にパーマリンク履歴を削除してください。';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'パーマリンク名は、a-z、A-Z、0-9、「-」、「_」、「/」で構成される必要があります。数字または「-」が続く数字を使用することはできません。';
+$lang['Permalink %s is already used by album %s'] = 'パーマリンク %s は、すでにカテゴリ %s で使用されています。';
+$lang['Permalink history'] = 'パーマリンク履歴';
+$lang['Permalinks'] = 'パーマリンク';
+$lang['Permission denied'] = 'パーミッション拒否';
+$lang['Permission granted thanks to a group'] = 'グループにパーミッションが付与されました。';
+$lang['Permission granted'] = 'パーミッション付与';
+$lang['Photo informations updated'] = '写真情報が更新されました。';
+$lang['Plugins'] = 'プラグイン';
+$lang['Position'] = 'ポジション';
+$lang['Preferences'] = 'プリファレンス';
+$lang['Properties'] = 'プロパティ';
+$lang['Random photo'] = 'ランダム写真';
+$lang['Rate date'] = '評価日';
+$lang['Rating by guests'] = 'ゲストによる評価';
+$lang['Rating'] = '評価';
+$lang['Reject'] = '拒否';
+$lang['Representant'] = '見本';
+$lang['Representation of albums'] = 'カテゴリ見本';
+$lang['Representative'] = '見本';
+$lang['Represents'] = '表示';
+$lang['Save order'] = '表示順を保存する';
+$lang['Save to permalink history'] = 'パーマネントリンク履歴に保存する';
+$lang['Select at least one album'] = '少なくとも1つのカテゴリを選択してください。';
+$lang['Select at least one photo'] = '少なくとも1つの写真を選択してください。';
+$lang['Select at least one user'] = '少なくとも1名のユーザを選択してください。';
+$lang['Show info'] = '情報を表示する';
+$lang['Site manager'] = 'サイトマネージャ';
+$lang['Status'] = 'ステータス';
+$lang['Statistics'] = '統計';
+$lang['Storage album'] = '保存カテゴリ';
+$lang['Sum of rates'] = '評価の合計';
+$lang['Tag "%s" already exists'] = 'タグ "%s" は、すでに登録されています。';
+$lang['Tag "%s" was added'] = 'タグ "%s" が追加されました。';
+$lang['Tag selection'] = 'タグ選択';
+$lang['The %d following tags were deleted'] = '次の %d 件のタグが削除されました。';
+$lang['Uninstall'] = 'アンインストール';
+$lang['Use the default photo sort order (defined in the configuration file)']='デフォルトの (設定ファイルで定義された) イメージ並び順を使用する';
+$lang['User comments validation'] = 'ユーザコメント承認';
+$lang['Users'] = 'ユーザ';
+$lang['Validate'] = '承認';
+$lang['Validation'] = '承認';
+$lang['Version'] = 'バージョン';
+$lang['Virtual albums to move'] = '移動するバーチャルカテゴリ';
+$lang['Virtual album name'] = 'バーチャルカテゴリ名';
+$lang['Webmaster cannot be deleted'] = 'ウェブマスタは削除できません。';
+$lang['You are running on development sources, no check possible.'] = 'あなたは開発版を使用しているため、チェックすることはできません。';
+$lang['You cannot delete your account'] = "あなた自身のアカウントを削除できません。";
+$lang['You cannot move an album in its own sub album'] = 'あなたは、カテゴリをサブカテゴリに移動できません。';
+$lang['You need to confirm deletion'] = 'あなたは、削除を確認する必要があります。';
+$lang['Associate to album'] = 'カテゴリに関連付ける';
+$lang['associate to group'] = 'グループに関連付ける';
+$lang['Authorized'] = '承認';
+$lang['Add a virtual album'] = 'バーチャルカテゴリを追加する';
+$lang['Authorize users to add comments on selected albums'] = '選択されたカテゴリにユーザのコメント追加を許可する';
+$lang['The name of an album must not be empty'] = 'カテゴリ名は空白にしないでください。';
+$lang['Lock albums'] = 'カテゴリをロックする';
+$lang['Private'] = 'プライベートカテゴリ';
+$lang['Public'] = 'パブリックカテゴリ';
+$lang['Find a new representant by random'] = '新しい見本をランダムに探す';
+$lang['Public / Private'] = 'パブリック / プライベート';
+$lang['Manage authorizations for selected albums'] = '選択したカテゴリの権限を管理する';
+$lang['Virtual album added'] = 'バーチャルカテゴリが追加されました。';
+$lang['Virtual album deleted'] = 'バーチャルカテゴリが削除されました。';
+$lang['Access type'] = 'アクセスタイプ';
+$lang['Information data registered in database'] = 'データベースに登録された情報データ';
+$lang['Default display'] = 'デフォルト表示';
+$lang['The gallery URL is not valid.'] = 'ギャラリーURIが有効ではありません。';
+$lang['Main'] = 'メイン';
+$lang['The number of comments a page must be between 5 and 50 included.'] = '1ページあたりのコメント数は、5から50の間にしてください。';
+$lang['Configuration'] = '設定';
+$lang['confirm'] = '確認';
+$lang['Date'] = '日付';
+$lang['delete album'] = 'カテゴリを削除する';
+$lang['Dissociate from album'] = 'カテゴリから関連付けを解除する';
+$lang['dissociate from group'] = 'グループから関連付けを解除する';
+$lang['Album updated successfully'] = 'カテゴリ情報が正常に更新されました。';
+$lang['photos per page'] = '1ページあたりのエレメント';
+$lang['High definition enabled'] = '高解像度を有効にする';
+$lang['File'] = 'ファイル';
+$lang['first photo added on %s'] = '最初のエレメント追加日時 %s';
+$lang['Forbidden'] = '禁止';
+$lang['global mode'] = 'グローバルモード';
+$lang['group "%s" added'] = 'グループ "%s" が追加されました。';
+$lang['group "%s" deleted'] = 'グループ "%s" が削除されました。';
+$lang['group "%s" updated'] = 'グループ "%s" が更新されました。';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'グループ名には「"」または「\'」を含んだり、空白にしないでください。';
+$lang['This name is already used by another group.'] = 'このグループ名は、すでに別のグループで使用されています。';
+$lang[''] = '';
+$lang['High definition'] = '高解像度';
+$lang['jump to album'] = 'カテゴリにジャンプする';
+$lang['jump to photo'] = 'イメージにジャンプする';
+$lang['leave'] = '変更なし';
+$lang['Lock'] = 'ロック';
+$lang['Locked'] = 'ロック済み';
+$lang['manage album photos'] = 'カテゴリエレメントを管理する';
+$lang['manage sub-albums'] = 'サブカテゴリを管理する';
+$lang['Manage'] = '管理';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = '実行時間が終了しました。処理を継続します [予想時間: %d 秒]。';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = '実行時間が終了しました。処理を継続します  [予想時間: %d 秒].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'メール送信するユーザリストのユーザ数が制限されています。他のユーザは、リストに含まれていません。';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'メール送信時間が制限されています。他のメールはスキップされます。';
+$lang['To send ?'] = '送信?';
+$lang['Last send'] = '最終送信';
+$lang['email'] = 'メール';
+$lang['User'] = 'ユーザ';
+$lang['See you soon,'] = 'それでは ';
+$lang['Go to'] = '移動 ';
+$lang['Hello'] = 'こんにちは ';
+$lang['New photos were added'] = '新しいエレメントが追加されました:';
+$lang['on'] = ' ';
+$lang['between'] = ' ';
+$lang['and'] = ' - ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'あなたが通知メールを受信するよう、ウェブマスタが購読登録しました。';
+$lang['You have subscribed to receiving notifications by mail.'] = 'あなたは、通知メールを購読登録しました。';
+$lang['To subscribe'] = '購読登録するには、';
+$lang['If you encounter problems or have any question, please send a message to'] = 'あなたが問題に遭遇した場合、質問がある場合、次の宛先にメール送信してください:';
+$lang['[NBM] Problems or questions'] = '[NBM] 問題または質問';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'あなたの通知メール購読をウェブマスタが解除しました。';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'あなたは、通知メールを購読解除しました。';
+$lang[', click on'] = '次のリンクをクリックしてください:';
+$lang['To unsubscribe'] = '受講解除するには、';
+$lang['With blank value, gallery title will be used'] = '空白の場合、ギャラリータイトルが使用されます。';
+$lang['Notification'] = '通知';
+$lang['Error when sending email to %s [%s].'] = '%s [%s] にメール送信中、エラーが発生しました。';
+$lang['Mail sent to %s [%s].'] = 'メールが %s [%s] に送信されました。';
+$lang['%d mail was sent.'] = '%d メールが送信されました。';
+$lang['%d mails were sent.'] = '%d メールが送信されました。';
+$lang['%d mail was not sent.'] = '%d メールは送信されませんでした。';
+$lang['%d mails were not sent.'] = '%d メールは送信されませんでした。';
+$lang['No mail to send.'] = '送信されたメールはありません。';
+$lang['There is no available subscribers to mail.'] = 'メールを送信できるユーザは存在しません。';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = '通知する新しいエレメントがある場合、ユーザが利用できます。';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'ユーザはメール購読できません (このタブは、ウェブマスタにのみ表示されます)。';
+$lang['No user to send notifications by mail.'] = '通知メールを送信できるユーザは存在しません。';
+$lang['New photos added'] = '新しいエレメントが追加されました。';
+$lang['Subscribe to notification by mail'] = '通知メールを購読する';
+$lang['Unsubscribe from notification by mail'] = '通知メールを購読解除する';
+$lang['Parameter'] = 'パラメータ';
+$lang['Continue processing treatment'] = '処理を続ける';
+$lang['Complementary mail content'] = '補足メールコンテンツ';
+$lang['Add detailed content'] = '詳細コンテンツを追加する';
+$lang['Send mail as'] = '送信者名';
+$lang['Send mail to users'] = 'ユーザにメールを送信する';
+$lang['Send'] = '送信';
+$lang['Options'] = 'オプション';
+$lang['Subscribed'] = '購読中';
+$lang['Subscribe'] = '購読';
+$lang['Parameters'] = 'パラメータ';
+$lang['Select recipients'] = '受信者の選択';
+$lang['Subscribe/unsubscribe users'] = 'ユーザの購読登録/購読解除';
+$lang['Unsubscribed'] = '購読なし';
+$lang['%d parameter was updated.'] = '%d 件のパラメータが更新されました。';
+$lang['%d parameters were updated.'] = '%d 件のパラメータが更新されました。';
+$lang['%d user was not updated.'] = '%d 名のユーザが更新されませんでした。';
+$lang['%d users were not updated.'] = '%d 名のユーザが更新されませんでした。';
+$lang['User %s [%s] was removed from the subscription list.'] = 'ユーザ %s [%s] は、購読リストから削除されました。';
+$lang['User %s [%s] was added to the subscription list.'] = 'ユーザ %s [%s] は、購読リストに追加されました。';
+$lang['%d user was updated.'] = '%d 名のユーザが更新されました。';
+$lang['%d users were updated.'] = '%d 名のユーザが更新されました。';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'ユーザ %s [%s] は、購読リストから削除されませんでした。';
+$lang['User %s [%s] was not added to the subscription list.'] = 'ユーザ %s [%s] は、購読リストに追加されませんでした。';
+$lang['User %s [%s] added.'] = 'ユーザ %s [%s] が追加されました。';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注意: 購読登録または購読解除の設定は、ユーザ宛にメール通知されます。';
+$lang['Send mail on HTML format'] = 'HTMLフォーマットでメールを送信する';
+$lang['Include display of recent photos grouped by dates'] = '最近の写真グループの日付ごとの表示を含む';
+$lang['Available only with HTML format'] = 'HTMLフォーマットのみ利用可';
+$lang['no write access'] = 'アクセス権なし';
+$lang['Permissions'] = 'パーミッション';
+$lang['private'] = 'プライベート';
+$lang['public'] = 'パブリック';
+$lang['Purge never used notification feeds'] = '未使用の通知フィードを削除する';
+$lang['Purge sessions'] = 'セッションを削除する';
+$lang['randomly represented'] = 'ランダム表示';
+$lang['registration date'] = '登録日';
+$lang['clean'] = 'クリーン';
+$lang['Create this site'] = 'このサイトを作成する';
+$lang['test'] = 'テスト';
+$lang['test this remote site'] = 'このリモートサイトをテストします。';
+$lang['remove tags'] = 'タグを削除する';
+$lang['Repair and optimize database'] = 'データベースを修復および最適化する';
+$lang['selection'] = '選択';
+$lang['set to'] = '設定';
+$lang['singly represented'] = '単独表示';
+$lang['This site already exists'] = 'このサイトは、すでに登録されています。';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = '新しいサイトを作成する : (create_listing_file.phpにURIを渡します)';
+$lang['created'] = 'が作成されました。';
+$lang['delete'] = '削除';
+$lang['delete this site and all its attached elements'] = 'このサイトおよびすべてに添付ファイルを削除します。';
+$lang['deleted'] = 'が削除されました。';
+$lang['an error happened'] = 'エラーが発生しました。';
+$lang['Local'] = 'ローカル';
+$lang['Remote'] = 'リモート';
+$lang['update the database from files'] = 'ファイルからデータベースを更新します。';
+$lang['status'] = 'ステータス';
+$lang['Directory'] = 'ディレクトリ';
+$lang['sub-albums'] = 'サブカテゴリ';
+$lang['Synchronize metadata'] = 'メタデータを同期化する';
+$lang['target'] = 'ターゲット';
+$lang['Thumbnail'] = 'サムネイル';
+$lang['title'] = 'タイトル';
+$lang['Album list management'] = 'カテゴリ管理';
+$lang['Piwigo configuration'] = 'Piwigo設定';
+$lang['Edit album'] = 'カテゴリを編集する';
+$lang['Group management'] = 'グループ管理';
+$lang['User list'] = 'ユーザリスト';
+$lang['Edit photo information'] = '写真情報を修正する';
+$lang['Database synchronization with files'] = 'ファイルおよびデータベースの同期化';
+$lang['all'] = 'すべて';
+$lang['height must be a number superior to'] = '高さは、次の値より大きくしてください:';
+$lang['width must be a number superior to'] = '幅は、次の値より大きくしてください:';
+$lang['for the file format'] = 'ファイルフォーマット';
+$lang['Photo unreachable or no support'] = '写真にアクセスできないか、次の内容がサポートされていません:';
+$lang['GD version'] = 'GDバージョン';
+$lang['General statistics'] = '一般統計';
+$lang['average time'] = '平均時間';
+$lang['number of miniaturized photos'] = '縮小化された写真数';
+$lang['total time'] = '合計時間';
+$lang['for this file format'] = 'このファイルフォーマット';
+$lang['unit mode'] = 'ユニットモード';
+$lang['Unlocked'] = '未ロック';
+$lang['unset'] = '設定解除';
+$lang['Update albums informations'] = 'カテゴリ情報を更新する';
+$lang['Update photos information'] = 'イメージ情報を更新する';
+$lang['Synchronize'] = '同期化';
+$lang['reduce to single existing albums'] = '既存の単一カテゴリに減らす';
+$lang['Choose an option'] = 'オプションの選択';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = '最大限の情報を表示する (追加されたカテゴリおよびエレメント、削除されたカテゴリおよびエレメント)';
+$lang['Error list'] = 'エラーリスト';
+$lang['Errors caption'] = 'エラーキャプション';
+$lang['Detailed informations'] = '詳細情報';
+$lang['File/directory read error'] = 'ファイル/ディレクトリ読み込みエラー';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'ファイルまたはディレクトリにアクセスできません (存在していないか、アクセスが拒否されています)。';
+$lang['albums deleted in the database'] = 'カテゴリがデータベースから削除されました。';
+$lang['photos deleted from the database'] = 'エレメントがデータベースから削除されました。';
+$lang['photos candidates for metadata synchronization'] = 'メタデータ同期化候補のイメージ';
+$lang['photos informations synchronized with files metadata'] = 'ファイルメタデータに同期化されたエレメント情報';
+$lang['errors during synchronization'] = '同期化中にエラーが発生しました。';
+$lang['albums added in the database'] = 'カテゴリがデータベースに追加されました。';
+$lang['photos added in the database'] = 'データベースにエレメントが追加されました。';
+$lang['photos updated in the database'] = 'データベースのエレメントが更新されました。';
+$lang['Search for new images in the directories'] = 'ディレクトリ内の新しいイメージを検索する';
+$lang['added'] = '追加済み';
+$lang['deleted'] = '削除済み';
+$lang['Metadata synchronization results'] = 'メタデータ同期化結果';
+$lang['only perform a simulation (no change in database will be made)'] = 'シミュレーションのみ実行する (データベースは更新されません)';
+$lang['Simulation'] = 'シミュレーション';
+$lang['directories + files'] = 'ディレクトリ + ファイル';
+$lang['only directories'] = 'ディレクトリのみ';
+$lang['synchronize files structure with database'] = 'ファイル構造とデータベースを同期化する';
+$lang['synchronize files metadata with database photos informations'] = 'ファイルメタデータとデータベースエレメント情報を同期化する';
+$lang['even already synchronized photos'] = 'すでに同期化されているエレメントも同期化する';
+$lang['Used metadata'] = '使用済みメタデータ';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'ディレクトリ名およびファイル名は、文字および記号「-」「_」「.」で構成される必要があります。';
+$lang['wrong filename'] = 'ファイル名が正しくありません。';
+$lang['Upload'] = 'アップロード';
+$lang['user "%s" added'] = 'ユーザ "%s" が追加されました。';
+$lang['User status'] = 'ユーザステータス';
+$lang['user_status_admin'] = '管理者';
+$lang['user_status_generic'] = '一般';
+$lang['user_status_guest'] = 'ゲスト';
+$lang['user_status_normal'] = 'ユーザ';
+$lang['user_status_webmaster'] = 'ウェブマスタ';
+$lang['Virtual album'] = 'バーチャルカテゴリ';
+$lang['Waiting'] = '承認待ち';
+$lang['default'] = 'デフォルト';
+$lang['Toggle \'default group\' property'] = '「デフォルトグループ」属性に切り替える';
+$lang['Advanced features'] = '高度な機能';
+$lang['Overall'] = '全体';
+$lang['Year'] = '年';
+$lang['Month'] = '月';
+$lang['Day'] = '日';
+$lang['Pages seen'] = 'ページ閲覧回数';
+$lang['Time'] = '時間';
+$lang['IP'] = 'IP';
+$lang['Element'] = '';
+$lang['Section'] = 'セクション';
+$lang['An information email was sent to group "%s"'] = 'グループ %s に情報メールが送信されました。';
+$lang['Send an information email to group members'] = 'グループメンバーに情報メールを送信する';
+$lang['Group'] = 'グループ';
+$lang['[%s] Visit album %s'] = '[%s]  %s を訪問してください。';
+$lang['Hello,'] = 'こんにちは。';
+$lang['See you soon.'] = 'さようなら。';
+$lang['Discover album:'] = 'カテゴリを見つけてください:';
+$lang['Mail content'] = 'メールコンテンツ';
+$lang['none'] = 'なし';
+$lang['high'] = '高';
+$lang['other'] = 'その他';
+$lang['Element type'] = 'エレメントタイプ';
+$lang['Image id'] = 'イメージID';
+$lang['Summary'] = 'サマリー';
+$lang['%d line filtered'] = '%d 行がフィルタされました。';
+$lang['%d lines filtered'] = '%d 行がフィルタされました。';
+$lang['%d guest'] = '%d ゲスト';
+$lang['%d guests'] = '%d ゲスト';
+$lang['Hour'] = '時間';
+$lang['guest'] = 'ゲスト';
+$lang['default values'] = 'デフォルト値';
+$lang['Guest cannot be deleted'] = 'ゲストは削除できません。';
+$lang['Default user cannot be deleted'] = 'デフォルトユーザは削除できません。';
+$lang['Purge history detail'] = '履歴詳細を消去する';
+$lang['Purge history summary'] = '履歴サマリーを消去する';
+$lang['Check integrity'] = 'インテグリティの確認';
+$lang['Anomaly'] = '例外';
+$lang['Correction'] = '修正';
+$lang['Automatic correction'] = '自動修正';
+$lang['Impossible automatic correction'] = '自動修正できません。';
+$lang['Correction applied with success'] = '正常に修正が適用されました。';
+$lang['Correction applied with error'] = '修正の適用にエラーが発生しました。';
+$lang['%d anomaly has been detected.'] = '%d 件の例外が検出されました。';
+$lang['%d anomalies have been detected.'] = '%d 件の例外が検出されました。';
+$lang['%d anomaly has been corrected.'] = '%d 件の例外が訂正されました。';
+$lang['%d anomalies have been detected corrected.'] = '%d 件の例外が訂正されました。';
+$lang['%d anomaly has not been corrected.'] = '%d 件の例外が訂正されませんでした。';
+$lang['%d anomalies have not been corrected.'] = '%d 件の例外が訂正されませんでした。';
+$lang['Go to %s or %s for more informations'] = '%s へアクセスするか、%s で詳細情報をご覧ください。';
+$lang['the forum'] = 'フォーラム';
+$lang['the wiki'] = 'Wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'exifがサポートされていないため、%s の値は正しいファイルではありません。';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = 'あなたのconfig_local.inc.phpファイルで %s は、falseに設定してください。';
+$lang['Main "guest" user does not exist'] = 'メイン「ゲスト」ユーザは存在しません。';
+$lang['Main "guest" user status is incorrect'] = 'メイン「ゲスト」ユーザステータスが正しくありません。';
+$lang['Default user does not exist'] = 'デフォルトユーザが設定されていません。';
+$lang['Main "webmaster" user does not exist'] = 'メイン「ウェブマスタ」ユーザは存在しません。';
+$lang['Main "webmaster" user status is incorrect'] = 'メイン「ウェブマスタ」ユーザステータスが正しくありません。';
+$lang['User "%s" created with "%s" like password'] = 'ユーザ「 %s 」がパスワード「 %s 」で作成されました。';
+$lang['Status of user "%s" updated'] = 'ユーザ "%s" のステータスが更新されました。';
+$lang['add new photos to caddie'] = 'キャディに新しいエレメントを追加する';
+$lang['No display'] = '表示なし';
+$lang['Classic display'] = 'クラシック表示';
+$lang['Hoverbox display'] = 'ハーバーボックス表示';
+$lang['Mail address is obligatory for all users'] = 'すべてのユーザにメールアドレスを必須とする';
+$lang['Minimum privacy level'] = '最小プライバシーレベル';
+$lang['Privacy level'] = 'プライバシーレベル';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = '連絡先';
+$lang['Level 2'] = 'フレンド';
+$lang['Level 4'] = 'ファミリー';
+$lang['Level 8'] = '管理者';
+$lang['Reinitialize check integrity'] = '整合性の再初期化チェック';
+$lang['Check all'] = 'すべてをチェックする';
+$lang['Uncheck all'] = 'すべてを選択解除する';
+$lang['Check automatic corrections'] = '自動修正をチェックする';
+$lang['Apply selected corrections'] = '選択した修正を適用する';
+$lang['Ignore selected anomalies'] = '選択した例外を無視する';
+$lang['Refresh'] = 'リフレッシュ';
+$lang['The anomaly will be ignored until next application version'] = '次のバージョンまで、例外は無視されます。';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = '無視されるため、例外の修正はキャンセルされました。';
+$lang['%d anomaly has been ignored.'] = '%d 件の例外が無視されました。';
+$lang['%d anomalies have been ignored.'] = '%d 件の例外が無視されました。';
+$lang['Plugins which need upgrade'] = 'アップグレードが必要なプラグイン';
+$lang['Plugin list'] = 'プラグインリスト';
+$lang['Check for updates'] = 'アップデートをチェックする';
+$lang['Other plugins'] = '他のプラグイン';
+$lang['Last revisions'] = '最新の修正';
+$lang['Are you sure you want to delete this plugin?'] = '本当にこのプラグインを削除してもよろしいですか?';
+$lang['Are you sure you want to install this plugin?'] = '本当にこのプラグインをインストールしてもよろしいですか?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = '本当にアップグレードを実行してもよろしいですか? このバージョンをアンインストールする必要があるかどうか確認してください。';
+$lang['Plugin has been successfully copied'] = 'プラグインが正常にコピーされました。';
+$lang['You might go to plugin list to install and activate it.'] = 'プラグインをインストールおよび解凍するため、あなたはプラグイン一覧にアクセスすることができます。';
+$lang['Can\'t create temporary file.'] = '一時ファイルを作成できません。';
+$lang['Can\'t download archive.'] = 'アーカイブをダウンロードできません。';
+$lang['Can\'t read or extract archive.'] = 'アーカイブを読めないか、解凍できません。';
+$lang['An error occured during extraction (%s).'] = '解凍中にエラーが発生しました (%s)。';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = '「プラグイン」フォルダおよびサブフォルダのパーミッションをチェック (CHMOD) してください。';
+$lang['Can\'t connect to server.'] = 'サーバに接続できません。';
+$lang['Purge compiled templates'] = 'コンパイル済みテンプレートを削除する';
+$lang['ACCESS_0'] = 'フリーアクセス';
+$lang['ACCESS_1'] = 'すべてのユーザがアクセスできる';
+$lang['ACCESS_2'] = '登録ユーザのみアクセスできる';
+$lang['ACCESS_3'] = '管理者にアクセスする';
+$lang['ACCESS_4'] = 'ウェブマスタにアクセスする';
+$lang['ACCESS_5'] = 'アクセスなし';
+$lang['Support'] = 'サポート';
+$lang['Documentation'] = 'ドキュメンテーション';
+$lang['A new version of Piwigo is available.'] = '新しいバージョンのPiwigoが利用可能です。';
+$lang['Piwigo Administration'] = 'Piwigo管理';
+$lang['Piwigo version'] = 'Piwigoバージョン';
+$lang['You are running the latest version of Piwigo.'] = 'あなたは最新バージョンのPiwigoを使用しています。';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'インストールされている %s [%s] のバージョンは、必須バージョン [%s] に互換性がありません。';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'アプリケーションを十分に活用するには、あなたのシステムをアップグレードする必要があります。そうでない場合、アプリケーションは正常に動作しません。';
+$lang['Deleted on'] = '削除日時';
+$lang['Last hit'] =  '最新ヒット数';
+$lang['GD library is missing'] = 'GDライブラリがありません。';
+$lang['Templates'] = 'テンプレート';
+$lang['Extend for templates'] = 'テンプレートの拡張';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'template-extensionサブフォルダのテンプレートをカスタマイズして、オリジナルのテンプレートと置換します。';
+$lang['Replacers (customized templates)'] = '置換テンプレート (カスタマイズ済みテンプレート)';
+$lang['Original templates'] = 'オリジナルテンプレート';
+$lang['Optional URL keyword'] = '任意のURIキーワード';
+$lang['Templates configuration has been recorded.'] = 'テンプレート設定が保存されました。';
+$lang['All optimizations have been successfully completed.'] = 'すべての最適化が正常に完了しました。';
+$lang['Optimizations have been completed with some errors.'] = 'いくつかのエラーを含んで最適化が完了しました。';
+$lang['Modify information'] = '情報を修正する';
+$lang['nothing'] = 'なし';
+$lang['overrides existing values with empty ones'] = '既存の値を空白にする';
+$lang['Manage photo ranks'] = 'イメージランクを管理する';
+$lang['Edit ranks'] = 'ランクを編集する';
+$lang['No photo in this album'] = 'このカテゴリには、エレメントがありません。';
+$lang['Images manual order was saved'] = 'イメージ手動並び替えが保存されました。';
+$lang['ranks'] = 'ランク';
+$lang['Drag to re-order'] = 'ドラッグして並び替え';
+$lang['Quick Local Synchronization'] = 'クイックローカル同期';
+$lang['No photo can be deleted'] = '写真は削除されませんでした。';
+$lang['Delete selected photos'] = '選択した写真を削除する';
+$lang['%d photo was deleted'] = '%d 写真が削除されました。';
+$lang['%d photos were deleted'] = '%d 写真が削除されました。';
+// --------- Starting below: New or revised $lang ---- from Colibri
+$lang['Unable to check for upgrade.'] = 'アップグレードを確認できません。';
+$lang['Operation in progress'] = '処理中';
+$lang['Please wait...'] = 'しばらくお待ち下さい...';
+$lang['Downloads'] = 'ダウンロード';
+$lang['Released on'] = '発行';
+$lang['Number of downloads'] = 'ダウンロードの件数';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo のニューズレター';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Piwigoプロジェットと連絡を取り続けて、Piwigo のニューズレターを加入してください。新しいリリースやセキュリティ・バグ修正やアップグレードなどについてのお知らせいたします。年間若干のメールしかありません。';
+$lang['Subscribe %s'] = '加入 %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = ' %s Piwigoのニューズレターを加入する';
+$lang['Purge search history'] = 'パージ検索履歴';
+$lang['Hide'] = '隠す';
+$lang['Password is missing. Please enter the password.'] = 'パスワードがありません。パスワードを入力して下さい。';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'パスワードの再確認がありません。パスワードの再確認を確認して下さい。';
+$lang['Allow users to edit their own comments'] = 'ユーザーは自分のコメントを編集できるようにする';
+$lang['Allow users to delete their own comments'] = 'ユーザーは自分のコメントを削除できるようにする';
+$lang['Email administrators when a comment is modified'] = 'コメントが変更された時、管理人にメールを送信する';
+$lang['Email administrators when a comment is deleted'] = 'コメントが削除された時、管理人にメールを送信する';
+$lang['Cannot delete the old permalink !'] = '旧パーマリンクを削除できません!';
+$lang['Hit'] = 'ヒット';
+$lang['Tools'] = 'ツール';
+$lang['Photos'] = '写真';
+$lang['Themes'] = 'テーマ';
+$lang['Instructions to use Piwigo'] = 'Piwigoの使い方';
+$lang['Installed Themes'] = 'インストールされたテーマ';
+$lang['Add New Theme'] = 'テーマを追加';
+$lang['Forbid this theme to users'] = 'ユーザーにこのテーマを禁止する';
+$lang['Set as default theme for unregistered and new users'] = '新しいユーザーや登録されてないユーザーにデフォルト・テーマを設定する';
+$lang['unknown'] = '不明';
+$lang['Upload Photos'] = '写真をアップロードする';
+$lang['Drop into album'] = 'カテゴリーに入れる';
+$lang['+ Add an upload box'] = '+ アップロード・ボックスを追加する';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = ' Piwigoにインストールされている場所の"%s" というディレクトリーに作成してください。';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Piwigoにインストールされている場所の "%s" というディレクトリーに書き込み(chmod 777)アクセスをする。';
+$lang['existing album'] = '存在しているカテゴリー';
+$lang['create a new album'] = '新しいカテゴリーを作成する';
+$lang['Album name'] = 'カテゴリー名';
+$lang['Album "%s" has been added'] = '"%s"のカテゴリーは追加された';
+$lang['Uploaded Photos'] = 'アップロードされた写真';
+$lang['%d photos uploaded'] = '%d 枚の写真がアップロードされた';
+$lang['Privacy level set to "%s"'] = 'プライバシー設定: "%s"';
+$lang['Album "%s" now contains %d photos'] = 'カテゴリー "%s" は現在　%d 枚の写真があります。';
+$lang['Manage this set of %d photos'] = ' %d 枚の写真を管理する';
+$lang['Select files'] = 'ファイルを選択する';
+$lang['Everybody'] = '全員';
+$lang['Who can see these photos?'] = 'どなたがこの写真を見られますか？';
+$lang['Settings'] = '設定';
+$lang['Resize'] = '拡大・縮小';
+$lang['Maximum Width'] = '最大の幅';
+$lang['pixels'] = 'ピクセル';
+$lang['Maximum Height'] = '最大の高さ';
+$lang['Image Quality'] = '画質';
+$lang['Save Settings'] = '設定を保存';
+$lang['Your configuration settings are saved'] = 'あなたの設定は保存されていました';
+$lang['Active Themes'] = '有効なテーマ';
+$lang['Add write access to the "%s" directory'] = '"%s" ディレクトリーに書き込みアクセスを追加';
+$lang['Administration Home'] = 'アドミニのホーム';
+$lang['Change Admin Colors'] = 'アドミ二の色を変更';
+$lang['Delete this theme'] = 'このテーマを削除';
+$lang['Directory does not exist'] = 'ディレクトリは存在しません';
+$lang['Download,'] = 'ダウンロード,';
+$lang['FTP + Synchronization'] = 'FTP + 同期化';
+$lang['Get Support on Piwigo Forum'] = 'Piwigoフォーラムでサポートを入手';
+$lang['Help Me'] = 'ヘルプ';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'このテーマを有効になれません。親テーマがありません: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'その他のテーマはこのテーマが必要なので、テーマを削除できません: %s';
+$lang['Inactive Themes'] = '無効なテーマ';
+$lang['Install on your computer,'] = 'あなたのパソコンにインストールする,';
+$lang['Make this theme available to users'] = 'このテーマをユーザーに有効する。';
+$lang['Page end'] = 'ページの終わり';
+$lang['Piwigo Uploader'] = 'Piwigo アップローダ';
+$lang['Read Piwigo Documentation'] = 'Piwigoの説明書を読む';
+$lang['Start pLoader and add your photos.'] = 'pLoader を起動し、写真を追加する';
+$lang['Switch to clear or dark colors for administration'] = 'アドミニストレーションのために、透明色又は、暗い色に変更';
+$lang['Theme has been successfully installed'] = 'テーマのインストールは成功しました';
+$lang['Visit Gallery'] = 'ガラリーへ';
+$lang['Visit Piwigo project website'] = 'Piwigo のホームページへ';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader は <em>Piwigo Uploader</em>と言います。pLoaderはあなたの写真をパソコンからあなたのPiwigoフォト・ガラリーまで簡単にアップロードできます。';
+$lang['Guest Settings'] = 'ゲストの設定';
+$lang['Main Page'] = 'ホームページ';
+$lang['Photo Page'] = '写真のページ';
+$lang['Activate Navigation Bar'] = 'ナビゲーション・バーを有効にする';
+$lang['Activate Navigation Thumbnails'] = 'ナビゲーションのサムネールを有効する';
+$lang['Activate icon "%s"'] = '"%s"のアイコンを有効する';
+$lang['Photo Properties'] = '写真のプロパティ';
+$lang['Allow user customization'] = 'ユーザーのカスタマイズを有効にする';
+$lang['Miscellaneous'] = 'その他の情報';
+$lang['Virtual Links'] = 'バーチャルのリンク';
+$lang['Languages'] = '言語';
+$lang['Installed Languages'] = 'インストールされた言語';
+$lang['Add New Language'] = '新しい言語を追加する';
+$lang['Language has been successfully installed'] = '言語のインストールは成功しました';
+$lang['Select:'] = '選択:';
+$lang['None'] = 'なし';
+$lang['Invert'] = '反転';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'このテーマは無効になりません。少なくとも一つのテーマが必要です。';
+$lang['Webmaster status is required.'] = 'ウェッブマスターのステータスが必要';
+$lang['Bound Theme'] = 'バウンドテーマ';
+$lang['Allow rating'] = '評価を許可する';
+$lang['Select at least one comment'] = '少なくとも一つのコメントを選択して下さい';
+$lang['Active Plugins'] = '有効なプラグイン';
+$lang['Inactive Plugins'] = '無効なプラグイン';
+$lang['Missing Plugins'] = '見つからないプラグイン';
+$lang['Uninstalled Plugins'] = 'インストールされてないプラグイン';
+$lang['By %s'] = '著作 %s';
+$lang['Visit plugin site'] = 'プラグインのサイトを訪問する';
+$lang['Active Languages'] = '有効な言語';
+$lang['Delete this language'] = 'この言語を削除する';
+$lang['Forbid this language to users'] = 'この言語をユーザーに禁止する';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'この言語を無効になれません。まず、その他の言語をデフォルトを設定して下さい。';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'この言語を無効になれません。少なくとも一つの言語が必要です。';
+$lang['Inactive Languages'] = '無効な言語';
+$lang['Make this language available to users'] = 'この言語をユーザーに利用できる。';
+$lang['Set as default language for unregistered and new users'] = '登録されてないユーザーと新しいユーザーのためにデフォルト言語を設定する。';
+$lang['Add Photos'] = '写真を追加します。';
+$lang['The following tag was deleted'] = '次のタグは削除されました。';
+$lang['There is no other language available.'] = 'その他の言語がありません。';
+$lang['There is no other plugin available.'] = 'その他のプラグインがありません。';
+$lang['There is no other theme available.'] = 'その他のテーマがありません。';
+$lang['By rank'] = '順番';
+$lang['Manual order'] = 'マニュアル順番';
+$lang['Add another set of photos'] = 'その他の写真を追加します';
+$lang['Order of menubar items has been updated successfully.'] = 'ニューの順番は正常に更新されました。';
+$lang['This theme was not designed to be directly activated'] = 'このテーマは直接有効化になりません。';
+$lang['Pending Comments'] = 'コメントを確認待ち';
+$lang['Menu Management'] = 'メニュー';
+$lang['%d of %d photos selected'] = '%d 個目の %d 個の写真選択されていました。';
+$lang['Action'] = 'アックション';
+$lang['Add a filter'] = 'フィルター追加';
+$lang['Album photos associated to the following albums: %s'] = '連携されていた写真アルバム: %s';
+$lang['Albums automatically sorted'] = 'アルバムを自動的に並び替えました';
+$lang['All %d photos are selected'] = '全ての %d 個の写真が選択されました';
+$lang['Apply action'] = 'アックションを実行する';
+$lang['automatic order'] = '自動並び替え';
+$lang['Batch Manager'] = 'バッチ・マネージャー';
+$lang['Choose an action'] = 'アックションを選択して下さい';
+$lang['Activate icon "new" next to albums and pictures'] = 'アルバムと写真のとなりに、\'起動アイコン　"新" があります';
+$lang['Deactivate all'] = '全て非活性する';
+$lang['Default photos order'] = 'デフォルト写真順番';
+$lang['Delete orphan tags'] = '捨てられたタグを削除する';
+$lang['delete photo'] = '写真を削除する';
+$lang['Duplicates'] = '複写';
+$lang['Error on file "%s" : %s'] = '"%s"　のファイル・エラー : %s';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif エクステンションなし、管理人がexifの使用を中止する必要です。';
+$lang['Failed to write file to disk'] = 'ディスク上に書き込みを失敗しました';
+$lang['File upload stopped by extension'] = 'エクステンションによって、ファイル・アップロードが中止しました。';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] =' あなたのphp.ini ファイルによって、最高の投稿サイズ (%sB)より、 最大のアップロード・ファイルサイズ (%sB) のほうが大量です。この設定を変更する必です。';
+$lang['Average rate'] = '平均評価';
+$lang['Rate'] = '評価';
+$lang['Learn more'] = '詳細はこちら';
+$lang['An error has occured during upgrade.'] = 'アップグレード中にエラーが発生しました。';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = '解凍中にエラーが発生しました。あなたのPiwigoインストレーションのパーミッションを確認してください。<br /><a href="%s">ログエラーを表示するには、ここをクリックしてください</a>。';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigoは、アップグレードファイルをサーバから検索できません。';
+$lang['Save Template Directory'] = 'テンプレートディレクトリー保存';
+$lang['Dump Database'] = 'ダンプデータベース';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'データ履歴を含む（注意：サーバーメモリー制限する可能性があります。';
+$lang['Unable to dump database.'] = 'ダンプデータベースができません。';
+$lang['Update in progress... Please wait.'] = 'アップグレード処理中 ... お待ちください。';
+$lang['Update to Piwigo %s'] = 'Piwigo %s にアップグレード';
+$lang['Two updates are available'] = '２個のアップグレードがあります';
+$lang['This is a minor update, with only bug corrections.'] = 'これはマイナーアップグレードだけバグ修正しています。';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'これはメジャーアップグレードで、 いろいろな楽しい<a href="%s">新機能がついています。</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'あるテーマとプラグインはまだできていません。';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Piwigo %sにアップグレードせずに、直接Piwigo %s にアップグレードすることができます（推進）。';
+$lang['Add to caddie'] = 'キャディに追加する';
+
+$lang['(this tag will be deleted)'] = 'このタグを削除される';
+$lang['... or '] = '・・・また';
+$lang['Activate comments'] = 'コメントを有効する';
+$lang['Add a criteria'] = '条件を追加';
+$lang['Add tags'] = 'タグを追加';
+$lang['All extensions are up to date.'] = '全ての拡張子が最新です';
+$lang['All languages are up to date.'] = '全ての言語が最新です';
+$lang['All plugins are up to date.'] = '全てのプラグインが最新です';
+$lang['All themes are up to date.'] = '全てのテーマが最新です';
+$lang['Allowed file types: %s.'] = '使用可能のファイル：%s。';
+$lang['Confirm merge'] = 'マージを確認して下さい';
+$lang['Create'] = '作成';
+$lang['Default comments order'] = 'デフォルト・コメント順';
+$lang['display'] = '表示';
+?>
Index: tags/2.4.0RC3/language/ja_JP/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: 日本語 [JP]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=425
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Japanese';
+$lang_info['country'] = 'Japan';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ja';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d 件のカテゴリが更新されました。';
+$lang['%d albums updated'] = '%d 件のカテゴリが更新されました。';
+$lang['%d comment to validate'] = '%d 件のコメントが承認されました。';
+$lang['%d comments to validate'] = '%d 件のコメントが承認されました。';
+$lang['%d new comment'] = '新しいコメント: %d';
+$lang['%d new comments'] = '新しいコメント: %d';
+$lang['%d comment'] = 'コメント: %d';
+$lang['%d comments'] = 'コメント: %d';
+$lang['%d hit'] = 'ヒット: %d';
+$lang['%d hits'] = 'ヒット: %d';
+$lang['%d new photo'] = '新しいイメージ: %d';
+$lang['%d new photos'] = '新しいイメージ: %d';
+$lang['%d new user'] = '新しいユーザ: %d';
+$lang['%d new users'] = '新しいユーザ: %d';
+$lang['About'] = 'About';
+$lang['All tags'] = 'すべてのタグ';
+$lang['Any tag'] = 'すべてのtag';
+$lang['At least one listed rule must be satisfied.'] = '少なくともリスト記載ルール1つを満たす必要があります。';
+$lang['Author'] = '撮影者';
+$lang['Albums'] = 'カテゴリ';
+$lang['Album'] = 'カテゴリ';
+$lang['Close this window'] = 'このウィンドウを閉じる';
+$lang['Complete RSS feed (photos, comments)'] = '完全なRSSフィード (イメージ、コメント)';
+$lang['Confirm Password'] = 'パスワードをもう一度';
+$lang['Connection settings'] = '接続設定';
+$lang['Login'] = 'ログイン';
+$lang['Contact webmaster'] = 'ウェブマスタに連絡する';
+$lang['Create a new account'] = '新しいアカウントを作成する';
+$lang['Created on'] = '作成日時';
+$lang['Creation date'] = '作成日';
+$lang['Current password is wrong'] = '現在のパスワードが正しくありません。';
+$lang['Dimensions'] = 'サイズ';
+$lang['Display'] = '表示';
+$lang['Each listed rule must be satisfied.'] = 'それぞれのリスト記載ルールを満たす必要があります。';
+$lang['Email address is missing. Please specify an email address.'] = 'メールアドレスがありません。';
+$lang['Email address'] = 'メールアドレス';
+$lang['Enter your personnal informations'] = 'あなたの個人情報を入力してください。';
+$lang['Error sending email'] = 'メールの送信にエラーが発生しました。';
+$lang['File name'] = 'ファイル名';
+$lang['File'] = 'ファイル';
+$lang['Filesize'] = 'ファイルサイズ';
+$lang['Filter and display'] = 'フィルタおよび表示';
+$lang['Filter'] = 'フィルタ';
+$lang['Forgot your password?'] = 'パスワードを忘れましたか?';
+$lang['Go through the gallery as a visitor'] = 'ビジターとしてギャラリーにアクセスする';
+$lang['Help'] = 'ヘルプ';
+$lang['Identification'] = 'アイデンティフィケーション';
+$lang['Photos only RSS feed'] = 'イメージ限定RSSフィード';
+$lang['Keyword'] = 'キーワード';
+$lang['Links'] = 'リンク';
+$lang['N/A'] = 'なし';
+$lang['New on %s'] = '最新投稿 - %s';
+$lang['Notification'] = '通知';
+$lang['Number of items'] = 'アイテム数';
+$lang['Original dimensions'] = 'オリジナルサイズ';
+$lang['Password forgotten'] = 'パスワードを忘れました。';
+$lang['Password'] = 'パスワード';
+$lang['Post date'] = '投稿日';
+$lang['Posted on'] = '投稿日時';
+$lang['Profile'] = 'プロファイル';
+$lang['Quick connect'] = 'クイック接続';
+$lang['RSS feed'] = 'RSSフィード';
+$lang['Register'] = '登録';
+$lang['Registration'] = '登録';
+$lang['Related tags'] = '関連タグ';
+$lang['Reset'] = 'リセット';
+$lang['Retrieve password'] = 'パスワード取得';
+$lang['Search rules'] = '検索ルール';
+$lang['Search tags'] = '検索タグ';
+$lang['Search'] = '検索';
+$lang['display available tags'] = '利用可能なタグを表示する';
+$lang['Since'] = 'Since';
+$lang['Sort by'] = '並び替え';
+$lang['Sort order'] = '並び順';
+$lang['Tag'] = 'タグ';
+$lang['Tags'] = 'タグ';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS通知フィードでは、このウェブサイトからニュースを通知します : 新しい写真、更新カテゴリ、新しいコメント。RSSフィードリーダーをお使いください。';
+$lang['Unknown feed identifier'] = '不明なフィードIDです。';
+$lang['User comments'] = 'ユーザコメント';
+$lang['Username'] = 'ユーザ名';
+$lang['Visits'] = '訪問';
+$lang['Webmaster'] = 'ウェブマスタ';
+$lang['Week %d'] = '週 %d';
+$lang['About Piwigo'] = 'Piwigoについて';
+$lang['You are not authorized to access the requested page'] = 'あなたは、リクエストしたページへのアクセスを許可されていません。';
+$lang['add this photo to your favorites'] = 'このイメージをあなたのお気に入りに追加する';
+$lang['Administration'] = '管理';
+$lang['all'] = 'すべて';
+$lang['ascending'] = '昇順';
+$lang['author(s) : %s'] = '作者 : %s';
+$lang['Expand all albums'] = 'すべてのカテゴリを拡げる';
+$lang['posted after %s (%s)'] = '%s (%s) 以降に投稿';
+$lang['posted before %s (%s)'] = '%s (%s) 以前に投稿';
+$lang['posted between %s (%s) and %s (%s)'] = '%s (%s) から %s (%s) の間に投稿';
+$lang['posted on %s'] = '%s に投稿';
+$lang['Best rated'] = '最高評価';
+$lang['display best rated photos'] = '最高評価アイテムを表示する';
+$lang['Calendar'] = 'カレンダー';
+$lang['All'] = 'すべて';
+$lang['display each day with photos, month per month'] = '月ごとに写真の投稿日を表示します。';
+$lang['View'] = '表示';
+$lang['chronology_monthly_calendar'] = '月カレンダー';
+$lang['chronology_monthly_list'] = '月リスト';
+$lang['chronology_weekly_list'] = '週リスト';
+$lang['Click here if your browser does not automatically forward you'] = '自動的にリダイレクトされない場合、ここをクリックしてください。';
+$lang['comment date'] = 'コメント投稿日';
+$lang['Comment'] = 'コメント';
+$lang['Your comment has been registered'] = 'あなたのコメントが登録されました。';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'アンチフラッドシステム : 新たに投稿するまで、しばらくお待ちください。';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '承認ルールにパスしなかったため、あなたのコメントは登録されませんでした。';
+$lang['An administrator must authorize your comment before it is visible.'] = '表示される前に管理者があなたのコメントを承認する必要があります。';
+$lang['This login is already used by another user'] = 'このユーザIDは、すでに別のユーザに使用されています。';
+$lang['Comments'] = 'コメント';
+$lang['Add a comment'] = 'コメントを追加する';
+$lang['created after %s (%s)'] = '%s (%s) 以降に作成';
+$lang['created before %s (%s)'] = '%s (%s) 以前に作成';
+$lang['created between %s (%s) and %s (%s)'] = '%s (%s) から %s (%s) の間に作成';
+$lang['created on %s'] = '%s に作成';
+$lang['Customize'] = 'カスタマイズ';
+$lang['Your Gallery Customization'] = 'あなたのギャラリーカスタマイズ ';
+$lang['day'][0] = '日曜日';
+$lang['day'][1] = '月曜日';
+$lang['day'][2] = '火曜日';
+$lang['day'][3] = '水曜日';
+$lang['day'][4] = '木曜日';
+$lang['day'][5] = '金曜日';
+$lang['day'][6] = '土曜日';
+$lang['Default'] = 'デフォルト';
+$lang['delete this photo from your favorites'] = 'あなたのお気に入りから、このイメージを削除する';
+$lang['Delete'] = '削除';
+$lang['descending'] = '降順';
+$lang['Download'] = 'ダウンロード';
+$lang['Download this file'] = 'このファイルをダウンロードする';
+$lang['edit'] = '編集';
+$lang['wrong date'] = '日付が正しくありません。';
+$lang['excluded'] = '除外';
+$lang['Your favorites'] = 'お気に入り';
+$lang['display your favorites photos'] = '私のお気に入りの写真を表示する';
+$lang['Favorites'] = 'お気に入り';
+$lang['First'] = '最初へ';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'このカテゴリは、メンテナンスのためロックされています。後ほどアクセスしてください。';
+$lang['Page generated in'] = 'ページ作成:';
+$lang['guest'] = 'ゲスト';
+$lang['Hello'] = 'こんにちは';
+$lang['available for administrators only'] = '管理者のみ利用可能です。';
+$lang['display this album'] = 'このカテゴリのルートのイメージを表示する';
+$lang['display last user comments'] = '最新のユーザコメントを表示する';
+$lang['customize the appareance of the gallery'] = 'ギャラリーのアピアランスをカスタマイズする';
+$lang['search'] = '検索';
+$lang['Home'] = 'ホーム';
+$lang['in this album'] = '- このカテゴリ';
+$lang['in %d sub-album'] = '- %d サブカテゴリ';
+$lang['in %d sub-albums'] = '- %d サブカテゴリ';
+$lang['included'] = '含む';
+$lang['Invalid password!'] = 'パスワードが正しくありません!';
+$lang['Language']='言語';
+$lang['last %d days'] = '直近 %d 日';
+$lang['Last'] = '最後へ';
+$lang['Logout'] = 'ログアウト';
+$lang['obligatory'] = '必須';
+$lang['Maximum photo height'] = '写真の最大高';
+$lang['Maximum height must be a number superior to 50'] = '最大高は、50以上に設定してください。';
+$lang['Maximum photo width'] = '写真の最大幅';
+$lang['Maximum width must be a number superior to 50'] = '最大幅は、50以上に設定してください。';
+$lang['display a calendar by creation date'] = '作成日のカレンダーを表示する';
+$lang['display all photos in all sub-albums'] = 'すべてのサブカテゴリのエレメント表示する';
+$lang['return to normal view mode'] = 'ノーマルビューモードに戻る';
+$lang['display a calendar by posted date'] = '投稿日のカレンダーを表示する';
+$lang['month'][10] = '10月';
+$lang['month'][11] = '11月';
+$lang['month'][12] = '12月';
+$lang['month'][1] = '1月';
+$lang['month'][2] = '2月';
+$lang['month'][3] = '3月';
+$lang['month'][4] = '4月';
+$lang['month'][5] = '5月';
+$lang['month'][6] = '6月';
+$lang['month'][7] = '7月';
+$lang['month'][8] = '8月';
+$lang['month'][9] = '9月';
+$lang['Most visited'] = '最多アクセス';
+$lang['display most visited photos'] = '最もアクセスされた写真を表示します。';
+$lang['Unknown identifier'] = '不明なID';
+$lang['New password'] = '新しいパスワード';
+$lang['Rate this photo'] = 'この写真を評する';
+$lang['Next'] = '次へ';
+$lang['no rate'] = '評価なし';
+$lang['Photos posted within the last %d day.'] = '直近 %d 日に投稿されたエレメントのみ表示します。';
+$lang['Photos posted within the last %d days.'] = '直近 %d 日に投稿されたエレメントのみ表示します。';
+$lang['password updated'] = 'パスワードが更新されました。';
+$lang['Recent period must be a positive integer value'] = '最近の期間には正の整数を設定してください。';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = '写真';
+$lang['Click on the photo to see it in high definition'] = '高解像度の写真を表示するには、写真をクリックしてください。';
+$lang['Show file metadata'] = 'ファイルメタデータを表示する';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'プリファレンス';
+$lang['Previous'] = '前へ';
+$lang['Random photos'] = 'ランダム写真';
+$lang['display a set of random photos'] = '一連のランダム写真を表示します。';
+$lang['Recent albums'] = '最近のカテゴリ';
+$lang['display recently updated albums'] = '最近更新されたカテゴリを表示します。';
+$lang['Recent period'] = '最近の期間';
+$lang['Recent photos'] = '最近の写真';
+$lang['display most recent photos'] = '最近の写真を表示します。';
+$lang['Redirection...'] = 'リダイレクト ...';
+$lang['Please, enter a login'] = 'ユーザIDを入力してください。';
+$lang['login mustn\'t end with a space character'] = 'ユーザIDの末尾にスペースを使用しないでください。';
+$lang['login mustn\'t start with a space character'] = 'ユーザIDの最初にスペースを使用しないでください。';
+$lang['this login is already used'] = 'このユーザIDは、すでに使用されています。';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'メールアドレスは、xxx@yyy.eee のようなフォーマットを使用してください (例 : jack@altern.org)。';
+$lang['please enter your password again'] = 'あなたのパスワードを再度入力してください。';
+$lang['Auto login'] = '自動ログイン';
+$lang['remove this tag from the list'] = 'このタグをリストから削除する';
+$lang['representative'] = '見本';
+$lang['Search for Author'] = '作者で探す';
+$lang['Search in albums'] = 'カテゴリを探す';
+$lang['Search by date'] = '日付で探す';
+$lang['Date'] = '日付';
+$lang['End-Date'] = '終了日';
+$lang['Kind of date'] = '日付タイプ';
+$lang['Search for words'] = '言葉で探す';
+$lang['Search for all terms'] = 'すべてを含む';
+$lang['Search for any term'] = '少なくとも一つを含む';
+$lang['Empty query. No criteria has been entered.'] = '空のクエリーです。検索キーワードが入力されていません。';
+$lang['Search results'] = '検索結果';
+$lang['Search in sub-albums'] = 'サブカテゴリを探す';
+$lang['searched words : %s'] = '検索キーワード : %s';
+$lang['Contact'] = '連絡:';
+$lang['set as album representative'] = 'カテゴリ見本を設定する';
+$lang['Show number of comments'] = 'コメント数を表示する';
+$lang['Show number of hits'] = 'ヒット数を表示する';
+$lang['slideshow'] = 'スライドショー';
+$lang['stop the slideshow'] = 'スライドショーを停止する';
+$lang['Specials'] = '特別';
+$lang['SQL queries in'] = 'SQLクエリー:';
+$lang['display only recently posted photos'] = '最近投稿されたイメージのみ表示する';
+$lang['return to the display of all photos'] = 'すべてのイメージ表示に戻る';
+$lang['the beginning'] = '最初';
+$lang['Interface theme'] = 'インターフェーステーマ';
+$lang['Thumbnails'] = 'サムネイル';
+$lang['Menu'] = 'メニュー';
+$lang['A comment on your site'] = 'あなたのサイトのコメント';
+$lang['today'] = '今日';
+$lang['Update your rating'] = 'あなたの評価を更新する';
+$lang['the username must be given'] = 'ユーザ名を入力してください。';
+$lang['useful when password forgotten'] = 'パスワードを忘れたときに便利です。';
+$lang['Quick search'] = 'クイックサーチ';
+$lang['Connected user: %s'] = '接続ユーザ: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'ブラウザ: %s';
+$lang['Author: %s'] = '撮影者: %s';
+$lang['Comment: %s'] = 'コメント: %s';
+$lang['Comment by %s'] = 'コメント by %s';
+$lang['User: %s'] = 'ユーザ: %s';
+$lang['Email: %s'] = 'メールアドレス: %s';
+$lang['Admin: %s'] = '管理者: %s';
+$lang['Registration of %s'] = '%s の登録';
+$lang['Album: %s'] = 'カテゴリ: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'デフォルトステータスの使用に関して、ユーザ「ゲスト」は正しくないステータスです。ウェブマスタにご連絡ください。';
+$lang['this email address is already in use'] = 'このメールアドレスは、すでに他のユーザに使用されています。';
+$lang['Album results for'] = 'カテゴリ検索結果:';
+$lang['Tag results for'] = 'タグ検索結果:';
+$lang['from %s to %s'] = '%s - %s';
+$lang['Play of slideshow'] = 'スライドショーを実行する';
+$lang['Pause of slideshow'] = 'スライドショーを一時停止する';
+$lang['Repeat the slideshow'] = 'スライドショーを繰り返す';
+$lang['Not repeat the slideshow'] = 'スライドショーを繰り返さない';
+$lang['Reduce diaporama speed'] = 'スライドショーのスピードを減らす';
+$lang['Accelerate diaporama speed'] = 'スライドショーのスピードを増やす';
+$lang['Submit'] = '送信';
+$lang['Yes'] = 'はい';
+$lang['No'] = 'いいえ';
+$lang['%d photo']='イメージ: %d';
+$lang['%d photos']='イメージ: %d';
+$lang['%d photo is also linked to current tags'] = '%d イメージも現在のタグにリンクされました。';
+$lang['%d photos are also linked to current tags'] = '%d イメージも現在のタグにリンクされました。';
+$lang['display photos linked to this tag'] = 'このタグのみにリンクされているイメージを表示する';
+$lang['photos posted during the last %d days'] = '直近 %d 日に投稿されたイメージ';
+$lang['Piwigo Help'] = 'Piwigoヘルプ';
+$lang['Rank'] = 'ランク';
+$lang['group by letters'] = '文字でグループ化する';
+$lang['letters'] = '文字';
+$lang['show tag cloud'] = 'タグクラウドを表示する';
+$lang['cloud'] = 'クラウド';
+$lang['Are you sure?'] = '本当によろしいですか?';
+$lang['Reset to default values'] = 'デフォルトにリセットする';
+$lang['delete all photos from your favorites'] = 'お気に入りから画像を全て削除する。';
+$lang['Sent by'] = 'Sent by';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'あなたのブラウザーでは、クッキーの設定が有効にされていません。ブラウザのクッキーが有効になっていることも確認しておいてください。';
+$lang['Edit a comment'] = 'コメントを編集';
+$lang['(!) This comment requires validation'] = '(!) このコメントは有効が必要';
+$lang['Welcome'] = 'ようこそ';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Piwigoフォト・ガラリーにようこそ!';
+$lang['... or browse your empty gallery'] = '... または、空のガラリーを回覧する';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... または、このメッセージに無効にして下さい。私は自分で見てみます。';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'こんにちは %sさん, あなたのPiwigoフォト・ガラリーが何も入っていません!';
+$lang['I want to add photos'] = '写真を追加したい';
+$lang['Manage this user comment: %s'] = 'このユーザーのコメントを管理: %s';
+$lang['This author modified following comment:'] = 'このユーザーが次のコメントを書き直しました:';
+$lang['This author removed the comment with id %d'] = 'このユーザーがコメントID %d を削除しました。';
+$lang['The number of photos per page must be a not null scalar'] = 'ページごとの写真数はゼロではありません';
+$lang['Number of photos per page'] = 'ページごとの写真数';
+$lang['html tags are not allowed in login'] = 'ログインの際、HTMLタッグが使いません';
+$lang['%d rates'] = '%d 程度';
+$lang['Rating score'] = '程度のスコア';
+$lang['Invalid username or email'] = '無効なユーザー名又はメールアドレス';
+$lang['Password reset is not allowed for this user'] = 'このユーザーのためのパスワード・リセットは無効である。';
+$lang['User "%s" has no email address, password reset is not possible'] = 'ユーザー： "%s" はメールアドレスがありません。パスワード・リセットができません。';
+$lang['Someone requested that the password be reset for the following user account:'] = '次のユーザーのアカウントのために、誰かがパスワード・リセットを要求しました。';
+$lang['Username "%s" on gallery %s'] = 'ユーザー： "%s" は現在： %s\'のガラリー';
+$lang['To reset your password, visit the following address:'] = 'パスワードがリセットしたいために、次のアドレスへ：';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'もし、これは間違えたら、このメールを消去し、何も起こりません。';
+$lang['Password Reset'] = 'パスワード・リセット';
+$lang['Check your email for the confirmation link'] = '認証リンクのために、あなたのメールを確認してください。';
+$lang['Invalid key'] = '無効なキー';
+$lang['The passwords do not match'] = 'パスワードが合わせません。';
+$lang['Your password has been reset'] = 'あなたのパスワードはリセットされました。';
+$lang['Return to home page'] = 'ホームページに戻り';
+$lang['Please enter your username or email address.'] = 'あなたのユーザー名又はメールアドレスを入力してください。';
+$lang['You will receive a link to create a new password via email.'] = '新たなパスワードを作成するためのリンクをメールで送信しました。';
+$lang['Username or email'] = 'ユーザー名又はメール';
+$lang['Change my password'] = 'パスワード変更';
+$lang['Enter your new password below.'] = '新たなパスワードを以下の空欄に入力して下さい。';
+$lang['Edit'] = '編集';
+$lang['EXIF Metadata'] = 'EXIF メタデータ';
+$lang['Hello %s,'] = '%sさん、こんにちは,';
+$lang['IPTC Metadata'] = 'IPTC メタデータ';
+$lang['Send my connection settings by email'] = '接続設定をメールで送信してください。';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'ようこそ！登録完了。まもなくあなたの接続設定をメールで届く予定です。';
+$lang['Username modification'] = 'ユーザー名の変更';
+$lang['Your username has been successfully changed to : %s'] = '新規のユーザー名は: %s';
+$lang['square'] = '四角';
+$lang['thumb'] = 'サムネール';
+$lang['small'] = '小';
+$lang['medium'] = '中';
+$lang['large'] = '大';
+$lang['xlarge'] = 'XL';
+$lang['xxlarge'] = 'XXL';
+$lang['Original'] = 'オリジナル';
+$lang['Thank you for registering at %s!'] = '%sに登録して、ありがとうございました!';
+$lang['Here are your connection settings'] = 'あなたの接続設定です。';
+$lang['Password: %s'] = 'パスワード: %s';
+$lang['Username: %s'] = 'ユーザー名: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'もしも、このメールの受信が誤ったら、 %sに連絡して下さい。';
+$lang['2small'] = 'XXS 小さい';
+$lang['Desktop'] = 'デスクトップ';
+$lang['Mobile'] = 'モービル';
+$lang['Photo sizes'] = '画像のサイズ';
+$lang['Show latest comments first'] = '最新のコメントを先に表示';
+$lang['Show oldest comments first'] = '以前のコメントを先に表示';
+$lang['View in'] = '表示';
+$lang['xsmall'] = 'XS　最も小さい';
+$lang['Date created, new &rarr; old'] = '作成日, 新 &rarr; 旧';
+$lang['Date created, old &rarr; new'] = '作成日, 旧 &rarr; 新';
+$lang['Date posted, new &rarr; old'] = '掲載日, 新 &rarr; 旧';
+$lang['Date posted, old &rarr; new'] = '掲載日, 旧 &rarr; 新';
+$lang['File name, A &rarr; Z'] = 'ファイル名, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'ファイル名, Z &rarr; A';
+$lang['Manual sort order'] = 'マニュアル・ソート順';
+$lang['Numeric identifier, 1 &rarr; 9'] = '数字識別子, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = '数字識別子, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = '写真題名, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = '写真題名, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'スコア, 高 &rarr; 低';
+$lang['Rating score, low &rarr; high'] = 'スコア, 低 &rarr; 高';
+$lang['Visits, high &rarr; low'] = '訪問, 高 &rarr; 低';
+$lang['Visits, low &rarr; high'] = '訪問, 低 &rarr; 高';
+?>
Index: tags/2.4.0RC3/language/ja_JP/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,127 @@
+<h2>カテゴリを編集する</h2>
+
+<h3>情報</h3>
+
+<ul>
+
+  <li><strong>名称</strong>: カテゴリをリネームします (物理カテゴリの場合、バーチャルリネームとなります)。</li>
+
+  <li><strong>説明</strong>: コンテンツに一般的なアイディアを与えます。このテキストは、サムネイルの下に表示されます。</li>
+
+</ul>
+
+<h3>移動</h3>
+
+<p>カテゴリがバーチャルカテゴリの場合、あなたはカテゴリを移動することができます。
+カテゴリを移動することは、そのカテゴリの親カテゴリを変更することを意味します。</p>
+
+<h3>オプション</h3>
+
+<ul>
+
+  <li><strong>アクセスタイプ</strong>: パーミッション管理。あなたがカテゴリをプライベートにした場合、
+  すべての子カテゴリもプライベートになります。あなたがカテゴリをパブリックにした場合、
+  すべての親カテゴリもパブリックになります。</li>
+
+  <li><strong>ロック</strong>: メンテナンスのため、カテゴリおよびサブカテゴリが一時的に無効にされます。</li>
+
+  <li><strong>コメント</strong>: このカテゴリのコンテンツに関して、認証ユーザのコメント投稿を許可します。</li>
+
+  <li><strong>アップロードを許可する</strong>: ユーザのファイルアップロードを許可します。
+  このオプションは、(バーチャルカテゴリではなく) 物理カテゴリでのみ使用できます。</li>
+
+</ul>
+
+<p>あなたは、これらのオプションを「プロパティ」管理画面 (<span class="pwgScreen">管理 > カテゴリ > プロパティ</span> > <span class="pwgScreen">アップロード</span>、<span
+class="pwgScreen">コメント</span>、<span class="pwgScreen">ロック</span>,
+<span class="pwgScreen">パブリック/プライベート</span>, <span
+class="pwgScreen">見本</span>) で管理することもできます。</p>
+
+<h3>並び順</h3>
+
+<p>デフォルトの並び順を使用する場合、選択してください。</p>
+
+<p>この並び順がサブカテゴリに適用される場合、指定してください。</p>
+
+<p>このカテゴリで使用するカラムの並び順を選択してください。</p>
+<ul>
+<li><strong>作成日</strong>: 写真の作成日</li>
+<li><strong>投稿日</strong>: 同期化日</li>
+<li><strong>平均評価 (*)</strong>: 平均評価は、ビジターによって変わります。</li>
+<li><strong>最多アクセス (*)</strong>: 現在の訪問件数を最多アクセス順に変更します。</li>
+<li><strong>ファイル名</strong>: 情報フィールドに入力された名称です。</li>
+<li><strong>ID</strong>: 内部ID (新しいカテゴリは、前のカテゴリより高いIDを持ちます。</li>
+
+</ul>
+<p><strong>(*)</strong>予測できない結果となる場合がありますので、実行前に十分なテストを実施してください。</p>
+
+
+<h3>見本</h3>
+
+<p>カテゴリの見本は、カテゴリが (ルートカテゴリのように) サブカテゴリのみ含む場合、
+メインページ (<span class="pwgScreen">category.php</span>) に表示されるサムネイルです。</p>
+
+<p>カテゴリの見本を設定するには、4つの方法があります。 :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">写真ページ</span>: アクションボタンの1つをクリックすることで、
+  あなたは表示されている写真を表示カテゴリの見本に設定することができます。
+  このボタンは、管理者のみ利用することができます。</li>
+
+  <li>管理ページで<span class="pwgScreen">写真情報を修正する</span>。
+  この画面には、<span class="pwgScreen">picture.php</span>またはユニットモードの<span class="pwgScreen">バッチ管理</span>からアクセスすることができます。
+  詳細は、このページのヘルプをご覧ください。</li>
+
+  <li><span class="pwgScreen">「管理 > カテゴリ > プロパティ > 見本」。
+  詳細は、このページのヘルプをご覧ください。</li>
+
+  <li><span class="pwgScreen">カテゴリを編集する</span> (この画面)。</li>
+
+</ul>
+
+<p>見本は、設定パラメータ「<code>allow_random_representative</code>」の設定に依存します
+ (詳細は、<span class="filename">include/config_default.inc.php</span>をご覧ください)。</p>
+
+<p>デフォルトモード (<code>allow_random_representative</code> = false) の場合、
+それぞれのカテゴリには、少なくとも1つの固定されたエレメントが見本にされます。
+(カテゴリ作成時に) 設定した場合、見本は、管理者が求める場合のみ変更することができます。
+見本が適切ではない場合、あなたは<strong>新しい見本をランダムに探す</strong>を使って、新しい見本を探すことができます。</p>
+
+<p>設定パラメータ「<code>allow_random_representative</code>」にtrueが設定された場合、
+エレメントを含んだカテゴリは、固定の見本を持つことができません。
+<strong>見本を削除する</strong>ボタンを使用してください。</p>
+
+<p>カテゴリに (サブカテゴリのみで) エレメントが含まれていない場合、<span class="pwgScreen">写真情報を修整する</span>画面を使って、
+どのような写真でも見本にすることができます。現在の画面で使用できるオプションは、<strong>見本を削除する</strong>ボタンのみです。
+このボタンを使用した場合、見本は設定されないようになります。</p>
+
+<h3>すべてのカテゴリエレメントを新しいカテゴリにリンクする</h3>
+
+<ul>
+
+<li><strong>バーチャルカテゴリ名</strong>: 作成される新しいカテゴリ名です。
+現在のカテゴリ内にある、すべての写真は新しいカテゴリにリンクされます。</li>
+
+<li><strong>親カテゴリ</strong>: 新しいカテゴリがどこに作成されるか選択してください。
+未選択の場合、ホームカテゴリとして作成されます。</li>
+
+</ul>
+
+<h3>すべてのカテゴリエレメントを既存のカテゴリにリンクする</h3>
+
+<ul>
+
+<li><strong>カテゴリ</strong>: リンク先のカテゴリを選択してください。</li>
+
+</ul>
+
+<h3>グループメンバーに情報メールを送信する</h3>
+
+<ul>
+
+<li><strong>グループ</strong>: 受信グループ</li>
+
+<li><strong>メールコンテンツ</strong>: グループに送信するテキストです。</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ja_JP/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>バーチャルカテゴリを移動する</h2>
+
+<p>バーチャルカテゴリのみ新しい親カテゴリを持つことができます。</p>
+
+<h3>移動するバーチャルカテゴリ</h3>
+
+<p>あなたが移動したいバーチャルカテゴリを選択してください。 
+リストが空の場合、あなたがカテゴリを作成していないことを意味します。</p>
+
+<h3>新しい親カテゴリ</h3>
+
+<p>新しい親カテゴリ (バーチャルまたはフィジカル) を選択してください。
+あなたが選択しない場合、選択されたバーチャルカテゴリは、ルートに移動されます。
+あなたは、カテゴリをカテゴリ自身、または子カテゴリに移動することはできません。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/cat_options.html	(revision 14585)
@@ -0,0 +1,31 @@
+<h2>カテゴリオプション</h2>
+
+<p>このページでは、管理者が一度に多くのカテゴリのオプションを管理することができます。</p>
+
+<dl>
+
+  <dt>アップロード</dt>
+  <dd>カテゴリに対して、ギャラリーのビジターが写真をアップロードできるようにします。
+   非バーチャルおよび非リモートカテゴリのみ表示されます。</dd>
+
+  <dt>コメント</dt>
+  <dd>選択したカテゴリで、ユーザによるコメントの追加を許可します。
+  コメントを追加できるカテゴリを選択してください。
+  少なくとも1つのコメント可能なカテゴリに属しているイメージには、コメントを追加することができます。</dd>
+
+  <dt>ロック</dt>
+  <dd>選択されたカテゴリは、メンテナンスのため、一時的に無効にされます。
+  あなたがカテゴリをロックした場合、すべての子カテゴリもロックされます。
+  あなたがカテゴリのロックを解除した場合、すべての親カテゴリもロック解除されます。</dd>
+
+  <dt>パブリック/プライベート</dt>
+  <dd>選択されたカテゴリの権限を管理します。選択されたカテゴリがプライベートの場合、
+  あなたは、ユーザまたはグループにアクセスの許可を与える必要があります。
+  あなたがカテゴリをプライベートにした場合、すべての子カテゴリもプライベートになります。
+  あなたがカテゴリをパブリックにした場合、すべての親カテゴリもパブリックになります。</dd>
+
+  <dt>見本</dt>
+  <dd>あなたが<code>allow_random_representative</code> (詳細は、<span class="filename">include/config_defaults.inc.php</span>をご覧ください) 
+  の設定パラメータを「true」にした場合、このオプションを管理することができます。
+  それぞれのカテゴリを (独自の写真として) ランダムに表示、または単独に表示することができます。</dd>
+</dl>
Index: tags/2.4.0RC3/language/ja_JP/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>カテゴリパーミッションを管理する</h2>
+
+<p>このページでは、プライベートカテゴリのみ利用できます。
+あなたは、このカテゴリへの権限を与えるユーザおよびグループを選択することができます。</p>
+
+<h3>グループ</h3>
+
+<p>現在のカテゴリに関して、あなたはグループに拒否または許可を与えることができます。
+あなたはカテゴリに許可されているグループのリストを修正することができます。</p>
+
+<h3>ユーザ</h3>
+
+<p>あなたは、個別のユーザに対して拒否または許可することができます。
+グループに属しているユーザに対して、拒否または許可を与えることができます。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/configuration.html	(revision 14585)
@@ -0,0 +1,111 @@
+<h2>設定</h2>
+
+<p>このページでは、管理者が基本的な設定を実行することができます。
+実際、このページでは、多くの管理者が必要とする最小設定のみ表示しています。
+あなたが他の多くの (そして高度な) 設定を閲覧したい場合、<span class="filename">include/config_default.inc.php</span>ファイルを参照してください。</p>
+
+<p>このページは、テーマにより設定パラメータを再編成するため、いくつかのセクションに分けられています。</p>
+
+
+<h3>メイン</h3>
+<ul>
+  <li><strong>ギャラリータイトル</strong>: RSSフィードおよびメール通知に使用されます。</li>
+
+  <li><strong>ページバナー</strong>: それぞれのページのトップに表示されます。</li>
+
+  <li><strong>ギャラリーURI</strong>: RSSフィードに使用されます。</li>
+
+  <li><strong>ギャラリーをロックする</strong>: メンテナンスのため、ギャラリー全体をロックします。
+  管理者のみギャラリーにアクセスすることができます。</li>
+
+  <li><strong>評価</strong>: 写真の評価機能を有効にします。</li>
+
+  <li><strong>ゲストによる評価</strong>: 未登録のユーザでも写真を評価できます。</li>
+
+  <li><strong>ユーザ登録を許可する</strong>: すべての人が自由にユーザ登録できます。</li>
+
+  <li><strong>すべてのユーザにメールアドレスを必須とする</strong>: 管理者による処理を除き、ユーザ登録およびプロファイル更新時にメールアドレスがチェックされます。</li>
+
+  <li><strong>新しいユーザ登録時、管理者にメールする</strong>: すべてのユーザ登録に関して、管理者がメール受信します。</li>
+
+</ul>
+
+<h3>履歴</h3>
+
+  <p>ページにアクセスすることで、<span
+  class="pwgScreen">category.php</span>および<span
+  class="pwgScreen">picture.php</span>が<code>history</code>テーブルに記録されます。</p>
+  
+  <p>アクセスは、「<span class="pwgScreen">管理 > 特別 > 履歴</span>」に表示されます。</p>
+
+<ul>
+  <li><strong>ゲストによるページアクセスを記録する</strong>: ゲストによるページアクセスが記録されます。</li>
+
+  <li><strong>ユーザによるページアクセスを記録する</strong>: ユーザによるページアクセスが記録されます。</li>
+
+  <li><strong>管理者によるページアクセスを記録する</strong>: 管理者によるページアクセスが記録されます。</li>
+
+</ul>
+
+<h3>コメント</h3>
+<ul>
+
+  <li><strong>すべてのユーザにコメントを許可する</strong>: ユーザ登録されていないゲストでもコメントを投稿することができます。</li>
+
+  <li><strong>1ページあたりのコメント数</strong>.</li>
+
+  <li><strong>承認</strong>: サイトで閲覧可能な状態になる前に、管理者がユーザによるコメントを承認します。
+  ユーザコメントの承認は、「<span class="pwgScreen">管理 > 写真 > コメント</span>」にて実施されます。</li>
+
+  <li><strong>有効なコメントが投稿された場合、管理者にメールする</strong>:
+ユーザがコメントを登録して、コメントが承認された場合、管理者にメール送信します。</li>
+
+  <li><strong>コメントの承認が必要な場合、管理者にメールする</strong>:
+管理者による承認が必要なコメントをユーザが投稿した場合、管理者にメール送信します。
+ユーザコメントの承認は、「<span class="pwgScreen">管理 > 写真 > コメント</span>」にて実施されます。</li>
+
+</ul>
+
+<!--TODO --><h3>アップロード</h3>
+<ul>
+<!--TODO -->  <li><strong>毎回アップロードリンクを表示する</strong>: アップロード可能なカテゴリが存在する場合、それぞれのカテゴリに追加リンクが表示されます。</li>
+<!--TODO -->  <li><strong>アップロードに関するユーザアクセスレベル</strong>: ユーザによるアップロードの制限を許可します。</li>
+  <li><strong>写真がアップロードされた場合、管理者にメールする</strong>: ユーザにより写真がアップロードされた場合、管理者にメール通知します。</li>
+</ul>
+
+<h3>デフォルト表示</h3>
+
+<p>ここであなたは、ログインしていないユーザに対する、デフォルト表示オプションを変更することができます。
+ユーザがログインした場合、これらのオプションは、ユーザ独自のオプション (<span class="pwgScreen">プロファイル</span>で変更可) により上書きされます。</p>
+
+<p>すべてのユーザは、表示オプションを変更することができますが、あなたは「<span class="pwgScreen">管理 > アイデンティフィケーション > ユーザ</span>」にて、
+選択したユーザの表示オプションを変更することもできます。</p>
+
+<ul>
+
+  <li><strong>言語</strong>: Piwigoラベルのみに関係します。カテゴリ名、写真名およびすべての説明はローカライズされません。</li>
+
+  <li><strong>1行あたりのイメージ数</strong></li>
+
+  <li><strong>1ページあたりの行数</strong></li>
+
+  <li><strong>インターフェーステーマ</strong></li>
+
+  <li><strong>最近の期間</strong>: 日数。写真が新しい写真として表示される期間です。1日より多い日数を指定してください。</li>
+
+  <li><strong>すべてのカテゴリを拡げる</strong>: デフォルトで、すべてのカテゴリをメニューに広げますか?
+  <em>警告</em>: このオプションは、多くのりソースを消費して、あなたのカテゴリツリーが多くのカテゴリを含む場合、巨大なメニューを作成してしまいます。</li>
+
+  <li><strong>コメント数を表示する</strong>: サムネイルページで、それぞれの写真のコメント数を表示します。多くのリソースを消費します。</li>
+
+  <li><strong>ヒット数を表示する</strong>: サムネイルページで、写真のヒット数をサムネイル下に表示します。
+  特別設定パラメータが次の場合のみ表示されます: <br />
+  $conf['show_nb_hits'] = true; <br />
+  注意: デフォルトでは、falseが設定されています。</li>
+
+  <li><strong>写真の最大幅</strong>: 写真の最大表示幅です。この設定より写真が大きい場合、表示時にリサイズされます。
+  この設定に値を入力したい場合、あなたの写真の幅に変更することをお勧めします。</li>
+
+  <li><strong>写真の最大高</strong>: 前の設定と同じです。</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ja_JP/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,85 @@
+<h2>テンプレートの拡張設定</h2>
+
+<h3>ゴール</h3>
+<p>それぞれのテンプレートに関して、テンプレート拡張より、テンプレートの置換 (「replacer」と呼びます) を定義します。</p>
+
+<p>replacerがオリジナルテンプレートにリンクされた場合 (または任意で、要求されたURIに「任意のURIキーワード」が含まれている場合)、
+./template/yoga (または他のyoga) は「replacer」と置換されます。</p>
+
+<p>「任意のURIキーワード」は、URIのモジュール名の後にあります。</p>
+
+<p>従って、「任意のURIキーワード」は、「パーマリンク」になり得ます (パーマリンクに関する詳細は、私たちのドキュメントをご覧ください)。</p>
+
+<p>使用用法に関して、「<a href="#warnings">注意</a>」をご覧ください。</p>
+
+<h3>テンプレート拡張とは?</h3>
+
+<p>この設定ツールは、ビギナーおよびアドバンストユーザにとって、パワフルなツールです。
+FTPを使用して、ウェブマスタは、多くの配布 .tplファイル (「オリジナルテンプレート」) を異なる名称 (「replacer」) で複製することができます。
+ 
+ 現在サポートされている「オリジナルテンプレート」は、以下のとおりです:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> および/または <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> および/または <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> および/または<span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> および/または <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> および/または <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> および/または <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> および/または <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>オリジナルテンプレートは、どこにありますか?</h3>
+
+<p>配布されているオリジナルテンプレートは、template/yoga/ にあります (アップグレードの観点から、編集しないでください)。
+そのため、ウェブマスタは、「オリジナルテンプレート」から独自の「replacers (カスタマイズテンプレート)」を作成することができます。
+
+<h3>replacerは、どこに保存すべきですか?</h3>
+
+<p><strong>replacer (カスタマイズテンプレート)</strong> は、template-extensionフォルダ (または、そのサブフォルダ) に配置する必要があります。
+Replacers can have any filename with the .tpl extension. For example: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>replacerは、どこで有効にできますか?</h3>
+<p>関連する置換テンプレートを有効にするため、<strong>オリジナルテンプレート</strong>は、
+<strong>replacer (カスタマイズテンプレート)</strong> に割り当てられる必要があります。
+これは、設定管理ページの「テンプレートの拡張」にて、割り当てることができます。</p>
+
+<p>あなたが<strong>任意のURIキーワード</strong>を選択した場合、このキーワードを使ったページのみ、
+置換が実行されます。例えば次のようになります: <span class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>アドバンストユーザは、<strong>任意URIキーワード</strong>をパーマリンクとして使用します。</p>
+<h3>replacerを無効にするには?</h3>
+<ul>
+<li>関連する「オリジナルテンプレート」の選択を解除してください。</li>
+<li>FTPでreplacerを削除してください。</li>
+</ul>
+<a name="warnings"></a>
+<h3>注意</h3>
+<ul>
+
+<li><strong>オリジナルテンプレート</strong>は、「オリジナル」テンプレートであるべきです。そうでない場合、あなたの予想できない結果となってしまいます!</li>
+
+<li>同じ<strong>オリジナルテンプレート</strong>を使って、いくつかの<strong>replacer (カスタマイズテンプレート)</strong> を作成して、
+同じ<strong>任意のURIキーワード</strong>を使用する場合、最後のreplacerのみ有効となります。</li>
+
+<li>未選択の<strong>任意のURIキーワード</strong>は、すべてのテンプレート使用に関して、replacerを有効にします。
+前の時点と同じように、順番は、前に選択されたreplacerをオーバーライドすることができます。</li>
+
+<li>サブフォルダ:
+サブフォルダは無視されますが、現在の順番を変更するのに有用です。<br />
+distributed-samples: テスト目的のため提供されます! 
+<strong>編集せずに</strong>、あなた自身のテンプレートを作成してください。
+</li>
+
+<li>replacerを削除すると、すぐに<strong>オリジナルテンプレート</strong>が再度有効にされます。</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ja_JP/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>グループリスト</h2>
+
+<p>ここでは、あなたが定義したグループを管理することができます。</p>
+
+<h3>グループを追加する</h3>
+
+<p>管理者は、グループを追加することができます。</p>
+
+<h3>グループリスト</h3>
+
+<p>グループリストでは、それぞれの要素に関して:</p>
+
+
+<ul>
+  <li>メンバーリストに移動できます。</li>
+  <li>パーミッションに移動できます。</li>
+  <li>グループを削除できます (要チェックボックスの確認)。</li>
+  <li>ステータスを「デフォルト」に切り替えることができます (要チェックボックスの確認)。</li>
+</ul>
+
+<h3>デフォルトグループ</h3>
+<p>デフォルトグループは、新しいユーザが自動的に関連付けられるグループです。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>色々な方法でガラリーに写真をアップロードできます：</p>
+
+<ul>
+  <li>ブラウザーの中で<strong>直接なアップロード</strong> は一番快適に気軽です。しかし、それはあなたのブラウザーやWebサーバーに依存します。多数の写真又は、その他のトラベルが発生がありましたら、その他のアップロード方法もあります。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">直接なアップロードへ</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> はあなたのパソコンにインストールするデスクトップのアプリケーションです。 pLoader ウィンドウに写真をドラッグ&amp;ドロップし、<em>"Piwigoにアップロード"</em> をクリックして待つだけです。<strong>WinToPiwigo</strong> 又は<strong>Digikam</strong> などのデスクトップアプリケーションも、あります。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">pLoaderへ</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li>多数の写真をアップロードする場合、<strong>FTP</strong> は推薦しています。写真をアップロードするために、ガイドをお読みください。ＦＴＰの方法はサーバー上に写真の場所を正確に指定することができます。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">ＦＴＰへ</a></p>
+</div>
Index: tags/2.4.0RC3/language/ja_JP/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>ユーザは自分の写真をアップロードすることもできます。</p>
+
+<p>物理カテゴリにアップロードを許可します (「<span class="pwgScreen">管理 > カテゴリ > 管理 > 編集</span>」または「<span class="pwgScreen">管理 > カテゴリ &raquo; プロパティ &raquo; アップロード</span>」)。バーチャルカテゴリには、アップロードすることができません。</p>
+
+<p>対応するディレクトリに書込み権を与えてください。</p>
+
Index: tags/2.4.0RC3/language/ja_JP/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/help_misc.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>あなたのギャラリーを作成したらすぐに、「<span class="pwgScreen">管理 &raquo; 設定 &raquo; デフォルト</span>」にて、デフォルト表示プロパティを変更してください。
+  すべての新規登録ユーザは、これらのデフォルト設定を使用することになります。</p>
+
+<p>あなたに質問がある場合、Piwigoコミュニティは、あなたを<a href="http://piwigo.org/forum">フォーラム</a>で歓迎します。</p>
+
+
Index: tags/2.4.0RC3/language/ja_JP/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,45 @@
+<fieldset>
+<legend>写真のパーミッション</legend>
+
+<p>各写真は <strong>プライバシーレベル</strong>があります。各ユーザーはプライバシーレベルもあります。５つのプライバシーレベルがあります：</p>
+<ol>
+ <li>なし</li>
+ <li><em>連絡先</em></li>
+ <li><em>友人（連絡先より高い）</em></li>
+ <li><em>家族 （友人より高い）</em></li>
+ <li><em>アドミン （その他のレベルより高い）</em></li>
+</ol>
+
+<p>最も高いレベルは最も低いレベルのパーミッションがあります。どのユーザーにも、最も高いプライバシーレベルは最も多くの写真が見られます。</p>
+
+<p>例えば、もし、"peter_wedding-0024.jpg" の写真は<em>家族</em>のプライバシーレベルを設定していれば、</p>
+<ul>
+ <li>山田さんは<em>アドミン</em>なので、全ての写真がが見られます。</li>
+ <li>田中さんは <em>家族</em> なので、その写真も見られます。</li>
+ <li>鈴木さんは<em>友人</em>) なので、その写真が見られません。</li>
+</ul>
+
+<p>カテゴリー内容のパーミッションがないユーザーはそのカテゴリーやそのタイトルも見られません。タグも同じようなルールもあります。</p>
+
+<p><span class="pwgScreen">アドミニストレーション &raquo; ユーザー &raquo; 管理</span>の画面でユーザーのプライバシーレベルを設定できます。</p>
+
+</fieldset>
+
+<fieldset>
+<legend>カテゴリーのパーミッション</legend>
+
+<p>もし、現在のプライバシーレベルが利用できなかったら、ユーザー又はグループのためのカテゴリーのパーミッションも設定できます。カテゴリーと写真を同時にパーミッションを設定できます。</p>
+
+<p>あなたは、カテゴリへのアクセスを禁止することができます。あなたがパーミッションを管理したい場合、カテゴリアクセスタイプを「プライベート」に変更してください。</p>
+
+<p>あなたは、単一のカテゴリを編集 (<span class="pwgScreen">管理 &raquo; カテゴリ &raquo; 管理 > 編集</span>) または、
+  すべてのカテゴリツリーを設定 (<span class="pwgScreen">管理 &raquo; カテゴリ &raquo; プロパティ &raquo;  パブリック/プライベート</span>) することで、カテゴリをプライベートにすることができます。</p>
+
+<p>カテゴリがプライベートにされた場合、あなたはグループおよびユーザのパーミッションを3つの画面で管理することができます:</p>
+
+<ul>
+  <li><span class="pwgScreen">管理 &raquo; アイデンティフィケーション &raquo; ユーザ &raquo; パーミッション</span> (1ユーザにつき1リンク)</li>
+  <li><span class="pwgScreen">管理 &raquo; アイデンティフィケーション &raquo; グループ &raquo; パーミッション</span> (1グループにつき1リンク)</li>
+  <li><span class="pwgScreen">管理 &raquo; カテゴリ &raquo; カテゴリパーミッションの編集</span> (1カテゴリにつき1リンク)</li>
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ja_JP/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>写真は、ファイルディレクトリに関連するカテゴリ内に表示されます。</p>
+
+<p>ウェブサーバ内で複製せず、あなたは複数のカテゴリで写真を表示することができます。
+(管理者がギャラリーの写真ページからアクセスできる) 写真編集画面でカテゴリと写真を関連付けてください。</p>
+
+<p>バーチャルディレクトリは、このコンセプトに基づいています: バーチャルディレクトリには、対応するカテゴリが存在しません。
+バーチャルカテゴリを「<span class="pwgScreen">管理 &raquo; カテゴリ &raquo; 管理</span>」にて作成してください。</p>
+
Index: tags/2.4.0RC3/language/ja_JP/help/history.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/history.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>履歴</h2>
+
+<p>これらのページでは、あなたが「管理 > 一般 > 履歴」で選択したオプションに従って、Piwigoの履歴ナビゲーションにアクセスすることができます。</p>
+	
+<h3>統計</h3>
+<ul>
+<p>あなたが、<code>history</code>テーブルにページアクセス (<span class="pwgScreen">index.php</span>および<span class="pwgScreen">picture.php</span>) を保存している場合、ここではサイトのページアクセスに関する情報を閲覧することができます。</p>
+
+	<li><strong>全体の統計</strong> : あなたは、年毎の統計を閲覧することができます。</li>
+	
+	<li><strong>年毎の統計</strong> : あなたが選択した年に関して、月毎の統計を閲覧することができます。</li>
+	
+	<li><strong>月毎の統計</strong> : あなたが選択した月に関して、日毎の統計を閲覧することができます。</li>
+	
+	<li><strong>日毎の統計</strong> : あなたが選択した日付に関して、時間毎の統計を閲覧することができます。</li>
+	
+</ul>
+
+<h3>検索</h3>
+<ul>
+<p>あなたが、<code>history</code>テーブルにページアクセス (<span class="pwgScreen">index.php</span>および<span class="pwgScreen">picture.php</span>) を保存している場合、ここでは異なるフィルタにより、サイトのページアクセス詳細に関する情報を閲覧することができます。</p>
+
+	<li><strong>日付に関するフィルタ</strong> : あなたが活動を閲覧したい期間を選択してください。</li>
+	
+	<li><strong>エレメントタイプに関するフィルタ</strong> : あなたが活動を閲覧したいエレメントタイプを選択してください。</li>
+	
+	<li><strong>ユーザに関するフィルタ</strong> : あなたが活動を閲覧したいユーザを選択してください。</li>
+	
+	<li><strong>ファイル名に関するフィルタ</strong> : あなたが活動を閲覧したいファイル名を選択してください。</li>
+	
+	<li><strong>イメージIDに関するフィルタ</strong> : あなたが活動を閲覧したいイメージIDを選択してください。</li>
+</ul>
Index: tags/2.4.0RC3/language/ja_JP/help/index.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ja_JP/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/maintenance.html	(revision 14585)
@@ -0,0 +1,56 @@
+<h2>メンテナンス</h2>
+
+<p>ページ作成時間を最適化するため、Piwigoはキャッシュ情報を使用します。
+例えば、それぞれのカテゴリに含まれている写真数を、ページがリロードされるたびにカウントするのではなく、
+データベースに保存します。理論的には、この情報は常に更新されますが、時々エラーが発生して、キャッシュ情報が
+正しく表示されない場合もあります。</p>
+
+<p>時間に関して、いくつかの情報が無用になる場合もあります。この無用な情報をデータベースから削除することで、
+あなたはディスクスペースを減らすことができます。</p>
+
+<ul>
+
+  <li>
+    <strong>未リンクのエレメント:</strong>
+    どのバーチャルカテゴリにも関連付けられていないイメージを表示します。
+  </li>
+  <li>
+    <strong>1つ以上の物理カテゴリに存在する同一名ファイル:</strong>
+    複数カテゴリで見つかった同一ファイル名のイメージまたはファイルを表示します。
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>カテゴリ情報を更新する:</strong> それぞれのカテゴリに関して、次の情報が更新または管理されます:
+  親カテゴリのリスト、写真数、最近の写真の日付、子カテゴリのポジション、すべてのカテゴリのポジション。
+  この処理では、サムネイルの一致もチェックされます。</li>
+
+  <li><strong>イメージ情報を更新する:</strong> それぞれの写真に関して、次の情報が更新されます:
+  ファイルのフルパス、平均評点。
+  <em>警告</em>: 「<span class="pwgScreen">管理 > カテゴリ > 同期化</span>」または
+  写真の修正ページ (例えば、<span class="pwgScreen">写真</span>を経由) で同期化できる、
+  メタデータ情報に混乱しないでください。</li>
+
+  <li><strong>データベースを修復および最適化する:</strong>
+  それぞれのテーブルに関して、並び替え、修復および最適化処理が実行されます。
+  </li>
+</ul>
+
+<ul>
+  <li><strong>履歴詳細を消去する:</strong> <code>履歴</code>テーブルから、すべてのレコードが削除されます。
+  「<span class="pwgScreen">管理 > 特別 > 履歴</span>」ページでは、過去の履歴に関する情報が表示されなくなります。
+  <em>警告</em>: すべてのデータが削除されて、元に戻すことはできませんので留意してください。</li>
+
+  <li><strong>履歴サマリーを消去する:</strong> 履歴に関して、すべてのサマリー情報を削除します。このサマリーは、履歴詳細から計算されます。</li>
+
+  <li><strong>セッションを削除する:</strong> 期限切れのユーザセッションを削除します。</li>
+
+  <li><strong>未使用の通知フィードを削除する</strong></li>
+  
+  <li><strong>Purge search history</strong></li>
+  
+  <li><strong>コンパイル済みテンプレートを削除する</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/ja_JP/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>メール通知</h2>
+
+<p>この画面では、あなたのサイトニュースに関する、ユーザのメール購読を設定および管理します。</p>
+
+<p>この画面は、3つのタブで構成されます:</p>
+
+<h3>パラメータ</h3>
+<p>ウェブマスタのみ利用できます。このタブでは、メール通知のパラメータを設定します。</p>
+
+<h3>購読</h3>
+<p>ウェブマスタのみ利用できます。このタブでは、ユーザに関する、メール通知の購読/購読解除を管理します。</p>
+
+<h3>送信</h3>
+<p>ウェブマスタおよび管理者のみ利用できます。このタブでは、ニュースをメール通知することができます。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>パーマリンク</h2>
+
+<p>パーマリンクは、カテゴリURIを素晴らしく変更します。カテゴリにパーマリンクが設定された場合、URIにカテゴリのIDが不要となります。</p>
+
+<p>パーマリンクが削除された場合、今後もPWGページにアクセスできるよう、あなたはパーマリンク履歴に保存することができます。パーマリンク履歴テーブルでは、あなたは最新利用日時、このパーマリンクの利用回数およびパーマリンクの削除日時を閲覧することができます。</p>
+
+<p>パーマリンクは、カテゴリごとにユニークである必要がありますので留意してください。また、パーマリンク履歴では、あなたは同じパーマリンクを2回以上定義することはできません。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,100 @@
+<fieldset>
+  <legend>クイックスタート</legend>
+
+<ol>
+  <li>あなたのコンピュータにディレクトリを作成してください。</li>
+
+  <li>このディレクトリ内に写真をコピーした後、ウェブ表示のため、写真をリサイズしてください。
+  <em>警告</em>: ディレクトリおよびファイル名には、文字、「-」「_」「.」の記号のみ含んでください。空白、アクセント符号は含まないでください。</li>
+
+  <li>FTPクライアントを使って、あなたのPiwigoインストレーションの「galleries」ディレクトリにディレクトリをコピーしてください。</li>
+
+  <li>あなたのギャラリーにログインして、未作成のサムネイルを作成するため、「<span class="pwgScreen">管理 > 写真 > サムネイル</span>」に移動してください。</li>
+
+  <li>「<span class="pwgScreen">管理</span>」に移動して、大きな「クイックローカル同期」ボタンをクリックしてください。</li>
+</ol>
+
+<p>おめでとうございます! あなたは、フォトギャラリーの最初のカテゴリの作成に成功しました。</p>
+
+</fieldset>
+
+<fieldset>
+  <legend>ディレクトリおよびファイル構造</legend>
+<ul>
+
+  <li>
+
+    <p>ギャラリーディレクトリは、Piwigoディレクトリ「galleries」にあります。以下、非常に小さな (しかし、多くの特長を持つ) ギャラリーのディレクトリツリーの例です:</p>
+
+    <pre>.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>「galleries」配下の各ディレクトリは、カテゴリを表します。カテゴリの深さに制限はありません。</li>
+ 
+  <li>基本的に、エレメントはファイルによって表されます。
+  ファイル拡張子が設定パラメータの<code>file_ext</code>内にある場合、ファイルはPiwigoのエレメントになることができます (詳細は、<span class="filename">include/config_default.inc.php</span>ファイルをご覧ください)。</li>
+
+  <li>写真エレメントは、サムネイルと関連付ける必要があります (詳細は、下記サムネイルの項目をご覧ください)。</li>
+
+  <li>写真エレメントは、高品質のファイルを関連付けることができます。上記例では、wedding.jpgです。高品質の写真には、接頭辞がありません。</li>
+
+  <li>デフォルトでは、写真エレメント (ビデオ、サウンド、テキスト等) に関して、ファイル名の拡張子に関連付けられるアイコンはありません。
+  任意で、あなたはサムネイルおよび見本ファイルを関連付けることができます (上記例のvideo.aviをご覧ください)。</li>
+
+  <li><em>警告</em>: ディレクトリおよびファイル名には、文字、「-」「_」「.」の記号のみ含んでください。空白、アクセント符号は含まないでください。</li>
+
+  <li>ファイル、サムネイルおよび見本が正しくディレクトリに配置された場合、「<span class="pwgScreen">管理 > カテゴリ > 同期化</span>」に移動してください。</li>
+
+</ul>
+
+</fieldset>
+
+<fieldset>
+  <legend>サムネイル</legend>
+<ul>
+
+  <li>それぞれの写真は、サムネイルを持つ必要があります。</li>
+
+  <li>サムネイルは、カテゴリディレクトリ内のサブディレクトリ「thumbnail」に保存されます。
+  サムネイルは、関連する写真のファイル名に接頭辞「<em>TN-</em>」を付けたファイル名となります。</li>
+
+  <li><em>アドバイス</em>: サムネイルの作成には、外部モジュールをお使いください。</li>
+
+  <li>(イメージクオリティ、ウェブサーバリソースのロードに関して) 推奨はできませんが、あなたはサムネイルの作成に「<span class="pwgScreen">管理 > 写真 > サムネイル</span>」ページを使用することができます。</li>
+
+  <li>すべてのカテゴリディレクトリに書込み権を与えてください。</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ja_JP/help/search.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/search.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>検索</h2>
+
+<p>このページでは、あなたはギャラリー全体から写真を検索することができます。</p>
+
+<dl>
+
+  <dt>言葉で探す</dt>
+  <dd>入力された言葉を使用して、ギャラリーで表示される写真に関連した属性すべてを検索します。
+  部分的な合致には、* をワイルドカードとして使用してください。</dd>
+
+  <dt>作者で探すdt>
+  <dd>部分的な合致には、* をワイルドカードとして使用してください。</dd>
+
+  <dt>日付で探す</dt>
+  <dd>あなたの検索に関して、日付および終了日を選択してください。あなたが「以前」を検索したい場合、
+  日付を空白のままにしてください。年は最後のフィールドに次のようなフォーマットで入力してください : 0000 (例 2009)</dd>
+
+  <dt>カテゴリを探す</dt>
+  <dd>あなたが探したいカテゴリを選択してください。親カテゴリを選択した後、
+  「サブカテゴリを探す」オプションを選択した場合、すべてのサブカテゴリも検索されます。</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ja_JP/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/site_manager.html	(revision 14585)
@@ -0,0 +1,41 @@
+<h2>リモートサイト</h2>
+
+<p>Piwigoでは、イメージを保存して、あなたのギャラリーを構成するため、
+複数のサーバを使用することができます。 これは、ギャラリーがインストールされているサーバのディスクスペースが限られていて、
+あなたが大量のイメージを表示したい場合、有用です。</p>
+
+<ol>
+
+  <li><code>$conf['prefix_thumbnail']</code> または <code>$conf['use_exif']</code></li>のようなパラメータセクションを変更することで、
+  ファイル<span class="filename">tools/create_listing_file.php</span>を編集してください。
+
+  <li>修正済みファイル<span class="filename">tools/create_listing_file.php</span>を
+  あなたのカテゴリのディレクトリ (このウェブサイトのディレクトリ<span class="filename">galleries</span> )と
+  同じ遠隔サーバのディレクトリにFTPでアップロードしてください。
+  例えば、あなたが<span class="filename">http://example.com/galleries/create_listing_file.php</span>にアクセスできるようにします。</li>
+
+  <li>「<span class="pwgScreen">管理パネル > カテゴリ > サイトマネージャ</span>」に移動してください。
+  例えば、<span class="filename">http://example.com/galleries</span>のようなサイトを作成してください。</li>
+
+  <li>新しいリモートサイトが作成されます。あなたは、次の4つの処理を実行できます :
+
+    <ol>
+
+      <li><strong>一覧の作成</strong> : 遠隔ファイル一覧を作成するリクエストを送信できます。</li>
+
+      <li><strong>同期化</strong> : 遠隔サイトの<span class="filename">listing.xml</span>ファイルを読んで、
+      データベース情報と同期化できます。</li>
+
+      <li><strong>クリーン</strong> : 遠隔サイトの<span class="filename">listing.xml</span>ファイルを削除できます。</li>
+
+      <li><strong>削除</strong> : データベース内のサイト (および、すべての関連カテゴリおよびエレメント) をデータベースから削除できます。</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>You can do all this by hand by generating yourself the <span
+class="filename">listing.xml</span> file, moving it from your distant server
+to you local Piwigo root directory and opening the remote site
+management screen : Piwigo will propose you to use the found
+listing.xml file.</p>-->
Index: tags/2.4.0RC3/language/ja_JP/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/synchronize.html	(revision 14585)
@@ -0,0 +1,10 @@
+<h2>同期化</h2>
+
+<p>同期化には、2つの方法があります: ディレクトリ/ファイルおよびファイルメタデータです。
+ディレクトリ/ファイルでは、データベース内のカテゴリツリーを含んだディレクトリを同期化します。
+メタデータでは、ファイルサイズ、ピクセルのサイズ、EXIFまたはIPTC情報等のエレメント情報を更新します。</p>
+
+<p>最初の同期化は、ディレクトリ/ファイルを実行してください。</p>
+
+<p>同期化処理には長時間を要します (あなたのサーバロードおよび管理するエレメント量に依存します)。
+そのため、カテゴリごとに処理することも可能です。</p>
Index: tags/2.4.0RC3/language/ja_JP/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,28 @@
+<h2>サムネイル作成</h2>
+
+<p>このページでは、欠けているサムネイルを作成することができます。</p>
+
+<dl>
+
+  <dt>GDバージョン</dt>
+
+  <dd>GDは、写真をコントロールするためのPHPライブラリです。あなたのサーバにインストールされている
+  バージョンを選択してください。あなたが正しくないバージョンを選択した場合、エラーメッセージが表示されます。
+  エラーメッセージが表示された場合、このページに戻って、他のバージョンを選択してください。どのバージョンを選択しても
+  動作しない場合、あなたのサーバがGDをサポートしていないことを意味します。</dd>
+
+  <dt>幅および高さ</dt>
+
+  <dd>サムネイルが使用することのできる最大サイズです。縦横比は保持されます。  </dd>
+
+  <dt>作成するサムネイル数</dt>
+
+  <dd>同時に多くの写真をサムネイル化しないでください。実際、サムネイル化では多くのCPUを使用します。あなたがPiwigoを
+  フリープロバイダにインストールしている場合、高すぎるCPUロードを理由として、あなたのウェブサイトが削除される場合があります。</dd>
+
+  <dt>ファイルフォーマット</dt>
+
+  <dd>サムネイルの作成には、JPEGファイルフォーマットのみサポートされています。
+  サムネイルは、PNGおよびJPEG写真からのみ作成することができます。</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ja_JP/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/ja_JP/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/help/user_list.html	(revision 14585)
@@ -0,0 +1,30 @@
+<h2>ユーザリスト</h2>
+
+<p>このページでは、あなたは登録済みユーザを管理することができます。
+パーミッションのみ異なるページで管理します。</p>
+
+<h3>ユーザを追加する</h3>
+
+<p>管理者は、手動でユーザを追加することができます。</p>
+
+<h3>ユーザリスト</h3>
+
+<p>リストは、ユーザ名 (ワイルドカードは、* を使用)、グループまたはステータスでフィルタすることができます。
+また、リストは登録日またはユーザ名の昇順または降順に並び替えることもできます。</p>
+
+<p>このページでは、複数のユーザに対して、同時に異なる処理を実施することができます:</p>
+
+<ul>
+
+  <li>ユーザの削除 (要確認チェックボックスのチェック)</li>
+
+  <li>ステータスの変更</li>
+
+  <li>グループの関連付け、または関連付けの解除</li>
+
+  <li>表示プロパティの変更</li>
+
+  <li>追加的なプロパティの変更</li>
+
+</ul>
+<p>ターゲットは「選択」されたユーザ (デフォルト) です。または、「すべて」のユーザを選択することができます。</p>
Index: tags/2.4.0RC3/language/ja_JP/index.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ja_JP/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/install.lang.php	(revision 14585)
@@ -0,0 +1,72 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'インストレーション';
+$lang['Basic configuration'] = '基本設定';
+$lang['Default gallery language'] = 'ギャラリーのデフォルト言語';
+$lang['Database configuration'] = 'データベース設定';
+$lang['Admin configuration'] = '管理設定';
+$lang['Start Install'] = 'インストールを開始する';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'メールアドレスは、 xxx@yyy.eee のような形式にしてください (例: jack@altern.org)。';
+
+$lang['Webmaster login'] = 'ウェブマスタログイン';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'ウェブマスタは、ビジターに表示されます。ウェブサイト管理に必要です。';
+
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'サーバへ接続することができましたが、データベースに接続できません。';
+$lang['Can\'t connect to server'] = 'サーバに接続できません。';
+
+$lang['Host'] = 'MySQLホスト';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = '例) localhost、sql.multimania.com、toto.freesurf.fr';
+$lang['User'] = 'ユーザ';
+$lang['user login given by your host provider'] = 'あなたのホストプロバイダから提供されたデータベースユーザ名です。';
+$lang['Password'] = 'パスワード';
+$lang['user password given by your host provider'] = 'あなたのホストプロバイダから提供されたデータベースパスワードです。';
+$lang['Database name'] = 'データベース名';
+$lang['also given by your host provider'] = 'こちらも、あなたのホストプロバイダから提供されたデータベース名です。';
+$lang['Database table prefix'] = 'データベーステーブル接頭辞';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'データベーステーブルに接頭辞として付けられます (あなたのテーブルを管理しやすくします)。';
+$lang['enter a login for webmaster'] = 'ウェブマスタのユーザIDを入力してください。';
+$lang['webmaster login can\'t contain characters \' or "'] = 'ウェブマスタのユーザIDには、「\'」または「"」を含まないでください。';
+$lang['please enter your password again'] = 'もう一度あなたのパスワードを入力してください。';
+$lang['Webmaster password'] = 'ウェブマスタパスワード';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'ウェブマスタパスワードは、内密にしてください。ウェブマスタパスワードを使用して、あなたは管理パネルにアクセスすることができます。';
+$lang['Password [confirm]'] = 'パスワード [もう一度]';
+$lang['verification'] = '確認';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'ヘルプが必要ですか? <a href="%s">Piwigoメッセージボード</a>にて、あなたの質問を投稿してください。';
+$lang['Webmaster mail address'] = 'ウェブマスタメールアドレス';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'ビジターは、このメールアドレスでサイト管理者に連絡することができます。';
+$lang['PHP 5 is required'] = 'PHP 5は必要';
+$lang['It appears your webhost is currently running PHP %s.'] = 'あなたのウェブホストは現在PHP %sを使っているらしいです。';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigoは.htaccess ファイルを作成するか、変更しようとしてPHP 5に設定してみます。';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = '注：自分で設定を変更し、その後Piwigoを再起動もできます。';
+$lang['Try to configure PHP 5'] = 'PHP 5を設定してみます。';
+$lang['Sorry!'] = '申し訳ありません!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'PiwigoはPHP 5に設定できませんでした。';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'あなたのホームページ・プロバイダーのサポートに参照し、自分でPHP 5に変更方法を見られます。';
+$lang['Hope to see you back soon.'] = 'またお越し下さい';
+$lang['Congratulations, Piwigo installation is completed'] = 'おめでとうございました。Piwigo のインストール完了しました。';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'その他の解決は、上のボックスにあるテクストをコピーし、"local/config/database.inc.php"に貼り付けます。（注意：database.inc.php は上のテクスト内容以外のこと（エンターキーやスペースなど）を含まないでください。)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'local/config/database.inc.php のconfig ファイル作成失敗しました。';
+$lang['Download the config file'] = 'config ファイルをダウンロードします。';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'config ファイルをダウンロードし、インストールされた local/config ディレクトリーにアップロードすることができます。';
+?>
Index: tags/2.4.0RC3/language/ja_JP/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ja_JP/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+日本語 [JP]
Index: tags/2.4.0RC3/language/ja_JP/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ja_JP/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ja_JP/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = 'アップグレード';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'このページであなたのデータベースをアップグレードするように推薦しています（旧Piwigoのデータベースから、現在版）。
+アップグレード・アシスタントはあなたが現在<strong>release %s</strong> (またはそれと同等)を使っています。';
+$lang['Upgrade from version %s to %s'] = 'バージョン %s から %s にアップグレードする';
+$lang['Statistics'] = '統計';
+$lang['total upgrade time'] = '合計アップグレード時間';
+$lang['total SQL time'] = '合計SQL時間';
+$lang['SQL queries'] = 'SQLクエリー';
+$lang['Upgrade informations'] = '更新情報';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = '問題がある場合、[管理 > ツール > メンテナンス] でメンテナンスチェックを実行してください。';
+$lang['Only administrator can run upgrade: please sign in below.'] = '管理者のみアップグレードを実行できます: 以下でログインしてください。';
+$lang['You do not have access rights to run upgrade'] = 'あなたには、アップグレードを実行する権限がありません。';
+$lang['All sub-albums of private albums become private'] = 'プライベートカテゴリのすべてのサブカテゴリがプライベートにされました。';
+$lang['User permissions and group permissions have been erased'] = 'ユーザパーミッションおよびグループパーミッションが削除されました。';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = '以前の設定より、サムネイル接頭辞およびウェブマスターのメールアドレスのみ保存されました。';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = '予防措置として、次のプラグインは無効になりました。再有効になる前に、プラグインのアップグレードを確認しなければなりません。:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '<i>%s</i>に、 <b>?></b>の前に入力:';
+?>
Index: tags/2.4.0RC3/language/ka_GE/about.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/about.html	(revision 14585)
@@ -0,0 +1,12 @@
+  <li>Piwigo - ეს არის სკრიპტი,რომელიც საშუალებას გაძლევთ ადვილად შექმნათ ფოტო სურათების ონლაინ გალერეა.</li>
+
+  <li>გალერეა Piwigo შექმნილია  PHP (elePHPant) საშუალებით და იყენებს  MySQL (SQuirreL) მონაცემთა ბაზას.</li>
+
+  <li>თუკი გაგიჩნდებათ რაიმე კითხვა ან კომენტარი სკრიპტთან დაკავშირებით,გთხოვთ დატოვოთ იგი ოფიციალურ საიტზე <a
+  href="http://ru.piwigo.org">Piwigo</a>, ან მის <a href="http://ru.piwigo.org/forum">ფორუმზე</a>.</li>
+
+<p>The Georgian is maintained by (alpha ordered):
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=8075">geomagi</a></li>
+	</ul>
+         .... thanks to them</p>
Index: tags/2.4.0RC3/language/ka_GE/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/admin.lang.php	(revision 14585)
@@ -0,0 +1,791 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d კავშირი';
+$lang['%d associations'] = '%d კავშირი';
+$lang['%d album including'] = '%d კატეგორია დამატებულია ';
+$lang['%d albums including'] = 'დამატებული კატეგორიები: %d';
+$lang['%d physical'] = '%d რეალური';
+$lang['%d physical'] = '%d რეალური';
+$lang[' and %d virtual'] = ' და %d ვირტუალური';
+$lang[' and %d virtual'] = ' და %d ვირტუალური';
+$lang['%d album moved'] = '%d კატეგორია გადატანილია';
+$lang['%d albums moved'] = '%d კატეგორია გადატანილია';
+$lang['%d group'] = '%d ჯგუფი';
+$lang['%d groups'] = '%d ჯგუფი';
+$lang['%d member'] = '%d მონაწილე';
+$lang['%d members'] = '%d მონაწილე';
+$lang['%d tag'] = '%d სიტყვა';
+$lang['%d tags'] = '%d სიტყვები';
+$lang['%d user comment rejected'] = '%d მომხმარებლის კომენტარი აცილებულია';
+$lang['%d user comments rejected'] = '%d მომხმარებლის კომენტარები აცილებულია';
+$lang['%d user comment validated'] = '%d მომხმარებლის კომენტარი მიღებულია';
+$lang['%d user comments validated'] = '%d მომხმარებლის კომენტარები მიღებული';
+$lang['%d user deleted'] = '%d მომხმარებელი წაშლილია';
+$lang['%d users deleted'] = '%d მომხმარებელი წაშლილია';
+$lang['%d user'] = '%d მომხმარებელი';
+$lang['%d users'] = '%d მომხმარებელი';
+$lang['%d waiting for validation'] = '%d უცდის შემოწმებას';
+$lang['Actions'] = 'მოქმედება';
+$lang['Activate'] = 'აქტივაცია';
+$lang['Add/delete a permalink'] = 'დავამატოთ/წავშალოთ მუდმივი ბმული';
+$lang['Add a tag'] = 'დავამატოთ სიტყვა';
+$lang['Add a user'] = 'დავამატოთ მომხმარებელი';
+$lang['Add group'] = 'დავამატოთ ჯგუფი';
+$lang['Add'] = 'დავამატოთ';
+$lang['Allow user registration'] = 'დაუშვათ მომხმარებლების რეგისტრაცია';
+$lang['Apply to sub-albums'] = 'გამოვიყენოთ ქვეკატეგორიებისთვისაც';
+$lang['Associated'] = 'დაკავშირებული';
+$lang['Caddie management'] = 'კალათის მართვა';
+$lang['Caddie'] = 'კალათა';
+$lang['Albums authorized thanks to group associations'] = 'კატეგორიები, რომლებიც დაშვებულია ჯგუფთან კავშირის გამო';
+$lang['Album manual order was saved'] = 'კატეგორიების განსაკუთრებული წყობა შენახულია';
+$lang['Check for upgrade failed for unknown reasons.'] = 'განახლების შემოწმება უცნობი მიზეზების გამო არ შესრულდა.';
+$lang['Check for upgrade'] = 'განახლების შემოწმება';
+$lang['Comments for all'] = 'კომენტარები ყველასათვის';
+$lang['Current name'] = 'მიმდინარე სახელი';
+$lang['Database'] = 'მონაცემთა ბაზა';
+$lang['Deactivate'] = 'გამორთვა';
+$lang['Delete Representant'] = 'წარმომადგენლის წაშლა';
+$lang['Delete selected tags'] = 'არჩეული სიტყვების წაშლა';
+$lang['Delete selected users'] = 'არჩეული მომხმარებლების წაშლა';
+$lang['Deletions'] = 'წაშლები';
+$lang['Deny selected groups'] = 'უარი ჯგუფის არჩევაზე';
+$lang['Deny selected users'] = 'უარი მომხმარებილს არჩევაზე';
+$lang['Description'] = 'აღწერა';
+$lang['Display options'] = 'ნახვის ვარიანტები';
+$lang['Dissociated'] = 'დაუკავშირებლები';
+$lang['Does not represent'] = 'წარმომადგენელი არ არის';
+$lang['Edit selected tags'] = 'გამოყოფილი სიტყვების რედაქტირება';
+$lang['Edit tags'] = 'სიტყვების რედაქტირება';
+$lang['Email admins when a new user registers'] = 'შევატყობინოთ ადმინისტრატორს ახალი მომხმარებლის რეგისტრაცია';
+$lang['Email admins when a valid comment is entered'] = 'შევატყობინოთ ადმინისტრატორს ახალი კომენტარის შესახებ';
+$lang['Email admins when a comment requires validation'] = 'შევატყობინოთ ადმინისტრატორს შესამოწმებელი კომანტარის შესახებ';
+$lang['Environment'] = 'გარემოცვა';
+$lang['Form'] = 'მოქმედებები';
+$lang['Gallery title'] = 'გალერეის სახელი';
+$lang['Grant selected groups'] = 'ნება დავრთოთ რჩეულ ჯგუფებს';
+$lang['Grant selected users'] = 'ნება დავრთოთ რჩეულ მომხმარებლებს';
+$lang['Group name'] = 'ჯგუფის სახელი';
+$lang['Groups'] = 'ლგუფები';
+$lang['Guests'] = 'სტუმრები';
+$lang['History'] = 'ისტორია';
+$lang['Informations'] = 'ინფორმაცია';
+$lang['Install'] = 'დავაყენოთ';
+$lang['Link all album photos to a new album'] = 'დაუკავშიროთ ამ კატეგორიის ყველა ელემენტი ახალს';
+$lang['Link all album photos to some existing albums'] = 'დაუკავშიროთ ამ კატეგორიის ყველა ელემენტი ერთ ერთ არსებულს';
+$lang['Linked albums'] = 'დაკავშირებული კატეგორიები';
+$lang['Lock gallery'] = 'დავბლოკოთ გალერეა';
+$lang['Maintenance'] = 'მომსახურება';
+$lang['Edit album permissions'] = 'ნებართვების მართვა კატეგორიებისათვის';
+$lang['Manage permissions for group "%s"'] = 'ნებართვების მართვა ჯგუფისთვის  "%s"';
+$lang['Manage permissions for user "%s"'] = 'ნებართვების მართვა მომხმარებლებისათვის  "%s"';
+$lang['Manage tags'] = 'სიტყვების მართვა';
+$lang['Members'] = 'მონაწილეები';
+$lang['Metadata synchronized from file'] = 'მეტამონაცემები სინქრონიზირებულია ფაილთან';
+$lang['Move albums'] = 'კატეგორიის გადატანა';
+$lang['Move'] = 'გადატანა';
+$lang['Name'] = 'სახელი';
+$lang['New name'] = 'ახალი სახელი';
+$lang['New parent album'] = 'ახალი მშობლიური კატეგორია';
+$lang['New tag'] = 'ახალი სიტყვა';
+$lang['Number of comments per page'] = 'კომენტარების რაოდენობა გვერდზე';
+$lang['Number of rates'] = 'შეფასების რაოდენობა';
+$lang['Number of thumbnails to create'] = 'შესაქმნელი ინიატურების რაოდენობა';
+$lang['Only private albums are listed'] = 'მხოლოდ დაფარული კატეგორიების ჩვენება';
+$lang['Operating system'] = 'ოპერატიული სისტემა';
+$lang['Options'] = 'ოპციები';
+$lang['Other private albums'] = 'პრივატულ კატეგორიებთან დაშვება';
+$lang['Page banner'] = 'წარწერა ბანერზე';
+$lang['Parent album'] = 'მშობლიური კატეგორია';
+$lang['Path'] = 'გზა';
+$lang['Permalink'] = 'მუდმივი მისამართი';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'მუდმივი მისამართი %s ადრე გამოიყენებოდა კატეგორიისთვის %s. წაშალეთ იგი მანამდე მუდმივი მისამართების ისტორიიდან';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'მუდმივი მისამართი უნდა შედგებოდეს  a-z, A-Z, 0-9, "-" ან"_". იგი არ უნდა იყოს რიცხობრივი და არ უნდა იწყებოდეს რიცხვით "-"';
+$lang['Permalink %s is already used by album %s'] = 'მუდმივი მისამართი %s უკვე გამოიყენება კატეგორიისათვის %s';
+$lang['Permalink history'] = 'მუდმივი მისამართების სია';
+$lang['Permalinks'] = 'მუდმივი მისამართი';
+$lang['Permission denied'] = 'დაშვება აკრძალულია';
+$lang['Permission granted thanks to a group'] = 'ჯგუფისთვის დაშვება შესაძლებელია';
+$lang['Permission granted'] = 'დაშვება შესაძლებელია';
+$lang['Photo informations updated'] = 'ინფორმაცია ფოტოსთვის განახლებულია';
+$lang['Plugins'] = 'პლაგინები';
+$lang['Position'] = 'ნომერი';
+$lang['Preferences'] = 'გასწორება';
+$lang['Properties'] = 'თვისებები';
+$lang['Random photo'] = 'შემთხვევითი ფოტო';
+$lang['Rate date'] = 'თარიღი';
+$lang['Rating by guests'] = 'სტუმრების შეფასება';
+$lang['Rating'] = 'შეფასება';
+$lang['Reject'] = 'უარი';
+$lang['Representant'] = 'წარმომადგენელი';
+$lang['Representation of albums'] = 'წარმოდგენილი კატეგორიები';
+$lang['Representative'] = 'წარმომადგენელი';
+$lang['Represents'] = 'წარმოადგენს';
+$lang['Save order'] = 'შევინახოთ წყობა';
+$lang['Save to permalink history'] = 'შევინახოთ მუდმვი მისამართების ისტორია';
+$lang['Select at least one album'] = 'აირჩიეთ ერთი კატეგორია მაინც';
+$lang['Select at least one photo'] = 'აირჩიეთ ერთი ფოტო მაინც';
+$lang['Select at least one user'] = 'აირჩიეთ ერთი მომხმარებელი მაინც';
+$lang['Show info'] = 'ვნახოთ ინფორმაცია';
+$lang['Site manager'] = 'საიტების მართვა';
+$lang['Status'] = 'სტატუსი';
+$lang['Statistics'] = 'სტატისტიკა';
+$lang['Storage album'] = 'შენახვის კატეგორია';
+$lang['Sum of rates'] = 'მთლიანი შეფასება';
+$lang['Tag "%s" already exists'] = 'სიტყვა "%s" უკვე არის';
+$lang['Tag "%s" was added'] = 'სიტყვა "%s" დამატებულია';
+$lang['Tag selection'] = 'სიტყვების არჩევა';
+$lang['The %d following tags were deleted'] = '%d მითითებული სიტყვა წაშლილია';
+$lang['Uninstall'] = 'დეინსტალაცია';
+$lang['Use the default photo sort order (defined in the configuration file)']='სურათების სორტირება ძირითადად (როგორც კონფიგურაციის ფაილშია)';
+$lang['User comments validation'] = 'მომხმარებლების კომენტარების შემოწმება';
+$lang['Users'] = 'მომხმარებლები';
+$lang['Validate'] = 'მივიღოთ';
+$lang['Validation'] = 'შემოწმება';
+$lang['Version'] = 'ვერსია';
+$lang['Virtual albums to move'] = 'ვირტუალური კატეგორიები გადასატანად';
+$lang['Virtual album name'] = 'ვირტუალური კატეგორიების სახელები';
+$lang['Webmaster cannot be deleted'] = 'ვებმასტერის წაშლა არ შეიძლება';
+$lang['You are running on development sources, no check possible.'] = 'მუშაობს დამუშავების პროცესში, შემოწმწბა შეუძლებელია.';
+$lang['You cannot delete your account'] = "თქვენ არ შეგიძლიათ თქვენი აკკაუნთის წაშლა";
+$lang['You cannot move an album in its own sub album'] = 'თქვენ არ შეგიძლიათ გადააადგილოთ კატეგორია მის ქვეკატერორიაში';
+$lang['You need to confirm deletion'] = 'თქვენ უნდა დაადასტუროთ წაშლა';
+$lang['add tags'] = 'დავამატოთ სიტყვები';
+$lang['Associate to album'] = 'მივამაგროთ კატეგორიას';
+$lang['associate to group'] = 'მივამაგროთ ჯგუფს';
+$lang['Authorized'] = 'დასაშვებია';
+$lang['Add a virtual album'] = 'დავამატოთ ვირტუალური კატეგორია';
+$lang['Authorize users to add comments on selected albums'] = 'ნება დავრთოთ მომხმარებლებს დაამატონ კომენტარები არჩეულ კატეგორიებს';
+$lang['The name of an album must not be empty'] = 'კატეგორიის სახელი ცარიელი არ უნდა იყოს';
+$lang['Lock albums'] = 'დავბლოკოთ კატეგორიები';
+$lang['Private'] = 'პირადი(პრივატული) კატეგორია';
+$lang['Public'] = 'საერთო კატეგორია';
+$lang['Find a new representant by random'] = 'ვიპოვოტ ახალი წარმომადგენელი შემთხვევითი მეთოდით';
+$lang['Public / Private'] = 'საერთო / პრივატული';
+$lang['Manage authorizations for selected albums'] = 'ავტორიზაციის მართვა არჩეული კატეგორიებისათვის';
+$lang['Virtual album added'] = 'ვირტუალური კატეგორია დამატებულია';
+$lang['Virtual album deleted'] = 'ვირტუალური კატეგორია წაშლილია';
+$lang['Access type'] = 'დაშვების ტიპი';
+$lang['Information data registered in database'] = 'ინფორმაცია დარეგისტრირებულია მონაცემთა ბაზაში';
+$lang['Default display'] = 'ძირითადი სახე';
+$lang['The gallery URL is not valid.'] = 'არაკორექტული URL გალერეისათვის';
+$lang['Main'] = 'მთავარი';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'გვერდზე შეიძლება იყოს 5 დან 50 კომენტარამდე.';
+$lang['Configuration'] = 'გასწორება';
+$lang['confirm'] = 'დასტური';
+$lang['delete album'] = 'წავშალოთ კატეგორია';
+$lang['Dissociate from album'] = 'მოვაშოროთ კატეგორიას';
+$lang['dissociate from group'] = 'მოვაშოროთ ჯგუფს';
+$lang['Album updated successfully'] = 'ინფორმაცია კატეგორიაზე წარმატებით განახლებულია.';
+$lang['photos per page'] = 'მინიატურები გვერდზე';
+$lang['High definition enabled'] = 'არსებობს დიდი გაფართოებით';
+$lang['File'] = 'ფაილი';
+$lang['first photo added on %s'] = 'პირველი ელემენტი დამატებულია %s';
+$lang['Forbidden'] = 'აკრძალულია';
+$lang['global mode'] = 'ჯგუფური რეჟიმი';
+$lang['group "%s" added'] = 'ჯგუფი "%s" დამატებულია';
+$lang['group "%s" deleted'] = 'ჯგუფი "%s" წაშლილია';
+$lang['group "%s" updated'] = 'ჯგუფი "%s" განახლებულია';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'ჯგუფის სახელი არ უნდა შეიცავდეს  " ან \' და არ უნდა იყოს ცარიელი.';
+$lang['This name is already used by another group.'] = 'ეს სახელი უკვე გამოყენებულია სხვა ჯგუფის მიერ.';
+$lang['Groups'] = 'ჯგუფები';
+$lang['High definition'] = 'დიდი გაფართოება';
+$lang['jump to album'] = 'კატეგორიაში გადასვლა';
+$lang['jump to photo'] = 'ფოტოებში გადასვლა';
+$lang['leave'] = 'დავტოვოთ';
+$lang['Lock'] = 'ბლოკირება';
+$lang['Locked'] = 'დაბლოკილია';
+$lang['manage album photos'] = 'კატეგორიის ფოტოების მართვა';
+$lang['manage sub-albums'] = 'ქვეკატეგორიების მართვა';
+$lang['Manage'] = 'მართვა';
+$lang['maximum height'] = 'მაქსიმალური სიმაღლე';
+$lang['maximum width'] = 'მაქსიმალური სიგანე';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'შესრულების დრო ამოიწურა, დამუშავება უნდა გაგრძელდეს [დაახლოებითი დრო: %d წამი].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'შესრულების დრო ამოიწურა, დამუშავება უნდა გაგრძელდეს [დაახლოებითი დრო: %d წამი].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'მომხმარებელთა სიის მომზადების დრო დასაგზავნად შეზრუდულია. დარჩენილი მომხმარებლები არ არიან სიაში.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'ფოსტის გაგზავნის დრო შეზღუდულია. სხვა წერილები გამოტოვებულია.';
+$lang['To send ?'] = 'გავგზავნოთ?';
+$lang['Last send'] = 'ბოლო გაგზავნილები';
+$lang['email'] = 'email';
+$lang['User'] = 'მომხმარებელი';
+$lang['See you soon,'] = 'ნახვამდის,';
+$lang['Go to'] = 'გადავიდეთ ';
+$lang['Hello'] = 'გამარჯობა ';
+$lang['New photos were added'] = 'ახალი ელემენტები დამატებულია ';
+$lang['on'] = ' ში ';
+$lang['between'] = 'შორის ';
+$lang['and'] = ' და ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'ადმინისტრატორმა მოგცათ უფლება მიიღოთ  შეტყობინები ფოსტის საშუალებით.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'თქვენ  დაადასტურეთ ხელმოწერა შეტყობინებების ფოსტით მიღებაზე.';
+$lang['To subscribe'] = 'ხელმოწერა';
+$lang['If you encounter problems or have any question, please send a message to'] = 'თუკი გაგიჩნდებათ რაიმე პრობლემა ან კითხვები, მოგვწერეთ ';
+$lang['[NBM] Problems or questions'] = 'პრობლემები და შეკითხვები';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'ადმინისტრატორმა დაბლოკა უფლება მიიღოთ  შეტყობინები ფოსტის საშუალებით.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'თქვენ წაშალეთ ხელმოწერა შეტყობინებების ფოსტის მიღებაზე.';
+$lang[', click on'] = ', დაწკაპეთ ';
+$lang['To unsubscribe'] = 'რათა გააუქმოთ ხელმოწერა';
+$lang['With blank value, gallery title will be used'] = 'თუკი არ არის შევსებული, გამოყენებული იქნება გალერეის სახელი';
+$lang['Notification'] = 'შეტყობინებები';
+$lang['Error when sending email to %s [%s].'] = 'ფოსტის გაგზავნის შეცდომა %s [%s] თვის.';
+$lang['Mail sent to %s [%s].'] = 'წერილი გაგზავნილია %s [%s] თვის.';
+$lang['%d mail was sent.'] = 'გაგზავნილია წერილი: %d.';
+$lang['%d mails were sent.'] = 'გაგზავნილია წერილები: %d.';
+$lang['%d mail was not sent.'] = 'გაუგზავნელი წერილი: %d.';
+$lang['%d mails were not sent.'] = 'გაუგზავნელი წერილები: %d.';
+$lang['No mail to send.'] = 'არ არის გასაგზავნი წერილები.';
+$lang['There is no available subscribers to mail.'] = 'არ არიან მომხმარებლები, ვისთვისაც შეიძლება წერილის გაგზავნა.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'მომხმარებლები არსებობენ, თუკი არის ახალი შეტყობინების ელემენტები.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'შესაძლებელია ,არ არიან ხელმომწერები (მხოლოდ ადმინისტრატორი ხედავს ამას).';
+$lang['No user to send notifications by mail.'] = 'არ არიან მომხმარებლები, რომ გაუგზავნოთ სეტყობინება ფოსტით..';
+$lang['New photos added'] = 'დამატებულია ახალი ელემენტი';
+$lang['Subscribe to notification by mail'] = 'ხელმოწერა ფოსტით შეტყობინებაზე';
+$lang['Unsubscribe from notification by mail'] = 'ხელმოწერის გაუქმება ფოსტით შეტყობინებაზე';
+$lang['Parameter'] = 'პარამეტრები';
+$lang['Continue processing treatment'] = 'გავაგრძელოთ მიმართვის დამუშავება';
+$lang['Complementary mail content'] = 'წერილის დამატებითი შემადგენლობა';
+$lang['Add detailed content'] = 'დავამატოთ დამატებითი შემადგენლობა';
+$lang['Send mail as'] = 'გავაგზავნოთ წერილი';
+$lang['Send mail to users'] = 'გაუგზავნოთ წერილი მომხმარებელს';
+$lang['Send'] = 'გაგზავნა';
+$lang['Options'] = 'პარამეტრები';
+$lang['Send'] = 'გაგზავნა';
+$lang['Subscribed'] = 'დასაგზავნთა სიაში';
+$lang['Subscribe'] = 'დაგზავნის სია';
+$lang['Parameters'] = 'პარამეტრები';
+$lang['Select recipients'] = 'ავირჩიოთ მიმღებები';
+$lang['Subscribe/unsubscribe users'] = 'მონაწილეთა დამატება/წაშლა დაგზავნის სიაში';
+$lang['Unsubscribed'] = 'არ არის დაგზავნის სიაში';
+$lang['%d parameter was updated.'] = '%d პარამეტრი განახლებულია.';
+$lang['%d parameters were updated.'] = '%d პარამეტრი განახლებულია.';
+$lang['%d user was not updated.'] = '%d მომხმარებელი არ არის განახლებული.';
+$lang['%d users were not updated.'] = '%d მომხმარებელი არ არის განახლებული.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Пользователь %s [%s] წაშლილია დაგზავნის სიიდან.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Пользователь %s [%s] დამატებულია დაგზავნის სიაში.';
+$lang['%d user was updated.'] = '%d მომხმარებელი შეცვლილია.';
+$lang['%d users were updated.'] = '%d მომხმარებელი შეცვლილია.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'მომხმარებელი %s [%s] არ არის წაშლილი დაგზავნის სიიდან.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'მომხმარებელი %s [%s] არ არის დამატებული დაგზავნის სიაში.';
+$lang['User %s [%s] added.'] = 'მომხმარებელი %s [%s] დამატებულია.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'ყურადღება: დაგზავნის სიაში დამატება/წაშლისას მომხმარებლებს გეაგზავნებათ შეტყობინება';
+$lang['Send mail on HTML format'] = 'გავაგზავნოთ წერილი HTML ფორმატში';
+$lang['Include display of recent photos grouped by dates'] = 'ჩავრთოთ თარიღის მიხედვით დაწყობილი ბოლო ფოტოების გამოსახვა';
+$lang['Available only with HTML format'] = 'შესაძლებელია მხოლოდ HTML ფორმატში';
+$lang['no write access'] = 'ჩაწერაზე დაშვება არ არის';
+$lang['Permissions'] = 'დაშვებები';
+$lang['private'] = 'პრივატული';
+$lang['Properties'] = 'Свойства';
+$lang['public'] = 'საერთო';
+$lang['Purge never used notification feeds'] = 'გავწმინდოთ გამოუყენებელი შეტყობინებების არხები';
+$lang['Purge sessions'] = 'გავწმინდოთ სესიები';
+$lang['randomly represented'] = 'შემთხვევითი წარმომადგენელი';
+$lang['registration date'] = 'რეგისტრაციის თარიღი';
+$lang['clean'] = 'გავწმინდოთ';
+$lang['remove remote listing.xml file'] = 'წავშალოთ მოშორებული ფაილი listing.xml';
+$lang['generate listing'] = 'შევქმნათ ლისტინგი';
+$lang['generate file listing.xml on remote site'] = 'შევქმნათ ფაილი listing.xml სხვა დაშორებულ საიტზე';
+$lang['Create this site'] = 'შევქმნათ ეს საიტი';
+$lang['A local listing.xml file has been found for'] = 'ლოკალური ფაილი listing.xml file მოიძებნა ';
+$lang['read local listing.xml and update'] = ' წავიკითხოთ ლოკალური ფაილი listing.xml და განვაახლოთ ';
+$lang['test'] = 'ტესტი';
+$lang['test this remote site'] = 'დავტესტოთ ეს დაშორებული საიტი';
+$lang['remove tags'] = 'წავშალოთ სიტყვები';
+$lang['Repair and optimize database'] = 'მონაცემთა ბაზის გასწორება და ოპტიმიზაცია';
+$lang['selection'] = 'აღნიშნულები';
+$lang['set to'] = 'შევცვალოთ';
+$lang['singly represented'] = 'აღნიშნული წარმომადგენელი';
+$lang['This site already exists'] = 'ასეთი საიტი უკვე არის';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'შევქმნათ ახალი საიტი: (ჩაწერეთ URL  create_listing_file.php -ში)';
+$lang['created'] = 'შექმნილია';
+$lang['delete'] = 'წაშლილია';
+$lang['delete this site and all its attached elements'] = 'წავშალოთ ეს საიტი და ყველა მიმაგრებული ელემენტი';
+$lang['an error happened'] = 'მოხდა შეცდომა';
+$lang['file create_listing_file.php on remote site was not found'] = 'ფაილი create_listing_file.php არ მოიძებნა დაშორებულ საიტზე';
+$lang['Local'] = 'ლოკალური';
+$lang['Remote'] = 'დაშორებული';
+$lang['update the database from files'] = 'განვაახლოთ მონაცემების გბაზა ფაილებიდან';
+$lang['status'] = 'სტატუსი';
+$lang['Directory'] = 'ფოლდერი';
+$lang['sub-albums'] = 'ქვეკატეგორიები';
+$lang['Synchronize metadata'] = 'მეტამონაცემების სინქრონიზაცია';
+$lang['target'] = 'შევცვალოთ';
+$lang['Thumbnail'] = 'მინიატურა';
+$lang['title'] = 'სათაური';
+$lang['Album list management'] = 'კატეგორიების მართვა';
+$lang['Piwigo configuration'] = ' PhpWebGallery მართვა';
+$lang['Edit album'] = 'კატეგორიების რედაქტირება';
+$lang['Group management'] = 'ჯგუფების მართვა';
+$lang['User list'] = 'მომხმარებლების სია';
+$lang['Edit photo information'] = 'შევცვალოთ ინფორმაცია ფოტოზე';
+$lang['Thumbnail creation'] = 'მინიატურების შექმნა';
+$lang['Database synchronization with files'] = 'მონაცემთა ბაზის სინქრონიზაცია ფაილებთან';
+$lang['all'] = 'ყველა';
+$lang['photos without thumbnail (jpeg and png only)'] = 'ფოტოები მინიატურების გარეშე (მხოლოდ jpeg და png)';
+$lang['height must be a number superior to'] = 'სიმაღლე უნდა იყოს მეტი რიცხვი';
+$lang['width must be a number superior to'] = 'სიგანე უნდა იყოს მეტი რიცხვი';
+$lang['for the file format'] = 'ფაილის ფორმატისათვის';
+$lang['No missing thumbnail'] = 'მინიატურები აქვს ყველა ფოტოს';
+$lang['Photo unreachable or no support'] = 'ფოტო მიუწვდომელია ან არ არის მისი ფორმატის მხარდაჭერა';
+$lang['GD version'] = 'ვერსია GD';
+$lang['generated in'] = 'გენერირებულია';
+$lang['Results of miniaturization'] = 'მინიატურიზაციის რეზულტატი';
+$lang['General statistics'] = 'საერთო სტატისტიკა';
+$lang['max time'] = 'მაქსიმალური დრო';
+$lang['average time'] = 'საშუალო დრო';
+$lang['min time'] = 'მინიმალური დრო';
+$lang['number of miniaturized photos'] = 'შემცირებული ფოტოების რაოდენობა';
+$lang['total time'] = 'საერთო დრო';
+$lang['for this file format'] = 'ამ ფაილის ფორმატისათვის';
+$lang['unit mode'] = 'ერთეული რეჟიმი';
+$lang['Unlocked'] = 'ბლოკის მოხსნა';
+$lang['unset'] = 'გავასუფთაოთ';
+$lang['Update albums informations'] = 'განვაახლოთ ინფორმაცია კატეგორიებზე';
+$lang['Update photos information'] = 'განვაახლოთ ინფორმაცია ფოტოებზე';
+$lang['Synchronize'] = 'სინქრონიზაცია';
+$lang['reduce to single existing albums'] = 'შევამოწმოთ მხოლოდ კატეგორია';
+$lang['Choose an option'] = 'აირჩიეთ პარამეტრები';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'ვნახოთ ინფორმაციის მაქსიმუმი (დამატებული კატეგორიები და ფოტოები, წაშლილი ფოტოები და ელემენტები)';
+$lang['Piwigo version differs on the remote site'] = 'PhpWebGallery ვერსია განსხვავდება დაშორებულ სერვერზე';
+$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = 'ვერსიები create_listing_file.php დაშორებულ სერვერზე და PhpWebGallery უნდა იყოს ერთი და იგივე';
+$lang['listing.xml file was not found'] = 'ფაილი listing.xml არ მოიძებნა';
+$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = 'ფაილი listing.xml არ მოიძებნა დაშორებულ საიტზე.ეს ფაილი იქმნება საიტების მართვის სისტემაში "შევქმნათ ლისტინგი" ბრძანების არჩევისას';
+$lang['Error list'] = 'შეცდომების სია';
+$lang['Errors caption'] = 'შეცდომების განმარტება';
+$lang['Detailed informations'] = 'დეტალური ინფორმაცია';
+$lang['File/directory read error'] = 'შეცდომია ფაილის/პაპკის კითხვისას';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'ფაილთან ან ფოლდერთან დაკავშირება არ მოხერხდა.(შესაძლებელია არ გაქვთ დაშვების უფლება ან მათთან დაშვება აკრძალულია)';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'ფაილის ამ ტიპისათვის საჭიროა მინიატურა.მინიატურები უნდა განათავსოთ ქვეფოლდერში  "thumbnail" კატეგორიის ფოლდერში. მინიატურის ფაილის სახელი უნდა იწყებოდეს კონფიგურაციის დროს მითითებული პრეფიქსით,ხოლო მისი გაფართოება უნდა იყოს ერთ-ერთი ქვემოთ ჩამოთვლილთაგან:';
+$lang['missing thumbnail'] = 'მინიატურები არ არის';
+$lang['albums deleted in the database'] = 'კატეგორია წაშლილია მონაცემთა ბაზიდან';
+$lang['photos deleted from the database'] = 'ელემენტი წაშლილია მონაცემთა ბაზიდან';
+$lang['photos candidates for metadata synchronization'] = 'სურათი მეტამონაცემების სინქრონიზაციისათვის';
+$lang['photos informations synchronized with files metadata'] = 'ინფორმაცია ელემენტებზე სინქრონირებულია ფაილების მეტამონაცემებთან';
+$lang['errors during synchronization'] = 'სინქრონიზაციის შეცდომები';
+$lang['albums added in the database'] = 'კატეგორიები დამატებულია მონაცემთა ბაზაში';
+$lang['photos added in the database'] = 'ელემენტები დამატებულია მონაცემთა ბაზაში';
+$lang['photos updated in the database'] = 'ელემანტები განახლებულია მონაცემთა ბაზაში';
+$lang['Search for new images in the directories'] = 'ახალი ფოტოების ძებნა პაპკებში';
+$lang['added'] = 'დამატებულია';
+$lang['deleted'] = 'წაშლილია';
+$lang['Metadata synchronization results'] = 'მეტამონაცემების სინქრონიზაციის შედეგები';
+$lang['only perform a simulation (no change in database will be made)'] = 'მხოლოდ ტესტირება (არ შევიტანოთ ცვლილებები მონაცემთა ბაზაში)';
+$lang['Simulation'] = 'ტესტი';
+$lang['directories + files'] = 'ფაილები და ფოლდერები';
+$lang['only directories'] = 'მხოლოდ ფოლდერები';
+$lang['synchronize files structure with database'] = 'ფაილების სტრუქტურის სინქრონიზაცია მონაცემთა ბაზასთან';
+$lang['synchronize files metadata with database photos informations'] = 'ფაილების მეტამონაცემების სინქრონიზაცია მონაცემთა ბაზასთან';
+$lang['even already synchronized photos'] = 'ყველა, ადრე სინქრონიზებულის ჩათვლით';
+$lang['Used metadata'] = 'გამოYენებული მეტამონაცემები';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'ფაილების ან ფოლდერების სახელი უნდა შედგებოდეს ასოების,ციფრების "-", "_" და "." სგან';
+$lang['wrong filename'] = 'ფაილის არასწორი სახელი';
+$lang['Upload'] = 'Зატვირთვა';
+$lang['user "%s" added'] = 'მომხმარებელი "%s" დამატებულია';
+$lang['User status'] = 'მომხმარებლის სტატუსი';
+$lang['user_status_admin'] = 'ადმინისტრატორი';
+$lang['user_status_generic'] = 'საერთო';
+$lang['user_status_guest'] = 'სტუმარი';
+$lang['user_status_normal'] = 'მომხმარებელი';
+$lang['user_status_webmaster'] = 'ვებდიზაინერი';
+$lang['Users'] = 'მომხმარებლები';
+$lang['Virtual album'] = 'ვირტუალური კატეგორია';
+$lang['Waiting'] = 'მოცდის პროცესში';
+$lang['default'] = 'ძირითადად';
+$lang['Toggle \'default group\' property'] = 'შევქმათ/მოვაშოროთ  \'ძირითადად\'';
+$lang['Advanced features'] = 'გაფართოებული ფუნქციები';
+$lang['Specials'] = 'სპეც ფუნქციები';
+$lang['Overall'] = 'ყველა';
+$lang['Year'] = 'წელი';
+$lang['Month'] = 'თვე';
+$lang['Day'] = 'დღე';
+$lang['Pages seen'] = 'გვერდია ნანახი';
+$lang['Time'] = 'დრო';
+$lang['User'] = 'მომხმარებელი';
+$lang['IP'] = 'IP';
+$lang['Element'] = '';
+$lang['Section'] = 'განყოფილება';
+$lang['Save page visits by guests'] = 'შევინახოთ სტუმრების მიერ ნანახი გვერდები';
+$lang['Save page visits by users'] = 'შევინახოთ მომხმარებლის მიერ ნანახი გვერდები';
+$lang['Save page visits by administrators'] = 'შევინახოთ ადმინისტრატორის მიერ ნანახი გვერდები';
+$lang['Properties'] = 'თვისება';
+$lang['An information email was sent to group "%s"'] = 'საინფორმაციო წერილი გაგზავნილია "%s" ჯგუფისთვის';
+$lang['Send an information email to group members'] = 'გავაგზავნოთ საინფორმაციო წერილი ჯგუფისთვის';
+$lang['Group'] = 'ჯგუფი';
+$lang['[%s] Visit album %s'] = '[%s] გიწვევთ %s კატეგორიაში';
+$lang['Hello,'] = 'გამარჯობა,';
+$lang['See you soon.'] = 'ნახვამდისД.';
+$lang['Discover album:'] = 'მობრძანდით კატეგორიში:';
+$lang['Mail content'] = 'შინაარსი';
+$lang['none'] = 'არა';
+$lang['high'] = 'დიდი';
+$lang['other'] = 'სხვა';
+$lang['Element type'] = 'ელემენტის ტიპი';
+$lang['User'] = 'მომხმარებელი';
+$lang['Image id'] = 'ფოტოს id';
+$lang['Summary'] = 'სუმარულად';
+$lang['%d line filtered'] = '%d ხაზი გაფილტრულია';
+$lang['%d lines filtered'] = '%d ხაზი გაფილტრულია';
+$lang['%d guest'] = '%d სტუმარი';
+$lang['%d guests'] = '%d სტუმრები';
+$lang['Hour'] = 'საათი';
+$lang['guest'] = 'სტუმარი';
+$lang['default values'] = 'ძირითAდი მნიშვნელობა';
+$lang['High filesize'] = 'ფაილის დიდი ზომა';
+// --------- Starting below: New or revised $lang ---- from version 1.7.1
+$lang['Guest cannot be deleted'] = 'შტუმრის წაშლა არ შეიძლება';
+$lang['Default user cannot be deleted'] = 'ძირითადი მომხმარებელის წაშლა არ შეიძლება';
+$lang['Purge history detail'] = 'გავასუფთაოთ ისტორია';
+$lang['Purge history summary'] = 'გავასუფთაოთ მთელი ისტორია';
+$lang['Check integrity'] = 'შესაბამისობის შემოწმება';
+$lang['Anomaly'] = 'გაუმართაობა';
+$lang['Correction'] = 'კორექტირება';
+$lang['Automatic correction'] = 'ავტომატური კორექტირება';
+$lang['Impossible automatic correction'] = 'ავტომატური კორექტირება შეუძლებელია';
+$lang['Correction applied with success'] = 'კორექტირებამ წარმატებით ჩაიარა';
+$lang['Correction applied with error'] = 'კორექციამ შეცდომებით ჩაიარა';
+$lang['%d anomaly has been detected.'] = 'აღმოჩენილია %d გაუმართაობა.';
+$lang['%d anomalies have been detected.'] = 'აღმოჩენილია %d გაუმართაობები.';
+$lang['%d anomaly has been corrected.'] = 'კორექტირებულია %d გაუმართაობა.';
+$lang['%d anomalies have been detected corrected.'] = 'კორექტირებულია %d გაუმართაობები.';
+$lang['%d anomaly has not been corrected.'] = 'არ არის კორექტირებული %d გაუმართაობა.';
+$lang['%d anomalies have not been corrected.'] = 'არ არის კორექტირებული %d გაუმართაობები.';
+$lang['Go to %s or %s for more informations'] = 'ნახეთ %s ან %s დამატებითი ინფორმაციის მისაღებად';
+$lang['the forum'] = 'ფორუმი';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'მნიშვნელობა %s ფაილში არა სწორია,რადგან exif მხარდაჭერა არაა';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s საჭიროა გათიშოთ ფაილში config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'მომხმარებლის სტატუსი "სტუმარი" აღარ არსებობს';
+$lang['Main "guest" user status is incorrect'] = 'მომხმარებლის სტატუსი "სტუმარი" არა კორექტულია';
+$lang['Default user does not exist'] = 'ძირითადი მომხმარებელი აღარ არსებობს';
+$lang['Main "webmaster" user does not exist'] = 'მომხმარებელი "ვებდიზაინერი" აღარ არსებობს';
+$lang['Main "webmaster" user status is incorrect'] = 'მომხმარებლის სახელი "ვებდიზაინერი" არა კორექტულია';
+$lang['User "%s" created with "%s" like password'] = 'მომხმარებელი "%s" შექმნილია პაროლით "%s"';
+$lang['Status of user "%s" updated'] = 'მომხმარებელი "%s" სტატუსი განახლებულია';
+$lang['add new photos to caddie'] = 'დავამატოთ ახალი ფოტოები კალათაში';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = 'არ ვანახოთ';
+$lang['Classic display'] = 'კლასიკური სახე';
+$lang['Hoverbox display'] = 'სახე Hoverbox';
+$lang['Mail address is obligatory for all users'] = 'ელ. ფოსტის მისამართი აუცილებელია ყველა მომხმარებლისათვის';
+$lang['Minimum privacy level'] = 'დაცვის მინიმალური დონე';
+$lang['Privacy level'] = 'დაცვის დონე';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'კონტაქტი';
+$lang['Level 2'] = 'მეგობრები';
+$lang['Level 4'] = 'ოჯახი';
+$lang['Level 8'] = 'ადმინისტრაცია';
+$lang['Reinitialize check integrity'] = 'გავიმეოროთ მთლიანობის შემოწმება';
+$lang['Check all'] = 'ავღნიშნოთ ყველა';
+$lang['Uncheck all'] = 'მოვხსნათ ყველა აღნიშვნა';
+$lang['Check automatic corrections'] = 'აღვნიშნოთ ავტოკორექცია';
+$lang['Apply selected corrections'] = 'გამოვიყენოთ აღნიშნული კორექციები';
+$lang['Ignore selected anomalies'] = 'აღნიშნული გაუმართაობების იგნორირება';
+$lang['Refresh'] = 'განვაახლოთ';
+$lang['The anomaly will be ignored until next application version'] = 'გაუმართაობები იგნორირებული იქნება სკრიპტის შემდგომი ვერსიის დაყენებამდე';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'გაუმართაობის კორექტირება გათიშავს მათ იგნორირებას';
+$lang['%d anomaly has been ignored.'] = '%d გაუმართაობა იგნორირებულია.';
+$lang['%d anomalies have been ignored.'] = 'იგნორირებული იქნა გაუმართაობები: %d';
+$lang['Plugins which need upgrade'] = 'პლაგინები, რომლებიც ითხხოვენ განახლებას';
+$lang['Plugin list'] = 'პლაგინების სია';
+$lang['Check for updates'] = 'განახლების შემოწმება';
+$lang['Other plugins'] = 'სხვა პლაგინები';
+$lang['Last revisions'] = 'ბოლო ცვლილებები';
+$lang['Delete'] = 'წავშალოთ';
+$lang['Are you sure you want to delete this plugin?'] = 'დარწმუნებული ხართ, რომ გინდათ წაშალოთ ეს პლაგინი?';
+$lang['Are you sure you want to install this plugin?'] = 'დარწმუნებული ხართ, რომ გინდათ დააყენოთ ეს პლაგინი?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'დარწმუნებული ხართ, რომ გინდათ განაახლოთ? შეამოწმეთ, ხომ არ ჭირდება ამ ვერსიას დეინსტალაცია.';
+$lang['%s has been successfully upgraded.'] = '%s წარმატებით განახლდა.';
+$lang['Plugin has been successfully copied'] = 'პლაგინი წარმატებით იქნა კოპირებული';
+$lang['You might go to plugin list to install and activate it.'] = 'შეგიძლიათ გადახვიდეთ პლაგინების სიასთან მის დასაყენებლად და აქტივაციისათვის.';
+$lang['Can\'t create temporary file.'] = 'შეუძლებელია დროებითი ფაილის შექმნა.';
+$lang['Can\'t download archive.'] = 'შეუძლებელია არქივის ჩამოტვირთვა.';
+$lang['Can\'t read or extract archive.'] = 'შეუძლებელია არქივის წაკითხვა.';
+$lang['An error occured during extraction (%s).'] = 'შეცდომაა გახსნის პროცესშიО (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'გთხოვთ, შეამოწმოთ ფოლდერ "plugins"-ის და მისი ქვეფოლდერების უფლებები (CHMOD).';
+$lang['Can\'t connect to server.'] = 'სერვერთან დაკავშირება შეუძლებელია.';
+$lang['Purge compiled templates'] = 'გავასუფთაოთ შექმნილი შაბლონები';
+$lang['Upload'] = 'ატვირთვები';
+$lang['ACCESS_0'] = 'თავისუფალი დაშვება';
+$lang['ACCESS_1'] = 'დაშვებულია ყველასთვის';
+$lang['ACCESS_2'] = 'დაშვებულია რჩეულებისათვის';
+$lang['ACCESS_3'] = 'დაშვებულია ადმინისტრატორებისთვის';
+$lang['ACCESS_4'] = 'დაშვებულია ვებდიზაინერისათვის';
+$lang['ACCESS_5'] = 'დაუშვებელია';
+$lang['Support'] = 'მხარდაჭერა';
+$lang['Documentation'] = 'დოკუმენტაცია';
+$lang['A new version of Piwigo is available.'] = 'ხელმისაწვდომია Piwigo-ს ახალი ვერსია.';
+$lang['Piwigo Administration'] = 'Piwigo-ს ადმინისტრაცია';
+$lang['Piwigo version'] = 'Piwigo-ს ვერსია';
+$lang['You are running the latest version of Piwigo.'] = 'გაშვებულია Piwigo-ს ბოლო ვერსია.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'დაყენებული ვერსია %s [%s] შეუსაბამოა [%s] ვერსიასთან';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'რათა გამოიყენოთ სკრიპტის მტელი შესაძლებლობები, განაახლეთ სისტემა, წინააღმდეგ შემთხვევაში სკრიპტმა შესაძლოა შეცდომებით იმუშაოს';
+$lang['Deleted on'] = 'წაშლილია';
+$lang['Last hit'] =  'ბოლო ნაჩვენები';
+$lang['GD library is missing'] = 'GD ბიბლიოთეკა არ არსებობს';
+$lang['Templates'] = 'შაბლონები';
+$lang['Extend for templates'] = 'გაფართოებები შაბლონებისათვის';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'შევცვალოთ ორიგინალი შაბლონები მომხმარებლის შაბლონებით ქვეფოლდერიდანtemplate-extension';
+$lang['Replacers (customized templates)'] = 'შემცვლელი (მომხმარებლის შაბლონი)';
+$lang['Original templates'] = 'ორიგინალი შაბლონი';
+$lang['Optional URL keyword'] = 'ოპციონალური URL საკვანძო სიტყვა';
+$lang['Templates configuration has been recorded.'] = 'თარგების კონფიგურაცია ჩაწერილია.';
+$lang['All optimizations have been successfully completed.'] = 'ყველა ოპტიმიზაციამ წარმატებით ჩაიარა.';
+$lang['Optimizations have been completed with some errors.'] = 'ოპტიმიზაცია დასრულდა შეცდომებით.';
+$lang['Modify information'] = 'Modify information';
+$lang['nothing'] = 'არაფერი';
+$lang['overrides existing values with empty ones'] = 'შევცვალოთ არსებული მნიშვნელობები ცარიელით';
+$lang['Manage photo ranks'] = 'ფოტოების მართვის წესი';
+$lang['Edit ranks'] = 'შევცვალოთ წესი';
+$lang['No photo in this album'] = 'ცარიელი კატეგორია';
+$lang['Images manual order was saved'] = 'ფოტოებისთვის აღნიშნული წესი შენახულია';
+$lang['ranks'] = 'წესი';
+$lang['Drag to re-order'] = 'გადმოიტანეთ რათა შეცვალოთ წესი';
+$lang['Quick Local Synchronization'] = 'ჩქარი სინქრონიზაცია';
+$lang['No photo can be deleted'] = 'არ არის ფოტო წასაშლელად';
+$lang['Delete selected photos'] = 'წავშალოთ არჩეული ფოტოები';
+$lang['%d photo was deleted'] = '%d ფოტო წაშლილია';
+$lang['%d photos were deleted'] = '%d ფოტო წაშლილია';
+$lang['Unable to check for upgrade.'] = 'შეუძლებელია განახლების შემოწმება.';
+$lang['Date'] = 'თარიღი';
+$lang['Operation in progress'] = 'მიმართვის დამუშავება.';
+$lang['Please wait...'] = 'გთხოვთ მოიცადოთ...';
+$lang['Downloads'] = 'ჩამოტვირთვები';
+$lang['Released on'] = 'გამოშვება';
+$lang['Number of downloads'] = 'ჩამოტვირთვების რაოდენობა';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo საინფორმაციო დაგზავნა';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'იყავით კავშირზე პროექტ Piwigo სთან ერთად, თქვენ მიიღებთ შეტყობინებას როგორც კი გამოვა ახალი გამოცემა (ზოგჯერ წერილი შეიცავს შეცდომების გამოსწორებას, უსაფრთხოების ზომების შესახებ და თქვენ უნდა იცოდეთ ეს), ან როცა იქნება რამე მნიშვნელოვანი მოვლენა ან პროექტი. ეს მხოლოდ რამდენიმე წერილია წელიწადში.';
+$lang['Subscribe %s'] = 'ხელმოწერა %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'ხელმოწერა %s Piwigo საინფორმაციო დაგზავნაზე';
+$lang['Purge search history'] = 'გავასუფთაოთ ძებნის ისტორია';
+$lang['Hide'] = 'დავფაროთ';
+$lang['Password is missing. Please enter the password.'] = 'პაროლი არა სწორია. გთხოვთ გაიმეოროთ.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'პაროლის დადასტურება არ არის. გთხოვთ დაადასტურეთ არჩეული პაროლი.';
+$lang['Allow users to edit their own comments'] = 'ნება დავრთოთ მომხმარებლებს თავიანთი კომენტარის რედაქტირებაზე';
+$lang['Allow users to delete their own comments'] = 'ნება დავრთოთ მომხმარებელს წაშალოს თავისი კომენტარი';
+$lang['Email administrators when a comment is modified'] = 'შევატყობინოთ ადმინისტრატორს ელ.ფოსტით, როცა კომენტარი შეიცვლება';
+$lang['Email administrators when a comment is deleted'] = 'შევატყობინოთ ადმინისტრატორს ელ.ფოსტით, როცა კომენტარი წაიშლება';
+$lang['Cannot delete the old permalink !'] = 'ძველი მუდმივი ბმული არ შეიძლება წაიშალოს!';
+$lang['Hit'] = 'პოპულარული';
+$lang['Tools'] = 'ინსტრუმენტები';
+$lang['Photos'] = 'ფოტოები';
+$lang['Themes'] = 'თემები';
+$lang['Instructions to use Piwigo'] = 'Piwigo მოხმარების ინსტრუქცია';
+$lang['Installed Themes'] = 'დაყენებული თემები';
+$lang['Add New Theme'] = 'დავამატოთ ახალი თემა';
+$lang['Forbid this theme to users'] = 'აუკრზალოთ მომხმარებელს ამ თემის გამოყენება';
+$lang['Set as default theme for unregistered and new users'] = 'დავაყენოთ ეს თემა ახალი და დაურეგისტრირებელი მომხმარებელისათვის ძირითადად';
+$lang['unknown'] = 'უცნობია';
+$lang['Upload Photos'] = 'ავტვირთოთ ფოტოები';
+$lang['Drop into album'] = 'ავტვირთოთ კატეგორიაში';
+$lang['+ Add an upload box'] = '+ დავამატოთ ასატვირთი ველი';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'შექმენით "%s" კატალოგი თქვენს მიერ დაყენებული Piwigo-ს ფუძეში';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'მიეცით ჩაწერაზე დაშვება (chmod 777)  "%s" კატალოგს, თქვენს მიერ დაყენებული Piwigo-ს ფუძეში';
+$lang['existing album'] = 'არსებული კატეგორია';
+$lang['create a new album'] = 'შევქმნათ ახალი კატეგორია';
+$lang['Album name'] = 'კატეგორიის სახელი';
+$lang['Album "%s" has been added'] = 'კატეგორია "%s" დამატებულია';
+$lang['Uploaded Photos'] = 'ატვირთული ფოტოები';
+$lang['%d photos uploaded'] = '%d ფოტოები ატვირთულია';
+$lang['Privacy level set to "%s"'] = 'დავაყენოთ დაშვების უფლება "%s"';
+$lang['Album "%s" now contains %d photos'] = 'კატეგორია "%s" შეიცავს ამჟამად %d ფოტოს';
+$lang['Manage this set of %d photos'] = 'ამ კრებულის რედაქტირება, შემცველობით %d Fოტო';
+$lang['Select files'] = 'ავირჩიოთ ფაილები';
+$lang['Everybody'] = 'ყველა';
+$lang['Who can see these photos?'] = 'ვის შეუძლია ნახოს ეს ფოტოები?';
+$lang['Settings'] = 'პარამეტრები';
+$lang['Resize'] = 'ზომების შეცვლა';
+$lang['Maximum Width'] = 'მაქსიმალური სიგანე';
+$lang['pixels'] = 'პიქსელი';
+$lang['Maximum Height'] = 'მაქსიმალური სიმაღლე';
+$lang['Image Quality'] = 'ფოტოს ხარისხი';
+$lang['Save Settings'] = 'შევინახოთ პარამეტრები';
+$lang['Your configuration settings are saved'] = 'თქვენი კონფიგურაცია შენახულია';
+$lang['Active Themes'] = 'აქტიური თემები';
+$lang['Add write access to the "%s" directory'] = 'დაამატეთ ჩაწერის უფლება "%s" დირექტორიისათვის';
+$lang['Administration Home'] = 'ადმინისტრირება';
+$lang['Change Admin Colors'] = 'შევცვალოთ ადმინისტრირების პანელის ფერები';
+$lang['Delete this theme'] = 'წავშალოთ ეს თემა';
+$lang['Directory does not exist'] = 'დირექტორია არ არსებობს';
+$lang['Download,'] = 'ჩამოვტვირთოთ,';
+$lang['FTP + Synchronization'] = 'FTP + სინქრონიზაცია';
+$lang['Get Support on Piwigo Forum'] = 'მიმართეთ დახმარებისათვის Piwigo-ს ფორუმს';
+$lang['Help Me'] = 'დამეხმარეთ';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'ამ თემის აქტივაცია არ შეიძლება, რადგან მშობლიური თემა %s არ არსებობს';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'ამ თემის წაშლა არ შეიზლება, რადგან სხვა თემები %s დამოკიდებულნი არიან მასზე';
+$lang['Inactive Themes'] = 'არა აქტიური თემები';
+$lang['Install on your computer,'] = 'დააყენეთ თქვენს კომპიუტერზე,';
+$lang['Make this theme available to users'] = 'გავხადოთ ეს თემა მომხმარებლებისთვის ხელმისაწვდომი';
+$lang['Page end'] = 'გვერდის დასასრული';
+$lang['Piwigo Uploader'] = 'Piwigo ამტვირთავი';
+$lang['Read Piwigo Documentation'] = 'წაიკითხეთ Piwigo დოკუმენტაცია';
+$lang['Start pLoader and add your photos.'] = 'გახსენით pLoader და დაამატეთ თქვენი ფოტოები.';
+$lang['Switch to clear or dark colors for administration'] = 'ღია და მუქი ტონების არჩევა ადმინისტრირების პანელისათვის';
+$lang['Theme has been successfully installed'] = 'თემა წარმატებით არის დაყენებული';
+$lang['Visit Gallery'] = 'ნახეთ გალერეა';
+$lang['Visit Piwigo project website'] = 'ნახეთ პროექტ Piwigo-ს საიტი ';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader ცვლის <em>Piwigo ამტვირთავს</em>. pLoader-ის მეშვეობით თქვენ შეგიძლიათ ლოკალურად მოამზადოთ ფოტოები და და ატვირთოთ თქვენს Piwigo ფოტო გალერეაში.';
+$lang['Guest Settings'] = 'სტუმრის პარამეტრები';
+$lang['Main Page'] = 'მთავარი გვერდი';
+$lang['Photo Page'] = 'ფოტოების გვერდი';
+$lang['Activate Navigation Bar'] = 'სანავიგაციო პანელის აქტივაცია';
+$lang['Activate Navigation Thumbnails'] = 'მინიატურებში ნავიგაციის აქტივაცია';
+$lang['Activate icon "%s"'] = 'გავააქტიუროთ ხატულა "%s"';
+$lang['Activate field "%s"'] = 'გავააქტიუროთ ველი "%s"';
+$lang['Photo Properties'] = 'ფოტოს თვისება';
+$lang['Allow user customization'] = 'ნება დავრთოთ მომხმარებლებს შეცვალონ გალერეის სახე';
+$lang['Languages'] = 'ენები';
+$lang['Installed Languages'] = 'დაყენებული ენები';
+$lang['Add New Language'] = 'დავამატოთ ახალი ენა';
+$lang['Language has been successfully installed'] = 'ენა წარმატებით დაყენდა';
+$lang['Select:'] = 'ავირჩიოთ:';
+$lang['None'] = 'არც ერთი';
+$lang['Invert'] = 'გადავწიოთ';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'შეუძლებელია ამ თემის დეაქტივაცია, თქვენ ერთი თემა მაინც უნდა გქონდეთ.';
+$lang['Webmaster status is required.'] = 'საჭიროა ადმინისტრატორის სტატუსი.';
+$lang['Bound Theme'] = 'დაკავშირებული თემა';
+$lang['Allow rating'] = 'ნება დავრთოთ შეაფასონ';
+$lang['Select at least one comment'] = 'აირჩიეთ ერთი კომენტარი მაინც';
+$lang['Active Plugins'] = 'გავააქტიუროოთ პლაგინი';
+$lang['Inactive Plugins'] = 'პლაგინის დეაქტივაცია';
+$lang['Missing Plugins'] = 'დაკარგული პლაგინები';
+$lang['Uninstalled Plugins'] = 'წაშლილი პლაგინები';
+$lang['By %s'] = ' %s';
+$lang['Visit plugin site'] = 'ვეწვიოთ პლაგინის საიტს';
+$lang['Active Languages'] = 'გავააქტიუროთ ენები';
+$lang['Delete this language'] = 'წავსალოთ ეს ენა';
+$lang['Forbid this language to users'] = 'გავხადოთ ეს ენა მომხმარებლისათვის ხელმიუწვდომელი';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'შეუყძლებელია ამ ენის დეაქტივაცია, დააყენეთ ძირითად ენად სხვა მანამდე.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'შეუძლებელია ამ ენის დეაქტივაცია, თქვენ ერთი ენა მაინც უნდა გქონდეთ.';
+$lang['Inactive Languages'] = 'ენის დეაქტივაცია';
+$lang['Make this language available to users'] = 'გავხადოთ ეს ენა მომხმარებლებისათვის ხელმისაწვდომი';
+$lang['Set as default language for unregistered and new users'] = 'დავაყენოთ ეს ენა დაურეგისტრირებელი მომხმარებლებისათვის ძირითადად';
+$lang['Add Photos'] = 'ფოტოს დამატება';
+$lang['The following tag was deleted'] = 'შემდეგი ნიშნულები წაშლილია';
+$lang['Miscellaneous'] = 'სხვა და სხვა';
+$lang['Virtual Links'] = 'ვირტ.ბმულები';
+$lang['Templates configuration has been recorded.'] = 'შაბლონის კონფიგურაცის გადაწერილია.';
+$lang['Modify information'] = 'ინფორმაცია ცვლილებების შესახებ';
+$lang['There is no other language available.'] = 'არ არის სხვა ენები.';
+$lang['There is no other plugin available.'] = 'არ არის სხვა პლაგინები.';
+$lang['There is no other theme available.'] = 'არ არის სხვა თემები.';
+$lang['By rank'] = 'რეიტინგით';
+$lang['Manual order'] = 'დავალაგოთ ხელით';
+$lang['Add another set of photos'] = 'დავამატოთ ფოტოები';
+$lang['Order of menubar items has been updated successfully.'] = 'მენიუში განლაგების წესი წარმატებით შეიცვალა.';
+$lang['This theme was not designed to be directly activated'] = 'ამ თემაში არ არის გათვლილი პირდაპირი აქტივაცია';
+$lang['Who can see this photo?'] = 'ვის შეუძლია ამ ფოტოს ნახვა?';
+$lang['Pending Comments'] = 'კომენტარის მოლოდინში';
+$lang['Menu Management'] = 'მენიუ';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'თქვენს php.ini ფაილში, upload_max_filesize (%sB) მეტია ვიდრე post_max_size (%sB), თქვენ უნდა შეცვალოთ ეს პარამეტრი ';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif გაფართოება არ არის ხელმისაწვდომი, ადმინისტრატორმა უნდა გამორთოს exif–ის გამოყენება';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'ასატვირთი ფაილის ზომა აღემატება upload_max_filesize დირექტივას ფაილში php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'ატვირთული ფაილების ზომა აღემატება post_max_size დირექტივას ფაილში php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'ასატვირთი ფაილის ზომა აღემატება MAX_FILE_SIZE დირექტივას მითითებულს HTML ფორმაში';
+$lang['The uploaded file was only partially uploaded'] = 'ასატვირთი ფაილი მოლოდ ნაწილობრივ აიტვირთა';
+$lang['No file was uploaded'] = 'ფაილი არ არის ატვირთული';
+$lang['Missing a temporary folder'] = 'არ არსებობს დროებითი ფოლდერი';
+$lang['Failed to write file to disk'] = 'ფაილის დისკზე ჩაწერა არ მოხერხდა';
+$lang['File upload stopped by extension'] = 'ფაილის ატვირთვა შეჩერებულია გაფართოების გამო';
+$lang['Unknown upload error'] = 'უცნობი ატვირთვის შეცდომა';
+$lang['Error on file "%s" : %s'] = 'შეცდომაა ფაილში "%s" : %s';
+$lang['automatic order'] = 'ავტომატურად განლაგება';
+$lang['manual order'] = 'ხელით განლაგება';
+$lang['Albums automatically sorted'] = 'ალბომები ავტომატურად დალაგებულია';
+$lang['Batch Manager'] = 'სურათების მენეჯერი';
+$lang['include child albums'] = 'მოიცავს ბავშვის ალბომებს';
+$lang['Selection'] = 'არჩევა';
+$lang['Action'] = 'მოქმედება';
+$lang['Set author'] = 'ავტორი';
+$lang['Set title'] = 'სათაური';
+$lang['Set creation date'] = 'შექმნის თარიღი';
+$lang['Apply action'] = 'არჩევანის დადასტურება';
+$lang['on the %d selected photos'] = '%d მონიშნული ფოტო';
+$lang['%d of %d photos selected'] = '%d დან %d ფოტოა შერჩეული';
+$lang['No photo selected, %d photos in current set'] = 'ფოტო არ არის არჩეული, %d ფოტოა მიმდინარე კრებულში';
+$lang['All %d photos are selected'] = 'ყველა %d ფოტოა არჩეული';
+$lang['remove this filter'] = 'გამოვრთოთ ეს ფილტრი';
+$lang['predefined filter'] = 'წინასწარგანსაზღვრული ფილტრი';
+$lang['last import'] = 'ბოლო იმპორტი';
+$lang['with no virtual album'] = 'არა ვირტუალური ალბომი';
+$lang['Duplicates'] = 'დუბლიკატები';
+$lang['Add a filter'] = 'დავამატოთ ფილტრი';
+$lang['Remove all filters'] = 'გავაუქმოთ ყველა ფილტრი';
+$lang['Refresh photo set'] = 'განვაახლოთ ფოტოები';
+$lang['The whole page'] = 'მთელი გვერდი';
+$lang['The whole set'] = 'მთელი რიგი';
+$lang['No photo in the current set.'] = 'არ არის სურათი მიმდინარე ნაკრებში.';
+$lang['No photo selected, no action possible.'] = 'არ არის არჩეული არც ერთი ფოტო, მოქმედება შეუძლებელია.';
+$lang['Choose an action'] = 'აირჩიეთ მოქმედება';
+$lang['remove author'] = 'წავშალოთ ავტორი';
+$lang['Type here the author name'] = 'ჩაწერეთ აქ ავტორის სახელი';
+$lang['remove title'] = 'წავშალოთ სათური';
+$lang['Type here the title'] = 'ჩაწერეთ აქ სათაური';
+$lang['remove creation date'] = 'წავშალოთ შექმნის თარიღი';
+$lang['with no album'] = 'ალბომის გარეშე';
+$lang['with no tag'] = 'ტეგის გარეშე';
+$lang['Album photos associated to the following albums: %s'] = 'ალბომის ფოტო ასოცირებულია შემდეგ ალბომთან: %s';
+$lang['Delete orphan tags'] = 'დაობლებული ტეგების წაშლა';
+$lang['delete photo'] = 'ფოტოს წაშლა';
+$lang['Orphan tags deleted'] = 'დაობლებული ტეგები წაშლილია';
+$lang['Remove from caddie'] = 'Remove from caddie';
+$lang['Week starts on'] = 'კვირა იწყება';
+$lang['You have %d orphan tags: %s.'] = 'თქვენ გაქვთ %d დაობლებული ტეგი: %s.';
+$lang['Themes which need upgrade'] = 'თემები, რომელთაც სჭირდებათ განახლება';
+$lang['Languages which need upgrade'] = 'ენები, რომელთაც სჭირდება განახლება';
+$lang['All themes are up to date.'] = 'ყველა თემა განახლებულია.';
+$lang['All plugins are up to date.'] = 'ყველა პლაგინი განახლებულია.';
+$lang['All languages are up to date.'] = 'ყველა ენა განახლებულია.';
+$lang['Visit theme site'] = 'ეწვიეთ თემის ვებ გვერდს';
+$lang['Visit language site'] = 'ეწვიეთ ენის ვებ გვერდს';
+$lang['New Version'] = 'ახალი ვერსია';
+$lang['Obsolete Plugins'] = 'მოძველებული პლაგინები';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'გართხილება! ამ პლაგინს არ აქვს Piwigo–ს ამ ვერსიის მხარაჭერა.';
+$lang['Do you want to activate anyway?'] = 'თქვენ მაინც გინდათ გაააქტიუროთ?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ეს პლაგინი უკვე PIWIGO–ს ბირთვის ნაწილია! წაშალეთ იგი!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'შეცდომაა: ეს პლაგინი აკლია, მაგრამ იგი დაყენებულია! წაშალეთ იგი.';
+$lang['display'] = 'ნახვა';
+$lang['new'] = 'ახალი';
+$lang['No results'] = 'შედეგი არ არის';
+$lang['Searching...'] = 'ძიება...';
+$lang['Type in a search term'] = 'ჩაწერეთ მოსაძებნი სიტყვა';
+$lang['Learn more'] = 'გავიგოთ მეტი';
+$lang['Rate'] = 'შეფასება';
+$lang['Average rate'] = 'საშუალო ქულა';
+$lang['An error has occured during upgrade.'] = 'განახლების დროს მოხდა შეცდომა.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'ამოარქივების დროს მოხდა შეცდომა. გთხოვთ, შეამოწმეთ დაშვების უფლება piwigo–ს ფოლდერთან.<br><a href="%s">დაკლიკეთ, რათა ნახოთ ინფორმაცია შეცდომაზე</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ვერ იღებს განახლების ფაილებს სერვერიდან';
+$lang['Save Template Directory'] = 'შევინახოთ დირექტორიის შაბლონი';
+$lang['Dump Database'] = 'მონაცემთა ბაზის წაშლა';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'ჩავრთოთ ისტორიის მონაცემები (გაფრთხილება: შესაძლებელია სერვერზე მეხსიერების ლიმიტის  გადაჭარბება)';
+$lang['Unable to dump database.'] = 'შეუძლებელია მონაცემთა ბაზის წაშლა.';
+$lang['Update in progress... Please wait.'] = 'მიმდინარეობს განახლების პროცესი... გთხოვთ დაიცადოთ.';
+$lang['Update to Piwigo %s'] = 'განაახლეთ Piwigo %s';
+$lang['Two updates are available'] = 'ორი განახლებაა ხელმისაწვდომი';
+$lang['This is a minor update, with only bug corrections.'] = 'ეს მცირე განახლებაა, მხოლოდ შეცდომების შესწორება.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'ეს ძალიან დიდი განახლებაა <a href="%s">საინტერესო სიახლეებით</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'თემების და პლაგინების ნაწილი ჯერჯერობით არ არის ხელმისაწვდომი.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'თქვენ პირდაპირ შეგიძლიათ  Piwigo %s გადახვიდეთ,  Piwigo %s განახლების გარეშე(რეკომენდირებულია).';
+
+
+
+?>
Index: tags/2.4.0RC3/language/ka_GE/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/common.lang.php	(revision 14585)
@@ -0,0 +1,348 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: ქართული [GE]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=426
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Georgian';
+$lang_info['country'] = 'Georgia';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ge';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d კბ';
+$lang['%d album updated'] = '%d კატეგორიაა დამატებული';
+$lang['%d albums updated'] = 'დამატებული კატეგორიები: %d';
+$lang['%d comment to validate'] = '%d შესამოწმებელი კომენტარი';
+$lang['%d comments to validate'] = 'შესამოწმებელი კომენტარები: %d';
+$lang['%d new comment'] = '%d ახალი კომენტარი';
+$lang['%d new comments'] = 'ახალი კომენტარები: %d';
+$lang['%d comment'] = '%d კომენტარი';
+$lang['%d comments'] = 'კომენტარები: %d';
+$lang['%d hit'] = '%d ნახვა';
+$lang['%d hits'] = 'ნახვები: %d';
+$lang['%d new photo'] = '%d ახალი ელემენტი';
+$lang['%d new photos'] = '%d ახალი ელემენტები';
+$lang['%d new user'] = '%d ახალი მნახველი';
+$lang['%d new users'] = '%d ახალი მნახველები';
+$lang['About'] = 'საიტის ძრავი';
+$lang['All tags'] = 'ყველა სიტყვა';
+$lang['Any tag'] = 'ნებისმიერი სიტყვა';
+$lang['At least one listed rule must be satisfied.'] = 'ერთი წესი მაინც უნდა სრულდებოდეს.';
+$lang['Author'] = 'ავტორი';
+$lang['Albums'] = 'გალერეა';
+$lang['Album'] = 'გალერეა';
+$lang['Close this window'] = 'დავხუროთ ეს ფანჯარა';
+$lang['Complete RSS feed (photos, comments)'] = 'სრული RSS ლენტა (ფოტოები, კომენტარები)';
+$lang['Confirm Password'] = 'გაიმეორეთ პაროლი';
+$lang['Connection settings'] = 'დაკავშირების გასწორება';
+$lang['Login'] = 'ავტორიზაცია';
+$lang['Contact webmaster'] = 'ტექდახმარება';
+$lang['Create a new account'] = 'ახალი აკკაუნტის შექმნა';
+$lang['Created on'] = 'გადაღების დრო';
+$lang['Creation date'] = 'გადაღების დრო';
+$lang['Current password is wrong'] = 'არასწორი პაროლი';
+$lang['Dimensions'] = 'ზომები';
+$lang['Display'] = 'წესი';
+$lang['Each listed rule must be satisfied.'] = 'ყველა ჩამოთვლილი წესი უნდა შესრულდეს';
+$lang['Email address is missing. Please specify an email address.'] = 'ელ.ფოსტის მისამართი არ არის მითითებული';
+$lang['Email address'] = 'ელ.ფოსტის მისამართი ';
+$lang['Enter your personnal informations'] = 'მიუთითეთ პერსონალური მონაცემები';
+$lang['Error sending email'] = 'შეცდომა ელ.ფოსტის გაგზავნისას';
+$lang['File name'] = 'ფაილის სახელი';
+$lang['File'] = 'ფაილი';
+$lang['Filesize'] = 'ფაილის ზომა';
+$lang['Filter and display'] = 'გავფილტროთ და ვნახოთ';
+$lang['Filter'] = 'ფილტრი';
+$lang['Forgot your password?'] = 'დაგავიწყდათ პაროლი?';
+$lang['Go through the gallery as a visitor'] = 'შევიდეთ გალერეაში როგორც სტუმარი';
+$lang['Help'] = 'დახმარება';
+$lang['Identification'] = 'იდენტიფიკაცია';
+$lang['Photos only RSS feed'] = 'RSS ლენტი ფოტოებით';
+$lang['Keyword'] = 'ძირითადი სიტყვები';
+$lang['Links'] = 'ბმულები';
+$lang['N/A'] = 'გაურკვეველია';
+$lang['New on %s'] = 'ახალი %s';
+$lang['Notification'] = 'RSS-შეტყობინება';
+$lang['Number of items'] = 'რაოდენობა გვერდზე';
+$lang['Original dimensions'] = 'საწყისი ზომა';
+$lang['Password forgotten'] = 'პაროლი დაკარგულია';
+$lang['Password'] = 'პაროლი';
+$lang['Post date'] = 'გამოქვეყნების თარიღი';
+$lang['Posted on'] = 'გამოქვეყნების თარიღი';
+$lang['Profile'] = 'პროფილი';
+$lang['Quick connect'] = 'სწრაფი შესვლა';
+$lang['RSS feed'] = 'RSS ლენტი';
+$lang['Register'] = 'რეგისტრაცია';
+$lang['Registration'] = 'რეგისტრაცია';
+$lang['Related tags'] = 'დამოკიდებული სიტყვები';
+$lang['Reset'] = 'უარი';
+$lang['Retrieve password'] = 'პაროლის შეხსენება';
+$lang['Search rules'] = 'ძიების პირობა';
+$lang['Search tags'] = 'საძიებო ტეგები';
+$lang['Search'] = 'ძიება';
+$lang['display available tags'] = 'შესაძლო ტეგების ნახვა';
+$lang['Since'] = 'პერიოდი';
+$lang['Sort by'] = 'სორტირება';
+$lang['Sort order'] = 'სორტირების წესი';
+$lang['Tag'] = 'სიტყვა';
+$lang['Tags'] = 'საძიებო სიტყვები';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS შეტყობინებები გიამბობენ ახალ ფოტოებზე, გალერეის განახლებაზე, ახალ კომენტარებზე. ამისათვის გამოიყენეთ RSS-წამკითხველი.';
+$lang['Unknown feed identifier'] = 'ლენტის გაურკვეველი იდენტიფიკატორი';
+$lang['User comments'] = 'მნახველების კომენტარები';
+$lang['Username'] = 'მომხმარებლის სახელი';
+$lang['Visits'] = 'ნახვები';
+$lang['Webmaster'] = 'მოგვწერეთ';
+$lang['Week %d'] = 'კვირა %d';
+$lang['About Piwigo'] = 'PhpWebGallery–ზე';
+$lang['You are not authorized to access the requested page'] = 'თქვენ არ გაქვთ ავტორიზაციის გარეშე გვერდის ნახვის უფლება';
+$lang['Add to caddie'] = 'კალათაში დამატება';
+$lang['add this photo to your favorites'] = ' დავამატოთეს ფოტო რჩეულებში';
+$lang['Administration'] = 'ადმინისტრირება';
+$lang['all'] = 'ყველა';
+$lang['ascending'] = 'ზრდის მიხედვით';
+$lang['author(s) : %s'] = 'ავტორი(ები) : %s';
+$lang['Expand all albums'] = 'გავხსნათ ყველა კატეგორია';
+$lang['posted after %s (%s)'] = 'გამოქვეყნებულია %s (%s) შემდეგ';
+$lang['posted before %s (%s)'] = 'გამოქვეყნებულია  %s (%s) მდე';
+$lang['posted between %s (%s) and %s (%s)'] = 'გამოქვეყნებულია %s (%s) და %s (%s) შორის';
+$lang['posted on %s'] = 'გამოქვეყნებულია %s';
+$lang['Best rated'] = 'შეფასებებით';
+$lang['display best rated photos'] = 'ვნახოთ მაღალშეფასებადი ';
+$lang['Calendar'] = 'კალენდარი';
+$lang['All'] = 'ყველა';
+$lang['display each day with photos, month per month'] = 'ვნახოთ ყველა დღე ფოტოებით,თვე თვეზე';
+$lang['View'] = 'ნახვა';
+$lang['chronology_monthly_calendar'] = 'თვე';
+$lang['chronology_monthly_list'] = 'რიცხვი';
+$lang['chronology_weekly_list'] = 'კვირის დღე';
+$lang['Click here if your browser does not automatically forward you'] = 'გადადით ამ მისამართზე,თუკი ბროუზერი არ გადაგამისამართებთ ავტომატურად';
+$lang['comment date'] = 'კომენტარის თარიღი';
+$lang['Comment'] = 'კომენტარი';
+$lang['Your comment has been registered'] = 'თქვენი კომენტარი გაგზავნილია';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'ანტიფლუდი: დაიცადეთ ცოტა ხანი სანამ გააგზავნით შემდეგ კომენტარს';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'თქვენი კომენტარი არ არის გაგზავნილი, რადგან არ შეესაბამება ჩვენს წესებს';
+$lang['An administrator must authorize your comment before it is visible.'] = 'ადმინისტრატორმა უნდა შეამოწმოს თქვენი კომენტარი,სანამ იგი ნაჩვენები იქნება.';
+$lang['This login is already used by another user'] = 'ეს სახელი(ლოგინი) უკვე დაკავებულია';
+$lang['Comments'] = 'კომენტარი';
+$lang['Add a comment'] = 'კომენტარის დამატება';
+$lang['created after %s (%s)'] = 'შექმნილი %s (%s) შემდეგ';
+$lang['created before %s (%s)'] = 'შექმნილი %s (%s) მდე';
+$lang['created between %s (%s) and %s (%s)'] = 'შექმნილი %s (%s) და %s (%s) შორის';
+$lang['created on %s'] = 'შექმნილი %s';
+$lang['Customize'] = 'გასწორება';
+$lang['Your Gallery Customization'] = 'გალერეის გასწორება ';
+$lang['day'][0] = 'კვ';
+$lang['day'][1] = 'ორშ';
+$lang['day'][2] = 'სამ';
+$lang['day'][3] = 'ოთხ';
+$lang['day'][4] = 'ხუთ';
+$lang['day'][5] = 'პარ';
+$lang['day'][6] = 'შაბ';
+$lang['Default'] = 'ძირითადად';
+$lang['delete this photo from your favorites'] = 'ამოვიღოთ ეს ფოტო რჩეულიდან';
+$lang['Delete'] = 'გადავაგდოთ';
+$lang['descending'] = 'კლებით';
+$lang['Download'] = 'ატვირთვა';
+$lang['Download this file'] = ' ავტვირთოთ ეს ფაილი';
+$lang['edit'] = 'რედაქტირება';
+$lang['wrong date'] = 'შეცდომა თარიღში';
+$lang['excluded'] = 'გამორიცხული';
+$lang['Your favorites'] = 'რჩეული';
+$lang['display your favorites photos'] = 'ვნახოთ არჩეული ფოტოები';
+$lang['Favorites'] = 'რჩეული';
+$lang['First'] = 'პირველი';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'გალერეა დროებით დაკეტილია. გთხოვთ მოგვიანებით მობრძანდეთ';
+$lang['Page generated in'] = 'გვერდი გენერირებილია';
+$lang['guest'] = 'სტუმარი';
+$lang['Hello'] = 'გამარჯობა';
+$lang['available for administrators only'] = 'დაშვება მხოლოდ ადმინისტრატორისათვის';
+$lang['display this album'] = 'ვნახოთ ფოტოები კატეგორიის ძირიდან';
+$lang['display last user comments'] = 'მომხმარებლების ბოლო კომენტარები';
+$lang['customize the appareance of the gallery'] = 'გაფორმების გასწორება';
+$lang['search'] = 'ძიება';
+$lang['Home'] = 'Home';
+$lang['Identification'] = 'შესვლა';
+$lang['in this album'] = 'ამ კატეგირიაში';
+$lang['in %d sub-album'] = ' %d ქვეკატეგორიაში';
+$lang['in %d sub-albums'] = '( %d ქვეკატეგორიებში)';
+$lang['included'] = 'ჩართულია';
+$lang['Invalid password!'] = 'არასწორი პაროლი!';
+$lang['Language']='ენა';
+$lang['last %d days'] = 'ბოლო %d დღე';
+$lang['Last'] = 'ბოლო';
+$lang['Logout'] = 'გამოსვლა';
+$lang['obligatory'] = 'აუცილებელი';
+$lang['Maximum photo height'] = 'სურათის მაქსიმალური სიმაღლე';
+$lang['Maximum height must be a number superior to 50'] = 'სურათის მაქსიმალური სიმაღლე უნდა იყოს 50–ზე მეტი';
+$lang['Maximum photo width'] = 'სურათის მაქსიმალური სიგანე';
+$lang['Maximum width must be a number superior to 50'] = 'სურათის მაქსიმალური სიგანე უნდა იყოს 50–ზე მეტი';
+$lang['display a calendar by creation date'] = ' ვნახოთ კალენდარი შექმნის თარიღით';
+$lang['display all photos in all sub-albums'] = ' ვნახოთ ყველა ფოტო ყველა ქვეკატეგორიებში';
+$lang['return to normal view mode'] = 'ჩვეულებრივ რეჯიმში დაბრუნება';
+$lang['display a calendar by posted date'] = ' ვნახოთ კალენდარი გაგზავნის დროის მიხედვით';
+$lang['month'][10] = 'ოქტომბერი';
+$lang['month'][11] = 'ნოემბერი';
+$lang['month'][12] = 'დეკემბერი';
+$lang['month'][1] = 'იანვარი';
+$lang['month'][2] = 'თებერვალი';
+$lang['month'][3] = 'მარტი';
+$lang['month'][4] = 'აპრილი';
+$lang['month'][5] = 'მაისი';
+$lang['month'][6] = 'ივნისი';
+$lang['month'][7] = 'ივლისი';
+$lang['month'][8] = 'აგვისტო';
+$lang['month'][9] = 'სექტემბერი';
+$lang['Most visited'] = 'პოპულარურობის მიხედვით';
+$lang['display most visited photos'] = 'ვნახოთ ყველაზე პოპულარული ფოტოები';
+$lang['Unknown identifier'] = 'უცნობი იდენტიფიკატორი';
+$lang['New password'] = 'ახალი პაროლი';
+$lang['Rate this photo'] = 'შეაფასეთ ეს ფოტო';
+$lang['Next'] = 'შემდეგი';
+$lang['Home'] = 'დასაწყისი';
+$lang['no rate'] = 'არ არის შეფასებული';
+$lang['Photos posted within the last %d day.'] = 'ვნახოთ ფოტოები, გამოქვეყნებული ბოლო %s დღეში.';
+$lang['Photos posted within the last %d days.'] = 'ვნახოთ ფოტოები, გამოქვეყნებული ბოლო %s დღეში.';
+$lang['password updated'] = 'პაროლი შეცვლილია';
+$lang['Recent period must be a positive integer value'] = 'ბოლო პერიოდი უნდა იყოს დადებითი ციფრი';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'ფოტო';
+$lang['Click on the photo to see it in high definition'] = 'დაკლიკეთ ფოტოზე, რათა ნახოთ იგი დიდი ფორმატით';
+$lang['Show file metadata'] = 'ვნახოთ მეტამონაცემები';
+$lang['Powered by'] = 'სკრიპტი';
+$lang['Preferences'] = 'უპირატესი';
+$lang['Previous'] = 'წინა';
+$lang['Random photos'] = 'შემთხვევითი';
+$lang['display a set of random photos'] = 'რამდენიმე შემთხვევითი ფოტო';
+$lang['Recent albums'] = 'ახალი გალერეები';
+$lang['display recently updated albums'] = 'ვნახოთ განახლებული გალერეები';
+$lang['Recent period'] = '"ახლების" ვადა';
+$lang['Recent photos'] = 'ახალი ფოტოები';
+$lang['display most recent photos'] = 'ვნახოთ ახალი ფოტოები';
+$lang['Redirection...'] = 'გადამისამართება...';
+$lang['Please, enter a login'] = 'გთხოვთ, შეიყვანეთ სახელი(ლოგინი)';
+$lang['login mustn\'t end with a space character'] = 'სახელი(ლოგინი) არ უნდა მთავრდებოდეს ცარიელი ადგილით(პრობელით)';
+$lang['login mustn\'t start with a space character'] = 'სახელი(ლოგინი) არ უნდა იწყებოდეს ცარიელი ადგილით(პრობელით)';
+$lang['this login is already used'] = 'ეს სახელი(ლოგინი) უკვე არსებობს';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ელ.ფოსტის მისამართი უნდა გამოიყურებოდეს ესე xxx@yyy.eee (მაგალითად: jack@altern.org)';
+$lang['please enter your password again'] = 'პაროლი კიდევ ერთხელ';
+$lang['Auto login'] = 'დამიმახსოვრე';
+$lang['remove this tag from the list'] = 'გადავაგდოთ ეს ტეგი სიიდან';
+$lang['representative'] = 'წარმომადგენელი';
+$lang['Search for Author'] = 'ძიება ავტორის მიხედვით';
+$lang['Search in albums'] = 'ძიება კატეგორიებში';
+$lang['Search by date'] = 'ძიება თარიღით';
+$lang['Date'] = 'საწყისი თარიღი';
+$lang['End-Date'] = 'საბოლოო თარიღი';
+$lang['Kind of date'] = 'თარიღის ტიპი';
+$lang['Search for words'] = 'ძიება სიტყვებით';
+$lang['Search for all terms'] = 'ძიება ყველა კრიტერიუმით ';
+$lang['Search for any term'] = 'ძიება ნებისმიერი კრიტერიუმით';
+$lang['Empty query. No criteria has been entered.'] = 'ცარიელი მოთხოვნა. ძიების კრიტერიუმი არ რსებობს.';
+$lang['Search results'] = 'ძიების რეზულტატი';
+$lang['Search in sub-albums'] = 'ქვეკატეგორიებშიც';
+$lang['Search'] = 'ძიება';
+$lang['searched words : %s'] = 'მოსაძებნი სიტყვები: %s';
+$lang['Contact'] = 'კონტაქტი';
+$lang['set as album representative'] = 'გავხადოთ კატეგორიის წარმომადგენელი';
+$lang['Show number of comments'] = 'ვაჩვენოთ კომენტარების რაოდენობა';
+$lang['Show number of hits'] = 'ვაჩვენოთ ნახვების რაოდენობა';
+$lang['slideshow'] = ' სლაიდშოუ';
+$lang['stop the slideshow'] = 'სლაიდშოუს გაჩერება';
+$lang['Specials'] = 'რჩეული';
+$lang['SQL queries in'] = 'SQL-მოთხოვნა';
+$lang['display only recently posted photos'] = ' ვნახოთ მხოლოდ ახლახანს გამოქვეყნებული ფოტოები';
+$lang['return to the display of all photos'] = 'ყველა ფოტოს ნახვასთან დაბრუნება';
+$lang['the beginning'] = 'თავიდან';
+$lang['Interface theme'] = 'გაფორმება';
+$lang['Thumbnails'] = 'მინიატურები';
+$lang['Menu'] = 'მენიუ';
+$lang['A comment on your site'] = 'კომენტარები თქვენი საიტიდან';
+$lang['today'] = 'დღეს';
+$lang['Update your rating'] = 'განვაახლოთ შეფასება';
+$lang['Author'] = 'ავტორი';
+$lang['the username must be given'] = 'მომხმარებლის სახელი უნდა არსებობდეს';
+$lang['useful when password forgotten'] = 'დაკარგული პაროლის აღსადგენად';
+$lang['Quick search'] = 'ჩქარი ძიება';
+$lang['Connected user: %s'] = 'დაკავშირებული მომხმარებლები: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'ბროუზერი: %s';
+$lang['Author: %s'] = 'ავტორი: %s';
+$lang['Comment: %s'] = 'კომენტარები: %s';
+$lang['Comment by %s'] = 'კომენტარები %s _სგან';
+$lang['User: %s'] = 'სტუმარი: %s';
+$lang['Email: %s'] = 'მისამართი: %s';
+$lang['Admin: %s'] = 'ადმინისტრატორი: %s';
+$lang['Registration of %s'] = 'რეგისტრაცია %s';
+$lang['Album: %s'] = 'კატეგორია: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'მომხმარებლის არასწორი სტატუსი "სტუმარი", გამოიყენეთ ძირითადი სტატუსი. გთხოვთ შეატყობინოთ ადმინისტრატორს.';
+$lang['this email address is already in use'] = 'მომხმარებელი ასეთი მისამართით უკვე არსებობს';
+$lang['Album results for'] = 'დღის კატეგორიების რეზულტატი';
+$lang['Tag results for'] = 'დღის სიტყვა–რეზულტატი';
+$lang['from %s to %s'] = ' %s დან  %s მდე';
+$lang['Play of slideshow'] = 'ვნახოთ სლაიდშოუ';
+$lang['Pause of slideshow'] = 'გავაჩეროთ სლაიდშოუ';
+$lang['Repeat the slideshow'] = 'გავიმეოროთ სლაიდშოუ';
+$lang['Not repeat the slideshow'] = 'არ გავიმეოროთ სლაიდშოუ';
+$lang['Reduce diaporama speed'] = 'Reduce diaporama speed';
+$lang['Accelerate diaporama speed'] = 'Accelerate diaporama speed';
+$lang['Submit'] = 'გაგზავნა';
+$lang['Yes'] = 'დიახ';
+$lang['No'] = 'არა';
+$lang['%d photo']='%d ფოტო';
+$lang['%d photos']='ფოტოები: %d';
+$lang['%d photo is also linked to current tags'] = '%d ფოტო ასევე დაკავშირებულია ამ სიტყვებთან';
+$lang['%d photos are also linked to current tags'] = '%d ფოტოები ასევე დაკავშირებულია ამ სიტყვებთან';
+$lang['display photos linked to this tag'] = 'ვნახოთ ფოტოები დაკავშირებული მხოლოდ ამ სიტყვასთან';
+$lang['photos posted during the last %d days'] = 'ფოტოები გამოქვეყნებული ბოლო %d დღეში';
+$lang['Piwigo Help'] = 'დახმარება';
+$lang['Rank'] = 'წყობა';
+$lang['group by letters'] = 'დავაჯგუფოთ ასოებით';
+$lang['letters'] = 'ასოები';
+$lang['show tag cloud'] = 'ვაჩვენოთ სიტყვების ღრუბელი';
+$lang['cloud'] = 'ღრუბელი';
+$lang['Are you sure?'] = 'დარწმუნებული ხართ?';
+$lang['Reset to default values'] = 'აღვადგინოთ ძირითადი მნიშვნელობები';
+$lang['delete all photos from your favorites'] = 'გადავაგდოთ ყველა ფოტო რჩეულიდან';
+$lang['Sent by'] = 'გაგზავნა';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'თქვენს როუზერს არ აქვს კუკების(Cookies) მხარდაჭერა, ან ბლოკავს მათ. გთხოვთ ჩართოთ ან გაასწოროთ იგი.';
+$lang['Edit a comment'] = 'კომენტარის რედაქტირება';
+$lang['(!) This comment requires validation'] = '(!) ეს კომენტარი ელოდება შემოწმებას';
+$lang['Welcome'] = 'კეთილი იყოს თქვენი მობრძანება';
+$lang['Welcome to your Piwigo photo gallery!'] = 'კეთილი იყოს თქვენი მობრძანება Piwigo–ს ფოტო გალერეაში!';
+$lang['... or browse your empty gallery'] = '... ან ნახეთ თქვენი ცარიელი გალერეა';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ან ნუ მაჩვენებთ ამ შეტყობინებას. მე თვითონ გადავწყვიტავ რას ვიმოქმედებ';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'გამარჯობა %s, თქვენი გალერეა ცარიელია!';
+$lang['I want to add photos'] = 'მსურს დავამატო ფოტო';
+$lang['Manage this user comment: %s'] = 'ამ მომხმარებლის კომენტარის მართვა: %s';
+$lang['This author modified following comment:'] = 'ამ ავტორმა შეცვალა  შემდეგი კომენტარი:';
+$lang['This author removed the comment with id %d'] = 'ამ ავტორმა წაშალა კომენტარი ნომერი %d';
+$lang['%d Kb'] = '%d კბ';
+$lang['Reduce diaporama speed'] = 'შევამციროთ პანორამის სიჩქარე';
+$lang['Accelerate diaporama speed'] = 'გავზარდოთ პანორამის სიჩქარე';
+$lang['html tags are not allowed in login'] = 'შესასვლელად html ტეგების გამოყენება აკრძალულია';
+?>
Index: tags/2.4.0RC3/language/ka_GE/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,117 @@
+<h2>კატეგორიის რედაქტირება</h2>
+
+<h3>ინფორმაცია</h3>
+
+<ul>
+
+  <li><strong>სათაური</strong>: გაძლევთ საშუალებას სახელი გადაარქვათ კატეგორიას
+  (გავს ფსევდონიმს, რეალური კატეგორიის შემთხვევაში).</li>
+
+  <li><strong>აღწერა</strong>: შეგიძლიათ აღწეროთ კატეგორიის შემადგენლობა.
+  ეს ტექსტი გამოჩნდება მინიატურების გვერდზე, ქვევით.</li>
+
+</ul>
+
+<h3>გადატანა</h3>
+
+<p>თუ კატეგორია ვირტუალურია, თქვენ შეგიძლიათ გადაიტანოთ იგი. კატეგორიის გადატანა ნიშნავს მშობლიური კატეგორიის შეცვლას.</p>
+
+<h3>ოპციები</h3>
+
+<ul>
+
+  <li><strong>დაშვების ტიპი</strong>: დაშვების მართვა. თუ კატეგორიას მიანიჭებთ სტატუსს პრივატული, მაშინ ყველა ქვეკატეგორია ამ კატეგორიაში გახდება პრივატული, ხოლო თუ მიანიჭებთ კატეგორიას სტატუსს საერთო, მაშინ ყველა ქვეკატეგორია ამ კატეგორიაში გახდება საერთო.</li>
+
+  <li><strong>დაბლოკვა</strong>: კატეგორია და მისი ქვეკატეგორიები დროებით დაბლოკილი იქნება, მომსახურეობის მიზნით.</li>
+
+  <li><strong>Комментарии</strong>: მომხმარებლის მიერ კატეგორიის ელემენტების კომენტირების მართვა.</li>
+
+  <li><strong>ნება დავრთოთ ატვირთვაზე</strong>: მომხმარებლების მიერ ფაილების ატვირთვის მართვა. ეს ოპცია ხელმისაწვდომია მხოლოდ ჩვეულებრივი (არა ვირტუალური) კატეგორიებისათვის.</li>
+
+</ul>
+
+<p>ასევე თქვენ შეგიძლიათ მართოთ ეს გასწორებები გვერდზე "თვისება"
+ (ჩანართი <span class="pwgScreen">ატვირთვა</span>, <span
+class="pwgScreen">კომენტარები</span>, <span class="pwgScreen">დაბლოკვა</span>,
+<span class="pwgScreen">საერთო/პრივატული</span>), ყველაფერი ეს მენიუში <span
+class="pwgScreen">ადმინისტრირება, გალერეა, თვისება</span>.</p>
+
+<h3>სორტირების წესი</h3>
+
+<p>პირველი ჩეკბოქსი განსაზღვრავს ძირითად სორტირებას.</p>
+<p>მეორე ჩეკბოქსი განსაზღვრავს სორტირების წესს ქვეკატეგორიებზე.</p>
+
+<p>აირჩიეთ სხვა სორტირების წესი, თუკი ეს საჭიროა.</p>
+<ul>
+<li><strong>გადაღების დრო</strong>: ფოტოს გადაღების თარიღი</li>
+<li><strong>გამოქვეყნების დრო</strong>: ფოტოს გალერეაში გამოქვეყნების თარიღი</li>
+<li><strong>საშუალო ქულა (*)</strong>: რეიტინგის მიხედვით, რომლითაც ხმას აძლევენ მომხმარებლები</li>
+<li><strong>პოპულარულობის მიხედვით (*)</strong>: მომხმარებლების მიერ ფოტოების ნახვის მიხედვით</li>
+<li><strong>ფოტოს სახელი</strong>: ფოტოს სახელის მიხედვით სორტირება</li>
+<li><strong>Id</strong>: შიდა იდენტიფიკატორი (ახალ კატეგორიებს აქვთ უფრო მაღალი იდენტიფიკატორი ვიდრე ძველებს).</li>
+
+</ul>
+<p><strong>(*)</strong> ცადეთ ეს მნიშვნელობები. ხშირად ისინი იძლევიან არა პროგნოზირებად რეზულტატს.</p>
+
+
+<h3>წარმომადგენელი</h3>
+
+<p>კატეგორიის წარმომადგენელი-ეს არის მინიატურა, რომელიც წარმოადგენს კატეგორას გალერეის მთავარ გვერდზე (<span class="pwgScreen">category.php</span>) როცა კატეგორია შეიცავს მხოლოდ ქვეკატეგორიებს.</p>
+
+<p>არსებობს 4 საშუალება კატეგორიის წარმომადგენლად დანიშვნინსათვის:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">ფოტოების გვერდი</span>: ღილაკების რიგში პანელზე არის ღილაკი, რომელიც საშუალებას გაძლევთ კატეგორიის წარმომადგენლად დანიშნოთ ეს ფოტო. ეს ღილაკი ხელმისაწვდომია მხოლოდ ადმინისტრატორისათვის.</li>
+
+  <li><span class="pwgScreen">ფოტოს ინფორმაციის რედაქტირება</span> 
+  ადმინისტრირების განყოფილებაში. ეს ფუნქცია ხელმისაწვდომია ფოტოების გვერდიდან <span
+  class="pwgScreen">picture.php</span> ან <span class="pwgScreen">კალათის მართვა</span>
+  <em>ჯგუფური რეჟიმი</em>. ნახეთ დახმარება ამ ეკრანისათვის დეტალების დასაზუსტებლად.</li>
+
+  <li><span class="pwgScreen">ადმინისტრირება, გალერეა, თვისება, წარმომადგენელი</span>. ნახეთ დახმარება ამ ეკრანისათვის დეტალების დასაზუსტებლად.</li>
+
+  <li><span class="pwgScreen">კატეგორიის რედაქტირება</span> (этот экран).</li>
+
+</ul>
+
+<p>შეხედულება დამოკიდებულია კონფიგურაციის პარამეტრებზე
+<code>allow_random_representative</code> (ნახე <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>ძირითადად (<code>allow_random_representative</code> დაყენებულია false)
+ყოველი კატეგორია, რომელიც შეიცავს ერთ ელემენტს მაინც, წარმოდგენილია ფიქსირებული ელემენტით. დაყენებული ერთხელ (კატეგორიის შექმნისას), წარმომადგენელი შეიცვლება მხოლოდ მას შემდეგ რაც ადმინისტრატორი შეცვლის მას.
+თუკი შეხედულება არ მოგწონთ, შეგიძლიათ აირჩიოთ <strong> მოძებნოთ ახალი წარმომადგენელი შემთხვევითი წესით</strong>.</p>
+
+<p>თუკი კონფიგურაციის პარამეტრი <code>allow_random_representative</code> დაყენებულია true, კატეგორიას, რომელიც შეიცავს ელემენტებს, ფიქსირებული წარმომადგენელი არ გააჩნია. გამოიყენეთ ღილაკი  <strong> წავშალოთ წარმომადგენელი</strong>.</p>
+
+<p>თუკი კატეგორია არ შეიცავს ელემენტებს ( არ შეიცავს ქვეკატეგორიებს), იგი შეიძლება წარმოდგენილი იყოს ნებისმიერი ელემენტით <span
+class="pwgScreen">შევცვალოთ ინფორმაცია ფოტოზე</span>.
+
+<h3>მივამაგროთ ამ კატეგორიის ყველა ელემენტი ახალს</h3>
+
+<ul>
+
+<li><strong>ვირტუალური კატეგორიის სახელი</strong>: ახალი კატეგორია ამ სახელით იქნება შექმნილი, ყველა ფოტო ამ კატეგორიაში, მიმაგრებული იქნება მასთან.</li>
+
+<li><strong>მშობლიური კატეგორია</strong>: სად იქნება შექმნილი ახალი კატეგორია, თუკი ეს უნდა იყოს ზემოთა კატეგორია, დატოვეთ პარამეტრი ცარიელი.</li>
+
+</ul>
+
+<h3>მივამაგროთ ამ კატეგორიის ყველა ელემენტი ერთ ერთ არსებულს</h3>
+
+<ul>
+
+<li><strong>გალერეა</strong>: აირჩიეთ კატეგორია, რომელთანაც საჭიროა მიამაგროთ ელემენტები.</li>
+
+</ul>
+
+<h3>გაუგზავნოთ საინფორმაციო წერილი ჯგუფს</h3>
+
+<ul>
+
+<li><strong>ჯგუფი</strong>: ჯგუფი-ადრესატი</li>
+
+<li><strong>Содержание</strong>: ტექსტი, რომელიც გაეგზავნება მის მონაწილეებს.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ka_GE/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>ვირტუალური კატეგორიების გადატანა</h2>
+
+<p>მხოლოდ ვირტუალური კატეგორიები შეიძლება გადატანილი იყოს სხვა მშობლიურ კატეგორიაში.</p>
+
+<h3>ვირტუალური კატეგორიები გადასატანად</h3>
+
+<p>აირჩიეთ ვირტუალური კატეგორიები, რომლების გადატანაც გსურთ.
+თუკი სია ცარიელია, მაშინ თქვენ ჯერ არ შეგიქმნიათ ვირტუალური კატეგორიები.</p>
+
+<h3>ახალი მშობლიური კატეგორია</h3>
+
+<p>აირჩიეთ ახალი მშობლიური კატეგორია (ვირტუალური ან რეალური).
+თუკი არაფერს არ აირჩევთ, ვირტუალური კატეგორიები, არჩეული წინა ეტაპზე, გადატანილი იქნება გალერეის ფუძეში.
+თქვენ არ შეგიძლიათ გადაიტანოთ კატეგორია თავისივე თავში ან ერთ ერთ მისივე ქვეკატეგორიაში.</p>
Index: tags/2.4.0RC3/language/ka_GE/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/cat_options.html	(revision 14585)
@@ -0,0 +1,28 @@
+<h2>კატეგორიის თვისება</h2>
+
+<p>ეს ეკრანი საშუალებას აძლევს ადმინისტრატორს შეცვალოს რამდენიმე კატეგორიის თვისება ერთდროულად.</p>
+
+<dl>
+
+  <dt>ატვირთვა</dt>
+  <dd>ხსნის კატეგორიებს მომხმარებლებისათვის ასატვირთად. ნაჩვენებია მხოლოდ არა ვირტუალური და წაუშლელი კატეგორიები.</dd>
+
+  <dt>კომენტარები</dt>
+  <dd>ხსნის კატეგორიებს კომენტირებისათვის.
+აირჩიეთ კატეგორიები, რომლებიც გინდათ გახსნათ კომენტირებისათვის.
+ფოტო ღიაა კომენტირებისათვის, თუკი ერთი კატეგორია მაინც გახსნილია კომენტარებისათვის.</dd>
+
+  <dt>ბლოკირება</dt>
+  <dd>არჩეული კატეგორიები დროებით დაბლოკილი იქნება, მომსახურების მიზნით. დაბლოკილი კატეგორიის ყველა ქვეკატეგორია , ასევე იქნება დაბლოკილი. როცა მოხსნით ბლოკირებას კატეგორიას, მისი ქვეკატეგორიებიდანაც მოიხსნება ბლოკირება.</dd>
+
+  <dt>საერთო / პრივატული</dt>
+  <dd>არჩეულ კატეგორიებთან დაშვების მართვა. თუკი გახდით კატეგორიას პრივატულს, საჭიროა მისცეთ მომხმარებლებს ან/და ჯგუფებს მასთან დაშვების უფლება.
+  თუკი კატეგორიას გახდით პრივატულს, მისი ქვეკატეგორიებიც პრივატული გახდება.
+  თუკი კატეგორიას გახდით საერთოს, ყველა მისი ქვეკატეგორია ასევე საერთო იქნება.</dd>
+
+  <dt>პრივილეგიები</dt>
+  <dd>ეს განყოფილება ხელმისაწვდომია,თუკი პარამეტრი <code>allow_random_representative</code>
+  (ნახეთ <span class="filename">include/config_defaults.inc.php</span>) დაყენებულია
+  <em>true</em>. ყოველ კატეგორიას შეიძლება ქონდეს შემთხვევითი წარმომადგენელი ან მხოლოდ ერთი წარმომადგენელი რომელსაც ადმინისტრატორი აირჩევს.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ka_GE/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>უფლებების მართვა კატეგორიისათვის</h2>
+
+<p>ეს ეკრანი ხელმისაწვდომია მხოლოდ პრივატული კატეგორიისათვის. აქ შეიძლება მომხმარებლების ან/და ჯგუფების არჩევა, რომლებსაც ექნებათ დაშვების უფლება ამ კატეგორიასთან.</p>
+
+<h3>ჯგუფები</h3>
+
+<p>თქვენ შეგიძლიათ უფლება მისცეთ ან აუკრძალოთ ჯგუფებს ამ კატეგორიასთან დაშვება.ჯგუფისთვის დაშვების უფლების შეცვლით, თქვენ ცვლით დაშვების უფლებას მომხმარებლებისთვისაც, რომლებიც ამ ჯგუფში არიან გაერთიანებულნი.</p>
+
+<h3>მომხმარებლები</h3>
+
+<p>ისევე როგორც ჯგუფებისათვის, შეგიძლიათ მოექცეთ ცალკეულ მომხმარებლებსაც.მომხმარებელი რომელსაც  კატეგორიასთან დაშვების უფლება აქვს ჯგუფის მიხედვით, შეიძლება შეზღუდული იყოს პერსონალურად მომხმარებლის დაშვების შეზღუდვის საშუალებით.</p>
Index: tags/2.4.0RC3/language/ka_GE/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/configuration.html	(revision 14585)
@@ -0,0 +1,103 @@
+<h2>გასწორება</h2>
+
+<p>ეს ეკრანი აძლევს ადმინისტრატორს საშუალებას გააკეთოს უმარტივესი გასწორებები. სინამდვილეში, ეს ეკრანი გაჩვენებთ მხოლოდ უმარტივეს გასწორებებს, რომელიც საკმარისი იქნება ადმინისტრატორების უმეტესობისათვის. თუკი გსურთ იხილოთ სხვა გასწორებები (დამატებით), იხილეთ ფაილი <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>ეკრანი დაყოფილია სექციებად და დაჯგუფებულია რამდენიმე თემად.</p>
+
+
+<h3>მთავარი</h3>
+<ul>
+  <li><strong>გალერეის სახელი</strong>: გამოიყენება RSS ლენტაში და email შეტყობინებებში.</li>
+
+  <li><strong>წარწერა ბანერზე</strong>: ნაჩვენები იქნება ყველა გვერდის ზევით.</li>
+
+  <li><strong>გალერეის მისამართი</strong>: გამოიყენება RSS ლენტაში.</li>
+
+  <li><strong>გალერეის დაბლოკვა</strong>: გალერეის დაკეტვა მომსახურეობის მიზნით. გალერეა ღია იქნება მხოლოდ ადმინისტრატორისათვის.</li>
+
+  <li><strong>შეფასებები</strong>: ნება დავრთოთ შეაფასონ.</li>
+
+  <li><strong>სტუმრების შეფასებები</strong>: დაურეგისტრირებელი მომხმარებლებიც შეძლებენ შეაფასონ ფოტოები.</li>
+
+  <li><strong>დაუშვათ მომხმარებლების რეგისტრაცია</strong>: ნებისმიერს შეუძლია დარეგისტრირება.</li>
+
+  <li><strong>ელ.ფოსტის მისამართი აუცილებელია ყველა მომხმარებლისათვის </strong>: მისამართის არსებობა შემოწმებული იქნება რეგისტრაციის დროს ან პროფილის შეცვლის დროს თუკი ეს მოქმედება აღნიშნულია ადმინისტრირების ნაწილში.</li>
+
+  <li><strong>შევატყობინოთ ადმინისტრატორს როცა ახალი მომხმარებელი დარეგისტრირდება</strong>:
+  ადმინისტრატორი მიიღებს შეტყობინებას ყოველი რეგისტრაციის შესახებ.</li>
+
+</ul>
+
+<h3>ისტორია</h3>
+
+  <p>ნანახი გვერდები <span class="pwgScreen">category.php</span> და
+  <span class="pwgScreen">picture.php</span> ჩაწერილი იქნება ტაბულაში <code>history</code>.</p>
+
+  <p>ნახვები ნაჩვენები იქნება <span class="pwgScreen"> ადმინისტრირება, სპეც.ფუნქციები, ისტორია</span>.</p>
+
+<ul>
+  <li><strong>შევინახოთ სტუმრების მიერ ნანახი გვერდები</strong>: გვერდები, რომლებსაც სტუმრები ნახავენ, შენახული იქნება.</li>
+
+  <li><strong>შევინახოთ მომხმარებლების მიერ ნანახი გვერდები</strong>: გვერდები, რომლებსაც დარეგისტრირებული მომხმარებლები ნახავენ, შენახული იქნება.</li>
+
+  <li><strong>შევინახოთ ადმინისტრატორების მიერ ნანახი გვერდები</strong>: გვერდები, რომლებსაც ადმინისტრატორები ნახავენ, შენახული იქნება.</li>
+
+</ul>
+
+<h3>კომენტარები</h3>
+<ul>
+
+  <li><strong>კომენტარები ყველასათვის</strong>: დაურეგისტრირებელი მომხმარებლებიც შეძლებენ შეაფასონ ფოტოები.</li>
+
+  <li><strong>კომენტარების რაოდენობა გვერდზე</strong>.</li>
+
+  <li><strong>შემოწმება</strong>: ადმინისტრატორი ამოწმებს მომხმარებლების მიერ დაწერილ შეფასებებს მანამდე, სანამ ისინი ნაჩვენები იქნება საიტზე. კომენტარების შეფასება შესაძლებელია გვერდზე <span class="pwgScreen">ადმინისტრირება, ფოტოები, კომენტარები</span>.</li>
+
+  <li><strong>შევატყობინოთ ადმინისტრატორს როდესაც არსებობს კომენტარები</strong>: გაუგზავნოთ email ადმინისტრატორს როდესაც მომხმარებელი დატოვებს კომენტარს.</li>
+
+  <li><strong>შევატყობინოთ ადმინისტრატორს როდესაც არსებობს კომენტარები შესამოწმებლად</strong>:
+გაუგზავნოთ email ადმინისტრატორს როდესაც მომხმარებელი დატოვებს კომენტარს ადმინისტრატორის შესამოწმებლად. შესამოწმებელი კომენტარები მდებარეობს გვერდზე <span class="pwgScreen">
+ადმინისტრირება, ფოტოები, კომენტარები</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>ატვირთვა</h3>
+<ul>
+<!--TODO -->  <li><strong>ვაჩვენოთ ატვირთვის ბმული მუდმივად</strong>: თუკი არსებობს კატეგორიები, სადაც დაშვებულია ატვირთვა, დამატებული იქნება ბმული, რომელიც გამოჩნდება ყველა კატეგორიაში.</li>
+<!--TODO -->  <li><strong>მომხმარებლის დაშვების უფლება ასატვირთად</strong>:
+საშუალებას გაძლევთ შეზღუდოთ მომხმარებლების მიერ ატვირთვა</li>
+  <li><strong>შევატყობინოთ ადმინისტრატორს როდესაც ატვირთულია ფოტო</strong>: ადმინისტრატორი მიიღებს შეტყობინებას მომხმარებლის მიერ ატვირთულ ფოტოზე.</li>
+</ul>
+
+<h3>ჩვენების ძირითადი სახე</h3>
+
+<p>აქ შესაძლებელია შეცვალოთ ჩვენების ძირითადი პარამეტრები სტუმრისათვის ან არა ავტორიზებული მომხმარებლისათვის. ავტორიზაციის შემდეგ ჩვენების პარამეტრები შეიცვლება მომხმარებლისაზე ( რომელიც მითითებულია გვერდზე <span class="pwgScreen">პროფაილი</span>).</p>
+
+<p>ჩვენების პარამეტრები ყველა არსებული მომხმარებლისათვის შეგიძლიათ შეცვალოთ გვერდზე <span class="pwgScreen">ადმინისტრირება, იდენტიფიკაცია, მომხმარებლები</span>, სადაც შესაძლებელია ჩვენების პარამეტრების გასწორება არნიშნული მომხმარებლებისათვის.</p>
+
+<ul>
+
+  <li><strong>ენა</strong>: გავლენა აქვს მხოლოდ წარწერებზე. კატეგორიის სახელები, ფოტოები და აღწერილობა ლოკალიზებული არ იქნება.</li>
+
+  <li><strong>ფოტოების რაოდენობა სტრიქონში</strong></li>
+
+  <li><strong>სტრიქონების რაოდენობა გვერდზე</strong></li>
+
+  <li><strong>გაფორმება</strong></li>
+
+  <li><strong>"ახლების" ვადა</strong>: დღეებში. პერიოდი, რომლის განმავლობაშიც ფოტო ჩაითვლება ახლად. უნდა იყოს 1 დღეზე მეტი.</li>
+
+  <li><strong>გავხსნათ ყველა კატეგორია</strong>: გავხსნათ ყველა კატეგორია მენიუში?
+  <em>ყურადღება</em>: ეს ვარიანტი საკმაოდ დიდ რესურსს მოითხოვს და შესაძლებელია ძალიან დიდი მენიუს გენერირება მოახდინოს, თუკი თქვენს გალერეაში ძალიან ბევრი კატეგორიაა.</li>
+
+  <li><strong>ვაჩვენოთ კომენტარების რაოდენობა</strong>: ვაჩვენოთ კომენტარების რაოდენობა თითოეული ფოტოსათვის მინიატურების გვერდზე.</li>
+
+  <li><strong>ვაჩვენოთ ნახვების რაოდენობა</strong>: ვაჩვენოთ ფოტოების ნახვების რაოდენობა მინიატურების გვერდზე. მოქმედებს როდესაც პარამეტრი: <br />  $conf['show_nb_hits'] = true; <br />
+  შენიშვნა: პარამეტრი ძირითადად დგას false.</li>
+
+  <li><strong>გამოსახულების მახსიმალური სიგანე</strong>: მაქსიმალური სიგანე ჩვენებისას. თუკი ფოტო მეტია სიგანეში, იგი შემცირებული იქნება ჩვენებისას. თუ თქვენ ირჩევთ ამ ოფციას, უკეთესი იქნება     ადრევე შეცვალოთ ფოტოს სიგანე.</li>
+
+  <li><strong>გამოსახულების მაქსიმალური სიმაღლე</strong>: იგივე კომენტარები, რაც სიგანეზე.</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/ka_GE/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,77 @@
+<h2>შაბლონების გაფართოების გასწორება</h2>
+
+<h3>მიზანი</h3>
+<p>გაარკვიეთ ყოველი შაბლონისათვის შეცვლის პირობა შაბლონ-გაფართოებაზე (შაბლონი, სახელად "შემცვლელი").</p>
+
+<p>"პირველადი შაბლონი"  ./template/yoga  -დან(ან სხვა) ჩანაცვლებული იქნება "შემცვლელი"-თ თუკი შემცვლელი დაკავშირებულია ამ პირველადთან (და თუკი URL შეიცავს "URL ოპციონალურ სიტყვას").</p>
+
+<p>"URL ოპციონალურ სიტყვა" ეს არის ის, რომელიც შეგიძლიათ იპოვოთ მოდულის დასახელების შემდეგ URL -ში.</p>
+
+<p>ამიტომ, "URL ოპციონალური სიტყვები" შესაძლოა იყვნენ აქტიური "პირდაპირი ბმულები"
+(ნახეთ შესაბამისი განყოფილება ჩვენს დოკუმენტაციაში, შემდგომი განმარტებებისათვის).</p>
+
+<p>წაიკითხეთ: `<a href="#warnings">გაფრთხილება</a>` მოხმარების წესები.</p>
+
+<h3>რა არის შაბლონი-გაფართოება?</h3>
+
+<p>ეს არის კონფიგურაციის ინსტრუმენტი - მძლავრი ახალბედა და გამოცდილი მომხმარებლებისათვის. FTP-ს გამოყენებით, ფოლდერ template-extension -ში, Web-მასტერს შეუძლია დუბლირება ბევრი სხვა და სხვა .tpl ფაილების ("პირველადი შაბლონი") სხვა და სხვა დასახელებით ("შემცვლელი").
+
+
+ "პირველადი შაბლონები", მიმდინარე ორიგინალი მხარდაჭერილი შაბლონები:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> და/ან <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> და/ან <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> და/ან <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> და/ან <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> და/ან <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> და/ან <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> და/ან <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>სად ვნახო "პირველადი შაბლონები"?</h3>
+
+<p>პირველადი შაბლონები იმყოფება ფოლდერში template/yoga/
+(იქვე ნუ გაუკეთებთ რედაქტირებას რათა შეინარჩუნოთ განახლების საშუალება). ისე რომ, "პირველადი შაბლონებით" ნებისმიერ web-მასტერს შეყძლია შექმნას თავისი  "შემცვლელი" (მომხმარებლის შაბლონები).</p>
+
+<h3>სად ჩავწეროთ "შემცვლელი"?</h3>
+
+<p><strong>"შემცვლელი" (მომხმარებლის შაბლონები)</strong> უნდა განთავსდეს ფოლდერში template-extension (ან მის ქვეფოლდერში). შემცვლელს შესაძლოა ქონდეს ნებისმიერი სახელი, გაფართოებით .tpl. მაგალითად: <span class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>როგორ გავააქტიურო ჩემი "შემცვლელი შაბლონები"?</h3>
+<p>ყოველი <strong>პირველადი შაბლონი</strong> შეთავსებული უნდა იყოს თავის <strong> "შემცვლელ" (მომხმარებლის შაბლონთან)</strong> რათა გაააქტიუროთ დაკავშირებული შეცვლა. ეს მიზანი აქვს "შაბლონების გაფართოების გასწორება"-ს მენიუში გასწორება.</p>
+
+<p>თუკი თქვენ აირჩევთ <strong>URL ოპციონალურ სიტყვას</strong> მაშინ შეცვლა მოხდება მხოლოდ გვერდებზე რომელიც დაკავშირებულია ამ სიტვასთან. მაგალითად: <span class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+
+<p>გამოცდილ მომხმარებლებს შეუძლიათ გამოიყენონ პირდაპირი ბმული როგორც <strong>URL ოპციონალურ სიტყვა</strong>. </p>
+
+<h3>როგორ გავუკეთო დეაქტივაცია ჩემს "შემცვლელ შაბლონებს"?</h3>
+<ul>
+<li>აღნიშნეთ არჩეული "პირველადი შაბლონი".</li>
+<li> FTP-თი წაშალეთ "შემცვლელი".</li>
+</ul>
+<a name="warnings"></a>
+<h3>გაფრთხილება</h3>
+<ul>
+
+  <li><strong>ორიგინალი შაბლონი</strong> უნდა იყოს "პირველადი" შაბლონი, წინააღმდეგ შემთხვევაში რეზულტატი შეიძლება იყოს  არაპროგნოზირებადი!</li>
+
+  <li>თუკი არსებობს რამდენიმე <strong>"შემცვლელი" (მომხმარებლის შაბლონი)</strong> ერთნაირი სახელით <strong>"პირველადი შაბლონით"</strong> და ერთნაირი <strong>URL ოპციონალურ სიტყვით</strong> მხოლოდ ბოლო "შემცვლელი" იქნება აქტიური.</li>
+
+  <li>უარი არჩევაზე <strong>URL ოპციონალურ სიტყვა</strong> აქტიურს გახდის "შემცვლელ" შაბლონს ყველასთვის. როგორც წინა პუნქტში, შემდეგი არჩევანი აუქმებს წინას.</li>
+
+  <li>ქვეფოლდერები:
+ქვეფოლდერები იგნორირებულია მაგრამ, ისინი მოსახერხებელია მომდინარე პარამეტრების შეცვლისათვის.<br />
+</li>
+
+  <li>"შემცვლელის" წაშლით <strong>"პირველადი" შაბლონი</strong> ისევ აქტიუტი გახდება.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ka_GE/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>ჯგუფების სია</h2>
+
+<p>აქ თქვენ შეგიძლიათ მართოთ შექმნილი ჯგუფები.</p>
+
+<h3>დავამატოთ ჯგუფი</h3>
+
+<p>ადმინისტრატორს შეუძლია დაამატოს ჯგუფები.</p>
+
+<h3>ჯგუფების სია</h3>
+
+<p>ყოველი ელემენტის სიიდან შესაძლებელია შექმნათ:</p>
+
+
+<ul>
+  <li>გადავიდეთ მონაწილეთა სიასთან</li>
+  <li>გადავიდეთ ნებართვებთან</li>
+  <li>წავშალოთ ჯგუფი (require a confirmation checkbox)</li>
+  <li>toggle status "default" (გამოდის მოთხოვნა დასტურზე)</li>
+</ul>
+
+<h3>ძირითადი ჯგუფი</h3>
+<p>ახალი მომხმარებლები ავტომატურად ხვდებიან ამ ჯგუფში.</p>
Index: tags/2.4.0RC3/language/ka_GE/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,20 @@
+<p>არსებობს რამდენიმე საშუალება დაამატოთ ფოტოები გალერეაში:</p>
+
+<ul>
+ <li><strong>ატვირთვა ბროუზერით</strong> – ეს ყველაზე ადვილი და ოპერატიული მეთოდია. ატვირთვის საიმედობა ამ დროს დამოკიდებულია თქვენი ბროუზერის და ვებ-სერვერის შესაძლებლობაზე. თუკი თქვენ გინდათ ატვირთოთ ძალიან დიდი რაოდენობის ფოტო, ან თუკი რაიმე სახის სიძნელეს შეხვით, ყოველთვის შეგიძლიათ გამოიყენოთ ატვირთვის ალტერნატიული გზა.
+</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">გადავიდეთ ბროუზერით ატვირთვასთან</a></p>
+
+<ul>
+ <li><strong>pLoader</strong> – ეს არის პროგრამა, რომელიც გაეშვება თქვენს კომპიუტერში. გადმოიტანეთ &amp; ფოტოები ასატვირთად pLoader-ის ფანჯარაში, დაკილკეთ <em>"Upload to Piwigo"</em> და pLoader-ი შეუდგება მუშაობას. არსებობს სხვა პროგრამებიც,მაგალითად, <strong>WinToPiwigo</strong> და პლაგინი ფოტოების ექსპორტისათვის პროგრამიდან <strong>Digikam</strong>  Piwigo-ში.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">გადავიდეთ pLoader თან</a></p>
+
+<ul>
+ <li><strong>ატვირთვა FTP თი</strong> – ყველაზე რეკომენდირებული საშუალება ძალიან დიდი რაოდენობის ფოტოების ასატვირთად კლიკების მინიმალური რაოდენობით. მოამზადეთ ფოტოები ინსტრუქციის გამოყენებით. FTP თი ატვირთვა საშუალებას მოგცემთ სერვერზე ფოტოების ორგანიზებისა ისე, როგორც თქვენ ეს გინდათ.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">ატვირთვა FTP თი</a></p>
Index: tags/2.4.0RC3/language/ka_GE/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Piwigo გაძლევთ საშუალებას მართოთ მომხმარებლების ჯგუფები. ეს მოსახერხებელია პრივატული კატეგორიების ხელმისაწვდომობის მხრივ.</p>
+
+<p>თქვენ შეგიძლიათ შექმნათ ჯგუფები გვერდზე <span class="pwgScreen"> ადმინისტრირება, იდენტიფიკაცია, ჯგუფები </span> და დაამატოთ მომხმარებლები შექმნილ ჯგუფში გვერდზე <span class="pwgScreen">ადმინისტრირება, იდენტიფიკაცია, მომხმარებლები</span>.</p>
+
+<p>მომხმარებელი შესაძლოა იმყოფებოდეს რამდენიმე ჯგუფში. ნებართვა უფრო ძლიერია ვიდრე აკრძალვა: თუკი მომხმარებელი "jack" არის ჯგუფში "family" და "friends", და არის კატეგორია "Christmas 2003", რომელთანაც დაიშვებიან მხოლოდ მომხმარებლები ჯგუფიდან "family", მომხმარებელს "jack" ექნება უფლება ნახოს კატეგორია "Christmas 2003".</p>
+
Index: tags/2.4.0RC3/language/ka_GE/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/help_misc.html	(revision 14585)
@@ -0,0 +1,4 @@
+<p>მას შემდეგ რაც შექმნით გალერეას, შეცვალეთ ძირითადი მნიშვნელობები, რომლებიც პასუხს აგებენ გალერეის სახეზე, ამისათვის კორექტირება გაუკეთეთ მნიშვნელობებს გვერდზე <span class="pwgScreen"> ადმინისტრირება, გასწორება, ძირითადი </span> ყოველი ახალი მომხმარებელი იხილავს გალერეას ისეთს როგორც თქვენ ამას მიუთითებთ გასწორების დროს.</p>
+
+<p>თუკი თქვენ გაქვთ შეკითხვები, ნუ დაიზარებთ და ნუ შეგრცხვებათ მოძებნოთ პასუხები <a href="http://ru.piwigo.org/forum"> ფორუმზე </a> ან დასვათ კითხვები იქ. უფრო დეტალური ინფორმაციისათვის წაიკითხეთ <a href="http://ru.piwigo.org/doc/"> Piwigo-ს ოფიციალური დოკუმენტაცია </a>.</p>
+
Index: tags/2.4.0RC3/language/ka_GE/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,45 @@
+<fieldset>
+<legend>ფოტოებთან დაშვება</legend>
+
+<p>ყოველი ფოტოსათვის შეგიძლიათ განსაზღვროთ <strong>დაშვების უფლება</strong> (ბლოკირება). ასევე  ყოველ მომხმარებელს შეგიძლიათ მიანიჭოთ გარკვეული დაშვების უფლება (გასაღები). გთავაზობთ დაშვების 5 დონეს:</p>
+<ol>
+  <li>დახურულია ყველასათვის</li>
+  <li><em>ნაცნობები</em></li>
+  <li><em>მეგობრები (ე.ი. მეტი ვიდრე ნაცნობები)</em></li>
+  <li><em>ოჯახი (ე.ი. მეტი ვიდერ მეგობრები)</em></li>
+  <li><em>ადმინისტრატორები (ყველაზე მაღალი)</em></li>
+</ol>
+
+<p>უფრო მაღალი დონე შეიცავს უფორ დაბალი ჯგუფის დაშვებებს. მომხმარებელი, რაც უფრო მეტია მისი დაშვების უფლება, მით მეტი ფოტოს ნახვას შეძლებს.</p>
+
+<p>მაგალითად, თუკი ფოტოს "peter_wedding-0024.jpg" ("პეტის-ქორწილი-0024.jpg") აქვს დაშვების დონე<em>"ოჯახი"</em> ეს ნიშნავს, რომ:</p>
+<ul>
+  <li>Peter (პეტი) (მისი ჯგუფია <em>"ადმინისტრატორი"</em>) შეძლებს ნახოს ეს ფოტო, რადგან  <em> "ადმინისტრატორი" </em> უფლებამოსილია ნახოს ყველა ფოტო </li>
+  <li>Beth (ბეტი)(მისი ჯგუფია <em>"ოჯახი"</em> ) იგიც შეძლებს ნახოს ეს ფოტო</li>
+  <li>Mary (მარი)(რომლის ჯგუფია <em>"მეგობარი"</em>) ვერ ნახავს ამ ფოტოს</li>
+</ul>
+
+<p>მომხმარებელი, რომელსც არა აქვს უფლება ნახოს ესა თუ ის ფოტო, ვერ ნახავს ინფორმაციას კატეგორიაში შემავალი ფოტოების რაოდენობაზე, ვერც თვითონ კატეგორიას და ვერც მის სათაურს.</p>
+
+<p>თქვენ შეგიძლიათ მიანიჭოთ დაშვების უფლება მომხმარებელს მენიუში <span class="pwgScreen">ადმინისტრირება &raquo; მომხმარებელი &raquo; მართვა</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>კატეგორიებთან დაშვება</legend>
+
+<p>თუკი დაშვების დონე არ შეესაბამება თქვენს მოთხოვნებს, შეგიძლიათ მართოთ იგი გარკვეული ჯგუფისათვის ან მომხმარებლებისთვის. თქვენ შეგიძლიათ მართოთ დაშვების უფლება ფოტოებისა და კატეგორიებისათვის ერთდოულად - კონფლიქტები არ მოხდება.</p>
+
+
+<p>თქვენ შეგიძლიათ აკრძალოთ კატეგორიასთან დაშვება. კატეგორიები შეიძლება იყოს "საერთო" ან "პრივატული". დაშვების უფლების ( ჯგუფისათვის ან მომხმარებლისათვის) დაყენება შესაძლებელია მხოლოდ პირივატული კატეგორიისათვის.</p>
+
+<p>თქვენ შეგიძლიათ გახადოთ კატეგორია პრივატული ყოველი კატეგორიის თვისებების რედაქტირებით (<span class="pwgScreen">ადმინისტრირება, გალერეა, მართვა, რედაქტირება</span>) ან კატეგორიის თვისების ნახვისას (<span class="pwgScreen"> ადმინისტრირება, გალერეა, თვისება, საერთო / პრივატული </span>).</p>
+
+<p>თუკი კატეგორია პრივატულია, დაშვების უფლება შეგიძლიათ დააყენოთ სამი საშუალებით:</p>
+
+<ul>
+  <li><span class="pwgScreen">ადმინისტრირება &raquo; იდენტიფიკაცია &raquo; მომხმარებლები &raquo; ნებართვები (ბოლო სვეტი მომხმარებლის ტაბულაში)</span></li>
+  <li><span class="pwgScreen">ადმინისტრირება &raquo; იდენტიფიკაცია &raquo; ჯგუფი &raquo; ნებართვები (ბოლო სვეტი ჯგუფის ტაბულაში)</span></li>
+  <li><span class="pwgScreen">ადმინისტრირება &raquo; გალერეა &raquo; მართვა &raquo; რედაქტირება (ბმული ყოველი კატეგორიისათვის)</span></li>
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ka_GE/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Piwigo ანსხვავებს კატეგორიებს სად ინახება ელემენტები და კატეგორიებს სადაც ისინი ნაჩვენები იქნება.</p>
+
+<p>ძირითადად, ელემენტები ნაჩვენები იქნება მხოლოდ რეალური კატეგორიებიდან: ანუ ისინი, რომლებიც დაკავშირებული არიან ფოლდერებთან სერვერზე.</p>
+
+<p>იმისათვის, რომ მიაბათ ელემენტი კატეგორიას, საჭიროა მიუთითოთ იგი ელემენტის რედაქტირების გვერდზე ან ინფორმაციაში კატეგორიის ყველა ელემენტის შესახებ.</p>
+
+<p>ამ პრინციპის ცოდნით ადვილია გაიგოთ რა არის ვირტუალური კატეგორია: ესაა კატეგორია, რომელსაც არ შეესაბამება ფოლდერი სერვერზე. ვირტუალური კატეგორიები შეგიძლიათ შექმნათ გვერდზე <span class="pwgScreen"> ადმინისტრირება, კატეგორიები, მართვა </span>.</p>
+
Index: tags/2.4.0RC3/language/ka_GE/help/history.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/history.html	(revision 14585)
@@ -0,0 +1,38 @@
+<h2>ისტორია</h2>
+
+<p>ეს ეკრანი გაძლევთ საშუალებას ნახოთ ნახვების ისტორია ოპციების თანახმად, რომლებიც არჩეულია გვერდზე ადმინისტრირება - გასწორება - ისტორია.</p>
+
+<h3>სტატისტიკა</h3>
+<ul>
+  <p>თუკი თქვენ აირჩიეთ ნახვების ისტორიის შენახვა (<span
+class="pwgScreen">index.php</span> და <span
+class="pwgScreen">picture.php</span>) ტაბულაში <code>history. </code>
+მაშინ აქ იხილავთ ამ გვერდების ნახვის სტატისტიკას.</p>
+
+	<li><strong>ყველა</strong>: სტატისტიკის ნახვა წლების მიხედვით. </li>
+
+	<li><strong>წლიური სტატისტიკა</strong>: ყოველთვიური სტატისტიკის ნახვა არჩეული წლისთვის.</li>
+
+	<li><strong>თვის სტატისტიკა</strong>: ყოველდღიური სტატისტიკის ნახვა არჩეული თვისთვის.</li>
+
+	<li><strong>დღის სტატისტიკა</strong>: საათობრივი სტატისტიკის ნახვა არჩეული დღისთვის.</li>
+
+</ul>
+
+<h3>ძიება</h3>
+<ul>
+  <p>თუკი თქვენ აირჩიეთ ნახვების ისტორიის შენახვა (<span
+class="pwgScreen">index.php</span> და <span
+class="pwgScreen">picture.php</span>) ტაბულაში <code>history. </code>
+მაშინ აქ იხილავთ ამ გვერდების ნახვის სტატისტიკას დაჯგუფებულს ფილტრების მეშვეობით.</p>
+
+	<li><strong>ფილტრი თარიღზე</strong>: აირჩიეთ თარიღის ინტერვალი აქტიურობის სტატისტიკის სანახავად.</li>
+
+	<li><strong>ფილტრი ელემენტის ტიპზე</strong>: აირჩიეთ ელემენტის ტიპი აქტიურობის სტატისტიკის სანახავად.</li>
+
+	<li><strong>ფილტრი მომხმარებელზე</strong>: აირჩიეთ მომხმარებელი აქტიურობის სტატისტიკის სანახავად.</li>
+
+	<li><strong>ფილტრი ფაილის სახელზე</strong>: აირჩიეთ ფაილის სახელი აქტიურობის სტატისტიკის სანახავად.</li>
+
+	<li><strong>ფილტრი გამოსახულების ნომერზე</strong>: აირჩიეთ გამოსახულების ნომერი აქტიურობის სტატისტიკის სანახავად.</li>
+</ul>
Index: tags/2.4.0RC3/language/ka_GE/help/index.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ka_GE/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/maintenance.html	(revision 14585)
@@ -0,0 +1,49 @@
+<h2>მომსახურება</h2>
+
+<p>გვერდის შექმნის ოპტიმიზაციისათვის, Piwigo იყენებს ინფორმაციის კეშირებას. მაგალითად, იმის მაგივრად, რომ დაითვალოს ფოტოების რაოდენობა ყოველ კატეგორიაში განახლების დროს, ეს ინფორმაცია ინახება მონაცემთა ბაზაში. თეორიულად ეს ინფორმაცია კორექტული უნდა იყოს, მაგრამ ხანდახან კეშირების დროს მომხდარი შეცდომებისას, ეს ინფორმაცია არა სწორი ხდება.</p>
+
+<p>ზოგიერთი ინფორმაცია დროთა განმავლობაში გამოუსადეგარი ხდება. ამ უსარგებლო ინფორმაციის წაშლა მონაცემთა ბაზიდან, საშუალებას მოგცემთ შეინარჩუნოთ ადგილი დისკზე.</p>
+
+<ul>
+
+  <li>
+    <strong>დაუკავშირებელი ელემენტები:</strong>
+    გაჩვენებთ ფოტოებს, რომლებიც არ არიან დაკავშირებული არც ერთ ვირტუალურ კატეგორიასთან.
+  </li>
+  <li>
+    <strong>ფაილები ერთნაირი სახელით სხვა და სხვა ფოლდერში:</strong>
+    გაჩვენებთ ისეთ ფოტოებს და სხვა ფაილებს, რომლებსაც ერთნაირი სახელები აქვთ და სხვა და სხვა კატეგორიებში იმყოფებიან.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>განვაახლოთ ინფორმაცია კატეგორიებზე:</strong> ყოველი კატეგორიისათვის ხდება განახლება ან კონტროლდება შემდეგი ინფორმაცია: მშობლიური კატეგორიების სია, ფოტოების რაოდენობა, მდებარეობა ერთი დონის კატეგორიებთან, მდებარეობა ყველა კატეგორიასთან მიმართებით.</li>
+
+  <li><strong>განვაახლოთ ინფორმაცია ფოტოებზე:</strong> ყოველი ფოტოსათვის განახლდება ან        კონტროლირდება შემდეგი ინფორმაცია: სრული გზა ფაილამდე, რეიტინგი.
+  <em>გაფრთხილება</em>: არ აგერიოთ მეტამონაცემებში, რომლის სინქრონიზაციაც ხდება
+  <span class="pwgScreen">ადმინისტრირება, გალერეა, სინქრონიზაცია</span> ან ფოტოს რედაქტირების გვერდიდან.</li>
+
+  <li><strong>მონაცემთა ბაზის გასწორება და ოპტიმიზაცია:</strong>
+ ყოველი ცხრილისათვის გაკეთდება გადამოწმება, აღდგენა და ოპტიმიზაცია.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>გავწმინდოთ ისტორია:</strong> წაიშლება ყველა სტრიქონი ცხრილში <code>history</code>. 
+  გვერდზე <span class="pwgScreen">ადმინისტრირება, სპეც.ფუნქციები, ისტორია</span>
+  არ იქნება ინფორმაცია ისტორიასთან დაკავშირებით ამ ოპერაციამდე. <em>გაფრთხილება</em>:
+  ყველა მონაცემი წაიშლება და არ არის არანაირი საშუალება ინფორმაციის აღდგენისათვის.</li>
+
+  <li><strong>გავასუფთაოთ მთელი ისტორია:</strong> წაიშლება მთელი ნახვების ისტორია. ეს შემაჯამებელი ინფორმაცია გამოითვლება ისტორიის დეტალებიდან.</li>
+
+  <li><strong>გავწმინდოთ სესიები:</strong> წაიშლება მომხმარებლების დროგასული სეანსები.</li>
+
+  <li><strong>გავწმინდოთ შეტყობინებების გამოუყენებელი არხები</strong></li>
+  
+  <li><strong>გავწმინდოთ ძიების ისტორია</strong></li>
+  
+  <li><strong>გავწმინდოთ შექმნილი შაბლონები</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/ka_GE/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>შეტყობინებები</h2>
+
+<p>ეს განყოფილება შექმნილია მომხმარებლებისათვის საიტის სიახლეების დაგზავნის გასწორებისა და მართვისათვის.</p>
+
+<p>გვერდი შეიცავს სამ ჩანართს:</p>
+
+<h3>პარამეტრები</h3>
+<p>ხელმისაწვდომია მხოლოდ ადმინისტრატორისათვის, ეს არის შეტყობინებების პარამეტრები.</p>
+
+<h3>დაგზავნის სია</h3>
+<p>ხელმისაწვდომია მხოლოდ ადმინისტრატორისათვის, ეს ჩანართი მართავს მომხმარებლების ხელმოწერას და შეტყობინებებს.</p>
+
+<h3>გაგზავნა</h3>
+<p>ხელმისაწვდომია მხოლოდ ადმინისტრატორისათვის, ეს ჩანართი გაძლევთ საშუალებას მოახდინოთ შეტყობინებების დაგზავნა.</p>
+
Index: tags/2.4.0RC3/language/ka_GE/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/permalinks.html	(revision 14585)
@@ -0,0 +1,8 @@
+<h2>მუდმივი ბმულები</h2>
+
+<p>მუდმივ ბმულებს იყენებენ რიოდესაც საჭიროა კატეგორიის URL გახდეს უფრო მოხერხებული. როდესაც კატეგორიისათვის გარკვეულია პირდაპირი ბმული, კატეგორიის id, URL-ში აღარ გამოიყენება.</p>
+
+<p>პირდაპირი ბმულის წაშლის შემდეგ, თქვენ შეგიძლიათ შეინახოთ იგი პირდაპირი ბმულების ისტორიაში, რათა შეინარჩუნოთ შიდა ბმულების მოქმედუნარიანობა. პირდაპირი ბმულების ისტორიის ცხრილში შესაძლებელია წაშლის თარიღის, ბოლოს როდის გამოიყენეთ, სულ რამდენჯერ გამოყენეთ ინფორმაციის ნახვა.</p>
+
+<p>ყურადღება მიაქციეთ, შესაძლებელია მხოლოდ ერთი პირდაპირი ბმულის გამოყენება თითო კატეგორიისათვის.
+ანალოგიურად, პირდაპირი ბმულების ისტორიაში არ შეიძლება ერთი და იგივე პირდაპირი ბმულის გამოყენება რამდენჯერმე.</p>
Index: tags/2.4.0RC3/language/ka_GE/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,112 @@
+<fieldset>
+  <legend>სწრაფი სტარტი</legend>
+
+<ol>
+
+  <li>შექმენით ლოკალური ფოლდერი "test_category".</li>
+
+  <li>გადაიტანეთ ფოტოები "test_category" -ში.</li>
+
+  <li>დაუკავშირდით გალერეას FTP -თი.</li>
+
+  <li>ატვირთეთ ლოკალური ფოლდერი "test_category" დაშორებულ ფოლდერში "galleries".
+  დააყენეთ დაშვების უფლება 777 ფოლდერზე "galleries/test_category".</li>
+
+  <li>შედით თქვენს Piwigo გალერეაში როგორც ადმინისტრატორი.</li>
+
+  <li>გადადით <span class="pwgScreen">ადმინისტრირება, ფოტოები,მინიატურები</span>. Piwigo იპოვის ფოტოებს მინიატურების გარეშე "test_category" -ში  და მოგთხოვთ დასტურს მინიატურების შექმნაზე.</li>
+
+  <li>გადადით <span class="pwgScreen">ადმინისტრირება, გალერეა, სინქრონიზაცია</span>. აღნიშნეთ "ფოლდერები და ფაილები", მოხსენით აღნიშვნა "მხოლოდ ტესტირება (არ შევიტანოთ ცვლილებები მონაცემთა ბაზაში)" და დაკლიკეთ გაგზავნა.</li>
+
+  <li>მორჩა. თქვენ შექმენით კატეგორია "test_category" თქვენი გალერეის ფუძეში.</li>
+
+</ol>
+
+</fieldset>
+<fieldset>
+  <legend>ფოტოების დამატება</legend>
+
+<ul>
+
+  <li>
+
+    <p>კატეგორიის ფოლდერები განლაგებულია ფოლდერ "galleries" -ში.
+    ქვევით ნახეთ პატარა გალერეის წყობა:</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>უმარტივეს შემთხვევაში კატეგორიები წარმოდგენილია როგორც ნებისმიერი დონის ფოლდერები ფოლდერში  "galleries". ყოველი კატეგორია შეიძლება შეიცავდეს იმდენ ქვეკატეგორიას რამდენიც გნებავთ. მაგალითში მაღლა, category-1.1.1.1 მდებარეობს მე-4 დონეზე.</li>
+
+  <li>ყოველი ფაილი - ესაა ფოტო. ფაილი შეიძლება იყოს Piwigo-ს ელემენტი, თუკი მისი ტიპი აღწერილია პარამეტრში <code>file_ext</code>
+  (ნახე ფაილი <span  class="filename">include/config_default.inc.php</span>).</li>
+
+  <li>ფოტოს უნდა ქონდეს მინიატურა (ნახე ქვემოთ განყოფილება მინიატურებზე)</li>
+
+  <li>ფოტოს შესაძლოა ქონდეს ვერსია დიდი გაფართოებით, როგორც wedding.jpg მაგალითში მაღლა. ფოტოს დიდი გაფართოებით არ აქვს პრეფიქსი.</li>
+
+  <li>ელემენტები, რომლებიც არ არიან ფოტოები (ვიდეო, მუსიკა, ტექსტი და ა.შ.) წარმოდგენილი არიან ამ ფაილის შესაბამისი მინიატურებით. დამატებით, თქვენ შეგიძლიათ დაუკავშიროთ მინიატურა და წარმომადგენლობითი ფაილი (ნახე video.avi მაგალითში მაღლა).</li>
+
+  <li><em>ყურადღება</em>: ფოლდერების და ფაილების სახელი უნდა შედგებოდეს ასოების, რიცხვების, "-", "_" ან "." -საგან. ნუ გამოიყენებთ დაშორებებს.</li>
+
+  <li><em>ცნობისათვის</em>: კატეგორია შეიძლება შეიცავდეს ელემენტებს და ქვეკატეგორიებს ერთდოულად. მიუხედავად ამისა, რეკომენდირებულია ყოველი კატეგორიისათვის აირჩიოთ, შეიცავს იგი ელემენტებს თუ კატეგორიებს.</li>
+
+  <li>როდესაც ფაილები, მინიატურები და წარმომადგენლები სწორად არიან ფოლდერში განლაგებულნი, აირჩიეთ:
+  <span class="pwgScreen">ადმინისტრირება, კატეგორიები, სინქრონიზაცია</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>მინიატურები</legend>
+
+<ul>
+
+  <li>როგორც ვთქვით, ყოველ ფოტოს უნდა ქონდეს მინიატურა.</li>
+
+  <li>მინიატურები განლაგებულია კატეგორიის ფოლდერის ქვეფოლდერში "thumbnail".
+  მინიატურა - ესაა სურათი რომელსაც ფაილის სახელში აქვს პრეფიქსი, რომელიც მითითებულია მინიატურის პრეფიქსის გასწორებაში (ნახე პანელი ადმინისტრირება, გასწორება, ძირითადი).</li>
+
+  <li>არ არის აუცილებელი მინიატურებსაც ისეთივე გაფართოება ქონდეთ როგორც ორიგინალ ფოტოებს (ფოტოს გაფართოებით .jpg შეიძლება ქონდეს მინიატურა გაფართოებით .GIF).</li>
+
+  <li>რჩევა: გამოიყენეთ შიდა მოდული მინიატურების შესაქმნელად.</li>
+
+  <li>თქვენ ასევე შეგიძლიათ გამოიყენოთ სკრიპტის შესაძლებლობები (<span class="pwgScreen"> ადმინისტრირება, ფოტოები,მინიატურები</span>), თუმცა ამის გაკეთება არ არის რეკომენდირებული. სამწუხაროდ, მინიატურების ხარისხი შეიძლება არც თუ ისე მაღალი იყოს ხოლო პროცესორზე დატვირთვა საკმაოდ მაღალია, რამაც შესაძლოა პრობლემები შეგიქმნათ უფასო ჰოსტინგის გამოყენების შემთხვევაში.</li>
+
+  <li>თუკი მაინც გამოიყენებთ სკრიპტის შესაძლებლობებს, საჭიროა ნებართვა ჩაწერაზე კატეგორიის ყველა ფოლდერში და ქვეფოლდერში "thumbnail".</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ka_GE/help/search.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/search.html	(revision 14585)
@@ -0,0 +1,20 @@
+<h2> ძიება </h2>
+
+<p> ეს გვერდი საშუალებას გაძლევთ მოძებნოთ ფოტოები მთელს გალერეაში.</p>
+
+<dl>
+
+  <dt> ძიება სიტყვებით </dt>
+  <dd> ძიება ყველა სიტყვით ყველა ატრიბუტით გალერეის ყველა ფოტოში.
+  გამოიყენეთ * როგორც მიმაგრებული ნიშანი ნაწილობრივი დამთხვევისათვის. </dd>
+
+  <dt> ძიება ავტორის მიხედვით </dt>
+  <dd> გამოიყენეთ * როგორც მიმაგრებული ნიშანი ნაწილობრივი დამთხვევისათვის.</dd>
+
+  <dt> ძიება თარიღის მიხედვით </dt>
+  <dd> აირჩიეთ საწყისი ან/და საბოლოო თარიღი მოთხოვნისათვის. დატოვეთ ცარიელი საწყისი თარიღი "ადრინდელის" მოსაძებნად. წელი უნდა ჩაწეროთ ბოლო ველში ფორმატში 0000 (ანუ 2010) </dd>
+
+  <dt> ძიება კატეგორიებში </dt>
+  <dd> აირჩიეთ კატეგორია ან კატეგორიები ძიების რაიონის შეცამცირებლად. ქვეკატეგორიაში მოსაძებნად შეგიძლიათ აირჩიოთ კატეგორია და დასვათ ქვეკატეგორიებში ძიების ალამი. </dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ka_GE/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/site_manager.html	(revision 14585)
@@ -0,0 +1,39 @@
+<h2>დაშორებული საიტები</h2>
+
+<p>Piwigo გთავაზობთ შესაძლებლობას გამოიყენოთ რამდენიმე სერვერი, რომლებზეც შეინახავთ თქვენს ფოტოებს, რომლისგანაც შედგება თქვენი გალერეა. ეს ძალიან მოსახერხებელია, თუკი გაქვთ ფოტოების ძალზე დიდი რაოდენობა, რომლის გამოყენებასაც აპირებთ გალერეაში და სერვერზე ადგილი შეზღუდულია.</p>
+
+<ol>
+
+  <li>რედაქტირება გაუკეთეთ ფაილს <span class="filename">tools/create_listing_file.php</span>,
+  შეცვალეთ სექციის პარამეტრები
+  <code>$conf['prefix_thumbnail']</code> ან
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>მოათავსეთ შეცვლილი ფაილი <span class="filename">tools/create_listing_file.php</span>
+  დაშორებულ სერვერზე, ფოლდერში სადაც დევს კატეგორიის ფოლდერები (როგორც ფოლდერი <span class="filename">galleries</span> ამ ვებ საიტზე) FTP-ს გამოყებებით. მაგალითად, ვთქვათ, თქვენ შეგიძლიათ მიმართოთ <span
+  class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>გადადით<span class="pwgScreen">ადმინისტრირება, გალერეა, საიტების მართვა</span>. შექმენით ახალი საიტი, მაგალითად <span class="filename">http://example.com/galleries</span>.</li>
+
+  <li>ახალი დაშორებული საიტი დარეგისტრირებულია. თქვენ შეგიძლიათ ჩაატაროოთ 4 მოქმედება:
+
+    <ol>
+
+      <li><strong>ლისტინგის გენერირება</strong>: ჩართავს მოთხოვნას ლისტინგის ფაილს გენერაციაზე</li>
+
+      <li><strong>სინქრონიზაცია</strong>: კითხულობს დაშორებულ ფაილს <span class="filename">listing.xml</span> და ახდენს მონაცემთა ბაზასთან სინქრონიზაციას.</li>
+
+      <li><strong>გასუფთავება</strong>: ასუფთავებს დაშორებულ ფაილს <span class="filename">listing.xml</span>.</li>
+
+      <li><strong>წაშლა</strong>: შლის საიტს (ყველა კატეგორიას და ელემენტებს) მონაცემთა ბაზაში.</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>You can do all this by hand by generating yourself the <span
+class="filename">listing.xml</span> file, moving it from your distant server
+to you local Piwigo root directory and opening the remote site
+management screen : Piwigo will propose you to use the found
+listing.xml file.</p>-->
+
Index: tags/2.4.0RC3/language/ka_GE/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/synchronize.html	(revision 14585)
@@ -0,0 +1,9 @@
+<h2>სინქრონიზაცია</h2>
+
+<p>შესაძლებელია სინქრონიზაციის 2 ტიპი: ფოლდერები/ფაილები და მეტამონაცემები.
+ფოლდერები/ფაილები სინქრონიზირებული იქნება ფოლდერები მონაცემთა ბაზაში ფოლდერებთან.
+მეტამონაცემები სინქრონიზირებული იქნება ინფორმაცია ელემენტებზე, ისეთი როგორიც არის ფაილის ზომა, ზომები პიქსელებში, ინფორმაცია EXIF ან IPTC.</p>
+
+<p>თავიდან სინქრონიზირებული უნდა იყოს ფოლდერები/ფაილები.</p>
+
+<p>სინქრონიზაციის პროცესმა შესაძლოა დიდი ხანი გასტანოს ( დამოკიდებულია სერვერის დატვირთვაზე და სინქრონიზირებული ელემენტების რაოდენობაზე) ანუ  შესაძლოა ღირდეს ნაბიჯ-ნაბიჯ გააკეთოთ: კატეგორიიდან კატეგორიამდე.</p>
Index: tags/2.4.0RC3/language/ka_GE/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,10 @@
+<h2>მინიატურების შექმნა</h2>
+<p>ეს გვერდი საშუალებას გაძლევთ შექმნათ დანაკლისი მინიატურები.</p>
+<dl>
+<dt>ვერსია GD</dt>
+<dd>GD - ესაა გარფიკული ბიბლიოთეკა PHP-სათვის. აირჩიეთ ვერსია, რომელიც დაყენებულია თქვენს სერვერზე. არასწორი ვერსიის არჩევისას გამოვა შეტყობინება შეცდომის შესახებ. დაბრუნდით უკან და აირჩიეთ სხვა ვერსია. თუკი არც ერთი ვერსია არ მუშაობს, მაშინ თქვენს სერვერს არ გააჩნია GD მხარდაჭერა.</dd>
+<dt>სიგანე და სიმაღლე</dt>
+<dd>მიუთითეთ მაქსიმალური ზომა მინიატურისათვის. მხარეთა შეფარდება შენარჩუნებული იქნება.</dd>
+<dt>შესაქმნელი მინიატურების რაოდენობა</dt>  <dd>ნუ ეცდებით დააპატარაოთ ერთდროულად ბევრი ფოტო. დაპატარავება ტვირთავს CPU-ს. თუ სკრიპტი დაყენებულია უფასო პროვაიდერის სერვერზე, ძალიან დიდმა დატვირთვამ თქვენი საიტის მხრიდან, შესაძლებელია გამოიწვიოს საიტის გათიშვა ან მისი წაშლა სერვერიდან.</dd>
+<dt>ფაილის ფორმატი</dt>
+<dd>მინიატურის ფაილს აქვს მხოლოდ JPEG გაფართოება. მინიატურები შეიძლება შეიქმნას მხოლოდ ფაილებისათვის  PNG და JPEG გაფართოებით.</dd></dl>
Index: tags/2.4.0RC3/language/ka_GE/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/ka_GE/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/help/user_list.html	(revision 14585)
@@ -0,0 +1,29 @@
+<h2>მომხმარებლების სია</h2>
+
+<p>ამ გვერდზე თქვენ შეგიძლიათ მართოთ დარეგისტრირებული მომხმარებლები. მარტო ნებართვების მართვა შესაძლებელია რამდენიმე ეკრანზე.</p>
+
+<h3>მომხმარებლების დამატება</h3>
+
+<p>ადმინისტრატორს შეუძლია ხელით დაამატოს მომხმარებელი.</p>
+
+<h3>მომხმარებლების სია</h3>
+
+<p>სია შეიძლება გაფილტრული იქნეს მომხმარებლის სახელის მიხედვით (გამოიყენეთ * როგორც მიმაგრებული ნიშანი ნაწილობრივი დამთხვევისათვის), ჯგუფის ან სტატუსის მიხედვით. სია შეიძლება  გადარჩეულ იქნეს  მომხმარებლის რეგისტრაციის ან სახელის მიხედვით, მატებით ან კლებით.</p>
+
+<p>ეს ეკრანი საშუალებას გაძლევთ ერთი და იგივე მოქმედება ჩაატაროთ რამდენიმე მომხმარებლის მიმართ:</p>
+
+<ul>
+
+  <li>მომხმარებლის წაშლა (საჭიროა თანხმობა ნიშნის ჩასმით)</li>
+
+  <li>სტატუსის შეცვლა</li>
+
+  <li>ჯგუფში ჩართვა ან გამორთვა</li>
+
+  <li>გამოსახულების მნიშვნელობის რედაქტირება</li>
+
+  <li>დამატებითი თვისებების რედაქტირება</li>
+
+</ul>
+
+<p>გასწორებები შეეხება არჩეულ მომხმარებლებს (ძირითადად) თუ ყველას.</p>
Index: tags/2.4.0RC3/language/ka_GE/index.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ka_GE/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'დაყენება';
+$lang['Basic configuration'] = 'საბაზო გასწორება';
+$lang['Default gallery language'] = 'პრიორიტეტული ენა';
+$lang['Database configuration'] = 'მონაცემთა ბაზის გასწორება';
+$lang['Admin configuration'] = 'ადმინისტრირების გასწორება';
+$lang['Start Install'] = 'დავიწყოთ დაყენება';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'ელ.ფოსტის მისამართი უნდა გავდეს  xxx@yyy.eee (მაგალითად: jack@altern.org)';
+
+$lang['Webmaster login'] = 'ვებმასტერის სახელი(ლოგინი)';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'მას დაინახავენ მნახველები.საჭიროა საიტის ადმინისტრირებისათვის';
+
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'წარმატებით დაუკავშირდით სერვერს,მაგრამ მონაცემთა ბაზასთან დაკავშირება შეუძლებელია';
+$lang['Can\'t connect to server'] = 'შეუძლებელია სერვერთან დაკავშირება';
+
+$lang['Host'] = 'MySQL ხოსტი';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'მომხმარებელი';
+$lang['user login given by your host provider'] = 'სახელი(ლოგინი),რომელიც პროვაიდერმა მოგცათ';
+$lang['Password'] = 'პაროლი';
+$lang['user password given by your host provider'] = 'პაროლი,რომელიც პროვაიდერმა მოგცათ';
+$lang['Database name'] = 'მონაცემთა ბაზის სახელი';
+$lang['also given by your host provider'] = 'ასევე გაიცემა პროვაიდერის მიერ.ხშირად ემთხვევა სახელს(ლოგინს)';
+$lang['Database table prefix'] = 'ცხრილის პრეფიქსი მონაცემთა ბაზაში';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'ცხრილის სათაური დაიწყება ამითი(რაც გააადვილებს მის მომსახურებას)';
+$lang['enter a login for webmaster'] = 'საჭიროა შეიყვანოთ ლოგინი ვებმასტერისათვის';
+$lang['webmaster login can\'t contain characters \' or "'] = 'ლოგინი ვებმასტერისათვის არ უნდა შეიცავდეს სიმბოლოებს  \' ან "';
+$lang['please enter your password again'] = 'პაროლი კიდევ ერთხელ';
+$lang['Webmaster password'] = 'ვებმასტერის პარილო';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'არ გაუმხილოთ არავის,იგი საჭიროა ადმინისტრირების პანელთან დასაშვებად';
+$lang['Password [confirm]'] = 'გაიმეორეთ პაროლი';
+$lang['verification'] = 'კიდევ ერთხელ,შეცდომის გამოსარიცხად';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'გჭირდებათ დახმარება?დასვით შეკითხვები <a href="%s">Piwigo–ს ფორუმზე</a>.';
+$lang['Webmaster mail address'] = 'ვებმასტერის ელ.ფოსტა';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'გამოყენებული იქნება მომხმარებლების მიერ ადმინისტრატორთან კავშირისათვის';
+
+$lang['PHP 5 is required'] = 'საჭიროა PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'სავარაუდოდ თქვენი ხოსტინგი ამჟამად იყენებს PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo–ს შეუძლია შეეცადოს გადართოს თქვენი კონფიგურაცია PHP 5, .htaccess ფაილს შექმნით ან შეცვლით.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'აღნიშნეთ,რომ თქვენ შეგიძლიათ თქვენით შეცვალოთ კონფიგურაცია და ამის შემდეგ ახლიდან გაუშვით Piwigo.';
+$lang['Try to configure PHP 5'] = 'შვეცადოთ PHP 5 გადაკონფიგურირება';
+$lang['Sorry!'] = 'ბოდიში!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo–ს არ შეუძლია PHP 5 გადაკონფიგურირება.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'თქვენ უნდა მიმართოთ პროვაიდერს დახმარებისა და განმარტებისათვის ტუ როგორ მოახერხოთ PHP 5 ზე გადართვა.';
+$lang['Hope to see you back soon.'] = 'იმედი გავქვს მალე შემოგვიერთდებით.';
+$lang['Congratulations, Piwigo installation is completed'] = 'გილოცავთ,Piwigo–ს დაყენება დამთავრებულია';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'ალტერნატიული გადაწყვეტილება მდგომარეობს შემდეგში,შეგიძლიათ დააკოპიროთ ტექსტი მაღლა ბლოკიდან და ჩასვათ ამ ფაილში "local/config/database.inc.php"   (გაფრთხილება: database.inc.php უნდა შეიცავდეს მხოლოდ იმას რაც წერია textarea–ში, თავისუფალი ადგილების და დაბრუნების ხაზების გარეშე)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'კონფიგურაციის ფაილის local/config/database.inc.php შექმნა არ მოხერხდა.';
+$lang['Download the config file'] = 'ავტვირთოთ კონფიგურაციის ფაილი';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'თქვენ შეგიძლიათ ატვირთოთ კონფიგურაციის ფაილი და გადასცეთ იგი local/config directory ში.';
+?>
Index: tags/2.4.0RC3/language/ka_GE/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ka_GE/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+ქართული [GE]
Index: tags/2.4.0RC3/language/ka_GE/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ka_GE/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ka_GE/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'განახლება';
+$lang['Upgrade from version %s to %s'] = 'განახლება %s ვერსიიდან %s ვერსიამდე';
+$lang['Statistics'] = 'სტატისტიკა';
+$lang['total upgrade time'] = 'განახლების საერთო დრო';
+$lang['total SQL time'] = 'SQL საერთო დრო';
+$lang['SQL queries'] = 'SQL მოთხოვნა';
+$lang['Upgrade informations'] = 'ინფორმაცია განახლებებზე';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'განახორციელეთ მომსახურება [ადმინისტრირება>ინსტრუმენტები>მომსახურება] თუკი შეგექმნათ რაიმე პრობლემა.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'მხოლოდ ადმინისტრტორს შეუძლია განახლების გაშვება: შეამოწმეთ ქვევით.';
+$lang['You do not have access rights to run upgrade'] = 'თქვენ არ გაქვთ განახლების გაშვების უფლება';
+$lang['All sub-albums of private albums become private'] = 'პრივატული (კერძო) კატეგორიის ყველა ქვეკატეგორია იქნება პრივატული';
+$lang['User permissions and group permissions have been erased'] = 'მომხმარებლების და ჯგუფების დაშვების უფლებები წაშლილია';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'მხოლოდ ესკიზების პრეფიქსები და ვებმასტერის ფოსტის მისამართი იქნა შენახული წინა კონფიგურაციიდან';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'ეს გვერდი გთავაზობთ მონაცემთა ბაზის მოდერნიზაციას,თქვენი Piwigo ძველი ვერსიიდან ახალ ვერსიამდე. განახლების დამხმარე საშუალება ფიქრობს,რომ თქვენ ამჟამად იყენებთ <b> ვერსია %s </b> (ან ეკვივალენტურს).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'სასურველია,რომ შემდეგი პლაგინები დეზაქტივირებული იყოს. თქვენ უნდა შეამოწმოთ პლაგინების განახლება მანამდე,სანამ მოახდენთ მათ აქტივაციას:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] =' %s, მდე ?>, ჩავსვათ:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'უსაფრთხოების მიზნით შემდეგი თემები გამორთულია. თქვენ უნდა შეამოწმოთთემების განახლება? სანამ მათ ახლიდან ჩართავთ:';
+?>
Index: tags/2.4.0RC3/language/km_KH/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/km_KH/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/km_KH/admin.lang.php	(revision 14585)
@@ -0,0 +1,163 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Add to caddie'] = 'ដាក់​ចូល​ទៅ​ក្នុង​កូន​ប្រអប់';
+$lang['Notification'] = "ការ​ផ្តល់​ដំណឹង​";
+$lang['Upload Photos'] = 'បញ្ចូល​រូប​ថត​';
+$lang['Select an album'] = 'ជ្រើស​រើស​សៀវ​ភៅ​រូប​ថត​';
+$lang['... or '] = '... ឬ ';
+$lang['create a new album'] = 'បង្កើត​សៀវ​ភៅ​រូប​ថត​ថ្មី​មួយ';
+$lang['Select files'] = 'ជ្រើស​រើស​រូប​ថត​';
+$lang['Start Upload'] = 'ចាប់​ផ្តើម​បញ្ចូល​';
+$lang['Learn more'] = 'ស្វែ​ងយល់​បន្ថែម​';
+$lang['Maximum file size: %sB.'] = 'ទំហំ​រូប​អតិ​បរមា​: %sB.';
+$lang['Allowed file types: %s.'] = 'អនុញ្ញាត​ឯកសារ​ប្រភេទ​: %s.';
+$lang['+ Add an upload box'] = '+ បន្ថែម​ប្រអប់​មួយ​ទៀត​';
+$lang['Add another set of photos'] = 'បន្ថែម​សំនុំ​រូប​មួយ​ផ្សេង​ទៀត​';
+$lang['Photo %s of %s'] = 'រូប​ថត​ទី %s នៃ %s';
+$lang['%d photos uploaded'] = '%d រូប​ថត​បាន​បញ្ចូល​';
+$lang['All %d photos are selected'] = 'រូប​ថត​ទាំង​អស់​ %d ត្រូវ​បាន​ជ្រើស​រើស​';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'អ្នក​កំពុង​ប្រើ​ប្រាស់​ Browser uploader. សាក​ល្បង​ប្រើ​ <a href="%s">Flash uploader</a> ជំនួស​វិញ';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'អ្នក​កំពុង​ប្រើ​ប្រាស់​ Flash uploader. មាន​បញ្ហា​? សាក​ល្បង​ប្រើ​ <a href="%s">Browser uploader</a> ជំនួស​វិញ​';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension not available, admin should disable exif use ផ្នែក​បន្ថែម​ Exif មិន​អាច​ដំណើរ​ការ​បាន​។ អ្នក​គ្រប់​គ្រង​គួរ​តែ​ទៅ​បិទ exif use';
+$lang['Hide'] = "លាក់​";
+$lang['ACCESS_0'] = "ចូល​ដំណើរ​ការ​សេរី";
+$lang['ACCESS_1'] = "ដំណើរ​ការសំរាប់​​ទាំង​អស់​";
+$lang['ACCESS_2'] = "ដំណើរ​ការ​សំរាប់​អ្នក​ចុះឈ្មោះ​ប្រើ​ប្រាស់​";
+$lang['ACCESS_3'] = "ដំណើរ​ការ​សំរាប់​អ្នក​គ្រប់​គ្រង​";
+$lang['ACCESS_4'] = "ដំណើរ​ការ​សំរាប់​ប្រធាន​បណ្តាញ​ធំ​";
+$lang['ACCESS_5'] = "មិន​អាច​ដំណើរ​ការ​បាន​";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "ទំនាក់​ទំនង​";
+$lang['Level 2'] = "មិត្ត​ភក្តិ​";
+$lang['Level 4'] = "គ្រួ​សារ​";
+$lang['Level 8'] = "អ្នក​គ្រប់​គ្រង​";
+$lang['%d album including'] = 'សៀវ​ភៅ​រូប​ថត %d កំពុង​ដាក់​បញ្ចូល';
+$lang['%d album moved'] = 'សៀវ​ភៅ​រូប​ថត %d បានផ្លាស់​ប្តូរ​ទី​តាំង​​';
+$lang['%d albums including'] = 'សៀវ​ភៅ​រូប​ថត %d កំពុង​បញ្ចូល';
+$lang['%d albums moved'] = 'សៀវ​ភៅ​រូប​ថត %d បាន​ផ្លាស់​ប្តូរ​ទី​តាំង​';
+$lang['%d anomalies have been detected corrected.'] = 'ភាព​ខុស​ប្រក្រតីចំនួន​ %d ត្រូវ​បាន​រក​ឃើញ​ និង​បាន​កែ​ប្រែ';
+$lang['%d anomalies have been detected.'] = 'ភាព​ខុស​ប្រក្រ​តី​ចំនួន​ %d ត្រូវ​បាន​រក​ឃើញ​';
+$lang['%d anomalies have been ignored.'] = 'ភាព​ខុស​ប្រក្រ​តី​ចំនួន​ %d មិន​បាន​ទទួល​យក';
+$lang['%d anomalies have not been corrected.'] = 'ភាព​មិន​ប្រ​ក្រ​តី​ចំនួន​ %d មិ​នទាន់​​បាន​កែ​ប្រែ​';
+$lang['%d anomaly has been corrected.'] = 'ភាព​មិន​ប្រ​ក្រ​តី​ចំនួន​ %d ត្រូវ​បាន​កែ​ប្រែ​';
+$lang['%d anomaly has been detected.'] = 'ភាព​មិន​ប្រ​ក្រ​តី​ចំនួន​ %d ត្រូវ​បាន​រក​ឃើញ​';
+$lang['%d anomaly has been ignored.'] = 'ភាព​មិន​ប្រ​ក្រ​តី​ចំនួន​ %d មិន​បាន​ទទួល​យក';
+$lang['%d anomaly has not been corrected.'] = 'ភាព​មិន​ប្រ​ក្រ​តី​ចំនួន %d មិន​ទាន់​បាន​កែ​ប្រែ';
+$lang['%d group'] = '%d ក្រុម​';
+$lang['%d groups'] = '%d ក្រុម​';
+$lang['%d guest'] = 'ភ្ញៀវ​ %d នាក់​​';
+$lang['%d guests'] = 'ភ្ញៀវ​ %d នាក់​';
+$lang['%d line filtered'] = '​ច្រោះ​យក​ %d បន្ទាត់';
+$lang['%d lines filtered'] = 'ច្រោះ​យក​ %d បន្ទាត់​';
+$lang['%d mail was not sent.'] = 'អ៊ីម៉ែល​ចំនួន %d មិន​បាន​ផ្ញើ​ចេញ​ទេ';
+$lang['%d mail was sent.'] = 'អ៊ី​ម៉ែល​ចំនួន​ %d បាន​ផ្ញើ​ចេញ​';
+$lang['%d mails were not sent.'] = 'អ៊ី​ម៉ែល​ចំនួន​ %d មិន​បាន​ផ្ញើ​ចេញ​ទេ​';
+$lang['%d mails were sent.'] = 'អ៊ី​ម៉ែល​ចំនួន​ %d បាន​ផ្ញើ​ចេញ';
+$lang['%d member'] = 'សមាជិក​ %d នាក់​';
+$lang['%d members'] = 'សមា​ជិក​ %d នាក់​';
+$lang['%d of %d photos selected'] = '%d នៃ​ %d រូប​ថត​បាន​ជ្រើស​រើស​';
+$lang['%d photo was deleted'] = 'រូប​ថត​ %d បា​ន​លុប';
+$lang['%d photos were deleted'] = 'រូប​ថត​ %d បាន​លុប';
+$lang['%d physical'] = '%d រូប​សណ្ឋាន​';
+$lang[' and %d virtual'] = ' និង​ %d  សៀវ​ភៅ​រូប​ថត​រង​';
+$lang['Photo Properties'] = 'លក្ខណៈ​នៃ​រូបថត​';
+$lang['Photo name'] = 'ឈ្មោះ​រូប​ថត​';
+$lang['Name'] = 'ឈ្មោះ';
+$lang['Description'] = ' ពិពណ៌នា';
+$lang['Parent album'] = 'សៀវ​ភៅ​រូប​ថត​មេ';
+$lang['Album name'] = 'ឈ្មោះ​សៀវ​ភៅ​រូប​ថត';
+$lang['Create'] = 'បង្កើត​';
+$lang['Original Size'] = 'ទំ​ហំដើម​';
+$lang['A locked gallery is only visible to administrators'] = 'វិចិត្រ​សាលដែល​ត្រូវ​បាន​ការ​ពារ គឺ​អាច​មើល​ឃើញ​សំរាប់តែ​អ្នក​គ្រប់​គ្រង​តែ​ប៉ុណ្ណោះ';
+$lang['Unlock gallery'] = 'វិចិត្រ​សាល​​លែង​ការ​ពារ';
+$lang['Gallery unlocked'] = ' វិចិត្រ​សាលលែង​ត្រូវ​បាន​ការ​ពារ​';
+$lang['Notify administrators when a comment is'] = 'ផ្តល់​ដំណឹង​អ្នក​គ្រប់​គ្រង​ពេល​មាន​មតិ​';
+$lang['modified'] = 'បាន​​កែ​ប្រែ​';
+$lang['pending validation'] = 'ការ​បញ្ជាក់​សុពល​ភាព កំពុង​ស្ថិត​ក្នុង​ការ​រង​ចាំ​';
+$lang['Save visits in history for'] = 'រក្សា​ការ​ទស្សនា​ក្នុង​កំណត់​ត្រា​';
+$lang['simple visitors'] = 'ភ្ញៀវ​ធម្មតា';
+$lang['registered users'] = 'អ្នក​ប្រើ​ប្រាស់​បាន​ចុះ​ឈ្មោះ​';
+$lang['administrators'] = 'អ្នក​គ្រប់​គ្រង​';
+$lang['%d association'] = '%d រូប​ថត​ពាក់​ព័ន្ធ​';
+$lang['%d associations'] = '%d រូប​​ពាក់​ព័ន្ធ​';
+$lang['%d parameter was updated.'] = '%d parameter បាន​បន្ទាន់​សម័យ.';
+$lang['%d parameters were updated.'] = '%d parameters បាន​បន្ទាន់​សម័យ.';
+$lang['%d tag'] = '%d ស្លាក';
+$lang['%d tags'] = '%d ស្លាក';
+$lang['%d user comment rejected'] = '%d មតិ​អ្នក​ប្រើ​ប្រាស់​បាន​ច្រាន​ចោល';
+$lang['%d user comment validated'] = '%d មិត​អ្នក​ប្រើ​ប្រាស់​មាន​សុពល​ភាព';
+$lang['%d user comments rejected'] = '%d មតិ​អ្នក​ប្រើ​ប្រាស់​បាន​ច្រាន​ចោល';
+$lang['%d user comments validated'] = '%d មិត​អ្នក​ប្រើ​ប្រាស់​មាន​សុពល​ភាព';
+$lang['%d user deleted'] = 'អ្នក​ប្រើ​ប្រាស់​ %d បានលុប';
+$lang['%d user was not updated.'] = '%d អ្នក​ប្រើ​ប្រាស់​មិន​បាន​បន្ទាន់​សម័យ.';
+$lang['%d user was updated.'] = '%d អ្នក​ប្រើ​ប្រាស់​បាន​បន្ទាន់​សម័យ';
+$lang['%d user'] = '%d អ្នក​ប្រើ​ប្រាស់​';
+$lang['%d users deleted'] = 'អ្នក​ប្រើ​ប្រាស់​​ %d បាន​លុប';
+$lang['%d users were not updated.'] = 'អ្នក​ប្រើ​ប្រាស់​ %d មិន​បាន​បន្ទាន់​សម័យ';
+$lang['%d users were updated.'] = 'អ្នក​ប្រើ​ប្រាស់ %d បាន​បន្ទាន់​សម័យ';
+$lang['%d users'] = '%d អ្នក​ប្រើ​ប្រាស់​';
+$lang['%d waiting for validation'] = '%d កំពុង​រង​ចាំ​ការ​បញ្ជាក់​សុពល​ភាព​';
+$lang['%s has been successfully updated.'] = '%s បាន​បន្ទាន់​សម័យ​ដោយ​ជោគ​ជ័យ​';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s ត្រូវ​តែប្តូរ​ទៅ false ក្នុង​ទី​តាំង​ local/config/config.inc.php';
+$lang['%s photos can not be regenerated'] = '%s រូប​ថត​មិន​អាច​កែ​ប្រែ​ឡើង​វិញ';
+$lang['%s photos have been regenerated'] = '%s រូប​ថត​បាន​កែ​ប្រែ​ឡើង​វិញ​';
+$lang['%s value is not correct file because exif are not supported'] = '%s តំលៃមិន​ត្រឹម​ត្រូវ​ ព្រោះ exif ពុំ​ត្រឹម​ត្រូវ​';
+$lang['(this tag will be deleted)'] = '(ស្លាក​នេះនឹង​ត្រូវ​លុប)';
+$lang[', click on'] = ', ចុច​លើ​';
+$lang['A new version of Piwigo is available.'] = 'កំណែ​ប្រែ​ថ្មីនៃ Piwigo អាច​ស្វែង​រក​សំរាប់​ប្រើ​ប្រាស់​បាន​';
+$lang['Access type'] = 'ប្រភេ​ទ​នៃការ​ចូល​';
+$lang['Action'] = 'សកម្មភាព​';
+$lang['Actions'] = 'សកម្ម​ភាព​';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activate icon "ថ្មី​" បន្ទាប់​ពី​សៀវ​ភៅ​រូប​ថត​និង​រូប​ភាព​';
+$lang['Activate icon "%s"'] = 'ដាក់​ឲ្យ​តំ​ណើរ​ការ​រូប​តំណាង​ "%s"';
+$lang['Activate Navigation Bar'] = 'ដាក់​ឲ្យ​តំណើរ​ការ​ផ្ទាំង​បង្ហាញផ្លូវ​';
+$lang['Activate Navigation Thumbnails'] = 'ដាក់​ឲ្យ​តំណើរ​ការ​រូប​បង្ហាញ់​ផ្លូវ';
+$lang['Activate comments'] = 'ដាក់​ឲ្យ​ដំណើរ​ការ​មតិ';
+$lang['Activate'] = 'ដាក់​ឲ្យ​តំណើរ​ការ​';
+$lang['Active Languages'] = 'តំណើរ​ការ​ភាសា​';
+$lang['Active Plugins'] = 'ដំណើរ​ការ​ Plugins';
+$lang['Active Themes'] = 'ដំណើរ​ការ​ Themes';
+$lang['Add a criteria'] = 'បន្ថែម​លក្ខណៈ​វិនិច្ឆ័យ​មួយ​';
+$lang['Add a filter'] = 'បន្ថែម​តំរង​មួយ​';
+$lang['Add a tag'] = 'បន្ថែម​ស្លាក​មួយ​';
+$lang['Add a user'] = 'បន្ថែម​អ្នក​ប្រើ​ប្រាស់​មួយ​';
+$lang['Add a virtual album'] = 'បន្ថែម​សៀវ​ភៅ​រូប​ថត​រង​មួយ​';
+$lang['Add detailed content'] = 'បន្ថែម​មាតិកា​លម្អិត​ខ្លះ​ៗ​';
+$lang['Add group'] = 'បន្ថែម​ក្រុម​';
+$lang['Add New Language'] = 'បន្ថែម​ភាសា​ថ្មី​';
+$lang['add new photos to caddie'] = 'បន្ថែម​រូប​ថត​ថ្មី​ទៅក្នុង​ caddie';
+$lang['Add New Theme'] = 'បន្ថែម​ theme ថ្មី​មួយ​';
+$lang['Add Photos'] = 'បន្ថែម​រូប​ថត​ផ្សេង​ទៀត​';
+$lang['Add tags'] = 'បន្ថែម​ស្លាក​ផ្សេង​ទៀត​';
+$lang['Add write access to the "%s" directory'] = 'បន្ថែម​ការ​អនុញ្ញាត​សរសេរ​បន្ថែម​ទៅ​សៀវ​ភៅ​ "%s"';
+$lang['Add'] = 'បន្ថែម​';
+$lang['Add/delete a permalink'] = 'បន្ថែម​/លុប​ permalink មួយ​';
+$lang['added'] = 'បាន​បន្ថែម​';
+$lang['Administration Home'] = 'ទំ​ព័រ​ដើម​អ្នក​គ្រប់​គ្រង​';
+$lang['Advanced features'] = 'លក្ខណៈ​ពិសេស​';
+$lang['Album "%s" has been added'] = 'សៀវ​ភៅ​រូប​ថត​ "%s" ត្រូវ​បាន​បន្ថែម​';
+
+?>
Index: tags/2.4.0RC3/language/km_KH/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/km_KH/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/km_KH/common.lang.php	(revision 14585)
@@ -0,0 +1,409 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: ភាសាខ្មែរ [KH]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=579
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "ភាសាខ្មែរ​";
+$lang_info['country'] = "ប្រទេសកម្ពុជា";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "en";
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d សៀវ​ភៅ​រូប​ថត​បាន​អាប់​ដែត​';
+$lang['%d albums updated'] = '%d សៀវ​ភៅ​រូប​ថត​ជា​ច្រើន​បាន​អាប់​ដែត​';
+$lang['%d comment to validate'] = '%d បញ្ចេញ​មតិដើម្បី​បញ្ជាក់​';
+$lang['%d comment'] = '%d បញ្ចេញមតិ';
+$lang['%d comments to validate'] = '%d បញ្ចេញ​មតិ​ផ្សេងៗ​ដើម្បី​បញ្ជាក់​';
+$lang['%d comments'] = '%d មតិ​ផ្សេងៗ';
+$lang['%d hit'] = '%d ដង';
+$lang['%d hit'] = '%d ចុច';
+$lang['%d hits'] = '%d ដង';
+$lang['%d Kb'] = '%d​ Kb';
+$lang['%d new comment'] = '%d មតិ​ថ្មី​';
+$lang['%d new comments'] = '%d មតិ​ថ្មីៗ​';
+$lang['%d new photo'] = '%d រូបថត​ថ្មី​';
+$lang['%d new photos'] = '%d រូប​ថត​ថ្មីៗ';
+$lang['%d new user'] = '%d អ្នក​ប្រើ​ប្រាស់​ថ្មី​';
+$lang['%d new users'] = '%d ​អ្នក​ប្រើ​ប្រាស់​ថ្មី​ច្រើន​នាក់​';
+$lang['%d rates'] = '%d ការ​វាយ​តម្លៃ​ទាំង​ឡាយ​';
+$lang['About'] = 'អំពីវិបសាយ';
+$lang['All tags'] = 'ស្លាក​ទាំងអស់';
+$lang['Any tag'] = 'ស្លាក​ផ្សេង​ទៀត​';
+$lang['At least one listed rule must be satisfied.'] = 'យ៉ាងហោច​ណាស់​​បញ្ជីអត្ថបទ​មួយ​ត្រូវ​​ធ្វើ​ឲ្យ​បាន​ត្រឹម​ត្រូវ​សិន';
+$lang['Author'] = 'ម្ចាស់​រូប​ថត';
+$lang['Albums'] = 'សៀវ​ភៅ​រូប​ថត​ទាំងអស់';
+$lang['Album'] = 'សៀវ​ភៅ​រូប​ថត​';
+$lang['Close this window'] = 'បិទ​ផ្ទាំង​មួយ​នេះ';
+$lang['Confirm Password'] = 'បញ្ជាក់​អក្សរ​សម្ងាត់​';
+$lang['Connection settings'] = 'ការ​កំណត់​បណ្តាញ​ភ្ជាប់​';
+$lang['Login'] = 'ចូល';
+$lang['Contact webmaster'] = 'ទំនាក់ទំនង អ្នកជំនាញ​ខាងវិបសាយ​';
+$lang['Create a new account'] = 'បង្កើត​គណនី​ថ្មី';
+$lang['Created on'] = 'បាន​បង្កើត​នៅ​​';
+$lang['Creation date'] = 'ថ្ងៃ​ដែល​បាន​​បង្កើត​';
+$lang['Current password is wrong'] = 'អក្សរ​សម្ងាត់​​នេះ​ខុស​';
+$lang['Dimensions'] = 'ទំហំ';
+$lang['Display'] = 'បង្ហាញ';
+$lang['Each listed rule must be satisfied.'] = 'គ្រប់​បញ្ជីអត្ថបទ​ទាំង​អស់​ត្រូវ​តែធ្វើ​ឲ្យ​បាន​ត្រឹម​ត្រូវ​សិន';
+$lang['Email address'] = 'អាស័យដ្ឋាន​អេឡិច​ត្រូ​និច​';
+$lang['Enter your personnal informations'] = 'បញ្ចូល​ពត៌​មាន​ផ្ទាល់​ខ្លួន​របស់​អ្នក​';
+$lang['Error sending email'] = 'មាន​បញ្ហា​កើត​ឡើង​ពេល​កំពុង​ផ្ញើ​សារ​អេ​ឡិច​ត្រូនិច';
+$lang['File name'] = 'ឈ្មោះ​ឯកសារ';
+$lang['File'] = 'ឯកសារ​';
+$lang['Filesize'] = 'ទំហំ​ឯកសារ';
+$lang['Filter and display'] = 'ច្រោះយក​ និង​ បង្ហាញ';
+$lang['Filter'] = 'ច្រោះ​យក​';
+$lang['Forgot your password?'] = 'ភ្លេច​អក្សរ​សម្ងាត់​របស់​អ្នក?';
+$lang['Go through the gallery as a visitor'] = 'ចូលក្នុង​វិចិត្រ​សាល​ក្នុង​នាម​ជា​ភ្ញៀវ';
+$lang['Help'] = 'ជំនួយ';
+$lang['Identification'] = 'អត្ត​សញ្ញាណ​';
+$lang['Photos only RSS feed'] = 'រូប​ភាព​សំរាប់​តែ RSS feed';
+$lang['Keyword'] = 'ពាក្យ​គន្លឹះ';
+$lang['Links'] = 'តំណភ្ជាប់​ជាច្រើន';
+$lang['day'][0] = "ថ្ងៃ​អាទិត្យ";
+$lang['day'][1] = "ថ្ងៃ​ច័ន្ទ";
+$lang['day'][2] = "ថ្ងៃ​អង្គារ";
+$lang['day'][3] = "ថ្ងៃ​ពុធ";
+$lang['day'][4] = "ថ្ងៃ​ព្រហស្បត្តិ៍";
+$lang['day'][5] = "ថ្ងៃ​សុក្រ";
+$lang['day'][6] = "ថ្ងៃ​​សៅរ៍";
+$lang['month'][10] = "ខែ​តុលា​";
+$lang['month'][11] = "ខែ​វិច្ឆិកា";
+$lang['month'][12] = "ខែ​ធ្នូ";
+$lang['month'][1] = "ខែ​មករា";
+$lang['month'][2] = "ខែ​កុម្ភះ";
+$lang['month'][3] = "ខែ​មិនា";
+$lang['month'][4] = "ខែ​មេសា";
+$lang['month'][5] = "ខែ​ឧសភា";
+$lang['month'][6] = "ខែ​​មិថុនា";
+$lang['month'][7] = "ខែ​កក្តដា";
+$lang['month'][8] = "ខែ​សីហា";
+$lang['month'][9] = "ខែ​កញ្ញា";
+$lang['Delete'] = 'លុប';
+$lang['descending'] = 'តាម​លំដាប់​ចុះ';
+$lang['Download'] = 'ទាញ​យក​';
+$lang['Download this file'] = 'ទាញ​យក​ឯកសារ​នេះ​';
+$lang['edit'] = 'កែ​ប្រែ​';
+$lang['wrong date'] = 'ខុស​ថ្ងៃ​ខែ​';
+$lang['excluded'] = 'បាន​ដក​ចោល​';
+$lang['Your favorites'] = 'ចំណង់​ចំណូល​ចិត្ត​របស់​អ្នក​';
+$lang['display your favorites photos'] = 'បង្ហាញ​រូប​ភាព​ដែល​អ្នក​ចូល​ចិត្ត​ទាំង​អស់';
+$lang['Favorites'] = 'ចំណូលចិត្ត​';
+$lang['First'] = 'ដំបូង​';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'វិចិត្រសាលបាន​បិទ​មិនឲ្យ​មាន​ការ​ជួស​ជុល​ទេ។ សូម​ព្យា​យាម​លើក​ក្រោយ​ទៀត។';
+$lang['Page generated in'] = 'ទំព័រ​បាន​បង្កើត​ក្នុង​';
+$lang['guest'] = 'ភ្ញៀវ';
+$lang['Hello'] = 'សួរស្តី';
+$lang['Notification'] = 'ការ​ជូន​ដំណឹង';
+$lang['Number of items'] = 'ចំនួន​នៃ​ធាតុ​';
+$lang['Original dimensions'] = 'ទំហំ​ដើម';
+$lang['Password forgotten'] = 'ភ្លេច​អក្សរ​សម្ងាត់​';
+$lang['Password'] = 'អក្សរ​សម្ងាត់​';
+$lang['Post date'] = 'ថ្ងៃ​ដាក់​ផ្សាយ​ប្រ​កាស​';
+$lang['Posted on'] = 'បាន​ផ្សាយ​ប្រកាសនៅ​ថ្ងៃ';
+$lang['Profile'] = 'គណនី';
+$lang['Quick connect'] = 'ភ្ជាប់​រហ័ស';
+$lang['RSS feed'] = 'RSS ព័ត៌មានផ្តល់មក​វិញ​';
+$lang['Rating score'] = 'ពិន្ទុ​នៃ​ការ​វាយ​តម្លៃ';
+$lang['Register'] = 'ចុះ​ឈ្មោះ';
+$lang['Registration'] = 'ការ​ចុះ​ឈ្មោះ​';
+$lang['Related tags'] = 'ស្លាក​ដែល​ទាក់​ទង​';
+$lang['Reset'] = 'ដាក់​ឲ្យ​ដូច​ដើម​';
+$lang['Retrieve password'] = 'ទាញ​យក​អក្សរ​សម្ងាត់​មក​វិញ​';
+$lang['Search rules'] = 'ស្វែងរក​លក្ខណៈ​វិនិច្ឆ័យ';
+$lang['Search tags'] = 'ស្វែងរក​ស្លាក​';
+$lang['Search'] = 'ស្វែង​រក​';
+$lang['display available tags'] = 'បង្ហាញ​ស្លាក​ទំនេរ​';
+$lang['Sort by'] = 'តម្រៀប​តាម​​';
+$lang['Sort order'] = 'តម្រៀប​តាម​លំដាប់​';
+$lang['Tag'] = 'ស្លាក​';
+$lang['Tags'] = 'ស្លាក';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = ' RSS ផ្តល់​ពត៌​មាន​​ទាំង​ឡាយ​ដែល​ជា​ ​ដំណឹង​នៃព្រឹត្តិការណ៍​ថ្មី​ៗ​ដែល​មាន​នៅ​លើ​គេហទំព័រ​មួយ​នេះដូចជា៖ ពេល​មាន​រូប​ថត​ថ្មីៗ ការ​កែ​ប្រែ​សៀវ​ភៅ​រូប​ថត​ថ្មី​ៗ​ មតិថ្មីៗ។ ដើម្បី​ប្រើ​ RSS ផ្តល់​ពត៌​មាន​សំរាប់​អ្នក​អាន​';
+$lang['Unknown feed identifier'] = 'មិន​ស្គាល់អ្វី​សំរាប់​​បង្ហាញ​ពត៌​មាន​មក​វិញ';
+$lang['User comments'] = 'មតិ​អ្នក​ប្រើ​ប្រាស់​';
+$lang['Username'] = 'ឈ្មោះ​អ្នក​ប្រើ​ប្រាស់​';
+$lang['Visits'] = 'ចូល​';
+$lang['Webmaster'] = 'ប្រធាន​បណ្តាញ';
+$lang['Week %d'] = 'សប្តាហ៍ %d';
+$lang['About Piwigo'] = 'អំពី Piwigo';
+$lang['You are not authorized to access the requested page'] = 'អ្នក​មិន​អនុញ្ញាតឲ្យ​ចូល​ទៅ​កាន់​ទំព័រ​នេះ​ទេ';
+$lang['add this photo to your favorites'] = 'ដាក់​រូប​ថត​នេះ​ទៅ​កាន់​ទី​តាំង​​ដែល​អ្នក​ចូល​ចិត្ត​';
+$lang['Administration'] = 'អ្នក​គ្រប់​គ្រង';
+$lang['all'] = 'ទាំង​អស់​';
+$lang['ascending'] = 'តាម​លំដាប់​កើន​';
+$lang['author(s) : %s'] = 'ក្រុម​អ្នក​និ​ពន្ធ​ : %s';
+$lang['Expand all albums'] = 'ពង្រីក​សៀវ​ភៅ​រូប​ថត​ទាំង​អស់​';
+$lang['posted after %s (%s)'] = 'បាន​ផ្សាយ​ប្រ​កាស​បន្ទាប់​ពី %s (%s)';
+$lang['posted before %s (%s)'] = 'បាន​ផ្សាយ​ប្រកាស​មុន​ពេល​ %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'បាន​ផ្សាយ​ប្រ​កាស​ចន្លោះ %s (%s) និង %s (%s)';
+$lang['posted on %s'] = 'បានផ្សាយ​​ប្រ​កាសលើ​ %s';
+$lang['Best rated'] = 'ការ​វាយ​តម្លៃ​ល្អ​ជាង​គេ​';
+$lang['display best rated photos'] = 'បង្ហាញ​រូ​ប​ថត​ដែល​បាន​វាយ​តម្លៃ​ខ្ពស់​ជាង​គេ';
+$lang['Calendar'] = 'ប្រតិទិន';
+$lang['All'] = 'ទាំង​អស់';
+$lang['display each day with photos, month per month'] = 'បង្ហាញ​រាល់​ថ្ងៃ​នូវ​រូប​ថត​ ក្នុង​មួយ​ខែ​ៗ​';
+$lang['View'] = 'បើកមើល';
+$lang['chronology_monthly_calendar'] = 'ប្រតិទិន​ប្រ​ចាំ​ខែ​';
+$lang['chronology_monthly_list'] = 'តារាង​ប្រ​ចាំ​ខែ​';
+$lang['chronology_weekly_list'] = 'តារាង​ប្រ​ចាំ​សប្តាហ៍';
+$lang['Click here if your browser does not automatically forward you'] = '​ចុច​ត្រង់​នេះ​ ប្រ​សិន​បើ​ Browser របស់​អ្នក​មិន​ដំណើរ​កា​រ​ទៅ​មុខ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['comment date'] = 'ថ្ងៃ​​បញ្ចេញ​មតិ​';
+$lang['Comment'] = 'មតិ';
+$lang['Your comment has been registered'] = 'មតិ​របស់​អ្នក​បាន​ដាក់​បញ្ចូល​';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'ប្រ​ព័ន្ធ Anti-flood: សូម​រង​ចាំ​មួយ​ភ្លេត​ មុន​ពេលទៅ​បញ្ចេញ​មតិ​មួយ​ផ្សេង​ទៀត​';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'មតិ​របស់​អ្នក​មិន​ត្រូវ​បាន​បញ្ចូល​ទេ ព្រោះវា​មិន​ត្រឹម​ត្រូវ​តាម​ការ​កំណត់​';
+$lang['An administrator must authorize your comment before it is visible.'] = 'អ្នក​គ្រប់​គ្រង​ត្រូវ​តែ​ផ្តល់​សិទ្ធិ​ជាមុន​លើ​មតិ​របស់​អ្នក​​ មុន​ពេល​វា​អាច​បង្ហាញ​';
+$lang['This login is already used by another user'] = 'ឈ្មោះ​នេះ​ត្រូវ​បាន​ប្រើ​ដោយ​អ្នក​ប្រើ​ប្រាស់​ម្នាក់​រួច​ហើយ';
+$lang['Comments'] = 'មតិ​';
+$lang['Add a comment'] = 'បញ្ចូល​មតិ';
+$lang['created after %s (%s)'] = 'បានបង្កើត​បន្ទាប់​ពី​ %s (%s)';
+$lang['created before %s (%s)'] = 'បាន​បង្កើត​មុន​ពេល​ %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'បាន​បង្កើត​ចន្លោះ %s (%s) និង %s (%s)';
+$lang['created on %s'] = 'បាន​បង្កើត​នៅ​ %s';
+$lang['Customize'] = 'រៀប​ចំ​កែ​សំរួល​';
+$lang['Your Gallery Customization'] = 'ការ​កែ​ប្រែ​សៀវ​ភៅ​រូប​ថត​របស់​អ្នក​';
+$lang['Default'] = 'លំនាំដើម​';
+$lang['delete this photo from your favorites'] = 'លុប​រូ​ប​ថត​នេះ​ចេញពី​ចំណូល​ចិត្ត​របស់​អ្នក​';
+$lang['available for administrators only'] = ' សំរាប់​តែ​អ្នក​គ្រប់​គ្រង​ប៉ុណ្ណោះ​';
+$lang['display this album'] = 'បង្ហាញ​សៀវ​ភៅ​រូប​ថត​នេះ​';
+$lang['display last user comments'] = 'បង្ហាញ​មតិ​របស់​អ្នក​ប្រើ​ប្រាស់​ចុង​ក្រោយ​';
+$lang['customize the appareance of the gallery'] = 'កែ​សំរួល​ទំរង់​បង្ហាញ​នៃ​វិចិត្រ​សាល​';
+$lang['search'] = 'ស្វែង​រក​';
+$lang['Home'] = 'ទំព័រ​ដើម​';
+$lang['in this album'] = 'ក្នុង​សៀវ​ភៅ​រូប​ថត​នេះ​';
+$lang['in %d sub-album'] = 'ក្នុង​ %d សៀវ​ភៅ​រូប​ថត​រង​';
+$lang['in %d sub-albums'] = 'ក្នុង​ %d សៀវ​ភៅ​រូប​ថត​រង​';
+$lang['included'] = 'បាន​បញ្ចូល​ក្នុង​';
+$lang['Invalid password!'] = 'អក្សរ​សម្ងាត់​មិន​ត្រឹម​ត្រូវ​ទេ​';
+$lang['Language'] = 'ភាសា';
+$lang['last %d days'] = ' %d ថ្ងៃ​ចុង​ក្រោយ​';
+$lang['Last'] = 'ចុង​ក្រោយ​';
+$lang['Logout'] = 'ចាក​ចេញ​';
+$lang['Since'] = 'តាំងពី';
+$lang['obligatory'] = 'ដែល​ចាំ​បាច់​';
+$lang['Maximum photo height'] = 'កំពស់​វែង​បំផុត​នៃរូប​ថត​';
+$lang['Maximum height must be a number superior to 50'] = 'កំពស់​វែង​បំ​ផុត​ត្រូវ​តែ​ជា​លេខ​ដែល​មាន​តំលៃ​ធំ​ជាង​ ៥០';
+$lang['Maximum photo width'] = 'ទទឹង​វែង​បំ​ផុត​នៃ​រូប​ថត​';
+$lang['Maximum width must be a number superior to 50'] = 'ទទឹង​វែង​បំផុត​ត្រូវ​តែ​ជា​លេខ​មាន​តំលៃធំជាង​ ៥០';
+$lang['display a calendar by creation date'] = 'បង្ហាញ​ប្រតិទិន​​​ដោយ​ពិនិត្យ​តាម​ថ្ងៃ​បង្កើត​';
+$lang['display all photos in all sub-albums'] = 'បង្ហាញ​រូប​ថត​ទាំង​អស់​ដែល​មាន​នៅ​ក្នុង​សៀវ​ភៅ​រូប​ថត​រងទាំង​ឡាយ';
+$lang['return to normal view mode'] = 'ត្រឡប់​ទៅ​ការ​បង្ហាញ​បែប​សាមញ្ញ​';
+$lang['display a calendar by posted date'] = 'បង្ហាញ​ប្រតិទិន​ដោយ​ពិនិត្យ​តាម​ថ្ងៃ​ដែល​បាន​ប្រ​កាស​';
+$lang['Most visited'] = 'ទស្សនា​ច្រើន​ជាង​គេ​បំផុត​';
+$lang['display most visited photos'] = 'បង្ហាញ​រូប​ដែល​បាន​ទស្សនា​ច្រើ​ន​ជាង​គេ';
+$lang['The number of photos per page must be a not null scalar'] = 'ចំនួន​នៃ​រូប​ថត​ក្នុង​មួយ​ទំព័រ​ត្រូវ​តែ​ជា​ចំនួន​គត់​មិន​សូន្យ​';
+$lang['Number of photos per page'] = 'ចំនួន​រូប​ថត​ក្នុង​មួយ​ទំព័រ';
+$lang['Unknown identifier'] = 'មិន​ស្គាល់​អត្ត​សញ្ញាណ​';
+$lang['New password'] = 'អក្សរ​សម្ងាត់​ថ្មី​';
+$lang['Rate this photo'] = 'វាយ​តម្លៃ​រូប​ថត​នេះ​';
+$lang['Next'] = 'បន្ទាប់​';
+$lang['no rate'] = 'មិន​មាន​ការ​វាយ​តម្លៃ​';
+$lang['Photos posted within the last %d day.'] = 'រូប​ថត​ដែល​បាន​ដាក់​នៅ​រយះ​ពេល​ %d ថ្ងៃ​ប៉ុណ្ណោះ';
+$lang['Photos posted within the last %d days.'] = 'រូប​ថត​ដែល​បាន​ដាក់​នៅ​រយះ​ពេល​ %d ថ្ងៃ​ប៉ុណ្ណោះ';
+$lang['password updated'] = 'អក្សរ​សម្ងាត់​បាន​កែ​ប្រែ​';
+$lang['Recent period must be a positive integer value'] = 'ចន្លោះពេល​ថ្មីៗ​ត្រូវ​តែ​ជា​ចំនួន​គត់​វិជ្ជមាន​';
+$lang['photo'] = 'រូប​ថត​';
+$lang['Click on the photo to see it in high definition'] = 'ចុច​លើ​រូប​ថត​ដើម្បី​មើល​វា​ក្នុង​កំរិត​កាន់​តែ​ច្បាស់​';
+$lang['Show file metadata'] = 'បង្ហាញ​ឯកសារ​ metadata';
+$lang['Powered by'] = 'ដាក់​ឲ្យ​ប្រើ​ប្រាស់​ដោយ​';
+$lang['Preferences'] = 'ចូល​ចិត្ត​ជាង​';
+$lang['Previous'] = 'មុន​';
+$lang['Random photos'] = 'រូប​ភាព​ចៃ​ដន្យ​';
+$lang['display a set of random photos'] = 'បង្ហាញ​សំណុំ​នៃ​រូប​ភាព​ចៃ​ដន្យ​';
+$lang['Recent albums'] = 'សៀវភៅ​រូប​ថត​ថ្មី​ៗ';
+$lang['display recently updated albums'] = 'បង្ហាញ​សៀវ​ភៅ​រូប​ថត​ទើប​កែ​ប្រែ​ថ្មី​ៗ';
+$lang['Recent period'] = 'រយះ​ពេល​ថ្មីៗ';
+$lang['Recent photos'] = 'រូប​ថត​ថ្មីៗ';
+$lang['display most recent photos'] = 'បង្ហាញ​រូប​ថត​ថ្មីៗ​បំផុត​';
+$lang['Redirection...'] = 'កំពុង​ភ្ជាប់​ទៅ​...';
+$lang['Please, enter a login'] = 'សូម​ភ្ជាប់​ចូល​ក្នុង​ប្រព័ន្ធ​';
+$lang['login mustn\'t end with a space character'] = 'ការ​ភ្ជាប់​ចូល​ត្រូវ​តែ ​មិន​បញ្ចប់​ដោយ​មានដក​ឃ្លា​នៅ​ខាង​ក្រោយ​ទេ​';
+$lang['login mustn\'t start with a space character'] = 'ការ​ភ្ជាប់​ចូល​ត្រូវ​តែ​ មិន​ចាប់​ផ្តើម​ជាមួយ​ដក​ឃ្លា​';
+$lang['this login is already used'] = 'ការ​ភ្ជាប់​ចូល​ជាមួយ​ឈ្មោះ​នេះ​ បាន​ប្រើ​ប្រាស់​រួច​ហើយ';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'អាស័យដ្ឋាន​សារ​អេឡិច​ត្រូនិច​ត្រូវ​តែ​ក្នុង​ទំ​រង់​ xxx@yyy.eee (example : jack@altern.org)';
+$lang['please enter your password again'] = 'សូម​បញ្ចូល​អក្សរ​សម្ងាត់​របស់​អ្នក​ម្តង​ទៀត​';
+$lang['Auto login'] = 'ភ្ជាប់​ចូល​ដោយ​ស្វ័យ​ប្រវត្តិ';
+$lang['remove this tag from the list'] = 'លុបស្លាក​នេះ​ចេញ​ពី​តារាង​';
+$lang['representative'] = 'រូប​ជា​គំរប​នៃ​សៀវ​ភៅ​រូប​ថត​';
+$lang['Search for Author'] = 'ស្វែង​រក​អ្នក​និ​ពន្ធ​ម្នាក់​';
+$lang['Search in albums'] = 'ស្វែង​រក​ក្នុង​សៀវ​ភៅ​រូប​ថត​';
+$lang['Search by date'] = 'ស្វែង​រក​តាម​រយះ​ថ្ងៃ​ខែ';
+$lang['Date'] = 'ថ្ងៃ​ខែ';
+$lang['End-Date'] = 'ថ្ងៃ​ខែ​បញ្ចប់​';
+$lang['Kind of date'] = 'ប្រ​ភេទ​នៃ​ពេល​វេលា​';
+$lang['Search for words'] = 'ស្វែង​រក​ពាក្យ​';
+$lang['Search for all terms'] = 'ស្វែង​រក​​ពាក្យ​ទាំង​អស់​';
+$lang['Search for any term'] = 'ស្វែង​រក​ពាក្យ​ផ្សេង​ៗ';
+$lang['Empty query. No criteria has been entered.'] = 'សំណួរទទេ. គ្មាន​ការ​វិនិច្ឆ័យ​ត្រូវ​បាន​បញ្ចូល';
+$lang['Search results'] = 'លទ្ធ​ផល​នៃ​ការ​ស្វែង​រក';
+$lang['Search in sub-albums'] = 'ស្វែង​រក​ក្នុង​សៀវ​ភៅ​រូប​ថត​រង​ទាំង​អស់​';
+$lang['searched words : %s'] = 'បាន​ស្វែង​រក​ពាក្យ​ : %s';
+$lang['Contact'] = 'ទាក់​ទង​';
+$lang['set as album representative'] = 'ដាក់​ជា​គំរប​សៀវភៅ​រូប​ថត​';
+$lang['Show number of comments'] = 'បង្ហាញ​ចំនួន​មតិ​ទាំង​អស់​';
+$lang['Show number of hits'] = 'បង្ហាញ​ចំនួន​នៃ​ការ​ទស្សនា​ទាំង​អស់​';
+$lang['slideshow'] = 'បង្ហាញ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['stop the slideshow'] = 'បញ្ឈប់​ការ​បង្ហាញ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['Specials'] = 'ពិសេស​';
+$lang['SQL queries in'] = 'SQL queries ក្នុង​';
+$lang['display only recently posted photos'] = 'បង្ហាញ​តែ​រូប​ថត​ដែល​ទើប​បាន​ប្រកាស​ថ្មី​ៗ';
+$lang['return to the display of all photos'] = 'ត្រឡប់​ទៅ​បង្ហាញ​រូប​ថត​ទាំង​អស់​';
+$lang['the beginning'] = 'ចាប់​ផ្តើម​ដំបូង​';
+$lang['Interface theme'] = 'រូប​រាង​ផ្ទៃសំរាប់​​បង្ហាញ​';
+$lang['Thumbnails'] = 'រូប​គំរប​ផ្ទៃ​លើ​';
+$lang['Menu'] = 'មីនុយ​';
+$lang['A comment on your site'] = 'មតិ​មួយ​នៅ​លើ​ប្រព័ន្ធ​របស់​អ្នក​';
+$lang['today'] = 'ថ្ងៃ​នេះ';
+$lang['Update your rating'] = 'កែ​សំរួល​ជាថ្មី​លើ​ការ​វាយ​តម្លៃ​របស់​អ្នក​';
+$lang['the username must be given'] = 'ឈ្មោះ​សំរាប់​ប្រើ​ប្រាស់​ តម្រូវ​ឲ្យ​ដាក់​';
+$lang['useful when password forgotten'] = 'សំរាប់​ប្រើ​ក្នុង​ករណី​​ភ្លេច​អក្សរ​សម្ងាត់​';
+$lang['Quick search'] = 'ស្វែង​រក​រហ័ស​';
+$lang['Connected user: %s'] = 'អ្នក​ប្រើ​ប្រាស់​ដែល​បាន​ភ្ជាប់​: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Browser: %s';
+$lang['Author: %s'] = 'អ្នក​និ​ពន្ធ​: %s';
+$lang['Comment: %s'] = 'មតិ: %s';
+$lang['Comment by %s'] = 'មាន​មតិ​ដោយ​ %s';
+$lang['User: %s'] = 'អ្នក​ប្រើ​ប្រាស់​: %s';
+$lang['Email: %s'] = 'សារ​អេ​ឡិច​ត្រូ​និច​: %s';
+$lang['Admin: %s'] = 'អ្នក​គ្រប់​គ្រង​: %s';
+$lang['Registration of %s'] = 'ការ​ចុះ​ឈ្មោះ​នៃ​ %s';
+$lang['Album: %s'] = 'សៀវ​ភៅ​រូប​ថត​: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'ប្រភេទ​អាក្រក់​សំរាប់​អ្នក​ប្រើ​ប្រាស់​ជា "ភ្ញៀវ", ប្រភេទ​​បែប​លំនាំ​ដើម​នឹង​ត្រូវ​យក​មក​ប្រើវិញ​។ សូម​ផ្តល់​ដំណឹង​ដល់​ប្រ​ធាន​បណ្តាញឲ្យ​បាន​ដឹង។';
+$lang['this email address is already in use'] = 'សារអេ​ឡិច​ត្រូ​និច​នេះ​បាន​ប្រើ​ប្រាស់​រួច​ហើយ​';
+$lang['Album results for'] = 'លទ្ធផល​សៀវ​ភៅ​រូប​ថត​សំរាប់​';
+$lang['Tag results for'] = 'លទ្ធផល​នៃ​ស្លាក​សំរាប់​';
+$lang['from %s to %s'] = 'ចាប់​ពី %s ទៅ %s';
+$lang['Play of slideshow'] = 'ចាប់​ផ្តើ​ម​បង្ហាញ​រូប​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['Pause of slideshow'] = 'ផ្អាក​​រូប​ដើរ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['Repeat the slideshow'] = 'បង្ហាញ​រូប​ស្វ័យ​ប្រ​វត្តិ​ សារ​ចុះ​ឡើង​​';
+$lang['Not repeat the slideshow'] = 'មិន​បង្ហាញ​រូប​ស្វ័យ​ប្រវត្តិ​ សារ​ចុះ​ឡើង';
+$lang['Reduce diaporama speed'] = 'បន្ថយ​ល្បឿន​រូប​បង្ហាញ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['Accelerate diaporama speed'] = 'បង្កើន​ល្បឿន​រូប​បង្ហាញ​ដោយ​ស្វ័យ​ប្រវត្តិ​';
+$lang['Submit'] = 'ដាក់​សំ​ណើរ​';
+$lang['Yes'] = 'យល់​ព្រម​';
+$lang['No'] = 'ទេ';
+$lang['%d photo'] = '%d រូប​';
+$lang['%d photos'] = '%d រូប​​';
+$lang['%d photo is also linked to current tags'] = '%d រូប​ថត​បាន​ភ្ជាប់​ទៅ​កាន់​ស្លាក​ថ្មី​ៗ​';
+$lang['%d photos are also linked to current tags'] = '%d​ រូប​ថត​បាន​ភ្ជាប់​ទៅ​កាន់​ស្លាក​ថ្មី​ៗ​';
+$lang['display photos linked to this tag'] = 'បង្ហាញ​រូប​ថត​ទាំង​ឡាយ​ដែល​បាន​ភា្ជប់​ទៅ​កាន់​ស្លាក​នេះ​';
+$lang['photos posted during the last %d days'] = 'រូប​ថត​ដែល​បាន​ដាក់​ចូល​ក្នុង​កំឡុង​ពេល​ %d ថ្ងៃ​ចុង​ក្រោយ​';
+$lang['Piwigo Help'] = 'ជំនួយ​ពី Piwigo';
+$lang['Rank'] = 'ជួរ​';
+$lang['group by letters'] = 'ក្រុម​តាម​លំដាប់​អក្សរ';
+$lang['letters'] = 'អក្សរ​';
+$lang['show tag cloud'] = 'បង្ហាញ​​ស្លាកដែល​ពេញ​និយម​​';
+$lang['cloud'] = 'ពពក​';
+$lang['Reset to default values'] = 'កំណត់​ទៅ​​តម្លៃតាម​លំនាំ​​ដើម​វិញ​';
+$lang['delete all photos from your favorites'] = 'លុប​រូប​ថត​ទាំង​អស់​ពី​តារាង​ចំណូល​ចិត្ត​របស់​អ្នក​';
+$lang['Sent by'] = 'បាន​​ផ្ញើរ​ដោយ​';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies បាន​គាំង​ ឬក៏ មិន​ត្រូវ​ជាមួយ browser របស់​លោក​អ្នក​។ លោក​អ្នក​ត្រូវ​តែ​ធ្វើ​ឲ្យ​​ cookies ដំណើរ​ការ​ប្រើ​បាន​ ដើម្បី​ភ្ជាប់​ចូល​។';
+$lang['Edit a comment'] = 'កែ​ប្រែ​មតិ​មួយ​';
+$lang['Are you sure?'] = 'តើ​អ្នក​ប្រា​កដច្បាស់​​ហើយ​ឬ​នៅ​?';
+$lang['(!) This comment requires validation'] = '(!) ការ​ដាក់​មតិ​នេះ​តំរូវ​ឲ្យ​មាន​លក្ខណះ​ត្រឹម​ត្រូវ​';
+$lang['Welcome'] = 'សូម​ស្វាគមន៍';
+$lang['Complete RSS feed (photos, comments)'] = 'បញ្ចូល​ពត៌មាន RSS រួច​រាល់​ (រូបភាព, មតិ)';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'ថ្មីលើ​ %s';
+$lang['Welcome to your Piwigo photo gallery!'] = 'សូម​ស្វា​គមន៍​ការ​មក​កាន់​វិចិត្រសាល​រូបថត​របស់​អ្នក​ក្នុង Piwigo !';
+$lang['... or browse your empty gallery'] = '... ឬក៏ ស្វែង​រក​វិចិត្រសាល​ទទេ​របស់​លោក​អ្នក​';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ឬ សូម​ធ្វើ​ឲ្យ​អសកម្ម​សារ​មួយ​នេះ ខ្ញុំ​នឹង​ស្វែង​រក​វិធី​ផ្សេង​ដោយ​ខ្លួន​ឯង';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'សួរស្តី​ %s, វិចិត្រសាល​រូប​ភាព​ក្នុង​ Piwigo របស់​អ្នក​គឺ​ទទេ!';
+$lang['I want to add photos'] = 'ខ្ញុំ​ចង់​បន្ថែម​រូប​ថត​ផ្សេងៗ​ទៀត​';
+$lang['Manage this user comment: %s'] = 'រៀប​ចំ​មតិ​នៃ​អ្នក​ប្រើ​ប្រាស់​នេះ​: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'សារ​អេឡិចត្រូ​និច​​មិន​មាន​ទេ​, សូមបញ្ជាក់​​ឡើង​វិញ​នូវ​សារ​អេឡិចត្រូនិច​នេះ';
+$lang['This author modified following comment:'] = 'អ្នក​និពន្ធ​នេះ​បាន​កែ​ប្រែ​មតិ​ខាង​ក្រោម​:';
+$lang['This author removed the comment with id %d'] = 'អ្នក​និ​ពន្ធ​នេះ​បាន​ដក​មតិ​ចេញ ដែល​មាន​លេខ​សំគាល់​ %d';
+$lang['html tags are not allowed in login'] = 'ស្លាក​ជាប្រ​ភេទ html មិន​បាន​អនុ​ញ្ញាត​ក្នុង​ការ​ភ្ជាប់​ចូល​ក្នុង​ប្រព័ន្ធទេ';
+$lang['Invalid username or email'] = 'ឈ្មោះ​ប្រើ​ប្រាស់​ ឬ សារអេឡិចត្រូនិច​ មិនត្រឹមត្រូវ​ទេ';
+$lang['Password reset is not allowed for this user'] = 'ការ​កែ​អក្សរ​សម្ងាត់​មិន​បាន​អនុញ្ញាត​សំរាប់​អ្នក​ប្រើ​ប្រាស់​ម្នាក់​នេះទេ';
+$lang['User "%s" has no email address, password reset is not possible'] = 'អ្នក​ប្រើ​ប្រាស់​ឈ្មោះ "%s" មិន​មាន​សារ​អេឡិចត្រូនិច, ការ​កែ​ប្រែអក្សរ​សម្ងាត់​មិន​អាច​ដំណើរ​ការ​ទៅបាន​ទេ';
+$lang['Someone requested that the password be reset for the following user account:'] = 'មាន​អ្នក​ផ្សេង​បាន​ស្នើរ​ឲ្យ​អក្សរ​សម្ងាត់​នោះ​អាច​កែប្រែ​បាន​សំរាប់​អ្នក​ប្រើ​ប្រាស់ដែល​មាន​​គណនី​ដូច​ខាង​ក្រោម​:';
+$lang['Username "%s" on gallery %s'] = 'ឈ្មោះ​អ្នក​ប្រើ​ប្រាស់​ "%s" នៅ​លើ​វិចិត្រសាល %s';
+$lang['To reset your password, visit the following address:'] = 'ដើម្បី​កែប្រែ​អក្សរ​សម្ងាត់​របស់​អ្នក​ សូម​ចូល​ទៅកាន់​អាស័យដ្ឋាន​ដូច​ខាង​ក្រោម​:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ប្រសិន​បើ​នេះជា​កំហុសមួយ គ្រាន់​តែ​ធ្វើ​មិន​ដឹង​មិន​លឺជាមួយ​សារ​អេឡិចត្រូនិច​មួយ​នេះ ហើយ​នឹង​មិន​មាន​អ្វី​កើត​ឡើង​ទេ';
+$lang['Password Reset'] = 'កែប្រែ​អក្សរ​សម្ងាត់​​';
+$lang['Check your email for the confirmation link'] = 'ទៅ​ពិនិត្យ​មើល​សារ​អេឡិច​ត្រូនិច​របស់​អ្នកដើម្បីរក​តំណរភ្ជាប់​ជា​សំអាង​បញ្ជាក់​';
+$lang['Invalid key'] = 'ពាក្យ​គន្លឹះ​មិន​ត្រឹមត្រូវ';
+$lang['The passwords do not match'] = 'អក្សរ​សម្ងាត់​មិន​ត្រូវ​គ្នា​ទេ​';
+$lang['Your password has been reset'] = 'អក្សរ​សម្ងាត់របស់​អ្នក​បាន​កែប្រែ';
+$lang['Return to home page'] = 'ត្រឡប់​ទៅ​ទំព័រដើម​';
+$lang['Please enter your username or email address.'] = 'សូម​បញ្ចូល​ឈ្មោះ​ប្រើ​ប្រាស់​ និង​ សារ​អេឡិចត្រូនិច​របស់​អ្នក';
+$lang['You will receive a link to create a new password via email.'] = 'អ្នក​នឹង​ទទួលបាន​តំណរភ្ជាប់​មួយតាម​រយះ​សារ​អេឡិចត្រូនិច​ ដើម្បី​ទៅ​បង្កើត​អក្សរ​សម្ងាត់​ថ្មី​មួយ​';
+$lang['Username or email'] = 'ឈ្មោះ​ប្រើ​ប្រាស់​ ឬ សារអេឡិចត្រូនិច';
+$lang['Change my password'] = 'ប្តូរ​អក្សរ​សម្ងាត់​របស់​ខ្ញុំ​';
+$lang['Enter your new password below.'] = 'បញ្ចូល​អក្សរសម្ងាត់​ថ្មី​របស់​អ្នក​ខាង​ក្រោម​';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Edit'] = 'កែ​ប្រែ';
+$lang['Hello %s,'] = 'សួរ​ស្តី %s,';
+$lang['Send my connection settings by email'] = 'ផ្ញើ​ការ​ចាត់តាំង​តំណរ​ភ្ជាប់​របស់​ខ្ញុំ​តាម​រយះ​ម៉ែល​';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'ការ​ចុះ​ឈ្មោះទទួល​បាន​ជោគ​ជ័យ បន្តិច​ទៀត​អ្នក​នឹង​ទទួល​​ម៉ែល​មួយ​ជាមួយ​ការ​ចាត់​តាំង​តំណរ​ភ្ជាប់​របស់​អ្នក។ សូម​ស្វា​គមន៍!';
+$lang['Username modification'] = 'កែ​ប្រែឈ្មោះ​ប្រើ​ប្រាស់';
+$lang['Your username has been successfully changed to : %s'] = 'ឈ្មោះ​របស់​អ្នក​​បាន​កែ​ប្រែ​​ទៅ​ជា %s ជោគ​ជ័យ​ហើយ';
+$lang['square'] = 'បួន​ជ្រុង';
+$lang['small'] = 'តូច​';
+$lang['medium'] = 'មធ្យម​';
+$lang['large'] = 'ធំ';
+$lang['Original'] = 'ដើម​';
+$lang['Thank you for registering at %s!'] = 'អរ​គុណ​សំរាប់​ការ​ចុះ​ឈ្មោះ​នៅ​ %s!';
+$lang['Here are your connection settings'] = 'នេះ​ជា​ការ​ចាត់​តាំង​តំណរ​ភ្ជាប់​របស់​អ្នក​';
+$lang['Password: %s'] = 'លេខ​សំ​ងាត់​: %s';
+$lang['Username: %s'] = 'ឈ្មោះ​ប្រើ​ប្រាស់​: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'ប្រ​សិន​បើ​អ្នក​គិត​ថា​ ការ​ទទួល​ម៉ែល​របស់​អ្នក​ជួប​បញ្ហា សូម​ទំនាក់​ទំនង​យើង​តាម​រយះ​ %s';
+$lang['thumb'] = 'រូប​ក្រប​មុខ​';
+$lang['xlarge'] = 'ធំ​ជាង​';
+$lang['xxlarge'] = 'ធំ​បំ​ផុត​';
+$lang['Show oldest comments first'] = 'បង្ហាញ​មតិ​ចាស់​ជាង​គេ ​មុន​គេ';
+$lang['Show latest comments first'] = 'បង្ហាញ​មតិ​ចុង​ក្រោយ​ មុន​គេ';
+$lang['Photo sizes'] = 'ទំហំ​រូប​ថត​';
+$lang['View in'] = 'បង្ហាញ​ក្នុង​';
+$lang['Mobile'] = 'ចល័ត​';
+$lang['2small'] = 'XXS - tiny';
+$lang['xsmall'] = 'XS - តូច​ណាស់';
+$lang['Desktop'] = 'Desktop';
+$lang['File name, A &rarr; Z'] = 'ឈ្មោះ​ឯក​សារ​, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'ឈ្មោះ​ឯក​សារ​, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'ចំណង​ជើង​រូប​ថត​, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'ចំ​ណង​ជើង​រូប​ថត, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'ថ្ងៃ​ដែល​បាន​បង្កើត​, ថ្មី​ &rarr; ចាស់​';
+$lang['Date created, old &rarr; new'] = 'ថ្ងៃ​ដែល​បាន​បង្កើត​, ចាស់​ &rarr; ថ្មី​';
+$lang['Date posted, new &rarr; old'] = 'ថ្ងៃ​ដែល​បាន​ដាក់​ផ្សាយ​, ថ្មី​ &rarr; ចាស់​';
+$lang['Date posted, old &rarr; new'] = 'ថ្ងៃ​ដែល​បាន​ដាក់​ផ្សាយ​, ចាស់​ &rarr; ថ្មី​';
+$lang['Rating score, high &rarr; low'] = 'ពិន្ទុនៃ​ការ​​វាយ​តម្លៃ​, ខ្ពស់​ &rarr; ទាប​';
+$lang['Rating score, low &rarr; high'] = 'ពិន្ទុ​នៃ​ការ​វាយ​តម្លៃ​, ទាប​ &rarr; ខ្ពស់';
+$lang['Visits, high &rarr; low'] = 'ចំនួន​អ្នក​ទស្សនា​, ខ្ពស់​ &rarr; ទាប​';
+$lang['Visits, low &rarr; high'] = 'ចំនួន​អ្នក​ទស្ស​នា​, ទាប​ &rarr; ខ្ពស់​';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'ចំនួន​សំរាប់​សំគាល់​, ១ &rarr; ៩';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'ចំនួន​សំរាប់​សំ​គាល់​, ៩ &rarr; ១';
+$lang['Manual sort order'] = 'តំ​រៀប​ដោយ​ខ្លួន​ឯង​';
+
+
+
+?>
Index: tags/2.4.0RC3/language/km_KH/index.php
===================================================================
--- tags/2.4.0RC3/language/km_KH/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/km_KH/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/km_KH/iso.txt
===================================================================
--- tags/2.4.0RC3/language/km_KH/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/km_KH/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+ភាសាខ្មែរ [KH]
Index: tags/2.4.0RC3/language/ko_KR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ko_KR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ko_KR/common.lang.php	(revision 14585)
@@ -0,0 +1,325 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: 한국어 [KR]
+Version: 2.2.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=509
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "한국어";
+$lang_info['country'] = "대한민국";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "en";
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d 개의 앨범이 업데이트 되었습니다';
+$lang['%d albums updated'] = '%d 개의 앨범이 업데이트 되었습니다';
+$lang['%d comment to validate'] = '%d 개의 승인 대기중인 코멘트가 있습니다';
+$lang['%d comments to validate'] = '%d 개의 승인 대기중인 코멘트가 있습니다';
+$lang['%d new comment'] = '%d 개의 새 댓글이 있습니다';
+$lang['%d new comments'] = '%d 개의 새 댓글이 있습니다';
+$lang['%d comment'] = '댓글 %d 개';
+$lang['%d comments'] = '댓글 %d 개';
+$lang['%d hit'] = '조회수 %d';
+$lang['%d hits'] = '조회수 %d';
+$lang['%d new photo'] = '%d 개의 새 사진';
+$lang['%d new photos'] = '%d 개의 새 사진';
+$lang['%d new user'] = '%d 명의 신규 유저';
+$lang['%d new users'] = '%d 명의 신규 유저';
+$lang['About'] = 'About';
+$lang['All tags'] = '모든 태그';
+$lang['Any tag'] = '아무 태그';
+$lang['At least one listed rule must be satisfied.'] = '적어도 하나의 기준을 만족해야 합니다.';
+$lang['Author'] = '저자';
+$lang['Average rate'] = '평균';
+$lang['Albums'] = '앨범';
+$lang['Album'] = '앨범';
+$lang['Close this window'] = '창 닫기';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS피드 (사진과 댓글)';
+$lang['Confirm Password'] = '비밀번호 확인';
+$lang['Connection settings'] = '연결 설정';
+$lang['Login'] = '로그인';
+$lang['Contact webmaster'] = '웹마스터에게 연락하기';
+$lang['Create a new account'] = '새 계정 만들기';
+$lang['Created on'] = '생성일';
+$lang['Creation date'] = '만들어진 날짜';
+$lang['Current password is wrong'] = '현재 비밀번호가 잘못되었습니다';
+$lang['Dimensions'] = '해상도';
+$lang['Display'] = '표시';
+$lang['Each listed rule must be satisfied.'] = '각각의 기준을 만족해야 합니다.';
+$lang['Email address'] = '메일 주소';
+$lang['Enter your personnal informations'] = '개인 정보를 입력해 주세요';
+$lang['Error sending email'] = '메일을 보내는 중 오류가 발생하였습니다';
+$lang['File name'] = '파일 이름';
+$lang['File'] = '파일';
+$lang['Filesize'] = '파일 크기';
+$lang['Filter and display'] = '필터 후 표시';
+$lang['Filter'] = '필터';
+$lang['Forgot your password?'] = '비밀번호를 잊으셨나요?';
+$lang['Go through the gallery as a visitor'] = '손님으로 앨범 구경';
+$lang['Help'] = '도움말';
+$lang['Identification'] = '확인';
+$lang['Photos only RSS feed'] = 'RSS피드 사진들';
+$lang['Keyword'] = '키워드';
+$lang['Notification'] = '알림';
+$lang['Number of items'] = '항목 수';
+$lang['Original dimensions'] = '원본 해상도';
+$lang['Password forgotten'] = '비밀번호를 잃어버렸습니다';
+$lang['Password'] = '비밀번호';
+$lang['Post date'] = '등록일';
+$lang['Posted on'] = '등록일';
+$lang['Profile'] = '프로필';
+$lang['Quick connect'] = '빠른 연결';
+$lang['RSS feed'] = 'RSS 피드';
+$lang['Rate'] = '등급';
+$lang['Register'] = '신규 가입';
+$lang['Registration'] = '새 사용자 등록';
+$lang['Related tags'] = '관련 태그';
+$lang['Reset'] = '초기화';
+$lang['Retrieve password'] = '비밀번호 찾기';
+$lang['Search rules'] = '검색 조건';
+$lang['Search tags'] = '태그 검색';
+$lang['Search'] = '검색';
+$lang['display available tags'] = '사용 가능한 태그 보이기';
+$lang['Since'] = '기간';
+$lang['Sort by'] = '정렬 기준';
+$lang['Sort order'] = '정렬 순서';
+$lang['Tag'] = '태그';
+$lang['Tags'] = '태그';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS 피드 알림은 이 사이트의 새 사진, 댓글, 업데이트된 앨범에 대해 알려줍니다. RSS 리더와 함께 사용하세요.';
+$lang['Unknown feed identifier'] = '알 수 없는 피드 식별자입니다';
+$lang['User comments'] = '사용자 댓글';
+$lang['Username'] = '사용자 이름';
+$lang['Visits'] = '방문자';
+$lang['Webmaster'] = '웹마스터';
+$lang['Week %d'] = '이번주 %d';
+$lang['About Piwigo'] = 'Piwigo에 대해';
+$lang['You are not authorized to access the requested page'] = '이 페이지에 접근할 권한이 없습니다';
+$lang['Add to caddie'] = '캐디에 추가';
+$lang['add this photo to your favorites'] = '이 사진을 즐겨찾기에 추가';
+$lang['Administration'] = '관리';
+$lang['all'] = '모두';
+$lang['ascending'] = '오름차순';
+$lang['author(s) : %s'] = '작가 : %s';
+$lang['Expand all albums'] = '모든 앨범 열기';
+$lang['posted after %s (%s)'] = '%s (%s) 이후의 포스트';
+$lang['posted before %s (%s)'] = '%s (%s) 이전의 포스트';
+$lang['posted between %s (%s) and %s (%s)'] = '%s (%s) 부터 %s (%s) 까지의 포스트';
+$lang['posted on %s'] = '%s 의 포스트';
+$lang['Best rated'] = '최고 등급';
+$lang['display best rated photos'] = '최고 등급의 사진들 보기';
+$lang['caddie'] = '캐디';
+$lang['Calendar'] = '캘린더';
+$lang['All'] = '모두';
+$lang['display each day with photos, month per month'] = '매일을 사진으로 표시하여 한달을 표시합니다';
+$lang['View'] = '보기';
+$lang['chronology_monthly_calendar'] = '월별 캘린더';
+$lang['chronology_monthly_list'] = '월별 리스트';
+$lang['chronology_weekly_list'] = '주간 리스트';
+$lang['New on %s'] = '새로 등록됨(%s)';
+$lang['Click here if your browser does not automatically forward you'] = '자동으로 이동되지 않을 땐 이곳을 클릭하세요';
+$lang['comment date'] = '의견 등록일';
+$lang['Comment'] = '의견';
+$lang['Your comment has been registered'] = '댓글이 등록되었습니다';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = '도배 방지 시스템: 다른 의견을 달기 전까지 잠시만 기다려 주세요.';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '유효 조건에 어긋난 의견이기 때문에 등록되지 않았습니다';
+$lang['An administrator must authorize your comment before it is visible.'] = '관리자의 승인이 있기 전까지 다른 사용자들이 이 의견을 볼 수 없습니다.';
+$lang['This login is already used by another user'] = '다른 사용자가 이미 이 계정을 사용중입니다';
+$lang['Comments'] = '의견';
+$lang['Add a comment'] = '의견 남기기';
+$lang['created after %s (%s)'] = '%s 이후 생성됨 (%s)';
+$lang['created before %s (%s)'] = '%s 이전 생성됨(%s)';
+$lang['created between %s (%s) and %s (%s)'] = '%s (%s) 에서 %s (%s) 사이에 생성됨';
+$lang['created on %s'] = '%s 에 생성됨';
+$lang['Customize'] = '개인화';
+$lang['Your Gallery Customization'] = '갤러리 개인화';
+$lang['day'] = '정렬';
+$lang['Default'] = '기본값';
+$lang['delete this photo from your favorites'] = '이 사진을 즐겨찾기에서 삭제';
+$lang['Delete'] = '삭제';
+$lang['descending'] = '내림차순';
+$lang['Download'] = '내려받기';
+$lang['Download this file'] = '이 파일을 내려받기';
+$lang['edit'] = '편집';
+$lang['wrong date'] = '잘못된 날짜';
+$lang['excluded'] = '제외됨';
+$lang['Your favorites'] = '나의 즐겨찾기';
+$lang['display your favorites photos'] = '내 즐겨찾는 사진들을 표시';
+$lang['Favorites'] = '즐겨찾기';
+$lang['First'] = '처음';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = '이 갤러리는 유지/보수를 위해 잠겨 있습니다. 나중에 다시 방문해 주세요.';
+$lang['Page generated in'] = '페이지 생성됨';
+$lang['guest'] = '손님';
+$lang['Hello'] = '안녕하세요!';
+$lang['available for administrators only'] = '관리자만 사용 가능합니다';
+$lang['display this album'] = '이 앨범을 표시';
+$lang['display last user comments'] = '마지막 사용자 의견을 표시';
+$lang['customize the appareance of the gallery'] = '갤러리 외형을 개인화합니다';
+$lang['search'] = '검색';
+$lang['Home'] = '홈';
+$lang['day'][0] = "일요일";
+$lang['day'][1] = "월요일";
+$lang['day'][2] = "화요일";
+$lang['day'][3] = "수요일";
+$lang['day'][4] = "목요일";
+$lang['day'][5] = "금요일";
+$lang['day'][6] = "토요일";
+$lang['month'][10] = "10월";
+$lang['month'][11] = "11월";
+$lang['month'][12] = "12월";
+$lang['month'][1] = "1월";
+$lang['month'][2] = "2월";
+$lang['month'][3] = "3월";
+$lang['month'][4] = "4월";
+$lang['month'][5] = "5월";
+$lang['month'][6] = "6월";
+$lang['month'][7] = "7월";
+$lang['month'][8] = "8월";
+$lang['month'][9] = "9월";
+$lang['Links'] = '링크';
+$lang['in this album'] = '이 앨범에서';
+$lang['in %d sub-album'] = '%d 하위 앨범에서';
+$lang['in %d sub-albums'] = '%d 하위 앨범에서';
+$lang['included'] = '포함됨';
+$lang['Invalid password!'] = '잘못된 비밀번호!';
+$lang['Language'] = '언어';
+$lang['last %d days'] = '최근 %d 일';
+$lang['Last'] = '마지막';
+$lang['Logout'] = '로그아웃';
+$lang['obligatory'] = '필수';
+$lang['Maximum photo height'] = '최대 높이';
+$lang['Maximum height must be a number superior to 50'] = '높이가 적어도 50이상은 되어야 합니다';
+$lang['Maximum photo width'] = '최대 넓이';
+$lang['Maximum width must be a number superior to 50'] = '넓이가 적어도 50이상은 되어야 합니다';
+$lang['display a calendar by creation date'] = '만들어진 날짜별로 달력 표시';
+$lang['display all photos in all sub-albums'] = '하위 앨범의 모든 사진 표시';
+$lang['return to normal view mode'] = '일반 모드로 돌아감';
+$lang['display a calendar by posted date'] = '등록된 날짜별로 달력 표시';
+$lang['Most visited'] = '최다 방문';
+$lang['display most visited photos'] = '가장 많이 방문한 사진 표시';
+$lang['Unknown identifier'] = '알 수 없는 식별자';
+$lang['New password'] = '새 비밀번호';
+$lang['Rate this photo'] = '이 사진 평가';
+$lang['Next'] = '다음';
+$lang['no rate'] = '등급 없음';
+$lang['Photos posted within the last %d day.'] = '%d 일 이내에 등록된 사진.';
+$lang['Photos posted within the last %d days.'] = '%d 일 이내에 등록된 사진.';
+$lang['password updated'] = '비밀번호가 변경되었습니다';
+$lang['Recent period must be a positive integer value'] = '최근 기간은 양의 정수여야 합니다';
+$lang['photo'] = '사진';
+$lang['Click on the photo to see it in high definition'] = '고해상도로 보시려면 사진을 클릭하세요';
+$lang['Show file metadata'] = 'Metadata 보기';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = '환경설정';
+$lang['Previous'] = '이전';
+$lang['Random photos'] = '무작위 사진';
+$lang['display a set of random photos'] = '무작위로 사진들을 보여줍니다';
+$lang['Recent albums'] = '최근 앨범';
+$lang['display recently updated albums'] = '최근에 업데이트된 앨범을 보여줍니다';
+$lang['Recent period'] = '최근 기간';
+$lang['Recent photos'] = '최근 사진';
+$lang['display most recent photos'] = '가장 최근의 사진을 보여줍니다';
+$lang['Redirection...'] = '연결중...';
+$lang['Please, enter a login'] = '로그인 정보를 입력하세요';
+$lang['login mustn\'t end with a space character'] = '공백문자로 끝낼 수 없습니다';
+$lang['login mustn\'t start with a space character'] = '공백문자로 시작할 수 없습니다';
+$lang['this login is already used'] = '이 정보는 이미 사용중입니다';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '메일 주소는 xxx@yyy.eee 처럼 되야 합니다. (예 : jack@altern.org)';
+$lang['please enter your password again'] = '비밀번호를 다시 입력 해 주세요';
+$lang['Auto login'] = '자동 로그인';
+$lang['remove this tag from the list'] = '목록에서 이 태그를 삭제';
+$lang['representative'] = '대표사진';
+$lang['Search for Author'] = '작가로 검색';
+$lang['Search in albums'] = '앨범에서 검색';
+$lang['Search by date'] = '날짜로 검색';
+$lang['Date'] = '날짜';
+$lang['End-Date'] = '끝나는 날짜';
+$lang['Kind of date'] = '날짜의 종류';
+$lang['Submit'] = '등록';
+$lang['Yes'] = '예';
+$lang['No'] = '아니오';
+$lang['%d photo'] = '%d 개 사진';
+$lang['%d photos'] = '%d 개 사진';
+$lang['%d photo is also linked to current tags'] = '현재 태그에 %d 개의 사진이 연결되어 있습니다';
+$lang['%d photos are also linked to current tags'] = '현재 태그에 %d 개의 사진들이 연결되어 있습니다';
+$lang['display photos linked to this tag'] = '이 태그에 연결된 사진들 보이기';
+$lang['photos posted during the last %d days'] = '최근 %d 일간 등록된 사진들';
+$lang['Piwigo Help'] = 'Piwigo 도움말';
+$lang['Rank'] = '등급';
+$lang['group by letters'] = '문자로 그룹화';
+$lang['letters'] = '문자';
+$lang['show tag cloud'] = '태그 구름 보이기';
+$lang['cloud'] = '구름';
+$lang['Reset to default values'] = '기본값으로 설정';
+$lang['delete all photos from your favorites'] = '즐겨찾기의 모든 사진을 지웁니다';
+$lang['Sent by'] = '보낸이';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = '쿠키가 차단되었거나 지원되지 않는 브라우저입니다. 로그인하기 위해서는 쿠키를 사용해야 합니다.';
+$lang['Edit a comment'] = '댓글 편집';
+$lang['Are you sure?'] = '확실합니까?';
+$lang['(!) This comment requires validation'] = '(!) 이 댓글은 확인이 필요합니다.';
+$lang['Welcome'] = '환영합니다';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Piwigo 포토 갤러리에 오신것을 환영합니다!';
+$lang['... or browse your empty gallery'] = '... 혹은 빈 갤러리를 탐색합니다';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... 혹은 이 메시지를 비활성화합니다. 스스로 무언가를 해 봅니다.';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = '안녕하세요 %s, 현재 갤러리가 비었습니다!';
+$lang['I want to add photos'] = '사진을 등록하고 싶습니다';
+$lang['Manage this user comment: %s'] = '이 사용자 댓글 관리: %s';
+$lang['Email address is missing. Please specify an email address.'] = '메일 주소란이 비었습니다. 메일 주소를 확인 해 주세요.';
+$lang['This author modified following comment:'] = '이 작가가 다음 댓글을 수정하였습니다:';
+$lang['This author removed the comment with id %d'] = '이 작가가 다음 사용자의 댓글을 삭제하였습니다: %d';
+$lang['%d rates'] = '%d 개의 평가';
+$lang['A comment on your site'] = '당신의 웹 사이트에 코멘트가 있습니다';
+$lang['Accelerate diaporama speed'] = '슬라이드쇼 속도 증가';
+$lang['Admin: %s'] = '관리자: %s';
+$lang['Album results for'] = '앨범 결과';
+$lang['Album: %s'] = '앨범: %s';
+$lang['Author: %s'] = '저자: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '"손님"사용자의 상태가 나빠 기본 상태를 사용합니다. 관리자에게 알려주세요.';
+$lang['Browser: %s'] = '브라우저: %s';
+$lang['Change my password'] = '비밀번호 변경';
+$lang['Check your email for the confirmation link'] = '인증을 위해 이메일을 확인 해 주세요';
+$lang['Comment by %s'] = '%s님의 댓글';
+$lang['Comment: %s'] = '댓글: %s';
+$lang['Connected user: %s'] = '접속중인 사용자: %s';
+$lang['Contact'] = '연락처';
+$lang['display only recently posted photos'] = '최근 등록된 사진만 보기';
+$lang['Edit'] = '편집';
+$lang['Email: %s'] = '이메일: %s';
+$lang['Empty query. No criteria has been entered.'] = '없는 요청입니다. 조건이 비었을 수 있습니다.';
+$lang['Enter your new password below.'] = '새 비밀번호를 입력해주세요.';
+$lang['EXIF Metadata'] = 'EXIF 메타데이터';
+$lang['from %s to %s'] = '%s님이 %s님에게';
+$lang['Hello %s,'] = '%s님 안녕하세요,';
+$lang['html tags are not allowed in login'] = '로그인 폼에 html태그는 허용되지 않습니다';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '만약 실수였다면 이 이메일을 무시하셔도 됩니다.';
+$lang['Interface theme'] = '인터페이스 테마';
+$lang['Invalid key'] = '잘못된 키';
+$lang['Invalid username or email'] = '잘못된 사용자 이름이나 이메일';
+$lang['IP: %s'] = 'IP: %s';
+$lang['IPTC Metadata'] = 'IPTC 메타데이터';
+$lang['Menu'] = '메뉴'; 
+
+
+?>
Index: tags/2.4.0RC3/language/ko_KR/index.php
===================================================================
--- tags/2.4.0RC3/language/ko_KR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ko_KR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based picture gallery                                  |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ko_KR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ko_KR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ko_KR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+한국어 [KR]
Index: tags/2.4.0RC3/language/lv_LV/about.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/about.html	(revision 14585)
@@ -0,0 +1,7 @@
+  <li>Piwigo - tas ir skripts, kas ļauj viegli uzbūvēt online galeriju.</li>
+
+  <li>Piwigo galerija ir radīta ar PHP (elePHPant) izmantojot MySQL (SQuirreL) datu bāzi.</li>
+
+  <li>Ja jums ir ierosinājumi vai vēlējumi skripta sakarā, adresējiet to  <a
+  href="http://ru.piwigo.org">Piwigo</a>, vai atstājiet <a href="http://ru.piwigo.org/forum">forumā</a>.</li>
+
Index: tags/2.4.0RC3/language/lv_LV/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/lv_LV/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/admin.lang.php	(revision 14585)
@@ -0,0 +1,893 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d kopa';
+$lang['%d associations'] = '%d kopas';
+$lang['%d album including'] = '%d albūmu ieskaitot';
+$lang['%d albums including'] = '%d albūmus ieskaitot';
+$lang['%d physical'] = ' %d reālas';
+$lang[' and %d virtual'] = ' un %d virtuālas';
+$lang['%d album moved'] = '%d albūms pārvietots';
+$lang['%d albums moved'] = '%d albūmi pārvietoti';
+$lang['%d group'] = '%d grupa';
+$lang['%d groups'] = '%d grupas';
+$lang['%d member'] = '%d biedrs';
+$lang['%d members'] = '%d biedri';
+$lang['%d tag'] = '%d iezīme';
+$lang['%d tags'] = '%d iezīmes';
+$lang['%d user comment rejected'] = '%d lietotāja komentārs noraidīts';
+$lang['%d user comments rejected'] = '%d lietotāja komentāri noraidīti';
+$lang['%d user comment validated'] = '%d lietotāja komentārs apstiptināts';
+$lang['%d user comments validated'] = '%d lietotāja komentāri apstiptināti';
+$lang['%d user deleted'] = '%d lietotājs izdēsts';
+$lang['%d users deleted'] = '%d lietotāji izdzēsti';
+$lang['%d user'] = '%d lietotājs';
+$lang['%d users'] = '%d lietotāji';
+$lang['%d waiting for validation'] = '%d gaida apstiprinājumu';
+$lang['Actions'] = 'Darbības';
+$lang['Activate'] = 'Aktivēt';
+$lang['Add/delete a permalink'] = 'Pievienot/dzēst pamatsaiti';
+$lang['Add a tag'] = 'Pievienot iezīmi';
+$lang['Add a user'] = 'Pievienot lietotāju';
+$lang['Add group'] = 'Pievienot grupu';
+$lang['Add'] = 'Pievienot';
+$lang['Allow user registration'] = 'Atļaut reģistrēt lietotāju';
+$lang['Apply to sub-albums'] = 'Pielietot apakšalbūmiem';
+$lang['Associated'] = 'Saistītas';
+$lang['Caddie management'] = 'Groza pārvaldīšana';
+$lang['Caddie'] = 'Grozs';
+$lang['Albums authorized thanks to group associations'] = 'Albūmi autorizēti dēļ grupu apvienībēm';
+$lang['Album manual order was saved'] = 'Albūmu kārtība saglabāta';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Pārbaude pēc uzlabojuma nezināmu iemeslu dēļ nav izdevusies.';
+$lang['Check for upgrade'] = 'Pārbaudīt uzlabojumu';
+$lang['Comments for all'] = 'Komentāri visiem';
+$lang['Current name'] = 'Patreizējais nosaukums';
+$lang['Database'] = 'Datubāze';
+$lang['Deactivate'] = 'Izslēgt';
+$lang['Delete Representant'] = 'Dzēst Pārstāvi';
+$lang['Delete selected tags'] = 'Dzēst izvēlētās iezīmes';
+$lang['Delete selected users'] = 'Dzēst izvēlētos lietotājus';
+$lang['Deletions'] = 'Izdzēšanas';
+$lang['Deny selected groups'] = 'Noraidīt izvēlētās grupas';
+$lang['Deny selected users'] = 'Noraidīt izvēlētos lietotājus';
+$lang['Description'] = 'Apraksts';
+$lang['Display options'] = 'Parādīšanas varianti';
+$lang['Dissociated'] = 'Nesaistītas';
+$lang['Does not represent'] = 'Nepārstāv';
+$lang['Edit selected tags'] = 'Rediģēt izvēlētās iezīmes';
+$lang['Edit tags'] = 'Rediģēt iezīmes';
+$lang['Email admins when a new user registers'] = 'Paziņot adminam, kad jauns lietotājs reģistrējas';
+$lang['Email admins when a valid comment is entered'] = 'Paziņot adminam, kad derīgs komentārs ievadīts';
+$lang['Email admins when a comment requires validation'] = 'Paziņot adminam, kad parādījies komentārs, kas jāpārbauda';
+$lang['Environment'] = 'Vide';
+$lang['Form'] = 'Forma';
+$lang['Gallery title'] = 'Galerijas nosaukums';
+$lang['Grant selected groups'] = 'Atļaut piekļuvi izvēlētām grupām';
+$lang['Grant selected users'] = 'Atļaut piekļuvi izvēlētajiem lietotājiem';
+$lang['Group name'] = 'Grupas nosaukums';
+$lang['Groups'] = 'Grupas';
+$lang['Guests'] = 'Viesi';
+$lang['History'] = 'Vēsture';
+$lang['Informations'] = 'Informācija';
+$lang['Install'] = 'Instalēt';
+$lang['Link all album photos to a new album'] = 'Sasaistīt visus albūma fotoattēlus ar jaunu albūmu';
+$lang['Link all album photos to some existing albums'] = 'Sasaistīt visus albūma fotoattēlus ar jau esošiem albūmiem';
+$lang['Linked albums'] = 'Sasaistītie albūmi';
+$lang['Lock gallery'] = 'Bloķēt galeriju';
+$lang['Maintenance'] = 'Apkope';
+$lang['Edit album permissions'] = 'Pārvaldīt albūma atļaujas';
+$lang['Manage permissions for group "%s"'] = 'Pārvaldīt "%s" grupas atļaujas';
+$lang['Manage permissions for user "%s"'] = 'Pārvaldīt lietotāja "%s" atļaujas';
+$lang['Manage tags'] = 'Pārvaldīt iezīmes';
+$lang['Members'] = 'Biedri';
+$lang['Metadata synchronized from file'] = 'Metadati no faila sinhronizēti';
+$lang['Move albums'] = 'Pārvietot albūmus';
+$lang['Move'] = 'Pārvietot';
+$lang['Name'] = 'Nosaukums';
+$lang['New name'] = 'Jauns nosaukums';
+$lang['New parent album'] = 'Jauns pamatalbūms';
+$lang['New tag'] = 'Jauna iezīme';
+$lang['Number of comments per page'] = 'Komentāru skaits lapā';
+$lang['Number of rates'] = 'Vērtējumu skaits';
+$lang['Number of thumbnails to create'] = 'Izveidojamo piktogrammu skaits';
+$lang['Only private albums are listed'] = 'Tiek rādīti tikai privātie albūmi';
+$lang['Operating system'] = 'Operacionālā sistēma';
+$lang['Options'] = 'Izvēles';
+$lang['Other private albums'] = 'Citi privātie albūmi';
+$lang['Page banner'] = 'Lapas baneris';
+$lang['Parent album'] = 'Pamatalbūms';
+$lang['Path'] = 'Ceļš';
+$lang['Permalink'] = 'Pamatsaite';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Pirmsaiti %s iepriekš lietoja albūms %s. Vispirms izdzēsiet to no pirmsašu vēstures';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Pamatsaites nosaukums drīkst saturēt a-z, A-Z, 0-9, "-", "_" or "/". Tas nedrīkst būt tikai skaitlis vai sākties ar ciparu, kam seko "-"';
+$lang['Permalink %s is already used by album %s'] = 'Pirmsaiti %s jau lieto albūms %s';
+$lang['Permalink history'] = 'Pamatsaišu vēsture';
+$lang['Permalinks'] = 'Pamatsaites';
+$lang['Permission denied'] = 'Piekļuve liegta';
+$lang['Permission granted thanks to a group'] = 'Piekļuve atļauta pateicoties grupai';
+$lang['Permission granted'] = 'Piekļuve atļauta';
+$lang['Photo informations updated'] = 'Informācija par foto atjaunināta';
+$lang['Plugins'] = 'Spraudņi';
+$lang['Position'] = 'Pozīcijas';
+$lang['Preferences'] = 'Iestatījumi';
+$lang['Properties'] = 'Īpašības';
+$lang['Random photo'] = 'Gadījuma foto';
+$lang['Rate date'] = 'Vērtēšanas datums';
+$lang['Rating by guests'] = 'Viesu novērtējums';
+$lang['Rating'] = 'Vērtējums';
+$lang['Reject'] = 'Noraidīt';
+$lang['Representant'] = 'Pārstāvis';
+$lang['Representation of albums'] = 'Albūma attēlojums';
+$lang['Representative'] = 'Pārstāvniecisks';
+$lang['Represents'] = 'Pārstāv';
+$lang['Save order'] = 'Saglabāt kārtību';
+$lang['Save to permalink history'] = 'Saglabāt pamatsaišu vēsturē';
+$lang['Select at least one album'] = 'Izvēlēties vismaz vienu albūmu';
+$lang['Select at least one photo'] = 'Atlasiet vizmaz vienu foto';
+$lang['Select at least one user'] = 'Izvēlēties vismaz vienu lietotāju';
+$lang['Show info'] = 'Rādīt informāciju';
+$lang['Site manager'] = 'Web lapu pārzinis';
+$lang['Status'] = 'Statuss';
+$lang['Statistics'] = 'Statistika';
+$lang['Storage album'] = 'Albūma uzglabāšana';
+$lang['Sum of rates'] = 'Kopējais novērtējums';
+$lang['Tag "%s" already exists'] = 'Iezīme "%s" jau eksistē';
+$lang['Tag "%s" was added'] = 'Iezīme "%s" ir pievienota';
+$lang['Tag selection'] = 'Iezīmes izvēle';
+$lang['The %d following tags were deleted'] = ' %d sekojošas iezīmes izdzēstas';
+$lang['Unable to check for upgrade.'] = 'Neiespējami pārbaudīt vai ir uzlabojums.';
+$lang['Uninstall'] = 'Atinstalēt';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Lietot foto kārtošanu pēc noklusējuma (definēts konfigurācijas failā)';
+$lang['User comments validation'] = 'Lietotāju komentāru pārbaude';
+$lang['Users'] = 'Lietotāji';
+$lang['Validate'] = 'Apstiprināt';
+$lang['Validation'] = 'Apstiprināšana';
+$lang['Version'] = 'Versija';
+$lang['Virtual albums to move'] = 'Virtuālie albūmi pārvietošanai';
+$lang['Virtual album name'] = 'Virtuālā albūma nosaukums';
+$lang['Webmaster cannot be deleted'] = 'Webmasteru izdzēst nevar';
+$lang['You are running on development sources, no check possible.'] = 'Jūs darbojaties izstrādes režīmā, pārbaude nav iespējama.';
+$lang['You cannot delete your account'] = 'Jūs nevarat izdzēst savu kontu';
+$lang['You cannot move an album in its own sub album'] = 'Nevar pārvietot albūmu savā apakšalbūmā';
+$lang['You need to confirm deletion'] = 'Jums jāapstiprina izdzēšana';
+$lang['Associate to album'] = 'sasaistīt ar albūmu';
+$lang['associate to group'] = 'saistīt ar grupu';
+$lang['Authorized'] = 'Atļauts';
+$lang['Add a virtual album'] = 'Pievienot virtuālo albūmu';
+$lang['Authorize users to add comments on selected albums'] = 'Atļaut lietotājiem pievienot komentārus izvēlētajiem albūmiem';
+$lang['The name of an album must not be empty'] = 'Albūma nosaukums nedrīkst būt tukšs';
+$lang['Lock albums'] = 'Boķēt albūmus';
+$lang['Private'] = 'Privāts albūms';
+$lang['Public'] = 'Publiska albūms';
+$lang['Find a new representant by random'] = 'Atrast jaunu pārstāvi nejauši';
+$lang['Public / Private'] = 'Publisks / Privāts';
+$lang['Manage authorizations for selected albums'] = 'Pārvaldīt izvēlēto albūmu autorizācijas';
+$lang['Virtual album added'] = 'Virtuālais albūms pievienots';
+$lang['Virtual album deleted'] = 'Virtuālais albūms izdzēsts';
+$lang['Access type'] = 'Piekļuves tips';
+$lang['Information data registered in database'] = 'Datubāzē reģistrētā informācija';
+$lang['Default display'] = 'Izskats pēc noklusējuma';
+$lang['The gallery URL is not valid.'] = 'Nekorekts galerijas URL.';
+$lang['Main'] = 'Galvenais';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Lapā var būt no 5 līdz 50 komentāriem.';
+$lang['Configuration'] = 'Konfigurācija';
+$lang['confirm'] = 'apstiprinājums';
+$lang['Date'] = 'Datums';
+$lang['delete album'] = 'dzēst albūmu';
+$lang['Dissociate from album'] = 'atsaistīt no albūma';
+$lang['dissociate from group'] = 'atsaistīt no grupas';
+$lang['Album updated successfully'] = 'Informācija par albūmu veiksmīgi atjaunota.';
+$lang['photos per page'] = 'foto skaits lapā';
+$lang['High definition enabled'] = 'Augstā izšķirtspēja iespējota';
+$lang['File'] = 'Fails';
+$lang['first photo added on %s'] = 'pirmais %s pievienotais foto';
+$lang['Forbidden'] = 'Aizliegts';
+$lang['global mode'] = 'grupveida režīms';
+$lang['group "%s" added'] = 'grupa "%s" pievienota';
+$lang['group "%s" deleted'] = 'grupa "%s" izdzēsta';
+$lang['group "%s" updated'] = 'grupa "%s" atjaunināta';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Grupas nosaukums nedrīkst saturēt " vai \' būt tukšs.';
+$lang['This name is already used by another group.'] = 'Šo vārdu jau lieto cita grupa.';
+$lang['High definition'] = 'Augsta izšķirtspēja';
+$lang['jump to album'] = 'pāriet uz albūmu';
+$lang['jump to photo'] = 'iet uz foto';
+$lang['leave'] = 'atstāt';
+$lang['Lock'] = 'Bloķēt';
+$lang['Locked'] = 'Bloķēts';
+$lang['manage album photos'] = 'pārvaldīt albūmu elementus';
+$lang['manage sub-albums'] = 'Pārvaldīt apakšalbūmus';
+$lang['Manage'] = 'Pārvaldīt';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Izpildes laiks beidzies, apstrāde jāturpina [Aprēķinātais laiks: %d sekundes].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Izpildes laiks pārsniegts, apstrāde jāturpina [Aprēķinātais laiks: %d sekundes].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Laiks, kas atvēlēts lietotāju saraksta izveidei pasta nosūtīšanai, ierobežots. Citi lietotāji nav ietverti.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'E-pasta izsūtīšanas laiks ierobežots. Citas vēstules izlaistas.';
+$lang['To send ?'] = 'Nosūtīt?';
+$lang['Last send'] = 'Pēdējais nosūtītais';
+$lang['email'] = 'E-pasts';
+$lang['User'] = 'Lietotājs';
+$lang['Complementary mail content'] = 'Vēstules saturs';
+$lang['See you soon,'] = 'Visu labu,';
+$lang['Go to'] = 'Pāriet uz';
+$lang['Hello'] = 'Sveiki';
+$lang['New photos were added'] = 'Tika pievienoti jauni fotoattēli';
+$lang['on'] = 'pie';
+$lang['between'] = 'starp';
+$lang['and'] = 'un';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmāsters reģistrējis Jūs saņemt ziņas ar e-pastu.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Jūs esat reģistrējies saņemt ziņas pa e-pastu.';
+$lang['To subscribe'] = 'reģistrācijai';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Ja Jums rodas problēmas vai jautājumi, lūdzu rakstiet';
+$lang['[NBM] Problems or questions'] = '[NBM] Problēmas un jautājumi';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmāsters ir izdzēsis Jūs no reģistra , lai saņemtu ziņas ar e-pastu .';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Jūs anulējāt parakstu saņemt ziņas ar e-pastu.';
+$lang[', click on'] = ', klikšķiniet uz';
+$lang['To unsubscribe'] = 'Lai anulētu reģistrāciju';
+$lang['With blank value, gallery title will be used'] = 'Ja tukša vērtība, tiks lietots galerijas nosaukums';
+$lang['Notification'] = 'Paziņojums';
+$lang['Error when sending email to %s [%s].'] = 'Kļūda nosūtot vēstuli %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Vēstule nosūtīta %s [%s].';
+$lang['%d mail was sent.'] = '%d vēstule ir nosūtīta.';
+$lang['%d mails were sent.'] = '%d vēstules ir nosūtītas.';
+$lang['%d mail was not sent.'] = '%d vēstule netika nosūtīta.';
+$lang['%d mails were not sent.'] = '%d vēstules netika nosūtītas.';
+$lang['No mail to send.'] = 'Nav vēstuļu nosūtīšanai.';
+$lang['There is no available subscribers to mail.'] = 'Nav lietotāju, kam varētu nosūtīt pastu.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Lietotāji pieejami, ja ir jauni elementi ko paziņot.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Tikai Webmāsters var redzēt šo iezīmi, ne administrators.';
+$lang['No user to send notifications by mail.'] = 'Nav lietotāja, kam nosūtīt e-paziņojumu.';
+$lang['New photos added'] = 'Pievienoti jauni fotoattēli';
+$lang['Subscribe to notification by mail'] = 'Reģistrēties, lai saņemtu e-paziņojumus';
+$lang['Unsubscribe from notification by mail'] = 'Anulēt reģistrāciju, lai saņemtu e-paziņojumus';
+$lang['Parameter'] = 'Iestatījumi';
+$lang['Operation in progress'] = 'Procesa apstrāde.';
+$lang['Please wait...'] = 'Lūdzu uzgaidiet...';
+$lang['Continue processing treatment'] = 'Turpināt procesa apstrādi';
+$lang['Add detailed content'] = 'Pievienot detalizētu saturu';
+$lang['Send mail as'] = 'Sūtīt vēstuli no';
+$lang['Send mail to users'] = 'Sūtīt vēstuli lietotājiem';
+$lang['Send'] = 'Sūtīt';
+$lang['Subscribed'] = 'Izsūtīšanas sarakstā';
+$lang['Subscribe'] = 'Izsūtīšanas saraksts';
+$lang['Parameters'] = 'Parameteri';
+$lang['Select recipients'] = 'Izvēlēties saņēmējus';
+$lang['Subscribe/unsubscribe users'] = 'Reģistrēt/izdzēst lietotājus';
+$lang['Unsubscribed'] = 'Nav izsūtīšanas sarakstā';
+$lang['%d parameter was updated.'] = '%d parametrs atjaunināts.';
+$lang['%d parameters were updated.'] = '%d parametru atjauninātu.';
+$lang['%d user was not updated.'] = '%d lirtotājs nav atjaunināts.';
+$lang['%d users were not updated.'] = '%d lietotāji nav atjaunināti.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Lietotājs %s [%s] izņemts no e-pasta izsūtīšanai paredzētā saraksta.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Lietotājs %s [%s] pievienots e-pasta izsūtīšanai paredzētajam sarakstam.';
+$lang['%d user was updated.'] = '%d lietotājs izmainīts.';
+$lang['%d users were updated.'] = '%d lietotāji izmainīti.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Lietotājs %s [%s] nav izņemts no e-pasta izsūtīšanai paredzētā saraksta.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Lietotājs %s [%s] nav pievienots e-pasta izsūtīšanai paredzētajam sarakstam.';
+$lang['User %s [%s] added.'] = 'Lietotājs %s [%s] pievienots.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Uzmanību: pievienojot vai dzēšot e-pasta izsūtīšanai paredzētajam sarakstam lietotājiem tiks nosūtīts paziņojums';
+$lang['Send mail on HTML format'] = 'Sūtīt vēstuli HTML formātā';
+$lang['Include display of recent photos grouped by dates'] = 'Rādīt jaunākos foto, sagrupētus pēc datumiem';
+$lang['Available only with HTML format'] = 'Pieejams tikai HTML formātā';
+$lang['no write access'] = 'nav atļaujas ierakstīšanai';
+$lang['Permissions'] = 'Atļaujas';
+$lang['private'] = 'privāta';
+$lang['public'] = 'publiska';
+$lang['Purge never used notification feeds'] = 'Iztīrīt nelietotos paziņojumu kanālus';
+$lang['Purge sessions'] = 'Iztīrīt sesijas';
+$lang['randomly represented'] = 'gadījuma pārstāvis';
+$lang['registration date'] = 'reģistrācijas datums';
+$lang['clean'] = 'iztīrīt';
+$lang['Create this site'] = 'Izveidot šo web lapu';
+$lang['test'] = 'tests';
+$lang['test this remote site'] = 'testēt šo attālināto web lapu';
+$lang['remove tags'] = 'noņemt iezīmes';
+$lang['Repair and optimize database'] = 'Labot un optimizēt datu bāzi';
+$lang['selection'] = 'izvēlētie';
+$lang['set to'] = 'izmainīt uz';
+$lang['singly represented'] = 'izvēlētais pārstāvis';
+$lang['This site already exists'] = 'Šī Web lapa jau eksistē';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Izveidot jaunu Web lapu : (ievadiet URL failā create_listing_file.php)';
+$lang['created'] = 'izveidota';
+$lang['delete'] = 'izdzēsta';
+$lang['delete this site and all its attached elements'] = 'izdzēst šo web lapu un visus tai pievienotos elementus';
+$lang['deleted'] = 'izdzēsta';
+$lang['an error happened'] = 'gadījusies kļūda';
+$lang['Local'] = 'Lokāls';
+$lang['Remote'] = 'Attālināts';
+$lang['update the database from files'] = 'atjaunināt datu bāzi no failiem';
+$lang['status'] = 'statuss';
+$lang['Directory'] = 'Direktorija';
+$lang['sub-albums'] = 'apakšalbūmi';
+$lang['Synchronize metadata'] = 'sinhronizēt metadatus';
+$lang['target'] = 'mērķis';
+$lang['Thumbnail'] = 'Piktogramma';
+$lang['title'] = 'nosaukums';
+$lang['Album list management'] = 'Albūmu pārvaldīšana';
+$lang['Piwigo configuration'] = 'Piwigo konfigurācija';
+$lang['Edit album'] = 'Rediģēt albūmu';
+$lang['Group management'] = 'Pārvaldīt grupas';
+$lang['User list'] = 'Lietotāju saraksts';
+$lang['Edit photo information'] = 'Rediģēt informāciju par foto';
+$lang['Database synchronization with files'] = 'Datu bāzes sinhronizācija ar failiem';
+$lang['all'] = 'viss';
+$lang['height must be a number superior to'] = 'augstuman jābūt skaitlim lielākam par';
+$lang['width must be a number superior to'] = 'platumam jābūt skaitlim lielākam par';
+$lang['for the file format'] = 'faila formātam';
+$lang['Photo unreachable or no support'] = 'foto nesasniedzams vai bez atbalsta';
+$lang['GD version'] = 'GD versija';
+$lang['General statistics'] = 'Vispārējā statistika';
+$lang['average time'] = 'vidējais laiks';
+$lang['number of miniaturized photos'] = 'miniaturizēto foto skaits';
+$lang['total time'] = 'kopējais laiks';
+$lang['for this file format'] = 'šim faila formātam';
+$lang['unit mode'] = 'mono režīms';
+$lang['Unlocked'] = 'Atbloķēt';
+$lang['unset'] = 'notīrīt';
+$lang['Update albums informations'] = 'Atjaunot albūma informāciju';
+$lang['Update photos information'] = 'Atjaunināt informāciju par fotoattēliem';
+$lang['Synchronize'] = 'Sinhrinizēšana';
+$lang['reduce to single existing albums'] = 'samazināt līdz vienam esošam albūmam';
+$lang['Choose an option'] = 'Izvēlieties iespēju';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'parādīt maksimālo informāciju (pievienotie albūmi un foto, izdzēstie albūmi un foto)';
+$lang['Error list'] = 'Kļūdu saraksts';
+$lang['Errors caption'] = 'Kļūdu apzīmējumi';
+$lang['Detailed informations'] = 'Detalizēta informācija';
+$lang['File/directory read error'] = 'Faila/mapes lasīšanas kļūda';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Nav piekļuves failam vai mapei (vai nu neeksistē vai piekļuve liegta)';
+$lang['albums deleted in the database'] = 'no datu bāzes izdzēsti albūmi';
+$lang['photos deleted from the database'] = 'no datu bāzes izdzēstie fotoattēli';
+$lang['photos candidates for metadata synchronization'] = 'foto kandidāti metadatu sinhronizācijai';
+$lang['photos informations synchronized with files metadata'] = 'informācija par foto sinhronizēta ar faila metadatiem';
+$lang['errors during synchronization'] = 'kļūdas sinhronizācijas laikā';
+$lang['albums added in the database'] = 'datu bāzei pievienoti albūmi';
+$lang['photos added in the database'] = 'datubāzei pievienotie fotoattēli';
+$lang['photos updated in the database'] = 'datubāzē atjauninātie fotoattēli';
+$lang['Search for new images in the directories'] = 'Jaunus attēlu meklēšana mapēs';
+$lang['added'] = 'pievienots';
+$lang['Metadata synchronization results'] = 'Metadatu sinhronizācijas rezultāti';
+$lang['only perform a simulation (no change in database will be made)'] = 'veikt tikai testēšanu (nekas nemainās datu bāzē)';
+$lang['Simulation'] = 'Simulācija';
+$lang['directories + files'] = 'mapes un faili';
+$lang['only directories'] = 'tikai mapes';
+$lang['synchronize files structure with database'] = 'sinhronizēt failu struktūru ar datubāzi';
+$lang['synchronize files metadata with database photos informations'] = 'sinhronizēt faila metadatus ar informāciju par foto datubāzē';
+$lang['even already synchronized photos'] = 'jau sinhronizētie fotoattēli';
+$lang['Used metadata'] = 'Lietotie metadati';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Mapju un failu nosaukumi jāveido no burtiem, cipariem, "-", "_" vai "."';
+$lang['wrong filename'] = 'nepareizs faila nosaukums';
+$lang['Upload'] = 'Augšupielāde';
+$lang['user "%s" added'] = 'lietotājs "%s" pievienots';
+$lang['User status'] = 'Lietotāja statuss';
+$lang['user_status_admin'] = 'Administrators';
+$lang['user_status_generic'] = 'Vispārējais';
+$lang['user_status_guest'] = 'Viesis';
+$lang['user_status_normal'] = 'Lietotājs';
+$lang['user_status_webmaster'] = 'Webmāsters';
+$lang['Virtual album'] = 'Virtuālais albūms';
+$lang['Waiting'] = 'Gaidīšana';
+$lang['default'] = 'pēc noklusējuma';
+$lang['Toggle \'default group\' property'] = 'Pretējais \'grupa pēc noklusējuma\' īpašība';
+$lang['Advanced features'] = 'Paplašinātās funkcijas';
+$lang['Overall'] = 'Visa';
+$lang['Year'] = 'Gads';
+$lang['Month'] = 'Mēnesis';
+$lang['Day'] = 'Diena';
+$lang['Pages seen'] = 'Lapas apskatītas';
+$lang['Time'] = 'Laiks';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Elements';
+$lang['Section'] = 'Nodaļa';
+$lang['An information email was sent to group "%s"'] = 'Informējošs e-pasts nosūtīts grupai "%s"';
+$lang['Send an information email to group members'] = 'Nosūtīt informējošu e-pastu grupas biedriem';
+$lang['Group'] = 'Grupa';
+$lang['[%s] Visit album %s'] = '[%s] Apciemo albūmu %s';
+$lang['Hello,'] = 'Sveiki,';
+$lang['See you soon.'] = 'Uz redzēšanos.';
+$lang['Discover album:'] = 'Atklāj albūmu:';
+$lang['Mail content'] = 'Pasta saturs';
+$lang['none'] = 'neviens';
+$lang['high'] = 'liels';
+$lang['other'] = 'cits';
+$lang['Element type'] = 'Elementa tips';
+$lang['Image id'] = 'Attēla id';
+$lang['Summary'] = 'Summāri';
+$lang['%d line filtered'] = '%d līnija nofiltrēta';
+$lang['%d lines filtered'] = '%d līnijas nofiltrētas';
+$lang['%d guest'] = '%d viesis';
+$lang['%d guests'] = '%d viesu';
+$lang['Hour'] = 'Stunda';
+$lang['guest'] = 'viesis';
+$lang['default values'] = 'vērtības pēc noklusēšanas';
+$lang['Guest cannot be deleted'] = 'Viesi nav iespējams izdzēst';
+$lang['Default user cannot be deleted'] = 'Lietotājs pēc noklusējuma nav izdzēšams';
+$lang['Purge history detail'] = 'Izdzēst daļu vēstures';
+$lang['Purge history summary'] = 'Izdzēst visu vēsturi';
+$lang['Check integrity'] = 'Saderības pārbaude';
+$lang['Anomaly'] = 'Bojājums';
+$lang['Correction'] = 'Labojums';
+$lang['Automatic correction'] = 'Automātisks labojums';
+$lang['Impossible automatic correction'] = 'Automātiska labošana neiespējama';
+$lang['Correction applied with success'] = 'Labojums sekmīgi pielietots';
+$lang['Correction applied with error'] = 'Labojums veikts ar kļūdām';
+$lang['%d anomaly has been detected.'] = '%d bojājums konstatēts.';
+$lang['%d anomalies have been detected.'] = '%d bojājumi konstatēti.';
+$lang['%d anomaly has been corrected.'] = '%d bojājums izlabots.';
+$lang['%d anomalies have been detected corrected.'] = '%d bojājumi konstatēti un izlaboti.';
+$lang['%d anomaly has not been corrected.'] = '%d bojājums nav izlabots.';
+$lang['%d anomalies have not been corrected.'] = '%d bojājumi nav izlaboti.';
+$lang['Go to %s or %s for more informations'] = 'Apmeklējie %s vai %s ,lai iegūtu vairāk informācijas';
+$lang['the forum'] = 'forums';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s vērtība nekorekta, jo exif netiek atbalstīts';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s jāatslēdz jūsu local/config/config.inc.php failā';
+$lang['Main "guest" user does not exist'] = 'Lietotāja "viesis" statuss vairs neeksistē';
+$lang['Main "guest" user status is incorrect'] = 'Lietotāja "viesis" statuss ir nekorekts';
+$lang['Default user does not exist'] = 'Lietotājs pēc noklusējuma vairs neeksistē';
+$lang['Main "webmaster" user does not exist'] = 'Lietotājs "webmāsters" vairs neeksistē';
+$lang['Main "webmaster" user status is incorrect'] = 'Lietotāja "webmāsters" statuss ir nekorekts';
+$lang['User "%s" created with "%s" like password'] = 'Lietotājs "%s" izveidots ar paroli "%s"';
+$lang['Status of user "%s" updated'] = 'Lietotāja "%s" statuss atjaunots';
+$lang['add new photos to caddie'] = 'pievienot jaunus fotoattēlus grozam';
+$lang['No display'] = 'Nerādīt';
+$lang['Classic display'] = 'Klasiskais izskats';
+$lang['Hoverbox display'] = 'Hoverbox izskats';
+$lang['Mail address is obligatory for all users'] = 'E-pasta adrese obligāta visiem lietotājiem';
+$lang['Minimum privacy level'] = 'Minimālais aizsardzības līmenis';
+$lang['Privacy level'] = 'Aizsardzības līmenis';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakti';
+$lang['Level 2'] = 'Draugi';
+$lang['Level 4'] = 'Ģimene';
+$lang['Level 8'] = 'Administrācija';
+$lang['Reinitialize check integrity'] = 'Atkārtot integritātes pārbaudi';
+$lang['Check all'] = 'Atzīmēt visu';
+$lang['Uncheck all'] = 'Noņemt visas atzīmes';
+$lang['Check automatic corrections'] = 'Atzīmēt autokorekciju';
+$lang['Apply selected corrections'] = 'Pielietot izvēlētās korekcijas';
+$lang['Ignore selected anomalies'] = 'Ignorēt atzīmētos bojājumus';
+$lang['Refresh'] = 'Atjaunināt';
+$lang['The anomaly will be ignored until next application version'] = 'Bojājumi tiks ignorēti līdz aplikācijas jaunajai versijai';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Bojājumu labojums atcels ignorēšanas faktu';
+$lang['%d anomaly has been ignored.'] = '%d bojājums ignorēts.';
+$lang['%d anomalies have been ignored.'] = '%d bojājumi ignorēti.';
+$lang['Plugins which need upgrade'] = 'Atjaunināmie spraudņi';
+$lang['Plugin list'] = 'Citi spraudņi';
+$lang['Check for updates'] = 'Jauninājumu pārbaude';
+$lang['Other plugins'] = 'Pieejami citi spraudņi';
+$lang['Last revisions'] = 'Pēdējās izmaiņas';
+$lang['Are you sure you want to delete this plugin?'] = 'Vai esat pārliecināts, ka gribat izdzēst šo spraudni?';
+$lang['Are you sure you want to install this plugin?'] = 'Vai esat pārliecināts, ka gribat instalēt šo spraudni?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Vai esat pārliecināts, kagribat instalēt šo jauninājumu? Pārbaudies vai esošajo versiju nav jāatinstalē.';
+$lang['Plugin has been successfully copied'] = 'Šis spraudnis sekmīgi nokopēts';
+$lang['You might go to plugin list to install and activate it.'] = 'Pārejiet pie spraudņu saraksta, lai to instalētu un aktivētu.';
+$lang['Can\'t create temporary file.'] = 'Nevar izveidot pagaidu failu.';
+$lang['Can\'t download archive.'] = 'Nevar lejupielādēt arhīvu.';
+$lang['Can\'t read or extract archive.'] = 'Nevar lasīt vai izpakot arhīvu.';
+$lang['An error occured during extraction (%s).'] = 'Kļūda izpakojot (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Lūdzu pārbaudiet "spraudņu" mapes and tās apakšdirektoriju atļaujas (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Neiespējams savienojums ar serveri.';
+$lang['Purge compiled templates'] = 'Dzēst izveidotās veidnes';
+$lang['ACCESS_0'] = 'Brīva piekļuve';
+$lang['ACCESS_1'] = 'Piekļuve visiem';
+$lang['ACCESS_2'] = 'Piekļuve tikai reģistrētiem lietotājiem';
+$lang['ACCESS_3'] = 'Piekļuve tikai administratoriem';
+$lang['ACCESS_4'] = 'Piekļuve webmāsteram';
+$lang['ACCESS_5'] = 'Nav piekļuves';
+$lang['Support'] = 'Atbalsts';
+$lang['Documentation'] = 'Dokumentācija';
+$lang['A new version of Piwigo is available.'] = 'Pieejama jauna Piwigo versija.';
+$lang['Piwigo Administration'] = 'Piwigo Administrācija';
+$lang['Piwigo version'] = 'Piwigo versija';
+$lang['You are running the latest version of Piwigo.'] = 'Jūs strādājat ar Piwigo beidzamo versiju.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Uzstādītā %s [%s] versija ir nesavietojama ar prasīto [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Lai izmantotu aplikāciju pilnībā uzlabojiet savu sistēmu, pretējā gadījumā tā strādās nekorekti vai nedarbosies vispār';
+$lang['Deleted on'] = 'Izdzēsts';
+$lang['Last hit'] = 'Pēdējie skatītie';
+$lang['GD library is missing'] = 'Trūksts GD bibliotēka';
+$lang['Templates'] = 'Paraugi';
+$lang['Extend for templates'] = 'Paplašinājums paraugiem';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Nomainīt oriģinālos paraugus ar lietotāja paraugiem no template-extension mapes';
+$lang['Replacers (customized templates)'] = 'Aizvietojošais (lietoptāja paraugs)';
+$lang['Original templates'] = 'Oriģinālie paraugi';
+$lang['Optional URL keyword'] = 'Izvēles URL atslēgvārds';
+$lang['Templates configuration has been recorded.'] = 'Parauga konfigurācija saglabāta.';
+$lang['All optimizations have been successfully completed.'] = 'Visi uzlabojumi sekmīgi veikti	.';
+$lang['Optimizations have been completed with some errors.'] = 'Uzlabojumi veikti ar dažām kļūdām.';
+$lang['Modify information'] = 'Modificēt informāciju';
+$lang['nothing'] = 'nekas';
+$lang['overrides existing values with empty ones'] = 'pārrakstīt esošās vērtības ar tukšām';
+$lang['Manage photo ranks'] = 'Pārvaldīt foto vērtējumus';
+$lang['Edit ranks'] = 'Rediģēt kārtību';
+$lang['No photo in this album'] = 'Šajā albūmā nav neviena foto';
+$lang['Images manual order was saved'] = 'Attēlu kārtība saglabāta';
+$lang['ranks'] = 'kārtība';
+$lang['By rank'] = 'Pēc kārtības';
+$lang['Manual order'] = 'Izveidotā kārtība';
+$lang['Drag to re-order'] = 'Pārvelciet, lai izmanītu kārtību ';
+$lang['Quick Local Synchronization'] = 'Ātrā vietējā sinhronizācija';
+$lang['No photo can be deleted'] = 'Nav attēlu, ko izdzēst';
+$lang['Delete selected photos'] = 'Dzēst izvēlētos attēlus';
+$lang['%d photo was deleted'] = '%d attēls izdzēsts';
+$lang['%d photos were deleted'] = '%d attēli izdzēsti';
+$lang['Downloads'] = 'Lejupielādes';
+$lang['Released on'] = 'Atbrīvots';
+$lang['Number of downloads'] = 'Lejupielāžu skaits';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Ziņu Lapa';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Uzturiet saikni ar Piwigo projektu, parakstieties uz Piwigo Ziņu Lapu. Jūs informēs par jaunumiem (reizēm ir nepieciešams zināt kādu knifu par aplikācijas drošību un atjaunināt to) kas notiek ar projektu. Tikai daži e-pasti gadā.';
+$lang['Subscribe %s'] = 'Parakstīties uz %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Parakstīties uz %s Piwigo Ziņu Lapu';
+$lang['Purge search history'] = 'Dzēst meklēšanas vēsturi';
+$lang['Hide'] = 'Paslēpt';
+$lang['Password is missing. Please enter the password.'] = 'Nepareiza parole. Lūdzu atkārtojiet mēģinājumu.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Nav paroles apstiprinājuma. Lūdzu apstipriniet paroli.';
+$lang['Allow users to edit their own comments'] = 'Atļaut lietotājiem labot savus komentārus';
+$lang['Allow users to delete their own comments'] = 'Atļaut lietotājiem dzēst savus komentārus';
+$lang['Email administrators when a comment is modified'] = 'Paziņot ar e-pastu admisistratoram par izmainītu komentāru ';
+$lang['Email administrators when a comment is deleted'] = 'Paziņot ar e-pastu admisistratoram par dzēstu komentāru';
+$lang['Cannot delete the old permalink !'] = 'Nevar idzēst veco pirmsaiti!';
+$lang['Hit'] = 'Populāri';
+$lang['Tools'] = 'Rīki';
+$lang['Photos'] = 'Attēli';
+$lang['Themes'] = 'Tēmas';
+$lang['Instructions to use Piwigo'] = 'Piwigo lietošanas instrukcija';
+$lang['Installed Themes'] = 'Instalētās Tēmas';
+$lang['Add New Theme'] = 'Pievienot jaunu tēmu';
+$lang['Forbid this theme to users'] = 'Aizliegt lietotājiem izmantot šo tēmu';
+$lang['Set as default theme for unregistered and new users'] = 'Iestatīt tēmu pēc noklusējuma jauniem un nereģistrētiem lietotājiem';
+$lang['unknown'] = 'nezināms';
+$lang['Upload Photos'] = 'Augšupielādēt attēlus';
+$lang['Drop into album'] = 'Ievietot albūmā';
+$lang['+ Add an upload box'] = '+ Pievienot augšupielādes lauku';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Izveidot "%s" mapi jūsu instalētajā Piwigo saknes mapē';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Piešķirt rakstīšanas tiesības (chmod 777) "%s" mapei jūsu instalētajā Piwigo saknes mapē';
+$lang['existing album'] = 'esošs albūms';
+$lang['create a new album'] = 'izveidot jaunu albūmu';
+$lang['Album name'] = 'Albūma nosaukums';
+$lang['Album "%s" has been added'] = 'Pievienota "%s" kategorija';
+$lang['Uploaded Photos'] = 'Augšupielādētie attēli';
+$lang['%d photos uploaded'] = '%d ielādēti attēli';
+$lang['Privacy level set to "%s"'] = 'Iestatīt piekļuves līmeni "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategorijā "%s" ir %d attēli';
+$lang['Manage this set of %d photos'] = 'Rediģēt šo %d attēlu kopumu.';
+$lang['Select files'] = 'Izvēlēties failus';
+$lang['Everybody'] = 'Visi';
+$lang['Who can see these photos?'] = 'Kas var skatīties šos attēlus?';
+$lang['Who can see this photo?'] = 'Kas var skatīties šo attēlu?';
+$lang['Settings'] = 'Iestatījumi';
+$lang['Resize'] = 'Izmainīt izmērus';
+$lang['Maximum Width'] = 'Maksimālais platums';
+$lang['pixels'] = 'pikseļi';
+$lang['Maximum Height'] = 'Maksimālais augstums';
+$lang['Image Quality'] = 'Attēla kvalitāte';
+$lang['Save Settings'] = 'Saglabāt iestatījumus';
+$lang['Your configuration settings are saved'] = 'Jūsu konfigurācija saglabāta';
+$lang['Active Themes'] = 'Aktīvās Tēmas';
+$lang['Add write access to the "%s" directory'] = 'Pievienot rakstīšanas tiesības mapei "%s"';
+$lang['Administration Home'] = 'Vadības panelis';
+$lang['Change Admin Colors'] = 'Izmainīt vadības paneļa krāsas';
+$lang['Delete this theme'] = 'Dzēst šo tēmu';
+$lang['Directory does not exist'] = 'Nav tādas mapes';
+$lang['Download,'] = 'Lejupielādēt,';
+$lang['FTP + Synchronization'] = 'FTP + Sinhronizācija';
+$lang['Get Support on Piwigo Forum'] = 'Griezieties pēc palīdzības Piwigo forumā';
+$lang['Help Me'] = 'Palīdzība';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Šo tēmu nevar aktivēt, jo nav pirmtēmas: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Šo tēmu nevar dzēst, jo no tās atkarīgas citas tēmas: %s';
+$lang['Inactive Themes'] = 'Neaktīvās tēmas';
+$lang['Install on your computer,'] = 'Instalējiet savā datorā,';
+$lang['Make this theme available to users'] = 'Padarīt šo tēmu pieejamu lietotājiem';
+$lang['Page end'] = 'Lapas beigas';
+$lang['Piwigo Uploader'] = 'Piwigo Augšupielādētājs';
+$lang['Read Piwigo Documentation'] = 'Lasiet Piwigo Documentāciju';
+$lang['Start pLoader and add your photos.'] = 'Startējiet pLoader un pievienojiet Jūsu fotogrāfijas.';
+$lang['Switch to clear or dark colors for administration'] = 'Izvēlieties vadības paneļa gaišos vai tumšos toņus';
+$lang['Theme has been successfully installed'] = 'Tēma sekmīgi uzinstalēta';
+$lang['Visit Gallery'] = 'Apmeklējiet Galeriju';
+$lang['Visit Piwigo project website'] = 'Apmeklējiet Piwigo projekta mājas lapu';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader aizvieto <em>Piwigo Augšupielādētāju</em>.Ar PLoader jūsu lokāli sagatavos attēlus var pārvietot uz jūsu Piwigo foto galeriju.';
+$lang['Guest Settings'] = 'Lietotāja Viesis iestatījumi';
+$lang['Main Page'] = 'Galvenā Lapa';
+$lang['Photo Page'] = 'Attēla Lapa';
+$lang['Activate Navigation Bar'] = 'Aktivēt Navigācijas Paneli';
+$lang['Activate Navigation Thumbnails'] = 'Aktivēt navigāciju pēc piktogrammām';
+$lang['Activate icon "%s"'] = 'Aktivēt ikonu "%s"';
+$lang['Photo Properties'] = 'Attēla raksturīgās īpašības';
+$lang['Allow user customization'] = 'Atļaut lietotājiem pielāgot galerijas izskatu';
+$lang['Languages'] = 'Valodas';
+$lang['Installed Languages'] = 'Instalēt Valodas';
+$lang['Add New Language'] = 'Pievienot Jaunu Valodu';
+$lang['Language has been successfully installed'] = 'Valoda sekmīgi uzinstalēta';
+$lang['Select:'] = 'Izvēlieties:';
+$lang['None'] = 'Neviens';
+$lang['Invert'] = 'Apvērst';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Neiespējams deaktivēt šo Tēmu, nepieciešams, lai paliek vismaz viena Tēma.';
+$lang['Webmaster status is required.'] = 'Nepieciešams Webmāstera statuss.';
+$lang['Bound Theme'] = 'Piesaistītā Tēma';
+$lang['Allow rating'] = 'Atļaut novērtēt';
+$lang['Select at least one comment'] = 'Izvēlieties vismaz vienu komentāru';
+$lang['Active Plugins'] = 'Aktīvie Spraudņi';
+$lang['Inactive Plugins'] = 'Neaktīvie Spraudņi';
+$lang['Missing Plugins'] = 'Trūkstošie Spraudņi';
+$lang['Uninstalled Plugins'] = 'Atinstalētie Spraudņi';
+$lang['By %s'] = ' %s';
+$lang['Visit plugin site'] = 'Apmeklēt spraudņu mājas lapu';
+$lang['Active Languages'] = 'Aktivēt Valodas';
+$lang['Delete this language'] = 'Izdzēst šo valodu';
+$lang['Forbid this language to users'] = 'Aizliegt šo valodu lietotājiem';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Neiespējams deaktivēt šo valodu, vispirms iestatiet kā noklusējumu citu valodu.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Neiespējams deaktivēt šo valodu, nepieciešama vismaz viena valoda.';
+$lang['Inactive Languages'] = 'Deaktivizēt Valodas';
+$lang['Make this language available to users'] = 'Padarīt šo valodu pieejamu lietotājiem';
+$lang['Set as default language for unregistered and new users'] = 'Iestatīt kā noklusējuma valodu nereģistrētiem un jauniem lietotājiem';
+$lang['Add Photos'] = 'Pievienot attēlus';
+$lang['The following tag was deleted'] = 'Izdzēsta sekojošas iezīme';
+$lang['Miscellaneous'] = 'Dažāds';
+$lang['Virtual Links'] = 'Virtuālās saites';
+$lang['There is no other language available.'] = 'Cita valoda nav pieejama.';
+$lang['There is no other plugin available.'] = 'Cits spraudnis nav pieejams.';
+$lang['There is no other theme available.'] = 'Cita tēma nav pieejama.';
+$lang['Add another set of photos'] = 'Pievienot citu attēlu kopumu';
+$lang['Order of menubar items has been updated successfully.'] = 'Izvēlnes rīku kārtība atjaunināta sekmīgi';
+$lang['This theme was not designed to be directly activated'] = 'Šo tēmu nevar aktivet tieši';
+$lang['Pending Comments'] = 'Komentaŗu pārbaude';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Jūsu php.ini faila upload_max_filesize (%sB) ir lielāks par post_max_size (%sB), jums jāizmaina šis iestatījums';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif paplašinājums nav iespējams, adminam jāaizliedz exif lietošana';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Augšupielādētais fails pārsniedz upload_max_filesize direktīvu php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Augšupielādētie faili pārsniedz post_max_size direktīvu php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Augšuplādējamais fails pārsniedz MAX_FILE_SIZE direktīvu, kas noteikta HTML formā';
+$lang['The uploaded file was only partially uploaded'] = 'Augšuplādētais fails tikai daļēji augšupielādēts';
+$lang['No file was uploaded'] = 'Fails netika augšupielādēts';
+$lang['Missing a temporary folder'] = 'Pazudusi pagaidu mape';
+$lang['Failed to write file to disk'] = 'Kļūda ierakstot failu diskā';
+$lang['File upload stopped by extension'] = 'Faila augšupielāde apturēta dēļ paplašinājuma';
+$lang['Unknown upload error'] = 'Nezināma augšupielādes kļūda';
+$lang['Error on file "%s" : %s'] = 'Kļūda failā "%s" : %s';
+$lang['Menu Management'] = 'Izvēlnes Pārvalde';
+$lang['automatic order'] = 'automātiskais kārtojums';
+$lang['manual order'] = 'manuālais kārtojums';
+$lang['Albums automatically sorted'] = 'Albūmi ir automātiski  sakārtoti';
+$lang['Batch Manager'] = 'Sērijveida failu pārvaldnieks';
+$lang['include child albums'] = 'ietvert radniecīgos albūmus';
+$lang['Selection'] = 'Izvēle';
+$lang['Action'] = 'Darbība';
+$lang['Set author'] = 'Ievadīt autoru';
+$lang['Set title'] = 'Ievadīt virsrakstu';
+$lang['Set creation date'] = 'Ievadīt izveides datumu';
+$lang['Apply action'] = 'Veikt darbību';
+$lang['on the %d selected photos'] = 'uz %d atlasītajiem fotoattēliem';
+$lang['%d of %d photos selected'] = '%d no %d atlasītajiem fotoattēliem';
+$lang['No photo selected, %d photos in current set'] = 'Nav atlasītu foto, %d fotoattēli tekošajā sērijā';
+$lang['All %d photos are selected'] = 'Visi %d foto ir atlasīti';
+$lang['remove this filter'] = 'noņemt šo filtru';
+$lang['Duplicates'] = 'dublikāti';
+$lang['Add a filter'] = 'Pievienot filtru';
+$lang['Remove all filters'] = 'Noņemt visus filtrus';
+$lang['Refresh photo set'] = 'Atjaunināt foto sēriju';
+$lang['The whole page'] = 'Visa lapa';
+$lang['The whole set'] = 'Visa sērija';
+$lang['No photo in the current set.'] = 'Nav fotoattēlu esošajā sērijā.';
+$lang['No photo selected, no action possible.'] = 'Nav atlasītu fotoattēlu, nekādas darbības nav iespējamas.';
+$lang['Choose an action'] = 'Izvēlēties darbību';
+$lang['remove author'] = 'izdzēst autoru';
+$lang['Type here the author name'] = 'Ievadīt autora vārdu šeit';
+$lang['remove title'] = 'dzēst nosaukumu';
+$lang['Type here the title'] = 'Ievadīt nosaukumu šeit';
+$lang['remove creation date'] = 'dzēst izveides datumu';
+$lang['Album photos associated to the following albums: %s'] = 'Albūma fotoattēli saistīti ar sekojošiem albūmiem: %s';
+$lang['Delete orphan tags'] = 'Dzēst nepiesaistītās cilnes (iezīmes)';
+$lang['delete photo'] = 'Dzēst fotoattēlu';
+$lang['Orphan tags deleted'] = 'Nepiesaistītās cilnes izdzēstas';
+$lang['Week starts on'] = 'Nedēļa sākas ar';
+$lang['You have %d orphan tags: %s.'] = 'Jums ir %d nepiesaistīto cilņu: %s.';
+$lang['Remove from caddie'] = 'Izņemt no groza';
+$lang['Themes which need upgrade'] = 'Tēmas, kurām nepieciešami jauninājumi';
+$lang['Languages which need upgrade'] = 'Valodas, kurām nepieciešami jauninājumi';
+$lang['All themes are up to date.'] = 'Visas tēmas ir atjauninātas.';
+$lang['All plugins are up to date.'] = 'Visi spraudņi ir atjaunināti.';
+$lang['All languages are up to date.'] = 'Visas valodas ir atjauninātas.';
+$lang['Visit theme site'] = 'Apmeklēt tēmu vietni';
+$lang['Visit language site'] = 'Apmeklēt valodu vietni';
+$lang['New Version'] = 'Jauna Versija';
+$lang['Obsolete Plugins'] = 'Nepiesaistītie Spraudņi';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'UZMANĪBU! Šķiet, ka šis spraudnis nav saderīgs ar šo Piwigo versiju.';
+$lang['Do you want to activate anyway?'] = 'Vai vēlaties aktivēt jebkurā gadījumā?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TAGAD ŠIS SPRAUDNIS IR PIWIGO KODOLA SASTĀVDAĻA! VAI NOINSTALĒT TO!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'KĻŪDA: ŠIS SPRAUDNIS IZTRŪKST, BET TAS IR INSTALĒTS! VAI NOINSTALĒT TO';
+$lang['display'] = 'attēlot';
+$lang['Thumbnails generation in progress...'] = 'Notiek sīkbilžu ģenerēšanas (veidošanas) process...';
+$lang['Photos generation in progress...'] = 'Notiek foto izveide...';
+$lang['%s photos have been regenerated'] = 'izveidotas %s fotogrāfijas';
+$lang['%s photos can not be regenerated'] = '%s fotogrāfijas nav iespējams reģenerēt';
+$lang['new'] = 'jauns';
+$lang['No results'] = 'Nav rezultātu';
+$lang['Searching...'] = 'Meklē...';
+$lang['Type in a search term'] = 'Ierakstiet meklējamo vārdu';
+$lang['Deactivate all'] = 'Deaktivēt visu';
+$lang['Default photos order'] = 'Foto kārtojums pēc noklusējuma';
+$lang['Restore'] = 'Atjaunot';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Atjaunot noklusējuma konfigurāciju. Jūs zaudēsit savus spraudņa iestatījumus!';
+$lang['Show menubar'] = 'Rādīt izvēles joslu';
+$lang['Updates'] = 'Jauninājumi';
+$lang['Update in progress... Please wait.'] = 'Notiek jaunināšana... Lūdzu uzgaidiet.';
+$lang['Ignore this update'] = 'Ignorēt šo jauninājumu';
+$lang['Reset ignored updates'] = 'Atjaunot ignorētos jauninājumus';
+$lang['Update All'] = 'Jaunināt visu';
+$lang['ERROR'] = 'KĻŪDA';
+$lang['Update Complete'] = 'Jauninājums Paveikts';
+$lang['Piwigo Update'] = 'Piwigo Jauninājums';
+$lang['Extensions Update'] = 'Paplašinājumu Jauninājums';
+$lang['All extensions are up to date.'] = 'Visi paplašinājumi ir atjaunināti.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Sekojoši spraudņi var nesaderēt ar jauno Piwigo versiju:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Sekojošas tēmas var nesaderēt ar jauno Piwigo versiju:';
+$lang['I decide to update anyway'] = 'Esmu izlēmis veikt jauninājumu jebkurā gadījumā';
+$lang['Update to Piwigo %s'] = 'Jaunināt uz Piwigo %s';
+$lang['Two updates are available'] = 'Pieejami divi jauninājumi';
+$lang['This is a minor update, with only bug corrections.'] = 'Šis ir nenozīmīgs jauninājums, tikai daži defektu labojumi.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Šis ir svarīgs jauninājums, ar <a href="%s">jaunām svarīgām iespējām</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Dažas tēmas un spraudņi vēl var būt nav pieejami.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Jūs varat jaunināt uz Piwigo %s tieši, neuzlabojot uz Piwigo %s (ieteicams).';
+$lang['Save Template Directory'] = 'Saglabāt veidņu mapi';
+$lang['Dump Database'] = 'Izgāzt Datubāzi';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Ietvert datu vēsturi (Brīdinājums: servera atmiņas limits var tikt pārsniegts)';
+$lang['Unable to dump database.'] = 'Neiespējami izgāzt (dump) datubāzi.';
+$lang['Some upgrades are available for extensions.'] = 'Paplašinājumiem pieejami daži uzlabojumi.';
+$lang['Ignore All'] = 'Ignorēt Visu';
+$lang['Crop'] = 'Apgriezt';
+$lang['Width'] = 'Platums';
+$lang['Height'] = 'Augstums';
+$lang['Follow Orientation'] = 'Sekot Orientācijai';
+$lang['Graphics Library'] = 'Grafikas Bibliotēka';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivēt ikonu "new" (jauns) blakus albūmiem un attēliem';
+$lang['Add a criteria'] = 'Pievienot kritēriju';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Nav iespējams izveidot foto kārtošanas secību pēc noklusējuma, jo jūsu izveidotajā lokālajā konfigurācijā ir jūsu pielāgotie iestatījumi.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Jūs savā  lokālajā konfigurācijas failā esat iestatīts  <i>$conf[\'order_by\']</i>, šis parametrs ir novecojis, lūdzu izdzēšiet to vai pārdēvējiet to sekojoši : <i>$conf[\'order_by_custom\']</i> !';
+$lang['Average rate'] = "Vidējais novērtejums";
+$lang['Rate'] = "Vērtējums";
+$lang['Learn more'] = 'Uzzini vairak';
+$lang['... or '] = '... vai ';
+$lang['Create'] = 'Izveidot';
+$lang['Start Upload'] = 'Sākt augšupielādi';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Jūs lietojat Flash augšuplādētāju. Problēmas? Tā vietā mēģiniet <a href="%s">Pārlūka augšuplādētāju</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Jūs lietojat Pārlūka augšuplādētāju. Tā vietā mēģiniet <a href="%s">Flash augšuplādētāju</a>.';
+$lang['Maximum file size: %sB.'] = 'Faila maksimālais izmērs: %sB.';
+$lang['Allowed file types: %s.'] = 'Atļautie failu tipi: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Aptuvenā maksimālā izšķirtspēja: %dM pixeļi (tas ir %dx%d pixeļi).';
+$lang['Manage Permissions'] = 'Pārvaldīt Piekļuves Atļaujas';
+$lang['Photo %s of %s'] = ' %s foto no %s';
+$lang['show details'] = 'rādīt detaļas';
+$lang['hide details'] = 'paslēpt detaļas';
+$lang['Merge tags'] = 'Apvienot (sapludināt) cilnes (tags)';
+$lang['Select the destination tag'] = 'Izvēlēties mērķa cilni';
+$lang['(this tag will be deleted)'] = '(šī cilne (tag) tiks izdzēsta)';
+$lang['Confirm merge'] = 'Apstiprināt apvienošanu';
+$lang['Merge selected tags'] = 'Apvienot izvēlētās cilnes';
+$lang['No destination tag selected'] = 'Nav izvēlēta mērķa cilne';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Cilnes (tags) <em>%s</em> apvienotas cilnē <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Izvēlaties vismaz divas cilnes apvienošanai';
+$lang['Select an album'] = 'Izvēlaties albūmu';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Pēc noklusēšanas Piwigo izveidos jaunu foto webizmēru jūsējai HD (augstas izšķirtspējas) attēla versijai.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Ja nav neviena HD un, ja esošais webizmērs ir lielāks par atļautajiem izmēriem, Piwigo to uzskata par HD attēlu un no šī attēla izveidos atbilsoša webizmēra attēlu.';
+$lang['An error has occured during upgrade.'] = 'Atjauninot notikusi kļūme.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Atpakošanas laikā notikusi kļūme. Pārbaudiet Jūsu piwigo instalācijas failu atļaujas.<br><a href="%s">Spiest te, lai redzētu log kļūdas</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo nevar ielādēt jauninājuma failu no servera';
+$lang['Zoom'] = 'Tālummaiņa';
+$lang['%s has been successfully updated.'] = '%s ir sekmīgi atjaunināts.';
+$lang['Add tags'] = 'Pievienot tagus';
+$lang['Add to caddie'] = 'Pievienot grozam';
+$lang['Last import'] = 'Pēdējais imports';
+$lang['Predefined filter'] = 'Definēts filtrs';
+$lang['With no album'] = 'Bez albūma';
+$lang['With no tag'] = 'Bez taga';
+$lang['With no virtual album'] = 'Bez virtuālā albūma';
+$lang['Activate comments'] = 'Aktivizēt komenārus';
+$lang['Default comments order'] = 'Komentāru kārtojums pēc noklusējuma';
+$lang['Photo name'] = 'Foto nosaukums';
+$lang['Send connection settings by email'] = 'Nosūtīt konekcijas iestatījumus ar e-pastu';
+$lang['The original image quality must be a number between %d and %d'] = 'Oriģinālā attēla kvalitātei jābūt skaitlim diapazonā starp %d un %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Oriģināla maksimālajam augstumam jābūt skaitlim starp %d un %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Oriģināla maksimālajam platumam jābūt skaitlim starp %d un %d';
+$lang['Resize after upload'] = 'Mainīt izmērus pēc augšupielāde';
+$lang['Original Size'] = 'Oriģinālie Izmēri';
+$lang['A locked gallery is only visible to administrators'] = 'Bloķētā galerija ir redzama tikai administratoriem';
+$lang['Unlock gallery'] = 'Atbloķēt galeriju';
+$lang['Gallery unlocked'] = 'Galerija ir atbloķēta';
+$lang['Notify administrators when a comment is'] = 'Ziņot administratoriem, kad komentārs ir';
+$lang['modified'] = 'modificēts';
+$lang['pending validation'] = 'gaida validāciju';
+$lang['Save visits in history for'] = 'Ieglabāt vēsturē apmeklējumus priekš';
+$lang['simple visitors'] = 'parastiem apmeklētājiem';
+$lang['registered users'] = 'reģistrētiem lietotājiem';
+$lang['administrators'] = 'administratoriem';
+$lang['This album contains %d photos, added on %s.'] = 'Šinī albūmā ir %d fotogrāfiju, kas pievienotas %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Šinī albūmā ir %d fotogrāfiju, kas pievienotas laikā starp %s un %s.';
+$lang['This album contains no photo.'] = 'Šinī albūmā nav fotogrāfiju.';
+$lang['Not cropped correctly?'] = 'Nav korekti apgriezts?';
+$lang['Center of interest'] = 'Interešu centrs';
+$lang['Move to album'] = 'Pārvietot uz albūmu';
+$lang['You can activate only one mobile theme.'] = 'Jūs varat aktivēt tikai vienu mobilo tēmu.';
+$lang['Automatic sort order'] = 'Automātiskās kārtošanas režīms';
+$lang['apply automatic sort order'] = 'pielietot automātiskās kārtošanas režīmu';
+$lang['Save manual order'] = 'Saglabāt manis veidoto kārtojumu';
+$lang['cancel manual order'] = 'atcelt manis veidoto kārtojumu';
+$lang['Cancel'] = 'Atcelt';
+$lang['List'] = 'Saraksts';
+$lang['Web Form'] = 'Web Forma';
+$lang['Applications'] = 'Aplikācijas';
+$lang['Available versions for'] = 'Pieejamās versijas priekš';
+$lang['Available on'] = 'Pieejams uz';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo priekš iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo priekš iOS</em> aplikācijas, kas ļauj piekļūt jūsu  Piwigo galerijai no iPhone, iPad vai iPod Touch, un bez pūlēm  izveidot jaunus albūmus un ielādēt jaunas fotogrāfijas.';
+$lang['Piwigo for Android'] = 'Piwigo priekš Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo priekš Android</em> aplikācija dod jums iespēju savienot savu Android telefonu vai iekārtu ar jūsu Piwigo galeriju, bez pūlēm izveidot jaunus albūmus un ielādēt jaunas fotogrāfijas.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publicēšanas spraudnis priekš Lightroom'; 
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom ir fotoredaktora programmatūra, kas domāta liela apjoma digitālu attēlu pārvaldīšanai un  pirmsproducēšanas darbu veikšanai.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publicēšanas spraudnis ļauj jums eksportēt un sinhronizēt attēlus Lightroom aplikācijā ar jūsu  Piwigo foto galeriju.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publicēšanas spraudnis priekš Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell ir atvērtā koda foto organizators, kas darbojas Linux vidē. Tas ir  Ubuntu and Fedora fotoredaktors pēc noklusēšanas.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Savā Linux vienkārši instalējiet Shotwell, izmantojot savu instalācijas menedžeri un aktivējiet Piwigo publicēšanas opciju.';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publicēšanas spraudnis priekš digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam ir bezmaksas advancēta digitālo foto apstrādes aplikācija priekš Linux, Windows, and MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam radīta priekš fotogrāfiem, kas grib pārraudzīt, pārvaldīt, rediģēt, uzlabot, organizēt, iezīmēt un dalīties ar savām fotogrāfijām.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Lai eksportētu savus attēlus no digiKam uz Piwigo, vienkārši instalējiet digiKam un  Kipi-spraudņus.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo eksporta spraudnis priekš iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto ir foto menedžeris pēc noklusēšanas  MacOSX vidē. Piwigo eksporta spraudnis ļauj jums izveidot jaunus albūmus un eksportēt jūsu fotogrāfijas pa taisno no iPhoto uz jūsu Piwigo foto galeriju.';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo eksporta spraudnis priekš Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture ir jaudīgs rīks attēlu šķirošanai un masīvu bibliotēku pārvaldīšanai  Mac vidē.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture ir domāts profesionāliem fotogrāfiem ar iPhoto vienkāršību.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo eksporta spraudnis ļauj jums veidot albūmus un eksportēt fotogrāfijas.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (Android AttālinātāsGalerijs klients) ir atvērtā koda (GPL v3) Piwigo klients priekš Android platformas.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Iespējas sevī ietver galeriju pārlūkošanu, albūmu veidošanu un fotogrāfiju augšupielādi.';
+$lang['Generate multiple size images'] = 'Ģenerēt dažādu izmēru attēlus';
+$lang['Delete multiple size images'] = 'Dzēst dažādu izmēru attēlus';
+$lang['any visitor can see this album'] = 'jebkurš apmeklētājs var redzēt šo albūmu';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'apmeklētājiem jāielogojas un jābūt attiecīgām atļaujām, lai redzētu šo albūmu';
+$lang['Groups and users'] = 'Grupas un lietotāji';
+$lang['Permission granted for groups'] = 'Atļauja piešķirta grupām';
+$lang['Select groups...'] = 'Atlasīt grupas...';
+$lang['There is no group in this gallery.'] = 'Šajā galerijā nav grupu.';
+$lang['Permission granted for users'] = 'Atļauja piešķirta lietotājiem';
+$lang['Select users...'] = 'Atlasīt lietotājus...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '% lietotājiem ir automātiskās piekļuves tiesības, jo tie pieder pie privileģētās grupas.';
+$lang['include photos with lower privacy level'] = 'iekļaut fotogrāfijas ar zemāku privātuma līmeni';
+$lang['custom'] = 'Lietotāja';
+$lang['No group is permitted to see this private album'] = 'Grupai nav atļauts skatīt šo privāto albūmu';
+$lang['Permission management'] = 'Atļauju pārvaldīšana';
+$lang['Photo sizes with crop'] = 'Foto izmēri pēc apgriešanas';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Interešu centrs ir visnozīmīgākā zona fotogrāfijā.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Priekš apgriezto foto izmēriem, tādiem kā “Kvadrāts”, Piwigo paveic to vislabāko iekļaujot interešu centru.';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Pēc noklusējuma interešu centrs atrodas fotogrāfijas vidū.';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Ar peles palīdzību izvēlieties jaunu interešu centru.';
+$lang['X Position'] = 'X Pozīcija';
+$lang['Y Position'] = 'Y Pozīcija';
+$lang['X Repeat'] = 'X Atkārtot';
+$lang['Opacity'] = 'Caurspīdīgums';
+$lang['top left corner'] = 'augšējais kreisais stūris';
+$lang['top right corner'] = 'augšējais labais stūris';
+$lang['middle'] = 'vidus';
+$lang['bottom left corner'] = 'apakšējais kreisais stūris';
+$lang['bottom right corner'] = 'apakšējais labais stūris';
+$lang['Select a file'] = 'Izvēlēties failu';
+$lang['add a new watermark'] = 'pievienot jaunu ūdenszīmi';
+$lang['Apply watermark if width is bigger than'] = 'Lietot ūdenszīmi, ja platums ir lielāks par';
+$lang['Apply watermark if height is bigger than'] = 'Lietot ūdenszīmi, ja augstums ir lielāks par';
+$lang['Multiple Size'] = 'Vairāki izmēri';
+?>
Index: tags/2.4.0RC3/language/lv_LV/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/lv_LV/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Latviešu [LV]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=427
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = "Latvian";
+$lang_info['country'] = "Latvia";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "lv";
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d albūms album atjaunināts';
+$lang['%d albums updated'] = '%d albūmi atjaunināti';
+$lang['%d comment to validate'] = "%d apstiprināt komentārus";
+$lang['%d comments to validate'] = "%d apstiprināt komentarus";
+$lang['%d new comment'] = "%d jauns komentārs";
+$lang['%d new comments'] = "%d jauni komentāri";
+$lang['%d comment'] = "%d komentārs";
+$lang['%d comments'] = "%d komentāri";
+$lang['%d hit'] = "%d skatījums";
+$lang['%d hits'] = "%d skatījumi";
+$lang['%d new photo'] = '%d jauns foto';
+$lang['%d new photos'] = '%d jauni foto';
+$lang['%d new user'] = "%d jauns lietotājs";
+$lang['%d new users'] = "%d jauni lietotāji";
+$lang['About'] = "Par";
+$lang['All tags'] = "Visi tagi";
+$lang['Any tag'] = "Jabkurš tags";
+$lang['At least one listed rule must be satisfied.'] = "Ir jaapmierina vismaz viens piedāvātais kritērijs.";
+$lang['Author'] = "Autors";
+$lang['Albums'] = 'Albūmi';
+$lang['Album'] = 'Albūms';
+$lang['Close this window'] = "Aizveriet šo logu";
+$lang['Complete RSS feed (photos, comments)'] = 'Pilnīga RSS padeve (foto, komentāri)';
+$lang['Confirm Password'] = "Apstiprināt paroli";
+$lang['Connection settings'] = "Savienojuma iestatījumi";
+$lang['Login'] = "Ielogoties";
+$lang['Contact webmaster'] = "Savienot ar webmaster";
+$lang['Create a new account'] = "Izveidot jaunu kontu";
+$lang['Created on'] = "Izveidots";
+$lang['Creation date'] = "Izveidošanas datums";
+$lang['Current password is wrong'] = "Patrreizējā parole ir nepareiza";
+$lang['Dimensions'] = "Izmēri";
+$lang['Display'] = "Displejs";
+$lang['Each listed rule must be satisfied.'] = "Ir jāapmierina visus piedāvātos kritērijus.";
+$lang['Email address'] = "E-pasta adrese";
+$lang['Enter your personnal informations'] = "Ievadiet savus datus";
+$lang['Error sending email'] = "Kļūda nosūtot e-pastu";
+$lang['File name'] = "Faila vārds";
+$lang['File'] = "Fails";
+$lang['Filesize'] = "Faila izmērs";
+$lang['Filter and display'] = "Filtrēt un attēlot";
+$lang['Filter'] = "Filtrs";
+$lang['Forgot your password?'] = "Aizmirsāt paroli?";
+$lang['Go through the gallery as a visitor'] = "Skatīt galeriju ka apmeklētājam";
+$lang['Help'] = "Palīgs";
+$lang['Identification'] = "Identifikācija";
+$lang['Photos only RSS feed'] = 'foto tikai ar RSS padevi';
+$lang['Keyword'] = "Atslēgvārds";
+$lang['Links'] = "Saites";
+$lang['N/A'] = "N/A";
+$lang['New on %s'] = "Jauns %s";
+$lang['Notification'] = "Paziņojums";
+$lang['Number of items'] = "Vienību skaits";
+$lang['Original dimensions'] = "Oriģinālie izmēri";
+$lang['Password forgotten'] = "Aizmirsta parole";
+$lang['Password'] = "Parole";
+$lang['Post date'] = "Ievietošanas datums";
+$lang['Posted on'] = "Ievietots";
+$lang['Profile'] = "Profils";
+$lang['Quick connect'] = "Ātrais savienojums";
+$lang['RSS feed'] = "RSS padeve";
+$lang['Register'] = "Reģistrs";
+$lang['Registration'] = "Reģistrācija";
+$lang['Related tags'] = "Radniecīgie tagi";
+$lang['Reset'] = "Restartēt";
+$lang['Retrieve password'] = "Iegūt paroli";
+$lang['Search rules'] = "Meklēšanas kritēriji";
+$lang['Search tags'] = "Meklēt tagus";
+$lang['Search'] = "Meklēt";
+$lang['display available tags'] = "Skatīt pieejamos tagus";
+$lang['Since'] = "Kopš";
+$lang['Sort by'] = "Sarindot pēc";
+$lang['Sort order'] = "Rindošanas secība";
+$lang['Tag'] = "Tags";
+$lang['Tags'] = "Tagi";
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS paziņojumu kanāls sniedz paziņojumus šis vietnes jaunumiem: jauni foto, atjaunināti albūmi, jauni komentāri. Lietot RSS piegādes kanāla lasītāju.';
+$lang['Unknown feed identifier'] = "Nezināms piegādes identifikators";
+$lang['User comments'] = "Lietotāja komentāri";
+$lang['Username'] = "Lietotājvārds";
+$lang['Visits'] = "Apmeklējumi";
+$lang['Webmaster'] = "Webmasters";
+$lang['Week %d'] = "Nedēļa %d";
+$lang['About Piwigo'] = "Par Piwigo";
+$lang['You are not authorized to access the requested page'] = "Jūs neēsat autorizējies, lai piekļūtu šai lapai";
+$lang['add this photo to your favorites'] = 'pievienot šo foto pie jūsu favorītiem';
+$lang['Administration'] = "Administrēšana";
+$lang['all'] = "visi";
+$lang['ascending'] = "augšupejošs";
+$lang['author(s) : %s'] = "autors(i) : %s";
+$lang['Expand all albums'] = 'Izvērst visus albūmus';
+$lang['posted after %s (%s)'] = "ievietots pēc %s (%s)";
+$lang['posted before %s (%s)'] = "ievietots pirms %s (%s)";
+$lang['posted between %s (%s) and %s (%s)'] = "ievietots starp %s (%s) un %s (%s)";
+$lang['posted on %s'] = "ievietots %s";
+$lang['Best rated'] = "Vislabāk novērtētais";
+$lang['display best rated photos'] = 'parādīt visaugstāk novērtētos foto';
+$lang['Calendar'] = "Kalendārs";
+$lang['All'] = "Visi";
+$lang['display each day with photos, month per month'] = 'rādīt katru dienu ar fotogrāfijām mēnesi pēc mēneša';
+$lang['View'] = "Skatīt";
+$lang['chronology_monthly_calendar'] = "Mēnesis";
+$lang['chronology_monthly_list'] = "Datums";
+$lang['chronology_weekly_list'] = "Nedēļas diena";
+$lang['Click here if your browser does not automatically forward you'] = "Klikšķiniet šeit, ja pārlūks jūs automatiksti neparsledz";
+$lang['comment date'] = "komentāra datums";
+$lang['Comment'] = "Komentārs";
+$lang['Your comment has been registered'] = "Jūsu komentārs ir reģistrēts";
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "Atipārpildīšanās : lūdzu pagaidiet pirms sūtīt jaunu komentāru";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "Jūsu komentārs nav reģistrēts, jo neatbilst nosacījumiem";
+$lang['An administrator must authorize your comment before it is visible.'] = "Administrātoram ir jāpārbauda jūsu komentārs pirms tas tiks parādīts.";
+$lang['This login is already used by another user'] = "Šo loginu jau izmanto cits lietotājs";
+$lang['Comments'] = "Komentāri";
+$lang['Add a comment'] = "Pievienot komentāru";
+$lang['created after %s (%s)'] = "izveidots pēc %s (%s)";
+$lang['created before %s (%s)'] = "izveidots pirms %s (%s)";
+$lang['created between %s (%s) and %s (%s)'] = "izveidots starp %s (%s) and %s (%s)";
+$lang['created on %s'] = "izveidots %s";
+$lang['Customize'] = "Pielāgot";
+$lang['Your Gallery Customization'] = "Jūs Galerijas pielāgošana";
+$lang['day'][0] = "Svētdiena";
+$lang['day'][1] = "Pirmdiena";
+$lang['day'][2] = "Otrdiena";
+$lang['day'][3] = "Trešdiena";
+$lang['day'][4] = "Ceturtdiena";
+$lang['day'][5] = "Piektdiena";
+$lang['day'][6] = "Sestdiena";
+$lang['Default'] = "Noklusējums";
+$lang['delete this photo from your favorites'] = 'dzēst šo foto no jūsu favorītiem';
+$lang['Delete'] = "Dzēst";
+$lang['descending'] = "lejupejošs";
+$lang['Download'] = "Lejupielādēt";
+$lang['Download this file'] = "lejupielādēt šo failu";
+$lang['edit'] = "labot";
+$lang['wrong date'] = "nepareizs datums";
+$lang['excluded'] = "izņemtais";
+$lang['Your favorites'] = "Mani izvēlētie";
+$lang['display your favorites photos'] = 'rādīt jūsu iemīļotos fotoattēlus (favorītus)';
+$lang['Favorites'] = "Izvēlētie";
+$lang['First'] = "Pirmais";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = "Galerija slēgta apkopei, lūdzu apmeklējiet to vēlāk.";
+$lang['Page generated in'] = "Uzģenerēta lappuse";
+$lang['guest'] = "viesis";
+$lang['Hello'] = "Sveiki";
+$lang['available for administrators only'] = "pieeja tikai administratoriem";
+$lang['display this album'] = 'rādīt šo albūmu';
+$lang['display last user comments'] = "Apskatīt pēdējos lietotāju komentārus";
+$lang['customize the appareance of the gallery'] = "pielāgot galerijas izskatu";
+$lang['search'] = "meklēt";
+$lang['Home'] = "Sākums";
+$lang['in this album'] = 'šajā albūmā';
+$lang['in %d sub-album'] = '%d apakšalbūmā';
+$lang['in %d sub-albums'] = '%d apakšalbūmos';
+$lang['included'] = "iekļauts";
+$lang['Invalid password!'] = "Nepareiza parole!";
+$lang['Language'] = "Valoda";
+$lang['last %d days'] = "pēdējās %d dienas";
+$lang['Last'] = "Pēdējais";
+$lang['Logout'] = "Iziet";
+$lang['obligatory'] = "obligāts";
+$lang['Maximum photo height'] = 'Maksimālais foto augstums';
+$lang['Maximum height must be a number superior to 50'] = "Maksimālajam augstumam jābūt lielākam par 50";
+$lang['Maximum photo width'] = 'Maksimālais foto platums';
+$lang['Maximum width must be a number superior to 50'] = "Maksimālajam platumam jābūt lielākam par 50";
+$lang['display a calendar by creation date'] = "rāda kalendārā izveides datumu";
+$lang['display all photos in all sub-albums'] = 'rādīt visus apakšalbūmu (sub-albums) attēlus';
+$lang['return to normal view mode'] = "atgriezties normālajā apskates režīmā";
+$lang['display a calendar by posted date'] = "rāda kalendārā iesniegšanas datumu";
+$lang['month'][10] = "Oktobris";
+$lang['month'][11] = "Novembris";
+$lang['month'][12] = "Decembris";
+$lang['month'][1] = "Janvāris";
+$lang['month'][2] = "Februāris";
+$lang['month'][3] = "Marts";
+$lang['month'][4] = "Aprīlis";
+$lang['month'][5] = "Maijs";
+$lang['month'][6] = "Jūnijs";
+$lang['month'][7] = "Jūlijs";
+$lang['month'][8] = "Augusts";
+$lang['month'][9] = "Septembris";
+$lang['Most visited'] = "Visapmeklētākie";
+$lang['display most visited photos'] = 'parādīt visapmeklētākos fotoattēlus';
+$lang['The number of photos per page must be a not null scalar'] = 'Foto skaits lapā nedrīkst būt nulle skalārs lielums';
+$lang['Number of photos per page'] = 'Foto skaits lapā';
+$lang['Unknown identifier'] = "Nezināms identifikators";
+$lang['New password'] = "Jauna parole";
+$lang['Rate this photo'] = 'Vērtēt šo foto';
+$lang['Next'] = "Nākamais";
+$lang['no rate'] = "nav novērtējuma";
+$lang['Photos posted within the last %d day.'] = 'Pēdējās %d dienas laikā atsūtītie foto.';
+$lang['Photos posted within the last %d days.'] = 'Pēdējo %d dienu laikā atsūtītie foto.';
+$lang['password updated'] = "parole izmainīta";
+$lang['Recent period must be a positive integer value'] = "Tekošajam periodam jābūt veselam skaitlim";
+$lang['photo'] = 'foto';
+$lang['Click on the photo to see it in high definition'] = 'Klikšķināt uz foto, lai redzētu to lielā izšķirtspējā';
+$lang['Show file metadata'] = "Parādīt faila metadatus";
+$lang['Powered by'] = "Skripts";
+$lang['Preferences'] = 'Izvēles';
+$lang['Previous'] = "Iepriekšējais";
+$lang['Random photos'] = 'Gadījuma fotoattēli';
+$lang['display a set of random photos'] = 'rādīt gadījuma attēlu kopumu';
+$lang['Recent albums'] = 'Jaunākie albūmi';
+$lang['display recently updated albums'] = 'parādīt jaunākos atjauninātos albūmus';
+$lang['Recent period'] = "Jauninājumu periods";
+$lang['Recent photos'] = 'Jaunākie foto';
+$lang['display most recent photos'] = 'rādīt visjaunākos fotoattēlus';
+$lang['Redirection...'] = "Pāradresē...";
+$lang['Please, enter a login'] = "Lūdzu ielogojietis";
+$lang['login mustn\'t end with a space character'] = "logins nedrīkst beigties ar tukšumu - spacebar";
+$lang['login mustn\'t start with a space character'] = "logins nedrīkst sākties ar tukšumu - spacebar";
+$lang['this login is already used'] = "šo loginu jau lieto";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "e-pasta adresei jāizskatās xxx@yyy.eee (piemēram : jack@altern.org)";
+$lang['please enter your password again'] = "lūdzu ievadiet savu paroli vēlreiz";
+$lang['Auto login'] = "Auto logins";
+$lang['remove this tag from the list'] = "izņemt šo tagu no saraksta";
+$lang['representative'] = "pārstāvis";
+$lang['Search for Author'] = "Meklēšana pēc autora";
+$lang['Search in albums'] = 'Meklēt albūmos';
+$lang['Search by date'] = "Meklēšana pēc datuma";
+$lang['Date'] = "Datums";
+$lang['End-Date'] = "Beigu datums";
+$lang['Kind of date'] = "Datuma tips";
+$lang['Search for words'] = "Meklēt pēc vārdiem";
+$lang['Search for all terms'] = "Meklēt pēc visiem kritērijiem";
+$lang['Search for any term'] = "Meklēt pēc jebkura kritērija";
+$lang['Empty query. No criteria has been entered.'] = "Tukšs saraksts. Nav ievadīts neviens kritērijs.";
+$lang['Search results'] = "Meklēšanas rezultāti";
+$lang['Search in sub-albums'] = 'Meklēt apakšalbūmos';
+$lang['searched words : %s'] = "meklējamie vārdi : %s";
+$lang['Contact'] = "Kontakts";
+$lang['set as album representative'] = 'iestatīt kā albūma pārstāvi';
+$lang['Show number of comments'] = "Parādīt komentāru skaitu";
+$lang['Show number of hits'] = "Parādīt apskates skaitu";
+$lang['slideshow'] = "slaidšovs";
+$lang['stop the slideshow'] = "pārtraukt slaidšovu";
+$lang['Specials'] = "Speciālie";
+$lang['SQL queries in'] = "SQL pieprasījums";
+$lang['display only recently posted photos'] = 'rādīt tikai tagad ievietotos fotoattēlus';
+$lang['return to the display of all photos'] = 'atgriezties pie visu foto rādīšanas režīma';
+$lang['the beginning'] = "sākums";
+$lang['Interface theme'] = "Interfeisa tēmas";
+$lang['Thumbnails'] = "Sīkbildes";
+$lang['Menu'] = "Izvēlne";
+$lang['A comment on your site'] = "Komentārijs no jūsu vietnes";
+$lang['today'] = "špdien";
+$lang['Update your rating'] = "Atjaunojiet savu vērtējumu";
+$lang['the username must be given'] = "nepieciešams lietotāja vārds";
+$lang['useful when password forgotten'] = "derīgi, ja aizmirsta parole";
+$lang['Quick search'] = "Ātrā meklēšana";
+$lang['Connected user: %s'] = "Pievienotais lietotājs: %s";
+$lang['IP: %s'] = "IP: %s";
+$lang['Browser: %s'] = "Pārlūks: %s";
+$lang['Author: %s'] = "Autors: %s";
+$lang['Comment: %s'] = "Komentārs: %s";
+$lang['Comment by %s'] = "Komentējis %s";
+$lang['User: %s'] = "Lietotājs: %s";
+$lang['Email: %s'] = "E-pasts: %s";
+$lang['Admin: %s'] = "Admins: %s";
+$lang['Registration of %s'] = "Reģistrācija %s";
+$lang['Album: %s'] = 'Albūms: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Lietotāja \"viesis\" nepareizs satuss, lietojiet statusu pēc noklusējuma. Lūdzu informējiet webmasteru.";
+$lang['this email address is already in use'] = "cits lietotājs jau lieto šo pasta adresi";
+$lang['Album results for'] = 'Albūma rezultāti priekš';
+$lang['Tag results for'] = "Tagu rezultāti priekš";
+$lang['from %s to %s'] = "no %s līdz %s";
+$lang['Play of slideshow'] = "Attēlot slaidšovu";
+$lang['Pause of slideshow'] = "Pauzēt slaidšovu";
+$lang['Repeat the slideshow'] = "Atkārtot slaidšovu";
+$lang['Not repeat the slideshow'] = "Neatkārtot slaidšovu";
+$lang['Reduce diaporama speed'] = "Samazināt slaidšova ātrumu";
+$lang['Accelerate diaporama speed'] = "Palielināt slaidšova ātrumu";
+$lang['Submit'] = "Sūtīt";
+$lang['Yes'] = "Jā";
+$lang['No'] = "Nē";
+$lang['%d photo'] = '%d foto';
+$lang['%d photos'] = '%d foto';
+$lang['%d photo is also linked to current tags'] = '%d fotogrāfija ir sasaistīts arī ar tekošo cilmi (iezīmi)';
+$lang['%d photos are also linked to current tags'] = '%d fotogrāfijas ir sasaistītas arī ar tekošām cilmēm';
+$lang['display photos linked to this tag'] = 'rādīt fotogrāfijas, kas saistītas ar šo cilmi';
+$lang['photos posted during the last %d days'] = 'pēdējo %d dienu laikā ievietotie foto';
+$lang['Piwigo Help'] = "Piwigo palīgs";
+$lang['Rank'] = "Rinda";
+$lang['group by letters'] = "grupēt pēc burtiem";
+$lang['letters'] = "burti";
+$lang['show tag cloud'] = "parādīt tagu mākoni";
+$lang['cloud'] = "mākonis";
+$lang['Reset to default values'] = "Iestatīt noklusējuma vērtības";
+$lang['delete all photos from your favorites'] = 'dzēst visus fotoattēlus no favorītiem';
+$lang['Sent by'] = "Aizūtījis";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Jūsu pārlūks ir bloķējis sīklietotnes - cookies. Lai varētu ielogoties ir jāaktevizē sīklietotnes.";
+$lang['Edit a comment'] = "Labot komentāru";
+$lang['Are you sure?'] = "Esat pārliecināts?";
+$lang['(!) This comment requires validation'] = '(!) Šis komentārs prasa apstiprinājumu';
+$lang['Welcome'] = 'Laipni lūdzam';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Lapni lūgti Jūsu Piwigo foto galerijā!';
+$lang['... or browse your empty gallery'] = '... vai pārlūkot jūsu tukšo galeriju';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... vai nerādied lūdzu šo ziņojumu, Es pats tikšu galā ar to';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Sveiki %s, Jūsu Piwigo foto galerija ir tukša!';
+$lang['I want to add photos'] = 'Es gribu pievienot attēlus';
+$lang['Manage this user comment: %s'] = 'Pārvaldīt šo lietotāja komentāriju: %s';
+$lang['Email address is missing. Please specify an email address.'] = "Trūkst e-pasta adreses. Lūdzu norādiet e-pasta adresi.";
+$lang['This author modified following comment:'] = 'Šis autors modificējis sekojošu komentāru:';
+$lang['This author removed the comment with id %d'] = 'Šis autors izdz;esis komentāru ar id %d';
+$lang['html tags are not allowed in login'] = 'html cilnes (tagi) loginā nav atļautas';
+$lang['%d rates'] = '%d vērtējums';
+$lang['Rating score'] = 'Rezultējošais vērtējums';
+$lang['Invalid username or email'] = 'Kļūdains lietotājvārds vai e-pasta adrese';
+$lang['Password reset is not allowed for this user'] = 'Paroles atgūšana šim lietotājam nav atļauta';
+$lang['User "%s" has no email address, password reset is not possible'] = '"%s" Lietotājiem nav e-pasta adreses, paroles atgūšana nav iespējama';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Kāds pieprasījis atgūt paroli sekojošam lietotāja kontam:';
+$lang['Username "%s" on gallery %s'] = 'Lietotājvārds "%s" galerijā %s';
+$lang['To reset your password, visit the following address:'] = ' Lai atgūtu savu paroli, apmeklējiet sekojošu adresi:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ja tā ir bijusi kļūda, ignorējiet šo e-pastu un nekas nenotiks.';
+$lang['Password Reset'] = 'Paroles Atgūšana (reset)';
+$lang['Check your email for the confirmation link'] = 'Meklējiet savā e-pastā apstiprināšanas saiti';
+$lang['Invalid key'] = 'Kļūdaina atslēga (key)';
+$lang['The passwords do not match'] = 'Paroles nesakrīt';
+$lang['Your password has been reset'] = 'Jūsu parole ir atgūta (atiestatīta)';
+$lang['Return to home page'] = 'Atgriezties mājas lapā';
+$lang['Please enter your username or email address.'] = 'Lūdzu ievadiet lietotājvārdu vai e-pasta adresi.';
+$lang['You will receive a link to create a new password via email.'] = 'Jūs ar e-pastu saņemsiet saiti, lai izveidotu jaunu paroli.';
+$lang['Username or email'] = 'Lietotājvārds vai e-pasta adrese';
+$lang['Change my password'] = 'Nomainīt manu paroli';
+$lang['Enter your new password below.'] = 'Ievadiet savu jauno paroli zemāk.';
+$lang['EXIF Metadata'] = 'EXIF Metadati';
+$lang['IPTC Metadata'] = 'IPTC Metadati';
+$lang['Edit'] = 'Rediģēt';
+$lang['Hello %s,'] = 'Sveiki %s,';
+$lang['Send my connection settings by email'] = 'Nosūtīt manus konekcijas datus ar e-pastu';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Veiksmīgi piereģistrēts, drīz ar e-pastu saņemsiet savus konekcijas iestatījumus. Esat laipni gaidīti!';
+$lang['Username modification'] = 'Lietotājvārda modofikācija';
+$lang['Your username has been successfully changed to : %s'] = 'Jūsu lietotājvārds tika sekmīgi izmainīts uz: %s';
+$lang['square'] = 'Kvadrāts';
+$lang['thumb'] = 'Sīks';
+$lang['small'] = 'Mazs';
+$lang['medium'] = 'Vidējs';
+$lang['large'] = 'Liels';
+$lang['xlarge'] = 'XLiels';
+$lang['xxlarge'] = 'XXLiels';
+$lang['Original'] = 'Oriģināls';
+$lang['Thank you for registering at %s!'] = 'Paldies par reģistrēšanos %s!';
+$lang['Here are your connection settings'] = 'Šeit ir Jūsu konekcijas iestatījumi';
+$lang['Password: %s'] = 'Parole: %s';
+$lang['Username: %s'] = 'Lietotājvārds: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ja uzskatāt, ka saņēmāt kļūdainu e-pastu, lūdzu sazinieties ar mums %s';
+$lang['Photo sizes'] = 'Foto izmēri';
+$lang['Show oldest comments first'] = 'Vecāku saturu rādīt vispirms';
+$lang['Show latest comments first'] = 'Jaunākos komentārus rādīt vispirms';
+$lang['View in'] = 'Skatīties kā';
+$lang['Mobile'] = 'Mobilo';
+$lang['Desktop'] = 'Desktopu';
+$lang['2small'] = 'XXS - sīks';
+$lang['xsmall'] = 'XS - ļoti mazs';
+$lang['File name, A &rarr; Z'] = 'Faila nosaukums, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Faila nosaukums, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Foto nosaukums, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Foto nosaukums, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Izveides datums jaunais &rarr; vecais';
+$lang['Date created, old &rarr; new'] = 'Izveides datums, vecais &rarr; jaunais';
+$lang['Date posted, new &rarr; old'] = 'Publicēšanas datums, jaunais &rarr; vecais';
+$lang['Date posted, old &rarr; new'] = 'Publicēšanas datums, vecais &rarr; jaunais';
+$lang['Rating score, high &rarr; low'] = 'Novērtējums, augsts &rarr; zems';
+$lang['Rating score, low &rarr; high'] = 'Novērtējums, zems &rarr; augsts';
+$lang['Visits, high &rarr; low'] = 'Apmeklējums, augsts &rarr; zems';
+$lang['Visits, low &rarr; high'] = 'Apmeklējums, zems &rarr; augsts';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Ciparu identifikators, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Ciparu identifikators, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Lietotāja izvēlētais kārtojums';
+
+?>
Index: tags/2.4.0RC3/language/lv_LV/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,45 @@
+ <h2>Regiģēt albūmu</h2>
+ <h3>Informācija</h3>
+ <ul> <li><strong>nosaukums</strong>: pārsaukt albūmu (virtuāla pārsaukšana fiziska albūma gadījumā).</li>
+   <li><strong>apraksts</strong>: īss skaidrojošs teksts, kas raksturo satura pamatideju,    šis teksts tiek rādīts sīkbilžu lapas apakšpusē.</li>
+ </ul>
+ <h3>Pārvietošana</h3>
+ <p>Ja albūms ir virtuāls, to iespējams pārvietot. Albūma pārvietošana nozīmē tā pamatalbūma (parent album) izmaiņas.</p>
+ <h3>Izvēles iespējas </h3>
+ <ul> <li><strong>Piekļuves veids</strong>: Atļauju pārvaldīšana. Ja padarāt albūmu privātu, visi tam pakļautie  (child) albūmi kļūst privāti. Ja padarāt albūmu publisku, visi tā pamatalbūmi (parent) publiski.</li>
+   <li><strong>Bloķēšana</strong>: Albūms un visi tā apakšalbūmi uz laiku tiek slēgti apkalpošanas pasākumiem.</li>
+   <li><strong>Komentāri</strong>: Autorizē lietotājus šī albūma fotogrāfiju komentēšanai.</li>
+ </ul>
+ <p>Jūs varat pārvaldīt šīs opcijas arī no &quot;Properties&quot; (rekvizīti) pārvaldīšanas loga (logi Komentāri, Slēgt, <span class="pwgScreen">Publisks/Privāts</span>, <span class="pwgScreen">Pārstāvim pieejams no Administrāšana</span><span class="pwgScreen"> &raquo; Albūmi &raquo; Rekvizīti</span>).</p>
+ <h3>Kārtošanas secība </h3>
+ <p>Lietot attēlu kārtošanas secību pēc noklusējuma.</p>
+ <p>Norādiet, vai šī kārtošanas secība attiecināma arī uz apakšalbumiem.</p>
+ <p>Izvēlēties noteiktus kārtošanas kritērijus, kas būtu jāizmanto  šim albūmam.</p>
+ <ul> <li><strong>Izveides datums</strong>: Fotogrāfijas uzņemšanas datums</li>
+   <li><strong>Iesniegšanas datums</strong>: Sinhronizācijas datums</li>
+   <li><strong>Vidējais vērtējums (*)</strong>: Vidējais vērtējums var tikt izmainīts pēc apmeklētāju vērtējuma</li>
+   <li><strong>Visvairāk apmeklētie (*)</strong>: Tekošais vērtējums var izmainīt visvairāk apmeklēto secību</li>
+   <li><strong>Faila nosaukums</strong>: Nosaukums, kas dots informācijas laukā</li>
+   <li><strong>Id</strong>: Iekšējais Id (tekošajām kategorijām ir lielāks id, kā iepriekšējām).</li>
+ </ul>
+ <p><strong>(*)</strong>Brīdinājums: Pārliecinieties par šo kārtošanas secību darbības pareizību pats, jo pretējā gadījumā tas var dot neparedzētus rezultātus.</p>
+ <h3>Pārstāvība</h3>
+ <p>Albūma pārstāvis  ir galvenajā lapā attēlotais sīktēls  (<span class="pwgScreen">category.php</span>), lai pārstāvētu to, kad tajā ir tikai apakšalbūmi un tajā nav neviena attēla  (glauži kā saknes albūma gadījumā).</p>
+ albūma foto :</p>
+ <ul> <li><span class="pwgScreen">Foto lapa</span>: viena no darbības pogām ļauj iestatīt pašreizējo fotoattēlu kā attēlojamā albūma pārstāvi. Šī poga pieejama tikai administratoriem.</li>
+   <li><span class="pwgScreen">Modificēt informāciju par foto pārvaldē</span>. Šajā logā var nonākt no <span    class="pwgScreen">picture.php</span> vai no  Grupas (batch) vadības, kas atrodas <em>unit mode vienības režīmā</em>. Detaļām, skatīt palīdzībā par šī loga izmantošanu.</li>
+   <li><span class="pwgScreen">Administrēšana &raquo; Albūmi &raquo; Rekvizīti,    Pārstāvis</span>. Detaļas skatīt palīdzībā par šī loga izmantošanu.</li>
+   <li><span class="pwgScreen">Rediģēt albūmu</span> (šajā logā).</li>
+ </ul>
+ <p>Pārstāvja izvēle ir atkarīga no <code>allow_random_representative</code> konfigurācijas parametra (skatīt <span class="filename">include/config_default.inc.php</span>).</p>
+ <p>Noklusēšanas režīmā  (<code>allow_random_representative</code> ir iestatīts false), katrs albūms, kurā ir vismaz viens elements, ir pārstāvēts ar fiksētu elemntu. Reiz istatīts (pie albūma izveides), pārstāvi maina tikai tad, ja administrators to pieprasa. Ja pārstāvis ir neatbilstošs situācijai, jūs varat vaicāt pēc jauna  pārstāvja - <strong>Atrast jaunu pārstāvi, izmantojot nejaušu izvēli</strong>.</p> <p>Ja <code>allow_random_representative</code> konfigurācijas parametrs ir iestatīts stāvoklī true, fotogrāfijas saturošai kategorijai var būt nefiksēts pārstāvis. Lietojiet pogu <strong>Dzēst pārstāvi</strong>.</p>
+ <p>Ja albūmā ir tikai apakšalbūmi un nav neviena foto, tomēr, pateicoties Modificēyai informācijai par foto ekrānu, to var pārstāvēt jebkurš elements. Vienīgā izvēlne uz šī ekrāna ir poga <strong>Dzēst pārstāvi</strong>.</p>
+ <h3>Sasaistīt visas albūma fotogrāfijas ar jaunu albūmu</h3> <ul> <li><strong>Virtuālā albūma nosaukums</strong>: Jaunizveidotajā un jaunnosauktajā albūmā visas pašreizējās kategorijas fotogrāfijas būs sasaistītas ar jaunoizveidoto.</li>
+ <li><strong>Pamatalbūms</strong>: Atstājiet tukšu vietu, kur paredzēts izveidot jauno albūmu, lai to izveidotu saknē.</li> </ul>
+ <h3>Sasaistīt visas albūma fotogrāfijas ar eksistējošu albūmu</h3> <ul> <li><strong>Albums</strong>: Izvēlieties mērķalbūmu..</li> </ul>
+ <h3>Nosūtīt informāciju uz e-pastu grupas dalībniekiem</h3> <ul> <li><strong>Grupa</strong>: saņēmēju grupa </li>
+   <li><strong>Pasta saturs</strong>: Viņiem brīvā formā nosūtāmais teksta ziņojums </li> </ul> --------------------- Actual LV Version -------------------
+ <h2>Rediģēt kategoriju</h2> <h3>Informācija</h3> <ul> <li><strong>nosaukums</strong>: pārdēvē kategoriju (virtuāla pārdēvēšana fiziskas kategorijas gadījumā).</li>
+ <li><strong>apraksts</strong>: īss apraksts, kas sniedz galveno informāciju par saturu,     šis teksts izvietots sīkbilžu lapas apakšā.</li> </ul> <h3>Pārvietot</h3> <p>Ja kategorija ir virtuāla to var pārvietot. Pārvietot kategoriju nozīmē izmainīt tās pamatkategoriju.</p> <h3>Izvēles iespējas</h3> <ul> <li><strong>Piekļuves tips</strong>: Piekļuves atļauju pārvaldība. Ja padarāt kategoriju privātu, visas tai radniecīgās apakškategorijas kļūst privātas.Ja padarāt kategoriju publiski pieejamu, tad arī visas tai radniecīgās apakškategorijas kļūst pieejamas.</li> <li><strong>Bloķēšana</strong>: Kategorija un tās apakškategorijas uz profilakses laiku tiks slēgtas piekļuvei.</li> <li><strong>Komentāri</strong>: Ļauj lietotājiem komentēt šīs kategorijas elementus.</li> <li><strong>Atļauja augšupielādēt</strong>: Atļauj lietotājiem augšupielādēt attēlu failus. Šī iespēja dota tikai fiziskām (nevis virtuālām) kategorijām.</li> </ul> <p>Šīs iespējas pieejamas arī no "Properties" (rekvizītu) pārvaldes loga (logi <span class="pwgScreen">Augšuplāde</span>, <span class="pwgScreen">Komentāri</span>, <span class="pwgScreen">Boķēšana</span>, <span class="pwgScreen">Publisks/Privāts</span>, <span class="pwgScreen">Pārstāvis</span> pieejams no <span class="pwgScreen">Administrēšana, Kategorijas, Rekvizīti</span>).</p> <h3>Kārtošanas secība</h3> <p>Lieto attēlu kārtošanas secību pēc noklusējuma.</p> <p>Norāda vai šī lietu kārtošanas secība attiecas arī uz apakškategorijām.</p> <p>Izvēlas atbilstošus kārtošanas kritērijus šai kategorijai.</p> <ul> <li><strong>Izveides datums</strong>: Attēla uzņemšanas datums</li> <li><strong>Iesūtīšanas datums</strong>: Sinhronizācijas datums</li> <li><strong>Vidējai vērtējums (*)</strong>: Apmeklētāja novērtējums var izmainīt vidējo vērtējumu </li> <li><strong>Visvairāk apmeklētais (*)</strong>: Tekošais apmeklējums var izmainīt visvairāk apmeklēto secību</li> <li><strong>Faila nosaukums</strong>: Vārds, kas piešķirts informācijas laukā</li> <li><strong>Id</strong>: Iekšējais Id (tekošajām kategorijām ir augstāks id kā vecākajām</li> </ul> <p><strong>(*)</strong>Brīdinājums: ieteikums izmēģināt šos kārtošanas kritērijus, jo tie var dod arī neparedzamus rezultātus.</p> <h3>Pārstāvība</h3> <p>Kategoriju pārstāv sīkbilde galvenajā lapā (<span class="pwgScreen">category.php</span>) lai pārstāvētu kategoriju, kad tajā ir tikai apakškategorijas un neviena tieša elementa (tāpat kā pamatkategorija).</p> <p>Ir 4 dažādi veidi kā noformēt kategoriju pārstāvošo attēlu :</p> <ul> <li><span class="pwgScreen">Attēla lapa</span>: viena no pogām ļauj Jums iestatīt patlabanējo attēlu kā šo kategoriju reprezentējošo attēlu. Šī darbība pieejama tikai administratoriem.</li> <li><span class="pwgScreen">Informācijas par attēlu modificēšana</span> administrācijā. Šis logs pieejams no <span class="pwgScreen">picture.php</span> vai <span class="pwgScreen">Grupas vadības</span> <em> vienības režīmā </em>. Detaļas skatiet šī loga palīgā.</li> <li><span class="pwgScreen">Administrēšana, Kategorijas, Rekvizīti, Pārstāvība</span>. Detaļas skatiet šī loga palīgā.</li> <li><span class="pwgScreen">Kategorijas rediģēšana</span> (esošais logs).</li> </ul> <p>Pārstāvniecības izvēle atkarīga no <code>allow_random_representative</code> konfigurācijas parametriem failā (see <span class="filename">include/config_default.inc.php</span>).</p>
+ <p>Noklusēšanas režīmā (<code>allow_random_representative</code> set to false), katra kategorija, kas satur vismaz vienu elementu, ir pārstāvēta ar fiksētu elementu. Kad pārstāvība noteikta (pie kategorijas izveides), to var nomainīt tikai administrators. Gadījuma, ja pārstāvība nav atbilstoša, Jūs varat mēģināt <strong>Atrast jaunu pārstāvi, izmantojot nejaušu izvēli</strong>.</p> <p>Ja <code>allow_random_representative</code> konfigurācijas parametrs ir patiesā (true) stāvoklī, elementus saturošajai kategorijai var nebūt fiksētas pārstāvības. Vienkārši lietojiet <strong>Dzēst pārstāvi</strong> pogu.</p> <p>Ja kategorijā ir tikai apakškategorijas un neviena elementa, to tik un tā var pārstāvēt jebkurš elements ņemts no <span class="pwgScreen">Informācijas par attēlu modificēšanas</span> loga. Vienīgā aktīvā iespēja esošajā logā ir <strong>Dzēst pārstāvi</strong> poga.</p> <h3>Sasaistīt visus kategorijas elementus ar jaunu kategoriju</h3> <ul> <li><strong>Virtuālās kategorijas nosaukums</strong>: Jaunizveidojamās kategorijas nosaukumā, visi esošās kategorijas attēli tiks sasaistīti ar jaunizveidoto kategoriju.</li> <li><strong>Pamatkategorija</strong>: Vieta, kur tiks veidota jauna kategorija, atstājiet tukšu, lai izveidotu to saknes mapē.</li> </ul> <h3>Sasaistīt visu kategoriju elementus ar esošajām kategorijām</h3> <ul> <li><strong>Kategorijas</strong>: Izvēlieties mērķa kategoriju.</li> </ul> <h3>Informācijas nosūtīšana ar e-pastu grupas biedriem</h3> <ul> <li><strong>Grupa</strong>: saņēmēju grupa</li>
+   <li><strong>Pasta saturs</strong>: Viņiem brīvā formā nosūtāmais teksta ziņojums </li> </ul>
Index: tags/2.4.0RC3/language/lv_LV/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Virtuālo albūmu pārvietošana</h2>
+
+<p>Tikai virtuālajiem albūmiem var būt jauns (parent) pamatalbūms.</p>
+
+<h3>Pārvietošanai paredzētie albūmi</h3>
+
+<p>Atlasiet vienu vai vairākus virtuālos albūmus, ko vēlaties pārvietot.
+Ja saraksts ir tukšs, tas nozīmē, ka vēl nevienu neesat izveidojis.</p>
+
+<h3>Jauns pamatalbūms</h3>
+
+<p>Atlasīt jaunu pamatalbūmu (virtuālu vai fizisku).
+Ja neesat atlasījis nevienu pamatalbūmu, virtuāli atlasītie albūmi tiks pārvietoti uz saknes mapi.
+Albūmu nevar pārvietot sevī paša vai kādā no tā atvasinājumiem (child).</p>
Index: tags/2.4.0RC3/language/lv_LV/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/cat_options.html	(revision 14585)
@@ -0,0 +1,16 @@
+<h2>Albūma iespējas </h2>
+<p>Vairāku albūmu iespēju pārvaldīšana vienlaicīgi.</p>
+<dl>
+	<dt>Komentāri</dt>
+	<dd>Foto var saņemt komentārus no  jūsu apmeklētājiem, ja tas ir no albūma, kura komentāru režīms ir aktivēts.</dd>
+
+	<dt>Bloķēt</dt>
+	<dd>Bloķētie albūmi ir noņemti no apkalpošanas. Tikai administratoram ir iespēja  tos aplūkot galerijā.</dd>
+
+	<dt>Publisks / privāts</dt>
+	<dd>Kad albūms kļūst privāts, dod piekļuves tiesības lietotājiem un grupām</dd>
+  
+	<dt>Pārstāvis</dt>
+	<dd>Šī iespēja kļūst pieejama, kad konfigurācijas iestatījumos iestatījuma vērtība <code>allow_random_representative</code> (skat. <span   class="filename">include/config_defaults.inc.php</span>) ir patiesa ( <em>true)</em>. Katru albūmu var pārstāvēt  gadījuma fotoattēls vai fotoattēls, kas izvēlēts kā unikāls pārstāvis.</dd>
+	
+</dl>
Index: tags/2.4.0RC3/language/lv_LV/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Rediģēt albūmu piekļuves atļaujas</h2>
+
+<p>Šis logs pieejams tikai privātajiem albūmiem. Šeit varat izvēlēties albūmam autorizētus lietotājus un grupas.</p>
+
+<h3>Grupas</h3>
+
+<p>Jūs varat liegt vai atļaut grupas piekļuvi tekošajam albūmam. Modificējot grupu piekļuves tiesības, lietotājiem piekrītošiem šai grupai, tiks liegta vai atļauta piekļuve albūmam. </p>
+
+<h3>Lietotāji</h3>
+
+<p>Jūs varat liegt vai atļaut  piekļuves tiesības atsevišķiem lietotājiem. Lietotājiem, kam ir grupas piekļuves tiesības, tās var atņemt izņēmuma kārtā.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/configuration.html	(revision 14585)
@@ -0,0 +1,108 @@
+<h2>Konfigurācija</h2>
+
+<p>Šajā logā administrators var veikt sistēmas pamatkonfigurāciju. Patiešām, šis logs dod piekļuvi tikai vienkāršākajiem konfigurācijas parametriem, kas ir gluži pietiekami lielākajam administratoru skaitam. Ja vēlaties vairāk (modernizētus) konfigurācijas parametrus, lasiet failu <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Šis logs ir sadalīts vairākās sekcijās, sagrupējot konfigurācijas parametrus pēc tēmām.</p>
+
+
+<h3>Galvenais</h3>
+<ul>
+<li><strong>Galerijas virsraksts</strong>: izmantots RSS padevē un e-pasta paziņojumos.</li>
+
+<li><strong>Lapas baneris</strong>: tiek atainots katras publiskās lapas augšā.</li>
+
+<li><strong>Galerijas URL</strong>: izmantots RSS padevē.</li>
+
+<li><strong>Bloķēt galeriju</strong>: Bloķē visu galeriju uz apkopes laiku. Tikai lietotāji ar administratora tiesībām var piekļūt galerijai.</li>
+
+<li><strong>Novērtējums</strong>: Attēla novērtēšanas funkcija ir iespējota.</li>
+
+<li><strong>Viesu veiktais novērtējums</strong>: Pat nepiereģistrēti lietotāji var vērtēt attēlus.</li>
+
+<li><strong>Atļauj lietotāja reģistrāciju</strong>: Ikviens var reģistrēties.</li>
+
+<li><strong>Visiem lietotājiem nepieciešama pasta adrese</strong>: pasta adrese tiks pārbaudīta reģistrējoties vai pie profila atjaunināšanas, izņemot, ja attiecīgās darbības veic administrators.</li>
+
+<li><strong>Izsūta e-pastu administratoram, kad reģistrējas jauns lietotājs</strong>:
+par katru jauna lietotāja reģistrēšanos ar e-pastu tiks paziņots administratoram.</li>
+
+</ul>
+
+<h3>Vēsture</h3>
+
+<p>Lapas apmeklējumu skaits <span
+   class="pwgScreen">category.php</span> un <span
+   class="pwgScreen">picture.php</span> tiks saglabāts <code>history</code> tabulā.</p>
+
+<p>Apmeklējumi tiks parādīti <span class="pwgScreen">Administrēšanā, Speciālos, Vēsturē</span>.</p>
+
+<ul>
+<li><strong>Saglabāt viesu lapu apmeklējumus</strong>: viesu veiktais lapu apmeklējumu skaits tiks ierakstīts.</li>
+
+<li><strong>Saglabāt lietotāju veiktos lapu apmeklējumus</strong>: reģistrēto lietotāju veiktais lapu apmeklējumu skaits tiks ierakstīts.</li>
+
+<li><strong>Saglabāt administratoru lapu apmeklējumus</strong>: administratoru veiktais lapu apmeklējumu skaits tiks ierakstīts.</li>
+
+</ul>
+
+<h3>Komentāri</h3>
+<ul>
+
+<li><strong>Komentāri visiem</strong>: Pat nereģistrēts viesis var komentēt.</li>
+
+<li><strong>Komentāru skaits lapā</strong>.</li>
+
+<li><strong>Apstiprināšana</strong>: administratoram jāapstiprina lietotāju komentāri pirms tie kļūst redzami web lapā. Lietotāju komentāru apstiprināšana notiek logā <span class="pwgScreen">Administrēšana, Attēli, Komentāri</span>.</li>
+
+<li><strong> Izsūta e-pastu administratoram, kad ievadīts derīgs komentārs</strong>:
+Izsūta e-pastu administratoram, kad lietotājs ievada komentāru un tas tiek pārbaudīts.</li>
+
+<li><strong> Izsūta e-pastu administratoram, kad komentāram nepieciešama apstiprināšana</strong>:
+Izsūta e-pastu administratoram , kad administratoram jāpārbauda un jāakceptē lietotāja ievadītais komentārs.
+Lietotāju komentāru apstiprināšana notiek logā <span
+class="pwgScreen">Administrēšana, Attēli, Komentāri</span>.</li>
+
+</ul>
+
+<h3>Augšupielāde</h3>
+<ul>
+ <li><strong>Rāda augšupielādes saiti katru reizi</strong>: ja eksistē augšuplādējamas kategorijas, augšupielādes saite tiek rādīta katrai kategorijai.</li>
+ <li><strong>Lietotāja piekļuves līmenis augšupielādei</strong>:
+Aizliedz augšupielādi dažām lietotāju kategorijām.</li>
+<li><strong> Izsūta e-pastu administratoram, kad tiek augšuplādēts attēls </strong>:
+Administratoram ar e-pastu paziņo katru reizi, kad lietotājs augšupielādē attēlu.</li>
+</ul>
+
+<h3>Attēlošana pēc noklusējuma</h3>
+
+<p>Šeit Jūs varat mainīt attēlošanas iespējas, ko lieto viesis, lietotājs pēc noklusēšanas, kas nav iekonektējies. Kad iekonektējas, tiek lietoti lietotāja paša istatījumi (modificējami <span class="pwgScreen">profilā</span>).</p>
+
+<p>Iespējams izmainīt atainošanas iespējas visiem eksistējošiem lietotājiem, jāieiet <span class="pwgScreen">Administrēšana, Identifikācija, Lietotāji</span> logā, kur var izvēlēties lietotāju sarakstu.</p>
+
+<ul>
+
+<li><strong>Valoda</strong>: pielietojams tikai Piwigo etiķetēm. Kategoriju un attēlu nosaukumi, kā arī visi aprakstošie komentāru lauki nav lokalizējami (tulkojami).</li>
+
+<li><strong>Attēlu skaits rindā</strong></li>
+
+<li><strong>Rindu skaits lapā</strong></li>
+
+<li><strong>Interfeisa tēma</strong></li>
+
+<li><strong>Tekošais periods</strong>: Dienās. Laika sprīdis, kurā attēls tiek rādīts kā jauns. Jābūt lielākam par 1 dienu.</li>
+
+<li><strong>Izvērst visas kategorijas</strong>: Pēc noklusējuma izvērst visas kategorijas izvēlnē <em>Brīdinājums</em>: šī darbība ir resursietilpīga un, ja Jūsu kategoriju koks satur daudz kategoriju, var tikt ģenerēts liels skaits izvēlņu.</li>
+
+<li><strong>Rāda komentāru skaitu</strong>: Sīkbilžu lapā rāda komentāru skaitu katram attēlam. Resursu patērējošs.</li>
+
+<li><strong>Rāda apmeklējumu skaitu</strong>: sīkbilžu lapā zem attiecīgās sīkbildes rāda cik reižu katrs attēls apskatīts.
+   Tikai tad, kad papildus konfigurācijas parametrs ir: <br>
+   $conf['show_nb_hits'] = true; <br>
+Zināšanai: false ir pēc noklusējuma.</li>
+
+<li><strong>Attēlu maksimālais platums</strong>: maksimālais attēlojamais platums. Attēli, kas pārsniedz šo lielumu, tiks pārveidoti, lai tos var parādīt. Labāk apsverat iespēju modificēt attēla platumu pašiem, nekā izmantot šo noklusējuma variantu.</li>
+
+<li><strong>Attēlu maksimālais augstums</strong>: attiecināms tas pats, kas pieminēts attēlu maksimālajā platumā.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/lv_LV/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,85 @@
+<h2>Plašāk par veidņu konfigurēšanu</h2>
+
+<h3>Mērķis</h3>
+<p>Definē aizvietošanas apstākļus katrai veidnei, ņemot vērā veidnes paplašinājumu (veidne saukta "replacer" - aizvietotājs).</p>
+
+<p>"original template" no ./template/yoga (vai jebkura cita, kā yoga)
+ tiks aizvietota ar "replacer", ja šī aizvietotājveidne ir sasaistīta ar "original template" (un izvēles kārtā, kad pieprasītais URL satur "optional URL keyword").</p>
+
+<p>"Optional URL keywords" (papildus URL atslēgvārdi) ir tie, pēc kuriem var atrast moduļa nosaukumu iekš URL.</p>
+
+<p>TādēlTherefore "Optional URL keywords" var darboties kā aktīvas pastāvīgās saites "permalink" (skatīt informāciju par pastāvīgajām saitēm permalinkiem mūsu dokumentācijā).</p>
+
+<p>Nolasīt: `<a href="#warnings">Warning</a>` lietošanas apstākļus.</p>
+
+<h3>Kādi ir veidņu paplašinājumi?</h3>
+
+<p>Šis konfigurēšanas rīks ir pietiekami jaudīgs priekš iesācējiem un arī priekš zinošiem lietotājiem.
+Izmantojot FTP, veidņu-paplašinājumu mapē, Webmāsters var nodublēt lielu daudzumu izplatīto .tpl failu ("original template") ar dažādiem nosaukumiem ("replacer").
+ 
+ "Original templates", patrreizējās oriģinālās atbalstītās veidnes ir:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> un/vai <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> un/vai <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> un/vai <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> un/vai <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> un/vai <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> un/vai <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> un/vai <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Kur var atrast veidņu pirmavotus "original templates"?</h3>
+
+<p>Izdalēmās oriģinālās veidnes ir atrodamas template/yoga/
+(nerediģējiet tās šai vietnē). Tādējādi lietojot "original templates", jebkurš webmāsters var izveidot savas "replacers (customized templates)" veidnes.</p>
+
+<h3>Kur var ieglabāt aizvietotājveidnes "replacers"?</h3>
+
+<p><strong>aizvietotājveidnes Replacers (pielāgotās veidnes)</strong> jāizvieto veidņu-paplašinājumu (template-extension) mapē (vai tās apakšmapēs).
+Aizvietotājveidnes nosaukums var būt jebkāds bet ar .tpl paplašinājumu. Piemēram: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Kā aktivizēt savas aizvietotājveidnes "replacers"?</h3>
+<p>Lai aktivizētu radniecīgās<strong>aizvietotājveidnes (pielāgotās veidnes)</strong> tām katrai jābūt piesaistītai <strong>oriģinājajai veidnei</strong>.
+ Šis ir "Extend for templates" uzdevums Konfigurēšanas Administrēšanas izvēlnē.</p>
+
+<p>Ja esta izvēlējies <strong>papildus URL atslēgvārdu</strong>, tad aizvietošanas notiks tikai lapās, kas sakritīs ar šo atslēgvārdu. Piemēram: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+ 
+<p>Pieredzējuši lietotāji kā <strong>papildus URL atslēgvārdu</strong> var lietot permalinkus – pastāvīgās saites. </p>
+
+<p>Ja esat izvēlējies <strong>Saistīto veidni</strong> tad aizvietošanas notiks tikai šajā veidnē.</p>
+
+<h3>Kā var deaktivizēt savas aizvietotājveidnes "replacers"?</h3>
+<ul>
+<li>Atselektējiet radniecīgās "Original templates".</li>
+<li>Izmantojot FTP, izdzēšat aizstājējvaidnes "replacers".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Brīdinājumi</h3>
+<ul>
+
+  <li><strong>Oriģinālajām veidnēm</strong> ir jābūt "original" veidnēm, pretējā gadījumā sagaidāmi neparedzami rezultāti!</li>
+
+  <li>No dažām<strong>aizstājējveidnēm (pielāgotām veidnēm)</strong> ar to pašu<strong>Oriģinālo veidni</strong> un to pašu <strong>papildus URL atslēgvārdu</strong> aktīva ir tikai pēdējā aizstājējveidne.</li>
+
+  <li>Atselektētais <strong>papildus URL atslēgvārds</strong> aktivizēs aizstājējveidni jebkurā veidnes lietošanas gadījumā. Kā iepriekšējā punktā, jaunākā aizstājējveidne izpildās pirmā, ignorējot pārējās rindā esošās.</li>
+
+  <li>Apakšmapes:
+Apakšmapes tiek ignorētas, bet tās ir lietderīgas veicot izmaiņas patrreizējā rindā.<br>
+izplatāmās-veidnes: tiek izplatītas testēšanas nolūkos!
+<strong>Nerediģējiet tās</strong> izveidojiet paši savas.
+</li>
+
+  <li>Izdzēšot aizstājējveidni <strong>Oriģinālā veidne </strong>nekavējoties tiek no jauna aktivizēta.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/lv_LV/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Grupu saraksts</h2>
+
+<p>Šeit Jūs varat pārvaldīt grupas.</p>
+
+<h3>Pievienot grupu</h3>
+
+<p>Administrators var pievienot grupas.</p>
+
+<h3>Grupu saraksts</h3>
+
+<p>Katram elementam saraksts atļauj:</p>
+
+
+<ul>
+<li>pārvietories uz biedru sarakstu</li>
+<li>pārvietoties uz atļauju pārvaldīšanas logu</li>
+<li>dzēst grupu (nepieciešams apstiprinājums)</li>
+<li>pārslēgt statusu "default" (nepieciešams apstiprinājums)</li>
+</ul>
+
+<h3>Grupas pēc noklusējuma</h3>
+<p>Grupas pēc noklusējuma ir tās, kuras administrators automātiski sasaistīta ar katru jaunu lietotāju tā reģistrācijas vai izveides gaitā.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>Vairaki veidi ka pievienot attelus Jusu galerijai:</p>
+
+<ul>
+<li><strong>Tieša augšupielade</strong> izmantojot web parluku ir vienkaršakais un atrakais veids. To nosaka Jusu parluka iespejas un Jusu web serveris. Ja nepieciešams augšupieladet loti daudz attelu un ja, rodas problemas, ir citi veidi ka to izdarit!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Izmantot Tiešo Augšupieladi</a></p>
+
+<ul>
+<li><strong>pLoader</strong> ir aplikacija, kas jaieinstale Jusu datora. Ievelciet &amp; nolieciet attelus pLoader loga, uzklikškiniet uz <em>"Augšupieladet Piwigo"</em> un laujiet  pLoaderim padarit darbu. Ir pieejamas ari citas aplikacijas, piemeram, <strong>WinToPiwigo</strong> vai <strong>Digikam</strong> spraudni attelu ieladešanai Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a
+href="admin.php?page=photos_add&section=ploader">Izmantot pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+<li><strong>Ielade ar FTP </strong> ir ieteicamakais variants lielu attelu kolekciju augšupieladei ar minimalu darbibu skaitu. Sekojiet celvedim, lai sekmigi sagatavotu Jusu attelus. FTP ielades metode lauj pilniba kontrolet Jusu attelu organizaciju uz servera.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Izmantot FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/lv_LV/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/help_groups.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Grupas ir ērts veids kā piešķirt atļaujas lietotāju sarakstam.</p>
+
+<p>Izveidot grupas <span class="pwgScreen">Administrēšanas &raquo; Lietotāja &raquo; Grupas</span> un piesaistīt lietotājus šai grupai  <span class="pwgScreen">Administrēšanas &raquo; Lietotāja &raquo; Pārvaldīt</span>.</p>
+
+<p>Lietotājs var vienlaicīgi piederēt vairākām grupām. Autorizācijai ir priekšroka pār aizliegumu: ja lietotājs "jack" pieder grupām "family" un "friends", un tikai grupa  "family" var redzēt kategoriju "Christmas 2003" kategoriju, tad arī grupa "jack" redzēs "Christmas 2003".</p>
Index: tags/2.4.0RC3/language/lv_LV/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Tiklīdz esat izveidojis savu galeriju, varat to konfigurēt priekš apmeklētājiem
+<ul>
+<li>Atainojums pēc noklusējuma kā gribējāt iekš<span class="pwgScreen">Administrēšana &raquo; Konfigurācija &raquo; Iespējas</span> iezīme <span class="pwgScreen">Viesa Iestatījumi</span></li>
+<li>Tēma pēc noklusējuma iekš<span class="pwgScreen">Administrēšana &raquo; Konfigurācija &raquo; Tēmas</span></li>
+<li>Valoda pēc noklusējuma iekš <span class="pwgScreen"> Administrēšana &raquo; Konfigurācija &raquo; Valodas</span></li>
+</ul>
+  Pēc noklusējuma, katrs jaunais lietotājs manto šīs īpašības, tiklīdz reģistrējies.
+</p>
+<p>Ja rodas jautājumi, Piwigo komūna laipni aicina Jūs <a href="http://piwigo.org/forum">savā forumā</a>.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,56 @@
+<fieldset>
+<legend>Atļaujas attēliem</legend>
+
+<p>Katram attēlam ir <strong>konfidencialitātes līmenis</strong> (atslēga). Katram lietotājam arī ir konfidencialitātes līmenis (slēdzene). Ir 5 konfidencialitātes līmeņi:</p>
+<ol>
+<li>Neviens</li>
+<li><em>Kontakti</em></li>
+<li><em>Draugi (augstāks par kontaktiem)</em></li>
+<li><em>Ģimene (augstāks par draugiem)</em></li>
+<li><em>Administrators (augstāks par visiem līmeņiem)</em></li>
+</ol>
+
+<p>Augstākam līmenim ir atļauja lietot zemākos līmeņus. Jo lietotāja konfidencialitātes līmenis ir augstāks, jo vairāk attēlus tas redz.</p>
+
+<p>Piemēram, ja attēlam "peter_wedding-0024.jpg" ir <em>"Ģimenes"</em>
+konfidencialitātes līmenis, tad:</p>
+<ul>
+<li>Pēteris (kas ir  <em>"Administrators"</em>) redz attēlu, jo <em>"Adminstrators"</em> var redzēt visus attēlus</li>
+<li>Beta (kas ir <em>"Ģimenes"</em> biedrs) arī redzēs attēlu</li>
+<li>Marija (kas ir tikai <em>"Draugs"</em>) attēlu neredzēs</li>
+</ul>
+
+<p>Lietotājs, kam nav tiesību redzēt kategorijas saturu, neredzēs pat kategorijas nosaukumu. Tas pats attiecas arī uz iezīmēm.</p>
+
+<p>Jūs varat iestādīt lietotāja konfidencialitātes līmeni izmantojot <span class="pwgScreen">Administrācijas &raquo; Lietotāja &raquo; Pārvaldnieka</span>
+ekrānu.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Atļaujas kategorijām</legend>
+
+<p>Ja konfidencialitātes līmeņi Jūs neapmierina, iespējams izmantot lietotāja vai grupas atļaujas uz kategorijām. Jūs varat izmantot atļaujas uz attēliem un kategorijām vienlaikus bez konfliktiem.</p>
+
+<p>Jūs varat aizliegt piekļuvi kategorijām. Varat izmainīt piekļuves tipu kategorijai uz "privāto", ja nepieciešams pārvaldīt piekļuves atļaujas.</p>
+
+<p>Jūs varat iestatīt kategoriju uz privāto rediģējot vienu kategoriju izmantojot (<span class="pwgScreen">Administratora &raquo; Kategoriju &raquo; Pārvaldnieku
+&raquo; edit</span>) vai veicot izvēles visā kategoriju kokā izmantojot
+(<span class="pwgScreen">Administrācijas &raquo; Kategoriju &raquo;
+Rekvizītus &raquo; Publisks / Privāts</span>).</p>
+
+<p>Ja kategorija ir privāta, iespējams pārvaldīt grupu un lietotāju atļaujas uzreiz 3 ekrānos:</p>
+
+<ul>
+
+<li><span class="pwgScreen">Administratora &raquo; Lietotāja &raquo; Pārvaldnieka
+&raquo; darbības atļauja </span> ( viena saite uz lietotāju)</li>
+
+<li><span class="pwgScreen">Administratora &raquo; Lietotāja &raquo; Grupu
+&raquo; darbības atļauja </span> (viena saite uz grupu)</li>
+
+<li><span class="pwgScreen">Administratora &raquo; Kategorijas &raquo;
+Pārvaldnieka &raquo; kategoriju piekļuves rediģēšanas atļauja </span> (viena saite uz kategoriju)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/lv_LV/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Attēli tiek rādīti kategorijās atbilstoši to failu mapei.</p>
+
+<p>Iespējams parādīt attēlu vairākās kategorijās nedublējot tā failu uz web servera. Sasaistiet attēlu ar jebkuru kategoriju, izmantojot attēlu rediģēšanas logu (tas pieejams katram administratoram no attēla lapas galerijas pusē).</p>
+
+<p>Virtuālās kategorijas ir balstītas uz sekojoša koncepta: tām nav atbilstošu fizisku mapju. Veidojiet virtuālās kategorijas izmantojot <span class="pwgScreen">Administrēšanas &raquo; Kategoriju &raquo; Pārvaldnieku</span>.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/history.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/history.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>Vēsture</h2>
+
+<p>Šajos logos, saskaņā ar izvēlētajām iespējām panelī Administrēšana – Vispārējais – Vēstures indekss, Jūs varat kontrolēt savas galerijas apmeklējumu vēsturi.</p>
+
+<h3>Statistika</h3>
+<ul>
+<p>Ja esat izvēlējies ierakstīt (<span class="pwgScreen">index.php</span> un <span class="pwgScreen">picture.php</span>) apmeklētās lapas tabulā <code>history</code>, Jūs varat to kontrolēt no šejienes.</p>
+
+<li><strong>Vispārējā statistika</strong>: apmeklējumu skaits gada laikā. </li>
+
+<li><strong>Gada statistika</strong>: apmeklējumu skaits mēnesī izvēlētajā gadā.</li>
+
+<li><strong>Mēneša statistika</strong>: apmeklējumu skaits dienā izvēklētajā mēnesī.</li>
+
+<li><strong>Dienas statistika</strong>: apmeklējumu skaits stundā izvēlētajā dienā.</li>
+
+</ul>
+
+<h3>Meklēšana</h3>
+<ul>
+<p>Ja esat nolēmis ierakstīt (<span class="pwgScreen">index.php</span> un <span class="pwgScreen">picture.php</span>) apmeklētās lapas tabulā <code>history. </code>, tad, izmantojot šo iezīmi ar dažādu filtru palīdzību, varat aplūkot apmeklēto lapu detaļas.</p>
+
+<li><strong>Filrēšana pēc datuma</strong> : izvēlieties datumu intervālu, kurā vēlaties vērot apmeklējumu aktivitāti.</li>
+
+<li><strong>Filtrēšana pēc elementa tipa</strong> : lai aplūkotu noteikta elementa tipa apmeklējumu aktivitāti, izvēlieties tā tipu.</li>
+
+<li><strong>Filtrēšana pēc lietotāja</strong> : izvēlieties lietotāju, kura apmeklējumu aktivitāti vēlaties redzēt.</li>
+
+<li><strong>Filtrēšana pēc faila nosaukuma</strong> : izvēlieties faila nosaukumu, kura apmeklējumu aktivitāti vēlaties redzēt.</li>
+
+<li><strong>Filtrēšana pēc attēla identifikatora</strong> : izvēlieties attēlu pēc tā identifikatora, kura apmeklējumu aktivitāti vēlaties redzēt.</li>
+</ul>
Index: tags/2.4.0RC3/language/lv_LV/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/maintenance.html	(revision 14585)
@@ -0,0 +1,45 @@
+<h2>Apkalpošana</h2>
+
+<p>Lai optimizētu lapas ģenerēšanas laiku, Piwigo izmanto kešatmiņu kā informācijas starpnieku. Piemēram, tā vietā, lai katru reizi ielādējot lapu skaitītu cik attēlu ir attiecīgajā kategorijā, šī informācija tiek glabāta datu bāzē. Teorētiski šai informācijai parasti būtu jābūt korektai, bet dažreiz gadās, ka kešatmiņā esošā informācija ir kļūdaina.</p>
+
+<p>Laikam ejot, daļa informācijas kļūst nevajadzīga. Izdzēšot nevajadzīgo informāciju no datu bāzes, ietaupīsiet savu diska telpu.</p>
+
+<ul>
+
+<li>
+<strong>Nesasaistītie elementi:</strong>
+     Tiek rādīti attēli, kuri nav sasaistīti ne ar vienu virtuālo kategoriju.
+</li>
+<li>
+<strong>Faili ar vienādiem nosaukumiem vairāk kā vienā fiziskā kategorijā:</strong>
+     Parāda attēlus vai failus, kuri atrasti vairākās kategorijās ar vienādiem faila vārdiem.
+</li>
+
+</ul>
+
+<ul>
+
+<li><strong>Atjaunina informāciju par kategoriju:</strong> Katru kategoriju raksturojošo informāciju pārbauda un, ja nepieciešams atjaunina: pamata kategoriju sarakstu, attēlu skaitu, pēdējo attēla datumu, vietu starp radniecīgām kategorijām, atrašanās vietu starp visām kategorijām. Šī darbība pārbauda arī pārstāvēto attēlu pastāvību.</li>
+
+<li><strong>Atjaunina informāciju par attēlu:</strong> Par katru attēlu atjaunināmā informācija ir: pilns ceļš līdz failam, vidējais novērtējums. <em>Brīdinājums</em>, nesajauciet: metadatu informācija ir jāsinhronizē no <span class="pwgScreen">Administrēšanas, Kategorijas, Sinchronizācijas</span>, vai izmantojot katra attēla modifikācijas ekrānu (līdz <span class="pwgScreen">Attēlam</span> piemēram).</li>
+
+<li><strong>Salabo un optimizē datu bāzi:</strong>
+   Veic pārkārtošanas, labošanas un optimizācijas operācijas katrai datu bāzes tabulai.
+</li>
+</ul>
+
+<ul>
+<li><strong>Dzēš vecos datus:</strong> Dzēš visas rindas no
+<code>vēstures</code> tabulas. Logs <span class="pwgScreen">Administratēšana,
+   Speciālais, Vēsture</span> vairāk nerādīs informāciju par pagājušo vēsturi. <em>Brīdinājums</em>: visi dati neatgriezeniski tiks pazaudēti.</li>
+
+<li><strong>Izdēš vēstures kopsavilkumu:</strong> Dzēš informācijas kopsavilkumu par apmeklējumu vēsturi. Šā kopsavilkuma pamatā vēsturiskās detaļas.</li>
+
+<li><strong>Dzēš sesijas:</strong> Dzēš lietotāju izbeigušās sesijas.</li>
+
+<li><strong> Dzēš neizmantotās paziņojumu plūsmas </strong></li>
+
+<li><strong>Dzēš meklēšanas vēsturi</strong></li>
+
+<li><strong>Dzēš izveidotās paraugveidnes</strong></li>
+</ul>
Index: tags/2.4.0RC3/language/lv_LV/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>E-pasta paziņojumi</h2>
+
+<p>Šis logs ļauj konfigurēt un izsūtīt e-pastu lietotājiem, lai paziņotu par viņu web lapās veiktajām izmaiņām.</p>
+
+<p>Šis logs sastāv no trīs raksturiezīmēm:</p>
+
+<h3>Parameteri</h3>
+<p>Pieejams tikai webmāsteriem, ar šīs iezīmes palīdzību iestāda e-pasta paziņojuma parametrus.</p>
+
+<h3>Abonēšana</h3>
+<p> Pieejams tikai webmāsteriem, ar šīs iezīmes palīdzību pārvalda lietotāju reģistrēšanās/izrakstīšanās informācijas nosūtīšanu ar e-pastu.</p>
+
+<h3>Aģents</h3>
+<p> Pieejams tikai webmāsteriem un administratoriem, šī iezīme ļauj izsūtīt e-pasta paziņojumus, lai informētu par veiktajām izmaiņām.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Pastāvīgās saites - permalinki</h2>
+
+<p>Pastāvīgās saites izmanto, lai padarītu kategoriju url glītākus. Kad kategorija definēta ar pstāvīgo saiti, kategorijas id urlā vairs nav nepieciešama.</p>
+
+<p>Kad pastāvīgā saite ir izdzēsta, Jūs to varat saglabāt pastāvīgo saišu vēsturē, tādējādi ārējas saites uz Piwigo lapām darbosies. Pastāvīgo saišu vēstures tabulā iespējams atrast datumu, kad šī saite ir izdzēsta, kad ši saite pēdējo reizi lietota un cik reizes tā ir lietota.</p>
+
+<p>Svarīgi, ka katrai kategorijai ir jābūt unikālai pastāvīgai saitei. Arī pastāvīgo saišu vēsturē nevar būt divu vienādu pastāvīgo saišu.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,98 @@
+<fieldset>
+<legend>Ātrais Starts</legend>
+
+<ol>
+<li>Izveidot mapi Jūsu datorā.</li>
+
+<li>Kopēt dažus attēlus šīs mapes iekšienē, piemērot tos rādīšanai internetā.
+<em>Brīdinājums</em>: mapju un failu nosaukumi jāveido tikai no burtiem, cipariem, "-", "_" vai ".". Nav pieļaujami tukšumi vai apakšsvītras.</li>
+
+<li>Izmantojot FTP klientu, iekopējiet Jūsu mapi Piwigo instalācijas "galleries" mapē.</li>
+
+<li>Ielogojaties Jūsu galerijā un ejiet uz <span class="pwgScreen">Administrēšanu
+&raquo; Attēlu &raquo; Sīkbildēm</span>, lai izveidotu trūkstošās sīkbildes.</li>
+
+<li>Ejiet uz <span class="pwgScreen">Administrēšanu</span> un klikšķiniet uz lielās Sinhronizācijas pogas.</li>
+</ol> Apsveicam! Jūs esat sekmīgi izveidojis Jūsu fotogalerijas pirmo kategoriju.
+</fieldset>
+
+<fieldset>
+<legend>Mapju un failu organizācija</legend>
+
+<ul>
+
+<li>
+
+<p>Kategoriju mapes atrodas Piwigo mapē "galleries". Tālāk seko ļoti mazas (bet ar ļoti daudz iespējām) galerijas mapju koks:</ p>
+
+<pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+</li>
+
+<li>Izņemot ar nosaukumu "thumbnail", "pwg_high" vai "pwg_representative" (skatīt skaidrojumu zemāk), katra mape zem "galleries" veido kategoriju. To dziļumam nav ierobežojumu.</li>
+
+<li>Pamatā elementu pārstāv fails. Fails var būt Piwigo elements, ja tā paplašinājums ir starp <code>file_ext</code> konfigurācijas parametru iespējām (skatīt <span class="filename">include/config_default.inc.php</span> failu). Fails var būt attēls, ja tā paplašinājums ir starp <code>picture_ext</code> konfigurācijas parametru iespējām.</li>
+
+<li>Attēliem jābūt asociētiem ar savām sīkbildēm (skatīt sīkbilžu sekciju zemāk)</li>
+
+<li>Attēli var būt asociēti ar liela izmēra failiem augstai izšķirtsējai. Kā, piemēram, attēlam wedding.jpg augstāk. Bez prefiksa augstas izšķirtsējas attēlam.</li>
+
+<li>Pēc noklusējuma ikonai, kas pārstāv faila nosaukuma paplašinājumu, nav nekādu papildus attēla elementu (video, skaņu, tekstu, jebkas...) . Ar papildus izvēli, Jūs varat sasaistīt sīkbildi un pārstāvošo failu (skatīt video.avi augstāk piemērā).</li>
+
+<li><em>Brīdinājums</em>: mapju un failu nosaukumi jāveido tikai no burtiem, cipariem, "-", "_" vai ".". Nav pieļaujami tukšumi vai apakšsvītras.</li>
+
+<li>Kolīdz faili, sīkbildes un pārstāvības ir korekti saliktas mapēs, ejam uz: <span class="pwgScreen">Administrēšanu &raquo; Kategorijām &raquo; Sinchronizšānu</span></li>
+
+</ul>
+</fieldset>
+
+<fieldset>
+<legend>Sīkbildes</legend>
+<ul>
+
+<li>Katram attēkam ir jābūt savai sīkbildei.</li>
+
+<li>Sīkbildes glabājas "thumbnail" kategorijas mapes apakšmapē. Sīkbildei ir tāds pats faila nosaukums kā tās pārstāvētajam attēlam, ar konfigurācijas parametriem <code>prefix_thumbnail</code> kā prefikss (skatīt <span class="filename">include/config.inc.php</span>).</li>
+
+<li>Sīkbilžu failiem nav jābūt ar tādu pašu paplašinājumu kā to pārstāvētajiem attēliem (piem. ".jpg" attēlam var būt ".GIF" paplašinājums).</li>
+
+<li>Sīkbilžu izveidošanai ieteicams izmantot ārējo moduli.</li>
+
+<li>Nav ieteicams izmantot Piwigo integrēto sīkbilžu veidošanas instrumentu, jo ar to veidoto sīkbilžu kvalitāte ir zema un tas stipri noslogo serveri ( tas rada nopietnas problēmas šārētiem serveriem).
+
+<li>Ja sīkbilžu veidošanai esat nolēmis izmantot webserveri, Jums jāatļauj rakstīšanas tiesības visām mapēm.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/lv_LV/help/search.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Meklēt</h2>
+
+<p>Šeit Jūs varat meklēt attēlus visā galerijā.</p>
+
+<dl>
+
+<dt>Meklēt pēc vārdiem</dt>
+<dd>Meklē pēc viena vai vairākiem vārdiem starp ar galeriju saistīto attēlu atribūtiem. Lietojiet * kā aizstājējzīmi nepilnam meklējumvārdam.</dd>
+
+<dt>Meklēt pēc autora</dt>
+<dd>Lietojiet * aizstājējzīmi nepilnam meklējumvārdam.</dd>
+
+<dt>Meklēt pēc datuma</dt>
+<dd>Izvēlieties datumu un/vai beigu datumu jūsu meklējumam. Atstājiet datuma lauku tukšu, ja vēlaties izveidot "before" meklējumu. Gadu beidzamajā lauciņa jāievada sekojošā formātā: AAAA (t.i. 2004)</dd>
+
+<dt>Meklēt Kategorijās</dt>
+<dd>Izvēlietits kategoriju vai kategorijas, kurās vēlaties meklēt. Meklēts tiks arī visās apakškategorijās, ja izvēlēsities pamatkategoriju un iestatīsit atļauju meklēt apakškategorijās.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/lv_LV/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/site_manager.html	(revision 14585)
@@ -0,0 +1,35 @@
+<h2>Attālinātās web lapas</h2>
+
+<p>Piwigo piedāvā iespēju Jūsu galerijas veidošanai attēlu glabāšanai izmantot vairākus serverus. Tas ir noderīgi, ja Jūsu galerija ir uzinstalēta uz mazietilpīga servera un Jums ir jāparāda liels daudzums attēlu.</p>
+
+<ol>
+
+<li>rediģē failu <span class="filename">tools/create_listing_file_local.inc.php</span>,
+   modificējot parametru daļu kā <code>$conf['prefix_thumbnail']</code> vai
+<code>$conf['use_exif']</code>.</li>
+
+<li>lietojot ftp, izvieto failus <span class="filename">tools/create_listing_file.php</span>
+   un <span class="filename">tools/create_listing_file_local.inc.php</span> (modificēti)
+   uz Jūsu attālinātās web lapas, tajā pašā mapē, kur atrodas Jūsu kategoriju mapes (kā mape <span class="filename">galerijas</span> uz šīs web laps). Piemēram, teiksim Jums ir piekļuve <span  
+class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+<li>ejat uz <span class="pwgScreen">administrēšanas paneli, Kategorijas, Web lapas pārvaldnieks</span>. Izvēlaties izveidot jaunu web lapu, piemēram <span
+   class="filename">http://example.com/galleries</span>.</li>
+
+<li>tiek reģistrēta jauna attālināta web lapa. Ispējams veikt 4 darbības :
+
+<ol>
+
+<li><strong>sarakstu ģenerēšanu</strong> : startē attālinātu pieprasījumu ģenerēt attālināto failu sarakstu</li>
+
+<li><strong>sinhronizāciju</strong> : nolasa attālināto <span
+       class="filename">listing.xml</span> failu un sinhronizē ar informāciju datu bāzē</li>
+
+<li><strong>tīrīšanu</strong> : dzēš attālināto <span
+       class="filename">listing.xml</span> failu</li>
+
+<li><strong>dzēšana</strong> : dzēš web lapu (un visas saistītās kategorijas un elementus) datu bāzē</li>
+
+</ol>
+</li>
+</ol>
Index: tags/2.4.0RC3/language/lv_LV/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/synchronize.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Sinhrionizēšana</h2>
+
+<p>Ir divi dažādi sinhronizēšanas varianti:  pēc mapēm/failiem un failu metadatiem. Variants Mapes/faili sinhronizē Jūsu mapju koku ar kategoriju koku datu bāzē. Sinhronizācija pēc Metadatiem atjaunina informāciju par elementiem: faila izmērs, dimensijas pikseļos, EXIF vai IPTC informāciju.</p>
+
+<p>Pirmoreiz sinhronizējot ir jāsinhronizē pēc mapēm/failiem varianta.</p>
+
+<p>Sinhronizācijas process var stipri ieilgt (viss atkarīgs no servera noslodzes un sinhronizējamo elementu daudzuma) tā, ka ieteicams to darīt pakāpeniski, kategoriju pēc kategorijas.</p>
Index: tags/2.4.0RC3/language/lv_LV/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Sīkbilžu izveide</h2>
+
+<p>Šajā lapā iespējams izveidot trūkstošās sīkbildes. Šo funkciju neiesaka lietot, ja Jūsu galerija izvietota uz kopīga (shared) servera.</p>
+
+<dl>
+
+<dt>GD versija</dt>
+
+<dd>GD ir bilžu manipulāciju bilbiotēka priekš PHP valodas. Izvēlieties uz Jūsu servera instalēlo versiju. Ja izvēlēsieties nepareizo, Jūs par to tiksiet brīdināts; vienkārši ejiet atpakaļ uz iepriekšējo lapu un izvēlieties citu versiju. Ja nederēs neviena no versijām, tad Jūsu serveris neatbalsta GD.</dd>
+
+<dt>Platums un augstums</dt>
+
+<dd>Maksimālie sīkbildes izmēri. Tiek saglabāta oriģinālā attiecība platums/augstums. Noklusējuma lielumus var modificēt lietojot konfigurācijas iestatījumus <code>tn_width</code> et <code>tn_height</code> (skatīt <span class="filename">include/config_default.inc.php</span> failu).</dd>
+
+<dt>Izveidojamo sīkbilžu skaits</dt>
+
+<dd>Nemēģiniet miniaturizēt ļoti daudz attēlu vienlaicīgi. Miniaturizācijas process ir ļoti CPU resursietilpīgs. Gadījumā, ja Jūsu galeriju uztur bezmaksas web pakalpojumu sniedzējs, pārāk liels CPU resursu patēriņš var novest pie tā, ka Jūsu web lapu no severa vienkārši izņem.</dd>
+
+<dt>Faila formāts </dt>
+
+<dd>Sīkbildes tiek veidotas JPEG formātā. Tās var izveidot tikai no PNG un JPEG formāta attēliem.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/lv_LV/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/lv_LV/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/help/user_list.html	(revision 14585)
@@ -0,0 +1,31 @@
+<h2>Lietotāju saraksts</h2>
+
+<p>Šeit var pārvaldīt reģistrēto lietotāju rekvizītus, izņemot atļaujas, kas tiek pārvaldītas no citurienes.</p>
+
+<h3>Pievienot lietotāju</h3>
+
+<p>Administrators var pašrocīgi pievienot lietotājus.</p>
+
+<h3>Lietotāju saraksts</h3>
+
+<p>Sarakstu var filtrēt pēc lietotājvārda (lietot * kā aizstājējzīmi), grupas vai statusa. To var sakārtot pēc reģistrēšanas datuma vai lietotājvārda gan augošā, gan dilstošā kārtībā.</p>
+
+<p>Šis logs, izmantojot dažādas darbības, ļauj pārvaldīt vairākus lietotājus vienlaicīgi:</p>
+
+<ul>
+
+<li>dzēst lietotājus (nepieciešams apstiprinājums)</li>
+<li>izmainīt statusu</li>
+<li>piesaistīt vai atsaistīt no grupām</li>
+<li>modificēt rādīšanas rekvizītus</li>
+<li>modificēt papildus rekvizītus</li>
+
+</ul>
+
+<p>Mērķis ir atlasītie lietotāji (pēc noklusēšanas) vai visi lietotāji, kas uzrādas izfiltrētajā sarakstā.</p>
+
+<h3>Padomdevējs</h3>
+<p>Padomdevēja definīcija: lietotājs, kas izlasa visu viņam pieejamo informāciju simulācijas režīmā.</p>
+
+<p>Padomdevēja režīmu var iestādīt ar mainīgo $conf['allow_adviser'].</p>
+<p>Ja šī mainīgā vērtība ir 'true', jebkurš lietotājs iegūst padomdevēja statusu</p>
Index: tags/2.4.0RC3/language/lv_LV/index.php
===================================================================
--- tags/2.4.0RC3/language/lv_LV/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/lv_LV/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/lv_LV/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = "Instalacija";
+$lang['Basic configuration'] = "Pamatkonfiguracija";
+$lang['Default gallery language'] = "Galerijas valoda pec noklusešanas";
+$lang['Database configuration'] = "Datubazes konfiguracija";
+$lang['Admin configuration'] = "Administratora konfiguracija";
+$lang['Start Install'] = "Sakt instalaciju";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "e-pasta adresei jaizskatas xxx@yyy.eee (piemeram : jack@altern.org)";
+$lang['Webmaster login'] = "Webmastera logins";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "Tas tiks radits apmekletajiem. Tas nepieciešams web lapas administrešanai";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "Savienojums ar serveri sekmigs, bet savienojums ar datu bazi nav iespejams";
+$lang['Can\'t connect to server'] = "Nevar savienoties ar serveri";
+$lang['Host'] = "Hosts";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "Lietotajs";
+$lang['user login given by your host provider'] = "lietotaja logins, ko pieškir Jusu hosta pakalpojuma sniedzejs";
+$lang['Password'] = "Parole";
+$lang['user password given by your host provider'] = " lietotaja parole, ko pieškir Jusu hosta pakalpojuma sniedzejs";
+$lang['Database name'] = "Datu bazes nosaukums";
+$lang['also given by your host provider'] = "ari pieškir Jusu hosta pakalpojuma sniedzejs";
+$lang['Database table prefix'] = "Datu bazes tabulas prefikss";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "datu bazes tabulu nosaukumi bus ar šo prefiksu (lauj labak parvaldit Jusu tabulas)";
+$lang['enter a login for webmaster'] = "ievadit webmastera loginu";
+$lang['webmaster login can\'t contain characters \' or "'] = "webmastera logins nedrikst saturet ' vai \"";
+$lang['please enter your password again'] = "ludzu ievadiet Jusu paroli no jauna";
+$lang['Webmaster password'] = "Webmastera parole";
+$lang['Keep it confidential, it enables you to access administration panel'] = "Esiet konfidenciali, tas lauj pieklut administratora panelim";
+$lang['Password [confirm]'] = "Parole [apstiprinat]";
+$lang['verification'] = "parbaude";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "Vajag palidzibu? Uzdodiet savu jautajumu <a href=\"%s\">Piwigo sludinajumos</a>.";
+$lang['Webmaster mail address'] = 'Webmāstera pasta adrese';
+$lang['Visitors will be able to contact site administrator with this mail'] = "Apmekletaji vares izmantot šo e-pastu, lai sazinatos ar lapas administratoru";
+$lang['PHP 5 is required'] = "nepieciešams PHP 5 ";
+$lang['It appears your webhost is currently running PHP %s.'] = "Jusu webhosts patlaban izmanto PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo var meginat parslegt Jusu konfiguraciju uz  PHP 5 izveidojot vai modificejot  a .htaccess failu.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "Jus varat izmanit savu konfiguraciju pats un pec tam parstartet Piwigo.";
+$lang['Try to configure PHP 5'] = "Meginiet nokonfiguret PHP 5";
+$lang['Sorry!'] = "Atvainojiet!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo nevar nokonfiguret PHP 5.";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "Jums javeršas pie Jusu hostinga pakalpojuma sniedzeja pec palidzibas un pašam jamegina parslegties uz PHP 5 atbalstu.";
+$lang['Hope to see you back soon.'] = "Ceram Jus redzet atkal.";
+$lang['Congratulations, Piwigo installation is completed'] = 'Apsveicam, Piwigo instalacija ir pabeigta';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = ' Alternativa ir iekopet tekstu lodzina augšpuse un ielimet to faila "local/config/database.inc.php" (Uzmanibu : database.inc.php drikst saturet tikai to kas ir teksta lodzina, ne enter ne tukšumus)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Konfigurācijas faila local/config/database.inc.php izveide ir nesekmīga.';
+$lang['Download the config file'] = 'Lejupladet config failu';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Jums jalejupielade configuracijas fails un jaielade tas Jusu instalacijas local/config mape.';
+$lang['Just another Piwigo gallery'] = 'Vēl viena Piwigo galerija';
+$lang['Welcome to my photo gallery'] = 'Laipni lūgti manā foto galerijā';
+$lang['Welcome to your new installation of Piwigo!'] = 'Laipni lūgti Jūsu Piwigo jaunajā instalācijā!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Nevilcinieties izmantot mūsu forumu palīdzību: %s';
+?>
Index: tags/2.4.0RC3/language/lv_LV/iso.txt
===================================================================
--- tags/2.4.0RC3/language/lv_LV/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Latviešu [LV]
Index: tags/2.4.0RC3/language/lv_LV/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/lv_LV/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/lv_LV/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Uzlabošana";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Šī lapa piedāvā uzlabot Jūsu Piwigo veco datu bāzi uz jaunāko versiju. Uzlabošanas asistents domā, ka Jūs patlaban lietojat <strong>release %s</strong> ( vai ekvivalentu).";
+$lang['Upgrade from version %s to %s'] = "Uzlabojums no  %s versijas uz %s";
+$lang['Statistics'] = "Statistika";
+$lang['total upgrade time'] = "kopējais uzlabošanas procesa laiks";
+$lang['total SQL time'] = "kopējais SQL laiks";
+$lang['SQL queries'] = "SQL rindas";
+$lang['Upgrade informations'] = "Informācija par uzlabojumu";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Veiciet profilakses pārbaudi [Administrēšana>Rīki>Profilakse] , ja ir gadījusies kāda kļūme.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Piesardzības nolūkos tiek atslēgti sekojoši spraudņi. Pirms tos atkal pieslēgt, pārbaudiet vai nav pieejami to uzlabojumi:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Uzlabojumu var veikt tikai administrators: lūdzu veiciet pierakstīšanos zemāk.";
+$lang['You do not have access rights to run upgrade'] = "Jums nav pieejas tiesību, lai veiktu uzlabojumu";
+$lang['All sub-albums of private albums become private'] = 'Visi privātā albūma apakšalbūmi kļūst privāti';
+$lang['User permissions and group permissions have been erased'] = "Lietotāju un grupu piekļuves tiesības ir izdzēstas";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "No iepriekšējās konfigurācijas ir saglabāti tikai sīkbilžu prefiksi un webmāstera e-pasta adreses";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Iekš <i>%s</i>, pirms <b>?></b>,ievietot:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Piesardzības pasākumu dēļ, sekojošas tēmas ir deaktivētas. Pirms atkal tās aktivēt, jums jāpārbauda, vai nav pieejami šo tēmu jauninājumi:';
+?>
Index: tags/2.4.0RC3/language/mk_MK/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/mk_MK/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/mk_MK/common.lang.php	(revision 14585)
@@ -0,0 +1,351 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id$
+// | last update   : $Date$
+// | last modifier : $Author$
+// | revision      : $Revision$
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Македонски [MK]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=428
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Македонски';
+$lang_info['country'] = 'Република Македонија';
+$lang_info['charset'] = 'utf-8';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'mk';
+$lang_info['zero_plural'] = true;
+
+$lang['%.2f (rated %d times)'] = '%.2f оценета %d пат';
+$lang['%d Kb'] = '%d килобајти';
+$lang['%d album updated'] = '%d категорија беше обновена';
+$lang['%d albums updated'] = '%d категории беа обновени';
+$lang['%d comment to validate'] = '%d коментар чека валидирање';
+$lang['%d comments to validate'] = '%d коментари чекаат валидирање';
+$lang['%d new comment'] = '%d нов коментар';
+$lang['%d new comments'] = '%d нови коментари';
+$lang['%d comment'] = '%d коментар';
+$lang['%d comments'] = '%d коментари';
+$lang['%d hit'] = '%d посета';
+$lang['%d hits'] = '%d посети';
+$lang['%d new photo'] = '%d нов елемент';
+$lang['%d new photos'] = '%d нови елементи';
+$lang['%d new user'] = '%d нов член';
+$lang['%d new users'] = '%d нови членови';
+$lang['%d photo'] = '%d фотографија';
+$lang['%d photos'] = '%d фотографии';
+$lang['%d photo is also linked to current tags'] = '%d фотографија е поврзана со овие етикети';
+$lang['%d photos are also linked to current tags'] = '%d фотографии се поврзани со овие етикети';
+$lang['About'] = 'Помош';
+$lang['All tags'] = 'Сите етикети';
+$lang['Any tag'] = 'Било која етикета';
+$lang['At least one listed rule must be satisfied.'] = 'Барем едно правило треба да биде исполнето.';
+$lang['Author'] = 'Автор';
+$lang['Average rate'] = 'Просек';
+$lang['Albums'] = 'Категории';
+$lang['Album'] = 'Категорија';
+$lang['Close this window'] = 'Затвори го овој прозор';
+$lang['Complete RSS feed (photos, comments)'] = 'Комплетен RSS feed (фотографии и коментари)';
+$lang['Confirm Password'] = 'Потврдете ја лозинката';
+$lang['Connection settings'] = 'Најавете се со вашето корисничко име и лозинка';
+$lang['Login'] = 'Најави се';
+$lang['Contact webmaster'] = '<a href="http://forum.avijacija.com.mk">Побарај помош тука.</a>';
+$lang['Create a new account'] = 'Зачлени се';
+$lang['Created on'] = 'Фотографирана во';
+$lang['Creation date'] = 'дата на создавање';
+$lang['Current password is wrong'] = 'Сегашната лозинка е погрешна';
+$lang['Dimensions'] = 'Димензии';
+$lang['Display'] = 'Преглед';
+$lang['Each listed rule must be satisfied.'] = 'Секое наведено правило мора да биде исполнето.';
+$lang['Email address is missing. Please specify an email address.'] = 'Email адресата недостасува.';
+$lang['Email address'] = 'Email адреса';
+$lang['Enter your personnal informations'] = 'Внесете ги вашите лични податоци';
+$lang['Error sending email'] = 'Грешка при испраќањето email.';
+$lang['File name'] = 'име на датотека';
+$lang['File'] = 'Датотека';
+$lang['Filesize'] = 'Големина';
+$lang['Filter and display'] = 'Пребарај и покажи ми';
+$lang['Filter'] = 'Филтер на пребарување';
+$lang['Forgot your password?'] = 'Ја заборави лозинката?';
+$lang['Go through the gallery as a visitor'] = 'Почетна страница';
+$lang['Help'] = 'Help';
+$lang['Identification'] = 'Корисник';
+$lang['Photos only RSS feed'] = 'Парцијален RSS feed (фотографии)';
+$lang['Keyword'] = 'Клучен збор';
+$lang['Links'] = 'Линкови';
+$lang['N/A'] = 'Не е познат';
+$lang['New on %s'] = 'Нова на %s';
+$lang['Notification'] = 'RSS';
+$lang['Number of items'] = 'Број на елементи';
+$lang['Original dimensions'] = 'Оригинални димензии';
+$lang['Password forgotten'] = 'Заборавена лозинка';
+$lang['Password'] = 'Лозинка';
+$lang['Piwigo Help'] = 'Често поставувани прашања';
+$lang['Post date'] = 'дата на испраќање';
+$lang['Posted on'] = 'Објавена во';
+$lang['Profile'] = 'Профил';
+$lang['Quick connect'] = 'Брзо најавување';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Rate'] = 'Оцени';
+$lang['Register'] = 'Зачлени се';
+$lang['Registration'] = 'Регистрирање на нов корисник';
+$lang['Related tags'] = 'Соодветни етикети';
+$lang['Reset'] = 'Избриши';
+$lang['Retrieve password'] = 'Врати ја лозинката';
+$lang['Search rules'] = 'Правила на пребарување';
+$lang['Search tags'] = 'Барај етикети';
+$lang['Search'] = 'Пребарување';
+$lang['display available tags'] = 'Погледни ги етикетите';
+$lang['Since'] = 'Од';
+$lang['Sort by'] = 'Подреди ги по';
+$lang['Sort order'] = 'Подредување по';
+$lang['Tag'] = 'Етикета';
+$lang['Tags'] = 'Етикети';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Really Simple Syndication функцијата обезбедува известувања кога се прикачуваат нови фотографии и пишуваат нови коментари. Потребно е да имате RSS feed reader. Повеќе информации може да најдете <a href="http://en.wikipedia.org/wiki/RSS_(file_format)">тука.</a>';
+$lang['Unknown feed identifier'] = 'Непознат feed.';
+$lang['User comments'] = 'Коментари од корисниците';
+$lang['Username'] = 'Член';
+$lang['Visits'] = 'Погледи';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Недела %d';
+$lang['About Piwigo'] = 'Помош за користење на галеријата';
+$lang['You are not authorized to access the requested page'] = 'You are not authorized to access the requested page';
+$lang['Add to caddie'] = 'Додај ја фотографијата во календарот';
+$lang['add this photo to your favorites'] = 'Додај ја фотографијата во твоите омилени';
+$lang['Administration'] = 'Администрација';
+$lang['all'] = 'сите';
+$lang['ascending'] = 'хоризонтален ред';
+$lang['author(s) : %s'] = 'автор(и) : %s';
+$lang['Expand all albums'] = 'Отвори ги сите категории на насловната';
+$lang['posted after %s (%s)'] = 'објавено по %s (%s)';
+$lang['posted before %s (%s)'] = 'објавено пред %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'објавено помеѓу %s (%s) и %s (%s)';
+$lang['posted on %s'] = 'објавено на %s';
+$lang['Best rated'] = 'Најдобро рангирани';
+$lang['display best rated photos'] = 'Ги покажува најдобро рангираните фотографии';
+$lang['caddie'] = 'Календар';
+$lang['Calendar'] = 'Календар';
+$lang['All'] = 'Сите';
+$lang['display each day with photos, month per month'] = 'Ги покажува фотографиите сортирани по ден, недела и месец';
+$lang['View'] = 'Преглед';
+$lang['chronology_monthly_calendar'] = 'Месечен календар';
+$lang['chronology_monthly_list'] = 'Месечна листа';
+$lang['chronology_weekly_list'] = 'Неделна листа';
+$lang['Click here if your browser does not automatically forward you'] = 'Кликнете тука доколку не сакате вашиот прелистувач автоматски да ве пренасочи';
+$lang['comment date'] = 'дата на коментар';
+$lang['Comment'] = 'Коментар';
+$lang['Your comment has been registered'] = 'Вашиот коментар е додаден.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Се обидовте да додадете премногу коментари. Почекајте 30 секунди и обидете се повторно.';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Твојот коментар не беше додаден по прегледувањето од администрацијата.';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Твојот коментар мора да биде прегледан од администрацијата пред да биде објавен.';
+$lang['This login is already used by another user'] = 'Корисничкото име веќе се користи. Обиди се со друго.';
+$lang['Comments'] = 'Коментари';
+$lang['Add a comment'] = 'Додај коментар';
+$lang['created after %s (%s)'] = 'создадена по %s (%s)';
+$lang['created before %s (%s)'] = 'создадена пред %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'создадена помеѓу %s (%s) и %s (%s)';
+$lang['created on %s'] = 'создадена на %s';
+$lang['Customize'] = 'Кориснички панел';
+$lang['Your Gallery Customization'] = 'Твои подесувања во корисничкиот панел';
+$lang['day'][0] = 'недела';
+$lang['day'][1] = 'понеделник';
+$lang['day'][2] = 'вторник';
+$lang['day'][3] = 'среда';
+$lang['day'][4] = 'четврток';
+$lang['day'][5] = 'петок';
+$lang['day'][6] = 'сабота';
+$lang['Default'] = 'основа';
+$lang['delete this photo from your favorites'] = 'Избриши ја фотографијата од твоите омилени';
+$lang['Delete'] = 'Избриши';
+$lang['descending'] = 'вертикален ред';
+$lang['Download'] = 'зачувај';
+$lang['Download this file'] = 'зачувај ја оваа датотека';
+$lang['edit'] = 'уреди';
+$lang['wrong date'] = 'погрешна дата';
+$lang['excluded'] = 'исклучено';
+$lang['Your favorites'] = 'Мои омилени';
+$lang['display your favorites photos'] = 'Ги покажува твоите омилени фотографии';
+$lang['Favorites'] = 'Омилени фотографии';
+$lang['First'] = 'Прва';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Прикачувањето на галерија моментално е оневозможено, поради обнова. Во меѓувреме прегледувањето е дозволено.';
+$lang['Page generated in'] = 'Страницата беше генерирана за';
+$lang['guest'] = 'гостин';
+$lang['Hello'] = 'Здраво';
+$lang['available for administrators only'] = 'Пристапот не е дозволен.';
+$lang['display this album'] = 'Покажи фотографии од коренот на оваа категорија';
+$lang['display last user comments'] = 'Погледни ги последните коментари од членовите';
+$lang['customize the appareance of the gallery'] = 'Промени ги твоите лични подесувања';
+$lang['search'] = 'барај';
+$lang['Home'] = 'Почетна';
+$lang['Identification'] = 'Профил';
+$lang['in this album'] = 'во оваа категорија';
+$lang['in %d sub-album'] = 'во %d подкатегорија';
+$lang['in %d sub-albums'] = 'во %d подкатегории';
+$lang['included'] = 'вклучено';
+$lang['Invalid password!'] = 'Лозинката е погрешна!';
+$lang['Language']='Јазик';
+$lang['last %d days'] = 'последните %d дена';
+$lang['Last'] = 'Последна';
+$lang['Logout'] = 'Одјави се';
+$lang['obligatory'] = 'Полињата обележани со звездичка се задолжителни за пополнување';
+$lang['Maximum photo height'] = 'Максимална висина на фотографиите';
+$lang['Maximum height must be a number superior to 50'] = 'Максималната висина мора да е број поголем од 50';
+$lang['Maximum photo width'] = 'Максимална ширина на фотографиите';
+$lang['Maximum width must be a number superior to 50'] = 'Максималната ширина мора да е број поголем од 50';
+$lang['display a calendar by creation date'] = 'Го покажува календарот по дата на создавање';
+$lang['display all photos in all sub-albums'] = 'Ги покажува сите елементи во сите подкатегории';
+$lang['return to normal view mode'] = 'Врати се кон нормалниот преглед';
+$lang['display a calendar by posted date'] = 'Го покажува календарот по дата на испраќање';
+$lang['month'][10] = 'октомври';
+$lang['month'][11] = 'ноември';
+$lang['month'][12] = 'декември';
+$lang['month'][1] = 'јануари';
+$lang['month'][2] = 'февруари';
+$lang['month'][3] = 'март';
+$lang['month'][4] = 'април';
+$lang['month'][5] = 'мај';
+$lang['month'][6] = 'јуни';
+$lang['month'][7] = 'јули';
+$lang['month'][8] = 'август';
+$lang['month'][9] = 'септември';
+$lang['Most visited'] = 'Најпосетени';
+$lang['display most visited photos'] = 'Ги покажува најпосетените фотографии';
+$lang['Unknown identifier'] = 'Unknown identifier';
+$lang['New password'] = 'Нова лозинка';
+$lang['Rate this photo'] = 'Оцени ја фотографијата';
+$lang['Next'] = 'Следна';
+$lang['no rate'] = 'Никој не ја оценал досега';
+$lang['Photos posted within the last %d day.'] = 'Се прикажуваат само фотографии испратени во последниот %s ден.';
+$lang['Photos posted within the last %d days.'] = 'Се прикажуваат само фотографии испратени во последните %s дена.';
+$lang['password updated'] = 'лозинката е обновена';
+$lang['Recent period must be a positive integer value'] = 'Мора да внесеш позитивен број.';
+$lang['photo'] = 'фотографија';
+$lang['Click on the photo to see it in high definition'] = 'Кликни на фотографијата за поголема димензија';
+$lang['Show file metadata'] = 'Покажи метадата за датотеката';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Подесувања';
+$lang['Previous'] = 'Претходна';
+$lang['Random photos'] = 'Случајни фотографии';
+$lang['display a set of random photos'] = 'Ги покажува случајните фотографии';
+$lang['Recent albums'] = 'Нови категории';
+$lang['display recently updated albums'] = 'Ги покажува најновите категории';
+$lang['Recent period'] = 'До колку денови фотографиите ги сметате за "нови"?';
+$lang['Recent photos'] = 'Нови фотографии';
+$lang['display most recent photos'] = 'Ги покажува најновите фотографии';
+$lang['Redirection...'] = 'Префрлувам...';
+$lang['Please, enter a login'] = 'Внесете корисничко име';
+$lang['login mustn\'t end with a space character'] = 'Корисничкото име не може да завршува со space место';
+$lang['login mustn\'t start with a space character'] = 'Корисничкото име не може да започнува со space место';
+$lang['this login is already used'] = 'Корисничкото име веќе постои. Ве молиме одберете друго.';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail адресата мора да изгледа вака xxx@yyy.eee (пример: pero@makedonija.com.mk)';
+$lang['please enter your password again'] = 'Ве молиме повторно внесете ја вашата лозинка.';
+$lang['Auto login'] = 'Логирај ме автоматски на секоја моја посета';
+$lang['remove this tag from the list'] = 'избриши ја оваа етикета од листата';
+$lang['representative'] = 'главна икона';
+$lang['search'] = 'Пребарување';
+$lang['Search for Author'] = 'Барај по автор';
+$lang['Search in albums'] = 'Барај по категории';
+$lang['Search by date'] = 'Барај по дата';
+$lang['Date'] = 'Почетна дата';
+$lang['End-Date'] = 'Крајна дата';
+$lang['Kind of date'] = 'Барај по';
+$lang['Search for words'] = 'Барај по зборови';
+$lang['Search for all terms'] = 'Барај по сите термини ';
+$lang['Search for any term'] = 'Барај по било кој термин';
+$lang['Empty query. No criteria has been entered.'] = 'Не внесовте ниту еден збор.';
+$lang['Search results'] = 'Резултати од пребарувањето';
+$lang['Search in sub-albums'] = 'Барај по подкатегории';
+$lang['searched words : %s'] = 'барани зборови : %s';
+$lang['Contact'] = 'Контакт';
+$lang['set as album representative'] = 'Намести ја како главна икона за категорија';
+$lang['Show number of comments'] = 'Покажи го бројот на коментарите?';
+$lang['Show number of hits'] = 'Покажи го бројот на прегледи?';
+$lang['slideshow'] = 'Презентација';
+$lang['stop the slideshow'] = 'Стопирај ја презентацијата';
+$lang['Specials'] = 'Функции';
+$lang['SQL queries in'] = 'SQL queries in';
+$lang['display only recently posted photos'] = 'Прикажи ги само новите фотографии';
+$lang['return to the display of all photos'] = 'Врати се кон прикажување на сите фотографии';
+$lang['the beginning'] = 'почетокот';
+$lang['Interface theme'] = 'Изглед на галеријата';
+$lang['Thumbnails'] = 'Сликички';
+$lang['Menu'] = 'Систем';
+$lang['A comment on your site'] = 'Коментар на твојата страна';
+$lang['today'] = 'денес';
+$lang['Update your rating'] = 'Обнови ја твојата оценка';
+$lang['the username must be given'] = 'корисничкото име мора да биде наведено';
+$lang['useful when password forgotten'] = 'Внесете постоечка и валидна e-mail адреса';
+$lang['Quick search'] = 'Брзо пребарување';
+$lang['Connected user: %s'] = 'Приклучен корисник: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Прелистувач: %s';
+$lang['Author: %s'] = 'Автор: %s';
+$lang['Comment by %s'] = 'Коментар од %s';
+$lang['User: %s'] = 'Корисник: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Registration of %s';
+$lang['Album: %s'] = 'Категорија: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Грешка при најавувањето како гостин.';
+$lang['Submit'] = 'Поднесува';
+$lang['Yes'] = 'Да';
+$lang['No'] = 'Не';
+$lang['Comment: %s'] = 'Коментар: %s';
+$lang['Album results for'] = 'Резултат на Албуми за';
+$lang['Tag results for'] = 'Таг резултати за';
+$lang['from %s to %s'] = 'од %s до %s';
+$lang['Play of slideshow'] = 'Пушти ја проекцијата';
+$lang['Pause of slideshow'] = 'Паузирај ја проекцијата';
+$lang['Repeat the slideshow'] = 'Повтори ја проекцијата';
+$lang['Not repeat the slideshow'] = 'Не ја повторувај проекцијата';
+$lang['Reduce diaporama speed'] = 'Намали ја брзината на проекцијата';
+$lang['Accelerate diaporama speed'] = 'Забрзај ја брзината на проекцијата';
+$lang['Rank'] = 'Оцени';
+$lang['group by letters'] = 'групирај по букви';
+$lang['letters'] = 'букви';
+$lang['show tag cloud'] = 'прикажи го облакот на тагови';
+$lang['cloud'] = 'Облак';
+$lang['Reset to default values'] = 'Врати на оригинални вредности';
+$lang['delete all photos from your favorites'] = 'Избриши ги сите слики од Омилени';
+$lang['Sent by'] = 'Прати по';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Колачиња се блокирани или не се подржани од вашиот прелистувач. Мора да овозможите колачиња за да се логирате.';
+$lang['Edit a comment'] = 'Промени коментар';
+$lang['Are you sure?'] = 'Дали сте сигурни?';
+$lang['(!) This comment requires validation'] = '(!) Потребна е валидација за овој коментар';
+$lang['Welcome'] = 'Дојбедојдовте';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Дојбедојдовте во вашата Piwigo фото галерија!';
+$lang['... or browse your empty gallery'] = '... или прелистајте ја вашата празна галерија';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... или ве молам деактивирајте ја оваа порака, сам ќе се снајдам';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hello %s, your Piwigo photo gallery is empty!';
+$lang['I want to add photos'] = 'Сакам да додадам слики';
+$lang['Manage this user comment: %s'] = 'Раководи со коментарот на овој корисник: %s';
+$lang['This author modified following comment:'] = 'Овој автор го променил следниов коментар:';
+$lang['This author removed the comment with id %d'] = 'Овој автор го отстранил коментарот со бројот %d';
+$lang['photos posted during the last %d days'] = 'слики објавени во последните %d денови';
+$lang['this email address is already in use'] = 'Друг корисник ја користи постоечката е-пошта';
+$lang['display photos linked to this tag'] = 'Поглед кон слики поврзани само со овој таг';
+
+?>
Index: tags/2.4.0RC3/language/mk_MK/index.php
===================================================================
--- tags/2.4.0RC3/language/mk_MK/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/mk_MK/index.php	(revision 14585)
@@ -0,0 +1,33 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | PhpWebGallery - a PHP based picture gallery                           |
+// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
+// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
+// +-----------------------------------------------------------------------+
+// | file          : $Id$
+// | last update   : $Date$
+// | last modifier : $Author$
+// | revision      : $Revision$
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/mk_MK/iso.txt
===================================================================
--- tags/2.4.0RC3/language/mk_MK/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/mk_MK/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Македонски [MK]
Index: tags/2.4.0RC3/language/nl_NL/about.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/about.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>Deze fotogalerie is gemaakt met Piwigo.</p>
+
+<p>Piwigo is programmatuur voor het publiceren van uw fotogalerieën op het
+web. Het wordt ontwikkeld en onderhouden door een actieve groep gebruikers
+en ontwikkelaars. Met behulp van vele uitbreidingen kunt u Piwigo naar uw
+wensen aanpassen. En niet onbelangrijk: Piwigo is gratis en opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://nl.piwigo.org">Bezoek de Piwigo 
+website</a></p>
+
+<p>De Nederlandse vertaling wordt verzorgd door (in alfabetische volgorde):
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=11901">J.Commelin</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=6755">Kees Hessels</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=12734">Mattias</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=7168">pauldaytona</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=15676">ruud</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=13823">stim</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=3594">terwolde</a></li>>
+	</ul>
+          .... waarvoor hartelijke dank</p>
Index: tags/2.4.0RC3/language/nl_NL/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/admin.lang.php	(revision 14585)
@@ -0,0 +1,900 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d associatie';
+$lang['%d associations'] = '%d associaties';
+$lang['%d album including'] = '%d categorie waarvan ';
+$lang['%d albums including'] = '%d categorieën waarvan ';
+$lang['%d physical'] = '%d fysiek';
+$lang['%d physical'] = '%d fysiek';
+$lang[' and %d virtual'] = ' en %d virtueel';
+$lang[' and %d virtual'] = ' en %d virtueel';
+$lang['%d album moved'] = '%d categorie verplaatst';
+$lang['%d albums moved'] = '%d categorieën verplaatst';
+$lang['%d group'] = '%d groep';
+$lang['%d groups'] = '%d groepen';
+$lang['%d member'] = '%d lid';
+$lang['%d members'] = '%d leden';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tags';
+$lang['%d user comment rejected'] = '%d gebruikers commentaar afgewezen';
+$lang['%d user comments rejected'] = '%d gebruikers commentaren afgewezen';
+$lang['%d user comment validated'] = '%d gebruikers commentaar bevestigd';
+$lang['%d user comments validated'] = '%d gebruikers commentaren bevestigd';
+$lang['%d user deleted'] = '%d gebruiker verwijderd';
+$lang['%d users deleted'] = '%d gebruikers verwijderd';
+$lang['%d user'] = '%d gebruiker';
+$lang['%d users'] = '%d gebruikers';
+$lang['%d waiting for validation'] = '%d wachten op bevestiging';
+$lang['Actions'] = 'Acties';
+$lang['Activate'] = 'Activeer';
+$lang['Add/delete a permalink'] = 'Toevoegen/verwijderen van een permalink';
+$lang['Add a tag'] = 'Voeg een tag toe';
+$lang['Add a user'] = 'Voeg een gebruiker toe';
+$lang['Add group'] = 'Voeg een groep toe';
+$lang['Add'] = 'Toevoegen';
+$lang['Allow user registration'] = 'Sta gebruikersregistratie toe';
+$lang['Apply to sub-albums'] = 'Toestaan op sub-categorieën';
+$lang['Associated'] = 'Gelinkt';
+$lang['Caddie management'] = 'Winkelmandje management';
+$lang['Caddie'] = 'Winkelmandje';
+$lang['Albums authorized thanks to group associations'] = 'Categorieën geautoriseerd dankzij groepassociaties';
+$lang['Album manual order was saved'] = 'Categorieën handmatig gesorteerd is opgeslagen';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Upgradecontrole is door onbekende reden niet (goed) uitgevoerd.';
+$lang['Check for upgrade'] = 'Upgradecontrole';
+$lang['Comments for all'] = 'Iedereen mag commentaar geven (ook gasten)';
+$lang['Current name'] = 'Huidige naam';
+$lang['Database'] = 'Database';
+$lang['Deactivate'] = 'Deactiveer';
+$lang['Delete Representant'] = 'Verwijder Representant';
+$lang['Delete selected tags'] = 'Verwijder geselecteerde tags';
+$lang['Delete selected users'] = 'Verwijder geselecteerde gebruikers';
+$lang['Deletions'] = 'Verwijderen';
+$lang['Deny selected groups'] = 'Verbiedt geselecteerde groepen';
+$lang['Deny selected users'] = 'Verbiedt geselecteerde gebruikers';
+$lang['Description'] = 'Omschrijving';
+$lang['Display options'] = 'Toon opties';
+$lang['Dissociated'] = 'Niet gelinkt';
+$lang['Does not represent'] = 'Representeerd niet';
+$lang['Edit selected tags'] = 'Bewerk geselecteerde tags';
+$lang['Edit tags'] = 'Bewerk tags';
+$lang['Email admins when a new user registers'] = 'Stuur email naar beheerders wanneer een nieuwe gebruiker zich heeft geregistreerd';
+$lang['Email admins when a valid comment is entered'] = 'Stuur email naar beheerders wannneer een geldig commentaar is ingevuld';
+$lang['Email admins when a comment requires validation'] = 'Stuur email naar beheerders wanneer een commantaar validatie nodig heeft';
+$lang['Environment'] = 'Omgeving';
+$lang['Form'] = 'Formulier';
+$lang['Gallery title'] = 'Galerie-titel';
+$lang['Grant selected groups'] = 'Toegang geselecteerde groepen';
+$lang['Grant selected users'] = 'Toegang geselecteerde gebruikers';
+$lang['Group name'] = 'Groepsnaam';
+$lang['Groups'] = 'Groepen';
+$lang['Guests'] = 'Gasten';
+$lang['History'] = 'Geschiedenis';
+$lang['Informations'] = 'Informatie';
+$lang['Install'] = 'Installeer';
+$lang['Link all album photos to a new album'] = 'Link alle categorie-afbeeldingen aan een nieuwe categorie';
+$lang['Link all album photos to some existing albums'] = 'Link alle categorie-afbeeldingen aan bestaande categorieën';
+$lang['Linked albums'] = 'Gelinkte categorieën';
+$lang['Lock gallery'] = 'Sluit galerie voor onderhoud';
+$lang['Maintenance'] = 'Onderhoud';
+$lang['Edit album permissions'] = 'Beheer rechten van een categorie';
+$lang['Manage permissions for group "%s"'] = 'Beheer rechten van groep "%s"';
+$lang['Manage permissions for user "%s"'] = 'Beheer rechten van gebruiker "%s"';
+$lang['Manage tags'] = 'Beheer tags';
+$lang['Members'] = 'Leden';
+$lang['Metadata synchronized from file'] = 'Metadata gesynchroniseerd van een bestand';
+$lang['Move albums'] = 'Verplaats categorie';
+$lang['Move'] = 'Verplaatsen';
+$lang['Name'] = 'Naam';
+$lang['New name'] = 'Nieuwe naam';
+$lang['New parent album'] = 'Nieuwe hoofdcategorie';
+$lang['New tag'] = 'Nieuwe tag';
+$lang['Number of comments per page'] = 'Aantal weer te geven commentaren per pagina';
+$lang['Number of rates'] = 'Aantal waarderingen';
+$lang['Number of thumbnails to create'] = 'Aantal mini-afbeeldingen om te maken';
+$lang['Only private albums are listed'] = 'Alleen privé categorieën worden getoond';
+$lang['Operating system'] = 'Besturingssysteem';
+$lang['Options'] = 'Opties';
+$lang['Other private albums'] = 'Andere privé categorieën';
+$lang['Page banner'] = 'Pagina banner';
+$lang['Parent album'] = 'Hoofdcategorie';
+$lang['Path'] = 'Pad';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s is eerder gebruikt door categorie %s. Verwijder de permalink geschiedenis eerst';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'De permalinknaam moet bestaan uit a-z, A-Z, 0-9, "-" of "_". Het mag geen getal zijn of starten met een "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s is al in gebruik door categorie %s';
+$lang['Permalink history'] = 'Permalink geschiedenis';
+$lang['Permalinks'] = 'Permalinks';
+$lang['Permission denied'] = 'Toegang gewijgerd';
+$lang['Permission granted thanks to a group'] = 'Rechten toegekend door een groep';
+$lang['Permission granted'] = 'Toegang toegestaan';
+$lang['Photo informations updated'] = 'Afbeeldings-informatie bijgewerkt';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Positie';
+$lang['Preferences'] = 'Voorkeuren';
+$lang['Properties'] = 'Eigenschappen';
+$lang['Random photo'] = 'Willekeurig plaatje';
+$lang['Rate date'] = 'Waarderingsdatum';
+$lang['Rating by guests'] = 'Ook gasten kunnen waarderen';
+$lang['Rating'] = 'Waardering';
+$lang['Reject'] = 'Afwijzen';
+$lang['Representant'] = 'Representant';
+$lang['Representation of albums'] = 'Representatieve categorieën';
+$lang['Representative'] = 'Representatief';
+$lang['Represents'] = 'Representeerd';
+$lang['Save order'] = 'Bewaar sortering';
+$lang['Save to permalink history'] = 'Opslaan in permalink geschiedenis';
+$lang['Select at least one album'] = 'Selecteer minstens één categorie';
+$lang['Select at least one photo'] = 'Selecteer minstens één plaatje';
+$lang['Select at least one user'] = 'Selecteer minstens één gebruiker';
+$lang['Show info'] = 'Toon info';
+$lang['Site manager'] = 'Site manager';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statistieken';
+$lang['Storage album'] = 'Opslag categorie';
+$lang['Sum of rates'] = 'Eindwaardering';
+$lang['Tag "%s" already exists'] = 'Tag "%s" bestaat al';
+$lang['Tag "%s" was added'] = 'Tag "%s" is toegevoegd';
+$lang['Tag selection'] = 'Tag selectie';
+$lang['The %d following tags were deleted'] = 'De %d volgende tags zijn verwijderd';
+$lang['Unable to check for upgrade.'] = 'Het is niet mogelijk om een upgradecontrole uit te voeren.';
+$lang['Uninstall'] = 'Deinstaleer';
+$lang['Use the default photo sort order (defined in the configuration file)']='Gebruik de standaard sortering (gedefinieerd in het configuratiebestand)';
+$lang['User comments validation'] = 'Gebruikers-commentaren die wachten op validatie';
+$lang['Users'] = 'Gebruikers';
+$lang['Validate'] = 'Valideren';
+$lang['Validation'] = 'Validatie van commentaar voor plaatsing is nodig';
+$lang['Version'] = 'Versie';
+$lang['Virtual albums to move'] = 'Virtuele categorieën om te verplaatsen';
+$lang['Virtual album name'] = 'Virtuele categorienaam';
+$lang['Webmaster cannot be deleted'] = 'Webbeheerder kan niet verwijderd worden';
+$lang['You are running on development sources, no check possible.'] = 'U werkt op basis van ontwikkelings bronnen, geen controle mogelijk.';
+$lang['You cannot delete your account'] = "U kunt uw account niet verwijderen";
+$lang['You cannot move an album in its own sub album'] = 'U kunt een categorie niet verplaatsen naar zijn eigen sub-categorie';
+$lang['You need to confirm deletion'] = 'U moet de verwijdering bevestigen';
+$lang['Associate to album'] = 'Link aan categorie';
+$lang['associate to group'] = 'Link aan groep';
+$lang['Authorized'] = 'Toegestaan';
+$lang['Add a virtual album'] = 'Voeg een virtuele categorie toe';
+$lang['Authorize users to add comments on selected albums'] = 'Selecteer categorieën waarop commentaar gegeven mag worden';
+$lang['The name of an album must not be empty'] = 'De naam van een categorie mag niet leeg zijn';
+$lang['Lock albums'] = 'Beschikbaarheid van geselecteerde categorieën';
+$lang['Private'] = 'Privé categorie';
+$lang['Public'] = 'Openbare categorie';
+$lang['Find a new representant by random'] = 'Vindt een willekeurige nieuwe representant';
+$lang['Public / Private'] = 'Openbaar / Privé';
+$lang['Manage authorizations for selected albums'] = 'Beheer toegang voor geselecteerde categorieën';
+$lang['Virtual album added'] = 'Virtuele categorie toegevoegd';
+$lang['Virtual album deleted'] = 'Virtuele categorie verwijderd';
+$lang['Access type'] = 'Toegangstype';
+$lang['Information data registered in database'] = 'Informatie opgeslagen in de database';
+$lang['Default display'] = 'Standaardweergave';
+$lang['The gallery URL is not valid.'] = 'De URL van de galerie is niet correct.';
+$lang['Main'] = 'Index';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Het aantal commentaren moet tussen 5 and 50 liggen.';
+$lang['Configuration'] = 'Configuratie';
+$lang['confirm'] = 'Bevestig';
+$lang['Date'] = 'Datum';
+$lang['delete album'] = 'verwijder categorie';
+$lang['Dissociate from album'] = 'Verwijder link aan categorie';
+$lang['dissociate from group'] = 'Verwijder link aan groep';
+$lang['Album updated successfully'] = 'Categorie informatie is met succes bijgewerkt.';
+$lang['photos per page'] = 'Afbeeldingen per pagina';
+$lang['High definition enabled'] = 'Hoge kwaliteit ingeschakeld';
+$lang['File'] = 'Bestand';
+$lang['first photo added on %s'] = 'eerste afbeelding toegevoegd op %s';
+$lang['Forbidden'] = 'Niet toegestaan';
+$lang['global mode'] = 'Compact overzicht';
+$lang['group "%s" added'] = 'groep "%s" toegevoegd';
+$lang['group "%s" deleted'] = 'groep "%s" verwijderd';
+$lang['group "%s" updated'] = 'groep "%s" bijgewerkt';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'De naam van de groep mag geen spatie bevatten of leeg zijn.';
+$lang['This name is already used by another group.'] = 'Deze naam is al in gebruik door een andere groep.';
+$lang['High definition'] = 'Hoge kwaliteit';
+$lang['jump to album'] = 'Ga naar categorie';
+$lang['jump to photo'] = 'Ga naar afbeelding';
+$lang['leave'] = 'Niet wijzigen';
+$lang['Lock'] = 'Gesloten';
+$lang['Locked'] = 'Gesloten categorie';
+$lang['manage album photos'] = 'Beheer categorie-afbeeldingen';
+$lang['manage sub-albums'] = 'Beheer sub-categorie';
+$lang['Manage'] = 'Beheer';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Executie tijd is om, afhandeling moet verder gaan [Verwachte tijd: %d seconden].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Verwachte tijd voor de gebruikerslijst voor een mailing is gelimiteerd. Andere gebruikers staan niet op de lijst.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tijd om email te sturen is gelimiteerd. Andere emailtjes worden overgeslagen.';
+$lang['To send ?'] = 'aan sturen ?';
+$lang['Last send'] = 'Laatst sturen';
+$lang['email'] = 'email';
+$lang['User'] = 'Gebruiker';
+$lang['See you soon,'] = 'Tot ziens op onze webpagina,';
+$lang['Go to'] = 'Ga naar ';
+$lang['Hello'] = 'Hallo ';
+$lang['New photos were added'] = 'Nieuwe afbeeldingen toegevoegd ';
+$lang['on'] = ' op ';
+$lang['between'] = 'tussen ';
+$lang['and'] = ' en ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'De webbeheerder heeft u ingeschreven op de lijst om meldingen per email te ontvangen.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'U heeeft zich ingeschreven voor meldingen per email.';
+$lang['To subscribe'] = 'Inschrijven';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Als u problemen of vragen heeft, stuur een bericht naar: ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemen of vragen';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'De webbeheerder heeft u uitgeschreven van de meldingenlijst, u ontvangt geen meldingen meer per email.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'U heeft zichzelf uitgeschreven om meldingen per email te ontvangen.';
+$lang[', click on'] = ', Klik op ';
+$lang['To unsubscribe'] = 'Uitschrijven';
+$lang['With blank value, gallery title will be used'] = 'Wanneer niet ingevuld, zal de galerie-titel worden gebruikt';
+$lang['Notification'] = 'Meldingen';
+$lang['Error when sending email to %s [%s].'] = 'Fout bij het versturen van email naar %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Email verstuuurd naar %s [%s].';
+$lang['%d mail was sent.'] = '%d email is verstuurd.';
+$lang['%d mails were sent.'] = '%d emails zijn verstuurd.';
+$lang['%d mail was not sent.'] = '%d email is niet verstuurd.';
+$lang['%d mails were not sent.'] = '%d emails zijn niet verstuurd.';
+$lang['No mail to send.'] = 'Geen email om te versturen.';
+$lang['There is no available subscribers to mail.'] = 'Geen gebruikers om email te sturen.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Een gebruiker is beschikbaar, er zijn nieuwe afbeeldingen te melden.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Het is mogelijk dat er geen ingeschreven gebruikers zijn (alleen de webbeheerder kan deze tab zien).';
+$lang['No user to send notifications by mail.'] = 'Geen gebruikers om meldingen te versturen per email.';
+$lang['New photos added'] = 'Nieuwe afbeeldingen toegevoegd';
+$lang['Subscribe to notification by mail'] = 'Inschrijving om meldingen te ontvangen per email';
+$lang['Unsubscribe from notification by mail'] = 'Uitschrijven van meldingen per email';
+$lang['Parameter'] = 'Parameters';
+$lang['Continue processing treatment'] = 'Verder gaan met de bewerking';
+$lang['Complementary mail content'] = 'Bijkomende email-inhoud';
+$lang['Add detailed content'] = 'Toevoegen gedetailleerde inhoud';
+$lang['Send mail as'] = 'Stuur email als (afzender)';
+$lang['Send mail to users'] = 'Stuur email naar gebruikers';
+$lang['Send'] = 'Sturen';
+$lang['Options'] = 'Opties';
+$lang['Subscribed'] = 'Ingeschreven';
+$lang['Subscribe'] = 'Inschrijven';
+$lang['Parameters'] = 'Parameters';
+$lang['Select recipients'] = 'Selecteer ontvangers';
+$lang['Subscribe/unsubscribe users'] = 'Inschrijven/Uitschrijven gebruikers';
+$lang['Unsubscribed'] = 'Uitgeschreven';
+$lang['%d parameter was updated.'] = '%d parameter is bijgewerkt.';
+$lang['%d parameters were updated.'] = '%d parameters zijn bijgewerkt.';
+$lang['%d user was not updated.'] = '%d gebruiker is niet bijgewerkt.';
+$lang['%d users were not updated.'] = '%d gebruikers zijn niet bijgewerkt.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Gebruiker %s [%s] is verwijderd van de inschrijvingslijst.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Gebruiker %s [%s] is toegevoegd aan de inschrijvingslijst.';
+$lang['%d user was updated.'] = '%d gebruiker is bijgewerkt.';
+$lang['%d users were updated.'] = '%d gebruikers zijn bijgewerkt.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Gebruiker %s [%s] is niet verwijderd van de inschrijvingslijst.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Gebruiker %s [%s] is niet toegevoegd aan de inschrijvingslijst.';
+$lang['User %s [%s] added.'] = 'Gebruiker %s [%s] toegevoegd.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Waarschuwing: in/uitschrijven zal een email versturen naar de gebruiker';
+$lang['Send mail on HTML format'] = 'Stuur email in HTML formaat';
+$lang['Include display of recent photos grouped by dates'] = 'Inclusief tonen van recente afbeeldingen op basis van datum';
+$lang['Available only with HTML format'] = 'Alleen beschikbaar in HTML formaat';
+$lang['no write access'] = 'geen schrijftoegang';
+$lang['Permissions'] = 'Rechten';
+$lang['private'] = 'Privé';
+$lang['public'] = 'Publiek';
+$lang['Purge never used notification feeds'] = 'Verwijder nooit gebruikte meldingen';
+$lang['Purge sessions'] = 'Verwijder sessies';
+$lang['randomly represented'] = 'willekeurig gerepresenteerd';
+$lang['registration date'] = 'Registratiedatum';
+$lang['clean'] = 'opschonen';
+$lang['Create this site'] = 'maak deze site';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'test deze remote site';
+$lang['remove tags'] = 'Verwijder tags';
+$lang['Repair and optimize database'] = 'Repareer en optimaliseer de database';
+$lang['selection'] = 'Selectie';
+$lang['set to'] = 'Instellen op';
+$lang['singly represented'] = 'afzonderlijk vertegenwoordigd';
+$lang['This site already exists'] = 'Deze site bestaat al';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Maak een nieuwe site : (geef de URL naar bestand create_listing_file.php)';
+$lang['created'] = 'gemaakt';
+$lang['delete'] = 'Verwijderen';
+$lang['delete this site and all its attached elements'] = 'Verwijder de site en alle bijbehorende afbeeldingen';
+$lang['an error happened'] = 'er heeft zich een fout voorgedaan';
+$lang['Local'] = 'Lokaal';
+$lang['Remote'] = 'Remote';
+$lang['update the database from files'] = 'werk de database bij vanuit bestanden';
+$lang['status'] = 'Status';
+$lang['Directory'] = 'Map';
+$lang['sub-albums'] = 'Sub-categorie';
+$lang['Synchronize metadata'] = 'synchroniseer metadata';
+$lang['target'] = 'Doel';
+$lang['Thumbnail'] = 'Mini-afbeelding';
+$lang['title'] = 'Titel';
+$lang['Album list management'] = 'Categorie beheer';
+$lang['Piwigo configuration'] = 'Piwigo configuratie';
+$lang['Edit album'] = 'Bewerk een categorie';
+$lang['Group management'] = 'Groepsbeheer';
+$lang['User list'] = 'Gebruikerslijst';
+$lang['Edit photo information'] = 'Verander de informatie van een plaatje';
+$lang['Database synchronization with files'] = 'Database synchronisatie met bestanden';
+$lang['all'] = 'Allen';
+$lang['height must be a number superior to'] = 'Hoogte moet groter zijn dan';
+$lang['width must be a number superior to'] = 'Breedte moet groter zijn dan';
+$lang['for the file format'] = 'voor het bestandsformaat';
+$lang['Photo unreachable or no support'] = 'Afbeelding is niet bereikbaar of er is geen support';
+$lang['GD version'] = 'GD versie';
+$lang['General statistics'] = 'Algemene statistieken';
+$lang['average time'] = 'gemiddelde tijd';
+$lang['number of miniaturized photos'] = 'aantal verkleinde afbeeldingen';
+$lang['total time'] = 'totale tijd';
+$lang['for this file format'] = 'voor dit bestandsformaat';
+$lang['unit mode'] = 'Uitgebreid overzicht';
+$lang['Unlocked'] = 'Open categorie';
+$lang['unset'] = 'Niet ingesteld';
+$lang['Update albums informations'] = 'Categorie-informatie bijwerken';
+$lang['Update photos information'] = 'Afbeeldings-informatie bijwerken';
+$lang['Synchronize'] = 'Synchroniseer';
+$lang['reduce to single existing albums'] = 'Alleen naar de bestaande categorieën terugbrengen';
+$lang['Choose an option'] = 'Kies een optie';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'toon maximale informatie (toegevoegde categorieën en afbeeldingen, verwijderde categorieën en afbeeldingen)';
+$lang['Error list'] = 'Foutenlijst';
+$lang['Errors caption'] = 'Foutmeldingen afvangen';
+$lang['Detailed informations'] = 'Gedetailleerde informatie';
+$lang['File/directory read error'] = 'Bestand/map lees fout';
+$lang['albums deleted in the database'] = 'categorieën verwijderd uit de database';
+$lang['photos deleted from the database'] = 'afbeeldingen verwijderd uit de database';
+$lang['photos candidates for metadata synchronization'] = 'afbeeldingen gesynchroniseerd met de metadata van de bijbehorende bestanden';
+$lang['photos informations synchronized with files metadata'] = 'afbeeldings-informatie gesynchroniseerd met bestandsmetadata';
+$lang['errors during synchronization'] = 'fouten tijdens synchronisatie';
+$lang['albums added in the database'] = 'categorieën toegevoegd aan de database';
+$lang['photos added in the database'] = 'afbeeldingen toegevoegd aan de database';
+$lang['photos updated in the database'] = 'afbeeldingen bijgewerkt in de database';
+$lang['Search for new images in the directories'] = 'Zoek naar nieuwe afbeeldingen in mappen';
+$lang['added'] = 'toegevoegd';
+$lang['deleted'] = 'verwijderd';
+$lang['Metadata synchronization results'] = 'Metadata synchronisatie resultaten';
+$lang['only perform a simulation (no change in database will be made)'] = 'alleen een simulatie uitvoeren (er worden geen veranderingen aangebracht in de database)';
+$lang['Simulation'] = 'Simulatie';
+$lang['directories + files'] = 'mappen + bestanden';
+$lang['only directories'] = 'alleen mappen';
+$lang['synchronize files structure with database'] = 'Synchroniseer bestanden met de database';
+$lang['synchronize files metadata with database photos informations'] = 'Synchroniseer bestandsmetadata met de database afbeeldings-informatie';
+$lang['even already synchronized photos'] = 'ook reeds synchroniseerde afbeeldingen';
+$lang['Used metadata'] = 'Gebruikte metadata';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'De naam van de mappen en bestanden moeten bestaan uit letters, "-", "_" of "."';
+$lang['wrong filename'] = 'verkeerde bestandsnaam';
+$lang['Upload'] = 'Upload';
+$lang['user "%s" added'] = 'gebruiker "%s" toegevoegd';
+$lang['User status'] = 'Gebruikersstatus';
+$lang['user_status_admin'] = 'Beheerder';
+$lang['user_status_generic'] = 'Algemeen';
+$lang['user_status_guest'] = 'Gast';
+$lang['user_status_normal'] = 'Gebruiker';
+$lang['user_status_webmaster'] = 'Webbeheerder';
+$lang['Virtual album'] = 'Virtuele categorieën';
+$lang['Waiting'] = 'Valideer';
+$lang['default'] = 'standaard';
+$lang['Toggle \'default group\' property'] = 'Wissel \'standaard groep\' instelling';
+$lang['Advanced features'] = 'Geavanceerde functies';
+$lang['Overall'] = 'Totaal';
+$lang['Year'] = 'Jaar';
+$lang['Month'] = 'Maand';
+$lang['Day'] = 'Dag';
+$lang['Pages seen'] = 'Pagina\'s bekeken';
+$lang['Time'] = 'tijd';
+$lang['IP'] = 'IP';
+$lang['Element'] = '';
+$lang['Section'] = 'sectie';
+$lang['An information email was sent to group "%s"'] = 'Een informatie email is verstuurd naar de groep "%s"';
+$lang['Send an information email to group members'] = 'Stuur een informatie email naar groepsleden';
+$lang['Group'] = 'Groep';
+$lang['[%s] Visit album %s'] = '[%s] Bezoek de categorie %s';
+$lang['Hello,'] = 'Hallo,';
+$lang['See you soon.'] = 'Tot ziens op onze webpagina.';
+$lang['Discover album:'] = 'Ondek de categorie:';
+$lang['Mail content'] = 'Email inhoud';
+$lang['none'] = 'geen';
+$lang['high'] = 'hoog';
+$lang['other'] = 'anders';
+$lang['Element type'] = 'afbeeldings-type';
+$lang['Image id'] = 'Afbeeldings id';
+$lang['Summary'] = 'Overzicht';
+$lang['%d line filtered'] = '%d regel gefilterd';
+$lang['%d lines filtered'] = '%d regels filterd';
+$lang['%d guest'] = '%d gast';
+$lang['%d guests'] = '%d gasten';
+$lang['Hour'] = 'Uur';
+$lang['guest'] = 'gast';
+$lang['default values'] = 'Standaard waarden';
+$lang['Guest cannot be deleted'] = 'Gast kan niet verwijderd worden';
+$lang['Default user cannot be deleted'] = 'Standaard gebruiker kan niet verwijderd worden';
+$lang['Purge history detail'] = 'Details van de filtergeschiedenis';
+$lang['Purge history summary'] = 'Overzicht van de filtergeschiedenis';
+$lang['Check integrity'] = 'Controleer integriteit';
+$lang['Anomaly'] = 'Onregelmatigheid';
+$lang['Correction'] = 'Correctie';
+$lang['Automatic correction'] = 'Automatische correctie';
+$lang['Impossible automatic correction'] = 'Onmogelijke automatische correctie';
+$lang['Correction applied with success'] = 'Correctie die met succes is toegepast';
+$lang['Correction applied with error'] = 'Correctie die met fout wordt toegepast';
+$lang['%d anomaly has been detected.'] = '%d Onregelmatigheid ontdekt.';
+$lang['%d anomalies have been detected.'] = '%d Onregelmatigheden ontdekt.';
+$lang['%d anomaly has been corrected.'] = '%d Onregelmatigheid is gecorrigeerd.';
+$lang['%d anomalies have been detected corrected.'] = '%d Onregelmatigheden die zijn gecorrigeerd.';
+$lang['%d anomaly has not been corrected.'] = '%d Onregelmatigheid ontdekt is niet gecorrigeerd.';
+$lang['%d anomalies have not been corrected.'] = '%d Onregelmatigheden zijn niet gecorrigeerd.';
+$lang['Go to %s or %s for more informations'] = 'Ga naar %s of %s voor meer informatie';
+$lang['the forum'] = 'het forum';
+$lang['the wiki'] = 'de wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s waarde is niet een correct bestand omdat exif niet ondersteund wordt';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s moet aangepast worden naar false in uw local/config/config.inc.php bestand';
+$lang['Main "guest" user does not exist'] = 'Hoofd "gast" gebruiker bestaat niet meer';
+$lang['Main "guest" user status is incorrect'] = 'Hoofd "gast" gebruikersstatus is niet correct';
+$lang['Default user does not exist'] = 'Standaard gebruiker bestaat niet meer';
+$lang['Main "webmaster" user does not exist'] = 'Hoofd "webbeheerder" bestaat niet meer';
+$lang['Main "webmaster" user status is incorrect'] = 'Hoofd "webbeheerder" status is niet correct';
+$lang['User "%s" created with "%s" like password'] = 'Gebruiker "%s" gemaakt met wachtwoord "%s" ';
+$lang['Status of user "%s" updated'] = 'Status van de gebruiker "%s" is bijgewerkt';
+$lang['add new photos to caddie'] = 'voeg nieuwe afbeeldingen toe aan winkelmandje';
+$lang['No display'] = 'Geen weergave';
+$lang['Classic display'] = 'Klassieke weergave';
+$lang['Hoverbox display'] = 'Hoverbox weergave';
+$lang['Mail address is obligatory for all users'] = 'Email-adres is verplicht voor alle gebruikers';
+$lang['Minimum privacy level'] = 'Minimaal privacy nivo';
+$lang['Privacy level'] = 'Privacy nivo';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contacten';
+$lang['Level 2'] = 'Vrienden';
+$lang['Level 4'] = 'Familie';
+$lang['Level 8'] = 'Admins';
+$lang['Reinitialize check integrity'] = 'Herinitialiseer de integriteitscontrole';
+$lang['Check all'] = 'Selecteer alles';
+$lang['Uncheck all'] = 'Deselecteer alles';
+$lang['Check automatic corrections'] = 'Controleer de aoutomatische correcties';
+$lang['Apply selected corrections'] = 'Pas geselecteerde correcties toe';
+$lang['Ignore selected anomalies'] = 'Negeer geselecteerde onregelmatigheden';
+$lang['Refresh'] = 'Ververs';
+$lang['The anomaly will be ignored until next application version'] = 'De onregelmatigheid wordt genegeerd tot de volgende versie';
+$lang['%d anomaly has been ignored.'] = '%d onregelmatigheid wordt genegeerd.';
+$lang['%d anomalies have been ignored.'] = '%d onregelmatigheden worden genegeerd.';
+$lang['Plugins which need upgrade'] = 'Plugins welke bijgewerkt moeten worden';
+$lang['Plugin list'] = 'Plugin lijst';
+$lang['Check for updates'] = 'Controleer op updates';
+$lang['Other plugins'] = 'Andere plugins';
+$lang['Last revisions'] = 'Lastste revisie';
+$lang['Are you sure you want to delete this plugin?'] = 'Weet U het zeker dat u deze plugin wilt verwijderen?';
+$lang['Are you sure you want to install this plugin?'] = 'Weet U het zeker dat u deze plugin wilt installeren?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Weet U het zeker dat u deze plugin wilt bijwerken? U moet controleren of deze versie niet gedeinstaleerd moet worden.';
+$lang['Plugin has been successfully copied'] = 'Plugin is succesvol gekopieerd';
+$lang['You might go to plugin list to install and activate it.'] = 'U zou naar de plugin-lijst kunnen gaan om de plugin te installeren en te activeren.';
+$lang['Can\'t create temporary file.'] = 'Kan geen tijdelijk bestand maken.';
+$lang['Can\'t download archive.'] = 'Kan geen archief downloaden.';
+$lang['Can\'t read or extract archive.'] = 'Kan het archief niet lezen of uitpakken.';
+$lang['An error occured during extraction (%s).'] = 'Een fout is opgetreden tijdens het uitpakken (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Controleer de "plugins" folder en de sub-folders permissies (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Kan niet met de server verbinden.';
+$lang['Purge compiled templates'] = 'Verwijder samengestelde sjablonen';
+$lang['Support'] = 'Piwigo Forum';
+$lang['Documentation'] = 'Documentatie';
+$lang['ACCESS_0'] = 'Vrije toegang';
+$lang['ACCESS_1'] = 'Toegang tot alles';
+$lang['ACCESS_2'] = 'Toegang tot geabonneerde';
+$lang['ACCESS_3'] = 'Toegang voor beheerders';
+$lang['ACCESS_4'] = 'Toegang voor webbeheerders';
+$lang['ACCESS_5'] = 'Geen toegang';
+$lang['A new version of Piwigo is available.'] = 'Een nieuwere versie van Piwigo is beschikbaar.';
+$lang['Piwigo Administration'] = 'Piwigo Beheer';
+$lang['Piwigo version'] = 'Piwigo versie';
+$lang['You are running the latest version of Piwigo.'] = 'U heeft de laatste versie van Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'De versie van %s [%s] die geïnstalleerd is is niet compatibel met de vereiste versie [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'U moet uw systeem bijwerken om volledig gebruik te kunnen maken van alle mogelijkheden van de software, anders kan de software niet goed werken, of helemaal niet';
+$lang['Deleted on'] = 'Verwijderd op';
+$lang['Last hit'] =  'Laaste hit';
+$lang['GD library is missing'] = 'GD library bestaat niet';
+$lang['Templates'] = 'Sjablonen';
+$lang['Extend for templates'] = 'Uitbreiding voor sjablonen';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 
+ 'Vervanging van de originele sjablonen door aangepaste sjablonen van sjabloon-extensie submap';
+$lang['Replacers (customized templates)'] = 'Vervangers (eigenbouw sjabloon)';
+$lang['Original templates'] = 'Originele sjabloontemplates';
+$lang['Optional URL keyword'] = 'Optionele URL sleutelwoord';
+$lang['Templates configuration has been recorded.'] = 'Sjabloon configuratie is vastgelegd.';
+$lang['All optimizations have been successfully completed.'] = 'Alle verbeteringen zijn succesvol afgerond.';
+$lang['Optimizations have been completed with some errors.'] = 'Verbeteringen zijn afgerond met enkele fouten.';
+$lang['Modify information'] = 'Aanpassen informatie';
+$lang['nothing'] = 'niets';
+$lang['overrides existing values with empty ones'] = 'overschrijft de bestaande waarden met lege waardes';
+$lang['Drag to re-order'] = 'Sleep om volgorde te veranderen';
+$lang['Quick Local Synchronization'] = 'Snelle lokale Synchronisatie';
+$lang['No photo can be deleted'] = 'Geen enkele foto kan verwijderd worden';
+$lang['Delete selected photos'] = 'Verwijder geselecteerde foto\'s';
+$lang['%d photo was deleted'] = '%d foto is verwijderd';
+$lang['%d photos were deleted'] = '%d foto\'s zijn verwijderd';
+$lang['Downloads'] = 'Downloads';
+$lang['Released on'] = 'Uitgegeven op';
+$lang['Number of downloads'] = 'Aantal downloads';
+$lang['Operation in progress'] = 'In behandeling.';
+$lang['Please wait...'] = 'Even geduld aub...';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Het corrigeren van de onregelmatigheid maakt een einde aan het negeren';
+$lang['Manage photo ranks'] = 'Bewerk de afbeeldingsrangen';
+$lang['Edit ranks'] = 'Bewerk de rangen';
+$lang['No photo in this album'] = 'Geen element in deze categorie';
+$lang['Images manual order was saved'] = 'De handmatige sortering van de afbeeldingen is bewaard';
+$lang['ranks'] = 'Rangen';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Aankondigings Nieuwsbrief';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Hou contact met het Piwigo project, abonneer u op de Piwigo Aankondigings Nieuwsbrief. Dan ontvangt u een email wanneer een nieuwe Piwigo-release beschikbaar komt, wanneer een belangrijke beveiligings bugfix nodig is of wanneer belangrijke ontwikkelingen binnen het Piwigo-project plaatsvinden. Alles bij elkaar een paar emails per jaar.';
+$lang['Subscribe %s'] = 'Abonneer %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonneer %s op de Piwigo Aankondigings Nieuwsbrief';
+$lang['Purge search history'] = 'Verwijder de Zoek-geschiedenis';
+$lang['Hide'] = 'Verberg';
+$lang['Password is missing. Please enter the password.'] = 'Wachtwoord ontbreekt. Geef uw wachtwoord aub.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Wachtwoord-bevestiging ontbreekt. Bevestig aub uw gekozen wachtwoord.';
+$lang['Allow users to edit their own comments'] = 'Sta toe dat gebruikers hun eigen commentaar kunnen bewerken';
+$lang['Allow users to delete their own comments'] = 'Sta toe dat gebruikers hun eigen comentaar kunnen verwijderen';
+$lang['Email administrators when a comment is modified'] = 'Stuur email naar de administrators wanneer een commentaar is gewijzigd';
+$lang['Email administrators when a comment is deleted'] = 'Stuur email naar de administrators wanneer een commentaar is verwijderd';
+$lang['Cannot delete the old permalink !'] = 'De oude permalink kan niet verwijderd worden !';
+$lang['Hit'] = 'Hit';
+$lang['Tools'] = 'Hulpmiddelen';
+$lang['Photos'] = 'Foto\'s';
+$lang['Themes'] = 'Thema\'s';
+$lang['Instructions to use Piwigo'] = 'Piwigo Gebruiks-instructies';
+$lang['Installed Themes'] = 'Geïnstalleerde thema\'s';
+$lang['Add New Theme'] = 'Nog niet geïnstaleerde thema\'s';
+$lang['Forbid this theme to users'] = 'Dit thema mag niet door gebruikers gebruikt worden';
+$lang['Set as default theme for unregistered and new users'] = 'Standaard thema voor niet geregisteerde and nieuwe gebruikers';
+$lang['unknown'] = 'onbekend';
+$lang['Upload Photos'] = 'Upload Foto\'s';
+$lang['Drop into album'] = 'Toevoegen aan categorie';
+$lang['+ Add an upload box'] = 'Voeg een upload-fregel toe';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Maak de "%s" directory aan vanuit de root van uw Piwigo-installatie';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Geef schrijfrechten (chmod 777) aan de "%s" directory vanuit de root van uw piwigo installatie';
+$lang['existing album'] = 'Bestaande categorie';
+$lang['create a new album'] = 'Maak een nieuwe categorie aan';
+$lang['Album name'] = 'Categorienaam';
+$lang['Album "%s" has been added'] = 'Categorie "%s" is toegevoegd';
+$lang['Uploaded Photos'] = 'Ge-uploade Foto\'s';
+$lang['%d photos uploaded'] = '%d foto\'s ge-uploaded';
+$lang['Privacy level set to "%s"'] = 'Privacy-niveau staat nu op "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Categorie "%s" bevat nu %d foto\'s';
+$lang['Manage this set of %d photos'] = 'Beheer deze reeks van %d foto\'s';
+$lang['Select files'] = 'Selecteer bestanden';
+$lang['Everybody'] = 'Iedereen';
+$lang['Who can see these photos?'] = 'Wie mag deze foto\'s zien?';
+$lang['Settings'] = 'Instellingen';
+$lang['Resize'] = 'Grootte aanpassen';
+$lang['Maximum Width'] = 'Maximum Breedte';
+$lang['pixels'] = 'pixels';
+$lang['Maximum Height'] = 'Maximum Hoogte';
+$lang['Image Quality'] = 'Afbeeldingskwaliteit';
+$lang['Save Settings'] = 'Bewaar instellingen';
+$lang['Your configuration settings are saved'] = 'Uw configuratie-instellingen zijn opgeslagen';
+$lang['Active Themes'] = 'Actieve Thema\'s';
+$lang['Add write access to the "%s" directory'] = 'Geef de "%s" directorie schrijfbevoegdheden';
+$lang['Administration Home'] = 'Administratie Startpagina';
+$lang['Change Admin Colors'] = 'Wijzig de Admin-kleuren';
+$lang['Delete this theme'] = 'Verwijder dit thema';
+$lang['Directory does not exist'] = 'Directorie bestaat niet';
+$lang['Download,'] = 'Download,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronisatie';
+$lang['Get Support on Piwigo Forum'] = 'Zoek/Krijg ondersteuning op het Piwigo gebruikers-forum';
+$lang['Help Me'] = 'Help';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Het is niet mogelijk dit thema te activeren, het basis-thema ontbreekt: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Het is niet mogelijk dit thema te verwijderen. Er zijn nog andere thema\'s die aan dit thema gekoppeld zijn: %s';
+$lang['Inactive Themes'] = 'Niet actieve Thema\'s';
+$lang['Install on your computer,'] = 'Installeer op uw computer,';
+$lang['Make this theme available to users'] = 'Maak dit thema beschikbaar voor gebruikers';
+$lang['Page end'] = 'Pagina-einde';
+$lang['Piwigo Uploader'] = 'Piwigo Uploader';
+$lang['Read Piwigo Documentation'] = 'Lees de Piwigo Documentatie';
+$lang['Start pLoader and add your photos.'] = 'Start pLoader en voeg uw foto\'s toe.';
+$lang['Switch to clear or dark colors for administration'] = 'Schakel om naar heldere of donkere kleuren voor de administratie';
+$lang['Theme has been successfully installed'] = 'Thema is succesvol geïnstalleerd';
+$lang['Visit Gallery'] = 'Bezoek Galerie';
+$lang['Visit Piwigo project website'] = 'Bezoek de website van het Piwigo project';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader is een afkorting van <em>Piwigo Uploader</em>. pLoader maakt uw foto\'s op uw computer klaar en zet ze dan over naar uw Piwigo fotogalerie.';
+$lang['Guest Settings'] = 'Bezoeker/Guest-Instellingen';
+$lang['Main Page'] = 'Hoofd-pagina';
+$lang['Photo Page'] = 'Foto-pagina';
+$lang['Activate Navigation Bar'] = 'Activeer de Navigatie-balk';
+$lang['Activate Navigation Thumbnails'] = 'Activeer de Navigatie-mini-afbeeldingen';
+$lang['Activate icon "%s"'] = 'Activeer icoon "%s"';
+$lang['Photo Properties'] = 'Foto-Eigenschappen';
+$lang['Allow user customization'] = 'Sta gebruikers-aanpassingen toe';
+$lang['Languages'] = 'Talen';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Uitvoerings-tijd overschreden, de afhandeling moet verder gaan [Geschatte tijd: %d seconden].';
+$lang['Installed Languages'] = 'Geïnstalleerde talen';
+$lang['Add New Language'] = 'Voeg een nieuwe taal toe';
+$lang['Language has been successfully installed'] = 'Taal is succesvol geïnstalleerd';
+$lang['Select:'] = 'Selecteer:';
+$lang['None'] = 'Geen';
+$lang['Invert'] = 'Inverteer';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Dit thema kan niet gedeactiveerd worden. Er moet minstens één thema geactiveerd zijn.';
+$lang['Webmaster status is required.'] = 'De status van de webbeheerder is noodzakelijk.';
+$lang['Bound Theme'] = 'Gebonden Thema';
+$lang['Allow rating'] = 'Waarderings-optie inschakelen';
+$lang['Select at least one comment'] = 'Minstens een commentaar selecteren';
+$lang['Active Plugins'] = 'Actieve Plugins';
+$lang['Inactive Plugins'] = 'Niet actieve Plugins';
+$lang['Missing Plugins'] = 'Missende Plugins';
+$lang['Uninstalled Plugins'] = 'Niet geïnstalleerde Plugins';
+$lang['By %s'] = 'Door %s';
+$lang['Visit plugin site'] = 'Bezoek de plugin site';
+$lang['Active Languages'] = 'Actieve talen';
+$lang['Delete this language'] = 'Verwijder deze taal';
+$lang['Forbid this language to users'] = 'Stel deze taal niet beschikbaar aan gebruikers';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Niet mogelijk om deze taal te deactiveren, stel eerst een andere taal in als standaardtaal.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Niet mogelijk om deze taal te deactiveren, er moet minstens één taal actief zijn.';
+$lang['Inactive Languages'] = 'Niet actieve talen';
+$lang['Make this language available to users'] = 'Stel deze taal beschikbaar aan gebruikers';
+$lang['Set as default language for unregistered and new users'] = 'Stel in als standaardtaal voor niet geregistreerde en nieuwe gebruikers';
+$lang['Miscellaneous'] = 'Diverse';
+$lang['Virtual Links'] = 'Virtuele Links';
+$lang['Add Photos'] = 'Afbeeldingen toevoegen';
+$lang['The following tag was deleted'] = 'De volgende tag werd verwijderd';
+$lang['There is no other language available.'] = 'Er is geen andere taal beschikbaar.';
+$lang['There is no other plugin available.'] = 'Er is geen andere plugin beschikbaar.';
+$lang['There is no other theme available.'] = 'Er is geen andere thema beschikbaar.';
+$lang['Add another set of photos'] = 'Een andere set afbeeldingen toevoegen';
+$lang['By rank'] = 'Op rank';
+$lang['Manual order'] = 'Handmatige volgorde';
+$lang['Order of menubar items has been updated successfully.'] = 'De volgorde van menu-items is succesvol aangepast.';
+$lang['This theme was not designed to be directly activated'] = 'Dit thema is niet ontworpen om direct geactiveerd te worden';
+$lang['Who can see this photo?'] = 'Wie mag deze afbeelding zien?';
+$lang['Pending Comments'] = 'Nog niet goedgekeurde commentaren';
+$lang['Menu Management'] = 'Menu';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'In uw php.ini bestand, de upload_max_filesize (%sB) is groter dan post_max_size (%sB), moet u deze instelling wijzigen';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension not available, admin should disable exif use';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Het geuploade bestand is groter dan de upload_max_filesize richtlijn in php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Het geuploade bestand is groter dan de MAX_FILE_SIZE richtlijn die is opgegeven in het HTML formulier';
+$lang['The uploaded file was only partially uploaded'] = 'Het geuploade bestand is slechts gedeeltelijk geupload';
+$lang['No file was uploaded'] = 'Er is geen bestand geupload';
+$lang['Missing a temporary folder'] = 'Er ontbreekt een tijdelijke map';
+$lang['Failed to write file to disk'] = 'Kan bestand niet naar schijf schrijven';
+$lang['File upload stopped by extension'] = 'Bestand upload gestopt door bestandsextensie';
+$lang['Unknown upload error'] = 'Onbekende upload fout';
+$lang['Error on file "%s" : %s'] = 'Fout in het bestand "%s" : %s';
+$lang['automatic order'] = 'automatische volgorde';
+$lang['manual order'] = 'handmatige volgorde';
+$lang['Albums automatically sorted'] = 'Albums automatisch gesorteerd';
+$lang['Batch Manager'] = 'Bulk beheerder';
+$lang['include child albums'] = 'include child albums';
+$lang['Selection'] = 'Selectie';
+$lang['Action'] = 'Actie';
+$lang['Set author'] = 'Stel auteur in';
+$lang['Set title'] = 'Stel titel in';
+$lang['Set creation date'] = 'Stel aanmaakdatum in';
+$lang['Apply action'] = 'Toepassen';
+$lang['on the %d selected photos'] = 'op de %d geselecteerde foto\'s';
+$lang['%d of %d photos selected'] = '%d van %d foto\'s geselecteerd';
+$lang['No photo selected, %d photos in current set'] = 'Geen foto geselecteerd, %d foto\'s in de huidige set';
+$lang['All %d photos are selected'] = 'Alle %d foto\'s zijn geselecteerd';
+$lang['remove this filter'] = 'Verwijder dit filter';
+$lang['Duplicates'] = 'duplicaten';
+$lang['Add a filter'] = 'Voeg een filter toe';
+$lang['Remove all filters'] = 'Verwijder alle filters';
+$lang['Refresh photo set'] = 'Vernieuwen foto set';
+$lang['The whole page'] = 'De hele pagina';
+$lang['The whole set'] = 'De hele set';
+$lang['No photo in the current set.'] = 'Geen foto in de huidige reeks.';
+$lang['No photo selected, no action possible.'] = 'Geen foto geselecteerd, geen actie mogelijk is.';
+$lang['Choose an action'] = 'Kies een actie';
+$lang['remove author'] = 'Verwijder auteur';
+$lang['Type here the author name'] = 'Typ hier de naam van de auteur';
+$lang['remove title'] = 'Verwijder titel';
+$lang['Type here the title'] = 'Typ hier de titel';
+$lang['remove creation date'] = 'verwijder aanmaakdatum';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extensie is niet beschikbaar, de administrator moet exif gebruik uitsluiten';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Het geuploade bestand is groter dan upload_max_filesize instelling in php.ini: %sB';
+$lang['include child albums'] = 'inclusief sub albums';
+$lang['Album photos associated to the following albums: %s'] = 'Fotoalbums verbonden met de volgende albums: %s';
+$lang['Delete orphan tags'] = 'Verwijder niet gebruikte labels';
+$lang['delete photo'] = 'verwijder afbeelding';
+$lang['Orphan tags deleted'] = 'Verwijderde niet gebruikte labels';
+$lang['Remove from caddie'] = 'Verwijder uit winkelwagen';
+$lang['Week starts on'] = 'De week begint op';
+$lang['You have %d orphan tags: %s.'] = 'U heeft %d niet gebruikte labels: %s.';
+$lang['Themes which need upgrade'] = 'Thema\'s die bijgewerkt moeten worden';
+$lang['Languages which need upgrade'] = 'Talen die bijgewerkt moeten worden';
+$lang['All themes are up to date.'] = 'Alle thema\'s zijn bijgewerkt.';
+$lang['All plugins are up to date.'] = 'Alle plugins zijn bijgewerkt.';
+$lang['All languages are up to date.'] = 'Alle talen zijn bijgewerkt.';
+$lang['Visit theme site'] = 'Bezoek de thema-webpagina';
+$lang['Visit language site'] = 'Bezoek de talen-webpagina';
+$lang['New Version'] = 'Nieuwe versie';
+$lang['Obsolete Plugins'] = 'Verouderde Plugins';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'WAARSCHUWING! Deze plugin lijkt niet compatibel met deze versie van Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Wilt u desondanks activeren?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DEZE PLUGIN IS NU ONDERDEEL VAN PIWIGO CORE! VERWIJDER DE PLUGIN NU.';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FOUT: DEZE PLUGIN MIST MAAR IS GEINSTALEERD! DEINSTALLEER DE PLUGIN NU.';
+$lang['Thumbnails generation in progress...'] = 'Bezig met genereren van thumbnails...';
+$lang['Photos generation in progress...'] = 'Bezig met hergenereren foto\'s...';
+$lang['%s photos have been regenerated'] = '%s foto\'s zijn hergegenereerd.';
+$lang['%s photos can not be regenerated'] = '%s foto\'s konden niet opnieuw gegenereerd worden.';
+$lang['display'] = 'toon';
+$lang['new'] = 'nieuw';
+$lang['No results'] = 'Geen resultaten';
+$lang['Searching...'] = 'Bezig met zoeken...';
+$lang['Type in a search term'] = 'Type een zoekterm in';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activeer "nieuw" pictogram naast albums en afbeeldingen';
+$lang['Deactivate all'] = 'Deactiveer alles';
+$lang['Default photos order'] = 'Standaard foto volgorde';
+$lang['Restore'] = 'Herstel';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Herstel de standaard instellingen. Je zal alle plugin instellingen kwijtraken!';
+$lang['Show menubar'] = 'Toon menubalk';
+$lang['Updates'] = 'Updates';
+$lang['Update in progress... Please wait.'] = 'Bezig met updaten... Even geduld aub';
+$lang['Ignore this update'] = 'Negeer deze update';
+$lang['Reset ignored updates'] = 'Reset genegeerde updates';
+$lang['Update All'] = 'Update Alles';
+$lang['ERROR'] = 'ERROR';
+$lang['Update Complete'] = 'Update klaar';
+$lang['Piwigo Update'] = 'Piwigo Update';
+$lang['Extensions Update'] = 'Uitbreidingen Update';
+$lang['All extensions are up to date.'] = 'Alle uitbreidingen zijn bijgewerkt.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'De volgende plugins zouden niet compatibel kunnen zijn met de nieuwe versie van Piwigo:';
+$lang['Add a criteria'] = 'Voeg een criterium toe';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'U kan geen standaard foto volgorde aanmaken, omdat u een aangepaste instelling in uw locale configuratie heeft.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'U heeft <i>$conf[\'order_by\']</i> in uw lokale configuratie bestand gespecificeerd. Deze parameter is verouderd, verwijder het of hernoem het naar <i>$conf[\'order_by_custom\']</i> !';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'De volgende thema\'s zijn mogelijk niet compatibel met de nieuwe versie van Piwigo:';
+$lang['I decide to update anyway'] = 'Ik besluit om alsnog te updaten';
+$lang['Update to Piwigo %s'] = 'Update naar Piwigo %s';
+$lang['Two updates are available'] = 'Twee updates zijn beschikbaar';
+$lang['This is a minor update, with only bug corrections.'] = 'Dit is een kleine update, met alleen wat gerepareerde foutjes.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Dit is een grote update, met <a href="%s">allerlei nieuwe mogelijkheden</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Sommige thema\'s en plugins zijn mogelijk nog niet beschikbaar.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'U kunt gelijk naar Piwigo %s updaten, zonder eerst up te daten naar Piwigo %s (aanbevolen).';
+$lang['Save Template Directory'] = 'Sla sjabloon direcotry op';
+$lang['Dump Database'] = 'Dump Database';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Gebruik geschiedenis data (Waarschuwing: het geheugen limiet van de server kan overschreden worden).';
+$lang['Unable to dump database.'] = 'Kan de database niet dumpen.';
+$lang['Some upgrades are available for extensions.'] = 'Er zijn sommige updates beschikbaar voor de plugins.';
+$lang['Ignore All'] = 'Negeer alles';
+$lang['Crop'] = 'Inkorten';
+$lang['Width'] = 'Breedte';
+$lang['Height'] = 'Hoogte';
+$lang['Follow Orientation'] = 'Volg orientatie';
+$lang['Graphics Library'] = 'Afbeeldings bibliotheek';
+$lang['Average rate'] = 'Gemiddelde waardering';
+$lang['Rate'] = 'Waardering';
+$lang['Learn more'] = 'Leer meer';
+$lang['An error has occured during upgrade.'] = 'Er is iets foutgegaan bij het bijwerken van Piwigo naar de nieuwste versie.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Er is iets foutgegaan bij het uitpakken. Controleer de bestandstoegangen van uw Piwigo-installatie.<br><a href="%s">Klik kier om de fout-logging weer te geven</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kan het upgrade-bestand niet van de server verkrijgen';
+$lang['... or '] = '... of ';
+$lang['Create'] = 'Aanmaken';
+$lang['Start Upload'] = 'Start Upload';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Je gebruikt de Flash uploader. Problemen? Probeer de <a href="%s">Browser uploader</a> inplaats.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Je gebruikt de Browser uploader. Problemen? Probeer de  <a href="%s">Flash uploader</a> inplaats.';
+$lang['Maximum file size: %sB.'] = 'Maximum bestands omvang: %sB.';
+$lang['Allowed file types: %s.'] = 'Toegestane bestands typen: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Geschatte maximale resolutie: %dM pixels (dat is %dx%d pixels).';
+$lang['Manage Permissions'] = 'Beheer Permissies';
+$lang['Photo %s of %s'] = 'Foto %s of %s';
+$lang['show details'] = 'Toon details';
+$lang['hide details'] = 'Verberg details';
+$lang['Merge tags'] = 'Voeg tags samen';
+$lang['Select the destination tag'] = 'Kies de bestemmings tag';
+$lang['(this tag will be deleted)'] = '(Deze tag wordt verwijderd)';
+$lang['Confirm merge'] = 'Bevestig samenvoegen';
+$lang['Merge selected tags'] = 'Voeg geselecteerde tags samen';
+$lang['No destination tag selected'] = 'Geen bestemmings tag geselecteerd';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tags <em>%s</em> samengevoegd in tag <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Selecteer ten minste twee tags om samen te voegen';
+$lang['Select an album'] = 'Kies een album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Standaard zal Piwigo een nieuwe web formaat foto aanmaken van de HD (high definition) versie van je foto.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Als geen HD beschikbaar is en de huidige web formaat foto is groter dan de nieuwe afmetingen, dan zal Piwigo het als HD gebruiken en daar een web formaat foto van maken.';
+$lang['Zoom'] = 'Zoom';
+$lang['%s has been successfully updated.'] = '%s is geupdated.';
+$lang['Add tags'] = 'Voeg tags toe';
+$lang['Add to caddie'] = 'Voeg toe aan het winkelmandje';
+$lang['Last import'] = 'Laatste import';
+$lang['Predefined filter'] = 'Voorgedefinieerd filter';
+$lang['With no album'] = 'Zonder album';
+$lang['With no tag'] = 'Zonder tag';
+$lang['With no virtual album'] = 'Zonder virtueel album';
+$lang['Photo name'] = 'Naam van afbeelding';
+$lang['Activate comments'] = 'Activeer onderschriften';
+$lang['Default comments order'] = 'Standaard onderschriften volgorde';
+$lang['Send connection settings by email'] = 'Verstuur verbindings instellingen per email';
+$lang['The original image quality must be a number between %d and %d'] = 'De kwaliteit van de originele afbeelding moet een nummer zijn tussen %d en %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'De originele maximum grootte moet een nummer zijn tussen %d en %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'De originele maximum breedte moet een nummer zijn tussen %d en %d';
+$lang['Resize after upload'] = 'Wijzig het formaat na uploaden';
+$lang['Original Size'] = 'Originele formaat';
+$lang['A locked gallery is only visible to administrators'] = 'Een gesloten galerij is alleen zichtbaar voor administratoren';
+$lang['Unlock gallery'] = 'Open gallerij';
+$lang['Gallery unlocked'] = 'Gallerij geopend';
+$lang['Notify administrators when a comment is'] = 'Houd administaroten op de hoogte als een comment';
+$lang['modified'] = 'gewijzigd is';
+$lang['pending validation'] = 'wacht op validatie';
+$lang['Save visits in history for'] = 'Sla bezoeken op in geschiedenis voor';
+$lang['simple visitors'] = 'gewone bezoekers';
+$lang['registered users'] = 'geregistreerde gebruikers';
+$lang['administrators'] = 'administratoren';
+$lang['This album contains %d photos, added on %s.'] = 'Dit album bevat %d foto\'s, toegevoegd op %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Dit album bevat %d foto\'s, toegevoegd tussen %s en %s.';
+$lang['This album contains no photo.'] = 'Dit album bevat geen foto\'s.';
+$lang['Not cropped correctly?'] = 'Niet goed bijgesneden?';
+$lang['Center of interest'] = 'Middelpunt van belangstelling';
+$lang['Move to album'] = 'Verplaats naar album';
+$lang['You can activate only one mobile theme.'] = 'U kunt slechts een mobiel thema activeren.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo voor Android</ em> applicatie stelt u in staat uw Piwigo galerie te openen vanaf uw Android-telefoon, een aantal albums aan te maken en meerdere foto\'s tegelijk te uploaden.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo voor IOS</ em> applicatie stelt u in staat uw Piwigo galerie te openen vanaf uw iPhone, iPad of iPod Touch, een aantal albums aan te maken en meerdere foto\'s tegelijk te uploaden.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom is een fotografie-software ontworpen om grote hoeveelheden digitale foto\'s te verwerken en het verrichten van post-productie werk.';
+$lang['Applications'] = 'Toepassingen';
+$lang['apply automatic sort order'] = 'automatische sorteervolgorde toepassen';
+$lang['Automatic sort order'] = 'Automatische sorteervolgorde';
+$lang['Available on'] = 'Beschikbaar voor';
+$lang['Available versions for'] = 'Beschikbare versies voor';
+$lang['cancel manual order'] = 'Annuleer handmatige volgorde';
+$lang['Cancel'] = 'Annuleer';
+$lang['List'] = 'Lijst';
+$lang['Piwigo for Android'] = 'Piwigo voor Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo voor iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish plugin voor Lightroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo Publish plugin voor Shotwell';
+$lang['Save manual order'] = 'Bewaar handmatige volgorde';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell is een open source digitale foto organizer die draait op Linux. Het is de standaard foto-manager in Ubuntu en Fedora.';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Het bestand of de map kan niet worden geopend (of het bestaat niet of de toegang wordt geweigerd)';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Met de Piwigo Publish plugin kunt u foto\'s direct vanuit Lightroom naar uw Piwigo fotogalerie exporteren en synchroniseren.';
+$lang['Web Form'] = 'webformulier';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u gebruikers hebben automatisch recht, omdat ze tot een groep behoren die rechten heeft.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture is een krachtig gereedschap om foto\'s te te beheren en verbeteren op een Mac .';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture is gemaakt voor proferssionele fotografen met iPhoto gemak.';
+$lang['Apply watermark if height is bigger than'] = 'Breng watermerk aan, als de hoogte groter is dan';
+$lang['Apply watermark if width is bigger than'] = 'Breng watermerk aan, als de breedte groter is dan';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Standaard, is het centrum van belangstelling in het midden van de foto geplaatst';
+$lang['Delete multiple size images'] = 'Verwijder meerdere formaat plaatjes';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Kenmerken omvatten galerie browsen, album maken en foto\'s uploaden.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Voor bijgesneden fotoformaten, probeert Piwigo het centrum van belangstelling in te voegen.   ';
+$lang['Generate multiple size images'] = 'Genereer meerdere formaat plaatjes';
+$lang['Groups and users'] = 'Groepen en gebruikers';
+$lang['No group is permitted to see this private album'] = 'Geen enkele groep heeft rechten om dit album te zien';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Onder Linux, installeer Shotwell met de package manager, en activeer de Piwigo publicatie optie.';
+$lang['Opacity'] = 'Transparantie';
+$lang['Permission granted for groups'] = 'Rechten toegewezen voor groepen';
+$lang['Permission granted for users'] = 'Rechten toegewezen aan gebruikers';
+$lang['Permission management'] = 'Rechten beheer';
+$lang['Photo sizes with crop'] = 'Bijgesneden foto formaten';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo export plugin voor Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo export plugin voor iPhoto';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publicatie plugin voor digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) is een open source (GPL v3) Piwigo client voor Android.';
+$lang['Select a file'] = 'Kies een bestand';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Selecteer met de muis een gebied als nieuw centrum van belangstelling.';
+$lang['Select groups...'] = 'Selecteer groepen...';
+$lang['Select users...'] = 'Kies gebruikers...';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'De Piwigo export plugin, maakt het mogelijk om albums te maken en foto\'s te exporteren.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Het centrum van belangstelling is het belangrijkste gedeelte van de foto.';
+$lang['There is no group in this gallery.'] = 'Er is geen groep in deze gallerie';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Om foto\'s van digiKam naar Piwigo te exporteren, installeer de digiKam en Kipi-plugins.';
+$lang['X Position'] = 'X positie';
+$lang['X Repeat'] = 'X herhalen';
+$lang['Y Position'] = 'Y positie';
+$lang['add a new watermark'] = 'Voeg een nieuw watermerk toe';
+$lang['any visitor can see this album'] = 'elke bezoeker kan dit album zien';
+$lang['bottom left corner'] = 'hoek links onder';
+$lang['bottom right corner'] = 'hoek rechts onder';
+$lang['custom'] = 'Aangepast';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam is geavanceerde digitale foto gratis beheersoftware voor Linux, Windows en MacOSX.  ';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digKam is voor fotografen die foto\'s willen bekijken, behren, bewerken en delen. ';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto is de standaard foto manager onder MacOSX. De Piwigo export plugin makt het aanmaken van albums en het exporteren van foto\'s mogelijk, van iPhoto naar de Piwigo gallerie';
+$lang['include photos with lower privacy level'] = 'Inclusief foto\'s met een lager rechten niveau ';
+$lang['middle'] = 'midden';
+$lang['top left corner'] = 'hoek links boven';
+$lang['top right corner'] = 'hoek rechts boven';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'bezoekers moeten inloggen en de juiste rechten hebben om dit album te zien';
+$lang['Multiple Size'] = 'Verschillende formaten';
+?>
Index: tags/2.4.0RC3/language/nl_NL/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Nederlands [NL]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=429
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Dutch';
+$lang_info['country'] = 'Nederland';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'nl';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d categorie bijgewerkt';
+$lang['%d albums updated'] = '%d categorieën bijgewerkt';
+$lang['%d comment to validate'] = '%d commentaar voor validatie';
+$lang['%d comments to validate'] = '%d commentaren voor validatie';
+$lang['%d new comment'] = '%d nieuw commentaar';
+$lang['%d new comments'] = '%d nieuw commentaar';
+$lang['%d comment'] = '%d commentaar';
+$lang['%d comments'] = '%d commentaren';
+$lang['%d hit'] = '%d bezoeker';
+$lang['%d hits'] = '%d bezoekers';
+$lang['%d new photo'] = '%d nieuwe afbeelding';
+$lang['%d new photos'] = '%d nieuwe afbeeldingen';
+$lang['%d new user'] = '%d nieuwe gebruiker';
+$lang['%d new users'] = '%d nieuwe gebruikers';
+$lang['About'] = 'Over';
+$lang['All tags'] = 'Alle tags';
+$lang['Any tag'] = 'Elke tag';
+$lang['At least one listed rule must be satisfied.'] = 'Op zijn minst moet aan één regel worden voldaan.';
+$lang['Author'] = 'Maker';
+$lang['Albums'] = 'Categorieën';
+$lang['Album'] = 'Categorie';
+$lang['Close this window'] = 'Sluit dit venster';
+$lang['Complete RSS feed (photos, comments)'] = 'Complete RSS feed (afbeeldingen, commentaren)';
+$lang['Confirm Password'] = 'Bevestig wachtwoord';
+$lang['Connection settings'] = 'Verbindings-instellingen';
+$lang['Login'] = 'Aanmelden';
+$lang['Contact webmaster'] = 'Neem contact op met de webbeheerder';
+$lang['Create a new account'] = 'Maak een nieuw account aan';
+$lang['Created on'] = 'Aangemaakt op';
+$lang['Creation date'] = 'Aanmaakdatum';
+$lang['Current password is wrong'] = 'Huidig wachtwoord is niet juist';
+$lang['Dimensions'] = 'Dimensies';
+$lang['Display'] = 'Weergeven';
+$lang['Each listed rule must be satisfied.'] = 'Aan elke weergegeven regel moet worden voldaan.';
+$lang['Email address is missing. Please specify an email address.'] = 'Email-adres is niet ingevuld';
+$lang['Email address'] = 'Email-adres';
+$lang['Enter your personnal informations'] = 'Vul uw persoonlijke informatie in';
+$lang['Error sending email'] = 'Fout bij het versturen van email';
+$lang['File name'] = 'Bestandsnaam';
+$lang['File'] = 'Bestand';
+$lang['Filesize'] = 'Bestandsgrootte';
+$lang['Filter and display'] = 'Filteren en tonen';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Wachtwoord vergeten?';
+$lang['Go through the gallery as a visitor'] = 'Ga naar de galerie als gast';
+$lang['Help'] = 'Help';
+$lang['Identification'] = 'Administratie';
+$lang['Photos only RSS feed'] = 'Alleen RSS feed mbt afbeeldingen';
+$lang['Keyword'] = 'Sleutelwoord';
+$lang['Links'] = 'Links';
+$lang['N/A'] = 'Niet bekend';
+$lang['New on %s'] = 'Nieuw op %s';
+$lang['Notification'] = 'Meldingen';
+$lang['Number of items'] = 'Aantal items';
+$lang['Original dimensions'] = 'Originele dimensies';
+$lang['Password forgotten'] = 'Wachtwoord vergeten';
+$lang['Password'] = 'Wachtwoord';
+$lang['Post date'] = 'Plaatsingsdatum';
+$lang['Posted on'] = 'Geplaatst op';
+$lang['Profile'] = 'Profiel';
+$lang['Quick connect'] = 'Snel verbinden';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Register'] = 'Registreren';
+$lang['Registration'] = 'Registratie';
+$lang['Related tags'] = 'Aanverwante tags';
+$lang['Reset'] = 'Reset';
+$lang['Retrieve password'] = 'Ontvang nieuw wachtwoord';
+$lang['Search rules'] = 'Zoekregels';
+$lang['Search tags'] = 'Zoek tags';
+$lang['Search'] = 'Zoeken';
+$lang['display available tags'] = 'Toon beschikbare tags';
+$lang['Since'] = 'Sinds';
+$lang['Sort by'] = 'Sorteren op';
+$lang['Sort order'] = 'Sorteervolgorde';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tags';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'De RSS feed geeft meldingen als er nieuws is op deze website: nieuwe afbeeldingen, bijgewerkte categorieën, nieuw commentaar. Gebruik hiervoor een rss lezer.';
+$lang['Unknown feed identifier'] = 'Onbekende feed identifier';
+$lang['User comments'] = 'Gebruikers-commentaar';
+$lang['Username'] = 'Gebruikersnaam';
+$lang['Visits'] = 'Bezoeken';
+$lang['Webmaster'] = 'Webbeheerder';
+$lang['Week %d'] = 'Week %d';
+$lang['About Piwigo'] = 'Over Piwigo';
+$lang['You are not authorized to access the requested page'] = 'U heeft geen rechten voor de opgevraagde pagina';
+$lang['add this photo to your favorites'] = 'Voeg deze afbeelding toe aan uw favorieten';
+$lang['Administration'] = 'Beheer';
+$lang['all'] = 'alle';
+$lang['ascending'] = 'Oplopend';
+$lang['author(s) : %s'] = 'Maker(s) : %s';
+$lang['Expand all albums'] = 'Toon alle categorieën';
+$lang['posted after %s (%s)'] = 'geplaatst na %s (%s)';
+$lang['posted before %s (%s)'] = 'geplaatst voor %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'geplaatst tussen %s (%s) en %s (%s)';
+$lang['posted on %s'] = 'geplaatst op %s';
+$lang['Best rated'] = 'Beste gewaardeerd';
+$lang['display best rated photos'] = 'Weergeven van de hoogst gewaardeerde afbeeldingen';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Alle';
+$lang['display each day with photos, month per month'] = 'Weergeven elke dag met afbeelding, maand per maand';
+$lang['View'] = 'Bekijk';
+$lang['chronology_monthly_calendar'] = 'Maand-kalender';
+$lang['chronology_monthly_list'] = 'Maand-lijst';
+$lang['chronology_weekly_list'] = 'Week-lijst';
+$lang['Click here if your browser does not automatically forward you'] = 'Klik hier als uw browser u niet doorstuurt';
+$lang['comment date'] = 'Commentaar-datum';
+$lang['Comment'] = 'Commentaar';
+$lang['Your comment has been registered'] = 'Uw commentaar is geregistreerd';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood systeem : u moet even wachten voordat u weer nieuw commentaar kunt plaatsen';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Uw commentaar is NIET geregistreerd omdat de validatie-regels de plaatsing voorkwam';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Een beheerder moet uw commentaar goedkeuren voordat het zichtbaar wordt.';
+$lang['This login is already used by another user'] = 'Deze gebruikersnaam is al in gebruik';
+$lang['Comments'] = 'Commentaren';
+$lang['Add a comment'] = 'Voeg commentaar toe';
+$lang['created after %s (%s)'] = 'Gemaakt na %s (%s)';
+$lang['created before %s (%s)'] = 'Gemaakt voor %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Gemaakt tussen %s (%s) en %s (%s)';
+$lang['created on %s'] = 'gemaakt op %s';
+$lang['Customize'] = 'Profiel aanpassen';
+$lang['Your Gallery Customization'] = 'Uw galerie aanpassen ';
+$lang['day'][0] = 'Zondag';
+$lang['day'][1] = 'Maandag';
+$lang['day'][2] = 'Dinsdag';
+$lang['day'][3] = 'Woensdag';
+$lang['day'][4] = 'Donderdag';
+$lang['day'][5] = 'Vrijdag';
+$lang['day'][6] = 'Zaterdag';
+$lang['Default'] = 'Standaard';
+$lang['delete this photo from your favorites'] = 'Verwijder deze afbeelding van uw favorieten';
+$lang['Delete'] = 'Verwijderen';
+$lang['descending'] = 'Aflopend';
+$lang['Download'] = 'Download';
+$lang['Download this file'] = 'download dit bestand';
+$lang['edit'] = 'Wijzig';
+$lang['wrong date'] = 'verkeerde datum';
+$lang['excluded'] = 'uitsluiten';
+$lang['Your favorites'] = 'Mijn favorieten';
+$lang['display your favorites photos'] = 'toon mijn favoriete afbeeldingen';
+$lang['Favorites'] = 'Favorieten';
+$lang['First'] = 'Eerste';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'De galerie is in onderhoud. Probeer het later nog eens.';
+$lang['Page generated in'] = 'Pagina gegenereerd in';
+$lang['guest'] = 'gast';
+$lang['Hello'] = 'Hallo';
+$lang['available for administrators only'] = 'Alleen voor beheerders';
+$lang['display this album'] = 'Toont afbeeldingen van het begin van de categorie';
+$lang['display last user comments'] = 'Bekijk de laatste gebruikerscommentaren';
+$lang['customize the appareance of the gallery'] = 'Weergave van de galerie aanpassen';
+$lang['search'] = 'zoeken';
+$lang['Home'] = 'Startpagina';
+$lang['Identification'] = 'Administratie';
+$lang['in this album'] = 'in deze categorie';
+$lang['in %d sub-album'] = 'in %d sub-categorie';
+$lang['in %d sub-albums'] = 'in %d sub-categorieën';
+$lang['included'] = 'inclusief';
+$lang['Invalid password!'] = 'Verkeerd wachtwoord!';
+$lang['Language'] = 'Taal';
+$lang['last %d days'] = 'laaste %d dagen';
+$lang['Last'] = 'Laatste';
+$lang['Logout'] = 'Afmelden';
+$lang['obligatory'] = 'verplicht';
+$lang['Maximum photo height'] = 'Maximale hoogte van de afbeelding';
+$lang['Maximum height must be a number superior to 50'] = 'Maximale hoogte moet meer zijn dan 50';
+$lang['Maximum photo width'] = 'Maximale breedte van de afbeelding';
+$lang['Maximum width must be a number superior to 50'] = 'Maximale breedte moet meer zijn dan 50';
+$lang['display a calendar by creation date'] = 'Toon afbeeldingen gesorteerd op aanmaakdatum';
+$lang['display all photos in all sub-albums'] = 'Toon alle afbeeldingen in alle sub-categorieën';
+$lang['return to normal view mode'] = 'Terug naar de standaardweergave';
+$lang['display a calendar by posted date'] = 'Toon afbeeldingen gesorteerd op plaatsingsdatum';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'December';
+$lang['month'][1] = 'Januari';
+$lang['month'][2] = 'Februari';
+$lang['month'][3] = 'Maart';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Mei';
+$lang['month'][6] = 'Juni';
+$lang['month'][7] = 'Juli';
+$lang['month'][8] = 'Augustus';
+$lang['month'][9] = 'September';
+$lang['Most visited'] = 'Meest bekeken';
+$lang['display most visited photos'] = 'Toon de meest bekeken afbeeldingen';
+$lang['The number of photos per page must be a not null scalar'] = 'Het aantal afbeeldingen per pagina mag geen ongeldige deling zijn';
+$lang['Number of photos per page'] = 'Aantal afbeeldingen per pagina';
+$lang['Unknown identifier'] = 'Onbekend herkenningsteken';
+$lang['New password'] = 'Nieuw wachtwoord';
+$lang['Rate this photo'] = 'Waardeer deze afbeelding';
+$lang['Next'] = 'Volgende';
+$lang['no rate'] = 'geen waardering';
+$lang['Photos posted within the last %d day.'] = 'Toon alleen afbeeldingen geplaatst op de laatste %s dag.';
+$lang['Photos posted within the last %d days.'] = 'Toon alleen afbeeldingen de laatste %s dagen geplaatst.';
+$lang['password updated'] = 'wachtwoord bijgewerkt';
+$lang['Recent period must be a positive integer value'] = 'Recente periode moet een positieve waarde zijn';
+$lang['photo'] = 'afbeelding';
+$lang['Click on the photo to see it in high definition'] = 'Klik op de afbeelding om het te bekijken in een groter formaat';
+$lang['Show file metadata'] = 'Toon bestands metadata';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Voorkeuren';
+$lang['Previous'] = 'Vorige';
+$lang['Random photos'] = 'Willekeurige afbeeldingen';
+$lang['display a set of random photos'] = 'Toon een set van willekeurige afbeeldingen';
+$lang['Recent albums'] = 'Recente categorieën';
+$lang['display recently updated albums'] = 'toon recentelijk bijgewerkte categorieën';
+$lang['Recent period'] = 'Recente periode (aantal dagen)';
+$lang['Recent photos'] = 'Recente afbeeldingen';
+$lang['display most recent photos'] = 'toon meest recente afbeeldingen';
+$lang['Redirection...'] = 'doorsturen...';
+$lang['Please, enter a login'] = 'Vul uw gebruikersnaam in aub.';
+$lang['login mustn\'t end with a space character'] = 'Gebruikersnaam mag niet eindigen met een spatie';
+$lang['login mustn\'t start with a space character'] = 'Gebruikersnaam mag niet beginnen met een spatie';
+$lang['this login is already used'] = 'Deze gebruikersnaam is al in gebruik';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'email-adres moet zijn xxx@yyy.eee (bijvoorbeeld : jack@altern.org)';
+$lang['please enter your password again'] = 'vul uw wachtwoord nogmaals in';
+$lang['Auto login'] = 'Auto login';
+$lang['remove this tag from the list'] = 'Verwijder deze tag van de lijst';
+$lang['representative'] = 'representatief';
+$lang['Search for Author'] = 'Zoek naar maker';
+$lang['Search in albums'] = 'Zoeken in categorieën';
+$lang['Search by date'] = 'Zoeken op datum';
+$lang['Date'] = 'Begindatum';
+$lang['End-Date'] = 'Einddatum';
+$lang['Kind of date'] = 'Datumtype';
+$lang['Search for words'] = 'Zoek naar hele woorden';
+$lang['Search for all terms'] = 'Zoeken naar alle woorden';
+$lang['Search for any term'] = 'Zoeken naar een woord';
+$lang['Empty query. No criteria has been entered.'] = 'Lege zoekopdracht. Er is niets ingevuld.';
+$lang['Search results'] = 'Zoekresultaten';
+$lang['Search in sub-albums'] = 'Zoeken in sub-categorieën';
+$lang['searched words : %s'] = 'zoekwoorden : %s';
+$lang['Contact'] = 'Contact';
+$lang['set as album representative'] = 'Stel in als standaard categorie';
+$lang['Show number of comments'] = 'Toon aantal commentaren';
+$lang['Show number of hits'] = 'Toon aantal bezoekers';
+$lang['slideshow'] = 'Diavoorstelling';
+$lang['stop the slideshow'] = 'Stop de diavoorstelling';
+$lang['Specials'] = 'Speciaal';
+$lang['SQL queries in'] = 'SQL queries in';
+$lang['display only recently posted photos'] = 'Toon alleen de recent geplaatste afbeeldingen';
+$lang['return to the display of all photos'] = 'Toon alle afbeeldingen';
+$lang['the beginning'] = 'het begin';
+$lang['Interface theme'] = 'Thema';
+$lang['Thumbnails'] = 'Mini-afbeeldingen';
+$lang['Menu'] = 'Menu';
+$lang['A comment on your site'] = 'Commentaar op uw site';
+$lang['today'] = 'vandaag';
+$lang['Update your rating'] = 'Werk uw waardering bij';
+$lang['the username must be given'] = 'de gebruikersnaam moet ingevuld zijn';
+$lang['useful when password forgotten'] = 'handig indien u uw wachtwoord bent vergeten';
+$lang['Quick search'] = 'Snel zoeken';
+$lang['Connected user: %s'] = 'Aangemeld als gebruiker: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Browser: %s';
+$lang['Author: %s'] = 'Maker: %s';
+$lang['Comment: %s'] = 'Commentaar: %s';
+$lang['Comment by %s'] = 'Commentaar van %s';
+$lang['User: %s'] = 'Gebruiker: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Beheerder: %s';
+$lang['Registration of %s'] = 'Registratie van %s';
+$lang['Album: %s'] = 'Categorie: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Foutieve status voor gebruiker "guest", gebruik standaard status. Waarschuw de webbeheerder.';
+$lang['this email address is already in use'] = 'Een andere gebruiker maakt al gebruik van dit email-adres';
+$lang['Album results for'] = 'Categorie resultaten voor';
+$lang['Tag results for'] = 'Tag resultaten voor';
+$lang['from %s to %s'] = 'van %s tot %s';
+$lang['Play of slideshow'] = 'Diavoorstelling afspelen';
+$lang['Pause of slideshow'] = 'Diavoorstelling pauzeren';
+$lang['Repeat the slideshow'] = 'Diavoorstelling herhalen';
+$lang['Not repeat the slideshow'] = 'Diavoorstelling niet herhalen';
+$lang['Reduce diaporama speed'] = 'Diavoorstelling langzamer';
+$lang['Accelerate diaporama speed'] = 'Diavoorstelling sneller';
+$lang['Submit'] = 'Bevestig';
+$lang['Yes'] = 'Ja';
+$lang['No'] = 'Nee';
+$lang['%d photo']='%d afbeelding';
+$lang['%d photos']='%d afbeeldingen';
+$lang['%d photo is also linked to current tags'] = '%d afbeelding is ook gelinkt aan de actuele tags';
+$lang['%d photos are also linked to current tags'] = '%d afbeeldingen zijn ook gelinkt aan de actuele tags';
+$lang['display photos linked to this tag'] = 'Toon afbeeldingen gelinkt met deze tag';
+$lang['photos posted during the last %d days'] = 'Afbeeldingen de afgelopen %d dagen ontvangen';
+$lang['Piwigo Help'] = 'Piwigo Help';
+$lang['Are you sure?'] = 'Weet u het zeker?';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'gegroepeerd per letter';
+$lang['letters'] = 'letters';
+$lang['show tag cloud'] = 'Geef tag-wolk weer';
+$lang['cloud'] = 'wolk';
+$lang['Reset to default values'] = 'Reset naar standaardwaarden';
+$lang['delete all photos from your favorites'] = 'verwijder alle afbeeldingen van uw favorieten';
+$lang['Sent by'] = 'Verstuurd door';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies worden geblokkeerd of worden niet ondersteund door uw browser. Om verbinding te kunnen maken dient u er voor te zorgen dat het gebruik van cookies mogelijk is.';
+$lang['Edit a comment'] = 'een commentaar wijzigen';
+$lang['(!) This comment requires validation'] = '(!) Dit commentaar moet nog gevalideerd worden';
+$lang['Welcome'] = 'Welkom';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Welkom bij uw Piwigo afbeeldingengalerie!';
+$lang['... or browse your empty gallery'] = '... of blader door uw lege galerie';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... of deactiveer deze boodschap aub, Ik vind mijn weg zelf wel';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %s, uw Piwigo afbeeldingengalerie is leeg!';
+$lang['I want to add photos'] = 'Ik wil afbeeldingen toevoegen';
+$lang['Manage this user comment: %s'] = 'Valideer het volgende gebruikers-commentaar: %s';
+$lang['This author modified following comment:'] = 'Deze bewerker wijzigde het volgende commentaar:';
+$lang['This author removed the comment with id %d'] = 'Deze bewerker verwijderde het commentaar met id %d';
+$lang['html tags are not allowed in login'] = 'html tags zijn niet toegestaan in login';
+$lang['%d rates'] = '%d stemmen';
+$lang['Rating score'] = 'Waarderings score';
+$lang['Invalid username or email'] = 'Gebruikersnaam of e-mailadres is ongeldig';
+$lang['Password reset is not allowed for this user'] = 'Deze gebruiker heeft geen toestemming om het paswoord te vernieuwen';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Gebruiker "%s" heeft geen e-mailadres daarom kan het paswoord niet vernieuwd worden';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Iemand heeft verzocht om het paswoord te vernieuwen voor het volgende account:';
+$lang['Username "%s" on gallery %s'] = 'Gebruikersnaam "%s" voor gallery %s';
+$lang['To reset your password, visit the following address:'] = 'Om je paswoord te vernieuwen kun je het volgende adres bezoeken:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Als dit een vergissing was kun je deze e-mail negeren, er zal dan niets gewijzigd worden.';
+$lang['Password Reset'] = 'Vernieuw paswoord';
+$lang['Check your email for the confirmation link'] = 'Kijk in je mail box voor de bevestigings link';
+$lang['Invalid key'] = 'Onjuiste sleutel';
+$lang['The passwords do not match'] = 'De paswoorden zijn niet gelijk';
+$lang['Your password has been reset'] = 'Uw paswoord is vernieuwd';
+$lang['Return to home page'] = 'Keer terug naar de home page';
+$lang['Please enter your username or email address.'] = 'Voer je gebruikersnaam en e-mailadres in.';
+$lang['You will receive a link to create a new password via email.'] = 'Via e-mail krijgt u een link om uw paswoord te vernieuwen.';
+$lang['Username or email'] = 'Gebruikersnaam of e-mail';
+$lang['Change my password'] = 'Vernieuw mijn paswoord';
+$lang['Enter your new password below.'] = 'Voer hieronder je nieuwe paswoord in.';
+$lang['EXIF Metadata'] = 'EXIF Metagegevens';
+$lang['IPTC Metadata'] = 'IPTC Metagegevens';
+$lang['Edit'] = 'Wijzig';
+$lang['large'] = 'groot';
+$lang['medium'] = 'middel';
+$lang['Original'] = 'origineel';
+$lang['small'] = 'klein';
+$lang['square'] = 'vierkant';
+$lang['thumb'] = 'thumb';
+$lang['xlarge'] = 'extra-groot';
+$lang['xxlarge'] = 'extra-extra-groot';
+$lang['Hello %s,'] = 'Hallo %s,';
+$lang['Here are your connection settings'] = 'Dit zijn uw verbindings-instellingen';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Indien u denkt dat er iets niet klopt nu u deze email ontvangt, vragen wij u contact met ons op te nemen op %s ';
+$lang['Password: %s'] = 'Wachtwoord %s';
+$lang['Send my connection settings by email'] = 'Verstuur mijn verbindings-instellingen per email';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'U bent succesvol geregistreerd. U ontvangt op korte termijn een email met uw verbindings-instellingen. Welkom!';
+$lang['Thank you for registering at %s!'] = 'Bedankt voor uw registratie bij %s';
+$lang['Username modification'] = 'Gebruikersnaam wijziging';
+$lang['Username: %s'] = 'Gebruikersnaam %s';
+$lang['Your username has been successfully changed to : %s'] = 'Uw gebruikersnaam is succesvol gewijzigd in: %s';
+$lang['Show oldest comments first'] = 'Toon oudste commentaren eerst';
+$lang['Show latest comments first'] = 'Toon nieuwste commentaren eerst';
+$lang['Photo sizes'] = 'Afbeeldingsgroottes';
+$lang['View in'] = 'Bekijk in';
+$lang['Mobile'] = 'Mobiel';
+$lang['Desktop'] = 'Bureaublad';
+$lang['2small'] = 'extra-extra-klein';
+$lang['Date created, new &rarr; old'] = 'Aanmaakdatum, nieuw &rarr; oud';
+$lang['Date created, old &rarr; new'] = 'Aanmaakdatum, oud &rarr; nieuw';
+$lang['Date posted, new &rarr; old'] = 'Datum geplaatst, nieuw &rarr; oud';
+$lang['Date posted, old &rarr; new'] = 'Datum geplaatst, oud &rarr; nieuw';
+$lang['File name, A &rarr; Z'] = 'Bestandsnaam, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Bestandsnaam, Z &rarr; A';
+$lang['Manual sort order'] = 'Handmatige sorteervolgorde';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numerieke aanduiding, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numerieke aanduiding, 0 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Afbeeldingtitel, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Afbeeldingtitel, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Waardering, hoog &rarr; laag';
+$lang['Rating score, low &rarr; high'] = 'Waardering, laag &rarr; hoog';
+$lang['Visits, high &rarr; low'] = 'Aantal keren bezocht, hoog &rarr; laag';
+$lang['Visits, low &rarr; high'] = 'Aantal keren bezocht, laag &rarr; hoog';
+$lang['xsmall'] = 'extra-klein';
+?>
Index: tags/2.4.0RC3/language/nl_NL/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,128 @@
+<h2>Een categorie bewerken</h2>
+
+<h3>Informatie</h3>
+
+<ul>
+
+  <li><strong>naam</strong>: hernoem de categorie (een virtuele hernoeming in het geval van een physieke categorie).</li>
+
+  <li><strong>omschrijving</strong>: geef informatie over de inhoud die getoond word in de categorie,
+  deze tekst word onder de thumbnail.</li>
+
+</ul>
+
+<h3>Verplaatsen</h3>
+
+<p>Als het een virtuele categorie is, dan kun je hem verplaatssen. Het verplaatsen van een categorie houd in dat je het ouderschap veranderd.</p>
+
+<h3>Opties</h3>
+
+<ul>
+
+  <li><strong>Toegangs type</strong>: Rechten beheren. Als je een 
+  categorie private maakt, worden alle daaronderliggende (kinder)categorieën worden dan ook private.<br>
+  Als je een categorie publiek maakt, worden alle ouder categorieën zullen dan ook publiek worden.</li>
+
+  <li><strong>Sluiten</strong>: De categorie en zijn sub-categorieë zijn
+  tijdelijk uitgeschakeld voor onderhoud.</li>
+
+  <li><strong>Commentaar</strong>: Machtig gebruikers om commentaar te geven op de elementen in deze categorie.</li>
+
+  <li><strong>Machtiging tot upload</strong>: Machtig gebruikers om bestanden te-uploaden. Deze optie is alleen beschikbaar als de categorie physiek is (niet
+  virtueel).</li>
+
+</ul>
+
+<p>Je kan de opties ook beheren via "Eigenschappen" beheer schermen (scherm <span class="pwgScreen">Upload</span>, <span
+class="pwgScreen">Commentaar</span>, <span class="pwgScreen">Sluiten</span>,
+<span class="pwgScreen">Publiek/Private</span>, <span
+class="pwgScreen">Vertegewoordiging</span> beschikbaar via <span
+class="pwgScreen">Administratie, Categorieën, Eigenschappen</span>).</p>
+
+<h3>Sorteer volgorde</h3>
+
+<p>Kies als de standaard sortering word gebruikt.</p>
+
+<p>Indicatie dat de sortering wort toegepast op de sub-categorieën.</p>
+
+<p>Gebruik specifieke sorteren middels de kolommen in deze categorie.</p>
+<ul>
+<li><strong>Aanmaak datum</strong>: Aanmaak datum foto</li>
+<li><strong>Plaatings datum</strong>: Synchronizatie datum</li>
+<li><strong>Gemiddelde waardering(*)</strong>: Gemiddelde waardering kan gewijzigt worden door een bezoeker</li>
+<li><strong>Most visited (*)</strong>: The current visit change the most visited order</li>
+<li><strong>Bestandsnaam</strong>: Gekozen naam in het informatie veld</li>
+<li><strong>Id</strong>: Interne Id (recente categorieën hoger id dan vorige id's.</li>
+
+</ul>
+<p><strong>(*)</strong>Neem zorg en test het voor uw zelf aangezien het onvoorspelbare resultaten kan geven.</p>
+
+
+<h3>Vertegenwoordiging</h3>
+
+<p>De vertegenwoordiging van de categorie is een indexplaatje "thumbnail" welke getoond word
+om de categorie te tonen op de hoofdpagina (<span class="pwgScreen">category.php</span>) wanneer een
+categorie alleen sub-categorieieën bevat (alleen als root categorie).</p>
+
+<p>Er zijn 4 manieren om een indexplaatje te tonen als weergavevan een categoie :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Picture page</span>: in het aktiemenu, 
+  met een van de knoppen is het mogelijk om een plaatje te kiezen als
+  vertegenwoordiging van een categorie. Deze knop is alleen beschikbaar voor administrators.</li>
+
+  <li><span class="pwgScreen">Verander informatie over een plaatje</span> via de administratie.
+  Je kunt bij dit scherm komen via <span class="pwgScreen">picture.php</span> of 
+  <span class="pwgScreen">Batch management</span> in <em>unit mode</em>. Kijk voor meer info in de documentatie voor meer details.</li>
+
+  <li><span class="pwgScreen">Administratie, Categorieën, Eigenschappen, Thumbnails</span>. Kijk voor meer info in de documentatie voor meer details.</li>
+
+  <li><span class="pwgScreen">Bewerk een categorie</span> (dit scherm).</li>
+
+</ul>
+
+<p>De indexafbeelding is afhankelijk van de configuratie parameter <code>allow_random_representative</code> (zie <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>Standaard is <code>allow_random_representative</code> ingesteld op false (onwaar)
+elke categorie die tenminste 1 element bevat is vertegenwoordigd door een vastgestelde afbeelding. 
+Eenmaal ingesteld (Bij het maken van de categorie), kan deze alleen veranderd worden door administrator 
+ die daar dan om verzoekt it. Als de indexafbeelding niet meer bestaat kun je er <strong>willekeurig</strong> een nieuwe aan toewijzen.</p>
+
+<p>Als de configuratie parameter <code>allow_random_representative</code> is
+ingesteld op true (waar), dan is eer geen vaste indexafbeelding. Gebruik gewoon <strong>Verwijder indexafbeelding</strong> knop.</p>
+
+<p>Als de categorie geen elementen bevat (maar alleen sub-categorieën) kan het 
+vertegenwoordigt worden dankzij het scherm <span class="pwgScreen">verander informatie over een afbeelding</span>. De enigste optie 
+op het huidige scherm is <strong>Verwijder vertegenwoordigingsafbeelding</strong> knop, na deze optie te hebben gebruikt is er geen 
+afbeeldingsafbeeldings optie meer om te veranderen.</p>
+
+<h3>Link alle categorie elementen aan een nieuwe categorie</h3>
+
+<ul>
+
+<li><strong>Virtuele categorie naam</strong>: Nieuwe categorie naam aanmaaken, 
+alle afbeeldingen van de huidige categorie zullen gekoppeld worden aan de nieuwecategorie.</li>
+
+<li><strong>Ouder categorie</strong>: Waar de nieuwe moet komen, laat dit leeg om deze in de root te maken.</li>
+
+</ul>
+
+<h3>Link alle categorie elementen aan bestaande categorieën</h3>
+
+<ul>
+
+<li><strong>Categorieën</strong>: Kies de doelcategorie.</li>
+
+</ul>
+
+<h3>Stuur een informatie email naar de groepsleden</h3>
+
+<ul>
+
+<li><strong>Groep</strong>: Geadresseerden groep</li>
+
+<li><strong>Email inhoud</strong>: Vrije tekst om mee te sturen.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/nl_NL/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/cat_move.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Verplaatsen virtuele categorieën</h2>
+
+<p>Allen virtuele categorieën kunnen een nieuwe ouder-categorie hebben.</p>
+
+<h3>Virtuele categorieën verplaatsen</h3>
+
+<p>Selecteer een virtuele categorie die je wilt verplaatsen.
+Als de lijst leeg is, wil dat zeggen dat je er geen gemaakt hebt.</p>
+
+<h3>Nieuwe ouder categorie</h3>
+
+<p>Selecteer de nieuwe ouder (virtueel of physiek). 
+Als je het niet doet zullen de geselecteerde categorieën verplaatst worden 
+naar het begin van de map (root). Categorieën kunnen niet verplaatst worden
+naar zichzelf of een kind van de categorie.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/cat_options.html	(revision 14585)
@@ -0,0 +1,30 @@
+<h2>Categorie opties</h2>
+
+<p>Dit scherm geeft administrators de mogelijkheid om categorie opties te beheren voor meerde categorieën in één keer.</p>
+
+<dl>
+
+  <dt>Upload</dt>
+  <dd>Maak categorieën benaderbaar voor bezoekers om er bestanden in te plaatsen. Alleen niet virtuele en externe categorieën worden getoond.</dd>
+
+  <dt>Commentaar</dt>
+  <dd>Geef gebruikers rechten om commentaar te plaatsen in de geselecteerde categorieën.
+	Selecteer de categorie waarop commentaar gegeven kan worden.
+	Op een afbeelding kan alleen commentaar gegeven worden als deze behoord tot een categorie waar dit is toegestaan.</dd>
+
+  <dt>sluiten</dt>
+  <dd>Geselecteerde categorieën zijn op dit moment gesloten voor onderhoud. 
+	Als je een categorie sluit, alle daaronder liggende categorieën zijn dan ook gesloten. Als je een categorie 
+	weer opent, alle ouder categorieën worden dan ook weer geopend.</dd>
+
+  <dt>Publiek / private</dt>
+  <dd>Beheer rechten voor de geselecteerde categorieën. Geselecteerde categorieën zijn private : je moet gebruikers/groepen rechten geven op deze categorieën.
+	 Als je een categorie private maakt, alle daaronderliggende categorieën worden dan ook private. 
+	Als je eeen categorie publiek maakt, alle ouder categorieën worden dan ook publiek</dd>
+
+  <dt>Vertegenwoordiging</dt>
+  <dd>Deze opties kunnen alleen beheerd worden als de configuratie parameter <code>allow_random_representative</code>
+	 is ingesteld op <em>true</em>.(zie <span class="filename">include/config_defaults.inc.php</span>)
+	Elke categorie kan vertegenwoordigd worden door een willekeurige of afzonderlijke vertegenwoordiging (door een unieke afbeelding).</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/nl_NL/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Beheer rechten voor een categorie</h2>
+
+<p>Dit scherm is allen beschikbaar voor private categorën. Hier kun je gebruikers en groepn toegang geven voor deze categorie.</p>
+
+<h3>Groepen</h3>
+
+<p>Je kan groepen toegang geven of toegang weigeren op de huidige categorie. Door het aanpassen van de groepsrechten kun je dat
+<br>bereiken. Je zal de lijst met gebruikers die toegang hebben tot deze categorie moeten wijzigen
+op basis van groepsrechten.</p>
+
+<h3>Gebruikers</h3>
+
+<p>Je kan een individuele gebruiker toegang geven of weigeren.
+Gebruikers die behoren tot een groep kunnen ook toegang gegeven of geweigerd worden.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/configuration.html	(revision 14585)
@@ -0,0 +1,106 @@
+<h2>Configuratie</h2>
+
+<p>Dit scherm geeft de administrator de mogenlijkheid tot basisconfiguratie. Dit scherm toont namelijk slechts eenvoudige 
+configuratieparameters die zouden moeten zijn genoeg voor de overgrote meerderheid van beheerders. Als je de andere mogelijkheden wilt zien
+(geavanceerde) over de configuratie parameters, lees dan <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Dit scherm wordt verdeeld in verscheidene secties, hergroeperend configuratieparameters per thema.</p>
+
+
+<h3>Begin</h3>
+<ul>
+  <li><strong>Gallerie titel</strong>: word gebruikt in RSS meldingen en meldingen per email.</li>
+
+  <li><strong>Pagina banner</strong>: word getoond op elke publieke pagina.</li>
+
+  <li><strong>Gallerie URL</strong>: word gebruikt voor de RSS meldingen.</li>
+
+  <li><strong>Sluit gallery</strong>: Sluit de hele gallerie voor onderhoud. Alleen administrators kunnen de gallerie nog bereiken.</li>
+
+  <li><strong>Waardering</strong>: Waarderings optie is ingeschakeld.</li>
+
+  <li><strong>Waardering door gasten</strong>: Niet geregisteerde gebruikers kunnen ook hun waardering geven aan afbeeldingen.</li>
+
+  <li><strong>Sta registratie toe</strong>: Registratie is gratis voor iedereen.</li>
+
+  <li><strong>Email adres is verplicht voor alle gebruikers</strong>: Email adres word gecontroleerd bij registratie of profiel update uitgezonderd als de actie word uitgevoerd op de administratie scherm.</li>
+
+  <li><strong>Email admins wanneer een nieuwe gebruiker zich registreerd</strong>: Administrators ontvangen een mailtje bij elke registratie.</li>
+
+</ul>
+
+<h3>Geschiedenis</h3>
+
+  <p>Bezoek op de pagina's <span class="pwgScreen">category.php</span> en <span class="pwgScreen">picture.php</span> worden opgeslagen in de <code>history</code> tabel.</p>
+  
+  <p>Bezoek word getoond in <span class="pwgScreen">Administratie, Speciaal, Geschiedenis</span>.</p>
+
+<ul>
+  <li><strong>Bewaar pagina bezoek door gasten</strong>: pagina bezoek van gasten wordt opgeslagen.</li>
+
+  <li><strong>Bewaar pagina bezoek door gebruikers</strong>: pagina bezoek van geregistreerde gebruikers wordt opgeslagen.</li>
+
+  <li><strong>Bewaar pagina bezoek door administrators</strong>: pagina bezoek van administrators wordt opgeslagen.</li>
+
+</ul>
+
+<h3>Commentaar</h3>
+<ul>
+
+  <li><strong>Commentaar door iedereen</strong>: Ook gasten kunnen commentaar plaatsen.</li>
+
+  <li><strong>Aantal commentaren per per pagina</strong>.</li>
+
+  <li><strong>Validatie</strong>: een administrator valideerd de door gebruikers geplaatste commentaren voordat deze zichtbaar wordt op de website.
+   Valideren van gebruikers commentaar gebeurd via het scherm <span class="pwgScreen">Administratie, Afbeeldingen, Commentaar</span>.</li>
+
+  <li><strong>Email admins when a valid comment is entered</strong>:
+Sends an email to the administrators when a user enters a comment and this comment is validated.</li>
+
+  <li><strong>Email admins wanneer een commentaar validatie nodig heeft</strong>:
+Stuurt de administrator een bericht dat een gebruiker een p[merking heeft geplaatst die nog gevalideerd moet worden door de administrator.
+Gebruikers commentaar valideren gaat via het scherm <span class="pwgScreen">Administratie, Afbeeldingen, Commentaren</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>Upload</h3>
+<ul>
+<!--TODO -->  <li><strong>Show upload link every time</strong>: If exists uploadeable categories, add link will be show for each categoy.</li>
+<!--TODO -->  <li><strong>User access level to upload</strong>: Allows to restrict upload by users</li>
+  <li><strong>Email admins wanneer een afbeelding is ge-upload</strong>: Administrators ontvangen een mailtje voor elke ge-uploade bestand door gebruikers.</li>
+</ul>
+
+<h3>Standaard weergave</h3>
+
+<p>Hier kan je de weergave aan passen die als standaard worden ingesteld, die je gast ziet als hij zich niet heeft aangemeld. Eenmaal aangemeld worden deze 
+opties overschreven door de gebruikers eigen opties (aanpasbaar in <span class="pwgScreen">profiel</span>).</p>
+
+<p>Het is mogelijk om de weergave opties voor alle gebruikers aan te passen, via scherm <span class="pwgScreen">Administratie, Identificatie, Gebruikers</span>, waar de opties voor de geslecteerde lijst van gebruikers word getoond.</p>
+
+<ul>
+
+  <li><strong>Talen</strong>: betreft slechts Piwigo labels. De namen van de categorie, de bestandsnamen en alle beschrijvingen vallen hier buiten.</li>
+
+  <li><strong>Aantal afbeeldingen per rij</strong></li>
+
+  <li><strong>Aantal afbeeldingen per pagina</strong></li>
+
+  <li><strong>aangezichts thema</strong></li>
+
+  <li><strong>Recente periode</strong>: per dag. Periode waarin de foto aangeduid moet worden als nieuw. Moet meer dan 1 dag zijn.</li>
+
+  <li><strong>Toon alle categorieën</strong>: Toon standaard alle categorieën in het menu? <em>Warning</em>: deze optie is een server belastende optie 
+en toont mogelijk een erg groot menu als je categorie erg veel sub categorieën bevat.</li>
+
+  <li><strong>Aantal commentaren tonen</strong>: Het aantal commentaren zichtbaar bij een afbeelding op de thumbnails pagina. Zware belasting.</li>
+
+  <li><strong>Toon aantal hits</strong>: Toon het aantal keren dat een afbeelding bekeken is, onder de afbeelding op de thumbnails pagina. 
+  Allen mogelijk als de geavanceerde configuratie parameter is: <br />  $conf['show_nb_hits'] = true; <br />
+  Opmerking: standaars is dit false.</li>
+
+  <li><strong>Maximale breedte van de afbeeldingen</strong>: maximale toonbare breedte. Als de afbeeldingen groter zijn dan deze instelling, worden ze verkleind op het scherm.  Als je deze optie gebruikt, denk er dan over na om de afbeelding aan te passen voor je ze plaatst op je gallery.</li>
+
+  <li><strong>Maximale hoogte van de afbeeldingen</strong>: Zelfde als hierboven.</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/nl_NL/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,100 @@
+<h2>Extend for templates configuration</h2>
+
+<h3>Goal</h3>
+<p>Define replacement conditions for each template from template-extension
+(template called "replacer").</p>
+
+<p>"original template" from ./template/yoga (or any other than yoga)
+ will be replaced by a "replacer" if the replacer is linked to this "original template"
+ (and optionally, when the requested URL contains an "optional URL keyword").</p>
+
+<p>"Optional URL keywords" are those you can find after the module name in URLs.</p>
+
+<p>Therefore "Optional URL keywords" can be an active "permalink" 
+(see permalinks in our documentation for further explanation).</p>
+
+<p>Read: `<a href="#warnings">Warning</a>` usage conditions.</p>
+
+<h3>What are template extensions?</h3>
+
+<p>This configuration tool is powerfull for beginners and advanced users.
+By FTP, in the template-extension folder, the Webmaster can duplicate a lot of
+ the distributed .tpl files ("original template") with a different name 
+ ("replacer").
+ 
+ "Original templates", current original supported templates are:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Where can I find "original templates"?</h3>
+
+<p>Distributed original templates are in template/yoga/ 
+(don't edit them in place for upgrade perspectives). So with "original templates", 
+any webmaster can create his "replacers (customized templates)".</p>
+
+<h3>Where should I save "replacers"?</h3>
+
+<p><strong>Replacers (customized templates)</strong> must be placed in the 
+template-extension folder (or its subfolders).
+Replacers can have any filename with the .tpl extension. For example: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>How can I activate my "replacers"?</h3>
+<p>An <strong>original template</strong> should be assigned to each
+ <strong>replacer (customized templates)</strong> to activate the related replacements.
+ This is the goal of "Extend for templates" in the Configuration Administration menu.</p>
+
+<p>If you select an <strong>optional URL keyword</strong> then replacements 
+will be operate only on pages with this keyword. For example: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+  
+<p>Advanced users will use permalinks as <strong>optional URL keyword</strong>. </p>
+
+<p>If you select a <strong>Bound template</strong> then replacements will be operate only on this template.</p>
+
+<h3>How can I deactivate my "replacers"?</h3>
+<ul>
+<li>Unselect related "Original templates".</li>
+<li>By FTP delete of "replacers".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Warnings</h3>
+<ul>
+
+  <li><strong>Original template</strong> must be the "original" template 
+  otherwise you could have unpredictable results!</li>
+
+  <li>On several <strong>replacers (customized templates)</strong> with the
+  same<strong>Original template</strong> and the same <strong>optional URL 
+  keyword</strong> only the last replacer is active.</li>
+
+  <li>Unselected <strong>optional URL keyword</strong> will active the replacer
+  on any template usage. As previous point, order can override previous
+  selected replacers.</li>
+
+  <li>Subfolders:
+Subfolders are ignored but they are usefull to change current order.<br />
+distributed-samples: for test purpose are distributed! 
+<strong>Don't edit them</strong> create your own ones.
+</li>
+
+  <li>On delete of a replacer the <strong>Original template</strong> is 
+  immediately reactivated.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/nl_NL/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Groepen lijst</h2>
+
+<p>Hier kan je de gedefinieerde groepen beheren.</p>
+
+<h3>Voeg een groep toe</h3>
+
+<p>Een administrator kan groepen toevoegen.</p>
+
+<h3>Groeps lijst</h3>
+
+<p>De lijst staat voor elk element toe:</p>
+
+
+<ul>
+  <li>naar de ledenlijst gaan</li>
+  <li>naar rechten gaan</li>
+  <li>een groep verwijderen (vereist een bevestiging)</li>
+  <li>stel de staus in als "standaard" (vereist een bevestiging)</li>
+</ul>
+
+<h3>Standaard groepen</h3>
+<p>Standaard groepen zijn groepen waar nieuwe gebruikers automatisch lid van worden.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,23 @@
+<p>Verschillende manieren om fotos aan de gallerie toe te voegen:</p>
+
+<ul>
+  <li><strong>Direct upload</strong> In je web browser is de makkelijkste mannier.
+  Het hangt van je webbrowser en web server af.
+  Om grote hoeveelheden foto's te uploaden, of als je een probleem hebt  zijn er andere manieren!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Ga naar Direct Upload </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> IS een desktop applicatie, die op je computer geïnstalleerd moet worden. Sleep &amp; fotos in het ploader venster , klik op <em>"Upload naar Piwigo"</em> and let pLoader do the job. You can find other desktop applications such as <strong>WinToPiwigo</strong> or the <strong>Digikam</strong> export plugin to Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Ga naar pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP overdracht</strong> is de meest geschikte nainier om een grote hoeveelheid fotos toe te voegen met zo min mogelijk handelingen. Volg de aanwijzingen om je fotos voor te bereiden. De FTP manier is laat je precies de indeling van je fotos op de server bepalen.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Ga naar FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/nl_NL/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<!--TODO--><p>Groups is a convenient way to set permissions for a list of users.</p>
+
+<p>Je kan groepen maken in <span class="pwgScreen">Administratie &raquo; Gebruikers &raquo; Groepen</span> en voeg gebruikers toe aan de groep via <span class="pwgScreen">Administratie, Identicatie, Gebruikers</span>.</p>
+
+<p>Een gebruiker kan behoren tot verschillende groepen. De vergunning is sterker dan verbod : als gebruiker "jack" behoord tot de groep "familie" en "Vrienden", en alleen de groep "familie" kan de categorie "Christmas 2003" zien, "jack" zal de mogelijkheid hebben om de categorie "Christmas 2003" te zien.</p>
+
Index: tags/2.4.0RC3/language/nl_NL/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/help_misc.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p> Als je de Gallery geinstalleerd hebt, kan je het voor je bezoeker configureren.
+<ul>
+<li>Als je je gallery-installatie hebt afgerond, verander dan het uiterlijk van de standaard weergave
+in <span class="pwgScreen">Administratie paneel &raquo; Configuratie &raquo; Opties &raquo; Bezoeker/Gast-Instellingen</span></li>
+<li>Het standaard thema in <span class="pwgScreen">Administratie &raquo; Configuratie &raquo; Thema\'s</span></li>
+<li>De standaard taal in <span class="pwgScreen">Administratie &raquo; Configuratie &raquo; Talen</span></li>
+</ul>
+Elke nieuwe geregistreerde gebruiker zal deze standaard vertoningseigenschappen hebben.</p>
+
+<p>Als je nog vragen hebt, de Piwigo gemeenschap heet je welkom op
+<a href="http://piwigo.org/forum">haar forum</a>.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,13 @@
+<!--TODO--><p>You can forbid access to categories. Switch the category access type to "private" if you want to manage permissions.</p>
+
+<p>U kunt een categorie aan private maken door het aanpassen van een enkele categorie(<span
+  class="pwgScreen">Administratie &raquo; Categorieën &raquo; Beheren &raquo; bewerken</span>) of bij het aanpassen van de opties op de hele categorie map (<span class="pwgScreen">Administratie &raquo; Categorieën &raquo; Eigenschappen &raquo; Publiek / Private</span>).</p>
+
+<p>Als de categorie private is, dan kun je de rechten aanpassen voor de groepen en gebruikers via 3 schermen :</p>
+
+<ul>
+  <li><span class="pwgScreen">Administratie &raquo; Gebruikers &raquo; Beheer &raquo; rechten aanpassen (een link per gebruiker)</span></li>
+  <li><span class="pwgScreen">Administratie &raquo; Gebruikers &raquo; Groepen &raquo; rechten aanpassen (een link per groep)</span></li>
+  <li><span class="pwgScreen">Administratie &raquo; Categorieën &raquo; Beheer &raquo; bewerk categorie rechten aanpassen (one link per categorie)</span></li>
+</ul>
+
Index: tags/2.4.0RC3/language/nl_NL/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,13 @@
+<p>Afbeeldingen / Foto's worden weergegeven in de categorie die overeenkomt
+met hun directory.</p>
+
+<p>Een afbeelding kan in meerdere categorieën worden weergegeven, zonder dat
+het bestand meerdere keren op uw webserver geplaatst hoeft te worden.
+Verbindt uw afbeelding de gewenste categorie of categorieën op het
+fotobewerkingsscherm (dat elke administrator kan bereiken vanaf het
+galeriescherm waarop de afbeelding weergegeven wordt).p>
+
+<p>Virtuele categorieën zijn gebaseerd op het volgende idee: ze hebben geen
+bijbehorende directory. Maak virtuele categorieën aan vanuit <span
+class="pwgScreen">Administratie &raquo; Categorieën &raquo;
+Beheer</span>.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/history.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/history.html	(revision 14585)
@@ -0,0 +1,37 @@
+<h2>Historie</h2>
+
+<p>Op deze pagina's , kan je de bezoekers geschiedenis van je gallerie zien, volgens de opties die ingesteld zijn in - Administratie - Algemeen - Historie inhoud.</p>
+
+<h3>Statistieken</h3>
+<ul>
+<p>Als je ervoor hebt gekozen om geschiedenis van (<span
+class="pwgScreen">index.php</span> en <span
+class="pwgScreen">picture.php</span>) bezochte pagina's <code>historie</code> geschiedenis,
+te bewaren kan je die bekijken op deze tab.</p>
+
+<li><strong>Algemene statistieken</strong>: bezoeken per jaar. </li>
+
+<li><strong>Jaarlijkste statistieken</strong>: bezoeken per maand in het geselecteerde jaar.</li>
+
+<li><strong>Maandeijkse statistieken</strong>: bezoeken per dag in de geselecteerde maand .</li>
+
+<li><strong>Dagelijkse statistieken</strong>: bezoeken per uur in de geselecteerde dag.</li>
+
+</ul>
+
+<h3>Zoeken</h3>
+<ul>
+<p>Als je ervoor hebt gekozen om geschiedenis van (<span
+class="pwgScreen">index.php</span> en <span
+class="pwgScreen">picture.php</span>) pagina's bezocht in de tabel <code>historie</code> te bewaren, kun je de gegevens van de bezochte pagina's bekijken met behulp van verschillende filters.</p>
+
+<li><strong>Filter op datum</strong> : kies het datum bereik waarvan je het bezoek wil bekijken.</li>
+
+<li><strong>Filter op type element</strong> : kies het type element waarvan je het bezoek wil bekijken.</li>
+
+<li><strong>Filter op gebruiker</strong> : kies de gebruiker waarvan je het bezoek wil bekijken.</li>
+
+<li><strong>Filter op bestandsnaam</strong> : kies de bestandsnaam waarvan je het bezoek wil bekijken.</li>
+
+<li><strong>Filter op beeld id</strong> : kies het beeld ID waarvan je het bezoek wil bekijken.</li>
+</ul>
Index: tags/2.4.0RC3/language/nl_NL/help/index.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/nl_NL/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/maintenance.html	(revision 14585)
@@ -0,0 +1,54 @@
+<h2>Onderhoud</h2>
+
+<p>Om de pagina genereringstijd te optimaliseren, gebruikt Piwigo gecachde informatie. Voorbeeld, 
+inplaats van in plaats van het tellen van het aantal beelden, bevat elke categorie bij paginaherladen, 
+wordt deze informatie opgeslagen inde database. In theorie, zou deze informatie altijd correct zijn, 
+maar soms kan een fout optreden en de cache informatie is dan foutief.</p>
+
+<p>Bepaalde informatie word door tijd nutteloos. Door de nutteloze informatie te verwijderen uit de database bespaar je ruimte.</p>
+
+<ul>
+
+  <li>
+    <strong>Niet gelinkte elementen:</strong>
+    Toon afbeeldingen die niet gekoppeld zijn aan enige virtuele categorie.
+  </li>
+  <li>
+    <strong>Bestanden met dezelfde naam in meer dan één physieke categorie:</strong>
+    Toon afbeeldingen of bestanden met dezelfde naam in verschillende categorieën.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Update categorie informatie:</strong> Voor elke categorie,
+  informatie bijwerken of controleren zijn de volgende: lijst van hooft
+  categorieën, aantal afbeeldingen, datum van de laatste afbeelding, positie onder 
+  broeder categorieën, positie onder alle categorieën. Deze aktie controleerd ook de koppeling met de indexafbeelding.</li>
+
+  <li><strong>Update afbeeldings informatie:</strong> Voor elke afbeelding,
+  informatie om te updaten zijn : volledige adres naar het bestand, gemiddelde waardering. 
+  <em>Waarschuwing</em>: raak niet in verwarring met de metadata informatie, welke gesynchroniseerd word via <span class="pwgScreen">Administratie,
+  Categorieën, Synchronizeren</span> of doormiddel van wijzigen enkele afbeelding (via <span class="pwgScreen">Afbeelding</span> voorbeeld).</li>
+
+  <li><strong>Repareren en optimalizeren database:</strong>
+  Voor elke tabel, re-odrer, reparatie en optimalizatie worden voltooid.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>Filter geschiedenis:</strong> Verwijder alle <code>geschiedenis</code>uit de tabel. Scherm <span class="pwgScreen">Administratie,
+  Speciaal, Geschiedenis</span> toont geen informatie meer uit de verleden tijd. <em>Waarschuwing</em>: alle data wordt verwijderd en is niet meer te herstellen.</li>
+
+  <li><strong>Filter samenvatting:</strong> Verwijder alle informatie over het bezoek aan de website. Deze samenvatting is samengesteld uit de geschiedenis informatie.</li>
+
+  <li><strong>Filter sessies:</strong> Verwijder verlopen gebruikers sessies.</li>
+
+  <li><strong>Filter nooit gebruikte meldingen</strong></li>
+  
+  <li><strong>Purge search history</strong></li>
+  
+  <li><strong>Purge samengestelde sjablonen</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/nl_NL/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Meldingen per email</h2>
+
+<p>Dit scherm geeft je de mogelijkheid om emailmeldingen te configureren en te beheren om je gebruikers op de hoogte te stellen van nieuws op je website.</p>
+
+<p>Dit scherm is verdeelt in 3 delen:</p>
+
+<h3>Parameters</h3>
+<p>Alleen beschikbaar voor webmasters, dit deel configureerd de meldingen per email.</p>
+
+<h3>Inschrijven</h3>
+<p>Alleen beschikbaar voor webmasters, dit deel beheerd de in/uitschrijvingen voor email meldingen.</p>
+
+<h3>Verzending</h3>
+<p>Alleen beschikbaar voor webmasters en administrators, dit deel staat het toe om email meldingen te verzenden.</p>
+
Index: tags/2.4.0RC3/language/nl_NL/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permanente links</h2>
+
+<p>Permanente links worden gebruikt om de adressen naar de categorie mooier te maken. wanneer een categorie een bepaalde permanente link heeft, wordt categorienaam niet meer vereist in de link ernaar toe.</p>
+
+<p>Wanneer een permanente link wordt verwijderd heb je de mogelijkheid om de geschiedenis te bewaren omde externe links naar de gallery werkend te houden. In de tabel met de permanente link geschiedenis kun je zien wanneer een permanente link is verwijderd, alsmede de laatste keer dat hij is gebruikt en het aantal keer.<p>
+
+<p>Let op: De permanente link naar een categorie moet uniek zijn. In de geschiedenis kan ook maar één keer dezelfde permanente link bestaan.</p>
Index: tags/2.4.0RC3/language/nl_NL/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,126 @@
+<fieldset>
+  <legend>Snelle start</legend>
+
+<ol>
+  <!--TODO--><li>Create a directory on your computer.</li>  
+
+  <!--TODO--><li>Copy some photos inside this directory, resize them for web display. <em>Warning</em>: the name of directories and files must contain only letters, figures, "-", "_" or ".". No blank space, no accentuated characters.</li>
+
+  <!--TODO--><li>With a FTP client, copy your directory in the "galleries" directory of your Piwigo installation.</li>
+
+  <!--TODO--><li>Logon your gallery and go to <span class="pwgScreen">Administration &raquo; Pictures &raquo; Thumbnails</span> to create missing thumbnails.</li>
+
+  <!--TODO--><li>Go to <span class="pwgScreen">Administration</span> and click on the big Synchronization button.</li>
+</ol>
+
+<!--TODO-->Congratulations! You have successfuly created the first category of your photo gallery.
+
+</fieldset>
+<fieldset>
+  <legend><!--TODO-->Directories and files organization</legend>
+
+<ul>
+
+  <li>
+
+    <p>Categorie mappen zijn in de Piwigo map "galleries". Bekijk de mapstructuur van een kleine gallerie (maar met een hoop mogelijkheden) :</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- categorie-1
+|   |   |-- categorie-1.1
+|   |   |   |-- categorie-1.1.1
+|   |   |   |   |-- categorie-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- categorie-1.1.1.2
+|   |   |   +-- categorie-1.1.2
+|   |   |-- categorie-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- categorie-1.3
+|   +-- categorie-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>Eigenlijk, een categorie is gepresenteerd door een map op welke level in
+  Piwigo map "galleries". Elke categorie kan zoveel submappen als jij wilt bevatten.
+  In het voorbeeld hierboven, categorie-1.1.1.1 is op nivo 4 van de trap.</li>
+
+  <li>Eigenlijk, een element is gepresenteerd door een bestand. Een bestand kan een
+  Piwigo element zijn als de extenstie is <code>file_ext</code>
+  configuration parameter mofenlijkheden (zie <span
+  class="filename">include/config_default.inc.php</span> file). Een bestand kan
+  een afbeelding zijn als de extensie gelijk is aan <code>picture_ext</code>
+  configuration parameter possibilities.</li>
+
+  <li>Afbeeldings elementen moeten een link naar een thumbnail hebben.(zie sectie hieronder
+  over thumbnails)</li>
+
+  <li>Afbeeldings elementen kunnen gekoppeld zijn aan hoge kwaliteit bestanden. Zoals 
+  in het voorbeeld wedding.jpg hierboven. Er is geen andere naamsaanpassing nodig voor de
+   hoge kwaliteit afbeelding verplicht.
+  </li>
+
+  <li>Niet afbeeldings elementen (video, geluid, tekstbestanden, wat je wil...) worden 
+  standaard vertegenwoordigt door een ikoontje die overeenkomt met de bestandsextensie.
+   Optioneel, je kan zelf een associatie met een thumbnail en een bestand opgeven (zie video.avi in het voorbeeld hierboven).</li>
+
+  <li><em>Waarshuwing</em> : de naam van de mappen en bestanden moeten bestaan uit de letters en koppeltekens "-", "_" of ".". Geen spaties en geen accenten
+ op de karakters</li>
+
+  <li><em>Advies</em> : Een categorie kan elementen en sub-categorieën hebben
+op het zelfde moment. Desalnietemin, word je geadviseerd om te kiezen uit categorieën die elementen bevatten <strong>of</strong> categorieën
+die sub-categorieën bevatten.</li>
+
+  <li>Als bestanden, thumbnails en representativev corrct zijn geplaatst in
+ mappen ga dan naar: <span class="pwgScreen">Administratie &raquo; Categorieën &raquo; Synchronizeren</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Thumbnails</legend>
+
+<ul>
+
+  <li>Zoals eerde gemeld, elk element of afbeeldingstype moet geassociateerd worden met een thumbnail.</li>
+
+  <li>Thumbnails worden opgeslagen in een sub-directory "thumbnail" of de categorie map. De thumbnail is een afbeelding (zelfde bestandsnaam extensies mogelijk
+  als de afbeeldingbestanden) welke is prefixed met een geconfigureerde
+  "Thumbnail prefix" (zie administratie paneel, Configuratie, Algemeen).</li>
+
+  <li>Thumbnails hoeven niet de zelfde extensie te hebben als het geassocieerde
+  afbeelding (een afbeelding met .jpg extensie kan een thumbnail hebben met .GIF
+  extentie als voorbeeld).</li>
+
+  <li>Advies: gebruik een ecterne module voor het maken van thumbnails.</li>
+
+  <li>Je kunt ook de pagina thumbnail maken gebruiken (<span
+  class="pwgScreen">Administratie, Afbeeldingen, Thumbnails</span>), maar dat word niet aangeraden.
+   De thumbnail kwaliteit kan slecht zijn en het gebruikt een hoge CPU kracht welke een probleem kan zijn bij gratis webhost.</li>
+
+  <li>Als je er voor kiest om de thumbnails te laten maken door de webhoster, dan dien je de rechten toe te wijzen op die mappen om de thumbnail te kunnen maken.
+  De correcte rechten op de mappen en sub-mappen zijn gebruiker/goep/wereld (ook wel 777)
+</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/nl_NL/help/search.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Zoeken</h2>
+
+<p>Via deze pagina kun je afbeeldingen zoeken in de totale gallerie.</p>
+
+<dl>
+
+  <dt>Zoeken naar woorden</dt>
+  <dd>Zoek naar opgegeven woorden in alle eigenschappen die betrekking heeft op de afbeelding die in de gallerie word getoond. Gebruik * als vervanging voor gedeeltelijke overeenkomsten.</dd>
+
+  <dt>Zoeken naar Auteur</dt>
+  <dd>Gebruik * als vervanging voor gedeeltelijke overeenkomsten.</dd>
+
+  <dt>Zoeken op datum</dt>
+  <dd>Selecteer een datum en/of een eind datum voor je zoekopdracht. Laat de datum leeg als je zoekt op een datum voor vandaag. Het jaartal moet zijn in het formaat : 0000 (2004)</dd>
+
+  <dt>Zoeken in Categorieën</dt>
+  <dd>Selecteer de categorie of categorieën waarin je wil zoeken. Voor snelheid kunnen alle subcategorieën worden doorzocht door de ouder te selecteren, en dan kun je kiezen om de subcategorieën te doorzoeken doormiddel van het aanvinken van die optie.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/nl_NL/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/site_manager.html	(revision 14585)
@@ -0,0 +1,36 @@
+<h2>Externe sites</h2>
+
+<p>Piwigo biedt de mogelijkheid om verscheidene servers te gebruiken om de afbeeldingen op te slaan die uw gallerie zullen samenstellen.
+ Het kan nuttig zijn als uw gallerie beperkte ruimte is op de server, en dat u een grote hoeveelheid beelden aan hebt wordt getoond.<p>
+
+<ol>
+
+  <li>bewerk bestand <span class="filename">beheer/create_listing_file.php</span>,
+  door het veranderen van de parameters opties zoals <code>$conf['prefix_thumbnail']</code> of
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>plaats het aangepaste bestand <span class="filename">beheer/create_listing_file.php</span>
+  op de andere server, in dezelfde map als je huidige categorie mappen  (als de map <span class="filename">galleries</span> op
+  deze website) via ftp. Voorbeeld, je hebt toegang tot <span class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>ga naar <span class="pwgScreen">administratie paneel, Categorieën, Site manager</span>. maak een nieuwe site aan, voorbeeld <span class="filename">http://example.com/galleries</span>.</li>
+
+  <li>een nieuwe externe site is geregistreerd. Je hebt nu 4 mogelijkheden :
+
+    <ol>
+
+      <li><strong>genereer een lijst</strong> : stuurd verzoek om een externe lijst te maken.</li>
+
+      <li><strong>synchronizeer</strong> : leest de externe <span class="filename">listing.xml</span> bestand en synchronizeerd deze met de database informatie.</li>
+
+      <li><strong>opschonen</strong> : verwijderd externe <span class="filename">listing.xml</span> bestandem.</li>
+
+      <li><strong>verwijderen</strong> : verwijderd de site (en alle gerelateerde categorieën en elementen) in de database.</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>Je kan ook handmatig deze <span class="filename">listing.xml</span> genereren, door dit bestand te kopieëren vanaf de externe server en te plaatsen in je huidige 
+Piwigo root map en dan het beheersscherm  te openen : Piwigo zal voorstellen om de gevonden listing.xml te gebruiken.</p>-->
+
Index: tags/2.4.0RC3/language/nl_NL/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/synchronize.html	(revision 14585)
@@ -0,0 +1,8 @@
+<h2>Synchronizeren</h2>
+
+<p>Er zijn 2 synchronizaties mogelijk : mappen/bestanden en bestands metadata. mapppen/bestanden gaat over het synchronizeren van je mapstructuur met de categorie structuur in de database.
+ metadata gaat over het bijwerken van de informatie zoals bestandsgrootte, dimenties in pixels en EXIF of IPTC informatie.</p>
+
+<p>De eerste synchronizatie moet zijn mappen/bestanden.</p>
+
+<p>Het synchronizatiren kan een lange tijd duren (afhankelijk van de server belasting en het aantal bestanden) daarom is het mogelijk om de categorieën één voor één te doen. (categorie voor categorie)</p>
Index: tags/2.4.0RC3/language/nl_NL/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Thumbnails maken</h2>
+
+<p>Deze pagina geeft je de mogelijkheid om ontbrekende thumbnails aan te maken.</p>
+
+<dl>
+
+  <dt>GD versie</dt>
+
+  <dd>GD is een afbeeldings m,anipulatie software voor bebruik in PHP. Kies de versie van GD welke op deze server is geinstalleerd. Als je de verkeerde kiest, kun je foutberichten
+te zien krijgen, ga dan terug en kies de andere versie. Als geen enkele versie werkt, dan betekent dit dat de server geen GD ondersteund.</dd>
+
+  <dt>Breedte en hoogte</dt>
+
+  <dd>Maximale groote die een indexafbeelding (thumbnail) mag hebben, daarbij blijft de verhouding behouden.</dd>
+
+  <dt>Aantal thumbnails aanmaken</dt>
+
+  <dd>Probeer niet in één keer teveel thumbnails te maken, dit vergt namelijk erg veel processorkracht. Als je phpgallery hebt geinstalleerd bij een gratis webhoster kan deze door de hoge
+   processorkracht die je vraagt het besluit nemen om je website te verwijderen.</dd>
+
+  <dt>Bestandsformaat</dt>
+
+  <dd>Alleen het bestandsformaat JPEG wordt ondersteund om thumbnails te maken. Thumbnails kunnen alleen gemaakt worden van PNG en JPEG afbeeldingen.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/nl_NL/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/nl_NL/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/help/user_list.html	(revision 14585)
@@ -0,0 +1,30 @@
+<h2>Gebruikers lijst</h2>
+
+<p>Hier kun je geregistreerde gebruikers beheren. Rechten kun je aanpassen in een aantal andere schermen.</p>
+
+<h3>Gebruiker toevoegen</h3>
+
+<p>Administrators kunnen zelf handmatig een gebruiker toevoegen.</p>
+
+<h3>Bebruikerslijst</h3>
+
+<p>De lijst kan gefilterd worden op gebruikersnaam (gebruike * als wildcard), groepen of status. De lijst kan gesorteerd worden op registratiedatum of gebruikersnaam, van A tot Z
+of van Z tot A.</p>
+
+<p>Dit scherm werkt verschillende gebruikers bij met verschillende akties:</p>
+
+<ul>
+
+  <li>verwijder gebruikers (vereist een bevestiging)</li>
+
+  <li>veranderen status</li>
+
+  <li>aan/af koppelen van groepen</li>
+
+  <li>wijzig weergave eigenschappen</li>
+
+  <li>wijzig extra eigenschappen</li>
+
+</ul>
+
+<p>Het doel is de geselecteerde groep gebruikers (standaard) of alle gebruikers. dit word gevraagd.</p>
Index: tags/2.4.0RC3/language/nl_NL/index.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/nl_NL/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Installatie';
+$lang['Basic configuration'] = 'Basis-configuratie';
+$lang['Default gallery language'] = 'Standaard galerie-taal';
+$lang['Database configuration'] = 'Database-configuratie';
+$lang['Admin configuration'] = 'Admin configuratie';
+$lang['Start Install'] = 'Start Installatie';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Email-adres moet lijken op xxx@yyy.eee (voorbeeld : jack@altern.org)';
+$lang['Webmaster login'] = 'Login webbeheerder';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Het wordt getoond aan de bezoekers. Het is ook noodzakelijk voor de administratie van de website';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'De verbinding met de server is geslaagd, maar het is niet mogelijk om verbinding te krijgen met de database';
+$lang['Can\'t connect to server'] = 'Geen verbinding met de server';
+$lang['Host'] = 'MySQL host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Gebruiker';
+$lang['user login given by your host provider'] = 'De gebruikersnaam welke door uw provider is gegeven';
+$lang['Password'] = 'Wachtwoord';
+$lang['user password given by your host provider'] = 'Wachtwoord welke door uw provider is gegeven';
+$lang['Database name'] = 'Database-naam';
+$lang['also given by your host provider'] = 'Ook deze is door uw provider gegeven';
+$lang['Database table prefix'] = 'Database-tabel voorvoegsel';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'Tabellen in de database worden voorzien van dit voorvoegsel (dit maakt een beter beheer van de database mogelijk) ook wel prefix genoemd';
+$lang['enter a login for webmaster'] = 'Geef een gebruikersnaam voor de beheerder';
+$lang['webmaster login can\'t contain characters \' or "'] = 'De gebruikersnaam mag geen \' of " bevatten';
+$lang['please enter your password again'] = 'Vul a.u.b. nogmaals uw wachtwoord in';
+$lang['Webmaster password'] = 'Wachtwoord webbeheerder';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Hou dit vertrouwlijk, het geeft toegang tot de beheermodule';
+$lang['Password [confirm]'] = 'Bevestig wachtwoord';
+$lang['verification'] = 'verificatie';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Hulp nodig ? Stel uw vraag op het <a href="%s" target="_blank">Piwigo forum</a>.';
+$lang['Webmaster mail address'] = 'Email-adres van de webbeheerder';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Met dit email-adres kunnen bezoekers contact opnemen met de beheerder';
+$lang['PHP 5 is required'] = 'PHP 5 is vereist';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Het lijkt er op dat uw webhost momenteel gebruik maakt van PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan proberen uw configuratie om te zetten naar PHP 5 door het aanmaken of wijzigen van een .htaccess bestand.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Opmerking: u kunt uw configuratie ook zelf aanpassen en daarna Piwigo opnieuw opstarten.';
+$lang['Try to configure PHP 5'] = 'Probeer PHP 5 te configureren';
+$lang['Sorry!'] = 'Sorry!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo kon PHP 5 niet configureren.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Neem contact op met de support van uw hosting provider en probeer met hen te bepalen hoe u kunt omschakelen naar PHP 5.';
+$lang['Hope to see you back soon.'] = 'Hoop u snel weer te zien op deze site !.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gefeliciteerd, de Piwigo installatie is afgerond';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Als alternatieve oplossing kunt de tekst in de bovenstaande box kopieren en plakken in bestand "local/config/database.inc.php" (Opgelet : in database.inc.php mag alleen datgene staan dat in het tekstgebied staat, geen return- of spatie-tekens)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Het aanmaken van config-bestand local/config/database.inc.php is mislukt.';
+$lang['Download the config file'] = 'Download het config-bestand';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'U kunt het config-bestand downloaden en het uploaden naar de local/config directory van uw Piwigo-installatie.';
+$lang['Just another Piwigo gallery'] = 'Alweer een Piwigo gallerie';
+$lang['Welcome to my photo gallery'] = 'Welkom bij mijn foto gallerie';
+$lang['Welcome to your new installation of Piwigo!'] = 'Welkom bij uw nieuwe installatie van Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Aarzel niet om onze forum\'s te raadplegen voor hulp: %s';
+?>
Index: tags/2.4.0RC3/language/nl_NL/iso.txt
===================================================================
--- tags/2.4.0RC3/language/nl_NL/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Nederlands [NL]
Index: tags/2.4.0RC3/language/nl_NL/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/nl_NL/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/nl_NL/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Upgrade';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Deze pagina stelt voor om uw
+huidige oude Piwigo-database te converteren naar de nieuwe versie. De upgrade-assistant denkt dat u momenteel gebruik maakt van <strong>release %s</strong> (of equivalent).';
+$lang['Upgrade from version %s to %s'] = 'Upgrade van versie %s naar versie %s';
+$lang['Statistics'] = 'Statistieken';
+$lang['total upgrade time'] = 'totale upgrade tijd';
+$lang['total SQL time'] = 'totale SQL tijd';
+$lang['SQL queries'] = 'SQL queries';
+$lang['Upgrade informations'] = 'Upgrade informatie';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Voor een onderhoudscontrole uit [Administratie>Hulpmiddelen>Onderhoud] indien u problemen ondervindt.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Als voorzorgsmaatregel zijn de volgende plugins gedeactiveerd. Voordat u ze reactiveert moet u deze plugins op upgrades controleren:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Alleen de administrator kan een upgrade uitvoeren: hieronder kunt u inloggen.';
+$lang['You do not have access rights to run upgrade'] = 'U bent niet gerechtigd om een upgrade uit te voeren';
+$lang['All sub-albums of private albums become private'] = 'Alle sub-categorieën van private categorieën worden private';
+$lang['User permissions and group permissions have been erased'] = 'Gebruikers- en groepsrechten zijn verwijderd';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Alleen het voorvoegsel (prefix) van de mini-afbeelding en het email-adres van de webbeheerder zijn bewaard gebleven van de vorige configuratie';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'In <i>%s</i>, voor <b>?></b>, voeg tussen:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Als voorzorgsmaatregel zijn de volgende thema\'s gedeactiveerd. Controleer of er nieuwe versies van deze thema\'s bestaan, voordat u ze reactiveerd:';
+
+?>
Index: tags/2.4.0RC3/language/no_NO/about.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/about.html	(revision 14585)
@@ -0,0 +1,16 @@
+<p>Dette fotogalleriet er basert på Piwigo.</p>
+
+<p>Piwigo er et fotogalleri program for web, laget av et aktivt miljø av
+brukere og utviklere. Tilleggsverktøy gjør at Piwigo lett kan skreddersys
+etter eget ønske. Og på toppen av det hele, Piwigo er gratis og har åpen
+kildekode.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Besøk Piwigo webside</a></p>
+
+<p> Den norske oversettelsen blir vedlikeholdt av (i alfabetisk rekkefølge):
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=16411">abbamust</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=11500">atlew</a></li>
+<li>Laurenz</li>
+</ul>
+              .... mange takk til deg </p>
Index: tags/2.4.0RC3/language/no_NO/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/no_NO/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/admin.lang.php	(revision 14585)
@@ -0,0 +1,894 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d assosier';
+$lang['%d associations'] = '%d assosierer';
+$lang['%d album including'] = '%d album inkludert';
+$lang['%d albums including'] = '%d album inkludert';
+$lang['%d physical'] = ' %d fysisk';
+$lang[' and %d virtual'] = ' og %d virituell';
+$lang['%d album moved'] = '%d album er flyttet';
+$lang['%d albums moved'] = '%d album er flyttet';
+$lang['%d group'] = '%d gruppe';
+$lang['%d groups'] = '%d grupper';
+$lang['%d member'] = '%d medlem';
+$lang['%d members'] = '%d medlemmer';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tager';
+$lang['%d user comment rejected'] = '%d bruker kommentar avvist';
+$lang['%d user comments rejected'] = '%d bruker kommentarer avvist';
+$lang['%d user comment validated'] = '%d bruker kommentar validert';
+$lang['%d user comments validated'] = '%d brukerkommentarer validert';
+$lang['%d user deleted'] = '%d bruker slettet';
+$lang['%d users deleted'] = '%d brukere slettet';
+$lang['%d user'] = '%d bruker';
+$lang['%d users'] = '%d brukere';
+$lang['%d waiting for validation'] = '%d venter på validering';
+$lang['Actions'] = 'Tiltak';
+$lang['Activate'] = 'Aktiver';
+$lang['Add/delete a permalink'] = 'Legg til/Slett en permalink';
+$lang['Add a tag'] = 'Legg til en tag';
+$lang['Add a user'] = 'Legg til en bruker';
+$lang['Add group'] = 'Legg til gruppe';
+$lang['Add'] = 'Legg til';
+$lang['Allow user registration'] = 'Godkjenn bruker registrering';
+$lang['Apply to sub-albums'] = 'Legg til i grunn-album';
+$lang['Associated'] = 'Sammenlignbar';
+$lang['Caddie management'] = 'Kurv behandling';
+$lang['Caddie'] = 'Kurv';
+$lang['Albums authorized thanks to group associations'] = 'Album autorisert grunnet gruppetilhørighet';
+$lang['Album manual order was saved'] = 'Album manuell sortering ble lagret';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Oppdateringssjekk misslyktes av ukjente grunner.';
+$lang['Check for upgrade'] = 'Sjekk etter oppgradering';
+$lang['Comments for all'] = 'Kommentar for alle';
+$lang['Current name'] = 'Gjeldende navn';
+$lang['Database'] = 'Database';
+$lang['Deactivate'] = 'Deaktiver';
+$lang['Delete Representant'] = 'Slett Representant';
+$lang['Delete selected tags'] = 'Slett valgte tag';
+$lang['Delete selected users'] = 'Slett valgte brukere';
+$lang['Deletions'] = 'Slettede';
+$lang['Deny selected groups'] = 'Nekt valgte grupper';
+$lang['Deny selected users'] = 'Nekt valgte brukere';
+$lang['Description'] = 'Beskrivelse';
+$lang['Display options'] = 'Visnings alternativer';
+$lang['Dissociated'] = 'Adskilt';
+$lang['Does not represent'] = 'Er ikke gjeldende';
+$lang['Edit selected tags'] = 'Rediger valgte tag';
+$lang['Edit tags'] = 'Rediger tag';
+$lang['Email admins when a new user registers'] = 'Email administrator når en ny bruker registreres';
+$lang['Email admins when a valid comment is entered'] = 'Email administrator når en kommentar blir lagt til';
+$lang['Email admins when a comment requires validation'] = 'Email administrator når en kommentar trenger godkjenning';
+$lang['Environment'] = 'Miljø';
+$lang['Form'] = 'Skjema';
+$lang['Gallery title'] = 'Galleri tittel';
+$lang['Grant selected groups'] = 'Godkjenn valgte grupper';
+$lang['Grant selected users'] = 'Godkjenn valgte brukere';
+$lang['Group name'] = 'Navn på gruppe';
+$lang['Groups'] = 'Grupper';
+$lang['Guests'] = 'Gjester';
+$lang['History'] = 'Historie';
+$lang['Informations'] = 'Informasjon';
+$lang['Install'] = 'Installere';
+$lang['Link all album photos to a new album'] = 'Link alle album elementer til et nytt album';
+$lang['Link all album photos to some existing albums'] = 'Link alle album elementer til noen eksisterende album';
+$lang['Linked albums'] = 'Linkede album';
+$lang['Lock gallery'] = 'Lås galleri';
+$lang['Maintenance'] = 'Vedlikehold';
+$lang['Edit album permissions'] = 'Rediger album rettigheter';
+$lang['Manage permissions for group "%s"'] = 'Behandle tillatelser for gruppen "%s"';
+$lang['Manage permissions for user "%s"'] = 'Behandle tillatelser for bruker "%s"';
+$lang['Manage tags'] = 'Behandle tags';
+$lang['Members'] = 'Medlemmer';
+$lang['Metadata synchronized from file'] = 'Metadata synkronisert fra fil';
+$lang['Move albums'] = 'Flytt album';
+$lang['Move'] = 'Flytt';
+$lang['Name'] = 'Navn';
+$lang['New name'] = 'Nytt navn';
+$lang['New parent album'] = 'Nytt nåverende album';
+$lang['New tag'] = 'Ny tag';
+$lang['Number of comments per page'] = 'Antall kommentarer per side';
+$lang['Number of rates'] = 'Antall stemmer';
+$lang['Number of thumbnails to create'] = 'Antall miniatyrbilder å lage';
+$lang['Only private albums are listed'] = 'Bare private album er listet';
+$lang['Operating system'] = 'Operativ system';
+$lang['Options'] = 'Alternativer';
+$lang['Other private albums'] = 'Andre private album';
+$lang['Page banner'] = 'Side banner';
+$lang['Parent album'] = 'Nåværende album';
+$lang['Path'] = 'Sti';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s har nylig blitt brukt av albumet %s. Slett dette fra permalinks historie først';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Permalink navn må bestå av a-å, A-Å, 0-9, "-", "_" eller "/". Det må ikke være numerisk eller begynne med et tall etterfulgt av "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s er allerede i bruk av album %s';
+$lang['Permalink history'] = 'Permalinker historie';
+$lang['Permalinks'] = 'Permalinker';
+$lang['Permission denied'] = 'Tillatelse nektet';
+$lang['Permission granted thanks to a group'] = 'Tillatelse godtatt grunnet gruppetilhørighet';
+$lang['Permission granted'] = 'Tillatelse godtatt';
+$lang['Photo informations updated'] = 'Bildeinformasjon oppdatert';
+$lang['Plugins'] = 'Tilleggsprogram';
+$lang['Position'] = 'Posisjon';
+$lang['Preferences'] = 'Preferanser';
+$lang['Properties'] = 'Egenskaper';
+$lang['Random photo'] = 'Tilfeldig bilde';
+$lang['Rate date'] = 'Stemme dato';
+$lang['Rating by guests'] = 'Stemt på av gjester';
+$lang['Rating'] = 'Stemming';
+$lang['Reject'] = 'Avvis';
+$lang['Representant'] = 'Representant';
+$lang['Representation of albums'] = 'Representant til album';
+$lang['Representative'] = 'Representative';
+$lang['Represents'] = 'Representere';
+$lang['Save order'] = 'Lagre rekkefølge';
+$lang['Save to permalink history'] = 'Lagre til permalink historie';
+$lang['Select at least one album'] = 'Velg minst et album';
+$lang['Select at least one photo'] = 'Velg minst et bilde';
+$lang['Select at least one user'] = 'Velg minst en bruker';
+$lang['Show info'] = 'Vis informasjon';
+$lang['Site manager'] = 'Håndter sider';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statistikk';
+$lang['Storage album'] = 'Lagrings album';
+$lang['Sum of rates'] = 'Sum av stemmer';
+$lang['Tag "%s" already exists'] = 'Tag "%s" eksisterer allerede';
+$lang['Tag "%s" was added'] = 'Tag "%s" har blitt lagt til';
+$lang['Tag selection'] = 'Tags utvalg';
+$lang['The %d following tags were deleted'] = 'Følgende %d tags har blitt slettet';
+$lang['Unable to check for upgrade.'] = 'Ikke mulig å sjekke for oppdatering.';
+$lang['Uninstall'] = 'Avinstaller';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'bruk standard bilde sortering (definert i konfigurasjons filen)';
+$lang['User comments validation'] = 'Brukerkommentar validering';
+$lang['Users'] = 'Brukere';
+$lang['Validate'] = 'Valider';
+$lang['Validation'] = 'Validering';
+$lang['Version'] = 'Versjon';
+$lang['Virtual albums to move'] = 'Virtuelle album å flytte';
+$lang['Virtual album name'] = 'Virtuelle album navn';
+$lang['Webmaster cannot be deleted'] = 'Webmaster kan ikke bli slettet';
+$lang['You are running on development sources, no check possible.'] = 'Du kjører på utviklingskilder, kontroll er ikke mulig.';
+$lang['You cannot delete your account'] = 'Du kan ikke slette din konto';
+$lang['You cannot move an album in its own sub album'] = 'Du kan ikke flytte et album i sitt eget grunn album';
+$lang['You need to confirm deletion'] = 'Du må bekrefte sletting';
+$lang['Add tags'] = 'Legg til tags';
+$lang['Associate to album'] = 'Assosier med album';
+$lang['associate to group'] = 'assosier med gruppe';
+$lang['Authorized'] = 'Godkjent';
+$lang['Add a virtual album'] = 'Legg til et virtuelt album';
+$lang['Authorize users to add comments on selected albums'] = 'Godkjen brukere til å legge inn kommentarer på valgte album';
+$lang['The name of an album must not be empty'] = 'Navnet på album kan ikke være tomt';
+$lang['Lock albums'] = 'Lås album';
+$lang['Private'] = 'Privat';
+$lang['Public'] = 'Offentlig';
+$lang['Find a new representant by random'] = 'Finn en ny tilfeldig representant';
+$lang['Public / Private'] = 'Offentlig / Privat';
+$lang['Manage authorizations for selected albums'] = 'Behandle autorisasjoner for valgt album';
+$lang['Virtual album added'] = 'Virtuelt album lagt til';
+$lang['Virtual album deleted'] = 'Virtuelt album slettet';
+$lang['Access type'] = 'Tilgangstype type';
+$lang['Information data registered in database'] = 'Informasjons data registrert i database';
+$lang['Default display'] = 'Standard visning';
+$lang['The gallery URL is not valid.'] = 'Galleri URL er ikke gyldig.';
+$lang['Main'] = 'Main';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Antall kommentarer per side må være mellom 5 og 50.';
+$lang['Configuration'] = 'Konfigurasjon';
+$lang['confirm'] = 'Godkjenn';
+$lang['Date'] = 'Dato';
+$lang['delete album'] = 'slett album';
+$lang['Dissociate from album'] = 'Skill fra album';
+$lang['dissociate from group'] = 'Skill fra gruppe';
+$lang['Album updated successfully'] = 'Album vellykket oppdatert';
+$lang['photos per page'] = 'elementer per side';
+$lang['High definition enabled'] = 'Høy oppløsning aktivert';
+$lang['File'] = 'Fil';
+$lang['first photo added on %s'] = 'første element lagt til den %s';
+$lang['Forbidden'] = 'Forbudt';
+$lang['global mode'] = 'global modus';
+$lang['group "%s" added'] = 'gruppe "%s" lagt til';
+$lang['group "%s" deleted'] = 'gruppe "%s" slettet';
+$lang['group "%s" updated'] = 'gruppe "%s" oppdatert';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Navnet til en gruppe må inneholde " eller \' eller være tom.';
+$lang['This name is already used by another group.'] = 'Dette navnet er allerede i bruk i av annen gruppe.';
+$lang['High definition'] = 'Høy oppløsning';
+$lang['jump to album'] = 'hopp til album';
+$lang['jump to photo'] = 'hopp til bilde';
+$lang['leave'] = 'gå ut';
+$lang['Lock'] = 'Lås';
+$lang['Locked'] = 'Låst';
+$lang['manage album photos'] = 'behandle album elementer';
+$lang['manage sub-albums'] = 'behandle grunn-album';
+$lang['Manage'] = 'Behandle';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Prossessen svarer ikke, behandling fortsetter [Estimert tid: %d sekund].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Prossessen svarer ikke, behandling fortsetter [Estimert tid: %d sekunder].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Tiden å forberede liste over brukere som vil bli mailet er begrenset. Andre brukere er ikke listet.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tiden for å sende mail er begrenset. Andre mail er hoppet over.';
+$lang['To send ?'] = 'Å sende?';
+$lang['Last send'] = 'Sist sendt';
+$lang['email'] = 'Email';
+$lang['User'] = 'Bruker';
+$lang['Complementary mail content'] = 'Kompletterende mail innhold';
+$lang['See you soon,'] = 'På gjensyn,';
+$lang['Go to'] = 'Gå til';
+$lang['Hello'] = 'Hallo';
+$lang['New photos were added'] = 'Nye elementer har blitt lagt til';
+$lang['on'] = 'på';
+$lang['between'] = 'mellom';
+$lang['and'] = 'og';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster har satt deg opp for beskjeder via e-mail.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Du har satt deg opp for beskjeder vi e-mail.';
+$lang['To subscribe'] = 'for å melde deg på nyhetsbrev';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Om du har spørsmål eller problemer, vennligst send mail til';
+$lang['[NBM] Problems or questions'] = '[NBM] Problem eller spørsmål.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster har fjernet deg for beskjeder via e-mail.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Du har fjernet deg for beskjeder vi e-mail.';
+$lang[', click on'] = ', Klikk på';
+$lang['To unsubscribe'] = 'for å fjerne nyhetsbrev';
+$lang['With blank value, gallery title will be used'] = 'Om blank verdi, galleri tittel vil bli brukt';
+$lang['Notification'] = 'Påminnelser';
+$lang['Error when sending email to %s [%s].'] = 'Feil ved sending av e-mail til %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Mail sent til %s [%s].';
+$lang['%d mail was sent.'] = '%d mail har blitt sendt.';
+$lang['%d mails were sent.'] = '%d mail har blitt sendt.';
+$lang['%d mail was not sent.'] = '%d mail har ikke blitt sent.';
+$lang['%d mails were not sent.'] = '%d mail har ikke blitt sent.';
+$lang['No mail to send.'] = 'Ingen mail å sende.';
+$lang['There is no available subscribers to mail.'] = 'Det er ingen abonnenter å varsle via e-mail.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Abonnenter kan bli listet (tilgjengelige) kun om det er nye meldinger.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Uansett kun webmastere ser denne fanen, ingen administratorer.';
+$lang['No user to send notifications by mail.'] = 'Ingen brukere å medele via mail.';
+$lang['New photos added'] = 'Nye elementer lagt til';
+$lang['Subscribe to notification by mail'] = 'Abonner for varsling via e-mail';
+$lang['Unsubscribe from notification by mail'] = 'Fjern abonnent på varsling via e-mail';
+$lang['Parameter'] = 'Settings';
+$lang['Operation in progress'] = 'Prosseserer behandling.';
+$lang['Please wait...'] = 'Vennligst vent...';
+$lang['Continue processing treatment'] = 'Fortsett pågående behandling';
+$lang['Add detailed content'] = 'Legg til detaljert innhold';
+$lang['Send mail as'] = 'Send mail som';
+$lang['Send mail to users'] = 'Send mail til brukere';
+$lang['Send'] = 'Send';
+$lang['Subscribed'] = 'Abonnert';
+$lang['Subscribe'] = 'Abonnere';
+$lang['Parameters'] = 'Parametere';
+$lang['Select recipients'] = 'Velg mottagere';
+$lang['Subscribe/unsubscribe users'] = 'Påmeld/avmeld brukere';
+$lang['Unsubscribed'] = 'Avmeldt';
+$lang['%d parameter was updated.'] = '%d parameter oppdatert.';
+$lang['%d parameters were updated.'] = '%d parametere oppdatert.';
+$lang['%d user was not updated.'] = '%d bruker ikke oppdatert.';
+$lang['%d users were not updated.'] = '%d brukere ikke oppdatert.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Bruker %s [%s] fjernet fra påmeldingslisten.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Bruker %s [%s] lagt til påmeldingslisten.';
+$lang['%d user was updated.'] = '%d bruker oppdatert.';
+$lang['%d users were updated.'] = '%d brukere oppdatert.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Bruker %s [%s] er ikke fjernet fra påmeldingslisten.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'bruker %s [%s] ikke lagt til påmeldingslisten.';
+$lang['User %s [%s] added.'] = 'Bruker %s [%s] lagt til.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Advarsel: Påmelding eller avmelding vil sende mail til brukere';
+$lang['Send mail on HTML format'] = 'Send mail i HTML format';
+$lang['Include display of recent photos grouped by dates'] = 'Inkluder visning av siste bilder grupert etter dato';
+$lang['Available only with HTML format'] = 'Tilgjengelig kun i HTML format';
+$lang['no write access'] = 'ingen skrive tilgang';
+$lang['Permissions'] = 'Tillatelser';
+$lang['private'] = 'privat';
+$lang['public'] = 'almenn';
+$lang['Purge never used notification feeds'] = 'Tøm aldrig brukte meldinger feeds';
+$lang['Purge sessions'] = 'Tøm sesjoner';
+$lang['randomly represented'] = 'tilfeldige representativer';
+$lang['registration date'] = 'registrert dato';
+$lang['clean'] = 'Rydd opp';
+$lang['Create this site'] = 'Lag denne siden';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'test ekstern side';
+$lang['remove tags'] = 'fjern tags';
+$lang['Repair and optimize database'] = 'Reparer og optimaliser database';
+$lang['selection'] = 'utvalg';
+$lang['set to'] = 'sett til';
+$lang['singly represented'] = 'faste representanter';
+$lang['This site already exists'] = 'Denne siden eksisterer allerede';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Lag en ny side : (gi oss URL´en til create_listing_file.php)';
+$lang['created'] = 'laget';
+$lang['delete'] = 'slette';
+$lang['delete this site and all its attached elements'] = 'slett denne siden og all relatert informasjon';
+$lang['deleted'] = 'slettet';
+$lang['an error happened'] = 'en feil oppstod';
+$lang['Local'] = 'Lokal';
+$lang['Remote'] = 'Ekstern side';
+$lang['update the database from files'] = 'oppdater databasen med filer';
+$lang['status'] = 'status';
+$lang['Directory'] = 'Katalog';
+$lang['sub-albums'] = 'grunn-album';
+$lang['Synchronize metadata'] = 'synkroniser metadata';
+$lang['target'] = 'mål';
+$lang['Thumbnail'] = 'miniatyr bilde';
+$lang['title'] = 'tittel';
+$lang['Album list management'] = 'Albumliste behandling';
+$lang['Piwigo configuration'] = 'Piwigo konfigurasjon';
+$lang['Edit album'] = 'Rediger album';
+$lang['Group management'] = 'Gruppe behandling';
+$lang['User list'] = 'Bruker liste';
+$lang['Edit photo information'] = 'Endre bilde informasjon';
+$lang['Database synchronization with files'] = 'Database synkronisering med filer';
+$lang['all'] = 'alle';
+$lang['height must be a number superior to'] = 'høyde må være et nummer høyere en';
+$lang['width must be a number superior to'] = 'bredde må være et nummer høyere en';
+$lang['for the file format'] = 'for fil format';
+$lang['Photo unreachable or no support'] = 'Bilde ikke tilgjengelig eller i feil filformat';
+$lang['GD version'] = 'GD versjon';
+$lang['General statistics'] = 'Generell statistikk';
+$lang['average time'] = 'gjennomsnitlig tid';
+$lang['number of miniaturized photos'] = 'antall miniatyrbilder laget';
+$lang['total time'] = 'total tid';
+$lang['for this file format'] = 'for dette fil format';
+$lang['unit mode'] = 'singel modus';
+$lang['Unlocked'] = 'Opplåst';
+$lang['unset'] = 'ubestemt';
+$lang['Update albums informations'] = 'Oppdater album informasjon';
+$lang['Update photos information'] = 'Oppdater bilde informasjon';
+$lang['Synchronize'] = 'Synkroniser';
+$lang['reduce to single existing albums'] = 'reduser til enkelt eksisterende album';
+$lang['Choose an option'] = 'Velg et alternativ';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'vis all informasjon (tillagte album og elemter, slettede album og elementer)';
+$lang['Error list'] = 'Liste med feilmeldinger';
+$lang['Errors caption'] = 'Feil legender';
+$lang['Detailed informations'] = 'Detaljert informasjon';
+$lang['File/directory read error'] = 'Lesefeil i Fil/katalog';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Fil eller katalog kan ikke nås (enten eksisterer den ikke eller tilgang er nektet)';
+$lang['albums deleted in the database'] = 'album slettet i database';
+$lang['photos deleted from the database'] = 'elementer slettet i database';
+$lang['photos candidates for metadata synchronization'] = 'bilder klare for metadata synkronisering';
+$lang['photos informations synchronized with files metadata'] = 'element informasjon synkronisert med filenes metadata';
+$lang['errors during synchronization'] = 'feil under synkronisering';
+$lang['albums added in the database'] = 'album lagt til i databasen';
+$lang['photos added in the database'] = 'elementer lagt til i databasen';
+$lang['photos updated in the database'] = 'elementer oppdatert i databasen';
+$lang['Search for new images in the directories'] = 'Søk etter nye bilder i mappene';
+$lang['added'] = 'lagt til';
+$lang['Metadata synchronization results'] = 'Metadatas synkroniserings resultat';
+$lang['only perform a simulation (no change in database will be made)'] = 'Utfør kun en simulering (ingen forandringer blir gjort i databasen)';
+$lang['Simulation'] = 'Simulering';
+$lang['directories + files'] = 'mapper + filer';
+$lang['only directories'] = 'kun mapper';
+$lang['synchronize files structure with database'] = 'Synkroniser filstruktur med databasen';
+$lang['synchronize files metadata with database photos informations'] = 'synkroniser database elementer med filers metadata';
+$lang['even already synchronized photos'] = 'også allerede synkroniserte elementer';
+$lang['Used metadata'] = 'Metadata brukt';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Navnet til mapper og filer må kun bestå av bokstaver, tall, "-", "_" eller "."';
+$lang['wrong filename'] = 'feil filnavn';
+$lang['Upload'] = 'Last opp';
+$lang['user "%s" added'] = 'bruker "%s" lagt til';
+$lang['User status'] = 'Bruker status';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Generisk';
+$lang['user_status_guest'] = 'Gjest';
+$lang['user_status_normal'] = 'Bruker';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Virtuelt album';
+$lang['Waiting'] = 'Avventer';
+$lang['default'] = 'Standard';
+$lang['Toggle \'default group\' property'] = 'Reverser \'Standard gruppering\' egenskaper';
+$lang['Advanced features'] = 'Avanserte funksjoner';
+$lang['Overall'] = 'Oversikt';
+$lang['Year'] = 'År';
+$lang['Month'] = 'Måned';
+$lang['Day'] = 'Dag';
+$lang['Pages seen'] = 'Sider sett';
+$lang['Time'] = 'Tid';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Element';
+$lang['Section'] = 'Seksjon';
+$lang['An information email was sent to group "%s"'] = 'Informasjons email sendt til gruppe "%s"';
+$lang['Send an information email to group members'] = 'Send en informasjons email til gruppe medlemmer';
+$lang['Group'] = 'Gruppe';
+$lang['[%s] Visit album %s'] = '[%s] besøk album %s';
+$lang['Hello,'] = 'Hallo,';
+$lang['See you soon.'] = 'Vi sees senere.';
+$lang['Discover album:'] = 'Utforsk album:';
+$lang['Mail content'] = 'Mail innhold';
+$lang['none'] = 'ingen';
+$lang['high'] = 'Høy';
+$lang['other'] = 'andre';
+$lang['Element type'] = 'Element type';
+$lang['Image id'] = 'Bilde id';
+$lang['Summary'] = 'Resymé';
+$lang['%d line filtered'] = '%d linje filtrert';
+$lang['%d lines filtered'] = '%d linjer filtrert';
+$lang['%d guest'] = '%d gjest';
+$lang['%d guests'] = '%d gjester';
+$lang['Hour'] = 'Time';
+$lang['guest'] = 'gjest';
+$lang['default values'] = 'standard verdi';
+$lang['Guest cannot be deleted'] = 'Gjest kan ikke bli slettet';
+$lang['Default user cannot be deleted'] = 'Standard bruker kan ikke slettes';
+$lang['Purge history detail'] = 'Tøm historie detaljer';
+$lang['Purge history summary'] = 'Tøm historie sammendrag';
+$lang['Check integrity'] = 'Integritets sjekk';
+$lang['Anomaly'] = 'Unormal';
+$lang['Correction'] = 'Rettelse';
+$lang['Automatic correction'] = 'Automatisk rettelse';
+$lang['Impossible automatic correction'] = 'Automatisk rettelse umulig';
+$lang['Correction applied with success'] = 'Rettelse er gjennomført';
+$lang['Correction applied with error'] = 'Rettelse er gjennomført med feil';
+$lang['%d anomaly has been detected.'] = '%d en unormalitet har blitt oppdaget.';
+$lang['%d anomalies have been detected.'] = '%d unormaliteter har blitt oppdaget.';
+$lang['%d anomaly has been corrected.'] = '%d unormalitet har blitt rettet.';
+$lang['%d anomalies have been detected corrected.'] = '%d en unormaliteter har blitt oppdaget og rettet.';
+$lang['%d anomaly has not been corrected.'] = '%d unormalitet har ikke blitt rettet.';
+$lang['%d anomalies have not been corrected.'] = '%d unormaliteter har ikke blitt rettet.';
+$lang['Go to %s or %s for more informations'] = 'Gå til %s eller %s for mer informasjon';
+$lang['the forum'] = 'Forum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s verdier feil da xfif ikke støttes';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s må være satt til false i din local/config/config.inc.php file';
+$lang['Main "guest" user does not exist'] = 'Hovedbruker "gjest" finnes ikke';
+$lang['Main "guest" user status is incorrect'] = 'Hovedbruker "gjest" brukers status er feil';
+$lang['Default user does not exist'] = 'Standard bruker finnes ikke';
+$lang['Main "webmaster" user does not exist'] = 'Hovedbruker "webmaster" finnes ikke';
+$lang['Main "webmaster" user status is incorrect'] = 'Hovedbruker "webmaster" brukers status er feil';
+$lang['User "%s" created with "%s" like password'] = 'Bruker "%s" laget med "%s" som passord';
+$lang['Status of user "%s" updated'] = 'Bruker "%s" status oppdatert';
+$lang['add new photos to caddie'] = 'legg nytt element i kurv';
+$lang['No display'] = 'Ingen visning';
+$lang['Classic display'] = 'klassisk visning';
+$lang['Hoverbox display'] = 'Sveveboks visning';
+$lang['Mail address is obligatory for all users'] = 'Mail addresse er obligatorisk for alle brukere';
+$lang['Minimum privacy level'] = 'Minimum privat nivå';
+$lang['Privacy level'] = 'Privat nivå';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakter';
+$lang['Level 2'] = 'Venner';
+$lang['Level 4'] = 'Familie';
+$lang['Level 8'] = 'Administrator';
+$lang['Reinitialize check integrity'] = 'Re initialier integritets sjekk';
+$lang['Check all'] = 'Sjekk alle';
+$lang['Uncheck all'] = 'Avsjekk alle';
+$lang['Check automatic corrections'] = 'Sjekk endringer automatisk';
+$lang['Apply selected corrections'] = 'Legg til valgte endringer';
+$lang['Ignore selected anomalies'] = 'Ignorer valgte unormaliteter';
+$lang['Refresh'] = 'Oppdater';
+$lang['The anomaly will be ignored until next application version'] = 'Unormalitet vil bli ignorert  frem til neste program versjon';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Rettet unormalitet vil ikke lenger bli ignorert';
+$lang['%d anomaly has been ignored.'] = '%d unormalitet har blitt ignorert.';
+$lang['%d anomalies have been ignored.'] = '%d unormaliteter har blitt ignorert.';
+$lang['Plugins which need upgrade'] = 'Tilleggsverktøy som trenger oppdatering ';
+$lang['Plugin list'] = 'Liste over tilleggsverktøy';
+$lang['Check for updates'] = 'Sjekk for oppdateringer';
+$lang['Other plugins'] = 'Andre tillegsverktøy tilgjengelige';
+$lang['Last revisions'] = 'Siste revisjon';
+$lang['Are you sure you want to delete this plugin?'] = 'Er du sikker på å slette tilleggsverktøy?';
+$lang['Are you sure you want to install this plugin?'] = 'Er du sikker på å installere tilleggsverktøy?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Er du sikker på at du vil installere den oppgraderingen? Du må verifisere om ikke denne versjonen trenger avinstallasjon først.';
+$lang['Plugin has been successfully copied'] = 'Tilleggsverktøyet har blitt suksessfult kopiert';
+$lang['You might go to plugin list to install and activate it.'] = 'Gå til tilleggsverktøy liste for å installere og aktivere det.';
+$lang['Can\'t create temporary file.'] = 'Midlertidig fil kan ikke bli laget.';
+$lang['Can\'t download archive.'] = 'Arkiv kan ikke bli nedlastet.';
+$lang['Can\'t read or extract archive.'] = 'Arkiv kan ikke leses eller pakkes ut.';
+$lang['An error occured during extraction (%s).'] = 'En feil oppstod under utpakking:(%s)';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Vennligst sjekk "plugins" mappe og under-mappers rettigheter (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Tilkobling til server ikke mulig.';
+$lang['Purge compiled templates'] = 'Tøm kompilerte maler (templates)';
+$lang['ACCESS_0'] = 'Fri tillgang';
+$lang['ACCESS_1'] = 'Tilgjengelig for alle';
+$lang['ACCESS_2'] = 'Tilgjengelig for registrerte brukere';
+$lang['ACCESS_3'] = 'Tilgjengelig for administratorer';
+$lang['ACCESS_4'] = 'Tilgjengelig for webmastere';
+$lang['ACCESS_5'] = 'Ingen adgang';
+$lang['Support'] = 'Hjelp';
+$lang['Documentation'] = 'Dokumentasjon';
+$lang['A new version of Piwigo is available.'] = 'En ny versjon av Piwigo er tilgjengelig.';
+$lang['Piwigo Administration'] = 'Piwigo Administrasjon';
+$lang['Piwigo version'] = 'Piwigo versjon';
+$lang['You are running the latest version of Piwigo.'] = 'Du kjører siste versjon av Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Versjon av %s [%s] installert er ikke kompatibel med den ønskede versjon [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'du bør oppgradere systemet dit for å kunne få full utnyttelse av programmet, ellers kan programmet virke ustabilt eller ikke i det hele tatt';
+$lang['Deleted on'] = 'Slettet den';
+$lang['Last hit'] = 'Siste treff';
+$lang['GD library is missing'] = 'GD bibliotek mangler';
+$lang['Templates'] = 'Maler (templates)';
+$lang['Extend for templates'] = 'Utivd maler (templates)';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Erstattning av orginal mal med egentilpasset mal fra template-extension grunn-mappe';
+$lang['Replacers (customized templates)'] = 'Alternativer (egentilpassete maler)';
+$lang['Original templates'] = 'Orginal mal (templates)';
+$lang['Optional URL keyword'] = 'Alternativ URL nøkkel ord';
+$lang['Templates configuration has been recorded.'] = 'Mal konfigurasjon er blitt registrert.';
+$lang['All optimizations have been successfully completed.'] = 'All optimalisering har blitt utført.';
+$lang['Optimizations have been completed with some errors.'] = 'Optimalisering har blitt utført med feil.';
+$lang['Modify information'] = 'Endre informasjon';
+$lang['nothing'] = 'ingen ting';
+$lang['overrides existing values with empty ones'] = 'overskriver eksisterende verdier med tomme';
+$lang['Manage photo ranks'] = 'Behandle bilde rangering';
+$lang['Edit ranks'] = 'Rediger rangering';
+$lang['No photo in this album'] = 'Ingen elementer i dette album';
+$lang['Images manual order was saved'] = 'Bilders manuelle rekkefølge lagret';
+$lang['ranks'] = 'rangering';
+$lang['By rank'] = 'Etter rangering';
+$lang['Manual order'] = 'Manuell rekefølge';
+$lang['Drag to re-order'] = 'Dra og slipp for å endre rekkefølge';
+$lang['Quick Local Synchronization'] = 'Rask lokal synkronisering';
+$lang['No photo can be deleted'] = 'Ingen foto kan slettes';
+$lang['Delete selected photos'] = 'Slett valgte foto';
+$lang['%d photo was deleted'] = '%d foto slettet';
+$lang['%d photos were deleted'] = '%d foto slettet';
+$lang['Downloads'] = 'Nedlastinger';
+$lang['Released on'] = 'Sluppet den';
+$lang['Number of downloads'] = 'Antall nedlastinger';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo nyhets brev';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Hold deg oppdatert i Piwigo prosjektet, abonner på Piwigo nyhetsbrev. Du vil få tilsendt email når en ny versjon er tilgjengelig (til tider med sikkerhets fix, noe som er viktig å oppdaere) og når større hendelser skjer i prosjektet. Kun noen få mail per år.';
+$lang['Subscribe %s'] = 'Abonner %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abonner %s på Piwigo nyhets brev';
+$lang['Purge search history'] = 'Tøm søke historikk';
+$lang['Hide'] = 'Gjem';
+$lang['Password is missing. Please enter the password.'] = 'Passord mangler. Vennligst skriv passord.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Passord bekreftelse mangler. Vennligst bekreft det valgte passord.';
+$lang['Allow users to edit their own comments'] = 'Tillat bruker å redigere sine egne kommentarer';
+$lang['Allow users to delete their own comments'] = 'Tillat brukere å slette sine egne kommentarer';
+$lang['Email administrators when a comment is modified'] = 'Email administrator når en kommentar er endret';
+$lang['Email administrators when a comment is deleted'] = 'Email administrator når en kommentar er slettet';
+$lang['Cannot delete the old permalink !'] = 'Gammel permalink kan ikke slettes!';
+$lang['Hit'] = 'Treff';
+$lang['Tools'] = 'Verktøy';
+$lang['Photos'] = 'Foto';
+$lang['Themes'] = 'Temaer';
+$lang['Instructions to use Piwigo'] = 'Instruksjoner i bruk av Piwigo';
+$lang['Installed Themes'] = 'Installerte temaer';
+$lang['Add New Theme'] = 'Legg til et nytt tema';
+$lang['Forbid this theme to users'] = 'Nekt dette tema for brukere';
+$lang['Set as default theme for unregistered and new users'] = 'Set som standard tema for uregistrerte og nye brukere';
+$lang['unknown'] = 'unkjent';
+$lang['Upload Photos'] = 'Last opp foto';
+$lang['Drop into album'] = 'Slipp inn i album';
+$lang['+ Add an upload box'] = '+ legg til en opplastings boks';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Lag "%s" mappe i roten av din Piwigo installasjon';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Gi skrive tilgang (chmod 777) til "%s" mappe i roten av din Piwigo installasjon';
+$lang['existing album'] = 'eksisterende album';
+$lang['create a new album'] = 'lag et nytt album';
+$lang['Album name'] = 'Album navn';
+$lang['Album "%s" has been added'] = 'Album "%s" har blitt lagt til';
+$lang['Uploaded Photos'] = 'Opplastede bilder';
+$lang['%d photos uploaded'] = '%d foto opplastet';
+$lang['Privacy level set to "%s"'] = 'Privat nivå satt til "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Album "%s" består nå av %d bilder';
+$lang['Manage this set of %d photos'] = 'Behandle disse %d bildene';
+$lang['Select files'] = 'Velg filer';
+$lang['Everybody'] = 'Alle';
+$lang['Who can see these photos?'] = 'Hvem kan se disse bildene?';
+$lang['Who can see this photo?'] = 'Hvem kan se dette bildet?';
+$lang['Settings'] = 'Instillinger';
+$lang['Resize'] = 'Endre størrelse';
+$lang['Maximum Width'] = 'Maksimum bredde';
+$lang['pixels'] = 'piksler';
+$lang['Maximum Height'] = 'Maksimum høyde';
+$lang['Image Quality'] = 'Bilde kvalitet';
+$lang['Save Settings'] = 'Lagre innstillinger';
+$lang['Your configuration settings are saved'] = 'Dine konfigurasjons instillinger er lagret';
+$lang['Active Themes'] = 'Aktive temaer';
+$lang['Add write access to the "%s" directory'] = 'Legg til skriver tilgang på "%s" mappe';
+$lang['Administration Home'] = 'Administrasjon Hjem';
+$lang['Change Admin Colors'] = 'Endre administrasjons farger';
+$lang['Delete this theme'] = 'Slett dette tema';
+$lang['Directory does not exist'] = 'mappen eksisterer ikke';
+$lang['Download,'] = 'Last ned,';
+$lang['FTP + Synchronization'] = 'FTP + synkronisering';
+$lang['Get Support on Piwigo Forum'] = 'Få hjelp på Piwigo forum';
+$lang['Help Me'] = 'Hjelp meg';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Dette tema kan ikke aktiveres, da temaet mangler: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Dette temaet kan ikke slettes, andrfe temaer er avhengig av det: %s';
+$lang['Inactive Themes'] = 'Innaktive temaer';
+$lang['Install on your computer,'] = 'Installer på din maskin,';
+$lang['Make this theme available to users'] = 'Gjør dette temaet tilgjengelig for brukere';
+$lang['Page end'] = 'Slutten av side';
+$lang['Piwigo Uploader'] = 'Piwigo opplaster';
+$lang['Read Piwigo Documentation'] = 'Les Piwigo dokumentasjon';
+$lang['Start pLoader and add your photos.'] = 'Start pLoader og legg til dine bilder.';
+$lang['Switch to clear or dark colors for administration'] = 'Bytt til lyse eller mørke farger for administrasjon';
+$lang['Theme has been successfully installed'] = 'Temaet er installert';
+$lang['Visit Gallery'] = 'Besøk galleriet';
+$lang['Visit Piwigo project website'] = 'Besøk Piwigo prosjektets webside';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader står for <em>Piwigo Opplaster</em>. Fra din maskin, pLoader klargjør dine bilder og overfører demtil ditt Piwigo photo galleri.';
+$lang['Guest Settings'] = 'Instillinger for gjester';
+$lang['Main Page'] = 'Hovedside';
+$lang['Photo Page'] = 'Bilde side';
+$lang['Activate Navigation Bar'] = 'Aktiver navigasjon bar';
+$lang['Activate Navigation Thumbnails'] = 'Aktiver navigasjon miniatyrbilder';
+$lang['Activate icon "%s"'] = 'Aktiver icon "%s"';
+$lang['Photo Properties'] = 'Bilde egenskaper';
+$lang['Allow user customization'] = 'Godkjenn brukers egne instillinger';
+$lang['Languages'] = 'Språk';
+$lang['Installed Languages'] = 'Installerte språk';
+$lang['Add New Language'] = 'Legg til nytt språk';
+$lang['Language has been successfully installed'] = 'Språkpakke har blitt installert';
+$lang['Select:'] = 'Velg:';
+$lang['None'] = 'Ingen';
+$lang['Invert'] = 'Inverter';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Umulig å deaktivere dette tema, du må minst et tema aktivt.';
+$lang['Webmaster status is required.'] = 'Webmaster status er nødvendig.';
+$lang['Bound Theme'] = 'Bundet tema';
+$lang['Allow rating'] = 'Godta gradering';
+$lang['Select at least one comment'] = 'Velg minst 1 kommentar';
+$lang['Active Plugins'] = 'Aktive tilleggsprogram';
+$lang['Inactive Plugins'] = 'Inaktive tilleggsprogram';
+$lang['Missing Plugins'] = 'Manglende tilleggsprogram';
+$lang['Uninstalled Plugins'] = 'Avinstallerte tilleggsprogram';
+$lang['By %s'] = 'Av %s';
+$lang['Visit plugin site'] = 'Besøk tilleggsprogram side';
+$lang['Active Languages'] = 'Aktive språk';
+$lang['Delete this language'] = 'Slett denne språkpakken';
+$lang['Forbid this language to users'] = 'Forby dette språket for brukere';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Umulig å deaktivere dette språket, sett et annet språk som standard først.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Umulig å deaktivere dette språket, du trenger minst et språk.';
+$lang['Inactive Languages'] = 'Inaktive språk';
+$lang['Make this language available to users'] = 'Gjør dette språket tilgjengelig for brukere';
+$lang['Set as default language for unregistered and new users'] = 'Sett som standard språk for uregistrerte og nye brukerer';
+$lang['Add Photos'] = 'Legg til bilder';
+$lang['The following tag was deleted'] = 'Følgende tag er slettet';
+$lang['Miscellaneous'] = 'Diverse';
+$lang['Virtual Links'] = 'Virtuelle Linker';
+$lang['There is no other language available.'] = 'Det er ingen andre språk tilgjengelig.';
+$lang['There is no other plugin available.'] = 'Det er ingen andre tilleggsprogrammer tilgjengelig.';
+$lang['There is no other theme available.'] = 'Det er ingen andre temaer tilgjengelig.';
+$lang['Add another set of photos'] = 'Legg til et annet sett med bilder';
+$lang['Order of menubar items has been updated successfully.'] = 'Sorteringen av meny elementer har blitt opppdatert.';
+$lang['This theme was not designed to be directly activated'] = 'Dette tema er ikke laget for å bli direkte aktivert';
+$lang['Pending Comments'] = 'Ventende kommentarer';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'I din php.ini fil, om upload_max_filesize (%sB) er større en post_max_size (%sB), bør du endre denne instillingen';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif tillegg ikke tilgjengelig, administrator bør gjøre bruk av exif utilgjengelig';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Den opplastede filen overgår upload_max_filesize direktivet i php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Den opplastede filen overgår post_max_size direktivet i php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Den opplastede filen overgår MAX_FILE_SIZE direktivetsom er spesifisert i HTML skjemaet';
+$lang['The uploaded file was only partially uploaded'] = 'Filen ble bare delvis opplastet';
+$lang['No file was uploaded'] = 'Ingen filer ble lastet opp';
+$lang['Missing a temporary folder'] = 'Mangler en midlertidig mappe';
+$lang['Failed to write file to disk'] = 'Feilet i å skrive til disk';
+$lang['File upload stopped by extension'] = 'Fil| opplastingen stoppet av tillegg';
+$lang['Unknown upload error'] = 'Ukjent opplastings feil';
+$lang['Error on file "%s" : %s'] = 'Feil på fil "%s" : %s';
+$lang['Menu Management'] = 'Menyer';
+$lang['automatic order'] = 'automatisk sortering';
+$lang['manual order'] = 'manuell sortering';
+$lang['Albums automatically sorted'] = 'Album automatisk sortert';
+$lang['Batch Manager'] = 'Batch Behandler';
+$lang['include child albums'] = 'inkluder under album';
+$lang['Selection'] = 'Utvalg';
+$lang['Action'] = 'Tiltak';
+$lang['Set author'] = 'Sett forfatter';
+$lang['Set title'] = 'Sett tittel';
+$lang['Set creation date'] = 'Sett opprettelses dato';
+$lang['Apply action'] = 'Aktiver handlinger';
+$lang['on the %d selected photos'] = 'på de %d valgte bildene';
+$lang['%d of %d photos selected'] = '%d av %d bilder valgt';
+$lang['No photo selected, %d photos in current set'] = 'Ingen foto valgt, %d foto i forrige sett';
+$lang['All %d photos are selected'] = 'Alle %d bilder er valgt';
+$lang['remove this filter'] = 'fjern filter';
+$lang['Predefined filter'] = 'Redefiner filter';
+$lang['Last import'] = 'Siste importering';
+$lang['With no virtual album'] = 'Uten virtuelle album';
+$lang['Duplicates'] = 'duplikater';
+$lang['Add a filter'] = 'Legg inn filter';
+$lang['Remove all filters'] = 'Fjern alle filtere';
+$lang['Refresh photo set'] = 'Oppdater bilde sesjonen';
+$lang['The whole page'] = 'Hele siden';
+$lang['The whole set'] = 'Hele sesjonen';
+$lang['No photo in the current set.'] = 'Ingen foto i gjeldende sesjon.';
+$lang['No photo selected, no action possible.'] = 'Ingne bilder valgt, ingen tilltak mulig.';
+$lang['Choose an action'] = 'Velg et tilltak';
+$lang['remove author'] = 'fjern forfatter';
+$lang['Type here the author name'] = 'Skriv forfatter navn her';
+$lang['remove title'] = 'fjern tittel';
+$lang['Type here the title'] = 'Skriv tittel her';
+$lang['remove creation date'] = 'fjern  opprettelse dato';
+$lang['With no album'] = 'Uten album';
+$lang['With no tag'] = 'Uten tag';
+$lang['Album photos associated to the following albums: %s'] = 'Album bilder assosiert til følgende album: %s';
+$lang['Delete orphan tags'] = 'Slett foreldreløse tagger';
+$lang['delete photo'] = 'slett bilde';
+$lang['Orphan tags deleted'] = 'Foreldreløse  tagger slettet';
+$lang['Week starts on'] = 'Uke starter på';
+$lang['You have %d orphan tags: %s.'] = 'Du har %d foreldreløse tagger: %s.';
+$lang['Remove from caddie'] = 'Fjern fra kurv';
+$lang['Themes which need upgrade'] = 'Temaer som trenger oppgradering'; 
+$lang['Languages which need upgrade'] = 'Språk som trenger oppgradering'; 
+$lang['All themes are up to date.'] = 'Alle temaer er oppdaterte.'; 
+$lang['All plugins are up to date.'] = 'Alle plugginene er oppdaterte.'; 
+$lang['All languages are up to date.'] = 'Alle språk er oppdaterte.'; 
+$lang['Visit theme site'] = 'Besøk tema side'; 
+$lang['Visit language site'] = 'Besøk språk side'; 
+$lang['New Version'] = 'Ny versjon';
+$lang['Learn more'] = 'Lær mer';
+$lang['Rate'] = 'Rangere';
+$lang['Average rate'] = 'Gjennomsnittlig rate';
+$lang['An error has occured during upgrade.'] = 'En feil oppstod under oppgraderingen.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'En feil oppstod under utpakkingen. Vennligst sjekk fil rettigheter i din piwigo installasjon.<br><a href="%s">Klikk her for å vise feil loggen</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kan ikke motta oppgraderingsfilen fra serveren';
+$lang['Update in progress... Please wait.'] = 'Oppgradering pågår... Vennligst vent.';
+$lang['Update to Piwigo %s'] = 'Oppgrader til Piwigo %s';
+$lang['Two updates are available'] = 'To oppgraderinger er tilgjengelige';
+$lang['This is a minor update, with only bug corrections.'] = 'Dette er en mindre oppgradering, kun med noen interne feilrettinger.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Dette er en omfattende oppgradering, med <a href="%s">nye spennende funksjoner</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Noen temaer og tilleggsverktøy er muligens ikke tilgjengelig foreløpig.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Du kan oppgradere til Piwigo %s direkte, uten å oppgradere til Piwigo %s (anbefalt).';
+$lang['Save Template Directory'] = 'Lagre mal (template) mappe';
+$lang['Dump Database'] = 'Tøm Database';
+$lang['ERROR'] = 'FEIL';
+$lang['Update Complete'] = 'Oppgradering fullført';
+$lang['Piwigo Update'] = 'Piwigo-oppgradering';
+$lang['Extensions Update'] = 'Tilleggsprogram-oppgradering';
+$lang['All extensions are up to date.'] = 'Alle tilleggsprogram er oppdaterte.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Følgende tilleggsprogram er muligens ikke kompatible med den nye utgaven av Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Følgende temaer er muligens ikke kompatible med den nye utgaven av Piwigo:';
+$lang['Height'] = 'Høyde';
+$lang['Width'] = 'Bredde';
+$lang['display'] = 'Vis';
+$lang['Zoom'] = 'Zoom';
+$lang['Add to caddie'] = 'legg i kurv';
+
+$lang['... or '] = '... eller';
+$lang['Allowed file types: %s.'] = 'Tillatte filtyper: %s.';
+$lang['%s has been successfully updated.'] = '%s har blitt oppdatert';
+$lang['%s photos can not be regenerated'] = '%s bilder kan ikke bli regenerert';
+$lang['%s photos have been regenerated'] = '%s bilder har blitt regenerert';
+$lang['(this tag will be deleted)'] = '(tilleggsinfo om bilde vil bli slettet)';
+$lang['Activate comments'] = 'Aktiver kommentarer';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktiver knappen "ny" ved siden av album og bilder';
+$lang['Add a criteria'] = 'Legg til kriterier';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Ca. max oppløsning: %dM piksler (dvs. %dx%d piksler).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Piwigo vil automatisk lage ny størrelse på bilde tilpasset web på dine HD bilder.';
+$lang['Confirm merge'] = 'Bekreft fletting';
+$lang['Create'] = 'Lag';
+$lang['Crop'] = 'Beskjær';
+$lang['Deactivate all'] = 'Deaktivere alt';
+$lang['Default comments order'] = 'Standard rekkefølge på kommentarer';
+$lang['Default photos order'] = 'Standard rekkefølge på bilder';
+$lang['Do you want to activate anyway?'] = 'Vil du aktivere allikevel?';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FEIL: DETTE TILLEGGET MANGLER, MEN ER INSTALLERT! AVINSTALLER NÅ.';
+$lang['Graphics Library'] = 'Grafikkbibliotek';
+$lang['hide details'] = 'skjul detaljer';
+$lang['I decide to update anyway'] = 'Jeg vil oppgradere allikevel';
+$lang['Ignore All'] = 'Ignorer alle';
+$lang['Ignore this update'] = 'Ignorer denne oppdatering';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inkluder historisk data (Advarsel: serverens minne kan overstiges)';
+$lang['Manage Permissions'] = 'Behandle rettigheter';
+$lang['Maximum file size: %sB.'] = 'Maksimal filstørrelse: %sB.';
+$lang['Merge selected tags'] = 'Flett merkede bildetags';
+$lang['Merge tags'] = 'Flett bildetags';
+$lang['new'] = 'ny';
+$lang['No results'] = 'Ingen resultater';
+$lang['Photo %s of %s'] = 'Bilde %s av %s';
+$lang['Photo name'] = 'Bildenavn';
+$lang['Reset ignored updates'] = 'Nullstill ignorerte uppdateringer';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Gjenopprett standard konfigurasjon. Du vil miste innstillingene til tilleggene.';
+$lang['Restore'] = 'Gjenopprett';
+$lang['Searching...'] = 'Søker...';
+$lang['Select an album'] = 'Velg et album';
+$lang['show details'] = 'Vis detaljer';
+$lang['Show menubar'] = 'Vis menyer';
+$lang['Start Upload'] = 'Start opplasting';
+$lang['Type in a search term'] = 'Skriv inn et søkeord';
+$lang['Update All'] = 'Oppdater alt';
+$lang['Updates'] = 'Oppdateringer';
+$lang['A locked gallery is only visible to administrators'] = 'Et lukket galleri er kun synlig for administratorer';
+$lang['administrators'] = 'administrator';
+$lang['apply automatic sort order'] = 'Sett automatisk rekkefølge';
+$lang['Automatic sort order'] = 'Automatisk rekkefølge';
+$lang['cancel manual order'] = 'avbryt manuell rekkefølge';
+$lang['Cancel'] = 'Avbryt';
+$lang['Gallery unlocked'] = 'Galleri låst opp';
+$lang['modified'] = 'endret';
+$lang['Move to album'] = 'Flytt til album';
+$lang['No destination tag selected'] = 'Ingen mål tag valgt';
+$lang['Obsolete Plugins'] = 'Foreldet tillegg.';
+$lang['Original Size'] = 'Original størrelse';
+$lang['pending validation'] = 'venter på bekreftelse';
+$lang['Photos generation in progress...'] = 'Generering av bilder foregår...';
+$lang['registered users'] = 'registrert bruker';
+$lang['Resize after upload'] = 'Endre størrelse etter opplasting';
+$lang['Save manual order'] = 'Lagre manuell rekkefølge';
+$lang['Select at least two tags for merging'] = 'Velg minst to tagger for fletting';
+$lang['Select the destination tag'] = 'Velg mål tag';
+$lang['Send connection settings by email'] = 'Send tilkoblingsinfo på epost';
+$lang['Some upgrades are available for extensions.'] = 'Oppgraderinger er tilgjengelig for tillegg.';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tag <em>%s</em> er flettet med tag <em>%s</em>';
+$lang['The original image quality must be a number between %d and %d'] = 'Opprinnelig bildekvalitet må være et tall mellom %d og %d.';
+$lang['The original maximum height must be a number between %d and %d'] = 'Opprinnelig maksimale bildehøyde må være et tall mellom %d og %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Opprinnelig maksimale bildebredde må være et tall mellom %d og %d';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Dette albumet inneholder %s bilder, lagt til mellom %s og %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Dette albumet inneholder %d bilder, lag til %s.';
+$lang['This album contains no photo.'] = 'Dette albumet er tomt.';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'DETTE TILLEGGET ER NÅ EN DEL AV PIWIGO! AVINSTALLER DET NÅ! ';
+$lang['Thumbnails generation in progress...'] = 'Generering av miniatyrbilder er i gang.';
+$lang['Unlock gallery'] = 'Lås opp galleri';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ADVARSEL! Dette tillegge ser ikke ut til å være kompatibelt med denne versjonen av Piwigo.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Du bruker nettleseropplasting. Prøv <a href="%s">Flashopplasting </a> isteden.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Du bruker Flashopplasting. Prøv <a href="%s">Nettleseropplasting </a> isteden.';
+$lang['Available on'] = 'Tilgjengelig på';
+$lang['Available versions for'] = 'Tilgjengelig versjon for';
+$lang['List'] = 'Vis';
+$lang['Not cropped correctly?'] = 'Ikke beskåret riktig?';
+$lang['Notify administrators when a comment is'] = 'Gi beskjed til administrator når en kommentar er';
+$lang['Piwigo for Android'] = 'Piwigo for Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['Save visits in history for'] = 'Lagre besøkshistorie for ';
+$lang['Unable to dump database.'] = 'Kan ikke dumpe databasen';
+$lang['You can activate only one mobile theme.'] = 'Du kan kun aktivere et mobilt tema.';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Du kan ikke definere standard bilderekkefølge, fordi du har eget oppsett i din lokale konfigurasjon.';
+$lang['simple visitors'] = 'vanlig besøkende';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u brukere har automatisk rettigheter fordi de tilhører en gruppe som allerede har rettigheter.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo for Android</em> applikasjonen gjør at du kan koble til ditt Piwigo-galleri fra din Android-telefon, opprette album og laste opp flere bilder samtidig.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em> applikasjonen gjør at du kan koble til ditt Piwigo-galleri fra din iPhone, iPad eller iPod Touch, opprette album og laste opp flere bilder samtidig.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom et et bildebehandlingsprogram, lagd for å å organisere svært mange bilder, samt etterbehandling av bilder.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture er et kraftig verktøy for å avgrense bilder, og for å behandle store bildebibliotek på Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture er lagd for profesjonelle fotografer med iPhoto enkelhet.';
+$lang['Applications'] = 'Applikasjoner';
+$lang['Apply watermark if height is bigger than'] = 'Legg på vannmerke hvis høyden er større enn';
+$lang['Apply watermark if width is bigger than'] = 'Legg på vannmerke hvis bredden er større enn';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Som standard, midten av fokus er plassert i midten av bilde.';
+$lang['Center of interest'] = 'Midten av fokus';
+$lang['Delete multiple size images'] = 'Slett bilder med flere størrelser';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funksjoner inkluderer å bla i gallerier, opprette album og laste opp bilder.';
+$lang['Follow Orientation'] = 'Følg retning';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'For beskårede bilder, som feks. "kvadratiske", vil Piwigo på best mulig måte prøve å inkludere midten av fokus.';
+$lang['Generate multiple size images'] = 'Lag bilder med flere størrelser';
+$lang['Groups and users'] = 'Grupper og brukere';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Hvis ikke HD er tilgjengelig, og hvis aktuell webstørrelse er større enn ny størrelse, vil Piwigo flytte bildet som HD, og opprette nedskalert webstrørrelse bilde. ';
+$lang['No group is permitted to see this private album'] = 'Ingen grupper har rettigheter til å se dette private album';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'I Linux kan du enkelt installere Shortwell i programvaresenteret, og deretter aktivere Piwigo publisering.';
+$lang['Opacity'] = 'Opasitet';
+$lang['Permission granted for groups'] = 'Rettigheter satt for grupper';
+$lang['Permission granted for users'] = 'Rettigheter satt for brukere.';
+$lang['Permission management'] = 'Administrere rettigheter';
+$lang['Photo sizes with crop'] = 'Bildestørrelse med beskjæring';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo publiseringstillegg for Lightroom';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo eksporteringstillegg for Aperture.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo eksporteringstillegg for iPhone.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publiseringstillegg for Shortwell';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publiseringstillegg for digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (Ekstern galleriklient for Android) er en åpen-kildekode (GPL v3) Piwigo klient for Android.';
+$lang['Select a file'] = 'Velg en fil';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Velg et område med musa for å definere nytt fokus.';
+$lang['Select groups...'] = 'Velg grupper...';
+$lang['Select users...'] = 'Velg brukere...';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shortwell er et Linux åpen-kildekode program for å organisere bilder. Det er standard bildebehandlingsprogram i Ubuntu og Fedora.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo eksporteringstillegg gjør at du kan opprette album og eksportere bilder.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publiseringstillegg muliggjør eksport og synkronisering av bilder fra Lightroom direkte til ditt Piwigo galleri.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Midten av fokus er det mest meningsfulle delen av bilde.';
+$lang['There is no group in this gallery.'] = 'Ingen grupper i dette galleriet.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'For å eksportere dine bilder fra digiKam til Piwigo, må du installere digiKam og Kipi-tillegg.';
+$lang['Web Form'] = 'Web-skjema';
+$lang['X Position'] = 'X posisjon';
+$lang['X Repeat'] = 'X repetering';
+$lang['Y Position'] = 'Y posisjon';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Parameteren <i>$conf[\'order_by\']</i> du har spesifisert i din lokale konfigurasjonsfil er foreldet. Vennligst fjern den, eller skift navn på den til <i>$conf[\'order_by_custom\']</i>!';
+$lang['add a new watermark'] = 'legg til vannmerke';
+$lang['any visitor can see this album'] = 'alle besøkende kan se dette album';
+$lang['bottom left corner'] = 'nedre venstre hjørne';
+$lang['bottom right corner'] = 'nedre høyre hjørne';
+$lang['custom'] = 'Egendefinert';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam er et gratis avansert digital bildebehandlingsprogram for Linux, Windows og MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam er lagd for fotografer som ønsker å se, behandle, redigere, forbedre, organisere, tagge og dele bilder.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto er standard bildebehandler på MacOSX. Piwigo eksporteringstillegg lar deg lage nye album og eksportere dine bilder direkte fra iPhoto til ditt Piwigo galleri.';
+$lang['include photos with lower privacy level'] = 'ta med bilder av lavere rettighetsnivå';
+$lang['middle'] = 'senter';
+$lang['top left corner'] = 'øvre venstre hjørne';
+$lang['top right corner'] = 'øvre høyre hjørne';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'besøkende må logge inn for å se dette album';
+$lang['Multiple Size'] = 'Flere størrelser';
+?>
Index: tags/2.4.0RC3/language/no_NO/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/no_NO/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Norwegian [NO]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=483
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "Norwegian";
+$lang_info['country'] = "Norway";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "no";
+$lang_info['zero_plural'] = true;
+
+$lang['useful when password forgotten'] = "Nyttig om passord blir glemt";
+$lang['Quick search'] = "Hurtigsøk";
+$lang['Connected user: %s'] = "Pålogget bruker: %s";
+$lang['IP: %s'] = "IP: %s";
+$lang['Browser: %s'] = "Browser: %s";
+$lang['Author: %s'] = "Forfatter: %s";
+$lang['Comment: %s'] = "Kommentar: %s";
+$lang['Comment by %s'] = "Kommentert av %s";
+$lang['User: %s'] = "Bruker: %s";
+$lang['Email: %s'] = "Email: %s";
+$lang['Admin: %s'] = "Admin: %s";
+$lang['Registration of %s'] = "Registrering av %s";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "Feil status for bruker \"gjest\", default status vil bli brukt. Vennligst kontakt webmaster.";
+$lang['this email address is already in use'] = "En annen bruker har allerede denne mail addressen";
+$lang['Tag results for'] = "Tag resultat for";
+$lang['from %s to %s'] = "fra %s til %s";
+$lang['Play of slideshow'] = 'Avspill slideshow';
+$lang['Pause of slideshow'] = "Pause slideshow";
+$lang['Repeat the slideshow'] = "Gjenta slideshow";
+$lang['Not repeat the slideshow'] = "Ikke repeter slideshow";
+$lang['Reduce diaporama speed'] = "Reduser slideshow hastighet";
+$lang['Accelerate diaporama speed'] = "Øk slideshow hastighet";
+$lang['Submit'] = "Send";
+$lang['Yes'] = "Ja";
+$lang['No'] = "Nei";
+$lang['%d photo'] = "%d bilde";
+$lang['%d photos'] = "%d bilder";
+$lang['%d photo is also linked to current tags'] = "%d bilde er også linket til gjeldende tags";
+$lang['%d photos are also linked to current tags'] = "%d bilder er også linket til gjeldende tags";
+$lang['display photos linked to this tag'] = "Se kun bilder linket til gjeldende tags";
+$lang['photos posted during the last %d days'] = "bilder postet innen de siste %d dager";
+$lang['Piwigo Help'] = "Piwigo hjelp";
+$lang['Rank'] = "Rangering";
+$lang['group by letters'] = "ordne etter bokstav";
+$lang['letters'] = "bokstav";
+$lang['show tag cloud'] = "vis tags cloud";
+$lang['cloud'] = 'sky';
+$lang['Reset to default values'] = "Sett tilbake til standard verdier";
+$lang['delete all photos from your favorites'] = "slett alle bilder fra dine favoritter";
+$lang['Sent by'] = "Sendt av";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Cookies er blokkert eller ikke støttet av din nettleser. Du må aktivere cookies for å logge inn.";
+$lang['day'][0] = 'Søndag';
+$lang['day'][1] = 'Mandag';
+$lang['day'][2] = 'Tirsdag';
+$lang['day'][3] = 'Onsdag';
+$lang['day'][4] = 'Torsdag';
+$lang['day'][5] = 'Fredag';
+$lang['day'][6] = 'Lørdag';
+$lang['month'][10] = 'Oktober';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'Desember';
+$lang['month'][1] = 'Januar';
+$lang['month'][2] = 'Februar';
+$lang['month'][3] = 'Mars';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Juni';
+$lang['month'][7] = 'July';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['Albums'] = 'Album';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Lukk dette vinduet';
+$lang['Complete RSS feed (photos, comments)'] = 'Komplett RSS mating (bilder, kommentarer)';
+$lang['Confirm Password'] = 'Bekreft Passord';
+$lang['Connection settings'] = 'Tilkoblings innstillinger';
+$lang['Login'] = 'Logg inn';
+$lang['Contact webmaster'] = 'Kontakt webmaster';
+$lang['Create a new account'] = 'Oprett ny konto';
+$lang['Created on'] = 'Oprettet den';
+$lang['Creation date'] = 'Dato for opprettelse';
+$lang['Current password is wrong'] = 'Passordet er feil';
+$lang['Dimensions'] = 'Dimensjoner';
+$lang['Display'] = 'Vis';
+$lang['Each listed rule must be satisfied.'] = 'Alle listede krav må være oppfylt.';
+$lang['Email address'] = 'Email adresse';
+$lang['Enter your personnal informations'] = 'Skriv inn dine personlige data';
+$lang['Error sending email'] = 'Feil ved sending av e-mail';
+$lang['File name'] = 'Fil navn';
+$lang['File'] = 'Fil';
+$lang['Filesize'] = 'Filstørrelse';
+$lang['Filter and display'] = 'Filtrer og vis';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Glemt passord?';
+$lang['Go through the gallery as a visitor'] = 'Naviger galleriet som gjest';
+$lang['Help'] = 'Hjelp';
+$lang['Identification'] = 'Identifikasjon';
+$lang['Photos only RSS feed'] = 'Bare bilder RSS feed';
+$lang['Keyword'] = 'Nøkkelord';
+$lang['Links'] = 'Linker';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Ny den %s';
+$lang['%d album updated'] = '%d album oppdatert';
+$lang['%d albums updated'] = '%d album oppdatert';
+$lang['%d comment to validate'] = '%d kommentar å godkjenne';
+$lang['%d comments to validate'] = '%d kommentarer å godkjenne';
+$lang['%d new comment'] = '%d ny kommentar';
+$lang['%d new comments'] = '%d nye kommentarer';
+$lang['%d comment'] = '%d kommentar';
+$lang['%d comments'] = '%d kommentarer';
+$lang['%d hit'] = '%d treff';
+$lang['%d hits'] = '%d treff';
+$lang['%d new photo'] = '%d nytt bilde';
+$lang['%d new photos'] = '%d nye bilder';
+$lang['%d new user'] = '%d ny bruker';
+$lang['%d new users'] = '%d nye brukere';
+$lang['About'] = 'Om';
+$lang['All tags'] = 'Alle ord';
+$lang['Any tag'] = 'Valgte ord';
+$lang['At least one listed rule must be satisfied.'] = 'Minst en listet regel må være med.';
+$lang['Author'] = 'Forfatter';
+$lang['Notification'] = 'Til informasjon';
+$lang['Number of items'] = 'Antall poster';
+$lang['Original dimensions'] = 'Orginal dimensjoner';
+$lang['Password forgotten'] = 'Glemt passord';
+$lang['Password'] = 'Passord';
+$lang['Post date'] = 'Post dato';
+$lang['Posted on'] = 'Postet den';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Hurtig tilkobling';
+$lang['RSS feed'] = 'RSS mating';
+$lang['Register'] = 'Registrere';
+$lang['Registration'] = 'Registrering';
+$lang['Related tags'] = 'Relaterte ord';
+$lang['Reset'] = 'Tibakestill';
+$lang['Retrieve password'] = 'Motta passord';
+$lang['Search rules'] = 'Søke kriterie';
+$lang['Search tags'] = 'Søke ord';
+$lang['Search'] = 'Søk';
+$lang['display available tags'] = 'Se tilgjengelige tags';
+$lang['Since'] = 'Siden';
+$lang['Sort by'] = 'Sorter etter';
+$lang['Sort order'] = 'Sorter alfabetisk';
+$lang['Tag'] = 'Ord';
+$lang['Tags'] = 'Ord';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS mater gir varsling om nye aktiviteter fra denne web siden: nye bilder, oppdaterte album, nye kommentarer. For å bli brukt i en RSS leser.';
+$lang['Unknown feed identifier'] = 'ukjent mater gjenkjenner';
+$lang['User comments'] = 'Bruker kommentarer';
+$lang['Username'] = 'Brukernavn';
+$lang['Visits'] = 'Besøk';
+$lang['Webmaster'] = 'Webmaster';
+$lang['About Piwigo'] = 'Om Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Du er ikke autorisert til å se ønsket side';
+$lang['add this photo to your favorites'] = 'legg dette bilde til dine favoritter';
+$lang['Administration'] = 'Administrasjon';
+$lang['all'] = 'alle';
+$lang['ascending'] = 'stigende';
+$lang['author(s) : %s'] = 'forfatter(e) : %e';
+$lang['Expand all albums'] = 'Vis alle album';
+$lang['posted after %s (%s)'] = 'postet etter %s (%s)';
+$lang['posted before %s (%s)'] = 'postet before %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'postet mellom %s (%s) og %s (%s)';
+$lang['posted on %s'] = 'postet den %s';
+$lang['Best rated'] = 'Best rangert';
+$lang['display best rated photos'] = 'vis de best rangerte bildene';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Alle';
+$lang['display each day with photos, month per month'] = 'Vis hver dag med bilder, måned etter måned';
+$lang['View'] = 'Vis';
+$lang['chronology_monthly_calendar'] = 'Månedlig kalender';
+$lang['chronology_monthly_list'] = 'Månedlig liste';
+$lang['chronology_weekly_list'] = 'Ukentlig liste';
+$lang['Click here if your browser does not automatically forward you'] = 'Klikk her pm din nettleser ikke automatisk sender deg viderer.';
+$lang['comment date'] = 'Kommentert dato';
+$lang['Comment'] = 'kommentar';
+$lang['Your comment has been registered'] = 'Din kommentar er registrert';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Overbuffringsvern : Vennligst vent før du prøver å legge til den ny kommentar';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Din kommentar har IKKE blitt registrert da den ikke ble validert';
+$lang['An administrator must authorize your comment before it is visible.'] = 'En administrator må godkjenne din kommentar før den blir synlig.';
+$lang['This login is already used by another user'] = 'Denne innloggingen er allerede i bruk.';
+$lang['Comments'] = 'Kommentarer';
+$lang['Add a comment'] = 'Legg til en kommentar';
+$lang['created after %s (%s)'] = 'oprettet etter %s (%s)';
+$lang['created before %s (%s)'] = 'oprettet før %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'oprettet mellom %s (%s) og %s (%s)';
+$lang['created on %s'] = 'oprettet den %s';
+$lang['Customize'] = 'Egendefinert';
+$lang['Your Gallery Customization'] = 'Ditt galleri egendefinert';
+$lang['Default'] = 'Standard';
+$lang['delete this photo from your favorites'] = 'slett bildet fra dine favoritter';
+$lang['Delete'] = 'Slett';
+$lang['descending'] = 'synkende';
+$lang['Download'] = 'Last ned';
+$lang['Download this file'] = 'last ned denne filen';
+$lang['edit'] = 'redigere';
+$lang['wrong date'] = 'gal dato';
+$lang['excluded'] = 'ekskludert';
+$lang['Your favorites'] = 'Mine favoritter';
+$lang['display your favorites photos'] = 'vis mine favoritt bilder';
+$lang['Favorites'] = 'Favoritter';
+$lang['First'] = 'Første';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleriet er stengt for vedlikehold. Vennligst kom tilbake senere.';
+$lang['Page generated in'] = 'Side generert i';
+$lang['guest'] = 'gjest';
+$lang['Hello'] = 'Hallo';
+$lang['available for administrators only'] = 'kun tilgjengelig for administrator';
+$lang['display this album'] = 'vis bilder fra root i dette albumet';
+$lang['display last user comments'] = 'Se siste brukers kommentarer';
+$lang['customize the appareance of the gallery'] = 'Egendefiner visning av dette galleriet';
+$lang['search'] = 'søk';
+$lang['Home'] = 'Hjem';
+$lang['in this album'] = 'i dette albumet';
+$lang['in %d sub-album'] = 'i % grunnn-album';
+$lang['in %d sub-albums'] = 'in % grunn-albumer';
+$lang['included'] = 'inkludert';
+$lang['Invalid password!'] = 'Ugyldig passord!';
+$lang['Language'] = 'Språk';
+$lang['last %d days'] = 'siste % dager';
+$lang['Last'] = 'Sist';
+$lang['Logout'] = 'Logg ut';
+$lang['obligatory'] = 'obligatorisk';
+$lang['Maximum photo height'] = 'Bildets maksimum høyde';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimum høyde må være et tall større en 50';
+$lang['Maximum photo width'] = 'Bildets maksimums bredde';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimum bredde må være et tall større en 50';
+$lang['display a calendar by creation date'] = 'vis en kalender fra opprettelses dato';
+$lang['display all photos in all sub-albums'] = 'vis alle elementer i alle grunn-albumer';
+$lang['return to normal view mode'] = 'tilbake til normalvisning';
+$lang['display a calendar by posted date'] = 'vis en kalender etter dato postet';
+$lang['Most visited'] = 'Mest besøkte';
+$lang['display most visited photos'] = 'vis mest besøkte bilder';
+$lang['The number of photos per page must be a not null scalar'] = 'Antall bilder per side må være større en null';
+$lang['Number of photos per page'] = 'Antall bilder per side';
+$lang['Unknown identifier'] = 'Ukjent identifier';
+$lang['New password'] = 'Nytt passord';
+$lang['Rate this photo'] = 'Gi karakter på dette bildet';
+$lang['Next'] = 'Neste';
+$lang['no rate'] = 'ingen karakter';
+$lang['Photos posted within the last %d day.'] = 'Elementer posted kun de % siste dager.';
+$lang['Photos posted within the last %d days.'] = 'Elementer posted kun de % siste dager.';
+$lang['password updated'] = 'passord oppdatert';
+$lang['Recent period must be a positive integer value'] = 'Siste periode må være en positiv verdi';
+$lang['photo'] = 'bilde';
+$lang['Click on the photo to see it in high definition'] = 'Klikk på bildet for å se det i høy oppløsning';
+$lang['Show file metadata'] = 'Vis filens metadata';
+$lang['Powered by'] = 'Drevet av';
+$lang['Preferences'] = 'Referanser';
+$lang['Previous'] = 'Forrige';
+$lang['Random photos'] = 'Tilfeldige bilder';
+$lang['display a set of random photos'] = 'viser en gruppe tilfeldige bilder';
+$lang['Recent albums'] = 'Siste album';
+$lang['display recently updated albums'] = 'viser nylig oppdaterte album';
+$lang['Recent period'] = 'Siste periode';
+$lang['Recent photos'] = 'Siste bilder';
+$lang['display most recent photos'] = 'Viser de sist sette bilder';
+$lang['Redirection...'] = 'Videresender...';
+$lang['Please, enter a login'] = 'Vennligst logg inn';
+$lang['login mustn\'t end with a space character'] = 'login må ikke ende med et mellomrom';
+$lang['login mustn\'t start with a space character'] = 'login må ikke starte med et mellomrom';
+$lang['this login is already used'] = 'denne innloggingen er allerede i bruk';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse må være tilsvarende xxx@yyy.eee (eksempel : jack@altern.org)';
+$lang['please enter your password again'] = 'vennligst skriv ditt passord på ny';
+$lang['Auto login'] = 'Auto innlogging';
+$lang['%d Kb'] = '%d Kb';
+$lang['Week %d'] = 'Uke %d';
+$lang['remove this tag from the list'] = 'fjern tag fra denne listen';
+$lang['representative'] = 'representative';
+$lang['Search for Author'] = 'Søk etter forfatter';
+$lang['Search in albums'] = 'Søk i album';
+$lang['Search by date'] = 'Søk etter dato';
+$lang['Date'] = 'Dato';
+$lang['End-Date'] = 'Ende dato';
+$lang['Kind of date'] = 'Slags dato';
+$lang['Search for words'] = 'Søk etter ord';
+$lang['Search for all terms'] = 'Søk i alle termer';
+$lang['Search for any term'] = 'Søk i hvilken som helst term';
+$lang['Empty query. No criteria has been entered.'] = 'Tøm spørring. Ingen kriterier har blitt lagt inn.';
+$lang['Search results'] = 'Søke resultat';
+$lang['Search in sub-albums'] = 'Søk i grunn-album';
+$lang['searched words : %s'] = 'søkte ord : %';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'set som album representant';
+$lang['Show number of comments'] = 'Vis antall kommentarer';
+$lang['Show number of hits'] = 'Vis antall hit';
+$lang['slideshow'] = 'slideshow';
+$lang['stop the slideshow'] = 'stop slideshow';
+$lang['Specials'] = 'Spesial';
+$lang['SQL queries in'] = 'SQL spørring' ;
+$lang['display only recently posted photos'] = 'Vis kun sisite postede bilder';
+$lang['return to the display of all photos'] = 'tilbake til visning av alle bilder';
+$lang['the beginning'] = 'begynnelsen';
+$lang['Interface theme'] = 'Brukerfalte tema';
+$lang['Thumbnails'] = 'Miniatyrbilder';
+$lang['Menu'] = 'Meny';
+$lang['A comment on your site'] = 'En kommentar på din side';
+$lang['today'] = 'i dag';
+$lang['Update your rating'] = 'Oppdater din rating';
+$lang['the username must be given'] = 'brukernavn kreves';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Album results for'] = 'Album results for';
+$lang['Edit a comment'] = 'Endre en kommentar';
+$lang['Are you sure?'] = 'Er du sikker?';
+$lang['(!) This comment requires validation'] = '(!) Denne kommentaren krever godkjenning';
+$lang['Welcome'] = 'Velkommen';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Velkommen til din Piwigo photo gallery!';
+$lang['... or browse your empty gallery'] = '... eller bla i ditt tomme galleri';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eller vennligstdeaktiver denne beskjeden, jeg vil finne ut av det selv';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hallo %, ditt Piwigo photo gallery er tomt!';
+$lang['I want to add photos'] = 'Jeg vil legge til foto';
+$lang['Manage this user comment: %s'] = 'Behandle denne brukers kommentar: %er';
+$lang['Email address is missing. Please specify an email address.'] = 'Email addresse mangler. Vennligst skriv en email addresse.';
+$lang['This author modified following comment:'] = 'Denne forfatteren modifiserte følgende kommentar:';
+$lang['This author removed the comment with id %d'] = 'Denne forfatteren fjernetkommentaren med id %d';
+$lang['Change my password'] = 'Bytt mitt passord';
+$lang['Check your email for the confirmation link'] = 'Bekreftelseslink er sent til deg på epost';
+$lang['Edit'] = 'Endre';
+$lang['Enter your new password below.'] = 'Skriv inn ditt nye passord.';
+$lang['EXIF Metadata'] = 'Avansert bildedata';
+$lang['Hello %s,'] = 'Hei %s,';
+$lang['html tags are not allowed in login'] = 'html-kode er ikke lov i brukernavn/passord';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Hvis dette var en feiltagelse, bare ignorer denne epost, ingen ting vil skje.';
+$lang['Invalid key'] = 'Feil nøkkel';
+$lang['Invalid username or email'] = 'Feil brukernavn eller passord';
+$lang['IPTC Metadata'] = 'Bildedata';
+$lang['Password reset is not allowed for this user'] = 'Du har ikke lov til å nullstille passord';
+$lang['Password Reset'] = 'Nullstill passord';
+$lang['Please enter your username or email address.'] = 'Skriv inn ditt brukernavn eller passord';
+$lang['Rating score'] = 'Karakter';
+$lang['Return to home page'] = 'Tilbake til hovedsiden';
+$lang['Send my connection settings by email'] = 'Send tilkoblingsinnstillinger på epost';
+$lang['Show oldest comments first'] = 'Vis eldst først';
+$lang['Show latest comments first'] = 'Vis senest kommentert først';
+$lang['square'] = 'Kvadrat';
+$lang['thumb'] = 'Miniatyrbilde';
+$lang['2small'] = 'XXS - bitte lite';
+$lang['xsmall'] = 'XS - veldig lite';
+$lang['small'] = 'S - lite';
+$lang['medium'] = 'M - medium';
+$lang['large'] = 'L - stor';
+$lang['xlarge'] = 'XL - veldig stor';
+$lang['xxlarge'] = 'XXL - kjempe stor';
+$lang['Original'] = 'Original';
+$lang['Password: %s'] = 'Passord: %s';
+$lang['Username: %s'] = 'Brukernavn: %s';
+$lang['Photo sizes'] = 'Bilde størrelser';
+$lang['View in'] = 'Se bilde på';
+$lang['Mobile'] = 'Mobil';
+$lang['Desktop'] = 'Skrivebord';
+$lang['%d rates'] = '%d karakter';
+$lang['Here are your connection settings'] = 'Her er din påloggingsinfo';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Hvis du tror du fikk denne eposten ved en feiltagelse, vennligst ta kontakt med oss på %s.';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Noen har bedt om å tilbakestille passordet for følgende bruker:';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrering fullført, du får snart en epost med info om pålogging.
+Velkommen!';
+$lang['Thank you for registering at %s!'] = 'Takk for at du registrerte deg hos %s!';
+$lang['The passwords do not match'] = 'Passordene er ikke like';
+$lang['To reset your password, visit the following address:'] = 'For å tilbakestille passordet, vennligst bruk følgene lenke:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Bruker "%s" har ikke registrert epostadresse, tilbakestilling av passord er ikke mulig';
+$lang['Username "%s" on gallery %s'] = 'Bruker "%s" i galleri %s';
+$lang['Username modification'] = 'Endre brukernavn';
+$lang['Username or email'] = 'Brukernavn eller epost';
+$lang['You will receive a link to create a new password via email.'] = 'Du får en link på epost for å lage nytt passord.';
+$lang['Your password has been reset'] = 'Ditt passord har blitt endret.';
+$lang['Your username has been successfully changed to : %s'] = 'Ditt brukernavn har blitt endret til: %s';
+$lang['Date created, new &rarr; old'] = 'Dato opprettet, nyest &rarr; eldst';
+$lang['Date created, old &rarr; new'] = 'Dato opprettet, eldst &rarr; nyest';
+$lang['Date posted, new &rarr; old'] = 'Dato publisert, nyest &rarr; eldst';
+$lang['Date posted, old &rarr; new'] = 'Dato publisert, eldst &rarr; nyest';
+$lang['File name, A &rarr; Z'] = 'Filnavn, A &rarr; Å';
+$lang['File name, Z &rarr; A'] = 'Filnavn, Å &rarr; A';
+$lang['Manual sort order'] = 'Manuell sortering';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Bildenummer, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Bildenummer, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Bildetittel, A &rarr; Å';
+$lang['Photo title, Z &rarr; A'] = 'Bildetittel, Å &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Karakter, høy &rarr; lav';
+$lang['Rating score, low &rarr; high'] = 'Karakter, lav &rarr; høy';
+$lang['Visits, high &rarr; low'] = 'Besøk, høy &rarr; lav';
+$lang['Visits, low &rarr; high'] = 'Besøk, lav &rarr; høy';
+?>
Index: tags/2.4.0RC3/language/no_NO/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,134 @@
+<h2>Rediger album</h2>
+
+<h3>Informasjon</h3>
+
+<ul>
+
+  <li><strong>navn</strong>: gi nytt navn til album (en virtuell navneendring om dette er et fysisk album).</li>
+
+  <li><strong>Beskrivelse</strong>: kort tekst som gir en ide om innholdet,
+  denne teksten vil vises i bunnen av miniatyr bildene.</li>
+
+</ul>
+
+<h3>Flytte</h3>
+
+<p>Om albumet er virtuelt, kan du flytte det. Flytting av album betyr å endre dets tillhørende mappe/album.</p>
+
+<h3>Alternativer</h3>
+
+<ul>
+
+  <li><strong>Tilgangstype type</strong>: Rettighets behandler. Om du gjør et album privat, vil alle dens under albums også bli
+
+private.
+   Om du gjør et album tilgjengelig for alle, vil alle bundne album bli tilgjengelig for alle.</li>
+
+  <li><strong>Lås</strong>: Albumet og dets under-album vil bli midlertidig utilgjengelig for vedlikehold .</li>
+
+  <li><strong>Comments</strong>: Autoriser brukere for å kunne kommentere dette albumet.</li>
+
+  <li><strong>Autoriser opplastinger</strong>: Autoriser brukere til å laste opp bilde filer. Dette alternativet er kun
+
+tilgjengelig for fysiske (ikke virtuelle) album.</li>
+
+</ul>
+
+<p>Du kan også redigere disse alternativene via "egenskaper" i
+Album menyen (Arkfane <span class="pwgScreen">Last opp</span>, <span
+class="pwgScreen">Kommentarer</span>, <span class="pwgScreen">Lås</span>,
+<span class="pwgScreen">Offentlig/Privat</span>, <span
+class="pwgScreen">Alternativer</span> tilgjengelig fra <span
+class="pwgScreen">Administrasjon &raquo; Album &raquo; Egenskaper</span>).</p>
+
+<h3>Sorterings rekkefølge</h3>
+
+<p>Bruk standard bilde sorterings rekkefølge.</p>
+
+<p>Indikerer om denne sortering rekkefølgen vil gjelde under album også.</p>
+
+<p>Velg spesifiserte sorterings rekkefølge på disse album.</p>
+<ul>
+<li><strong>Opprettelses dato</strong>: Dato for når bilder er tatt</li>
+<li><strong>Post dato</strong>: Synkroniserings dato</li>
+<li><strong>Gjennomsnittlige rangering (*)</strong>: Gjennomsittlig rangering kan bli endret av besøkendes rangering </li>
+<li><strong>Mest besøkte (*)</strong>: Det forrige besøket kan endre mest besøkte rekkefølgen</li>
+<li><strong>Fil navn</strong>: Navn som er satt i informasjons feltet</li>
+<li><strong>Id</strong>: Intern Id (siste album har en høyere id en den før der igjen.</li>
+
+</ul>
+<p><strong>(*)</strong>Advarsel: Vær nøye med å test dise sorterings rekkefølgene selv da de kan gi uventede resultater.</p>
+
+
+<h3>Representanter</h3>
+
+<p>Albumets representat er miniatyr bildet som vises på hoved siden (<span class="pwgScreen">category.php</span>) for å
+
+representere albumet når det kun består av under album og ingen bilder direkte(akkurat som et grunn album).</p>
+Bilder fra et album :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Bilde side</span>: en av knappene lar deg sette gjeldende bilde som representant for gjeldende
+
+vist album. Knappen er kun synlig for administratorer.</li>
+
+  <li><span class="pwgScreen">Endre informasjon om et bilde</span> i
+  administrasjon. Dette skjermbildet kan nåes fra <span
+  class="pwgScreen">bilder.php</span> eller <span class="pwgScreen">Batch
+  behandler</span> i <em>unit modus</em>. Se hjelpefilen på dette skjermbildet for detaljer.</li>
+
+  <li><span class="pwgScreen">Administrasjon &raquo; Album &raquo; Egenskaper,
+  Representanter</span>. Se hjelpefilen på dette skjermbildet for detaljer.</li>
+
+  <li><span class="pwgScreen">Rediger album</span> (forrige skjermbilde).</li>
+
+</ul>
+
+<p>Valget for en representant avhenger av <code>allow_random_representative</code> konfigurasjons parametere (se <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>I standard modus (<code>godkjenn_tilfeldig_representativer</code> satt til usant(false)),
+vil hvert album som inneholder minst et element bli representert av et satt
+ellement. Når dette er satt (ved album opprettelse), vil representanten kun endres når en administrator ber om det.
+Om det representative bildet ikke passer,
+kan du få et nytt bilde i<strong>Finn en ny tilfeldig representant</strong>.</p>
+
+<p>Om <code>godkjenn_tilfeldig-representant</code> konfigurasjons parametere er sat til sant, kan en kategori bestående av
+
+bilder ikke ha noen satt representant. Bare bruk <strong>Slett representant</strong> knappen.</p>
+
+<p>Om albumet består av kun under album og ingen bilder, kan det alikevell bli representert av hvilket som helst element takket
+
+være <span class="pwgScreen">Endre informasjon om bildet</span> skjermbildet. Det eneste alterantivet på gjeldende skjermbilde
+
+er <strong>Slett representant</strong> knappen.</
+
+
+<h3>Link alle album elementer til et nytt album</h3>
+
+<ul>
+
+<li><strong>Virtuelle album navn</strong>: Navnet på det nye albumet som blir laget,
+alle bilder i det forrige albumet vil bli linket til det nye.</li>
+
+<li><strong>Forrige album</strong>: Hvor det nye albumet vil være,
+La dette være tomt for å legge den på root.</li>
+
+</ul>
+
+<h3>Link alle album bilder til eksisterende albums</h3>
+
+<ul>
+
+<li><strong>Album</strong>: Velg hvor albumet skal ligge.</li>
+
+</ul>
+
+<h3>Send en informasjons email til gruppe medlemmer</h3>
+
+<ul>
+
+<li><strong>Gruppe</strong>: tilgjengelige grupper</li>
+
+<li><strong>Mail innhold</strong>: Fri tekst som skal sendes.</li>
Index: tags/2.4.0RC3/language/no_NO/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Flytte virtuelle album</h2>
+
+<p>Kun virtuelle album kan ha et nytt side album.</p>
+
+<h3>Virtuelle album å flytte</h3>
+
+<p>Velg et eller flere virtuelle albumsom du vil flytte.
+Om listen er tom, betyr det at ingen er oprettet enda.</p>
+
+<h3>Nytt side album</h3>
+
+<p>Velg et nytt side album (virtuelt eller fysisk).
+Om du ikke velger et side album, Vil det valgte virtuelle bli flyttet til root.
+Et album kan ikke bli flyttet inn i seg selv eller til noen av sine egne undermapper.</p>
Index: tags/2.4.0RC3/language/no_NO/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Album alternativer</h2>
+
+<p>Alternativ behandling av flere album sammtidig.</p>
+
+<dl>
+
+<dt>Kommentarer</dt>
+<dd>Et bilde kan motta kommentarer fra besøkende om det tillhører et album som har kommentarer aktivert.</dd>
+
+<dt>Lås</dt>
+<dd>Låste album er utilgjengelige grunnet vedlikehold. Kun administratorer kan se de i galleriet.</dd>
+
+<dt>Offentlig / privat</dt>
+<dd>Når et album blir privat, må det gies rettigheter til brukere og grupper</dd>
+
+<dt>Representative</dt>
+<dd>Dette alternativet er tilgjengelig når du setter konfigurasjons instillingene
+<code>allow_random_representative</code> (see <span
+class="filename">include/config_defaults.inc.php</span>) til
+<em>true</em>. Hvert album kan være representert av et tilfeldig bilde, eller et bilde valgt som en unik representant.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/no_NO/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Rediger album rettigheter</h2>
+
+<p>Dette skjmbildet er kun tilgjengelig for private album. Her kan du velge brukere og grupper autorisert for et album.</p>
+
+<h3>Grupper</h3>
+
+<p>Du kan nekte eller gi tilgang for grupper til gjeldende album. Ved å modifisere gruppe rettigheter, vil brukerens gruppetillhørighet bestemme om de blir nektet eller gitt tilgang til albumet.</p>
+
+<h3>Brukere</h3>
+
+<p>Du kan nekte eller gi tilgang til individuelle brukere. Brukere som har tilgang gjennom en gruppe kan bli nektet tilgang ved å sette unntak.</p>
Index: tags/2.4.0RC3/language/no_NO/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/configuration.html	(revision 14585)
@@ -0,0 +1,117 @@
+<h2>Konfigurasjon</h2>
+
+<p>Dette skjermbildet lar administratorer gjøre standard konfigurasjon. Men, dette bildet viser bare de enkle konfigurasjons
+parametrene som bør være nok for de fleste administratorer.
+Om du ønsker å se flere (og avanserte) konfigurasjons parametere, les filen <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Dette skjermbildet er delt opp i flere seksjoner, omgrupper konfigurasjons
+parametere etter temaer.</p>
+
+
+<h3>Hovedside</h3>
+<ul>
+  <li><strong>Galleri tittel</strong>: brukt i RSS mating og nyhetsbrev via email.</li>
+
+  <li><strong>Side banner</strong>: Vises på toppen av hver offentlige side.</li>
+
+  <li><strong>Galleri URL</strong>: brukes til RSS mating.</li>
+
+  <li><strong>Lås gallery</strong>: Låser hele galleriet for vedlikehold.
+  Kun administratorer brukere vil kunne nå galleriet.</li>
+
+  <li><strong>Stemming</strong>: Bilde avstemming er aktiv.</li>
+
+  <li><strong>Stemmer fra gjester</strong>: Selv uregistrerte brukere kan gi stemmer på bilder.</li>
+
+  <li><strong>Tillat bruker registrering</strong>: Alle kan registrere seg.</li>
+
+  <li><strong>Mail addresse er et krav for alle brukere</strong>: mail addresse blir sjekket ved registrering eller ved profil oppdatering,
+  unntak er om dette blir gjort av en administrator.</li>
+
+  <li><strong>Mailer administrator når en ny bruker registrerer seg</strong>: administratorer vil bli kontaktet via mail for hver registrering.</li>
+
+</ul>
+
+<h3>Historie</h3>
+
+  <p>Besøk på sider <span
+  class="pwgScreen">Album.php</span> og <span
+  class="pwgScreen">bilde.php</span> vil bli lagret i
+  <code>historie</code> tabellen.</p>
+
+  <p>Besøk vil vises i <span
+  class="pwgScreen">Administrasjon, verktøy, Historie</span>.</p>
+
+<ul>
+  <li><strong>Lagre sider besøkt av gjester</strong>: sider besøkt av gjester vil bli logget.</li>
+
+  <li><strong>Lagre sider besøkt av brukere</strong>: sider besøkt av brukere vil bli logget.</li>
+
+  <li><strong>Lagre sider besøk besøkt av administratorer</strong>: sider besøkt av administratorer vil bli logget.</li>
+
+</ul>
+
+<h3>Kommentarer</h3>
+<ul>
+
+  <li><strong>Kommentarer for alle</strong>: Selv uregistrerte gjester kan poste kommentarer.</li>
+
+  <li><strong>Antall kommentarer per side</strong>.</li>
+
+  <li><strong>Validering</strong>: en administrator må validere brukeres kommentarer før de blir synlige på siden. Brukers    kommentar validering gjøres i skjermbilde <span class="pwgScreen">Administrasjon, Verktøy,
+  Ventende kommentarer</span>.</li>
+
+  <li><strong>Email administrator når en reell kommentar blir lagt til</strong>:
+Sender en email til administratorer når en bruker legger inn en kommentar.</li>
+
+  <li><strong>Email administratorer når en kommentar trenger godkjenning</strong>:
+Sender en email til administratorer når en bruker legger inn en kommentar som krever godkjenning fra en administrator.
+Brukers kommentar godkjenning gjøres i skjermbildet <span class="pwgScreen">Administrasjon, Verktøy, Ventende kommentarer</span>.</li>
+
+</ul>
+
+<h3>Last opp</h3>
+<ul>
+  <li><strong>Viser opplastings link hver gang</strong>: Om opplastede album eksisterer, en opplasting link vil vises for hvert album.</li>
+  <li><strong>Brukers tilgangsnivå for opplasting</strong>: Begrenser opplasting til noen album til brukere</li>
+  <li><strong>Email administratorer når et bilde er lastet</strong>: Administratorer blir informert via mail hver gang et bilde blir
+    lastet opp av en bruker.</li>
+</ul>
+
+<h3>Instillinger for gjester</h3>
+
+<p>Her kan du endre visnings alternativene brukt av gjester, standad bruker som ikke er innlogget. Ved innlogging, blir disse alternativene overstyrt av brukerens egne alternativer (redigerbare i <span class="pwgScreen">profil</span>).</p>
+
+<p>Det er mulig å endre visningsalternativene for alle eksisterende brukere, gjøres via <span class="pwgScreen">Administrasjon &raquo;
+Brukere &raquo; Behandle</span> skjermbildet, hvor du kan velge en liste av brukere.</p>
+
+
+<ul>
+
+  <li><strong>Språk</strong>: Endrer kun tekst i Piwigo programmet. Album navn, bilde navn og alle beskrivende felt er ikke berørt.</li>
+
+  <li><strong>Antall bilder per rad</strong></li>
+
+  <li><strong>Antall rader per side</strong></li>
+
+<li><strong>Siste periode</strong>: Etter dager. Periode et bilde sakl vises som nytt. Må være mer en 1 dag.</li>
+
+
+  <li><strong>Vis alle album</strong>: Viser alle album som standard i menyen <em>Advarsel</em>: dette alternativet er ressurskrevende og kan generere en lang meny om ditt album tre inneholder mange album.</li>
+
+  <li><strong>Vis antall kommentarer</strong>: Viser antall kommentarer for hvert bilde i miniatyrbilde siden. Ressurs krevende.</li>
+
+  <li><strong>Vis antall hit </strong>: viser antall treff på bilder like under miniatyrbildet i miniatyrbilde siden.
+  Kun når avansert konfigurasjons parameter er satt til: <br>
+  $conf['show_nb_hits'] = true; <br>
+  Noter: false er standard.</li>
+
+  <li><strong>Bildets maksimum bredde</strong>: maksimum vist bredde. Bilder større en denne instillingen vil bli tilpasset ved visning.
+  Heller en å velge dette alternativet, bør du overveie å modifisere bredden på dine bilder; Det vil være en mye bedre kjøre regel.</li>
+
+  <li><strong>Bildets maksimum høyde</strong>: samme kjøre regler som for maksimium bredde instillinger.</li>
+
+  <li><strong>Grensesnitt tema</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/no_NO/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,92 @@
+
+<h2>Utvidelse for mal konfigurasjon</h2>
+
+<h3>Mål</h3>
+<p>Definere erstatnings status for hver malfra mal utvidelesen (mal kalt "replacer").</p>
+
+<p>"orginal mal" fra ./themes/default/template (eller hvilken som helst annet tema)
+vil bli erstattet av en "erstatter" om erstatteren er linket til denne "orginal malen"
+(eller, når den ønskede URL´en består av "valgfri URL nøkkelord").</p>
+
+<p>"Alternativ URL nøkkelord" er de du kan finne etter modilnavnets i URL´er.</p>
+
+<p>Derfor kan "Alternativ URL nøkkelord" være en aktiv "permalink"
+(se permalinker i vår dokumentasjon for videre forklaring).</p>
+
+<p>Les: `<a href="#warnings">Advarsel</a>` bruker tilrettelegginger.</p>
+
+<h3>Hva er mal utvidelser?</h3>
+
+<p>Dette konfigurasjons verktøyet er kraftfult både for nybegynnere og viderkommende brukere.
+Med FTP, i mal-utvideles mappen, kan web masteren duplikere en rekke av de distribuerte .tpl filene ("orginal male") med et annet navn
+("erstatter").
+
+"Orginal maler", tidligere orginalt støttede maler er:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Hvor kan jeg finne "orginal maler"?</h3>
+
+<p>Distribuerte orginal maler er i /themes/default/template/
+(ikke rediger dem med tanke på opggradering). Så med "orginal maler",
+hvilken som helst webmaster kan lage sin "erstatter (modifiserte maler)".</p>
+
+<h3>Hvor bør jeg lagre "erstattere"?</h3>
+
+<p><strong>Erstattere (modifiserte maler)</strong> mæ ligge i template-extension mappenr (eller i sine under mapper).
+Erstattere kan ha hvilket som helst navn med .tpl ending. For eksempel: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Hvordan kan jeg aktivere min "erstatter"?</h3>
+<p>An <strong>orginal mal</strong> bør være knyttet til hver <strong>erstatter (egendefinert mal)</strong> for å aktivere de relaterte erstatningene.
+Dette er målet til "utvidelse for maler" i konfigurasjon administrasjons menyen.</p>
+
+<p>Du kan velge et <strong>alternativ URL nøkkel ord</strong> da vil erstatteren gjelde kun på de sidene med dette nøkkelordet. For eksempel: <span
+  class="pwgScreen">index.php?/<strong>mest_besøkte</strong></span></p>
+
+<p>Avanserte brukere vil bruke permalinker som <strong>alternative URL nøkkel ord</strong>. </p>
+
+<p>Om du velger en <strong>Bundet mal</strong> vil erstatningen kun gjelde på denne malen.</p>
+
+<h3>Hvordan kan jeg deaktivere min "erstatter"?</h3>
+<ul>
+<li>Velg bort relaterte "orginal maler".</li>
+<li>Med FTP slett "erstattere".</li>
+</ul>
+<a name="Advarsler"></a>
+<h3>Advarsler</h3>
+<ul>
+
+  <li><strong>Orginal mal</strong> må være den "orginale" malen ellers kan du få uventede resultater!</li>
+
+  <li>På flere <strong>erstattere (modifiserte maler)</strong> med samme<strong>Orginal mal</strong> og den samme <strong>valgfrie URL
+  nøkkel ord</strong> vil kun den siste erstatteren være aktiv.</li>
+
+  <li>Velg bort <strong>alternativ URL nøkkel ord</strong> vil aktivere erstatteren på hvem som helst mal i bruk. Som i forrige punkt,
+    rekkefølge kan overkjøre forrige valgte erstatter.</li>
+
+  <li>Undermapper:
+Undermapper blir ignorert men de er nyttige for å endre gjeldende rekkefølge.<br>
+distribuerte-eksempler: Disse er sendt med for utprøving!
+<strong>Ikke rediger dem</strong> Lag dine egne.
+</li>
+
+  <li>Ved sletting av en erstatter blir den<strong>Orginale malen</strong> umiddelbart reaktivert.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/no_NO/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Gruppe liste</h2>
+
+<p>Dette er stedet hvor du kan behandle grupper.</p>
+
+<h3>Legg til en gruppe</h3>
+
+<p>Administrator kan legge til grupper.</p>
+
+<h3>Gruppe lister</h3>
+
+<p>For hvert element, gir listen tilgang til:</p>
+
+
+<ul>
+  <li>gå til medlem lister</li>
+  <li>gå til rettighetbehandlings skjermvindu</li>
+  <li>slette gruppe (krever en bekreftelse)</li>
+  <li>endre status "standard" (krever en bekreftelse)</li>
+</ul>
+
+<h3>Standard grupper</h3>
+<p>Standard grupper er grupper som automatisk blir assosiert til hver ny bruker ved registrering eller ved oprettelse av en administrator.</p>
Index: tags/2.4.0RC3/language/no_NO/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,28 @@
+<p>Flere måter å legge til foto i ditt galleri:</p>
+
+<ul>
+  <li><strong>Direkte opplasting</strong> i din netleser er den enkleste og raskeste måten. Det avhenger av noe av din nettleser og servers kapasitet. For en stor mengde
+
+bilder eller om du støter på problemer, bare venter de andre løsningene på deg!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Gå til direkte opplasting </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> er en lokal applikasjon som skal installeres på din maskin. Dra &amp; slipp bilder inn i pLoader vinduet, klikk på <em>"Last opp til
+
+Piwigo"</em> og la pLoader gjøre jobben. Du kan finne andre lokale applikasjoner som <strong>WinToPiwigo</strong> eller <strong>Digikam</strong> eksporteringsverktøy til
+
+Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Gå til pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP opplasting</strong> er den best anbefalte måten å legge til store samlinger av bilder med et minimum av klikk.
+Følg guiden for å klargjøre dine bilder. FTP metoden gir deg full kontroll over organiseringen av dine bilder på serveren.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Gå til FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/no_NO/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/help_groups.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Via grupper kan man på en fornuftig måte sette rettigheter på en rad brukere.</p>
+
+<p>Lag grupper i <span class="pwgScreen">Administrasjon &raquo; Brukere
+&raquo; Gupper</span> og assosier brukere til denne gruppen i <span class="pwgScreen">Administrasjon &raquo; Brukere &raquo;
+Behandle</span>.</p>
+
+<p>En bruker kan tillhøre flere grupper. Autorisasjon gir tillatelser over flere mapper : om bruker "jack" hører til gruppen
+"familie" og "venner", og den eneste gruppen "familie" kan se kategori "Jul 2003" kategory vil "jack" kunne se "jul 2003".</p>
Index: tags/2.4.0RC3/language/no_NO/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Når du har laget ditt galleri kan du konfigurere det for besøkende
+<ul>
+    <li>Standard visning du vil ha i <span class="pwgScreen">Administrasjon &raquo; Konfigurasjon &raquo; Alternativ</span> tab <span class="pwgScreen">Gjeste instillinger</span></li>
+    <li>Standard tema i <span class="pwgScreen">Administrasjon &raquo; konfigurasjon &raquo; Temaer</span></li>
+    <li>Standard språk i <span class="pwgScreen">Administration &raquo; Konfigurasjon &raquo; Språk</span></li>
+</ul>
+Som standard,     hver ny bruker vil arve disse egenskapene ved registrering.
+</p>
+<p>Om du har noen spørsmål, ønsker Piwigo samfunnet deg velkommen <a href="http://piwigo.org/forum">på forumet</a>.</p>
Index: tags/2.4.0RC3/language/no_NO/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,57 @@
+<fieldset>
+<legend>Rettigheter på bilder</legend>
+
+<p>Hvert bilde har et <strong>tilgangs nivå</strong> (en lås). Hver bruker har også et tilgangs nivå (en nøkkel). Det er 5 private nivåer:</p>
+<ol>
+  <li>Ingen</li>
+  <li><em>Kontakter</em></li>
+  <li><em>Venner (som er høyere en en kontakt)</em></li>
+  <li><em>Familie (som er høyere en en venn)</em></li>
+  <li><em>Administrator (som er høyere en alle andre nivåer)</em></li>
+</ol>
+
+<p>Høyere nivåer har rettigheter på lavere nivåer. For en gitt bruker, jo høyere tilgangs nivå, jo fler bilder kan han se.</p>
+
+<p>For eksempel, om bildet "peter_bryllup-0024.jpg" har <em>"Familie"</em> tilgangs nivå, vil:</p>
+<ul>
+  <li>Peter (som er en <em>"Administrator"</em>) kunne se bildet fordi <em>"Administratorer"</em> kan se alle bilder</li>
+  <li>Beth (som er <em>"Familie"</em> medlem) vil også kunne se bildet</li>
+  <li>Mary (som kun er <em>"venn"</em>) vil ikke kunne se bildet</li>
+</ul>
+
+<p>En bruker som ikke har noen rettigheter til å se innholdet i en kategori vil heller ikke se selve kategorien, selv ikke tittelen. Samme prinsipp gjelder Tagger. Om
+
+ingen rettigheter, vil de ikke synes. </p>
+
+<p>Du kan sette rettighets nivå på en bruker i <span class="pwgScreen">Administrasjon &raquo; Brukere &raquo; Behandle</span> Bildet.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Rettigheter på kategorier</legend>
+
+<p>Om private nivåer ikke oppfyller dine behov, kan du også behandle rettigheter på kategorier for en bruker eller en gruppe. Du kan behandle rettigheter på foto og
+
+kategorier samtidig, uten at dette gir konflikter.</p>
+
+<p>Du kan nekte tilgang til kategorier. Bytt kategori tillgangs type til "privat" om du ønsker å behandle rettigheter.</p>
+
+<p>Du kan sette en kategori til privat ved å redigere en enkel kategori (<span class="pwgScreen">Administrasjon &raquo; kategorier &raquo; Behandle &raquo;
+
+redigere</span>) eller ved å endre alternativer for hele kategori strukturen (treet)(<span class="pwgScreen">Administrasjon &raquo; Kategori &raquo;
+Egenskaper &raquo; Offentlig / Privat</span>).</p>
+
+<p>Når kategorien er privat, kan du behandle rettigheter for grupper og brukere i 3 vinduer:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Administrasjon &raquo; Brukere &raquo; Behandle &raquo;
+  Under tiltak -> tillatelser</span> (en link per bruker)</li>
+
+  <li><span class="pwgScreen">Administrasjon &raquo; Bruker &raquo; Grupper &raquo;
+  Under tiltak -> tillatelser</span> (en link per gruppe)</li>
+
+  <li><span class="pwgScreen">Administrasjon &raquo; Album &raquo; Behandle &raquo; rediger kategori rettigheter action</span> (en link per kategori)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/no_NO/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Bilder vises i det album  som stemmer overens med deres filmapper.</p>
+
+<p>Du kan også vise et bilde i flere album, uten å duplikere filen på web serveren. Assosier bildet til vilket som helst album fra bilde redigerings vinduet (som alle administratorer når fra bilde siden i gallerier).</p>
+
+<p>Virtuelle mapper er basert på dette konseptet: De har ingen tillhørende mapper. Lag virtuelle album fra <span class="pwgScreen">Administrasjon &raquo; Album &raquo; Behandle</span>.</p>
Index: tags/2.4.0RC3/language/no_NO/help/history.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/history.html	(revision 14585)
@@ -0,0 +1,37 @@
+<h2>Historik</h2>
+
+<p>På disse skjermbildene kan du monitorere ditt galleris besøks historie opp i mot de valg du har valgt i - Administrasjon &raquo; Konfigurasjon &raquo; Alternativer &raquo; Historik indeks.</p>
+   
+<h3>Statistik</h3>
+<ul>
+  <p>Om du har valgt å overvåke(<span
+class="pwgScreen">index.php</span> og <span
+class="pwgScreen">picture.php</span>) sider besøkt i tabellen <code>historik</code>,
+kan du overvåke dem fra denne siden.</p>
+   
+    <li><strong>Global statistics</strong>: besøk per år. </li>
+   
+    <li><strong>Yearly statistics</strong>: besøk per måned i valgt år.</li>
+   
+    <li><strong>Monthly statistics</strong>: besøk per dag i valgte måned.</li>
+   
+    <li><strong>Daily statistics</strong>: besøk per time på valgt dag.</li>
+   
+</ul>
+
+<h3>Søk</h3>
+<ul>
+  <p>Om du har valgt å overvåke (<span
+class="pwgScreen">index.php</span> og <span
+class="pwgScreen">picture.php</span>) sider besøkt i tabellen <code>historik. </code>, kan du utforske detaljene på de besøkte sidene fra denne siden ved hjelp av forskjellige filtre.</p>
+
+    <li><strong>Filtrer per dato</strong> : velg dato perioden du ønsker å se aktiviteten over.</li>
+   
+    <li><strong>Filtrer per type element</strong> : velg hvilken type element du ønsker å observere aktiviteten over.</li>
+   
+    <li><strong>Filtrer per bruker</strong> : velg brukeren du ønsker å observere aktiviteten på.</li>
+   
+    <li><strong>Filtrer per navn på fil</strong> : velg fil navn du ønsker å observere aktiviteten på.</li>
+   
+    <li><strong>Filtrer per bilde identifikator</strong> : velg bilde identifiaktoren du ønsker å observere aktiviteten til.</li>
+</ul>
Index: tags/2.4.0RC3/language/no_NO/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/maintenance.html	(revision 14585)
@@ -0,0 +1,63 @@
+<h2>Vedlikehold</h2>
+
+<p>For å optimalisere side genererings tiden, bruker Piwigo mellomlagret informasjon. For eksempel, i stedet for å telle antall bilder i hvert
+
+album hver gang siden relastes, blir denne informasjonen lagret i databasen. I teorien bør denne infomasjonen alltid være korrekt, men ved noen
+
+anledninger kan en feil oppstå og den lagrede informasjonen blir feil.</p>
+
+<p>Noe informasjon blir ubrukelig ettersom tiden går. Sletting av disse unødige dataene vil frigjøre mere diskplass.</p>
+
+<ul>
+
+  <li>
+    <strong>Ulinkede bilder:</strong>
+    Vis bilder som ikke er assosiert til noen virtuelle album.
+  </li>
+  <li>
+    <strong>Filer med samme navn i mer en et fysisk album:</strong>
+    Vis bilder eller filer som er funnet med samme filnavn i flere album.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Oppdater album informasjon:</strong> For hvert album,
+  følgende informasjon blir sjekket og oppdatert ved behov: liste over hoved album, antall bilder, siste bilde dato, posisjon rundt relaterte
+
+album, posisjon iblandt alle album. Dette tiltaket sjekker også representative bilders ektehet.</li>
+
+  <li><strong>Oppdater bilde informasjon:</strong> For hvert bilde,
+  oppdatert informasjon er: full sti til filen, gjennomsnittlige stemmer. <em>Advarsel</em>, må ikke blandes med: metadata informasjon
+  må synkroniseres fra <span class="pwgScreen">Administrasjon &raquo;
+  Verktøy &raquo; Synkronisering</span>, eller i modifikasjons skjerm bildet til et enkelt bilde (gjennom <span class="pwgScreen">Bilder</span>
+
+for
+  eksempel).</li>
+
+  <li><strong>Reprer og optimaliser databasen:</strong>
+  Gjennomfør reorganisering, reparer og optimaliser rutiner i hver tabell i databasen.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>Tøm historikk detaljer:</strong> Slett alle linjer fra <code>historik</code> tabellen. Skjermvindu <span
+
+class="pwgScreen">Administrasjon &raquo;
+  Verktøy &raquo; Historik</span> vil ikkke lenger vise informasjon for tidligere historikk. <em>Advarsel</em>: alle data vil bli borte uten
+
+noen mulighet for å få de tilbake.</li>
+
+  <li><strong>Tøm historikk sammendrag:</strong> Slett all informasjons historik om alle besøk. Dette sammendraget er kalkulert fra historikk
+
+detaljene.</li>
+
+  <li><strong>Tøm sesjon:</strong> Slett utgåtte bruker sesjoner.</li>
+
+  <li><strong>Tøm informasjons matinger som aldrig er brukt</strong></li>
+
+  <li><strong>Tøm søke historikk</strong></li>
+ 
+  <li><strong>Tøm kompilerte maler</strong></li> 
+</ul>
Index: tags/2.4.0RC3/language/no_NO/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Beskjeder via mail</h2>
+
+<p>Dette skjermbildet lar deg konfigurere og behandle mail brukeres, for å sende melding om endringer på siden din.</p>
+
+<p>Dette skjermbildet består av 3 alternativer:</p>
+
+<h3>Parametere</h3>
+<p>Tilgjengelig kun for webmaster, dette alternativet setter parametrene på meldinger via mail.</p>
+
+<h3>Abonner</h3>
+<p>Tilgjengelig kun for webmaster, dette alternativet behandler brukeres abonnenter påmelding/avmelding for email beskjeder.</p>
+
+<h3>Envoi</h3>
+<p>Tilgjengelig kun for webmaster og administratorer, dette alternativet tillater å sende mail for å varsle endringer.</p>
Index: tags/2.4.0RC3/language/no_NO/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Permalinker</h2>
+
+<p>Permalinker blir brukt for å gjøre album adresser mer brukervennlig. Når et album har en permalink definert, vil ikke albumets ID lengre være påkrevd i url´en.</p>
+
+<p>Når en permalink er slettet, kan den lagres i permalink historikken, da vil den eksterne linken til Piwigo sidene fortsatt virke. I permalink historikk skjermbildet kan du se når linken har blitt slettet, siste gang den var i brukt og antall ganger linken har blitt brukt.</p>
+
+<p>Noter at permalinker må være unike for hvert album. Heller ikke i permalink historikken kan du ha samme permalink definert mer en en gang.</p>
Index: tags/2.4.0RC3/language/no_NO/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,143 @@
+<fieldset>
+  <legend>Hurtig veiledning</legend>
+
+<ol>
+  <li>Lag en mappe på din datamaskin.</li>
+
+  <li>Kopier noen bilder inn i denne mappen, endre størrelse til web visning. <em>Advarsel</em>:
+
+Navnet til mapper og filer må kun inneholde bokstaver, figurer, "-", "_" eller ".". Ingen blanke
+
+mellomrom, ei heller opphøyde karakterer.</li>
+
+  <li>Med en ftp klient, kopier mappen din inn i "galleries" mappen i din Piwigo installasjon.</li>
+
+  <li>Logg inn i ditt glleri og gå til <span class="pwgScreen">Administrasjon &raquo; Verktøy
+
+&raquo; Miniatyr bilder</span> for å lage manglende miniatyr bilder.</li>
+
+  <li>Gå til <span class="pwgScreen">Administrasjon</span> og klikk på den store synkroniserings
+
+knappen.</li>
+</ol>
+
+Gratulerer! Du har nå laget ditt første album i ditt foto galleri.
+</fieldset>
+
+<fieldset>
+  <legend>Mapper og fil organisering</legend>
+
+<ul>
+
+  <li>
+
+    <p>Album mapper er i Piwigo mappen "galleries". Her følger mappestrukturen til et veldig lite
+
+galleri (men bruker mange muligheter):</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- gallerier
+|   |-- album-1
+|   |   |-- album-1.1
+|   |   |   |-- album-1.1.1
+|   |   |   |   |-- album-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- miniatyrbilder
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- album-1.1.1.2
+|   |   |   +-- album-1.1.2
+|   |   |-- album-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- miniatyrbilder
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- album-1.3
+|   +-- album-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- miniatyrbilder
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>Untagen de med navnet "miniatyrbilder", "pwg_high" eller "pwg_representative" (se forklaring
+
+under), vil hver mappe under "gallerier" representerer et album. Det er ingen begrensning på dybden
+
+i strukturen.</li>
+
+  <li>Hovedsakelig, et element er representert av en fil. En fil kan være et Piwigo element om dets
+
+fil endelse er iblandt <code>file_ext</code>
+  konfigurasjons parametres muligheter(se <span
+  class="filename">inkluder/config_default.inc.php</span> file). En fil kan være et bilde om dets
+
+fil endelse er blandt <code>picture_ext</code>
+  konfigurasjons parametres muligheter.</li>
+
+  <li>Bilde elementer må ha et assosiert miniatyr bilde (se seksjonen under om miniatyr bilder)</li>
+
+  <li>Bilde elementer kan ha høy kvalitets filer assosiert. Som for eks wedding.jpg i eksempelet
+
+over. Ingen prefix på høy kvalitets bildet.</li>
+
+  <li>Ingen bilde elementer (video, lyder, fil tekster, hva du måtte ønske...) er representert som
+
+standard med et icon tillhørende fil endelsen. Valgfritt, kan du assosiere et miniatyr bilde
+
+og en representativ fil (se video.avi i eksempelet over).</li>
+
+  <li><em>Advarsel</em>: navnet på mapper og filer må kun inneholde bokstaver, figurer, "-", "_"
+
+eller ".". Ingen tomme mellomrom, ei heller opphøyde karakterer.</li>
+
+  <li>Når så filer, miniatyr bilder og representativer er korrekt plassert i mappene, gå til: <span
+
+class="pwgScreen">Administrasjon &raquo; Verktøy &raquo;
+  Synkroniser</span></li>
+
+</ul>
+</fieldset>
+
+<fieldset>
+  <legend>Miniatyr bilder</legend>
+<ul>
+
+  <li>Hvert bilde må ha sitt miniatyr bilde.</li>
+
+  <li>Miniatyr bilde blir lagret i "miniatyrbilde " under mappe i album
+  mappen. Miniatyr bildene har det samme filnavnet som bildet det passer opp mot, med konfigurasjons
+
+parametrene <code>prefix_thumbnail</code> som prefix (se <span
+
+class="filename">inkluder/config.inc.php</span>).</li>
+
+  <li>Miniatyr bilde filer bør ikke nødvendigvis ha samme fil endelse som det assosierte bildet (Eks
+
+".jpg" bilde kan ha ".GIF" endelse).</li>
+
+  <li>Det anbefales å bruker en ekstern modul for å lage miniatyr bilder.</li>
+
+  <li>Bruken av miniatyr bilde oprettelses verktøyet integrert i Piwigo er ikke anbefalt, Dette
+
+fordi den resulterte kvaliteten kan være skuffende og den vil bruke mye server ressurser (Dette kan
+
+være et stort problem på en delt server).
+
+  <li>Om du vleger å bruker web serveren til å lage miniatyr bilder, må du gi skrive rettigheter på
+
+alle album mappene.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/no_NO/help/search.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Søk</h2>
+
+<p>Denne siden lar deg søke på bilder i hele galleriet.</p>
+
+<dl>
+
+  <dt>Søk etter ord</dt>
+  <dd>Søk etter et eller flere ord iblandt atributtene relatert til bilder i galleriet. Bruk * som en ukjent for flere treff.</dd>
+
+  <dt>Søk etter en forfatter</dt>
+  <dd>Bruk * som en ukjent for flere treff.</dd>
+
+  <dt>Søk etter dato</dt>
+  <dd>Velg en dato og /eller en slutt dato for ditt søk. La dato feltet stå tomt om du ønsker å gjøre et "før" søk. Året i det siste feltet må ha følgende format: AAAA (feks 2004)</dd>
+
+  <dt>Søk i album</dt>
+  <dd>Velg album eller flere album du vil søke i. Alle under album kan også bli søkt i ved å velge hele hovedalbumet og sette søk i under album til enable.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/no_NO/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/site_manager.html	(revision 14585)
@@ -0,0 +1,35 @@
+<h2>Fjern sider</h2>
+
+<p>Piwigo gir mulighet for å bruker flere servere å lagre bilder som vil danne ditt galleri. Dette kan være nyttig om ditt galleri er installert på en server med begrenset plass og du har en stor mengde bilder å vise.</p>
+
+<ol>
+
+  <li>rediger file <span class="filename">verktøy/create_listing_file_local.inc.php</span>,
+  ved å modifisere seksjons parametrene <code>$conf['prefix_thumbnail']</code> eller
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>ved bruk av ftp, plaser filene <span class="filename">verktøy/create_listing_file.php</span>
+  og <span class="filename">verktøy/create_listing_file_local.inc.php</span> (modifisert)
+  på din eksterne web side, i den samme mappen som dine album mapper (som mappen <span class="filename">gallerier</span> i web siden). For eksempel, la oss si at du kan gå inn på <span
+  class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>gå til <span class="pwgScreen">administrasjons panelet &raquo; Verktøy &raquo; Side behandler</span>. Spør om å lage ny side, for eksempel <span
+  class="filename">http://example.com/galleries</span>.</li>
+
+  <li>en ny ekstern side blir da registrert. Du kan nå gjøre 4 tiltak :
+
+    <ol>
+
+      <li><strong>generere en liste</strong> : kjør en fjern forespørsel for generere en fjern fil liste</li>
+
+      <li><strong>synkroniser</strong> : leser den fjerne <span
+      class="filename">listing.xml</span> filen og synkroniserer den med database informasjonen</li>
+
+      <li><strong>Rens</strong> : fjerner fjern <span
+      class="filename">listing.xml</span> filer</li>
+
+      <li><strong>slett</strong> : sletter sidens (og alle relaterte album og bilder) i the databasen</li>
+
+    </ol>
+  </li>
+</ol>
Index: tags/2.4.0RC3/language/no_NO/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/synchronize.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>Synkroniser</h2>
+
+<p>Set er 2 forskjellige synkroniserings typer: mapper/filer og fil metadata. Mapper/filer handler om å synkronisere mappe strukturen mot album
+
+strukturen i databasen. Metadata handler om å oppdatere bilde informasjon som filstørrelse, dimensjoner i piksler, EXIF eller IPTC
+informasjon.</p>
+
+<p>Første synkronisering må være mapper / filer.</p>
+
+<p>Synkroniseringen kan ta noe tid (avhengig av din server belastning og mengden data å behandle) så det er mulig å gjøre dette album etter
+
+album.</p>
Index: tags/2.4.0RC3/language/no_NO/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,34 @@
+<h2>Lage Miniatyr bilder</h2>
+
+<p>Denne siden lar deg lage manglende miniatyr bilder. Det er ikke anbefalt å bruker denne funksjonen dersom ditt galleri ligger på en delt
+
+server.</p>
+
+<dl>
+
+  <dt>GD versjon</dt>
+
+  <dd>GD er bilde manipulerings bibliotek for PHP. Velg den versjon som er installert på din server. Du vil bli advart med en feil melding
+, om du skulle velge feil; bare gå tilbake til forrige side med nettleseren og velg en annen versjon. Om ikke versjon virker, støtter ikke din
+
+server GD.</dd>
+
+  <dt>Bredde og høyde</dt>
+
+  <dd>Maksimum miniatyr bilde dimensjoner. Orginal ratio er satt som standard. Standard verdier kan endres ved bruk av konfigurasjons
+
+instillingene <code>tn_width</code> og
+<code>tn_height</code> (se <span
+class="filename">include/config_default.inc.php</span> fil).</dd>
+
+  <dt>Antall miniatyr bilder som skal lages</dt>
+
+  <dd>Prøv ikke å lage for mange miatyrer av bilder samtidig. Denne prosessen bruker mye CPU kraft. Om ditt Piwigo gallery er hosted av en
+
+gratis tjeneste, for høy CPU bruk kan føre til begrensninger på web siden din.</dd>
+
+  <dt>Fil format</dt>
+
+  <dd>Miniatyr bilder blir laget i JPEG fil format. De kan kun bli laget fra PNG og JPEG bilder.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/no_NO/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/no_NO/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/help/user_list.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Bruker liste</h2>
+
+<p>Dette er stedet for behandling av registrerte bruker egenskaper, untagen rettigheter som gjøres fra et annet skjermbilde.</p>
+
+<h3>Legg til en bruker</h3>
+
+<p>Administratorer kan legge til brukere manuelt.</p>
+
+<h3>Bruker liste</h3>
+
+<p>Listen kan filtreres etter brukernavn (bruk * som ukjent), gruppe eller status. Du kan organisere etter registreringsdato eller brukernavn, i stigende eller synkende rekkefølge.</p>
+
+<p>Dette skjermbildet tillater å behandle flere brukere samtidig, ved bruk av flere tilltak:</p>
+
+<ul>
+
+  <li>slett bruker (krever bekreftelse)</li>
+  <li>endre status</li>
+  <li>assosier eller ikke assosier med grupper</li>
+  <li>endre visnings egenskaper</li>
+  <li>endre lignende egenskaper</li>
+
+</ul>
+
+<p>Målet er den valgte brukeren (som standard) eller alle brukere vist i den filtrerte listen.</p>
Index: tags/2.4.0RC3/language/no_NO/index.php
===================================================================
--- tags/2.4.0RC3/language/no_NO/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/no_NO/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/no_NO/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Installasjon';
+$lang['Basic configuration'] = 'Grunnleggende konfigurasjon';
+$lang['Default gallery language'] = 'Standard galleri språk';
+$lang['Database configuration'] = 'Database konfigurasjon';
+$lang['Admin configuration'] = 'Admin konfigurasjon';
+$lang['Start Install'] = 'Start installasjon';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail addresse må være lik xxx@yyy.eee (eksempel : jack@altern.org)';
+$lang['Webmaster login'] = 'Webmaster innlogging';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det vil vises for besøkende. Det er nødvendig med side administrasjon';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Tilkobling til server er ok, men tilkobling til databasen er ikke mulig';
+$lang['Can\'t connect to server'] = 'Kan ikke koble til server';
+$lang['Host'] = 'Host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'bruker (user)';
+$lang['user login given by your host provider'] = 'bruker (user) innlogging gitt av din web tilbyder';
+$lang['Password'] = 'Passord';
+$lang['user password given by your host provider'] = 'bruker (user) passord gitt av din web tilbyder';
+$lang['Database name'] = 'Database navn';
+$lang['also given by your host provider'] = 'også gitt av din web tilbyder';
+$lang['Database table prefix'] = 'Database tabellers prefix';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'database tabellers navn kommer til å få prefix (gjør deg i bedre stand til å behandle tabellene)';
+$lang['enter a login for webmaster'] = 'skriv et brukernavn for webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'webmasters brukernavn kan ikke inneholde tegn som \' eller "';
+$lang['please enter your password again'] = 'vennligst skriv passord igjen';
+$lang['Webmaster password'] = 'Webmaster passord';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Hold det hemmelig, dette gir deg tilgang til administrasjons panelet';
+$lang['Password [confirm]'] = 'Passord [bekreft]';
+$lang['verification'] = 'verifisering';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Trenger du hjelp? Still et spørsmål på <a href="%s">Piwigo message board</a>.';
+$lang['Webmaster mail address'] = 'Webmasters mail addresse';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Besøkende vil kunne bruke denne mailen for å kontakte side administrator.';
+$lang['PHP 5 is required'] = 'PHP 5 er nødvendig';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Det kan se ut som om din leverandør kjører PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan prøve å endre din konfigurasjon til PHP 5 ved å lage eller modifisere en .htaccess fil.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Merk, du kan endre din konfigurasjon selv og restarte Piwigo etter dette.';
+$lang['Try to configure PHP 5'] = 'Prøve å konfigurere PHP 5';
+$lang['Sorry!'] = 'Beklager!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo var ikke i stand til å konfigurere PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Du kan sjekke din web tilbyder\'e support og se om du kan endre til PHP 5 selv.';
+$lang['Hope to see you back soon.'] = 'Håper vi sees snart.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulerer, Piwigo installasjonen er ferdig';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'En alternativ løsning er å kopiere teksten fra tekst boksen over og lime det inn i filen "local/config/database.inc.php" (Advarsel: database.inc.php må kun inneholde hva som ligger i tekstområdet, ingen ny linje eller mellomrom)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Opprettelse av konfig fil local/config/database.inc.php feilet.';
+$lang['Download the config file'] = 'Last ned konfig fil';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan laste ned konfig filen og laste den opp til local/config mappen i din installasjon.';
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ikke nøl med å sjekke vårt forum for hjelp: %s';
+$lang['Just another Piwigo gallery'] = 'Enda et Piwigo bildegalleri';
+$lang['Welcome to my photo gallery'] = 'Velkommen til mitt bildegalleri';
+$lang['Welcome to your new installation of Piwigo!'] = 'Velkommen til din nye installasjon av Piwigo!';
+?>
Index: tags/2.4.0RC3/language/no_NO/iso.txt
===================================================================
--- tags/2.4.0RC3/language/no_NO/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Norwegian [NO]
Index: tags/2.4.0RC3/language/no_NO/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/no_NO/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/no_NO/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Oppgrader';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Denne siden tilbyr å oppgradere databasen fra din gamle Piwigo versjonen til den gjeldende versjonen. Oppgraderings assistenten mener at du for tiden kjører <strong>Versjon %s</strong> (eller lignende).';
+$lang['Upgrade from version %s to %s'] = 'Oppgrader fra versjon %s til %s';
+$lang['Statistics'] = 'Statistisk';
+$lang['total upgrade time'] = 'total oppgraderings tid';
+$lang['total SQL time'] = 'total SQL tid';
+$lang['SQL queries'] = 'SQL spørringer';
+$lang['Upgrade informations'] = 'oppgraderings informasjon';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Gjennomfør en vedlikeholds sjekk i [Administration>Tools>Maintenance] om du møter på problemer.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'For å være sikker, følgende tilleggsprogrammer har blitt deaktivert. Du må sjekke for oppgradering på dine tilleggsverktøy før du reaktiverer dem:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'kun en administrator kan oppgradere: .Vennligst logg inn under';
+$lang['You do not have access rights to run upgrade'] = 'Du har ikke tilgangs rettigheter for å kunne oppgradere';
+$lang['All sub-albums of private albums become private'] = 'Alle grunn-album i privat album blir private';
+$lang['User permissions and group permissions have been erased'] = 'Bruker og gruppe rettigheter har blitt slettet';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Kun miniatyr bliders prefix and webmasters mail addresse har blitt lagret fra forrige konfigurasjon';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'I <i>%s</i>, før <b>?></b>, sett inn:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] =  'Som en sikkerhet har følgende temaer blitt deaktivert. Du må sjekke om det finnes oppgraderinger til dem før aktivering:';
+
+?>
Index: tags/2.4.0RC3/language/pl_PL/about.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/about.html	(revision 14585)
@@ -0,0 +1,18 @@
+<p>Ta galeria zdjęć bazuje na Piwigo.</p>
+
+<p>Piwigo jest oprogramowaniem typu galeria zdjęć www, stworzone przez programistów oraz aktywną społeczność użytkowników. Dzięki rozszerzeniom Piwigo jest łatwe w dostosowaniu do własnych potrzeb. A co najważniejsze Piwigo jest oprogramowaniem otwartym.</p>
+
+<p id="linkToPiwigo"><a href="http://de.piwigo.org">Odwiedź stronę Piwigo</a></p>
+
+<p>Polskie tłumaczenie Piwigo jest utrzymywane przez (w kolejności alfabetycznej):
+	<ul>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=5244">emcek</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=9792">Greybrow</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=4657">kuba</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=16313">larky</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=13190">Ortolan</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=13965">T00kie</a></li>
+		<li><a href="http://pl.piwigo.org/forum/profile.php?id=4624">voyteckst</a></li>
+	</ul>
+        .... podziękowania dla nich</p>
+
Index: tags/2.4.0RC3/language/pl_PL/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/admin.lang.php	(revision 14585)
@@ -0,0 +1,897 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d powiązanie';
+$lang['%d associations'] = '%d powiązań';
+$lang['%d album including'] = '%d album zawiera';
+$lang['%d albums including'] = '%d albumy zawierające';
+$lang['%d physical'] = '%d fizycznie';
+$lang['%d physical'] = '%d fizycznie';
+$lang[' and %d virtual'] = ' i %d wirtualnie';
+$lang[' and %d virtual'] = ' i %d wirtualnie';
+$lang['%d album moved'] = '%d album przeniesiony';
+$lang['%d albums moved'] = '%d albumów przeniesionych';
+$lang['%d group'] = '%d grupa';
+$lang['%d groups'] = '%d grup';
+$lang['%d member'] = '%d członek';
+$lang['%d members'] = '%d członków';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tagów';
+$lang['%d user comment rejected'] = '%d komentarz użytkownika odrzucony';
+$lang['%d user comments rejected'] = '%d komentarzy użytkownika odrzuconych';
+$lang['%d user comment validated'] = '%d komentarz użytkownika zaakceptowany';
+$lang['%d user comments validated'] = '%d komentarzy użytkowników zaakceptowanych';
+$lang['%d user deleted'] = '%d użytkownik usunięty';
+$lang['%d users deleted'] = '%d usuniętych użytkowników';
+$lang['%d user'] = '%d użytkownik';
+$lang['%d users'] = '%d użytkowników';
+$lang['%d waiting for validation'] = '%d oczekujących na zatwierdzenie';
+$lang['Actions'] = 'Akcje';
+$lang['Activate'] = 'Aktywacja';
+$lang['Add/delete a permalink'] = 'Dodaj/Usuń permalink';
+$lang['Add a tag'] = 'Dodaj tag';
+$lang['Add a user'] = 'dodaj użytkownika';
+$lang['Add group'] = 'Dodaj grupę';
+$lang['Add'] = 'Dodaj';
+$lang['Allow user registration'] = 'Zezwól na rejestrację użytkowników';
+$lang['Apply to sub-albums'] = 'Zastosuj do pod-albumów';
+$lang['Associated'] = 'Powiązane';
+$lang['Caddie management'] = 'Zarządzanie koszykiem';
+$lang['Caddie'] = 'Koszyk';
+$lang['Albums authorized thanks to group associations'] = 'Albumy zautoryzowane dzięki powiązaniom z grupami';
+$lang['Album manual order was saved'] = 'Zapisano własną kolejność albumów';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Sprawdzenie aktualizacji nie powiodło się z nieznanych powodów.';
+$lang['Check for upgrade'] = 'Sprawdź aktualizacje';
+$lang['Comments for all'] = 'Komentarze dla wszystkich';
+$lang['Current name'] = 'Bieżąca nazwa';
+$lang['Database'] = 'Baza danych';
+$lang['Deactivate'] = 'Deaktywuj';
+$lang['Delete Representant'] = 'Usuń reprezentanta';
+$lang['Delete selected tags'] = 'Usuń zaznaczone tagi';
+$lang['Delete selected users'] = 'Usuń zaznaczonych użytkowników';
+$lang['Deletions'] = 'Usunięcia';
+$lang['Deny selected groups'] = 'Zabroń zaznaczonym grupom';
+$lang['Deny selected users'] = 'Zabroń zaznaczonym użytkownikom';
+$lang['Description'] = 'Opis';
+$lang['Display options'] = 'Opcje wyświetlania';
+$lang['Dissociated'] = 'Niepowiązane';
+$lang['Does not represent'] = 'Nie reprezentuje';
+$lang['Edit selected tags'] = 'Edytuj zaznaczone tagi';
+$lang['Edit tags'] = 'Edytuj tagi';
+$lang['Email admins when a new user registers'] = 'Wyślij wiadomość do administratora gdy zarejestruje się nowy użytkownik';
+$lang['Email admins when a valid comment is entered'] = 'Wyślij wiadomość do administratora gdy zostanie wprowadzony poprawny komentarz';
+$lang['Email admins when a comment requires validation'] = 'Wyślij wiadomość do administratora gdy komentarz wymaga weryfikacji';
+$lang['Environment'] = 'Środowisko';
+$lang['Form'] = 'Formularz';
+$lang['Gallery title'] = 'Tytuł galerii';
+$lang['Grant selected groups'] = 'Zezwól zaznaczonym grypom';
+$lang['Grant selected users'] = 'Zezwól zaznaczonym użytkownikom';
+$lang['Group name'] = 'Nazwa grupy';
+$lang['Groups'] = 'Grupy';
+$lang['Guests'] = 'Goście';
+$lang['History'] = 'Historia';
+$lang['Informations'] = 'Informacje';
+$lang['Install'] = 'Instaluj';
+$lang['Link all album photos to a new album'] = 'Podlinkuj wszystkie zdjęcia albumu do nowego albumu';
+$lang['Link all album photos to some existing albums'] = 'Podlinkuj wszystkie zdjęcia albumu do istniejących albumów';
+$lang['Linked albums'] = 'Podlinkowane albumy';
+$lang['Lock gallery'] = 'Zablokuj galerię';
+$lang['Maintenance'] = 'Przerwa techniczna';
+$lang['Edit album permissions'] = 'Zarządzaj uprawnieniami dla albumu';
+$lang['Manage permissions for group "%s"'] = 'Zarządzaj uprawnieniami dla grupy "%s"';
+$lang['Manage permissions for user "%s"'] = 'Zarządzaj uprawnieniami dla użytkownika "%s"';
+$lang['Manage tags'] = 'Zarządzaj tagami';
+$lang['Members'] = 'Członkowie';
+$lang['Metadata synchronized from file'] = 'Metadane zsynchronizowane z pliku';
+$lang['Move albums'] = 'Przenieś albumy';
+$lang['Move'] = 'Przenieś';
+$lang['Name'] = 'Nazwa';
+$lang['New name'] = 'Nowa nazwa';
+$lang['New parent album'] = 'Nowy nadrzędny album';
+$lang['New tag'] = 'Nowy tag';
+$lang['Number of comments per page'] = 'Liczba komentarzy na stronę';
+$lang['Number of rates'] = 'Liczba ocen';
+$lang['Number of thumbnails to create'] = 'Liczba miniatur do stworzenia';
+$lang['Only private albums are listed'] = 'Lista zawiera tylko prywatne albumy';
+$lang['Operating system'] = 'System operacyjny';
+$lang['Options'] = 'Opcje';
+$lang['Other private albums'] = 'Inne prywatne albumy';
+$lang['Page banner'] = 'Banner strony';
+$lang['Parent album'] = 'Nadrzędny album';
+$lang['Path'] = 'Ścieżka';
+$lang['Permalink'] = 'Link permanentny';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Link permanentny %s był wcześniej używany przez album %s. Usuń go najpierw z historii linkó permanentnych';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Nazwa linku permanentnego musi składać się z następujących znaków a-z, A-Z, 0-9, "-", "_" lub "/". Nie może być cyfrą lub zaczynać się od "-"';
+$lang['Permalink %s is already used by album %s'] = 'Link permanentny %s jest aktualnie używany przez album %s';
+$lang['Permalink history'] = 'Historia linków permanentnych';
+$lang['Permalinks'] = 'Linki permanentne';
+$lang['Permission denied'] = 'Dostęp zabroniony';
+$lang['Permission granted thanks to a group'] = 'Uprawnienia przyznane dzięki grupie';
+$lang['Permission granted'] = 'Dostęp przyznany';
+$lang['Photo informations updated'] = 'Zaktualizowano informację o obrazie';
+$lang['Plugins'] = 'Wtyczki';
+$lang['Position'] = 'Pozycja';
+$lang['Preferences'] = 'Preferencje';
+$lang['Properties'] = 'Właściwości';
+$lang['Random photo'] = 'Losowy obraz';
+$lang['Rate date'] = 'Oceny po dacie';
+$lang['Rating by guests'] = 'Oceny przez gości';
+$lang['Rating'] = 'Oceny';
+$lang['Reject'] = 'Odrzuć';
+$lang['Representant'] = 'Reprezentant';
+$lang['Representation of albums'] = 'Reprezentacja albumu';
+$lang['Representative'] = 'Reprezentacyjny';
+$lang['Represents'] = 'Reprezentuje';
+$lang['Save order'] = 'Zapisz kolejność';
+$lang['Save to permalink history'] = 'Zapisz do historii linków permanentnych';
+$lang['Select at least one album'] = 'Wybierz przynajmniej jeden album';
+$lang['Select at least one photo'] = 'Wybierz przynajmniej jeden obraz';
+$lang['Select at least one user'] = 'Wybierz przynajmniej jednego użytkownika';
+$lang['Show info'] = 'Pokaż informacje';
+$lang['Site manager'] = 'Menadżer strony';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statystyki';
+$lang['Storage album'] = 'Lokalizacja albumu';
+$lang['Sum of rates'] = 'Suma ocen';
+$lang['Tag "%s" already exists'] = 'Tag "%s" już istnieje';
+$lang['Tag "%s" was added'] = 'Tag "%s" został dodany';
+$lang['Tag selection'] = 'Wybór tagu';
+$lang['The %d following tags were deleted'] = '%d tagów zostało usuniętych';
+$lang['Uninstall'] = 'Odinstaluj';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Użyj domyślnego sortowania zdjęć (zdefiniowane w pliku konfiguracyjnym)';
+$lang['User comments validation'] = 'Zatwierdzanie komentarzy użytkowników';
+$lang['Users'] = 'Użytkownicy';
+$lang['Validate'] = 'Zatwierdź';
+$lang['Validation'] = 'Zatwierdzanie';
+$lang['Version'] = 'Wersja';
+$lang['Virtual albums to move'] = 'Wirtualne albumy do przeniesienia';
+$lang['Virtual album name'] = 'Wirtualna nazwa albumu';
+$lang['Webmaster cannot be deleted'] = 'Nie można usunąć użytkownika Webmaster';
+$lang['You are running on development sources, no check possible.'] = 'Nie można sprawdzić, ponieważ używasz źródeł developerskich.';
+$lang['You cannot delete your account'] = "Nie możesz usunąć swojego konta";
+$lang['You cannot move an album in its own sub album'] = 'Nie możesz przenieść albumu do jego własnego pod-albumu';
+$lang['You need to confirm deletion'] = 'Musisz potwierdzić usunięcie';
+$lang['Associate to album'] = 'powiąż z albumem';
+$lang['associate to group'] = 'powiązane z grupą';
+$lang['Authorized'] = 'Zautoryzowane';
+$lang['Add a virtual album'] = 'Dodaj wirtualny album';
+$lang['Authorize users to add comments on selected albums'] = 'Autoryzuj użytkowników do dodawania komentarzy do albumu';
+$lang['The name of an album must not be empty'] = 'Nazwa albumu nie może być pusta';
+$lang['Lock albums'] = 'Zablokuj albumy';
+$lang['Private'] = 'prywatny';
+$lang['Public'] = 'publiczny';
+$lang['Find a new representant by random'] = 'Znajdź losowo nowego reprezentanta';
+$lang['Public / Private'] = 'Publiczne / Prywatne';
+$lang['Manage authorizations for selected albums'] = 'Zarządzaj autoryzacjami do zaznaczonych albumów';
+$lang['Virtual album added'] = 'Album wirtualny dodany';
+$lang['Virtual album deleted'] = 'Album wirtualny usunięty';
+$lang['Access type'] = 'Typ dostępu';
+$lang['Information data registered in database'] = 'Dane zapisane w bazie danych';
+$lang['Default display'] = 'Wyświetlanie domyślne';
+$lang['The gallery URL is not valid.'] = 'Adres URL galerii jest niepoprawny.';
+$lang['Main'] = 'Główne';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Liczba komentarzy na stronę musi być pomiędzy 5 a 50.';
+$lang['Configuration'] = 'Konfiguracja';
+$lang['confirm'] = 'potwierdź';
+$lang['Date'] = 'Data';
+$lang['delete album'] = 'usuń album';
+$lang['Dissociate from album'] = 'usuń powiązanie z albumem';
+$lang['dissociate from group'] = 'usuń powiązanie od grupy';
+$lang['Album updated successfully'] = 'Informacje o albumie zostały zaktualizowane pomyślnie.';
+$lang['photos per page'] = 'elementów na stronę';
+$lang['High definition enabled'] = 'Wysoka jakość włączona';
+$lang['File'] = 'plik';
+$lang['first photo added on %s'] = 'pierwszy element dodany %s';
+$lang['Forbidden'] = 'Zabronione';
+$lang['global mode'] = 'tryb globalny';
+$lang['group "%s" added'] = 'dodano grupę "%s"';
+$lang['group "%s" deleted'] = 'usunięto grupę "%s"';
+$lang['group "%s" updated'] = 'zaktualizowano grupę "%s"';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Nazwa grupy nie może zawierać znaków " lub \' lub być pusta.';
+$lang['This name is already used by another group.'] = 'Nazwa jest już używana przez inną grupę.';
+$lang['High definition'] = 'Wysoka jakość';
+$lang['jump to album'] = 'przejdź do albumu';
+$lang['jump to photo'] = 'przejdź do obrazu';
+$lang['leave'] = 'opuść';
+$lang['Lock'] = 'Zablokuj';
+$lang['Locked'] = 'Zablokowane';
+$lang['manage album photos'] = 'Zarządzaj zdjęciami w albumie';
+$lang['manage sub-albums'] = 'Zarządzaj pod-albumami';
+$lang['Manage'] = 'Zarządzaj';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Czas wykonania minął, proces musi być kontynuowany [Szacowany czas: %d sekund].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Czas wykonania minął, proces musi być kontynuowany [Szacowany czas: %d sekund].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Czas wysłania wiadomości do listy użytkowników jest ograniczony. Pozostali użytkownicy nie znajdują się na liście.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Czas wysłania wiadomości jest ograniczony. Pozostałe wiadomości zostaną pominięte.';
+$lang['To send ?'] = 'Do wysłania ?';
+$lang['Last send'] = 'Ostatnio wysłane';
+$lang['email'] = 'email';
+$lang['User'] = 'Użytkownik';
+$lang['See you soon,'] = 'Do zobaczenia wkrótce,';
+$lang['Go to'] = 'Przejdź do ';
+$lang['Hello'] = 'Witaj ';
+$lang['New photos were added'] = 'dodano nowe elementy ';
+$lang['on'] = ' dnia ';
+$lang['between'] = 'pomiędzy ';
+$lang['and'] = ' i ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster zapisał Cię na listę powiadomień.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Zapisałeś(łaś) się aby otrzymywać powiadomienia.';
+$lang['To subscribe'] = 'Aby się zapisać';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Jeżeli napotkasz problem lub masz pytania wyślij wiadomość do ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemy i pytania';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster wypisał Cię z otrzymywania powiadomień.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Zostałeś wypisany z otrzymywania powiadomień.';
+$lang[', click on'] = ', kliknij ';
+$lang['To unsubscribe'] = 'Aby się wypisać';
+$lang['With blank value, gallery title will be used'] = 'Tytuł galerii będzie używany jeżeli pole zostanie puste';
+$lang['Notification'] = 'Powiadomienia';
+$lang['Error when sending email to %s [%s].'] = 'Błąd podczas wysyłania wiadomości do %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Wysłano wiadomość do %s [%s].';
+$lang['%d mail was sent.'] = 'Wysłano %d wiadomość.';
+$lang['%d mails were sent.'] = 'Wysłano %d wiadomości.';
+$lang['%d mail was not sent.'] = 'Nie wysłano %d wiadomości.';
+$lang['%d mails were not sent.'] = 'Nie wysłano %d wiadomości.';
+$lang['No mail to send.'] = 'Brak wiadomości do wysłania.';
+$lang['There is no available subscribers to mail.'] = 'Brak dostępnych użytkowników do wysłania powiadomienia.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Użytkownik jest dostępny, jeżeli są nowe elementy do powiadomienia.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Prawdopodobnie nie ma zapisanych użytkowników (tę zakładkę widzi tylko użytkownik webmaster).';
+$lang['No user to send notifications by mail.'] = 'Brak użytkowników do wysłania powiadomień.';
+$lang['New photos added'] = 'Dodano nowe elementy';
+$lang['Subscribe to notification by mail'] = 'Zapisz do powiadomień email';
+$lang['Unsubscribe from notification by mail'] = 'Wypisz z powiadomień email';
+$lang['Parameter'] = 'Parametr';
+$lang['Continue processing treatment'] = 'Kontynuuj procesowanie';
+$lang['Complementary mail content'] = 'Uzupełniająca treść wiadomości';
+$lang['Add detailed content'] = 'Dodaj szczegółową treść';
+$lang['Send mail as'] = 'Wyślij wiadomość jako';
+$lang['Send mail to users'] = 'Wyślij wiadomość do użytkowników';
+$lang['Send'] = 'Wyślij';
+$lang['Options'] = 'Opcje';
+$lang['Subscribed'] = 'Zapisani';
+$lang['Subscribe'] = 'Zapisy';
+$lang['Parameters'] = 'Parametry';
+$lang['Select recipients'] = 'Wybierz odbiorców';
+$lang['Subscribe/unsubscribe users'] = 'Zapisz/wypisz użytkowników';
+$lang['Unsubscribed'] = 'Nie zapisani';
+$lang['%d parameter was updated.'] = 'Zaktualizowano %d parametr.';
+$lang['%d parameters were updated.'] = 'Zaktualizowano %d parametrów.';
+$lang['%d user was not updated.'] = 'Użytkownik %d nie został zaktualizowany.';
+$lang['%d users were not updated.'] = 'Nie zaktualizowano %d użytkowników.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Użytkownik %s [%s] usunięty z listy zapisanych.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Użytkownik %s [%s] został dodany do listy zapisanych na listę.';
+$lang['%d user was updated.'] = 'Zaktualizowano użytkownika %d.';
+$lang['%d users were updated.'] = 'Zaktualizowano %d użytkowników.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Użytkownik %s [%s] nie został usunięty z listy zapisanych.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Nie dodano użytkownika %s [%s] do listy zapisanych.';
+$lang['User %s [%s] added.'] = 'Dodano użytkownika %s [%s] .';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Ostrzeżenie: zapisanie lub wypisanie spowoduje wysłanie wiadomości do użytkowników';
+$lang['Send mail on HTML format'] = 'Wyślij email w formacie HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Dodaj wyświetlanie aktualnych zdjęć grupowane po dacie';
+$lang['Available only with HTML format'] = 'Dostępne tylko w formacie HTML';
+$lang['no write access'] = 'brak praw do zapisu';
+$lang['Permissions'] = 'Uprawnienia';
+$lang['private'] = 'prywatna';
+$lang['public'] = 'publiczna';
+$lang['Purge never used notification feeds'] = 'Wyczyść nigdy nie używane RSS feed';
+$lang['Purge sessions'] = 'Wyczyść sesje';
+$lang['randomly represented'] = 'reprezentowane losowo';
+$lang['registration date'] = 'data rejestracji';
+$lang['clean'] = 'wyczyść';
+$lang['Create this site'] = 'Utwórz tę stronę';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'testuj zdalną stronę';
+$lang['remove tags'] = 'usuń tagi';
+$lang['Repair and optimize database'] = 'Napraw i optymalizuj bazę danych';
+$lang['selection'] = 'zaznaczenie';
+$lang['set to'] = 'ustaw na';
+$lang['singly represented'] = 'pojedynczy reprezentant';
+$lang['This site already exists'] = 'Taka strona już istnieje';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Stwórz nową stronę : (podaj adres URL pliku create_listing_file.php)';
+$lang['created'] = 'utworzona';
+$lang['delete'] = 'usuń';
+$lang['delete this site and all its attached elements'] = 'usuń tę stronę oraz wszystkie załączone elementy';
+$lang['an error happened'] = 'wystąpił błąd';
+$lang['Local'] = 'Lokalny';
+$lang['Remote'] = 'Zdalny';
+$lang['update the database from files'] = 'aktualizuj bazę danych z plików';
+$lang['status'] = 'status';
+$lang['Directory'] = 'Katalog';
+$lang['sub-albums'] = 'pod-albumy';
+$lang['Synchronize metadata'] = 'synchronizuj metadane';
+$lang['target'] = 'cel';
+$lang['Thumbnail'] = 'miniatura';
+$lang['title'] = 'tytuł';
+$lang['Album list management'] = 'Zarządzanie albumami';
+$lang['Piwigo configuration'] = 'Konfiguracja Piwigo';
+$lang['Edit album'] = 'Edytuj album';
+$lang['Group management'] = 'Zarządzanie grupami';
+$lang['User list'] = 'Lista użytkowników';
+$lang['Edit photo information'] = 'Edytuj informacje o obrazie';
+$lang['Database synchronization with files'] = 'Synchronizacja bazy danych z plikami';
+$lang['all'] = 'wszystkie';
+$lang['height must be a number superior to'] = 'wysokość musi być liczbą większą od';
+$lang['width must be a number superior to'] = 'szerokość musi być liczbą większą od';
+$lang['for the file format'] = 'dla typu pliku';
+$lang['Photo unreachable or no support'] = 'Obraz niedostępny lub brak wsparcia';
+$lang['GD version'] = 'Wersja GD';
+$lang['General statistics'] = 'Ogólne statystyki';
+$lang['average time'] = 'czas średni';
+$lang['number of miniaturized photos'] = 'liczba plików, dla których zostały dodane miniatury';
+$lang['total time'] = 'czas sumaryczny';
+$lang['for this file format'] = 'dla tego rodzaju plików';
+$lang['unit mode'] = 'tryb jednostkowy';
+$lang['Unlocked'] = 'Odblokowane';
+$lang['unset'] = 'nie ustawione';
+$lang['Update albums informations'] = 'Aktualizuj informacje o albumie';
+$lang['Update photos information'] = 'Aktualizuj informacje o obrazach';
+$lang['Synchronize'] = 'Synchronizuj';
+$lang['reduce to single existing albums'] = 'zredukuj do pojedynczego istniejącego albumu';
+$lang['Choose an option'] = 'Wybierz opcję';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'pokaż maksimum informacji (dodanie albumu i elementów, usunięcie albumu i elementów)';
+$lang['Error list'] = 'Lista błędów';
+$lang['Errors caption'] = 'Nagłówki błędów';
+$lang['Detailed informations'] = 'Informacje szczegółowe';
+$lang['File/directory read error'] = 'Błąd odczytu pliku/katalogu';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Brak dostępu do pliku lub katalogu (nie istnieje lub brak uprawnień)';
+$lang['albums deleted in the database'] = 'albumy usunięte z bazy danych';
+$lang['photos deleted from the database'] = 'elementów usuniętych z bazy danych';
+$lang['photos candidates for metadata synchronization'] = 'zdjęć dla których można zsynchronizować metadane';
+$lang['photos informations synchronized with files metadata'] = 'informacji o elementach zsynchronizowanych z metadanymi plików';
+$lang['errors during synchronization'] = 'błędów podczas synchronizacji';
+$lang['albums added in the database'] = 'albumy dodane do bazy danych';
+$lang['photos added in the database'] = 'elementów dodanych do bazy danych';
+$lang['photos updated in the database'] = 'elementów zaktualizowanych w bazie danych';
+$lang['Search for new images in the directories'] = 'Szukaj nowych zdjęć w katalogach';
+$lang['added'] = 'dodane';
+$lang['deleted'] = 'usunięte';
+$lang['Metadata synchronization results'] = 'Wynik synchronizacji metadanych';
+$lang['only perform a simulation (no change in database will be made)'] = 'przeprowadź tylko symulację (nie będzie żadnych zmian w bazie danych)';
+$lang['Simulation'] = 'Symulacja';
+$lang['directories + files'] = 'katalogi + pliki';
+$lang['only directories'] = 'tylko katalogi';
+$lang['synchronize files structure with database'] = 'synchronizuj strukturę plików z bazą danych';
+$lang['synchronize files metadata with database photos informations'] = 'synchronizuj metadane z informacjami o elementach z bazy danych';
+$lang['even already synchronized photos'] = 'także elementy już zsynchronizowane';
+$lang['Used metadata'] = 'Wykorzystane metadane';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Nazwy plików i katalogów muszą się składać z liter, cyfr, znaków: "-", "_" lub "."';
+$lang['wrong filename'] = 'zła nazwa pliku';
+$lang['Upload'] = 'Wgrywanie';
+$lang['user "%s" added'] = 'użytkownik "%s" został dodany';
+$lang['User status'] = 'Status użytkownika';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Ogólny';
+$lang['user_status_guest'] = 'Gość';
+$lang['user_status_normal'] = 'Użytkownik';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Album wirtualny';
+$lang['Waiting'] = 'Oczekujące';
+$lang['default'] = 'domyślna';
+$lang['Toggle \'default group\' property'] = 'Właściwości przełączania \'grupy domyślnej\'';
+$lang['Advanced features'] = 'Zaawansowane';
+$lang['Overall'] = 'W sumie';
+$lang['Year'] = 'Rok';
+$lang['Month'] = 'Miesiąc';
+$lang['Day'] = 'Dzień';
+$lang['Pages seen'] = 'Oglądanych stron';
+$lang['Time'] = 'czas';
+$lang['IP'] = 'IP';
+$lang['Element'] = '';
+$lang['Section'] = 'sekcja';
+$lang['An information email was sent to group "%s"'] = 'Powiadomienie wysłane do członków grupy "%s"';
+$lang['Send an information email to group members'] = 'Wyślij powiadomienie do członków grupy';
+$lang['Group'] = 'Grupa';
+$lang['[%s] Visit album %s'] = '[%s] Odwiedź album %s';
+$lang['Hello,'] = 'Witaj,';
+$lang['See you soon.'] = 'Do zobaczenia wkrótce.';
+$lang['Discover album:'] = 'Odkryj album:';
+$lang['Mail content'] = 'Treść maila';
+$lang['none'] = 'brak';
+$lang['high'] = 'wysoki';
+$lang['other'] = 'inny';
+$lang['Element type'] = 'Typ elementu';
+$lang['Image id'] = 'ID obrazu';
+$lang['Summary'] = 'Podsumowanie';
+$lang['%d line filtered'] = '%d linia odfiltrowana';
+$lang['%d lines filtered'] = '%d linii odfiltrowanych';
+$lang['%d guest'] = '%d gość';
+$lang['%d guests'] = '%d gości';
+$lang['Hour'] = 'Godzina';
+$lang['guest'] = 'gość';
+$lang['default values'] = 'wartości domyślne';
+$lang['Guest cannot be deleted'] = 'Gość nie może zostać usunięty';
+$lang['Default user cannot be deleted'] = 'domyślny użytkownik nie może zostać usunięty';
+$lang['Purge history detail'] = 'Usuń szczegóły historii';
+$lang['Purge history summary'] = 'Usuń podsumowanie historii';
+$lang['Check integrity'] = 'Sprawdź integralność';
+$lang['Anomaly'] = 'Anomalie';
+$lang['Correction'] = 'Poprawki';
+$lang['Automatic correction'] = 'Automatyczne poprawki';
+$lang['Impossible automatic correction'] = 'Automatyczna poprawka niemożliwa';
+$lang['Correction applied with success'] = 'Poprawki zastosowana pomyślnie';
+$lang['Correction applied with error'] = 'Poprawka zastosowana, ale wystąpił błąd';
+$lang['%d anomaly has been detected.'] = 'Została wykryta %d anomalia.';
+$lang['%d anomalies have been detected.'] = 'Zostało wykrytych %d anomalii.';
+$lang['%d anomaly has been corrected.'] = '%d anomalii została poprawnie wykrytych.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalii zostało poprawnie wykrytych.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalia nie została poprawiona.';
+$lang['%d anomalies have not been corrected.'] = '%d anomalii nie zostało poprawionych.';
+$lang['Go to %s or %s for more informations'] = 'Aby uzyskać więcej informacji przejdź do %s lub %s';
+$lang['the forum'] = 'forum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'Wartość %s nie jest poprawna, ponieważ exif nie jest wspierany';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = 'Wartość %s musi być ustawiona na false w pliku konfiguracyjnym config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'Główny użytkownik "gość" nie istnieje';
+$lang['Main "guest" user status is incorrect'] = 'Status głównego użytkownika "gość" jest niepoprawny';
+$lang['Default user does not exist'] = 'Domyślny użytkownik nie istnieje';
+$lang['Main "webmaster" user does not exist'] = 'Główny użytkownik "webmaster" nie istnieje';
+$lang['Main "webmaster" user status is incorrect'] = 'Status głównego użytkownika "webmaster" jest niepoprawny';
+$lang['User "%s" created with "%s" like password'] = 'Użytkownik "%s" został utworzony z hasłem "%s"';
+$lang['Status of user "%s" updated'] = 'Status użytkownika "%s" został zaktualizowany';
+$lang['add new photos to caddie'] = 'dodaj nowe elementy do koszyka';
+$lang['No display'] = 'Brak wyświetlania';
+$lang['Classic display'] = 'Wyświetlanie klasyczne';
+$lang['Hoverbox display'] = 'Wyświetlanie w ramkach w kształcie poduszek';
+$lang['Mail address is obligatory for all users'] = 'Adres email jest obowiązkowy dla wszystkich użytkowników';
+$lang['Minimum privacy level'] = 'Minimalny poziom prywatności';
+$lang['Privacy level'] = 'Poziom prywatności';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakty';
+$lang['Level 2'] = 'Znajomi';
+$lang['Level 4'] = 'Rodzina';
+$lang['Level 8'] = 'Administratorzy';
+$lang['Reinitialize check integrity'] = 'Rozpocznij jeszcze raz sprawdzenie integralności';
+$lang['Check all'] = 'Zaznacz wszystkie';
+$lang['Uncheck all'] = 'Odznacz wszystkie';
+$lang['Check automatic corrections'] = 'Automatycznie sprawdzaj poprawki';
+$lang['Apply selected corrections'] = 'Zastosuj wybrane poprawki';
+$lang['Ignore selected anomalies'] = 'Ignoruj wybrane anomalie';
+$lang['Refresh'] = 'Odśwież';
+$lang['The anomaly will be ignored until next application version'] = 'Anomalia zostania zignorowana aż do następnej aktualizacji wersji';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Poprawka anomalii anuluje fakt, że została zignorowana';
+$lang['%d anomaly has been ignored.'] = '%d anomalia została zignorowana.';
+$lang['%d anomalies have been ignored.'] = '%d anomalii zostało zignorowanych.';
+$lang['Plugins which need upgrade'] = 'Wtyczki wymagające aktualizacji';
+$lang['Plugin list'] = 'Lista wtyczek';
+$lang['Check for updates'] = 'Sprawdź dostępność aktualizacji';
+$lang['Other plugins'] = 'Inne wtyczki';
+$lang['Last revisions'] = 'Ostatnie wersje';
+$lang['Are you sure you want to delete this plugin?'] = 'Czy na pewno chcesz usunąć tę wtyczkę?';
+$lang['Are you sure you want to install this plugin?'] = 'Czy na pewno chcesz zainstalować tę wtyczkę?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Czy na pewno chcesz zainstalować aktualizację? Musisz zweryfikować czy aktualna wersja nie wymaga odinstalowania.';
+$lang['Plugin has been successfully copied'] = 'Wtyczka została poprawnie skopiowana';
+$lang['You might go to plugin list to install and activate it.'] = 'Aby zainstalować lub aktywować wtyczkę udaj się do listy wtyczek.';
+$lang['Can\'t create temporary file.'] = 'Nie można stworzyć pliku tymczasowego.';
+$lang['Can\'t download archive.'] = 'Nie można pobrać archiwum.';
+$lang['Can\'t read or extract archive.'] = 'Nie można odczytać lub rozpakować archiwum.';
+$lang['An error occured during extraction (%s).'] = 'Błąd podczas rozpakowywania (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Sprawdź uprawnienia (CHMOD) do katalogu "plugins" oraz podfolderów.';
+$lang['Can\'t connect to server.'] = 'Nie można połączyć się do serwera.';
+$lang['Purge compiled templates'] = 'Usuń skompilowane szablony';
+$lang['ACCESS_0'] = 'Wolny dostęp';
+$lang['ACCESS_1'] = 'Dostęp dla wszystkich';
+$lang['ACCESS_2'] = 'Dostęp dla zapisanych';
+$lang['ACCESS_3'] = 'Dostęp dla Administratorów';
+$lang['ACCESS_4'] = 'Dostęp dla webmasterów';
+$lang['ACCESS_5'] = 'Brak dostępu';
+$lang['Support'] = 'Wsparcie';
+$lang['Documentation'] = 'Dokumentacja';
+$lang['A new version of Piwigo is available.'] = 'Dostępna jest nowa wersja Piwigo.';
+$lang['Piwigo Administration'] = 'Administracja Piwigo';
+$lang['Piwigo version'] = 'Wersja Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Używasz aktualnej wersji Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Zainstalowana wersja %s [%s] jest niekompatybilna z wymaganą wersją [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Musisz zaktualizować swój system by ......... w przeciwnym wypadku aplikacja nie będzie działała poprawnie lub w ogóle';
+$lang['Deleted on'] = 'Usunięte';
+$lang['Last hit'] =  'Ostatnie wejście';
+$lang['GD library is missing'] = 'Brak biblioteki GD';
+$lang['Templates'] = 'Szablony';
+$lang['Extend for templates'] = 'Rozszerz dla szablony';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'Zamienniki oryginalnych szablonów przez spersonalizowane szablony z katalogu template-extension';
+$lang['Replacers (customized templates)'] = 'Zamienniki (spersonalizowane szablony)';
+$lang['Original templates'] = 'Oryginalne szablony';
+$lang['Optional URL keyword'] = 'Opcjonalne słowo klucz dla URL';
+$lang['Templates configuration has been recorded.'] = 'Konfiguracja szablonów została zapisana.';
+$lang['All optimizations have been successfully completed.'] = 'Wszystkie optymalizacje zakończone pomyślnie.';
+$lang['Optimizations have been completed with some errors.'] = 'Optymalizacje zakończone z kilkoma błędami.';
+$lang['Modify information'] = 'Modyfikuj informacje';
+$lang['nothing'] = 'nic';
+$lang['overrides existing values with empty ones'] = 'nadpisuje istniejące wartości pustymi';
+$lang['Manage photo ranks'] = 'Sortowanie zdjęć';
+$lang['Edit ranks'] = 'Edytuj rankingi';
+$lang['No photo in this album'] = 'Brak elementó w tym albumie';
+$lang['Images manual order was saved'] = 'Zapisano własną kolejność zdjęć';
+$lang['ranks'] = 'rankingi';
+$lang['Drag to re-order'] = 'Przesuń aby zreorganizować';
+$lang['Quick Local Synchronization'] = 'Szybka synchronizacja lokalna';
+$lang['No photo can be deleted'] = 'Żadne zdjęcie nie zostało usunięte';
+$lang['Delete selected photos'] = 'Usuń zaznaczone zdjęcie';
+$lang['%d photo was deleted'] = '%d zdjęcie zostało usunięte';
+$lang['%d photos were deleted'] = '%d zdjęć zostało usuniętych';
+$lang['Downloads'] = 'Pobrania';
+$lang['Released on'] = 'Opublikowano';
+$lang['Number of downloads'] = 'Liczba pobrań';
+$lang['Piwigo Announcements Newsletter'] = 'Newsletter Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Zapisz się, aby otrzymywać Newsletter Piwigo, jeśli chcesz mieć bieżące informacje o projekcie Piwigo. Kiedy nowa wersja Piwigo zostanie opublikowana (czasami zawierająca konieczne do zainstalowania poprawki bezpieczeństwa) oraz gdy zajdą ważne zdarzenia dotyczące projektu - wtedy otrzymasz wiadomość e-mail z Newsletterem Piwigo. Powinno to być kilka wiadomości w ciągu roku.';
+$lang['Subscribe %s'] = 'Zapisz %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Zapisz %s do angielskiej wersji Newsletter Piwigo';
+$lang['Purge search history'] = 'Usuń historię przeszukiwań';
+$lang['Hide'] = 'Ukryj';
+$lang['Miscellaneous'] = 'Informacje różne';
+$lang['Unable to check for upgrade.'] = 'Nie można sprawdzić aktualizacji.';
+$lang['Operation in progress'] = 'Przetwarzanie obróbki.';
+$lang['Please wait...'] = 'Proszę czekać...';
+$lang['Password is missing. Please enter the password.'] = 'Brak hasła. Proszę wprowadzić hasło.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Brak potwierdzenia hasła. Proszę potwierdzić wybrane hasło.';
+$lang['Allow users to edit their own comments'] = 'Zezwól użytkownikom edytować swoje komentarze';
+$lang['Allow users to delete their own comments'] = 'Zezwól użytkownikom usuwać swoje komentarze';
+$lang['Email administrators when a comment is modified'] = 'Wyślij email do administratorów gdy komentarz był modyfikowany';
+$lang['Email administrators when a comment is deleted'] = 'Wyślij email do administratorów gdy komentarz został usunięty';
+$lang['Cannot delete the old permalink !'] = 'Stary link permanentny nie może być usunięty!';
+$lang['Hit'] = 'Wejść';
+$lang['Tools'] = 'Narzędzia';
+$lang['Photos'] = 'Zdjęcia';
+$lang['Themes'] = 'Tematy';
+$lang['Instructions to use Piwigo'] = 'Instrukcje używania Piwigo';
+$lang['Installed Themes'] = 'Zainstalowane Tematy';
+$lang['Add New Theme'] = 'Dodaj nowy temat';
+$lang['Forbid this theme to users'] = 'Zabroń używania tego tematu przez użytkowników';
+$lang['Set as default theme for unregistered and new users'] = 'Ustaw jako domyślny temat dla niezarejestrowanych użytkowników';
+$lang['unknown'] = 'nieznany';
+$lang['Upload Photos'] = 'Wgrywanie zdjęć';
+$lang['Drop into album'] = 'Wrzuć do albumu';
+$lang['+ Add an upload box'] = '+ Dodaj skrzynki wgrywania';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Tworzy katalog "%s" w głównym katalogu Twojej instalacji Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dodaj prawa do zapisu (chmod 777) do katalogu "%s" w głównym katalogu Twojej instalacji Piwigo';
+$lang['existing album'] = 'istniejący album';
+$lang['create a new album'] = 'stwórz nowy album';
+$lang['Album name'] = 'Nazwa albumu';
+$lang['Album "%s" has been added'] = 'Kategoria "%s" została dodana';
+$lang['Uploaded Photos'] = 'Wgrane zdjęcia';
+$lang['%d photos uploaded'] = '%d wgranych zdjęć';
+$lang['Privacy level set to "%s"'] = 'Poziom prywatności ustawiony na "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategoria "%s" aktualnie zawiera %d zdjęć';
+$lang['Manage this set of %d photos'] = 'Zarządzaj tym zbiorem %d zdjęć';
+$lang['Select files'] = 'Wybierz pliki';
+$lang['Everybody'] = 'Każdy';
+$lang['Who can see these photos?'] = 'Kto może oglądać te zdjęcia?';
+$lang['Settings'] = 'Ustawienia';
+$lang['Resize'] = 'Zmień wymiary';
+$lang['Maximum Width'] = 'Maksymalna szerokość';
+$lang['pixels'] = 'pikseli';
+$lang['Maximum Height'] = 'Maksymalna wysokość';
+$lang['Image Quality'] = 'Jakość obrazu';
+$lang['Save Settings'] = 'Zapisz Ustawienia';
+$lang['Your configuration settings are saved'] = 'Twoje ustawienia konfiguracji zostały zapisane';
+$lang['Active Themes'] = 'Aktywne Tematy';
+$lang['Add write access to the "%s" directory'] = 'Dodaj ustawienia do zapisu do katalogu "%s"';
+$lang['Administration Home'] = 'Administracja';
+$lang['Change Admin Colors'] = 'Zmień kolory administracyjne';
+$lang['Delete this theme'] = 'Usuń ten temat';
+$lang['Directory does not exist'] = 'Katalog nie istnieje';
+$lang['Download,'] = 'Pobierz,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronizacja';
+$lang['Get Support on Piwigo Forum'] = 'Uzyskaj pomoc na forum Piwigo';
+$lang['Help Me'] = 'Pomóż Mi';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ten temat nie może zostać aktywowany, ponieważ brakuje tematu nadrzędnego: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ten temat nie może zostać usunięty, ponieważ zależą od niego inne tematy: %s';
+$lang['Inactive Themes'] = 'Nieaktywne tematy';
+$lang['Install on your computer,'] = 'Zainstaluj na swoim komputerze,';
+$lang['Make this theme available to users'] = 'Daj dostęp do tematu użytkownikom';
+$lang['Page end'] = 'Koniec strony';
+$lang['Piwigo Uploader'] = 'Wgrywanie Piwigo';
+$lang['Read Piwigo Documentation'] = 'Czytaj dokumentację Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Uruchom pLoader i dodaj swoje zdjęcia.';
+$lang['Switch to clear or dark colors for administration'] = 'Przełącz pomiędzy czystym i ciemnym kolorem administracji';
+$lang['Theme has been successfully installed'] = 'Temat został pomyślnie zainstalowany';
+$lang['Visit Gallery'] = 'Odwiedź galerię';
+$lang['Visit Piwigo project website'] = 'Odwiedź stronę projektu Piwigo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader służy do <em>Piwigo Uploader</em>. pLoader przygotuje zdjęcia i prześle je do Twojej galerii Piwigo, z Twojego komputera.';
+$lang['Guest Settings'] = 'Ustawienia gości';
+$lang['Main Page'] = 'Strona główna';
+$lang['Photo Page'] = 'Strona zdjęć';
+$lang['Activate Navigation Bar'] = 'Aktywuj pasek nawigacji';
+$lang['Activate Navigation Thumbnails'] = 'Aktywuj pasek nawigacji z miniaturami';
+$lang['Activate icon "%s"'] = 'Aktywuj ikonę "%s"';
+$lang['Photo Properties'] = 'Właściwości zdjęcia';
+$lang['Allow user customization'] = 'Zezwól na dostosowanie przez użytkowników';
+$lang['Languages'] = 'Języki';
+$lang['Installed Languages'] = 'Zainstalowane języki';
+$lang['Add New Language'] = 'Dodaj nowy język';
+$lang['Language has been successfully installed'] = 'Język został zainstalowany pomyślnie';
+$lang['Select:'] = 'Wybierz:';
+$lang['None'] = 'Brak';
+$lang['Invert'] = 'Odwróć';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Nie można zdeaktywować tematy, ponieważ przynajmniej jeden musi być aktywny.';
+$lang['Webmaster status is required.'] = 'Status Webmastera jest wymagany.';
+$lang['Bound Theme'] = 'Przypięty temat';
+$lang['Allow rating'] = 'Zezwól na oceny';
+$lang['Select at least one comment'] = 'Wybierz przynajmniej jeden komentarz';
+$lang['Active Plugins'] = 'Aktywne wtyczki';
+$lang['Inactive Plugins'] = 'Nieaktywne wtyczki';
+$lang['Missing Plugins'] = 'Brakujące wtyczki';
+$lang['Uninstalled Plugins'] = 'Niezainstalowane wtyczki';
+$lang['By %s'] = 'Przez %s';
+$lang['Visit plugin site'] = 'Odwiedź stronę z wtyczkami';
+$lang['Active Languages'] = 'Aktywne języki';
+$lang['Delete this language'] = 'Usuń ten język';
+$lang['Forbid this language to users'] = 'Zabroń używania tego języka użytkownikom';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Nie można zdezaktywować tego języka. Najpierw ustaw inny język jako domyślny.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Nie można zdezaktywować tego języka, ponieważ musisz posiadać co najmniej jeden język.';
+$lang['Inactive Languages'] = 'Nieaktywne języki';
+$lang['Make this language available to users'] = 'Daj dostęp do tego języka użytkownikom';
+$lang['Set as default language for unregistered and new users'] = 'Ustaw jako domyślny język dla niezarejestrowanych oraz nowych użytkowników';
+$lang['Add Photos'] = 'Dodaj zdjęcia';
+$lang['The following tag was deleted'] = 'Ten tag został usunięty';
+$lang['Virtual Links'] = 'Wirtualne linki';
+$lang['There is no other language available.'] = 'Nie ma dostępnego innego języka.';
+$lang['There is no other plugin available.'] = 'Nie ma dostępnej innej wtyczki.';
+$lang['There is no other theme available.'] = 'Nie ma dostępnego innego tematu.';
+$lang['By rank'] = 'Po rankingu';
+$lang['Manual order'] = 'Własna kolejność';
+$lang['Add another set of photos'] = 'Dodaj inny zbiór zdjęć';
+$lang['Order of menubar items has been updated successfully.'] = 'Kolejność elementów paska menu została zaktualizowana pomyślnie.';
+$lang['This theme was not designed to be directly activated'] = 'Temat nie został zaprojektowany tak, by aktywować go bezpośrednio.';
+$lang['Who can see this photo?'] = 'Kto może oglądać o zdjęcie?';
+$lang['Pending Comments'] = 'Oczekujące komentarze';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'W twoim pliku php.ini, parametr upload_max_filesize (%sB) jest większy niż post_max_size (%sB), powinieneś zmienić te ustawienia';
+$lang['Exif extension not available, admin should disable exif use'] = 'Rozszerzenie exif jest nie dostępne, administrator powinien usunąć korzystanie z exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Wgrywany plik przekracza rozmiar zdefiniowany w parametrze upload_max_filesize w pliku php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Wgrywany plik przekracza rozmiar zdefiniowany w parametrze post_max_size w pliku php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Wgrywany plik przekracza rozmiar zdefiniowany w parametrze MAX_FILE_SIZE w formularzu HTML';
+$lang['The uploaded file was only partially uploaded'] = 'Plik został wgrany tylko częściowo';
+$lang['No file was uploaded'] = 'Nie został wgrany żaden plik';
+$lang['Missing a temporary folder'] = 'Brak katalogu tymczasowego';
+$lang['Failed to write file to disk'] = 'Błąd zapisu na dysku';
+$lang['File upload stopped by extension'] = 'Wgrywanie pliku zostało zatrzymane przez rozszerzenie';
+$lang['Unknown upload error'] = 'Nieznany błąd podczas wgrywania';
+$lang['Error on file "%s" : %s'] = 'Błąd w pliku"%s" : %s';
+$lang['Menu Management'] = 'Menu';
+$lang['automatic order'] = 'automatyczna kolejność';
+$lang['manual order'] = 'własna kolejność';
+$lang['Albums automatically sorted'] = 'Albumy sortowane automatycznie';
+$lang['Batch Manager'] = 'Manadżer wsadowy';
+$lang['include child albums'] = 'zawieraj podalbumy';
+$lang['Selection'] = 'Zaznaczenie';
+$lang['Action'] = 'Akcja';
+$lang['Set author'] = 'UStaw autora';
+$lang['Set title'] = 'Ustaw tytuł';
+$lang['Set creation date'] = 'Ustaw datę utworzenia';
+$lang['Apply action'] = 'Zastosuj akcje';
+$lang['on the %d selected photos'] = 'na %d zaznaczonych zdjęć';
+$lang['%d of %d photos selected'] = '%d z %d zaznaczonych zdjęć';
+$lang['No photo selected, %d photos in current set'] = 'Nie zostało wybrane żadne zdjęcie, %d zdjęć w aktualnym zestawie';
+$lang['All %d photos are selected'] = '%d wszystkich zaznaczonych zdjęć';
+$lang['remove this filter'] = 'usuń ten filtr';
+$lang['Duplicates'] = 'duplikaty';
+$lang['Add a filter'] = 'Dodaj filtr';
+$lang['Remove all filters'] = 'Usuń wszsytkie filtry';
+$lang['Refresh photo set'] = 'Odśwież zestaw zdjęć';
+$lang['The whole page'] = 'Całą strona';
+$lang['The whole set'] = 'Cały zestaw';
+$lang['No photo in the current set.'] = 'Brak zdjęć w wybranym zestawie.';
+$lang['No photo selected, no action possible.'] = 'Brak wybranych zdjęć, niedostępna jest żadna akcja.';
+$lang['Choose an action'] = 'Wybierz akcję';
+$lang['remove author'] = 'usuń autora';
+$lang['Type here the author name'] = 'Wpisz tutaj nazwę autora';
+$lang['remove title'] = 'usuń tytuł';
+$lang['Type here the title'] = 'Wpisz tutaj tytuł';
+$lang['remove creation date'] = 'usuń datę stworzenia';
+$lang['Album photos associated to the following albums: %s'] = 'Zdjęcia albumu są powiązane z następującymi albumami: %s';
+$lang['Delete orphan tags'] = 'Usuń niepowiązane tagi';
+$lang['delete photo'] = 'usuń zdjęcie';
+$lang['Orphan tags deleted'] = 'Niepowiązane tagi usunięto';
+$lang['Remove from caddie'] = 'Usuń z koszyk';
+$lang['Week starts on'] = 'Tydzień zaczyna się w';
+$lang['You have %d orphan tags: %s.'] = 'Masz %d niepowiązanych tagów: %s.';
+$lang['Themes which need upgrade'] = 'Tematy wymagające aktualizacji';
+$lang['Languages which need upgrade'] = 'Języki wymagające aktualizacji';
+$lang['All themes are up to date.'] = 'Wszystkie tematy są aktualne.';
+$lang['All plugins are up to date.'] = 'Wszystkie wtyczki są aktualne.';
+$lang['All languages are up to date.'] = 'Wszystkie języki są aktualne.';
+$lang['Visit theme site'] = 'Odwiedź stronę temetu';
+$lang['Visit language site'] = 'Odwiedź stronę języka';
+$lang['New Version'] = 'Nowa wersja';
+$lang['Obsolete Plugins'] = 'Przestałe wtyczki';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'UWAGA! Ta wtyczka wydaje się nie być kompatybilna z tą wersją Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Czy jednak chcesz aktywować?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TA WTYCZKA JEST TERAZ CZĘŚCIĄ PODSTAWOWEJ WERSJI PIWIGO! ODINSTALUJ JĄ TERAZ!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'BŁĄD: BRAK WTYCZKI CHOĆ JEST ZAINSTALOWANA! ODINSTALUJ JĄ TERAZ.';
+$lang['display'] = 'wyświetlanie';
+$lang['new'] = 'nowy';
+$lang['No results'] = 'Brak wyników';
+$lang['Searching...'] = 'Wyszukiwanie...';
+$lang['Type in a search term'] = 'Wpisz frazę do wyszukania';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktywuj ikonę "nowe" obok albumów i zdjęć';
+$lang['Deactivate all'] = 'Deaktywuj wszystko';
+$lang['Default photos order'] = 'Domślne sortowanie zdjęć';
+$lang['Restore'] = 'Przywróć';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Przywróć domyślną konfigurację. Stracisz ustawienia wtyczek!';
+$lang['Show menubar'] = 'Pokazuj belkę z menu';
+$lang['Thumbnails generation in progress...'] = 'Trwa tworzenie miniatur...';
+$lang['Photos generation in progress...'] = 'Trwa tworzenie zdjęć...';
+$lang['%s photos have been regenerated'] = 'Stworzono %s zdjęć';
+$lang['%s photos can not be regenerated'] = '%s zdjęć nie mogło zostać stworzonych';
+$lang['Updates'] = 'Aktualizacje';
+$lang['Update in progress... Please wait.'] = 'Trwa aktualizacja... Proszę czekać.';
+$lang['Ignore this update'] = 'Ignoruj tę aktualizację';
+$lang['Reset ignored updates'] = 'Zresetuj ignorowane aktualizacje';
+$lang['Update All'] = 'Aktualizuj wszystko';
+$lang['ERROR'] = 'BŁĄD';
+$lang['Update Complete'] = 'Aktualizacja zakończona';
+$lang['Rate'] = 'Ocena';
+$lang['Average rate'] = 'Średnia ocena';
+$lang['Learn more'] = 'Dowiedz się więcej';
+$lang['Add a criteria'] = 'Dodaj kryteria';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Nie możesz zdefiniować domyślnej kolejności zdjęć, gdyż stworzono własne ustawienia w konfiguracji plików lokalnych .';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Określiłeś <i>$conf[\'order_by\']</i> w lokalnym plików konfiguracji. Parametr ten jest przestarzały. Usuń go lub zmień jego nazwę na <i>$conf[\'order_by_custom\']</i> !';
+$lang['Piwigo Update'] = 'Aktualizacja Piwigo';
+$lang['Extensions Update'] = 'Aktualizacja rozszerzeń';
+$lang['All extensions are up to date.'] = 'Wszystkie rozszerzenia są aktualne.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Poniższe rozszerzenia mogą być nieaktualne z nową wersją Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Poniższe tematy mogą być nieaktualne z nową wersją Piwigo:';
+$lang['I decide to update anyway'] = 'Aktualizuj mimo wszystko';
+$lang['Update to Piwigo %s'] = 'Aktualizuj do Piwigo %s';
+$lang['Two updates are available'] = 'Dostępne są dwie aktualizacje';
+$lang['This is a minor update, with only bug corrections.'] = 'Jest to mała aktualizacja usuwająca tylko znalezione błędy.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Jest to duża aktualizacja z <a href="%s">nowymi funkcjami</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Niektóre tematy i rozszerzenia mogą nie być jeszcze dostępne.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Możesz aktualizować bezpośrednio do Piwigo %s, bez potrzeby wcześniejszej aktualizacji do wersji %s (zalecane).';
+$lang['Save Template Directory'] = 'Zachowaj katalog szablonów';
+$lang['Dump Database'] = 'Zrzut Bazy Danych';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Dołącz informacje o historii (Uwaga: limit pamięci serwera może zostać przekroczony)';
+$lang['Unable to dump database.'] = 'Błąd zrzucania bazy danych.';
+$lang['Some upgrades are available for extensions.'] = 'Niektóre rozszerzenia posiadają aktualizacje.';
+$lang['Ignore All'] = 'Ignoruj wszystko';
+$lang['Crop'] = 'Przytnij';
+$lang['Width'] = 'Szerokość';
+$lang['Height'] = 'Wysokość';
+$lang['Follow Orientation'] = 'Zgodnie z orientacją';
+$lang['Graphics Library'] = 'Biblioteki Graficzne';
+$lang['... or '] = '... lub ';
+$lang['Create'] = 'Utwórz';
+$lang['Start Upload'] = 'Rozpocznij wysyłanie';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Używasz trybu Flash. Problem? Spróbuj <a href="%s">interfejsu przeglądarkowego</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Używasz trybu przeglądarki. Wypróbuj <a href="%s">trybu Flash</a>.';
+$lang['Maximum file size: %sB.'] = 'Maksymalny rozmiar pliku: %sB.';
+$lang['Allowed file types: %s.'] = 'Dostępne typy plików: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Przybliżona maksymalna rozdzielczość: %dM pikseli (tj. %dx%d pikseli).';
+$lang['Manage Permissions'] = 'Zarządzaj uprawnieniami';
+$lang['Photo %s of %s'] = 'Zdjęcie %s z %s';
+$lang['show details'] = 'pokaż szczegóły';
+$lang['hide details'] = 'ukryj szczegóły';
+$lang['Merge tags'] = 'Połącz tagi';
+$lang['Select the destination tag'] = 'Wybierz tag docelowy';
+$lang['(this tag will be deleted)'] = '(ten tag zostanie usunięty)';
+$lang['Confirm merge'] = 'Zatwierdź łączenie';
+$lang['Merge selected tags'] = 'Połącz wybrane tagi';
+$lang['No destination tag selected'] = 'Nie wybrano taga docelowego';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Tagi <em>%s</em> połączono w tag <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Wybierz co najmniej dwa tagi do łączenia';
+$lang['Select an album'] = 'Wybierz album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Piwigo stworzy domyślnie nową stronę z twoich zdjęć w jakości HD.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Jeśli wersja HD jest niedostępna a bieżący rozmiar jest większy niż rozmiar zmiany, Piwigo przesunie zdjęcia jako HD i stworzy z nich pomniejszone wersje.'; 
+$lang['An error has occured during upgrade.'] = 'Wystąpił błąd podczas aktualizacji.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Wystąpił błąd podczas rozpokowywania. Sprawdź uprawnienia do plików w katalogu gdize jest zainstalowane piwigo.<br><a href="%s">Kliknij aby zobaczyć błędy</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo nie może ściągnąć pliku aktualizacji z serwera';
+$lang['Zoom'] = 'Powiększenie';
+$lang['Add to caddie'] = 'Dodaj do koszyka';
+$lang['Add tags'] = 'Dodaj tagi';
+$lang['Last import'] = 'Ostatnie importowanie';
+$lang['Photo name'] = 'Nazwa zdjęcia';
+$lang['Predefined filter'] = 'Filtr predefiniowany';
+$lang['With no album'] = 'Bez albumu';
+$lang['With no tag'] = 'Bez tagów';
+$lang['With no virtual album'] = 'Bez wirtualnego albumu';
+$lang['%s has been successfully updated.'] = '%s zostało pomyślnie zaktualizowanych.';
+$lang['Activate comments'] = 'Aktywuj komentarze';
+$lang['Default comments order'] = 'Domyślna kolejność komentarzy';
+$lang['Send connection settings by email'] = 'Wyślij dane logowania emailem';
+$lang['The original image quality must be a number between %d and %d'] = 'Oryginalna jakość musi być liczbą pomiędzy %d i %d';
+$lang['The original maximum height must be a number between %d and %d'] = ' Oryginalna maksymalna wysokość musi być liczbą pomiędzy %d i %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Oryginalna maksymalna szerokość musi być liczbą pomiędzy %d i %d';
+$lang['Resize after upload'] = 'Zmień rozmiar po wgraniu';
+$lang['Original Size'] = 'Oryginalny Rozmiar';
+$lang['A locked gallery is only visible to administrators'] = 'Zablokowana galeria jest widoczna tylko dla administratorów';
+$lang['Unlock gallery'] = 'Odblokuj galerię';
+$lang['Gallery unlocked'] = 'Galeria odblokowana';
+$lang['Notify administrators when a comment is'] = 'Powiadom administratorów jeżeli komentarz jest';
+$lang['modified'] = 'zmodyfikowany';
+$lang['pending validation'] = 'oczekuje na zatwierdzenie';
+$lang['Save visits in history for'] = 'Zapisz historię odwiedzin dla';
+$lang['simple visitors'] = 'zwykli użytkownicy';
+$lang['registered users'] = 'zarejestrowanych użytkowników';
+$lang['administrators'] = 'administratorów';
+$lang['This album contains %d photos, added on %s.'] = 'Ten album zawiera %d zdjęć, dodanych %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Ten album zawiera %d zdjęć, dodanych między %s a %s.';
+$lang['This album contains no photo.'] = 'Ten album nie zawiera zdjęć.';
+$lang['Not cropped correctly?'] = 'Rozmiar nie zmieniony poprawnie?';
+$lang['Center of interest'] = 'Centrum zainteresowania';
+$lang['Move to album'] = 'Przenieś do albumu';
+
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo na Androida</em> aplikacja daje możliwość połączenia Twojej galerii Piwigo z Twoim telefonem lub tabletem opartym na Androidzie. Możesz tworzyć albumy i wysyłać wiele zdjęć jednocześnie.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo na iOS</em> aplikacja daje możliwość połączenia Twojej galerii Piwigo z Twoim iPhonem, iPadem lub iPodem. Możesz tworzyć albumy i wysyłać wiele zdjęć jednocześnie.';
+$lang['Applications'] = 'Aplikacje';
+$lang['Available on'] = 'Dostępne na';
+$lang['Available versions for'] = 'Wersje dostępne na';
+$lang['Cancel'] = 'Anuluj';
+$lang['Piwigo for Android'] = 'Piwigo na Androida';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo na iOS (iPhone, iPad, iPod Touch)';
+$lang['any visitor can see this album'] = 'wszyscy odwiedzający galerię zobaczą ten album';
+$lang['apply automatic sort order'] = 'Zastosuj automatyczną kolejność sortowania';
+$lang['Automatic sort order'] = 'Automatyczna kolejność sortowania';
+$lang['cancel manual order'] = 'Anuluj własne ustawienia kolejności';
+$lang['No group is permitted to see this private album'] = 'Do tego prywatnego albumu nie przydzielono żadnej grupy';
+$lang['Save manual order'] = 'Zapisz własne ustawienia kolejności';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'odwiedzający galerię muszą się zalogować i mieć uprawnienia do oglądania tego albumu';
+$lang['You can activate only one mobile theme.'] = 'Możesz aktywować tylko jeden temat mobilny';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u użytkowników dostało zezwolenie automatycznie, bo należą do grupy, której udzielono zezwolenia';
+$lang['custom'] = 'Własne';
+$lang['Delete multiple size images'] = 'Kasuj obrazy w wielu rozmiarach';
+$lang['Generate multiple size images'] = 'Twórz obrazy w wielu rozmiarach';
+$lang['Groups and users'] = 'Użytkownicy i grupy';
+$lang['include photos with lower privacy level'] = 'dołącz zdjęcia z niższym poziomem prywatności';
+$lang['List'] = 'Lista';
+$lang['Permission granted for groups'] = 'Zezwolenia udzielone grupom';
+$lang['Permission granted for users'] = 'Zezwolenia udzielone użytkownikom';
+$lang['Permission management'] = 'Zarządzanie zezwoleniami';
+$lang['Select groups...'] = 'Wybierz grupy...';
+$lang['Select users...'] = 'Wybierz użytkowników...';
+$lang['There is no group in this gallery.'] = 'Do tej galerii nie przydzielono żadnej grupy';
+$lang['Web Form'] = 'Forumlarz www';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom jest oprogramowaniem do zdjęć zaprojektowanym do zarządzania dużą ilością cyfrowych obrazów oraz prac po ich stworzeniu.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Na Linux po prostu instalujesz Shotwell swoim menadżerem pakietów a następnie aktywujesz opcję publikowania Piwigo.';
+$lang['Piwigo publish plugin for digiKam'] = 'Wtyczka Piwigo dla digiKam.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Wtyczka Piwigo Publish dla Lightroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Wtyczka Piwigo dla Shotwell.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell jest oprogramowaniem typu open source do zarządzania zdjęciami na systemie Linux. Jest domyślnym menadżerem zdjęć dla dystrybucji Ubuntu oraz Fedora.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Wtyczka Piwigo Publish powala na eksportowanie i synchronizację zdjęć bezpośrednio z Lightroom do Twojej galerii Piwigo.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture jest narzędziem do poprawiania oraz zarządzania bibliotekami zdjęć na Mac\'u.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture jest zaprojektowany dla profesjonalnych fotografów, ale posiada prostotę iPhoto.';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam jest zaawansowanym, darmowym oprogramowaniem do zarządzania zdjęciami dla systemów Linux, Windows oraz MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam jest zaprojektowany dla fotografów, którzy chcą przeglądac, zarządzać, edytować, polepszać, organizować, tagować oraz współdzielić zdjęcia.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funkcje to m.in. przeglądanie, tworzenie albumów oraz wgrywanie zdjęć.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto jest domyślnym oprogramowaniem zarządzania zdjęciami dla MacOSX. Wtyczka eksportu Piwigo pozwoli Ci tworzyć nowe albumy i eksportować zdjęcia bezpośrednio z iPhoto do galerii Piwigo.';
+$lang['Piwigo export plugin for Aperture'] = 'Wtyczka Piwigo dla Aperture.';
+$lang['Piwigo export plugin for iPhoto'] = 'Wtyczka Piwigo dla iPhoto.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (Klient RemoteGallery dla Androida) jest klientem Piwigo na platformę Android (open source na licencji GPLv3).';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Wtyczka eksportu Piwigo, pozwala Ci na łatwe tworzenie albumów oraz eksport zdjęć.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Aby eksportować zdjęcia z digiKam, zainstaluj digiKam oraz wtyczki Kipi.';
+$lang['Apply watermark if height is bigger than'] = 'Dodaj znak wodny, jeśli wysokość jest większa niż';
+$lang['Apply watermark if width is bigger than'] = 'Dodaj znak wodny, jeśli szerokość jest większa niż';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Domyślnie, wybierany jest środek zdjęcia.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Dla obciętych zdjęć np. do kwadratu, Piwigo będzie starać się wyśrodkować na interesującym obszarze zdjęcia.';
+$lang['Opacity'] = 'Przezroczystość';
+$lang['Photo sizes with crop'] = 'Rozmiary zdjęć po obcięciu';
+$lang['Select a file'] = 'Wybierz plik';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Zaznacz myszką nowy obszar zdjęcia.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Interesujący obszar zdjęcia, to ten w którym dzieje się najwięcej.';
+$lang['X Position'] = 'Pozycja X';
+$lang['X Repeat'] = 'Powtarzaj X';
+$lang['Y Position'] = 'Pozycja Y';
+$lang['add a new watermark'] = 'dodaj nowy znak wodny';
+$lang['bottom left corner'] = 'dolny lewy róg';
+$lang['bottom right corner'] = 'prawy dolny róg';
+$lang['middle'] = 'środek';
+$lang['top left corner'] = 'lewy górny róg';
+$lang['top right corner'] = 'prawy górny róg';
+?>
Index: tags/2.4.0RC3/language/pl_PL/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/common.lang.php	(revision 14585)
@@ -0,0 +1,410 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Polski [PL]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=430
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+//Polish translation by voyteckst (voyteckst@yahoo.com). You can edit them free and post corrections to Piwigo.
+$lang_info['language_name'] = 'Polish';
+$lang_info['country'] = 'Polska';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'pl';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d album zaktualizowany';
+$lang['%d albums updated'] = '%d albumów zaktualizowanych';
+$lang['%d comment to validate'] = '%d komentarz do weryfikacji';
+$lang['%d comments to validate'] = '%d komentarzy do weryfikacji';
+$lang['%d new comment'] = '%d nowy komentarz';
+$lang['%d new comments'] = '%d nowe komentarze';
+$lang['%d comment'] = '%d komentarz';
+$lang['%d comments'] = '%d komentarzy';
+$lang['%d hit'] = '%d wejście';
+$lang['%d hits'] = '%d wejść';
+$lang['%d new photo'] = '%d nowy element';
+$lang['%d new photos'] = '%d nowych elementów';
+$lang['%d new user'] = '%d nowy użytkownik';
+$lang['%d new users'] = '%d nowi użytkownicy';
+$lang['About'] = 'O Piwigo';
+$lang['All tags'] = 'Wszystkie tagi';
+$lang['Any tag'] = 'Dowolny tag';
+$lang['At least one listed rule must be satisfied.'] = 'Przynajmniej jedna reguła musi być spełniona.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Albumy';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Zamknij okno';
+$lang['Complete RSS feed (photos, comments)'] = 'Kompletny RSS feed (zdjęcia, komentarze)';
+$lang['Confirm Password'] = 'Potwierdź hasło';
+$lang['Connection settings'] = 'Ustawienia połączenia';
+$lang['Login'] = 'Logowanie';
+$lang['Contact webmaster'] = 'Kontakt z webmasterem';
+$lang['Create a new account'] = 'Utwórz nowe konto';
+$lang['Created on'] = 'Utworzone';
+$lang['Creation date'] = 'Data utworzenia';
+$lang['Current password is wrong'] = 'Złe hasło';
+$lang['Dimensions'] = 'Rozmiary';
+$lang['Display'] = 'Wyświetlanie';
+$lang['Each listed rule must be satisfied.'] = 'Każda reguła musi być spełniona.';
+$lang['Email address is missing. Please specify an email address.'] = 'Brak adresu email';
+$lang['Email address'] = 'Adres email';
+$lang['Enter your personnal informations'] = 'Wprowadź informacje';
+$lang['Error sending email'] = 'Błąd podczas wysyłania maila';
+$lang['File name'] = 'Nazwa pliku';
+$lang['File'] = 'Plik';
+$lang['Filesize'] = 'Rozmiar pliku';
+$lang['Filter and display'] = 'Filtrowanie i wyświetlanie';
+$lang['Filter'] = 'Filtr';
+$lang['Forgot your password?'] = 'Zapomniane hasło?';
+$lang['Go through the gallery as a visitor'] = 'Przejdź do galerii jako gość';
+$lang['Help'] = 'Pomoc';
+$lang['Identification'] = 'Logowanie';
+$lang['Photos only RSS feed'] = 'RSS feed tylko dla zdjęć';
+$lang['Keyword'] = 'Słowo kluczowe';
+$lang['Links'] = 'Linki';
+$lang['N/A'] = 'N/D';
+$lang['New on %s'] = 'Nowe %s';
+$lang['Notification'] = 'Powiadamianie';
+$lang['Number of items'] = 'Liczba obiektów';
+$lang['Original dimensions'] = 'Oryginalne rozmiary';
+$lang['Password forgotten'] = 'Zapomniane hasło';
+$lang['Password'] = 'Hasło';
+$lang['Post date'] = 'Data umieszczenia';
+$lang['Posted on'] = 'Data umieszczenia';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Logowanie';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Register'] = 'Zarejestruj';
+$lang['Registration'] = 'Rejestracja';
+$lang['Related tags'] = 'Powiązane tagi';
+$lang['Reset'] = 'Resetuj';
+$lang['Retrieve password'] = 'Odzyskaj hasło';
+$lang['Search rules'] = 'Reguły wyszukiwania';
+$lang['Search tags'] = 'Szukaj tagów';
+$lang['Search'] = 'Szukaj';
+$lang['display available tags'] = 'Zobacz dostępne tagi';
+$lang['Since'] = 'Od';
+$lang['Sort by'] = 'Sortuj po';
+$lang['Sort order'] = 'Sortowanie po';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tagi';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS zapewnia powiadomienia o wydarzeniach na tej stronie: nowych zdjęciach, aktualizacjach albumów, nowych komentarzach. Do użycia z czytnikiem RSS.';
+$lang['Unknown feed identifier'] = 'Nieznany identyfikator feed';
+$lang['User comments'] = 'Komentarze użytkowników';
+$lang['Username'] = 'Użytkownik';
+$lang['Visits'] = 'Odwiedzin';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Tydzień %d';
+$lang['About Piwigo'] = 'O Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Nie masz uprawnień do oglądania tej strony';
+$lang['add this photo to your favorites'] = 'Dodaj zdjęcie do ulubionych';
+$lang['Administration'] = 'Administracja';
+$lang['all'] = 'wszystkie';
+$lang['ascending'] = 'rosnąco';
+$lang['author(s) : %s'] = 'Autor(-rzy) : %s';
+$lang['Expand all albums'] = 'Rozwiń wszystkie albumy';
+$lang['posted after %s (%s)'] = 'umieszczone po %s (%s)';
+$lang['posted before %s (%s)'] = 'umieszczone przed %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'umieszczone pomiędzy %s (%s) i %s (%s)';
+$lang['posted on %s'] = 'umieszczone %s';
+$lang['Best rated'] = 'Najlepiej oceniane';
+$lang['display best rated photos'] = 'wyświetl najlepiej oceniane obiekty';
+$lang['Calendar'] = 'Kalendarz';
+$lang['All'] = 'Wszystkie';
+$lang['display each day with photos, month per month'] = 'wyświetl każdy dzień ze zdjęciem, miesiąc po miesiącu';
+$lang['View'] = 'Pokaż';
+$lang['chronology_monthly_calendar'] = 'Kalendarz miesięczny';
+$lang['chronology_monthly_list'] = 'Lista miesięczna';
+$lang['chronology_weekly_list'] = 'Lista tygodniowa';
+$lang['Click here if your browser does not automatically forward you'] = 'Kliknij jeżeli nie zostałeś przekierowany poprawnie';
+$lang['comment date'] = 'data komentarza';
+$lang['Comment'] = 'Komentarz';
+$lang['Your comment has been registered'] = 'Twój komentarz został zapisany';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood system : poczekaj chwilę aby wysłać następny komentarz';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Twój komentarz nie został zarejestrowany, ponieważ nie jest zgodny z regułami walidacji';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administrator musi zatwierdzić Twój komentarz zanim będzie on widoczny.';
+$lang['This login is already used by another user'] = 'Ten login jest już używany przez innego użytkownika';
+$lang['Comments'] = 'Komentarze';
+$lang['Add a comment'] = 'Dodaj komentarz';
+$lang['created after %s (%s)'] = 'utworzone po %s (%s)';
+$lang['created before %s (%s)'] = 'utworzone przed %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'utworzone pomiędzy %s (%s) i %s (%s)';
+$lang['created on %s'] = 'utworzone %s';
+$lang['Customize'] = 'Dostosuj';
+$lang['Your Gallery Customization'] = 'Twoje dostosowanie ';
+$lang['day'][0] = 'Niedziela';
+$lang['day'][1] = 'Poniedziałek';
+$lang['day'][2] = 'Wtorek';
+$lang['day'][3] = 'Środa';
+$lang['day'][4] = 'Czwartek';
+$lang['day'][5] = 'Piątek';
+$lang['day'][6] = 'Sobota';
+$lang['Default'] = 'Domyślnie';
+$lang['delete this photo from your favorites'] = 'Usuń zdjęcie ze swoich ulubionych';
+$lang['Delete'] = 'Usuń';
+$lang['descending'] = 'malejąco';
+$lang['Download'] = 'Pobierz';
+$lang['Download this file'] = 'Pobierz ten plik';
+$lang['edit'] = 'edytuj';
+$lang['wrong date'] = 'zła data';
+$lang['excluded'] = 'wykluczone';
+$lang['Your favorites'] = 'Moje ulubione';
+$lang['display your favorites photos'] = 'pokaż moje ulubione zdjęcia';
+$lang['Favorites'] = 'Ulubione';
+$lang['First'] = 'Pierwsza';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galeria zablokowana w celach konserwacji. Wróć później.';
+$lang['Page generated in'] = 'Strona wygenerowana w';
+$lang['guest'] = 'gość';
+$lang['Hello'] = 'Witaj';
+$lang['available for administrators only'] = 'dostępne tylko dla administratorów';
+$lang['display this album'] = 'pokazuje zdjęcia w głównym katalogu albumu';
+$lang['display last user comments'] = 'Zobacz ostatnie komentarze';
+$lang['customize the appareance of the gallery'] = 'dostosuj wygląd galerii';
+$lang['search'] = 'szukaj';
+$lang['Home'] = 'Strona Główna';
+$lang['Identification'] = 'Uprawnienia';
+$lang['in this album'] = 'w tym albumie';
+$lang['in %d sub-album'] = 'w %d pod-albumie';
+$lang['in %d sub-albums'] = 'w %d pod-albumach';
+$lang['included'] = 'zawarte';
+$lang['Invalid password!'] = 'Złe hasło!';
+$lang['Language']='Język';
+$lang['last %d days'] = 'ostatnich %d dni';
+$lang['Last'] = 'Ostatnia';
+$lang['Logout'] = 'Wyloguj';
+$lang['obligatory'] = 'obowiązkowe';
+$lang['Maximum photo height'] = 'Maksymalna wysokość zdjęć';
+$lang['Maximum height must be a number superior to 50'] = 'Maksymalna wysokość musi być liczbą do 50';
+$lang['Maximum photo width'] = 'Maksymalna szerokość zdjęć';
+$lang['Maximum width must be a number superior to 50'] = 'Maksymalna szerokość musi być liczbą do 50';
+$lang['display a calendar by creation date'] = 'wyświetla kalendarz po dacie utworzenia';
+$lang['display all photos in all sub-albums'] = 'pokaż wszystkie elementy w albumach i pod-albumach';
+$lang['return to normal view mode'] = 'powrót do normalnego widoku';
+$lang['display a calendar by posted date'] = 'wyświetla kalendarz po dacie umieszczenia';
+$lang['month'][10] = 'Październik';
+$lang['month'][11] = 'Listopad';
+$lang['month'][12] = 'Grudzień';
+$lang['month'][1] = 'Styczeń';
+$lang['month'][2] = 'Luty';
+$lang['month'][3] = 'Marzec';
+$lang['month'][4] = 'Kwiecień';
+$lang['month'][5] = 'Maj';
+$lang['month'][6] = 'Czerwiec';
+$lang['month'][7] = 'Lipiec';
+$lang['month'][8] = 'Sierpień';
+$lang['month'][9] = 'Wrzesień';
+$lang['Most visited'] = 'Najczęściej odwiedzane';
+$lang['display most visited photos'] = 'pokaż najczęściej odwiedzane zdjęcia';
+$lang['The number of photos per page must be a not null scalar'] = 'Liczba zdjęć na stronie musi być większa od zera';
+$lang['Number of photos per page'] = 'Liczba zdjęć na stronie';
+$lang['Unknown identifier'] = 'Nieznany identyfikator';
+$lang['New password'] = 'Nowe hasło';
+$lang['Rate this photo'] = 'Oceń to zdjęcie';
+$lang['Next'] = 'Następne';
+$lang['no rate'] = 'nie oceniane';
+$lang['Photos posted within the last %d day.'] = 'Wyświetl elementy umieszczone w ciągu ostatniego %s dnia.';
+$lang['Photos posted within the last %d days.'] = 'Wyświetl elementy umieszczone w ciągu ostatnich %s dni.';
+$lang['password updated'] = 'hasło zmienione';
+$lang['Recent period must be a positive integer value'] = 'Okres czasu musi być liczbą dodatnią';
+$lang['photo'] = 'zdjęcie';
+$lang['Click on the photo to see it in high definition'] = 'Wybierz zdjęcie aby je zobaczyć w większej rozdzielczości';
+$lang['Show file metadata'] = 'Pokaż metadane (EXIF)';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Preferencje';
+$lang['Previous'] = 'Poprzednia';
+$lang['Random photos'] = 'Losowe zdjęcia';
+$lang['display a set of random photos'] = 'wyświetla zbiór losowych zdjęć';
+$lang['Recent albums'] = 'Aktualne albumy';
+$lang['display recently updated albums'] = 'pokaż aktualnie zaktualizowane albumy';
+$lang['Recent period'] = 'Najnowszy okres';
+$lang['Recent photos'] = 'Najnowsze zdjęcia';
+$lang['display most recent photos'] = 'wyświetla najnowsze zdjęcia';
+$lang['Redirection...'] = 'Przekierowywanie...';
+$lang['Please, enter a login'] = 'Wprowadź login';
+$lang['login mustn\'t end with a space character'] = 'Login nie może posiadać spacji';
+$lang['login mustn\'t start with a space character'] = 'Login nie może zaczynać się od znaku specjalnego';
+$lang['this login is already used'] = 'ten login już istnieje';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail musi być w postaci xxx@yyy.eee (przykład : jack@altern.org)';
+$lang['please enter your password again'] = 'wprowadź hasło jeszcze raz';
+$lang['Auto login'] = 'Pamiętaj mnie';
+$lang['remove this tag from the list'] = 'usuń ten tag z listy';
+$lang['representative'] = 'reprezentant';
+$lang['Search for Author'] = 'Szukaj Autora';
+$lang['Search in albums'] = 'Szukaj w albumach';
+$lang['Search by date'] = 'Szukaj po Dacie';
+$lang['Date'] = 'Data od';
+$lang['End-Date'] = 'Data do';
+$lang['Kind of date'] = 'Rodzaj daty';
+$lang['Search for words'] = 'Szukaj słów';
+$lang['Search for all terms'] = 'Szukaj po wszystkim ';
+$lang['Search for any term'] = 'Szukaj po wszystkim';
+$lang['Empty query. No criteria has been entered.'] = 'Puste zapytanie. Nie zostały wprowadzone żadne kryteria.';
+$lang['Search results'] = 'Wyniki wyszukiwania';
+$lang['Search in sub-albums'] = 'Szukaj w pod-albumach';
+$lang['searched words : %s'] = 'szukane słowa : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'ustaw jako reprezentanta albumu';
+$lang['Show number of comments'] = 'Pokaż liczbę komentarzy';
+$lang['Show number of hits'] = 'Pokaż liczbę wyświetleń';
+$lang['slideshow'] = 'pokaz zdjęć';
+$lang['stop the slideshow'] = 'zatrzymaj pokaz';
+$lang['Specials'] = 'Specjalne';
+$lang['SQL queries in'] = 'Zapytania SQL w';
+$lang['display only recently posted photos'] = 'wyświetla tylko ostatnio umieszczone';
+$lang['return to the display of all photos'] = 'powrót do wyświetlania wszystkich elementów';
+$lang['the beginning'] = 'początek';
+$lang['Interface theme'] = 'Styl interfejsu';
+$lang['Thumbnails'] = 'Miniatury';
+$lang['Menu'] = 'Menu';
+$lang['A comment on your site'] = 'Komentarz do Twojej strony';
+$lang['today'] = 'dzisiaj';
+$lang['Update your rating'] = 'Aktualizuj Twoją ocenę';
+$lang['the username must be given'] = 'nazwa użytkownika musi być podana';
+$lang['useful when password forgotten'] = 'przydatne gdy zostanie zapomniane hasło';
+$lang['Quick search'] = 'Szybkie wyszukiwanie';
+$lang['Connected user: %s'] = 'Zalogowany użytkownik: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Przeglądarka: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Komentarz: %s';
+$lang['Comment by %s'] = 'Komentarz wystawiony przez %s';
+$lang['User: %s'] = 'Użytkownik: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Rejestracja %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Zły status dla użytkownika "gość", używam domyślnego';
+$lang['this email address is already in use'] = 'użytkownik już używa tego adresu email';
+$lang['Album results for'] = 'Wyniki albumu dla';
+$lang['Tag results for'] = 'Wyniki tagów dla';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Odtwórz jako slideshow';
+$lang['Pause of slideshow'] = 'Pause pokazu';
+$lang['Repeat the slideshow'] = 'Powtarzaj slideshow';
+$lang['Not repeat the slideshow'] = 'Nie powtarzaj slideshow';
+$lang['Reduce diaporama speed'] = 'Zmniejsz prędkość diaporamy';
+$lang['Accelerate diaporama speed'] = 'Zwiększ prędkość diaporamy';
+$lang['Submit'] = 'Zapisz';
+$lang['Yes'] = 'Tak';
+$lang['No'] = 'Nie';
+$lang['%d photo']='%d obraz';
+$lang['%d photos']='%d obrazów';
+$lang['%d photo is also linked to current tags'] = '%d obraz jest także podpięty do aktualnych tagów';
+$lang['%d photos are also linked to current tags'] = '%d obrazów jest także podpiętych do aktualnych tagów';
+$lang['display photos linked to this tag'] = 'Zobacz obrazy podpięte tylko do tego tagu';
+$lang['photos posted during the last %d days'] = 'obrazy wgrane przez ostatnich %d dni';
+$lang['Piwigo Help'] = 'Piwigo Pomoc';
+$lang['Rank'] = 'Ranking';
+$lang['group by letters'] = 'grupuj literami';
+$lang['letters'] = 'litery';
+$lang['show tag cloud'] = 'pokazuj tag jako chmurkę';
+$lang['cloud'] = 'chmurka';
+$lang['Are you sure?'] = 'Jesteś pewien?';
+$lang['Reset to default values'] = 'Resetuj do domyślnych wartości';
+$lang['delete all photos from your favorites'] = 'usuń wszystkie obrazy ze swoich ulubionych';
+$lang['Sent by'] = 'Wysłane przez';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookie są zablokowane lub nie wspierane przez Twoją przeglądarkę. Musisz włączyć cookies aby się zalogować.';
+$lang['Edit a comment'] = 'Edytuj komentarz';
+$lang['(!) This comment requires validation'] = '(!) Ten komentarz wymaga potwierdzenia';
+$lang['Welcome'] = 'Witaj';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Witaj w swojej galerii Piwigo!';
+$lang['... or browse your empty gallery'] = '... lub przeglądaj pustą galerię';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... lub zdezaktywuj tę wiadomość, znajdę sam sposób aby sobie poradzić';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Cześć %s, Twoja galeria Piwigo jest pusta!';
+$lang['I want to add photos'] = 'Chcę dodać zdjęcia';
+$lang['Manage this user comment: %s'] = 'Zarządzaj komentarzami tego użytkownika: %s';
+$lang['This author modified following comment:'] = 'Ten autor zmodyfikował następujący komentarz:';
+$lang['This author removed the comment with id %d'] = 'Ten autor usunął komentarz o id %d';
+$lang['Album'] = 'Album';
+$lang['Album: %s'] = 'Albumy: %s';
+$lang['html tags are not allowed in login'] = 'znaczniki html nie są dozwolone w polu login';
+$lang['%d rates'] = '%d ocen';
+$lang['Rating score'] = 'Ocena';
+$lang['Invalid username or email'] = 'Niewłaściwa nazwa użytkownika lub adres e-mail';
+$lang['Password reset is not allowed for this user'] = 'Przywracanie hasła jest dla tego użytkownika niedozwolone';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Użytkownik "%s" nie ma adresu e-mail, przywracanie hasła jest niemożliwe';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Zgłoszono prośbę o przywrócenie hasła dla następującego konta użytkownika:';
+$lang['Username "%s" on gallery %s'] = 'Użytkownik "%s" w galerii %s';
+$lang['To reset your password, visit the following address:'] = 'Aby przywrócić hasło odwiedź następującą stronę:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Jeśli wybrałeś przywracanie hasła przypadkowo zignoruj tą wiadomość (nie zostaną wprowadzone żadne zmiany).';
+$lang['Password Reset'] = 'Przywracanie hasła';
+$lang['Check your email for the confirmation link'] = 'Sprawdź skrzynkę e-mail czy otrzymałeś link potwierdzający';
+$lang['Invalid key'] = 'Nieprawidłowy klucz';
+$lang['The passwords do not match'] = 'Hasła są różne';
+$lang['Your password has been reset'] = 'Twoje hasło zostało zresetowane';
+$lang['Return to home page'] = 'Wróć do strony głównej';
+$lang['Please enter your username or email address.'] = 'Wpisz swoją nazwę użytkownika lub adres e-mail';
+$lang['You will receive a link to create a new password via email.'] = 'Link do stworzenia nowego hasła otrzymasz drogą mailową.';
+$lang['Username or email'] = 'nazwa użytkownika lub adres e-mail';
+$lang['Change my password'] = 'Zmień moje hasło';
+$lang['Enter your new password below.'] = 'Wpisz poniżej swoje nowe hasło.';
+$lang['EXIF Metadata'] = 'Metadane EXIF';
+$lang['IPTC Metadata'] = 'Metadane IPTC';
+$lang['Edit'] = 'Edytuj';
+$lang['Hello %s,'] = 'Witaj %s,';
+$lang['Send my connection settings by email'] = 'Wyślij moje dane połączenia mailem';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Zarejestrowany pomyślnie! Wkrótce dostaniesz mail z danymi do połączenia. Witamy!';
+$lang['Username modification'] = 'Zmiana nazwy użytkownika';
+$lang['Your username has been successfully changed to : %s'] = 'Twoja nazwa użytkownika została zmieniona pomyślnie na: %s';
+$lang['square'] = 'Kwadrat';
+$lang['thumb'] = 'Thumb';
+$lang['small'] = 'Mały';
+$lang['medium'] = 'Średni';
+$lang['large'] = 'Duży';
+$lang['xlarge'] = 'Bardzo duży (XL)';
+$lang['xxlarge'] = 'Bardzo bardzo duży (XXL)';
+$lang['Original'] = 'Oryginalny';
+$lang['Thank you for registering at %s!'] = 'Dziękujemy za rejestrację na %s!';
+$lang['Here are your connection settings'] = 'Dane Twojego połączenia';
+$lang['Password: %s'] = 'Hasło: %s';
+$lang['Username: %s'] = 'Nazwa użytkownika: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Jeżeli myślisz, że otrzymałeś ten mail w wyniku błędu, skontaktuj się proszę z nami tutaj %s';
+$lang['Photo sizes'] = 'Rozmiary zdjęć';
+$lang['2small'] = 'XXS - malutkie';
+$lang['Desktop'] = 'Wersja standardowa';
+$lang['Mobile'] = 'Wersja mobilna';
+$lang['Show latest comments first'] = 'Pokaż najpierw najnowsze komentarze';
+$lang['Show oldest comments first'] = 'Pokaż najpierw najstarsze komentarze';
+$lang['View in'] = 'Obejrzyj w';
+$lang['xsmall'] = 'XS - bardzo małe';
+$lang['Date created, new &rarr; old'] = 'Data utworzenia, wcześniejsze &rarr; starsze';
+$lang['Date created, old &rarr; new'] = 'Data utworzenia, starsze &rarr; wcześniejsze';
+$lang['Date posted, new &rarr; old'] = 'Data publikacji, wcześniejsze &rarr; starsze';
+$lang['Date posted, old &rarr; new'] = 'Data publikacji, starsze &rarr; wcześniejsze';
+$lang['File name, A &rarr; Z'] = 'Nazwa pliku, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nazwa pliku, Z &rarr; A';
+$lang['Manual sort order'] = 'Własna kolejność';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identyfikator, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identyfikator, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Tytuł zdjęcia, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Tytuł zdjęcia, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Ocena, wysoka &rarr; niska';
+$lang['Rating score, low &rarr; high'] = 'Ocena, niska &rarr; wysoka';
+$lang['Visits, high &rarr; low'] = 'Liczba odwiedzin, wysoka &rarr; niska';
+$lang['Visits, low &rarr; high'] = 'Liczba odwiedzin, niska &rarr; wysoka';
+?>
Index: tags/2.4.0RC3/language/pl_PL/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,118 @@
+<h2>Edycja kategorii</h2>
+
+<h3>Informacje</h3>
+
+<ul>
+
+  <li><strong>nazwa</strong>: zmień nazwę kategorii (wirtualna zmiana nazwy dla fizycznie istniejącej kategorii).</li>
+
+  <li><strong>opis</strong>: daje ogólny obraz zawartości,
+  ten tekst będzie wyświetlany pod stroną miniaturami.</li>
+
+</ul>
+
+<h3>Przenieś</h3>
+
+<p>Jeżeli dana kategoria jest wirtualna, to można ją przenieść. Przeniesienie kategorii oznacza zmianę kategorii nadrzędnej.</p>
+
+<h3>Opcje</h3>
+
+<ul>
+
+  <li><strong>Typ dostępu</strong>: Zarządzanie uprawnieniami. Jeżeli ustawisz kategorię jako prywatną, to wszystkie jej podkategorie będą prywatne. Jeżeli ustawisz kategorię jako publiczną, to wszystkie jej podkategorie będą publiczne.</li>
+
+  <li><strong>Blokada</strong>: Kategoria i podkategorie są tymczasowo zablokowane na czas prac konserwacyjnych.</li>
+
+  <li><strong>Komentarze</strong>: Zautoryzowani użytkownicy mogą dodawać komentarze do elementów kategorii.</li>
+
+  <li><strong>Autoryzuj upload</strong>: Zautoryzowani użytkownicy mogą wgrywać pliki. Ta opcja jest możliwa tylko dla kategorii fizycznej (nie wirtualnej).</li>
+
+</ul>
+
+<p>Możesz także zarządzać tymi opcjami poprzez ekran "Właściwości"
+(ekrany <span class="pwgScreen">Upload</span>, <span
+class="pwgScreen">Komentarze</span>, <span class="pwgScreen">Blokada</span>,
+<span class="pwgScreen">Publiczny/Prywatny</span>, <span
+class="pwgScreen">Reprezentacyjny</span> dostępne z <span
+class="pwgScreen">Administracja, Kategorie, Właściwości</span>).</p>
+
+<h3>Kolejnośćsortowania</h3>
+
+<p>Wybierz czy ma być sortowanie domyślne.</p>
+
+<p>Oznacza, że sortowanie będzie także dla podkategorii.</p>
+
+<p>Wybierz okreslony rodzaj sortowania dla kategorii.</p>
+<ul>
+<li><strong>Data utworzenia</strong>: Data utworzenia obrazu</li>
+<li><strong>Data wysłania</strong>: Data synchronizacji</li>
+<li><strong>Średnie oceny (*)</strong>: Średnie oceny mogą zostać zmienione przez odwiedzających</li>
+<li><strong>Najczęściej odwiedzane (*)</strong>: Aktualne odwiedziny zmieniają kolejność najczęściej odwiedzanych</li>
+<li><strong>Nazwa pliku</strong>: Nazwa nada w informacji o pliku</li>
+<li><strong>Id</strong>: Wewnętrzne Id (aktualnie wgrane elementy mają wyższe niż wgrane poprzednio).</li>
+
+</ul>
+<p><strong>(*)</strong>Przetestuj sam ponieważ opcja ma nieprzewidzialne rezultaty.</p>
+
+
+<h3>Reprezentant</h3>
+
+<p>Reprezantant kategorii to miniatura, która jest wyświetlana na stronie głównej kategorii (<span class="pwgScreen">category.php</span>) jeżeli kategoria zawiera podkategorie (w tym przypadku tylko głównej kategorii).</p>
+
+<p>Są 4 sposoby ustawienia reprezentanta kategorii :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Strona obrazy</span>: w pasku przycisków akcji,
+  jeden z nich pozwoli ustawić Ci reprezentanta danej kategorii. Przycisk ten ejst dostępny dla administratorów.</li>
+
+  <li><span class="pwgScreen">Edycja informacji o obrazie</span> w panelu administracyjnym. Ekran ten jest dostępny z poziomu <span
+  class="pwgScreen">picture.php</span> lub <span class="pwgScreen">Zarządzanie batch</span> w <em>trybie jednostkowym</em>. Aby dowiedzić się więcej zobacz pomoc dlatego ekranu.</li>
+
+  <li><span class="pwgScreen">Administracja, Kategorie, Właściwości,
+  Reprezentujący</span>. Aby dowiedzić się więcej zobacz pomoc dlatego ekranu.</li>
+
+  <li><span class="pwgScreen">Edycja kategorii</span> (ten ekran).</li>
+
+</ul>
+
+<p>Reprezentacja zależy od ustawienia parametru konfiguracyjnego
+<code>allow_random_representative</code> (zobacz <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>W trybie domyślnym (<code>allow_random_representative</code> jest ustawiony na false)
+każda kategoria zawiera jeden element ustawiony jako ją reprezentujący. Raz ustawiony (przy tworzeniu kategorii), reprezentant może zostać zmieniony tylko przez administratora. Jeżeli dany obrac nie odpowiada Ci jako reprezentujący kategorię,
+możesz wybrać <strong>Znajdź reprezentanta losowo</strong>.</p>
+
+<p>Jeżeli natomiast parametr konfiguracyjny <code>allow_random_representative</code> ma wartość true, kategoria zwierająca elementy nie może mieć ustawionego jednego reprezentanta. Wtedy wystarczy użyć przycisku <strong>Usuń reprezentanta</strong> .</p>
+
+<p>JEżeli kategoria nie zawiera żacnych elementów (a tylko podkategorie) może być wtedy reprezentowana dzięki ekranowi <span class="pwgScreen">Edytuj informacje o obrazie</span>. JEdyną dostepną opcją na aktualnym ekranie jest przycisk <strong>Usuń reprezentanta</strong> . P wybraniu przycisku nie ma już możliwości wybrania nowego reprezentanta.</p>
+
+<h3>Podpięcie wszystkich elementów kategorii do nowej kategorii</h3>
+
+<ul>
+
+<li><strong>Nazwa wirtualnej kategorii</strong>: Nazwa nowo tworzonej kategorii, 
+do której będą podpięte wszystkie elementy bieżącej kategorii.</li>
+
+<li><strong>Kategoria nadrzędna</strong>: Zostaw pole puste jeżeli kategoria ma być stworzona w głównej kategorii.</li>
+
+</ul>
+
+<h3>Podpięcie wszystkich elementów kategorii do którejś z istniejących kategorii</h3>
+
+<ul>
+
+<li><strong>Kategorie</strong>: Wybierz kategorię docelową.</li>
+
+</ul>
+
+<h3>Wyślij maila informacyjnego do wszystkich członków grupy</h3>
+
+<ul>
+
+<li><strong>Grupa</strong>: adresy grup</li>
+
+<li><strong>Treść wiadomości</strong>: Dowolny tekst do wpisania.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/pl_PL/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Przenoszenie kategorii wirtualnych</h2>
+
+<p>Tylko wirtualne kategorie mogą mieć nową kategorię nadrzędną.</p>
+
+<h3>Wirtualne kategorie do przeniesienia</h3>
+
+<p>Wybierz dowolną wirtualną kategorię, którą chcesz przenieść. 
+Jeżeli lista jest pusta, to oznacza, że żadnej nie stworzyłeś.</p>
+
+<h3>Nowa kategoria nadrzędna</h3>
+
+<p>Wybierz nową kategorię nadrzędną (wirtualną lub fizyczną). 
+Jeżeli nie wybierzesz żadnej wirtualnej kategorie zostaną przeniesione do głównej kategorii nadrzędnej.
+Nie można przenieść kategorii do własnej podkategorii.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/cat_options.html	(revision 14585)
@@ -0,0 +1,27 @@
+<h2>Opcje kategorii</h2>
+
+<p>Ekran umożliwia administratorowi zmianę opcji dla wielu kategorii jednocześnie.</p>
+
+<dl>
+
+  <dt>Upload</dt>
+  <dd>Umożliwia odwiedzającym wgrywanie plików do kategorii. Wyświetlone są tylko kategorie nie będące wirtualnymi</dd>
+
+  <dt>Komentarze</dt>
+  <dd>Zezwala użytkownikom na dodawanie komentarzy w wybranych kategoriach.
+Wybiera kategorie, które mają już tę opcję włączoną. Obraz może być komentowany wtedy jeżeli kategoria ma tę opcję włączoną.</dd>
+
+  <dt>Zablokuj</dt>
+  <dd>Umożliwia zablokowanie wybranych kategorii np. w ramach prac prowadzonych nad daną kategorią. 
+  Jeżeli zablokujesz kategorię, zablokowane również zostaną wszystkie jej podkategorie. Podobnie jeżeli odblokujesz kategorię, wszystkie jej podkategorie zostaną odblokowane.</dd>
+
+  <dt>Publiczne / Prywatne</dt>
+  <dd>Zarządza autoryzacją wo wybranych kategorii. Wybrane kategorie są prywatne : aby użytkownicy mieli dostęp do tych kategorii, będzie trzeba przyznać uprawnienia do tych kategorii grupom/użytkownikom. Jeżeli ustawisz daną kategorię jako prywatną, wtedy wszystkie jej podkategorie także będą prywatne. Analogicznie, jeżeli ustawisz daną kategorią jako publiczną, wszystkie jej podkategorie będą publiczne</dd>
+
+  <dt>Reprezentant</dt>
+  <dd>Opcja jest dostępna tylko wtedy jeżeli masz skonfigurowany parametr
+  <code>allow_random_representative</code> (zobacz <span
+  class="filename">include/config_defaults.inc.php</span>) na
+  <em>true</em>. Każda kategoria może mieć reprezentanta losowego lub ustawionego (unikalny obraz).</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/pl_PL/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Zarządzanie uprawnieniami dla kategorii</h2>
+
+<p>Ekran ten jest dostępny tylko dla kategorii prywatnych. Możesz tutaj wybrać grupy oraz użytkowników, którzy będą posiadali dostęp do danej kategorii.</p>
+
+<h3>Grupy</h3>
+
+<p>Dla bieżącej kategorii możesz przyznać uprawnienia lub zabronić dostępu. Modyfikując grupy, zmodyfikujesz użytkowników, którzy dzięki przynależności do tych grup mają lub nie dostęp do danej kategorii.</p>
+
+<h3>Użytkownicy</h3>
+
+<p>Możesz także przyznać uprawnienia lub zabronić dostępu. Użytkownicy posiadający dostęp dzięki przynależności do grupy, mogą w tym miejscu mieć ten dostęp odebrany.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/configuration.html	(revision 14585)
@@ -0,0 +1,109 @@
+<h2>Konfiguracja</h2>
+
+<p>Ekran umożliwia administratorom podstawową administrację. Pomimo małej ilości parametrów konfiguracyjnych, powinna ona być wystarczająca dla większości administratorów. Jeżeli chciałbyś zmienić więcej parametrów zajrzyj do pliku <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Ekran jest podzielony na sekcje grupujące parametry tematycznie.</p>
+
+
+<h3>Główna</h3>
+<ul>
+  <li><strong>Tytuł galerii</strong>: używany w RSS oraz powiadomieniach mailowych.</li>
+
+  <li><strong>Baner strony</strong>: wyświetlany na górze każdej strony.</li>
+
+  <li><strong>Adres URL galerii</strong>: wykorzystywany w RSS.</li>
+
+  <li><strong>Blokada galerii</strong>: Blokuje całą galerię do celów serwisowych. Tylko użytkownicy posiadający uprawnienia administracyjne będą mogli korzystać z galerii.</li>
+
+  <li><strong>Oceny</strong>: Włączone oceny obrazów.</li>
+
+  <li><strong>Oceny przez gości</strong>: Opcja umożliwiająca oceny obrazów także przez niezalogowanych użytkowników.</li>
+
+  <li><strong>Zezwól na rejestrację użytkowników</strong>: Pozwala na rejestrację użytkowników w galerii.</li>
+
+  <li><strong>Adres email jest obowiązkowy dla wszystkich użytkowników</strong>: Adres email będzie sprawdzany podczas rejestracji lub podczas aktualizacji profilu (jeżeli akcja jest wykonywana przez administratora).</li>
+
+  <li><strong>Wyślij wiadomość do administratora gdy zarejestruje się nowy użytkownik </strong>: Administrator będzie powiadamiany o każdej rejestracji nowego użytkownika.</li>
+
+</ul>
+
+<h3>Historia</h3>
+
+  <p>Odwiedziny na stronach <span
+  class="pwgScreen">category.php</span> i <span
+  class="pwgScreen">picture.php</span> będą zapisane w tabeli
+  <code>historia</code> .</p>
+  
+  <p>Odwiedziny będą wyświetlane w <span
+  class="pwgScreen">Administracja, Specjalne, Historia</span>.</p>
+
+<ul>
+  <li><strong>Zapisuj odwiedziny strony przez  gości</strong>: zapisywane będą odwiedziny niezalogowanych użytkowników.</li>
+
+  <li><strong>Zapisuj odwiedziny strony przez  użytkowników</strong>: zapisywane będą odwiedziny zarejestrowanych użytkowników.</li>
+
+  <li><strong>Zapisuj odwiedziny strony przez administratorów</strong>: zapisywane będą odwiedziny administratorów.</li>
+
+</ul>
+
+<h3>Komentarze</h3>
+<ul>
+
+  <li><strong>Komentarze dla wszystkich</strong>: umożliwia dodawanie komentarzy przez niezarejestrowanych użytkowników.</li>
+
+  <li><strong>Liczba komentarzy na stronę</strong>.</li>
+
+  <li><strong>Zatwierdzanie</strong>: administrator zatwierdza komentarze pojawiające się w galerii. Zatwierdzanie komentarzy jest możliwe z  <span class="pwgScreen">Administracja, Obrazy,
+  Komentarze</span>.</li>
+
+  <li><strong>Wyślij wiadomość do administratora gdy zostanie wprowadzony poprawny komentarz</strong>:
+Wysyła wiadomość do administratora w przypadku dodania komentarza i gdy ten komentarz zostanie zatwierdzony.</li>
+
+  <li><strong>Wyślij wiadomość do administratora gdy komentarz wymaga weryfikacji</strong>:
+Wysyła wiadomość do administratora w przypadku dodania komentarza, który wymaga zatwierdzenia przez administratora.
+Zatwierdzanie komentarzy jest możliwe z  <span class="pwgScreen">Administracja, Obrazy, Komentarze</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>Upload</h3>
+<ul>
+<!--TODO -->  <li><strong>Zawsze pokazuj link upload</strong>: Jeżeli istnieją kategorie mające włączoną opcję wgrywania plików, odpowiedni link będzie widoczny przy każdej kategorii.</li>
+<!--TODO -->  <li><strong>Poziom uprawnień użytkowników dla upload'u</strong>: Pozwala na zabronienie użytkownikom wgrywania plików</li>
+  <li><strong>Wyślij wiadomość do administratora gdy został wgrany nowy obraz</strong>: Administrator otrzyma wiadomość o każdym wgranym pliku.</li>
+</ul>
+
+<h3>Wyświetlanie domyślne</h3>
+
+<p>W tym miejscu można zmienić domyślne wyświetlanie, dla użytkownika gość (niezalogowanego). Po zalogowaniu opcje są nadpisywane przez preferencje użytkownika(edycja w <span class="pwgScreen">profil</span>).</p>
+
+<p>Możliwa jest zmiana dla wszystkich użytkowników, natomiast opcja ta jest dostępna z poziomu <span class="pwgScreen">Administracja,
+Uprawnienia, Użytkownicy</span>, gdzie opcje można zmienić dla wybranych użytkowników.</p>
+
+<ul>
+
+  <li><strong>Język</strong>: dotyczy tylko labelek Piwigo. Nazwy kategorii, obrazów oraz wszystkie opisy nie podlegają tłumaczeniu.</li>
+
+  <li><strong>Liczba obrazów w wierszu</strong></li>
+
+  <li><strong>Liczba wierszy na stronę</strong></li>
+
+  <li><strong>Interfejs użytkownika</strong></li>
+
+  <li><strong>Aktualny okres</strong>: W dniach. Okres oznaczający, że elementy są wyświetlane jako nowe. Musi być większe od 1 dnia.</li>
+
+  <li><strong>Rozwiń wszystkie kategorie</strong>: Rozwija wszystkie kategorie w menu <em>Ostrzeżenie</em>: opcja ta wymaga dużo zasobów i może wygenerować bardzo duże menu jeżeli liczba kategorii jest duża..</li>
+
+  <li><strong>Pokazuj liczbę komentarzy</strong>: wyświetla liczbę komentarzy na stronie z miniaturami. Wymaga dużych zasobów.</li>
+
+  <li><strong>Pokazuj liczbę wejść</strong>: wyświetla liczbę wyświetleń danego obrazu na stronie z miniaturami. 
+  Tylko gdy zaawansowany parametr jest ustawiony na: <br />
+  $conf['show_nb_hits'] = true; <br />
+  Notka: domyślne ustawienie to false.</li>
+
+  <li><strong>Maksymalna szerokość obrazu</strong>: maksymalna wyświetlana szerokość. Jeżeli obraz jest większy, to wtedy zostanie pomniejszony (do wyświetlenia). Jeżeli chcesz zaznaczyć tę opcję, lepiej jest rozważyć zmianę rozmiarów obrazów.</li>
+
+  <li><strong>Maksymalna wysokość obrazu</strong>: jak wyżej (ale odnośnie szerokości).</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/pl_PL/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,87 @@
+<h2>Rozszerzenie dla konfiguracji szablonów</h2>
+
+<h3>Cel</h3>
+<p>Definiuje warunki zamiany szablonu z template-extension
+(szablon zwany "zamiennikiem").</p>
+
+<p>"Oryginalny szablon" z ./template/yoga (lub inny niż yoga)
+ będzie zamieniony przez "zamiennik" jeżeli zamiennik jest podpięty do "szablonu oryginalnego"
+ (lub opcjonalnie, jeżeli żądany adres URL zawiera "opcjonalne słowo klucz dla URL").</p>
+
+<p>"Opcjonalne słowa klucze dla URL" mogą zostać odnalezione w module URLs.</p>
+
+<p>"Opcjonalne słowa klucze dla URL" może być także "linkiem permanentnym" 
+(zobacz opis linków permanentnych w naszej dokumentacji).</p>
+
+<p>Czytaj: `<a href="#warnings">Ostrzeżenie</a>` warunki użycia.</p>
+
+<h3>Czym są rozszerzenia szablonów?</h3>
+
+<p>Narzędzie konfiguracyjne zarówno dla użytkowników początkujących jak i zaawansowanych.
+Webmaster może powielić wiele dostarczanych plików (.tpl) szablonów ("szablony oryginalne") przez FTP do folderu template-extensions nadając im inne nazwy.
+ 
+ "Szablony oryginalne", aktualnie szablony oryginalne są wspierane dla:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> i/lub <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> i/lub <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> i/lub <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> i/lub <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> i/lub <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> i/lub <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> i/lub <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Gdzie mogę znaleźć  "szablony oryginalne"?</h3>
+
+<p>Szablony oryginalne znajdują się w katalogu template/yoga/ 
+(nie należy ich edytować z powodów aktualizacji). Z "szablonów oryginalnych", 
+dowolny administrator może stworzyć ich "zamienniki (spersonalizowane szablony)".</p>
+
+<h3>Gdzie należy zapisać "zamienniki"?</h3>
+
+<p><strong>Zamienniki (szablony spersonalizowane)</strong> muszą być umieszczone w katalogu template-exension (lub jego podkatalogach).
+Nazwy plików zamienników mogą mieć dowolne nazwy oraz rozszerzenie .tpl. Na przykład: <span
+class="filename">template-extension/moje-rozszerzenia/wideo.tpl</span>.</p>
+
+
+<h3>Jak mogę aktywować "zamienniki"?</h3>
+<p>Aby aktywować powiązane zamienniki<strong>szablon oryginalny</strong> powinien być przypisany do każdego
+ <strong>zamiennika (szablonu spersonalizowanego)</strong>.
+ Do tego służy funkcja "Rozszerz szablony" w menu Konfiguracja/Administracja.</p>
+
+<p>Jeżeli zostanie wybrane <strong>opcjonalne słowo klucz dla adresu URL</strong> zamienniki będą funkcjonować tylko dla stron zawierających te słowa. Na przykład: <span
+  class="pwgScreen">index.php?/<strong>najczęściej_odwiedzane</strong></span></p>
+  
+<p>Zaawansowani użytkownicy mogą używać linków permanentnych jako <strong>opcjonalnego słowa klucz dla adresu URL</strong>. </p>
+<h3>Jak mogę deaktywować "zamienniki"?</h3>
+<ul>
+<li>Odznacz powiązane "Szablony oryginalne".</li>
+<li>Usuń "zamienniki" przez FTP.</li>
+</ul>
+<a name="warnings"></a>
+<h3>Ostrzeżenia</h3>
+<ul>
+
+  <li><strong>Szablon oryginalny</strong> musi być "oryginalnym" szablonem, w przeciwnym przypadku mogą wystąpić nieprzewidziane problemy!</li>
+
+  <li>Dla wielu <strong>zamienników (szablonów spersonalizowanych)</strong> z takim samym<strong>Szablonem oryginalnym</strong> i takim samym <strong>kluczowym słowem dla adresu URL</strong> aktywny jest tylko ostatni zamiennik.</li>
+
+  <li>Odznaczenie <strong>opcjonalnego słowa klucz dla adresu URL</strong> aktywuje zamiennik dla dowolnego użycia szablonu. Jak już wspomniano wcześniej, kolejność może nadpisać poprzednio wybrane zamienniki.</li>
+
+  <li>Podkatalogi:
+Podkatalogi są ignorowane, ale są przydatne aby zmienić kolejność.<br />
+distributed-samples: rozpowszechniane dla celów testowych! 
+<strong>Nie edytuj ich</strong>, ale stwórz własne.
+</li>
+
+  <li>Po usunięciu zamiennika natychmiastowo jest aktywowany <strong>Szablon oryginalny</strong>.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/pl_PL/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Lista grup</h2>
+
+<p>To jest miejsce, w którym możesz zarządzać zdefiniowanymi grupami.</p>
+
+<h3>Dodaj grupę</h3>
+
+<p>Grupy może dodawać administrator.</p>
+
+<h3>Lista grup</h3>
+
+<p>Lista dla każdego elementu umożliwia:</p>
+
+
+<ul>
+  <li>przejście do listy członków</li>
+  <li>przejście do uprawnień</li>
+  <li>usunięcie grupy (wymaga zaznaczenia potwierdzającego checkbox'a)</li>
+  <li>zmiana statusu "default" (wymaga zaznaczenia potwierdzającego checkbox'a)</li>
+</ul>
+
+<h3>Grupy domyślne</h3>
+<p>Grupy domyślne są grupami przypisywanymi do nowych użytkowników.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>Wiele możliwości dodania zdjęć do Twojej galerii:</p>
+
+<ul>
+  <li><strong>Wgranie bezpośrednie</strong> z poziomu przeglądarki jest najprostszym i szybkim sposobem. Zależy od możliwości Twojej przeglądarki oraz serwera. W przypadku problemów z dużą ilością zdjęć, możesz skorzystać z wgrywania innym sposobem!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Przejdź do Bezpośredniego Wgrywania </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> jest aplikacją zainstalowaną na Twoim komputerze. Przeciągnij &amp; upuść zdjęcia w oknie pLoader, kliknij <em>"Wgraj do Piwigo"</em> i pozwól pLoader'owi wykonać swoją pracę. Możesz także znaleźć inne aplikacje takie jak <strong>WinToPiwigo</strong> lub plugin eksportu do Piwigo <strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Przejdź do pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>Transfer FTP</strong> jest najbardziej rekomendowanym sposobem dodawania bardzo dużej ilości zdjęć przy pomocy niewielu kliknięć. Skorzystaj z przewodnika aby przygotować swoje zdjęcia. Metoda FTP umożliwia Ci bardzo dokładną kontrolę nad umiejscowieniem plików zdjęć na serwerze.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Przejdź do FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/pl_PL/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/help_groups.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Grupy są dobrym sposobem do zarządzania uprawnieniami dla określonej listy użytkowników.</p>
+
+<p>Możesz tworzyć grupy w <span class="pwgScreen">Administracja &raquo; Użytkownicy &raquo; Grupy</span> i przypisywać użytkowników do tych grup w <span class="pwgScreen">Administracja &raquo; Użytkownicy &raquo; Zarządzaj</span>.</p>
+
+<p>Użytkownik może należeć do wielu grup. Przyznanie dostępu jest ważniejsze niż zabronienie : jeżeli użytkownik "jack" należy do grup "family" i "friends", i tylko grupa "family" może oglądać kategorię "Christmas 2003", "jack" będzie mógł oglądać kategorię "Christmas 2003".</p>
Index: tags/2.4.0RC3/language/pl_PL/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Jak tylko utworzysz galerię, możesz dostosować ją dla odwiedzających
+<ul>
+    <li>Domyślne wyswietlanie w zakładce <span class="pwgScreen">Administracja &raquo; Konfiguracja &raquo; Opcje</span> <span class="pwgScreen">Ustawienia dla gości</span></li>
+    <li>Domyślny temat w <span class="pwgScreen">Administracja &raquo; Konfiguracja &raquo; Tematy</span></li>
+    <li>Domyślny język w <span class="pwgScreen">Administracja &raquo; Konfiguracja &raquo; Języki</span></li>
+</ul>
+Domyślnie, każdy nowy użytkownik otrzyma te ustawienia po rejestracji.
+</p>
+<p>Jeżeli masz pytania, społeczność Piwigo zaprasza Cię na swoje <a href="http://pl.piwigo.org/forum">forum</a>.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,47 @@
+<fieldset>
+<legend>Uprawnienia dla zdjęć</legend>
+
+<p>Każde zdjęcie posiada <strong>poziom prywatności</strong> (blokadę). Każdy użytkownik także posiada poziom prywatności (klucz). Jest 5 poziomów prywatności:</p>
+<ol>
+  <li>Brak</li>
+  <li><em>Kontakty</em></li>
+  <li><em>Przyjaciele (który jest wyższy niż Kontakty)</em></li>
+  <li><em>Rodzina (który jest wyższy niż Przyjaciele)</em></li>
+  <li><em>Administratorzy (który jest wyższy niż każdy inny poziom)</em></li>
+</ol>
+
+<p>Wyższe poziomy posiadają uprawnienia do niższych poziomów. Jeżeli dany użytkownik posiada wyższy poziom prywatności, to może oglądać więcej zdjęć.</p>
+
+<p>Na przykład jeżeli zdjęcie "peter_wedding-0024.jpg" posiada poziom prywatności <em>"Rodzina"</em>, to:</p>
+<ul>
+  <li>Piotr (który posiada poziom <em>"Administratorem"</em>) będzie widział zdjęcie ponieważ <em>"Administratorzy"</em> mogą oglądać wszystkie zdjęcia</li>
+  <li>Beata (która posiada poziom <em>"Rodzina"</em>) także będzie widzieć zdjęcie</li>
+  <li>Maria (która posiada poziom tylko <em>"Przyjaciel"</em>) nie będzie widziała zdjęcia</li>
+</ul>
+
+<p>Użytkownik, który nie posiada uprawnień do oglądania zawartości danej kategorii, nie będzie widział nawet tej kategorii. Ta sama zasada dotyczy tagów.</p>
+
+<p>Możesz ustawić poziom prywatności dla użytkownika w: <span class="pwgScreen">Administracja&raquo; Użytkownicy &raquo; Zarządzaj</span> .</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Uprawnienia na kategoriach</legend>
+
+<p>Jeżeli poziomy prywatności nie bardzo pasują do Twoich potrzeb, możesz także zarządzać uprawnieniami na kategoriach dla użytkowników oraz grup. W tym samym czasie możesz zarządzać uprawnieniami dla zdjęć oraz kategorii, nie powodując konfliktów.</p>
+
+<p>Do poszczególnych kategorii można zabronić dostępu. Kategorie mogą być "publiczne" lub
+"prywatne". Uprawnienia (dla grup i użytkowników) mogą być ustawione tylko dla kategorii "prywatnych".</p>
+
+<li>Możesz ustawić kategorię jako "prywatna" dla pojedynczej kategorii (<span
+class="pwgScreen">Administracja &raquo; Kategorie &raquo; Zarządzaj &raquo; edycja</span>) lub przez ustawienie opcji dla całego drzewa (<span class="pwgScreen">Administracja &raquo; Kategorie &raquo; Właściwości &raquo; Publiczna / Prywatna</span>).</p>
+
+<p>Po ustawieniu kategorii jako prywatna, możesz zarządzać uprawnieniami dla grup i użytkowników przy pomocy następujących 3 ekranów :</p>
+
+<ul>
+  <li><span class="pwgScreen">Administracja &raquo; Użytkownicy &raquo; Zarządzaj &raquo; akcja uprawnienia</span> (jeden link per użytkownik)</li>
+  <li><span class="pwgScreen">Administracja &raquo; Użytkownicy &raquo; Grupy &raquo; akcja uprawnienia</span> (jeden link per grupa)</li>
+  <li><span class="pwgScreen">Administracja &raquo; Kategorie &raquo; Zarządzaj &raquo; akcja edycja uprawnień kategorii</span> (jeden link per kategoria)</li>
+</ul>
+
+</fieldset>
Index: tags/2.4.0RC3/language/pl_PL/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Zdjęcia są wyświetlane w kategoriach odpowiadających katalogom, w których dane pliki się znajdują.</p>
+
+<p>Możesz także wyświetlać zdjęcia w wielu kategoriach bez duplikowania plików na serwerze www. By podlinkować link do kategorii, wystarczy utworzyć powiązanie na stronie edycji zdjęcia (do której ma dostęp każdy administrator ze strony danego zdjęcia w galerii).</p>
+
+<p>Kategorie wirtualne bazują na następującym założeniu : nie mają odpowiadających katalogów. Kategorię wirtualną możesz stworzyć w <span class="pwgScreen">Administracja &raquo; Kategorie &raquo; Zarządzaj</span>.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/history.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/history.html	(revision 14585)
@@ -0,0 +1,38 @@
+<h2>Historia</h2>
+
+<p>Ekran umożliwia śledzenie historii odwiedzin stron galerii Piwigo w nawiązaniu do wybranych opcji w Administracja, Ogólne, Historia.</p>
+	
+<h3>Statystyki</h3>
+<ul>
+  <p>Jeżeli wybrałeś opcję zapisywania odwiedzin stron(<span
+class="pwgScreen">index.php</span> i <span
+class="pwgScreen">picture.php</span>) w tabeli <code>historii. </code>
+Index pozwala na prześledzenie odwiedzonych stron.</p>
+	
+	<li><strong>Statystyki ogólne</strong> : wizualizacja roczna. </li>
+	
+	<li><strong>Statystyki roczne</strong> : wizualizacja miesięczna dla wybranego roku.</li>
+	
+	<li><strong>Statystyki miesięczne</strong> : wizualizacja dzienna dla wybranego miesiąca.</li>
+	
+	<li><strong>Statystyki dzienne</strong> :wizualizacja dzienna dla wybranego dnia.</li>
+	
+</ul>
+
+<h3>Wyszukiwanie</h3>
+<ul>
+  <p>Jeżeli wybrałeś opcję zapisywania odwiedzin stron (<span
+class="pwgScreen">index.php</span> i <span
+class="pwgScreen">picture.php</span>) w tabeli <code>historii. </code>
+Index pozwala na prześledzenie odwiedzonych stron z wykorzystaniem różnych filtrów.</p>
+ 
+	<li><strong>Filtrowanie po dacie</strong> : wybierz interwał dat, które Cię interesują.</li>
+	
+	<li><strong>Filtrowanie po typie elementu</strong> : wybierz typ elementu, którego statystyki chcesz zobaczyć.</li>
+	
+	<li><strong>Filtrowanie po użytkowniku</strong> : wybierz użytkownika, którego statystyki chcesz zobaczyć.</li>
+	
+	<li><strong>Filtrowanie po nazwie pliku</strong> : wybierz nazwę pliku, dla którego chcesz zobaczyć statystyki.</li>
+	
+	<li><strong>Filtrowanie po identyfikacyjnym obrazie</strong> : wybierz identyfikacyjny obraz, dla którego statystyki chcesz zobaczyć.</li>
+</ul>
Index: tags/2.4.0RC3/language/pl_PL/help/index.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/pl_PL/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/maintenance.html	(revision 14585)
@@ -0,0 +1,47 @@
+<h2>Maintenance</h2>
+
+<p>W celu optymalizacji czasu generowania strony Piwigo wykorzystuje informacje umieszczone w cache'u. Dla przykładu zamiast przeliczać za każdym razem liczbę elementów w kategorii, informacja ta jest zapisana w bazie danych. Teoretycznie informacja ta powinna być zawsze prawdziwa, ale czasami występują błędy i informacja wyświetlana jest niepoprawna.</p>
+
+<p>Niektóre informacje stają się wtedy bezużyteczne. Usuwanie tych bezużytecznych informacji pozwala zaoszczędzić przestrzeń na dysku.</p>
+
+<ul>
+
+  <li>
+    <strong>Nie powiązane elementy:</strong>
+    Wyświetla obrazy, które nie są powiązane z żadną wirtualną kategorią.
+  </li>
+  <li>
+    <strong>Pliki o tej samej nazwie w jednej lub wielu kategoriach:</strong>
+    Wyświetla obrazy lub pliki o tej samej nazwie znalezione w jednej lub wielu kategoriach.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Aktualizuj informacje o kategoriach:</strong> Informacje dla każdej kategorii : lista kategorii nadrzędnych, liczba obrazów, data dodania ostatniego obrazu, pozycja względem sąsiednich kategorii, pozycja względem wszystkich kategorii. Akcja ta sprawdza także istnienie reprezentanta dla kategorii.</li>
+
+  <li><strong>Aktualizuj informacje o obrazach:</strong> Dla każdego obrazu są to informacje : pełna ścieżka do pliku, średnie oceny. <em>Ostrzeżenie</em>: nie należy mylić tych informacji z metadanymi, które są dostępne z poziomu <span class="pwgScreen">Administracja,
+  Kategorie, Synchronizacja</span> lub dostępne z poziomu ekranu edycji dla każdego elementu (np. przez <span class="pwgScreen">Obraz</span>  ).</li>
+
+  <li><strong>Napraw i optymalizuj bazę danych:</strong>
+  Dla każdej tabeli może być wykonana, re-organizacja, naprawa i optymalizacja.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>Usuń szczegóły historii:</strong> Usuwa wszystkie linie z tabeli
+  <code>historii</code> . Ekran <span class="pwgScreen">Administracja,
+  Specjalne, Historia</span> nie będzie wyświetlał żadnej historii. <em>Ostrzeżenie</em>: wszystkie dane zostaną utracone bez możliwości ich odzyskania.</li>
+
+  <li><strong>Usuń podsumowanie historii:</strong> Usuwa informacje podsumowujące liczbę odwiedzin historii. Podsumowanie to jest wyliczane na podstawie szczegółowych informacji zawartych w historii.</li>
+
+  <li><strong>Wyczyść sesje:</strong> Usuwa wygaśnięte sesje użytkowników.</li>
+
+  <li><strong>Wyczyść nigdy nie używane RSS feed</strong></li>
+  
+  <li><strong>Purge search history</strong></li>
+  
+  <li><strong>Usuń skompilowane szablony</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/pl_PL/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Powiadamianie mailowe</h2>
+
+<p>Ekran umożliwia konfigurację oraz zarządzanie powiadomieniami użytkowników o nowościach na stronie.</p>
+
+<p>Ekran składa się z 3 zakładek:</p>
+
+<h3>Parametry</h3>
+<p>Dostępna tylko dla webmaster'a, umożliwia zmianę parametrów powiadomień mailowych.</p>
+
+<h3>Zapisy</h3>
+<p>Dostępna tylko dla webmaster'a, umożliwia zapisywanie/wypisywanie użytkowników z powiadomień.</p>
+
+<h3>Wyślij</h3>
+<p>Dostępna tylko dla webmaster'ów i administratorów, umożliwia wysłanie wiadomości do użytkowników.</p>
+
Index: tags/2.4.0RC3/language/pl_PL/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>Linki permanentne</h2>
+
+<p>Linki permanentne są wykorzystywane po to, aby adres URL danej kategorii był łatwiejszy do zapamiętania i ładniej wyglądał. Jeżeli kategoria posiada taki link, nie jest już potrzebne zapamiętywanie jej ID.</p>
+
+<p>Podczas usuwania linku, istnieje możliwość zapisania go w historii, po to, żeby w dalszym ciągu działały adresy zewnętrzne. W historii linków permanentnych można zobaczyć kiedy dany link został usunięty jak również czas kiedy był ostatnio używany oraz liczbę jego użyć.</p>
+
+<p>Link permanentny musi być unikalny w obrębie kategorii. Również w historii linków permanentnych dana nazwa może być użyta tylko raz.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,103 @@
+<fieldset>
+  <legend>Szybki start</legend>
+
+<ol>
+  <li>Utwórz katalog lokalny na swoim komputerze.</li>
+
+  <li>Skopiuj zdjęcia do tego katalogu (zmień ich rozmiar na potrzeby galerii). <em>Uwaga</em>: nazwy katalogów oraz plików mogą zawierać tylko litery, cyfry oraz znaki "-", "_" lub ".". Ne mogą zawierać znaku spacji lub akcentowania.</li></li>
+
+  <li>Za pomocą klienta FTP skopiuj katalog katalogu "galleries".</li>
+
+ <li>Zaloguj się do galerii i przejdź do <span class="pwgScreen">Administracja &raquo; Obrazy &raquo; Miniatury</span> aby stworzyć brakujące miniatury.</li>
+
+  <li>Przejdź do <span class="pwgScreen">Administracja</span> i wybierz duży przycisk Synchronizacja.</li>
+  
+</ol>
+Gratulacje! Stworzyłeś pierwszą kategorię w swojej galerii.
+
+</fieldset>
+<fieldset>
+  <legend>Struktura katalogów i plików</legend>
+<ul>
+
+  <li>
+
+    <p>W Piwigo katalogi kategorii znajdują się wewnątrz katalogu
+    "galleries". Poniżej można zobaczyć drzewo niewielkiej galerii (ale wykorzystującej wiele funkcji) :</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>Każdy podkatalog w katalogu "galleries" tworzy kategorię. Nie ma limitu na poziomy zagłębień katalogów.</li>
+
+  <li>Ogólnie element jest reprezentowany przez plik. Plik może być elementem Piwigo jeżeli
+  jego rozszerzenie jest zawarte w parametrze <code>file_ext</code> (plik <span
+  class="filename">include/config_default.inc.php</span>). Plik może być obrazem jeżeli jego rozszerzenie jest zawarte w parametrze<code>picture_ext</code>
+.</li>
+
+  <li>Obrazy muszą mieć powiązane z nimi miniatury (patrze sekcja miniatury poniżej)</li>
+
+  <li>Obrazy mogą mieć odpowiadające im pliki wysokiej rozdzielczości. Jak np
+  dla zdjęcia wedding.jpg w przykładzie powyżej. Dla obrazów wysokiej jakości nie jest wymagany żaden prefix.</li>
+
+  <li>Elementy nie będące obrazami (video, dźwięki, pliki tekstowe, cokolwiek zechcesz...) są domyślnie reprezentowane jako ikona powiązana z danym plikiem. Opcjonalnie możesz powiązać miniaturę i plik reprezentujący (zobacz video.avi w przykładzie powyżej).</li>
+
+  <li><em>Ostrzeżenie</em> : nazwy plików oraz katalogów muszą składać się wyłącznie z
+liter cyfr, znaków "-", "_" lub ".". Nie mogą zawierać spacji oraz pozostałych znaków.</li>
+
+  <li>Po umieszczeniu plików, miniatur oraz reprezentantów, przejdź do : <span class="pwgScreen">Administracja &raquo; Kategorie &raquo;
+  Synchronizacja</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Miniatury</legend>
+<ul>
+
+  <li>Tak jak wspomniano wcześniej każdy element typu obraz musi posiadać swoją miniaturę.</li>
+
+  <li>Miniatury są zapisywane w podkatalogu "thumbnail" danej kategorii. Miniatura jest obrazem o takiej samej nazwie pliku jak jak dany obraz i posiada prefix <em>TN-</em>.</li>
+
+  <li><em>Rada</em>: do tworzenia miniatur używaj zewnętrznego modułu.</li>
+
+  <li>Do tworzenia miniatur możesz także wykorzystać stronę do ich tworzenia <span
+  class="pwgScreen">Administracja &raquo; Obrazy &raquo; Miniatury</span> , natomiast nie jest to zalecane, ze względu na to, że jakość miniatur może być kiepska oraz jest wysokie wykorzystanie procesora.</li>
+
+  <li>Musisz dać prawa zapisu na katalogach i podkatalogach kategorii</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/pl_PL/help/search.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Wyszukiwanie</h2>
+
+<p>Funkcja umożliwia wyszukiwanie obrazów w całej galerii.</p>
+
+<dl>
+
+  <dt>Wyszukiwanie słów</dt>
+  <dd>Szuka danego słowa we wszystkich atrybutach obrazów umieszczonych w galerii. Użyj znaku * aby wyszukać obrazy, do których słowo częściowo pasuje (np. wycieczk*).</dd>
+
+  <dt>Wyszukiwanie autora</dt>
+  <dd>Użyj znaku * aby wyszukać słowo które częściowo pasuje (np. jac*).</dd>
+
+  <dt>Wyszukiwanie po dacie</dt>
+  <dd>Wybierz datę i/lub datę końcową dla wyszukiwania. Zostaw datę pustą jeżeli chcesz wyszukać obrazy "sprzed" danej daty. Rok musi być wpisany w ostatnim polu w formacie : 0000 (np. 2004)</dd>
+
+  <dt>Wyszukiwanie w kategoriach</dt>
+  <dd>Wybierz kategorię lub kategorie, w których chcesz wyszukiwać. Dla przyśpieszenia wyszukiwania w podkategoriach, można zaznaczyć główną kategorię oraz opcję szukania w podkategoriach.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/pl_PL/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/site_manager.html	(revision 14585)
@@ -0,0 +1,41 @@
+<h2>Zdalne strony</h2>
+
+<p>Piwigo oferuje możliwość wykorzystania wielu serwerów do przechowywania zawartości galerii. Może to być przydatne gdy na serwerze masz mało miejsca lub posiadasz dużo obrazów.</p>
+
+<ol>
+
+  <li>edytuj następujące parametry w pliku <span class="filename">tools/create_listing_file.php</span>,
+  <code>$conf['prefix_thumbnail']</code> lub
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>umieść przy pomocy ftp zmodyfikowany plik <span class="filename">tools/create_listing_file.php</span>
+  na zdalnym serwerze, w tym samym katalogu co katalog kategorii (tak jak katalog <span class="filename">galleries</span> . Dla przykładu może to być <span
+  class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>przejdź do <span class="pwgScreen">panelu administracyjnego, Kategorie, Menadżer strony</span>. Stwórz nową stronę np. <span
+  class="filename">http://example.com/galleries</span>.</li>
+
+  <li>zostanie stworzona nowa zdalna strona. Możesz na niej wykonać 4 akcje :
+
+    <ol>
+
+      <li><strong>generuj listę</strong> : uruchamia zdalnie żądanie generacji listy plików</li>
+
+      <li><strong>synchronizuj</strong> : odczytuje zdalny plik <span
+      class="filename">listing.xml</span> i synchronizuje informacje z bazą danych.</li>
+
+      <li><strong>wyczyść</strong> : usuwa zdalny plik <span
+      class="filename">listing.xml</span> .</li>
+
+      <li><strong>usuń</strong> : usuwa zdalną stronę (oraz wszystkie z nią powiązane kategorie i elementy) z bazy danych.</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>You can do all this by hand by generating yourself the <span
+class="filename">listing.xml</span> file, moving it from your distant server
+to you local Piwigo root directory and opening the remote site
+management screen : Piwigo will propose you to use the found
+listing.xml file.</p>-->
+
Index: tags/2.4.0RC3/language/pl_PL/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/synchronize.html	(revision 14585)
@@ -0,0 +1,8 @@
+<h2>Synchronizuj</h2>
+
+<p>Możliwe są 2 sposoby synchronizacji : katalogi/pliki oraz metadane plików. Tryb katalogi/pliki służy do synchronizacji struktury katalogów oraz plików kategorii z bazą danych. Tryb metadane plików aktualizuje informacje o elementach takie jak rozmiar pliku, rozmiar w pixelach, EXIF czy IPTC.</p>
+
+<p>Najpierw musi zostać wykonana synchronizacja katalogi/pliki.</p>
+
+<p>Proces synchronizacji może trwać długo (zależny jest np od obciążenia serwera oraz ilości elementów, które mają zostać zsynchronizowane) dlatego możliwa jest synchronizacja krok po kroku:
+kategoria po kategorii.</p>
Index: tags/2.4.0RC3/language/pl_PL/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Tworzenie miniatur</h2>
+
+<p>Strona ta umożliwia stworzenie brakujących miniatur.</p>
+
+<dl>
+
+  <dt>Wersja GD</dt>
+
+  <dd>GD jest biblioteką służącą do manipulacji obrazami dla PHP. Należy wybrać wersję zainstalowaną na serwerze. Jeżeli zostanie wybrana zła, zostaną wyświetlone komunikaty o błędach, należy wtedy wrócić do konfiguracji wersji GD i wybrać inną. Jeżeli nie zadziała żadna wersja, oznacza to, że serwer nie posiada wsparcia dla biblioteki GD.</dd>
+
+  <dt>Szerokość i wysokość</dt>
+
+  <dd>Maksymalne rozmiary jakie mogą posiadać miniatury. Zachowane jest aspect ratio.</dd>
+
+  <dt>Liczba miniatur do utworzenia</dt>
+
+  <dd>Nie próbuj wykonywać miniatur dla zbyt wielu obrazów w tym samym czasie, ponieważ proces ten obciąża mocno procesor. Jeżeli masz zainstalowane Piwigo w ramach darmowego hostingu, zbyt wysokie wykorzystanie procesora może prowadzić nawet do usunięcia strony.</dd>
+
+  <dt>Typ pliku</dt>
+
+  <dd>Miniatury mogą być tworzone tylko jako JPEG. Natomiast miniatury mogą być tworzone z plików GIF oraz JPEG.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/pl_PL/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/pl_PL/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/help/user_list.html	(revision 14585)
@@ -0,0 +1,30 @@
+<h2>Lista użytkowników</h2>
+
+<p>W tym miejscu można zarządzać zarejestrowanymi użytkownikami. Tylko uprawnienia znajdują się na kilku innych ekranach.</p>
+
+<h3>Dodawanie użytkownika</h3>
+
+<p>Administrator może dodawać użytkowników ręcznie.</p>
+
+<h3>Lista użytkowników</h3>
+
+<p>Lista użytkowników może być filtrowana po nazwie użytkownika (użyj znaku * jako wildcard), grupie lub statusie. Lista może być sortowana po dacie rejestracji, nazwie użytkownika w kolejności roznącej lub malejącej.</p>
+
+<p>Ekran ten umożliwia wykonywanie w tym samym czasie danej akcji na kilku użytkonwikach
+:</p>
+
+<ul>
+
+  <li>usuwanie użytkowników (wymaga potwierdzenia przez zaznaczenie checkbox)</li>
+
+  <li>zmiana statusu</li>
+
+  <li>dodanie lub usuięcie z grup</li>
+
+  <li>edycja właściwości wyświetlania</li>
+
+  <li>edycja dodatkowych właściwości</li>
+
+</ul>
+
+<p>Domyślnie można wykonać taką akcję np. dla użytkowników zaznaczonych lub wszystkich użytkowników.</p>
Index: tags/2.4.0RC3/language/pl_PL/index.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/pl_PL/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Instalacja';
+$lang['Basic configuration'] = 'Podstawowa konfiguracja';
+$lang['Default gallery language'] = 'Domyślny język galerii';
+$lang['Database configuration'] = 'Konfiguracja bazy danych';
+$lang['Admin configuration'] = 'Konfiguracja administratora';
+$lang['Start Install'] = 'Rozpoczęcie instalacji';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'adres email musi być w postaci xxx@yyy.eee (np : jack@altern.org)';
+$lang['Webmaster login'] = 'Logowanie Webmastera';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'To będzie wyświetlone dla odwiedzających i jest konieczne do celów administracyjnych ';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Połączenie do serwera powiodło się, ale nie było możliwe połączenie do bazy danych';
+$lang['Can\'t connect to server'] = 'Nie można połączyć się do serwera';
+$lang['Host'] = 'MySQL host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Użytkownik';
+$lang['user login given by your host provider'] = 'login użytkownika dostarczona przez provider\'a';
+$lang['Password'] = 'Hasło';
+$lang['user password given by your host provider'] = 'hasło użytkownika dostarczona przez provider\'a';
+$lang['Database name'] = 'Nazwa bazy danych';
+$lang['also given by your host provider'] = 'także dostarczona przez provider\'a';
+$lang['Database table prefix'] = 'Prefix tabel bazy danych';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'tabele w bazie danych będą miały taki prefix (ułatwia to zarządzanie tabelami)';
+$lang['enter a login for webmaster'] = 'wprowadź nazwę użytkownika posiadającego uprawnienia Webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'login nie może zawierać następujących znaków \' lub "';
+$lang['please enter your password again'] = 'wprowadź hasło jeszcze raz';
+$lang['Webmaster password'] = 'Hasło użytkownika Webmaster';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Zachowaj hasło, umożliwia ono dostęp do panelu administracyjnego';
+$lang['Password [confirm]'] = 'Hasło [potwierdź]';
+$lang['verification'] = 'weryfikacja';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrzebujesz pomocy ? Zadaj pytanie na <a href="%s">Forum Piwigo</a>.';
+$lang['Webmaster mail address'] = 'Adres email Webmaster\'a';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Z jego pomocą odwiedzający będą mogli się skontaktować z administratorem strony';
+$lang['PHP 5 is required'] = 'PHP 5 jest wymagane';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Twój serwer aktualnie używa PHP w wersji %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo może spróbować przełączyć Twoją konfigurację do PHP 5 poprzez modyfikację pliku .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Możesz również zmienić tę konfigurację sam, a następnie uruchomić ponownie Piwigo.';
+$lang['Try to configure PHP 5'] = 'Spróbuj skonfigurować PHP 5';
+$lang['Sorry!'] = 'Niestety!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nie mógł skonfigurować Twojego PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Możesz skontaktować się z działem wsparcia Twojego providera aby dowiedzieć się jak włączyć PHP 5.';
+$lang['Hope to see you back soon.'] = 'Do zobaczenia wkrótce.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulacje, instalacja Piwigo zakończona sukcesem';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Alternatywnym rozwiązaniem jest skopiować tekst z powyższego textbox i wkleić do pliku "local/config/database.inc.php" (Uwaga : database.inc.php musi zawierać to co jest w textbox i nie może zawierać znaków spacji oraz enter)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Nie powiodło się stworzenie pliku konfiguracyjnego local/config/database.inc.php.';
+$lang['Download the config file'] = 'Pobierz plik konfiguracyjny';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Możesz pobrać plik konfiguracyjny i wgrać go do katalogu lokalnego/z konfiguracją.';
+$lang['Just another Piwigo gallery'] = 'Kolejna galeria Piwigo';
+$lang['Welcome to my photo gallery'] = 'Witaj w mojej galerii zdjęć';
+$lang['Welcome to your new installation of Piwigo!'] = 'Witamy w Towjej nowej instalacji Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Nie obawiaj się kontaktu na forum w celu skorzystania z pomocy: %s';
+
+?>
Index: tags/2.4.0RC3/language/pl_PL/iso.txt
===================================================================
--- tags/2.4.0RC3/language/pl_PL/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Polski [PL]
Index: tags/2.4.0RC3/language/pl_PL/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/pl_PL/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pl_PL/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Aktualizacja';
+$lang['Upgrade from version %s to %s'] = 'Aktualizacja z wersji %s do %s';
+$lang['Statistics'] = 'Statystyki';
+$lang['total upgrade time'] = 'sumaryczny czas aktualizacji';
+$lang['total SQL time'] = 'sumaryczny czas SQL';
+$lang['SQL queries'] = 'zapytań SQL';
+$lang['Upgrade informations'] = 'Informacje o aktualizacji';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Jeżeli napotkasz jakiś problem wykonaj weryfikację przez [Administracja>Narzędzia>Maintenance].';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Tylko administrator może wykonać aktualizację: zaloguj się poniżej.';
+$lang['You do not have access rights to run upgrade'] = 'Nie masz uprawnień do wykonania aktualizacji';
+$lang['All sub-albums of private albums become private'] = 'Wszystkie pod-albumy prywatnych albumów będą prywatne';
+$lang['User permissions and group permissions have been erased'] = 'Uprawnienia użytkowników oraz grup zostały usunięte';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Z poprzedniej konfiguracji zostały zapisane tylko prefiksy miniatur oraz adres email administratora.';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Ta strona proponuje aktualizację Twojej bazy danych Piwigo do nowej wersji. Asystent aktualizacji myśli, że aktualnie używasz <strong>wersji %s</strong> (lub równoważnej).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Jako zabezpieczenie, następujące wtyczki zostały zdezaktywowane. Przed ich aktywacją musisz sprawdzić czy nie ma nowszych wersji:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'W <i>%s</i>, przed <b>?></b>, wstaw:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Zapobiegawczo, zostały dezayktywowane następujące tematy. Przed ich ponownym aktywowaniem, należy sprawdzić ich aktualizacje:';
+
+?>
Index: tags/2.4.0RC3/language/pt_BR/about.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/about.html	(revision 14585)
@@ -0,0 +1,6 @@
+  <li>Piwigo é uma aplicação web que permite a criação de uma galeria de imagens on line.</li>
+
+  <li>Piwigo é desenvolevido em PHP com uma base de dados MySQL.</li>
+
+  <li>Se houver sugestões ou comentários, visite o <a
+  href="http://piwigo.org">sitio oficial</a> e <a href="http://piwigo.org/forum">seu forum</a>.</li>
Index: tags/2.4.0RC3/language/pt_BR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_BR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/admin.lang.php	(revision 14585)
@@ -0,0 +1,607 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d associação';
+$lang['%d associations'] = '%d associações';
+$lang['%d album including'] = '%d categoria incluída ';
+$lang['%d albums including'] = '%d categorias incluídas ';
+$lang['%d physical'] = '%d físico';
+$lang['%d physical'] = '%d físico';
+$lang[' and %d virtual'] = ' e %d virtual';
+$lang[' and %d virtual'] = ' e %d virtual';
+$lang['%d album moved'] = '%d categoria movida';
+$lang['%d albums moved'] = '%d categorias movidas';
+$lang['%d group'] = '%d grupo';
+$lang['%d groups'] = '%d grupos';
+$lang['%d member'] = '%d membro';
+$lang['%d members'] = '%d membros';
+$lang['%d tag'] = '%d tag';
+$lang['%d tags'] = '%d tags';
+$lang['%d user comment rejected'] = '%d comentário de usuário rejeitado';
+$lang['%d user comments rejected'] = '%d comentários de usuário rejeitados';
+$lang['%d user comment validated'] = '%d comentário de usuário aprovado';
+$lang['%d user comments validated'] = '%d comentários de usuário aprovados';
+$lang['%d user deleted'] = '%d usuário apagado';
+$lang['%d users deleted'] = '%d usuários apagados';
+$lang['%d user'] = '%d usuário';
+$lang['%d users'] = '%d usuários';
+$lang['%d waiting for validation'] = '%d aguardando aprovação';
+$lang['Actions'] = 'Acões';
+$lang['Activate'] = 'Ativar';
+$lang['Add/delete a permalink'] = 'Adicionar/apagar um link';
+$lang['Add a tag'] = 'Adicionar uma tag';
+$lang['Add a user'] = 'Adicionar um usuário';
+$lang['Add group'] = 'Adicionar um grupo';
+$lang['Add'] = 'Adicionar';
+$lang['Allow user registration'] = 'Permitir o registro de usuário';
+$lang['Apply to sub-albums'] = 'Aplicar às subcategorias';
+$lang['Associated'] = 'Associados(as)';
+$lang['Caddie management'] = 'Gerenciamento da cesta';
+$lang['Caddie'] = 'Cesta';
+$lang['Albums authorized thanks to group associations'] = 'Categorias autorizadas graças a associações de grupo';
+$lang['Album manual order was saved'] = 'A ordem manual das categorias foi salva';
+$lang['Check for upgrade failed for unknown reasons.'] = 'A checagem por atualização falhou por razões desconhecidas.';
+$lang['Check for upgrade'] = 'Checar por atualização';
+$lang['Comments for all'] = 'Comentários para todos';
+$lang['Current name'] = 'Nome atual';
+$lang['Database'] = 'Base de dados';
+$lang['Deactivate'] = 'Desativar';
+$lang['Delete Representant'] = 'Apagar representante';
+$lang['Delete selected tags'] = 'Apagar tags selecionadas';
+$lang['Delete selected users'] = 'Apagar usuários selecionados';
+$lang['Deletions'] = 'Itens apagados';
+$lang['Deny selected groups'] = 'Negar os grupos selecionados';
+$lang['Deny selected users'] = 'Negar usuários selecionados';
+$lang['Description'] = 'Descrição';
+$lang['Display options'] = 'Mostrar opções';
+$lang['Dissociated'] = 'Desassociados';
+$lang['Does not represent'] = 'Não representa';
+$lang['Edit selected tags'] = 'Editar tags selecionadas';
+$lang['Edit tags'] = 'Editar tags';
+$lang['Email admins when a new user registers'] = 'Notificar os administradores quando um novo usuário se registrar';
+$lang['Email admins when a valid comment is entered'] = 'Notificar os administradores quando um comentário aprovado for incluído';
+$lang['Email admins when a comment requires validation'] = 'Notificar os administradores quando um comentário necessitar de aprovação';
+$lang['Environment'] = 'Arredores';
+$lang['Form'] = 'Formulário';
+$lang['Gallery title'] = 'título da galeria';
+$lang['Grant selected groups'] = 'Permitir os grupos selecionados';
+$lang['Grant selected users'] = 'Permitir os usuários selecionados';
+$lang['Group name'] = 'Nome do grupo';
+$lang['Groups'] = 'Grupos';
+$lang['Guests'] = 'Visitantes';
+$lang['History'] = 'Histórico';
+$lang['Informations'] = 'Informações';
+$lang['Install'] = 'Instalar';
+$lang['Link all album photos to a new album'] = 'Vincular (lincar) todos os itens da categoria a uma nova categoria';
+$lang['Link all album photos to some existing albums'] = 'Vincular (lincar) todos os itens da categoria a alguma(s) categoria existente';
+$lang['Linked albums'] = 'Categorias vinculadas (Linked)';
+$lang['Lock gallery'] = 'Trancar a  galeria';
+$lang['Maintenance'] = 'Manutenção';
+$lang['Edit album permissions'] = 'Gerenciar permissões da categoria';
+$lang['Manage permissions for group "%s"'] = 'Gerenciar permissões do grupo "%s"';
+$lang['Manage permissions for user "%s"'] = 'Gerenciar permissões do usuário "%s"';
+$lang['Manage tags'] = 'Gerenciar tags';
+$lang['Members'] = 'Membros';
+$lang['Metadata synchronized from file'] = 'Metadados sincronizados do arquivo';
+$lang['Move albums'] = 'Mover categorias';
+$lang['Move'] = 'Mover';
+$lang['Name'] = 'Nome';
+$lang['New name'] = 'Nome novo';
+$lang['New parent album'] = 'Nova categoria pai (parent category)';
+$lang['New tag'] = 'Tag nova';
+$lang['Number of comments per page'] = 'Número de comentários por página';
+$lang['Number of rates'] = 'Número de votos';
+$lang['Number of thumbnails to create'] = 'Número de miniaturas (thumbnails) a ser criado';
+$lang['Only private albums are listed'] = 'Apenas as categorias privadas estão listadas';
+$lang['Operating system'] = 'Sistema operacional';
+$lang['Options'] = 'Opções';
+$lang['Other private albums'] = 'Outras categorias privadas';
+$lang['Page banner'] = 'Banner da página (imagem que fica no cabeçalho)';
+$lang['Parent album'] = 'Categoria pai';
+$lang['Path'] = 'Caminho (path)';
+$lang['Permalink'] = 'Permalink (endereço permanente)';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink %s já está sendo usado pela categoria %s. Apague do histórico do permalink primeiro';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'O permalink deve ser composto de a-z, A-Z, 0-9, "-", "_" ou "/". Não deve ser numérico ou começar com número seguido de "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink %s já está sendo usado pela categoria %s';
+$lang['Permalink history'] = 'Histórico permalink';
+$lang['Permalinks'] = 'Permalinks';
+$lang['Permission denied'] = 'Permissão negada';
+$lang['Permission granted thanks to a group'] = 'Permissão garantida graças ao grupo';
+$lang['Permission granted'] = 'Permissão garantida';
+$lang['Photo informations updated'] = 'Informações da imagem atualizada';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Posição';
+$lang['Preferences'] = 'Preferências';
+$lang['Properties'] = 'Propriedades';
+$lang['Random photo'] = 'Imagem randômica';
+$lang['Rate date'] = 'Data da votação';
+$lang['Rating by guests'] = 'Votado(a) pelos visitantes';
+$lang['Rating'] = 'Avaliação';
+$lang['Reject'] = 'Rejeitar';
+$lang['Representant'] = 'Representante';
+$lang['Representation of albums'] = 'Representante das categorias';
+$lang['Representative'] = 'Representativo';
+$lang['Represents'] = 'Representa';
+$lang['Save order'] = 'Salvar ordem';
+$lang['Save to permalink history'] = 'Salvar no histórico permalink';
+$lang['Select at least one album'] = 'Selecionar ao menos uma categoria';
+$lang['Select at least one photo'] = 'Selecionar ao menos uma imagem';
+$lang['Select at least one user'] = 'Selecionar ao menos um usuário';
+$lang['Show info'] = 'Mostrar info';
+$lang['Site manager'] = 'Gerenciador do site';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statísticas';
+$lang['Storage album'] = 'categoria da armazenagem';
+$lang['Sum of rates'] = 'Soma dos valores';
+$lang['Tag "%s" already exists'] = 'A tag "%s" já existe';
+$lang['Tag "%s" was added'] = 'A tage "%s" foi adicionada';
+$lang['Tag selection'] = 'Seleção de tag';
+$lang['The %d following tags were deleted'] = 'As %d tags seguintes foram apagadas';
+$lang['Unable to check for upgrade.'] = 'Não foi possível checar as atualizações.';
+$lang['Uninstall'] = 'Desinstalar';
+$lang['Use the default photo sort order (defined in the configuration file)']='Usar a ordem de exibição padrão (definida no arquivo de configuração)';
+$lang['User comments validation'] = 'Validação dos comentários de usuário';
+$lang['Users'] = 'Usuários';
+$lang['Validate'] = 'Aprovar';
+$lang['Validation'] = 'Aprovação';
+$lang['Version'] = 'Versão';
+$lang['Virtual albums to move'] = 'Categorias virtuais a serem movidas';
+$lang['Virtual album name'] = 'Nome da categoria virtual';
+$lang['Webmaster cannot be deleted'] = 'Webmaster não pode ser apagado';
+$lang['You are running on development sources, no check possible.'] = 'Você está navegando em fontes de desenvolvimento, nenhuma checagem é possível.';
+$lang['You cannot delete your account'] = "Você não pode apagar sua conta";
+$lang['You cannot move an album in its own sub album'] = 'Você não pode mover uma categoria em sua própria sub categoria.';
+$lang['You need to confirm deletion'] = 'Você precisa confirmar a remoção';
+$lang['Associate to album'] = 'associar à categoria';
+$lang['associate to group'] = 'associar ao grupo';
+$lang['Authorized'] = 'Autorizado';
+$lang['Add a virtual album'] = 'Adicionar uma categoria virtual';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizar os usuários a adicionar comentários nas categorias selecionadas';
+$lang['The name of an album must not be empty'] = 'O nome de uma categoria não deveria ser vazio';
+$lang['Lock albums'] = 'Trancar categorias';
+$lang['Private'] = 'Categorias privadas';
+$lang['Public'] = 'Categorias públicas';
+$lang['Find a new representant by random'] = 'Encontrar um novo representante aleatoriamente';
+$lang['Public / Private'] = 'Público / Privado';
+$lang['Manage authorizations for selected albums'] = 'Gerenciar as autorizações para categorias selecionadas';
+$lang['Virtual album added'] = 'Categoria virtual adicionada';
+$lang['Virtual album deleted'] = 'Categoria virtual apagada';
+$lang['Access type'] = 'Tipo de acesso';
+$lang['Information data registered in database'] = 'Dado de informação registrado na base de dados';
+$lang['Default display'] = 'Exibição padrão (Default display)';
+$lang['The gallery URL is not valid.'] = 'O URL (endereço) da galeria não é valido.';
+$lang['Main'] = 'Principal';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'O número de comentários por página deve ser entre 5 e 50 .';
+$lang['Configuration'] = 'Configuração';
+$lang['confirm'] = 'confirmar';
+$lang['Date'] = 'Data';
+$lang['delete album'] = 'apagar categoria';
+$lang['Dissociate from album'] = 'desassociar da categoria';
+$lang['dissociate from group'] = 'desassociar do grupo';
+$lang['Album updated successfully'] = 'As informações da categoria foram atualizadas com sucesso.';
+$lang['photos per page'] = 'itens por página';
+$lang['High definition enabled'] = 'Auta definição ativada';
+$lang['File'] = 'Arquivo';
+$lang['first photo added on %s'] = 'primeiro item adicionado em %s';
+$lang['Forbidden'] = 'Proibido';
+$lang['global mode'] = 'modo global';
+$lang['group "%s" added'] = 'grupo "%s" adicionado';
+$lang['group "%s" deleted'] = 'grupo "%s" apagado';
+$lang['group "%s" updated'] = 'grupo "%s" atualizado';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'O nome de um grupo não deve conter " ou \' ou ser vazio.';
+$lang['This name is already used by another group.'] = 'Este nome já está sendo usado por outro grupo.';
+$lang['High definition'] = 'Alta definição';
+$lang['jump to album'] = 'pular para categoria';
+$lang['jump to photo'] = 'pular para imagem';
+$lang['leave'] = 'deixar (leave)';
+$lang['Lock'] = 'Trancar (Lock)';
+$lang['Locked'] = 'Trancado(a) (Locked)';
+$lang['manage album photos'] = 'gerenciar os itens da categoria';
+$lang['manage sub-albums'] = 'gerenciar subcategorias';
+$lang['Manage'] = 'Gerenciar';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundo].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundos].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'O tempo disponível para a criação da lista de usuários para enviar email é limitado. Outros usuários não estão listados.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'O tempo para enviar email é limitado. Outros emails estão desconsiderados.';
+$lang['To send ?'] = 'Enviar ?';
+$lang['Last send'] = 'Enviado pela última vez';
+$lang['email'] = 'email';
+$lang['User'] = 'Usuário';
+$lang['See you soon,'] = 'Até breve,';
+$lang['Go to'] = 'Ir à(ao) ';
+$lang['Hello'] = 'Olá ';
+$lang['New photos were added'] = 'Novos itens foram adicionados ';
+$lang['on'] = ' em ';
+$lang['between'] = 'entre ';
+$lang['and'] = ' e ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'O webmaster lhe incluiu na assinatura que lhe pemitirá receber notificações por email.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Você está na assinatura para receber notificações por email.';
+$lang['To subscribe'] = 'Assinar';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Se você encontrar problemas ou tiver qualquer pergunta, por favor envie uma mensagem para ';
+$lang['[NBM] Problems or questions'] = '[Notificação] Problemas ou perguntas';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'O webmaster lhe retirou da assinatura para receber notificações por email.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Você saiu da assinatura para receber notificações por email.';
+$lang[', click on'] = ', clique em ';
+$lang['To unsubscribe'] = 'Cancelar assinatura';
+$lang['With blank value, gallery title will be used'] = 'Com valor em branco, o título da galeria será usado';
+$lang['Notification'] = 'Notificação';
+$lang['Error when sending email to %s [%s].'] = 'Erro ao enviar email para %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Email enviado para %s [%s].';
+$lang['%d mail was sent.'] = '%d email foi enviado.';
+$lang['%d mails were sent.'] = '%d emails foram enviados.';
+$lang['%d mail was not sent.'] = '%d email não foi enviado.';
+$lang['%d mails were not sent.'] = '%d emails não foram enviados.';
+$lang['No mail to send.'] = 'Nenhum email para enviar.';
+$lang['There is no available subscribers to mail.'] = 'Não há assinante algum para enviar email.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Assinantes poderiam ser listados (disponíveis) apenas se houver novos itens para notificar.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Em todo caso, apenas webmasters podem ver esta tab e nunca administradores.';
+$lang['No user to send notifications by mail.'] = 'Nenhum usuário para enviar notificações por email.';
+$lang['New photos added'] = 'Novos itens adicionados';
+$lang['Subscribe to notification by mail'] = 'Assinar as notificações por email';
+$lang['Unsubscribe from notification by mail'] = 'Cancelar a assinatura das notificações por email';
+$lang['Parameter'] = 'Parâmetro';
+$lang['Continue processing treatment'] = 'Continuar processando tratamento';
+$lang['Complementary mail content'] = 'Conteúdo complementar da correspondência';
+$lang['Add detailed content'] = 'Adicionar conteúdo detalhado';
+$lang['Send mail as'] = 'Enviar email como';
+$lang['Send mail to users'] = 'Enviar email aos usuários';
+$lang['Send'] = 'Enviar';
+$lang['Options'] = 'Opções';
+$lang['Subscribed'] = 'Assinados';
+$lang['Subscribe'] = 'Assinar';
+$lang['Parameters'] = 'Parâmetros';
+$lang['Select recipients'] = 'Selecionar os destinatários';
+$lang['Subscribe/unsubscribe users'] = 'Assinar/Cancelar Assinatura de usuários';
+$lang['Unsubscribed'] = 'Assinatura Cancelada';
+$lang['%d parameter was updated.'] = '%d parâmetro foi atualizado.';
+$lang['%d parameters were updated.'] = '%d parâmetros foram atualizados.';
+$lang['%d user was not updated.'] = '%d usuário não foi atualizado.';
+$lang['%d users were not updated.'] = '%d usuários não foram atualizados.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Usuário %s [%s] foi removido da lista de assinantes.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Usuário %s [%s] foi adicionado na lista de assinantes.';
+$lang['%d user was updated.'] = '%d usuário foi atualizado.';
+$lang['%d users were updated.'] = '%d usuários foram atualizados.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Usuário %s [%s] não foi removido da lista de assinantes.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Usuário %s [%s] não foi adicionado na lista de assinantes.';
+$lang['User %s [%s] added.'] = 'Usuário %s [%s] adicionado.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Aviso: assinando ou cancelando a assinatura enviará correspondência aos usuários';
+$lang['Send mail on HTML format'] = 'Enviar a correspondência no formato HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Incluir a exibição do grupo das imagens recentes por datas';
+$lang['Available only with HTML format'] = 'Disponível apenas com o formato HTML';
+$lang['no write access'] = 'sem acesso de escrita';
+$lang['Permissions'] = 'Permissões';
+$lang['private'] = 'privado';
+$lang['public'] = 'público';
+$lang['Purge never used notification feeds'] = 'Limpar os feeds de notificação que nunca foram usados';
+$lang['Purge sessions'] = 'Limpar as sessões';
+$lang['randomly represented'] = 'radomicamente representado';
+$lang['registration date'] = 'dato de registro';
+$lang['clean'] = 'limpar';
+$lang['Create this site'] = 'Criar este site';
+$lang['test'] = 'testar';
+$lang['test this remote site'] = 'testar ste site remoto';
+$lang['remove tags'] = 'remover tags';
+$lang['Repair and optimize database'] = 'Reparar e otimizar base de dados';
+$lang['selection'] = 'seleção';
+$lang['set to'] = 'iniciar';
+$lang['singly represented'] = 'unicamente representado';
+$lang['This site already exists'] = 'Este site já existe';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Criar um site novo : (dê seu URL para create_listing_file.php)';
+$lang['created'] = 'criado';
+$lang['delete this site and all its attached elements'] = 'apagar este site e todos os itens associados a ele';
+$lang['deleted'] = 'apagado';
+$lang['an error happened'] = 'um erro aconteceu';
+$lang['Local'] = 'Local';
+$lang['Remote'] = 'Remoto';
+$lang['update the database from files'] = 'usar os arquivos para atualizar a base de dados';
+$lang['status'] = 'status';
+$lang['Directory'] = 'Diretório';
+$lang['sub-albums'] = 'subcategorias';
+$lang['Synchronize metadata'] = 'sincronizar metadado';
+$lang['target'] = 'meta';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['title'] = 'título';
+$lang['Album list management'] = 'Gerenciamento de categorias';
+$lang['Piwigo configuration'] = 'Configuração Piwigo';
+$lang['Edit album'] = 'Editar uma categoria';
+$lang['Group management'] = 'Gerenciamento de grupo';
+$lang['User list'] = 'Lista de usuário';
+$lang['Edit photo information'] = 'Modificar informações sobre uma imagem';
+$lang['Database synchronization with files'] = 'Sincronização da base de dados com os arquivos';
+$lang['all'] = 'tudo';
+$lang['height must be a number superior to'] = 'altura deve ser um número superior a';
+$lang['width must be a number superior to'] = 'largura deve ser um número superior a';
+$lang['for the file format'] = 'para o formato de arquivo';
+$lang['Photo unreachable or no support'] = 'Imagem não alcançável ou nenhum suporte';
+$lang['GD version'] = 'versão GD';
+$lang['General statistics'] = 'Estatísticas gerais';
+$lang['average time'] = 'tempo médio';
+$lang['number of miniaturized photos'] = 'número de imagens miniaturizadas';
+$lang['total time'] = 'tempo total';
+$lang['for this file format'] = 'para este formato de arquivo';
+$lang['unit mode'] = 'modo unitário';
+$lang['Unlocked'] = 'Destrancado (Unlocked)';
+$lang['unset'] = 'sem valor (não ajustado)';
+$lang['Update albums informations'] = 'Atualizar as informações das categorias';
+$lang['Update photos information'] = 'Atualizar as informações das imagens';
+$lang['Synchronize'] = 'Sincronizar';
+$lang['reduce to single existing albums'] = 'reduzir as categorias existentes em apenas uma';
+$lang['Choose an option'] = 'Escolher uma opção';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'exibir o máximo de informações (categorias e itens adicionados, categorias e itens apagados)';
+$lang['Error list'] = 'Lista de erros';
+$lang['Errors caption'] = 'Captura de erros';
+$lang['Detailed informations'] = 'Informações detalhadas';
+$lang['File/directory read error'] = 'Erro de leitura em arquivo/diretório';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'O arquivo ou diretório não pode ser acessado (ou ele não existe ou o acesso está negado)';
+$lang['albums deleted in the database'] = 'categorias apagadas da base de dados';
+$lang['photos deleted from the database'] = 'itens apagados da base de dados';
+$lang['photos candidates for metadata synchronization'] = 'imagens candidatas para a sincronização com o metadado';
+$lang['photos informations synchronized with files metadata'] = 'as informações dos itens foram sincronizados com o metadado dos arquivos';
+$lang['errors during synchronization'] = 'erros durante a sincronização';
+$lang['albums added in the database'] = 'categorias adicionadas à base de dados';
+$lang['photos added in the database'] = 'itens adicionados à base de dados';
+$lang['photos updated in the database'] = 'itens atualizados à base de dados';
+$lang['Search for new images in the directories'] = 'Pesquisar novas imagens nos diretórios';
+$lang['added'] = 'adicionado(a)';
+$lang['deleted'] = 'apagado(a)';
+$lang['Metadata synchronization results'] = 'Resultados da sincronização do metadado';
+$lang['only perform a simulation (no change in database will be made)'] = 'apenas executa uma simulação (não será feita alteração alguma na base de dados)';
+$lang['Simulation'] = 'Simulação';
+$lang['directories + files'] = 'diretórios + arquivos';
+$lang['only directories'] = 'apenas diretórios';
+$lang['synchronize files structure with database'] = 'sincronizar a estrutura dos arquivos com a base de dados';
+$lang['synchronize files metadata with database photos informations'] = 'sincronizar o metadado dos arquivos com as informações dos itens da base de dados';
+$lang['even already synchronized photos'] = 'itens já sincronizados';
+$lang['Used metadata'] = 'Metadados usados';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'O nome dos diretórios e dos arquivos devem ser compostos de letras, números, "-", "_" ou "."';
+$lang['wrong filename'] = 'nome de arquivo errado';
+$lang['Upload'] = 'Enviar (Upload)';
+$lang['user "%s" added'] = 'adicionado usuário "%s" ';
+$lang['User status'] = 'Status de usuário';
+$lang['user_status_admin'] = 'Administrador';
+$lang['user_status_generic'] = 'Genérico';
+$lang['user_status_guest'] = 'Visitante';
+$lang['user_status_normal'] = 'Usuário';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Categoria virtual';
+$lang['Waiting'] = 'Aguardando';
+$lang['default'] = 'padrão';
+$lang['Toggle \'default group\' property'] = 'Ligar/Desligar \'gruppo padrão\' propriedade';
+$lang['Advanced features'] = 'Características principais';
+$lang['Overall'] = 'Completo(amente)';
+$lang['Year'] = 'Ano';
+$lang['Month'] = 'Mês';
+$lang['Day'] = 'Dia';
+$lang['Pages seen'] = 'Páginas vistas';
+$lang['Time'] = 'Tempo';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Item';
+$lang['Section'] = 'Seção';
+$lang['An information email was sent to group "%s"'] = 'Um email informativo foi foi enviado para o grupo "%s';
+$lang['Send an information email to group members'] = 'Enviar um email informativo aos membros do grupo';
+$lang['Group'] = 'Grupo';
+$lang['[%s] Visit album %s'] = '[%s] Venha visitar a categoria %s';
+$lang['Hello,'] = 'Olá,';
+$lang['See you soon.'] = 'Até breve.';
+$lang['Discover album:'] = 'Venha descobrir a categoria:';
+$lang['Mail content'] = 'conteúdo da correspondência';
+$lang['none'] = 'nenhum';
+$lang['high'] = 'alto';
+$lang['other'] = 'outro';
+$lang['Element type'] = 'Tipo de item';
+$lang['Image id'] = 'ID da imagem';
+$lang['Summary'] = 'Sumário';
+$lang['%d line filtered'] = '%d linha filtrada';
+$lang['%d lines filtered'] = '%d linhas filtradas';
+$lang['%d guest'] = '%d visitante';
+$lang['%d guests'] = '%d visitantes';
+$lang['Hour'] = 'Hora';
+$lang['guest'] = 'visitante';
+$lang['default values'] = 'valores padrão';
+$lang['Guest cannot be deleted'] = 'Visitante não pode ser apagado';
+$lang['Default user cannot be deleted'] = 'Usuário padrão não pode ser apagado';
+$lang['Purge history detail'] = 'Limpar o detalhe histórico';
+$lang['Purge history summary'] = 'Limpar o sumário do histórico';
+$lang['Check integrity'] = 'Checar integridade';
+$lang['Anomaly'] = 'Anomalia';
+$lang['Correction'] = 'Correção';
+$lang['Automatic correction'] = 'Correção automática';
+$lang['Impossible automatic correction'] = 'Impossível a correção automática';
+$lang['Correction applied with success'] = 'A correção foi aplicada com sucesso';
+$lang['Correction applied with error'] = 'A correção foi aplicada com erro';
+$lang['%d anomaly has been detected.'] = '%d anomalia foi detectada.';
+$lang['%d anomalies have been detected.'] = '%d anomalias foram detectadas.';
+$lang['%d anomaly has been corrected.'] = '%d anomalia foi corrigida.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalias foram corrigidas.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalia não foi corrigida.';
+$lang['%d anomalies have not been corrected.'] = '%d anomalias não foram corrigidas.';
+$lang['Go to %s or %s for more informations'] = 'Vá ao %s ou %s para mais informações';
+$lang['the forum'] = 'forum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'valor %s não está correto porque exif não é suportado';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s deve ser atualizado para falso no seu arquivo config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'O usuário "visitante" principal não existe';
+$lang['Main "guest" user status is incorrect'] = 'O status de usuário do "visitante" principal está incorreto';
+$lang['Default user does not exist'] = 'usuário padrão (default) não existe';
+$lang['Main "webmaster" user does not exist'] = 'O usuário principal "webmaster" não existe';
+$lang['Main "webmaster" user status is incorrect'] = 'O status do usuário principal "webmaster" está incorreto';
+$lang['User "%s" created with "%s" like password'] = 'O usuário "%s" foi criado com "%s" como senha';
+$lang['Status of user "%s" updated'] = 'Status do usuário "%s" foi atualizado';
+$lang['add new photos to caddie'] = 'adicionar novos itens à cesta';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = 'Nenhuma exibição';
+$lang['Classic display'] = 'Exibição clássica';
+$lang['Hoverbox display'] = 'Exibição hoverbox';
+$lang['Mail address is obligatory for all users'] = 'Endereço de email é obrigatório para todos os usuários';
+$lang['Minimum privacy level'] = 'Nível de privacidade mínima';
+$lang['Privacy level'] = 'Nível de privacidade';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contatos';
+$lang['Level 2'] = 'Amigos';
+$lang['Level 4'] = 'Família';
+$lang['Level 8'] = 'Administradores';
+$lang['Reinitialize check integrity'] = 'Reiniciar checar integridade';
+$lang['Check all'] = 'marcar tudo';
+$lang['Uncheck all'] = 'desmarcar tudo';
+$lang['Check automatic corrections'] = 'Checar correções automáticas';
+$lang['Apply selected corrections'] = 'Aplicar as correções selecionadas';
+$lang['Ignore selected anomalies'] = 'Ignorar as anomalias selecionadas';
+$lang['Refresh'] = 'Refresh (Carregar novamente)';
+$lang['The anomaly will be ignored until next application version'] = 'A anomalia será ignorada até a próxima versão da aplicação';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'A correção da anomalia irá cancelar o fato de que está ignorada';
+$lang['%d anomaly has been ignored.'] = '%d anomalia foi ignorada.';
+$lang['%d anomalies have been ignored.'] = '%d anomalias foram ignoradas.';
+$lang['Plugins which need upgrade'] = 'Plugins que necessitam atualização (upgrade)';
+$lang['Plugin list'] = 'Lista de plugins';
+$lang['Check for updates'] = 'Checar por atualizações';
+$lang['Other plugins'] = 'Outros plugins';
+$lang['Last revisions'] = 'Últimas revisões';
+$lang['Are you sure you want to delete this plugin?'] = 'Você tem certeza de que você quer apagar este plugin?';
+$lang['Are you sure you want to install this plugin?'] = 'Você tem certeza de que você quer instalar este plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Você tem certeza de que você quer instalar esta atualização? Você deve verificar se esta versão não necessita de uma desinstalação.';
+$lang['Plugin has been successfully copied'] = 'Plugin foi copiado com sucesso';
+$lang['You might go to plugin list to install and activate it.'] = 'Você deve ir à lista de plugins para instalar e ativá-lo.';
+$lang['Can\'t create temporary file.'] = 'Não é possível criar arquivo temporário.';
+$lang['Can\'t download archive.'] = 'Não é possível baixar arquivo.';
+$lang['Can\'t read or extract archive.'] = 'Não é possível ler ou extrair arquivo.';
+$lang['An error occured during extraction (%s).'] = 'Houve um erro durante a extração (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Por favor, checar as permissões das pastas e subpastas de plugins (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Não foi possível a conexão com o servidor.';
+$lang['Purge compiled templates'] = 'Limpar os modelos compilados';
+$lang['ACCESS_0'] = 'Acesso livre';
+$lang['ACCESS_1'] = 'Acesso a todos';
+$lang['ACCESS_2'] = 'Acesso a assinantes';
+$lang['ACCESS_3'] = 'Acesso a administradores';
+$lang['ACCESS_4'] = 'Acesso a webmasters';
+$lang['ACCESS_5'] = 'Nenhum acesso';
+$lang['Support'] = 'Suporte';
+$lang['Documentation'] = 'Documentação';
+$lang['A new version of Piwigo is available.'] = 'Uma nova versão de Piwigo está disponível.';
+$lang['Piwigo Administration'] = 'Administração Piwigo';
+$lang['Piwigo version'] = 'Versão Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Você está usando a última versão de Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'A versão instalada de %s [%s] não é compatível com a versão requerida [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Você precisa atualizar seu sistema para aproveitar ao máximo a aplicação, do contrário, a aplicação não funcionará completa ou corretamente.';
+$lang['Deleted on'] = 'Apagada em';
+$lang['Last hit'] = 'Último acesso (Last hit)';
+$lang['GD library is missing'] = 'está faltanto a GD library';
+$lang['Templates'] = 'Modelos (Templates)';
+$lang['Extend for templates'] = 'Extensões para modelos (templates)';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+'Substituição dos modelos originais pelos modelos customizados do subdiretório template-extension';
+$lang['Replacers (customized templates)'] = 'Substitutos (modelos customizados)';
+$lang['Original templates'] = 'Modelos(templates) originais';
+$lang['Optional URL keyword'] = 'palavra chave URL opcional';
+$lang['Templates configuration has been recorded.'] = 'A configuração dos modelos (templates) foram gravadas.';
+$lang['All optimizations have been successfully completed.'] = 'Todas as otimizações foram finalizadas com sucesso.';
+$lang['Optimizations have been completed with some errors.'] = 'As otimizações foram finalizadas com alguns erros.';
+$lang['Modify information'] = 'Modificar informação';
+$lang['nothing'] = 'nada';
+$lang['overrides existing values with empty ones'] = 'sobrepor os valores existentes com valores vazios';
+$lang['Manage photo ranks'] = 'Gerenciar posições (image ranks)';
+$lang['Edit ranks'] = 'Editar posições (ranks)';
+$lang['No photo in this album'] = 'Nenhum item nesta categoria';
+$lang['Images manual order was saved'] = 'A ordem manual das imagens foi salva';
+$lang['ranks'] = 'posições (ranks)';
+$lang['Drag to re-order'] = 'Arraste para reordenar';
+$lang['Quick Local Synchronization'] = 'Sincronização Local Rápida';
+$lang['No photo can be deleted'] = 'Nenhuma foto pode ser apagada';
+$lang['Delete selected photos'] = 'Apagar as fotos selecionadas';
+$lang['%d photo was deleted'] = '%d foto foi apagada';
+$lang['%d photos were deleted'] = '%d fotos foram apagadas';
+$lang['Downloads'] = 'Downloads';
+$lang['Released on'] = 'Lançado em';
+$lang['Number of downloads'] = 'Número de downloads';
+$lang['Piwigo Announcements Newsletter'] = 'Boletim (newsletter) sobre anúncios do Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Fique atualizado com o projeto Piwigo, assine o boletim (newsletter) dos anúncios do Piwigo. Você receberá emails quando uma nova versão for disponibilizada (às vezes incluindo a correção de um bug, é importante estar por dentro para atualizar) e quando eventos importantes acontecerem no projeto. Apenas uns poucos emails ao longo do ano.';
+$lang['Subscribe %s'] = 'Assinar %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Fazer %s assinar o boletim (newsletter) sobre anúncios do Piwigo';
+$lang['Purge search history'] = 'Limpar o histórico da pesquisa';
+$lang['Hide'] = 'Esconder';
+$lang['Miscellaneous'] = 'Outras informações';
+$lang['Virtual Links'] = 'Links virtuais';
+$lang['Menu Management'] = 'Menu';
+$lang['Rate'] = 'Nota';
+$lang['Average rate'] = 'Nota média';
+$lang['Add to caddie'] = 'Acrescentar à cesta';
+$lang['%d of %d photos selected'] = '%d de %d fotos selecionadas';
+$lang['%d photos uploaded'] = '%d fotos enviadas';
+$lang['%s has been successfully updated.'] = '%s foi atualizado com sucesso.';
+$lang['%s photos can not be regenerated'] = '%s fotos não puderam ser recriadas';
+$lang['%s photos have been regenerated'] = '%s fotos foram ser recriadas';
+$lang['(this tag will be deleted)'] = '(esta etiqueta será excluida)';
+$lang['+ Add an upload box'] = '+ Inserir uma caixa de envio';
+$lang['... or '] = '... ou';
+$lang['Action'] = 'Ação';
+$lang['Activate icon "%s"'] = 'Ativar ícone "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Ativar ícone "novo" próximo a àlbuns e imagens';
+$lang['Activate Navigation Bar'] = 'Ativar barra de navegação';
+$lang['Activate Navigation Thumbnails'] = 'Ativar miniaturas de navegação';
+$lang['Activate comments'] = 'Ativar comentários';
+$lang['Active Languages'] = 'Ativar idiomas';
+$lang['Active Plugins'] = 'Ativar Plugins';
+$lang['Active Themes'] = 'Ativar Temas';
+$lang['Add a criteria'] = 'Adicionar um critério';
+$lang['Add a filter'] = 'Adicionar um filtro';
+$lang['Add another set of photos'] = 'Inserir outro conjunto de fotos';
+$lang['Add New Language'] = 'Inserir novo idioma';
+$lang['Add New Theme'] = 'Inserir um novo tema';
+$lang['Add Photos'] = 'Inserir fotos';
+$lang['Add tags'] = 'Inserir etiquetas';
+$lang['Add write access to the "%s" directory'] = 'Adicionar acesso de gravação ao diretório "%s"';
+$lang['Administration Home'] = 'Administração';
+$lang['Album "%s" has been added'] = 'Álbum "%s" foi inserido';
+$lang['Album "%s" now contains %d photos'] = 'Álbum "%s" contém agora %d fotos';
+$lang['Album name'] = 'Nome do Álbum';
+$lang['Album photos associated to the following albums: %s'] = 'Álbum associado aos seguintes álbuns: %s';
+$lang['Albums automatically sorted'] = 'Albuns classificados automaticamente';
+$lang['All %d photos are selected'] = 'Todas as %d fotos foram selecionadas';
+$lang['All extensions are up to date.'] = 'Todas as extensões estão atualizadas.';
+$lang['All languages are up to date.'] = 'Todos os idiomas estão atualizados.';
+$lang['All plugins are up to date.'] = 'Todos os plugins estão atualizados.';
+$lang['All themes are up to date.'] = 'Todos os temas estão atualizados.';
+$lang['Allow rating'] = 'Permitir avaliação';
+$lang['Allow user customization'] = 'Permitir personalização de usuário';
+$lang['Allow users to delete their own comments'] = 'Permitir aos usuários excluir seus próprios comentários';
+$lang['Allow users to edit their own comments'] = 'Permitir aos usuários editar seus próprios comentários';
+$lang['Allowed file types: %s.'] = 'Tipos de arquivos permitidos: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Um erro ocorreu durante a extração. Por favor, verifique as permissões de arquivo da sua instalação do Piwigo.<br><a href="%s">Clique aqui para mostrar o registro de erros</a>.';
+$lang['An error has occured during upgrade.'] = 'Um erro ocorreu durante a atualização.';
+$lang['Apply action'] = 'Aplicar ação';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Resolução máxima aproximada: %dM pixels (que é %dx%d pixels).';
+$lang['automatic order'] = 'Ordem automática';
+$lang['Batch Manager'] = 'Gerenciador de lotes';
+$lang['Bound Theme'] = 'Tema vinculado';
+$lang['By %s'] = 'Por %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Por padrão, Piwigo irá criar um novo tamhanho web a partir da versão HD (alta definição) da sua foto.';
+$lang['By rank'] = 'Por classificação';
+$lang['Cannot delete the old permalink !'] = 'O antigo link permanente não pode ser deletado!';
+$lang['Change Admin Colors'] = 'Trocar cores da administração';
+$lang['Choose an action'] = 'Escolher uma ação';
+$lang['Confirm merge'] = 'Confirme a fusão';
+$lang['create a new album'] = 'criar um novo álbum';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Criar o diretório "%s" no diretório raiz de instalação do seu Piwigo';
+$lang['Create'] = 'Criar';
+$lang['Crop'] = 'Cortar';
+$lang['Deactivate all'] = 'Desativar todos';
+?>
Index: tags/2.4.0RC3/language/pt_BR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_BR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Brasil [BR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=431
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Português';
+$lang_info['country'] = 'Brasil';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'pt';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d categoria atualizada';
+$lang['%d albums updated'] = '%d categorias atualizadas';
+$lang['%d comment to validate'] = '%d comentário para aprovar';
+$lang['%d comments to validate'] = '%d comentários para serem aprovados';
+$lang['%d new comment'] = '%d novo comentário';
+$lang['%d new comments'] = '%d novos comentários';
+$lang['%d comment'] = '%d comentário';
+$lang['%d comments'] = '%d comentários';
+$lang['%d hit'] = 'visto %d vez';
+$lang['%d hits'] = 'visto %d vezes';
+$lang['%d new photo'] = '%d imagem nova';
+$lang['%d new photos'] = '%d imagens novas';
+$lang['%d new user'] = '%d usuário novo';
+$lang['%d new users'] = '%d usuários novos';
+$lang['About'] = 'Sobre';
+$lang['All tags'] = 'Todas as tags';
+$lang['Any tag'] = 'qualquer tag';
+$lang['At least one listed rule must be satisfied.'] = 'Ao menos um dos critérios deve ser satisfeito.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Categorias';
+$lang['Album'] = 'Categoria';
+$lang['Close this window'] = 'Fechar esta janela';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS completo';
+$lang['Confirm Password'] = 'Confirmar senha';
+$lang['Connection settings'] = 'dados da conexão';
+$lang['Login'] = 'Conexão';
+$lang['Contact webmaster'] = 'Contatar o webmaster';
+$lang['Create a new account'] = 'Criar uma nova conta';
+$lang['Created on'] = 'Criada em';
+$lang['Creation date'] = 'Data de criação';
+$lang['Current password is wrong'] = 'A senha atual está errada';
+$lang['Dimensions'] = 'Dimensões';
+$lang['Display'] = 'Mostrar';
+$lang['Each listed rule must be satisfied.'] = 'Todos os critérios devem ser satisfeitos';
+$lang['Email address is missing. Please specify an email address.'] = 'Está faltando o endereço de email';
+$lang['Email address'] = 'Endereço de email';
+$lang['Enter your personnal informations'] = 'Introduza suas informações pessoais';
+$lang['Error sending email'] = 'Erro durante o envio do email';
+$lang['File name'] = 'Nome do arquivo';
+$lang['File'] = 'Arquivo';
+$lang['Filesize'] = 'Tamanho do arquivo';
+$lang['Filter and display'] = 'Filtrar e mostrar';
+$lang['Filter'] = 'Filtro';
+$lang['Forgot your password?'] = 'Esqueceu sua senha?';
+$lang['Go through the gallery as a visitor'] = 'Percorer a galeria como visitante';
+$lang['Help'] = 'Ajuda';
+$lang['Identification'] = 'Identificação';
+$lang['Photos only RSS feed'] = 'RSS das imagens';
+$lang['Keyword'] = 'Palavra chave';
+$lang['Links'] = 'Links';
+$lang['N/A'] = 'Não disponível';
+$lang['New on %s'] = 'Novo em %s';
+$lang['Notification'] = 'Notificação';
+$lang['Number of items'] = 'Número de itens';
+$lang['Original dimensions'] = 'Dimensão original';
+$lang['Password forgotten'] = 'Senha perdida';
+$lang['Password'] = 'Senha';
+$lang['Post date'] = 'Data de envio';
+$lang['Posted on'] = 'Enviado em';
+$lang['Profile'] = 'Perfil';
+$lang['Quick connect'] = 'Conexão rápida';
+$lang['RSS feed'] = 'fluxo RSS';
+$lang['Register'] = 'Registrar-se';
+$lang['Registration'] = 'Registro';
+$lang['Related tags'] = 'Tags relacionados';
+$lang['Reset'] = 'Cancelar';
+$lang['Retrieve password'] = 'Recuperar a senha';
+$lang['Search rules'] = 'Critérios de busca';
+$lang['Search tags'] = 'Pesquisar as tags';
+$lang['Search'] = 'Pesquisa';
+$lang['display available tags'] = 'Ver as tags disponíveis';
+$lang['Since'] = 'Desde ';
+$lang['Sort by'] = 'Listado por';
+$lang['Sort order'] = 'Ordem de exibição';
+$lang['Tag'] = 'Tag';
+$lang['Tags'] = 'Tags';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'O RSS notifica dos eventos da galeria : novas imagens, categorias actualizadas, Novos comentários usuários. Use um leitor de fluxos RSS.';
+$lang['Unknown feed identifier'] = 'identificador de fluxo RSS desconhecido';
+$lang['User comments'] = 'Comentários de usuário';
+$lang['Username'] = 'Nome de usuário';
+$lang['Visits'] = 'Visitas';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Semana %d';
+$lang['About Piwigo'] = 'Sobre Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Acesso proibido';
+$lang['add this photo to your favorites'] = 'Acrescentar aos favoritos';
+$lang['Administration'] = 'Administração';
+$lang['all'] = 'tudo';
+$lang['ascending'] = 'crescente';
+$lang['author(s) : %s'] = 'autor(es) : %s';
+$lang['Expand all albums'] = 'Expandir todas as categorias';
+$lang['posted after %s (%s)'] = 'disponível depois de %s (%s)';
+$lang['posted before %s (%s)'] = 'disponível antes de %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'disponível entre o %s (%s) e o %s (%s)';
+$lang['posted on %s'] = 'disponível em %s';
+$lang['Best rated'] = 'Com a melhor pontuação';
+$lang['display best rated photos'] = 'Mostrar as imagens com as notas mais altas';
+$lang['Calendar'] = 'Calendário';
+$lang['All'] = 'Todo';
+$lang['display each day with photos, month per month'] = 'Mostrar ano por ano, mês por mês, dia por dia';
+$lang['View'] = 'Vista';
+$lang['chronology_monthly_calendar'] = 'Calendário mensal';
+$lang['chronology_monthly_list'] = 'Lista mensal';
+$lang['chronology_weekly_list'] = 'Lista semanal';
+$lang['Click here if your browser does not automatically forward you'] = 'Clique aqui se o seu browser não o redirecionar automaticamente.';
+$lang['comment date'] = 'data do comentário';
+$lang['Comment'] = 'comentário';
+$lang['Your comment has been registered'] = 'O seu comentário foi registrado.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema conta abuso : Por favor, espere um momento antes de tentar escrever um novo comentario';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'O seu comentário não pôde ser registado porque não passou pelas regras de validação';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Um administrador deve autorizar o seu comentário para que ele seja visível por todos.';
+$lang['This login is already used by another user'] = 'Este login já está sendo usado por outro usuário.';
+$lang['Comments'] = 'Comentários';
+$lang['Add a comment'] = 'Adicionar um comentário';
+$lang['created after %s (%s)'] = 'criado depois de %s (%s)';
+$lang['created before %s (%s)'] = 'criado antes de %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Criada entre  %s (%s) e  %s (%s)';
+$lang['created on %s'] = 'criado em %s';
+$lang['Customize'] = 'Personalizar';
+$lang['Your Gallery Customization'] = 'Personalização Da Sua Galeria';
+$lang['day'][0] = 'Domingo';
+$lang['day'][1] = 'Segunda-feira';
+$lang['day'][2] = 'Terça-feira';
+$lang['day'][3] = 'Quarta-feira';
+$lang['day'][4] = 'Quinta-eira';
+$lang['day'][5] = 'Sexta-feira';
+$lang['day'][6] = 'Sábado';
+$lang['Default'] = 'Padrão';
+$lang['delete this photo from your favorites'] = 'Apague esta imagem de seus favoritos';
+$lang['Delete'] = 'Apagar';
+$lang['descending'] = 'decrescente';
+$lang['Download'] = 'baixar';
+$lang['Download this file'] = 'baixar este arquivo';
+$lang['edit'] = 'editar';
+$lang['wrong date'] = 'data errada';
+$lang['excluded'] = 'excluídos';
+$lang['Your favorites'] = 'Meus favoritos';
+$lang['display your favorites photos'] = 'Mostrar minhas imagens favoritas';
+$lang['Favorites'] = 'Favoritas';
+$lang['First'] = 'Primeira página';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'A galeria está bloqueada para manutenção. Por favor, volte mais tarde.';
+$lang['Page generated in'] = 'Página gerada em';
+$lang['guest'] = 'visitante';
+$lang['Hello'] = 'Olá';
+$lang['available for administrators only'] = 'disponível apenas para os administradores';
+$lang['display this album'] = 'mostra as imagens do diretório raíz desta categoria';
+$lang['display last user comments'] = 'Ver os últimos comentários de usuários';
+$lang['customize the appareance of the gallery'] = 'personalisar a aparência da galeria';
+$lang['search'] = 'Pesquisar';
+$lang['Home'] = 'Início';
+$lang['in this album'] = 'nesta categoria';
+$lang['in %d sub-album'] = 'em %d subcategoria';
+$lang['in %d sub-albums'] = 'em %d subcategorias';
+$lang['included'] = 'incluídos';
+$lang['Invalid password!'] = 'Senha inválida!';
+$lang['Language'] = 'Idioma';
+$lang['last %d days'] = '%d últimos dias';
+$lang['Last'] = 'Última página';
+$lang['Logout'] = 'Desconectar (logout)';
+$lang['obligatory'] = 'obrigatório';
+$lang['Maximum photo height'] = 'Altura máxima das imagens';
+$lang['Maximum height must be a number superior to 50'] = 'A altura máxima das imagens deve ser um número superior a 50';
+$lang['Maximum photo width'] = 'Largura máxima das imagens';
+$lang['Maximum width must be a number superior to 50'] = 'A largura máxima das imagens deve ser um número superior a 50';
+$lang['display a calendar by creation date'] = 'Mostra um calendário ordenado pela data de criação';
+$lang['display all photos in all sub-albums'] = 'Mostra todos os elementos em todas as subcategorias';
+$lang['return to normal view mode'] = 'voltar à exibição normal';
+$lang['display a calendar by posted date'] = 'Mostrar um calendário por data de envio das imagens';
+$lang['month'][10] = 'outubro';
+$lang['month'][11] = 'novembro';
+$lang['month'][12] = 'dezembro';
+$lang['month'][1] = 'janeiro';
+$lang['month'][2] = 'fevereiro';
+$lang['month'][3] = 'março';
+$lang['month'][4] = 'abril';
+$lang['month'][5] = 'maio';
+$lang['month'][6] = 'junho';
+$lang['month'][7] = 'julho';
+$lang['month'][8] = 'agosto';
+$lang['month'][9] = 'setembro';
+$lang['Most visited'] = 'Mais visitadas';
+$lang['display most visited photos'] = 'Mostra as imagens mais visitadas';
+$lang['The number of photos per page must be a not null scalar'] = 'O número de imagens por página deve ser inteiro e não nulo';
+$lang['Number of photos per page'] = 'Número de imagens por página';
+$lang['Unknown identifier'] = 'Origem desconhecida';
+$lang['New password'] = 'Senha nova';
+$lang['Rate this photo'] = 'Dê uma nota a esta imagem';
+$lang['Next'] = 'Página seguinte';
+$lang['no rate'] = 'nenhuma nota';
+$lang['Photos posted within the last %d day.'] = 'Imagens adicionadas a partir do últimos %d dia.';
+$lang['Photos posted within the last %d days.'] = 'Imagens adicionadas a partir dos últimos %d dias';
+$lang['password updated'] = 'senha atualizada';
+$lang['Recent period must be a positive integer value'] = 'O período deve ser um número inteiro positivo';
+$lang['photo'] = 'imagem';
+$lang['Click on the photo to see it in high definition'] = 'Clique na imagem para vê-la em alta definição';
+$lang['Show file metadata'] = 'Mostrar os metadados do arquivo.';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Preferências';
+$lang['Previous'] = 'Página anterior';
+$lang['Random photos'] = 'Imagens aleatórias';
+$lang['display a set of random photos'] = 'exibir um grupo aleatório de imagens';
+$lang['Recent albums'] = 'Categorias recentes';
+$lang['display recently updated albums'] = 'Exibir categorias atualizadas recentemente.';
+$lang['Recent period'] = 'Período recente';  
+$lang['Recent photos'] = 'Imagens recentes';
+$lang['display most recent photos'] = 'Mostrar as imagens mais recentes';
+$lang['Redirection...'] = 'Redirecionamento...';
+$lang['Please, enter a login'] = 'Por favor, entre com um nome de usuário';
+$lang['login mustn\'t end with a space character'] = 'O nome de usuário não deve terminar com um espaço';
+$lang['login mustn\'t start with a space character'] = 'O nome de usuário não deve começar com um espaço';
+$lang['this login is already used'] = 'Este nome de usuário já existe';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'O formato do email deve ser do tipo: xxx@yyy.eee (exemplo : jack@altern.org)';
+$lang['please enter your password again'] = 'Por favor, digite sua senha novamente';
+$lang['Auto login'] = 'Auto login (conexão automática)';
+$lang['remove this tag from the list'] = 'remover esta tag da lista';
+$lang['representative'] = 'representante';
+$lang['Search for Author'] = 'Pesquisar por autor';
+$lang['Search in albums'] = 'Pesquisar nas categorias';
+$lang['Search by date'] = 'Pesquisar por data';
+$lang['Date'] = 'Data';
+$lang['End-Date'] = 'Data final';
+$lang['Kind of date'] = 'Tipo de data';
+$lang['Search for words'] = 'Pesquisar por palavras';
+$lang['Search for all terms'] = 'Pesquisar todos os termos';
+$lang['Search for any term'] = 'Pesquisar qualquer um dos termos';
+$lang['Empty query. No criteria has been entered.'] = 'Pesquisa vazia. Nenhum critério fornecido.';
+$lang['Search results'] = 'Resultados da pesquisa';
+$lang['Search in sub-albums'] = 'Pesquisar nas subcategorias';
+$lang['searched words : %s'] = 'Palavras pesquisadas : %s';
+$lang['Contact'] = 'Contactar';
+$lang['set as album representative'] = 'Eleger para representar esta categoria';
+$lang['Show number of comments'] = 'Exibir o número de comentários';
+$lang['Show number of hits'] = 'Exibir o número de vizualisações';
+$lang['slideshow'] = 'Slideshow';
+$lang['stop the slideshow'] = 'interromper o Slideshow';
+$lang['Specials'] = 'Ferramentas';
+$lang['SQL queries in'] = 'Pesquisa SQL em';
+$lang['display only recently posted photos'] = 'exibir apenas as imagens enviadas recentemente';
+$lang['return to the display of all photos'] = 'voltar a exibir todas as imagens';
+$lang['the beginning'] = 'o início';
+$lang['Interface theme'] = 'Tema';
+$lang['Thumbnails'] = 'Miniaturas';
+$lang['Menu'] = 'Menu';
+$lang['A comment on your site'] = 'Um comentário no seu site';
+$lang['today'] = 'hoje';
+$lang['Update your rating'] = 'atualizar nota';
+$lang['the username must be given'] = 'Entre com o nome de usuário';
+$lang['useful when password forgotten'] = 'útil em caso de senha esquecida';
+$lang['Quick search'] = 'Pesquisa Rápida';
+$lang['Connected user: %s'] = 'Usuário conectado: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Navegador: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Comentário: %s';
+$lang['Comment by %s'] = 'Comentário de %s';
+$lang['User: %s'] = 'Usuário: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Administração: %s';
+$lang['Registration of %s'] = 'Registro de %s';
+$lang['Album: %s'] = 'Categoria: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status ruim para o usuário "guest", será usado status padrão. Por favor, avise o administrador do site.';
+$lang['this email address is already in use'] = 'um outro usuário já utiliza este email';
+$lang['Album results for'] = 'Resultados da categoria para';
+$lang['Tag results for'] = 'Resultados da tag para';
+$lang['from %s to %s'] = 'de %s ao %s';
+$lang['Play of slideshow'] = 'Iniciar o Slideshow';
+$lang['Pause of slideshow'] = 'Parar o Slideshow';
+$lang['Repeat the slideshow'] = 'Repetir o Slideshow';
+$lang['Not repeat the slideshow'] = 'Não repetir o Slideshow';
+$lang['Reduce diaporama speed'] = 'Diminuir a velocidade do Slideshow';
+$lang['Accelerate diaporama speed'] = 'Aumentar a velocidade do Slideshow';
+$lang['Submit'] = 'Ok';
+$lang['Yes'] = 'Sim';
+$lang['No'] = 'Não';
+$lang['%d photo']='%d imagem';
+$lang['%d photos']='%d imagens';
+$lang['%d photo is also linked to current tags'] = '%d imagem está também ligada às tags correntes';
+$lang['%d photos are also linked to current tags'] = '%d imagens estão também ligadas às tags correntes';
+$lang['display photos linked to this tag'] = 'Ver as imagens ligadas apenas a esta tag';
+$lang['photos posted during the last %d days'] = 'imagens enviadas durante os últimos %d dias';
+$lang['Piwigo Help'] = 'Piwigo Help';
+$lang['Rank'] = 'Fila (Rank)';
+$lang['group by letters'] = 'agrupar por letras';
+$lang['letters'] = 'letras';
+$lang['show tag cloud'] = 'mostar a nuvem de tags';
+$lang['cloud'] = 'nuvem';
+$lang['Are you sure?'] = 'Você tem certeza?';
+$lang['%d rates'] = '%d taxas';
+$lang['(!) This comment requires validation'] = '(!) Este comentário necessita validação';
+$lang['... or browse your empty gallery'] = '... ou procure sua galeria vazia';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ou, por favor, desative esta mensagem, encontrarei minha maneira por mim mesmo';
+$lang['Change my password'] = 'Alterar minha senha';
+$lang['Check your email for the confirmation link'] = 'Verifique em seu email o link de confirmação';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies estão bloqueados ou não são suportados pelo seu navegador. Você deve ativar os cookies para entrar no sistema.';
+$lang['delete all photos from your favorites'] = 'Exclua todas as fotos do seu Favoritos';
+$lang['Edit a comment'] = 'Editar um comentário';
+$lang['Edit'] = 'Editar';
+$lang['Enter your new password below.'] = 'Insira sua nova senha abaixo.';
+$lang['EXIF Metadata'] = 'Metadados EXIF';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Olá %s, sua galeria de fotos Piwigo está vazia!';
+$lang['Hello %s,'] = 'Olá %s,';
+$lang['html tags are not allowed in login'] = 'etiquetas html não são permitidas na autenticação';
+$lang['I want to add photos'] = 'Eu quero inserir fotos';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se isto foi um engano, apenas ignore esta mensagem e nada acontecerá.';
+$lang['Invalid key'] = 'Chave inválida';
+$lang['Invalid username or email'] = 'Nome de usuário ou email inválido';
+$lang['IPTC Metadata'] = 'Metadados IPTC';
+$lang['Manage this user comment: %s'] = 'Gerenciar o comentário deste usuário: %s';
+$lang['Password reset is not allowed for this user'] = 'Não é permitido a este usuário redefinir senha';
+$lang['Password Reset'] = 'Redefinir senha';
+$lang['Please enter your username or email address.'] = 'Por favor, insira seu nome de usuário ou email.';
+$lang['Rating score'] = 'Avaliação';
+$lang['Reset to default values'] = 'Voltar aos valores padrão';
+$lang['Return to home page'] = 'Voltar à página inicial';
+$lang['Sent by'] = 'Enviado por';
+$lang['Send my connection settings by email'] = 'Enviar minhas configurações de conexão por email';
+$lang['Show oldest comments first'] = 'Mostrar comentários antigos primeiro';
+$lang['Show latest comments first'] = 'Mostrar comentários recentes primeiro';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Alguém solicitou que a senha do seguinte usuário seja redefinida:';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrado com sucesso. Em breve você receberá um email com suas configurações de conexão. Bem-vindo!';
+$lang['The passwords do not match'] = 'As senhas não combinam';
+$lang['This author modified following comment:'] = 'Este autor alterou o seguinte comentário:';
+$lang['This author removed the comment with id %d'] = 'Este autor removeu o comentário com id %d';
+$lang['To reset your password, visit the following address:'] = 'Para redefinir sua senha, visite o seguinte endereço:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'O usuário "%s" não possui endereço de email, não é possível redefinir a senha';
+$lang['Username "%s" on gallery %s'] = 'Nome de usuário "%s" na galeria %s';
+$lang['Username or email'] = 'Nome de usuário ou email';
+$lang['Username modification'] = 'Alteração do nome de usuário';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bem-vindo à sua galeria de fotos Piwigo!';
+$lang['Welcome'] = 'Bem-vindo';
+$lang['You will receive a link to create a new password via email.'] = 'Você receberá, via email, um link para criar uma nova senha.';
+$lang['Your username has been successfully changed to : %s'] = 'Seu nome de usuário foi alterado com sucesso para: %s';
+$lang['Your password has been reset'] = 'Sua senha foi redefinida';
+$lang['square'] = 'quadrado';
+$lang['thumb'] = 'miniatura';
+$lang['2small'] = 'XXS - minúscula';
+$lang['xsmall'] = 'XS - extra pequeno';
+$lang['small'] = 'S - pequeno';
+$lang['medium'] = 'M - médio';
+$lang['large'] = 'L - grande';
+$lang['xlarge'] = 'XL - extra grande';
+$lang['xxlarge'] = 'XXL - enorme';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Obrigado por registrar-se em %s!';
+$lang['Here are your connection settings'] = 'Aqui estão suas configurações de conexão';
+$lang['Password: %s'] = 'Senha: %s';
+$lang['Username: %s'] = 'Nome de usuário: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Se você acha que recebeu este email por engano, por favor nos contacte em %s';
+$lang['Photo sizes'] = 'Tamanhos da foto';
+$lang['View in'] = 'Ver em';
+$lang['Mobile'] = 'Móvel';
+$lang['Desktop'] = 'Área de trabalho';
+$lang['File name, A &rarr; Z'] = 'Nome do arquivo, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nome do arquivo, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Título da foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Título da foto, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Data de criação, nova &rarr; antiga';
+$lang['Date created, old &rarr; new'] = 'Data de criação, antiga &rarr; nova';
+$lang['Date posted, new &rarr; old'] = 'Data de publicação, nova &rarr; antiga';
+$lang['Date posted, old &rarr; new'] = 'Data de publicação, antiga &rarr; nova';
+$lang['Rating score, high &rarr; low'] = 'Avaliação, alta &rarr; baixa';
+$lang['Rating score, low &rarr; high'] = 'Avaliação, baixa &rarr; alta';
+$lang['Visits, high &rarr; low'] = 'Visitas, alta &rarr; baixa';
+$lang['Visits, low &rarr; high'] = 'Visitas, baixa &rarr; alta';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identificador numérico, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identificador numérico, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Ordem de classificação manual';
+
+?>
Index: tags/2.4.0RC3/language/pt_BR/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Os grupos são uma maneira conveniente de configurar permissões para uma lista de usuários.</p>
+
+<p>Crie grupos em <span class="pwgScreen">Administração &raquo; Usuários &raquo; Grupos</span> e associe usuários para este grupo em <span class="pwgScreen">Administração &raquo; Usuários &raquo; Gerenciar</span>.</p>
+
+<p>Um usuário pode pertencer a vários grupos. A autorização é mais forte do que a proibição : se o usuário "jack" pertence aos grupos "família" e "amigos", e apenas o grupo "família" pode ver a categoria "Natal 2003", então "jack" poderá ver "Natal 2003".</p>
+
Index: tags/2.4.0RC3/language/pt_BR/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/help/help_misc.html	(revision 14585)
@@ -0,0 +1,4 @@
+<p>Assim que você tiver criado sua galeria, modifique as propriedades padrão em <span class="pwgScreen">Administração &raquo; Configuração &raquo; Opções &raquo; Guest Settings</span>. Todo usuário novo registrado usará estas opções de configuração padrão.</p>
+
+<p>Se você tiver qualquer pergunta, a comunidade Piwigo lhe receberá de braços abertos em <a href="http://piwigo.org/forum">seu forum</a>.</p>
+
Index: tags/2.4.0RC3/language/pt_BR/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,12 @@
+<p>Você pode proibir o acesso às categorias. Altere o modo de acesso à categoria para "privado" se você quiser gerenciar permissões.</p>
+
+<p>Você pode tornar uma categoria privada simplesmente editando uma categoria (<span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar &raquo; editar</span>) ou alterando as opções em toda a árvore da categoria (<span class="pwgScreen">Administração &raquo; Categorias &raquo; Propriedades &raquo; Publico / Privado</span>).</p>
+
+<p>Uma vez que a categoria esteja como privada, você pode gerenciar as permissões para grupos e usuários com 3 telas:</p>
+
+<ul>
+  <li><span class="pwgScreen">Administração &raquo; Usuários &raquo; Gerenciar &raquo; ação das permissões</span> (um link por usuário)</li>
+  <li><span class="pwgScreen">Administração &raquo; Usuários &raquo; Grupos &raquo; ação das permissões</span> (um link por grupo)</li>
+  <li><span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar &raquo; editar ação das permissões da categoria</span> (um link por categoria)</li>
+</ul>
+
Index: tags/2.4.0RC3/language/pt_BR/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>As fotos são mostradas na categoria correspondente are displayed in the category corresponding to the file directory.</p>
+
+<p>Você também pode mostrar uma imagem em várias categorias, sem a necessidade de duplicar o arquivo em seu servidor. Associe a imagem a qualquer categoria na tela de edição de foto (que qualquer administrador pode ter acesso da página de foto na galeria).</p>
+
+<p>Categorias virtuais são baseadas neste conceito: elas não tem diretório correspondente. Crie categorias virtuais através da <span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar</span>.</p>
+
Index: tags/2.4.0RC3/language/pt_BR/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/pt_BR/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,106 @@
+<fieldset>
+  <legend>Início Rápido</legend>
+
+<ol>
+  <li>Crie um diretório no seu computador.</li>  
+
+  <li>Copie algumas fotos para esse diretório, altere o tamanho delas para serem exibidas na rede. <em>Cuidado</em>: o nome dos diretórios e dos arquivos devem conter apenas letras, números, "-", "_" ou ".". Não use espaço em branco, e nem caracteres acentuados.</li>
+
+  <li>Com a ajuda de um programa de FTP, copie o seu diretório para o diretório "galleries" da sua instalação Piwigo.</li>
+
+  <li>Faça o login na sua galeria e vá até <span class="pwgScreen">Administração &raquo; Imagens &raquo; Miniatruras</span> para criar alguma miniatura que esteja faltando.</li>
+
+  <li>Vá até <span class="pwgScreen">Administração</span> e clique no grande botão escrito "Sincronização".</li>
+</ol>
+
+<p>Parabéns! Você acabou de criar a primeira categoria da sua galeria de fotos.</p>
+
+</fieldset>
+<fieldset>
+  <legend>Organização de diretórios e arquivos</legend>
+<ul>
+
+  <li>
+
+    <p>Os diretórios das categorias estão no diretório "galleries" no Piwigo. Segue aqui a árvore de diretórios de uma pequena galeria (mas
+    usando muitos recursos) :</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>Cada diretório sob "galleries" produz uma categoria. Não há limite de profundidade.</li>
+
+  <li>Basicamente, um item é representado por um arquivo. Um arquivo pode ser um
+  iten Piwigo se sua extensão estiver entre as possibilidades dos parâmetros de configuração <code>file_ext</code> (veja o arquivo <span
+  class="filename">include/config_default.inc.php</span> ). Um arquivo pode
+  ser uma imagem se a sua extensão estiver entre as possibilidades dos parâmetros de configuração <code>picture_ext</code>.</li>
+
+  <li>Os itens fotográficos devem ter uma miniatura associada (veja a seção abaixo
+  sobre miniaturas)</li>
+
+  <li>Os itens fotográficos podem ter um arquivo de alta definição associado. Assim como para
+  wedding.jpg no exemplo acima. Não use prefixo nas imagens de alta definição.</li>
+
+  <li>Outros itens (video, sons, arquivos de texto, o que você quiser...) são
+  por padrão representados por um ícone correspondente à extensão do nome de arquivo. Você tem a opção de associar uma miniatura e um arquivo representativo (veja video.avi no exemplo acima).</li>
+
+  <li><em>Atenção</em>: o nome dos diretórios e dos arquivos devem conter apenas letras, números, "-", "_" ou ".". Não use espaço em branco e nem caracteres acentuados.</li>
+
+  <li>Uma vez que os arquivos, as miniaturas e representativos estiverem corretamente alocados nos diretórios,
+  vá até : <span class="pwgScreen">Administração &raquo; Categorias &raquo;
+  Sincronizar</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Miniaturas (Thumbnails)</legend>
+<ul>
+
+  <li>Cada foto deve ter a sua miniatura.</li>
+
+  <li>As miniaturas estão armazenadas no subdiretório "thumbnail" no diretório das categorias. 
+      A miniatura tem o mesmo nome de arquivo que a foto correspondente, com <em>TN-</em> como prefixo.</li>
+
+  <li><em>Aviso</em>: use um módulo externo para a criação das miniaturas.</li>
+
+  <li>Even if it is not recommended (qualidade da imagem, carregamento do servidor, etc), você pode usar a página<span>
+  class="pwgScreen">Administração &raquo; Imagens &raquo; Miniaturas</span> para criar as miniaturas.</li>
+
+  <li>Dê acesso de escrita para todos os diretórios das categorias.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/pt_BR/index.php
===================================================================
--- tags/2.4.0RC3/language/pt_BR/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/pt_BR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_BR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/install.lang.php	(revision 14585)
@@ -0,0 +1,68 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Instalação';
+$lang['Basic configuration'] = 'Configuração Básica';
+$lang['Default gallery language'] = 'Idioma padrão da galeria';
+$lang['Database configuration'] = 'Configuração da base de dados';
+$lang['Admin configuration'] = 'Configuração da administração';
+$lang['Start Install'] = 'Iniciar a instalação';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'o endereço de email deve ser do tipo xxx@yyy.eee (exemplo : jack@altern.org)';
+
+$lang['Webmaster login'] = 'Login do Webmaster';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Será mostrado aos visitantes. É necessário para a administração do website';
+
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A conexão com o servidor foi bem sucedida, porém não foi possível se conectar à base de dados';
+$lang['Can\'t connect to server'] = 'Não foi possível se conectar ao servidor';
+
+$lang['Host'] = 'MySQL host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Usuário';
+$lang['user login given by your host provider'] = 'login de usuário fornecido pelo seu provedor de hospedagem';
+$lang['Password'] = 'Senha';
+$lang['user password given by your host provider'] = 'senha de usuário fornecida pelo seu provedor de hospedagem';
+$lang['Database name'] = 'Nome da base de dados';
+$lang['also given by your host provider'] = 'também forncido pelo seu provedor de hospedagem';
+$lang['Database table prefix'] = 'Prefixo da tabela da base de dado';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'Os nomes das tabelas da base de dados terão este prefixo (isto possibilita que você gerencie melhor suas tabelas)';
+$lang['enter a login for webmaster'] = 'entre um login para o webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'o login do webmaster não pode conter os caracteres \' ou "';
+$lang['please enter your password again'] = 'por favor, entre com a sua senha novamente';
+$lang['Webmaster password'] = 'senha do Webmaster';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'mantenha-a bem guardada, é ela que lhe permite acessar o painel da administração';
+$lang['Password [confirm]'] = 'Senha [confirmar]';
+$lang['verification'] = 'verificação';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Precisa de ajuda ? Faça a sua pergunta no <a href="%s">Piwigo message board</a>.';
+$lang['Webmaster mail address'] = 'endereço de email do Webmaster';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Os visitantes poderão entrar em contato com o administrador do site através desse email';
+
+$lang['PHP 5 is required'] = 'É necessário PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Parece que a sua hospedagem está atualmente usando PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo pode tentar mudar sua configuração para PHP 5 através da criação ou modificação de um arquivo .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Note que você pode alterar sua configuração por conta própria e reiniciar o Piwigo depois disso.';
+$lang['Try to configure PHP 5'] = 'Tentar configurar PHP 5';
+$lang['Sorry!'] = 'Lamento!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo não teve condições de configurar o PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Você deve entrar em contato com o suporte do seu provedor e ver como você poderia mudar para PHP 5 por conta própria.";
+$lang['Hope to see you back soon.'] = 'Espero te ver de volta em breve.';
+?>
Index: tags/2.4.0RC3/language/pt_BR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/pt_BR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Brasil [BR]
Index: tags/2.4.0RC3/language/pt_BR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_BR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_BR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Upgrade';
+$lang['Upgrade from version %s to %s'] = 'Atualizar da versão %s para a %s';
+$lang['Statistics'] = 'Estatísticas';
+$lang['total upgrade time'] = 'tempo total do upgrade';
+$lang['total SQL time'] = 'tempo total do SQL';
+$lang['SQL queries'] = 'Consultas SQL';
+$lang['Upgrade informations'] = 'Informações do upgrade';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Executa uma avaliação de rotina em [Administração>Tools>Manutenção] se você encontrar algum problema.';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaução, os seguintes plugins foram desativados. Você deve checar por atualizações dos plugins antes de reativá-los:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Apenas administrador pode realizar o upgrade: por favor, faça o login logo abaixo.';
+$lang['You do not have access rights to run upgrade'] = 'Você não tem permissões de acesso para realizar o upgrade';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Em <i>%s</i>, antes de <b>?></b>, insira:';
+// Upgrade informations from upgrade_1.3.1.php
+$lang['All sub-albums of private albums become private'] = 'All sub-categories of private categories become private';
+$lang['User permissions and group permissions have been erased'] = 'Permissões de usuário e de grupo foram apagadas.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Apenas o prefixo das miniaturas (thumbnails) e o endereço de email do webmaster foram salvos da configuração anterior.';
+
+//For version 2.1.0
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "This page proposes to upgrade the database from your Piwigo old version to the new version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).";
+?>
Index: tags/2.4.0RC3/language/pt_PT/about.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+  <li>Piwigo é uma aplicação web que permite a criação de uma galeria de imagens na internet.</li>
+
+  <li>Piwigo é desenvolvido em PHP com uma base de dados MySQL.</li>
+
+  <li>Se tiver sugestões ou comentários, visite o <a href="http://piwigo.org">sítio oficial</a> e o <a href="http://piwigo.org/forum">fórum Piwigo</a>.</li>
+
+  <p>The Portuguese translation is maintained by (in alphabetical order):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=2588">alahel76</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=16447">klito</a></li>
+<li><a href="http://piwigo.org/forum/profile.php?id=12768">PsyKick_RuhYn</a></li>
+</ul>
+.... Many thanks to you</p> 
Index: tags/2.4.0RC3/language/pt_PT/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_PT/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/admin.lang.php	(revision 14585)
@@ -0,0 +1,897 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d associação';
+$lang['%d associations'] = '%d associações';
+$lang['%d album including'] = '%d do album incluído ';
+$lang['%d albums including'] = '%d albums incluídos ';
+$lang['%d physical'] = '%d físico';
+$lang['%d physical'] = '%d físicos';
+$lang[' and %d virtual'] = ' e %d virtual';
+$lang[' and %d virtual'] = ' e %d virtuais';
+$lang['%d album moved'] = '%do album movido';
+$lang['%d albums moved'] = '%d albums movidos';
+$lang['%d group'] = '%d grupo';
+$lang['%d groups'] = '%d grupos';
+$lang['%d member'] = '%d membro';
+$lang['%d members'] = '%d membros';
+$lang['%d tag'] = '%d etiqueta';
+$lang['%d tags'] = '%d etiquetas';
+$lang['%d user comment rejected'] = '%d comentário de utilizador rejeitado';
+$lang['%d user comments rejected'] = '%d comentários de utilizador rejeitados';
+$lang['%d user comment validated'] = '%d comentário de utilizador aprovado';
+$lang['%d user comments validated'] = '%d comentários de utilizador aprovados';
+$lang['%d user deleted'] = '%d utilizador apagado';
+$lang['%d users deleted'] = '%d utilizadores apagados';
+$lang['%d user'] = '%d utilizador';
+$lang['%d users'] = '%d utilizadores';
+$lang['%d waiting for validation'] = '%d a aguardar aprovação';
+$lang['Actions'] = 'Acções';
+$lang['Activate'] = 'Activar';
+$lang['Add/delete a permalink'] = 'Adicionar/apagar um link';
+$lang['Add a tag'] = 'Adicionar uma etiqueta';
+$lang['Add a user'] = 'Adicionar um utilizador';
+$lang['Add group'] = 'Adicionar um grupo';
+$lang['Add'] = 'Adicionar';
+$lang['Allow user registration'] = 'Permitir o registo de utilizadores';
+$lang['Apply to sub-albums'] = 'Aplicar aos sub-álbums';
+$lang['Associated'] = 'Associados(as)';
+$lang['Caddie management'] = 'Gestão do carrinho';
+$lang['Caddie'] = 'Carrinho';
+$lang['Albums authorized thanks to group associations'] = 'Álbums autorizados graças a associações de grupo';
+$lang['Album manual order was saved'] = 'A ordem manual das álbums foi salva';
+$lang['Check for upgrade failed for unknown reasons.'] = 'A procura de actualizações falhou por razões desconhecidas.';
+$lang['Check for upgrade'] = 'procurar por actualizações';
+$lang['Comments for all'] = 'Comentários para todos';
+$lang['Current name'] = 'Nome actual';
+$lang['Database'] = 'Base de dados';
+$lang['Deactivate'] = 'Desactivar';
+$lang['Delete Representant'] = 'Apagar capa de álbum';
+$lang['Delete selected tags'] = 'Apagar etiquetas selecionadas';
+$lang['Delete selected users'] = 'Apagar utilizadores selecionados';
+$lang['Deletions'] = 'Items apagados';
+$lang['Deny selected groups'] = 'Negar os grupos selecionados';
+$lang['Deny selected users'] = 'Negar utilizadores selecionados';
+$lang['Description'] = 'Descrição';
+$lang['Display options'] = 'Mostrar opções';
+$lang['Dissociated'] = 'Desassociados';
+$lang['Does not represent'] = 'Não representa';
+$lang['Edit selected tags'] = 'Editar etiquetas selecionadas';
+$lang['Edit tags'] = 'Editar etiquetas';
+$lang['Email admins when a new user registers'] = 'Notificar os administradores quando um novo utilizador se registar';
+$lang['Email admins when a valid comment is entered'] = 'Notificar os administradores quando um comentário aprovado for incluído';
+$lang['Email admins when a comment requires validation'] = 'Notificar os administradores quando um comentário necessitar de aprovação';
+$lang['Environment'] = 'Ambiente';
+$lang['Form'] = 'Formulário';
+$lang['Gallery title'] = 'Título da galeria';
+$lang['Grant selected groups'] = 'Permitir os grupos selecionados';
+$lang['Grant selected users'] = 'Permitir os utilizadores selecionados';
+$lang['Group name'] = 'Nome do grupo';
+$lang['Groups'] = 'Grupos';
+$lang['Guests'] = 'Visitantes';
+$lang['History'] = 'Histórico';
+$lang['Informations'] = 'Informações';
+$lang['Install'] = 'Instalar';
+$lang['Link all album photos to a new album'] = 'Vincular todos os items do álbum a um novo álbum';
+$lang['Link all album photos to some existing albums'] = 'Vincular todos os items do álbum a um álbum já existente';
+$lang['Linked albums'] = 'Álbums vinculados';
+$lang['Lock gallery'] = 'Trancar a  galeria';
+$lang['Maintenance'] = 'Manutenção';
+$lang['Edit album permissions'] = 'Gerir permissões do álbum';
+$lang['Manage permissions for group "%s"'] = 'Gerir permissões do grupo "%s"';
+$lang['Manage permissions for user "%s"'] = 'Gerir permissões do utilizador "%s"';
+$lang['Manage tags'] = 'Gerir etiquetas';
+$lang['Members'] = 'Membros';
+$lang['Metadata synchronized from file'] = 'Metadados sincronizados do ficheiro';
+$lang['Move albums'] = 'Mover álbums';
+$lang['Move'] = 'Mover';
+$lang['Name'] = 'Nome';
+$lang['New name'] = 'Novo nome';
+$lang['New parent album'] = 'Novo álbum pai';
+$lang['New tag'] = 'Etiqueta nova';
+$lang['Number of comments per page'] = 'Número de comentários por página';
+$lang['Number of rates'] = 'Número de votos';
+$lang['Number of thumbnails to create'] = 'Número de miniaturas a serem criadas';
+$lang['Only private albums are listed'] = 'Apenas os álbums privados estão listados';
+$lang['Operating system'] = 'Sistema operativo';
+$lang['Options'] = 'Opções';
+$lang['Other private albums'] = 'Outros álbums privados';
+$lang['Page banner'] = 'Cabeçalho de página';
+$lang['Parent album'] = 'Álbum pai';
+$lang['Path'] = 'Caminho';
+$lang['Permalink'] = 'Ligação Permanente';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'A Ligação Permanente %s já está a ser usada pelo álbum %s. Apague-o do histórico de ligações permanentes primeiro';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'A Ligação Permanente deve ser composta de a-z, A-Z, 0-9, "-", "_" ou "/". Não deve ser numérica ou começar com número seguido de "-"';
+$lang['Permalink %s is already used by album %s'] = 'A Ligação Permanente %s já está a ser usada pelo álbum %s';
+$lang['Permalink history'] = 'Histórico de ligações permanentes';
+$lang['Permalinks'] = 'Ligações Permanentes';
+$lang['Permission denied'] = 'Permissão negada';
+$lang['Permission granted thanks to a group'] = 'Permissão garantida graças ao grupo';
+$lang['Permission granted'] = 'Permissão garantida';
+$lang['Photo informations updated'] = 'Informações da foto actualizadas';
+$lang['Plugins'] = 'Extensões';
+$lang['Position'] = 'Posição';
+$lang['Preferences'] = 'Preferências';
+$lang['Properties'] = 'Propriedades';
+$lang['Random photo'] = 'Foto aleatória';
+$lang['Rate date'] = 'Data da classificação';
+$lang['Rating by guests'] = 'Classificado(a) pelos visitantes';
+$lang['Rating'] = 'Classificação';
+$lang['Reject'] = 'Rejeitar';
+$lang['Representant'] = 'Capa de Álbum';
+$lang['Representation of albums'] = 'Capas dos álbums';
+$lang['Representative'] = 'Capa';
+$lang['Represents'] = 'É capa';
+$lang['Save order'] = 'Salvar ordem';
+$lang['Save to permalink history'] = 'Salvar no histórico de ligações permanentes';
+$lang['Select at least one album'] = 'Seleccionar pelo menos um álbum';
+$lang['Select at least one photo'] = 'Seleccionar pelo menos uma foto';
+$lang['Select at least one user'] = 'Seleccionar pelo menos um utilizador';
+$lang['Show info'] = 'Mostrar informação';
+$lang['Site manager'] = 'Gerir a galeria';
+$lang['Status'] = 'Estatuto';
+$lang['Statistics'] = 'Estatísticas';
+$lang['Storage album'] = 'Armazenagem de álbum';
+$lang['Sum of rates'] = 'Soma das classificações';
+$lang['Tag "%s" already exists'] = 'A etiqueta "%s" já existe';
+$lang['Tag "%s" was added'] = 'A etiqueta "%s" foi adicionada';
+$lang['Tag selection'] = 'Seleção de etiqueta';
+$lang['The %d following tags were deleted'] = 'As %d etiquetas seguintes foram apagadas';
+$lang['Unable to check for upgrade.'] = 'Não foi possível procurar actualizações.';
+$lang['Uninstall'] = 'Desinstalar';
+$lang['Use the default photo sort order (defined in the configuration file)']='Usar a ordem de exibição padrão (definida no ficheiro de configuração)';
+$lang['User comments validation'] = 'Aprovação dos comentários de utilizador';
+$lang['Users'] = 'Utilizadores';
+$lang['Validate'] = 'Aprovar';
+$lang['Validation'] = 'Aprovação';
+$lang['Version'] = 'Versão';
+$lang['Virtual albums to move'] = 'Álbums virtuais a serem movidos';
+$lang['Virtual album name'] = 'Nome do álbum virtual';
+$lang['Webmaster cannot be deleted'] = 'O Utilizador Webmaster não pode ser apagado';
+$lang['You are running on development sources, no check possible.'] = 'Você está a usar código fonte de desenvolvimento, nenhuma verificação é possível.';
+$lang['You cannot delete your account'] = "Não pode apagar a sua conta";
+$lang['You cannot move an album in its own sub album'] = 'Não pode mover um álbum para um dos seus sub-álbums.';
+$lang['You need to confirm deletion'] = 'Precisa confirmar a remoção';
+$lang['Associate to album'] = 'Associar ao álbum';
+$lang['associate to group'] = 'Associar ao grupo';
+$lang['Authorized'] = 'Autorizado';
+$lang['Add a virtual album'] = 'Adicionar um álbum virtual';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizar os utilizadores a adicionar comentários nos álbums seleccionados';
+$lang['The name of an album must not be empty'] = 'O nome de um álbum não deverá ser vazio';
+$lang['Lock albums'] = 'Trancar álbums';
+$lang['Private'] = 'Álbums privados';
+$lang['Public'] = 'Álbums públicas';
+$lang['Find a new representant by random'] = 'Encontrar uma nova capa aleatoriamente';
+$lang['Public / Private'] = 'Público / Privado';
+$lang['Manage authorizations for selected albums'] = 'Gerir as autorizações para os álbums seleccionadas';
+$lang['Virtual album added'] = 'Álbum virtual adicionado';
+$lang['Virtual album deleted'] = 'Álbum virtual apagado';
+$lang['Access type'] = 'Acesso';
+$lang['Information data registered in database'] = 'Dados de informação registados na base de dados';
+$lang['Default display'] = 'Exibição padrão';
+$lang['The gallery URL is not valid.'] = 'O URL (endereço) da galeria não é valido.';
+$lang['Main'] = 'Principal';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'O número de comentários por página deve ser entre 5 e 50 .';
+$lang['Configuration'] = 'Configuração';
+$lang['confirm'] = 'Confirmar';
+$lang['Date'] = 'Data';
+$lang['delete album'] = 'Apagar álbum';
+$lang['Dissociate from album'] = 'Desassociar do álbum';
+$lang['dissociate from group'] = 'Desassociar do grupo';
+$lang['Album updated successfully'] = 'As informações do álbum foram actualizadas com sucesso.';
+$lang['photos per page'] = 'Fotos por página';
+$lang['High definition enabled'] = 'Alta definição activada';
+$lang['File'] = 'Ficheiro';
+$lang['first photo added on %s'] = 'primeira foto adicionada em %s';
+$lang['Forbidden'] = 'Proibido';
+$lang['global mode'] = 'modo global';
+$lang['group "%s" added'] = 'grupo "%s" adicionado';
+$lang['group "%s" deleted'] = 'grupo "%s" apagado';
+$lang['group "%s" updated'] = 'grupo "%s" actualizado';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'O nome de um grupo não deve conter " ou \' ou ser vazio.';
+$lang['This name is already used by another group.'] = 'Este nome já é usado por outro grupo.';
+$lang['High definition'] = 'Alta definição';
+$lang['jump to album'] = 'ir para álbum';
+$lang['jump to photo'] = 'ir para foto';
+$lang['leave'] = 'Manter';
+$lang['Lock'] = 'Trancar';
+$lang['Locked'] = 'Trancado';
+$lang['manage album photos'] = 'Gerir as fotos do álbum';
+$lang['manage sub-albums'] = 'Gerir sub-álbums';
+$lang['Manage'] = 'Gerir';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundo].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'O tempo de execução acabou, tratamento deve ser contínuo [Tempo estimado: %d segundos].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'O tempo disponível para a criação da lista de utilizadores para enviar email é limitado. Outros utilizadores não estão listados.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'O tempo para enviar email é limitado. Outros emails serão desconsiderados.';
+$lang['To send ?'] = 'Enviar ?';
+$lang['Last send'] = 'Enviado pela última vez';
+$lang['email'] = 'e-mail';
+$lang['User'] = 'Utilizador';
+$lang['See you soon,'] = 'Até breve,';
+$lang['Go to'] = 'Ir à(ao) ';
+$lang['Hello'] = 'Olá ';
+$lang['New photos were added'] = 'Novas fotos foram adicionadas ';
+$lang['on'] = ' em ';
+$lang['between'] = 'entre ';
+$lang['and'] = ' e ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'O webmaster subscreveu-o para receber notificações por email.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Você subscreveu as notificações por email.';
+$lang['To subscribe'] = 'Subscrever';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Se encontrar problemas ou tiver qualquer pergunta, por favor envie uma mensagem para ';
+$lang['[NBM] Problems or questions'] = '[Notificação] Problemas ou perguntas';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'O webmaster retirou-o da lista de subscrição para receber notificações por email.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Você saiu da lista de subscrição para receber notificações por email.';
+$lang[', click on'] = ', clique em ';
+$lang['To unsubscribe'] = 'Cancelar subscrição';
+$lang['With blank value, gallery title will be used'] = 'Com valor em branco, o título da galeria será usado';
+$lang['Notification'] = 'Notificação';
+$lang['Error when sending email to %s [%s].'] = 'Erro ao enviar email para %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Email enviado para %s [%s].';
+$lang['%d mail was sent.'] = '%d email foi enviado.';
+$lang['%d mails were sent.'] = '%d emails foram enviados.';
+$lang['%d mail was not sent.'] = '%d email não foi enviado.';
+$lang['%d mails were not sent.'] = '%d emails não foram enviados.';
+$lang['No mail to send.'] = 'Nenhum email para enviar.';
+$lang['There is no available subscribers to mail.'] = 'Não existem subscritores para enviar email.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Subscritores apenas poderão ser listados quando existirem novos items para notificar.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Em todo caso, apenas webmasters podem ver este separador e nunca administradores.';
+$lang['No user to send notifications by mail.'] = 'Nenhum utilizador para enviar notificações por email.';
+$lang['New photos added'] = 'Novas fotos adicionados';
+$lang['Subscribe to notification by mail'] = 'Subscrever as notificações por email';
+$lang['Unsubscribe from notification by mail'] = 'Cancelar a subscrição das notificações por email';
+$lang['Parameter'] = 'Parâmetro';
+$lang['Continue processing treatment'] = 'Continuar a processar tratamento';
+$lang['Complementary mail content'] = 'Conteúdo complementar da correspondência';
+$lang['Add detailed content'] = 'Adicionar conteúdo detalhado';
+$lang['Send mail as'] = 'Enviar email como';
+$lang['Send mail to users'] = 'Enviar email aos utilizadores';
+$lang['Send'] = 'Enviar';
+$lang['Options'] = 'Opções';
+$lang['Subscribed'] = 'Subscritos';
+$lang['Subscribe'] = 'Subscrever';
+$lang['Parameters'] = 'Parâmetros';
+$lang['Select recipients'] = 'Selecionar os destinatários';
+$lang['Subscribe/unsubscribe users'] = 'Assinar/Cancelar Subscrição dos utilizadores';
+$lang['Unsubscribed'] = 'Subscrição Cancelada';
+$lang['%d parameter was updated.'] = '%d parâmetro foi actualizado.';
+$lang['%d parameters were updated.'] = '%d parâmetros foram actualizados.';
+$lang['%d user was not updated.'] = '%d utilizador não foi actualizado.';
+$lang['%d users were not updated.'] = '%d utilizadores não foram actualizados.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Utilizador %s [%s] foi removido da lista de subscritores.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Utilizador %s [%s] foi adicionado na lista de subscritores.';
+$lang['%d user was updated.'] = '%d utilizador foi actualizado.';
+$lang['%d users were updated.'] = '%d utilizadores foram actualizados.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Utilizador %s [%s] não foi removido da lista de subscritores.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Utilizador %s [%s] não foi adicionado na lista de subscritores.';
+$lang['User %s [%s] added.'] = 'Utilizador %s [%s] adicionado.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Aviso: activando ou cancelando a subscrição enviará correspondência aos utilizadores';
+$lang['Send mail on HTML format'] = 'Enviar a correspondência no formato HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Incluír a exibição do grupo das fotos recentes por datas';
+$lang['Available only with HTML format'] = 'Disponível apenas com o formato HTML';
+$lang['no write access'] = 'Sem acesso de escrita';
+$lang['Permissions'] = 'Permissões';
+$lang['private'] = 'Privado';
+$lang['public'] = 'Público';
+$lang['Purge never used notification feeds'] = 'Limpar as notificações que nunca foram enviadas';
+$lang['Purge sessions'] = 'Limpar as sessões';
+$lang['randomly represented'] = 'aleatoriamente representado';
+$lang['registration date'] = 'data de registo';
+$lang['clean'] = 'limpar';
+$lang['Create this site'] = 'Criar este site';
+$lang['test'] = 'testar';
+$lang['test this remote site'] = 'testar este site remoto';
+$lang['remove tags'] = 'remover etiquetas';
+$lang['Repair and optimize database'] = 'Reparar e optimizar a base de dados';
+$lang['selection'] = 'selecção';
+$lang['set to'] = 'definir para';
+$lang['singly represented'] = 'unicamente representado';
+$lang['This site already exists'] = 'Este site já existe';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Criar um site novo : (dê seu URL para create_listing_file.php)';
+$lang['created'] = 'criado';
+$lang['delete'] = 'apagar';
+$lang['delete this site and all its attached elements'] = 'apagar este site e todos os elementos associados a ele';
+$lang['deleted'] = 'apagado';
+$lang['an error happened'] = 'aconteceu um erro';
+$lang['Local'] = 'Local';
+$lang['Remote'] = 'Remoto';
+$lang['update the database from files'] = 'usar os ficheiros para atualizar a base de dados';
+$lang['status'] = 'estado';
+$lang['Directory'] = 'Pasta';
+$lang['sub-albums'] = 'sub-álbums';
+$lang['Synchronize metadata'] = 'sincronizar meta-dados';
+$lang['target'] = 'alvo';
+$lang['Thumbnail'] = 'Miniatura';
+$lang['title'] = 'título';
+$lang['Album list management'] = 'Gerir lista álbums';
+$lang['Piwigo configuration'] = 'Configuração Piwigo';
+$lang['Edit album'] = 'Editar um álbum';
+$lang['Group management'] = 'Gestão de grupos';
+$lang['User list'] = 'Lista de utilizadores';
+$lang['Edit photo information'] = 'Modificar informações sobre uma foto';
+$lang['Database synchronization with files'] = 'Sincronização da base de dados com os ficheiros';
+$lang['all'] = 'tudo';
+$lang['height must be a number superior to'] = 'altura deve ser um número superior a';
+$lang['width must be a number superior to'] = 'largura deve ser um número superior a';
+$lang['for the file format'] = 'para o formato de ficheiro';
+$lang['Photo unreachable or no support'] = 'Foto não alcançável ou sem suporte';
+$lang['GD version'] = 'versão GD';
+$lang['General statistics'] = 'Estatísticas gerais';
+$lang['average time'] = 'tempo médio';
+$lang['number of miniaturized photos'] = 'número de fotos miniaturizadas';
+$lang['total time'] = 'tempo total';
+$lang['for this file format'] = 'para este formato de ficheiro';
+$lang['unit mode'] = 'modo unitário';
+$lang['Unlocked'] = 'Destrancado';
+$lang['unset'] = 'não definido';
+$lang['Update albums informations'] = 'Atualizar as informações dos álbums';
+$lang['Update photos information'] = 'Atualizar as informações das fotos';
+$lang['Synchronize'] = 'Sincronizar';
+$lang['reduce to single existing albums'] = 'reduzir os álbums existentes em apenas um';
+$lang['Choose an option'] = 'Escolher uma opção';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'exibir o máximo de informações (álbums e fotos adicionados, álbums e fotos apagados)';
+$lang['Error list'] = 'Lista de erros';
+$lang['Errors caption'] = 'Captura de erros';
+$lang['Detailed informations'] = 'Informações detalhadas';
+$lang['File/directory read error'] = 'Erro de leitura em ficheiro/pasta';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'O ficheiro ou pasta não pode ser acedido (ou ele não existe ou o acesso foi negado)';
+$lang['albums deleted in the database'] = 'álbums apagados da base de dados';
+$lang['photos deleted from the database'] = 'fotos apagadas da base de dados';
+$lang['photos candidates for metadata synchronization'] = 'fotos candidatas para a sincronização de meta-dados';
+$lang['photos informations synchronized with files metadata'] = 'as informações das fotos foram sincronizados com os meta-dados dos ficheiros';
+$lang['errors during synchronization'] = 'erros durante a sincronização';
+$lang['albums added in the database'] = 'álbums adicionados à base de dados';
+$lang['photos added in the database'] = 'fotos adicionadas à base de dados';
+$lang['photos updated in the database'] = 'fotos actualizadas na base de dados';
+$lang['Search for new images in the directories'] = 'Pesquisar novas fotos nas pastas';
+$lang['added'] = 'adicionado(a)';
+$lang['deleted'] = 'apagado(a)';
+$lang['Metadata synchronization results'] = 'Resultados da sincronização de meta-dados';
+$lang['only perform a simulation (no change in database will be made)'] = 'apenas executa uma simulação (não será feita alteração alguma na base de dados)';
+$lang['directories + files'] = 'pastas + ficheiros';
+$lang['only directories'] = 'apenas pastas';
+$lang['synchronize files structure with database'] = 'sincronizar a estrutura dos ficheiros com a base de dados';
+$lang['synchronize files metadata with database photos informations'] = 'sincronizar os meta-dados dos ficheiros com as informações das fotos na base de dados';
+$lang['even already synchronized photos'] = 'fotos já sincronizadas';
+$lang['Used metadata'] = 'Metadados usados';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'O nome das pastas e dos ficheiros devem ser compostos de letras, números, "-", "_" ou "."';
+$lang['wrong filename'] = 'nome de ficheiro errado';
+$lang['Upload'] = 'Enviar';
+$lang['user "%s" added'] = 'utilizador "% adicionado" ';
+$lang['User status'] = 'Estatuto de utilizador';
+$lang['user_status_admin'] = 'Administrador';
+$lang['user_status_generic'] = 'Genérico';
+$lang['user_status_guest'] = 'Visitante';
+$lang['user_status_normal'] = 'Utilizador';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Álbum virtual';
+$lang['Waiting'] = 'Aguardando';
+$lang['default'] = 'padrão';
+$lang['Toggle \'default group\' property'] = 'Ligar/Desligar \'grupo padrão\' propriedade';
+$lang['Advanced features'] = 'Características principais';
+$lang['Overall'] = 'Sempre';
+$lang['Year'] = 'Ano';
+$lang['Month'] = 'Mês';
+$lang['Day'] = 'Dia';
+$lang['Pages seen'] = 'Páginas vistas';
+$lang['Time'] = 'Tempo';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Elemento';
+$lang['Section'] = 'Secção';
+$lang['An information email was sent to group "%s"'] = 'Um email informativo foi enviado para o grupo "%s';
+$lang['Send an information email to group members'] = 'Enviar um email informativo aos membros do grupo';
+$lang['Group'] = 'Grupo';
+$lang['[%s] Visit album %s'] = '[%s] Venha visitar o álbum %s';
+$lang['Hello,'] = 'Olá,';
+$lang['See you soon.'] = 'Até breve.';
+$lang['Discover album:'] = 'Venha descobrir o álbum:';
+$lang['Mail content'] = 'Conteúdo do email';
+$lang['none'] = 'nenhum';
+$lang['high'] = 'alto';
+$lang['other'] = 'outro';
+$lang['Element type'] = 'Tipo de elemento';
+$lang['Image id'] = 'ID da foto';
+$lang['Summary'] = 'Sumário';
+$lang['%d line filtered'] = '%d linha filtrada';
+$lang['%d lines filtered'] = '%d linhas filtradas';
+$lang['%d guest'] = '%d visitante';
+$lang['%d guests'] = '%d visitantes';
+$lang['Hour'] = 'Hora';
+$lang['guest'] = 'visitante';
+$lang['default values'] = 'valores padrão';
+$lang['Guest cannot be deleted'] = 'Visitante não pode ser apagado';
+$lang['Default user cannot be deleted'] = 'Utilizador padrão não pode ser apagado';
+$lang['Purge history detail'] = 'Limpar detalhes do histórico';
+$lang['Purge history summary'] = 'Limpar sumário do histórico';
+$lang['Check integrity'] = 'Verificar integridade';
+$lang['Anomaly'] = 'Anomalia';
+$lang['Correction'] = 'Correcção';
+$lang['Automatic correction'] = 'Correcção automática';
+$lang['Impossible automatic correction'] = 'Impossível efectuar a correcção automática';
+$lang['Correction applied with success'] = 'A correcção foi aplicada com sucesso';
+$lang['Correction applied with error'] = 'A correcção foi aplicada com erro(s)';
+$lang['%d anomaly has been detected.'] = '%d da anomalia foi detectada.';
+$lang['%d anomalies have been detected.'] = '%d das anomalias foram detectadas.';
+$lang['%d anomaly has been corrected.'] = '%d da anomalia foi corrigida.';
+$lang['%d anomalies have been detected corrected.'] = '%d das anomalias foram detectadas e corrigidas.';
+$lang['%d anomaly has not been corrected.'] = '%d da anomalia não foi corrigida.';
+$lang['%d anomalies have not been corrected.'] = '%d das anomalias não foram corrigidas.';
+$lang['Go to %s or %s for more informations'] = 'Vá ao %s ou %s para mais informações';
+$lang['the forum'] = 'fórum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'o valor %s não está correcto porque exif não é suportado';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s deve ser actualizado para falso no seu ficheiro config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'O utilizador principal "visitante" não existe';
+$lang['Main "guest" user status is incorrect'] = 'O Estatuto de utilizador do "visitante" principal está incorreto';
+$lang['Default user does not exist'] = 'utilizador padrão não existe';
+$lang['Main "webmaster" user does not exist'] = 'O utilizador principal "webmaster" não existe';
+$lang['Main "webmaster" user status is incorrect'] = 'O estatuto do utilizador principal "webmaster" está incorreto';
+$lang['User "%s" created with "%s" like password'] = 'O utilizador "%s" foi criado com "%s" como palavra-passe';
+$lang['Status of user "%s" updated'] = 'Estatuto do utilizador "%s" foi atualizado';
+$lang['add new photos to caddie'] = 'adicionar novos itens ao carrinho';
+$lang['No display'] = 'Não exibir';
+$lang['Classic display'] = 'Exibição clássica';
+$lang['Hoverbox display'] = 'Exibição hoverbox';
+$lang['Mail address is obligatory for all users'] = 'Endereço de email é obrigatório para todos os utilizadores';
+$lang['Minimum privacy level'] = 'Nível de privacidade mínima';
+$lang['Privacy level'] = 'Nível de privacidade';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contactos';
+$lang['Level 2'] = 'Amigos';
+$lang['Level 4'] = 'Família';
+$lang['Level 8'] = 'Administradores';
+$lang['Reinitialize check integrity'] = 'Reiniciar verificação de integridade';
+$lang['Check all'] = 'Marcar tudo';
+$lang['Uncheck all'] = 'Desmarcar tudo';
+$lang['Check automatic corrections'] = 'Verificar correcções automáticas';
+$lang['Apply selected corrections'] = 'Aplicar as correcções seleccionadas';
+$lang['Ignore selected anomalies'] = 'Ignorar as anomalias seleccionadas';
+$lang['Refresh'] = 'Recarregar a página';
+$lang['The anomaly will be ignored until next application version'] = 'A anomalia será ignorada até à próxima versão da aplicação';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'A correcção da anomalia irá cancelar o facto de estar ignorada';
+$lang['%d anomaly has been ignored.'] = '%d da anomalia foi ignorada.';
+$lang['%d anomalies have been ignored.'] = '%d das anomalias foram ignoradas.';
+$lang['Plugins which need upgrade'] = 'Plugins que necessitam atualização (upgrade)';
+$lang['Plugin list'] = 'Lista de plugins';
+$lang['Check for updates'] = 'Procurar atualizações';
+$lang['Other plugins'] = 'Outros plugins';
+$lang['Last revisions'] = 'Últimas revisões';
+$lang['Are you sure you want to delete this plugin?'] = 'Você tem certeza de que você quer apagar este plugin?';
+$lang['Are you sure you want to install this plugin?'] = 'Você tem certeza de que você quer instalar este plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Você tem certeza de que você quer instalar esta atualização? Você deve verificar se esta versão não necessita uma desinstalação.';
+$lang['Plugin has been successfully copied'] = 'Plugin foi copiado com sucesso';
+$lang['You might go to plugin list to install and activate it.'] = 'Você deve ir à lista de plugins para instalar e ativá-lo.';
+$lang['Can\'t create temporary file.'] = 'Não é possível criar ficheiro temporário.';
+$lang['Can\'t download archive.'] = 'Não é possível descarregar ficheiro.';
+$lang['Can\'t read or extract archive.'] = 'Não é possível ler ou extrair ficheiro.';
+$lang['An error occured during extraction (%s).'] = 'Houve um erro durante a extração (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Por favor, verifique as permissões das pastas e subpastas de plugins (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Não foi possível a conexão com o servidor.';
+$lang['Purge compiled templates'] = 'Limpar os modelos compilados';
+$lang['ACCESS_0'] = 'Acesso livre';
+$lang['ACCESS_1'] = 'Acesso a todos';
+$lang['ACCESS_2'] = 'Acesso a subscritores';
+$lang['ACCESS_3'] = 'Acesso a administradores';
+$lang['ACCESS_4'] = 'Acesso a webmasters';
+$lang['ACCESS_5'] = 'Nenhum acesso';
+$lang['Support'] = 'Suporte';
+$lang['Documentation'] = 'Documentação';
+$lang['A new version of Piwigo is available.'] = 'Uma nova versão de Piwigo está disponível.';
+$lang['Piwigo Administration'] = 'Administração Piwigo';
+$lang['Piwigo version'] = 'Versão Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Você está usando a última versão de Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'A versão instalada de %s [%s] não é compatível com a versão requerida [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Você precisa atualizar seu sistema para aproveitar ao máximo a aplicação, do contrário, a aplicação não funcionará completa ou corretamente.';
+$lang['Deleted on'] = 'Apagada em';
+$lang['Last hit'] = 'Último acesso (Last hit)';
+$lang['GD library is missing'] = 'está faltanto a GD library';
+$lang['Templates'] = 'Modelos (Templates)';
+$lang['Extend for templates'] = 'Extensões para modelos (templates)';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Substituição dos modelos originais pelos modelos customizados do subdiretório template-extension';
+$lang['Replacers (customized templates)'] = 'Substitutos (modelos customizados)';
+$lang['Original templates'] = 'Modelos(templates) originais';
+$lang['Optional URL keyword'] = 'palavra chave URL opcional';
+$lang['Templates configuration has been recorded.'] = 'A configuração dos modelos (templates) foram gravadas.';
+$lang['All optimizations have been successfully completed.'] = 'Todas as otimizações foram finalizadas com sucesso.';
+$lang['Optimizations have been completed with some errors.'] = 'As otimizações foram finalizadas com alguns erros.';
+$lang['Modify information'] = 'Modificar informação';
+$lang['nothing'] = 'nada';
+$lang['overrides existing values with empty ones'] = 'sobrepor os valores existentes com valores vazios';
+$lang['Manage photo ranks'] = 'Gerenciar posições (image ranks)';
+$lang['Edit ranks'] = 'Editar posições (ranks)';
+$lang['No photo in this album'] = 'Nenhum elemento nesta álbum';
+$lang['Images manual order was saved'] = 'A ordem manual das fotos foi salva';
+$lang['ranks'] = 'posições (ranks)';
+$lang['Drag to re-order'] = 'Arraste para reordenar';
+$lang['Quick Local Synchronization'] = 'Sincronização<br>Local Rápida';
+$lang['No photo can be deleted'] = 'Nenhuma foto pode ser apagada';
+$lang['Delete selected photos'] = 'Apagar as fotos selecionadas';
+$lang['%d photo was deleted'] = '%d foto foi apagada';
+$lang['%d photos were deleted'] = '%d fotos foram apagadas';
+$lang['Downloads'] = 'Downloads';
+$lang['Released on'] = 'Lançado em';
+$lang['Number of downloads'] = 'Número de downloads';
+$lang['Piwigo Announcements Newsletter'] = 'Boletim (newsletter) sobre anúncios do Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Fique atualizado com o projeto Piwigo, assine o boletim (newsletter) dos anúncios do Piwigo. Você receberá emails quando uma nova versão for disponibilizada (às vezes incluindo a correção de um bug, é importante estar por dentro para atualizar) e quando eventos importantes acontecerem no projeto. Apenas uns poucos emails ao longo do ano.';
+$lang['Subscribe %s'] = 'Assinar %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Fazer %s assinar o boletim (newsletter) sobre anúncios do Piwigo';
+$lang['Purge search history'] = 'Limpar o histórico da pesquisa';
+$lang['Hide'] = 'Esconder';
+$lang['Miscellaneous'] = 'Outras informações';
+$lang['Virtual Links'] = 'Links virtuais';
+$lang['Menu Management'] = 'Menú';
+$lang['%d of %d photos selected'] = '%d de %d fotos seleccionadas';
+$lang['%d photos uploaded'] = '%d fotos enviadas';
+$lang['+ Add an upload box'] = '+ Adicionar uma caixa de envio';
+$lang['Action'] = 'Acção';
+$lang['Activate icon "%s"'] = 'Activar ícone "%s"';
+$lang['Activate Navigation Bar'] = 'Activar Barra de Navegação';
+$lang['Activate Navigation Thumbnails'] = 'Activar Navegação por Miniaturas';
+$lang['Active Languages'] = 'Activar Linguagens';
+$lang['Active Plugins'] = 'Activar Plugins';
+$lang['Active Themes'] = 'Activar Temas';
+$lang['Add a filter'] = 'Adicionar um filtro';
+$lang['Add another set of photos'] = 'Adicionar outro conjunto de fotos';
+$lang['Add New Language'] = 'Adicionar Nova Linguagem';
+$lang['Add New Theme'] = 'Adicionar Novo Tema';
+$lang['Add Photos'] = 'Adicionar Fotos';
+$lang['Add write access to the "%s" directory'] = 'Adicionar permissões de escrita à pasta "%s"';
+$lang['Administration Home'] = 'Painel Administrativo';
+$lang['Album "%s" has been added'] = 'Álbum "%s" foi adicionado';
+$lang['Album "%s" now contains %d photos'] = 'Álbum "%s" agora contém %d fotos';
+$lang['Album photos associated to the following albums: %s'] = 'Fotos de Álbum associadas aos seguintes álbums: %s';
+$lang['Album name'] = 'Nome do Álbum';
+$lang['Albums automatically sorted'] = 'Álbums sortidos automaticamente';
+$lang['All %d photos are selected'] = 'Todas as %d fotos estão seleccionadas';
+$lang['Allow rating'] = 'Permitir Votação';
+$lang['Allow user customization'] = 'Permitir Personalização aos Utilizadores';
+$lang['Allow users to delete their own comments'] = 'Permitir aos utilizadores apagar os seus comentários';
+$lang['Allow users to edit their own comments'] = 'Permitir aos utilizadores editar os seus comentários';
+$lang['Apply action'] = 'Aplicar Acção';
+$lang['automatic order'] = 'ordem automática';
+$lang['Batch Manager'] = 'Gestor de Envio em Massa';
+$lang['Bound Theme'] = 'Ligar Tema';
+$lang['By %s'] = 'Por %s';
+$lang['By rank'] = 'Por classificação';
+$lang['Cannot delete the old permalink !'] = 'O permalink antigo não pode ser apagado!';
+$lang['Change Admin Colors'] = 'Alterar cor de fundo na Administração';
+$lang['Choose an action'] = 'Escolher uma acção';
+$lang['create a new album'] = 'criar um novo album';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Crie a pasta "%s" na raiz da sua instalação Piwigo';
+$lang['Delete orphan tags'] = 'Apagar Etiquetas orfãs';
+$lang['delete photo'] = 'apagar foto';
+$lang['Delete this language'] = 'Apagar esta Linguagem';
+$lang['Delete this theme'] = 'Apagar este Tema';
+$lang['Directory does not exist'] = 'A pasta não existe';
+$lang['Download,'] = 'Download,';
+$lang['Drop into album'] = 'Enviar para o álbum';
+$lang['Duplicates'] = 'duplicados';
+$lang['Email administrators when a comment is deleted'] = 'Enviar um Email aos administradores quando um comentário for apagado';
+$lang['Email administrators when a comment is modified'] = 'Enviar um Email aos administradores quando um comentário for modificado';
+$lang['Error on file "%s" : %s'] = 'Erro no ficheiro "%s" : %s';
+$lang['Everybody'] = 'Todos';
+$lang['Exif extension not available, admin should disable exif use'] = 'Extensão Exif indisponível, o administrador deve descativar o uso de Exif';
+$lang['existing album'] = 'álbum existente';
+$lang['Failed to write file to disk'] = 'Falha ao escrever no disco';
+$lang['File upload stopped by extension'] = 'Envio de ficheiro parado pela extensão';
+$lang['Forbid this language to users'] = 'Proibir esta linguagem aos utilizadores';
+$lang['Forbid this theme to users'] = 'Proibir este tema aos utilizadores';
+$lang['FTP + Synchronization'] = 'FTP + Sincronização';
+$lang['Get Support on Piwigo Forum'] = 'Peça ajuda no fórum Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dê permissões de escrita (chmod 777) à pasta "%s" situada na raiz da sua intalação Piwigo';
+$lang['Guest Settings'] = 'Definições de Visitante';
+$lang['Help Me'] = 'Ajuda';
+$lang['Hit'] = 'Visita';
+$lang['Image Quality'] = 'Qualidade da Foto';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Impossível activar este tema, o tema pai não existe: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Impossível activar esta linguagem, primeiro escolha outra linguagem por defeito.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Impossível desactivar esta linguagem, precisa de ter uma linguagem activa.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Impossível desactivar este tema, precisa de ter um tema activa.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Impossível apagar este tema, outros temas dependem dele: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'No seu php.ini o upload_max_filesize (%sB) é maior que o post_max_size (%sB). Deverá mudar esta definição.';
+$lang['Inactive Languages'] = 'Linguagens Inactivas';
+$lang['Inactive Plugins'] = 'Plugins Inactivos';
+$lang['Inactive Themes'] = 'Temas Inactivos';
+$lang['include child albums'] = 'incluír álbums filho';
+$lang['Install on your computer,'] = 'Instalar no seu computador,';
+$lang['Installed Languages'] = 'Linguagens Instaladas';
+$lang['Installed Themes'] = 'Temas Instalados';
+$lang['Instructions to use Piwigo'] = 'Instruções para usar Piwigo';
+$lang['Invert'] = 'Inverter';
+$lang['Language has been successfully installed'] = 'Linguagem instalada com sucesso';
+$lang['Languages'] = 'Linguagens';
+$lang['Main Page'] = 'Página Principal';
+$lang['Make this language available to users'] = 'Permitir aos utilizadores usar esta linguagem';
+$lang['Make this theme available to users'] = 'Permitir aos utilizadores usar este tema';
+$lang['Manage this set of %d photos'] = 'Gerir este conjunto de %d fotos';
+$lang['Manual order'] = 'Ordem Manual';
+$lang['manual order'] = 'ordem manual';
+$lang['Maximum Height'] = 'Altura máxima';
+$lang['Maximum Width'] = 'Largura máxima';
+$lang['Missing a temporary folder'] = 'Falta uma pasta temporária';
+$lang['Missing Plugins'] = 'Plugins em Falta';
+$lang['No file was uploaded'] = 'Nenhum ficheiro foi enviado';
+$lang['No photo in the current set.'] = 'Nenhuma foto no conjunto actual.';
+$lang['No photo selected, %d photos in current set'] = 'Nenhuma foto seleccionada, %d fotos no conjunto actual';
+$lang['No photo selected, no action possible.'] = 'Nenhuma foto seleccionada, Impossível realizar acção.';
+$lang['None'] = 'Nenhuma';
+$lang['on the %d selected photos'] = 'nas %d fotos seleccionadas';
+$lang['Operation in progress'] = 'Operação em progresso.';
+$lang['Order of menubar items has been updated successfully.'] = 'A ordem dos items do menú foi actualizada com sucesso.';
+$lang['Orphan tags deleted'] = 'Etiquetas orfãs removidas';
+$lang['Page end'] = 'Fim de Página';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Confirmação da Palavra Passe em falta. Por favor confirme a Palavra Passe escolhida.';
+$lang['Password is missing. Please enter the password.'] = 'Palavra Passe em falta. Por favor escreva a Palavra Passe.';
+$lang['Pending Comments'] = 'Comentários Pendentes';
+$lang['Photo Properties'] = 'Propriedades da Foto';
+$lang['Photos'] = 'Fotos';
+$lang['Piwigo Uploader'] = 'Uploader Piwigo';
+$lang['pixels'] = 'pixeis';
+$lang['Please wait...'] = 'Aguarde por favor...';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader significa <em>Piwigo Uploader</em>. Directamente do seu computador, pLoader prepara as suas fotos e transfere-as para a sua galeria de fotos Piwigo.';
+$lang['Privacy level set to "%s"'] = 'Nível de privacidade definido para "%s"';
+$lang['Read Piwigo Documentation'] = 'Ler Documentação Piwigo';
+$lang['Refresh photo set'] = 'Recarregar conjunto de fotos';
+$lang['Remove all filters'] = 'Remover todos os filtros';
+$lang['remove author'] = 'remover autor';
+$lang['remove creation date'] = 'remover data de criação';
+$lang['remove this filter'] = 'remover este filtro';
+$lang['remove title'] = 'remover título';
+$lang['Resize'] = 'Redimensionar';
+$lang['Save Settings'] = 'Salvar Definições';
+$lang['Select at least one comment'] = 'Seleccione pelo menos um comentário';
+$lang['Select files'] = 'Seleccionar ficheiros';
+$lang['Select:'] = 'Seleccionar:';
+$lang['Selection'] = 'Selecção';
+$lang['Set as default language for unregistered and new users'] = 'Definir como Linguagem por defeito para utilizadores não registados e novos utilizadores';
+$lang['Set as default theme for unregistered and new users'] = 'Definir como Tema por defeito para utilizadores não registados e novos utilizadores';
+$lang['Set author'] = 'Definir autor';
+$lang['Set creation date'] = 'Definir data de criação';
+$lang['Set title'] = 'Definir título';
+$lang['Settings'] = 'Definições';
+$lang['Start pLoader and add your photos.'] = 'Iniciar pLoader e adicionar as suas fotos.';
+$lang['Switch to clear or dark colors for administration'] = 'Mudar esquema de cores, claro ou escuro, para a administração';
+$lang['The following tag was deleted'] = 'A Etiqueta seguinte foi removida';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'O ficheiro enviado excede a directiva MAX_FILE_SIZE especificada no formulário HTML';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'O ficheiro enviado excede a directiva upload_max_filesize definida no ficheiro php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'O ficheiro apenas foi enviado parcialmente';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Os ficheiros enviados excedem a directiva post_max_sizedefinida no ficheiro php.ini: %sB';
+$lang['The whole page'] = 'Página Completa';
+$lang['The whole set'] = 'Conjunto Completo';
+$lang['Theme has been successfully installed'] = 'O Tema foi instalado com sucesso';
+$lang['Themes'] = 'Temas';
+$lang['There is no other language available.'] = 'Não existem mais linguagens disponíveis.';
+$lang['There is no other plugin available.'] = 'Não existem mais plugins disponíveis.';
+$lang['There is no other theme available.'] = 'Não existem mais temas disponíveis.';
+$lang['This theme was not designed to be directly activated'] = 'Este tema não foi desenhado para ser activado directamente';
+$lang['Tools'] = 'Ferramentas';
+$lang['Type here the author name'] = 'Escreva aqui o nome do autor';
+$lang['Type here the title'] = 'Escreva aqui o título';
+$lang['Uninstalled Plugins'] = 'Plugins Não Instalados';
+$lang['Unknown upload error'] = 'Erro de Envio desconhecido';
+$lang['unknown'] = 'desconhecido';
+$lang['Upload Photos'] = 'Enviar Fotos';
+$lang['Uploaded Photos'] = 'Fotos Enviadas';
+$lang['Visit Gallery'] = 'Visitar a galeria';
+$lang['Visit Piwigo project website'] = 'Visitar o sítio do projecto Piwigo';
+$lang['Visit plugin site'] = 'Visitar o sítio do plugin';
+$lang['Webmaster status is required.'] = 'Estatuto de Webmaster requerido.';
+$lang['Week starts on'] = 'A semana começa em';
+$lang['Who can see these photos?'] = 'Quem pode ver estas fotos?';
+$lang['Who can see this photo?'] = 'Quem pode ver esta foto?';
+$lang['You have %d orphan tags: %s.'] = 'Tem %d etiquetas orfãs: %s.';
+$lang['Your configuration settings are saved'] = 'A sua configuração foi guardada';
+$lang['Remove from caddie'] = 'Remover do carrinho';
+$lang['Themes which need upgrade'] = 'Temas que precisam ser actualizados';
+$lang['Languages which need upgrade'] = 'Idiomas que precisam ser actualizados';
+$lang['All themes are up to date.'] = 'Todos os Temas est&atilde;o actualizados.';
+$lang['All plugins are up to date.'] = 'Todas as extens&otilde;es est&atilde;o actualizadas.';
+$lang['All languages are up to date.'] = 'Todos os Idiomas est&atilde;o actualizados.';
+$lang['Visit theme site'] = 'Visitar s&iacute;tio do Tema';
+$lang['Visit language site'] = 'Visitar  s&iacute;tio do Idioma';
+$lang['New Version'] = 'Nova Vers&atilde;o';
+$lang['Obsolete Plugins'] = 'Extensões Obsoletas';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ATENÇÃO! Esta extensão não parece ser compatível com esta versão Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Deseja mesmo activar a extensão?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ESTA EXTENSÃO AGORA É PARTE DO NÚCLEO DE PIWIGO! DESINSTALE-A IMEDIATAMENTE!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ERRO: ESTA EXTENSÃO NÃO EXISTE MAS ESTÁ INSTALADA! DESINSTALE-A AGORA.';
+$lang['Simulation'] = 'Simulação';
+$lang['new'] = 'novo';
+$lang['No results'] = 'Sem resultados';
+$lang['Searching...'] = 'Procurando...';
+$lang['Type in a search term'] = 'Escreva um termo de busca';
+$lang['Learn more'] = 'Saber mais';
+$lang['Rate'] = 'Classificação';
+$lang['Average rate'] = 'Nota média';
+$lang['Activate icon "new" next to albums and pictures'] = 'Mostrar o icon "novo" ao lado dos Álbums e das fotos';
+$lang['Add a criteria'] = 'Adicionar um critério';
+$lang['Deactivate all'] = 'Desactivar tudo';
+$lang['Default photos order'] = 'Ordem padrão das fotos';
+$lang['Restore'] = 'Restaurar';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Restaurar a configuração padrão ? Perderá as configurações pesoiais !';
+$lang['Show menubar'] = 'Mostrar o menú';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Não pode definir uma ordem padrão para as fotos porque tem uma definição na sua configuração local.';																																					
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Especificou <i>$conf[\'order_by\']</i> no seu ficheiro de configuração, este pâremetro esta obsoleto, apaguar ou renomear em <i>$conf[\'order_by_custom\']</i> !';
+$lang['display'] = 'Mostrar';
+$lang['An error has occured during upgrade.'] = 'Ocorreu um erro durante a actualização automática.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Ocorreu um erro durante a extração dos ficheiros. Por favior verifique as permissões de escrita da sua instalação Piwigo.<br><a href="%s">Clique aqui para mostrar o relatório de erros</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo não consegue recuperar o ficheiro de actualização do servidor remoto.';
+$lang['Update in progress... Please wait.'] = 'Actualização em curso... Aguarde, por favor.';
+$lang['Update to Piwigo %s'] = 'Actualizar para Piwigo %s';
+$lang['Two updates are available'] = 'Duas actualizações disponíveis';
+$lang['This is a minor update, with only bug corrections.'] = 'Esta é uma actualização menor, apenas alguns pequenos erros foram corrigidos.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Esta é uma actualização maior, com <a href="%s">novas funcionalidades excitantes</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Alguns temas e plugins poderão não estar ainda disponíveis.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Pode actualizar para Piwigo %s directamente, sem actualizar primeiro para Piwigo %s (recomendado).';
+$lang['Save Template Directory'] = 'Salvar a pasta de Modelos';
+$lang['Dump Database'] = 'Descarregar Base de Dados';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Incluir dados históricos (Aviso: pode exceder o limite de memória do servidor)';
+$lang['Unable to dump database.'] = 'Impossível descarregar base de dados.';
+$lang['ERROR'] = 'ERRO';
+$lang['Update Complete'] = 'Actualização Completa';
+$lang['Piwigo Update'] = 'Actualizar Piwigo';
+$lang['Extensions Update'] = 'Actualizar Extensões';
+$lang['All extensions are up to date.'] = 'Todas as extensões estão actualizadas.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'As seguintes estensões poderão não ser compatíveis com a nova versão de Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Os seguintes temas poderão não ser compatíveis com a nova versão de Piwigo:';
+$lang['Add to caddie'] = 'Adicionar ao carrinho';
+$lang['%s has been successfully updated.'] = '%s foi atualizado com sucesso.';
+$lang['%s photos can not be regenerated'] = '%s fotos não puderam ser criadas';
+$lang['%s photos have been regenerated'] = '%s fotos foram criadas';
+$lang['(this tag will be deleted)'] = '(esta tag será excluída)';
+$lang['... or '] = '... ou ';
+$lang['Add tags'] = 'inserir tags';
+$lang['Allowed file types: %s.'] = 'tipos de arquivos permitidos: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Resolução máxima aproximada %dM pixels (qual\'s %dx%d pixels).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Por padrão,o Piwigo irá criar um novo tamanho web da versão em alta resolução da sua foto.';
+$lang['Confirm merge'] = 'Confirmar fusão';
+$lang['Create'] = 'Criar';
+$lang['Crop'] = 'Cortar';
+$lang['Follow Orientation'] = 'Siga a orientação';
+$lang['Graphics Library'] = 'Biblioteca Gráfica';
+$lang['Height'] = 'Altura';
+$lang['hide details'] = 'Ocultar detalhes';
+$lang['I decide to update anyway'] = 'Eu ainda quero atualizar';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Se não há HD disponível e o tamanho web é maior que o tamanho redimensionado, Piwigo irá movê-la como HD e criará uma foto com tamanho web diminuído.';
+$lang['Ignore All'] = 'Ignorar tudo';
+$lang['Ignore this update'] = 'Ignorar esta atualização';
+$lang['Last import'] = 'Última importação';
+$lang['Manage Permissions'] = 'Gerenciar permissões';
+$lang['Maximum file size: %sB.'] = 'Tamanho máximo do arquivo: %sB.';
+$lang['Merge selected tags'] = 'Mesclar marcas selecionadas';
+$lang['Merge tags'] = 'Mesclar marcas';
+$lang['No destination tag selected'] = 'Nenhuma marca de destino selecionada';
+$lang['Photo %s of %s'] = 'Foto %s de %s';
+$lang['Photo name'] = 'Nome da foto';
+$lang['Photos generation in progress...'] = 'Gerando fotos ...';
+$lang['Predefined filter'] = 'Filtro predefinido';
+$lang['Reset ignored updates'] = 'Redefinir atualizaÃ§Ãµes ignoradas';
+$lang['Select an album'] = 'Selecionar um Ã¡lbum';
+$lang['Select at least two tags for merging'] = 'Selecione pelo menos duas marcas para mesclar';
+$lang['Select the destination tag'] = 'Selecione a marca de destino';
+$lang['show details'] = 'Mostrar detalhes';
+$lang['Some upgrades are available for extensions.'] = 'Algumas atualizaÃ§Ãµes estÃ£o disponÃ­veis para extensÃµes.';
+$lang['Start Upload'] = 'Iniciar envio';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Marcas <em>%s</em> mescladas na marca <em>%s</em>';
+$lang['Thumbnails generation in progress...'] = 'Gerando miniaturas...';
+$lang['Update All'] = 'Atualizar tudo';
+$lang['Updates'] = 'AtualizaÃ§Ãµes';
+$lang['Width'] = 'Largura';
+$lang['With no album'] = 'Sem Ã¡lbum';
+$lang['With no tag'] = 'Sem marca';
+$lang['With no virtual album'] = 'Sem Ã¡lbum virtual';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'VocÃª estÃ¡ transferindo via navegador. Ao invÃ©s disso, tente enviar via <a href="%s"> Flash</a>.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'VocÃª estÃ¡ transferindo via Flash. Problemas? Ao invÃ©s disso, tente enviar via <a href="%s"> navegador</a>.';
+$lang['Zoom'] = 'Zoom';
+$lang['Activate comments'] = 'Ativar comentários';
+$lang['Default comments order'] = 'Ordem de comentários padrão';
+$lang['Photo Page'] = 'Página de  foto';
+$lang['Send connection settings by email'] = 'Enviar configurações de conexão por e-mail';
+$lang['The original image quality must be a number between %d and %d'] = 'A qualidade da imagem original deve ser um número entre %d e %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'A altura original máxima deve ser um número entre %d e %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'A largura original máxima deve ser um número entre %d e %d';
+$lang['Resize after upload'] = 'Redimensionar depois do envio';
+$lang['Original Size'] = 'Tamanho original';
+$lang['A locked gallery is only visible to administrators'] = 'Uma galeria bloqueada é visível somente para administradores';
+$lang['Unlock gallery'] = 'Desbloquear galeria';
+$lang['Gallery unlocked'] = 'Galeria desbloqueada';
+$lang['Notify administrators when a comment is'] = 'Notificar os administradores quando um comentário é';
+$lang['modified'] = 'modificado';
+$lang['pending validation'] = 'aguarda validação';
+$lang['Save visits in history for'] = 'Gravar visitas no histórico de';
+$lang['simple visitors'] = 'visitantes comuns';
+$lang['registered users'] = 'usuários registrados';
+$lang['administrators'] = 'administradores';
+$lang['This album contains %d photos, added on %s.'] = 'Este álbum contém %d  fotografias, adicionadas em %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Este álbum contém %d fotografias, adicionadas entre %s e %s.';
+$lang['This album contains no photo.'] = 'Este álbum não contém fotografias.'; 
+$lang['Not cropped correctly?'] = 'Não foi cortada corretamente?';
+$lang['Center of interest'] = 'Centro de interesse';
+$lang['Move to album'] = 'Mover para o álbum';
+$lang['You can activate only one mobile theme.'] = 'Você pode ativar apenas um tema móvel.';
+$lang['Automatic sort order'] = 'Ordem de classificação automática';
+$lang['apply automatic sort order'] = 'Aplicar ordem de classificação automática';
+$lang['Save manual order'] = 'Gravar ordem manual';
+$lang['cancel manual order'] = 'Cancelar ordem manual';
+$lang['Cancel'] = 'Cancelar';
+$lang['List'] = 'Lista';
+$lang['Web Form'] = 'Formulário web';
+$lang['Applications'] = 'Aplicações'; 
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'A aplicação <em>Piwigo for Android</em> permite-lhe ligar do seu telefone Android ou Tablet à galeria Piwigo, criar albuns e carregar diversas fotos simultâneamente.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'A aplicação <em>Piwigo for iOS</em> permite-lhe, ligação à sua galeria Piwigo a partir do seu IPhone,IPad ou IPod táctil, criar albuns e carregar fotos simultâneamente.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom é um software para fotografia desenhado para manusear uma larga quantidade de fotos digitais e transferir as mesmas para a web.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture é uma potente ferramenta destinada a refinar imagens e trabalhar massivas livrarias em Mac.';
+$lang['Available on'] = 'Existente em';
+$lang['Available versions for'] = 'Versões existentes para';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'DigiKam é um software grátis de tratamento foto-digital para Linux, Windows e MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'Digikam é aconselhado para fotografos que querem ver, manusear, editar, tratar, organizar, atribuir tags e partilhar essas fotos.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'Iphoto é, por defeito, um software para MacOSX. A aplicação de exportação Piwigo permite-lhe criar novos albuns e exportar fotos directamente de Iphoto para a galeria Piwigo.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Em Linux, instale o Shotwell com o pacote base e, depois apenas. terá de ativar a plicação.';
+$lang['Piwigo export plugin for Aperture'] = 'Aplicação Piwigo de exportação para Aperture.';
+$lang['Piwigo export plugin for iPhoto'] = 'Aplicação Piwigo de exportação para Iphoto.';
+$lang['Piwigo for Android'] = 'Piwigo para Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo para  iOS (iPhone, iPad, iPod táctil)';
+$lang['Piwigo publish plugin for digiKam'] = 'Aplicação de publicação Piwigo para DigiKam.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Aplicação de publicação Piwigo para Lightroom.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Aplicação de publicação Piwigo para Shotwell.';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell é um organizador (Open Source) de origem aberta para fotos digitais em Linux. É, por defeito, o organizador do Ubuntu e Fedora';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'A aplicação "Piwigo publish" permite-lhe exportar e sincronizar fotos directamente do Lightroom para a sua galeria Piwigo. ';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Para expotar fotos de DigiKam para Piwwigo, apenas é necessário instalar as aplicações DigiKam e Kipi.';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u utilizadores têm permissão automática porque pertecem ao grupo.';
+$lang['any visitor can see this album'] = 'Este album pode ser visto por qualquer visitante.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture é concebido para fotografos profissionais com Iphoto simplicity.';
+$lang['custom'] = 'Personalizado.';
+$lang['Delete multiple size images'] = 'Apagar imagens de tamanhos diversos.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Como funções inclui navegação da galeria, criaçãoo de albuns e carregar fotos.';
+$lang['Generate multiple size images'] = 'Gerar multiplos tamanhos de imagens.';
+$lang['Groups and users'] = 'Grupos e utilizadores.';
+$lang['include photos with lower privacy level'] = 'Incluir fotos com baixo nível de privacidade.';
+$lang['No group is permitted to see this private album'] = 'Este album privado é interdito a grupos.';
+$lang['Permission granted for groups'] = 'permissão garantida para grupos.';
+$lang['Permission granted for users'] = 'Permissão.';
+$lang['Permission management'] = 'Permissões de manuseamento.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (Galeria cliente remota para Android)é aplicação Piwigo de Origem Aberta(GPLv3) para plataforma Android.';
+$lang['Select groups...'] = 'Selecionar grupos.';
+$lang['Select users...'] = 'Seleccionar utilizadores.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'A aplicação Piwigo Export permite criar albuns e exportar fotos.';
+$lang['There is no group in this gallery.'] = 'Nesta galeria não existe grupo.';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'Para ver este album, os visitantes deverão entrar como inscritos e possuir permissão para tal.';
+$lang['add a new watermark'] = 'Adicionar nova marca de água';
+$lang['Apply watermark if height is bigger than'] = 'Aplicar marca de água se a altura é maior que';
+$lang['Apply watermark if width is bigger than'] = 'Aplicar marca de água se a largura é maior que';
+$lang['bottom left corner'] = 'Canto inferior esquerdo';
+$lang['bottom right corner'] = 'Canto inferior direito';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Por defeito o ponto de mais interesse é colocado no centro da foto';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Para tamanhos de foto com recorte, tal como quadrado, Piwigo fará o seu melhor para incluir o ponto de maior interesse.';
+$lang['middle'] = 'Meio';
+$lang['Opacity'] = 'Opacidade';
+$lang['Photo sizes with crop'] = 'Tamanho das fotos após recorte';
+$lang['Select a file'] = 'Selecione um arquivo';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Seleccione com o rato para definir outro ponto como centro de interesse';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'O centro do interesse é a zona que mais chama a nossa atenção na foto';
+$lang['top left corner'] = 'Canto esquerdo superior';
+$lang['top right corner'] = 'Canto direito superior';
+$lang['X Position'] = 'Posição X';
+$lang['X Repeat'] = 'Repetir X';
+$lang['Y Position'] = 'Posição Y';
+$lang['Multiple Size'] = 'Tamanho multiplo';
+?>
Index: tags/2.4.0RC3/language/pt_PT/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_PT/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Português [PT]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=432
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Português';
+$lang_info['country'] = 'Portugal';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'pt';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d álbum actualizado';
+$lang['%d albums updated'] = '%d álbums actualizados';
+$lang['%d comment to validate'] = '%d comentário para aprovar';
+$lang['%d comments to validate'] = '%d comentários para aprovar';
+$lang['%d new comment'] = '%d novo comentário';
+$lang['%d new comments'] = '%d novos comentários';
+$lang['%d comment'] = '%d comentário';
+$lang['%d comments'] = '%d comentários';
+$lang['%d hit'] = 'visto %d vez';
+$lang['%d hits'] = 'visto %d vezes';
+$lang['%d new photo'] = '%d foto nova';
+$lang['%d new photos'] = '%d fotos novas';
+$lang['%d new user'] = '%d novo utilizador ';
+$lang['%d new users'] = '%d novos utilizadores ';
+$lang['About'] = 'Sobre';
+$lang['All tags'] = 'Todas as etiquetas';
+$lang['Any tag'] = 'qualquer etiqueta';
+$lang['At least one listed rule must be satisfied.'] = 'No mínimo, um dos critérios deverá ser satisfeito.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Albuns';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Fechar a janela';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS completo (fotos e comentários)';
+$lang['Confirm Password'] = 'Confirmar a senha';
+$lang['Connection settings'] = 'Definições de ligação';
+$lang['Login'] = 'Entrar';
+$lang['Contact webmaster'] = 'Contactar o webmaster';
+$lang['Create a new account'] = 'Criar uma conta nova';
+$lang['Created on'] = 'Criada em';
+$lang['Creation date'] = 'Data de criação';
+$lang['Current password is wrong'] = 'A palavra-passe actual está errada';
+$lang['Dimensions'] = 'Dimensões';
+$lang['Display'] = 'Mostrar';
+$lang['Each listed rule must be satisfied.'] = 'Todos os critérios listados devem ser satisfeitos';
+$lang['Email address is missing. Please specify an email address.'] = 'Esqueceu o endereço de email. Por favor indique um email.';
+$lang['Email address'] = 'Endereço de email';
+$lang['Enter your personnal informations'] = 'Introduza os seus dados pessoais';
+$lang['Error sending email'] = 'Erro durante o envio do email';
+$lang['File name'] = 'Nome do ficheiro';
+$lang['File'] = 'Ficheiro';
+$lang['Filesize'] = 'Tamanho do ficheiro';
+$lang['Filter and display'] = 'Filtrar e mostrar';
+$lang['Filter'] = 'Filtro';
+$lang['Forgot your password?'] = 'Esqueceu a palavra-passe?';
+$lang['Go through the gallery as a visitor'] = 'Ver a galeria como visitante';
+$lang['Help'] = 'Ajuda';
+$lang['Identification'] = 'Identificação';
+$lang['Photos only RSS feed'] = 'RSS de fotos';
+$lang['Keyword'] = 'Palavra chave';
+$lang['Links'] = 'Links';
+$lang['N/A'] = 'Não disponível';
+$lang['New on %s'] = 'Novo no %s';
+$lang['Notification'] = 'Notificação';
+$lang['Number of items'] = 'Número de items';
+$lang['Original dimensions'] = 'Dimensões originais';
+$lang['Password forgotten'] = 'Senha esquecida';
+$lang['Password'] = 'Senha';
+$lang['Post date'] = 'Data de Publicação';
+$lang['Posted on'] = 'Publicado em';
+$lang['Profile'] = 'Perfil';
+$lang['Quick connect'] = 'Ligação Rápida';
+$lang['RSS feed'] = 'RSS';
+$lang['Register'] = 'Registar';
+$lang['Registration'] = 'Registo';
+$lang['Related tags'] = 'Etiquetas relacionados';
+$lang['Reset'] = 'Reset';
+$lang['Retrieve password'] = 'Recuperar a palavra-passe';
+$lang['Search rules'] = 'Critérios de pesquisa';
+$lang['Search tags'] = 'Pesquisar as estiquetas';
+$lang['Search'] = 'pesquisar';
+$lang['display available tags'] = 'Mostrar etiquetas disponíveis';
+$lang['Since'] = 'Desde ';
+$lang['Sort by'] = 'Ordenar por';
+$lang['Sort order'] = 'Ordem de exibição';
+$lang['Tag'] = 'Etiqueta';
+$lang['Tags'] = 'Etiquetas';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'O RSS notifica-o(a) dos eventos da galeria : novas imagens, álbums actualizados, novos comentários, utilizadores, etc. Use um leitor de RSS para subscrever.';
+$lang['Unknown feed identifier'] = 'identificador de RSS desconhecido';
+$lang['User comments'] = 'Comentários de utilizador';
+$lang['Username'] = 'Nome de utilizador';
+$lang['Visits'] = 'Visitas';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Semana %d';
+$lang['About Piwigo'] = 'Sobre Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Não tem permissões para aceder à página solicitada';
+$lang['add this photo to your favorites'] = 'Adicionar aos favoritos';
+$lang['Administration'] = 'Administração';
+$lang['all'] = 'tudo';
+$lang['ascending'] = 'crescente';
+$lang['author(s) : %s'] = 'autor(es) : %s';
+$lang['Expand all albums'] = 'Expandir todos os albums';
+$lang['posted after %s (%s)'] = 'publicado depois de %s (%s)';
+$lang['posted before %s (%s)'] = 'publicado antes de %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'publicado entre %s (%s) e  %s (%s)';
+$lang['posted on %s'] = 'Publicado em %s';
+$lang['Best rated'] = 'Melhor classificadas';
+$lang['display best rated photos'] = 'Mostrar as fotos com melhor classificação';
+$lang['Calendar'] = 'Calendário';
+$lang['All'] = 'Tudo';
+$lang['display each day with photos, month per month'] = 'Mostrar cada dia com fotos, mês a mês';
+$lang['View'] = 'Ver';
+$lang['chronology_monthly_calendar'] = 'Calendário mensal';
+$lang['chronology_monthly_list'] = 'Lista mensal';
+$lang['chronology_weekly_list'] = 'Lista semanal';
+$lang['Click here if your browser does not automatically forward you'] = 'Clique aqui se o seu navegador não o redireccionar automaticamente.';
+$lang['comment date'] = 'data do comentário';
+$lang['Comment'] = 'Comentário';
+$lang['Your comment has been registered'] = 'O seu comentário foi registado.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistema anti-abuso : Por favor, espere um momento antes de tentar escrever um novo comentário';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'O seu comentário NÃO pôde ser registado porque não passou pelas regras de validação';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Um administrador deve autorizar o seu comentário para que ele seja visível por todos.';
+$lang['This login is already used by another user'] = 'Esta entrada já é usada por outro utilizador.';
+$lang['Comments'] = 'Comentários';
+$lang['Add a comment'] = 'Adicionar um comentário';
+$lang['created after %s (%s)'] = 'criada depois de %s (%s)';
+$lang['created before %s (%s)'] = 'criada antes de %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Criada entre  %s (%s) e  %s (%s)';
+$lang['created on %s'] = 'criado em %s';
+$lang['Customize'] = 'Personalizar';
+$lang['Your Gallery Customization'] = 'Personalização da sua galeria';
+$lang['day'][0] = 'Domingo';
+$lang['day'][1] = 'Segunda-feira';
+$lang['day'][2] = 'Terça-feira';
+$lang['day'][3] = 'Quarta-feira';
+$lang['day'][4] = 'Quinta-eira';
+$lang['day'][5] = 'Sexta-feira';
+$lang['day'][6] = 'Sábado';
+$lang['Default'] = 'Padrão';
+$lang['delete this photo from your favorites'] = 'Remover esta foto dos favoritos';
+$lang['Delete'] = 'Apagar';
+$lang['descending'] = 'decrescente';
+$lang['Download'] = 'Descarregar';
+$lang['Download this file'] = 'fazer descarga deste ficheiro';
+$lang['edit'] = 'editar';
+$lang['wrong date'] = 'data errada';
+$lang['excluded'] = 'excluídos';
+$lang['Your favorites'] = 'Meus favoritos';
+$lang['display your favorites photos'] = 'Mostrar as minhas imagens favoritas';
+$lang['Favorites'] = 'Favoritas';
+$lang['First'] = 'Primeira página';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'A galeria está bloqueada para manutenção. Por favor, volte mais tarde.';
+$lang['Page generated in'] = 'Página gerada em';
+$lang['guest'] = 'visitante';
+$lang['Hello'] = 'Olá';
+$lang['available for administrators only'] = 'disponível apenas para os administradores';
+$lang['display this album'] = 'mostrar este album';
+$lang['display last user comments'] = 'Ver os últimos comentários dos utilizadores';
+$lang['customize the appareance of the gallery'] = 'personalisar a aparência da galeria';
+$lang['search'] = 'Pesquisar';
+$lang['Home'] = 'Início';
+$lang['in this album'] = 'neste álbum';
+$lang['in %d sub-album'] = 'no sub-album %d ';
+$lang['in %d sub-albums'] = 'nos sub-albums %d ';
+$lang['included'] = 'incluídos';
+$lang['Invalid password!'] = 'Senha inválida!';
+$lang['Language'] = 'Idioma';
+$lang['last %d days'] = '%d últimos dias';
+$lang['Last'] = 'Última página';
+$lang['Logout'] = 'Sair';
+$lang['obligatory'] = 'mandatário';
+$lang['Maximum photo height'] = 'Altura máxima das fotos';
+$lang['Maximum height must be a number superior to 50'] = 'A altura máxima das fotos deve ser um número maior que 50';
+$lang['Maximum photo width'] = 'Largura máxima das fotos';
+$lang['Maximum width must be a number superior to 50'] = 'A largura máxima das fotos deve ser um número maior que 50';
+$lang['display a calendar by creation date'] = 'Mostra um calendário ordenado pela data de criação';
+$lang['display all photos in all sub-albums'] = 'Mostra todas as fotos em todos os sub-albuns';
+$lang['return to normal view mode'] = 'voltar ao modo normal de visionamento';
+$lang['display a calendar by posted date'] = 'Mostrar um calendário por data em que as imagens foram carregadas';
+$lang['month'][10] = 'Outubro';
+$lang['month'][11] = 'Novembro';
+$lang['month'][12] = 'Dezembro';
+$lang['month'][1] = 'Janeiro';
+$lang['month'][2] = 'Fevereiro';
+$lang['month'][3] = 'Março';
+$lang['month'][4] = 'Abril';
+$lang['month'][5] = 'Maio';
+$lang['month'][6] = 'Junho';
+$lang['month'][7] = 'Julho';
+$lang['month'][8] = 'Agosto';
+$lang['month'][9] = 'Setembro';
+$lang['Most visited'] = 'Mais vistas';
+$lang['display most visited photos'] = 'Mostra as fotos mais vistas';
+$lang['The number of photos per page must be a not null scalar'] = 'O número de fotos por página deve ser um número que não 0';
+$lang['Number of photos per page'] = 'Número de fotos por página';
+$lang['Unknown identifier'] = 'Identificador desconhecido';
+$lang['New password'] = 'Nova senha';
+$lang['Rate this photo'] = 'Classifique esta foto';
+$lang['Next'] = 'Seguinte';
+$lang['no rate'] = 'Sem avaliação';
+$lang['Photos posted within the last %d day.'] = 'Fotos adicionadas no último dia %d.';
+$lang['Photos posted within the last %d days.'] = 'Fotos adicionadas nos últimos dias %d';
+$lang['password updated'] = 'Senha actualizada';
+$lang['Recent period must be a positive integer value'] = 'O período de tempo deve ser um número inteiro positivo';
+$lang['photo'] = 'Foto';
+$lang['Click on the photo to see it in high definition'] = 'Clique na foto para vê-la em alta definição';
+$lang['Show file metadata'] = 'Mostrar os metadados do arquivo.';
+$lang['Powered by'] = 'Powered by';
+$lang['Preferences'] = 'Preferências';
+$lang['Previous'] = 'Prévia';
+$lang['Random photos'] = 'Fotos aleatórias';
+$lang['display a set of random photos'] = 'exibir um conjunto aleatório de fotos';
+$lang['Recent albums'] = 'Albuns recentes';
+$lang['display recently updated albums'] = 'Exibir albums actualizados recentemente.';
+$lang['Recent period'] = 'Período recente';  
+$lang['Recent photos'] = 'Fotos recentes';
+$lang['display most recent photos'] = 'Mostrar as fotos mais recentes';
+$lang['Redirection...'] = 'A redireccionar...';
+$lang['Please, enter a login'] = 'Por favor, escreva um nome de utilizador';
+$lang['login mustn\'t end with a space character'] = 'O nome de utilizador não deve terminar com um espaço';
+$lang['login mustn\'t start with a space character'] = 'O nome de utilizador não deve começar com um espaço';
+$lang['this login is already used'] = 'Este nome de utilizador já existe';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'O formato do email deve ser do tipo: xxx@yyy.eee (exemplo : jack@altern.org)';
+$lang['please enter your password again'] = 'Por favor, escreva a sua senha novamente';
+$lang['Auto login'] = 'Início de Sessão automático';
+$lang['remove this tag from the list'] = 'remover esta etiqueta da lista';
+$lang['representative'] = 'Foto de Capa';
+$lang['Search for Author'] = 'Pesquisar por autor';
+$lang['Search in albums'] = 'Pesquisar nos albums';
+$lang['Search by date'] = 'Pesquisar por data';
+$lang['Date'] = 'Data';
+$lang['End-Date'] = 'Data final';
+$lang['Kind of date'] = 'Tipo de data';
+$lang['Search for words'] = 'Pesquisar por palavras';
+$lang['Search for all terms'] = 'Pesquisar todos os termos';
+$lang['Search for any term'] = 'Pesquisar qualquer um dos termos';
+$lang['Empty query. No criteria has been entered.'] = 'Pesquisa vazia. Nenhum critério fornecido.';
+$lang['Search results'] = 'Resultados da pesquisa';
+$lang['Search in sub-albums'] = 'Pesquisar nos sub-albums';
+$lang['searched words : %s'] = 'Palavras pesquisadas : %s';
+$lang['Contact'] = 'Contacto';
+$lang['set as album representative'] = 'Escolher como capa de álbum';
+$lang['Show number of comments'] = 'Mostrar o número de comentários';
+$lang['Show number of hits'] = 'Mostrar o número de vizualisações';
+$lang['slideshow'] = 'Slideshow';
+$lang['stop the slideshow'] = 'Parar o Slideshow';
+$lang['Specials'] = 'Especiais';
+$lang['SQL queries in'] = 'Pesquisas SQL em';
+$lang['display only recently posted photos'] = 'Mostrar apenas as fotos publicadas recentemente';
+$lang['return to the display of all photos'] = 'voltar a visionar todas as fotos';
+$lang['the beginning'] = 'O começo';
+$lang['Interface theme'] = 'Tema';
+$lang['Thumbnails'] = 'Miniaturas';
+$lang['Menu'] = 'Menú';
+$lang['A comment on your site'] = 'Um comentário no seu site';
+$lang['today'] = 'hoje';
+$lang['Update your rating'] = 'Actualizar a sua classificação';
+$lang['the username must be given'] = 'O nome de utilizador é obrigatório';
+$lang['useful when password forgotten'] = 'útil em caso de esquecer a senha';
+$lang['Quick search'] = 'Pesquisa Rápida';
+$lang['Connected user: %s'] = 'Utilizador ligado: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Navegador: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Comentário: %s';
+$lang['Comment by %s'] = 'Comentário de %s';
+$lang['User: %s'] = 'Utilizador: %s';
+$lang['Email: %s'] = 'Email: %s';
+$lang['Admin: %s'] = 'Administração: %s';
+$lang['Registration of %s'] = 'Registo de %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status incorrecto para visitante, deverá ser usado o status por defeito. Por favor, contacte o administrador do site.';
+$lang['this email address is already in use'] = 'Este email já está em uso';
+$lang['Album results for'] = 'Resultados de album para';
+$lang['Tag results for'] = 'Resultados de etiqueta para';
+$lang['from %s to %s'] = 'de %s a %s';
+$lang['Play of slideshow'] = 'Iniciar o Slideshow';
+$lang['Pause of slideshow'] = 'Pausar o Slideshow';
+$lang['Repeat the slideshow'] = 'Repetir o Slideshow';
+$lang['Not repeat the slideshow'] = 'Não repetir o Slideshow';
+$lang['Reduce diaporama speed'] = 'Diminuir a velocidade do Slideshow';
+$lang['Accelerate diaporama speed'] = 'Aumentar a velocidade do Slideshow';
+$lang['Submit'] = 'Submeter';
+$lang['Yes'] = 'Sim';
+$lang['No'] = 'Não';
+$lang['%d photo']='%d foto';
+$lang['%d photos']='%d fotos';
+$lang['%d photo is also linked to current tags'] = '%d foto está também ligada às etiquetas actuais';
+$lang['%d photos are also linked to current tags'] = '%d fotos estão também ligadas às etiquetas actuais';
+$lang['display photos linked to this tag'] = 'Ver as fotos ligadas a esta etiqueta';
+$lang['photos posted during the last %d days'] = 'fotos publicadas durante os últimos %d dias';
+$lang['Piwigo Help'] = 'Ajuda Piwigo';
+$lang['Rank'] = 'Posição';
+$lang['group by letters'] = 'agrupar por letras';
+$lang['letters'] = 'letras';
+$lang['show tag cloud'] = 'mostar a núvem de etiquetas';
+$lang['cloud'] = 'nuvem';
+$lang['Are you sure?'] = 'Tem a certeza?';
+$lang['Reset to default values'] = 'Repor valores padrão';
+$lang['delete all photos from your favorites'] = 'apagar todas as fotos dos seus favoritos';
+$lang['Sent by'] = 'Enviado por';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Os cookies estão bloqueados ou não são suportados pelo seu navegador. Deverá activar os cookies para Iniciar Sessão.';
+$lang['Edit a comment'] = 'Editar um comentário';
+$lang['(!) This comment requires validation'] = '(!) Este cometário requer validação';
+$lang['Welcome'] = 'Bem-vindo(a)';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bem-vindo(a) à sua galeria Piwigo!';
+$lang['... or browse your empty gallery'] = '... ou navegue a sua galeria vazia';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ou, desactive esta mensagem por favor, encontrará o seu caminho por si.';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Olá %s, a sua galeria Piwigo está vazia!';
+$lang['I want to add photos'] = 'Eu quero adicionar fotos';
+$lang['Manage this user comment: %s'] = 'Gerir comentários deste utilizador: %s';
+$lang['This author modified following comment:'] = 'Este autor modificou o seguinte comentário:';
+$lang['This author removed the comment with id %d'] = 'Este autor removeu o comentário com o ID %d';
+$lang['html tags are not allowed in login'] = 'Etiquetas HTML n&atilde;o s&atilde;o permitidas no In&iacute;cio de Sess&atilde;o';
+$lang['%d rates'] = '%d avaliações';
+$lang['Rating score'] = 'Pontuação na avaliação';
+$lang['Invalid username or email'] = 'nome de utilizador ou email inválido(s)';
+$lang['Password reset is not allowed for this user'] = 'A reinicialização da senha não é permitida para este utilizador';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Utilizador "%s" não tem email, a reinicialização da palavra-passe não é possível';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Alguém pediu a reinicialização da senha para a conta do utilizador seguinte :';
+$lang['Username "%s" on gallery %s'] = 'Nome de utilizador "%s" na galeria %s';
+$lang['To reset your password, visit the following address:'] = 'Para reinicializar a sua senha, siga o endereço seguinte :';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Se for um erro, apenas deverá ignorar este email e nada acontecerá.';
+$lang['Password Reset'] = 'Palavra-passe reinicializada';
+$lang['Check your email for the confirmation link'] = 'Verifique o seu email para clicar no link de confirmação';
+$lang['Invalid key'] = 'Chave inválida';
+$lang['The passwords do not match'] = 'As palavras-passe não correspondem';
+$lang['Your password has been reset'] = 'A sua senha foi reinicializada';
+$lang['Return to home page'] = 'Voltar ao inicio';
+$lang['Please enter your username or email address.'] = 'Por Favor escreva o seu nome de utilizador ou o seu email.';
+$lang['You will receive a link to create a new password via email.'] = 'Vai receber um link para criar uma nova senha por email.';
+$lang['Username or email'] = 'nome de utilizador ou email';
+$lang['Change my password'] = 'alterar a minha senha';
+$lang['Enter your new password below.'] = 'Escreva abaixo a sua nova senha.';
+$lang['Edit'] = 'Editar';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Hello %s,'] = 'Olá %s,';
+$lang['Send my connection settings by email'] = 'Enviar minhas configurações de entrada por e-mail';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registrado com sucesso! Você receberá, em breve, um e-mail com suas configurações de entrada. Bem-vindo(a)!';
+$lang['Username modification'] = 'Modificação de nome de usuário';
+$lang['Your username has been successfully changed to : %s'] = 'Seu nome de utilizador foi alterado com sucesso para : %s';
+$lang['square'] = 'Quadrado';
+$lang['thumb'] = 'Miniatura';
+$lang['small'] = 'Pequeno';
+$lang['medium'] = 'Médio';
+$lang['large'] = 'Grande';
+$lang['xlarge'] = 'Extra grande';
+$lang['xxlarge'] = 'Gigante';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Obrigado por se registrar no %s!';
+$lang['Here are your connection settings'] = 'Aqui estão as suas definições de entrada';
+$lang['Password: %s'] = 'Senha: %s';
+$lang['Username: %s'] = 'Nome de usuário: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Se você acha que recebeu este e-mail por engano, por favor contacte-nos em %s';
+$lang['Photo sizes'] = 'Tamanhos da fotografia';
+$lang['Show oldest comments first'] = 'Mostrar comentários mais antigos primeiro';
+$lang['Show latest comments first'] = 'Mostrar comentários mais recentes primeiro';
+$lang['View in'] = 'Visualizar em';
+$lang['Mobile'] = 'Móvel';
+$lang['Desktop'] = 'Área de Trabalho'; 
+
+$lang['2small'] = 'XXS - Pequenissimo';
+$lang['Date created, new &rarr; old'] = 'Data de criação, recente &rarr; antiga';
+$lang['Date created, old &rarr; new'] = 'Data de criação, antiga &rarr; nova';
+$lang['Date posted, new &rarr; old'] = 'Data de publicação, recente &rarr; antiga';
+$lang['Date posted, old &rarr; new'] = 'Data de publicação, antiga &rarr; recente';
+$lang['File name, A &rarr; Z'] = 'Nome do arquivo, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Nome do arquivo, Z &rarr; A';
+$lang['Manual sort order'] = 'Ordenar manualmente';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identificador numérico, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identificador numérico, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Título da foto, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Título da foto,Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Nível de avaliação, elevado &rarr; baixo';
+$lang['Rating score, low &rarr; high'] = 'Nível de avaliação, baixo &rarr; elevado';
+$lang['Visits, high &rarr; low'] = 'Visitas, elevadas &rarr; parcas';
+$lang['Visits, low &rarr; high'] = 'Visitas, parcas &rarr; elevadas';
+$lang['xsmall'] = 'XS - extra pequeno';
+?>
Index: tags/2.4.0RC3/language/pt_PT/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Movendo &Aacute;lbums virtuais</h2>
+
+<p>Apenas &aacute;lbums virtuais podem ter um novo &aacute;lbum-pai.</p>
+
+<h3>&Aacute;lbums virtuais a mover</h3>
+
+<p>Seleccione um ou mais &aacute;bums virtuais que deseje mover. 
+Se a lista estiver vazia, isso significa que ainda n&atilde;o criou nenhum &aacute;lbum.</p>
+
+<h3>Novo &aacute;lbum-pai</h3>
+
+<p>Seleccione o novo &aacute;lbum-pai (virtual ou f&iacute;sico). 
+Se n&atilde;o seleccionar um &aacute;lbum-pai, os &aacute;lbums virtuais seleccionados ser&atilde;o movidos para a raiz.
+Um &aacute;lbum n&atilde;o poder&aacute; ser movido para dentro de si pr&oacute;prio ou para um dos seus sub-&aacute;lbums.</p>
Index: tags/2.4.0RC3/language/pt_PT/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Lista de Grupos</h2>
+
+<p>Este &eacute; o local onde gere os grupos.</p>
+
+<h3>Adicione um grupo</h3>
+
+<p>O Administrador pode adicionar grupos.</p>
+
+<h3>Lista de Grupos</h3>
+
+<p>Para cada grupo as seguintes a&ccedil;&otilde;es podem ser aplicadas:</p>
+
+
+<ul>
+  <li>ir para gest&atilde;o de utilizadores (Administra&ccedil;&atilde;o &raquo; Utilizadores &raquo; Gerir)</li>
+  <li>ir para o ecr&atilde; de gest&atilde;o de permiss&otilde;es para permitir ou negar acesso a &aacute;lbums privados.</li>
+  <li>apagar grupo (requer confirma&ccedil;&atilde;o)</li>
+  <li>mudar estado "default" (requer confirma&ccedil;&atilde;o)</li>
+</ul>
+
+<h3>Grupos por defeito(default)</h3>
+<p>Grupos por defeito(default) s&atilde;o grupos automaticamente associados a cada novo utilizador na altura do registo no site ou da cria&ccedil;&atilde;o por um administrador.</p>
Index: tags/2.4.0RC3/language/pt_PT/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,29 @@
+<p>Existem varios m&eacute;todos para juntar fotos na sua galeria :</p>
+
+<ul>
+
+  <li><strong>A adi&ccedil;&atilde;o direta</strong> no seu navigador web &eacute; o m&eacute;todo mais simples e mais imediato.
+	Depende das capacidades do seu navegador e do seu servidor. Para grandes volumes ou em caso de problemas,
+	os m&eacute;todos alternativos ficam &agrave; sua espera !</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Usar a adi&ccedil;&atilde;o direta</a></p>
+
+<ul>
+	<li><strong>ploader</strong> &eacute; um software a instalar no seu computador. Fazer drag-and-drop, arrastar e largar,
+	suas fotos na janela de ploader, clicar sobre<em>"Transferir para Piwigo"</em> e ploader faz o resto.
+	Existem outros programas clientes, como <strong>WinToPiwigo</strong> ou o m&oacute;dulo de exporta&ccedil;&atilde;o Piwigo de
+	<strong>Digikam</strong>.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Usar ploader</a></p>
+
+<div id="helpSynchro">
+<ul>
+<li><strong>A transfer&ecirc;ncia FTP</strong>
+	&eacute; o m&eacute;todo ideal para a adi&ccedil;&atilde;o de uma grande cole&ccedil;&atilde;o em um m&iacute;nimo de opera&ccedil;&otilde;es. Siga o guia para preparar as suas fotos.
+	Este m&eacute;todo permite-lhe controlar com precis&atilde;o a organiza&ccedil;&atilde;o f&iacute;sica de suas fotos em seu servidor.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Usar FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/pt_PT/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Os grupos são uma maneira conveniente de configurar permissões para uma lista de usuários.</p>
+
+<p>Crie grupos em <span class="pwgScreen">Administração &raquo; Usuários &raquo; Grupos</span> e associe usuários para este grupo em <span class="pwgScreen">Administração &raquo; Usuários &raquo; Gerenciar</span>.</p>
+
+<p>Um usuário pode pertencer a vários grupos. A autorização é mais forte do que a proibição : se o usuário "jack" pertence aos grupos "família" e "amigos", e apenas o grupo "família" pode ver a categoria "Natal 2003", então "jack" poderá ver "Natal 2003".</p>
+
Index: tags/2.4.0RC3/language/pt_PT/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/help_misc.html	(revision 14585)
@@ -0,0 +1,4 @@
+<p>Assim que você tiver criado sua galeria, modifique as propriedades padrão em <span class="pwgScreen">Administração &raquo; Configuração &raquo; Opções &raquo; Guest Settings</span>. Todo usuário novo registrado usará estas opções de configuração padrão.</p>
+
+<p>Se você tiver qualquer pergunta, a comunidade Piwigo lhe receberá de braços abertos em <a href="http://piwigo.org/forum">seu forum</a>.</p>
+
Index: tags/2.4.0RC3/language/pt_PT/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,12 @@
+<p>Você pode proibir o acesso às categorias. Altere o modo de acesso à categoria para "privado" se você quiser gerenciar permissões.</p>
+
+<p>Você pode tornar uma categoria privada simplesmente editando uma categoria (<span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar &raquo; editar</span>) ou alterando as opções em toda a árvore da categoria (<span class="pwgScreen">Administração &raquo; Categorias &raquo; Propriedades &raquo; Publico / Privado</span>).</p>
+
+<p>Uma vez que a categoria esteja como privada, você pode gerenciar as permissões para grupos e usuários com 3 telas:</p>
+
+<ul>
+  <li><span class="pwgScreen">Administração &raquo; Usuários &raquo; Gerenciar &raquo; ação das permissões</span> (um link por usuário)</li>
+  <li><span class="pwgScreen">Administração &raquo; Usuários &raquo; Grupos &raquo; ação das permissões</span> (um link por grupo)</li>
+  <li><span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar &raquo; editar ação das permissões da categoria</span> (um link por categoria)</li>
+</ul>
+
Index: tags/2.4.0RC3/language/pt_PT/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>As fotos são mostradas na categoria correspondente are displayed in the category corresponding to the file directory.</p>
+
+<p>Você também pode mostrar uma imagem em várias categorias, sem a necessidade de duplicar o arquivo em seu servidor. Associe a imagem a qualquer categoria na tela de edição de foto (que qualquer administrador pode ter acesso da página de foto na galeria).</p>
+
+<p>Categorias virtuais são baseadas neste conceito: elas não tem diretório correspondente. Crie categorias virtuais através da <span class="pwgScreen">Administração &raquo; Categorias &raquo; Gerenciar</span>.</p>
+
Index: tags/2.4.0RC3/language/pt_PT/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/pt_PT/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,96 @@
+<fieldset>
+  <legend>Início Rápido</legend>
+
+<ol>
+  <li>Crie uma pasta no seu computador.</li>  
+
+  <li>Copie algumas fotos para essa pasta, altere o tamanho das imagens para serem exibidas na internet. <em>Cuidado</em>: o nome das pastas e ficheiros deve conter apenas letras, números, "-", "_" ou ".". Não use espaços em branco nem caracteres acentuados.</li>
+
+  <li>Com a ajuda de um programa de FTP, copie a sua pasta para a pasta "galleries" da sua instalação Piwigo.</li>
+
+  <li>Faça o login na sua galeria e vá até <span class="pwgScreen">Ferramentas &raquo; Miniaturas</span> para criar alguma miniatura que esteja em falta.</li>
+
+  <li>Vá até <span class="pwgScreen">Painel Administrativo</span> e clique no botão "Sincronização Rápida".</li>
+</ol>
+
+Parabéns! Você acabou de criar o primeiro álbum da sua galeria de fotos.
+
+</fieldset>
+<fieldset>
+  <legend>Organização de pastas e ficheiros</legend>
+<ul>
+
+  <li>
+
+	<p>As pastas dos álbums estão na pasta "galleries" no Piwigo. Segue aqui a árvore de diretórios de uma pequena galeria (mas usando muitos recursos) :</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>Cada pasta sob "galleries" produz um álbum. Não há limite de profundidade.</li>
+
+  <li>Basicamente, um item é representado por um ficheiro. Um ficheiro pode ser um item Piwigo se a sua extensão estiver entre as possibilidades dos parâmetros de configuração <code>file_ext</code> (veja o arquivo <span class="filename">include/config_default.inc.php</span>). Um arquivo pode ser uma imagem se a sua extensão estiver entre as possibilidades dos parâmetros de configuração <code>picture_ext</code>.</li>
+
+  <li>Os itens fotográficos devem ter uma miniatura associada (veja a secção abaixo sobre miniaturas)</li>
+
+  <li>Os itens fotográficos podem ter um arquivo de alta definição associado. Assim como para wedding.jpg no exemplo acima. Não use prefixo nas imagens de alta definição.</li>
+
+  <li>Outros itens (video, sons, arquivos de texto, o que você quiser...) são por padrão representados por um ícone correspondente à extensão do nome de arquivo. Você tem a opção de associar uma miniatura e um arquivo representativo (veja video.avi no exemplo acima).</li>
+
+  <li><em>Atenção</em>: o nome dos diretórios e dos arquivos devem conter apenas letras, números, "-", "_" ou ".". Não use espaço em branco e nem caracteres acentuados.</li>
+
+  <li>Uma vez que os arquivos, as miniaturas e representativos estiverem corretamente alocados nos diretórios,vá até : <span class="pwgScreen">Ferramentas &raquo; Sincronizar</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Miniaturas (Thumbnails)</legend>
+<ul>
+
+  <li>Cada foto deve ter a sua miniatura.</li>
+
+  <li>As miniaturas estão armazenadas no subdiretório "thumbnail" no diretório das categorias. 
+      A miniatura tem o mesmo nome de arquivo que a foto correspondente, com <em>TN-</em> como prefixo.</li>
+
+  <li><em>Atenção</em>: use um módulo externo para a criação das miniaturas.</li>
+
+  <li>Embora não seja recomendado (qualidade da imagem, carga do servidor, etc), você pode usar a página <span class="pwgScreen">Ferramentas &raquo; Miniaturas</span> para criar as miniaturas.</li>
+
+  <li>Dê permissões de escrita para todas as pastas dos álbums.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/pt_PT/index.php
===================================================================
--- tags/2.4.0RC3/language/pt_PT/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/pt_PT/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_PT/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Instalação';
+$lang['Basic configuration'] = 'Configuração Básica';
+$lang['Default gallery language'] = 'Idioma padrão da galeria';
+$lang['Database configuration'] = 'Configuração da base de dados';
+$lang['Admin configuration'] = 'Configuração da administração';
+$lang['Start Install'] = 'Iniciar a instalação';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'o endereço de email deve ser do tipo xxx@yyy.eee (exemplo : jack@altern.org)';
+$lang['Webmaster login'] = 'Login do Webmaster';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Será mostrado aos visitantes. É necessário para a administração do website';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'A ligação ao servidor foi bem sucedida, mas foi impossível ligar à base de dados';
+$lang['Can\'t connect to server'] = 'Não foi possível ligar ao servidor';
+$lang['Host'] = 'Servidor MySQL';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Utilizador';
+$lang['user login given by your host provider'] = 'Login de utilizador fornecido pelo seu provedor de hospedagem';
+$lang['Password'] = 'Palavra-passe';
+$lang['user password given by your host provider'] = 'Palavra-passe fornecida pelo seu provedor de hospedagem';
+$lang['Database name'] = 'Nome da base de dados';
+$lang['also given by your host provider'] = 'Também fornecido pelo seu provedor de hospedagem';
+$lang['Database table prefix'] = 'Prefixo da tabela da base de dados';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'Os nomes das tabelas da base de dados terão este prefixo (isto possibilita uma melhor gestão das tabelas)';
+$lang['enter a login for webmaster'] = 'Introduza um nome para o webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'o nome do webmaster não pode conter os caracteres \' ou "';
+$lang['please enter your password again'] = 'Por favor, escreva a sua palavra-passe novamente';
+$lang['Webmaster password'] = 'Palavra-passe do Webmaster';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Mantenha-a bem guardada, é ela que lhe permite aceder ao painel administrativo';
+$lang['Password [confirm]'] = 'Palavra-passe [confirmação]';
+$lang['verification'] = 'Verificar Palavra-passe inserida';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Precisa de ajuda ? Faça a sua pergunta no <a href="%s">Fórum Piwigo</a>.';
+$lang['Webmaster mail address'] = 'Endereço de email do Webmaster';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Os visitantes poderão entrar em contacto com o administrador da galeria através desse email';
+$lang['PHP 5 is required'] = 'PHP 5 é necessário';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Parece que o seu provedor de hospedagem usa actualmente PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo pode tentar mudar a sua configuração para PHP 5 através da criação ou modificação de um arquivo .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Note que você pode alterar sua configuração por conta própria e reiniciar o Piwigo depois disso.';
+$lang['Try to configure PHP 5'] = 'Tentar configurar PHP 5';
+$lang['Sorry!'] = 'Lamento!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo não pôde configurar o PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Você deve entrar em contacto com o suporte do seu provedor e saber como pode mudar para PHP 5.";
+$lang['Hope to see you back soon.'] = 'Espero que volte em breve.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Parabéns, a sua instalação Piwigo está completa';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Uma solução alternativa será copiar o texto na caixa abaixo e colá-lo no ficheiro "local/config/database.inc.php" (Atenção : database.inc.php apenas deverá conter o que está na área de texto, não insira nenhuma linha nova ou espaço em branco)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'A criação do ficheiro de configuração local/config/database.inc.php falhou.';
+$lang['Download the config file'] = 'Guardar ficheiro de configuração';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Pode guardar o ficheiro de configuração no seu computador e de seguida enviá-lo para a pasta /local/config da sua instalação.';
+$lang['Just another Piwigo gallery'] = 'Apenas uma outra galeria Piwigo';
+$lang['Welcome to my photo gallery'] = 'Bem-vindo à minha galeria de fotos';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bem-vindo à sua nova instalação do Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Não hesite em visitar nossos forums para qualquer ajuda: %s'; 
+
+?>
Index: tags/2.4.0RC3/language/pt_PT/iso.txt
===================================================================
--- tags/2.4.0RC3/language/pt_PT/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Português [PT]
Index: tags/2.4.0RC3/language/pt_PT/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/pt_PT/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/pt_PT/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Actualizar';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Recomendamos que faça uma actualização à sua base de dados para a versão mais recente. O assistente de actualização reconhece a sua versão como <strong>versão %s</strong> (ou equivalente).';
+$lang['Upgrade from version %s to %s'] = 'Actualizar da versão %s para a versão %s';
+$lang['Statistics'] = 'Estatísticas';
+$lang['total upgrade time'] = 'Tempo total de actualização';
+$lang['total SQL time'] = 'Tempo total de SQL';
+$lang['SQL queries'] = 'Consultas SQL';
+$lang['Upgrade informations'] = 'Informações da actualização';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Se encontrar algum problema durante a actualização execute uma avaliação de rotina em [Administração>Ferramentas>Manutenção].';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Por precaução os seguintes plugins foram desactivados. Deve procurar actualizações dos plugins antes de reactivá-los:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Apenas o administrador pode efectuar actualizações: por favor Inicie Sessão no formulário abaixo.';
+$lang['You do not have access rights to run upgrade'] = 'Você não tem permissões de acesso para efectuar a actualização';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Em <i>%s</i>, antes de <b>?></b>, insira:';
+$lang['All sub-albums of private albums become private'] = 'Todas as sub-categorias de categorias privadas tornam-se privadas também';
+$lang['User permissions and group permissions have been erased'] = 'Permissões de utilizador e de grupo foram apagadas.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Apenas o prefixo das miniaturas e o endereço de email do webmaster foram salvos da configuração anterior.';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Como precau&ccedil;&atilde;o os seguintes temas foram desactivados. Dever&aacute; verificar por actualiza&ccedil;&otilde;es para os temas antes de os reactivar:';
+
+?>
Index: tags/2.4.0RC3/language/ro_RO/about.html
===================================================================
--- tags/2.4.0RC3/language/ro_RO/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/about.html	(revision 14585)
@@ -0,0 +1,17 @@
+<p> Această galerie foto este bazată pe Piwigo.</p>
+
+<p> Piwigo este un software pentru galerii foto web, dezvoltat de o comunitate activă de utilizatori și dezvoltatori. Extensiile fac Piwigo ușor personalizabil. In plus, Piwigo este liber și gratuit.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Vizitează web site-ul Piwigo</a></p>
+
+Traducerea Piwigo în limba română este menținuta de :
+
+<p>Traducerea Piwigo în limba română este menținuta de :
+
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16378">madalinul1</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16422">norboo</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16282">SERGIUx</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=2393">strotti</a></li>
+	</ul>
+        .... Ii mulțumim.</p>
Index: tags/2.4.0RC3/language/ro_RO/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ro_RO/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/admin.lang.php	(revision 14585)
@@ -0,0 +1,300 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['%d association'] = '%d asociatie';
+$lang['%d associations'] = '%d asociatii';
+$lang['%d album including'] = '%d album inclusiv';
+$lang['%d albums including'] = '%d albums inclusiv';
+$lang['%d physical'] = ' %d fizic';
+$lang[' and %d virtual'] = ' si %d virtual';
+$lang['%d album moved'] = '%d album mutata';
+$lang['%d albums moved'] = '%d albums mutate';
+$lang['%d group'] = '%d grup';
+$lang['%d groups'] = '%d grupuri';
+$lang['%d member'] = '%d membru';
+$lang['%d members'] = '%d membrii';
+$lang['%d tag'] = '%d eticheta';
+$lang['%d tags'] = '%d etichete';
+$lang['%d user comment rejected'] = '%d comentariu utilizator respins';
+$lang['%d user comments rejected'] = '%d comentarii utilizator respinse';
+$lang['%d user comment validated'] = '%d comentariu utilizator validat';
+$lang['%d user comments validated'] = '%d comentarii utilizator validate';
+$lang['%d user deleted'] = '%d utilizator sters';
+$lang['%d users deleted'] = '%d utilizatori stersi';
+$lang['%d user'] = '%d utilizator';
+$lang['%d users'] = '%d utilizatori';
+$lang['%d waiting for validation'] = '%d în asteptare pentru validare';
+$lang['Actions'] = 'Actiuni';
+$lang['Activate'] = 'Activa';
+$lang['Add/delete a permalink'] = 'Adaugati / stergeti un link permanent';
+$lang['Add a tag'] = 'Adaugati o eticheta';
+$lang['Add a user'] = 'Adaugati un utilizator';
+$lang['Add group'] = 'Adaugati un grup';
+$lang['Add'] = 'Adauga';
+$lang['Allow user registration'] = 'Permite înregistrarea utilizatorilor';
+$lang['Associated'] = 'Asociat';
+$lang['Caddie management'] = 'Gestiunea caruciorului';
+$lang['Caddie'] = 'Cărucior';
+$lang['Albums authorized thanks to group associations'] = 'albums autorizate datorita asociatiilor la grupuri';
+$lang['Album photos associated to the following albums: %s'] = 'photoele albumi asociate la urmatoarele albums : %s';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Verificarea pentru ultima versiune a aplicatiei a esuat din motive necunoscute.';
+$lang['Check for upgrade'] = 'Ultima versiune?';
+$lang['Comments for all'] = 'Comentarii pentru toti';
+$lang['Current name'] = 'Numele actual';
+$lang['Database'] = 'Baza de date';
+$lang['Deactivate'] = 'Dezactivare';
+$lang['Delete Representant'] = 'Ștergeți reprezentantul';
+$lang['Delete selected tags'] = 'Ștergeți etichetele selectate';
+$lang['Delete selected users'] = 'Ștergeți utilizatorii selectați';
+$lang['Deletions'] = 'Ștergeri';
+$lang['Deny selected groups'] = 'Restricționați accesul la grupurile selecționate';
+$lang['Deny selected users'] = 'Restricționați accesul la utilizatorii selecționați';
+$lang['Description'] = 'Descriere';
+$lang['Display options'] = 'Opțiuni de afişare';
+$lang['Dissociated'] = 'Disociat de';
+$lang['Does not represent'] = 'Nu reprezintă';
+$lang['Edit photo information'] = 'Modifică informațiile legate de această imagine';
+$lang['Edit selected tags'] = 'Modifică etichetele selecționate';
+$lang['Edit tags'] = 'Modifică etichetele';
+$lang['Email admins when a new user registers'] = 'Anunță administratorii atunci cînd un nou utilizator se înregistrează';
+$lang['Email admins when a valid comment is entered'] = 'Anunță administratorii atunci cînd un comentariu valabil este înscris';
+$lang['Email admins when a comment requires validation'] = 'Anunță administratorii atunci cînd un comentariu necesită validare';
+$lang['Environment'] = 'Mediul';
+$lang['Form'] = 'Formular';
+$lang['Gallery title'] = 'Titlul galeriei';
+$lang['Grant selected groups'] = 'Asigură accesul la grupurile selectate';
+$lang['Grant selected users'] = 'Asigură accesul la utilizatorii selectați';
+$lang['Group name'] = 'Numele grupului';
+$lang['Groups'] = 'Grupuri';
+$lang['Guests'] = 'Invitați';
+$lang['History'] = 'Istoric';
+$lang['Informations'] = 'Informații';
+$lang['Install'] = 'Instalează';
+$lang['Link all album photos to a new album'] = 'Corelează toate photoele albumi la o nouă album';
+$lang['Link all album photos to some existing albums'] = 'Corelează toate photoele albumi la unele albums existente';
+$lang['Linked albums'] = 'albums corelate';
+$lang['Lock gallery'] = 'Blochează galeria';
+$lang['Maintenance'] = 'Întreţinere';
+$lang['Manage permissions for group "%s"'] = 'Gestionează permisiunile pentru grupul "%s"';
+$lang['Manage permissions for user "%s"'] = 'Gestionează permisiunile pentru utilizatorul "%s"';
+$lang['Manage tags'] = 'Gestionează etichetele';
+$lang['Members'] = 'Membrii';
+$lang['Metadata synchronized from file'] = 'Metadata sincronizate din fișier';
+$lang['Move albums'] = 'Deplasează albumsle';
+$lang['Move'] = 'Deplasează';
+$lang['Name'] = 'Nume';
+$lang['New name'] = 'Nume nou';
+$lang['New parent album'] = 'album mamă nouă';
+$lang['New tag'] = 'Etichetă nouă';
+$lang['Number of comments per page'] = 'Număr de comentarii pe pagină';
+$lang['Number of rates'] = 'Numărul evaluărilor';
+$lang['Number of thumbnails to create'] = 'Numărul miniaturilor de creat';
+$lang['Only private albums are listed'] = 'Doar albumsle private sunt enumerate';
+$lang['Operating system'] = 'Sistemul de operare';
+$lang['Options'] = 'Opțiuni';
+$lang['Other private albums'] = 'Alte albums private';
+$lang['Page banner'] = 'Panglica paginii';
+$lang['Parent album'] = 'album mamă';
+$lang['Path'] = 'Cale';
+$lang['Permalink'] = 'Permalink';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalink-ul %s a fost folosit în prealabil de album %s. Ștergeți permalink-ul din istoric mai întîi';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Permalink-ul trebuie să conțină doar caractere alfanumerice de la a-z, A-Z, 0-9, "-", "_" sau "/". Nu trebuie să fie doar numeric sau să înceapă cu un număr urmat de "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalink-ul %s este deja folosit de album %s';
+$lang['Permalink history'] = 'Istoricul permalink-ului';
+$lang['Permalinks'] = 'Permalink-uri';
+$lang['Permission denied'] = 'Acces interzis';
+$lang['Permission granted thanks to a group'] = 'Accesul autorizat datorită apartenenței la un grup';
+$lang['Permission granted'] = 'Acces autorizat';
+$lang['Plugins'] = 'Plugin-uri';
+$lang['Position'] = 'Poziție';
+$lang['Preferences'] = 'Preferințe';
+$lang['Properties'] = 'Proprietăți';
+$lang['Random photo'] = 'Fotografie la nimereală';
+$lang['Rate date'] = 'Data evaluării';
+$lang['Rating by guests'] = 'Evaluat de invitați';
+$lang['Rating'] = 'Apreciere';
+$lang['Reject'] = 'Respinge';
+$lang['Representant'] = 'Reprezentant';
+$lang['Representation of albums'] = 'Reprezentarea albumslor';
+$lang['Representative'] = 'Reprezentativă';
+$lang['Represents'] = 'Reprezintă';
+$lang['Save order'] = 'Salvează ordinea';
+$lang['Save to permalink history'] = 'Salvare în istorie la permalinks';
+$lang['Select at least one album'] = 'Selectați cel puțin o album';
+$lang['Select at least one photo'] = 'Selectați cel puțin o fotografie';
+$lang['Select at least one user'] = 'Selectați cel puțin un utilizator';
+$lang['Show info'] = 'Afișare info';
+$lang['Site manager'] = 'Managerul site-ului';
+$lang['Status'] = 'Statut';
+$lang['Statistics'] = 'Statistici';
+$lang['Storage album'] = 'album depozitului';
+$lang['Sum of rates'] = 'Suma evaluarilor';
+$lang['Tag "%s" already exists'] = 'Eticheta "%s" există deja';
+$lang['Tag "%s" was added'] = 'Eticheta "%s" a fost adăugată';
+$lang['Tag selection'] = 'Selecționarea etichetei';
+$lang['The %d following tags were deleted'] = 'Următoarele %d etichete au fost șterse';
+$lang['Unable to check for upgrade.'] = 'Imposibil de verificat pentru upgrade.';
+$lang['Uninstall'] = 'Dezinstalează';
+$lang['User comments validation'] = 'Validarea comentariilor utilizatorilor';
+$lang['Users'] = 'Utilizatori';
+$lang['Validate'] = 'Validează';
+$lang['Validation'] = 'Validare';
+$lang['Version'] = 'Versiune';
+$lang['Virtual albums to move'] = 'albums virtuale de mutat';
+$lang['Virtual album name'] = 'Numele albumslor virtuale';
+$lang['Webmaster cannot be deleted'] = 'Utilizatorul Webmaster nu poate fi șters';
+$lang['You are running on development sources, no check possible.'] = 'Folosiți sursele de dezvoltare, nu e posibil de verificat.';
+$lang['You cannot delete your account'] = 'Nu puteți șterge contul dumneavoastră';
+$lang['You need to confirm deletion'] = 'Trebuie să confirmați ștergerea';
+$lang['associate to group'] = 'asociază grupului';
+$lang['Authorized'] = 'Autorizat';
+$lang['Add a virtual album'] = 'Adaugă o album virtuală';
+$lang['Authorize users to add comments on selected albums'] = 'Autorizați utilizatorii să adauge comentarii pe albumsle selectate';
+$lang['Lock albums'] = 'Blochează albumsle';
+$lang['Private'] = 'Privată';
+$lang['private'] = 'privată';
+$lang['Public'] = 'Publică';
+$lang['public'] = 'publică';
+$lang['Find a new representant by random'] = 'Găsiți un reprezentant aleatoriu nou';
+$lang['Public / Private'] = 'Public / Privat';
+$lang['Manage authorizations for selected albums'] = 'Administrează autorizațiile pentru albumsle selectate';
+$lang['Virtual album added'] = 'album virtuală adăugată';
+$lang['Virtual album deleted'] = 'album virtuală ștearsă';
+$lang['Access type'] = 'Metodă de acces';
+$lang['%d album including'] = '%d album includ';
+$lang['%d album moved'] = '%d album mutat';
+$lang['%d albums including'] = '%d albume includ';
+$lang['%d albums moved'] = '%d albume mutate';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalii au fost detectate şi corectate.';
+$lang['%d anomalies have been detected.'] = '%d anomalii au fost detectate.';
+$lang['%d anomalies have been ignored.'] = '%d anomalii au fost ignorate.';
+$lang['%d anomalies have not been corrected.'] = '%d anomalii nu au fost corectate.';
+$lang['%d anomaly has been corrected.'] = '%d anomalie a fost corectată.';
+$lang['%d anomaly has been detected.'] = '%d anomalie a fost detectată.';
+$lang['%d anomaly has been ignored.'] = '%d anomalie a fost ignorată.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalie nu a fost corectată.';
+$lang['%d guest'] = '%d invitat';
+$lang['%d guests'] = '%d invitaţi';
+$lang['%d line filtered'] = '%d linie filtrată';
+$lang['%d lines filtered'] = '%d linii filtrate';
+$lang['%d mail was not sent.'] = '%d mesaj nu a fost trimis.';
+$lang['%d mail was sent.'] = '%d mesaj a fost trimis.';
+$lang['%d mails were not sent.'] = '%d mesaje nu au fost trimise.';
+$lang['%d mails were sent.'] = '%d mesaje au fost trimise.';
+$lang['%d of %d photos selected'] = '%d din %d fotografii selectate';
+$lang['%d parameter was updated.'] = '%d parametru adus la zi.';
+$lang['%d parameters were updated.'] = '%d parametri aduşi la zi.';
+$lang['%d photo was deleted'] = '%d fotografie ştearsă';
+$lang['%d photos uploaded'] = '%d fotografii încărcate';
+$lang['%d photos were deleted'] = '%d fotografii şterse';
+$lang['ACCESS_0'] = 'Acces liber';
+$lang['ACCESS_1'] = 'Acces pentru toţi';
+$lang['ACCESS_2'] = 'Acces pentru utilizatorii înregistraţi';
+$lang['ACCESS_3'] = 'Acces pentru administratori';
+$lang['ACCESS_4'] = 'Acces pentru administratorii de site';
+$lang['ACCESS_5'] = 'Fără acces';
+$lang['Action'] = 'Acţiune';
+$lang['Activate icon "%s"'] = 'Activează pictograma "%s"';
+$lang['Activate Navigation Bar'] = 'Activează bara de navigaţie';
+$lang['Activate Navigation Thumbnails'] = 'Activează miniaturile de navigare';
+$lang['Activate icon "new" next to albums and pictures'] = 'Activează pctograma "nou" lângă albume şi fotografii';
+$lang['Active Languages'] = 'Limbi active';
+$lang['Active Plugins'] = 'Conectori activi';
+$lang['Active Themes'] = 'Teme active';
+$lang['Add a criteria'] = 'Adaugă un criteriu';
+$lang['Add a filter'] = 'Adaugă un filtru';
+$lang['Add a virtual album'] = 'Adaugă un album virtual';
+$lang['Add another set of photos'] = 'Adaugă un nou set de fotografii';
+$lang['Add detailed content'] = 'Adaugă conţinut detaliat';
+$lang['Add New Language'] = 'Adaugă o limbă nouă';
+$lang['add new photos to caddie'] = 'adauga fotografii noi în coş';
+$lang['Add New Theme'] = 'Adaugă o temă nouă';
+$lang['Add Photos'] = 'Adaugă fotografii';
+$lang['Add write access to the "%s" directory'] = 'Adaugă drept de scriere în directorul "%s"';
+$lang['added'] = 'adăugat';
+$lang['Administration Home'] = 'Centrul de administrare';
+$lang['Advanced features'] = 'Opţiuni avansate';
+$lang['Album "%s" has been added'] = 'Albumul "%s" a fost adăugat';
+$lang['Album "%s" now contains %d photos'] = 'Albumul "%s" conţine acum %d fotografii';
+$lang['Album photos associated to the following albums: %s'] = 'Fotografii asociate următoarelor albume: %s';
+$lang['Album list management'] = 'Administrarea listei de albume';
+$lang['Album manual order was saved'] = 'Ordinea manuală a albumelor a fost salvată';
+$lang['Album name'] = 'Nume album';
+$lang['Album updated successfully'] = 'Album adus la zi cu succes';
+$lang['albums added in the database'] = 'albume adăugate în baza de date';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Contacte';
+$lang['Level 2'] = 'Prieteni';
+$lang['Level 4'] = 'Familie';
+$lang['Level 8'] = 'Administratori';
+$lang['%d user was not updated.'] = '%d utilizator nu a fost adus la zi.';
+$lang['%d user was updated.'] = '%d utilizator a fost adus la zi.';
+$lang['%d users were not updated.'] = '%d utilizatori nu au fost aduşi la zi.';
+$lang['%d users were updated.'] = '%d utilizatori au fost aduşi la zi.';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s trebuie modificat în fals în fişierul local/config/config.inc.php';
+$lang['%s value is not correct file because exif are not supported'] = '%s valoare este incorectă, deoarece exif-urile nu sunt suportate';
+$lang['+ Add an upload box'] = '+ Adauga o cutie de încărcare';
+$lang[', click on'] = ', apasă pe';
+$lang['A new version of Piwigo is available.'] = 'O nouă versiune a lui Piwigo este disponibilă.';
+$lang['Albums automatically sorted'] = 'Albume sortate automat';
+$lang['albums deleted in the database'] = 'albume şterse în baza de date';
+$lang['All %d photos are selected'] = 'Toate cele %d fotografii sunt selectate';
+$lang['All optimizations have been successfully completed.'] = 'Toate optimizările au fost terminate cu succes.';
+$lang['all'] = 'toate';
+$lang['Allow rating'] = 'Permite aprecierea';
+$lang['Allow user customization'] = 'Permite adaptarea utilizatorilor';
+$lang['Allow users to delete their own comments'] = 'Permite utilizatorilor să-şi şteargă propriile comentarii';
+$lang['Allow users to edit their own comments'] = 'Permite utilizatorilor să-şi modifice propriile comentarii';
+$lang['an error happened'] = 's-a produs o eroare';
+$lang['An error occured during extraction (%s).'] = 'S-a produs o eroare în timpul extragerii fişierelor (%s).';
+$lang['An information email was sent to group "%s"'] = 'Un mesaj de informare a fost trimis către grupul "%s"';
+$lang['and'] = 'şi';
+$lang['Anomaly'] = 'Anomalie';
+$lang['Rate'] = 'Evaluare';
+$lang['Add to caddie'] = 'adaugă în cărucior';
+
+$lang['%s has been successfully updated.'] = '% a fost actualizat cu succes.';
+$lang['%s photos can not be regenerated'] = '% fotografii nu pot fi regenerate';
+$lang['%s photos have been regenerated'] = '% fotografii au fost regenerate';
+$lang['(this tag will be deleted)'] = '(această etichetă va fi ștearsă)';
+$lang['... or '] = '...sau';
+$lang['Activate comments'] = 'Activează comentarii';
+$lang['Add tags'] = 'Adaugă etichete';
+$lang['All extensions are up to date.'] = 'Toate extensiile sunt la zi.';
+$lang['All languages are up to date.'] = 'Toate limbile sunt la zi.';
+$lang['All plugins are up to date.'] = 'Toate pluginurile sunt la zi.';
+$lang['All themes are up to date.'] = 'Toate temele sunt la zi.';
+$lang['Allowed file types: %s.'] = 'Tipuri de fişiere permise: %s';
+$lang['An error has occured during upgrade.'] = 'O eroare a apărut în timpul actualizării.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Oricum numai webmasterii pot vedea acest document, nu administratorii.';
+$lang['Apply action'] = 'Aplicați acțiunea';
+$lang['Apply selected corrections'] = 'Aplicați corecţiile selectate';
+$lang['Apply to sub-albums'] = 'Aplicați la sub-albume';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Rezoluţie maximă aproximativă: %dM pixeli (aceasta înseamnă %dx%d pixeli).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Sunteţi sigur că doriţi să instalaţi această actualizare? Trebuie să verificați dacă această versiune nu trebuie dezinstalată mai întâi.';
+$lang['Are you sure you want to delete this plugin?'] = 'Sunteți sigur că doriți sa ștergeți pluginul acesta?';
+$lang['Are you sure you want to install this plugin?'] = 'Sunteți sigur că doriți să instalați pluginul acesta?';
+$lang['Associate to album'] = 'Asociază la album';
+$lang['Automatic correction'] = 'Corectare automată';
+?>
Index: tags/2.4.0RC3/language/ro_RO/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ro_RO/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/common.lang.php	(revision 14585)
@@ -0,0 +1,409 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Română [RO]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=433
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Română';
+$lang_info['country'] = 'România';  
+$lang_info['charset'] = 'utf-8';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ro';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d categorie actualizată';
+$lang['%d albums updated'] = '%d categorii actualizate';
+$lang['%d comment to validate'] = '%d comentariu de validat';
+$lang['%d comments to validate'] = '%d comentarii de validat';
+$lang['%d new comment'] = '%d nou comentariu';
+$lang['%d new comments'] = '%d noi comentarii';
+$lang['%d comment'] = '%d comentariu';
+$lang['%d comments'] = '%d comentarii';
+$lang['%d hit'] = 'vazut %d dată';
+$lang['%d hits'] = 'vazut %d ori';
+$lang['%d new photo'] = '%d imagine nouă';
+$lang['%d new photos'] = '%d imagini noi';
+$lang['%d new user'] = '%d utilizator nou';
+$lang['%d new users'] = '%d utilizatori noi';
+$lang['About'] = 'Despre';
+$lang['All tags'] = 'Toate etichetele';
+$lang['Any tag'] = 'Orice eticheta';
+$lang['At least one listed rule must be satisfied.'] = 'Cel puţin o singură regulă trebuie să fie îndeplinită';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Categorii';
+$lang['Album'] = 'Categorie';
+$lang['Close this window'] = 'Inchide această fereastră';
+$lang['Complete RSS feed (photos, comments)'] = 'Flux RSS complet (imagini, comentarii)';
+$lang['Confirm Password'] = 'Confirmare parolă';
+$lang['Connection settings'] = 'Parametrii de conecţie';
+$lang['Login'] = 'Conecţie';
+$lang['Contact webmaster'] = 'Contactaţi webmasterul';
+$lang['Create a new account'] = 'Creaţi un cont nou';
+$lang['Created on'] = 'Creat pe';
+$lang['Creation date'] = 'Data creaţiei';
+$lang['Current password is wrong'] = 'Parola actuală nu este corectă';
+$lang['Dimensions'] = 'Dimensii';
+$lang['Display'] = 'Afişare';
+$lang['Each listed rule must be satisfied.'] = 'Fiecare regulă enumerată trebuie să fie îndeplinită';
+$lang['Email address'] = 'Adresa de e-mail';
+$lang['Enter your personnal informations'] = 'Introduceţi informaţiile dvs. personale';
+$lang['Error sending email'] = 'Eroare la trimiterea de e-mail';
+$lang['File name'] = 'Nume de fişier';
+$lang['File'] = 'Fişier';
+$lang['Filesize'] = 'Mărime fişier';
+$lang['Filter and display'] = 'Filtrează şi afişează';
+$lang['Filter'] = 'Filtrează';
+$lang['Forgot your password?'] = 'Aţi uitat parola?';
+$lang['Go through the gallery as a visitor'] = 'Navigaţi prin galerie ca un vizitator';
+$lang['Help'] = 'Ajutor';
+$lang['Identification'] = 'Identificare';
+$lang['Photos only RSS feed'] = 'RSS feed numai cu imagini';
+$lang['Keyword'] = 'Cuvînt cheie';
+$lang['Links'] = 'Link-uri';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Nou pe %s';
+$lang['Notification'] = 'Notificare';
+$lang['Number of items'] = 'Numărul de articole';
+$lang['Original dimensions'] = 'Dimensiuni originale';
+$lang['Password forgotten'] = 'Parola uitată';
+$lang['Password'] = 'Parola';
+$lang['Post date'] = 'Dată post';
+$lang['Posted on'] = 'Postat pe';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Conectare rapidă';
+$lang['RSS feed'] = 'RSS feed';
+$lang['Register'] = 'Înscrie';
+$lang['Registration'] = 'Înscriere';
+$lang['Related tags'] = 'Etichete asociate';
+$lang['Reset'] = 'Resetare';
+$lang['Retrieve password'] = 'Recuperare parolă';
+$lang['Search rules'] = 'Criterii de căutare';
+$lang['Search tags'] = 'Caută etichete';
+$lang['Search'] = 'Caută';
+$lang['display available tags'] = 'Vezi etichetele disponibile';
+$lang['Since'] = 'De la';
+$lang['Sort by'] = 'Sortare după';
+$lang['Sort order'] = 'Ordine de sortare';
+$lang['Tag'] = 'Etichetă';
+$lang['Tags'] = 'Etichete';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Notificarea RSS feed prevede notificarea cu privire la noutăţile din acest site: poze noi, categorii actualizate, noi comentarii. Folosiţi un RSS feed reader.';
+$lang['Unknown feed identifier'] = 'Identificator RSS feed  necunoscut';
+$lang['User comments'] = 'Comentarii utilizator ';
+$lang['Username'] = 'Nume de utilizator';
+$lang['Visits'] = 'Vizite';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Săptămâna %d';
+$lang['About Piwigo'] = 'Despre Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Nu sunteţi autorizat sa accesaţi pagina solicitată';
+$lang['add this photo to your favorites'] = 'adăuga această imagine la favorite';
+$lang['Administration'] = 'Administraţie';
+$lang['all'] = 'tot';
+$lang['ascending'] = 'ascendent';
+$lang['author(s) : %s'] = 'autor(i) : %s';
+$lang['Expand all albums'] = 'Extinde toate categoriile';
+$lang['posted after %s (%s)'] = 'postat după %s (%s)';
+$lang['posted before %s (%s)'] = 'postat înainte de %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'postat între %s (%s) şi %s (%s)';
+$lang['posted on %s'] = 'postat pe %s';
+$lang['Best rated'] = 'Cel mai bun evaluat';
+$lang['display best rated photos'] = 'afişează cele mai bune imagini';
+$lang['Calendar'] = 'Calendar';
+$lang['All'] = 'Tot';
+$lang['display each day with photos, month per month'] = 'Afişare an de an, lună de lună, zi de zi';
+$lang['View'] = 'Vedere';
+$lang['chronology_monthly_calendar'] = 'Calendar lunar';
+$lang['chronology_monthly_list'] = 'Lista lunară';
+$lang['chronology_weekly_list'] = 'Listă săptămânală ';
+$lang['Click here if your browser does not automatically forward you'] = 'Click aici dacă browser-ul nu va trimite în mod automat';
+$lang['comment date'] = 'data comentariului';
+$lang['Comment'] = 'Comentariu';
+$lang['Your comment has been registered'] = 'Comentariul dvs. a fost înregistrat';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Sistem Anti-flood: vă rugăm aşteptaţi o clipă înainte de a încerca să postaţi un alt comentariu';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Comentariul dvs. nu a fost înregistrat deoarece nu a trecut regulile de validare';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Un administrator trebuie să autorizeze comentariul dvs. înainte de a deveni vizibil.';
+$lang['This login is already used by another user'] = 'Acest nume este deja folosit de un alt utilizator';
+$lang['Comments'] = 'Comentarii';
+$lang['Add a comment'] = 'Adaugă un comentariu';
+$lang['created after %s (%s)'] = 'creat după %s (%s)';
+$lang['created before %s (%s)'] = 'create înainte de %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'creat între %s (%s) şi %s (%s)';
+$lang['created on %s'] = 'creat pe %s';
+$lang['Customize'] = 'Particularizează';
+$lang['Your Gallery Customization'] = 'Personalizarea Galeriei dvs.';
+$lang['Default'] = 'În mod implicit';
+$lang['delete this photo from your favorites'] = 'şterge această imagine din favorite';
+$lang['Delete'] = 'Şterge';
+$lang['descending'] = 'descendent';
+$lang['Download'] = 'descărcare';
+$lang['Download this file'] = 'descărcă acest fişier';
+$lang['edit'] = 'editează';
+$lang['wrong date'] = 'dată greşită';
+$lang['day'][0] = 'Duminică';
+$lang['day'][1] = 'Luni';
+$lang['day'][2] = 'Marţi';
+$lang['day'][3] = 'Miercuri';
+$lang['day'][4] = 'Joi';
+$lang['day'][5] = 'Vineri';
+$lang['day'][6] = 'Sâmbătă';
+$lang['excluded'] = 'exclus';
+$lang['Your favorites'] = 'Preferatele mele';
+$lang['display your favorites photos'] = 'Afişează imaginile mele preferate';
+$lang['Favorites'] = 'Preferat(e)';
+$lang['First'] = 'Prima(ul)';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galeria este blocată pentru întreţinere. Vă mulţumim reveniţi mai târziu.';
+$lang['Page generated in'] = 'Pagina generată în';
+$lang['guest'] = 'vizitator';
+$lang['Hello'] = 'Bună ziua';
+$lang['available for administrators only'] = 'disponibil numai pentru administratori';
+$lang['display this album'] = 'prezintă imagini de la rădăcina acestei categorii';
+$lang['display last user comments'] = 'Vezi cele mai recente comentarii ale utilizatorilor';
+$lang['customize the appareance of the gallery'] = 'personalizează aspectul galeriei';
+$lang['search'] = 'căutare';
+$lang['Home'] = 'Prima pagină';
+$lang['in this album'] = 'în această categorie';
+$lang['in %d sub-album'] = 'în %d sub-categorie';
+$lang['in %d sub-albums'] = 'în %d sub-categorii';
+$lang['included'] = 'inclus';
+$lang['Invalid password!'] = 'Parolă invalidă !';
+$lang['Language'] = 'Limbă';
+$lang['last %d days'] = 'ultimele %d zile';
+$lang['Last'] = 'Ultima(ul)';
+$lang['Logout'] = 'Deconectare';
+$lang['obligatory'] = 'obligatorie';
+$lang['Maximum photo height'] = 'Înălţimea maximă a imaginii';
+$lang['Maximum height must be a number superior to 50'] = 'Înălţimea maximă trebuie să fie mai mare de 50';
+$lang['Maximum photo width'] = 'Lăţimea maximă a imaginilor';
+$lang['Maximum width must be a number superior to 50'] = 'Lăţimea maximă trebuie să fie mai mare de 50';
+$lang['display a calendar by creation date'] = 'afişează un calendar în funcţie de data creării';
+$lang['display all photos in all sub-albums'] = 'afişează toate elementele în toate sub-categoriile';
+$lang['return to normal view mode'] = 'Înapoi la vizualizarea normală';
+$lang['display a calendar by posted date'] = 'afişează un calendar în funcţie de data adăugării';
+$lang['Most visited'] = 'Cele mai vizionate';
+$lang['display most visited photos'] = 'afişează imaginile cele mai vizionate';
+$lang['The number of photos per page must be a not null scalar'] = 'Numărul de imagini pe pagină trebuie să fie un număr întreg nenul';
+$lang['Number of photos per page'] = 'Numărul de miniaturi pe pagină';
+$lang['Unknown identifier'] = 'Identificator necunoscut ';
+$lang['New password'] = 'Parolă nouă';
+$lang['Rate this photo'] = 'Evaluează aceasta imagine';
+$lang['Next'] = 'Următor(oare)';
+$lang['no rate'] = 'nici o evaluare';
+$lang['Photos posted within the last %d day.'] = 'Elemente postate în ultima %d zi.';
+$lang['Photos posted within the last %d days.'] = 'Elemente postate în ultimele %d zile.';
+$lang['password updated'] = 'parolă actualizată';
+$lang['Recent period must be a positive integer value'] = 'perioada recentă trebuie să fie un număr întreg pozitiv';
+$lang['photo'] = 'imagine';
+$lang['Click on the photo to see it in high definition'] = 'Clicaţi pe imagine pentru a o vedea de înaltă definiţie';
+$lang['Show file metadata'] = 'Arată metadatele fişierului';
+$lang['Powered by'] = 'Realizat de';
+$lang['Preferences'] = 'Preferinţe';
+$lang['Random photos'] = 'Imagini aleatoare';
+$lang['display a set of random photos'] = 'afişează un set de imagini aleatoare';
+$lang['Recent albums'] = 'Categorii recente';
+$lang['Recent albums'] = 'Categorii recente';
+$lang['display recently updated albums'] = 'afişează categoriile create  sau actualizate recent ';
+$lang['Recent period'] = 'Recent';
+$lang['Recent photos'] = 'Imagini recente';
+$lang['display most recent photos'] = 'afişează cele mai recente imagini';
+$lang['Redirection...'] = 'Redirecţionare...';
+$lang['Please, enter a login'] = 'Vă rugăm, introduceţi un nume de utilizator';
+$lang['login mustn\'t end with a space character'] = 'numele de utilizator nu trebuie să se încheie cu un spaţiu';
+$lang['login mustn\'t start with a space character'] = 'numele de utilizator nu trebuie sa înceapă cu un spaţiu';
+$lang['this login is already used'] = 'acest nume este deja folosit';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'adresa de e-mail trebuie să fie de genul xxx@yyy.eee (de exemplu: jack@altern.org)';
+$lang['please enter your password again'] = 'vă rugăm să introduceţi parola din nou';
+$lang['Auto login'] = 'Conectare automatică';
+$lang['remove this tag from the list'] = 'eliminaţi acesta etichetă de pe lista';
+$lang['representative'] = 'reprezentant';
+$lang['Search for Author'] = 'Caută autor';
+$lang['Search in albums'] = 'Caută în categorii';
+$lang['Previous'] = 'Precedent(e)';
+$lang['Search by date'] = 'Căutare după dată';
+$lang['Date'] = 'Dată';
+$lang['End-Date'] = 'Expiră';
+$lang['Kind of date'] = 'Tip de dată';
+$lang['Search for words'] = 'Caută cuvinte';
+$lang['Search for all terms'] = 'Caută toţi termenii';
+$lang['Search for any term'] = 'Cauta după oricare dintre termeni';
+$lang['Empty query. No criteria has been entered.'] = 'Interogare goală. Nici un criteriu nu a fost introdus.';
+$lang['Search results'] = 'Rezultatele căutării';
+$lang['Search in sub-albums'] = 'Caută în sub-categorii';
+$lang['searched words : %s'] = 'cuvinte căutate : %s';
+$lang['Contact'] = 'Contact';
+$lang['set as album representative'] = 'Setaţi ca reprezentant al acestei categorii';
+$lang['Show number of comments'] = 'Arată numărul de comentarii';
+$lang['Show number of hits'] = 'Arată numărul de vizualizări';
+$lang['slideshow'] = 'prezentare';
+$lang['stop the slideshow'] = 'opreşte prezentarea';
+$lang['Specials'] = 'Speciale';
+$lang['SQL queries in'] = 'interogări SQL în';
+$lang['display only recently posted photos'] = 'Arată numai elementele publicate recent';
+$lang['return to the display of all photos'] = 'reveniţi la afişarea tuturor imaginilor';
+$lang['the beginning'] = 'începutul';
+$lang['Interface theme'] = 'Tema Interfeţei';
+$lang['Thumbnails'] = 'Miniaturi';
+$lang['Menu'] = 'Meniu';
+$lang['A comment on your site'] = 'Un comentariu pe site-ul dvs.';
+$lang['today'] = 'azi';
+$lang['Update your rating'] = 'Actualizaţi evaluarea dvs.';
+$lang['the username must be given'] = 'numele utilizatorului trebuie să fie specificat';
+$lang['useful when password forgotten'] = 'utilă în cazul în care uitaţi parola';
+$lang['Quick search'] = 'Căutare rapidă';
+$lang['Connected user: %s'] = 'Utilizator conectat : %s';
+$lang['IP: %s'] = 'Adresa IP : %s';
+$lang['Browser: %s'] = 'Navigator : %s';
+$lang['Author: %s'] = 'Autor : %s';
+$lang['Comment: %s'] = 'Comentariu : %s';
+$lang['Comment by %s'] = 'Comentarii de %s';
+$lang['User: %s'] = 'Utilizator: %s';
+$lang['Email: %s'] = 'E-mail : %s';
+$lang['Admin: %s'] = 'Administraţie : %s';
+$lang['Registration of %s'] = 'Înregistrare de %s';
+$lang['Album: %s'] = 'Categorie : %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Statutul utilizatorului "invitat" este eronat, se vor folosi  parametrii impliciţi. Va rugăm sa informaţi webmasterul.';
+$lang['this email address is already in use'] = 'un alt utilizator foloseşte deja acest e-mail';
+$lang['Album results for'] = 'Rezultatele categoriilor pentru';
+$lang['Tag results for'] = 'Rezultatele  etichetelor pentru';
+$lang['from %s to %s'] = 'de la %s până la %s';
+$lang['Play of slideshow'] = 'Startează prezentarea';
+$lang['Pause of slideshow'] = 'Pune pe pauză prezentarea';
+$lang['Repeat the slideshow'] = 'Repetă prezentarea';
+$lang['Not repeat the slideshow'] = 'Nu repeta prezentarea';
+$lang['Reduce diaporama speed'] = 'Încetineşte viteza prezentării';
+$lang['Accelerate diaporama speed'] = 'Accelerează viteza prezentării';
+$lang['Submit'] = 'Execută';
+$lang['Yes'] = 'Da';
+$lang['No'] = 'Nu';
+$lang['%d photo'] = '%d imagine';
+$lang['%d photos'] = '%d imagini';
+$lang['%d photo is also linked to current tags'] = '%d Imaginea este de asemenea legată de etichetele actuale';
+$lang['%d photos are also linked to current tags'] = '%d Imaginile sunt de asemenea legate de etichetele actuale';
+$lang['display photos linked to this tag'] = 'Vezi numai imagini legate de această etichetă';
+$lang['photos posted during the last %d days'] = 'Imagini adăugate în ultimele %d zile';
+$lang['Piwigo Help'] = 'Ajutor pentru Piwigo';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'regrupează pe litere';
+$lang['letters'] = 'litere';
+$lang['show tag cloud'] = 'arată norul de etichete';
+$lang['cloud'] = 'nor';
+$lang['Reset to default values'] = 'Reveniţi la setările implicite';
+$lang['delete all photos from your favorites'] = 'scoate-ţi toate pozele din preferinţele dvs.';
+$lang['Sent by'] = 'Trimis de';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookie-urile sunt blocate sau nu sunt suportate de browser-ul dumneavoastră. Trebuie să activaţi  cookie-urile pentru a vă conecta.';
+$lang['Edit a comment'] = 'modifică un comentariu';
+$lang['Are you sure?'] = 'Sunteţi sigur(ă) ?';
+$lang['(!) This comment requires validation'] = '(!) Acest comentariu trebuie să fie validat';
+$lang['Welcome'] = 'Bine aţi venit';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Bine aţi venit la galeria dvs. foto Piwigo !';
+$lang['... or browse your empty gallery'] = '... sau navigaţi prin galeria dvs. vidă';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... sau vă rugăm să dezactivaţi acest mesaj, mă voi descurca singur';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Bună ziua %s, galeria dvs. foto Piwigo este vidă !';
+$lang['I want to add photos'] = 'Vreau să adaug poze';
+$lang['Manage this user comment: %s'] = 'Administrează acest comentariu de utilizator: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Adresa de email lipseşte. Vă rugăm să specificaţi o adresă de e-mail.';
+$lang['This author modified following comment:'] = 'Acest autor a modificat următorul comentariu :';
+$lang['This author removed the comment with id %d'] = 'Acest autor a şters comentariul cu id-ul %d';
+$lang['month'][10] = 'Octombrie';
+$lang['month'][11] = 'Noiembrie';
+$lang['month'][12] = 'Decembrie';
+$lang['month'][1] = 'Ianuarie';
+$lang['month'][2] = 'Februarie';
+$lang['month'][3] = 'Martie';
+$lang['month'][4] = 'Aprilie';
+$lang['month'][5] = 'Mai';
+$lang['month'][6] = 'Iunie';
+$lang['month'][7] = 'Iulie';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'Septembrie';
+$lang['html tags are not allowed in login'] = 'tag-urile HTML nu sunt permise în login';
+
+$lang['Change my password'] = 'Schimba parola';
+$lang['Check your email for the confirmation link'] = 'Verifica-ti emailul pentru link-ul de confirmare';
+$lang['Edit'] = 'Editeaza';
+$lang['Enter your new password below.'] = 'Repeta noua parola aici';
+$lang['Hello %s,'] = 'Hello%s,';
+$lang['Here are your connection settings'] = 'Aici ai setarile de conectare';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Daca acesta e o greseala, doar ignora acest email si nimic nu se va intampla.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Daca crezi ca ai primit acest mail eronat, te rugam sa ne contactezi la%s';
+$lang['Invalid key'] = 'Cheie invalida';
+$lang['Invalid username or email'] = 'User sau email incorect';
+$lang['large'] = 'Mare';
+$lang['medium'] = 'Mediu';
+$lang['Mobile'] = 'Mobil';
+$lang['Original'] = 'Original';
+$lang['Password reset is not allowed for this user'] = 'Resetarea parolei nu este permisa pentru acest user';
+$lang['Password Reset'] = 'Resetare parola';
+$lang['Password: %s'] = 'Parola:%s';
+$lang['Photo sizes'] = 'Marime fotografie';
+$lang['Please enter your username or email address.'] = 'Introduceti userul sau adresa de email';
+$lang['Return to home page'] = 'Reveniti la pagina principala';
+$lang['Send my connection settings by email'] = 'Trimiteti-mi setarile conexiunii pe email';
+$lang['Show latest comments first'] = 'Arata-mi cele mai noi comentarii';
+$lang['Show oldest comments first'] = 'Arata-mi cele mai vechi comentarii';
+$lang['small'] = 'Mic';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Cineva a cerut resetarea parolei pentru contul acestui user';
+$lang['square'] = 'Patrat';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Inregistrarea a fost cu succes, curand vei primi un email cu setarile conexiunii.Bine ai venit!!!';
+$lang['Thank you for registering at %s!'] = 'Multumim pentru inregistrarea la%s!';
+$lang['The passwords do not match'] = 'Parola nu se potriveste';
+$lang['To reset your password, visit the following address:'] = 'Pentru a reseta parola, click pe urmatorul link';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Userul"%s" nu are o adresa de email, resetarea parolei nu va fi posibila';
+$lang['Username modification'] = 'Modificare user';
+$lang['Username or email'] = 'User sau email';
+$lang['Username: %s'] = 'User:%s';
+$lang['View in'] = 'Vezi in';
+$lang['You will receive a link to create a new password via email.'] = 'Vei primi un link pe email pentru a creea o noua parola';
+$lang['Your password has been reset'] = 'Parola ta a fost resetata';
+$lang['Your username has been successfully changed to : %s'] = 'Userul tau a fost schimbat cu succes in:%s';
+$lang['%d rates'] = '%d rating';
+$lang['Desktop'] = 'Prima pagina';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Rating score'] = 'Scor mediu';
+$lang['thumb'] = 'Thumb';
+$lang['Username "%s" on gallery %s'] = 'User "%s" pe aceasta pagina %s';
+$lang['xlarge'] = 'XLarge';
+$lang['xxlarge'] = 'XXLarge';
+$lang['2small'] = 'XXS - mic';
+$lang['xsmall'] = 'XS - foarte mic';
+$lang['Date created, new &rarr; old'] = 'Data crearii , nou &rarr; vechi';
+$lang['Date created, old &rarr; new'] = 'Data crearii, vechi &rarr; nou';
+$lang['Date posted, new &rarr; old'] = 'Data postarii, nou &rarr; vechi';
+$lang['Date posted, old &rarr; new'] = 'Data postari, vechi &rarr; nou';
+$lang['File name, A &rarr; Z'] = 'Numele filei , A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Numele filei, Z &rarr; A';
+$lang['Manual sort order'] = 'Ordonarea manuala';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Identificatorul numeric, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Identificatorul numeric, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Titlul pozei A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Titlul pozei Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Scorul de rating, ridicat &rarr; scazut';
+$lang['Rating score, low &rarr; high'] = 'Scorul de rating, scazut &rarr; ridicat';
+$lang['Visits, high &rarr; low'] = 'Vizite , ridicat &rarr; scazut';
+$lang['Visits, low &rarr; high'] = 'Vizite, scazut &rarr; ridicat';
+?>
Index: tags/2.4.0RC3/language/ro_RO/index.php
===================================================================
--- tags/2.4.0RC3/language/ro_RO/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ro_RO/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ro_RO/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['Admin configuration'] = 'Configurarea Adminului';
+$lang['also given by your host provider'] = 'De asemenea oferita de host';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'O solutie alternativa ar fi sa copiezi textul din casuta de deasupra si sa il scrii in fila "local/config/database.inc.php" 
+(Atentie database.inc.php trebuie sa contina doar caracterele din text, fara linie sau space)';
+$lang['Basic configuration'] = 'Configurarea de baza';
+$lang['Can\'t connect to server'] = 'Nu se poate conecta la server';
+$lang['Congratulations, Piwigo installation is completed'] = 'Felicitari, Piwigo s-a instalat cu succes.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Conectarea la server reusita, dar conexiunea cu baza de data este imposibila';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Creearea filei local/config/database.inc.php a esuat';
+$lang['Database configuration'] = 'Configurarea datezi de baze';
+$lang['Database name'] = 'Numele bazei de date';
+$lang['Database table prefix'] = 'Prefixele tabelelor bazei de date';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'Tabelele bazei de date vor avea prefix ( permitandu-ti o mai usoara administrare)';
+$lang['Default gallery language'] = 'Limba default a galeriei';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Nu ezita sa vizitezi forumul pentru ajutor %s';
+$lang['Download the config file'] = 'Descarca fila de configurare';
+$lang['enter a login for webmaster'] = 'Introduceti userul pentru webmaster';
+$lang['Hope to see you back soon.'] = 'Speram sa te revedem curand! Pa.';
+$lang['Host'] = 'Host';
+$lang['Installation'] = 'Instalare';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Se pare ca webhostul tau ruleaza PHP %s.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Va fi afisata vizitatorilor. Este necesara pentru administrarea site-ului.';
+$lang['Just another Piwigo gallery'] = 'Doar o alta galerie Piwigo';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Tine-o secreta, iti permite accesul la panoul de administrare';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Adresa de mail trebuie sa fie de forma  xxx@yyy.eee (example : jack@altern.org)';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Ai nevoie de ajutor? Intreaba pe <a href="%s">Forumul Piwigo</a>.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Poti sa schimbi configuratia manual si sa restartezi Piwigo dupa aceea.';
+$lang['Password [confirm]'] = 'Parola [confirma]';
+$lang['Password'] = 'Parola';
+$lang['PHP 5 is required'] = 'PHP5 este necesar';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo va incerca sa treaca configuratia ta la PHP5 folosind o fila  .htaccess';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nu a putut sa configureze PHP5';
+$lang['please enter your password again'] = 'Introduce parola inca o data';
+$lang['Sorry!'] = 'Imi pare rau!';
+$lang['Start Install'] = 'Incepe instalarea';
+$lang['Try to configure PHP 5'] = 'Incearca sa configurezi PHP5';
+$lang['user login given by your host provider'] = 'Userul oferit de providerul de host.';
+$lang['user password given by your host provider'] = 'Parola oferita de providerul de host';
+$lang['User'] = 'User';
+$lang['verification'] = 'verificarea';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Vizitatorii vor folosii aceasta adresa pentru a contacta administratorul';
+$lang['webmaster login can\'t contain characters \' or "'] = 'Userul nu poate sa contina caracterele \' sau "';
+$lang['Webmaster login'] = 'Webmaster login';
+$lang['Webmaster mail address'] = 'Adresa de e-mail a webmasterului';
+$lang['Webmaster password'] = 'Parola';
+$lang['Welcome to my photo gallery'] = 'Bine ati venit la galeria mea foto';
+$lang['Welcome to your new installation of Piwigo!'] = 'Bine ai venit la noua instalare Piwigo!';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Poti sa descarci fila de configurare si sa o uploadezi in folderul local/config al instalarii.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ar trebui sa te adresezi hostului si sa intrebi cum poti sa treci la PHP5';
+?>
Index: tags/2.4.0RC3/language/ro_RO/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ro_RO/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Română [RO]
Index: tags/2.4.0RC3/language/ro_RO/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ro_RO/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ro_RO/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['All sub-albums of private albums become private'] = 'Toate sub-albumele ale albumelor private devin private';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ca precatuie urmatoarele pluginuri au fost dezactivate. Trebuie sa le verifici de actualizari inainte de a le activa';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Ca precautie urmatoarele teme au fost dezactivate. Trebuie sa verifici de actualizari inainte de a le activa.';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'In <i>%s</i>, inainte de <b></b>, insert:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Numai un administrator poate face upgrade. Te rog logheaza-te mai jos.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Numai prefixurile thumbnailurilor si adresa de mail a webmasterului au fost salvate';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Ruleaza o verificare de mentenanta in [Administration>Tools>Maintenance] daca intampini probleme';
+$lang['SQL queries'] = 'Interogari SQL';
+$lang['Statistics'] = 'Statistici';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Aceasta pagina upgradeaza baza de date de la o versiunea mai veche de Piwigo la cea noua.
+In acest moment rulezi <strong>release %s</strong>';
+$lang['total SQL time'] = 'timpul total SQL';
+$lang['total upgrade time'] = 'Timpul total pentru upgrade';
+$lang['Upgrade from version %s to %s'] = 'Upgradeaza de la versiunea  %s la %s';
+$lang['Upgrade informations'] = 'Informatiile pentru upgrade';
+$lang['Upgrade'] = 'Upgradeaza';
+$lang['User permissions and group permissions have been erased'] = 'Userii si permisiunile grupurilor au fost sterse';
+$lang['You do not have access rights to run upgrade'] = 'Nu ai acces pentru a face upgrade';
+?>
Index: tags/2.4.0RC3/language/ru_RU/about.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/about.html	(revision 14585)
@@ -0,0 +1,16 @@
+<p>Эта фотогалерея работает на Piwigo.</p>
+
+<p>Piwigo -  система управления контентом (CMS) для сайта-фотогалереи, поддерживается активным сообществом пользователей и разработчиков. Разнообразные плагины делают Piwigo гибкой и легко модифицируемой системой. Особенно ценно то, что Piwigo - бесплатная CMS с открытым исходным кодом.</p>
+
+<p id="linkToPiwigo"><a href="http://ru.piwigo.org">Посетите официальный сайт Piwigo</a></p>
+
+<p>Актуальность русской локализации поддерживается (в алфавитном порядке):
+
+    <ul>
+        <li><a href="http://ru.piwigo.org/forum/profile.php?id=6705">ie</a></li>
+		<li><a href="http://ru.piwigo.org/forum/profile.php?id=4895">kiddy-admin</a></li>
+		<li><a href="http://ru.piwigo.org/forum/profile.php?id=16485">marchelly</a></li>
+        <li><a href="http://ru.piwigo.org/forum/profile.php?id=3180">nadusha</a></li>
+		<li><a href="http://ru.piwigo.org/forum/profile.php?id=6714">yuragal</a></li>
+    </ul>
+           .... спасибо вам большое</p>
Index: tags/2.4.0RC3/language/ru_RU/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/admin.lang.php	(revision 14585)
@@ -0,0 +1,900 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d связь';
+$lang['%d associations'] = '%d связей';
+$lang['%d album including'] = '%d альбом включает';
+$lang['%d albums including'] = '%d альбомов включают ';
+$lang['%d physical'] = '%d реальная';
+$lang['%d physical'] = '%d реальных';
+$lang[' and %d virtual'] = ' и %d виртуальная';
+$lang[' and %d virtual'] = ' и %d виртуальных';
+$lang['%d album moved'] = '%d альбом перемещен';
+$lang['%d albums moved'] = '%d альбомы перемещены';
+$lang['%d group'] = '%d группа';
+$lang['%d groups'] = '%d групп';
+$lang['%d member'] = '%d участник';
+$lang['%d members'] = '%d участников';
+$lang['%d tag'] = '%d метка';
+$lang['%d tags'] = '%d метки';
+$lang['%d user comment rejected'] = '%d комментарий посетителя отклонен';
+$lang['%d user comments rejected'] = '%d комментариев посетителей отклонено';
+$lang['%d user comment validated'] = '%d комментарий посетителя принят';
+$lang['%d user comments validated'] = '%d комментариев посетителей принято';
+$lang['%d user deleted'] = '%d пользователь удален';
+$lang['%d users deleted'] = '%d пользователей удалено';
+$lang['%d user'] = '%d пользователь';
+$lang['%d users'] = '%d пользователей';
+$lang['%d waiting for validation'] = '%d ожидает проверки';
+$lang['Actions'] = 'Действия';
+$lang['Activate'] = 'Активировать';
+$lang['Add/delete a permalink'] = 'Добавить/удалить постоянную ссылку';
+$lang['Add a tag'] = 'Добавить метку';
+$lang['Add a user'] = 'Добавить пользователя';
+$lang['Add group'] = 'Добавить группу';
+$lang['Add'] = 'Добавить';
+$lang['Allow user registration'] = 'Разрешить регистрацию пользователей';
+$lang['Apply to sub-albums'] = 'Применить к вложенным альбомам';
+$lang['Associated'] = 'Связаны';
+$lang['Caddie management'] = 'Управление корзиной';
+$lang['Caddie'] = 'Корзина';
+$lang['Albums authorized thanks to group associations'] = 'Альбомы разрешены благодаря группе ассоциаций';
+$lang['Album manual order was saved'] = 'Ручной порядок альбомов был сохранен';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Проверка обновлений не удалась по неизвестным причинам.';
+$lang['Check for upgrade'] = 'Проверить обновления';
+$lang['Comments for all'] = 'Комментарии для всех';
+$lang['Current name'] = 'Текущее название';
+$lang['Database'] = 'База данных';
+$lang['Deactivate'] = 'Выключить';
+$lang['Delete Representant'] = 'Удалить представителя';
+$lang['Delete selected tags'] = 'Удалить выбранные метки';
+$lang['Delete selected users'] = 'Удалить выбранных пользователей';
+$lang['Deletions'] = 'Удаления';
+$lang['Deny selected groups'] = 'Отмена выбора групп';
+$lang['Deny selected users'] = 'Отмена выбора пользователей';
+$lang['Description'] = 'Описание';
+$lang['Display options'] = 'Варианты показа';
+$lang['Dissociated'] = 'Не связанные';
+$lang['Does not represent'] = 'Нет представителя';
+$lang['Edit selected tags'] = 'Редактировать выделенные метки';
+$lang['Edit tags'] = 'Редактировать метки';
+$lang['Email admins when a new user registers'] = 'Сообщать администратору когда зарегистрировался новый посетитель';
+$lang['Email admins when a valid comment is entered'] = 'Сообщать администратору когда появился комментарий';
+$lang['Email admins when a comment requires validation'] = 'Сообщать администратору когда появился комментарий для проверки';
+$lang['Environment'] = 'Окружение';
+$lang['Form'] = 'Действия';
+$lang['Gallery title'] = 'Название галереи';
+$lang['Grant selected groups'] = 'Разрешить доступ выбранным группам';
+$lang['Grant selected users'] = 'Разрешить доступ выбранным пользователям';
+$lang['Group name'] = 'Название группы';
+$lang['Groups'] = 'Группы';
+$lang['Guests'] = 'Гости';
+$lang['History'] = 'История';
+$lang['Informations'] = 'Информация';
+$lang['Install'] = 'Установить';
+$lang['Link all album photos to a new album'] = 'Привязать все фотографии альбома к новому альбому';
+$lang['Link all album photos to some existing albums'] = 'Привязать все фотографии альбома к существующим альбомам';
+$lang['Linked albums'] = 'Связать альбомы';
+$lang['Lock gallery'] = 'Заблокированные галереи';
+$lang['Maintenance'] = 'Обслуживание';
+$lang['Edit album permissions'] = 'Управлять разрешением для альбомов';
+$lang['Manage permissions for group "%s"'] = 'Управление разрешениями для группы "%s"';
+$lang['Manage permissions for user "%s"'] = 'Управление разрешениями для пользователя "%s"';
+$lang['Manage tags'] = 'Управление метками';
+$lang['Members'] = 'Участники';
+$lang['Metadata synchronized from file'] = 'Метаданные синхронизированы с файлом';
+$lang['Move albums'] = 'Переместить альбом';
+$lang['Move'] = 'Перемещение';
+$lang['Name'] = 'Название';
+$lang['New name'] = 'Новое название';
+$lang['New parent album'] = 'Новый родительский альбом';
+$lang['New tag'] = 'Новая метка';
+$lang['Number of comments per page'] = 'Количество комментариев на странице';
+$lang['Number of rates'] = 'Количество оценок';
+$lang['Number of thumbnails to create'] = 'Количество создаваемых миниатюр';
+$lang['Only private albums are listed'] = 'Показаны только приватные альбомы';
+$lang['Operating system'] = 'Операционная система';
+$lang['Options'] = 'Опции';
+$lang['Other private albums'] = 'Другие приватные альбомы';
+$lang['Page banner'] = 'Надпись на баннере';
+$lang['Parent album'] = 'Родительский альбом';
+$lang['Path'] = 'Путь';
+$lang['Permalink'] = 'Постоянная ссылка';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Постоянная ссылка %s была ранее использована для альбома %s. Удалите ее сначала из истории постоянных ссылок';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Имя постоянной ссылки должно состоять из a-z, A-Z, 0-9, "-" или "_". Оно не должно быть числовым или начинаться с числа с "-"';
+$lang['Permalink %s is already used by album %s'] = 'Постоянная ссылка %s уже используется альбомом %s';
+$lang['Permalink history'] = 'История постоянных ссылок';
+$lang['Permalinks'] = 'Постоянные ссылки';
+$lang['Permission denied'] = 'Доступ запрещен';
+$lang['Permission granted thanks to a group'] = 'Доступ для группы разрешен';
+$lang['Permission granted'] = 'Доступ разрешен';
+$lang['Photo informations updated'] = 'Информация о фотографии обновлена';
+$lang['Plugins'] = 'Плагины';
+$lang['Position'] = 'Номер';
+$lang['Preferences'] = 'Настройки';
+$lang['Properties'] = 'Свойства';
+$lang['Random photo'] = 'Случайная фотография';
+$lang['Rating by guests'] = 'Оценки от гостей';
+$lang['Rating'] = 'Оценки';
+$lang['Reject'] = 'Отклонить';
+$lang['Representant'] = 'Миниатюра альбома';
+$lang['Representation of albums'] = 'Представитель альбомов';
+$lang['Representative'] = 'Представитель';
+$lang['Represents'] = 'Представляет';
+$lang['Save order'] = 'Сохранить порядок';
+$lang['Save to permalink history'] = 'Сохранить историю постоянных ссылок';
+$lang['Select at least one album'] = 'Выберите хотя бы один альбом';
+$lang['Select at least one photo'] = 'Выберите по крайней мере одну фотографию';
+$lang['Select at least one user'] = 'Выберите хотя бы одного пользователя';
+$lang['Show info'] = 'Показать информацию';
+$lang['Site manager'] = 'Управление сайтами';
+$lang['Status'] = 'Статус';
+$lang['Statistics'] = 'Статистика';
+$lang['Storage album'] = 'Альбом для хранения';
+$lang['Sum of rates'] = 'Суммарная оценка';
+$lang['Tag "%s" already exists'] = 'Метка "%s" уже есть';
+$lang['Tag "%s" was added'] = 'Метка "%s" добавлена';
+$lang['Tag selection'] = 'Выбор меток';
+$lang['The %d following tags were deleted'] = 'Следующие %d меток были удалены';
+$lang['Uninstall'] = 'Удалить';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Использовать порядок сортировки фотографий по умолчанию (определенный в конфигурационном файле)';
+$lang['User comments validation'] = 'Проверка комментариев посетителей';
+$lang['Users'] = 'Пользователи';
+$lang['Validate'] = 'Принять';
+$lang['Validation'] = 'Проверка';
+$lang['Version'] = 'Версия';
+$lang['Virtual albums to move'] = 'Виртуальные альбомы для перемещения';
+$lang['Virtual album name'] = 'Название виртуального альбома';
+$lang['Webmaster cannot be deleted'] = 'Нельзя удалить Вебмастера';
+$lang['You are running on development sources, no check possible.'] = 'Выполняется в режиме разработки, проверка невозможна.';
+$lang['You cannot delete your account'] = "Вы не можете удалить свой аккаунт";
+$lang['You cannot move an album in its own sub album'] = 'Вы не можете переместить альбом в его собственный подальбом';
+$lang['You need to confirm deletion'] = 'Вам нужно подтвердить удаление';
+$lang['Associate to album'] = 'Привязать к альбому';
+$lang['associate to group'] = 'привязать к группе';
+$lang['Authorized'] = 'Разрешено';
+$lang['Add a virtual album'] = 'Добавить виртуальный альбом';
+$lang['Authorize users to add comments on selected albums'] = 'Авторизованные пользователи могут добавлять комментарии к выбранным альбомам';
+$lang['The name of an album must not be empty'] = 'Название альбома не может быть пустым';
+$lang['Lock albums'] = 'Заблокированные альбомы';
+$lang['Private'] = 'Приватные альбомы';
+$lang['Public'] = 'Общедоступные альбомы';
+$lang['Find a new representant by random'] = 'Найти нового представителя случайным образом';
+$lang['Public / Private'] = 'Общедоступные / Приватные';
+$lang['Manage authorizations for selected albums'] = 'Управление авторизацией для выбранных альбомов';
+$lang['Virtual album added'] = 'Виртуальный альбом добавлен';
+$lang['Virtual album deleted'] = 'Виртуальный альбом удален';
+$lang['Access type'] = 'Тип доступа';
+$lang['Information data registered in database'] = 'Информация зарегистрирована в базе данных';
+$lang['Default display'] = 'Вид по умолчанию';
+$lang['The gallery URL is not valid.'] = 'Некорректный URL галереи';
+$lang['Main'] = 'Главная';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'На странице может быть от 5 до 50 комментариев.';
+$lang['Configuration'] = 'Настройки';
+$lang['confirm'] = 'подтверждение';
+$lang['delete album'] = 'удалить альбом';
+$lang['Dissociate from album'] = 'отделить альбом';
+$lang['dissociate from group'] = 'отвязать от группы';
+$lang['Album updated successfully'] = 'Информация об альбоме успешно добавлена.';
+$lang['photos per page'] = 'фотографий на странице';
+$lang['High definition enabled'] = 'Доступно высокое разрешение';
+$lang['File'] = 'файл';
+$lang['first photo added on %s'] = 'первая фотография добавлена %s';
+$lang['Forbidden'] = 'Запрещено';
+$lang['global mode'] = 'групповой режим';
+$lang['group "%s" added'] = 'группа "%s" добавлена';
+$lang['group "%s" deleted'] = 'группа "%s" удалена';
+$lang['group "%s" updated'] = 'группа "%s" обновлена';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Название группы не должно содержать " и \' или быть пустым.';
+$lang['This name is already used by another group.'] = 'Это название уже используется для другой группы.';
+$lang['High definition'] = 'Большое разрешение';
+$lang['jump to album'] = 'перейти в альбом';
+$lang['jump to photo'] = 'перейти к фотографии';
+$lang['leave'] = 'оставить';
+$lang['Lock'] = 'Блокировка';
+$lang['Locked'] = 'Заблокировано';
+$lang['manage album photos'] = 'управлять элементами альбома';
+$lang['manage sub-albums'] = 'Управление вложенными альбомами';
+$lang['Manage'] = 'Управление';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Время выполнения превышено, обработка должна быть продолжена [Рассчетное время: %d сек].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Время выполнения превышено, обработка должна быть продолжена [Рассчетное время: %d сек].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Время подготовки списка пользователей для рассылки ограничено. Остальные пользователи не выведены.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Время для отправки почты ограничено. Другие письма пропущены.';
+$lang['To send ?'] = 'Отправить?';
+$lang['Last send'] = 'Последнее отправленное';
+$lang['email'] = 'email';
+$lang['User'] = 'Пользователь';
+$lang['See you soon,'] = 'Пока,';
+$lang['Go to'] = 'Перейти к ';
+$lang['Hello'] = 'Привет ';
+$lang['New photos were added'] = 'Были добавлены новые фотографии';
+$lang['on'] = ' в ';
+$lang['between'] = 'между ';
+$lang['and'] = ' и ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Вебмастер подписал Вас на получение уведомлений по почте.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Вы подписались на получение уведомлений по почте.';
+$lang['To subscribe'] = 'Для подписки';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Если у Вас возникнут проблемы или вопросы, пожалуйста, напишите ';
+$lang['[NBM] Problems or questions'] = 'Проблемы и вопросы';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Вебмастер удалил подписку на получение уведомлений по почте.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Вы удалили подписку на получение уведомлений по почте.';
+$lang[', click on'] = ', щелкните на ';
+$lang['To unsubscribe'] = 'Чтобы отменить подписку';
+$lang['With blank value, gallery title will be used'] = 'Если не заполнено, будет использовано название галереи';
+$lang['Notification'] = 'Уведомления';
+$lang['Error when sending email to %s [%s].'] = 'Ошибка отправки почты для %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Письмо отправлено для %s [%s].';
+$lang['%d mail was sent.'] = 'Отправлено письмо: %d.';
+$lang['%d mails were sent.'] = 'Отправлено писем: %d.';
+$lang['%d mail was not sent.'] = 'Не отправлено письмо: %d.';
+$lang['%d mails were not sent.'] = 'Не отправлено писем: %d.';
+$lang['No mail to send.'] = 'Нет писем для отправки.';
+$lang['There is no available subscribers to mail.'] = 'Нет пользователей, которым можно было бы отправить почту.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Пользователи доступны, если есть новые элементы уведомлений.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Возможно, нет подписанных пользователей (только webmaster может видеть это).';
+$lang['No user to send notifications by mail.'] = 'Нет пользователей, чтобы послать уведомления почтой.';
+$lang['New photos added'] = 'Новые фотографии добавлены';
+$lang['Subscribe to notification by mail'] = 'Подписаться на уведомления по почте';
+$lang['Unsubscribe from notification by mail'] = 'Отписаться от уведомлений по почте';
+$lang['Parameter'] = 'Параметры';
+$lang['Continue processing treatment'] = 'Продолжить обработку обращения';
+$lang['Complementary mail content'] = 'Дополнительное содержание письма';
+$lang['Add detailed content'] = 'Добавить дополнительное содержание';
+$lang['Send mail as'] = 'Отправить письмо от';
+$lang['Send mail to users'] = 'Отправить письмо пользователю';
+$lang['Send'] = 'Отправка';
+$lang['Options'] = 'Параметры';
+$lang['Subscribed'] = 'В списке рассылки';
+$lang['Subscribe'] = 'Список рассылки';
+$lang['Parameters'] = 'Параметры';
+$lang['Select recipients'] = 'Выбрать получателей';
+$lang['Subscribe/unsubscribe users'] = 'Добавление/удаление пользователей в список рассылки';
+$lang['Unsubscribed'] = 'Не в списке рассылки';
+$lang['%d parameter was updated.'] = '%d параметр обновлен.';
+$lang['%d parameters were updated.'] = '%d параметров обновлено.';
+$lang['%d user was not updated.'] = '%d пользователь не обновлен.';
+$lang['%d users were not updated.'] = '%d пользователей не обновлено.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Пользователь %s [%s] удален из списка рассылки.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Пользователь %s [%s] добавлен в список рассылки.';
+$lang['%d user was updated.'] = '%d пользователь изменен.';
+$lang['%d users were updated.'] = '%d пользователей изменено.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Пользователь %s [%s] не удален из списка рассылки.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Пользователь %s [%s] не добавлен в список рассылки.';
+$lang['User %s [%s] added.'] = 'Пользователь %s [%s] добавлен.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Внимание: при добавлении/удалении в список рассылки будет отправлено уведомление пользователям';
+$lang['Send mail on HTML format'] = 'Отправить письмо в HTML формате';
+$lang['Include display of recent photos grouped by dates'] = 'Включить показ недавних фотографий, сгруппированных по датам';
+$lang['Available only with HTML format'] = 'Возможно только в HTML формате';
+$lang['no write access'] = 'нет доступа на запись';
+$lang['Permissions'] = 'Разрешения';
+$lang['private'] = 'приватная';
+$lang['public'] = 'общедоступная';
+$lang['Purge never used notification feeds'] = 'очистить неиспользуемые каналы уведомлений';
+$lang['Purge sessions'] = 'очистить сессии';
+$lang['randomly represented'] = 'случайный представитель';
+$lang['registration date'] = 'дата регистрации';
+$lang['clean'] = 'очистить';
+$lang['Create this site'] = 'Создать этот сайт';
+$lang['test'] = 'тест';
+$lang['test this remote site'] = 'тестировать этот удаленный сайт';
+$lang['remove tags'] = 'удалить метки';
+$lang['Repair and optimize database'] = 'исправить и оптимизировать базу данных';
+$lang['selection'] = 'отмеченные';
+$lang['set to'] = 'изменить на';
+$lang['singly represented'] = 'выбранный представитель';
+$lang['This site already exists'] = 'Такой сайт уже есть';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Создать новый сайт: (введите URL в create_listing_file.php)';
+$lang['created'] = 'создан';
+$lang['delete'] = 'удален';
+$lang['delete this site and all its attached elements'] = 'удалить этот сайт и все прикрепленные элементы';
+$lang['deleted'] = 'удален';
+$lang['an error happened'] = 'произошла ошибка';
+$lang['Local'] = 'Локальный';
+$lang['Remote'] = 'Удаленный';
+$lang['update the database from files'] = 'обновить базу данных из файлов';
+$lang['status'] = 'статус';
+$lang['Directory'] = 'Папка';
+$lang['sub-albums'] = 'вложенные альбомы';
+$lang['Synchronize metadata'] = 'синхронизировать метаданные';
+$lang['target'] = 'изменить';
+$lang['Thumbnail'] = 'миниатюра';
+$lang['title'] = 'Название';
+$lang['Album list management'] = 'Управление списком альбомов';
+$lang['Piwigo configuration'] = 'Настройка Piwigo';
+$lang['Edit album'] = 'Редактирование альбома';
+$lang['Group management'] = 'Управление группами';
+$lang['User list'] = 'Список пользователей';
+$lang['Edit photo information'] = 'Редактировать всю информацию о фотографии';
+$lang['Database synchronization with files'] = 'Синхронизация базы данных с файлами';
+$lang['all'] = 'все';
+$lang['height must be a number superior to'] = 'высота должна быть числом больше';
+$lang['width must be a number superior to'] = 'ширина должна быть числом больше';
+$lang['for the file format'] = 'для файла формата';
+$lang['Photo unreachable or no support'] = 'Фотография недоступна или поддержка не возможна';
+$lang['GD version'] = 'версия GD';
+$lang['General statistics'] = 'Общая статистика';
+$lang['average time'] = 'среднее время';
+$lang['number of miniaturized photos'] = 'число фотографий с миниатюрами';
+$lang['total time'] = 'общее время';
+$lang['for this file format'] = 'для этого формата файла';
+$lang['unit mode'] = 'одиночный режим';
+$lang['Unlocked'] = 'Разблокировать';
+$lang['unset'] = 'очистить';
+$lang['Update albums informations'] = 'Обновить информацию об альбоме';
+$lang['Update photos information'] = 'Обновить информацию о фотографии';
+$lang['Synchronize'] = 'Синхронизация';
+$lang['reduce to single existing albums'] = 'объединить в один существующий альбом';
+$lang['Choose an option'] = 'Выберите параметры';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'показать максимум информации (добавленные альбомы и фотографии, удаленные альбомы и фотографии)';
+$lang['Error list'] = 'Список ошибок';
+$lang['Errors caption'] = 'Обозначение ошибки';
+$lang['Detailed informations'] = 'Детальная информация';
+$lang['File/directory read error'] = 'Ошибка чтения файла/папки';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Нет доступа к файлу или папке (возможно они отсутствуют или доступ к ним запрещен)';
+$lang['albums deleted in the database'] = 'альбомы удалены из базы данных';
+$lang['photos deleted from the database'] = 'фотографии удалены из базы данных';
+$lang['photos candidates for metadata synchronization'] = 'фотографии, предложенные для синхронизации';
+$lang['photos informations synchronized with files metadata'] = 'информация о фотографиях синхронизировалась с метаданными файлов';
+$lang['errors during synchronization'] = 'ошибок синхронизации';
+$lang['albums added in the database'] = 'альбомы добавлены в базу данных';
+$lang['photos added in the database'] = 'фотографии добавлены в базу данных';
+$lang['photos updated in the database'] = 'фотографии обновлены в базе данных';
+$lang['Search for new images in the directories'] = 'Поиск новых изображений в папках';
+$lang['added'] = 'добавлена';
+$lang['deleted'] = 'удалена';
+$lang['Metadata synchronization results'] = 'Результаты синхронизации метаданных';
+$lang['only perform a simulation (no change in database will be made)'] = 'только тестировать (не вносить изменения в базу данных)';
+$lang['Simulation'] = 'Тест';
+$lang['directories + files'] = 'папки и файлы';
+$lang['only directories'] = 'только папки';
+$lang['synchronize files structure with database'] = 'синхронизировать файловую структуру с базой данных';
+$lang['synchronize files metadata with database photos informations'] = 'синхронизируйте метаданные файлов с информацией о фотографиях базы данных';
+$lang['even already synchronized photos'] = 'даже уже просинхронизированные фотографии';
+$lang['Used metadata'] = 'Используемые метаданные';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Название папки и файла должно состоять из букв, цифр, "-", "_" и "."';
+$lang['wrong filename'] = 'неверное имя файла';
+$lang['Upload'] = 'Загрузка';
+$lang['user "%s" added'] = 'пользователь "%s" added';
+$lang['User status'] = 'Статус пользователя';
+$lang['user_status_admin'] = 'Администратор';
+$lang['user_status_generic'] = 'Общий';
+$lang['user_status_guest'] = 'Гость';
+$lang['user_status_normal'] = 'Пользователь';
+$lang['user_status_webmaster'] = 'Вебмастер';
+$lang['Virtual album'] = 'Виртуальный альбом';
+$lang['Waiting'] = 'Ожидающие';
+$lang['default'] = 'по умолчанию';
+$lang['Toggle \'default group\' property'] = 'Сделать/убрать \'по умолчанию\'';
+$lang['Advanced features'] = 'Расширенные функции';
+$lang['Overall'] = 'Обзор';
+$lang['Year'] = 'Год';
+$lang['Month'] = 'Месяц';
+$lang['Day'] = 'День';
+$lang['Pages seen'] = 'Страниц просмотрено';
+$lang['Time'] = 'время';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Элемент';
+$lang['Section'] = 'раздел';
+$lang['An information email was sent to group "%s"'] = 'Информационное письмо отправлено для группы "%s"';
+$lang['Send an information email to group members'] = 'Отправить информационное письмо для группы';
+$lang['Group'] = 'Группа';
+$lang['[%s] Visit album %s'] = '[%s] Просмотреть альбом %s';
+$lang['Hello,'] = 'Привет,';
+$lang['See you soon.'] = 'До встречи.';
+$lang['Discover album:'] = 'Откройте альбом:';
+$lang['Mail content'] = 'Содержание';
+$lang['none'] = 'нет';
+$lang['high'] = 'большой';
+$lang['other'] = 'другой';
+$lang['Element type'] = 'Тип элемента';
+$lang['Image id'] = 'id изображения';
+$lang['Summary'] = 'Суммарно';
+$lang['%d line filtered'] = '%d линия отфильтрована';
+$lang['%d lines filtered'] = '%d линий отфильтровано';
+$lang['%d guest'] = '%d гость';
+$lang['%d guests'] = '%d гостей';
+$lang['Hour'] = 'Час';
+$lang['guest'] = 'гость';
+$lang['default values'] = 'значение по умолчанию';
+$lang['Guest cannot be deleted'] = 'Гость не может быть удален';
+$lang['Default user cannot be deleted'] = 'Пользователь по умолчанию не может быть удален';
+$lang['Purge history detail'] = 'очистить историю';
+$lang['Purge history summary'] = 'очистить всю историю';
+$lang['Check integrity'] = 'Проверка совместимости';
+$lang['Anomaly'] = 'Неисправность';
+$lang['Correction'] = 'Корректировка';
+$lang['Automatic correction'] = 'Автоматическая коррекция';
+$lang['Impossible automatic correction'] = 'Автоматическая коррекция невозможна';
+$lang['Correction applied with success'] = 'Коррекция успешно применена';
+$lang['Correction applied with error'] = 'Коррекция применена с ошибками';
+$lang['%d anomaly has been detected.'] = 'Обнаружена %d неисправность.';
+$lang['%d anomalies have been detected.'] = 'Обнаружено %d неисправностей.';
+$lang['%d anomaly has been corrected.'] = 'Скорректирована %d неисправность.';
+$lang['%d anomalies have been detected corrected.'] = 'Скорректировано %d неисправностей.';
+$lang['%d anomaly has not been corrected.'] = 'Не скорректирована %d неисправность.';
+$lang['%d anomalies have not been corrected.'] = 'Не скорректировано %d неисправностей.';
+$lang['Go to %s or %s for more informations'] = 'Смотрите %s или %s для получения дополнительной информации';
+$lang['the forum'] = 'форум';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'значение %s в файле не верно, так как exif не поддерживается';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s нужно отключить в файле config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'Статус пользователя "гость" больше не существует';
+$lang['Main "guest" user status is incorrect'] = 'Статус пользователя "гость" некорректен';
+$lang['Default user does not exist'] = 'Пользователь по умолчанию больше не существует';
+$lang['Main "webmaster" user does not exist'] = 'Пользователь "webmaster" больше не существует';
+$lang['Main "webmaster" user status is incorrect'] = 'Статус пользователя "webmaster" некорректен';
+$lang['User "%s" created with "%s" like password'] = 'Пользователь "%s" создан с паролем "%s"';
+$lang['Status of user "%s" updated'] = 'Статус пользователя "%s" обновлен';
+$lang['add new photos to caddie'] = 'добавить новые фотографии в корзину';
+$lang['No display'] = 'Не показывать';
+$lang['Classic display'] = 'Классический вид';
+$lang['Hoverbox display'] = 'Вид Hoverbox';
+$lang['Mail address is obligatory for all users'] = 'Адрес электронной почты обязателен для всех пользователей';
+$lang['Minimum privacy level'] = 'Минимальный уровень защиты';
+$lang['Privacy level'] = 'Уровень защиты';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Контакты';
+$lang['Level 2'] = 'Друзья';
+$lang['Level 4'] = 'Семья';
+$lang['Level 8'] = 'Администрация';
+$lang['Reinitialize check integrity'] = 'Повторить проверку целостности';
+$lang['Check all'] = 'Отметить все';
+$lang['Uncheck all'] = 'Снять все отметки';
+$lang['Check automatic corrections'] = 'Отметить автокоррекцию';
+$lang['Apply selected corrections'] = 'Применить выбранные корректировки';
+$lang['Ignore selected anomalies'] = 'Игнорировать отмеченные неисправности';
+$lang['Refresh'] = 'Обновить';
+$lang['The anomaly will be ignored until next application version'] = 'Неисправности будут игнорироваться до установки следующей версии скрипта';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Исправленная неисправность больше не будет игнорироваться';
+$lang['%d anomaly has been ignored.'] = '%d неисправность была проигнорирована.';
+$lang['%d anomalies have been ignored.'] = 'Было проигнорировано неисправностей: %d';
+$lang['Plugins which need upgrade'] = 'Плагины, требующие обновлений';
+$lang['Plugin list'] = 'Список плагинов';
+$lang['Check for updates'] = 'Проверка обновлений';
+$lang['Other plugins'] = 'Другие плагины';
+$lang['Last revisions'] = 'Последние измененные';
+$lang['Are you sure you want to delete this plugin?'] = 'Уверены, что хотите удалить этот плагин?';
+$lang['Are you sure you want to install this plugin?'] = 'Уверены, что хотите установить этот плагин?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Уверены, что хотите обновить? Проверьте, не нужна ли этой версии деинсталляция.';
+$lang['Plugin has been successfully copied'] = 'Плагин успешно скопирован';
+$lang['You might go to plugin list to install and activate it.'] = 'Вы можете перейти к списку плагинов для его установки и активации.';
+$lang['Can\'t create temporary file.'] = 'Невозможно создать временный файл.';
+$lang['Can\'t download archive.'] = 'Невозможно скачать архив.';
+$lang['Can\'t read or extract archive.'] = 'Невозможно прочитать или распаковать архив.';
+$lang['An error occured during extraction (%s).'] = 'Ошибка в процессе распаковки (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Пожалуйста, проверьте права папки "plugins" и подпапок (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Невозможно соединиться с сервером.';
+$lang['Purge compiled templates'] = 'Очистить созданные шаблоны';
+$lang['ACCESS_0'] = 'Свободный доступ';
+$lang['ACCESS_1'] = 'Доступно для всех';
+$lang['ACCESS_2'] = 'Доступно для избранных';
+$lang['ACCESS_3'] = 'Доступно для администраторов';
+$lang['ACCESS_4'] = 'Доступно для вебмастера';
+$lang['ACCESS_5'] = 'Недоступно';
+$lang['Support'] = 'Поддержка';
+$lang['Documentation'] = 'Документация';
+$lang['A new version of Piwigo is available.'] = 'Доступна новая версия Piwigo.';
+$lang['Piwigo Administration'] = 'Администрация Piwigo';
+$lang['Piwigo version'] = 'Версия Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Запущена последняя версия Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Установленная версия %s [%s] не совместима с версией [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Чтобы воспользоваться всеми возможностями скрипта, обновите систему, иначе скрипт может работать некорректно';
+$lang['Deleted on'] = 'Удалено';
+$lang['Last hit'] =  'Последние просмотренные';
+$lang['GD library is missing'] = 'Библиотека GD отсутствует';
+$lang['Templates'] = 'Шаблоны';
+$lang['Extend for templates'] = 'Расширение для шаблонов';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =  'Заменить исходные шаблоны на пользовательские из подпапки template-extension';
+$lang['Replacers (customized templates)'] = 'Заменяющий (пользовательский шаблон)';
+$lang['Original templates'] = 'Исходный шаблон';
+$lang['Optional URL keyword'] = 'Опциональное ключевое слово URL';
+$lang['Templates configuration has been recorded.'] = 'Templates configuration has been recorded.';
+$lang['All optimizations have been successfully completed.'] = 'Все оптимизации успешно завершены.';
+$lang['Optimizations have been completed with some errors.'] = 'Оптимизации завершены с ошибками.';
+$lang['Modify information'] = 'Modify information';
+$lang['nothing'] = 'ничего';
+$lang['overrides existing values with empty ones'] = 'замена существующих значений пустыми';
+$lang['Manage photo ranks'] = 'Редактировать оценку фотографии';
+$lang['Edit ranks'] = 'Изменить порядок';
+$lang['No photo in this album'] = 'В этом альбоме нет фотографий';
+$lang['Images manual order was saved'] = 'Указанный порядок изображений сохранен';
+$lang['ranks'] = 'порядок';
+$lang['Drag to re-order'] = 'Перетащите чтобы изменить порядок';
+$lang['Quick Local Synchronization'] = 'Быстрая синхронизация';
+$lang['No photo can be deleted'] = 'Нет фото для удаления';
+$lang['Delete selected photos'] = 'Удалить выбранные фото';
+$lang['%d photo was deleted'] = '%d фото удалено';
+$lang['%d photos were deleted'] = '%d фото удалено';
+$lang['Unable to check for upgrade.'] = 'Невозможно проверить обновление.';
+$lang['Date'] = 'Дата';
+$lang['Operation in progress'] = 'Обработка обращения.';
+$lang['Please wait...'] = 'Пожалуйста, подождите...';
+$lang['Downloads'] = 'Загрузки';
+$lang['Released on'] = 'Выпуск';
+$lang['Number of downloads'] = 'Число скачиваний';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo информационная рассылка';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Оставайтесь на связи с проектом Piwigo, подпишитесь на информационную рассылку Piwigo. Вы получите письмо, как только будет доступен новый релиз (иногда письма будут содержать корректировку ошибок безопасности, о которых Вы должны знать и исправить), или когда произойдет какое-то важное событие с проектом. Это всего несколько электронных писем в год.';
+$lang['Subscribe %s'] = 'Подписка %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Подписать %s на Piwigo информационную рассылку';
+$lang['Purge search history'] = 'Очистить историю поиска';
+$lang['Hide'] = 'Спрятать';
+$lang['Password is missing. Please enter the password.'] = 'Пароль не верен. Пожалуйста, повторите попытку.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Подтверждение пароля отсутствует. Пожалуйста, подтвердите выбранный пароль.';
+$lang['Allow users to edit their own comments'] = 'Позволить пользователям редактировать свои комментарии';
+$lang['Allow users to delete their own comments'] = 'Позволить пользователям удалять их комментарии';
+$lang['Email administrators when a comment is modified'] = 'Уведомить администратора по почте, когда комментарий изменен';
+$lang['Email administrators when a comment is deleted'] = 'Уведомить администратора по почте, когда комментарий удален';
+$lang['Cannot delete the old permalink !'] = 'Старая постоянная ссылка не может быть удалена!';
+$lang['Hit'] = 'Популярное';
+$lang['Tools'] = 'Инструменты';
+$lang['Photos'] = 'Фотографии';
+$lang['Themes'] = 'Темы';
+$lang['Instructions to use Piwigo'] = 'Инструкция по использованию Piwigo';
+$lang['Installed Themes'] = 'Установленные темы';
+$lang['Add New Theme'] = 'Добавить новую тему';
+$lang['Forbid this theme to users'] = 'Запретить использование этой темы пользователям';
+$lang['Set as default theme for unregistered and new users'] = 'Установить тему по умолчанию для новых и незарегистрированных пользователей';
+$lang['unknown'] = 'неизвестен';
+$lang['Upload Photos'] = 'Загрузить фотографии';
+$lang['Drop into album'] = 'Выберите альбом';
+$lang['+ Add an upload box'] = '+ Добавить поле для загрузки';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Создайте папку "%s" в папке где установлен Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Дайте доступ для записи (chmod 777) к папке "%s" в папке где установлен Piwigo';
+$lang['existing album'] = 'существующий альбом';
+$lang['create a new album'] = 'создать новый альбом';
+$lang['Album name'] = 'Название альбома';
+$lang['Album "%s" has been added'] = 'Альбом "%s" добавлен';
+$lang['Uploaded Photos'] = 'Загруженные фотографии';
+$lang['%d photos uploaded'] = '%d фотографий загружено';
+$lang['Privacy level set to "%s"'] = 'Установить уровень доступа "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Альбом "%s" содержит %d фотографий';
+$lang['Manage this set of %d photos'] = 'Редактировать этот набор из %d фотографий';
+$lang['Select files'] = 'Выбрать файлы';
+$lang['Everybody'] = 'Все';
+$lang['Who can see these photos?'] = 'Кто может смотреть эти фотографии?';
+$lang['Settings'] = 'Установки';
+$lang['Resize'] = 'Изменить размеры';
+$lang['Maximum Width'] = 'Максимальная ширина';
+$lang['pixels'] = 'пикселей';
+$lang['Maximum Height'] = 'Максимальная высота';
+$lang['Image Quality'] = 'Качество изображения';
+$lang['Save Settings'] = 'Сохранить установки';
+$lang['Your configuration settings are saved'] = 'Ваши настройки конфигурации сохранены';
+$lang['Active Themes'] = 'Активные темы';
+$lang['Add write access to the "%s" directory'] = 'Добавьте права записи для папки "%s"';
+$lang['Administration Home'] = 'Панель администрирования';
+$lang['Change Admin Colors'] = 'Изменить цвет административной панели';
+$lang['Delete this theme'] = 'Удалить эту тему';
+$lang['Directory does not exist'] = 'Папка не существует';
+$lang['Download,'] = 'Загрузить,';
+$lang['FTP + Synchronization'] = 'FTP + Синхронизация';
+$lang['Get Support on Piwigo Forum'] = 'Обратитесь за помощью на Piwigo форум';
+$lang['Help Me'] = 'Помощь';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Эта тема не может быть активизирована, поскольку родительская тема отсутствует: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Эта тема не может быть удалена, потому что другие темы зависят от нее: %s';
+$lang['Inactive Themes'] = 'Неактивные темы';
+$lang['Install on your computer,'] = 'Установите на Ваш компьютер,';
+$lang['Make this theme available to users'] = 'Сделать эту тему доступной для пользователей';
+$lang['Page end'] = 'Конец страницы';
+$lang['Piwigo Uploader'] = 'Piwigo загрузчик';
+$lang['Read Piwigo Documentation'] = 'Читайте документацию Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Откройте pLoader и добавьте свои фотографии.';
+$lang['Switch to clear or dark colors for administration'] = 'Выбрать светлые или темные тона для панели администирования';
+$lang['Theme has been successfully installed'] = 'Тема была успешно установлена';
+$lang['Visit Gallery'] = 'Перейти на сайт';
+$lang['Visit Piwigo project website'] = 'посмотрите сайт проекта Piwigo ';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader заменяет <em>Piwigo Загрузчик</em>. С помощью pLoader Вы можете локально подготовить Ваши фотографии и загрузить их в Вашу фотогалерею Piwigo.';
+$lang['Guest Settings'] = 'Установки пользователя Гость';
+$lang['Main Page'] = 'Главная страница';
+$lang['Photo Page'] = 'Страница фотографии';
+$lang['Activate Navigation Bar'] = 'Активизировать навигационную панель';
+$lang['Activate Navigation Thumbnails'] = 'Активизировать навигацию по миниатюрам';
+$lang['Activate icon "%s"'] = 'Активизировать иконку "%s"';
+$lang['Photo Properties'] = 'Свойства фотографии';
+$lang['Allow user customization'] = 'Разрешить пользователям изменять внешний вид галереи';
+$lang['Languages'] = 'Языки';
+$lang['Installed Languages'] = 'предустановленные языки';
+$lang['Add New Language'] = 'Добавить новый язык';
+$lang['Language has been successfully installed'] = 'Язык был успешно установлен';
+$lang['Select:'] = 'выбрать:';
+$lang['None'] = 'ни один';
+$lang['Invert'] = 'Обратить';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Невозможный деактивировать эту тему, у Вас должна оставаться по крайней мере одна тема.';
+$lang['Webmaster status is required.'] = 'Требуется статус веб мастера.';
+$lang['Bound Theme'] = 'связанная тема';
+$lang['Allow rating'] = 'Разрешить оценивать';
+$lang['Select at least one comment'] = 'Выберите по крайней мере один комментарий';
+$lang['Active Plugins'] = 'Активные плагины';
+$lang['Inactive Plugins'] = 'Неактивные плагины';
+$lang['Missing Plugins'] = 'Потерянные плагины';
+$lang['Uninstalled Plugins'] = 'Удаленные плагины';
+$lang['By %s'] = ' %s';
+$lang['Visit plugin site'] = 'Страница плагина';
+$lang['Active Languages'] = 'Активировать языки';
+$lang['Delete this language'] = 'Удалить этот язык';
+$lang['Forbid this language to users'] = 'Сделать недоступным этот язык для пользователей';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Невозможный деактивировать этот язык, сначала установите другой язык как значение по умолчанию.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Невозможный деактивировать этот язык, у Вас должен быть по крайней мере один язык.';
+$lang['Inactive Languages'] = 'Деактивировать язык';
+$lang['Make this language available to users'] = 'Сделать этот язык доступным для пользователей';
+$lang['Set as default language for unregistered and new users'] = 'Установить язык по умолчанию для незарегистрированных и новых пользователей';
+$lang['Add Photos'] = 'Добавить фотографии';
+$lang['The following tag was deleted'] = 'Следущие метки были удалены';
+$lang['Miscellaneous'] = 'Разное';
+$lang['Virtual Links'] = 'Виртуальные ссылки';
+$lang['Templates configuration has been recorded.'] = 'Конфигурация шаблона перезаписана.';
+$lang['Modify information'] = 'Информация по изменению';
+$lang['There is no other language available.'] = 'Нет других доступных языков.';
+$lang['There is no other plugin available.'] = 'Нет других доступных плагинов.';
+$lang['There is no other theme available.'] = 'Нет других доступных тем.';
+$lang['By rank'] = 'По рейтингу';
+$lang['Manual order'] = 'Сортировать вручную';
+$lang['Add another set of photos'] = 'Добавить фотографии';
+$lang['Order of menubar items has been updated successfully.'] = 'Порядок расположения элементов меню изменен успешно.';
+$lang['This theme was not designed to be directly activated'] = 'В этой теме не предусмотрена активация напрямую';
+$lang['Who can see this photo?'] = 'Кто может смотреть эту фотографию?';
+$lang['Pending Comments'] = 'Проверка комментариев';
+$lang['Menu Management'] = 'Меню';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'В вашем файле php.ini, upload_max_filesize (%sB) больше, чем post_max_size (%sB), вы должны изменить это значение';
+$lang['Exif extension not available, admin should disable exif use'] = 'Расширение Exif не поддерживается, администратор должен отключить использование Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Размер загружаемого файла превышает значение upload_max_filesize, указанное в php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Размер загружаемого файла превышает значение post_max_size, указанное in php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Размер загружаемого файла превышает значение MAX_FILE_SIZE, указанное в html форме';
+$lang['The uploaded file was only partially uploaded'] = 'Файл был загружен лишь частично';
+$lang['No file was uploaded'] = 'Файл не был загружен';
+$lang['Missing a temporary folder'] = 'Потеряна временная папка';
+$lang['Failed to write file to disk'] = 'Не удалось записать файл на диск';
+$lang['File upload stopped by extension'] = 'Загрузка файла остановлена из-за его расширения';
+$lang['Unknown upload error'] = 'Ошибка загрузки не известна';
+$lang['Error on file "%s" : %s'] = 'Ошибка в файле "%s": %s';
+$lang['automatic order'] = 'автоматический режим';
+$lang['manual order'] = 'ручной режим';
+$lang['Albums automatically sorted'] = 'Автоматическая сотрировка альбомов';
+$lang['Batch Manager'] = 'Пакетный менеджер';
+$lang['include child albums'] = 'включает вложенные альбомы';
+$lang['Selection'] = 'Выбор';
+$lang['Action'] = 'Действие';
+$lang['Set author'] = 'Установить автора';
+$lang['Set title'] = 'Установить название';
+$lang['Set creation date'] = 'Установить дату создания';
+$lang['Apply action'] = 'Добавить действие';
+$lang['on the %d selected photos'] = 'на %d выбранных фотографиях';
+$lang['%d of %d photos selected'] = '%d из %d фотографий выбрано';
+$lang['No photo selected, %d photos in current set'] = 'Ниодна фотография не выбрана, в текущем наборе %d фото';
+$lang['All %d photos are selected'] = 'Все %d фотографии были выбраны';
+$lang['remove this filter'] = 'удалить этот фильтр';
+$lang['Duplicates'] = 'дубликаты';
+$lang['Add a filter'] = 'Добавить фильтр';
+$lang['Remove all filters'] = 'Удалить все фильтры';
+$lang['Refresh photo set'] = 'Обновить набор фотографий';
+$lang['The whole page'] = 'Все на странице';
+$lang['The whole set'] = 'Все в наборе';
+$lang['No photo in the current set.'] = 'Нет фотографий в текущем наборе.';
+$lang['No photo selected, no action possible.'] = 'Фото не выбрано, действие не возможно.';
+$lang['Choose an action'] = 'Выберите действие';
+$lang['remove author'] = 'удалить автора';
+$lang['Type here the author name'] = 'напечатайте имя автора здесь';
+$lang['remove title'] = 'удалить название';
+$lang['Type here the title'] = 'напечатайте название здесь';
+$lang['remove creation date'] = 'удалить дату создания';
+$lang['Album photos associated to the following albums: %s'] = 'Фотографии этого альбома связаны со следущими альбомами: %s';
+$lang['Delete orphan tags'] = 'Удалить неривязанные метки';
+$lang['delete photo'] = 'удалить фотографию';
+$lang['Orphan tags deleted'] = 'Непривязанные метки удалены';
+$lang['Week starts on'] = 'Неделя начинается с';
+$lang['You have %d orphan tags: %s.'] = 'У Вас есть %d непривязанных меток: %s.';
+$lang['Remove from caddie'] = 'Очистить корзину';
+$lang['Themes which need upgrade'] = 'Темы, которые нужно обновить';
+$lang['Languages which need upgrade'] = 'Языки, которые нужно обновить';
+$lang['All themes are up to date.'] = 'Все темы обновлены до последней версии.';
+$lang['All plugins are up to date.'] = 'Все плагины обновлены до последней версии.';
+$lang['All languages are up to date.'] = 'Все языки обновлены до последней версии.';
+$lang['Visit theme site'] = 'Посмотреть полное описание темы';
+$lang['Visit language site'] = 'Посмотреть подробную страницу языка';
+$lang['New Version'] = 'Новая версия';
+$lang['Obsolete Plugins'] = 'Устаревшие плагины';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'ВНИМАНИЕ! По всей вероятности, этот плагин не совместим с данной версией Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Всё равно хотите активировать?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ЭТОТ ПЛАГИН СЕЙЧАС УЖЕ ЯВЛЯЕТСЯ ЧАСТЬЮ ЯДРА PIWIGO! УДАЛИТЕ ЕГО СЕЙЧАС!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ОШИБКА: НЕСМОТРЯ НА ТО, ЧТО ЭТОТ ПЛАГИН УСТАНОВЛЕН, ОН НЕ НАЙДЕН! УДАЛИТЕ ЕГО.';
+$lang['new'] = 'новый';
+$lang['No results'] = 'Ничего не найдено';
+$lang['Searching...'] = 'Выполняется поиск...';
+$lang['Type in a search term'] = 'Определите критерий поиска';
+$lang['display'] = 'показать';
+$lang['Activate icon "new" next to albums and pictures'] = 'Активировать иконку "new" рядом с альбомами и фотографиями';
+$lang['Deactivate all'] = 'Деактивировать все';
+$lang['Default photos order'] = 'Порядок фотографий по умолчанию';
+$lang['Restore'] = 'Восстановить';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Восстановление конфигурации по умолчанию. Ваши настройки плагинов будут потеряны!';
+$lang['Show menubar'] = 'Показать меню';
+$lang['Thumbnails generation in progress...'] = 'Идет генерация миниатюр ...';
+$lang['Photos generation in progress...'] = 'Идет генерация фотографий ...';
+$lang['%s photos have been regenerated'] = '%s фотографий было создано заново';
+$lang['%s photos can not be regenerated'] = '%s фотографий не было создано заново';
+$lang['Updates'] = 'Обновление';
+$lang['Update in progress... Please wait.'] = 'Процесс обновления... Пожалуйста, подождите.';
+$lang['Ignore this update'] = 'Пропустить это обновление';
+$lang['Reset ignored updates'] = 'Сбросить проигнорированные обновления';
+$lang['Update All'] = 'Обновить все';
+$lang['ERROR'] = 'ОШИБКА';
+$lang['Update Complete'] = 'Обновление завершено';
+$lang['Piwigo Update'] = 'Обновление Piwigo';
+$lang['Extensions Update'] = 'обновление плагинов';
+$lang['All extensions are up to date.'] = 'Все плагины обновлены.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Следующие плагины, возможно, не являются совместимыми с новой версией Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Следующие темы, возможно, не являются совместимыми с новой версией Piwigo:';
+$lang['I decide to update anyway'] = 'Всё равно обновить!';
+$lang['Update to Piwigo %s'] = 'Обновление до версии Piwigo %s';
+$lang['Two updates are available'] = 'Два апдейта доступны';
+$lang['This is a minor update, with only bug corrections.'] = 'Это незначительный апдейт, исправлены небольшие ошибки.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Это основной апдейт, с <a href="%s">новыми восхитительными возможностями</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Некоторые темы и плагины  все же могут быть не доступны.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Вы можете обновиться до версии  Piwigo %s, минуя апдейт до версии Piwigo %s (рекомендуется).';
+$lang['Save Template Directory'] = 'Сохранить папку шаблонов';
+$lang['Dump Database'] = 'Дамп базы данных';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Включить данные истории (Предупреждение: память сервера может быть превышена)';
+$lang['Unable to dump database.'] = 'Невозможно сделать дамп базы данных.';
+$lang['Some upgrades are available for extensions.'] = 'Для плагинов доступны некоторые обновления.';
+$lang['Ignore All'] = 'Пропустить все';
+$lang['Crop'] = 'Обрезать';
+$lang['Width'] = 'Ширина';
+$lang['Height'] = 'Высота';
+$lang['Follow Orientation'] = 'Изменить ориентацию';
+$lang['Graphics Library'] = 'Библиотека изображений';
+$lang['Add a criteria'] = 'Добавить критерий';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Вы не можете определить порядок сортировки фотографий по умолчанию, так как он переопределен в локальных настройках.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Вы использовали <i>$conf[\'order_by\']</i> в качестве порядка сортировки в локальном файле конфигурации. Этот параметр не рекомендуется для использования. Пожалуйста, удалите его или переименуйте в <i>$conf[\'order_by_custom\']</i> !';
+$lang['Learn more'] = 'Узнать больше';
+$lang['Rate'] = 'Оценка';
+$lang['Average rate'] = 'Средний балл';
+$lang['Rate date'] = 'Дата оценки';
+$lang['... or '] = '... или ';
+$lang['Create'] = 'Создать';
+$lang['Start Upload'] = 'Начать загрузку';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Вы используете Flash-загрузчик. Возникли проблемы? Попробуйте <a href="%s">браузерный загрузчик</a>.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Вы используете браузерный загрузчик. Попробуйте <a href="%s">Flash-загрузчик</a>.';
+$lang['Maximum file size: %sB.'] = 'Максимальный размер файла: %sB.';
+$lang['Allowed file types: %s.'] = 'Допустимые типы файлов: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Максимальное разрешение: %dM пикселей (то есть %dx%d пикселей).';
+$lang['Manage Permissions'] = 'Настройка прав доступа';
+$lang['Photo %s of %s'] = 'Фотография %s из %s';
+$lang['show details'] = 'показать подробности';
+$lang['hide details'] = 'скрыть подробности';
+$lang['Merge tags'] = 'Объединить метки';
+$lang['Select the destination tag'] = 'Выбрать метку-получатель';
+$lang['(this tag will be deleted)'] = '(эта метка будет удалена)';
+$lang['Confirm merge'] = 'Подтвердите объединение';
+$lang['Merge selected tags'] = 'Объединить выбранные метки';
+$lang['No destination tag selected'] = 'Метка-получатель не выбрана';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Метки <em>%s</em> объединены в метку <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Выберите по крайней мере две метки для объединения';
+$lang['Select an album'] = 'Выберите альбом';
+$lang['An error has occured during upgrade.'] = 'Во время обновления произошла ошибка.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Во время распаковки произошла ошибка. Пожалуйста, проверьте права доступа к папке установки piwigo.<br><a href="%s">Нажмите, чтобы посмотреть лог ошибки</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo не может получить файлы обновления с сервера';
+$lang['Zoom'] = 'увеличение';
+$lang['Add to caddie'] = 'добавить в корзину';
+
+$lang['%s has been successfully updated.'] = '%s успешно обновлено.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = 'Приложение <em>Piwigo для iOS</em> позволяет Вам соединяться с Вашей галереей Piwigo с Вашего iPhone, iPad или iPod touch, создавать альбомы и загружать несколько фотографий сразу.';
+$lang['A locked gallery is only visible to administrators'] = 'Заблокированная галерея видна только администраторам';
+$lang['Activate comments'] = 'Активировать комментарии';
+$lang['Add tags'] = 'Добавить метки';
+$lang['Applications'] = 'Приложения';
+$lang['Available versions for'] = 'Доступные версии для';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'По умолчанию Piwigo создает новые изображения формата web из HD (высокого разрешения) версий фотографий.';
+$lang['Default comments order'] = 'Порядок комментариев по умолчанию';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Если HD-изображение недоступно и если существующее изображение web-размера больше чем получается при изменении размеров, Piwigo запишет его как HD и создаст из него web-размер.';
+$lang['Last import'] = 'Последняя загрузка';
+$lang['List'] = 'Список';
+$lang['Original Size'] = 'Размер оригинала';
+$lang['Photo name'] = 'Название фотографии';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo для iOS (iPhone, iPad, iPod Touch)';
+$lang['Predefined filter'] = 'Префильтр';
+$lang['Resize after upload'] = 'Изменение размеров после загрузки';
+$lang['Send connection settings by email'] = 'Отправить настройки подключения по электронной почте';
+$lang['The original image quality must be a number between %d and %d'] = 'Качество изображения оригинала должно быть числом между %d и %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Максимальная высота оригинала должна быть числом между %d и %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Максимальная ширина оригинала должна быть числом между %d и %d';
+$lang['Unlock gallery'] = 'Разблокировать галерею';
+$lang['Web Form'] = 'Web-форма';
+$lang['With no album'] = 'Без альбома';
+$lang['With no tag'] = 'Без меток';
+$lang['With no virtual album'] = 'Без виртуальных альбомов';
+$lang['%u users have automatic permission because they belong to a granted group.'] = 'Пользователи %u автоматически получили разрешение, так как входят  в группу, которой дано разрешение.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = 'Приложение <em>Piwigo для Android</em> позволяет Вам соединяться с Вашей галереей Piwigo с Вашего Android телефона, создавать альбомы и загружать несколько фотографий сразу.';
+$lang['add a new watermark'] = 'добавить новый водяной знак';
+$lang['administrators'] = 'администраторов';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom - это софт для фотографов, созданный для систематизации большого количества фотографий, их обработки и последующего использования.';
+$lang['any visitor can see this album'] = 'все посетители видят этот альбом';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture - мощный инструмент для улучшения изображений и управления большими библиотеками изображений для Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture создан для профессиональных фотографов с простотой iPhoto.';
+$lang['apply automatic sort order'] = 'применить автоматическую сортировку';
+$lang['Apply watermark if height is bigger than'] = 'Применять водяной знак если высота больше';
+$lang['Apply watermark if width is bigger than'] = 'Применять водяной знак если ширина больше';
+$lang['Automatic sort order'] = 'Автоматическая сортировка';
+$lang['Available on'] = 'Доступно';
+$lang['bottom left corner'] = 'левый нижний угол';
+$lang['bottom right corner'] = 'правый нижний угол';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'По умолчанию, центром композиции считается геометричесий центр изображения.';
+$lang['cancel manual order'] = 'отменить ручную сортировку';
+$lang['Cancel'] = 'Отмена';
+$lang['Center of interest'] = 'Центр интереса';
+$lang['custom'] = 'Пользовательский';
+$lang['Delete multiple size images'] = 'Удалить изображения разных размеров';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam - продвинутый и бесплатный менеджер фотографий для Linux, Windows и MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam создан для фотографов которым нужно просматривать, управлять, редактировать, каталогизировать, проставлять метки и публиковать фотографии.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Среди его возможностей просмотр галереи, создание альбома и загрузка фотографий.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Для квадратного кропа, Piwigo старается максимально отобразить центр композиции.';
+$lang['Gallery unlocked'] = 'Галерея разблокирована';
+$lang['Generate multiple size images'] = 'Сгенерировать изображения разных размеров';
+$lang['Groups and users'] = 'Пользователи и группы';
+$lang['include photos with lower privacy level'] = 'включены фотографии с более низким уровнем приватности';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto - менеджер фото по умолчанию для MacOSX. Плагин публикации фотографий Piwigo позволяет создавать новые альбомы и загружать фотографии напрямую из iPhoto в Вашу галерею Piwigo.';
+$lang['middle'] = 'середина';
+$lang['modified'] = 'изменен';
+$lang['Move to album'] = 'Переместить в альбом';
+$lang['No group is permitted to see this private album'] = 'Нет групп, которым открыт доступ к этому приватному альбому';
+$lang['Not cropped correctly?'] = 'Вырезано некорректно?';
+$lang['Notify administrators when a comment is'] = 'Уведомить администраторов когда комментарий';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'В Linux, просто установите Shotwell с диспетчером пакетов и активируйте опцию публикации в Piwigo.';
+$lang['Opacity'] = 'Прозрачность';
+$lang['pending validation'] = 'ожидает проверки';
+$lang['Permission granted for groups'] = 'Разрешение предоставлено для групп';
+$lang['Permission granted for users'] = 'Разрешение предоставлено для пользователей';
+$lang['Permission management'] = 'Управление доступом';
+$lang['Photo sizes with crop'] = 'Размеры изображений с кропом';
+$lang['Piwigo export plugin for Aperture'] = 'Плагин публикации фотографий для Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Плагин публикации фотографий для iPhoto';
+$lang['Piwigo for Android'] = 'Piwigo для Android';
+$lang['Piwigo publish plugin for digiKam'] = 'Плагин публикации фотографий для digiKam';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Плагин публикации фотографий в Piwigo из Lightroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Плагин публикации фотографий для Shotwell';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (клиент RemoteGallery для Android) - это клиент для Piwigo с открытым кодом (GPL v3) для платформы Android.';
+$lang['registered users'] = 'зарегистрированных пользователей';
+$lang['Save manual order'] = 'Сохранить ручную сортировку';
+$lang['Save visits in history for'] = 'Сохранять посещения в истории для';
+$lang['Select a file'] = 'Выберите файл';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Выделите зону мышкой чтобы указать центр композиции.';
+$lang['Select groups...'] = 'Выбрать группы...';
+$lang['Select users...'] = 'Выбрать пользователей...';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell - приложение с открытым кодом для каталогизации фотографий под Linux. Является менеджером фото по умолчанию для Ubuntu и Fedora.';
+$lang['simple visitors'] = 'простых посетителей';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Центр композиции - самая значимая зона в фотографии.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Плагин публикации фотографий Piwigo позволяет создавать новые альбомы и загружать фотографии напрямую в Вашу галерею Piwigo.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Плагин публикации Piwigo позволяет экспортировать и синхронизировать фотографии из Lightroom напрямую в Вашу галерею Piwigo.';
+$lang['There is no group in this gallery.'] = 'В галерее нет групп.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Этот альбом содержит %d фотографий, добавлен между %s и %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Этот альбом содержит %d фотографий, добавлен %s.';
+$lang['This album contains no photo.'] = 'Этот альбом не содержит фотографий.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Для экспорта фото из digiKam в Piwigo, просто установите digiKam и плагин Kipi.';
+$lang['top left corner'] = 'левый верхний угол';
+$lang['top right corner'] = 'правый верхний угол';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'посетители должны авторизоваться и иметь соответствующие права для просмотра этого альбома';
+$lang['X Position'] = 'Координата X';
+$lang['X Repeat'] = 'X Повтор';
+$lang['Y Position'] = 'Координата Y';
+$lang['You can activate only one mobile theme.'] = 'Вы можете активировать только одну мобильную тему.';
+$lang['Multiple Size'] = 'Размеры';
+?>
Index: tags/2.4.0RC3/language/ru_RU/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/common.lang.php	(revision 14585)
@@ -0,0 +1,410 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Русский [RU]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=434
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Russian';
+$lang_info['country'] = 'Russia';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'ru';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d альбом изменен';
+$lang['%d albums updated'] = '%d альбомы изменены';
+$lang['%d comment to validate'] = '%d комментарий на проверке';
+$lang['%d comments to validate'] = 'комментариев на проверке: %d';
+$lang['%d new comment'] = '%d новый комментарий';
+$lang['%d new comments'] = 'новых комментариев: %d';
+$lang['%d comment'] = '%d комментарий';
+$lang['%d comments'] = 'комментариев: %d';
+$lang['%d hit'] = '%d просмотр';
+$lang['%d hits'] = 'просмотров: %d';
+$lang['%d new photo'] = '%d новая фотография';
+$lang['%d new photos'] = '%d новых фотографий';
+$lang['%d new user'] = '%d новый посетитель';
+$lang['%d new users'] = '%d новых посетителей';
+$lang['About'] = 'О...';
+$lang['All tags'] = 'Все слова';
+$lang['Any tag'] = 'Любая метка';
+$lang['At least one listed rule must be satisfied.'] = 'Хотя бы одно правило должно выполняться.';
+$lang['Author'] = 'Автор';
+$lang['Albums'] = 'Альбомы';
+$lang['Album'] = 'Альбом';
+$lang['Close this window'] = 'Закрыть это окно';
+$lang['Complete RSS feed (photos, comments)'] = 'Полная RSS лента (фотографии, комментарии)';
+$lang['Confirm Password'] = 'Повторите пароль';
+$lang['Connection settings'] = 'Настройки соединения';
+$lang['Login'] = 'Авторизация';
+$lang['Contact webmaster'] = 'Техподдержка';
+$lang['Create a new account'] = 'Создать новый аккаунт';
+$lang['Created on'] = 'Дата съемки';
+$lang['Creation date'] = 'Дата съемки';
+$lang['Current password is wrong'] = 'Введен неправильный пароль';
+$lang['Dimensions'] = 'Размеры';
+$lang['Display'] = 'Порядок';
+$lang['Each listed rule must be satisfied.'] = 'Все перечисленные правила должны выполняться';
+$lang['Email address is missing. Please specify an email address.'] = 'Не указан адрес электронной почты';
+$lang['Email address'] = 'Адрес электронной почты';
+$lang['Enter your personnal informations'] = 'Укажите персональную информацию';
+$lang['Error sending email'] = 'Ошибка отправки электронной почты';
+$lang['File name'] = 'Имя файла';
+$lang['File'] = 'Файл';
+$lang['Filesize'] = 'Размер файла';
+$lang['Filter and display'] = 'Отфильтровать и показать';
+$lang['Filter'] = 'Фильтр';
+$lang['Forgot your password?'] = 'Забыли пароль?';
+$lang['Go through the gallery as a visitor'] = 'Войти в галерею как посетитель';
+$lang['Help'] = 'Помощь';
+$lang['Identification'] = 'Идентификация';
+$lang['Photos only RSS feed'] = 'RSS лента. Только фотографии.';
+$lang['Keyword'] = 'Ключевые слова';
+$lang['Links'] = 'Ссылки';
+$lang['N/A'] = 'не определен';
+$lang['New on %s'] = 'Новое в %s';
+$lang['Notification'] = 'RSS-уведомления';
+$lang['Number of items'] = 'Кол-во на странице';
+$lang['Original dimensions'] = 'Исходный размер';
+$lang['Password forgotten'] = 'Пароль утерян';
+$lang['Password'] = 'Пароль';
+$lang['Post date'] = 'Дата публикации';
+$lang['Posted on'] = 'Дата публикации';
+$lang['Profile'] = 'Профиль';
+$lang['Quick connect'] = 'Быстрый вход';
+$lang['RSS feed'] = 'RSS ленты';
+$lang['Register'] = 'Регистрирация';
+$lang['Registration'] = 'Регистрация';
+$lang['Related tags'] = 'Связанные слова';
+$lang['Reset'] = 'Отмена';
+$lang['Retrieve password'] = 'Напомнить пароль';
+$lang['Search rules'] = 'Условия для поиска';
+$lang['Search tags'] = 'Тэги для поиска';
+$lang['Search'] = 'Поиск';
+$lang['display available tags'] = 'Просмотр доступных тэгов';
+$lang['Since'] = 'За период';
+$lang['Sort by'] = 'Признак сортировки';
+$lang['Sort order'] = 'Порядок сортировки';
+$lang['Tag'] = 'Слово';
+$lang['Tags'] = 'Ключевые слова';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS лента позволяет Вам быть в курсе новостей этого веб-сайта: новые фотографии, обновленные альбомы, новые комментарии. Используйте RSS читатель.';
+$lang['Unknown feed identifier'] = 'Неизвестный идентификатор ленты';
+$lang['User comments'] = 'Комментарии посетителей';
+$lang['Username'] = 'Имя пользователя';
+$lang['Visits'] = 'Посещения';
+$lang['Webmaster'] = 'Техподдержка';
+$lang['Week %d'] = 'Неделя %d';
+$lang['About Piwigo'] = 'О Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Вы не можете получить доступ к запрашиваемой странице без авторизации';
+$lang['add this photo to your favorites'] = 'добавить эту фотографию в избранные';
+$lang['Administration'] = 'Администрирование';
+$lang['all'] = 'все';
+$lang['ascending'] = 'по возрастанию';
+$lang['author(s) : %s'] = 'автор(ы): %s';
+$lang['Expand all albums'] = 'Раскрыть все альбомы';
+$lang['posted after %s (%s)'] = 'опубликовано после %s (%s)';
+$lang['posted before %s (%s)'] = 'опубликовано до %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'опубликовано между %s (%s) и %s (%s)';
+$lang['posted on %s'] = 'опубликовано %s';
+$lang['Best rated'] = 'По оценкам';
+$lang['display best rated photos'] = 'показать высоко оцененные';
+$lang['Calendar'] = 'Календарь';
+$lang['All'] = 'Все';
+$lang['display each day with photos, month per month'] = 'показать календарь с  фотографиями, день за днем, месяц за месяцем';
+$lang['View'] = 'Просмотр';
+$lang['chronology_monthly_calendar'] = 'Календарь по месяцам';
+$lang['chronology_monthly_list'] = 'Месяцы';
+$lang['chronology_weekly_list'] = 'Недели';
+$lang['Click here if your browser does not automatically forward you'] = 'Пройдите по этой ссылке, если браузер не перенаправляет Вас автоматически';
+$lang['comment date'] = 'дата комментария';
+$lang['Comment'] = 'Комментарий';
+$lang['Your comment has been registered'] = 'Ваш комментарий отправлен';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Антифлуд: пожалуйста, подождите немного, прежде чем отправить следующий комментарий';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Ваш комментарий НЕ отправлен, так как не соответствует правилам';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Адимнмстратор должен проверить ваш комментарий, прежде чем он будет показан.';
+$lang['This login is already used by another user'] = 'Этот логин уже используется другим посетителем';
+$lang['Comments'] = 'Комментарии';
+$lang['Add a comment'] = 'Добавить комментарий';
+$lang['created after %s (%s)'] = 'созданы после %s (%s)';
+$lang['created before %s (%s)'] = 'созданы до %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'созданы между %s (%s) и %s (%s)';
+$lang['created on %s'] = 'созданы %s';
+$lang['Customize'] = 'Настройка';
+$lang['Your Gallery Customization'] = 'Настройка галереи ';
+$lang['day'][0] = 'Вс';
+$lang['day'][1] = 'Пн';
+$lang['day'][2] = 'Вт';
+$lang['day'][3] = 'Ср';
+$lang['day'][4] = 'Чт';
+$lang['day'][5] = 'Пт';
+$lang['day'][6] = 'Сб';
+$lang['Default'] = 'По умолчанию';
+$lang['delete this photo from your favorites'] = 'удалить эту фотографию из избранных';
+$lang['Delete'] = 'Удалить';
+$lang['descending'] = 'по убыванию';
+$lang['Download'] = 'Загрузить';
+$lang['Download this file'] = 'загрузить этот файл';
+$lang['edit'] = 'редактировать';
+$lang['wrong date'] = 'ошибка в дате';
+$lang['excluded'] = 'исключенный';
+$lang['Your favorites'] = 'Избранное';
+$lang['display your favorites photos'] = 'показать ваши избранные фотографии';
+$lang['Favorites'] = 'Избранное';
+$lang['First'] = 'Первая';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Галерея закрыта для обслуживания. Пожалуйста, заходите попозже.';
+$lang['Page generated in'] = 'Страница сгенерирована за';
+$lang['guest'] = 'гость';
+$lang['Hello'] = 'Привет';
+$lang['available for administrators only'] = 'доступно только для администратора';
+$lang['display this album'] = 'показать этот альбом';
+$lang['display last user comments'] = 'Просмотр последних пользовательский комментариев';
+$lang['customize the appareance of the gallery'] = 'настройка оформления';
+$lang['search'] = 'поиск';
+$lang['Home'] = 'Начало';
+$lang['Identification'] = 'Вход';
+$lang['in this album'] = 'в этом альбоме';
+$lang['in %d sub-album'] = 'в %d вложенном альбоме';
+$lang['in %d sub-albums'] = 'в %d вложенных альбомах';
+$lang['included'] = 'включено';
+$lang['Invalid password!'] = 'Неверный пароль!';
+$lang['Language']='Язык';
+$lang['last %d days'] = 'послеедние %d дней';
+$lang['Last'] = 'Последняя';
+$lang['Logout'] = 'Выход';
+$lang['obligatory'] = 'обязательный';
+$lang['Maximum photo height'] = 'Максимальная высота фотографии';
+$lang['Maximum height must be a number superior to 50'] = 'Максимальная высота изображения должна быть больше 50';
+$lang['Maximum photo width'] = 'Максимальная ширина фотографии';
+$lang['Maximum width must be a number superior to 50'] = 'Максимальная ширина изображения должна быть больше 50';
+$lang['display a calendar by creation date'] = 'показывает календарь по дате создания';
+$lang['display all photos in all sub-albums'] = 'показать все фотографии во всех вложенных альбомах';
+$lang['return to normal view mode'] = 'возвращение к нормальному режиму';
+$lang['display a calendar by posted date'] = 'показывает календарь по дате отправления';
+$lang['month'][10] = 'Октябрь';
+$lang['month'][11] = 'Ноябрь';
+$lang['month'][12] = 'Декабрь';
+$lang['month'][1] = 'Январь';
+$lang['month'][2] = 'Февраль';
+$lang['month'][3] = 'Март';
+$lang['month'][4] = 'Апрель';
+$lang['month'][5] = 'Май';
+$lang['month'][6] = 'Июнь';
+$lang['month'][7] = 'Июль';
+$lang['month'][8] = 'Август';
+$lang['month'][9] = 'Сентябрь';
+$lang['Most visited'] = 'По популярности';
+$lang['display most visited photos'] = 'показать наиболее популярные фотографии';
+$lang['Unknown identifier'] = 'Неизвестный идентификатор';
+$lang['New password'] = 'Новый пароль';
+$lang['Rate this photo'] = 'Оценить эту фотографию';
+$lang['Next'] = 'Следующая';
+$lang['no rate'] = 'не оценено';
+$lang['Photos posted within the last %d day.'] = 'Фотографии, загруженные в течении последнего %d дня.';
+$lang['Photos posted within the last %d days.'] = 'Фотографии, загруженные в течении последних %d дней.';
+$lang['password updated'] = 'пароль изменен';
+$lang['Recent period must be a positive integer value'] = 'Последний период должен быть положительным целым числом';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'изображение';
+$lang['Click on the photo to see it in high definition'] = 'Нажмите для просмотра фотографии в большом разрешении';
+$lang['Show file metadata'] = 'Показать метаданные';
+$lang['Powered by'] = 'Скрипт';
+$lang['Preferences'] = 'Предпочтение';
+$lang['Previous'] = 'Предыдущая';
+$lang['Random photos'] = 'Случайные фотографии';
+$lang['display a set of random photos'] = 'показать ряд случайных фотографий ';
+$lang['Recent albums'] = 'Последние альбомы';
+$lang['display recently updated albums'] = 'показать недавно обновленные альбомы';
+$lang['Recent period'] = 'Срок "новых"';
+$lang['Recent photos'] = 'Недавние фотографии';
+$lang['display most recent photos'] = 'показать больше свежих фотографий';
+$lang['Redirection...'] = 'Перенаправляем...';
+$lang['Please, enter a login'] = 'Пожалуйста, введите логин';
+$lang['login mustn\'t end with a space character'] = 'логин не должен оканчиваться на пробел';
+$lang['login mustn\'t start with a space character'] = 'логин не должен начинаться с пробела';
+$lang['this login is already used'] = 'такой логин уже есть';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адрес электронной почты должен выглядеть как-то типа xxx@yyy.eee (например: jack@altern.org)';
+$lang['please enter your password again'] = 'введите пароль еще раз';
+$lang['Auto login'] = 'Запомнить меня';
+$lang['remove this tag from the list'] = 'удалить этот тэг из списка';
+$lang['representative'] = 'миниатюра альбома';
+$lang['Search for Author'] = 'Поиск по автору';
+$lang['Search in albums'] = 'Поиск в альбомах';
+$lang['Search by date'] = 'Поиск по дате';
+$lang['Date'] = 'Начальная дата';
+$lang['End-Date'] = 'Конечная дата';
+$lang['Kind of date'] = 'Тип даты';
+$lang['Search for words'] = 'Поиск по словам';
+$lang['Search for all terms'] = 'Поиск по всем критериям ';
+$lang['Search for any term'] = 'Поиск по любому критерию';
+$lang['Empty query. No criteria has been entered.'] = 'Пустой запрос. Нет критериев для поиска.';
+$lang['Search results'] = 'Результаты поиска';
+$lang['Search in sub-albums'] = 'Поиск во вложенных альбомах';
+$lang['searched words : %s'] = 'искомые слова: %s';
+$lang['Contact'] = 'Контакты';
+$lang['set as album representative'] = 'установить как миниатюру альбома';
+$lang['Show number of comments'] = 'Показывать количество комментариев';
+$lang['Show number of hits'] = 'Показывать количество просмотров';
+$lang['slideshow'] = 'слайдшоу';
+$lang['stop the slideshow'] = 'остановить слайдшоу';
+$lang['Specials'] = 'Избранное';
+$lang['SQL queries in'] = 'SQL-запрос в';
+$lang['display only recently posted photos'] = 'показать только недавно загруженные фотографии';
+$lang['return to the display of all photos'] = 'вернуться к полному списку фотографии';
+$lang['the beginning'] = 'с начала';
+$lang['Interface theme'] = 'Оформление';
+$lang['Thumbnails'] = 'Миниатюры';
+$lang['Menu'] = 'Меню';
+$lang['A comment on your site'] = 'Комментарий с вашего сайта';
+$lang['today'] = 'сегодня';
+$lang['Update your rating'] = 'Обновить оценку';
+$lang['the username must be given'] = 'должно присутствовать имя пользователя';
+$lang['useful when password forgotten'] = 'для восстановления потерянного пароля';
+$lang['Quick search'] = 'Быстрый поиск';
+$lang['Connected user: %s'] = 'Подключены пользователи: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Браузер: %s';
+$lang['Author: %s'] = 'Автор: %s';
+$lang['Comment: %s'] = 'Комментарий: %s';
+$lang['Comment by %s'] = 'Комментарий от %s';
+$lang['User: %s'] = 'Посетитель: %s';
+$lang['Email: %s'] = 'адрес: %s';
+$lang['Admin: %s'] = 'Администратор: %s';
+$lang['Registration of %s'] = 'Регистрация %s';
+$lang['Album: %s'] = 'Альбом: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Неверный статус пользователя "гость", используйте статус по умолчанию. Пожалуйста сообщите вебмастеру.';
+$lang['this email address is already in use'] = 'пользователь с таким адресом уже есть';
+$lang['Album results for'] = 'Альбом определен для';
+$lang['Tag results for'] = 'Слова-результаты для';
+$lang['from %s to %s'] = 'от %s до %s';
+$lang['Play of slideshow'] = 'Показать слайдшоу';
+$lang['Pause of slideshow'] = 'Остановить слайдшоу';
+$lang['Repeat the slideshow'] = 'Повторять слайдшоу';
+$lang['Not repeat the slideshow'] = 'Не повторять слайдшоу';
+$lang['Reduce diaporama speed'] = 'Reduce diaporama speed';
+$lang['Accelerate diaporama speed'] = 'Accelerate diaporama speed';
+$lang['Submit'] = 'Отправить';
+$lang['Yes'] = 'Да';
+$lang['No'] = 'Нет';
+$lang['%d photo'] = '%d фотография';
+$lang['%d photos'] = '%d фотографии';
+$lang['%d photo is also linked to current tags'] = '%d фотография также связана с этими метками';
+$lang['%d photos are also linked to current tags'] = '%d фотографий также связаны с этими метками';
+$lang['display photos linked to this tag'] = 'показать фотографии, связанные с этой меткой';
+$lang['photos posted during the last %d days'] = 'фотографии, опубликованный последние %d дней';
+$lang['Piwigo Help'] = 'Помощь';
+$lang['Rank'] = 'Ряд';
+$lang['group by letters'] = 'сгруппировать по буквам';
+$lang['letters'] = 'буквы';
+$lang['show tag cloud'] = 'показать облако слов';
+$lang['cloud'] = 'облако';
+$lang['Are you sure?'] = 'Уверены?';
+$lang['Reset to default values'] = 'Восстановить значения по умолчанию';
+$lang['delete all photos from your favorites'] = 'удалить все фотографии из избранных';
+$lang['Sent by'] = 'Отправить';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Ваш браузер не поддерживает или блокирует куки. Разрешите использовать куки в настройках.';
+$lang['Edit a comment'] = 'Редактировать комментарий';
+$lang['(!) This comment requires validation'] = '(!) Этот комментарий ждет проверки';
+$lang['Welcome'] = 'Добро пожаловать';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Добро пожаловать в фотогалерею Piwigo!';
+$lang['... or browse your empty gallery'] = '... или просмотрите Вашу пустую галерею';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... или не показывать это сообщение, Я самостоятельно решу, что предпринять';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Привет %s, Ваша галерея Piwigo пуста!';
+$lang['I want to add photos'] = 'Я хочу добавить фото';
+$lang['Manage this user comment: %s'] = 'Управление этим комментарием пользователя: %s';
+$lang['This author modified following comment:'] = 'Этот автор изменил следующий комментарий:';
+$lang['This author removed the comment with id %d'] = 'Этот автор удалил комментарий номер %d';
+$lang['%d Kb'] = '%d Кб';
+$lang['Reduce diaporama speed'] = 'Уменьшить скорость панорамы';
+$lang['Accelerate diaporama speed'] = 'Увеличить скорость панорамы';
+$lang['html tags are not allowed in login'] = 'html тэги не допустимы в логине';
+$lang['The number of photos per page must be a not null scalar'] = 'Число фотографий на странице должно быть ненулевым целым числом';
+$lang['Number of photos per page'] = 'Число фотографий на странице';
+$lang['%d rates'] = 'Оценок: %d';
+$lang['Rating score'] = 'Средний балл';
+$lang['Invalid username or email'] = 'Неверное имя пользователя или адрес электронной почты';
+$lang['Password reset is not allowed for this user'] = 'Для этого пользователя сброс пароля невозможен';
+$lang['User "%s" has no email address, password reset is not possible'] = 'У пользователя "%s" нет адреса электронной почты, сброс пароля невоможен';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Поступил запрос на изменение пароля для следуюшей учетной записи:';
+$lang['Username "%s" on gallery %s'] = 'Пользователь "%s" в галерее %s';
+$lang['To reset your password, visit the following address:'] = 'Чтобы сбросить пароль пройдите по ссылке:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Если Вы получили это сообщение по ошибке, просто не предпринимайте никаких действий и ничего не произойдет.';
+$lang['Password Reset'] = 'Сброс пароля';
+$lang['Check your email for the confirmation link'] = 'Проверьте Ваш адрес электронной почты, на который выслано сообщение с подтверждающей ссылкой';
+$lang['Invalid key'] = 'Неверный ключ';
+$lang['The passwords do not match'] = 'Пароли не совпадают';
+$lang['Your password has been reset'] = 'Ваш пароль был сброшен';
+$lang['Return to home page'] = 'Возврат на домашнюю страницу';
+$lang['Please enter your username or email address.'] = 'Пожалуйста, введите имя пользователя или адрес Вашей электронной почты.';
+$lang['You will receive a link to create a new password via email.'] = 'Вы получите ссылку для ввода нового пароля по электронной почте.';
+$lang['Username or email'] = 'Имя пользователя или адрес электронной почты';
+$lang['Change my password'] = 'Изменить пароль';
+$lang['Enter your new password below.'] = 'Введите новый пароль.';
+$lang['EXIF Metadata'] = 'Метаданные EXIF';
+$lang['IPTC Metadata'] = 'Метаданные IPTC';
+$lang['Edit'] = 'Изменить';
+$lang['Hello %s,'] = 'Здравствуйте, %s,';
+$lang['Send my connection settings by email'] = 'Отправить настройки моего соединения по почте';
+$lang['Show oldest comments first'] = 'Показывать комментарии, начиная со старых';
+$lang['Show latest comments first'] = 'Показывать комментарии, начиная с новых';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Регистрация прошла успешно. Скоро вы получите письмо с настройками Вашего соединения. Добро пожаловать!';
+$lang['Username modification'] = 'Изменить имя пользователя';
+$lang['Your username has been successfully changed to : %s'] = 'Имя пользователя было успешно изменено на %s';
+$lang['square'] = 'Квардат';
+$lang['thumb'] = 'Миниатюра';
+$lang['2small'] = 'XXS - крошечный';
+$lang['xsmall'] = 'XS - очень мелкий';
+$lang['small'] = 'S - мелкий';
+$lang['medium'] = 'M - средний';
+$lang['large'] = 'L - крупный';
+$lang['xlarge'] = 'XL - очень крупный';
+$lang['xxlarge'] = 'XXL - огромный';
+$lang['Original'] = 'Исходный';
+$lang['Thank you for registering at %s!'] = 'Благодарим за регистрацию на %s!';
+$lang['Here are your connection settings'] = 'Ваши настройки соединения';
+$lang['Password: %s'] = 'Пароль: %s';
+$lang['Username: %s'] = 'Имя пользователя: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Если Вы получили это сообщение по ошибке, пожалуйста, напишите нам по адресу %s';
+$lang['Photo sizes'] = 'Размер фотографии';
+$lang['View in'] = 'Вид';
+$lang['Mobile'] = 'Мобильное устройство';
+$lang['Desktop'] = 'Компьютер';
+$lang['Date created, new &rarr; old'] = 'Дата создания, новые &rarr; старые';
+$lang['Date created, old &rarr; new'] = 'Дата создания, старые &rarr; новые';
+$lang['Date posted, new &rarr; old'] = 'Дата публикации, новые &rarr; старые';
+$lang['Date posted, old &rarr; new'] = 'Дата публикации, старые &rarr; новые';
+$lang['File name, A &rarr; Z'] = 'Имя файла, А &rarr; Я';
+$lang['File name, Z &rarr; A'] = 'Имя файла, Я &rarr; А';
+$lang['Manual sort order'] = 'Сортировка вручную';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Порядок номеров, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Порядок номеров, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Название фотографии, А &rarr; Я';
+$lang['Photo title, Z &rarr; A'] = 'Название фотографии, Я &rarr; А';
+$lang['Rating score, high &rarr; low'] = 'Рейтинг, высокий &rarr; низкий';
+$lang['Rating score, low &rarr; high'] = 'Рейтинг, низкий &rarr; высокий';
+$lang['Visits, high &rarr; low'] = 'Посещения, много &rarr; мало';
+$lang['Visits, low &rarr; high'] = 'Посещения, мало &rarr; много';
+?>
Index: tags/2.4.0RC3/language/ru_RU/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,137 @@
+<h2>Редактирование категорий</h2>
+
+<h3>Информация</h3>
+
+<ul>
+
+  <li><strong>Название</strong>: дает возможность переименовать категорию
+  (похоже на псевдоним в случае реальной категории).</li>
+
+  <li><strong>Описание</strong>: можно описать содержимое категории.
+  Этот текст будет показан внизу на странице с миниатюрами.</li>
+
+</ul>
+
+<h3>Перемещение</h3>
+
+<p>Если категория виртуальная, Вы можете ее перемещать. Перемещение категории
+   означает изменение родительской категории.</p>
+
+<h3>Опции</h3>
+
+<ul>
+
+  <li><strong>Тип доступа</strong>: Управление доступом. Если сделать категорию
+  приватной, все вложенные категории тоже станут приватными. Если сделать категорию
+  общедоступной, все вложенные категории тоже станут общедоступными.</li>
+
+  <li><strong>Блокировка</strong>: Категория и ее подкатегории временно будут
+  закрыты на обслуживание.</li>
+
+  <li><strong>Комментарии</strong>: Управление возможностью комментировать
+  элементы категории для пользователей.</li>
+
+  <li><strong>Разрешить загрузку</strong>: Управление доступом для загрузки
+  файлов пользователями. Эта опция доступна только для обычных категорий (не виртуальных).</li>
+
+</ul>
+
+<p>Также вы можете управлять этими настройками на странице "Свойства"
+ (вкладки <span class="pwgScreen">Загрузка</span>, <span
+class="pwgScreen">Комментарии</span>, <span class="pwgScreen">Блокировка</span>,
+<span class="pwgScreen">Общедоступные / Приватные</span>), все это в меню <span
+class="pwgScreen">Администрирование, Галереи, Свойства</span>.</p>
+
+<h3>Порядок сортировки</h3>
+
+<p>Первый чекбокс определяет сортировку по умолчанию.</p>
+<p>Второй чекбокс определяет распространяет правила сортировки на подкатегории.</p>
+
+<p>Выберите другую сортировку, если это необходимо.</p>
+<ul>
+<li><strong>Дата съемки</strong>: Дата создания фотографии</li>
+<li><strong>Дата публикации</strong>: Дата добавления фотографии в галерею</li>
+<li><strong>Средний балл (*)</strong>: По рейтингу, за который голосуют посетители</li>
+<li><strong>По популярности (*)</strong>: По числу посещений посетителями страниц с фотографиями</li>
+<li><strong>Имя файла</strong>: Сортировка по имени файла фотографий</li>
+<li><strong>Id</strong>: Внутренний идентификатор (недавние категории имеют более высокий идентификатор, чем более ранние).</li>
+
+</ul>
+<p><strong>(*)</strong> Попробуйте эти значения. Часто они дают непрогнозируемые
+результаты.</p>
+
+
+<h3>Представитель</h3>
+
+<p>Представитель категории - это миниатюра, которая представляет категорию на
+главной странице (<span class="pwgScreen">category.php</span>) когда категория
+содержит только подкатегории (как корнревая, например).</p>
+
+<p>Существует 4 способа назначить представителя категории:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Страница с фотографией</span>: в ряду кнопок на
+  панели есть кнопка, назначающая эту фотографию представителем отображаемой
+  категории. Эта кнопка доступна только администратору.</li>
+
+  <li><span class="pwgScreen">Редактирование информации о фотографии</span> в
+  разделе администрирования. Эта функция доступна со страницы с фотографией <span
+  class="pwgScreen">picture.php</span> или <span class="pwgScreen">Управление корзиной</span>
+  в <em>групповом режиме</em>. См. помощь этого экрана для уточнения деталей.</li>
+
+  <li><span class="pwgScreen">Администрирование, Галереи, Свойства,
+  Представитель</span>. См. помощь этого экрана для уточнения деталей.</li>
+
+  <li><span class="pwgScreen">Редактирование категории</span> (этот экран).</li>
+
+</ul>
+
+<p>Представление зависит от параметра конфигурации
+<code>allow_random_representative</code> (см. <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>По умолчанию (<code>allow_random_representative</code> установлен на false)
+каждая категория, содержащая по крайней мере один элемент, представлена
+фиксированным элементом. Установленный однажды (при создании категории),
+представитель изменяется только когда администратор сделает это.
+Если представительне устраивает, Вы можете выбрать <strong>Найти нового
+представителя случайным образом</strong>.</p>
+
+<p>Если параметр конфигурации <code>allow_random_representative</code> установлен на
+ true, категория, имеющая элементы не имеет фиксированного представителя. Используйте
+ кнопку <strong>Удалить представителя</strong>.</p>
+
+<p>Если категория не содержит элементов (но содердит подкатегории), она может
+быть представлеа любым элементом установленным с помощью страницы <span
+class="pwgScreen">Изменить информацию о фотографии</span>.
+
+<h3>Привязать все элементы этой категории к новой</h3>
+
+<ul>
+
+<li><strong>Название виртуальной категории</strong>: Новая категория с этим именем будет создана,
+все фотографии этой категории будут привязаны к ней.</li>
+
+<li><strong>Родительская категория</strong>: Где будет создана новая категория,
+если это должна быть верхняя категория, оставьте параметр пустым.</li>
+
+</ul>
+
+<h3>Привязать все элементы этой категории к одной из существующих</h3>
+
+<ul>
+
+<li><strong>Галереи</strong>: Выберите категорию, к которой нужно привязать элементы.</li>
+
+</ul>
+
+<h3>Отправить информационное письмо для группы</h3>
+
+<ul>
+
+<li><strong>Группа</strong>: группа-адресат</li>
+
+<li><strong>Содержание</strong>: Текст, который будет отправлен ее участникам.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ru_RU/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Перемещение виртуальных категорий</h2>
+
+<p>Только виртуальные категории могут быть перемещены в новую родительскую категорию.</p>
+
+<h3>Виртуальные категории для перемещения</h3>
+
+<p>Выберите виртуальные категории, которые хотите переместить.
+Если список пуст, то Вы еще не создавали виртуальных категорий.</p>
+
+<h3>Новая родительская категория</h3>
+
+<p>Выберите новую родительскую категорию (виртуальную или реальную).
+Если ничего не выбрать, виртуальные категории, отмеченные на предыдущем этапе, будут перемещены в корневую галерею.
+Вы не можете переместить категорию в саму себя или в одну из собственных подкатегорий.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/cat_options.html	(revision 14585)
@@ -0,0 +1,34 @@
+<h2>Свойства категорий</h2>
+
+<p>Этот экран позволяет администратору изменять свойства нескольких категорий одновременно.</p>
+
+<dl>
+
+  <dt>Загрузка</dt>
+  <dd>Открывает категории для загрузки файлов пользователями. Показаны только не
+  виртуальные и не удаленные категории.</dd>
+
+  <dt>Комментарии</dt>
+  <dd>Открывает категории для комментирования.
+Выберите категории, которые хотите открыть для комментирования.
+Изображение открыто для комментариев, если хотя бы одна категория открыта для
+комментариев.</dd>
+
+  <dt>Блокировка</dt>
+  <dd>Выбранные категории будут временно заблокированы для обслуживания. Все
+  подкатегории заблокированной категории также будут заблокированы. Если разблокировать
+  категорию, все ее родительские категории также разблокируются.</dd>
+
+  <dt>Общедоступные / Приватные</dt>
+  <dd>Управление доступом к выбранным категориям. Если сделать категорию приватной,
+  нужно дать права пользователям и/или группам для доступа к ним.
+  Если сделать категорию приватной, все ее подкатегории тоже станут приватными.
+  Если сделать категорию общедоступной, все родительские категории также станут общедоступными.</dd>
+
+  <dt>Представители</dt>
+  <dd>Этот раздел доступен, если параметр <code>allow_random_representative</code>
+  (см. <span class="filename">include/config_defaults.inc.php</span>) установлен в
+  <em>true</em>. Каждая категория может иметь случайно выбранного представителя
+  или единственного представителя (выбранного администратором).</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ru_RU/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Управление разрешениями для категории</h2>
+
+<p>Этот экран доступен только для приватной категории. Здесь можно выбрать
+пользователей и группы, которые имеют доступ к этой категории.</p>
+
+<h3>Группы</h3>
+
+<p>Вы можете разрешить или запретить группам доступ к этой категории. Изменяя доступность для групп,
+Вы изменяете доступность для пользователей, входящих в соответствующие группы.</p>
+
+<h3>Пользователи</h3>
+
+<p>Так же как с группами, можно поступать с отдельными пользователями.
+Пользователь допущенный к категории по участию в группе, может быть ограничен в
+правах персонально с помощью доступа пользователя.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/configuration.html	(revision 14585)
@@ -0,0 +1,136 @@
+<h2>Настройка</h2>
+
+<p>Этот экран позволяет администратору делать простейшие настройки. На самом деле, этот
+экран всего лишь показывает простейшие настройки, которых будет достаточно для
+большинства администраторов. Если Вы хотите увидеть другие настройки (дополнительные),
+смотрите файл <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Экран разбит на несколько секций, группирующих настройки по темам.</p>
+
+
+<h3>Главная</h3>
+<ul>
+  <li><strong>Название галереи</strong>: используется в ленте RSS и уведомлениях по email.</li>
+
+  <li><strong>Надпись на баннере</strong>: показывается вверху всех страниц.</li>
+
+  <li><strong>Адрес галереи</strong>: используется в ленте RSS.</li>
+
+  <li><strong>Заблокировать галерею</strong>: Закрыть галерею на обслуживание.
+  Доступ к галерее будет открыт только администратору.</li>
+
+  <li><strong>Оценки</strong>: Разрешить выставлять оценки.</li>
+
+  <li><strong>Оценки от гостей</strong>: Даже не зарегистрированные пользователи
+  смогут оценивать фотографии.</li>
+
+  <li><strong>Разрешить регистрацию пользователей</strong>: Любой может свободно
+  зарегистрироваться.</li>
+
+  <li><strong>Адрес электронной почты обязателен для всех пользователей</strong>:
+  Наличие адреса будет проверено при регистрации или изменении профиля если это
+  действие задано в административной части.</li>
+
+  <li><strong>Сообщать администратору когда зарегистрировался новый посетитель</strong>:
+  Администратор получает письмо при каждой регистрации.</li>
+
+</ul>
+
+<h3>История</h3>
+
+  <p>Посещения страниц <span class="pwgScreen">category.php</span> и
+  <span class="pwgScreen">picture.php</span> будут записываться в таблицу <code>history</code>.</p>
+
+  <p>Посещения показаны на <span class="pwgScreen">Администрирование, Спец функции, История</span>.</p>
+
+<ul>
+  <li><strong>Сохранять страницы посещенные гостями</strong>: страницы посещенные
+  гостями будут сохраняться.</li>
+
+  <li><strong>Сохранять страницы посещенные пользователями</strong>: страницы
+  посещенные зарегистрированными пользователями будут сохраняться.</li>
+
+  <li><strong>Сохранить страницы посещенные администраторами</strong>: страницы
+  посещенные администратором будут сохраняться.</li>
+
+</ul>
+
+<h3>Комментарии</h3>
+<ul>
+
+  <li><strong>Комментарии для всех</strong>: Даже не зарегистрированные
+  пользователи могут комментировать фотографии.</li>
+
+  <li><strong>Количество комментариев на странице</strong>.</li>
+
+  <li><strong>Проверка</strong>: администратор проверяет комментарии написанные
+  пользователями прежде чем они будут показаны на сайте. Проверка комментариев
+  осуществляется на странице <span class="pwgScreen">Администрирование, Фотографии,
+  Комментарии</span>.</li>
+
+  <li><strong>Сообщать администратору когда появился комментарий</strong>:
+Посылать email администратору когда пользователь внесет комментарий.</li>
+
+  <li><strong>Сообщать администратору когда появился комментарий для проверки</strong>:
+Посылать email администратору когда пользователь внесет комментарий для проверки администратором.
+Комментарии для проверки находятся на странице<span class="pwgScreen">
+Администрирование, Фотографии, Комментарии</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>Загрузки</h3>
+<ul>
+<!--TODO -->  <li><strong>Показывать ссылку на загрузку постоянно</strong>: Если
+есть категории, куда разрешена загрузка, добавляется ссылка, которая показывается
+в каждой категории.</li>
+<!--TODO -->  <li><strong>Уровень доступа пользователя для загрузки</strong>:
+Позволяет ограничит загрузку для пользователей</li>
+  <li><strong>Сообщать администратору когда загружена фотография</strong>:
+  Администратор получает письмо при загрузке фотографии каждым пользователем.</li>
+</ul>
+
+<h3>Вид по умолчанию</h3>
+
+<p>Здесь можно изменить параметры отображения по умолчанию для пользователя
+Гость или не авторизованного пользователя.
+После авторизации параметры отображения изменятся на пользовательские (заданные
+на странице <span class="pwgScreen">профайла</span>).</p>
+
+<p>Параметры отображения для всех существующих пользователей можно изменить на
+странице <span class="pwgScreen">Администрирование,
+Идентификация, Пользователи</span>, где можно сделать настройки для отмеченных пользователей.</p>
+
+<ul>
+
+  <li><strong>Язык</strong>: влияет только на надписи. Названия категорий,
+  фотографий и все описания не локализуются.</li>
+
+  <li><strong>Число фотографий в строке</strong></li>
+
+  <li><strong>Число строк на странице</strong></li>
+
+  <li><strong>Оформление</strong></li>
+
+  <li><strong>Срок "новых"</strong>: В днях. Период в течение которого фотография
+  показывается как новая. Должен быть больше 1 дня.</li>
+
+  <li><strong>Раскрыть все категории</strong>: Раскрыть все категории в меню?
+  <em>Внимание</em>: этот вариант ресурсоемок и может сгенерировать очень большое
+  меню, если дерево категорий Вашей галереи содержит много категорий.</li>
+
+  <li><strong>Показывать количество комментариев</strong>: показывать количество комментариев
+  для каждой фотографии на странице миниатюр.</li>
+
+  <li><strong>Показывать количество просмотров</strong>: показывать количество
+  просмотров фотографии под миниатюрой фотографии на странице миниатюр.
+  Действует когда параметр: <br />  $conf['show_nb_hits'] = true; <br />
+  Примечание: параметр по умолчанию установлен в false.</li>
+
+  <li><strong>Максимальная ширина изображения</strong>: максимальная отображаемая
+  ширина. Если фотография больше по ширине, она будет уменьшена при показе.
+  Если Вы устанавливаете эту настройку, лучше будет изменить ширину фотографий заранее.</li>
+
+  <li><strong>Максимальная высота изображения</strong>: те же комментарии, что и у ширины.</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/ru_RU/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,96 @@
+<h2>Настройка расширений для шаблонов</h2>
+
+<h3>Цель</h3>
+<p>Определите условия замены каждого шаблона на шаблон-расширение (шаблон,
+названный "заменяющим").</p>
+
+<p>"Исходный шаблон" из ./template/yoga (или другой) будет заменен на
+ "заменяющий" если заменяющий связан с этим "исходным"
+ (и, опционально, если URL содержит "Опциональное ключевое слово URL").</p>
+
+<p>"Опциональное ключевое слово URL" это те, которые Вы можете найти после названия модуля в URL.</p>
+
+<p>Поэтому "Опциональные ключевые слова URL" могут быть активным "прямыми ссылками"
+(см. соответствующий раздел в нашей документации для дальнейшего объяснения).</p>
+
+<p>Читайте: `<a href="#warnings">Предупреждение</a>` условий использования.</p>
+
+<h3>Что такое шаблон-расширение?</h3>
+
+<p>Этот инструмент конфигурации - мощный для новичков и продвинутых пользователей.
+С помощью FTP, в папке template-extension, Web-мастер может дублировать много
+разных .tpl файлов ("исходный шаблон") с различным названием ("заменяющим").
+
+
+ "Исходные шаблоны", текущие оригинальные поддерживаемые шаблоны:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> и/или <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> и/или <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> и/или <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> и/или <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> и/или <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> и/или <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> и/или <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+
+<h3>Где мне найти "исходные шаблоны"?</h3>
+
+<p>Находятся исходные шаблоны в template/yoga/
+(не редактируйте их там для сохранения возможности обновления). Так, с "исходными шаблонами",
+любой web-мастер может создать свои "заменяющие (пользовательские шаблоны)".</p>
+
+<h3>Куда записать "заменяющие"?</h3>
+
+<p><strong>Заменяющие (пользовательские шаблоны)</strong> должны находиться в папке
+template-extension (или ее подпапке).
+Заменяющие могут иметь любые имена файлов с расширением .tpl. Например: <span
+class="filename">template-extension/my-extension/video.tpl</span>.</p>
+
+
+<h3>Как мне активировать мои "заменяющие шаблоны"?</h3>
+<p>Каждый <strong>исходный шаблон</strong> должен быть сопоставлен со своим
+ <strong>заменяющим (пользовательским шаблоном)</strong> чтобы активировать связанные замены.
+ Это является целью "Настройки расширений для шаблонов" в меню Настроек.</p>
+
+<p>Если Вы выберете <strong>Опциональное ключевое слово URL</strong> тогда замена
+будет производиться только на страницах с этим ключевым словом. Например: <span
+  class="pwgScreen">index.php?/<strong>most_visited</strong></span></p>
+
+<p>Продвинутые пользователи могут использовать прямую ссылку как <strong>Опциональное
+ключевое слово URL</strong>. </p>
+
+<h3>Как мне деактивировать мои "заменяющие шаблоны"?</h3>
+<ul>
+<li>Отмените выбранный "Исходный шаблон".</li>
+<li>Через FTP удалите "заменяющий".</li>
+</ul>
+<a name="warnings"></a>
+<h3>Предупреждение</h3>
+<ul>
+
+  <li><strong>Оригинальный шаблон</strong> должен быть "исходным" шаблоном,
+  иначе результат может быть непредсказуемым!</li>
+
+  <li>При наличии нескольких <strong>заменяющих (пользовательских шаблонов)</strong>
+  с одинаковыми <strong>исходными шаблонами</strong> и одинаковыми <strong>опциональным
+  ключевым словом URL</strong> только последний заменяющий будет активным.</li>
+
+  <li>Отмена выбора <strong>опционального ключевого слова URL</strong> сделает
+  активной заменяющий шаблон для всех. Как в предыдущем пункте, следующий выбор может
+  отменить предыдущий.</li>
+
+  <li>Подпапки:
+Подпапки игнорируются, но они удобны для смены текущих установок.<br />
+</li>
+
+  <li>При удалении замещающего <strong>Исходный шаблон</strong> будет снова активным.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/ru_RU/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Список групп</h2>
+
+<p>Здесь Вы можете управлять созданными группами.</p>
+
+<h3>Добавить группу</h3>
+
+<p>Администратор может добавлять группы.</p>
+
+<h3>Список групп</h3>
+
+<p>Из списка для каждого элемента можно сделать:</p>
+
+
+<ul>
+  <li>перейти к списку участников</li>
+  <li>перейти к разрешениям</li>
+  <li>удалить группу (require a confirmation checkbox)</li>
+  <li>toggle status "default" (выдается запрос подтверждения)</li>
+</ul>
+
+<h3>Группа по умолчанию</h3>
+<p>Новые пользователи автоматически попадают в эту группу.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>Существует несколько способов добавить фотографии в галерею:</p>
+
+<ul>
+ <li><strong>Загрузка через браузер</strong> – это самый простой и оперативный способ. Надежность загрузки при этом зависит от возможностей вашего браузера и веб-сервера. Если вам нужно загрузить очень большое количество фотографий, или если вы столкнулись с какими-то трудностями, всегда можно воспользоваться альтернативными способами загрузки.
+</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Перейти к загрузке через браузер</a></p>
+
+<ul>
+ <li><strong>pLoader</strong> – это приложение, которое запускается у вас на компьютере. Перетащите &amp; фотографии для загрузки на окно pLoader, кликните <em>"Upload to Piwigo"</em> и pLoader приступит к работе. Существуют и другие приложения, например, <strong>WinToPiwigo</strong> и плагин для экспорта фотографий из программы <strong>Digikam</strong> в Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Перейти к pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+ <li><strong>Загрузка по FTP</strong> – наиболее рекомендуемый способ загрузки очень большой коллекции фотографии при минимальном количестве кликов. Подготовьте фотографии, воспользовавшись инструкцией. Загрузка по FTP позволит вам организовать фотографии на сервере именно так, как нужно.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Загрузка по FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/ru_RU/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Piwigo позволяет управлять группами пользователей. Это удобно для установки прав доступа к приватным категориям.</p>
+
+<p>Вы можете создать группы на странице <span class="pwgScreen">Администрирование, Идентификация, Группы</span> и добавить пользователей в созданную группу на странице <span class="pwgScreen">Администрирование, Идентификация, Пользователи</span>.</p>
+
+<p>Пользователь может входить в несколько групп. Разрешение сильнее чем запрет: если пользователь "jack" входит в группы "family" и "friends", и есть категория "Christmas 2003", доступ к которой открыт только для группы "family", пользователь "jack" будет иметь доступ к категории "Christmas 2003".</p>
+
Index: tags/2.4.0RC3/language/ru_RU/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>После того, как вы создали галерею, вы можете настроить ее вид по умолчанию для посетителей
+<ul>
+    <li>отображение: <span class="pwgScreen">Панель администирования &raquo; Настройки &raquo; Параметры</span> закладка <span class="pwgScreen">Установки пользователя Гость</span></li>
+    <li>тема: <span class="pwgScreen">Панель администирования &raquo; Настройки &raquo; Темы</span></li>
+    <li>язык: <span class="pwgScreen">Панель администирования &raquo; Настройки &raquo; Языки</span></li>
+</ul>
+Каждый новый пользователь сразу после регистраци будет видеть галерею так, как описано в этих настройках. Впоследствии он сможет изменить вид галереи.
+</p>
+<p>Если у вас есть вопросы, члены сообщества разработчиков и пользователей Piwigo будут рады ответить на них  <a href="http://ru.piwigo.org/forum">на форуме</a>.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,45 @@
+<fieldset>
+<legend>Допуск к фотографиям</legend>
+
+<p>Для каждой фотографии можно определить <strong>уровень доступа</strong> (блокировка). Каждого пользователя также можно отнести к определенному уровню доступа (ключ). Представляем вашему вниманию 5 уровней доступа:</p>
+<ol>
+  <li>Закрыто для всех</li>
+  <li><em>Знакомые</em></li>
+  <li><em>Друзья (те, что больше, чем друзья)</em></li>
+  <li><em>Семья (важнее друзей)</em></li>
+  <li><em>Администраторы (превыше всех)</em></li>
+</ol>
+
+<p>Более высокий уровнь включает в себя разрешения более низких уровней. Для каждого пользователя, чем выше уровень доступа, тем больше фотографий он может видеть.</p>
+
+<p>Например, если фото "peter_wedding-0024.jpg" ("свадьба-пети-0024.jpg") имеет уровень доступа<em>"Семья"</em> это значит, что:</p>
+<ul>
+  <li>Peter (Пети) (он <em>"Администратор"</em>) может любоваться этой фотографией потому, что <em>"Администраторы"</em> могут видеть все фото</li>
+  <li>Beth (Оля)(она член <em>"Семьи"</em> ) тоже может смотреть это фото</li>
+  <li>Mary (Маша)(она всего лишь <em>"Друг"</em>) увы, не сможет увидеть фото</li>
+</ul>
+
+<p>Пользователь, у которого нет разрешения смотреть какие-либо фотографии, не будет видеть ни информационное наполнение категории, ни категорию непосредственно, не говоря уже о ее заголовке. Тот же самый принцип относится и к метке.</p>
+
+<p>Вы можете установить уровень доступа для пользователя в меню <span class="pwgScreen">Администратор &raquo; Пользователь &raquo; Управление</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Допуск к категориям</legend>
+
+<p>Если уровни допуска не соответствуют Вашим потребностям, Вы можете также управлять разрешениями определенных категорий для пользователя или группы. Вы можете управлять разрешениями на фотографиях и категориях одновременно - конфликта не возникнет.</p>
+
+
+<p>Вы можете запретить доступ к категориям. Категории могут быть "публичными" или "приватными". Права доступа (для групп и пользователей) могут быть установлены только для приватных категорий.</p>
+
+<p>Вы можете сделать приватной категорию редактируя свойства каждой категории (<span class="pwgScreen">Администрирование, Галереи, Управление, редактировать</span>) или просматривая дерево категорий (<span class="pwgScreen">Администрирование, Галереи, Свойства, Общедоступные / Приватные</span>).</p>
+
+<p>Если категория приватная, права доступа к ней можно установить для групп и пользователей тремя способами:</p>
+
+<ul>
+  <li><span class="pwgScreen">Администрирование &raquo; Идентификация &raquo; Пользователи &raquo; разрешения (последний столбец в таблице с пользователем)</span></li>
+  <li><span class="pwgScreen">Администрирование &raquo; Идентификация &raquo; Группы &raquo; разрешения (последний столбец в таблице с группой)</span></li>
+  <li><span class="pwgScreen">Администрирование &raquo; Галереи &raquo; Управление &raquo; редактировать (ссылка для каждой категории)</span></li>
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ru_RU/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Piwigo различает категории где хранятся элементы и категории где они показаны.</p>
+
+<p>По умолчанию, элементы показываются только в реальных категориях: тех, которые связаны с папками на сервере.</p>
+
+<p>Чтобы привязать элемент к категории, нужно только указать это на странице редактирования элемента или в информации обо всех элементах категории.</p>
+
+<p>Зная этот принцип, легко понять что такое виртуальные категории: это те, которым не соответствуют папки на сервере. Виртуальные категории можно создать на странице <span class="pwgScreen">Администрирование, Категории, Управление</span>.</p>
+
Index: tags/2.4.0RC3/language/ru_RU/help/history.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/history.html	(revision 14585)
@@ -0,0 +1,45 @@
+<h2>История</h2>
+
+<p>Этот экран позволяет просматривать историю посещений согласно опциям, которые
+выбраны в Администрирование - Настройки - История.</p>
+
+<h3>Статистика</h3>
+<ul>
+  <p>Если Вы выбрали сохранение истории посещений (<span
+class="pwgScreen">index.php</span> и <span
+class="pwgScreen">picture.php</span>) в таблице <code>history. </code>
+То здесь Вы увидите статистику посещений этих страниц.</p>
+
+	<li><strong>Вся</strong>: просмотр статистики по годам. </li>
+
+	<li><strong>Годовая статистика</strong>: просмотр помесячной статистики за выбранный год.</li>
+
+	<li><strong>Статистика за месяц</strong>: просмотр статистики по дням за выбранный месяц.</li>
+
+	<li><strong>Дневная статистика</strong>: просмотр статистики по часам за выбранный день.</li>
+
+</ul>
+
+<h3>Поиск</h3>
+<ul>
+  <p>Если Вы выбрали сохранение истории посещений (<span
+class="pwgScreen">index.php</span> и <span
+class="pwgScreen">picture.php</span>) в таблице <code>history. </code>
+То здесь Вы увидите статистику посещений этих страниц сгруппированную с помощью
+фильтров.</p>
+
+	<li><strong>Фильтр на дату</strong>: выберите интервал дат для отображения
+	статистики активности.</li>
+
+	<li><strong>Фильтр на тип элемента</strong>: выберите тип элемента для
+	отображения статистики активности.</li>
+
+	<li><strong>Фильтр на пользователя</strong>: выберите пользователя для
+	отображения статистики активности.</li>
+
+	<li><strong>Фильтр на имя файла</strong>: выберите имя файла для отображения
+	статистики активности.</li>
+
+	<li><strong>Фильтр на номер изображения</strong>: выберите номер изображения
+	для отображения статистики активности.</li>
+</ul>
Index: tags/2.4.0RC3/language/ru_RU/help/index.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008      Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ru_RU/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/maintenance.html	(revision 14585)
@@ -0,0 +1,60 @@
+<h2>Обслуживание</h2>
+
+<p>Чтобы оптимизировать время создания страницы, Piwigo использует кэширование
+информации. Например, вместо того, чтобы считать число фотографий, содержащихся в
+каждой категории при каждом обновлении, эту информация хранят в базе данных. В
+теории, эта информация должна быть корректной, но иногда при ошибках кэшированная
+информация становится неверной.</p>
+
+<p>Некоторая информации становится бесполезным со временем. Удаление этой бесполезной
+информации из базы данных позволит сохранить дисковое пространство.</p>
+
+<ul>
+
+  <li>
+    <strong>Не привязанные элементы:</strong>
+    Показывает фотографии которые не связаны ни с одной виртуальной категорией.
+  </li>
+  <li>
+    <strong>Файлы с одинаковыми именами в разных папках:</strong>
+    Показывает фотографии или другие файлы имеющие одинаковые имена и находящиеся в разных категориях.
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>Обновить информацию о категориях:</strong> Для каждой категории
+  обновляется или контролируется следующая информация: список родительских категорий,
+  число фотографий, дата последней фотографии, положение среди категорий одного
+  уровня, положение среди всех категорий.</li>
+
+  <li><strong>Обновить информацию о фотографиях:</strong> Для каждой фотографии
+  обновляется или контролируется следующая информация: полный путь к файлу, рейтинг.
+  <em>Предупреждение</em>: не путайте с метаданными которые синхронизируются из
+  <span class="pwgScreen">Администрирование, Галереи, Синхронизация</span> или
+  через страницу редактирования фотографии.</li>
+
+  <li><strong>Исправить и оптимизировать базу данных:</strong>
+  Для каждой таблицы будут проведены переупорядочивание, восстановление и оптимизация.
+  </li>
+</ul>
+
+<ul>
+  <li><strong>Очистить историю:</strong> Удаляются все строки из таблицы <code>history</code>.
+  На странице <span class="pwgScreen">Администрирование, Спец. функции, История</span>
+  не будет информации относительно истории до этой операции. <em>Предупреждение</em>:
+  все данные будут потеряны и нет никакого способа вернуть информацию.</li>
+
+  <li><strong>Очистить всю историю:</strong> Удаляется вся итоговая информаци об
+  истории посещений. Эта итоговая информация вычисляется из деталей истории.</li>
+
+  <li><strong>Очистить сессии:</strong> Удаляются истекшие пользовательские сеансы.</li>
+
+  <li><strong>Очистить неиспользуемые каналы уведомлений</strong></li>
+  
+  <li><strong>Purge search history</strong></li>
+  
+  <li><strong>Очистить созданные шаблоны</strong></li>
+
+</ul>
Index: tags/2.4.0RC3/language/ru_RU/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,16 @@
+<h2>Уведомления</h2>
+
+<p>Этот раздел создан для настройки и управления уведомлениями по электронной
+почте пользователей о новостях на сайте.</p>
+
+<p>Страница содержит три вкладки:</p>
+
+<h3>Параметры</h3>
+<p>Доступные только вебмастеру, это параметры уведомлений.</p>
+
+<h3>Список рассылки</h3>
+<p>Доступно только вебмастеру, эта вкладка управляет подпиской пользователей на уведомления.</p>
+
+<h3>Отправка</h3>
+<p>Доступно только вебмастеру и администратору, эта вкладка позволяет производить рассылку уведомлений.</p>
+
Index: tags/2.4.0RC3/language/ru_RU/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/permalinks.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>Постоянные ссылки</h2>
+
+<p>Постоянные ссылки используют чтобы сделать URL категории более удобным. Когда
+для категории определена прямая ссылка, id категории в URL более не используется.</p>
+
+<p>После удаления прямой ссылки, Вы можете сохранить ее в истории прямых ссылок,
+чтобы сохранить работоспособность внешних ссылок. В таблице истории прямых ссылок
+ можно посмотреть дату удаления прямой ссылки, когда ей последний раз пользовались,
+ сколько всего раз ей пользовались.</p>
+
+<p>Заметьте, допускается только одна прямая ссылка на каждую категорию.
+Аналогично и в истории прямых ссылок нельзя определить одну и ту же прямую ссылку несколько раз.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,133 @@
+<fieldset>
+  <legend>Быстрый старт</legend>
+
+<ol>
+
+  <li>Создайте локальную папку "test_category".</li>
+
+  <li>Скопируйте фотографии в "test_category".</li>
+
+  <li>Соединитесь по FTP с галереей.</li>
+
+  <li>Загрузите локальную папку "test_category" в удаленную папку "galleries".
+  Установите права доступа 777 на папку "galleries/test_category".</li>
+
+  <li>Зайдите в Вашу галерею Piwigo как администратор.</li>
+
+  <li>Перейдите в <span class="pwgScreen">Администрирование, Фотографии,
+  Миниатюры</span>. Piwigo найдет фотографии без миниатюр в "test_category"
+  и спросит подтверждение на создание миниатюр.</li>
+
+  <li>Перейдите в <span class="pwgScreen">Администрирование, Галереи,
+  Синхронизация</span>. Отметьте "папки и файлы", снимите отметку "только тестировать
+  (не вносить изменения в базу данных)" и нажмите отправить.</li>
+
+  <li>Все. Вы создали категорию "test_category" в корне Вашей галереи.</li>
+
+</ol>
+
+</fieldset>
+<fieldset>
+  <legend>Добавление фотографий</legend>
+
+<ul>
+
+  <li>
+
+    <p>Папки категорий располагаются в папке "galleries".
+    Ниже смотрите дерево небольшой галереи:</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>В простейшем случае, категории представлены как папки любого уровня в
+  папке "galleries". Каждая категория может содержать столько подкатегорий,
+  сколько хотите. В примере выше, category-1.1.1.1 находится на 4 уровне.</li>
+
+  <li>Каждый файл - это фотография. Файл может быть элементом Piwigo если его
+  тип описан в параметре <code>file_ext</code>
+  (см файл <span  class="filename">include/config_default.inc.php</span>).</li>
+
+  <li>Фотография должна иметь миниатюру (см ниже раздел о миниатюрах)</li>
+
+  <li>Фотография может иметь версию в высоком разрешении, как wedding.jpg в примере выше.
+  У файла с высоким разрешением нет префикса.</li>
+
+  <li>Элементы, не являющиеся изображениями (видео, музыка, тексты и др.) по определению
+  представлены иконками соответствующими расширению файла. Дополнительно, Вы можете
+  связать миниатюру и представительный файл (см. video.avi в примере выше).</li>
+
+  <li><em>Внимание</em>: название папок и файлов должно быть составлено из букв,
+  чисел, "-", "_" или ".". Не используйте пробелы.</li>
+
+  <li><em>Для сведения</em>: категория может содержать элементы и подкатегории одновременно.
+  Тем не менее, настоятельно рекомендуется для каждой категории выбрать, будет
+  она содержать подкатегории или элементы.</li>
+
+  <li>Когда файлы, миниатюры и представители правильно размещены в папки, выберите:
+  <span class="pwgScreen">Администрирование, Категории, Синхронизация</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>Миниатюры</legend>
+
+<ul>
+
+  <li>Как сказано ранее, каждое изображение должно иметь миниатюру.</li>
+
+  <li>Миниатюры располагаются в подпапке "thumbnail" папки категории.
+  Миниатюра - это картинка (с типами файлов как и изображения) в имени файла
+  имеющая префикс, который указан в настройке Префикс миниатюры" (см панель
+  администрирования, Настройки, Основные).</li>
+
+  <li>Миниатюры не обязательно должны быть с тем же расширением, как оригинальные изображения
+  (изображение с расширением .jpg может иметь миниатюру с расширением .GIF).</li>
+
+  <li>Совет: используйте внешний модуль для создания миниатюр.</li>
+
+  <li>Вы можете также использовать возможности скрипта (<span
+  class="pwgScreen">Администрирование, Фотографии, Миниатюры</span>), хотя делать
+  это не рекомендуется. К сожалению, качество миниатюр может быть не очень высоким,
+  а загрузка процессора достаточно высока, что может привести к проблемам
+  при использовании бесплатного хостинга.</li>
+
+  <li>Если все же пользоваться возможностями скрипта, нужно дать права на запись
+  для всех папок категорий и подпапок "thumbnail" для ugo (user, group, other).</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/ru_RU/help/search.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/search.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Поиск</h2>
+
+<p>Эта страница позволяет искать фотографии по всей галерее.</p>
+
+<dl>
+
+  <dt>Поиск по словам </dt>
+  <dd>Поиск по всем словам во всех атрибутах во всех изображениях галереи.
+  Используйте * как подстановочный знак для частичных соответствий.</dd>
+
+  <dt>Поиск по автору</dt>
+  <dd>Используйте * как подстановочный знак для частичных соответствий.</dd>
+
+  <dt>Поиск по дате</dt>
+  <dd>Выберите начальную и/или конечную дату запроса. Оставьте пустой начальную
+  дату для поиска "ранее". Год должен вводиться в последнее поле в формате 0000 (т.е. 2004)</dd>
+
+  <dt>Поиск в Категориях</dt>
+  <dd>Выберите категорию или категории для ограничения области поиска. Для поиска
+  во всех подкатегориях можно выбратьродительскую категорию и установить флаг поиска в подкатегориях.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/ru_RU/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/site_manager.html	(revision 14585)
@@ -0,0 +1,48 @@
+<h2>Удаленные сайты</h2>
+
+<p>Piwigo предлагает возможность использовать несколько серверов, чтобы хранить
+изображения, которые составят Вашу галерею. Это может быть полезно, если Ваша
+галерея установлена на одном ограниченном пространстве и у Вас большое количество
+изображений, которые должны быть показаны.</p>
+
+<ol>
+
+  <li>отредактируйте файл <span class="filename">tools/create_listing_file.php</span>,
+  изменяя секцию параметров
+  <code>$conf['prefix_thumbnail']</code> или
+  <code>$conf['use_exif']</code>.</li>
+
+  <li>поместите измененный файл <span class="filename">tools/create_listing_file.php</span>
+  на удаленный сервер, в папку где лежат папки категорий (как папка <span class="filename">galleries</span> на
+  этом вебсайте) с помощью FTP. Для примера, скажем, что Вы можете обратиться к <span
+  class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+
+  <li>перейдите к <span class="pwgScreen">панели администрирования, Галереи, Управление
+  сайтами</span>. Создайте новый сайт, например <span
+  class="filename">http://example.com/galleries</span>.</li>
+
+  <li>новый удаленный сайт зарегистрирован. Вы можете выполнить 4 действия:
+
+    <ol>
+
+      <li><strong>сгенерировать листинг</strong>: запускает удаленный запрос на
+      генерацию файла листинга</li>
+
+      <li><strong>синхронизация</strong>: читает удаленный файл <span
+      class="filename">listing.xml</span> и синхронизирует с информацией в базе данных.</li>
+
+      <li><strong>очистить</strong>: стирает удаленный файл <span
+      class="filename">listing.xml</span>.</li>
+
+      <li><strong>удалить</strong>: удаляет сайт (все категории и элементы) в базе данных.</li>
+
+    </ol>
+  </li>
+</ol>
+
+<!-- <p>You can do all this by hand by generating yourself the <span
+class="filename">listing.xml</span> file, moving it from your distant server
+to you local Piwigo root directory and opening the remote site
+management screen : Piwigo will propose you to use the found
+listing.xml file.</p>-->
+
Index: tags/2.4.0RC3/language/ru_RU/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/synchronize.html	(revision 14585)
@@ -0,0 +1,12 @@
+<h2>Синхронизация</h2>
+
+<p>Возможны 2 типа синхронизации: папки/файлы и метаданные.
+Папки/файлы синхронизируют дерево папок с деревом категорий в базе данных.
+Метаданные синхронизируют информацию элементов, такую как размер файла, размеры
+в пикселях, информацию EXIF или IPTC.</p>
+
+<p>Сначала должны быть синхронизированы папки/файлы.</p>
+
+<p>Процесс синхронизации может занять много времени (в зависимости от загрузки
+сервера и количества синхронизируемых элементов) то есть возможно стоит продвигаться
+пошагово:  от категории к категории.</p>
Index: tags/2.4.0RC3/language/ru_RU/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,17 @@
+<h2>Создание миниатюр</h2>
+<p>Эта страница позволяет создать отсутствующие миниатюры.</p>
+<dl>
+<dt>Версия GD</dt>
+<dd>GD - это графическая библиотека для PHP. Выберите версию, установленную на
+Вашем сервере. Если выбрать неправильную версию, выведется сообщение об ошибке,
+вернитесь и задайте другую версию. Если ни один из вариантов не работает, значит
+сервер не поддерживает GD.</dd>
+<dt>Ширина и высота</dt>
+<dd>Задается максимальный размер миниатюры. Соотношение сторон сохраняется.</dd>
+<dt>Количество создаваемых миниатюр</dt>  <dd>Не пытайтесь уменьшить сразу много
+фотографий. Уменьшение загружает CPU. Если скрипт установлен на сервере бесплатного
+провайдера, слишком большая загрузка CPU со стороны Вашего сайта может привести
+к его удалению.</dd>
+<dt>Формат файла</dt>
+<dd>Файлы миниатюр имеют только тип JPEG. Миниатюры могут быть созданы только для
+файлов PNG и JPEG.</dd></dl>
Index: tags/2.4.0RC3/language/ru_RU/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/ru_RU/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/help/user_list.html	(revision 14585)
@@ -0,0 +1,32 @@
+<h2>Список пользователей</h2>
+
+<p>На этой странице Вы можете управлять зарегистрированными пользователями.
+Только разрешениями управляют в нескольких различных экранах.</p>
+
+<h3>Добавление пользователей</h3>
+
+<p>Администратор может вручную добавить пользователя.</p>
+
+<h3>Список пользователей</h3>
+
+<p>Список может быть отфильтрован по имени пользователя (используйте * как
+подстановочный знак), группе или статусу. Список можно отсортировать по дате
+регистрации или имени пользователя, по возрастанию или по убыванию.</p>
+
+<p>Этот экран позволяет производить над несколькими пользователями одно или несколько действий:</p>
+
+<ul>
+
+  <li>удаление пользователей (требуется подтвердить установкой галочки)</li>
+
+  <li>изменение статуса</li>
+
+  <li>включение или исключение из группы</li>
+
+  <li>редактирование свойств отображения</li>
+
+  <li>редактирование дополнительных свойств</li>
+
+</ul>
+
+<p>Настройки применяются к выбранным пользователям (по умолчанию) или ко всем.</p>
Index: tags/2.4.0RC3/language/ru_RU/index.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/ru_RU/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Установка';
+$lang['Basic configuration'] = 'Базовая настройка';
+$lang['Default gallery language'] = 'Язык по умолчанию';
+$lang['Database configuration'] = 'Настройка базы данных';
+$lang['Admin configuration'] = 'Настройка администрирования';
+$lang['Start Install'] = 'Начать установку';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адрес электронной почты должен быть похож на xxx@yyy.eee (например: jack@altern.org)';
+$lang['Webmaster login'] = 'Логин вебмастера';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Он будет показан посетителям. Необходим для администрирования сайта';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Успешно соединились с сервером, но невозможно подключиться к базе данных';
+$lang['Can\'t connect to server'] = 'Невозможно соединиться с сервером';
+$lang['Host'] = 'Хост MySQL';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Пользователь';
+$lang['user login given by your host provider'] = 'логин, который выдал провайдер';
+$lang['Password'] = 'Пароль';
+$lang['user password given by your host provider'] = 'пароль, который выдал провайдер';
+$lang['Database name'] = 'Имя базы данных';
+$lang['also given by your host provider'] = 'также выдается провайдером. Часто совпадает с логином';
+$lang['Database table prefix'] = 'Префикс таблиц в базе данных';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'названия таблиц в базе данных будут начинаться с этого (что упростит их обслуживание)';
+$lang['enter a login for webmaster'] = 'нужно ввести логин для вебмастера';
+$lang['webmaster login can\'t contain characters \' or "'] = 'логин вебмастера не должен содержать символы  \' или "';
+$lang['please enter your password again'] = 'еще раз пароль';
+$lang['Webmaster password'] = 'Пароль вебмастера';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Не сообщайте его никому, он необходим для доступа к панели администрирования';
+$lang['Password [confirm]'] = 'Повторите пароль';
+$lang['verification'] = 'еще раз для исключения опечатки';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Нужна помощь? Задайте свои вопросы на <a href="%s">Форуме Piwigo</a>.';
+$lang['Webmaster mail address'] = 'Электронная почта вебмастера';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Будет использоваться для контакта посетителей с администратором';
+$lang['PHP 5 is required'] = 'Требуется PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Кажется, что Ваш хостинг в настоящее время под управлением  PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo может попытаться переключить Вашу конфигурацию на PHP 5, создавая или изменяя .htaccess файл.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Отметьте, что Вы можете изменить конфигурацию самостоятельно и перезапустите Piwigo после этого.';
+$lang['Try to configure PHP 5'] = 'Попытаться переконфигурировать PHP 5';
+$lang['Sorry!'] = 'Извините!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo не в состоянии переконфигурировать PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Вы должны обратиться к своему провайдеру за поддержой и разъяснениями  как Вы можете переключиться на PHP 5.';
+$lang['Hope to see you back soon.'] = 'Надеемся скоро увидеть Вас вновь.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Поздравляем, установка Piwigo полностью завершена';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Альтернативное решение состоит в том, чтобы скопировать текст в блоке выше и вставить это в файл "local/config/database.inc.php"   (Предупреждение: database.inc.php должен только содержать то, что находится в textarea, без линий возврата строки или пробелов)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Создать файл конфигурации local/config/database.inc.php не удалось.';
+$lang['Download the config file'] = 'Загрузить файл конфигурации';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Вы можете загрузить файл конфигурации и передать его в local/config directory.';
+$lang['Just another Piwigo gallery'] = 'Еще одна галерея Piwigo';
+$lang['Welcome to my photo gallery'] = 'Добро пожаловать в мою фотогалерею';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Пожалуйста консультируйтесь на нашем форуме для любой помощи:';
+$lang['Welcome to your new installation of Piwigo!'] = 'Добро пожаловать в новую установку Piwigo!';
+?>
Index: tags/2.4.0RC3/language/ru_RU/iso.txt
===================================================================
--- tags/2.4.0RC3/language/ru_RU/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Русский [RU]
Index: tags/2.4.0RC3/language/ru_RU/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/ru_RU/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/ru_RU/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,41 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Обновление';
+$lang['Upgrade from version %s to %s'] = 'Обновление с версии %s до %s';
+$lang['Statistics'] = 'Статистика';
+$lang['total upgrade time'] = 'общее время обновления';
+$lang['total SQL time'] = 'общее время SQL';
+$lang['SQL queries'] = 'SQL запросы';
+$lang['Upgrade informations'] = 'Информация об обновлениях';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Выполните обслуживание [Администирирование> Инструменты > Обслуживание] если вы столкнулись с какими-либо проблемами.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Только администратор может запустить обновление: проверьте ниже.';
+$lang['You do not have access rights to run upgrade'] = 'У вас нет прав на запуск обновлений';
+$lang['All sub-albums of private albums become private'] = 'Все вложенные альбомы для приватного альбома тоже становятся приватными';
+$lang['User permissions and group permissions have been erased'] = 'Разрешения пользователей и групп были стерты';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Только префикс эскизов и адрес почты вебмастера были сохранены от предыдущей конфигурации';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Эта страница предлагает модернизировать базу данных от Вашей старой версии Piwigo до новой версии. Помощник обновления думает, что Вы используете в настоящее время <b> выпуск %s </b> (или эквивалентный).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Желательно, чтобы следующие плагины были дезактивированы. Вы должны проверить обновления плагинов прежде, чем активировать их снова:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] ='В %s, до ?>, вставить:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Предварительно эти темы были деактивированы. Вы должны проверить актуальность их версии, прежде чем реактивировать их:';
+?>
Index: tags/2.4.0RC3/language/sh_RS/about.html
===================================================================
--- tags/2.4.0RC3/language/sh_RS/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/about.html	(revision 14585)
@@ -0,0 +1,13 @@
+  <li>Piwigo je web aplikacija koja vam omogućava izradu web galerije na lak način.</li>
+
+  <li>Tehnički, Piwigo je potpuno razvijen korišćenjem PHP (the elePHPant) te MySQL baze podataka (the SQuirreL).</li>
+
+  <li>Ako imate predloga i komentara, molimo posjetite <a href="http://piwigo.org">Piwigo</a> službenu stranicu, i njoj posvećen <a href="http://piwigo.org/forum">forum</a>.</li>
+
+<p>The serbia translation is maintained by (in alphabetical order):
+
+<ul>
+<li>Darko</li>
+<li><a href="http://piwigo.org/forum/profile.php?id=16294">vladamilanovic</a></li>
+</ul>
+.... Many thanks to you</p> 
Index: tags/2.4.0RC3/language/sh_RS/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/admin.lang.php	(revision 14585)
@@ -0,0 +1,901 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d veza';
+$lang['%d associations'] = '%d veze';
+$lang['%d album including'] = '%d kategorija obuhvata ';
+$lang['%d albums including'] = '%d kategorije obuhvataju ';
+$lang['%d physical'] = '%d stvarna';
+$lang['%d physical'] = '%d stvarnih';
+$lang[' and %d virtual'] = ' i %d virtualna';
+$lang[' and %d virtual'] = ' i %d virtualnih';
+$lang['%d album moved'] = '%d kategorija premeštena';
+$lang['%d albums moved'] = '%d kategorija premešteno';
+$lang['%d group'] = '%d grupa';
+$lang['%d groups'] = '%d grupa';
+$lang['%d member'] = '%d član';
+$lang['%d members'] = '%d članova';
+$lang['%d tag'] = '%d oznaka';
+$lang['%d tags'] = '%d oznaka';
+$lang['%d user comment rejected'] = '%d korisnički komentar odbačen';
+$lang['%d user comments rejected'] = '%d korisničkih komentara odbačeno';
+$lang['%d user comment validated'] = '%d korisnički kometar odobren';
+$lang['%d user comments validated'] = '%d korisničkih komentara odobreno';
+$lang['%d user deleted'] = '%d korisnik izbrisan';
+$lang['%d users deleted'] = '%d korisnika izbrisano';
+$lang['%d user'] = '%d korisnik';
+$lang['%d users'] = '%d korisnika';
+$lang['%d waiting for validation'] = '%d čekanje na overu';
+$lang['Actions'] = 'Postupci';
+$lang['Activate'] = 'Uključi';
+$lang['Add/delete a permalink'] = 'Dodaj/izbriši stalnu vezu';
+$lang['Add a tag'] = 'Dodaj';
+$lang['Add a user'] = 'Dodaj korisnika';
+$lang['Add group'] = 'Dodaj grupu';
+$lang['Add'] = 'Dodaj';
+$lang['Allow user registration'] = 'Odobri upis korisnika';
+$lang['Apply to sub-albums'] = 'Primeni na podkategorije';
+$lang['Associated'] = 'Povezanost';
+$lang['Caddie management'] = 'Kontrola fioke';
+$lang['Caddie'] = 'Fioka';
+$lang['Albums authorized thanks to group associations'] = 'Kategorije overene zahvaljujući grupnoj vezi';
+$lang['Album manual order was saved'] = 'Redosled kategorija je sačuvan';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Provera nadogradnje neuspešna iz nepoznatog razloga.';
+$lang['Check for upgrade'] = 'Provera nadogradnje';
+$lang['Comments for all'] = 'Komentari za sve';
+$lang['Current name'] = 'Trenutni naziv';
+$lang['Database'] = 'Baza podataka';
+$lang['Deactivate'] = 'Isključi';
+$lang['Deletions'] = 'Brisanja';
+$lang['Deny selected groups'] = 'Zabrani odabrane grupe';
+$lang['Deny selected users'] = 'Zabrani odabrane korisnike';
+$lang['Description'] = 'Opis';
+$lang['Display options'] = 'Mogućnosti prikaza';
+$lang['Dissociated'] = 'Odvojeno';
+$lang['Does not represent'] = 'Ne predstavlja';
+$lang['Edit selected tags'] = 'Uredi odabrane oznake';
+$lang['Edit tags'] = 'Uredi oznake';
+$lang['Email admins when a new user registers'] = 'E-mail administratorima pri upisu novih korisnika';
+$lang['Email admins when a valid comment is entered'] = 'E-mail administratorima pri upisu novih komentara';
+$lang['Email admins when a comment requires validation'] = 'Email administratorima kada komentar treba overu';
+$lang['Environment'] = 'Okruženje';
+$lang['Form'] = 'Oblik';
+$lang['Gallery title'] = 'Naziv galerije';
+$lang['Grant selected groups'] = 'Ovlasti odabrane grupe';
+$lang['Grant selected users'] = 'Ovlasti odabrane korisnike';
+$lang['Group name'] = 'Naziv grupe';
+$lang['Groups'] = 'Grupa';
+$lang['Guests'] = 'Gostiju';
+$lang['History'] = 'Istorija';
+$lang['Informations'] = 'Informacije';
+$lang['Install'] = 'Instaliraj';
+$lang['Link all album photos to a new album'] = 'Poveži sve elemente kategorije sa novom kategorijom';
+$lang['Link all album photos to some existing albums'] = 'Poveži sve elemente kategorije sa nekom postojećom kategorijom';
+$lang['Linked albums'] = 'Povezane kategorije';
+$lang['Lock gallery'] = 'Zaključaj galeriju';
+$lang['Maintenance'] = 'Održavanje';
+$lang['Edit album permissions'] = 'Upravljanje dozvolama za kategoriju';
+$lang['Manage permissions for group "%s"'] = 'Upravljanje dozvolama za grupu "%s"';
+$lang['Manage permissions for user "%s"'] = 'Upravljanje dozvolama za korisnika "%s"';
+$lang['Manage tags'] = 'Upravljanje oznakama';
+$lang['Members'] = 'Članovi';
+$lang['Metadata synchronized from file'] = 'Usklađivanje meta podataka iz datoteke';
+$lang['Move albums'] = 'Premesti kategorije';
+$lang['Move'] = 'Premesti';
+$lang['Name'] = 'Naziv';
+$lang['New name'] = 'Novi naziv';
+$lang['New parent album'] = 'Nova nadređena kategorija';
+$lang['New tag'] = 'Nova oznaka';
+$lang['Number of comments per page'] = 'Broj komentara po stranici';
+$lang['Number of rates'] = 'Broj ocena';
+$lang['Number of thumbnails to create'] = 'broj poveznih sličica za izradu';
+$lang['Only private albums are listed'] = 'Samo lične kategorije su ispisane';
+$lang['Operating system'] = 'Operativni sistem';
+$lang['Options'] = 'Mogućnosti';
+$lang['Other private albums'] = 'Ostale lične kategorije';
+$lang['Page banner'] = 'Baner stranice';
+$lang['Parent album'] = 'Nadređena kategorija';
+$lang['Path'] = 'Putanja';
+$lang['Permalink'] = 'Stalna veza';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Stalna veza mora biti sastavljena od znakova a-z, A-Z, 0-9, "-", "_" ili "/". Ne sme biti brojčana vrijednost ili počinjati brojem pa znakom "-"';
+$lang['Permalink %s is already used by album %s'] = 'Stalnu vezu %s već koristi kategorija %s';
+$lang['Permalink history'] = 'Istorija stalnih veza';
+$lang['Permalinks'] = 'Stalne veze';
+$lang['Permission denied'] = 'Dozvola uskraćena';
+$lang['Permission granted thanks to a group'] = 'Dozvola odobrena zahvaljujući grupi';
+$lang['Permission granted'] = 'Dozvola odobrena';
+$lang['Photo informations updated'] = 'Podaci o slikama obnovljeni';
+$lang['Plugins'] = 'Dodaci';
+$lang['Position'] = 'Položaj';
+$lang['Preferences'] = 'Podešavanja';
+$lang['Properties'] = 'Karakteristike';
+$lang['Random photo'] = 'Slika slučajnog izbora';
+$lang['Rate date'] = 'Datum ocene';
+$lang['Rating by guests'] = 'Ocene gostiju';
+$lang['Rating'] = 'Ocenjivanje';
+$lang['Reject'] = 'Odbaci';
+$lang['Representant'] = 'Predstavnik';
+$lang['Representation of albums'] = 'Predstavljanje kategorija';
+$lang['Representative'] = 'Predstavljeno';
+$lang['Represents'] = 'Predstavlja';
+$lang['Save order'] = 'Snimi raspored';
+$lang['Save to permalink history'] = 'Snimi u istoriju stalnih veza';
+$lang['Select at least one album'] = 'Odaberite najmanje jednu kategoriju';
+$lang['Select at least one photo'] = 'Odaberite najmanje jednu sliku';
+$lang['Select at least one user'] = 'Odaberite najmanje jednog korisnika';
+$lang['Show info'] = 'Prikaz podataka';
+$lang['Site manager'] = 'Administrator galerije';
+$lang['Status'] = 'Stanje';
+$lang['Statistics'] = 'Statistika';
+$lang['Storage album'] = 'Kategorija snimanja';
+$lang['Sum of rates'] = 'Zbir ocena';
+$lang['Tag "%s" already exists'] = 'Oznaka "%s" već postoji';
+$lang['Tag "%s" was added'] = 'Oznaka "%s" dodata';
+$lang['Tag selection'] = 'Izbor oznake';
+$lang['The %d following tags were deleted'] = 'Sledeće %d oznake su izbrisane';
+$lang['Unable to check for upgrade.'] = 'Ne mogu proveriti za nadogradnju.';
+$lang['Uninstall'] = 'Ukloni';
+$lang['Use the default photo sort order (defined in the configuration file)']='Koristi podrazumevani redosled slaganja slika (određeno u datoteci za podešavanje)';
+$lang['User comments validation'] = 'Overa korisničkih komentara';
+$lang['Users'] = 'Korisnici';
+$lang['Validate'] = 'Overi';
+$lang['Validation'] = 'Overa';
+$lang['Version'] = 'Verzija';
+$lang['Virtual albums to move'] = 'Virtuelne kategorije za premeštanje';
+$lang['Virtual album name'] = 'Naziv virtuelne kategorije';
+$lang['Webmaster cannot be deleted'] = 'Webmaster ne može biti izbrisan';
+$lang['You are running on development sources, no check possible.'] = 'Vi koristite razvojni izvorni kod, provera nemoguća.';
+$lang['You cannot delete your account'] = "Ne možete izbrisati svoj nalog";
+$lang['You cannot move an album in its own sub album'] = 'Ne možete premestiti kategoriju u njenu podkategoriju';
+$lang['You need to confirm deletion'] = 'Potvrdi brisanje';
+$lang['Associate to album'] = 'poveži sa kategorijom';
+$lang['associate to group'] = 'poveži sa grupom';
+$lang['Authorized'] = 'Ovlašćeno';
+$lang['Add a virtual album'] = 'Dodaj virtuelnu kategoriju';
+$lang['Authorize users to add comments on selected albums'] = 'Ovlastite korisnike za davanje komentara u odabranim kategorijama';
+$lang['The name of an album must not be empty'] = 'Naziv kategorije ne bi trebao biti prazan';
+$lang['Lock albums'] = 'Zaključaj kategorije';
+$lang['Private'] = 'Lična kategorija';
+$lang['Public'] = 'Javna kategorija';
+$lang['Find a new representant by random'] = 'Izbor novog predstavnika slučajnim izborom';
+$lang['Public / Private'] = 'Javno / Lično';
+$lang['Manage authorizations for selected albums'] = 'Upravljanje ovlašćenjima za odabrane kategorije';
+$lang['Virtual album added'] = 'Virtuelna kategorija dodata';
+$lang['Virtual album deleted'] = 'Virtuelna kategorija izbrisana';
+$lang['Access type'] = 'Vrsta pristupa';
+$lang['Information data registered in database'] = 'Podaci upisani u bazu podataka';
+$lang['Default display'] = 'Podrazumevani prikaz';
+$lang['The gallery URL is not valid.'] = 'URL galerije nije odgovarajući.';
+$lang['Main'] = 'Glavno';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Broj komentara po stranici mora biti između 5 i 50.';
+$lang['Configuration'] = 'Podešavanje';
+$lang['confirm'] = 'potvrdi';
+$lang['Date'] = 'Datum';
+$lang['delete album'] = 'obriši kategoriju';
+$lang['Dissociate from album'] = 'odvoji od kategorije';
+$lang['dissociate from group'] = 'odvoji od grupe';
+$lang['Album updated successfully'] = 'Podaci kategorije uspešno obnovljeni.';
+$lang['photos per page'] = 'elemenata po stranici';
+$lang['High definition enabled'] = 'Visoka rezolucija omogućena';
+$lang['File'] = 'Datoteka';
+$lang['first photo added on %s'] = 'prvi element dodat %s';
+$lang['Forbidden'] = 'Zabranjeno';
+$lang['global mode'] = 'opšti način';
+$lang['group "%s" added'] = 'grupa "%s" dodata';
+$lang['group "%s" deleted'] = 'grupa "%s" izbrisana';
+$lang['group "%s" updated'] = 'grupa "%s" obnovljena';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Naziv grupe ne može sadržati  " ili \' ili biti prazan.';
+$lang['This name is already used by another group.'] = 'Ovaj naziv već koristi druga grupa.';
+$lang['High definition'] = 'Visoka rezolucija';
+$lang['jump to album'] = 'skok u kategoriju';
+$lang['jump to photo'] = 'skok na sliku';
+$lang['leave'] = 'ostavi';
+$lang['Lock'] = 'Zaključaj';
+$lang['Locked'] = 'Zaključano';
+$lang['manage album photos'] = 'upravljanje elementima kategorije';
+$lang['manage sub-albums'] = 'upravljanje podkategorijama';
+$lang['Manage'] = 'Upravljaj';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Vreme izvršenja je isteklo, obrada se mora nastaviti [Procenjeno vreme: %d sekunde].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Vreme izvršenja je isteklo, obrada se mora nastaviti [Procenjeno vreme: %d sekundi].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Predviđeno vreme za popis korisnika za slanje poruka je ograničeno. Ostali korisnici nisu izlistani.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Vreme za slanje poruke je ograničeno. Ostale poruke su preskočene.';
+$lang['To send ?'] = 'Poslati ?';
+$lang['Last send'] = 'Zadnje poslato';
+$lang['email'] = 'e-mail';
+$lang['User'] = 'Korisnik';
+$lang['See you soon,'] = 'Vidimo se uskoro,';
+$lang['Go to'] = 'Idi na ';
+$lang['Hello'] = 'Pozdrav ';
+$lang['New photos were added'] = 'Novi elementi su dodati ';
+$lang['on'] = ' na ';
+$lang['between'] = 'između ';
+$lang['and'] = ' i ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster vas je pretlatio na primanje e-mail obaveštenja.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Pretplatili ste se na primanje e-mail obaveštenja.';
+$lang['To subscribe'] = 'Pretplata';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Ukoliko ste naišli na probleme ili imate pitanja, molimo pošaljite poruku za ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problemi ili pitanja';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster Vas je uklonio sa liste za primanje e-mail obaveštenja.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Uklonili ste se sa liste za primanje e-mail obaveštenja.';
+$lang[', click on'] = ', kliknite na ';
+$lang['To unsubscribe'] = 'Za uklanjanje';
+$lang['With blank value, gallery title will be used'] = 'Sa praznim poljem, koristi će se naziv galerije';
+$lang['Notification'] = 'Obaveštenje';
+$lang['Error when sending email to %s [%s].'] = 'Greška prilikom slanja e-mail poruke za %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Poruka poslata za %s [%s].';
+$lang['%d mail was sent.'] = '%d poruka poslata.';
+$lang['%d mails were sent.'] = '%d poruke poslate.';
+$lang['%d mail was not sent.'] = '%d poruka nije poslata.';
+$lang['%d mails were not sent.'] = '%d poruke nisu poslate.';
+$lang['No mail to send.'] = 'Nema poruke za slanje.';
+$lang['There is no available subscribers to mail.'] = 'Nema dostupnih primaoca za slanje poruka.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Pretplatnici mogu biti izlistani (dostupni) samo ako ima novih elemenata za obaveštenje.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'U svakom slučaju samo webmaster može pristupiti ovoj tabli a nikad administratori.';
+$lang['No user to send notifications by mail.'] = 'Nema korisnika za slanje e-mail obaveštenja.';
+$lang['New photos added'] = 'Novi elementi dodati';
+$lang['Subscribe to notification by mail'] = 'Pretplatite se za e-mail obaveštenja';
+$lang['Unsubscribe from notification by mail'] = 'Uklonite se iz sistema primanja e-mail obaveštenja';
+$lang['Parameter'] = 'Stavka';
+$lang['Continue processing treatment'] = 'Nastavi obradu postupka';
+$lang['Complementary mail content'] = 'Kompletan sadržaj poruke';
+$lang['Add detailed content'] = 'Dodaj detaljni sadržaj';
+$lang['Send mail as'] = 'Pošalji poruku kao ';
+$lang['Send mail to users'] = 'Pošalji poruku korisnicima';
+$lang['Send'] = 'Pošalji';
+$lang['Options'] = 'Mogućnosti';
+$lang['Send'] = 'Pošalji';
+$lang['Subscribed'] = 'Pretplaćen';
+$lang['Subscribe'] = 'Pretplatite se';
+$lang['Parameters'] = 'Stavke';
+$lang['Select recipients'] = 'Odaberite primaoce';
+$lang['Subscribe/unsubscribe users'] = 'Pretplati/poništi pretplatu korisnika';
+$lang['Unsubscribed'] = 'Pretplata poništena';
+$lang['%d parameter was updated.'] = '%d stavka je obnovljena.';
+$lang['%d parameters were updated.'] = '%d stavke su poništene.';
+$lang['%d user was not updated.'] = '%d korisnik nije obnovljen.';
+$lang['%d users were not updated.'] = '%d korisnici nisu obnovljeni.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Korisnik %s [%s] je uklonjen iz liste pretplatnika.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Korisnik %s [%s] je dodat na listu pretplatnika.';
+$lang['%d user was updated.'] = '%d korisnik je obnovljen.';
+$lang['%d users were updated.'] = '%d korisnici su obnovljeni.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Korisnik %s [%s] nije uklonjen iz liste pretplatnika.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Korisnik %s [%s] nije dodat na listu pretplatnika.';
+$lang['User %s [%s] added.'] = 'Korisnik %s [%s] dodat.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Upozorenje: pretplata ili ukidanje pretplate će poslati e-mail poruke korisnicima';
+$lang['Send mail on HTML format'] = 'Pošalji poruku u HTML obliku';
+$lang['Include display of recent photos grouped by dates'] = 'Uključi prikaz nedavnih slika složenih po datumima';
+$lang['Available only with HTML format'] = 'Dostupno samo u HTML obliku';
+$lang['no write access'] = 'nema dozvole upisa';
+$lang['Permissions'] = 'Dozvole';
+$lang['private'] = 'lično';
+$lang['public'] = 'javno';
+$lang['Purge never used notification feeds'] = 'Isprazni nikad korišćene obaeštavajuće izvore';
+$lang['Purge sessions'] = 'Isprazni sesije';
+$lang['randomly represented'] = 'predstavljen slučajnim izborom';
+$lang['registration date'] = 'datum upisa';
+$lang['clean'] = 'čisto';
+$lang['Create this site'] = 'Napravi ovu stranicu';
+$lang['test'] = 'proba';
+$lang['test this remote site'] = 'isprobajte ovo udaljenu stranicu';
+$lang['remove tags'] = 'ukloni oznake';
+$lang['Repair and optimize database'] = 'Popravi i podesi bazu podataka';
+$lang['selection'] = 'izbor';
+$lang['set to'] = 'postavljeno na';
+$lang['singly represented'] = 'jednoznačno predstavljeno';
+$lang['This site already exists'] = 'Ova stranica već postoji';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Izradi novu stranicu : (odrdite njenu URL za izradu create_listing_file.php)';
+$lang['created'] = 'napravljeno';
+$lang['delete'] = 'obriši';
+$lang['delete this site and all its attached elements'] = 'obriši ovu stranicu i sve njene pridodate stavke';
+$lang['an error happened'] = 'došlo je do greške';
+$lang['Local'] = 'Lokalno';
+$lang['Remote'] = 'Udaljeno';
+$lang['update the database from files'] = 'obnovi bazu podataka pomoću datoteke';
+$lang['status'] = 'stanje';
+$lang['Directory'] = 'Mapa';
+$lang['sub-albums'] = 'podkategorije';
+$lang['Synchronize metadata'] = 'sinhronizuj meta podatke';
+$lang['target'] = 'odredište';
+$lang['Thumbnail'] = 'Povezne sličice';
+$lang['title'] = 'naslov';
+$lang['Album list management'] = 'Upravljanje kategorijama';
+$lang['Piwigo configuration'] = 'Piwigo podešavanja';
+$lang['Edit album'] = 'Uredi kategoriju';
+$lang['Group management'] = 'Upravljanje grupama';
+$lang['User list'] = 'Lista korisnika';
+$lang['Edit photo information'] = 'Promena podataka o slici';
+$lang['Database synchronization with files'] = 'Sinhronizacija baze podataka sa datotekama';
+$lang['all'] = 'sve';
+$lang['height must be a number superior to'] = 'visina mora biti broj veći od ';
+$lang['width must be a number superior to'] = 'širina mora biti broj veći od';
+$lang['for the file format'] = 'za datotečni oblik';
+$lang['Photo unreachable or no support'] = 'Slika nedostupna ili bez podrške';
+$lang['GD version'] = 'GD verzija';
+$lang['General statistics'] = 'Glavna statistika';
+$lang['average time'] = 'prosečno vreme';
+$lang['number of miniaturized photos'] = 'broj umanjenih slika';
+$lang['total time'] = 'ukupno vreme';
+$lang['for this file format'] = 'za ovu vrstu datoteke';
+$lang['unit mode'] = 'pojedinačni način';
+$lang['Unlocked'] = 'Otključano';
+$lang['unset'] = 'razdešeno';
+$lang['Update albums informations'] = 'Obnovi podatke o kategorijama';
+$lang['Update photos information'] = 'Obnovi podatke o slikama';
+$lang['Synchronize'] = 'Sinhronizuj';
+$lang['reduce to single existing albums'] = 'umanji na jednu postojeću kategoriju-e';
+$lang['Choose an option'] = 'Izaberite mogućnost';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'najopširniji mogući prikaz podataka (dodate kategorije i elementi, izbrisane  kategorije i elementi)';
+$lang['Error list'] = 'Lista grešaka ';
+$lang['Errors caption'] = 'Zaglavlja grešaka';
+$lang['Detailed informations'] = 'Detaljnija obaveštenja';
+$lang['File/directory read error'] = 'Greška čitanja datoteke/direktorijuma';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Datoteci ili direktorijumu se ne može pristupiti (ne postoji ili je pristup zabranjen)';
+$lang['albums deleted in the database'] = 'kategorije izbrisane iz baze podataka';
+$lang['photos deleted from the database'] = 'elementi izbrisani iz baze podataka';
+$lang['photos candidates for metadata synchronization'] = 'slika kandidata za sinhronizaciju meta podataka';
+$lang['photos informations synchronized with files metadata'] = 'podataka elemenata sinhronizovano sa meta podacima datoteke';
+$lang['errors during synchronization'] = 'grešaka tokom sinhronizacije';
+$lang['albums added in the database'] = 'kategorija dodato u bazu podataka';
+$lang['photos added in the database'] = 'elemenata dodato u bazu podataka';
+$lang['photos updated in the database'] = 'elemenata obnovljeno u bazi podataka';
+$lang['Search for new images in the directories'] = 'Pretraživanje novih slika u direktorijumima';
+$lang['added'] = 'dodato';
+$lang['deleted'] = 'obrisano';
+$lang['Metadata synchronization results'] = 'Rezultat usklađivanja meta podataka';
+$lang['only perform a simulation (no change in database will be made)'] = 'izvrši samo simulaciju (nema promena u bazi podataka)';
+$lang['Simulation'] = 'Simulacija';
+$lang['directories + files'] = 'direktorijume + datoteke';
+$lang['only directories'] = 'samo direktorijume';
+$lang['synchronize files structure with database'] = 'uskladi strukturu datoteke sa bazom podataka';
+$lang['synchronize files metadata with database photos informations'] = 'uskladi meta podatke datoteke sa podacima o elementu iz baze podataka';
+$lang['even already synchronized photos'] = 'čak i već usklađene elemente';
+$lang['Used metadata'] = 'Korišćeni meta podaci';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Nazivi direktorijuma i datoteka moraju biti sastavljeni od slova, brojva, "-", "_" ili "."';
+$lang['wrong filename'] = 'loš naziv datoteke';
+$lang['Upload'] = 'Prebaci';
+$lang['user "%s" added'] = 'korisnik "%s" dodat';
+$lang['User status'] = 'Stanje korisnika';
+$lang['user_status_admin'] = 'Administrator';
+$lang['user_status_generic'] = 'Opšti';
+$lang['user_status_guest'] = 'Gost';
+$lang['user_status_normal'] = 'Korisnik';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Virtuelna ketegorija';
+$lang['Waiting'] = 'Čekanje';
+$lang['default'] = 'podrazumevano';
+$lang['Toggle \'default group\' property'] = 'Promeni \'podrazumevana grupa\' osobine';
+$lang['Advanced features'] = 'Napredne mogućnosti';
+$lang['Overall'] = 'Sveukupno';
+$lang['Year'] = 'Godina';
+$lang['Month'] = 'Mesec';
+$lang['Day'] = 'Dan';
+$lang['Pages seen'] = 'Stranica viđeno';
+$lang['Time'] = 'Vreme';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Element';
+$lang['Section'] = 'Sekcija';
+$lang['An information email was sent to group "%s"'] = 'E-mail poruka obaveštenja je poslata grupi "%s';
+$lang['Send an information email to group members'] = 'Pošalji e-mail obaveštenja članovima grupe';
+$lang['Group'] = 'Grupa';
+$lang['[%s] Visit album %s'] = '[%s] Dođite i pogledajte kategoriju %s';
+$lang['Hello,'] = 'Zdravo,';
+$lang['See you soon.'] = 'Do viđenja.';
+$lang['Discover album:'] = 'Dođite i otkrijte kategoriju:';
+$lang['Mail content'] = 'sadržaj e-mail poruke';
+$lang['none'] = 'ni jedan';
+$lang['high'] = 'visoko';
+$lang['other'] = 'ostalo';
+$lang['Element type'] = 'Tip elementa';
+$lang['Image id'] = 'ID slike';
+$lang['Summary'] = 'Zbirno';
+$lang['%d line filtered'] = '%d linija pročišćena';
+$lang['%d lines filtered'] = '%d linija pročišćeno';
+$lang['%d guest'] = '%d gost';
+$lang['%d guests'] = '%d gostiju';
+$lang['Hour'] = 'Sat';
+$lang['guest'] = 'gost';
+$lang['default values'] = 'podrazumevane vrednosti';
+// --------- Starting below: New or revised $lang ---- from version 1.7.1
+$lang['Guest cannot be deleted'] = 'Gost ne može biti izbrisan';
+$lang['Default user cannot be deleted'] = 'Podrazumevani korisnik ne može biti izbrisan';
+$lang['Purge history detail'] = 'Isprazni detalje istorije';
+$lang['Purge history summary'] = 'Isprazni zbirnu istoriju';
+$lang['Check integrity'] = 'Provera celovitosti';
+$lang['Anomaly'] = 'Nepravilnost';
+$lang['Correction'] = 'Ispravka';
+$lang['Automatic correction'] = 'Automatsko ispravljanje';
+$lang['Impossible automatic correction'] = 'Automatsko ispravljanje nemoguće';
+$lang['Correction applied with success'] = 'Ispravka uspešno primenjena';
+$lang['Correction applied with error'] = 'Ispravka primenjena s greškom';
+$lang['%d anomaly has been detected.'] = '%d nepravilnost je otkrivena.';
+$lang['%d anomalies have been detected.'] = '%d nepravilnosti su otkrivene.';
+$lang['%d anomaly has been corrected.'] = '%d nepravilnost je ispravljena.';
+$lang['%d anomalies have been detected corrected.'] = '%d nepravilnosti je ispravljeno.';
+$lang['%d anomaly has not been corrected.'] = '%d nepravilnost nije ispravljena.';
+$lang['%d anomalies have not been corrected.'] = '%d nepravilnosti nije ispravljeno.';
+$lang['Go to %s or %s for more informations'] = 'Idite na %s ili %s za više detalja';
+$lang['the forum'] = 'forum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s vrijednost nije valjana datoteka jer exif nije podržan';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s mora biti postavljeno na false u config_local.inc.php file';
+$lang['Main "guest" user does not exist'] = 'Glavni "guest" korisnik ne postoji';
+$lang['Main "guest" user status is incorrect'] = 'Stanje glavnog "guest" korisnika je neispravno';
+$lang['Default user does not exist'] = 'Podrazumevani korisnik ne postoji';
+$lang['Main "webmaster" user does not exist'] = 'Glavni "webmaster" korisnik ne postoji';
+$lang['Main "webmaster" user status is incorrect'] = 'Stanje glavnog "webmaster" korisnika je neispravno';
+$lang['User "%s" created with "%s" like password'] = 'Korisnik "%s" izrađen sa "%s" kao lozinkom';
+$lang['Status of user "%s" updated'] = 'Stanje korisnika "%s" obnovljeno';
+$lang['add new photos to caddie'] = 'dodaj nove elemente u fioku';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = 'Bez prikaza';
+$lang['Classic display'] = 'Klasični prikaz';
+$lang['Hoverbox display'] = 'Prikaz lebdećim prozorom';
+$lang['Mail address is obligatory for all users'] = 'E-mail adresa je obavezna za sve korisnike';
+$lang['Minimum privacy level'] = 'Najniži nivo privatnosti';
+$lang['Privacy level'] = 'Nivo privatnosti';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Poznanici';
+$lang['Level 2'] = 'Prijatelji';
+$lang['Level 4'] = 'Porodica';
+$lang['Level 8'] = 'Administratori';
+$lang['Reinitialize check integrity'] = 'Ponovi proveru celovitosti';
+$lang['Check all'] = 'Označi sve';
+$lang['Uncheck all'] = 'Odznači sve';
+$lang['Check automatic corrections'] = 'Označi automatske ispravke';
+$lang['Apply selected corrections'] = 'Primeni odabrane ispravke';
+$lang['Ignore selected anomalies'] = 'Zanemari odabrane nepravilnosti';
+$lang['Refresh'] = 'Osveži';
+$lang['The anomaly will be ignored until next application version'] = 'Nepravilnost će se zanemariti do sledeće verzije galerije';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Ispravka nepravilnosti će poništiti činjenicu da je zanemarena';
+$lang['%d anomaly has been ignored.'] = '%d nepravilnost je zanemarena.';
+$lang['%d anomalies have been ignored.'] = '%d nepravilnosti su zanemarene.';
+$lang['Plugins which need upgrade'] = 'Dodaci koji trebaju nadogradnju';
+$lang['Plugin list'] = 'Lista dodataka';
+$lang['Check for updates'] = 'Provera nadogradnje';
+$lang['Other plugins'] = 'Ostali dodaci';
+$lang['Last revisions'] = 'Zadnja izdanja';
+$lang['Are you sure you want to delete this plugin?'] = 'Sigurno želite ukloniti ovaj dodatak?';
+$lang['Are you sure you want to install this plugin?'] = 'Sigurno želite instalirati ovaj dodatak?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Sigurno želite instalirati ovaj dodatak? Morate potvrditi da ova prečica ne treba uklanjanje.';
+$lang['Plugin has been successfully copied'] = 'Dodatak je uspješno iskopiran';
+$lang['You might go to plugin list to install and activate it.'] = 'Možete ići na listu datoteka za instalaciju i pokretanje.';
+$lang['Can\'t create temporary file.'] = 'Ne mogu napraviti privremeni datoteku.';
+$lang['Can\'t download archive.'] = 'Ne mogu preuzeti datoteku.';
+$lang['Can\'t read or extract archive.'] = 'Ne mogu očitati ili raspakovati datoteku.';
+$lang['An error occured during extraction (%s).'] = 'Došlo je do greške prilikom raspakovanja (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Proverite "plugins" direktorijum i dozvole poddirektorijuma (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Ne mogu se povezati na server.';
+$lang['Purge compiled templates'] = 'Isprazni obrađene šablone';
+$lang['ACCESS_0'] = 'Slobodan pristup';
+$lang['ACCESS_1'] = 'Pristup svima';
+$lang['ACCESS_2'] = 'Pristup pretplatnicima';
+$lang['ACCESS_3'] = 'Pristup administratorima';
+$lang['ACCESS_4'] = 'Pristup webmaster-ima';
+$lang['ACCESS_5'] = 'Bez pristupa';
+$lang['Support'] = 'Podrška';
+$lang['Documentation'] = 'Dokumentacija';
+$lang['A new version of Piwigo is available.'] = 'Nova Piwigo verzija je dostupna.';
+$lang['Piwigo Administration'] = 'Piwigo administracija';
+$lang['Piwigo version'] = 'Piwigo verzija';
+$lang['You are running the latest version of Piwigo.'] = 'Koristite najnoviju verziju Piwigo-a.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Verzija od %s [%s] postavljene nije odgovarajuća potrebnoj verziji [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'morate nadograditi vaš sistem da biste imali sve pogodnosti u protivnom sistem neće raditi ispravno ili uopšte neće raditi';
+$lang['Deleted on'] = 'Izbrisan na';
+$lang['Last hit'] =  'Zadnja poseta';
+$lang['GD library is missing'] = 'Nedostaje GD biblioteka';
+$lang['Templates'] = 'Šabloni';
+$lang['Extend for templates'] = 'Proširenje za šablone';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'Zamena izvornih šablona prilagođenim iz direktorijuma template-extension';
+$lang['Replacers (customized templates)'] = 'Zamene (prilagođeni šabloni)';
+$lang['Original templates'] = 'Izvorni šabloni';
+$lang['Optional URL keyword'] = 'Izborna URL ključna reč';
+$lang['Templates configuration has been recorded.'] = 'Podešavnje šablona je sačuvano.';
+$lang['All optimizations have been successfully completed.'] = 'Sva poboljšanja su uspešno dovršena.';
+$lang['Optimizations have been completed with some errors.'] = 'Poboljšanja su izvršena uz neke greške.';
+$lang['Modify information'] = 'Promeni podatak';
+$lang['nothing'] = 'ništa';
+$lang['overrides existing values with empty ones'] = 'prekucava postojeće vrednosti praznim poljima';
+$lang['Manage photo ranks'] = 'Upravljanje poretkom';
+$lang['Edit ranks'] = 'Uredi poredak';
+$lang['No photo in this album'] = 'Nema elemenata u ovoj kategoriji';
+$lang['Images manual order was saved'] = 'Sačuvan je podešenii redosled slika';
+$lang['ranks'] = 'poredak';
+$lang['Drag to re-order'] = 'Povuci za preređivanje';
+$lang['Quick Local Synchronization'] = 'Brza Lokalna Sinhronizacija';
+$lang['No photo can be deleted'] = 'Nema slike koja se može brisati';
+$lang['Delete selected photos'] = 'Briši odabrane slike';
+$lang['%d photo was deleted'] = '%d slika je izbrisana';
+$lang['%d photos were deleted'] = '%d slike su izbrisane';
+$lang['Downloads'] = 'Preuzimanja';
+$lang['Released on'] = 'Objavljeno dana';
+$lang['Number of downloads'] = 'Broj preuzimanja';
+// --------- Starting below: New or revised $lang ---- from Colibri
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Announcements e-Novine';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Ostanite u vezi sa projektom, pretplatite se na Piwigo Announcement e-Novine. Dobijaćete e-mail poruke po izlasku novih verzija (ponekad sa sigurnosnim zakrpama, važno je znati da su dostupne i treba ih što pre ugraditi) te o svim važnijim desavanjima i događanjima u vezi sa projektom. Svega par e-mail poruka godišnje.';
+$lang['Subscribe %s'] = 'Pretplatite %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Pretplatite %s na Piwigo English Announcements e-Novine';
+$lang['Purge search history'] = 'Očisti istoriju pretraživanja';
+$lang['Hide'] = 'Sakrij';
+$lang['Operation in progress'] = 'Tretiranje procesa.';
+$lang['Please wait...'] = 'Molim sačekajte...';
+$lang['Password is missing. Please enter the password.'] = 'Lozinka nedostaje. Molim unesite lozinku.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Potvrda lozinke nedostaje. Molim potvrdite izabranu lozinku.';
+$lang['Allow users to edit their own comments'] = 'Dozvoli korisnicima da uređuju svoje komentare';
+$lang['Allow users to delete their own comments'] = 'Dozvoli korisnicima da brišu svoje komentare';
+$lang['Email administrators when a comment is modified'] = 'Pošalji e-mail administratoru kada je komentar izmenjen';
+$lang['Email administrators when a comment is deleted'] = 'Pošalji e-mail administratoru kada je komentar izbrisan';
+$lang['Cannot delete the old permalink !'] = 'Stari link se ne može obrisati!';
+$lang['Hit'] = 'Pogodak';
+$lang['Tools'] = 'Alati';
+$lang['Photos'] = 'Fotografije';
+$lang['Themes'] = 'Teme';
+$lang['Instructions to use Piwigo'] = 'Instrukcije kako da koristite Piwigo';
+$lang['Installed Themes'] = 'Instalirane teme';
+$lang['Add New Theme'] = 'Dodaj novu temu';
+$lang['Forbid this theme to users'] = 'Zabrani ovu temu korisnicima';
+$lang['Set as default theme for unregistered and new users'] = 'Postavi kao podrazumevanu temu za neregistrovane i nove korisnike';
+$lang['unknown'] = 'nepoznato';
+$lang['Upload Photos'] = 'Pošalji fotografije';
+$lang['Drop into album'] = 'Baci u kategoriju';
+$lang['+ Add an upload box'] = '+ Dodaj kutiju za slanje';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Napravi "%s" directorijum u korenu Vaše Piwigo instalacije';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Dozvoli upis (chmod 777) u "%s" direktorijum u korenu Vaše Piwigo instalcije';
+$lang['existing album'] = 'postojeće kategorije';
+$lang['create a new album'] = 'napravi novu kategoriju';
+$lang['Album name'] = 'Naziv kategorije';
+$lang['Album "%s" has been added'] = 'Kategorija "%s" je dodata';
+$lang['Uploaded Photos'] = 'Pošalji fotografije';
+$lang['%d photos uploaded'] = '%d fotografije poslate';
+$lang['Privacy level set to "%s"'] = 'Nivo privatnosti podešen na "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategorija "%s" sada sadrži %d fotografija';
+$lang['Manage this set of %d photos'] = 'Uredi ovaj set %d fotografija';
+$lang['Select files'] = 'Izaberi datoteke';
+$lang['Everybody'] = 'Svi';
+$lang['Who can see these photos?'] = 'Ko može da vidi fotografije?';
+$lang['Settings'] = 'Podešenja';
+$lang['Resize'] = 'Promeni veličinu';
+$lang['Maximum Width'] = 'Maksimalna širina';
+$lang['pixels'] = 'pikseli';
+$lang['Maximum Height'] = 'Maksimalna visina';
+$lang['Image Quality'] = 'Kvalitet slike';
+$lang['Save Settings'] = 'Snimi podešenja';
+$lang['Your configuration settings are saved'] = 'Vaša podešenja su sačuvana';
+$lang['Active Themes'] = 'Aktivne teme';
+$lang['Add write access to the "%s" directory'] = 'Dozvoli upis "%s" direktorijumu';
+$lang['Administration Home'] = 'Početna administracije';
+$lang['Change Admin Colors'] = 'Promeni administratorske boje';
+$lang['Delete this theme'] = 'Obriši ovu temu';
+$lang['Directory does not exist'] = 'Direktorijum ne postoji';
+$lang['Download,'] = 'Snimi na računar,';
+$lang['FTP + Synchronization'] = 'FTP + Sinhronizacija';
+$lang['Get Support on Piwigo Forum'] = 'Podrška on Piwigo forumu';
+$lang['Help Me'] = 'Pomoć';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ova tema se ne može aktivirati, jer tema ne postoji: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ova tema se ne može obrisati, jer druge teme zavise od nje: %s';
+$lang['Inactive Themes'] = 'Neaktivne teme';
+$lang['Install on your computer,'] = 'Instaliraj na tvom računaru,';
+$lang['Make this theme available to users'] = 'Napravi ovu temu dostupnu korisnicima';
+$lang['Page end'] = 'Kraj strane';
+$lang['Piwigo Uploader'] = 'Piwigo pošiljaoc';
+$lang['Read Piwigo Documentation'] = 'Pročitaj Piwigo dokumentaciju';
+$lang['Start pLoader and add your photos.'] = 'Pokreni pLoader i dodaj tvoje slike.';
+$lang['Switch to clear or dark colors for administration'] = 'Promeni na svetle ili tamne boje za administratora';
+$lang['Theme has been successfully installed'] = 'tema je uspešno instalirana';
+$lang['Visit Gallery'] = 'Poseti galeriju';
+$lang['Visit Piwigo project website'] = 'Poseti stranicu Piwigo projekta';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader označava <em>Piwigo Uploader</em>. Sa Vašeg racunara, pLoader priprema Vaše fotografije i šalje ih u  Piwigo foto galeriju.';
+$lang['Guest Settings'] = 'Podešenja za goste';
+$lang['Main Page'] = 'Glavna strana';
+$lang['Photo Page'] = 'Foto strana';
+$lang['Activate Navigation Bar'] = 'Aktiviraj liniju za navigaciju';
+$lang['Activate Navigation Thumbnails'] = 'Aktiviraj povezne sličice za navigaciju';
+$lang['Activate icon "%s"'] = 'Aktiviiraj ikonu "%s"';
+$lang['Photo Properties'] = 'Osobine slike';
+$lang['Allow user customization'] = 'Dozvoli podešavanja korisniku';
+$lang['Languages'] = 'Jezici';
+$lang['Installed Languages'] = 'Instalirani jezici';
+$lang['Add New Language'] = 'Dodaj novi jezik';
+$lang['Language has been successfully installed'] = 'Jezik je uspešno instaliran';
+$lang['Select:'] = 'Odaberi:';
+$lang['None'] = 'Ništa';
+$lang['Invert'] = 'Suprotno';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Nemoguće deaktivirati ovu temu, treba Vam bar jedna tema.';
+$lang['Webmaster status is required.'] = 'Webmaster status je potreban.';
+$lang['Bound Theme'] = 'Povezana tema';
+$lang['Allow rating'] = 'Dozvoli rangiranje';
+$lang['Select at least one comment'] = 'Odaberi najmanje jedan komentar';
+$lang['Active Plugins'] = 'Aktivni dodaci';
+$lang['Inactive Plugins'] = 'Neaktivni dodaci';
+$lang['Missing Plugins'] = 'Nedostajući dodaci';
+$lang['Uninstalled Plugins'] = 'Deinstalirani dodaci';
+$lang['By %s'] = 'Od %s';
+$lang['Visit plugin site'] = 'Poseti stranicu sa dodacima';
+$lang['Active Languages'] = 'Aktivni jezici';
+$lang['Delete this language'] = 'Obriši ovaj jezik';
+$lang['Forbid this language to users'] = 'Zabrani ovaj jezik za korisnike';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Nemoguće deaktivirati ovaj jezik, prvo odaberite drugi jezik kao podrazumevani.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Nemoguće deaktivirati ovaj jezik, treba Vam najmanje jedan jezik.';
+$lang['Inactive Languages'] = 'Neaktivni jezici';
+$lang['Make this language available to users'] = 'Omogući ovaj jezik korisnicima';
+$lang['Set as default language for unregistered and new users'] = 'Postavi kao podrazumevani jezik za neregistrovane i nove korisnike';
+$lang['Add Photos'] = 'Dodaj fotografije';
+$lang['The following tag was deleted'] = 'Tekuća oznaka je obrisana';
+$lang['Miscellaneous'] = 'Ostalo';
+$lang['Virtual Links'] = 'Virtualne veze';
+$lang['There is no other language available.'] = 'Drugi jezik nije dostupan.';
+$lang['There is no other plugin available.'] = 'Drugi dodatak nije dostupan.';
+$lang['There is no other theme available.'] = 'Druga tema nije dostupna.';
+$lang['By rank'] = 'Po rangu';
+$lang['Manual order'] = 'Ručno poređano';
+$lang['Add another set of photos'] = 'Dodaj drugi set fotografija';
+ $lang['Order of menubar items has been updated successfully.'] = ' Poredak elemenata u izborniku je uspešno ažuriran.';
+$lang['Menu Management'] = 'Izbornik';
+$lang['%d of %d photos selected'] = '%d od %d fotografija odabrano';
+$lang['%s has been successfully updated.'] = '%s je uspešno ažiran';
+$lang['(this tag will be deleted)'] = '(ova oznaka će biti obrisana)';
+$lang['... or '] = '... ili';
+$lang['Action'] = 'Akcija';
+$lang['Activate comments'] = 'Aktivira komentare';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivira ikonicu "novo" pored albuma i slika';
+$lang['Add a criteria'] = 'Dodaj kriterijum';
+$lang['Add a filter'] = 'Dodaj filter';
+$lang['Add tags'] = 'Dodaj oznake';
+$lang['Add to caddie'] = 'Dodaj u fioku';
+$lang['Album photos associated to the following albums: %s'] = 'Fotografije albuma povezane sa sledećim albumima: %s';
+$lang['Albums automatically sorted'] = 'Albumi automatski poređani';
+$lang['All %d photos are selected'] = 'Svih %d fotografija je odabrano';
+$lang['All extensions are up to date.'] = 'Sve ekstenzije su ažurne.';
+$lang['All languages are up to date.'] = 'Svi jezici su ažurni.';
+$lang['All plugins are up to date.'] = 'Svi plaginovi su ažurni.';
+$lang['All themes are up to date.'] = 'Sve teme su ažurne.';
+$lang['Allowed file types: %s.'] = 'Dozvoljeni tipovi fajlova: %s';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Dogodila se greška u toku raspakivanja. Molimo proverite dozvole na fajlovima Vaše piwigo instalacije.
+<br><a href="%s">Kliknite ovde da biste videli zapis greške</a>.';
+$lang['An error has occured during upgrade.'] = 'Dogodila se greška u toku nadgradnje.';
+$lang['Apply action'] = 'Primeni akciju';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Približna maksimalna rezolucija: %dM piksela (odnosno %dx%d piksela)';
+$lang['automatic order'] = 'automatski poredak';
+$lang['Average rate'] = 'Prosečna ocena';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Podrazumevano, Piwigo će kreirati novu veličinu prilagođenu web-u od HD verzije (visoke definicije) Vaše fotografije';
+$lang['Choose an action'] = 'Izaberi akciju';
+$lang['Confirm merge'] = 'Potvrdi pripajanje';
+$lang['Create'] = 'Kreiraj';
+$lang['Crop'] = 'Iseci';
+$lang['Deactivate all'] = 'Isključi sve';
+$lang['Default comments order'] = 'Podrazumevani poredak komentara';
+$lang['Default photos order'] = 'Podrazumevani poredak fotografija';
+$lang['Delete orphan tags'] = 'Obriši napuštene oznake';
+$lang['delete photo'] = 'obriši fotografiju';
+$lang['display'] = 'prikaži';
+$lang['Do you want to activate anyway?'] = 'Da li želite ipak da uključite?';
+$lang['Dump Database'] = 'Obriši bazu podataka';
+$lang['Duplicates'] = 'Duplikati';
+$lang['Error on file "%s" : %s'] = 'Greška u fajlu "%s": %s';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'GREŠKA: OVAJ PLAGIN NEDOSTAJE IAKO JE INSTALIRAN! DEINSTALIRAJTE GA ODMAH.';
+$lang['ERROR'] = 'GREŠKA';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif ekstenzija nije dostupna, admin bi trebalo da onemogući njeno korišćenje';
+$lang['Extensions Update'] = 'Ažuriranja ekstenzija';
+$lang['Failed to write file to disk'] = 'Nije uspelo pisanje fajla na disk';
+$lang['File upload stopped by extension'] = 'Otpremanje fajla je zaustavila ekstenzija';
+$lang['Follow Orientation'] = 'Prati orjentaciju';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Sledeći plaginovi mogu biti nekompatibilni sa novom verzijom Piwigo-a:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Sledeće teme mogu biti nekompatibilne sa novom verzijom Piwigo-a:';
+$lang['Graphics Library'] = 'Biblioteka grafika';
+$lang['Height'] = 'Visina';
+$lang['hide details'] = 'sakrij detalje';
+$lang['I decide to update anyway'] = 'Odlučio sam da ipak ažuriram';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Ako je HD nedostupna i ako je trenutna web-veličina veća od promenjene veličine, Piwigo će ukloniti HD i kreirati smanjenu web-veličinu fotografije.';
+$lang['Ignore All'] = 'Ignoriši sve';
+$lang['Ignore this update'] = 'Ignoriši ovo ažuriranje';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'U Vašem php.ini fajlu upload_max_filesize(%sB) je veći od post_max_size(%sB), trebalo bi da promenite ovo podešavanje';
+$lang['include child albums'] = 'uključi podređene albume';
+$lang['Languages which need upgrade'] = 'Jezici kojima treba ažuriranje';
+$lang['Last import'] = 'Poslednji uvoz';
+$lang['%s photos can not be regenerated'] = '%s fotografija ne može biti regenerisano';
+$lang['%s photos have been regenerated'] = '%s fotografija je regenerisano';
+$lang['A locked gallery is only visible to administrators'] = 'Zaključana galerija je vidljiva samo administratorima';
+$lang['administrators'] = 'administratori';
+$lang['Applications'] = 'Aplikacije';
+$lang['apply automatic sort order'] = 'primeni automatski poredak';
+$lang['Automatic sort order'] = 'Automatski poredak';
+$lang['Batch Manager'] = 'Menadžer automatizma';
+$lang['cancel manual order'] = 'poništi ručni poredak';
+$lang['Cancel'] = 'Odustani';
+$lang['Center of interest'] = 'Interesno središte';
+$lang['Delete Representant'] = 'Obriši ikonice albuma';
+$lang['Gallery unlocked'] = 'Galerija otključana';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Uključi istoriju podataka (Upozorenje: može se premašiti limit memorije na serveru)';
+$lang['Learn more'] = 'Nauči više';
+$lang['List'] = 'Lista';
+$lang['Manage Permissions'] = 'Uredi dozvole';
+$lang['manual order'] = 'ručni poredak';
+$lang['Maximum file size: %sB.'] = 'Maksimalna veličina fajla: %sB.';
+$lang['Merge selected tags'] = 'Spoj odabrane oznake';
+$lang['Merge tags'] = 'Spoj oznake';
+$lang['Missing a temporary folder'] = 'Nedostaje privremeni direktorijum';
+$lang['modified'] = 'izmenjen';
+$lang['Move to album'] = 'Premesti u album';
+$lang['New Version'] = 'Nova verzija';
+$lang['new'] = 'novo';
+$lang['No destination tag selected'] = 'Nije odabrana odredišna oznaka';
+$lang['No file was uploaded'] = 'Nije poslat ni jedan fajl';
+$lang['No photo in the current set.'] = 'Nema fotografija u trenutnom skupu';
+$lang['No photo selected, %d photos in current set'] = 'Nema odabranih fotografija, %d fotografija u trenutnom skupu';
+$lang['No photo selected, no action possible.'] = 'Nema odabranih fotografija, nema dozvoljenih akcija';
+$lang['No results'] = 'Nema rezultata';
+$lang['Not cropped correctly?'] = 'Pogrešno isečeno?';
+$lang['Notify administrators when a comment is'] = 'Obavesti administratore kada je komentar';
+$lang['Obsolete Plugins'] = 'Zastareli plagin';
+$lang['on the %d selected photos'] = 'od %d odabranih fotografija';
+$lang['Original Size'] = 'Originalna veličina';
+$lang['Orphan tags deleted'] = 'Napuštena oznaka obrisana';
+$lang['Pending Comments'] = 'Komentari na čekanju';
+$lang['pending validation'] = 'čeka validaciju';
+$lang['Photo %s of %s'] = 'Fotografija %s od %s';
+$lang['Photo name'] = 'Naziv fotografije';
+$lang['Photos generation in progress...'] = 'Generisanje fotografija...';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ne može preuzeti nadogradnju sa servera';
+$lang['Piwigo Update'] = 'Piwigo nadogradnja';
+$lang['Predefined filter'] = 'Predefinisani filter';
+$lang['Rate'] = 'Ocena';
+$lang['Refresh photo set'] = 'Osveži skup fotografija';
+$lang['registered users'] = 'registrovani korisnici';
+$lang['Remove all filters'] = 'Ukloni sve filtere';
+$lang['remove author'] = 'ukloni autora';
+$lang['remove creation date'] = 'ukloni datum kreiranja';
+$lang['Remove from caddie'] = 'Ukloni iz fioke';
+$lang['remove this filter'] = 'ukloni ovaj filter';
+$lang['remove title'] = 'ukloni naslov';
+$lang['Reset ignored updates'] = 'Resetuj ignorisane nadogradnje';
+$lang['Resize after upload'] = 'Promeni veličinu posle slanja';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Vrati podrazumevana podešavanja. Izgubićete podešavanja plaginova!';
+$lang['Restore'] = 'Vrati';
+$lang['Save manual order'] = 'Sačuvaj ručni poredak';
+$lang['Save Template Directory'] = 'Sačuvaj privremeni direktorijum';
+$lang['Save visits in history for'] = 'Sačuvaj posete u istoriji za ';
+$lang['Searching...'] = 'Traženje...';
+$lang['Select an album'] = 'Izaberite album';
+$lang['Select at least two tags for merging'] = 'Odaberite najmanje dve oznake za spajanje';
+$lang['Select the destination tag'] = 'Odaberite odredišnu oznaku';
+$lang['Selection'] = 'Odabir';
+$lang['Send connection settings by email'] = 'Pošalji podešavanja veze mejlom';
+$lang['Set author'] = 'Postavi autora';
+$lang['Set creation date'] = 'Postavi datum kreiranja';
+$lang['Set title'] = 'Postavi naslov';
+$lang['show details'] = 'prikaži detalje';
+$lang['Show menubar'] = 'Prikaži meni bar';
+$lang['simple visitors'] = 'obični posetioci';
+$lang['Some themes and plugins may be not available yet.'] = 'Neke teme i plaginovi neće biti dostupni odmah.';
+$lang['Some upgrades are available for extensions.'] = 'Neke nadogradnje su dostupne za proširenja.';
+$lang['Start Upload'] = 'Počni slanje';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Oznake  <em>%s</em> spojene u oznaku <em>%s</em>';
+$lang['The original image quality must be a number between %d and %d'] = 'Kvalitet originalne slike mora biti broj između %d i %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Visina originalne slike mora biti broj između %d i %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Širina originalne slike mora biti broj između %d i %d';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Poslati fajl prelazi MAX_FILE_SIZE direktivu koja je specificirana u HTML formi';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Poslati fajl prelazi upload_max_filesize direktivu u php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Poslati fajl je nije kompletan';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Poslati fajlovi prelaze post_max_size direktivu u php.ini: %sB';
+$lang['The whole page'] = 'Kompletna strana';
+$lang['The whole set'] = 'Kompletan skup';
+$lang['Themes which need upgrade'] = 'Theme koje je potrebno nadograditi';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Ovaj album sadrži %d fotografija, dadatih od %s do %s.';
+$lang['This album contains %d photos, added on %s.'] = 'Ovaj album sadrži %d fotografija, dodatih %s.';
+$lang['This album contains no photo.'] = 'Ovaj album ne sadrži fotografije.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Ovo je bitna nadogradnja, sa <a href="%s"> novim mogućnostima</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Ovo je manja nadogradnja, sa ispravkama bagova.';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'OVAJ PLAGIN JE SADA DEO PIWIGO JEZGRA! OBRIŠITE GA SADA!';
+$lang['This theme was not designed to be directly activated'] = 'Ova tema nije dizajnirana da bude direktno aktivirana';
+$lang['Thumbnails generation in progress...'] = 'Generisanje sličica...';
+$lang['Two updates are available'] = 'Dve nadogradnje su dostupne';
+$lang['Type here the author name'] = 'Unesite ime autora';
+$lang['Type here the title'] = 'Unesite naslov';
+$lang['Type in a search term'] = 'Unesite pojam za pretragu';
+$lang['Unable to dump database.'] = 'Neuspelo brisanje baze.';
+$lang['Unknown upload error'] = 'Nepoznata greška slanja';
+$lang['Unlock gallery'] = 'Otključaj galeriju';
+$lang['Update All'] = 'Nadogradi sve';
+$lang['Update Complete'] = 'Nadogradnja završena';
+$lang['Update in progress... Please wait.'] = 'Nadogradnja... Molimo sačekajte.';
+$lang['Update to Piwigo %s'] = 'Nadogradnja Piwiga %s';
+$lang['Updates'] = 'Nadogradnje';
+$lang['Visit language site'] = 'Poseti sajt jezika';
+$lang['Visit theme site'] = 'Poseti sajt tema';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'UPOZORENJE! Ovaj plagin nije kompatibilan sa trenutnom verzijom Piwiga';
+$lang['Web Form'] = 'Web forma';
+$lang['Week starts on'] = 'Dan kada počinje sedmica:';
+$lang['Who can see this photo?'] = 'Ko može videti fotografiju?';
+$lang['Width'] = 'Širina';
+$lang['With no album'] = 'Bez albuma';
+$lang['With no tag'] = 'Bez oznake';
+$lang['With no virtual album'] = 'Bez virtuelnog albuma';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Koristite slanje iz brauzera. Probajte <a href="%s">slanje iz Flash-a</a>.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Koristite slanje iz Flash-a. Imate problem? Probajte <a href="%s">slanje iz brauzera</a>.';
+$lang['You can activate only one mobile theme.'] = 'Možete aktivirati samo jednu pokretnu temu.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Možete nadograditi Piwigo %s direktno, bez nadogradnji na Piwigo %s (preporučeno).';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Ne možete postaviti podrazumevani poredak fotografija jer je drugačije podešeno u vašem lokalnom podešavanju.';
+$lang['You have %d orphan tags: %s.'] = 'Imate %d napuštenih oznaka: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Označili ste  <i>$conf[\'order_by\']</i> u svom lokalnom podešavanju, ovaj parametar je zastareo, molimo uklonite ga ili ga preimenujte u <i>$conf[\'order_by_custom\']</i>!';
+$lang['Zoom'] = 'Uvećaj';
+$lang['Delete selected tags'] = 'Obriši odabrane oznake';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo for Android</em> aplikacija omogućava Vam da se povežete sa Vašom Piwigo galerijom preko Adroid telefona ili tablet računara, možete da kreirate albume i pošaljete nekoliko slika odjednom.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo za iOS</em> aplikacija omogućava Vam da se povežete sa Vašom Piwigo galerijom preko iPhone, iPad ili iPod Touch uređaja, možete da kreirate albume i pošaljete nekoliko slika odjednom.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom je softver za fotografije dizajniran da upravlja velikom količinom digitalnih slika i za postprodukciju.';
+$lang['Available on'] = 'Dostupno na';
+$lang['Available versions for'] = 'Dostupna verzija za';
+$lang['Delete selected users'] = 'Obriši odabrane korisnike';
+$lang['Piwigo for Android'] = 'Piwigo za Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo za iOs (iPhone, iPad, iPod Touch)';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish plagin za Ligtroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publish plagin za Shotwell';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo Publish plagin omogućava Vam da izvezete i sinhronizujete fotografije iz Lightroom-a direktno u Vašu Piwigo foto-galeriju.';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u korisnici imaju dozvole jer pripadaju grupi kojoj je data dozvola.';
+$lang['any visitor can see this album'] = 'bilo koji posetilac može videti ovaj album';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture je moćan alat za poboljšanje slika i upravljanje velikim bibliotekama na Mac-u.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture je dizajniran za profesionalne fotografe sa iPhoto jednostavnošću.';
+$lang['Delete multiple size images'] = 'Obriši višestruke veličine slika';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam je besplatni, napredni menadžer digitalnih fotografija za Linux, Windows i MacOSX';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam je dizajniran za fotografe koji žele da pregledaju, upravljaju, urede, poboljšaju, organizuju, označe i dele fotografije.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Karakteristike uključuju pregled galerije, kreiranje albuma i slanje fotografija.';
+$lang['Generate multiple size images'] = 'Generiši višestruke veličine slika';
+$lang['Groups and users'] = 'Grupe i korisnici';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto je podrazumevani menadžer fotografijama na MacOSX. Piwigo izvozni dodatak omogućava Vam da kreirate novi album i da izvezete Vaše fotografije direktno iz iPhoto u Vašu Piwigo foto-galeriju.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Na Linux-u, jednostavno instalirajte Shotwell preko Vašeg menadžera paketa i onda aktivirajte Piwigo opciju objavljivanja.';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Trajni-link %s je prethodno korišćen od strane albuma %s. Obrišite ga prvo iz istorije trajnih linkova';
+$lang['Permission granted for groups'] = 'Dozvola pridodata grupama';
+$lang['Permission granted for users'] = 'Dozvola data korisnicima';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo izvozni dodatak za Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo izvozni dodatak za iPhoto';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo dodatak za objavljivanje za digiKam';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery klient za Android) je Piwigo klient otvorenog koda (GPL v3) za Adroid platformu.';
+$lang['Select groups...'] = 'Odaberi grupe...';
+$lang['Select users...'] = 'Odaberi korisnike...';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell je organizator digitalnih fotografija otvorenog koda za Linux. To je podrazumevani menadžer fotografija u Ubuntu-u i Fedori.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo izvozni dodatak omogućava Vam da kreirate albume i da izvezete fotografije.';
+$lang['There is no group in this gallery.'] = 'Ne postoje grupe u ovoj galeriji';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Da biste izvezli fotografije iz digiKam-a u Piwigo, samo instalirajte digiKam i the Kipi dodatke';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'posetioci moraju biti prijavljeni i imati odgovarajuće dozvole da bi videli ovaj album';
+$lang['custom'] = 'Po izboru';
+$lang['include photos with lower privacy level'] = 'Uključi fotografije sa nižim nivoom privatnosti';
+$lang['No group is permitted to see this private album'] = 'Ni jednoj grupi nije dozvoljeno da vidi ovaj privatni album';
+$lang['Permission management'] = 'Upravljanje dozvolama';
+$lang['Apply watermark if height is bigger than'] = 'Primeni vodeni žig ako je visina veća od';
+$lang['Apply watermark if width is bigger than'] = 'Primeni vodeni žig ako je širina veća od ';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Podrazumevano, interesni centar je postavljen na sredinu fotografije.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Za veličine fotografija sa odsecanjem, kao što je "kvadrat", Piwigo će uraditi najbolje što je moguće da uključi interesni centar.';
+$lang['Opacity'] = 'Neprovidnost';
+$lang['Photo sizes with crop'] = 'Veličina fotografija sa odsecanjem';
+$lang['Select a file'] = 'Odaberite fajl';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Odaberite mišem zonu da bi ste definisali novi interesni centar.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Interesni centar je najbitnija zona fotografije.';
+$lang['X Position'] = 'X pozicija';
+$lang['X Repeat'] = 'X ponavljanja';
+$lang['Y Position'] = 'Y pozicija';
+$lang['add a new watermark'] = 'dodajte novi vodeni žig';
+$lang['bottom left corner'] = 'donji levi ugao';
+$lang['bottom right corner'] = 'donji desni ugao';
+$lang['middle'] = 'sredina';
+$lang['top left corner'] = 'gornji lefi ugao';
+$lang['top right corner'] = 'gornji desni ugao';
+?>
Index: tags/2.4.0RC3/language/sh_RS/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Srpski [SR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=435
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Srpski';
+$lang_info['country'] = 'Srbija';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'sh';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d kategorija obnovljena';
+$lang['%d albums updated'] = '%d kategorije obnovljene';
+$lang['%d comment to validate'] = '%d komentar za overu';
+$lang['%d comments to validate'] = '%d komentari za overu';
+$lang['%d new comment'] = '%d novi komentar';
+$lang['%d new comments'] = '%d novi komentari';
+$lang['%d comment'] = '%d komentar';
+$lang['%d comments'] = '%d komentari';
+$lang['%d hit'] = '%d poseta';
+$lang['%d hits'] = '%d poseta';
+$lang['%d new photo'] = '%d nova slika';
+$lang['%d new photos'] = '%d nove slike';
+$lang['%d new user'] = '%d novi korisnik';
+$lang['%d new users'] = '%d novi korisnici';
+$lang['About'] = 'O...';
+$lang['All tags'] = 'Svi tagovi';
+$lang['Any tag'] = 'Bilo koji tag';
+$lang['At least one listed rule must be satisfied.'] = 'Najmanje jedno od navedenih pravila mora biti zadovoljeno.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Kategorije';
+$lang['Album'] = 'Kategorija';
+$lang['Close this window'] = 'Zatvori prozor';
+$lang['Complete RSS feed (photos, comments)'] = 'Potpuni RSS izvori (slike, komentari)';
+$lang['Confirm Password'] = 'Potvrdi Lozinku';
+$lang['Connection settings'] = 'Podešavanja povezivanja';
+$lang['Login'] = 'Prijava';
+$lang['Contact webmaster'] = 'Pišite webmaster-u';
+$lang['Create a new account'] = 'Napravi novi nalog';
+$lang['Created on'] = 'Napravljen na';
+$lang['Creation date'] = 'Datum izrade';
+$lang['Current password is wrong'] = 'Trenutna lozinka je neispravna';
+$lang['Dimensions'] = 'Veličine';
+$lang['Display'] = 'Prikaz';
+$lang['Each listed rule must be satisfied.'] = 'Svako navedeno pravilo mora biti zadovoljeno.';
+$lang['Email address is missing. Please specify an email address.'] = 'Nedostaje E-mail adresa';
+$lang['Email address'] = 'E-mail adresa';
+$lang['Enter your personnal informations'] = 'Upišite svoje lične podatke';
+$lang['Error sending email'] = 'Greška prilikom slanja e-mail poruke';
+$lang['File name'] = 'Naziv datoteke';
+$lang['File'] = 'Datoteka';
+$lang['Filesize'] = 'Veličina datoteke';
+$lang['Filter and display'] = 'Filter i prikaz';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Zaboravili ste lozinku?';
+$lang['Go through the gallery as a visitor'] = 'Pregledajte galeriju kao posetioc';
+$lang['Help'] = 'Pomoć';
+$lang['Identification'] = 'Prijava';
+$lang['Photos only RSS feed'] = 'RSS izvor samo za slike';
+$lang['Keyword'] = 'Ključna riječ';
+$lang['Links'] = 'Linkovi';
+$lang['N/A'] = 'N/D';
+$lang['New on %s'] = 'Novi na on %s';
+$lang['Notification'] = 'Obaveštenje';
+$lang['Number of items'] = 'Broj stavki';
+$lang['Original dimensions'] = 'Izvorne veličine';
+$lang['Password forgotten'] = 'Zaboravljena lozinka';
+$lang['Password'] = 'Lozinka';
+$lang['Post date'] = 'Datum objave';
+$lang['Posted on'] = 'Objavljeno u';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Brza veza';
+$lang['RSS feed'] = 'RSS izvor';
+$lang['Register'] = 'Upišite se';
+$lang['Registration'] = 'Registracija';
+$lang['Related tags'] = 'Povezani tagovi';
+$lang['Reset'] = 'Poništi';
+$lang['Retrieve password'] = 'Vrati lozinku';
+$lang['Search rules'] = 'Pravila pretrage';
+$lang['Search tags'] = 'Tagovi pretrage';
+$lang['Search'] = 'Pretraživanje';
+$lang['display available tags'] = 'Pogledaj dostupne tagove';
+$lang['Since'] = 'Od';
+$lang['Sort by'] = 'Složeno po';
+$lang['Sort order'] = 'Redosled slaganja';
+$lang['Tag'] = 'Oznaka';
+$lang['Tags'] = 'Tagovi';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS obavijesni izvor omogućava obaveštavanje o novostima sa ovog web mesta : nove slike, obnovljene kategorije, nove komentare. Koristite čitač RSS izvora.';
+$lang['Unknown feed identifier'] = 'Nepoznata oznaka izvora';
+$lang['User comments'] = 'Korisnički komentari';
+$lang['Username'] = 'Korisničko ime';
+$lang['Visits'] = 'Poseta';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Nedelja %d';
+$lang['About Piwigo'] = 'O Piwigo-u';
+$lang['You are not authorized to access the requested page'] = 'Niste ovlašteni za pristup zatraženoj stranici';
+$lang['add this photo to your favorites'] = 'dodaj ovu sliku u omiljene';
+$lang['Administration'] = 'Administracija';
+$lang['all'] = 'sve';
+$lang['ascending'] = 'uzlazno';
+$lang['author(s) : %s'] = 'autor(i) : %s';
+$lang['Expand all albums'] = 'Proširi sve kategorije';
+$lang['posted after %s (%s)'] = 'objavljeno posle %s (%s)';
+$lang['posted before %s (%s)'] = 'objavljeno pre %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'objavljeno između %s (%s) i %s (%s)';
+$lang['posted on %s'] = 'objavljeno na %s';
+$lang['Best rated'] = 'Najbolje ocenjeno';
+$lang['display best rated photos'] = 'prikaz najbolje ocenjenih stavki';
+$lang['Calendar'] = 'Kalendar';
+$lang['All'] = 'Sve';
+$lang['display each day with photos, month per month'] = 'prikaz svakog dana sa slikama, mesec po mesec';
+$lang['View'] = 'Pogledaj';
+$lang['chronology_monthly_calendar'] = 'Mesečni kalendar';
+$lang['chronology_monthly_list'] = 'Mesečni popis';
+$lang['chronology_weekly_list'] = 'Nedeljni popis';
+$lang['Click here if your browser does not automatically forward you'] = 'Kliknite ovde ako niste automatski prebačeni';
+$lang['comment date'] = 'datum komentara';
+$lang['Comment'] = 'Komentar';
+$lang['Your comment has been registered'] = 'Vaš je komentar upisan';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistem : molimo sačekajte malo pre objave novog komentara';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Vaš komentar NIJE upisan jer nije prošao pravila overe';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administrator mora odobriti vaš komentar pre objave.';
+$lang['This login is already used by another user'] = 'Ovo korisničko ime se već koristi';
+$lang['Comments'] = 'Komentari';
+$lang['Add a comment'] = 'Dodaj komentar';
+$lang['created after %s (%s)'] = 'napravljen nakon %s (%s)';
+$lang['created before %s (%s)'] = 'napravljen prije %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'napravljen između %s (%s) i %s (%s)';
+$lang['created on %s'] = 'napravljen na %s';
+$lang['Customize'] = 'Podesi';
+$lang['Your Gallery Customization'] = 'Podešavanje Vaše Galerije ';
+$lang['day'][0] = 'Nedelja';
+$lang['day'][1] = 'Ponedjeljak';
+$lang['day'][2] = 'Utorak';
+$lang['day'][3] = 'Sreda';
+$lang['day'][4] = 'Četvrtak';
+$lang['day'][5] = 'Petak';
+$lang['day'][6] = 'Subota';
+$lang['Default'] = 'Podrazumevano';
+$lang['delete this photo from your favorites'] = 'uklonite ovu sliku iz omiljenih';
+$lang['Delete'] = 'Ukloni';
+$lang['descending'] = 'silazno';
+$lang['Download'] = 'Preuzmi';
+$lang['Download this file'] = 'preuzmi ovu sliku';
+$lang['edit'] = 'uredi';
+$lang['wrong date'] = 'pogrešan datum';
+$lang['excluded'] = 'isključeno';
+$lang['Your favorites'] = 'Moji omiljeni';
+$lang['display your favorites photos'] = 'prikaz mojih omiljenih slika';
+$lang['Favorites'] = 'Omiljeni';
+$lang['First'] = 'Prvi';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galerija je zaključana zbog održavanja. Molimo, navratite kasnije.';
+$lang['Page generated in'] = 'Stranica izrađena u ';
+$lang['guest'] = 'gost';
+$lang['Hello'] = 'Pozdrav';
+$lang['available for administrators only'] = 'dostupno samo administratorima';
+$lang['display this album'] = 'prikazuje slike u glavnoj kategoriji';
+$lang['display last user comments'] = 'Pregled zadnjih korisničkih komentara';
+$lang['customize the appareance of the gallery'] = 'podesite izgled vaše galerije';
+$lang['search'] = 'pretraži';
+$lang['Home'] = 'Početna';
+$lang['in this album'] = 'u ovoj kategoriji';
+$lang['in %d sub-album'] = 'u %d podkategoriji';
+$lang['in %d sub-albums'] = 'u %d podkategorijama';
+$lang['included'] = 'uključeno';
+$lang['Invalid password!'] = 'Pogrešna lozinka!';
+$lang['Language']='Jezik';
+$lang['last %d days'] = 'zadnjih %d dana';
+$lang['Last'] = 'Zadnji';
+$lang['Logout'] = 'Odjava';
+$lang['obligatory'] = 'obvezno';
+$lang['Maximum photo height'] = 'Najveća dozvoljena visina slika';
+$lang['Maximum height must be a number superior to 50'] = 'Najveća visina mora biti broj veći od 50';
+$lang['Maximum photo width'] = 'Najveća dozvoljena širina slika';
+$lang['Maximum width must be a number superior to 50'] = 'Najveća širina mora biti broj veći od 50';
+$lang['display a calendar by creation date'] = 'prikaz kalendara po datumu izrade';
+$lang['display all photos in all sub-albums'] = 'prikaz svih stavki u svim podkategorijama';
+$lang['return to normal view mode'] = 'povratak u uobičajeni način pregleda';
+$lang['display a calendar by posted date'] = 'prikaz kalendara po datumu objave';
+$lang['month'][10] = 'Oktobar';
+$lang['month'][11] = 'Novembar';
+$lang['month'][12] = 'Decembar';
+$lang['month'][1] = 'Januar';
+$lang['month'][2] = 'Februar';
+$lang['month'][3] = 'Mart';
+$lang['month'][4] = 'April';
+$lang['month'][5] = 'Maj';
+$lang['month'][6] = 'Jun';
+$lang['month'][7] = 'Jul';
+$lang['month'][8] = 'Avgust';
+$lang['month'][9] = 'Septembar';
+$lang['Most visited'] = 'Najposjećenije';
+$lang['display most visited photos'] = 'prikaz najposjećenijih slika';
+$lang['The number of photos per page must be a not null scalar'] = 'broj slika po stranici mora biti celobrojna vrednost';
+$lang['Number of photos per page'] = 'Broj slika po stranici';
+$lang['Unknown identifier'] = 'Nepoznata oznaka';
+$lang['New password'] = 'Nova lozinka';
+$lang['Rate this photo'] = 'Oceni ovu sliku';
+$lang['Next'] = 'Sledeći';
+$lang['no rate'] = 'bez ocene';
+$lang['Photos posted within the last %d day.'] = 'Stavke objavljene u zadnjem %d danu.';
+$lang['Photos posted within the last %d days.'] = 'Stavke objavljene u zadnjih %d dana.';
+$lang['password updated'] = 'lozinka obnovljena';
+$lang['Recent period must be a positive integer value'] = 'Razdoblje mora biti pozitivna celobrojna vrednost';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'slika';
+$lang['Click on the photo to see it in high definition'] = 'Klikni na sliku za pregled u visokoj rezoluciji';
+$lang['Show file metadata'] = 'Prikaži meta podatke zapisa';
+$lang['Powered by'] = 'Urađeno u';
+$lang['Preferences'] = 'Podešenja';
+$lang['Previous'] = 'Prethodni';
+$lang['Random photos'] = 'Slike po slučajnom izboru';
+$lang['display a set of random photos'] = 'prikaz slika po slučajnom izboru';
+$lang['Recent albums'] = 'Nedavne kategorije';
+$lang['display recently updated albums'] = 'prikaz nedavno obnovljenih kategorija';
+$lang['Recent period'] = 'Nedavno razdoblje';
+$lang['Recent photos'] = 'Nedavne slike';
+$lang['display most recent photos'] = 'prikaz najnovijih slika';
+$lang['Redirection...'] = 'Preusmeravanje...';
+$lang['Please, enter a login'] = 'Molimo, prijavite se';
+$lang['login mustn\'t end with a space character'] = 'prijava ne sme završavati razmakom';
+$lang['login mustn\'t start with a space character'] = 'prijava ne sme počinjati razmakom';
+$lang['this login is already used'] = 'ovo korisničko ime se već koristi';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail adresa mora biti oblika xxx@yyy.eee (npr : korisnik@stranica.org)';
+$lang['please enter your password again'] = 'molimo unesite lozinku ponovo';
+$lang['Auto login'] = 'Upamti me';
+$lang['remove this tag from the list'] = 'ukloni  ovaj tag iz popisa';
+$lang['representative'] = 'predstavnik';
+$lang['Search for Author'] = 'Pretraživanje po Autoru';
+$lang['Search in albums'] = 'Pretraživanje u Kategorijama';
+$lang['Search by date'] = 'Pretraživanje po Datumu';
+$lang['Date'] = 'Datum';
+$lang['End-Date'] = 'Krajnji Datum';
+$lang['Kind of date'] = 'Vrsta datuma';
+$lang['Search for words'] = 'Pretraživanje po rečima';
+$lang['Search for all terms'] = 'Pretraživanje po svim kriterijumima ';
+$lang['Search for any term'] = 'Pretraživanje po bilo kojem kriterijumu';
+$lang['Empty query. No criteria has been entered.'] = 'Prazna pretraga. Nije unešeno ni jedno polje.';
+$lang['Search results'] = 'Rezultati pretraživanja';
+$lang['Search in sub-albums'] = 'Pretraživanje u podkategorijama';
+$lang['searched words : %s'] = 'tražene reči : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'postavi za predstavnika kategorije';
+$lang['Show number of comments'] = 'Prikaži broj komentara';
+$lang['Show number of hits'] = 'Prikaži broj poseta';
+$lang['slideshow'] = 'klizni prikaz';
+$lang['stop the slideshow'] = 'zaustavi klizni prikaz';
+$lang['Specials'] = 'Posebne kategorije';
+$lang['SQL queries in'] = 'SQL upit u ';
+$lang['display only recently posted photos'] = 'prikaz samo nedavno objavljenih slika';
+$lang['return to the display of all photos'] = 'povratak u prikaz svih slika';
+$lang['the beginning'] = 'početak';
+$lang['Interface theme'] = 'tema';
+$lang['Thumbnails'] = 'Sličice';
+$lang['Menu'] = 'Izbornik';
+$lang['A comment on your site'] = 'Komentar na Vašem sajtu';
+$lang['today'] = 'danas';
+$lang['Update your rating'] = 'Obnovite svoju ocenu';
+$lang['the username must be given'] = 'mora se upisati korisničko ime';
+$lang['useful when password forgotten'] = 'korisno kada se zaboravi lozinka';
+$lang['Quick search'] = 'Brzo pretraživanje';
+$lang['Connected user: %s'] = 'Povezani korisnik: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Pretraživač: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Komentar: %s';
+$lang['Comment by %s'] = 'Komentarisao-la %s';
+$lang['User: %s'] = 'Korisnik: %s';
+$lang['Email: %s'] = 'E-mail: %s';
+$lang['Admin: %s'] = 'Administrator: %s';
+$lang['Registration of %s'] = 'Prijava od %s';
+$lang['Album: %s'] = 'Kategorija: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Loš status za korisnika "guest", koristi se podrazumevani status. Molimo obavestite webmaster-a.';
+$lang['this email address is already in use'] = 'korisnik već koristi ovu e-mail adresu';
+$lang['Album results for'] = 'Rezultati kategorije za ';
+$lang['Tag results for'] = 'Rezultati tagova za';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Pokreni klizni prikaz';
+$lang['Pause of slideshow'] = 'Zaustavi klizni prikaz';
+$lang['Repeat the slideshow'] = 'Ponovi klizni prikaz';
+$lang['Not repeat the slideshow'] = 'Ne ponavljaj klizni prikaz';
+$lang['Reduce diaporama speed'] = 'Smanji brzinu ';
+$lang['Accelerate diaporama speed'] = 'Povećaj brzinu ';
+$lang['Submit'] = 'Pošalji';
+$lang['Yes'] = 'Da';
+$lang['No'] = 'Ne';
+$lang['%d photo']='%d slika';
+$lang['%d photos']='%d slike';
+$lang['%d photo is also linked to current tags'] = '%d slika takođe povezana sa trenutnim tagovima';
+$lang['%d photos are also linked to current tags'] = '%d slike takođe povezana sa trenutnim tagovima';
+$lang['display photos linked to this tag'] = 'Pregledaj slike povezane samo sa ovim tag-om';
+$lang['photos posted during the last %d days'] = 'slike objavljene tokom zadnjih %d dana';
+$lang['Piwigo Help'] = 'Piwigo Pomoć';
+$lang['Rank'] = 'Redosled';
+$lang['group by letters'] = 'složeno po slovima';
+$lang['letters'] = 'slova';
+$lang['show tag cloud'] = 'prikaži tag oblak';
+$lang['cloud'] = 'oblak';
+$lang['Reset to default values'] = 'Vrati na podrazumevane vrednosti';
+$lang['delete all photos from your favorites'] = 'obriši sve slike iz Omiljeni';
+$lang['Sent by'] = 'Poslao';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies su blokirani ili nisu podržani od Vašeg pretraživača. Morate omogućiti cookies da bi se logovali.';
+$lang['Edit a comment'] = 'Uredi komentar';
+$lang['Are you sure?'] = 'Jeste li sigurni?';
+$lang['(!) This comment requires validation'] = '(!) Ovaj komentar zahteva overu';
+$lang['Welcome'] = 'Dobrodošli';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Dobrodošli u Vašu Piwigo foto galeriju!';
+$lang['... or browse your empty gallery'] = '... ili pretraži Vašu praznu galeriju';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ili isključite ovu poruku, uradiću to na svoj način';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Zdravo %s, Vaša Piwigo foto galerija je prazna!';
+$lang['I want to add photos'] = 'Želim da dodam fotografije';
+$lang['Manage this user comment: %s'] = 'Uredi komentare ovog korisnika: %s';
+$lang['This author modified following comment:'] = 'Ovaj autor je menjao tekući komentar:';
+$lang['This author removed the comment with id %d'] = 'Ovaj autor je uklonio komentar sa identifikacijom %d';
+$lang['html tags are not allowed in login'] = 'html oznake nisu dozvoljene prilikom logovanja';
+$lang['%d rates'] = '%d ocene';
+$lang['Change my password'] = 'Promena lozinke';
+$lang['Check your email for the confirmation link'] = 'Proverite da li vam je stigao email sa potvrdnim linkom';
+$lang['Desktop'] = 'Stoni';
+$lang['Edit'] = 'Uređivanje';
+$lang['Enter your new password below.'] = 'Unesite novu lozinku.';
+$lang['EXIF Metadata'] = 'EXIF Metapodatak';
+$lang['Hello %s,'] = 'Zdravo %s,';
+$lang['Here are your connection settings'] = 'Ovde su vaša podešavanja veze';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ukoliko je greška, samo ignorišite ovaj email i ništa se neće desiti.';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ako mislite da ste greškom dobili ovaj email, molimo da nas kontaktirate na %s';
+$lang['Invalid key'] = 'Neispravan ključ';
+$lang['Invalid username or email'] = 'Neispravno korisničko ime ili email';
+$lang['IPTC Metadata'] = 'IPTC Metapodatak';
+$lang['large'] = 'Veliko';
+$lang['medium'] = 'Srednje';
+$lang['Mobile'] = 'Mobilni';
+$lang['Original'] = 'Original';
+$lang['Password reset is not allowed for this user'] = 'Reset lozinke nije dozvoljen za ovog korisnika';
+$lang['Password Reset'] = 'Reset lozinke';
+$lang['Password: %s'] = 'Lozinka: %s';
+$lang['Photo sizes'] = 'Veličine fotografija';
+$lang['Please enter your username or email address.'] = 'Unesite Vaše korisničko ime ili email adresu.';
+$lang['Rating score'] = 'Rezultat ocenjivanja';
+$lang['Return to home page'] = 'Povratak na početnu stranu';
+$lang['Send my connection settings by email'] = 'Pošalji moja podešavanja veze email-om';
+$lang['Show latest comments first'] = 'Prikaži prvo poslednje komentare';
+$lang['Show oldest comments first'] = 'Prikaži prvo najstarije komentare';
+$lang['small'] = 'Malo';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Neko je zatražio reset lozinke korisnika';
+$lang['square'] = 'Kvadrat';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Uspešno ste se registrovali, uskoro ćete dobiti email sa podešavanjima veze. Dobrodošli!';
+$lang['Thank you for registering at %s!'] = 'Hvala na registrovavnju za %s!';
+$lang['The passwords do not match'] = 'Lozinke se ne poklapaju';
+$lang['thumb'] = 'Palac';
+$lang['To reset your password, visit the following address:'] = 'Da biste resetovali lozinku, posetite sledeću adresu:';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Korisnik "%s" nema email adresu, reset lozinke nije moguć';
+$lang['Username "%s" on gallery %s'] = 'Korisničko ime "%s" u galeriji %s';
+$lang['Username modification'] = 'Promena korisničkog imena';
+$lang['Username or email'] = 'Korisničko ime ili email';
+$lang['Username: %s'] = 'Korisničko ime: %s';
+$lang['View in'] = 'Pogled u';
+$lang['xlarge'] = 'Ekstra veliko';
+$lang['xxlarge'] = 'Ekstra ekstra veliko';
+$lang['You will receive a link to create a new password via email.'] = 'Dobićete email-om link za kreiranje nove lozinke.';
+$lang['Your password has been reset'] = 'Vaša lozinka je resetovana';
+$lang['Your username has been successfully changed to : %s'] = 'Vaše korisničko ime je uspešno promenjeno na: %s';
+$lang['2small'] = 'XXS-sićušan';
+$lang['xsmall'] = 'XS-ekstra mali';
+$lang['Date created, new &rarr; old'] = 'Datum kreiranja, novo &rarr; staro';
+$lang['Date created, old &rarr; new'] = 'Datum kreiranja, staro &rarr; novo';
+$lang['Date posted, new &rarr; old'] = 'Datum objavljivanja, novo &rarr; staro';
+$lang['Date posted, old &rarr; new'] = 'Datum objavljivanja, staro &rarr; novo';
+$lang['File name, A &rarr; Z'] = 'Ime fajla, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Ime fajla, Z &rarr; A';
+$lang['Manual sort order'] = 'Ručno sortiran poredak';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Brojni identifikator, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Brojni identifikator, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Naslov fotografije, A &rarr; Z ';
+$lang['Photo title, Z &rarr; A'] = 'Naslov fotografije, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = 'Ocena, visoka &rarr; niska';
+$lang['Rating score, low &rarr; high'] = 'Ocena, niska &rarr; visoka';
+$lang['Visits, high &rarr; low'] = 'Posete, više &rarr; manje';
+$lang['Visits, low &rarr; high'] = 'Posete, manje &rarr; više';
+?>
Index: tags/2.4.0RC3/language/sh_RS/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/sh_RS/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,129 @@
+<h2>Uredi album</h2>
+
+<h3>Informacije</h3>
+
+<ul>
+
+  <li><strong>ime</strong>: preimenuj album (virtuelno preimenovanje u slučaju fizičkog albuma).</li>
+
+  <li><strong>opis</strong>: kratak tekst sa op&scaron;tim podacima o sadržaju, ovaj tekst će biti prikazan na dnu strane sličica.</li>
+
+</ul>
+
+<h3>Premesti</h3>
+
+<p>Ako je album virtuelni, možete ga pomeriti. Pomeranje albuma znači promenu njegovog roditeljskog albuma.</p>
+
+<h3>Opcije</h3>
+
+<ul>
+
+  <li><strong>Tip pristuma</strong>: Upravljanje dozvolama. Ako napravite privatni album,
+  svi njegovi podređeni albumi postaju privatni. Ako napravite album javnim, svi njegovi nadređeni albumi postaju javni.</li>
+
+  <li><strong>Zaključaj</strong>: The album and its sub-albums will
+  be temporary disabled for maintenance.</li>
+
+  <li><strong>Comments</strong>: Authorize users to comment photos of this
+  album.</li>
+
+</ul>
+
+<p>You can also manage these options on the "Properties"
+management screen (screens <span
+class="pwgScreen">Comments</span>, <span class="pwgScreen">Lock</span>,
+<span class="pwgScreen">Public/Private</span>, <span
+class="pwgScreen">Representative</span> available from <span
+class="pwgScreen">Administration &raquo; Albums &raquo; Properties</span>).</p>
+
+<h3>Sort order</h3>
+
+<p>Use the default images sort order.</p>
+
+<p>Indicate whether this sort order will apply to subalbums also.</p>
+
+<p>Select specific sorting criteria to be used with this album.</p>
+<ul>
+<li><strong>Creation date</strong>: Photo shooting date</li>
+<li><strong>Post date</strong>: Synchronization date</li>
+<li><strong>Average rate (*)</strong>: Average rate could be changed by the visitor rating</li>
+<li><strong>Most visited (*)</strong>: The current visit might change the most visited order</li>
+<li><strong>File name</strong>: Name given in information field</li>
+<li><strong>Id</strong>: Internal Id (recent categories have an higher id than previous ones.</li>
+
+</ul>
+<p><strong>(*)</strong>Warning: Be sure to test these sort orders by yourself as they can give unexpected results.</p>
+
+
+<h3>Representant</h3>
+
+<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
+the album when
+it contains only sub-albums and no direct photo (just as the root album).</p>
+photo of a album :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
+  displayed album. This button is available only for administrators.</li>
+
+  <li><span class="pwgScreen">Modify informations about a photo</span> in
+  administration. This screen can be reached from <span
+  class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
+  management</span> in <em>unit mode</em>. See the help of this screen for
+  details.</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
+  Representative</span>. See the help of this screen for details.</li>
+
+  <li><span class="pwgScreen">Edit album</span> (the present screen).</li>
+
+</ul>
+
+<p>The choice of a representative depends on the 
+<code>allow_random_representative</code> configuration parameter (see <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In default mode (<code>allow_random_representative</code> set to false),
+each album containing at least one element is represented by a fixed
+element. Once set (at album creation), the representative changes only
+when an administrator ask for it. If the representative is not appropriate,
+you can ask to <strong>Find a new representant by random</strong>.</p>
+
+<p>If the <code>allow_random_representative</code> configuration parameter is
+set to true, a category containing photos may have no fixed
+representant. Just use <strong>Delete representant</strong> button.</p>
+
+<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
+informations about a photo</span> screen. The only option on the current screen
+is the <strong>Delete representant</strong> button.</p>
+
+<h3>Link all album photos to a new album</h3>
+
+<ul>
+
+<li><strong>Virtual album name</strong>: Name of the new album to be created, 
+all photos of the current category will be linked to the new one.</li>
+
+<li><strong>Parent album</strong>: Where the new album will be, 
+leave empty to create it at root.</li>
+
+</ul>
+
+<h3>Link all album photos to existing albums</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Choose the destination album.</li>
+
+</ul>
+
+<h3>Send an information email to group members</h3>
+
+<ul>
+
+<li><strong>Group</strong>: recipients group</li>
+
+<li><strong>Mail content</strong>: Free text to send to them.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/sh_RS/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/sh_RS/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,25 @@
+<p>Nekoliko načina da dodate Vaše slike u galeriju:</p>
+
+<ul>
+  <li><strong>Direktno slanje</strong> u Vašem web pretraživaču je najjednostavniji i najdirektniji način. Zavisi od mogućnosti Vašeg web pretraživača
+  i Vašeg web servera. Za veliki broj fotografija ili u slučaju da imate neki problem,
+  druge metode Vas čekaju!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Idi na Direktno slanje </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> je aplikacija za računar, koju trebate da instalirate. Pokupite i ubacite slike u pLoader prozor, kliknite na <em>"Upload to Piwigo"</em> i pustite pLoader da uradi posao. Možete naći drugu desktop aplikaciju kao<strong>WinToPiwigo</strong> ili <strong>Digikam</strong> dodatak za slanje na Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Idi na pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP prenos</strong>je najčešće preporučen način da dodate
+  jako veliku kolekciju fotografija sa najmanjim brojem klikova. Sledite uputstvo da biste pripremili Vaše fotografije. FTP metoda Vam omogućava kontrolu
+  organizacije Vaših fotografija na severu.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Idi na FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/sh_RS/help/index.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sh_RS/index.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sh_RS/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/install.lang.php	(revision 14585)
@@ -0,0 +1,75 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['Installation'] = 'Instalacija';
+$lang['Basic configuration'] = 'Osnovna podešenja';
+$lang['Default gallery language'] = 'Podrazumevani jezik galerije';
+$lang['Database configuration'] = 'Podešavanje baze';
+$lang['Admin configuration'] = 'Administratorska podešenja';
+$lang['Start Install'] = 'Pokreni instalaciju';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'mail adresa mora biti u formatu xxx@yyy.eee (primer : milos@firma.org)';
+$lang['Webmaster login'] = 'Webmaster pristup';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bice prikazano posetiocima. Neophodno je za administraciju stranice';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Konekcija na server uspešna, ali konecija na bazu je nemoguca';
+$lang['Can\'t connect to server'] = 'Nemoguce povezivanje na server';
+$lang['Host'] = 'Host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Korisnik';
+$lang['user login given by your host provider'] = 'korisnicko ime dat od strane Vašeg host distributera';
+$lang['Password'] = 'Lozinka';
+$lang['user password given by your host provider'] = 'korisnicka lozinka data od strane Vašeg host distributera ';
+$lang['Database name'] = 'Ime baze';
+$lang['also given by your host provider'] = 'takode dato od Vašeg Host distributera';
+$lang['Database table prefix'] = 'Prefix tabele baze';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'ime tabele baze will bice prefix sa njim (omogucava da upravljate bolje Vašuim tabelama)';
+$lang['enter a login for webmaster'] = 'Unesi pristupne podatke za webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'pristupni podaci za webmastera ne mogu sadržati znake \' ili "';
+$lang['please enter your password again'] = 'molim unesite Vašu lozinku ponovo';
+$lang['Webmaster password'] = 'Webmaster lozinka';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Sacuvajte u tajnosti, omogucava pristup administratorskom delu';
+$lang['Password [confirm]'] = 'Lozinka[potvrdi]';
+$lang['verification'] = 'Provera';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrebna Vam je pomoc? Pitajte na  <a href="%s">Piwigo tabli za poruke</a>.';
+$lang['Webmaster mail address'] = 'E-mail adresa Webmaster-a';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Posetioci ce biti u mogucnosti da koriste ovaj mail da kontaktiraju administratora stranice';
+$lang['PHP 5 is required'] = 'PHP 5 je neophodan';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Izgleda da Vaš webhost trenutno koristi PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo može pokušati da promeni Vašu konfiguraciju na PHP 5 kreiranjem ili menjanjem .htaccess datoteke.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Imajte u vidu da možete sami izmeniti Vašu konfiguraciju restartovati Piwigo posle toga.';
+$lang['Try to configure PHP 5'] = 'Pokušajte da podestite PHP 5';
+$lang['Sorry!'] = 'Žao nam je!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo wnije uspeo da podesi PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Trebalo bi da se obartite podršci Vašeg hosting provajdera za uputstvo kako da promenite na PHP 5 sami.';
+$lang['Hope to see you back soon.'] = 'Nadamo se da se uskoro vidimo.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Cestitamo, Piwigo instalacija je završena';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Alternativno rešenje je da kopirate tekst iz kutije iznad i nalepite u datoteku "local/config/database.inc.php" (Upozorenje : database.inc.php mora sadržati samo tekst iz kutije, bez linije ili praznih karaktera)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Kreiranje konfiguracione datoteke local/config/database.inc.php neuspešno.';
+$lang['Download the config file'] = 'Snimi na racunar konfiguracionu datoteku';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Možete snimiti na racunar konfiguracionu datoteku i poslati je na local/config direktorijum Vaše instalacije.';
+
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Ne oklevajte da zatražite pomoć na našem forumu oko bilo čega: %s';
+$lang['Just another Piwigo gallery'] = 'Još jedna Piwigo galerija';
+$lang['Welcome to my photo gallery'] = 'Dobrodošli u moju foto galeriju';
+$lang['Welcome to your new installation of Piwigo!'] = 'Dobrodošli na Vašu novu instalaciju Piwigo-a!';
+?>
Index: tags/2.4.0RC3/language/sh_RS/iso.txt
===================================================================
--- tags/2.4.0RC3/language/sh_RS/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Srpski [SR]
Index: tags/2.4.0RC3/language/sh_RS/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/sh_RS/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sh_RS/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Nadogradnja";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Ova stranica predlaže nadogradnju baze sa Piwigo stare verzije na novu.
+Asistent nadogradnje procenjuje da trenutno koristite <strong>izdanje %s</strong> (ili ekvivalentnu).";
+$lang['Upgrade from version %s to %s'] = "Nadogradnja sa verzije %s na %s";
+$lang['Statistics'] = "Statistika";
+$lang['total upgrade time'] = "ukupno vreme nadogradnje";
+$lang['total SQL time'] = "ukupno SQL vreme";
+$lang['SQL queries'] = "SQL upiti";
+$lang['Upgrade informations'] = "Informacije o nadogradnji";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Izvršiti proveru održavanja u [Administracija>Alati>Održavanje] ako naiđšete na neki problem.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Kao meru predostrožnost, dati dodaci su deaktivirani. Morate proveriti za nadogradnju dodataka pre nego ih ponovo aktivirate :";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Samo administrator može da pokrene nadogradnju: prijavite se ispod.";
+$lang['You do not have access rights to run upgrade'] = "Nemate pristupna prava da pokrenete nadogradnju";
+$lang['All sub-albums of private albums become private'] = "Sve podkategorije privatnih kategorija postaju privatne";
+$lang['User permissions and group permissions have been erased'] = "Korisničke i grupne dozvole su obrisane";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Samo prefix za povezne sličice i webmaster e-mail adresa su sačuvane iz prethodne konfiguracije";
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Iz predustrožnosti, sledeće teme su deaktivirane. Proverite nadogradnje tema pre nego što ih reaktivirate:';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'U <i>%s</i>, pre <b></b>, dodajte:';
+?>
Index: tags/2.4.0RC3/language/sk_SK/about.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/about.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p>Táto web fotogaléria je založená na aplikáci Piwigo.</p>
+
+<p>Piwigo je softvér fotogalérie pre web vytvorený aktívnou komunitou používateľov a vývojárov. Rozšírenia a doplnky robia Piwigo jednoducho prispôsobiteľné. Zásadná výhoda nakoniec: Piwigo je bezplatné a opensource.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Navštívte Piwigo web stránky</a></p>
+
+<p>Slovenské Piwigo udržuje:
+
+	<ul>
+        <li><a href="http://piwigo.org/forum/profile.php?id=9968">Jozef Kaffka</a></li>
+  </ul></p>
Index: tags/2.4.0RC3/language/sk_SK/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/admin.lang.php	(revision 14585)
@@ -0,0 +1,899 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d spojenie';
+$lang['%d associations'] = '%d spojení';
+$lang['%d album including'] = '%d album obsahujúci';
+$lang['%d albums including'] = '%d albumy obsahujúce';
+$lang['%d physical'] = '%d fyzická';
+$lang[' and %d virtual'] = 'a %d virtuálna';
+$lang['%d album moved'] = '%d album presunutý';
+$lang['%d albums moved'] = '%d albumov presunutých';
+$lang['%d group'] = '%d skupina';
+$lang['%d groups'] = '%d skupín';
+$lang['%d member'] = '%d účastník';
+$lang['%d members'] = '%d účastníkov';
+$lang['%d tag'] = '%d kľúčové slovo';
+$lang['%d tags'] = '%d kľúčových slov';
+$lang['%d user comment rejected'] = '%d komentár používateľa odmietnutý';
+$lang['%d user comments rejected'] = '%d komentárov používateľov odmietnutých';
+$lang['%d user comment validated'] = '%d komentár používateľa schválený';
+$lang['%d user comments validated'] = '%d komentárov používateľov schválených';
+$lang['%d user deleted'] = '%d používateľ zmazaný';
+$lang['%d users deleted'] = '%d používateľov zmazaných';
+$lang['%d user'] = '%d používateľ';
+$lang['%d users'] = '%d používateľov';
+$lang['%d waiting for validation'] = '%d čaká na schválenie';
+$lang['Actions'] = 'Akcia';
+$lang['Activate'] = 'Aktivovať';
+$lang['Add/delete a permalink'] = 'Pridať/odobrať pernamentný odkaz';
+$lang['Add a tag'] = 'Pridať kľúčové slovo';
+$lang['Add a user'] = 'Pridat používateľa';
+$lang['Add group'] = 'Pridať skupinu';
+$lang['Add'] = 'Pridať';
+$lang['Allow user registration'] = 'Povoliť registráciu používateľa';
+$lang['Apply to sub-albums'] = 'Použiť na podalbumy';
+$lang['Associated'] = 'Priradené';
+$lang['Caddie management'] = 'Správa košíku';
+$lang['Caddie'] = 'Košík';
+$lang['Albums authorized thanks to group associations'] = 'Albumy schválené vďaka skupinovým spojeniam';
+$lang['Album manual order was saved'] = 'Manuálne radenie albumov bolo schválené';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Zistenie možnosti aktualizácie sa nepodarilo';
+$lang['Check for upgrade'] = 'Zistiť možnosť aktualizácie';
+$lang['Comments for all'] = 'Komentáre pre všetkých';
+$lang['Current name'] = 'Súčasný názov';
+$lang['Database'] = 'Databáza';
+$lang['Deactivate'] = 'Deaktivovať';
+$lang['Delete Representant'] = 'Zmazať ukážkovú fotografiu';
+$lang['Delete selected tags'] = 'Zmazať vybrané kľúčové slová';
+$lang['Delete selected users'] = 'Zmazať vybraných používateľov';
+$lang['Deletions'] = 'Zmazanie';
+$lang['Deny selected groups'] = 'Zakázať vybraným skupinám';
+$lang['Deny selected users'] = 'Zakázať vybraným používateľom';
+$lang['Description'] = 'Popis';
+$lang['Display options'] = 'Nastavenie zobrazenia';
+$lang['Dissociated'] = 'Väzba zrušená';
+$lang['Does not represent'] = 'Nereprezentuje';
+$lang['Edit selected tags'] = 'Upraviť vybrané kľúčové slová';
+$lang['Edit tags'] = 'Upraviť kľúčové slová';
+$lang['Email admins when a new user registers'] = 'Poslať e-mail administrátorom pri registrácii nového používateľa';
+$lang['Email admins when a valid comment is entered'] = 'Poslať e-mail administrátorom pri vložení nového komentára';
+$lang['Email admins when a comment requires validation'] = 'Poslať e-mail administrátorom pri vložení nového komentára vyžadujúceho schválenie.';
+$lang['Environment'] = 'Prostredie';
+$lang['Form'] = 'Formulár';
+$lang['Gallery title'] = 'Názov galérie';
+$lang['Grant selected groups'] = 'Povoliť vybrané skupiny';
+$lang['Grant selected users'] = 'Povoliť vybraných používateľov';
+$lang['Group name'] = 'Meno skupiny';
+$lang['Groups'] = 'Skupiny';
+$lang['Guests'] = 'Hostia';
+$lang['History'] = 'História';
+$lang['Informations'] = 'Informácie';
+$lang['Install'] = 'Inštalovať';
+$lang['Link all album photos to a new album'] = 'Napojiť všetky položky na nový album';
+$lang['Link all album photos to some existing albums'] = 'Napojiť všetky položky na niektoré existujúce albumy';
+$lang['Linked albums'] = 'Napojené albumy';
+$lang['Lock gallery'] = 'Zamknúť galériu';
+$lang['Maintenance'] = 'Údržba';
+$lang['Edit album permissions'] = 'Nastaviť práva pre album';
+$lang['Manage permissions for group "%s"'] = 'Nastaviť práva pre skupinu "%s"';
+$lang['Manage permissions for user "%s"'] = 'Nastaviť práva pre používateľa "%s"';
+$lang['Manage tags'] = 'Správa kľúčových slov';
+$lang['Members'] = 'Členovia';
+$lang['Metadata synchronized from file'] = 'Metadata synchronizované zo súboru';
+$lang['Move albums'] = 'Presunúť albumy';
+$lang['Move'] = 'Presunúť';
+$lang['Name'] = 'Meno';
+$lang['New name'] = 'Nové meno';
+$lang['New parent album'] = 'Nový rodičovský album';
+$lang['New tag'] = 'Nové kľúčové slovo';
+$lang['Number of comments per page'] = 'Počet komentárov na stránke';
+$lang['Number of rates'] = 'Počet hodnotení';
+$lang['Number of thumbnails to create'] = 'Počet náhľadov k vytvoreniu';
+$lang['Only private albums are listed'] = 'Sú zobrazené len súkromné albumy';
+$lang['Operating system'] = 'Operačný systém';
+$lang['Options'] = 'Nastavenia';
+$lang['Other private albums'] = 'Ďalšie súkromné albumy';
+$lang['Page banner'] = 'Banner stránky';
+$lang['Parent album'] = 'Rodičovský album';
+$lang['Path'] = 'Cesta';
+$lang['Permalink'] = 'Pernamentné spojenie';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Pernamentné spojenie %s bolo predtým použité albumom %s. Najprv zmažte z histórie spojení.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Permanentné spojenie musí byť zložené zo znakov a-z, A-Z, 0-9, "-", "_" alebo "/". Nie je možné použiť len číslo alebo číslo nasledované "-"';
+$lang['Permalink %s is already used by album %s'] = 'Pernamentné spojenie je už využívané albumom %s';
+$lang['Permalink history'] = 'História permanentného spojenia';
+$lang['Permalinks'] = 'Permanentné spojenie';
+$lang['Permission denied'] = 'Prístup zamietnutý';
+$lang['Permission granted thanks to a group'] = 'Prístup povolený vďaka skupine';
+$lang['Permission granted'] = 'Prístup povolený';
+$lang['Photo informations updated'] = 'Informácie o fotografii aktualizované';
+$lang['Plugins'] = 'Doplnky';
+$lang['Position'] = 'Pozícia';
+$lang['Preferences'] = 'Nastavenia';
+$lang['Properties'] = 'Vlastnosti';
+$lang['Random photo'] = 'Náhodná fotografia';
+$lang['Rate date'] = 'Dátum hodnotenia';
+$lang['Rating by guests'] = 'Hodnotenie hosťami';
+$lang['Rating'] = 'Hodnotenie';
+$lang['Reject'] = 'Zamietnuť';
+$lang['Representant'] = 'Ukážkové';
+$lang['Representation of albums'] = 'Reprezentatívna fotografia pre albumy';
+$lang['Representative'] = 'Ukážková fotografia';
+$lang['Represents'] = 'Ukážkové fotografie';
+$lang['Save order'] = 'Uložiť poradie';
+$lang['Save to permalink history'] = 'Uložiť do histórie permanentného spojenia';
+$lang['Select at least one album'] = 'Je nutné zvoliť aspoň jeden album';
+$lang['Select at least one photo'] = 'Je nutné zvoliť aspoň jednu fotografiu';
+$lang['Select at least one user'] = 'Je nutné zvoliť aspoň jedného používateľa';
+$lang['Show info'] = 'Zobraziť informácie';
+$lang['Site manager'] = 'Správca stránky';
+$lang['Status'] = 'Stav';
+$lang['Statistics'] = 'Štatistiky';
+$lang['Storage album'] = 'Album umiestnení';
+$lang['Sum of rates'] = 'Sumarizácia hodnotení';
+$lang['Tag "%s" already exists'] = 'Kľúčové slovo "%" už existuje';
+$lang['Tag "%s" was added'] = '"%" kľúčové slovo bolo pridané';
+$lang['Tag selection'] = 'Výber kľúčového slova';
+$lang['The %d following tags were deleted'] = 'Nasledujúcích %d kľúčových slov bolo odstránených';
+$lang['Unable to check for upgrade.'] = 'Nie je možné skontrolovať aktualizácie.';
+$lang['Uninstall'] = 'Odinštalovať';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Použiť východzie radenie (definované v konfiguračnom súbore)';
+$lang['User comments validation'] = 'Schválenie komentárov používateľa';
+$lang['Users'] = 'Používatelia';
+$lang['Validate'] = 'Schváliť';
+$lang['Validation'] = 'Schválenie';
+$lang['Version'] = 'Verzia';
+$lang['Virtual albums to move'] = 'Virtuálne albumy k presunutiu';
+$lang['Virtual album name'] = 'Názov virtuálneho albumu';
+$lang['Webmaster cannot be deleted'] = 'Administrátor nemôže byť zmazaný';
+$lang['You are running on development sources, no check possible.'] = 'Sú používané vývojové zdrojové kódy, zistenie nie je možné.';
+$lang['You cannot delete your account'] = 'Nemôžete zmazať svoj účet';
+$lang['You cannot move an album in its own sub album'] = 'Nie je možné presunúť album do jeho vlastného podalbumu';
+$lang['You need to confirm deletion'] = 'Je nutné potvrdiť vymazanie';
+$lang['Associate to album'] = 'priradiť k albumu';
+$lang['associate to group'] = 'priradiť ku skupine';
+$lang['Authorized'] = 'Autorizované';
+$lang['Add a virtual album'] = 'Pridať virtuálny album';
+$lang['Authorize users to add comments on selected albums'] = 'Povoliť používateľom komentovať vybrané albumy';
+$lang['The name of an album must not be empty'] = 'Meno albumu nesmie byť prázdne';
+$lang['Lock albums'] = 'Zamknúť albumy';
+$lang['Private'] = 'Súkromný album';
+$lang['Public'] = 'Verejný album';
+$lang['Find a new representant by random'] = 'Nájsť ukážkovú fotografiu pomocou náhodného výberu';
+$lang['Public / Private'] = 'Verejná / Súkromná';
+$lang['Manage authorizations for selected albums'] = 'Nastaviť oprávnenie pre vybrané albumy';
+$lang['Virtual album added'] = 'Virtuálny album pridaný';
+$lang['Virtual album deleted'] = 'Virtuálny album zmazaný';
+$lang['Access type'] = 'Druh prístupu';
+$lang['Information data registered in database'] = 'Data boli uložené do databázy';
+$lang['Default display'] = 'Východzie zobrazenie';
+$lang['The gallery URL is not valid.'] = 'URL galérie nie je platné';
+$lang['Main'] = 'Hlavné';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Počet komentárov na stránku musí byť číslo medzi 5 a 50 vrátane';
+$lang['Configuration'] = 'Konfigurácia';
+$lang['confirm'] = 'potvrdiť';
+$lang['Date'] = 'Dátum';
+$lang['delete album'] = 'vymazať album';
+$lang['Dissociate from album'] = 'oddeliť z albumu';
+$lang['dissociate from group'] = 'oddeliť od skupiny';
+$lang['Album updated successfully'] = 'Informácie o albume boli úspěšne aktualizované.';
+$lang['photos per page'] = 'položiek na stránke';
+$lang['High definition enabled'] = 'Vysoké rozlíšenie povolené';
+$lang['File'] = 'Súbor';
+$lang['first photo added on %s'] = 'prvá položka pridaná k %s';
+$lang['Forbidden'] = 'Zakázané';
+$lang['global mode'] = 'viac naraz';
+$lang['group "%s" added'] = 'skupina "%s" pridaná';
+$lang['group "%s" deleted'] = 'skupina "%s" vymazaná';
+$lang['group "%s" updated'] = 'skupina "%s" aktualizovaná';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Názov skupiny nesmie obsahovať " alebo \' alebo byť prázdny.';
+$lang['This name is already used by another group.'] = 'Toto meno je už používané pre inú skupinu.';
+$lang['High definition'] = 'Vysoké rozlíšenie';
+$lang['jump to album'] = 'Prejsť do albumu';
+$lang['jump to photo'] = 'prejsť na obrázok';
+$lang['leave'] = 'ponechať';
+$lang['Lock'] = 'Zamknúť';
+$lang['Locked'] = 'Uzamknuté';
+$lang['manage album photos'] = 'Spravovať položky albumu';
+$lang['manage sub-albums'] = 'Spravovať položky podalbumov';
+$lang['Manage'] = 'Správa';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Vykonávanie operácie prekročilo povolený čas, spracovanie musí pokračovať [zostávajúci čas: %d sekundu].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Vykonávanie prekročilo maximálny čas, spracovanie musí pokračovať [zostávajúci čas: %d sekúnd].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Nastavený čas pre zobrazenie zoznamu používateľov bol prekročený. Ďalší používatelia nebudú zobrazení.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Nastavený čas pre odoslanie správy bol prekročený. Ďalšie správy nebudú odoslané.';
+$lang['To send ?'] = 'Odoslať?';
+$lang['Last send'] = 'Naposledy odoslané';
+$lang['email'] = 'E-mail';
+$lang['User'] = 'Používateľ';
+$lang['See you soon,'] = 'Dovidenia';
+$lang['Go to'] = 'Prejsť na';
+$lang['Hello'] = 'Dobrý deň ';
+$lang['New photos were added'] = 'Boli pridané nové fotografie';
+$lang['on'] = ' v ';
+$lang['between'] = 'medzi ';
+$lang['and'] = ' a ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster Vás prihlásil k odberu noviniek e-mailom.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Prihlásenie k odberu noviniek e-mailom prebehlo úspešne.';
+$lang['To subscribe'] = 'Pre prihlásenie kliknite na %s .';
+$lang['If you encounter problems or have any question, please send a message to'] = 'V prípade problémov alebo otázok kontaktujte ';
+$lang['[NBM] Problems or questions'] = '[NBM] Problémy alebo otázky';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster Vás odhlásil z odberu noviniek e-mailom.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Odhlásenie z odberu noviniek e-mailom prebehlo úspešne.';
+$lang[', click on'] = ', kliknite na ';
+$lang['To unsubscribe'] = 'Pre odhlásenie kliknite na %s .';
+$lang['With blank value, gallery title will be used'] = 'Pokiaľ nie je zadané, použije sa názov galérie';
+$lang['Notification'] = 'Oznámenie';
+$lang['Error when sending email to %s [%s].'] = 'Chyba pri odosielaní správy príjemcovi %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Správa odoslaná príjemcovi %s [%s].';
+$lang['%d mail was sent.'] = '%d správa odoslaná.';
+$lang['%d mails were sent.'] = '%d správ odoslaných.';
+$lang['%d mail was not sent.'] = '%d správa nebola odoslaná.';
+$lang['%d mails were not sent.'] = '%d správ nebolo odoslaných.';
+$lang['No mail to send.'] = 'Žiadna správa k odoslaniu.';
+$lang['There is no available subscribers to mail.'] = 'Nie sú žiadni odberatelia prihlásení pre príjem správy.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Prihlásení odberatelia môžu byť zobrazení len ak existujú novinky k upozorneniu.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Táto záložka sa zobrazuje len administrátorom.';
+$lang['No user to send notifications by mail.'] = 'Nebol nájdený žiaden používateľ pre odoberanie noviniek e-mailom.';
+$lang['New photos added'] = 'Nové položky boli pridané';
+$lang['Subscribe to notification by mail'] = 'Prihlásiť k odberu novinek e-mailom';
+$lang['Unsubscribe from notification by mail'] = 'Odhlásiť z odberu noviniek e-mailom';
+$lang['Parameter'] = 'Parameter';
+$lang['Continue processing treatment'] = 'Pokračovať v údržbe';
+$lang['Complementary mail content'] = 'Doplnkový obsah správy';
+$lang['Add detailed content'] = 'Odoslať obsah';
+$lang['Send mail as'] = 'Odoslať správu ako';
+$lang['Send mail to users'] = 'Odoslať e-mail používateľom';
+$lang['Send'] = 'Odoslať';
+$lang['Subscribed'] = 'Prihlásení používatelia';
+$lang['Subscribe'] = 'Prihlásiť';
+$lang['Parameters'] = 'Parametre';
+$lang['Select recipients'] = 'Zvoľte príjemcov';
+$lang['Subscribe/unsubscribe users'] = 'Prihlásiť/odhlásiť používateľov';
+$lang['Unsubscribed'] = 'Neprihlásení používatelia';
+$lang['%d parameter was updated.'] = '%d parameter aktualizovaný.';
+$lang['%d parameters were updated.'] = '%d parametrov aktualizovaných.';
+$lang['%d user was not updated.'] = '%d používateľ nebyl aktualizovaný.';
+$lang['%d users were not updated.'] = '%d používateľov nebolo aktualizovaných.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Používateľ %s [%s] bol odhlásený z odberu noviniek e-mailom.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Používateľ %s [%s] bol prihlásený k odoberaniu noviniek e-mailom.';
+$lang['%d user was updated.'] = '%d používateľ aktualizovaný.';
+$lang['%d users were updated.'] = '%d používateľov aktualizovaných.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Používateľ %s [%s] nebol odobraný zo zoznamu prihlásených k odoberaniu noviniek.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Používateľ %s [%s] nebol pridaný do zoznamu prihlásených k odoberaniu noviniek.';
+$lang['User %s [%s] added.'] = 'Používateľ %s [%s] pridaný.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Upozornenie: prihlásenie alebo odhlásenie má za následok odoslanie e-mailov používateľom';
+$lang['Send mail on HTML format'] = 'Odosielať správy v HTML formáte';
+$lang['Include display of recent photos grouped by dates'] = 'Zahrnúť novú skupinu fotografií podľa dátumu';
+$lang['Available only with HTML format'] = 'Dostupné len pre správy vo formáte HTML';
+$lang['no write access'] = 'nemáte prístupové práva';
+$lang['Permissions'] = 'Oprávnenia';
+$lang['private'] = 'súkromé';
+$lang['public'] = 'verejné';
+$lang['Purge never used notification feeds'] = 'Previesť údržbu nepoužitých RSS vlákien';
+$lang['Purge sessions'] = 'Previesť údržbu relácií';
+$lang['randomly represented'] = 'náhodne reprezentovaný';
+$lang['registration date'] = 'dátum registrácie';
+$lang['clean'] = 'vyčistiť';
+$lang['Create this site'] = 'Vytvoriť túto stránku';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'otestovať vzdialenú stránku';
+$lang['remove tags'] = 'presunúť kľúčové slová';
+$lang['Repair and optimize database'] = 'Opraviť a optimalizovať databázu';
+$lang['selection'] = 'výber';
+$lang['set to'] = 'nastaviť ';
+$lang['singly represented'] = 'samostatne reprezentovaný';
+$lang['This site already exists'] = 'Táto stránka už existuje';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Vytvoriť novú stránku: (zadajte adresu do create_listing_file.php)';
+$lang['created'] = 'vytvorené';
+$lang['delete'] = 'vymazať';
+$lang['delete this site and all its attached elements'] = 'vymazať túto stránku a všetky súvisiace položky';
+$lang['deleted'] = 'vymazané';
+$lang['an error happened'] = 'došlo k chybe';
+$lang['Local'] = 'Miestny';
+$lang['Remote'] = 'Vzdialený';
+$lang['update the database from files'] = 'aktualizovať databázu zo súboru';
+$lang['status'] = 'stav';
+$lang['Directory'] = 'Adresár';
+$lang['sub-albums'] = 'podalbumy';
+$lang['Synchronize metadata'] = 'synchronizovať metadata';
+$lang['target'] = 'cieľ';
+$lang['Thumbnail'] = 'Náhľad';
+$lang['title'] = 'názov';
+$lang['Album list management'] = 'Správa albumov';
+$lang['Piwigo configuration'] = 'Nastavenie aplikácie Piwigo';
+$lang['Edit album'] = 'Editovať album';
+$lang['Group management'] = 'Správa skupín';
+$lang['User list'] = 'Zoznam používateľov';
+$lang['Edit photo information'] = 'Upraviť informácie o fotografii';
+$lang['Database synchronization with files'] = 'Synchronizácia databázy so súbormi';
+$lang['all'] = 'všetko';
+$lang['height must be a number superior to'] = 'výška musí byť väčšia ako';
+$lang['width must be a number superior to'] = 'šírka musí byť väčšia ako';
+$lang['for the file format'] = 'pre formát súboru';
+$lang['Photo unreachable or no support'] = 'Fotografia nie je dostupná alebo podporovaná';
+$lang['General statistics'] = 'Celková štatistika';
+$lang['average time'] = 'priemerný čas';
+$lang['number of miniaturized photos'] = 'počet miniaturizovaných fotografií';
+$lang['total time'] = 'celkový čas';
+$lang['for this file format'] = 'pre tento formát súboru';
+$lang['unit mode'] = 'jednotlivo';
+$lang['Unlocked'] = 'Odomknuté';
+$lang['unset'] = 'nenastavovať';
+$lang['Update albums informations'] = 'Aktualizovať informácie o albumoch';
+$lang['Update photos information'] = 'Aktualizovať informácie o fotografiách';
+$lang['Synchronize'] = 'Synchronizácia';
+$lang['reduce to single existing albums'] = 'Previesť do jediného existujúceho albumu';
+$lang['Choose an option'] = 'Zvoliť nastavenie';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'Zobraziť všetky informácie (pridané a odstránené albumy a položky)';
+$lang['Error list'] = 'Zozam chýb';
+$lang['Errors caption'] = 'Chyby - legenda';
+$lang['Detailed informations'] = 'Detailné informácie';
+$lang['File/directory read error'] = 'Chyba pri čítaní súboru/adresára';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Súbor alebo adresár nie je prístupný alebo neexistuje';
+$lang['albums deleted in the database'] = 'albumy odstránené z databázy';
+$lang['photos deleted from the database'] = 'položky odstránené z databázy';
+$lang['photos candidates for metadata synchronization'] = 'fotografie pre synchronizáciu metadat';
+$lang['photos informations synchronized with files metadata'] = 'informácie synchronizované z metadat súborov';
+$lang['errors during synchronization'] = 'chýb behom synchronizácie';
+$lang['albums added in the database'] = 'albumy pridané do databázy';
+$lang['photos added in the database'] = 'položky pridané do databázy';
+$lang['photos updated in the database'] = 'položky aktualizované v databáze';
+$lang['Search for new images in the directories'] = 'Hľadať nové obrázky v kategóriách';
+$lang['added'] = 'pridané';
+$lang['Metadata synchronization results'] = 'Výsledky synchronizácie metadat';
+$lang['only perform a simulation (no change in database will be made)'] = 'len simulácia pridania (nebudú urobené žiadne zmeny v databáze)';
+$lang['Simulation'] = 'Simulácia';
+$lang['directories + files'] = 'adresáre + súbory';
+$lang['only directories'] = 'len adresáre';
+$lang['synchronize files structure with database'] = 'synchronizovať štruktúru súborov s databázou';
+$lang['synchronize files metadata with database photos informations'] = 'synchronizovať metadata súborov s databázou';
+$lang['even already synchronized photos'] = 'zahrnúť aj skôr synchronizované položky';
+$lang['Used metadata'] = 'Použité metadata';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Názov adresárov a súborov musí byť tvorený písmenami, číslami, "-", "_" alebo "."';
+$lang['wrong filename'] = 'chybný názov súboru';
+$lang['Upload'] = 'Nahrať fotografie';
+$lang['user "%s" added'] = 'používateľ "%s" pridaný';
+$lang['User status'] = 'Stav používateľa';
+$lang['user_status_admin'] = 'Administrátor';
+$lang['user_status_generic'] = 'Všeobecný';
+$lang['user_status_guest'] = 'Hosť';
+$lang['user_status_normal'] = 'Používateľ';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Virtuálny album';
+$lang['Waiting'] = 'Na schválenie';
+$lang['default'] = 'východzí';
+$lang['Toggle \'default group\' property'] = 'Prepnúť vlastnosť \'základná skupina\'';
+$lang['Advanced features'] = 'Rozšírené vlastnosti';
+$lang['Overall'] = 'Celkovo';
+$lang['Year'] = 'Rok';
+$lang['Month'] = 'Mesiac';
+$lang['Day'] = 'Deň';
+$lang['Pages seen'] = 'Prezretých stránok';
+$lang['Time'] = 'čas';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Fotografie';
+$lang['Section'] = 'Sekcia';
+$lang['An information email was sent to group "%s"'] = 'Informačný e-mail bol poslaný skupine "%s"';
+$lang['Send an information email to group members'] = 'Poslať informačný e-mail používateľom skupiny';
+$lang['Group'] = 'Skupina';
+$lang['[%s] Visit album %s'] = '[%s] Navštívilo album %s';
+$lang['Hello,'] = 'Dobrý deň,';
+$lang['See you soon.'] = 'Dovidenia.';
+$lang['Discover album:'] = 'Navštívte album:';
+$lang['Mail content'] = 'Obsah e-mailu';
+$lang['none'] = 'žiadny';
+$lang['high'] = 'vysoký';
+$lang['other'] = 'iný';
+$lang['Element type'] = 'Typ položky';
+$lang['Image id'] = 'ID fotografie';
+$lang['Summary'] = 'Súhrn';
+$lang['%d line filtered'] = '%d riadok filtrovaný';
+$lang['%d lines filtered'] = '%d riadkov filtrovaných';
+$lang['%d guest'] = '%d hosť';
+$lang['%d guests'] = '%d hostí';
+$lang['Hour'] = 'Hodina';
+$lang['guest'] = 'hosť';
+$lang['default values'] = 'východzie hodnoty';
+$lang['Guest cannot be deleted'] = 'Používateľa hosť nie je možné vymazať';
+$lang['Default user cannot be deleted'] = 'Východzieho používateľa nie je možné vymazať';
+$lang['Purge history detail'] = 'Previesť údržbu detailov histórie';
+$lang['Purge history summary'] = 'Previesť údržbu celej histórie';
+$lang['Check integrity'] = 'Skontrolovať integritu';
+$lang['Anomaly'] = 'Anomálie';
+$lang['Correction'] = 'Oprava';
+$lang['Automatic correction'] = 'Automatická oprava';
+$lang['Impossible automatic correction'] = 'Automatická oprava nie je možná';
+$lang['Correction applied with success'] = 'Oprava úspešne prevedená';
+$lang['Correction applied with error'] = 'Oprava sa nepodarila';
+$lang['%d anomaly has been detected.'] = '%d anomália detekovaná.';
+$lang['%d anomalies have been detected.'] = '%d anomálií detekovaných.';
+$lang['%d anomaly has been corrected.'] = '%d anomália bola opravená.';
+$lang['%d anomalies have been detected corrected.'] = '%d anomálií bolo opravených.';
+$lang['%d anomaly has not been corrected.'] = '%d anomália nebola opravená.';
+$lang['%d anomalies have not been corrected.'] = '%d anomálií nebolo opravených.';
+$lang['Go to %s or %s for more informations'] = 'Viac informácií nájdete na %s a %s';
+$lang['the forum'] = 'fórum';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s nie je korektný súbor - EXIF nie je podporovaný';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s musí byť nastavený na false v súbore config_local.inc.php';
+$lang['Main "guest" user does not exist'] = 'Hlavný používateľ "hosť" neexistuje';
+$lang['Main "guest" user status is incorrect'] = 'Stav hlavného používateľa "hosť" je chybný';
+$lang['Default user does not exist'] = 'Východzí hlavný používateľ neexistuje';
+$lang['Main "webmaster" user does not exist'] = 'Hlavný používateľ "webmaster" neexistuje';
+$lang['Main "webmaster" user status is incorrect'] = 'Stav hlavného používateľa "webmaster" je chybný';
+$lang['User "%s" created with "%s" like password'] = 'Používateľ "%s" vytvorený s heslom "%s"';
+$lang['Status of user "%s" updated'] = 'Stav používateľa "%s" aktualizovaný';
+$lang['add new photos to caddie'] = 'pridať nové položky do košíku';
+$lang['No display'] = 'Bez zobrazenia';
+$lang['Classic display'] = 'Bežné zobrazenie';
+$lang['Hoverbox display'] = 'Zobraziť pri ukázaní myšou';
+$lang['Mail address is obligatory for all users'] = 'E-mailová adresa je povinná pre všetkých používateľov';
+$lang['Minimum privacy level'] = 'Najnižší stupeň ochrany súkromia';
+$lang['Privacy level'] = 'Stupeň ochrany súkromia';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakty';
+$lang['Level 2'] = 'Priatelia';
+$lang['Level 4'] = 'Rodina';
+$lang['Level 8'] = 'Administrátori';
+$lang['Reinitialize check integrity'] = 'Znovu spustiť kontrolu integrity';
+$lang['Check all'] = 'Vybrať všetko';
+$lang['Uncheck all'] = 'Zrušiť výber';
+$lang['Check automatic corrections'] = 'Vybrať automatické opravy';
+$lang['Apply selected corrections'] = 'Previesť vybrané opravy';
+$lang['Ignore selected anomalies'] = 'Ignorovať vybrané anomálie';
+$lang['Refresh'] = 'Aktualizovať';
+$lang['The anomaly will be ignored until next application version'] = 'Anomálie budú ignorované do novej verzie aplikácie';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Prevedením opravy anomálie sa zruší ich ignorácia';
+$lang['%d anomaly has been ignored.'] = '%d anomália bola ignorovaná.';
+$lang['%d anomalies have been ignored.'] = '%d anomálií bolo ignorovaných.';
+$lang['Plugins which need upgrade'] = 'Doplnky vyžadujúce aktualizáciu';
+$lang['Plugin list'] = 'Zoznam doplnkov';
+$lang['Check for updates'] = 'Skontrolovať aktualizácie';
+$lang['Other plugins'] = 'Ďalšie doplnky';
+$lang['Last revisions'] = 'Posledná revízia';
+$lang['Are you sure you want to delete this plugin?'] = 'Prajete si odstrániť tento doplnok?';
+$lang['Are you sure you want to install this plugin?'] = 'Prajete si nainštalovať tento doplnok?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Prajete si nainštalovať túto aktualizáciu? Je potrebné overiť, či súčasnú verziu nie je nutné najskôr odinštalovať.';
+$lang['Plugin has been successfully copied'] = 'Doplnok bol úspešne nainštalovaný';
+$lang['You might go to plugin list to install and activate it.'] = 'Doplnok je potrebné aktivovať v zozname doplnkov.';
+$lang['Can\'t create temporary file.'] = 'Nie je možné vytvoriť dočasný súbor.';
+$lang['Can\'t download archive.'] = 'Nie je možné stiahnuť archív.';
+$lang['Can\'t read or extract archive.'] = 'Archív nie je možné rozbaliť alebo prečítať.';
+$lang['An error occured during extraction (%s).'] = 'Behom rozbaľovania došlo k chybe (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Prosím skontrolujte oprávnenie pre adresár "plugins" vrátane podadresárov (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Nie je možné sa pripojiť k serveru.';
+$lang['Purge compiled templates'] = 'Previesť údržbu šablón';
+$lang['Upload'] = 'Nahrať fotografie';
+$lang['ACCESS_0'] = 'Voľný prístup';
+$lang['ACCESS_1'] = 'Prístupné všetkým';
+$lang['ACCESS_2'] = 'Prístupné prihláseným';
+$lang['ACCESS_3'] = 'Prístupné administrátorom';
+$lang['ACCESS_4'] = 'Prístupné správcom';
+$lang['ACCESS_5'] = 'Neprístupné';
+$lang['Support'] = 'Podpora';
+$lang['Documentation'] = 'Dokumentácia';
+$lang['A new version of Piwigo is available.'] = 'Je dostupná nová verzia Piwigo.';
+$lang['Piwigo Administration'] = 'Administrácia Piwigo';
+$lang['Piwigo version'] = 'Verzia Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Používate najnovšiu verziu Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Používaná verzia %s [%s] nie je kompatibilná s požadovanou verziou [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Je nutné aktualizovať systém pokiaľ chcete využívať všetky funkcie aplikácie - inak nemusí aplikácia pracovať správne alebo vôbec';
+$lang['Deleted on'] = 'Vymazané';
+$lang['Last hit'] = 'Posledné zobrazenie';
+$lang['GD library is missing'] = 'GD knižnica neexistuje';
+$lang['Templates'] = 'Šablóny';
+$lang['Extend for templates'] = 'Rozšírenia pre šablóny';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Nahradiť pôvodné šablóny používateľskými z podadresára template-extension';
+$lang['Replacers (customized templates)'] = 'Nahradiť používateľskými šablónami';
+$lang['Original templates'] = 'Pôvodné šablóny';
+$lang['Optional URL keyword'] = 'Voliteľné kľúčové slovo URL';
+$lang['Templates configuration has been recorded.'] = 'Nastavenie šablón bolo uložené.';
+$lang['All optimizations have been successfully completed.'] = 'Všetky zmeny boli úspešne dokončené.';
+$lang['Optimizations have been completed with some errors.'] = 'Zmeny boli dokončené s niekoľkými chybami.';
+$lang['Modify information'] = 'Upraviť informácie';
+$lang['nothing'] = 'prázdne';
+$lang['overrides existing values with empty ones'] = 'nahradiť súčasné hodnoty prázdnymi';
+$lang['Manage photo ranks'] = 'Spravovať hodnotenie fotografií';
+$lang['Edit ranks'] = 'Upraviť hodnotenie';
+$lang['No photo in this album'] = 'Album neobsahuje žiadne položky';
+$lang['Images manual order was saved'] = 'Poradie fotografií bolo uložené';
+$lang['ranks'] = 'hodnotenie';
+$lang['Drag to re-order'] = 'Poradie zmeníte ťahaním myši';
+$lang['Quick Local Synchronization'] = 'Rýchla miestna synchronizácia';
+$lang['No photo can be deleted'] = 'Fotografia nemôže byť vymazaná';
+$lang['Delete selected photos'] = 'Vymazať vybrané fotografie';
+$lang['%d photo was deleted'] = '%d fotografia vymazaná';
+$lang['%d photos were deleted'] = '%d fotografií vymazaných';
+$lang['Downloads'] = 'Stiahnuté';
+$lang['Released on'] = 'Vydané';
+$lang['Number of downloads'] = 'Počet stiahnutí';
+$lang['Upload Photos'] = 'Nahrať fotografie';
+$lang['Drop into album'] = 'Späť do albumu';
+$lang['+ Add an upload box'] = '+ Pridat pole';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Vytvorte "%s" adresár v koreňovom adresári inštalácie Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Povoľte zápis (chmod 777,644,atď.) do "%s" adresára v koreňovom adresári inštalácie Piwigo';
+$lang['existing album'] = 'súčasný album';
+$lang['create a new album'] = 'Založiť nový album';
+$lang['Album name'] = 'Názov albumu';
+$lang['Album "%s" has been added'] = 'Kategória "%s" pridaná';
+$lang['Uploaded Photos'] = 'Nahrať fotografie';
+$lang['%d photos uploaded'] = '%d fotografií nahraných';
+$lang['Privacy level set to "%s"'] = 'Úroveň súkromia údajov nastavená na "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategória "%s" teraz obsahuje %d fotografií';
+$lang['Manage this set of %d photos'] = 'Spravovať tento súbor %d fotografií';
+$lang['Select files'] = 'Výber súborov';
+$lang['Operation in progress'] = 'Prevádzam údržbu.';
+$lang['Please wait...'] = 'Prosím počkajte...';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo spravodaj';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Prihláste sa k odberu Piwigo spravodaja, aby ste boli informovaný o novinkách. Dostanete tak e-mail, keď bude k dispozícii nová verzia Piwigo (ktorá môže obsahovať bezpečnostnú záplatu, o čom je dôležité byť informovaný) alebo v prípade dôležitých novinek v projekte. Jedná sa len o niekoľko mailov ročne.';
+$lang['Subscribe %s'] = 'Prihlásiť %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Prihlásiť %s k Spravodaju Piwigo';
+$lang['Purge search history'] = 'Odstrániť históriu hľadania';
+$lang['Hide'] = 'Skryť';
+$lang['Password is missing. Please enter the password.'] = 'Chýba heslo. Prosím napíšte heslo.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Chýba potvrdenie hesla. Prosím potvrďte vybrané heslo.';
+$lang['Allow users to edit their own comments'] = 'Povoliť používateľom upravovať ich vlastné komentáre';
+$lang['Allow users to delete their own comments'] = 'Povoliť používateľom mazať ich vlastné komentáre';
+$lang['Email administrators when a comment is modified'] = 'Informovať e-mailom administrátorov, keď je upravený komentár';
+$lang['Email administrators when a comment is deleted'] = 'Informovať e-mailom administrátorov, keď je zmazaný komentár';
+$lang['Cannot delete the old permalink !'] = 'Starý pernamentný odkaz nemôže byť zmazaný!';
+$lang['Hit'] = 'Zobrazenie';
+$lang['Tools'] = 'Nástroje';
+$lang['Photos'] = 'Fotografie';
+$lang['Themes'] = 'Témy';
+$lang['Instructions to use Piwigo'] = 'Informácie ako používať Piwigo';
+$lang['Installed Themes'] = 'Inštalované témy';
+$lang['Add New Theme'] = 'Pridať novú tému';
+$lang['Forbid this theme to users'] = 'Zakázať použitie tojto témy používateľom';
+$lang['Set as default theme for unregistered and new users'] = 'Nastaviť východziu tému pre nezaregistrovaných a nových používateľov';
+$lang['unknown'] = 'neznámy';
+$lang['Everybody'] = 'Každý';
+$lang['Who can see these photos?'] = 'Kto môže vidieť tieto fotografie?';
+$lang['Who can see this photo?'] = 'Kto môže vidieť túto fotografiu?'; 
+$lang['Pending Comments'] = 'Nevybavené komentáre';
+$lang['Settings'] = 'Nastavenia';
+$lang['Resize'] = 'Zmeniť veľkosť';
+$lang['Maximum Width'] = 'Maximálna šířka';
+$lang['pixels'] = 'bodov';
+$lang['Maximum Height'] = 'Maximálna výška';
+$lang['Image Quality'] = 'Kvalita formátu';
+$lang['Save Settings'] = 'Uložiť nastavenia';
+$lang['Your configuration settings are saved'] = 'Vaše nastavenia boli uložené';
+$lang['Active Themes'] = 'Aktívne témy';
+$lang['Add write access to the "%s" directory'] = 'Nastavte prístup pre zápis do adresára "%s"';
+$lang['Administration Home'] = 'Úvodná stránka administrácie';
+$lang['Change Admin Colors'] = 'Zmeňte farvy administrácie';
+$lang['Delete this theme'] = 'Zrušte túto tému';
+$lang['Directory does not exist'] = 'Adresár neexistuje';
+$lang['Download,'] = 'Stiahnuť,';
+$lang['FTP + Synchronization'] = 'FTP + Synchronizácia';
+$lang['Get Support on Piwigo Forum'] = 'Získať podporu na fóre Piwigo';
+$lang['Help Me'] = 'Pomoc';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Táto téma nemôže byť aktivovaná, protože chýba rodičovská téma: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Táto téma nemôže byť zrušená, protože na nej závisia ďalšie témy: %s';
+$lang['Inactive Themes'] = 'Neaktívne témy';
+$lang['Install on your computer,'] = 'Inštalovať na Váš počítač,';
+$lang['Make this theme available to users'] = 'Sprístupniť používateľom';
+$lang['Page end'] = 'Koniec stránky';
+$lang['Piwigo Uploader'] = 'Piwigo nahrávač fotografií';
+$lang['Read Piwigo Documentation'] = 'Čítajte Piwigo dokumentáciu';
+$lang['Start pLoader and add your photos.'] = 'Spustite pLoader a pridajte Vaše fotografie.';
+$lang['Switch to clear or dark colors for administration'] = 'Prepnúť na svetlé alebo tmavé farvy pre administráciu';
+$lang['Theme has been successfully installed'] = 'Téma bola úspešne nainštalovaná';
+$lang['Visit Gallery'] = 'Navštíviť galériu';
+$lang['Visit Piwigo project website'] = 'Navštíviť Piwigo projektový web portál';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader je <em>Piwigo nahrávač</em>. pLoader pripraví Vaše fotografie na Vašom počítači a nahraje ich na Vašu Piwigo fotogalériu.';
+$lang['Guest Settings'] = 'Nastavenie pre hostí';
+$lang['Main Page'] = 'Hlavná stránka';
+$lang['Photo Page'] = 'Fotostránka';
+$lang['Activate Navigation Bar'] = 'Aktivovať navigačnú lištu';
+$lang['Activate Navigation Thumbnails'] = 'Aktivovať navigačné náhľady';
+$lang['Activate icon "%s"'] = 'Aktivovať ikonu "%s"';
+$lang['Photo Properties'] = 'Vlastnosti fotografie';
+$lang['Allow user customization'] = 'Povoliť používateľskú úpravu nastavení';
+$lang['Languages'] = 'Jazyky';
+$lang['Installed Languages'] = 'Inštalované jazyky';
+$lang['Add New Language'] = 'Pridať nový jazyk';
+$lang['Language has been successfully installed'] = 'Jazyk bol úspešne nainštalovaný';
+$lang['Select:'] = 'Vybrať:';
+$lang['None'] = 'Žiadny';
+$lang['Invert'] = 'Obrátiť';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Nie je možné deaktivovať túto tému, potrebujete aspoň jednu tému.';
+$lang['Webmaster status is required.'] = 'Je požadovaný status webmastra.';
+$lang['Bound Theme'] = 'Zviazať témy';
+$lang['Allow rating'] = 'Povoliť hodnotenie';
+$lang['Select at least one comment'] = 'Vyberte aspoň jeden komentár';
+$lang['Active Plugins'] = 'Aktivovať doplnky';
+$lang['Inactive Plugins'] = 'Deaktivovať doplnky';
+$lang['Missing Plugins'] = 'Chýbajúce doplnky';
+$lang['Uninstalled Plugins'] = 'Nenainštalované doplnky';
+$lang['By %s'] = 'Od %s';
+$lang['Visit plugin site'] = 'Navštívte web portál doplnkov';
+$lang['Active Languages'] = 'Aktívne jazyky';
+$lang['Delete this language'] = 'Odstrániť tento jazyk';
+$lang['Forbid this language to users'] = 'Zneprístupniť tento jazyk používateľom';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Nie je možné deaktivovať tento jazyk, najprv vyberte iný východzí jazyk.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Nie je možné deaktivovať tento jazyk, potrebujete aspoň jeden jazyk.';
+$lang['Inactive Languages'] = 'Deaktivované jazyky';
+$lang['Make this language available to users'] = 'Sprístupniť tento jazyk používateľom';
+$lang['Set as default language for unregistered and new users'] = 'Nastaviť ako východzí jazyk pre nezaregistrovaných a nových používateľov';
+$lang['Add Photos'] = 'Pridať fotografie';
+$lang['The following tag was deleted'] = 'Nasledujúce kľúčové slovo bolo odstránené';
+$lang['Miscellaneous'] = 'Rôzne';
+$lang['Virtual Links'] = 'Virtuálne odkazy';
+$lang['There is no other language available.'] = 'Nie je dostupný žiadny ďalší jazyk.';
+$lang['There is no other plugin available.'] = 'Nie je dostupný žiadny ďalší doplnok.';
+$lang['There is no other theme available.'] = 'Nie je dostupná žiadna ďalšia téma.';
+$lang['Add another set of photos'] = 'Pridať ďalšiu množinu fotografií';
+$lang['user_status_generic'] = 'Všeobecné';
+$lang['IP'] = 'IP';
+$lang['By rank'] = 'Podľa hodnotenia';
+$lang['Manual order'] = 'Radené ručne';
+$lang['Order of menubar items has been updated successfully.'] = 'Poradie položiek v menu bolo úspešne aktualizované.';
+$lang['This theme was not designed to be directly activated'] = 'Táto téma nebola navrhnutá tak, aby bola priamo aktivovateľná';
+$lang['Menu Management'] = 'Ďalšie funkcie';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'V súbore php.ini, upload_max_filesize (%sB) je väčší ako post_max_size (%sB), mali by ste zmeniť toto nastavenie';
+$lang['Exif extension not available, admin should disable exif use'] = 'Doplnok Exif nie je dostupný, administrátor by mal deaktivovať jeho použitie';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Nahrané súbory presahujú upload_max_filesize ako je uvedené v php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Nahrané súbory presahujú post_max_size ako je uvedené v php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Nahraný súbor presahuje MAX_FILE_SIZE ako je uvedené v HTML formulári';
+$lang['The uploaded file was only partially uploaded'] = 'Súbor bol iba čiastočne nahraný';
+$lang['No file was uploaded'] = 'Súbor nebol nahraný';
+$lang['Missing a temporary folder'] = 'Chýbajúci dočasný adresár';
+$lang['Failed to write file to disk'] = 'Chyba zápisu súboru na disk';
+$lang['File upload stopped by extension'] = 'Nahrávanie súboru zastavené doplnkom';
+$lang['Unknown upload error'] = 'Neznáma chyba nahrávania';
+$lang['Error on file "%s" : %s'] = 'Chyba súboru "%s" : %s';
+$lang['automatic order'] = 'automatické zoradenie';
+$lang['manual order'] = 'manuálne zoradenie';
+$lang['Albums automatically sorted'] = 'Automaticky triedené albumy';
+$lang['Batch Manager'] = 'Správca dávky';
+$lang['include child albums'] = 'vrátane podalbumov';
+$lang['Selection'] = 'Výber';
+$lang['Action'] = 'Akcia';
+$lang['Set author'] = 'Nastavenie autora';
+$lang['Set title'] = 'Nastavenie názvu';
+$lang['Set creation date'] = 'Nastavenie dátumu vytvorenia';
+$lang['Apply action'] = 'Pridaj akciu';
+$lang['on the %d selected photos'] = 'na %d vybraných fotografií';
+$lang['%d of %d photos selected'] = '%d z %d vybraných fotografií';
+$lang['No photo selected, %d photos in current set'] = 'Žiadna fotografia vybraná, %d fotografií v súčasnom súbore';
+$lang['All %d photos are selected'] = 'Všetkých %d fotografií vybraných';
+$lang['remove this filter'] = 'odstráň tento filter';
+$lang['Duplicates'] = 'duplicity';
+$lang['Add a filter'] = 'Pridaj filter';
+$lang['Remove all filters'] = 'Odstráň všetky filtre';
+$lang['Refresh photo set'] = 'Obnoviť foto súbor';
+$lang['The whole page'] = 'Celá stránka';
+$lang['The whole set'] = 'Celý súbor';
+$lang['No photo in the current set.'] = 'Žiadna fotografia v súčasnom súbore.';
+$lang['No photo selected, no action possible.'] = 'Nie je označená žiadna fotografia, nie je možné pokračovať v akcii.';
+$lang['Choose an action'] = 'Zvoľ akciu';
+$lang['remove author'] = 'odstrániť autora';
+$lang['Type here the author name'] = 'Sem napíšte meno autora';
+$lang['remove title'] = 'odstrániť názov';
+$lang['Type here the title'] = 'Sem napíšte názov';
+$lang['remove creation date'] = 'odstrániť dátum vytvorenia';
+$lang['Album photos associated to the following albums: %s'] = 'Fotografie prepojené na nasledujúce albumy: %s';
+$lang['Delete orphan tags'] = 'Vymazanie nepriradených kľúčových slov';
+$lang['delete photo'] = 'vymazať fotografiu';
+$lang['Orphan tags deleted'] = 'Nepriradené kľúčové slová boli vymazané';
+$lang['Week starts on'] = 'Týždenné spustenie';
+$lang['You have %d orphan tags: %s.'] = 'Máte %d nepriradených kľúčových slov: %s.';
+$lang['Remove from caddie'] = 'Vymazať z krabičky';
+$lang['Themes which need upgrade'] = 'Témy potrebujúce aktualizáciu'; 
+$lang['Languages which need upgrade'] = 'Jazyky potrebujúce aktualizáciu '; 
+$lang['All themes are up to date.'] = 'Všetky témy sú aktuálne.'; 
+$lang['All plugins are up to date.'] = 'Všetky doplnky sú aktuálne.'; 
+$lang['All languages are up to date.'] = 'Všetky jazyky sú aktuálne.'; 
+$lang['Visit theme site'] = 'Navštívte stránku tém'; 
+$lang['Visit language site'] = 'Navštívte stránku jazykov'; 
+$lang['New Version'] = 'Nová verzia';
+$lang['Obsolete Plugins'] = 'Zastaralé doplnky';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'UPOZORNENIE! Tento doplnok nemusí byť kompatibilný s touto verziou Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Chtete ho aj tak aktivovať?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'TENTO DOPLNOK JE TERAZ SÚČASŤOU JADRA PIWIGO! ODINŠTALUJTE HO TERAZ!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'CHYBA: TENTO DOPLNOK CHÝBA ALE JE NAINŠTALOVANÝ! ODINŠTALUJTE HO TERAZ.';
+$lang['display'] = 'zobrazenie';
+$lang['Thumbnails generation in progress...'] = 'Prebieha tvorba náhľadov...';
+$lang['Photos generation in progress...'] = 'Prebieha tvorba fotografií...';
+$lang['%s photos have been regenerated'] = '%s fotografií bolo vytvorených';
+$lang['%s photos can not be regenerated'] = '%s fotografií nebolo vytvorených';
+$lang['new'] = 'nové';
+$lang['No results'] = 'Bez výsledkov';
+$lang['Searching...'] = 'Vyhľadávam...';
+$lang['Type in a search term'] = 'Napíšte vo vyhľadávaní';
+$lang['Deactivate all'] = 'Ukončiť všetko';
+$lang['Restore'] = 'Obnoviť';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Obnoviť východiskovú konfiguráciu. Stratíte nastavenia Vašich doplnkov!';
+$lang['Show menubar'] = 'Zobraziť menu';
+$lang['Updates'] = 'Aktualizácie';
+$lang['Update in progress... Please wait.'] = 'Prebieha aktualizácia... Prosím čakajte.';
+$lang['Ignore this update'] = 'Ignorovať túto aktualizáciu';
+$lang['Reset ignored updates'] = 'Obnoviť ignorované aktualizácie';
+$lang['Update All'] = 'Aktualizovať všetko';
+$lang['ERROR'] = 'CHYBA';
+$lang['Update Complete'] = 'Aktualizácia kompletná';
+$lang['Piwigo Update'] = 'Piwigo aktualizácia';
+$lang['Extensions Update'] = 'Aktualizácia doplnkov';
+$lang['All extensions are up to date.'] = 'Všetky doplnky sú aktuálne.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Nasledovné doplnky nemusia byť kompatibilné s novou verziou Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = ' Nasledovné témy nemusia byť kompatibilné s novou verziou Piwigo:';
+$lang['I decide to update anyway'] = 'Rozhodol som sa aktualizovať každopádne';
+$lang['Update to Piwigo %s'] = 'Aktualizovať na Piwigo %s';
+$lang['Two updates are available'] = 'Dve aktualizácie sú dostupné';
+$lang['This is a minor update, with only bug corrections.'] = 'Toto je malá aktualizácia opravujúca chyby.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Toto je veľká aktulizácia s <a href="%s">novými funkciami</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Niektoré témy a doplnky nemusia byť prístupné.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Môžete aktualizovať na Piwigo %s priamo bez aktualizácie na Piwigo %s (odporúčané).';
+$lang['Save Template Directory'] = 'Uložiť adresár šablón';
+$lang['Dump Database'] = 'Vyčistiť databázu';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Vrátane histórie údajov (Upozornenie: limit pamäte servera môže byť prekročený)';
+$lang['Unable to dump database.'] = 'Nemožno vyčistiť databázu.';
+$lang['Some upgrades are available for extensions.'] = 'Niektoré aktualizácie sú dostupné pre doplnky.';
+$lang['Ignore All'] = 'Ignorovať všetko';
+$lang['Crop'] = 'Orezať';
+$lang['Width'] = 'Šírka';
+$lang['Height'] = 'Výška';
+$lang['Follow Orientation'] = 'Nasledovať orientáciu';
+$lang['Graphics Library'] = 'Grafická knižnica';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivovať ikonu "new" pre ďalšie albumy a fotky'; 
+$lang['Default photos order'] = 'Predvolené zoradenie fotiek';
+$lang['Average rate'] = 'Priemerné hodnotenie';
+$lang['Rate'] = 'Hodnotenie';
+$lang['Add a criteria'] = 'Pridať kritéria';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Nemožno definovať prednastavené zoradenie fotiek, pretože ho máte inak nastavené lokálnej konfigurácii.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Máte špecifikované <i>$conf[\'order_by\']</i> vo Vašom lokálnom konfiguračnom súbore, tento parameter je neprípustný, prosím vymažte ho alebo premenujte v <i>$conf[\'order_by_custom\']</i> !';
+$lang['Learn more'] = 'Zistiť viac';
+$lang['... or '] = '... alebo ';
+$lang['Create'] = 'Vytvoriť';
+$lang['Start Upload'] = 'Spustiť nahrávanie';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Používate Flash uploader. Problemy? Skúste <a href="%s">Browser uploader</a> miesto toho.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Používate prehliadačový uploader. Skúste <a href="%s">Flash uploader</a> miesto toho.';
+$lang['Maximum file size: %sB.'] = 'Maximálna veľkosť súboru: %sB.';
+$lang['Allowed file types: %s.'] = 'Povolené typy súborov: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Približné maximálne rozlíšenie: %dM pixelov (teda %dx%d pixelov).';
+$lang['Manage Permissions'] = 'Riadenie prístupov';
+$lang['Photo %s of %s'] = 'Fotka %s z %s';
+$lang['show details'] = 'ukázať detaily';
+$lang['hide details'] = 'schovať detaily';
+$lang['Merge tags'] = 'Zlúčiť kľúčové slová';
+$lang['Select the destination tag'] = 'Označiť cieľové kľúčové slovo';
+$lang['(this tag will be deleted)'] = '(toto kľúčové slovo bude vymazané)';
+$lang['Confirm merge'] = 'Potvrdiť zlúčnie';
+$lang['Merge selected tags'] = 'Zlúčiť označené kľúčové slová';
+$lang['No destination tag selected'] = 'Žiadne cieľové kľúčové slovo nie je označené';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Kľúčové slová <em>%s</em> sú zlúčené do kľúčového slova <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Označiť najmenej dve kľúčové slová pre zlúčenie';
+$lang['Select an album'] = 'Označiť album';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Štandardne Piwigo vytvorí novú veľkosť pre web z HD (high definition) verzie fotky.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Ak nie je k dispozícii HD a ak súčasná veľkosť pre web je väčšia ako rozmer zmeny veľkosti, Piwigo fotku presunie ako HD a vytvorí z nej menšiu veľkosť pre web.';
+$lang['An error has occured during upgrade.'] = 'Pri upgrade sa vyskytla chyba.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Pri rozbaľovaní sa vyskytla chyba. Prosím skontrolujte prístupové práva súborov Vašej inštalácie piwigo.<br><a href="%s">Kliknite sem na zobrazenie logu chyby</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo nemôže získať upgradovací súbor zo servra';
+$lang['Zoom'] = 'Zväčšenie';
+$lang['Add to caddie'] = 'Pridať do košíku';
+$lang['%s has been successfully updated.'] = '%s bol úspešne aktualizovaný.'; 
+$lang['Add tags'] = 'Pridať kľúčové slová'; 
+$lang['Last import'] = 'Ostatný import'; 
+$lang['Predefined filter'] = 'Predefinovaný filter'; 
+$lang['With no album'] = 'Bez albumu'; 
+$lang['With no tag'] = 'Bez kľúčového slova'; 
+$lang['With no virtual album'] = 'Bez virtuálneho albumu';
+$lang['Activate comments'] = 'Aktívne komentáre';
+$lang['Default comments order'] = 'Predvolené zoradenie komentárov';
+$lang['GD version'] = 'GD verzia';
+$lang['Photo name'] = 'Názov fotky';
+$lang['Send connection settings by email'] = 'Poslať nastavenie pripojenia mailom';
+$lang['The original image quality must be a number between %d and %d'] = 'Originálna kvalita fotky musí byť číslo medzi %d a %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Originálna maximálna výška musí byť číslo medzi %d a %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Originálna maximálna šírka musí byť číslo medzi %d a %d';
+$lang['Resize after upload'] = 'Zmeniť rozmer po nahratí';
+$lang['Original Size'] = 'Originálna veľkosť';
+$lang['A locked gallery is only visible to administrators'] = 'Uzamknutý album je viditeľný len administrátorom'; 
+$lang['Unlock gallery'] = 'Odomknúť album'; 
+$lang['Gallery unlocked'] = 'Album odomknutý'; 
+$lang['Notify administrators when a comment is'] = 'Upozorniť administrátorov, keď je komentár'; 
+$lang['modified'] = 'upravené'; 
+$lang['pending validation'] = 'čakajúce na potvrdenie'; 
+$lang['Save visits in history for'] = 'Uložiť návštevy do histórie'; 
+$lang['simple visitors'] = 'obyčajní návštevníci'; 
+$lang['registered users'] = 'registrovaní používatelia'; 
+$lang['administrators'] = 'administrátori'; 
+$lang['This album contains %d photos, added on %s.'] = 'Tento album obsahuje %d fotiek, pridaných %s.'; 
+$lang['This album contains %d photos, added between %s and %s.'] = 'Tento album obsahuje %d fotiek, pridaných medzi %s a %s.'; 
+$lang['This album contains no photo.'] = 'Tento album neobsahuje fotky.';
+$lang['Not cropped correctly?'] = 'Nesprávne orezanie?';
+$lang['Center of interest'] = 'Stred záujmu';
+$lang['Move to album'] = 'Premiestniť do albumu';
+$lang['You can activate only one mobile theme.'] = 'Môžete aktivovať len jednu tému pre mobil.';
+$lang['Automatic sort order'] = 'Automatické zoradenie';
+$lang['apply automatic sort order'] = 'použiť automatické zoradenie';
+$lang['Save manual order'] = 'Uložiť manuálne zoradenie';
+$lang['cancel manual order'] = 'zrušiť manuálne zoradenie';
+$lang['Cancel'] = 'Zrušiť';
+$lang['List'] = 'Zoznam';
+$lang['Web Form'] = 'Web formulár';
+$lang['Applications'] = 'Aplikácie';
+$lang['Available versions for'] = 'Dostupné verzie pre';
+$lang['Available on'] = 'K dispozícii';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo pre iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo pre iOS</em> aplikácie umožňujúcej spojenie na Vašu Piwigo galériu pre Váš iPhone, iPad alebo iPod Touch, vytváranie albumov a nahrávanie fotografií.';
+$lang['Piwigo for Android'] = 'Piwigo pre Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo pre Android</em> aplikácie umožňujúcej spojenie na Vašu Piwigo galériu pre Váš iPhone, iPad alebo iPod Touch, vytváranie albumov a nahrávanie fotografií.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo publikačný doplnok pre Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom je fotografický softvér určený na správu väčšieho počtu digitálnych fotografií a postprodukčnú prácu.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publikačný doplnok umožňuje export a synchronizáciu fotografií z Lightroomu priamo do Vašej Piwigo foto galérie.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publikačný doplnok pre Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell je open source digitálny foto organizér pracujúci pod Linuxom. Je to predvolený foto správca v Ubuntu a Fedore.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Vo Vašom Linuxe jednoducho nainštalujte Shotwell so správcovským balíkom a aktivujte Piwigo publikačnú voľbu.';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publikačný doplnok pre digiKam';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam je pokročilý digitálny foto správca a to voľne šíriteľný pre Linux, Windows, a MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam je navrhnutý pre fotografov, ktorí chcú prezerať, spravovať, upravovať, vylepšovať, organizovať, označovať a zdieľať fotografie.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Pre export Vašich fotografií z digiKam do Piwigo jednoducho nainštalujte digiKam a Kipi-doplnky.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo export doplnok pre iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto je predvolený foto správca na MacOSX. Piwigo export doplnok umožňuje vytvárať nové albumy a exportovať Vaše fotografie priamo z iPhoto do Vašej Piwigo foto galérie.';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo export doplnok pre Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture je výkonný nástroj na vylepšovanie fotografií a správu veľkých knižníc na Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture je navrhnutý pre profesionálnych fotografov s jednoduchosťou iPhoto.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo export doplnok umožňuje vytváranie albumov a export fotografií.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery klient pre Android) je open source (GPL v3) Piwigo klient pre platformu Android.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Funkcie vrátane prehliadania galérií, vytvárania albumov a nahrávania fotografií.';
+$lang['Generate multiple size images'] = 'Tvorba početných veľkostí fotografií';
+$lang['Delete multiple size images'] = 'Vymazanie početných veľkostí fotografií';
+$lang['any visitor can see this album'] = 'ktorýkoľvek návštevník môže vidieť tento album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'návštevníci sa musia prihlásiť a mať povolené vidieť tento album';
+$lang['Groups and users'] = 'Skupiny a používatelia';
+$lang['Permission granted for groups'] = 'Práva udelené pre skupiny';
+$lang['Select groups...'] = 'Výber skupín...';
+$lang['There is no group in this gallery.'] = 'Nie je definovaná skupina v tejto galérii.';
+$lang['Permission granted for users'] = 'Povolenia udelené pre používateľov';
+$lang['Select users...'] = 'Výber používateľov...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u používateľov má automaticky oprávnenia, pretože patria do skupiny s prideleným oprávnením.';
+$lang['include photos with lower privacy level'] = 'vrátane fotografií s nízkou súkromnou úrovňou';
+$lang['custom'] = 'Voliteľné';
+$lang['No group is permitted to see this private album'] = 'Žiadna skupina nemá oprávnenie vidieť tento súkromný album';
+$lang['Permission management'] = 'Správa oprávnení';
+$lang['add a new watermark'] = 'pridať novú vodotlač';
+$lang['Apply watermark if height is bigger than'] = 'Použiť vodotlač ak výška je väčšia ako';
+$lang['Apply watermark if width is bigger than'] = 'Použiť vodotlač ak šírka je väčšia ako';
+$lang['bottom left corner'] = 'ľavý dolný roh';
+$lang['bottom right corner'] = 'pravý dolný roh';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Ako predvolené, stred záujmu je umiestnený do stredu fotky.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Pre fotku s orezom, takým ako "Štvorec", Piwigo ju urobí čo najlepšie so stredom záujmu.';
+$lang['middle'] = 'stred';
+$lang['Opacity'] = 'Nepriehľadnosť';
+$lang['Photo sizes with crop'] = 'Veľkosť fotky s orezom';
+$lang['Select a file'] = 'Označiť súbor';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Označiť zónu Vašou myšou na definovanie nového stredu záujmu.';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Stred záujmu je veľmi významná zóna na fotke';
+$lang['top left corner'] = 'ľavý horný roh';
+$lang['top right corner'] = 'pravý horný roh';
+$lang['X Position'] = 'X Pozícia';
+$lang['X Repeat'] = 'X Opakovanie';
+$lang['Y Position'] = 'Y Pozícia';
+$lang['Multiple Size'] = 'Viacnásobná veľkosť';
+?>
Index: tags/2.4.0RC3/language/sk_SK/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/common.lang.php	(revision 14585)
@@ -0,0 +1,416 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Slovensky [SK]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=452
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Slovenčina';
+$lang_info['country'] = 'Slovenská republika';
+$lang_info['charset'] = 'UTF-8';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'sk';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d album aktualizovaný';
+$lang['%d albums updated'] = '%d albumov aktualizovaných';
+$lang['%d comment to validate'] = '%d komentár na schválenie';
+$lang['%d comments to validate'] = '%d komentárov na schválenie';
+$lang['%d new photo'] = '%d nová fotka';
+$lang['%d new photos'] = '%d nových fotiek';
+$lang['%d comment'] = '%d komentár';
+$lang['%d comments'] = '%d komentárov';
+$lang['%d hit'] = '%d zobrazenie';
+$lang['%d hits'] = '%d zobrazení';
+$lang['%d new photo'] = '%d nový objekt';
+$lang['%d new photos'] = '%d nových objektov';
+$lang['%d new user'] = '%d nový používateľ';
+$lang['%d new users'] = '%d nových používateľov';
+$lang['About'] = 'O galérii';
+$lang['All tags'] = 'Všetky kľúčové slová';
+$lang['Any tag'] = 'Akékoľvek kľúčové slovo';
+$lang['At least one listed rule must be satisfied.'] = 'Aspoň jedno pravidlo zo zoznamu musí byť splnené.';
+$lang['Author'] = 'Autor';
+$lang['Albums'] = 'Albumy';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Zatvoriť okno';
+$lang['Complete RSS feed (photos, comments)'] = 'Kompletné RSS vlákno (fotografie, komentáre)';
+$lang['Confirm Password'] = 'Potvrdiť heslo';
+$lang['Connection settings'] = 'Nastavenie prihlasovacích údajov';
+$lang['Login'] = 'Prihlásiť sa';
+$lang['Contact webmaster'] = 'Kontaktovať webmastra';
+$lang['Create a new account'] = 'Vytvoriť nový účet';
+$lang['Created on'] = 'Vytvorené';
+$lang['Creation date'] = 'Dátum vytvorenia';
+$lang['Current password is wrong'] = 'Chybne zadané heslo';
+$lang['Dimensions'] = 'Rozmery';
+$lang['Display'] = 'Zobraziť';
+$lang['Each listed rule must be satisfied.'] = 'Všetky pravidlá zo zoznamu musia byť splnené.';
+$lang['Email address is missing. Please specify an email address.'] = 'Chýba e-mailová adresa. Prosím zadajte e-mailovú adresu.';
+$lang['Email address'] = 'E-mail';
+$lang['Enter your personnal informations'] = 'Vyplňte svoje osobné údaje';
+$lang['Error sending email'] = 'Chyba pri odosielaní správy';
+$lang['File name'] = 'Názov súboru';
+$lang['File'] = 'Súbor';
+$lang['Filesize'] = 'Veľkosť súboru';
+$lang['Filter and display'] = 'Zobraziť podľa filtra';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Zabudnuté heslo?';
+$lang['Go through the gallery as a visitor'] = 'Prechádzať galériu ako hosť';
+$lang['Help'] = 'Nápoveda';
+$lang['Identification'] = 'Identifikácia';
+$lang['Photos only RSS feed'] = 'RSS vlákno len s fotografiami';
+$lang['Keyword'] = 'Kľúčové slovo';
+$lang['Links'] = 'Odkazy';
+$lang['N/A'] = 'nezadané';
+$lang['New on %s'] = 'Nový na %s';
+$lang['Notification'] = 'RSS vlákno';
+$lang['Number of items'] = 'Počet položiek';
+$lang['Original dimensions'] = 'Pôvodné rozmery';
+$lang['Password forgotten'] = 'Zabudnuté heslo';
+$lang['Password'] = 'Heslo';
+$lang['Post date'] = 'Dátum zverejnenia';
+$lang['Posted on'] = 'Odoslané';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Rýchle prihlásenie';
+$lang['RSS feed'] = 'RSS čítačka';
+$lang['Register'] = 'Zaregistrovať sa';
+$lang['Registration'] = 'Registrácia';
+$lang['Related tags'] = 'Súvisiace kľúčové slová';
+$lang['Reset'] = 'Vynulovať';
+$lang['Retrieve password'] = 'Obnoviť heslo';
+$lang['Search rules'] = 'Podmienky pre vyhľadávanie';
+$lang['Search tags'] = 'Hľadať podľa kľúčových slov';
+$lang['Search'] = 'Vyhľadať';
+$lang['display available tags'] = 'Ukázať dostupné kľúčové slová';
+$lang['Since'] = 'Od';
+$lang['Sort by'] = 'Zoradiť podľa';
+$lang['Sort order'] = 'Smer zoradenia';
+$lang['Tag'] = 'Kľúčové slovo';
+$lang['Tags'] = 'Kľúčové slová';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS vlákno informuje o novinkách na týchto stránkach: nové fotografie, aktualizované albumy, komentáre. Použite RSS čítačku.';
+$lang['Unknown feed identifier'] = 'Neznámý identifikátor vlákna';
+$lang['User comments'] = 'Komentáre používateľov';
+$lang['Username'] = 'Používateľské meno';
+$lang['Visits'] = 'Návštev';
+$lang['Webmaster'] = 'Webmaster';
+$lang['Week %d'] = 'Týždeň %d';
+$lang['About Piwigo'] = 'O aplikácii Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Nemáte oprávnenie k prístupu na požadovanú stránku';
+$lang['add this photo to your favorites'] = 'Pridať túto fotografiu k obľúbeným';
+$lang['Administration'] = 'Administrácia';
+$lang['all'] = 'všetko';
+$lang['ascending'] = 'vzostupne';
+$lang['author(s) : %s'] = 'autor : %s';
+$lang['Expand all albums'] = 'Rozbaliť všetky albumy';
+$lang['posted after %s (%s)'] = 'vložené po %s (%s)';
+$lang['posted before %s (%s)'] = 'vložené pred %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'vložené medzi %s (%s) a %s (%s)';
+$lang['posted on %s'] = 'vložené %s';
+$lang['Best rated'] = 'Najlepšie hodnotené';
+$lang['display best rated photos'] = 'Zobraziť najlepšie hodnotené položky';
+$lang['Calendar'] = 'Kalendár';
+$lang['All'] = 'Všetko';
+$lang['display each day with photos, month per month'] = 'Fotografie podľa dňov, mesiac po mesiaci';
+$lang['View'] = 'Zobraziť';
+$lang['chronology_monthly_calendar'] = 'Kalendár na mesiac';
+$lang['chronology_monthly_list'] = 'Zoznam na mesiac';
+$lang['chronology_weekly_list'] = 'Týždenný zoznam';
+$lang['Click here if your browser does not automatically forward you'] = 'Ak neprebehlo automatické presmerovanie, kliknite sem';
+$lang['comment date'] = 'dátum vloženia komentára';
+$lang['Comment'] = 'Komentár';
+$lang['Your comment has been registered'] = 'Váš komentár bol zaregistrovaný';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Ochrana proti zahlteniu: prosím počkajte chvíľu pred vložením nového komentára';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Váš komentár nebol vložený, protože neprešiel schválením';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Váš komentár nebude zobrazený, pokiaľ ho neschváli administrátor.';
+$lang['This login is already used by another user'] = 'Prihlasovacie meno je už používané iným používateľom';
+$lang['Comments'] = 'Komentáre';
+$lang['Add a comment'] = 'Vložiť komentár';
+$lang['created after %s (%s)'] = 'vytvorené po %s (%s)';
+$lang['created before %s (%s)'] = 'vytvorené pred %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'vytvorené medzi %s (%s) a %s (%s)';
+$lang['created on %s'] = 'vytvorené %s';
+$lang['Customize'] = 'Upraviť';
+$lang['Your Gallery Customization'] = 'Prispôsobiť galériu ';
+$lang['day'][0] = 'Nedeľa';
+$lang['day'][1] = 'Pondelok';
+$lang['day'][2] = 'Utorok';
+$lang['day'][3] = 'Streda';
+$lang['day'][4] = 'Štvrtok';
+$lang['day'][5] = 'Piatok';
+$lang['day'][6] = 'Sobota';
+$lang['Default'] = 'Východzie';
+$lang['delete this photo from your favorites'] = 'Odstrániť fotografiu z obľúbených';
+$lang['Delete'] = 'Zmazať';
+$lang['descending'] = 'zostupne';
+$lang['Download'] = 'Stiahnuť';
+$lang['Download this file'] = 'stiahnuť tento súbor';
+$lang['edit'] = 'editovať';
+$lang['wrong date'] = 'chybný dátum';
+$lang['excluded'] = 'vyňaté';
+$lang['Your favorites'] = 'Obľúbené';
+$lang['display your favorites photos'] = 'zobraziť moje obľúbené fotografie';
+$lang['Favorites'] = 'Obľúbené';
+$lang['First'] = 'Začiatok';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galéria je uzamknutá z dôvodu údržby. Skúste to prosím neskôr.';
+$lang['Page generated in'] = 'Stránka vytvorená ';
+$lang['guest'] = 'hosť';
+$lang['Hello'] = 'Prihlásený ako';
+$lang['available for administrators only'] = 'prístupné len adminitrátorom';
+$lang['display this album'] = 'ukazuje fotografie v koreňovom adresári tohto albumu';
+$lang['display last user comments'] = 'Zobraziť najnovšie komentáre používateľov';
+$lang['customize the appareance of the gallery'] = 'prispôsobiť vzhľad galérie';
+$lang['search'] = 'hľadať';
+$lang['Home'] = 'Úvodná stránka';
+$lang['Identification'] = 'Identifikácia';
+$lang['in this album'] = 'v tomto albume';
+$lang['in %d sub-album'] = 'v %d podalbume';
+$lang['in %d sub-albums'] = 'v %d podalbumoch';
+$lang['included'] = 'vrátane';
+$lang['Invalid password!'] = 'Neplatné heslo!';
+$lang['Language'] = 'Jazyk';
+$lang['last %d days'] = 'posledných %d dní';
+$lang['Last'] = 'Koniec';
+$lang['Logout'] = 'Odhlásiť sa';
+$lang['obligatory'] = 'povinné';
+$lang['Maximum photo height'] = 'Maximálna výška fotografií';
+$lang['Maximum height must be a number superior to 50'] = 'Maximálna výška musí byť číslo väčšie ako 50';
+$lang['Maximum photo width'] = 'Maximálna šírka fotografií';
+$lang['Maximum width must be a number superior to 50'] = 'Maximálna šírka musí byť číslo väčšie ako 50';
+$lang['display a calendar by creation date'] = 'zobraziť v kalendári podľa dátumu vytvorenia';
+$lang['display all photos in all sub-albums'] = 'zobraziť všetky objekty v podalbumoch';
+$lang['return to normal view mode'] = 'návrat do normálneho zobrazenia';
+$lang['display a calendar by posted date'] = 'zobraziť v kalendári podľa dátumu vloženia';
+$lang['month'][10] = 'Október';
+$lang['month'][11] = 'November';
+$lang['month'][12] = 'December';
+$lang['month'][1] = 'Január';
+$lang['month'][2] = 'Február';
+$lang['month'][3] = 'Marec';
+$lang['month'][4] = 'Apríl';
+$lang['month'][5] = 'Máj';
+$lang['month'][6] = 'Jún';
+$lang['month'][7] = 'Júl';
+$lang['month'][8] = 'August';
+$lang['month'][9] = 'September';
+$lang['Most visited'] = 'Najčastejšie zobrazované';
+$lang['display most visited photos'] = 'najčastejšie zobrazované fotografie';
+$lang['The number of photos per page must be a not null scalar'] = 'Počet fotografií na stránke musí byť číslo väčšie ako 0.';
+$lang['Number of photos per page'] = 'Počet fotografií na stránke';
+$lang['Unknown identifier'] = 'Neznámy identifikátor';
+$lang['New password'] = 'Nové heslo';
+$lang['Rate this photo'] = 'Ohodnotiť túto fotografiu';
+$lang['Next'] = 'Nasledujúca';
+$lang['no rate'] = 'bez hodnotenia';
+$lang['Photos posted within the last %d day.'] = 'Fotografie vložené behom posledného %d dňa.';
+$lang['Photos posted within the last %d days.'] = 'Fotografie vložené behom posledných %d dní.';
+$lang['password updated'] = 'heslo aktualizované';
+$lang['Recent period must be a positive integer value'] = 'Aktuálny interval musí byť číslo väčšie ako 0.';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'fotografia';
+$lang['Click on the photo to see it in high definition'] = 'Pre zobrazenie vo vyššom rozlíšení kliknite na fotografiu';
+$lang['Show file metadata'] = 'Zobraziť metadata';
+$lang['Powered by'] = 'Publikované pomocou aplikácie';
+$lang['Preferences'] = 'Nastavenia';
+$lang['Previous'] = 'Predchádzajúca';
+$lang['Random photos'] = 'Náhodný výber';
+$lang['display a set of random photos'] = 'Zobraziť sadu fotografií podľa náhodného výberu';
+$lang['Recent albums'] = 'Nové albumy';
+$lang['display recently updated albums'] = 'zobraziť novo pridané albumy';
+$lang['Recent period'] = 'Doba, počas ktorej sú fotografie zobrazované ako novo pridané';
+$lang['Recent photos'] = 'Nové fotografie';
+$lang['display most recent photos'] = 'zobraziť novo pridané fotografie';
+$lang['Redirection...'] = 'Presmerovanie...';
+$lang['Please, enter a login'] = 'Zadajte prosím prihlasovacie údaje';
+$lang['login mustn\'t end with a space character'] = 'používateľské meno nesmie končiť medzerou';
+$lang['login mustn\'t start with a space character'] = 'používateľské meno nesmie začínať medzerou';
+$lang['this login is already used'] = 'tieto prihlasovacie údaje už sú používané';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail musí byť vo formáte xxx@yyy.eee (napríklad: kovac@zoznam.sk)';
+$lang['please enter your password again'] = 'prosím zadajte znovu heslo';
+$lang['Auto login'] = 'Automatické prihlásenie';
+$lang['remove this tag from the list'] = 'odstrániť toto kľúčové slovo zo zoznamu';
+$lang['representative'] = 'vzorový';
+$lang['Search for Author'] = 'Hľadať autora';
+$lang['Search in albums'] = 'Hľadanie v albumoch';
+$lang['Search by date'] = 'Hľadať podľa dátumu pridania';
+$lang['Date'] = 'Od';
+$lang['End-Date'] = 'Do';
+$lang['Kind of date'] = 'Dátum:';
+$lang['Search for words'] = 'Hľadať slová';
+$lang['Search for all terms'] = 'Hľadať uvedené výrazy ';
+$lang['Search for any term'] = 'Hľadať všetky výrazy';
+$lang['Empty query. No criteria has been entered.'] = 'Neúplný dotaz. Neboli zadané žiadne podmienky pre vyhľadávanie.';
+$lang['Search results'] = 'Výsledky vyhľadávania';
+$lang['Search in sub-albums'] = 'Hľadanie v subalbumoch';
+$lang['searched words : %s'] = 'hľadať slová: %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'nastaviť album ako reprezentatívny';
+$lang['Show number of comments'] = 'Ukázať počet komentárov';
+$lang['Show number of hits'] = 'Ukázať počet zobrazení';
+$lang['slideshow'] = 'automatické prehrávanie';
+$lang['stop the slideshow'] = 'zastaviť automatické prehrávanie';
+$lang['Specials'] = 'Zobraziť';
+$lang['SQL queries in'] = 'SQL dotazov behom';
+$lang['display only recently posted photos'] = 'zobrazí len novo vložené fotografie';
+$lang['return to the display of all photos'] = 'návrat k zobrazeniu všetkých fotografií';
+$lang['the beginning'] = 'začiatok';
+$lang['Interface theme'] = 'Šablona vzhľadu';
+$lang['Thumbnails'] = 'Náhľady';
+$lang['Menu'] = 'Ďalšie funkcie';
+$lang['A comment on your site'] = 'Komentár v Vašim stránkam';
+$lang['today'] = 'dnes';
+$lang['Update your rating'] = 'Aktualizovať hodnotenie';
+$lang['the username must be given'] = 'je nutné zadať používateľské meno';
+$lang['useful when password forgotten'] = 'užitočné pri zabudnutí hesla';
+$lang['Quick search'] = 'Rýchle hľadanie';
+$lang['Connected user: %s'] = 'Pripojený používateľ: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Prehliadač: %s';
+$lang['Author: %s'] = 'Autor: %s';
+$lang['Comment: %s'] = 'Komentár: %s';
+$lang['Comment by %s'] = 'Komentár od %s';
+$lang['User: %s'] = 'Používateľ: %s';
+$lang['Email: %s'] = 'E-mail: %s';
+$lang['Admin: %s'] = 'Administrátor: %s';
+$lang['Registration of %s'] = 'Registrácia %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Zlý stav pre používateľa "hosť", bude použitý východzí stav. Prosím informujte webmastra.';
+$lang['this email address is already in use'] = 'táto e-mailová adresa je už používaná';
+$lang['Album results for'] = 'Výsledky pre album';
+$lang['Tag results for'] = 'Výsledky pre kľúčové slová';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Spustiť prezentáciu';
+$lang['Pause of slideshow'] = 'Zastaviť prezentáciu';
+$lang['Repeat the slideshow'] = 'Opakovať prezentáciu';
+$lang['Not repeat the slideshow'] = 'Neopakovať prezentáciu';
+$lang['Reduce diaporama speed'] = 'Spomaliť';
+$lang['Accelerate diaporama speed'] = 'Zrýchliť';
+$lang['Submit'] = 'Poslať';
+$lang['Yes'] = 'Áno';
+$lang['No'] = 'Nie';
+$lang['%d photo'] = '%d fotografia';
+$lang['%d photos'] = '%d fotografií';
+$lang['%d photo is also linked to current tags'] = '%d fotografia je tiež spojená s aktuálnymi kľúčovými slovami';
+$lang['%d photos are also linked to current tags'] = '%d fotografií je tiež spojených s aktuálnymi kľúčovými slovami';
+$lang['display photos linked to this tag'] = 'Ukázať len fotografie spojené s aktuálnym kľúčovým slovom';
+$lang['photos posted during the last %d days'] = 'fotografie vložené za posledních %d dní';
+$lang['Piwigo Help'] = 'Nápoveda Piwigo';
+$lang['Rank'] = 'Hodnotiť';
+$lang['group by letters'] = 'zoskupiť podľa písmen';
+$lang['letters'] = 'písmená';
+$lang['show tag cloud'] = 'zobraziť kľúčové slová v bubline';
+$lang['cloud'] = 'bublina';
+$lang['Are you sure?'] = 'Ste si istý?';
+$lang['Reset to default values'] = 'Obnoviť východzie hodnoty';
+$lang['delete all photos from your favorites'] = 'vymazať všetky obrázky z Vašich obľúbených';
+$lang['Sent by'] = 'Poslané';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies sú buď blokované, alebo nie sú povolené vo Vašom prehliadači. Musíte povoliť cookies, aby bolo možné sa prihlásiť.';
+$lang['Edit a comment'] = 'Upraviť komentár';
+$lang['(!) This comment requires validation'] = '(!) Tento komentár vyžaduje kontrolu';
+$lang['Welcome'] = 'Vitajte';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Vitajte vo Vašej Piwigo fotogalérii!';
+$lang['... or browse your empty gallery'] = '... alebo prezerajte Vašu prázdnu galériu';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... alebo prosím zrušte túto správu, program nájde spôsob sám';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Vitajte %s, Vaša Piwigo fotogaléria je prázdna!';
+$lang['I want to add photos'] = 'Chcem pridať fotografie';
+$lang['Manage this user comment: %s'] = 'Spravujte tento používateľský komentár: %s';
+$lang['This author modified following comment:'] = 'Tento autor upravil nasledujúci komentár:';
+$lang['This author removed the comment with id %d'] = 'Tento autor zmazal komentár s identifikátorom %d';
+$lang['%d Kb'] = '%d Kb';
+$lang['IP: %s'] = 'IP: %s';
+$lang['%d new comment'] = '%d nový komentár';
+$lang['%d new comments'] = '%d nové komentáre';
+$lang['html tags are not allowed in login'] = 'html znaky nie sú povolené pri prihlásení';
+$lang['%d rates'] = '%d hodnotení';
+$lang['Rating score'] = 'Bodové hodnotenie';
+$lang['Invalid username or email'] = 'Nesprávne meno alebo email';
+$lang['Password reset is not allowed for this user'] = 'Obnova hesla nie je povolená pre tohto používateľa';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Používateľ "%s" nemal zadaný email, obnova hesla nie je možná';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Niekto požiadal o obnovu hesla pre nasledovný používateľský účet:';
+$lang['Username "%s" on gallery %s'] = 'Používateľské meno "%s" v galérii %s';
+$lang['To reset your password, visit the following address:'] = 'Pre obnovu hesla navštívte nasledovnú adresu:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ak to bola chyba, jednoducho ignorujte tento mail a všetko bude v poriadku.';
+$lang['Password Reset'] = 'Obnova hesla';
+$lang['Check your email for the confirmation link'] = 'Skontrolujte Váš email pre potvrdenie linku';
+$lang['Invalid key'] = 'Nesprávny kľúč';
+$lang['The passwords do not match'] = 'Heslo sa nezhoduje';
+$lang['Your password has been reset'] = 'Vaše heslo bolo obnovené';
+$lang['Return to home page'] = 'Návrat na Úvodnú stránku';
+$lang['Please enter your username or email address.'] = 'Prosím vložte Vaše používateľské meno alebo email.';
+$lang['You will receive a link to create a new password via email.'] = 'Obdržíte adresu na vytvorenie nového hesla cez email.';
+$lang['Username or email'] = 'Používateľské meno alebo email';
+$lang['Change my password'] = 'Zmeniť moje heslo';
+$lang['Enter your new password below.'] = 'Nižšie vložte Vaše nové heslo.';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Edit'] = 'Upraviť';
+$lang['Hello %s,'] = 'Ahoj %s,';
+$lang['Send my connection settings by email'] = 'Odoslať moje nastavenia pripojenia emailom';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Úspešná registrácia, obdržíte email s Vašimi nastaveniami pripojenia. Vitajte!';
+$lang['Username modification'] = 'Zmena používateľského mena';
+$lang['Your username has been successfully changed to : %s'] = 'Vaše používateľské meno bolo úspešne zmenené na : %s';
+$lang['square'] = 'Štvorec';
+$lang['thumb'] = 'Náhľad';
+$lang['small'] = 'Malý';
+$lang['medium'] = 'Stredný';
+$lang['large'] = 'Veľký';
+$lang['xlarge'] = 'Väčší';
+$lang['xxlarge'] = 'Najväčší';
+$lang['Original'] = 'Originál';
+$lang['Thank you for registering at %s!'] = 'Ďakujeme za registráciu na %s!';
+$lang['Here are your connection settings'] = 'Tu je Vaše nastavenie pripojenia';
+$lang['Password: %s'] = 'Heslo: %s';
+$lang['Username: %s'] = 'Používateľské meno: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ak si myslíte, že tento mail ste dostali chybne, kontaktujte nás prosím na %s';
+$lang['Show oldest comments first'] = 'Zobraziť staršie komentáre ako prvé';
+$lang['Show latest comments first'] = 'Zobraziť najnovšie komentáre ako prvé';
+$lang['Photo sizes'] = 'Veľkosti fotky';
+$lang['View in'] = 'Ukázať v';
+$lang['Mobile'] = 'Mobile';
+$lang['Desktop'] = 'Desktope';
+$lang['Mobile'] = 'Mobil';
+$lang['2small'] = 'XXS - malé';
+$lang['xsmall'] = 'XS – veľmi malé';
+$lang['File name, A &rarr; Z'] = 'Názov súboru, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Názov súboru, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Názov fotky, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Názov fotky, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Dátum vytvorenia, nové &rarr; staré';
+$lang['Date created, old &rarr; new'] = 'Dátum vytvorenia, staré &rarr; nové';
+$lang['Date posted, new &rarr; old'] = 'Dátum odoslania, nové &rarr; staré';
+$lang['Date posted, old &rarr; new'] = 'Dátum odoslania, staré &rarr; nové';
+$lang['Manual sort order'] = 'Manuálne zoradenie';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Číselný identifikátor, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Číselný identifikátor, 9 &rarr; 1';
+$lang['Rating score, high &rarr; low'] = 'Hodnotenie, vysoké &rarr; nízke';
+$lang['Rating score, low &rarr; high'] = 'Hodnotenie, nízke &rarr; vysoké';
+$lang['Visits, high &rarr; low'] = 'Zobrazenia, vysoké &rarr; nízke';
+$lang['Visits, low &rarr; high'] = 'Zobrazenia, nízke &rarr; vysoké';
+?>
Index: tags/2.4.0RC3/language/sk_SK/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>Existuje niekoľko možností, ako pridať fotografie do Vašej Piwigo galérie:</p>
+
+<ul>
+  <li><strong>priame nahranie</strong> vo Vašom web prehliadači je najjednoduchšia a najpriamejšia cesta. Záleží na možnostiach Vašeho prehliadača a Vašeho web servra.
+  Pre nahranie veľkého množstva fotografií, alebo v prípade, že tento spôsob sklame, sú tu ďalšie možnosti.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Prejdite na priame nahrávanie</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> je aplikácia, ktorú musíte nainštalovať na Váš počítač. Pretiahnite fotografie do okna pLoader, kliknite na <em>"Upload to Piwigo"</em> a nechajte pLoader nahraťt fotografie na server. Existujú taktiež ďalšie aplikácie ako <strong>WinToPiwigo</strong>, alebo <strong>Digikam</strong>, doplnok pre nahrávanie fotografií do Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Prejdite na pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP prenos</strong> je najviac odporúčaná cesta, ako nahrať veľké množstvo fotografií s minimálnym úsilím. Nasledujte návod, ako pripraviť Vaše fotografie. Táto metóda Vám dáva možnosť presne riadiť usporiadanie Vašich fotografií na Vašom servri.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Prejdite na FTP prenos</a></p>
+</div>
Index: tags/2.4.0RC3/language/sk_SK/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/help_groups.html	(revision 14585)
@@ -0,0 +1,8 @@
+<p>Skupiny predstavujú spôsob, ako nastaviť rovnaké oprávnenia pre viacero používateľov.</p>
+
+<p>Vytvorte skupinu pomocou <span class="pwgScreen">Administrácia &raquo; Používatelia &raquo; Skupiny</span> a priraďte používateľov do tejto skupiny pomocou
+<span class="pwgScreen">Administrácie &raquo; Používatelia &raquo;
+Správa</span>.</p>
+
+<p>Používateľ môže patriť do viacerých skupín. Používateľ potom získava práva súčtom práv všetkých týchto skupín: pokiaľ používateľ "janko" patrí do skupín "rodina" aj "priatelia" a len "rodina" má oprávnenie na kategóriu "Vianoce" tak 
+"janko" kategóriu "Vianoce" uvidí.</p>
Index: tags/2.4.0RC3/language/sk_SK/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Akonáhle ste vytvorili Vašu galériu, môžete ju nakonfigurovať pre Vašich návštevníkov.
+<ul>
+    <li>Predvolené zobrazenie ako chcete v <span class="pwgScreen">Administrácia &raquo; Konfigurácia &raquo; Možnosti</span> tab <span class="pwgScreen">Nastavenie návštevníka</span></li>
+    <li>Predvolený motív v <span class="pwgScreen">Administrácia &raquo; Konfigurácia &raquo; Motívy</span></li>
+    <li>Predvolený jazyk v <span class="pwgScreen">Administrácia &raquo; Konfigurácia &raquo; Jazyky</span></li>
+</ul>
+Štandardne každý nový používateľ bude mať tieto základné nastavenia po registrácii.
+</p>
+<p>Ak máte nejaké otázky, Piwigo komunita Vás rada privíta na <a href="http://piwigo.org/forum">jej fórume</a>.</p>
Index: tags/2.4.0RC3/language/sk_SK/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,54 @@
+<fieldset>
+<legend>Oprávnenia na fotografiách</legend>
+
+<p>Každá fotografia má <strong>úroveň súkromia</strong> (zámok). Každý používateľ má úroveň prístupu (kľúč). Existuje 5 úrovní:</p>
+<ol>
+  <li>Žiadna</li>
+  <li><em>Kontakty</em></li>
+  <li><em>Priatelia (vyššia ako kontakty)</em></li>
+  <li><em>Rodina (vyššia ako priatelia)</em></li>
+  <li><em>Adminstrátori (nejvyššia)</em></li>
+</ol>
+
+<p>Vyššie úrovne majú oprávnenia na nižšie úrovne. Pre daného upoužívateľa to znamená, že čím vyššiu úroveň prístupu má, tým viac fotografií vidí.</p>
+
+<p>Napríklad, pokiaľ fotografie "svatba-0011.jpg" má úroveň súkromia <em>"Rodina"</em> tak:</p>
+<ul>
+  <li>Peter (ktorý je <em>"Administrátor"</em>) ju uvidí, protože <em>"Administrátori"</em> môžu vidieť všetky fotografie</li>
+  <li>Barbora (ktorá je <em>"Rodina"</em>) tiež uvidí</li>
+  <li>Mária (ktorá je len <em>"Priateľ"</em>) ale fotografiu neuvidí</li>
+</ul>
+
+<p>Používateľ, ktorý nemá právo vidieť obsah kategórie, neuvidí ani kategóriu ako takú a teda ani jej názov. Rovnaký princíp platí pre kľúčové slová.</p>
+
+<p>Úroveň prístupu (kľúč) môžete nastaviť na obrazovke <span class="pwgScreen">Administrácia &raquo; Používatelia &raquo; Správa</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Oprávnenia na kategóriach</legend>
+
+<p>Pokiaľ Vám vyššie popísané úrovne súkromia nevyhovujú, môžete tiež spravovať oprávnenia pre používateľov a pre skupiny. Môžete spravovať oprávnenia pre používateľov aj pre skupiny naraz, bez rizika, že by došlo ku konfliktom.</p>
+
+<p>Môžete zakázať prístup do kategórií. Prepnite prístup do kategórie na 
+"súkromný" pokiaľ chcete riadiť prístup.</p>
+
+<p>Môžete nastaviť prístup do kategórie na "súkromný" pri editácii jednej kategórie (<span class="pwgScreen">Administrácia &raquo; Kategória &raquo; Správa
+&raquo; editovať</span>), alebo nastavením vlastností pre celý strom kategórií 
+(<span class="pwgScreen">Administrácia &raquo; Kategórie &raquo;
+Vlastnosti &raquo; Verejná / Súkromná</span>).</p>
+
+<p>Keď je prístup do kategórie nastavený na "súkromný", môžete riadiť prístup pre skupiny a používateľov na troch obrazovkách:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Administrácia &raquo; Používatelia &raquo; Správa &raquo;
+  akcia oprávnenia</span></li>
+
+  <li><span class="pwgScreen">Administrácia &raquo; Používatelia &raquo; Skupiny &raquo;
+  akcia oprávnenia</span></li>
+
+  <li><span class="pwgScreen">Administrácia &raquo; Kategória &raquo; Správa &raquo; editovať</span></li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/sk_SK/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>Fotografie sú zobrazené v kategórii, ktorá zodpovedá adresáru, v ktorom sú uložené.</p>
+
+<p>Môžete ale tiež zobraziť rovnakú fotografiu vo viacerých kategóriách bez toho, že by museli byť uložené na servri viackrát. urobíte to tak, že spojíte fotografiu s akoukoľvek inou kategóriou pomocou obrazovky <span class="pwgScreen">Upraviť informácie o fotografii</span>, ktorú môže administrátor vyvolať zo stránky zobrazenia fotografie.</p>
+
+<p>Virtuálne kategórie sú založené na tomto koncepte: nemajú žiaden odpovedajúci adresá na servri. Virtuálne kategórie môžete vytvoriť pomocou <span class="pwgScreen">Administrácia &raquo; Kategória &raquo;
+Správa</span>.</p>
Index: tags/2.4.0RC3/language/sk_SK/help/index.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sk_SK/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/sk_SK/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,102 @@
+<fieldset>
+  <legend>Rýchly návod</legend>
+
+<ol>
+  <li>Vytvorte kategóriu (adresár) na Vašom počítači.</li>  
+
+  <li>Skopírujte nejaké fotografie do tohto adresára, zmeňte ich veľkosť pre zobrazenie na webe. <em>Varovanie</em>: názvy adresárov a súborov musia obsahovať len písmena, čísla, "-", "_" alebo ".". Žiadne medzery alebo znaky s diakritikou.</li>
+
+  <li>Pomocou FTP skopírujte Váš adresár do adresára "galleries" vašej inštalácie  Piwigo.</li>
+
+  <li>Prihláste sa do Vašej Piwigo galérie a prejdite na <span class="pwgScreen">Administrácia &raquo; Nástroje &raquo; Náhľady</span> aby ste vytvorili chýbajúce náhľady.</li>
+
+  <li>Choďte na <span class="pwgScreen">Adminstrácia</span> a stlačte veľké tlačidlo Rýchla miestna synchronizácia.</li>
+</ol>
+
+Gratulujeme! Práve ste vytvorili vašu prvú galériu fotografií vo Vašej Piwigo galérii.
+</fieldset>
+
+<fieldset>
+  <legend>Organizácia súborov a adresárov</legend>
+
+<ul>
+
+  <li>
+
+    <p>Adresáre kategórií sú v Piwigo adresári 
+    "galleries". Tu je ukážka malej adresárovej štruktúry Piwigo (ktorá ale využívá veľa vlastností Piwigo):</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- kategoria-1
+|   |   |-- kategoria-1.1
+|   |   |   |-- kategoria-1.1.1
+|   |   |   |   |-- kategoria-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- svatba.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-svatba.jpg
+|   |   |   |   |   +-- svatba.jpg
+|   |   |   |   +-- kategoria-1.1.1.2
+|   |   |   +-- kategoria-1.1.2
+|   |   |-- kategoria-1.2
+|   |   |   |-- slon.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-slon.jpg
+|   |   +-- kategoria-1.3
+|   +-- kategoria-2
+|       |-- teliatko.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-teliatko.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+
+  <li>Okrem adresárov pomenovaných "thumbnail", "pwg_high" alebo "pwg_representative" (čítajte vysvetlenie nižšie), každý adresár v "galleries" vytvorí kategóriu. Nie je tu omedzenie hĺbky adresárov.</li>
+
+  <li>Každý element kategórie je reprezentovaný súborom. Súbor môže byť elementom Piwigo pokiaľ jeho prípona odpovedá parametru konfigurácie <code>file_ext</code>
+  (viz. súbor <span
+  class="filename">include/config_default.inc.php</span>). Súbor môže byť obrázok (fotografia) ak jeho prípona je uvedená v parametri <code>picture_ext</code>.</li>
+
+  <li>Obrázky musia mať priradený náhľad (viz. sekcia o náhľadoch nižšie)</li>
+
+  <li>Obrázky môžu mať priradenú verziu vo vysokej kvalite. Ako napríklad svatba.jpg v príklade vyššie. Verzia vo vysokej kvalite nemá, na rozdiel od náhľadu, žiaden prefix v názve.</li>
+
+  <li>Elementy, ktoré nie sú obrázky (video, zvuk, textové súbory, čokoľvek chcete...) majú ako východzí náhľad ikonu, ktorá odpovedá ich prípone. Voliteľne môžete priradiť náhľad a reprezentatívny súbor (viď. video.avi v príklade vyššie).</li>
+
+  <li><em>Varovanie</em>: názvy adresárov a súborov musia obsahovať len písmená, čísla, "-", "_" alebo ".". Žiadne medzery alebo znaky s diakritikou.</li>
+
+  <li>Keď sú elementy, obrázky, náhľady a reprezentatívne súbory umiestnené v adresárovej štruktúre, prejdite na: <span class="pwgScreen">Administrácia &raquo; Kategória &raquo;
+  Synchronizácia</span></li>
+
+</ul>
+</fieldset>
+
+<fieldset>
+  <legend>Náhľady</legend>
+<ul>
+
+  <li>Všetky obrázky (fotografie) musia mať priradený náhľad.</li>
+
+  <li>Náhľady sú umiestnené v podadresári "thumbnail", ktorý je v adresári kategórie. Náhľad má rovnaký názov ako jemu odpovídajúci obrázok s prefixom podľa konfiguračného parametra <code>prefix_thumbnail</code> (viď. <span class="filename">include/config.inc.php</span>).</li>
+
+  <li>Náhľad nemusí mať nutne rovnakú príponu ako jemu odpovedajúcí obrázok (napríklad ".jpg", obrázok môže mať náhľad s ".GIF" príponou).</li>
+
+  <li>Odporúčame použiť externú aplikáciu pre tvorbu náhľadov.</li>
+
+  <li>Vytváranie náhľadov pomocou Piwigo môže viesť k zlej kvalite vytvorených náhľadov, protože tá závisí na zdrojoch servra (a toto môže byť na zdielaných servroch (webhosting) problém).
+
+  <li>Pokiaľ budete aj tak vytvárať náhľady pomocou Piwigo na servri, tak musíte povoliť prístup pre zápis do všetkých adresárov "galleries" a všetkých podadresárov.</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/sk_SK/index.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sk_SK/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/install.lang.php	(revision 14585)
@@ -0,0 +1,76 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Inštalácia';
+$lang['Basic configuration'] = 'Základná konfigurácia';
+$lang['Default gallery language'] = 'Základný jazyk galérie';
+$lang['Database configuration'] = 'Databázová konfigurácia';
+$lang['Admin configuration'] = 'Administrátorská konfigurácia';
+$lang['Start Install'] = 'Spustiť inštaláciu';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mailová adresa musí mať formát xxx@yyy.eee (napríklad : kovac@zoznam.sk)';
+$lang['Webmaster login'] = 'Používateľské meno správcu';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bude zobrazený návštevníkom. Je nutný pre administráciu aplikácie.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Spojenie na server sa podarilo, ale nebolo možné pripojiť databázu';
+$lang['Can\'t connect to server'] = 'Nebolo možné sa pripojiť k serveru';
+$lang['Host'] = 'MySQL server';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.sk';
+$lang['User'] = 'Používateľ';
+$lang['user login given by your host provider'] = 'používateľské meno, ktoré Vám pridelil prevádzkovateľ serveru';
+$lang['Password'] = 'Heslo';
+$lang['user password given by your host provider'] = 'heslo na tomto serveri';
+$lang['Database name'] = 'Názov databázy';
+$lang['also given by your host provider'] = 'ktorý na tomto servri';
+$lang['Database table prefix'] = 'Predpona názvov databázových tabuliek';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'názvy vytvorených databázových tabuliek budú označené predponou (pre ich jednoduchšiu správu)';
+$lang['enter a login for webmaster'] = 'zadať používateľské meno webmastra';
+$lang['webmaster login can\'t contain characters \' or "'] = 'používateľské meno správcu nemôže obsahovať znak \' alebo "';
+$lang['please enter your password again'] = 'prosím zadať znovu heslo';
+$lang['Webmaster password'] = 'Heslo webmastra';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Heslo majte utajené, umožní Vám prístup do administrácie aplikácie';
+$lang['Password [confirm]'] = 'Heslo [potvrdenie]';
+$lang['verification'] = 'kontrola';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Potrebujete pomoc? Opýtajte sa na <a href="%s">Piwigo fóre</a>.';
+$lang['Webmaster mail address'] = 'E-mail webmastra';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Návštevníci môžu pomocou tohto e-mailu kontaktovať správcu';
+$lang['PHP 5 is required'] = 'Je nutné PHP 5';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Na Vašom webhostingu je PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo sa môže pokúsiť zmeniť Vaše nastavenie na PHP 5 tým, že vytvorí alebo zmení súbor .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Prípadne môžete zmeniť Vašu konfiguráciu sami a potom reštartovať Piwigo.';
+$lang['Try to configure PHP 5'] = 'Pokúste sa zmeniť Vaše nastavenie na PHP 5';
+$lang['Sorry!'] = 'Bohužiaľ!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo nebolo schopné zmeniť Vaše nastavenie na PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Obráďte sa na poskytovateľa Vašeho webhostingu, aby ste zistili, ako môžete zmeniť Vaše nastavenie na PHP 5.';
+$lang['Hope to see you back soon.'] = 'Veríme, že sa čoskoro uvidíme.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulujeme, Piwigo inštalácia je ukončená';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Náhradným riešením je skopírovať text z boxu vyššie a vložiť ho do súboru "local/config/database.inc.php" (Upozornenie: súbor database.inc.php môže obsahovať len to, čo je v tomto boxe, žiadne znaky odriadkovania alebo medzery)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Vytvorenie súboru local/config/database.inc.php sa nepodarilo.';
+$lang['Download the config file'] = 'Stiahnuť konfiguračný súbor';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Môžete stiahnuť konfiguračný súbor a nahrať ho do adresára local/config Vašej inštalácie.';
+$lang['Just another Piwigo gallery'] = 'Len iná Piwigo galéria';
+$lang['Welcome to my photo gallery'] = 'Vitajte v mojej foto galérii';
+$lang['Welcome to your new installation of Piwigo!'] = 'Vitajte vo Vašej novej inštalácii Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Neváhajte konzultovať na našom fóre každú pomoc: %s'; 
+?>
Index: tags/2.4.0RC3/language/sk_SK/iso.txt
===================================================================
--- tags/2.4.0RC3/language/sk_SK/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Slovensky [SK]
Index: tags/2.4.0RC3/language/sk_SK/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/sk_SK/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sk_SK/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,45 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// | Czech language localization                                           |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2009     Pavel Budka & Petr Jirsa    http://pbudka.co.cc |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = 'Aktualizácia';
+$lang['Upgrade from version %s to %s'] = 'Aktualizácia z verzie %s na %s';
+$lang['Statistics'] = 'Štatistika';
+$lang['total upgrade time'] = 'celkový čas aktualizácie';
+$lang['total SQL time'] = 'celkový čas SQL';
+$lang['SQL queries'] = 'SQL otázky';
+$lang['Upgrade informations'] = 'Informácie o aktualizácii';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Vykonanie kontroly údržby v [Administrácia>Nástroje>Údržba] ak narazíte na problém.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Len administrátor môže spustiť aktualizáciu: prosím prihláste sa nižšie.';
+$lang['You do not have access rights to run upgrade'] = 'Nemáte prístupové práva na spustenie aktualizácie';
+$lang['All sub-albums of private albums become private'] = 'Všetky subalbumy súkromných albumov budú súkromné';
+$lang['User permissions and group permissions have been erased'] = 'Používateľské oprávnenia a oprávnenia skupín boli vymazané';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Z predchádzajúcej konfigurárie boli zachované len predpony náhľadov a mailová adresa webmastra.';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Navrhujeme aktualizovať databázu Vašej galérie Piwigo zo staršej na novú verziu.
+Asistent aktualizácie sa domnieva, že aktuálne používate <strong>verziu %s</strong> (alebo obdobnú).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Ako predbežné opatrenie boli deaktivované nasledujúce doplnky. Prosím skontrolujte aktualizácie týchto doplnkov predtým než ich znovu aktivujete:';$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'V <i>%s</i>, pred <b>?></b>, vložením:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Z opatrnosti boli nasledovné témy deaktivované. Musíte skontrolovať aktualizácie tém pred ich reaktiváciou:';
+
+?>
Index: tags/2.4.0RC3/language/sl_SL/about.html
===================================================================
--- tags/2.4.0RC3/language/sl_SL/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/sl_SL/about.html	(revision 14585)
@@ -0,0 +1,15 @@
+<p>Piwigo foto galerija</p>
+
+<p>Piwigo je foto galerija za splet, zgrajena s pomočjo aktivne skupnosti uporabnikov in razvijalcev.
+   Preko razširitev je možno piwigo na enostaven način prilagoditi svojim zahtevam.
+   Piwigo je odprto kodni projekt in je zastonj.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Obiščite Piwigo spletno stran</a></p>
+
+
+<p>Slovenski prevod vzdržujejo (v abecednem vrstnem redu ):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=">Klemen</a></li>
+</ul>
+           .... zahvala vsem</p>
Index: tags/2.4.0RC3/language/sl_SL/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/sl_SL/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sl_SL/admin.lang.php	(revision 14585)
@@ -0,0 +1,247 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['%d album including'] = '%d album vsebuje';
+$lang['%d album moved'] = '%d album je bil premaknjen';
+$lang['%d albums including'] = '%d albumov vsebuje';
+$lang['%d albums moved'] = '%d albumov je bilo premaknjenih';
+$lang['%d anomalies have been detected corrected.'] = '%d anomalij je bilo zaznanih in odpravljenih.';
+$lang['%d anomalies have been detected.'] = '%d anomalij je bilo zaznanih.';
+$lang['%d anomalies have been ignored.'] = '%d anomalij je bilo ignoriranih.';
+$lang['%d anomalies have not been corrected.'] = '%d anomalij ni bilo odpravljenih.';
+$lang['%d anomaly has been corrected.'] = '%d anomalija je bila odpravljena.';
+$lang['%d anomaly has been detected.'] = '%d anomalija je bila zaznana.';
+$lang['%d anomaly has been ignored.'] = '%d anomalija je bila ignorirana.';
+$lang['%d anomaly has not been corrected.'] = '%d anomalija ni bila odpravljena.';
+$lang['%d association'] = '%d asocijacija';
+$lang['%d associations'] = '%d asocijacij';
+$lang['%d group'] = '%d skupina';
+$lang['%d groups'] = '%d skupine';
+$lang['%d guest'] = '%d gost';
+$lang['%d guests'] = '%d gostov';
+$lang['%d line filtered'] = '%d vrstica filtrirana';
+$lang['%d lines filtered'] = '%d vrstic filtriranih';
+$lang['ACCESS_0'] = 'Prosti dostop';
+$lang['ACCESS_1'] = 'Dsotop do vsega';
+$lang['ACCESS_2'] = 'Dostop za registrirane uporabnike';
+$lang['ACCESS_3'] = 'Dostop za administratorje';
+$lang['ACCESS_4'] = 'Dostop za spletne skrbnike';
+$lang['ACCESS_5'] = 'Brez dostopa';
+$lang['Action'] = 'Akcija';
+$lang['Actions'] = 'Akcije';
+$lang['Activate field "%s"'] = 'Aktiviraj polje "%s"';
+$lang['Activate icon "%s"'] = 'Aktiviraj ikono "%s"';
+$lang['Activate Navigation Bar'] = 'Aktiviraj navigacijsko vrstico';
+$lang['Activate Navigation Thumbnails'] = 'Aktiviraj navigacijo za predoglede';
+$lang['Activate'] = 'Aktiviraj';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktiviraj ikono "novo" poleg albumov in slik';
+$lang['Active Languages'] = 'Aktiviraj jezike';
+$lang['Active Plugins'] = 'Aktiviraj ';
+$lang['Active Themes'] = 'Aktiviraj teme';
+$lang['Add a criteria'] = 'Dodaj kriterij';
+$lang['Add a filter'] = 'Dodaj filter';
+$lang['Add a tag'] = 'Dodaj znacko';
+$lang['clean'] = 'pobrii';
+$lang['Comments for all'] = 'Komentarji za vse';
+$lang['Complementary mail content'] = 'Komplementarna vsebina pote';
+$lang['Configuration'] = 'Konfiguracija';
+$lang['confirm'] = 'potrdi';
+$lang['Continue processing treatment'] = 'Nadaljuj z obdelavo';
+$lang['Correction applied with error'] = 'Popravek namecen z napako';
+$lang['Correction applied with success'] = 'Popravek uspeno namecen';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Odpravljene anomalije ne bodo vec ignorirane.';
+$lang['Correction'] = 'Popravek';
+$lang['create a new album'] = 'ustvari nov album';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Ustvari novo stran : (URL naj kae na create_listing_file.php)';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Ustvari imenik "%s" v korenu Piwigo intalacije.';
+$lang['Create this site'] = 'Ustvari stran';
+$lang['delete album'] = 'odstrani album';
+$lang['Delete orphan tags'] = 'Odstrani neuporabljene znacke';
+$lang['delete photo'] = 'odstrani sliko';
+$lang['Delete Representant'] = 'Odstrani Representant';
+$lang['Delete selected photos'] = 'Odstrani izbrane slike';
+$lang['Delete selected tags'] = 'Odstrani izbrane znacke';
+$lang['Delete selected users'] = 'Odstrani izbrane uporabnike';
+$lang['Delete this language'] = 'Odstrani jezik';
+$lang['delete this site and all its attached elements'] = 'odstrani stran in pripadajoce podatke';
+$lang['Delete this theme'] = 'Odstrani temo';
+$lang['delete'] = 'odstrani';
+$lang['Deleted on'] = 'Odstranjeno';
+$lang['deleted'] = 'odstranjeno';
+$lang['Deletions'] = 'Odstrani';
+$lang['Deny selected groups'] = 'Prepreci dostop izbranim skupinam';
+$lang['Deny selected users'] = 'Prepreci dostop izbranim uporabnikom';
+$lang['Description'] = 'Opis';
+$lang['Average rate'] = 'Povprecje';
+$lang['Rate'] = 'Glasuj';
+$lang['Album "%s" has been added'] = 'Album "%s" je bil dodan';
+$lang['Album "%s" now contains %d photos'] = 'Album "%s" vsebuje %d slik';
+$lang['Album photos associated to the following albums: %s'] = 'Slike albuma pripadajo naslednjim albumom: %s';
+$lang['Album list management'] = 'Upravljanje seznama albuma';
+$lang['Album manual order was saved'] = 'Rocna nastavitev sortiranja albuma, uspeno shranjena';
+$lang['Album name'] = 'Ime albuma';
+$lang['Album updated successfully'] = 'Album uspeno popravljen';
+$lang['albums added in the database'] = 'albumi dodani v bazo';
+$lang['Albums automatically sorted'] = 'Albumi so bili avtomaticno sortirani';
+$lang['albums deleted in the database'] = 'albumi odstranjeni iz baze';
+$lang['Access type'] = 'Tip dostopa';
+$lang['Add a user'] = 'Dodaj uporabnika';
+$lang['Add a virtual album'] = 'Dodaj virtualni album';
+$lang['Add another set of photos'] = 'Dodaj nov nabor slik';
+$lang['Add detailed content'] = 'Dodaj vsebino';
+$lang['Add group'] = 'Dodaj skupino';
+$lang['Add New Language'] = 'Dodaj nov jezik';
+$lang['add new photos to caddie'] = 'dodaj nove slike v caddie';
+$lang['Add New Theme'] = 'Dodaj novo temo';
+$lang['Add Photos'] = 'Dodaj slike';
+$lang['Add write access to the "%s" directory'] = 'Dodaj pravico pisanja "%s" imeniku';
+$lang['Add'] = 'Dodaj';
+$lang['Add/delete a permalink'] = 'Dodaj/odstrani povezavo';
+$lang['added'] = 'dodano'; 
+$lang['%d tag'] = '%d znacka';
+$lang['%d tags'] = '%d znacke';
+$lang['%d user comment rejected'] = '%d komentar zavrnjen';
+$lang['%d user comment validated'] = '%d komentar validiran';
+$lang['%d user comments rejected'] = '%d komentarjev zavrnjenih';
+$lang['%d user comments validated'] = '%d komentarjev validiranih';
+$lang['%d user deleted'] = '%d uporabnik odstranjen';
+$lang['%d user was not updated.'] = '%d uporabnik ni bil posodobljen.';
+$lang['%d user was updated.'] = '%d uporabnik posodobljen.';
+$lang['%d user'] = '%d uporabnik';
+$lang['%d users deleted'] = '%d uporabnikov odstranjenih';
+$lang['%d users were not updated.'] = '%d uporabnikov ni bilo posodobljenih.';
+$lang['%d users were updated.'] = '%d uporabnikov posodobljenih.';
+$lang['%d users'] = '%d uporabnikov';
+$lang['%d waiting for validation'] = '%d cakam na validacijo';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s mora biti nastavljeno na false v datoteki local/config/config.inc.php';
+$lang['%s value is not correct file because exif are not supported'] = '%s vrednost je neveljavna, exif ni podprt';
+$lang['+ Add an upload box'] = '+ Dodaj upload';
+$lang[', click on'] = ', klikni na';
+$lang[' and %d virtual'] = ' in %d navidezen';
+$lang['%d mail was not sent.'] = '%d mail ni bil poslan.';
+$lang['%d mail was sent.'] = '%d mail poslan.';
+$lang['%d mails were not sent.'] = '%d mailov ni bilo poslanih.';
+$lang['%d mails were sent.'] = '%d mailov poslanih.';
+$lang['%d member'] = '%d clan';
+$lang['%d members'] = '%d clanov';
+$lang['%d of %d photos selected'] = '%d od %d slik izbranih';
+$lang['%d parameter was updated.'] = '%d parameter popravljen.';
+$lang['%d parameters were updated.'] = '%d parametrov popravljenih.';
+$lang['%d photo was deleted'] = '%d slika odstranjena';
+$lang['%d photos uploaded'] = '%d slik naloenih';
+$lang['%d photos were deleted'] = '%d slik  odstranjenih';
+$lang['%d physical'] = ' %d fizicen';
+$lang['A local listing.xml file has been found for'] = 'Lokalna datoteka listing.xml je bila najdena za';
+$lang['A new version of Piwigo is available.'] = 'Dostopna je nova verzija Piwigo.';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'koncnica datoteke zahteva sliko za predogled. Slika za predogled se mora nahajati v podimeniku "thumbnail", v imeniku v katerem se nahaja tudi album. Datoteka s predogledom se mora zaceti z vnaprej dolocenim prefixom in koncnica datoteke mora biti ena izmed seznama naslednjih koncnic: ';
+$lang['Administration Home'] = 'Administracija';
+$lang['Advanced features'] = 'Napredne monosti';
+$lang['Albums authorized thanks to group associations'] = 'Albums authorized thanks to group associations';
+$lang['All %d photos are selected'] = 'Vseh %d slik je izbranih';
+$lang['All optimizations have been successfully completed.'] = 'Vsi optimizacijski postopki uspeno zakljuceni.';
+$lang['all'] = 'vsi';
+$lang['Allow rating'] = 'Dovoli glasovanje';
+$lang['Allow user customization'] = 'Dovoli uporabniku prilagoditev';
+$lang['Allow user registration'] = 'Dovoli registracijo uporabnika';
+$lang['Allow users to delete their own comments'] = 'Dovoli uporabniku brisanje lastnih komentarjev';
+$lang['Allow users to edit their own comments'] = 'Dovoli uporabnikom popravljanje lastnih komentarjev';
+$lang['an error happened'] = 'prilo je do napake';
+$lang['An error occured during extraction (%s).'] = 'Prilo je do napake med ekstrahiranjem (%s).';
+$lang['An information email was sent to group "%s"'] = 'Informativni mail je bil poslan skupini "%s"';
+$lang['and'] = 'in';
+$lang['Anomaly'] = 'Nepravilnost';
+$lang['General statistics'] = 'Splona statistika';
+$lang['generate file listing.xml on remote site'] = 'generiraj datoteko listing.xml na oddaljeni strani';
+$lang['generate listing'] = 'generiraj izpis';
+$lang['generated in'] = 'generirano v';
+$lang['Get Support on Piwigo Forum'] = 'Za vec pomoci pojdi na Piwigo forum';
+$lang['global mode'] = 'globalni nacin';
+$lang['Go to %s or %s for more informations'] = 'Pojdi na %s ali %s za vec informacij';
+$lang['Go to'] = 'Pojdi na';
+$lang['Grant selected groups'] = 'Odobri izbrane skupine';
+$lang['Grant selected users'] = 'Odobri izbrane uporabnike';
+$lang['group "%s" added'] = 'skupina "%s" dodana';
+$lang['group "%s" deleted'] = 'skupina "%s" odstranjena';
+$lang['group "%s" updated'] = 'skupina "%s" popravljena';
+$lang['Group management'] = 'Upravljanje skupin';
+$lang['Group name'] = 'Ime skupine';
+$lang['Group'] = 'Skupina';
+$lang['Groups'] = 'Skupine';
+$lang['Guest cannot be deleted'] = 'Gost ne more biti odstranjen';
+$lang['Guest Settings'] = 'Nastavitve gosta';
+$lang['guest'] = 'gost';
+$lang['Guests'] = 'Gosti';
+$lang['height must be a number superior to'] = 'viina mora biti tevilka, vecja od ';
+$lang['Hello'] = 'Pozdravljen';
+$lang['Hello,'] = 'Pozdravljen,';
+$lang['Help Me'] = 'Pomagaj mi';
+$lang['Hide'] = 'Skrij';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Samo skrbnik lahko vidi ta jezicek.';
+$lang['Apply action'] = 'Potrdi akcijo';
+$lang['Apply selected corrections'] = 'Potrdi izbrane popravke';
+$lang['Apply to sub-albums'] = 'Potrdi na vsemi pod-albumi';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ali res elite namestiti posodobitev ? Potrebno je preveriti, ce nova verzija ne zahteva odstranitev trenutno namecene.';
+$lang['Are you sure you want to delete this plugin?'] = 'Ali res elite odstraniti  vticnik?';
+$lang['Are you sure you want to install this plugin?'] = 'Ali res elite namestiti  vticnik?';
+$lang['Associate to album'] = 'Associate to album';
+$lang['associate to group'] = 'associate to group';
+$lang['Associated'] = 'Associated';
+$lang['Authorize users to add comments on selected albums'] = 'Avtoriziraj uporabnike za dodajanje komentarjev na izbranih albumih';
+$lang['Authorized'] = 'Avtoriziran';
+$lang['Automatic correction'] = 'Avtomatski popravki';
+$lang['automatic order'] = 'avtomatsko sortiranje';
+$lang['Available only with HTML format'] = 'Na voljo le v HTML obliki';
+$lang['average time'] = 'povprecen cas';
+$lang['Batch Manager'] = 'Paketni upravljalec';
+$lang['between'] = 'med';
+$lang['Bound Theme'] = 'Povezana tema';
+$lang['By %s'] = 'Po %s';
+$lang['By rank'] = 'Po oceni';
+$lang['%s has been successfully updated.'] = '%s je bil uspeno posodobljen.';
+$lang['%s photos can not be regenerated'] = '%s slik se ne da regenerirat';
+$lang['%s photos have been regenerated'] = '%s slike so bile regenerirane';
+$lang['%s thumbnails can not be regenerated'] = '%s predogledov se ne da regenerirat';
+$lang['%s thumbnails have been regenerated'] = '%s predogledi so bili regenerirani';
+$lang['(this tag will be deleted)'] = '(ta znacka bo odstranjena)';
+$lang['... or '] = '... ali ';
+$lang['Add tags'] = 'Dodaj znacke';
+$lang['Add to caddie'] = 'Add to caddie';
+$lang['All extensions are up to date.'] = 'Vse raziritve so posodobljene.';
+$lang['All languages are up to date.'] = 'Vsi jeziki so posodobljeni.';
+$lang['All plugins are up to date.'] = 'Vsi vticniki so posodobljeni.';
+$lang['All themes are up to date.'] = 'Vse teme so posodobljene.';
+$lang['Allowed file types: %s.'] = 'Dovoljeni tipi datotek so: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Prilo je do napake med ekstrahiranjem. Prosim preverite pravice datotek, vae piwigo intalacije.<br><a href="%s">Za prikaz loga, kliknite tukaj.</a>.';
+$lang['An error has occured during upgrade.'] = 'Prilo je do napake med nadgrajevanjem.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Priblina maksimalna resolucija: %dM pik (to je %dx%d pik).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = ' Privzeto bo Piwigo ustvaril nove web slike  iz HD locljivosti vaih slik.';
+
+
+$lang['Can\'t connect to server.'] = 'Ne morem vzpostaviti povezave s streÅ¾nikom.';
+$lang['Can\'t create temporary file.'] = 'Ne morem ustvariti zaÄasne datoteke.';
+$lang['Check all'] = 'Preveri vse';
+$lang['Choose an action'] = 'Izberi akcijo';
+$lang['Create'] = 'Ustvari';
+$lang['created'] = 'ustvarjeno';
+?>
Index: tags/2.4.0RC3/language/sl_SL/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/sl_SL/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sl_SL/common.lang.php	(revision 14585)
@@ -0,0 +1,383 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Slovenšcina [SL]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=453
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = 'slovenščina';
+$lang_info['country'] = 'Slovenija';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'sl';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d kategorija popravljena';
+$lang['%d albums updated'] = '%d kategorij popravljenih';
+$lang['%d comment to validate'] = '%d komentar za preveriti';
+$lang['%d comments to validate'] = '%d komentarjev za preveriti';
+$lang['%d new comment'] = '%d novi komentar';
+$lang['%d new comments'] = '%d novih komentarjev';
+$lang['%d comment'] = '%d komentar';
+$lang['%d comments'] = '%d komentarjev';
+$lang['%d hit'] = '%d zadetek';
+$lang['%d hits'] = '%d zadetkov';
+$lang['%d new user'] = '%d novi uporabnik';
+$lang['%d new users'] = '%d novih uporabnikov';
+$lang['About'] = 'Vizitka';
+$lang['All tags'] = 'Vse označbe';
+$lang['Any tag'] = 'Katerakoli označba';
+$lang['At least one listed rule must be satisfied.'] = 'Vsaj eno pravilo mora biti izpolnjeno.';
+$lang['Author'] = 'Avtor';
+$lang['Albums'] = 'Kategorije';
+$lang['Album'] = 'Kategorija';
+$lang['Close this window'] = 'Zapri okno';
+$lang['Confirm Password'] = 'Potrdi geslo';
+$lang['Connection settings'] = 'Nastavitve povezave';
+$lang['Contact webmaster'] = 'Kontaktiraj skrbnika';
+$lang['Create a new account'] = 'Ustvari nov račun';
+$lang['Created on'] = 'Ustvarjeno';
+$lang['Creation date'] = 'Ustvarjeno';
+$lang['Current password is wrong'] = 'Napačno geslo';
+$lang['Dimensions'] = 'Dimenzije';
+$lang['Display'] = 'Zaslon';
+$lang['%d new photo'] = '%d nova slika';
+$lang['%d new photos'] = '%d novih slik';
+$lang['Complete RSS feed (photos, comments)'] = 'RSS vir (slike, komentarji)';
+$lang['Login'] = 'Prijava';
+$lang['Each listed rule must be satisfied.'] = 'Vsa pravila morajo biti izpolnjena.';
+$lang['Email address'] = 'E-pošta';
+$lang['Enter your personnal informations'] = 'Vnesite svoje osebne podatke';
+$lang['Error sending email'] = 'Napaka pri pošiljanju pošte';
+$lang['File name'] = 'Ime datoteke';
+$lang['File'] = 'Datoteka';
+$lang['Filesize'] = 'Velikost datoteke';
+$lang['Filter and display'] = 'Filter in prikaz';
+$lang['Filter'] = 'Filter';
+$lang['Forgot your password?'] = 'Si pozabil geslo?';
+$lang['Go through the gallery as a visitor'] = 'Obiskaj galerijo kot obiskovalec';
+$lang['Help'] = 'Pomoč';
+$lang['Identification'] = 'Identifikacija';
+$lang['Photos only RSS feed'] = 'RSS vir (samo slike)';
+$lang['Keyword'] = 'Ključna beseda';
+$lang['Links'] = 'Povezave';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Nov na %s';
+$lang['Notification'] = 'Obvestilo';
+$lang['Number of items'] = 'Število ';
+$lang['Original dimensions'] = 'Originalna velikost';
+$lang['Password forgotten'] = 'Pozabljeno geslo';
+$lang['Password'] = 'Geslo';
+$lang['Post date'] = 'Datum objave';
+$lang['Posted on'] = 'Objavljeno';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Hitra povezava';
+$lang['RSS feed'] = 'RSS vir';
+$lang['Register'] = 'Registracija';
+$lang['Registration'] = 'Registracija';
+$lang['Unknown feed identifier'] = 'Neznan identifikator vira';
+$lang['User comments'] = 'Komentarji uporabnika';
+$lang['Username'] = 'Uporabniško ime';
+$lang['Visits'] = 'Obiski';
+$lang['Webmaster'] = 'Skrbnik';
+$lang['Week %d'] = 'Teden %d';
+$lang['About Piwigo'] = 'O Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Niste avtorizirani za dostop do zahtevane strani';
+$lang['add this photo to your favorites'] = 'dodaj sliko med svoje priljubljene';
+$lang['Administration'] = 'Administracija';
+$lang['all'] = 'vse';
+$lang['ascending'] = 'naraščujoce';
+$lang['author(s) : %s'] = 'avtor(ji) : %s';
+$lang['Expand all albums'] = 'Razširi vse kategorije';
+$lang['posted after %s (%s)'] = 'naloženo po %s (%s)';
+$lang['posted before %s (%s)'] = 'naloženo pred %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'naloženo med %s (%s) in %s (%s)';
+$lang['posted on %s'] = 'naloženo na %s';
+$lang['Best rated'] = 'Najbolje ocenjene';
+$lang['display best rated photos'] = 'prikaži najbolje ocenjene slike';
+$lang['Calendar'] = 'Koledar';
+$lang['All'] = 'Vse';
+$lang['display each day with photos, month per month'] = 'prikaži slike po dnevih in mesecih'; 
+$lang['View'] = 'Pogled';
+$lang['chronology_monthly_calendar'] = 'Mesečni koledar';
+$lang['chronology_monthly_list'] = 'Mesečni seznam';
+$lang['chronology_weekly_list'] = 'Tedenski seznam';
+$lang['Click here if your browser does not automatically forward you'] = 'Če vas brskalnik ni preusmeril, kliknite tukaj.';
+$lang['comment date'] = 'komentarji po datumih';
+$lang['Comment'] = 'Komentar';
+$lang['Your comment has been registered'] = 'Vaš komentar je bil zabeležen';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistem : prosim počakajte trenutek, preden oddate nov komentar';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Vaš komentar ni bil zabeležen, saj ne ustreza validacijskim pravilom';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Administrator mora pregledati vaš komentar, preden le-ta postane viden.';
+$lang['This login is already used by another user'] = 'Ta prijava je že uporabljena s strani drugega uporabnika';
+$lang['Comments'] = 'Komentarji';
+$lang['Add a comment'] = 'Dodaj komentar';
+$lang['created after %s (%s)'] = 'kreirano po %s (%s)';
+$lang['created before %s (%s)'] = 'kreirano pred %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'kreirano med %s (%s) in %s (%s)';
+$lang['created on %s'] = 'kreirano na %s';
+$lang['Customize'] = 'Prilagodi';
+$lang['Your Gallery Customization'] = 'Prilagodi svojo galerijo';
+$lang['Related tags'] = 'Sorodne označbe';
+$lang['Reset'] = 'Ponastavi';
+$lang['Retrieve password'] = 'Pridobi geslo';
+$lang['Search rules'] = 'Iskalni kriteriji';
+$lang['Search tags'] = 'Iskalne označbe';
+$lang['Search'] = 'Išci';
+$lang['display available tags'] = 'Prikaži možne označbe';
+$lang['Since'] = 'Odkar';
+$lang['Sort by'] = 'Uredi po';
+$lang['Sort order'] = 'Urejeno po';
+$lang['Tag'] = 'Označba';
+$lang['Tags'] = 'Označbe';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS viri omogočajo prijavo na dogodke te spletne strani, kot so: nove slike, nove kategorije, novi komentarji. Za uporabo je potreben RSS odjemalec.';
+$lang['Default'] = 'Privzeto';
+$lang['delete this photo from your favorites'] = 'odstrani to sliko iz svojih priljubljenih';
+$lang['Delete'] = 'Odstrani';
+$lang['descending'] = 'padajoče';
+$lang['Download'] = 'snami';
+$lang['Download this file'] = 'snami to datoteko';
+$lang['edit'] = 'uredi';
+$lang['wrong date'] = 'napačen datum';
+$lang['excluded'] = 'izključen';
+$lang['Your favorites'] = 'Moje priljubljene';
+$lang['display your favorites photos'] = 'prikaži moje priljubljene slike';
+$lang['Favorites'] = 'Priljubljene';
+$lang['First'] = 'Prva';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Stran je v vzdrževanju. Prosim, oglasite se kasneje.';
+$lang['Page generated in'] = 'Stran naložena v';
+$lang['guest'] = 'gost';
+$lang['Hello'] = 'Pozdravljen';
+$lang['available for administrators only'] = 'dovoljeno samo za administratorje';
+$lang['display this album'] = 'prikaži slike na najvišjem nivoju te kategorije';
+$lang['display last user comments'] = 'Prikaži zadnje komentarje uporabnika';
+$lang['customize the appareance of the gallery'] = 'prilagodi izgled galerije';
+$lang['search'] = 'išči';
+$lang['Home'] = 'Domov';
+$lang['in this album'] = 'v tej kategoriji';
+$lang['in %d sub-album'] = 'v %d pod-kategoriji';
+$lang['in %d sub-albums'] = 'v %d pod-kategorijah';
+$lang['included'] = 'vsebuje';
+$lang['Invalid password!'] = 'Napačno geslo!';
+$lang['Language'] = 'Jezik';
+$lang['last %d days'] = 'zadnjih %d dnevih';
+$lang['Last'] = 'Zadnji';
+$lang['Logout'] = 'Odjava';
+$lang['obligatory'] = 'obvezno';
+$lang['Maximum photo height'] = 'Maksimalna velikost slik';
+$lang['Maximum height must be a number superior to 50'] = 'Maksimalna velikost mora biti vecja od 50';
+$lang['Maximum photo width'] = 'Maksimalna dolžina slik';
+$lang['Most visited'] = 'Najbolj obiskana';
+$lang['display most visited photos'] = 'prikaži najbolj obiskane slike';
+$lang['The number of photos per page must be a not null scalar'] = 'Število slik na stran, mora biti ne prazno celo število.';
+$lang['Number of photos per page'] = 'Število slik na stran';
+$lang['Unknown identifier'] = 'Neznan';
+$lang['New password'] = 'Novo geslo';
+$lang['Rate this photo'] = 'Glasuj';
+$lang['Next'] = 'Naprej';
+$lang['no rate'] = 'brez glasa';
+$lang['Photos posted within the last %d day.'] = 'Elementi naloženi znotraj zadnjega %d dneva.';
+$lang['Photos posted within the last %d days.'] = 'Elementi naloženi znotraj zadnjih %d  dni.';
+$lang['password updated'] = 'geslo spremenjeno';
+$lang['Recent period must be a positive integer value'] = 'Novo obdobje more biti pozitivno celo število';
+$lang['photo'] = 'slika';
+$lang['Click on the photo to see it in high definition'] = 'Za ogled  v originalni velikosti, kliknite na sliko';
+$lang['Show file metadata'] = 'Prikaži mete podatke datoteke';
+$lang['Powered by'] = 'Narejeno z';
+$lang['Preferences'] = 'Nastavitve';
+$lang['Previous'] = 'Nazaj';
+$lang['Random photos'] = 'Naključne slike';
+$lang['display a set of random photos'] = 'prikaži množico nakljucno izbranih slik';
+$lang['Recent albums'] = 'Nove kategorije';
+$lang['display recently updated albums'] = 'prikaži na novo posodobljene kategorije';
+$lang['Recent period'] = 'Novo obdobje';
+$lang['Recent photos'] = 'Nove slike';
+$lang['display most recent photos'] = 'prikaži najbolj nove slike';
+$lang['Redirection...'] = 'Preusmeritev...';
+$lang['Please, enter a login'] = 'Prosim, prijavite se';
+$lang['login mustn\'t end with a space character'] = 'prijava se ne sme končati s presledkom';
+$lang['login mustn\'t start with a space character'] = 'prijava se ne sme začeti s presledkom';
+$lang['this login is already used'] = 'ta uporabnik je že prijavljen';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-mail mora biti oblike xxx@yyy.eee (primer : jack@altern.org)';
+$lang['please enter your password again'] = 'prosim vnesite svoje geslo še enkrat';
+$lang['Auto login'] = 'Avtomatska prijava';
+$lang['remove this tag from the list'] = 'odstrani značko iz seznama';
+$lang['representative'] = 'reprezentativen';
+$lang['Search for Author'] = 'Iskanje po avtorju';
+$lang['Search in albums'] = 'Iskanje po kategorijah';
+$lang['Search by date'] = 'Iskanje po datumo';
+$lang['Date'] = 'Datum';
+$lang['End-Date'] = 'Končni datum';
+$lang['Kind of date'] = 'Oblika datuma';
+$lang['Search for words'] = 'Iskanje po besedah';
+$lang['Search for all terms'] = 'Iskanje po vseh izrazih';
+$lang['Search for any term'] = 'Iskanje po kateremkoli izrazu';
+$lang['Empty query. No criteria has been entered.'] = 'Prazen niz. Vnesen ni bil niti eden kriterij.';
+$lang['Search results'] = 'Rezultat iskanja';
+$lang['Search in sub-albums'] = 'Iskanje po podkategorijah';
+$lang['searched words : %s'] = 'iskalne besede : %s';
+$lang['Contact'] = 'Kontakt';
+$lang['set as album representative'] = 'set as category representative';
+$lang['Maximum width must be a number superior to 50'] = 'Maksimalna dolžina mora biti večje od 50';
+$lang['display a calendar by creation date'] = 'prikaži kolendar po datumo nastanka';
+$lang['display all photos in all sub-albums'] = 'prikaži vse elemente v kategorijah in pod-kategorijah';
+$lang['return to normal view mode'] = 'vrni se v normalni način';
+$lang['display a calendar by posted date'] = 'prikaži kolendar po datumo odpošiljanja';
+$lang['Show number of comments'] = 'Prikaži število komentarjev';
+$lang['Show number of hits'] = 'Prikaži število zadetkov';
+$lang['slideshow'] = 'diaprojekcija';
+$lang['stop the slideshow'] = 'ustavi diaprojekcijo';
+$lang['Specials'] = 'Posebno';
+$lang['SQL queries in'] = 'SQL povpraševanje v';
+$lang['display only recently posted photos'] = 'prikaži samo zadnje odposlane slike';
+$lang['return to the display of all photos'] = 'vrni se v prikaz vseh slik';
+$lang['the beginning'] = 'začetek';
+$lang['Interface theme'] = 'Tema';
+$lang['Thumbnails'] = 'Predogled';
+$lang['Menu'] = 'Meni';
+$lang['A comment on your site'] = 'Komentar na vaši strani';
+$lang['today'] = 'danes';
+$lang['Update your rating'] = 'Popravi svojo oceno';
+$lang['the username must be given'] = 'potrebno je uporabniško ime';
+$lang['useful when password forgotten'] = 'uporabno, v primeru izgubljenega gesla';
+$lang['Quick search'] = 'Hitro iskanje';
+$lang['Connected user: %s'] = 'Prijavljeni uporabniki: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Brskalnik: %s';
+$lang['Author: %s'] = 'Avtor: %s';
+$lang['Comment: %s'] = 'Komentar: %s';
+$lang['Comment by %s'] = 'Komentar za %s';
+$lang['User: %s'] = 'Uporabnik: %s';
+$lang['Email: %s'] = 'E-pošta: %s';
+$lang['Admin: %s'] = 'Administrator: %s';
+$lang['Registration of %s'] = 'Prijavljenih %s';
+$lang['Album: %s'] = 'Kategorija: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Nepravilen status uporabnika "guest", uporabljen bo privzeti status. Prosim obvestite skrbnika.';
+$lang['this email address is already in use'] = 'email uporablja že drug uporabnik';
+$lang['Album results for'] = 'Category results for';
+$lang['Tag results for'] = 'Rezultat za značke';
+$lang['from %s to %s'] = 'od %s do %s';
+$lang['Play of slideshow'] = 'Začni diaprojekcijo';
+$lang['Pause of slideshow'] = 'Premor diaprojekcije';
+$lang['Repeat the slideshow'] = 'Ponovi diaprojekcijo';
+$lang['day'][0] = "nedelja";
+$lang['day'][1] = "ponedeljek";
+$lang['day'][2] = "torek";
+$lang['day'][3] = "sreda";
+$lang['day'][4] = "četrtek";
+$lang['day'][5] = "petek";
+$lang['day'][6] = "sobota";
+$lang['month'][10] = "oktober";
+$lang['month'][11] = "november";
+$lang['month'][12] = "december";
+$lang['month'][1] = "januar";
+$lang['month'][2] = "februar";
+$lang['month'][3] = "marec";
+$lang['month'][4] = "april";
+$lang['month'][5] = "maj";
+$lang['month'][6] = "junij";
+$lang['month'][7] = "julij";
+$lang['month'][8] = "avgust";
+$lang['month'][9] = "september";
+$lang['Not repeat the slideshow'] = 'Ne ponovi prezentacije';
+$lang['Reduce diaporama speed'] = 'Zmanjšaj hitrost predvajanja';
+$lang['Accelerate diaporama speed'] = 'Povečaj hitrost predvajanja';
+$lang['Submit'] = 'Pošlji';
+$lang['Yes'] = 'Da';
+$lang['No'] = 'Ne';
+$lang['%d photo'] = '%d slika';
+$lang['%d photos'] = '%d slik';
+$lang['%d photo is also linked to current tags'] = '%d slika je pravtako povezana s trenutno značko';
+$lang['%d photos are also linked to current tags'] = '%d slike so pravtako povezane s trenutnimi značkami';
+$lang['display photos linked to this tag'] = 'Pokaži slike vezane na samo to označbo ';
+$lang['photos posted during the last %d days'] = 'slike naložene zadnjih  %d dni';
+$lang['Piwigo Help'] = 'Piwigo pomoč';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'grupiraj po črkah';
+$lang['letters'] = 'črke';
+$lang['show tag cloud'] = 'show tags cloud';
+$lang['cloud'] = 'cloud';
+$lang['Reset to default values'] = 'Resetiraj na privzete vrednosti';
+$lang['delete all photos from your favorites'] = 'odstrani vse slike iz svojih priljubljenih';
+$lang['Sent by'] = 'Poslano od';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Piškotki so blokirani ali niso podprti s strani vašega brskalnika. Za prijavo je potrebno omogočiti piškotke.';
+$lang['Edit a comment'] = 'Uredi komentar';
+$lang['Are you sure?'] = 'Ali ste prepričani?';
+$lang['(!) This comment requires validation'] = '(!) Komentar potrebuje validacijo';
+$lang['Welcome'] = 'Dobrodošli';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Dobrodošli v svoji Piwigo galeriji!';
+$lang['... or browse your empty gallery'] = '... ali prebrskaj svojo prazno galerijo';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ali prosim deaktivirajte to sporočilo , I will find my way by myself';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Zdravo %s, tvoja Piwigo galerija je prazna!';
+$lang['I want to add photos'] = 'Želim dodati slike';
+$lang['Manage this user comment: %s'] = 'Uredi komentar uporabnika: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Manjka e-pošta. Prosim navedite svojo e-pošto.';
+$lang['This author modified following comment:'] = 'Ta uporabnik je uredil naslednji komentar:';
+$lang['This author removed the comment with id %d'] = 'Ta uporabnik je odstranil komentar z id-jem %d';
+$lang['html tags are not allowed in login'] = 'pri prijavi niso dovoljene html značke';
+$lang['%d rates'] = '%d točk';
+$lang['Rating score'] = 'Ocena';
+$lang['Invalid username or email'] = 'Nepravilno uporabniško ime ali e-pošta';
+$lang['Password reset is not allowed for this user'] = 'Poenostavite gesla ni možna za tega uporabnika';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Uporabnik "%s" nima e-pošte, zato poenostavitev gesla ni možna';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Nekdo je zahteval poenostavite gesla za uporabniški račun:';
+$lang['Username "%s" on gallery %s'] = 'Uporabnik "%s" za album %s';
+$lang['To reset your password, visit the following address:'] = 'Za poenostavitev gesla, obiščite naslednji spletni naslov:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Če je bila to napaka, preprosto prezrite to sporočilo in nič se ne bo zgodilo.';
+$lang['Password Reset'] = 'Poenostavitev gesla';
+$lang['Check your email for the confirmation link'] = 'Preverite e-pošto za potrditev';
+$lang['Invalid key'] = 'Nepravilen ključ';
+$lang['The passwords do not match'] = 'Gesli se ne ujemata';
+$lang['Your password has been reset'] = 'Vaše geslo je bilo poenostavljeno';
+$lang['Return to home page'] = 'Vrnite se na domačo stran';
+$lang['Please enter your username or email address.'] = 'Prosim vnesite svoje uporabniško ime ali e-pošto.';
+$lang['You will receive a link to create a new password via email.'] = 'Po e-pošti boste prejeli povezavo za kreiranje novega gesla.';
+$lang['Username or email'] = 'Uporabniško ime ali e-pošta';
+$lang['Change my password'] = 'Spremeni geslo';
+$lang['Enter your new password below.'] = 'Vnesite novo geslo.';
+$lang['EXIF Metadata'] = 'EXIF metapodatki';
+$lang['IPTC Metadata'] = 'IPTC metapodatki';
+$lang['Edit'] = 'Uredi';
+
+$lang['Hello %s,'] = 'Pozdravljen %s,';
+$lang['Password: %s'] = 'Geslo: %s';
+$lang['Username: %s'] = 'Uporabnik: %s';
+$lang['Here are your connection settings'] = 'Tukaj so vaše nastavitve povezave';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Če mislite, da ste prejeli to e-pošto po pomoti, se obrnite na nas na %s';
+$lang['large'] = 'large';
+$lang['medium'] = 'medium';
+$lang['Original'] = 'Original';
+$lang['Send my connection settings by email'] = 'Pošlji nastavitve povezave po e-pošti';
+$lang['small'] = 'small';
+$lang['square'] = 'square';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Uspešna registracija. Po e-pošti boste kmalu prejeli nastavitve povezave. Dobrodošli !';
+$lang['Thank you for registering at %s!'] = 'Hvala za registracijo na %s!';
+$lang['thumb'] = 'thumb';
+$lang['Username modification'] = 'Sprememba uporabniškega imena';
+$lang['xlarge'] = 'xlarge';
+$lang['xxlarge'] = 'xxlarge';
+$lang['Your username has been successfully changed to : %s'] = 'Vaše uporabniško ime je bilo uspešno sprememenjeno na: %s';
+?>
Index: tags/2.4.0RC3/language/sl_SL/iso.txt
===================================================================
--- tags/2.4.0RC3/language/sl_SL/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/sl_SL/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Sloven&scaron;čina [SL]
Index: tags/2.4.0RC3/language/sr_RS/about.html
===================================================================
--- tags/2.4.0RC3/language/sr_RS/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/about.html	(revision 14585)
@@ -0,0 +1,6 @@
+  <li>Piwigo је интернет апликација која вам омогућава израду интернет галерије на лак начин.</li>
+
+  <li>Технички, Piwigo је потпуно развијен коришћењем PHP (the elePHPant) као и  MySQL базе података (the SQuirreL).</li>
+
+  <li>Ако имате предлога и коментара, молимо посјетите <a href="http://piwigo.org">Piwigo</a> службену страницу, и њој посвећен <a href="http://piwigo.org/forum">форум</a>.</li>
+
Index: tags/2.4.0RC3/language/sr_RS/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/sr_RS/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/admin.lang.php	(revision 14585)
@@ -0,0 +1,785 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d веза';
+$lang['%d associations'] = '%d везе';
+$lang['%d album including'] = '%d категорија обухвата ';
+$lang['%d albums including'] = '%d категорије обухватају ';
+$lang['%d physical'] = '%d стварна';
+$lang['%d physical'] = '%d стварних';
+$lang[' and %d virtual'] = ' и %d виртуална';
+$lang[' and %d virtual'] = ' и %d виртуалних';
+$lang['%d album moved'] = '%d категорија премештена';
+$lang['%d albums moved'] = '%d категорија премештено';
+$lang['%d group'] = '%d група';
+$lang['%d groups'] = '%d група';
+$lang['%d member'] = '%d члан';
+$lang['%d members'] = '%d чланова';
+$lang['%d tag'] = '%d ознака';
+$lang['%d tags'] = '%d ознака';
+$lang['%d user comment rejected'] = '%d кориснички коментар одбачен';
+$lang['%d user comments rejected'] = '%d корисничких коментара одбачено';
+$lang['%d user comment validated'] = '%d кориснички кометар одобрен';
+$lang['%d user comments validated'] = '%d корисничких коментара одобрено';
+$lang['%d user deleted'] = '%d корисник избрисан';
+$lang['%d users deleted'] = '%d корисника избрисано';
+$lang['%d user'] = '%d корисник';
+$lang['%d users'] = '%d корисника';
+$lang['%d waiting for validation'] = '%d чекање на оверу';
+$lang['Actions'] = 'Поступци';
+$lang['Activate'] = 'Укључи';
+$lang['Add/delete a permalink'] = 'Додај/избриши сталну везу';
+$lang['Add a tag'] = 'Додај ознаку';
+$lang['Add a user'] = 'Додај корисника';
+$lang['Add group'] = 'Додај групу';
+$lang['Add'] = 'Додај';
+$lang['Allow user registration'] = 'Одобри упис корисника';
+$lang['Apply to sub-albums'] = 'Примени на подкатегорије';
+$lang['Associated'] = 'Повезаност';
+$lang['Caddie management'] = 'Контрола фиоке';
+$lang['Caddie'] = 'Фиока';
+$lang['Albums authorized thanks to group associations'] = 'Категорије оверене захваљујући групној вези';
+$lang['Album manual order was saved'] = 'Редослед категорија је сачуван';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Провера надоградње неуспешна из непознатог разлога.';
+$lang['Check for upgrade'] = 'Провера надоградње';
+$lang['Comments for all'] = 'Коментари за све';
+$lang['Current name'] = 'Тренутни назив';
+$lang['Database'] = 'База података';
+$lang['Deactivate'] = 'Искључи';
+$lang['Delete Representant'] = 'Избриши представника';
+$lang['Delete selected tags'] = 'Избриши одабране ознаке';
+$lang['Delete selected users'] = 'Избриши одабране кориснике';
+$lang['Deletions'] = 'Брисања';
+$lang['Deny selected groups'] = 'Забрани одабране групе';
+$lang['Deny selected users'] = 'Забрани одабране кориснике';
+$lang['Description'] = 'Опис';
+$lang['Display options'] = 'Могућности приказа';
+$lang['Dissociated'] = 'Одвојено';
+$lang['Does not represent'] = 'Не представља';
+$lang['Edit selected tags'] = 'Уреди одабране ознаке';
+$lang['Edit tags'] = 'Уреди ознаке';
+$lang['Email admins when a new user registers'] = 'Пошаљи електронску пошту администраторима при упису нових корисника';
+$lang['Email admins when a valid comment is entered'] = 'Пошаљи електронску пошту администраторима при упису нових коментара';
+$lang['Email admins when a comment requires validation'] = 'Пошаљи електронску пошту администраторима када коментар треба оверу';
+$lang['Environment'] = 'Окружење';
+$lang['Form'] = 'Облик';
+$lang['Gallery title'] = 'Назив галерије';
+$lang['Grant selected groups'] = 'Овласти одабране групе';
+$lang['Grant selected users'] = 'Овласти одабране кориснике';
+$lang['Group name'] = 'Назив групе';
+$lang['Groups'] = 'Група';
+$lang['Guests'] = 'Гостију';
+$lang['History'] = 'Историја';
+$lang['Informations'] = 'Информације';
+$lang['Install'] = 'Инсталирај';
+$lang['Link all album photos to a new album'] = 'Повежи све елементе категорије са новом категоријом';
+$lang['Link all album photos to some existing albums'] = 'Повежи све елементе категорије са неком постојећом категоријом';
+$lang['Linked albums'] = 'Повезане категорије';
+$lang['Lock gallery'] = 'Закључај галерију';
+$lang['Maintenance'] = 'Одржавање';
+$lang['Edit album permissions'] = 'Управљање дозволама за категорију';
+$lang['Manage permissions for group "%s"'] = 'Управљање дозволама за групу "%s"';
+$lang['Manage permissions for user "%s"'] = 'Управљање дозволама за корисника "%s"';
+$lang['Manage tags'] = 'Управљање ознакама';
+$lang['Members'] = 'Чланови';
+$lang['Metadata synchronized from file'] = 'Усклађивање мета података из датотеке';
+$lang['Move albums'] = 'Премести категорије';
+$lang['Move'] = 'Премести';
+$lang['Name'] = 'Назив';
+$lang['New name'] = 'Нови назив';
+$lang['New parent album'] = 'Нова надређена категорија';
+$lang['New tag'] = 'Нова ознака';
+$lang['Number of comments per page'] = 'Број коментара по страници';
+$lang['Number of rates'] = 'Број оцена';
+$lang['Number of thumbnails to create'] = 'број повезних сличица за израду';
+$lang['Only private albums are listed'] = 'Само личне категорије су исписане';
+$lang['Operating system'] = 'Оперативни систем';
+$lang['Options'] = 'Могућности';
+$lang['Other private albums'] = 'Остале личне категорије';
+$lang['Page banner'] = 'Банер странице';
+$lang['Parent album'] = 'Надређена категорија';
+$lang['Path'] = 'Путања';
+$lang['Permalink'] = 'Стална веза';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Стална веза %s је претходно коришћтена од категорије %s. Прво је избришите из старих записа';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Стална веза мора бити састављена од знакова a-z, A-Z, 0-9, "-", "_" или "/". Не сме бити бројчана вриједност или почињати бројем па знаком "-"';
+$lang['Permalink %s is already used by album %s'] = 'Сталну везу %s већ користи категорија %s';
+$lang['Permalink history'] = 'Историја сталних веза';
+$lang['Permalinks'] = 'Сталне везе';
+$lang['Permission denied'] = 'Дозвола ускраћена';
+$lang['Permission granted thanks to a group'] = 'Дозвола одобрена захваљујући групи';
+$lang['Permission granted'] = 'Дозвола одобрена';
+$lang['Photo informations updated'] = 'Подаци о сликама обновљени';
+$lang['Plugins'] = 'Додаци';
+$lang['Position'] = 'Положај';
+$lang['Preferences'] = 'Подешавања';
+$lang['Properties'] = 'Карактеристике';
+$lang['Random photo'] = 'Слика случајног избора';
+$lang['Rate date'] = 'Датум оцене';
+$lang['Rating by guests'] = 'Оцене гостију';
+$lang['Rating'] = 'Оцењивање';
+$lang['Reject'] = 'Одбаци';
+$lang['Representant'] = 'Представник';
+$lang['Representation of albums'] = 'Представљање категорија';
+$lang['Representative'] = 'Представљено';
+$lang['Represents'] = 'Представља';
+$lang['Save order'] = 'Сними распоред';
+$lang['Save to permalink history'] = 'Сними у историју сталних веза';
+$lang['Select at least one album'] = 'Одаберите најмање једну категорију';
+$lang['Select at least one photo'] = 'Одаберите најмање једну слику';
+$lang['Select at least one user'] = 'Одаберите најмање једног корисника';
+$lang['Show info'] = 'Приказ података';
+$lang['Site manager'] = 'Администратор галерије';
+$lang['Status'] = 'Стање';
+$lang['Statistics'] = 'Статистика';
+$lang['Storage album'] = 'Категорија снимања';
+$lang['Sum of rates'] = 'Збир оцена';
+$lang['Tag "%s" already exists'] = 'Ознака "%s" већ постоји';
+$lang['Tag "%s" was added'] = 'Ознака "%s" додата';
+$lang['Tag selection'] = 'Избор ознаке';
+$lang['The %d following tags were deleted'] = 'Следеће %d ознаке су избрисане';
+$lang['Unable to check for upgrade.'] = 'Не могу проверити за надоградњу.';
+$lang['Uninstall'] = 'Уклони';
+$lang['Use the default photo sort order (defined in the configuration file)']='Користи подразумевани редослед слагања слика (одређено у датотеци за подешавање)';
+$lang['User comments validation'] = 'Овера корисничких коментара';
+$lang['Users'] = 'Корисници';
+$lang['Validate'] = 'Овери';
+$lang['Validation'] = 'Овера';
+$lang['Version'] = 'Верзија';
+$lang['Virtual albums to move'] = 'Виртуелне категорије за премештање';
+$lang['Virtual album name'] = 'Назив виртуелне категорије';
+$lang['Webmaster cannot be deleted'] = 'Мајстор интернет страница не може бити избрисан';
+$lang['You are running on development sources, no check possible.'] = 'Ви користите развојни изворни код, провера немогућа.';
+$lang['You cannot delete your account'] = "Не можете избрисати свој налог";
+$lang['You cannot move an album in its own sub album'] = 'Не можете преместити категорију у њену подкатегорију';
+$lang['You need to confirm deletion'] = 'Потврди брисање';
+$lang['Associate to album'] = 'повежи са категоријом';
+$lang['associate to group'] = 'повежи са групом';
+$lang['Authorized'] = 'Овлашћено';
+$lang['Add a virtual album'] = 'Додај виртуелну категорију';
+$lang['Authorize users to add comments on selected albums'] = 'Овластите кориснике за давање коментара у одабраним категоријама';
+$lang['The name of an album must not be empty'] = 'Назив категорије не би требао бити празан';
+$lang['Lock albums'] = 'Закључај категорије';
+$lang['Private'] = 'Лична категорија';
+$lang['Public'] = 'Јавна категорија';
+$lang['Find a new representant by random'] = 'Избор новог представника случајним избором';
+$lang['Public / Private'] = 'Јавно / Лично';
+$lang['Manage authorizations for selected albums'] = 'Управљање овлашћењима за одабране категорије';
+$lang['Virtual album added'] = 'Виртуелна категорија додата';
+$lang['Virtual album deleted'] = 'Виртуелна категорија избрисана';
+$lang['Access type'] = 'Врста приступа';
+$lang['Information data registered in database'] = 'Подаци уписани у базу података';
+$lang['Default display'] = 'Подразумевани приказ';
+$lang['The gallery URL is not valid.'] = 'URL галерије није одговарајући.';
+$lang['Main'] = 'Главно';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Број коментара по страници мора бити између 5 и 50.';
+$lang['Configuration'] = 'Подешавање';
+$lang['confirm'] = 'потврди';
+$lang['Date'] = 'Датум';
+$lang['delete album'] = 'обриши категорију';
+$lang['Dissociate from album'] = 'одвоји од категорије';
+$lang['dissociate from group'] = 'одвоји од групе';
+$lang['Album updated successfully'] = 'Подаци категорије успешно обновљени.';
+$lang['photos per page'] = 'елемената по страници';
+$lang['High definition enabled'] = 'Висока резолуција омогућена';
+$lang['File'] = 'Датотека';
+$lang['first photo added on %s'] = 'први елемент додат %s';
+$lang['Forbidden'] = 'Забрањено';
+$lang['global mode'] = 'општи начин';
+$lang['group "%s" added'] = 'група "%s" додата';
+$lang['group "%s" deleted'] = 'група "%s" избрисана';
+$lang['group "%s" updated'] = 'група "%s" обновљена';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Назив групе не може садржати  " или \' или бити празан.';
+$lang['This name is already used by another group.'] = 'Овај назив већ користи друга група.';
+$lang['High definition'] = 'Висока резолуција';
+$lang['jump to album'] = 'прелазак на категорију';
+$lang['jump to photo'] = 'прелазак на слику';
+$lang['leave'] = 'остави';
+$lang['Lock'] = 'Закључај';
+$lang['Locked'] = 'Закључано';
+$lang['manage album photos'] = 'управљање елементима категорије';
+$lang['manage sub-albums'] = 'управљање подкатегоријама';
+$lang['Manage'] = 'Управљај';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Време извршења је истекло, обрада се мора наставити [Процењено време: %d секунде].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Време извршења је истекло, обрада се мора наставити [Процењено време: %d секунди].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Предвиђено време за попис корисника за слање порука је ограничено. Остали корисници нису излистани.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Време за слање поруке је ограничено. Остале поруке су прескочене.';
+$lang['To send ?'] = 'Послати ?';
+$lang['Last send'] = 'Задње послато';
+$lang['email'] = 'електронска адреса';
+$lang['User'] = 'Корисник';
+$lang['See you soon,'] = 'Видимо се ускоро,';
+$lang['Go to'] = 'Иди на ';
+$lang['Hello'] = 'Поздрав ';
+$lang['New photos were added'] = 'Нови елементи су додати ';
+$lang['on'] = ' на ';
+$lang['between'] = 'између ';
+$lang['and'] = ' и ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Мајстор интернет страница вас је претлатио на примање електронских обавештења.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Претплатили сте се на примање електронских обавештења.';
+$lang['To subscribe'] = 'Претплата';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Уколико сте наишли на проблеме или имате питања, молимо пошаљите поруку за ';
+$lang['[NBM] Problems or questions'] = '[NBM] Проблеми или питања';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Мајстор интернет страница Вас је уклонио са листе за примање е-маил обавештења.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Уклонили сте се са листе за примање електронских обавештења.';
+$lang[', click on'] = ', кликните на ';
+$lang['To unsubscribe'] = 'За уклањање';
+$lang['With blank value, gallery title will be used'] = 'Са празним пољем, користи ће се назив галерије';
+$lang['Notification'] = 'Обавештење';
+$lang['Error when sending email to %s [%s].'] = 'Грешка приликом слања електронске поруке за %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Порука послата за %s [%s].';
+$lang['%d mail was sent.'] = '%d порука послата.';
+$lang['%d mails were sent.'] = '%d поруке послате.';
+$lang['%d mail was not sent.'] = '%d порука није послата.';
+$lang['%d mails were not sent.'] = '%d поруке нису послате.';
+$lang['No mail to send.'] = 'Нема поруке за слање.';
+$lang['There is no available subscribers to mail.'] = 'Нема доступних примаоца за слање порука.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Претплатници могу бити излистани (доступни) само ако има нових елемената за обавештење.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'У сваком случају само мајстор интернет страница може приступити овој табли а никад администратори.';
+$lang['No user to send notifications by mail.'] = 'Нема корисника за слање електронских обавештења.';
+$lang['New photos added'] = 'Нови елементи додати';
+$lang['Subscribe to notification by mail'] = 'Претплатите се на електронска обавештења';
+$lang['Unsubscribe from notification by mail'] = 'Уклоните се из система примања електронских обавештења';
+$lang['Parameter'] = 'Ставка';
+$lang['Continue processing treatment'] = 'Настави обраду поступка';
+$lang['Complementary mail content'] = 'Комплетан садржај поруке';
+$lang['Add detailed content'] = 'Додај детаљни садржај';
+$lang['Send mail as'] = 'Пошаљи поруку као ';
+$lang['Send mail to users'] = 'Пошаљи поруку корисницима';
+$lang['Send'] = 'Пошаљи';
+$lang['Options'] = 'Могућности';
+$lang['Send'] = 'Пошаљи';
+$lang['Subscribed'] = 'Претплаћен';
+$lang['Subscribe'] = 'Претплатите се';
+$lang['Parameters'] = 'Ставке';
+$lang['Select recipients'] = 'Одаберите примаоце';
+$lang['Subscribe/unsubscribe users'] = 'Претплати/поништи претплату корисника';
+$lang['Unsubscribed'] = 'Претплата поништена';
+$lang['%d parameter was updated.'] = '%d ставка је обновљена.';
+$lang['%d parameters were updated.'] = '%d ставке су поништене.';
+$lang['%d user was not updated.'] = '%d корисник није обновљен.';
+$lang['%d users were not updated.'] = '%d корисници нису обновљени.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Корисник %s [%s] је уклоњен из листе претплатника.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Корисник %s [%s] је додат на листу претплатника.';
+$lang['%d user was updated.'] = '%d корисник је обновљен.';
+$lang['%d users were updated.'] = '%d корисници су обновљени.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Корисник %s [%s] није уклоњен из листе претплатника.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Корисник %s [%s] није додат на листу претплатника.';
+$lang['User %s [%s] added.'] = 'Корисник %s [%s] додат.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Упозорење: претплата или укидање претплате ће послати електронске поруке корисницима';
+$lang['Send mail on HTML format'] = 'Пошаљи поруку у ХТМЛ облику';
+$lang['Include display of recent photos grouped by dates'] = 'Укључи приказ недавних слика сложених по датумима';
+$lang['Available only with HTML format'] = 'Доступно само у ХТМЛ облику';
+$lang['no write access'] = 'нема дозволе уписа';
+$lang['Permissions'] = 'Дозволе';
+$lang['private'] = 'лично';
+$lang['public'] = 'јавно';
+$lang['Purge never used notification feeds'] = 'Испразни никад коришћене обаештавајуће изворе';
+$lang['Purge sessions'] = 'Испразни сесије';
+$lang['randomly represented'] = 'представљен случајним избором';
+$lang['registration date'] = 'датум уписа';
+$lang['clean'] = 'чисто';
+$lang['Create this site'] = 'Направи ову страницу';
+$lang['test'] = 'проба';
+$lang['test this remote site'] = 'испробајте ово удаљену страницу';
+$lang['remove tags'] = 'уклони ознаке';
+$lang['Repair and optimize database'] = 'Поправи и подеси базу података';
+$lang['selection'] = 'избор';
+$lang['set to'] = 'постављено на';
+$lang['singly represented'] = 'једнозначно представљено';
+$lang['This site already exists'] = 'Ова страница већ постоји';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Изради нову страницу : (одрдите њену УРЛ за израду create_listing_file.php)';
+$lang['created'] = 'направљено';
+$lang['delete'] = 'обриши';
+$lang['delete this site and all its attached elements'] = 'обриши ову страницу и све њене придодате ставке';
+$lang['an error happened'] = 'дошло је до грешке';
+$lang['Local'] = 'Локално';
+$lang['Remote'] = 'Удаљено';
+$lang['update the database from files'] = 'обнови базу података помоћу датотеке';
+$lang['status'] = 'стање';
+$lang['Directory'] = 'Мапа';
+$lang['sub-albums'] = 'подкатегорије';
+$lang['Synchronize metadata'] = 'синхронизуј мета податке';
+$lang['target'] = 'одредиште';
+$lang['Thumbnail'] = 'Повезне сличице';
+$lang['title'] = 'наслов';
+$lang['Album list management'] = 'Управљање категоријама';
+$lang['Piwigo configuration'] = 'Piwigo подешавања';
+$lang['Edit album'] = 'Уреди категорију';
+$lang['Group management'] = 'Управљање групама';
+$lang['User list'] = 'Листа корисника';
+$lang['Edit photo information'] = 'Промена података о слици';
+$lang['Database synchronization with files'] = 'Синхронизација базе података са датотекама';
+$lang['all'] = 'све';
+$lang['height must be a number superior to'] = 'висина мора бити број већи од ';
+$lang['width must be a number superior to'] = 'ширина мора бити број већи од';
+$lang['for the file format'] = 'за датотечни облик';
+$lang['Photo unreachable or no support'] = 'Слика недоступна или без подршке';
+$lang['GD version'] = 'ГД верзија';
+$lang['General statistics'] = 'Главна статистика';
+$lang['average time'] = 'просечно време';
+$lang['number of miniaturized photos'] = 'број умањених слика';
+$lang['total time'] = 'укупно време';
+$lang['for this file format'] = 'за ову врсту датотеке';
+$lang['unit mode'] = 'појединачни начин';
+$lang['Unlocked'] = 'Откључано';
+$lang['unset'] = 'раздешено';
+$lang['Update albums informations'] = 'Обнови податке о категоријама';
+$lang['Update photos information'] = 'Обнови податке о сликама';
+$lang['Synchronize'] = 'Усагласи';
+$lang['reduce to single existing albums'] = 'сажми на једну постојећу категорију-е';
+$lang['Choose an option'] = 'Изаберите могућност';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'најопширнији могући приказ података (додате категорије и елементи, избрисане  категорије и елементи)';
+$lang['Error list'] = 'Листа грешака ';
+$lang['Errors caption'] = 'Заглавља грешака';
+$lang['Detailed informations'] = 'Детаљнија обавештења';
+$lang['File/directory read error'] = 'Грешка читања датотеке/директоријума';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Датотеци или директоријуму се не може приступити (не постоји или је приступ забрањен)';
+$lang['albums deleted in the database'] = 'категорије избрисане из базе података';
+$lang['photos deleted from the database'] = 'елементи избрисани из базе података';
+$lang['photos candidates for metadata synchronization'] = 'слика кандидата за синхронизацију мета података';
+$lang['photos informations synchronized with files metadata'] = 'података елемената синхронизовано са мета подацима датотеке';
+$lang['errors during synchronization'] = 'грешака током синхронизације';
+$lang['albums added in the database'] = 'категорија додато у базу података';
+$lang['photos added in the database'] = 'елемената додато у базу података';
+$lang['photos updated in the database'] = 'елемената обновљено у бази података';
+$lang['Search for new images in the directories'] = 'Претраживање нових слика у директоријумима';
+$lang['added'] = 'додато';
+$lang['deleted'] = 'обрисано';
+$lang['Metadata synchronization results'] = 'Резултат усклађивања мета података';
+$lang['only perform a simulation (no change in database will be made)'] = 'изврши само симулацију (нема промена у бази података)';
+$lang['Simulation'] = 'Симулација';
+$lang['directories + files'] = 'директоријуме + датотеке';
+$lang['only directories'] = 'само директоријуме';
+$lang['synchronize files structure with database'] = 'усклади структуру датотеке са базом података';
+$lang['synchronize files metadata with database photos informations'] = 'усклади мета податке датотеке са подацима о елементу из базе података';
+$lang['even already synchronized photos'] = 'чак и већ усклађене елементе';
+$lang['Used metadata'] = 'Коришћени мета подаци';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Називи директоријума и датотека морају бити састављени од слова, бројва, "-", "_" ili "."';
+$lang['wrong filename'] = 'лош назив датотеке';
+$lang['Upload'] = 'Пребаци';
+$lang['user "%s" added'] = 'корисник "%s" додат';
+$lang['User status'] = 'Стање корисника';
+$lang['user_status_admin'] = 'Администратор';
+$lang['user_status_generic'] = 'Општи';
+$lang['user_status_guest'] = 'Гост';
+$lang['user_status_normal'] = 'Корисник';
+$lang['user_status_webmaster'] = 'Мајстор интернет страница';
+$lang['Virtual album'] = 'Виртуелна кетегорија';
+$lang['Waiting'] = 'Чекање';
+$lang['default'] = 'подразумевано';
+$lang['Toggle \'default group\' property'] = 'Промени \'подразумевана група\' особине';
+$lang['Advanced features'] = 'Напредне могућности';
+$lang['Overall'] = 'Свеукупно';
+$lang['Year'] = 'Година';
+$lang['Month'] = 'Месец';
+$lang['Day'] = 'Дан';
+$lang['Pages seen'] = 'Страница виђенa';
+$lang['Time'] = 'Време';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Елемент';
+$lang['Section'] = 'Секција';
+$lang['An information email was sent to group "%s"'] = 'Електронска порука обавештења је послата групи "%s';
+$lang['Send an information email to group members'] = 'Пошаљи електронско обавештења члановима групе';
+$lang['Group'] = 'Група';
+$lang['[%s] Visit album %s'] = '[%s] Дођите и погледајте категорију %s';
+$lang['Hello,'] = 'Здраво,';
+$lang['See you soon.'] = 'До виђења.';
+$lang['Discover album:'] = 'Дођите и откријте категорију:';
+$lang['Mail content'] = 'садржај електронске поруке';
+$lang['none'] = 'ни један';
+$lang['high'] = 'високо';
+$lang['other'] = 'остало';
+$lang['Element type'] = 'Тип елемента';
+$lang['Image id'] = 'Шифра слике';
+$lang['Summary'] = 'Збирно';
+$lang['%d line filtered'] = '%d линија прочишћена';
+$lang['%d lines filtered'] = '%d линија прочишћено';
+$lang['%d guest'] = '%d гост';
+$lang['%d guests'] = '%d гостију';
+$lang['Hour'] = 'Сат';
+$lang['guest'] = 'гост';
+$lang['default values'] = 'подразумеване вредности';
+$lang['Guest cannot be deleted'] = 'Гост не може бити избрисан';
+$lang['Default user cannot be deleted'] = 'Подразумевани корисник не може бити избрисан';
+$lang['Purge history detail'] = 'Испразни детаље историје';
+$lang['Purge history summary'] = 'Испразни збирну историју';
+$lang['Check integrity'] = 'Провера целовитости';
+$lang['Anomaly'] = 'Неправилност';
+$lang['Correction'] = 'Исправка';
+$lang['Automatic correction'] = 'Аутоматско исправљање';
+$lang['Impossible automatic correction'] = 'Аутоматско исправљање немогуће';
+$lang['Correction applied with success'] = 'Исправка успешно примењена';
+$lang['Correction applied with error'] = 'Исправка примењена с грешком';
+$lang['%d anomaly has been detected.'] = '%d неправилност је откривена.';
+$lang['%d anomalies have been detected.'] = '%d неправилности су откривене.';
+$lang['%d anomaly has been corrected.'] = '%d неправилност је исправљена.';
+$lang['%d anomalies have been detected corrected.'] = '%d неправилности је исправљено.';
+$lang['%d anomaly has not been corrected.'] = '%d неправилност није исправљена.';
+$lang['%d anomalies have not been corrected.'] = '%d неправилности није исправљено.';
+$lang['Go to %s or %s for more informations'] = 'Идите на %s или %s за више детаља';
+$lang['the forum'] = 'форум';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s вредност није ваљана датотека јер exif није подржан';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s мора бити постављено на false у config_local.inc.php датотеци';
+$lang['Main "guest" user does not exist'] = 'Главни "гост" корисник не постоји';
+$lang['Main "guest" user status is incorrect'] = 'Стање главног "гост" корисника је неисправно';
+$lang['Default user does not exist'] = 'Подразумевани корисник не постоји';
+$lang['Main "webmaster" user does not exist'] = 'Главни "мајстора интернет страница" као корисник не постоји';
+$lang['Main "webmaster" user status is incorrect'] = 'Стање главног "мајстора интернет страница" као корисника је неисправно';
+$lang['User "%s" created with "%s" like password'] = 'Корисник "%s" израђен са "%s" као лозинком';
+$lang['Status of user "%s" updated'] = 'Стање корисника "%s" обновљено';
+$lang['add new photos to caddie'] = 'додај нове елементе у фиоку';
+$lang['No display'] = 'Без приказа';
+$lang['Classic display'] = 'Класични приказ';
+$lang['Hoverbox display'] = 'Приказ лебдећим прозором';
+$lang['Mail address is obligatory for all users'] = 'Електронска адреса је обавезна за све кориснике';
+$lang['Minimum privacy level'] = 'Најнижи ниво приватности';
+$lang['Privacy level'] = 'Ниво приватности';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Познаници';
+$lang['Level 2'] = 'Пријатељи';
+$lang['Level 4'] = 'Породица';
+$lang['Level 8'] = 'Администратори';
+$lang['Reinitialize check integrity'] = 'Понови проверу целовитости';
+$lang['Check all'] = 'Означи све';
+$lang['Uncheck all'] = 'Одзначи све';
+$lang['Check automatic corrections'] = 'Означи аутоматске исправке';
+$lang['Apply selected corrections'] = 'Примени одабране исправке';
+$lang['Ignore selected anomalies'] = 'Занемари одабране неправилности';
+$lang['Refresh'] = 'Освежи';
+$lang['The anomaly will be ignored until next application version'] = 'Неправилност ће се занемарити до следеће верзије галерије';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Исправка неправилности ће поништити чињеницу да је занемарена';
+$lang['%d anomaly has been ignored.'] = '%d неправилност је занемарена.';
+$lang['%d anomalies have been ignored.'] = '%d неправилности су занемарене.';
+$lang['Plugins which need upgrade'] = 'Додаци који требају надоградњу';
+$lang['Plugin list'] = 'Листа додатака';
+$lang['Check for updates'] = 'Провера надоградње';
+$lang['Other plugins'] = 'Остали додаци';
+$lang['Last revisions'] = 'Задња издања';
+$lang['Are you sure you want to delete this plugin?'] = 'Сигурно желите уклонити овај додатак?';
+$lang['Are you sure you want to install this plugin?'] = 'Сигурно желите инсталирати овај додатак?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Сигурно желите инсталирати овај додатак? Морате потврдити да ова пречица не треба уклањање.';
+$lang['Plugin has been successfully copied'] = 'Додатак је успјешно ископиран';
+$lang['You might go to plugin list to install and activate it.'] = 'Можете ићи на листу датотека за инсталацију и покретање.';
+$lang['Can\'t create temporary file.'] = 'Не могу направити привремени датотеку.';
+$lang['Can\'t download archive.'] = 'Не могу преузети датотеку.';
+$lang['Can\'t read or extract archive.'] = 'Не могу очитати или распаковати датотеку.';
+$lang['An error occured during extraction (%s).'] = 'Дошло је до грешке приликом распаковања (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Проверите "plugins" директоријум и дозволе поддиректоријума (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Не могу се повезати на сервер.';
+$lang['Purge compiled templates'] = 'Испразни обрађене шаблоне';
+$lang['ACCESS_0'] = 'Слободан приступ';
+$lang['ACCESS_1'] = 'Приступ свима';
+$lang['ACCESS_2'] = 'Приступ претплатницима';
+$lang['ACCESS_3'] = 'Приступ администраторима';
+$lang['ACCESS_4'] = 'Приступ мајсторима интернет страница';
+$lang['ACCESS_5'] = 'Без приступа';
+$lang['Support'] = 'Подршка';
+$lang['Documentation'] = 'Документација';
+$lang['A new version of Piwigo is available.'] = 'Нова Piwigo vерзија је доступна.';
+$lang['Piwigo Administration'] = 'Piwigo администрација';
+$lang['Piwigo version'] = 'Piwigo верзија';
+$lang['You are running the latest version of Piwigo.'] = 'Користите најновију верзију Piwigo-a.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Верзија од %s [%s] постављене није одговарајућа потребној верзији [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'морате надоградити ваш систем да бисте имали све погодности у противном систем неће радити исправно или уопште неће радити';
+$lang['Deleted on'] = 'Избрисан на';
+$lang['Last hit'] =  'Задња посета';
+$lang['GD library is missing'] = 'Недостаје ГД библиотека';
+$lang['Templates'] = 'Шаблони';
+$lang['Extend for templates'] = 'Проширење за шаблоне';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] =
+ 'Замена изворних шаблона прилагођеним из директоријума template-extension';
+$lang['Replacers (customized templates)'] = 'Замене (прилагођени шаблони)';
+$lang['Original templates'] = 'Изворни шаблони';
+$lang['Optional URL keyword'] = 'Изборна URL кључна реч';
+$lang['Templates configuration has been recorded.'] = 'Подешавње шаблона је сачувано.';
+$lang['All optimizations have been successfully completed.'] = 'Сва побољшања су успешно довршена.';
+$lang['Optimizations have been completed with some errors.'] = 'Побољшања су извршена уз неке грешке.';
+$lang['Modify information'] = 'Промени податак';
+$lang['nothing'] = 'ништа';
+$lang['overrides existing values with empty ones'] = 'прекуцава постојеће вредности празним пољима';
+$lang['Manage photo ranks'] = 'Управљање поретком';
+$lang['Edit ranks'] = 'Уреди поредак';
+$lang['No photo in this album'] = 'Нема елемената у овој категорији';
+$lang['Images manual order was saved'] = 'Сачуван је подешении редослед слика';
+$lang['ranks'] = 'поредак';
+$lang['Drag to re-order'] = 'Повуци за преређивање';
+$lang['Quick Local Synchronization'] = 'Брза Локална Синхронизација';
+$lang['No photo can be deleted'] = 'Нема слике која се може брисати';
+$lang['Delete selected photos'] = 'Бриши одабране слике';
+$lang['%d photo was deleted'] = '%d слика је избрисана';
+$lang['%d photos were deleted'] = '%d слике су избрисане';
+$lang['Downloads'] = 'Преузимања';
+$lang['Released on'] = 'Објављено дана';
+$lang['Number of downloads'] = 'Број преузимања';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Announcements e-Новине';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Останите у вези са пројектом, претплатите се на Piwigo Announcement e-Новине. Добијаћете електронске поруке по изласку нових верзија (понекад са сигурносним закрпама, важно је знати да су доступне и треба их што пре уградити) те о свим важнијим десавањима и догађањима у вези са пројектом. Свега пар електронских порука годишње.';
+$lang['Subscribe %s'] = 'Претплатите %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Претплатите %s на Piwigo English Announcements e-Новине';
+$lang['Purge search history'] = 'Очисти историју претраживања';
+$lang['Hide'] = 'Сакриј';
+$lang['Operation in progress'] = 'Третирање процеса.';
+$lang['Please wait...'] = 'Молим сачекајте...';
+$lang['Password is missing. Please enter the password.'] = 'Лозинка недостаје. Молим унесите лозинку.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Потврда лозинке недостаје. Молим потврдите изабрану лозинку.';
+$lang['Allow users to edit their own comments'] = 'Дозволи корисницима да уређују своје коментаре';
+$lang['Allow users to delete their own comments'] = 'Дозволи корисницима да бришу своје коментаре';
+$lang['Email administrators when a comment is modified'] = 'Пошаљи електронску поруку администратору када је коментар измењен';
+$lang['Email administrators when a comment is deleted'] = 'Пошаљи електронску поруку администратору када је коментар избрисан';
+$lang['Cannot delete the old permalink !'] = 'Стара интернет веза се не може обрисати!';
+$lang['Hit'] = 'Погодак';
+$lang['Tools'] = 'Алати';
+$lang['Photos'] = 'Фотографије';
+$lang['Themes'] = 'Теме';
+$lang['Instructions to use Piwigo'] = 'Инструкције како да користите Piwigo';
+$lang['Installed Themes'] = 'Инсталиране теме';
+$lang['Add New Theme'] = 'Додај нову тему';
+$lang['Forbid this theme to users'] = 'Забрани ову тему корисницима';
+$lang['Set as default theme for unregistered and new users'] = 'Постави као подразумевану тему за нерегистроване и нове кориснике';
+$lang['unknown'] = 'непознато';
+$lang['Upload Photos'] = 'Пошаљи фотографије';
+$lang['Drop into album'] = 'Баци у категорију';
+$lang['+ Add an upload box'] = '+ Додај кутију за слање';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Направи "%s" дирецторијум у корену Ваше Piwigo инсталације';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Дозволи упис (chmod 777) у "%s" директоријум у корену Ваше Piwigo инсталције';
+$lang['existing album'] = 'постојеће категорије';
+$lang['create a new album'] = 'направи нову категорију';
+$lang['Album name'] = 'Назив категорије';
+$lang['Album "%s" has been added'] = 'Категорија "%s" је додата';
+$lang['Uploaded Photos'] = 'Пошаљи фотографије';
+$lang['%d photos uploaded'] = '%d фотографије послате';
+$lang['Privacy level set to "%s"'] = 'Ниво приватности подешен на "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Категорија "%s" сада садржи %d фотографија';
+$lang['Manage this set of %d photos'] = 'Уреди овај сет %d фотографија';
+$lang['Select files'] = 'Изабери датотеке';
+$lang['Everybody'] = 'Сви';
+$lang['Who can see these photos?'] = 'Ко може да види фотографије?';
+$lang['Settings'] = 'Подешења';
+$lang['Resize'] = 'Промени величину';
+$lang['Maximum Width'] = 'Максимална ширина';
+$lang['pixels'] = 'тачака';
+$lang['Maximum Height'] = 'Максимална висина';
+$lang['Image Quality'] = 'Квалитет слике';
+$lang['Save Settings'] = 'Сними подешења';
+$lang['Your configuration settings are saved'] = 'Ваша подешења су сачувана';
+$lang['Active Themes'] = 'Активне теме';
+$lang['Add write access to the "%s" directory'] = 'Дозволи упис "%s" директоријуму';
+$lang['Administration Home'] = 'Почетна администрације';
+$lang['Change Admin Colors'] = 'Промени администраторске боје';
+$lang['Delete this theme'] = 'Обриши ову тему';
+$lang['Directory does not exist'] = 'Директоријум не постоји';
+$lang['Download,'] = 'Сними на рачунар,';
+$lang['FTP + Synchronization'] = 'FTP + Синхронизација';
+$lang['Get Support on Piwigo Forum'] = 'Подршка он Пиwиго форуму';
+$lang['Help Me'] = 'Помоћ';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ова тема се не може активирати, јер тема не постоји: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Ова тема се не може обрисати, јер друге теме зависе од ње: %s';
+$lang['Inactive Themes'] = 'Неактивне теме';
+$lang['Install on your computer,'] = 'Инсталирај на твом рачунару,';
+$lang['Make this theme available to users'] = 'Направи ову тему доступну корисницима';
+$lang['Page end'] = 'Крај стране';
+$lang['Piwigo Uploader'] = 'Piwigo пошиљаоц';
+$lang['Read Piwigo Documentation'] = 'Прочитај Piwigo документацију';
+$lang['Start pLoader and add your photos.'] = 'Покрени pLoader и додај твоје слике.';
+$lang['Switch to clear or dark colors for administration'] = 'Промени на светле или тамне боје за администратора';
+$lang['Theme has been successfully installed'] = 'тема је успешно инсталирана';
+$lang['Visit Gallery'] = 'Посети галерију';
+$lang['Visit Piwigo project website'] = 'Посети страницу Piwigo пројекта';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader означава <em>Piwigo Uploader</em>. Са Вашег рацунара, pLoader припрема Ваше фотографије и шаље их у  Piwigo фото галерију.';
+$lang['Guest Settings'] = 'Подешења за госте';
+$lang['Main Page'] = 'Главна страна';
+$lang['Photo Page'] = 'Фото страна';
+$lang['Activate Navigation Bar'] = 'Активирај линију за навигацију';
+$lang['Activate Navigation Thumbnails'] = 'Активирај повезне сличице за навигацију';
+$lang['Activate icon "%s"'] = 'Активиирај икону "%s"';
+$lang['Photo Properties'] = 'Особине слике';
+$lang['Allow user customization'] = 'Дозволи подешавања кориснику';
+$lang['Languages'] = 'Језици';
+$lang['Installed Languages'] = 'Инсталирани језици';
+$lang['Add New Language'] = 'Додај нови језик';
+$lang['Language has been successfully installed'] = 'Језик је успешно инсталиран';
+$lang['Select:'] = 'Одабери:';
+$lang['None'] = 'Ништа';
+$lang['Invert'] = 'Супротно';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Немогуће деактивирати ову тему, треба Вам бар једна тема.';
+$lang['Webmaster status is required.'] = 'Потребан је статус мајстора интернет страница.';
+$lang['Bound Theme'] = 'Повезана тема';
+$lang['Allow rating'] = 'Дозволи рангирање';
+$lang['Select at least one comment'] = 'Одабери најмање један коментар';
+$lang['Active Plugins'] = 'Активни додаци';
+$lang['Inactive Plugins'] = 'Неактивни додаци';
+$lang['Missing Plugins'] = 'Недостајући додаци';
+$lang['Uninstalled Plugins'] = 'Деинсталирани додаци';
+$lang['By %s'] = 'Од %s';
+$lang['Visit plugin site'] = 'Посети страницу са додацима';
+$lang['Active Languages'] = 'Активни језици';
+$lang['Delete this language'] = 'Обриши овај језик';
+$lang['Forbid this language to users'] = 'Забрани овај језик за кориснике';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Немогуће деактивирати овај језик, прво одаберите други језик као подразумевани.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Немогуће деактивирати овај језик, треба Вам најмање један језик.';
+$lang['Inactive Languages'] = 'Неактивни језици';
+$lang['Make this language available to users'] = 'Омогући овај језик корисницима';
+$lang['Set as default language for unregistered and new users'] = 'Постави као подразумевани језик за нерегистроване и нове кориснике';
+$lang['Add Photos'] = 'Додај фотографије';
+$lang['The following tag was deleted'] = 'Текућа ознака је обрисана';
+$lang['Miscellaneous'] = 'Остало';
+$lang['Virtual Links'] = 'Виртуалне везе';
+$lang['There is no other language available.'] = 'Други језик није доступан.';
+$lang['There is no other plugin available.'] = 'Други додатак није доступан.';
+$lang['There is no other theme available.'] = 'Друга тема није доступна.';
+$lang['By rank'] = 'По рангу';
+$lang['Manual order'] = 'Ручно поређано';
+$lang['Add another set of photos'] = 'Додај други сет фотографија';
+$lang['Order of menubar items has been updated successfully.'] = ' Поредак елемената у избору је успешно ажуриран.';
+$lang['Menu Management'] = 'Контрола избора';
+$lang['Who can see this photo?'] = 'Ко може да види ову слику?';
+$lang['This theme was not designed to be directly activated'] = 'Ова тема није пројектована да може бити непосредно активирана';
+$lang['Pending Comments'] = 'Коментари који чекају на објављивање';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'У Вашој php.ini датотеци, upload_max_filesize (%sB) је већи од post_max_size (%sB), требало би да промените ову вредност';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif екстензија није на располагању, администратор треба да онемогућите коришћење Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Пренешена датотека премашује upload_max_величину датотеке у php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Пренете датотеке су веће од  post_max_size вредности у  php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Пренета датотека је већа од MAX_FILE_SIZE вредности дефинисане у HTML обрасцу';
+$lang['The uploaded file was only partially uploaded'] = 'Преузимана датотека је само делимично преузета!';
+$lang['No file was uploaded'] = 'Ниједна датотека није преузета';
+$lang['Missing a temporary folder'] = 'Недостаје привремени директоријум';
+$lang['Failed to write file to disk'] = 'Грешка при упису на диск';
+$lang['File upload stopped by extension'] = 'Преузимање датотеке зауставњено због продужног имена';
+$lang['Unknown upload error'] = 'Непозната грешка преузимања!';
+$lang['Error on file "%s" : %s'] = 'Грешка код датотеке "%s" : %s';
+$lang['%d of %d photos selected'] = '%d од %d фотографија одабрано';
+$lang['Action'] = 'Операција';
+$lang['Add a filter'] = 'Додај филтер';
+$lang['Album photos associated to the following albums: %s'] = 'Слике албума  се налазе и у следећим албумима: %s';
+$lang['Albums automatically sorted'] = 'Албуми су аутоматски уређени';
+$lang['All %d photos are selected'] = 'Одабране су све слике: %d ';
+$lang['Apply action'] = 'Примени операцију';
+$lang['automatic order'] = 'аутоматско сређивање';
+$lang['Batch Manager'] = 'Менаџер операција';
+$lang['Choose an action'] = 'Одабери операцију';
+$lang['Delete orphan tags'] = 'Обриши orphan ознаку';
+$lang['delete photo'] = 'избриши фотографију';
+$lang['Duplicates'] = 'дупликати';
+$lang['include child albums'] = 'укључи подалбуме';
+$lang['manual order'] = 'ручно уређивање';
+$lang['No photo in the current set.'] = 'Нема фотографија у одабраном скупу.';
+$lang['No photo selected, %d photos in current set'] = 'Ниједна одабрана фотографија, број фотографија у одабраном скупу: %d';
+$lang['No photo selected, no action possible.'] = 'Ниједна одабрана фотографија, нема могућих операција.';
+$lang['on the %d selected photos'] = 'on the %d одабране слике';
+$lang['Orphan tags deleted'] = 'Orphan ознака обрисана';
+$lang['Refresh photo set'] = 'Обнови скуп слика';
+$lang['Remove all filters'] = 'Обриши све филтере';
+$lang['remove author'] = 'обриши аутора';
+$lang['remove creation date'] = 'обриши датум прављења';
+$lang['Remove from caddie'] = 'Избриши из caddie';
+$lang['remove this filter'] = 'избриши овај филтер';
+$lang['remove title'] = 'обриши наслов';
+$lang['Selection'] = 'Избор';
+$lang['Set author'] = 'Постави аутора';
+$lang['Set creation date'] = 'Постави датум прављења';
+$lang['Set title'] = 'Постави наслов';
+$lang['The whole page'] = 'Комплетна страница';
+$lang['The whole set'] = 'Комплетан скуп';
+$lang['Type here the author name'] = 'Откуцај овде име аутора';
+$lang['Type here the title'] = 'Откуцај овде наслов';
+$lang['Week starts on'] = 'Недеља стартује у';
+$lang['You have %d orphan tags: %s.'] = 'Имате %d orphan ознака: %s.';
+$lang['Themes which need upgrade'] = 'Теме које треба да унапредите';
+$lang['Languages which need upgrade'] = 'Језици које треба да унапредите';
+$lang['All themes are up to date.'] = 'Све теме су унапређене.';
+$lang['All plugins are up to date.'] = 'Сви додаци су унапређени.';
+$lang['All languages are up to date.'] = 'Сви језици су унапређени.';
+$lang['Visit theme site'] = 'Посетите страницу о теми';
+$lang['Visit language site'] = 'Посетите страницу о језику';
+$lang['New Version'] = 'Нова верзија';
+$lang['Obsolete Plugins'] = 'Застарели додаци';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'Упозорење! Овај додатак није компатибилан са овом верзијом Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Да ли ипак желите да је активирате?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'Овај додатак је сада део PIWIGO програма! Обришите га  ОДМАХ!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ГРЕШКА: Овај додатак недостаје, али је инсталиран! Уклоните(деинсталирате) га ОДМАХ.';
+$lang['new'] = 'Ново';
+$lang['No results'] = 'Без резултата';
+$lang['Searching...'] = 'Тражење...';
+$lang['Type in a search term'] = 'Откуцајте тражени израз';
+$lang['display'] = 'приказ';
+$lang['Average rate'] = 'Просечна оцена';
+$lang['Rate'] = 'Оцена';
+$lang['Deactivate all'] = 'Искључи све';
+$lang['Restore'] = 'Обнови';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Обнови подразумевану конфигурацију. Изгубићете Ваша подешавања додатака!';
+$lang['Show menubar'] = 'Прикажи мени';
+$lang['Thumbnails generation in progress...'] = 'У току је генерисање сличица ...';
+$lang['Photos generation in progress...'] = 'У току је генерисање слика ...';
+$lang['%s photos have been regenerated'] = 'Број регенерисаних фотографија: %s';
+$lang['%s photos can not be regenerated'] = 'Број фотографија који се не може регенерисати: %s';
+$lang['Updates'] = 'Унапређење';
+$lang['Update in progress... Please wait.'] = 'У току је унапређење... Молимо Вас да сачеката.';
+$lang['Ignore this update'] = 'Занемари ово унапређење';
+$lang['Reset ignored updates'] = 'Обнови занемарена унапређења';
+$lang['Update All'] = 'Унапреди све';
+$lang['ERROR'] = 'Грешка';
+$lang['Update Complete'] = 'Унапређење је завршено';
+$lang['Piwigo Update'] = 'ПиВиГо је унапређен';
+$lang['Extensions Update'] = 'Додатаци су унапређени';
+$lang['All extensions are up to date.'] = 'Сви додаци су ажурирани.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Следећи додаци можда нису компатибилни са новом верзијом ПиВиГо-а:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Следеће теме можда нису компатибилне са новом верзијом ПиВиГо-а:';
+$lang['I decide to update anyway'] = 'Одлучио сам да унапредим у сваком случају';
+$lang['Update to Piwigo %s'] = 'Унапредите на ПиВиГо: %s';
+$lang['Two updates are available'] = 'Два унапређења су доступна';
+$lang['This is a minor update, with only bug corrections.'] = 'Ово је мање унапређење, само са мањим корекцијама грешака.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Ово је главно унапређење, са <a href="%s">новим могућностима</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Неке теме и додаци можда још нису доступни.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Можете унапредити ПиВиГо директно на %s, без унапређења ПиВиГо-а %s (препоручено).';
+$lang['Save Template Directory'] = 'Снимање адресара шаблона';
+$lang['Dump Database'] = 'Дамповање базе података';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Укључи податке о историји (Упозорење: Меморијско ограничење сервера може бити прекорачено)';
+$lang['Unable to dump database.'] = 'Не могу да дампујем базу података.';
+$lang['Some upgrades are available for extensions.'] = 'Нека унапређења су доступна за проширења.';
+$lang['Ignore All'] = 'Занемари све';
+$lang['Crop'] = 'Одсецање';
+$lang['Width'] = 'Ширина';
+$lang['Height'] = 'Висина';
+$lang['Follow Orientation'] = 'Следећа орјентација';
+$lang['Graphics Library'] = 'Графичка библиотека';
+$lang['Learn more'] = 'Научите више';
+$lang['An error has occured during upgrade.'] = 'Појавила се грешка у току унапређења.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Појавила се грешка у току распаковања. Молимо Вас, проверите дозволе приступа Вашој piwigo инсталацији.<br><a href="%s">Притисните овде да видите извештај о грешкама</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo не може да преузме датотеку за надоградњу са сервера';
+$lang['Add to caddie'] = 'додај у фиоку';
+
+$lang['(this tag will be deleted)'] = '(ова ознака биће обрисана)';
+$lang['... or '] = '... или';
+$lang['Activate comments'] = 'Активирај коментар';
+$lang['Add a criteria'] = 'Додај критеријум';
+$lang['Add tags'] = 'Додај ознаке';
+$lang['Allowed file types: %s.'] = 'Дозвољене врсте датотека: %s.';
+$lang['Cancel'] = 'Откажи';
+$lang['Default comments order'] = 'Подразумевани редослед коментара';
+$lang['Default photos order'] = 'Подразумевани редослед фотографија';
+$lang['Merge selected tags'] = 'Споји одабране ознаке';
+$lang['Merge tags'] = 'Споји ознаке';
+$lang['Photo name'] = 'Назив фотографије';
+$lang['bottom left corner'] = 'горњи леви угао';
+$lang['bottom right corner'] = 'доњи десни угао';
+?>
Index: tags/2.4.0RC3/language/sr_RS/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/sr_RS/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Српски [SR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=458
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Српски';
+$lang_info['country'] = 'Србија';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'sr';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d категорија обновљена';
+$lang['%d albums updated'] = '%d категорије обновљене';
+$lang['%d comment to validate'] = '%d коментар за оверу';
+$lang['%d comments to validate'] = '%d коментари за оверу';
+$lang['%d new comment'] = '%d нови коментар';
+$lang['%d new comments'] = '%d нови коментари';
+$lang['%d comment'] = '%d коментар';
+$lang['%d comments'] = '%d коментари';
+$lang['%d hit'] = '%d посета';
+$lang['%d hits'] = '%d посета';
+$lang['%d new photo'] = 'број нових слика: %d';
+$lang['%d new photos'] = 'нове слике - %d';
+$lang['%d new user'] = '%d нови корисник';
+$lang['%d new users'] = '%d нови корисници';
+$lang['About'] = 'O...';
+$lang['All tags'] = 'Све ознаке';
+$lang['Any tag'] = 'Било која ознака';
+$lang['At least one listed rule must be satisfied.'] = 'Најмање једно од наведених правила мора бити задовољено.';
+$lang['Author'] = 'Аутор';
+$lang['Albums'] = 'Категорије';
+$lang['Album'] = 'Категорија';
+$lang['Close this window'] = 'Затвори прозор';
+$lang['Complete RSS feed (photos, comments)'] = 'Потпуни RSS извори (слике, коментари)';
+$lang['Confirm Password'] = 'Потврди Лозинку';
+$lang['Connection settings'] = 'Подешавања повезивања';
+$lang['Login'] = 'Пријава';
+$lang['Contact webmaster'] = 'Пишите wебмастер-у';
+$lang['Create a new account'] = 'Направи нови налог';
+$lang['Created on'] = 'Датум израде:';
+$lang['Creation date'] = 'Датум израде';
+$lang['Current password is wrong'] = 'Тренутна лозинка је неисправна';
+$lang['Dimensions'] = 'Величине';
+$lang['Display'] = 'Приказ';
+$lang['Each listed rule must be satisfied.'] = 'Свако наведено правило мора бити задовољено.';
+$lang['Email address is missing. Please specify an email address.'] = 'Недостаје адреса електронске поште';
+$lang['Email address'] = 'Адреса електронске поште';
+$lang['Enter your personnal informations'] = 'Упишите своје личне податке';
+$lang['Error sending email'] = 'Грешка приликом слања електронске поште';
+$lang['File name'] = 'Назив датотеке';
+$lang['File'] = 'Датотека';
+$lang['Filesize'] = 'Величина датотеке';
+$lang['Filter and display'] = 'Филтер и приказ';
+$lang['Filter'] = 'Филтер';
+$lang['Forgot your password?'] = 'Заборавили сте лозинку?';
+$lang['Go through the gallery as a visitor'] = 'Прегледајте галерију као посетиоц';
+$lang['Help'] = 'Помоћ';
+$lang['Identification'] = 'Пријава';
+$lang['Photos only RSS feed'] = 'RSS извор само за слике';
+$lang['Keyword'] = 'Кључна реч';
+$lang['Links'] = 'Интернет везе';
+$lang['N/A'] = 'Н/Д';
+$lang['New on %s'] = 'Нови на %s';
+$lang['Notification'] = 'Обавештење';
+$lang['Number of items'] = 'Број ставки';
+$lang['Original dimensions'] = 'Изворне величине';
+$lang['Password forgotten'] = 'Заборављена лозинка';
+$lang['Password'] = 'Лозинка';
+$lang['Post date'] = 'Датум објаве:';
+$lang['Posted on'] = 'Датум објављивања';
+$lang['Profile'] = 'Профил';
+$lang['Quick connect'] = 'Брза веза';
+$lang['RSS feed'] = 'RSS извор';
+$lang['Register'] = 'Упишите се';
+$lang['Registration'] = 'Регистрација';
+$lang['Related tags'] = 'Повезане ознаке';
+$lang['Reset'] = 'Поништи';
+$lang['Retrieve password'] = 'Врати лозинку';
+$lang['Search rules'] = 'Правила претраге';
+$lang['Search tags'] = 'Ознаке претраге';
+$lang['Search'] = 'Претраживање';
+$lang['display available tags'] = 'Погледај доступне ознаке';
+$lang['Since'] = 'Од';
+$lang['Sort by'] = 'Сложено по';
+$lang['Sort order'] = 'Редослед слагања';
+$lang['Tag'] = 'Ознака';
+$lang['Tags'] = 'Ознаке';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS обавијесни извор омогућава обавештавање о новостима са овог wеб места : нове слике, обновљене категорије, нове коментаре. Користите читач RSS iзвора.';
+$lang['Unknown feed identifier'] = 'Непозната ознака извора';
+$lang['User comments'] = 'Кориснички коментари';
+$lang['Username'] = 'Корисничко име';
+$lang['Visits'] = 'Посета';
+$lang['Webmaster'] = 'Мајстор за интернет странице';
+$lang['Week %d'] = 'Недеља %d';
+$lang['About Piwigo'] = 'О Piwigo-u';
+$lang['You are not authorized to access the requested page'] = 'Нисте овлаштени за приступ затраженој страници';
+$lang['add this photo to your favorites'] = 'додај ову слику у омиљене';
+$lang['Administration'] = 'Администрација';
+$lang['all'] = 'све';
+$lang['ascending'] = 'узлазно';
+$lang['author(s) : %s'] = 'аутор(и) : %s';
+$lang['Expand all albums'] = 'Прошири све категорије';
+$lang['posted after %s (%s)'] = 'објављено после %s (%s)';
+$lang['posted before %s (%s)'] = 'објављено пре %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'објављено између %s (%s) и %s (%s)';
+$lang['posted on %s'] = 'објављено на %s';
+$lang['Best rated'] = 'Најбоље оцењено';
+$lang['display best rated photos'] = 'приказ најбоље оцењених ставки';
+$lang['Calendar'] = 'Календар';
+$lang['All'] = 'Све';
+$lang['display each day with photos, month per month'] = 'приказ сваког дана са сликама, месец по месец';
+$lang['View'] = 'Погледај';
+$lang['chronology_monthly_calendar'] = 'Месечни календар';
+$lang['chronology_monthly_list'] = 'Месечни попис';
+$lang['chronology_weekly_list'] = 'Недељни попис';
+$lang['Click here if your browser does not automatically forward you'] = 'Кликните овде ако нисте аутоматски пребачени';
+$lang['comment date'] = 'датум коментара';
+$lang['Comment'] = 'Коментар';
+$lang['Your comment has been registered'] = 'Ваш је коментар уписан';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood систем : молимо сачекајте мало пре објаве новог коментара';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Ваш коментар НИЈЕ уписан јер није прошао правила овере';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Администратор мора одобрити ваш коментар пре објаве.';
+$lang['This login is already used by another user'] = 'Ово корисничко име се већ користи';
+$lang['Comments'] = 'Коментари';
+$lang['Add a comment'] = 'Додај коментар';
+$lang['created after %s (%s)'] = 'направљен након %s (%s)';
+$lang['created before %s (%s)'] = 'направљен прије %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'направљен између %s (%s) и %s (%s)';
+$lang['created on %s'] = 'направљен на %s';
+$lang['Customize'] = 'Подеси';
+$lang['Your Gallery Customization'] = 'Подешавање Ваше Галерије ';
+$lang['day'][0] = 'Недеља';
+$lang['day'][1] = 'Понедељак';
+$lang['day'][2] = 'Уторак';
+$lang['day'][3] = 'Среда';
+$lang['day'][4] = 'Четвртак';
+$lang['day'][5] = 'Петак';
+$lang['day'][6] = 'Субота';
+$lang['Default'] = 'Подразумевано';
+$lang['delete this photo from your favorites'] = 'уклоните ову слику из омиљених';
+$lang['Delete'] = 'Уклони';
+$lang['descending'] = 'силазно';
+$lang['Download'] = 'преузми';
+$lang['Download this file'] = 'преузми ову слику';
+$lang['edit'] = 'уреди';
+$lang['wrong date'] = 'погрешан датум';
+$lang['excluded'] = 'искључено';
+$lang['Your favorites'] = 'Моји омиљени';
+$lang['display your favorites photos'] = 'приказ мојих омиљених слика';
+$lang['Favorites'] = 'Омиљени';
+$lang['First'] = 'Први';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Галерија је закључана због одржавања. Молимо, навратите касније.';
+$lang['Page generated in'] = 'Страница израђена у ';
+$lang['guest'] = 'гост';
+$lang['Hello'] = 'Поздрав';
+$lang['available for administrators only'] = 'доступно само администраторима';
+$lang['display this album'] = 'приказује слике у главној категорији';
+$lang['display last user comments'] = 'Преглед задњих корисничких коментара';
+$lang['customize the appareance of the gallery'] = 'подесите изглед ваше галерије';
+$lang['search'] = 'претражи';
+$lang['Home'] = 'Почетна';
+$lang['in this album'] = 'у овој категорији';
+$lang['in %d sub-album'] = 'у %d подкатегорији';
+$lang['in %d sub-albums'] = 'у %d подкатегорија';
+$lang['included'] = 'укључено';
+$lang['Invalid password!'] = 'Погрешна лозинка!';
+$lang['Language']='Језик';
+$lang['last %d days'] = 'задњих %d дана';
+$lang['Last'] = 'Задњи';
+$lang['Logout'] = 'Одјава';
+$lang['obligatory'] = 'обвезно';
+$lang['Maximum photo height'] = 'Највећа дозвољена висина слика';
+$lang['Maximum height must be a number superior to 50'] = 'Највећа висина мора бити број већи од 50';
+$lang['Maximum photo width'] = 'Највећа дозвољена ширина слика';
+$lang['Maximum width must be a number superior to 50'] = 'Највећа ширина мора бити број већи од 50';
+$lang['display a calendar by creation date'] = 'приказ календара по датуму израде';
+$lang['display all photos in all sub-albums'] = 'приказ свих ставки у свим подкатегоријама';
+$lang['return to normal view mode'] = 'повратак у уобичајени начин прегледа';
+$lang['display a calendar by posted date'] = 'приказ календара по датуму објаве';
+$lang['month'][10] = 'Октобар';
+$lang['month'][11] = 'Новембар';
+$lang['month'][12] = 'Децембар';
+$lang['month'][1] = 'Јануар';
+$lang['month'][2] = 'Фебруар';
+$lang['month'][3] = 'Март';
+$lang['month'][4] = 'Април';
+$lang['month'][5] = 'Мај';
+$lang['month'][6] = 'Јун';
+$lang['month'][7] = 'Јул';
+$lang['month'][8] = 'Август';
+$lang['month'][9] = 'Септембар';
+$lang['Most visited'] = 'Најпосјећеније';
+$lang['display most visited photos'] = 'приказ најпосјећенијих слика';
+$lang['Unknown identifier'] = 'Непозната ознака';
+$lang['New password'] = 'Нова лозинка';
+$lang['Rate this photo'] = 'Оцени ову слику';
+$lang['Next'] = 'Следећи';
+$lang['no rate'] = 'без оцене';
+$lang['Photos posted within the last %d day.'] = 'Ставке објављене у задњем %d дану.';
+$lang['Photos posted within the last %d days.'] = 'Ставке објављене у задњих %d дана.';
+$lang['password updated'] = 'лозинка обновљена';
+$lang['Recent period must be a positive integer value'] = 'Раздобље мора бити позитивна целобројна вредност';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'слика';
+$lang['Click on the photo to see it in high definition'] = 'Кликни на слику за преглед у високој резолуцији';
+$lang['Show file metadata'] = 'Прикажи мета податке записа';
+$lang['Powered by'] = 'Урађено у';
+$lang['Preferences'] = 'Подешења';
+$lang['Previous'] = 'Претходни';
+$lang['Random photos'] = 'Слике по случајном избору';
+$lang['display a set of random photos'] = 'приказ слика по случајном избору';
+$lang['Recent albums'] = 'Недавне категорије';
+$lang['display recently updated albums'] = 'приказ недавно обновљених категорија';
+$lang['Recent period'] = 'Недавно раздобље';
+$lang['Recent photos'] = 'Недавне слике';
+$lang['display most recent photos'] = 'приказ најновијих слика';
+$lang['Redirection...'] = 'Преусмеравање...';
+$lang['Please, enter a login'] = 'Молимо, пријавите се';
+$lang['login mustn\'t end with a space character'] = 'пријава не сме завршавати размаком';
+$lang['login mustn\'t start with a space character'] = 'пријава не сме почињати размаком';
+$lang['this login is already used'] = 'ово корисничко име се већ користи';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адреса електронске поште мора бити облика xxx@yyy.eee (нпр. : korisnik@stranica.org)';
+$lang['please enter your password again'] = 'молимо унесите лозинку поново';
+$lang['Auto login'] = 'Упамти ме';
+$lang['remove this tag from the list'] = 'уклони  ову ознаку из пописа';
+$lang['representative'] = 'представник';
+$lang['Search for Author'] = 'Претраживање по аутору';
+$lang['Search in albums'] = 'Претраживање у категоријама';
+$lang['Search by date'] = 'Претраживање по датуму';
+$lang['Date'] = 'Датум';
+$lang['End-Date'] = 'Крајњи датум';
+$lang['Kind of date'] = 'Врста датума';
+$lang['Search for words'] = 'Претраживање по речима';
+$lang['Search for all terms'] = 'Претраживање по свим критеријумима ';
+$lang['Search for any term'] = 'Претраживање по било којем критеријуму';
+$lang['Empty query. No criteria has been entered.'] = 'Празна претрага. Није унешено ни једно поље.';
+$lang['Search results'] = 'Резултати претраживања';
+$lang['Search in sub-albums'] = 'Претраживање у подкатегоријама';
+$lang['searched words : %s'] = 'тражене речи : %s';
+$lang['Contact'] = 'Контакт';
+$lang['set as album representative'] = 'постави за представника категорије';
+$lang['Show number of comments'] = 'Pрикажи број коментара';
+$lang['Show number of hits'] = 'Прикажи број посета';
+$lang['slideshow'] = 'клизни приказ';
+$lang['stop the slideshow'] = 'заустави клизни приказ';
+$lang['Specials'] = 'Посебне категорије';
+$lang['SQL queries in'] = 'SQL упит у ';
+$lang['display only recently posted photos'] = 'приказ само недавно објављених слика';
+$lang['return to the display of all photos'] = 'повратак у приказ свих слика';
+$lang['the beginning'] = 'почетак';
+$lang['Interface theme'] = 'тема';
+$lang['Thumbnails'] = 'Сличице';
+$lang['Menu'] = 'Избор';
+$lang['A comment on your site'] = 'Коментар на Вашој интернет страници';
+$lang['today'] = 'данас';
+$lang['Update your rating'] = 'Обновите своју оцену';
+$lang['the username must be given'] = 'мора се уписати корисничко име';
+$lang['useful when password forgotten'] = 'корисно када се заборави лозинка';
+$lang['Quick search'] = 'Брзо претраживање';
+$lang['Connected user: %s'] = 'Повезани корисник: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Претраживач: %s';
+$lang['Author: %s'] = 'Аутор: %s';
+$lang['Comment: %s'] = 'Коментар: %s';
+$lang['Comment by %s'] = 'Коментарисао-ла %s';
+$lang['User: %s'] = 'Корисник: %s';
+$lang['Email: %s'] = 'Електронска адреса: %s';
+$lang['Admin: %s'] = 'Администратор: %s';
+$lang['Registration of %s'] = 'Пријава од %s';
+$lang['Album: %s'] = 'Категорија: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Лош статус за корисника "гост", користи се подразумевани статус. Молимо обавестите мајстора интернет страница.';
+$lang['this email address is already in use'] = 'корисник већ користи ову адресу електронске поште';
+$lang['Album results for'] = 'Резултати категорије за ';
+$lang['Tag results for'] = 'Резултати ознака за';
+$lang['from %s to %s'] = 'од %s до %s';
+$lang['Play of slideshow'] = 'Покрени клизни приказ';
+$lang['Pause of slideshow'] = 'Заустави клизни приказ';
+$lang['Repeat the slideshow'] = 'Понови клизни приказ';
+$lang['Not repeat the slideshow'] = 'Не понављај клизни приказ';
+$lang['Reduce diaporama speed'] = 'Смањи брзину ';
+$lang['Accelerate diaporama speed'] = 'Повећај брзину ';
+$lang['Submit'] = 'Пошаљи';
+$lang['Yes'] = 'Да';
+$lang['No'] = 'Не';
+$lang['%d photo']='слика %d';
+$lang['%d photos']='%d слике';
+$lang['%d photo is also linked to current tags'] = '%d слика такође повезана са тренутним ознакама';
+$lang['%d photos are also linked to current tags'] = '%d слике такође повезана са тренутним ознакама';
+$lang['display photos linked to this tag'] = 'Прегледај слике повезане само са овом ознаком';
+$lang['photos posted during the last %d days'] = 'слике објављене током задњих %d дана';
+$lang['Piwigo Help'] = 'Piwigo Помоћ';
+$lang['Rank'] = 'Редослед';
+$lang['group by letters'] = 'сложено по словима';
+$lang['letters'] = 'слова';
+$lang['show tag cloud'] = 'прикажи означен облак';
+$lang['cloud'] = 'облак';
+$lang['Reset to default values'] = 'Врати на подразумеване вредности';
+$lang['delete all photos from your favorites'] = 'обриши све слике из Омиљени';
+$lang['Sent by'] = 'Послао';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies су блокирани или нису подржани од Вашег претраживача. Морате омогућити цоокиес да би се логовали.';
+$lang['Edit a comment'] = 'Уреди коментар';
+$lang['Are you sure?'] = 'Јесте ли сигурни?';
+$lang['(!) This comment requires validation'] = '(!) Овај коментар захтева оверу';
+$lang['Welcome'] = 'Добродошли';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Добродошли у Вашу Piwigo фото галерију!';
+$lang['... or browse your empty gallery'] = '... или претражи Вашу празну галерију';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... или искључите ову поруку, урадићу то на свој начин';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Здраво %s, Ваша Piwigo фото галерија је празна!';
+$lang['I want to add photos'] = 'Желим да додам фотографије';
+$lang['Manage this user comment: %s'] = 'Уреди коментаре овог корисника: %s';
+$lang['This author modified following comment:'] = 'Овај аутор је мењао текући коментар:';
+$lang['This author removed the comment with id %d'] = 'Овај аутор је уклонио коментар са идентификацијом %d';
+$lang['html tags are not allowed in login'] = 'html ознаке нису дозвољене овде';
+$lang['The number of photos per page must be a not null scalar'] = 'Број фотографија по страни мора бити већи од нуле';
+$lang['Number of photos per page'] = 'Број фотографија по страници';
+$lang['%d rates'] = '%d оцена';
+$lang['Rating score'] = 'Оцена резултата';
+$lang['Invalid username or email'] = 'Неправилно корисничко име или адреса е-поште';
+$lang['Password reset is not allowed for this user'] = 'Поништавање лозинке није дозвољено за овог корисника';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Корисник "%s" нема адресу е-поште, поништавање лозинке није могуће';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Неко је захтевао да се лозинка поништи за корисничко налог:';
+$lang['Username "%s" on gallery %s'] = 'Корисничко име "%s" у галерији %s';
+$lang['To reset your password, visit the following address:'] = 'Да бисте поништили Вашу лозинку прочитајте пошту са следеће е-адресе:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Ако је ово грешка, занемарите ову поруку и ништа се неће десити.';
+$lang['Password Reset'] = 'Поништавање лозинке';
+$lang['Check your email for the confirmation link'] = 'Проверите вашу е-пошту за везу за потврду';
+$lang['Invalid key'] = 'Лош кључ';
+$lang['The passwords do not match'] = 'Лозинке нису једнаке';
+$lang['Your password has been reset'] = 'Ваша лозинка је поништена';
+$lang['Return to home page'] = 'Повратак на почетну страницу';
+$lang['Please enter your username or email address.'] = 'Молимо Вас да унесете корисничко име или е-адресу.';
+$lang['You will receive a link to create a new password via email.'] = 'Добићете везу  преко е-поште да бисте променили лозинку.';
+$lang['Username or email'] = 'Корисничко име или е-адреса';
+$lang['Change my password'] = 'Промени моју лозинку';
+$lang['Enter your new password below.'] = 'Унесите Вашу нову лозинку испод.';
+$lang['Edit'] = 'Промени';
+$lang['EXIF Metadata'] = 'EXIF подаци';
+$lang['Hello %s,'] = 'Здраво %s,';
+$lang['IPTC Metadata'] = 'IPTC подаци';
+$lang['Send my connection settings by email'] = 'Пошаљи податке о подешавању везе електронском поштом';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Успешна регистрација, добићете ускоро е-пошту са подацима о подешавању везе. Добродошли!';
+$lang['Username modification'] = 'Промена корисничког имена';
+$lang['Your username has been successfully changed to : %s'] = 'Ваше корисничко име је успешно промењено у : %s';
+$lang['square'] = 'квадрат';
+$lang['thumb'] = 'сличица';
+$lang['small'] = 'мала';
+$lang['medium'] = 'средња';
+$lang['large'] = 'Велика';
+$lang['xlarge'] = 'XL велика';
+$lang['xxlarge'] = 'XXL велика';
+$lang['Original'] = 'оригинална';
+$lang['Thank you for registering at %s!'] = 'Хвала за регистрацију на %s!';
+$lang['Here are your connection settings'] = 'Овде су ваша подешавања за везу';
+$lang['Password: %s'] = 'Лозинка: %s';
+$lang['Username: %s'] = 'Корисничко име: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Ако мислите да сте добили ову е-пошту грешком, контактирајте нас на следећу адресу: %s';
+$lang['Show oldest comments first'] = 'Прикажи најстарије коментаре прво';
+$lang['Show latest comments first'] = 'Прикажи последње коментаре прво';
+$lang['2small'] = 'XXS - мали';
+$lang['xsmall'] = 'XS - врло мали';
+$lang['Photo sizes'] = 'Величине фотографија';
+$lang['View in'] = 'Погледај у';
+$lang['Mobile'] = 'Мобилни';
+$lang['Desktop'] = 'Стони';
+$lang['File name, A &rarr; Z'] = 'Назив датотеке, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Назив датотеке, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Наслов фотографије, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Наслов фотографије, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Датум сликања, најсновији &rarr; најстарији';
+$lang['Date created, old &rarr; new'] = 'Датум сликања, најстарији &rarr; најновији';
+$lang['Date posted, new &rarr; old'] = 'Датум објављивања, најновији &rarr; најстарији';
+$lang['Date posted, old &rarr; new'] = 'Датум објављивања, најстарији &rarr; најновији';
+$lang['Rating score, high &rarr; low'] = 'Према оцењивању, највећа &rarr; најмања';
+$lang['Rating score, low &rarr; high'] = 'Према оцењивању, најмања &rarr; највећа';
+$lang['Visits, high &rarr; low'] = 'Посете, најбројније &rarr; најмање';
+$lang['Visits, low &rarr; high'] = 'Посете, најмање &rarr; најбројније';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Бројчана променљива, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Бројчана променљива, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Ручно уређени редослед'; 
+
+?>
Index: tags/2.4.0RC3/language/sr_RS/index.php
===================================================================
--- tags/2.4.0RC3/language/sr_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sr_RS/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/sr_RS/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/install.lang.php	(revision 14585)
@@ -0,0 +1,70 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['Installation'] = 'Инсталација';
+$lang['Basic configuration'] = 'Основна подешења';
+$lang['Default gallery language'] = 'Подразумевани језик галерије';
+$lang['Database configuration'] = 'Подешавање базе';
+$lang['Admin configuration'] = 'Администраторска подешења';
+$lang['Start Install'] = 'Покрени инсталацију';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'Адреса електронске поште мора бити у облику xxx@yyy.eee (пример : milos@firma.org)';
+$lang['Webmaster login'] = 'Приступ уредника интернет страница';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Биће приказано посетиоцима. Неопходно је за администрацију интернет страница';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Повезивање на сервер успешно, али повезивање на базу је немогућа';
+$lang['Can\'t connect to server'] = 'Немогуће повезивање на сервер';
+$lang['Host'] = 'Хост';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Korisnik';
+$lang['user login given by your host provider'] = 'корисничко име дато од стране Вашег давалаца интернет услуга';
+$lang['Password'] = 'Лозинка';
+$lang['user password given by your host provider'] = 'корисничка лозинка дата од стране Вашег давалаца интернет услуга';
+$lang['Database name'] = 'Име базе';
+$lang['also given by your host provider'] = 'такоде дато од Вашег дистрибутера интернет услуга';
+$lang['Database table prefix'] = 'Префиx табела базе';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'име табеле базе биће префикс са њим (омогућава да управљате боље Вашим табелама)';
+$lang['enter a login for webmaster'] = 'Унеси приступне податке за уредника интернет страница';
+$lang['webmaster login can\'t contain characters \' or "'] = 'приступни подаци за уредника интернет страница не могу садржати знаке \' или "';
+$lang['please enter your password again'] = 'молим унесите Вашу лозинку поново';
+$lang['Webmaster password'] = 'Лозинка уредника интернет страница';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Сачувајте у тајности, омогућава приступ администраторском делу';
+$lang['Password [confirm]'] = 'Лозинка[потврди]';
+$lang['verification'] = 'Провера';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Потребна Вам је помоц? Питајте на  <a href="%s">Piwigo табли за поруке</a>.';
+$lang['Webmaster mail address'] = 'Адреса електронске поште  уредника интернет страница';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Посетиоци ће бити у могућности да са ове електронске адресе контактирају администратора странице';
+$lang['PHP 5 is required'] = 'PHP 5 је неопходан';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Izgleda da Vaš webhost trenutno koristi PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo може покушати да промени Вашу конфигурацију на PHP 5 формирањем или мењањем .htaccess датотеке.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Имајте у виду да можете сами изменити Вашу конфигурацију рестартовати Piwigo после тога.';
+$lang['Try to configure PHP 5'] = 'Покушајте да подестите PHP 5';
+$lang['Sorry!'] = 'Жао нам је!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo није успео да подеси PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Требало би да се обартите подршци Вашег хостинг провајдера за упутство како да промените на PHP 5 сами.';
+$lang['Hope to see you back soon.'] = 'Надамо се да се ускоро поново видимо.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Честитамо, Piwigo инсталација је завршена';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Алтернативно решење је да копирате текст из кутије изнад и налепите у датотеку "local/config/database.inc.php" (Упозорење : database.inc.php мора садржати само текст из кутије, без линије или празних карактера)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Формирање конфигурационе датотеке local/config/database.inc.php неуспешно.';
+$lang['Download the config file'] = 'Сними на рачунар конфигурациону датотеку';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Можете снимити на рацунар конфигурациону датотеку и послати је на local/config директоријум Ваше инсталације.';
+?>
Index: tags/2.4.0RC3/language/sr_RS/iso.txt
===================================================================
--- tags/2.4.0RC3/language/sr_RS/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Српски [SR]
Index: tags/2.4.0RC3/language/sr_RS/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/sr_RS/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sr_RS/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "Надоградња";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Ова страница предлаже надоградњу базе са Piwigo старе верзије на нову.
+Асистент надоградње процењује да тренутно користите <strong>издање %s</strong> (или еквивалентну).";
+$lang['Upgrade from version %s to %s'] = "Надоградња са верзије %s на %s";
+$lang['Statistics'] = "Статистика";
+$lang['total upgrade time'] = "укупно време надоградње";
+$lang['total SQL time'] = "укупно SQL време";
+$lang['SQL queries'] = "SQL упити";
+$lang['Upgrade informations'] = "Информације о надоградњи";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Извршити проверу одржавања у [Администрација>Алати>Одржавање] ако наиђете на неки проблем.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Као меру предострожност, дати додаци су деактивирани. Морате проверити за надоградњу додатака пре него их поново активирате: ";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Само администратор може да покрене надоградњу: пријавите се испод.";
+$lang['You do not have access rights to run upgrade'] = "Немате приступна права да покренете надоградњу";
+$lang['All sub-albums of private albums become private'] = "Све подкатегорије приватних категорија постају приватне";
+$lang['User permissions and group permissions have been erased'] = "Корисничке и групне дозволе су обрисане";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Само префиx за повезне сличице и адреса електронске поште уредника интернет страница су сачуване из претходне конфигурације";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'У <i>%s</i>, испред <b>?></b>, уметни:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Као мера предострожности, следеће теме су деактивиране. Ви треба да проверите да ли теме имају унапређење пре него што их поново активирате:'; 
+?>
Index: tags/2.4.0RC3/language/sv_SE/about.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/about.html	(revision 14585)
@@ -0,0 +1,16 @@
+<p>Det här fotogalleriet är baserat på Piwigo.</p>
+ 
+<p>Piwigo är en fotogalleriprogramvara för internet, byggt av en aktiv gemenskap av användare och utvecklare. Påbyggnadsmoduler gör Piwigo lätt att anpassna och utöka. Piwigio är licensierat under GPL vilket innebär att det är fri programvara.</P>
+ 
+<p id="linkToPiwigo"> <a href="http://piwigo.org">Besök Piwigo's hemsida</a></p>
+ 
+</p>
+
+<p>För den svenska översättningen riktas ett särskilt tack till (i alfabetisk ordning): 
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=12558">berraw</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=9834">jonas</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=14638">styxsailor</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=10283">Wallster</a></li>
+	</Ul>
+</p>
Index: tags/2.4.0RC3/language/sv_SE/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/sv_SE/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/admin.lang.php	(revision 14585)
@@ -0,0 +1,874 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['%d association'] = '%d association';
+$lang['%d associations'] = '%d associationer';
+$lang['%d album including'] = '%d kategori inkluderar';
+$lang['%d albums including'] = '%d kategorier inkluderar';
+$lang['%d physical'] = ' %d fysisk';
+$lang[' and %d virtual'] = ' and %d virituell';
+$lang['%d album moved'] = '%d kategori flyttad';
+$lang['%d albums moved'] = '%d kategorier flyttade';
+$lang['%d group'] = '%d grupp';
+$lang['%d groups'] = '%d grupper';
+$lang['%d member'] = '%d medlem';
+$lang['%d members'] = '%d medlemmar';
+$lang['%d tag'] = '%d tagg';
+$lang['%d tags'] = '%d taggar';
+$lang['%d user comment rejected'] = '%d användares kommentar nekad';
+$lang['%d user comments rejected'] = '%d användares kommentarer nekade';
+$lang['%d user comment validated'] = '%d användares kommentar godkänd';
+$lang['%d user comments validated'] = '%d användares kommentarer godkända';
+$lang['%d user deleted'] = '%d användare borttagen';
+$lang['%d users deleted'] = '%d användare borttagna';
+$lang['%d user'] = '%d användare';
+$lang['%d users'] = '%d användare';
+$lang['%d waiting for validation'] = '%d väntar på godkännande';
+$lang['Actions'] = 'Åtgärder';
+$lang['Activate'] = 'Aktivera';
+$lang['Add/delete a permalink'] = 'Lägg till/Ta bort en permalink';
+$lang['Add a tag'] = 'Lägg till en tagg';
+$lang['Add a user'] = 'Lägg till en användare';
+$lang['Add group'] = 'Lägg till grupp';
+$lang['Add'] = 'Lägg till';
+$lang['Allow user registration'] = 'Tillåt användarregistrering';
+$lang['Apply to sub-albums'] = 'Använd på underkategorier';
+$lang['Associated'] = 'Associerad';
+$lang['Caddie management'] = 'Korg hantering';
+$lang['Caddie'] = 'Korg';
+$lang['Albums authorized thanks to group associations'] = 'Kategorier auktoriserade tack vare grupp associationer';
+$lang['Album manual order was saved'] = 'Kategoriernas manuella ordningsföljd är sparad';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Sök efter uppdatering misslyckades av okänd anledning.';
+$lang['Check for upgrade'] = 'Sök efter uppdatering';
+$lang['Comments for all'] = 'Kommentarer för alla';
+$lang['Current name'] = 'Aktuellt namn';
+$lang['Database'] = 'Databas';
+$lang['Deactivate'] = 'Avaktivera';
+$lang['Delete Representant'] = 'Ta bort Representant';
+$lang['Delete selected tags'] = 'Ta bort markerade taggar';
+$lang['Delete selected users'] = 'Ta bort markerade användare';
+$lang['Deletions'] = 'Borttagna';
+$lang['Deny selected groups'] = 'Neka markerade grupper';
+$lang['Deny selected users'] = 'Neka markerad användare';
+$lang['Description'] = 'Beskrivning';
+$lang['Display options'] = 'Visa alternativ';
+$lang['Dissociated'] = 'Skiljd';
+$lang['Does not represent'] = 'Representerar inte';
+$lang['Edit selected tags'] = 'Ändra markerade taggar';
+$lang['Edit tags'] = 'Ändra taggar';
+$lang['Email admins when a new user registers'] = 'Sänd mail till admin när en ny användare registreas';
+$lang['Email admins when a valid comment is entered'] = 'Sänd mail till admin när en giltig kommentar är inlagd';
+$lang['Email admins when a comment requires validation'] = 'Sänd mail till admin när en kommentar väntar på godkännande';
+$lang['Environment'] = 'Miljö';
+$lang['Form'] = 'Formulär';
+$lang['Gallery title'] = 'Galleri titel';
+$lang['Grant selected groups'] = 'Tillåt markerade grupper';
+$lang['Grant selected users'] = 'Tillåt markerade användare';
+$lang['Group name'] = 'Grupp namn';
+$lang['Groups'] = 'Grupper';
+$lang['Guests'] = 'Gäster';
+$lang['History'] = 'Histori';
+$lang['Informations'] = 'Information';
+$lang['Install'] = 'Installera';
+$lang['Link all album photos to a new album'] = 'Länka alla kategori element till en ny kategori';
+$lang['Link all album photos to some existing albums'] = 'Länka alla kategori element till existerande kategorier';
+$lang['Linked albums'] = 'Länkade kategorier';
+$lang['Lock gallery'] = 'Lås galleri';
+$lang['Maintenance'] = 'Underhåll';
+$lang['Edit album permissions'] = 'Hantera behörigheter för en kategori';
+$lang['Manage permissions for group "%s"'] = 'Hantera behörigheter för grupp "%s"';
+$lang['Manage permissions for user "%s"'] = 'Hantera behörigheter för användare "%s"';
+$lang['Manage tags'] = 'Hantera taggar';
+$lang['Members'] = 'Medlemmar';
+$lang['Metadata synchronized from file'] = 'Metadata synkroniserad från fil';
+$lang['Move albums'] = 'Flytta kategorier';
+$lang['Move'] = 'Flytta';
+$lang['Name'] = 'Namn';
+$lang['New name'] = 'Nytt namn';
+$lang['New parent album'] = 'Ny nuvarande kategori';
+$lang['New tag'] = 'Ny tagg';
+$lang['Number of comments per page'] = 'Antal kommentarer per sida';
+$lang['Number of rates'] = 'Antal röster';
+$lang['Number of thumbnails to create'] = 'Antal miniatyrer att skapa';
+$lang['Only private albums are listed'] = 'Enbart privata kategorier är listade';
+$lang['Operating system'] = 'Operativ system';
+$lang['Options'] = 'Alternativ';
+$lang['Other private albums'] = 'Andra privata kategorier';
+$lang['Page banner'] = 'Sidans banner';
+$lang['Parent album'] = 'Nuvarande kategori';
+$lang['Path'] = 'Sökväg';
+$lang['Permalink'] = 'Permalänk';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Permalänk %s har tidigare varit använd av kategori %s. Ta bort från permalänks historiken först';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Permalänkens namn får endast innehålla följande tecken: a-z, A-Z, 0-9, "-", "_" eller "/". Den får inte vara numerisk eller börja med ett nummber följt av "-"';
+$lang['Permalink %s is already used by album %s'] = 'Permalänk %s används redan av kategori %s';
+$lang['Permalink history'] = 'Permalänks historik';
+$lang['Permalinks'] = 'Permalänkar';
+$lang['Permission denied'] = 'Tillgång nekad';
+$lang['Permission granted thanks to a group'] = 'Tillgång beviljad tack vare en grupp';
+$lang['Permission granted'] = 'Tillgång beviljad';
+$lang['Photo informations updated'] = 'Bild information uppdaterad';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Position';
+$lang['Preferences'] = 'Inställningar';
+$lang['Properties'] = 'Egenskaper';
+$lang['Random photo'] = 'Slumpad bild';
+$lang['Rate date'] = 'Röst datum';
+$lang['Rating by guests'] = 'Röstning av gäster';
+$lang['Rating'] = 'Röstning';
+$lang['Reject'] = 'Neka';
+$lang['Representant'] = 'Representant';
+$lang['Representation of albums'] = 'Kategori representation';
+$lang['Representative'] = 'Representativ';
+$lang['Represents'] = 'Representerar';
+$lang['Save order'] = 'Spara ordning';
+$lang['Save to permalink history'] = 'Spara i permalänks historik';
+$lang['Select at least one album'] = 'Markera minst en kategori';
+$lang['Select at least one photo'] = 'Markera minst en bild';
+$lang['Select at least one user'] = 'Markera minst en användare';
+$lang['Show info'] = 'Visa info';
+$lang['Site manager'] = 'Hantera sidor';
+$lang['Status'] = 'Status';
+$lang['Statistics'] = 'Statistik';
+$lang['Storage album'] = 'Lagrings kategori';
+$lang['Sum of rates'] = 'Summa av röster';
+$lang['Tag "%s" already exists'] = 'Tagg "%s" existerar redan';
+$lang['Tag "%s" was added'] = 'Tagg "%s" har lagts till';
+$lang['Tag selection'] = 'Tagg markering';
+$lang['The %d following tags were deleted'] = 'Följande %d taggar har blivit borttagna';
+$lang['Unable to check for upgrade.'] = 'Fel uppstod under sökning efter uppdatering.';
+$lang['Uninstall'] = 'Avinstallera';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Använd standard ordning för bild sortering (definerad i konfigurationsfilen)';
+$lang['User comments validation'] = 'Validera användar kommentarer';
+$lang['Users'] = 'Användare';
+$lang['Validate'] = 'Godkänn';
+$lang['Validation'] = 'Godkänn';
+$lang['Version'] = 'Version';
+$lang['Virtual albums to move'] = 'Virtuella kategorier att flytta';
+$lang['Virtual album name'] = 'Namn på virtuell kategori';
+$lang['Webmaster cannot be deleted'] = 'Kan inte ta bort Webmaster';
+$lang['You are running on development sources, no check possible.'] = 'Du använder utväcklar källor, kontroll är inte möjlig.';
+$lang['You cannot delete your account'] = 'Du kan inte ta bort ditt konto';
+$lang['You cannot move an album in its own sub album'] = 'Du kan inte flytta en kategori till sin egen underkategori';
+$lang['You need to confirm deletion'] = 'Du måste godkänna borttagning';
+$lang['Associate to album'] = 'associera till kategori';
+$lang['associate to group'] = 'associera till grupp';
+$lang['Authorized'] = 'Befogad';
+$lang['Add a virtual album'] = 'Lägg till en virtuell kategori';
+$lang['Authorize users to add comments on selected albums'] = 'Tillåt användare att lägga till kommentarer på markerade kategorier';
+$lang['The name of an album must not be empty'] = 'Namnet på en kategori kan inte vara blankt';
+$lang['Lock albums'] = 'Lås kategorier';
+$lang['Private'] = 'Privat kategori';
+$lang['Public'] = 'Allmänn ';
+$lang['Find a new representant by random'] = 'Hitta en ny slumpad representant';
+$lang['Public / Private'] = 'Allmän / Privat';
+$lang['Manage authorizations for selected albums'] = 'Hantera behörigheter för markerade kategorier';
+$lang['Virtual album added'] = 'Virtuell kategori tillagd';
+$lang['Virtual album deleted'] = 'Virtuell kategori borttagen';
+$lang['Access type'] = 'Typ av tillgång';
+$lang['Information data registered in database'] = 'Informations data registrerad i databas';
+$lang['Default display'] = 'Standard vy';
+$lang['The gallery URL is not valid.'] = 'Adressen till galleriet är ogiltig.';
+$lang['Main'] = 'Allmänt';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Antalet kommentarer per sida måste vara mellan 5 och 50.';
+$lang['Configuration'] = 'Inställning';
+$lang['confirm'] = 'godkänn';
+$lang['Date'] = 'Datum';
+$lang['delete album'] = 'ta bort kategori';
+$lang['Dissociate from album'] = 'skilj från kategori';
+$lang['dissociate from group'] = 'skilj från grupp';
+$lang['Album updated successfully'] = 'Kategori informationen har uppdaterats.';
+$lang['photos per page'] = 'Bilder per sida';
+$lang['High definition enabled'] = 'High definition aktiverad';
+$lang['File'] = 'Fil';
+$lang['first photo added on %s'] = 'första elementet tillagt på %s';
+$lang['Forbidden'] = 'Förbjudet';
+$lang['global mode'] = 'globalt läge';
+$lang['group "%s" added'] = 'grupp "%s" tillagd';
+$lang['group "%s" deleted'] = 'grupp "%s" borttagen';
+$lang['group "%s" updated'] = 'grupp "%s" uppdaterad';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Namnet på en grupp får inte innehålla symbolerna " eller \' eller vara blank.';
+$lang['This name is already used by another group.'] = 'Det här namnet används redan av en annan grupp.';
+$lang['High definition'] = 'High definition';
+$lang['jump to album'] = 'gå till kategori';
+$lang['jump to photo'] = 'gå till bild';
+$lang['leave'] = 'lämna';
+$lang['Lock'] = 'Lås';
+$lang['Locked'] = 'Låst';
+$lang['manage album photos'] = 'Hantera kategori element';
+$lang['manage sub-albums'] = 'Hantera underkategorier';
+$lang['Manage'] = 'Hantera';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Processen svarar inte, behandling måste fortsätta [Uppskattad tid: %d sekund].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Processen svarar inte, behandling måste fortsätta [Uppskattad tid: %d sekunder].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Tid att förbereda listan för användare som ska skickas e-mail är begränsad. Andra användare är inte listade.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Tiden att skicka e-mail är begränsad. Andras e-mail hoppas över.';
+$lang['To send ?'] = 'Att skicka?';
+$lang['Last send'] = 'Senast skickat';
+$lang['email'] = 'E-mail';
+$lang['User'] = 'Användare';
+$lang['Complementary mail content'] = 'Kompletterande mail innehåll';
+$lang['See you soon,'] = 'Vi ses,';
+$lang['Go to'] = 'Gå till';
+$lang['Hello'] = 'Hallå';
+$lang['New photos were added'] = 'Nya element har blivit tillagda';
+$lang['on'] = 'på';
+$lang['between'] = 'mellan';
+$lang['and'] = 'och';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster har lagt till dig så att du får notifikationer via e-mail.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Du har lagts till och kommer nu får notifikationer via e-mail.';
+$lang['To subscribe'] = 'Till prenumerera';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Om du stöter på problem eller har frågor, vänligen skicka ett meddelande till';
+$lang['[NBM] Problems or questions'] = '[NBM] Problem eller frågor';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster har tagit bort dig från listan, du kommer nu inte få några notifikationer via e-mail.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Du har blivit borttagen från notifikations e-mail listan.';
+$lang[', click on'] = ', klicka på';
+$lang['To unsubscribe'] = 'Till avsluta prenumeration';
+$lang['With blank value, gallery title will be used'] = 'Om lämnad tom kommer galleriets titel att användas';
+$lang['Notification'] = 'Notifikation';
+$lang['Error when sending email to %s [%s].'] = 'När försökte skicka e-mail till %s [%s] ett fel uppstod.';
+$lang['Mail sent to %s [%s].'] = 'E-mail skickat till %s [%s].';
+$lang['%d mail was sent.'] = '%d e-mail har blivit skickat.';
+$lang['%d mails were sent.'] = '%d e-mail var skickade.';
+$lang['%d mail was not sent.'] = '%d e-mail skickades inte.';
+$lang['%d mails were not sent.'] = '%d e-mail skickades inte.';
+$lang['No mail to send.'] = 'Inga e-mail att skicka.';
+$lang['There is no available subscribers to mail.'] = 'Det finns inga prenumeranter att skicka notifikationer till.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Prenumeranter kan listas (tillgänglig) enbart om det finns nya element att meddela.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Ändå, enbart webmaster kan se denna flik, inte administratörer.';
+$lang['No user to send notifications by mail.'] = 'Ingen användare att meddela via e-mail.';
+$lang['New photos added'] = 'Nya element tillagda';
+$lang['Subscribe to notification by mail'] = 'Anmäl till notifikation via e-mail';
+$lang['Unsubscribe from notification by mail'] = 'Avanmäl notifikation via e-mail';
+$lang['Parameter'] = 'Inställningar';
+$lang['Operation in progress'] = 'Bearbetnings behandling.';
+$lang['Continue processing treatment'] = 'Fortsätt med pågående behandling';
+$lang['Add detailed content'] = 'Lägg till detaljerad information';
+$lang['Send mail as'] = 'Skicka e-mail som';
+$lang['Send mail to users'] = 'Skicka e-mail till användare';
+$lang['Send'] = 'Skicka';
+$lang['Subscribed'] = 'Anmäld';
+$lang['Subscribe'] = 'Anmäl';
+$lang['Parameters'] = 'Parameter';
+$lang['Select recipients'] = 'Välj mottagare';
+$lang['Subscribe/unsubscribe users'] = 'Anmäl/Avanmäl användare';
+$lang['Unsubscribed'] = 'Avanmäld';
+$lang['%d parameter was updated.'] = '%d parameter uppdaterad.';
+$lang['%d parameters were updated.'] = '%d parameter uppdaterade.';
+$lang['%d user was not updated.'] = '%d användare uppdaterades inte.';
+$lang['%d users were not updated.'] = '%d användare uppdaterades inte.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Användare %s [%s] borttagen från prenumerations listan.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Användare %s [%s] tillagd till prenumerations listan.';
+$lang['%d user was updated.'] = '%d användare uppdaterad.';
+$lang['%d users were updated.'] = '%d användare uppdaterade.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Användare %s [%s] inte borttagen från prenumerations listan.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Användare %s [%s] inte tillagd till prenumerations listan.';
+$lang['User %s [%s] added.'] = 'Användare %s [%s] tillagd.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Varning: anmälning eller avanmälning kommer att skicka e-mail till användare';
+$lang['Send mail on HTML format'] = 'Skicka e-mail i HTML format';
+$lang['Include display of recent photos grouped by dates'] = 'Inkludera display av tidigare bilder grupperat efter datum';
+$lang['Available only with HTML format'] = 'Endast tillgänglig med HTML format';
+$lang['no write access'] = 'inte tillåtelse att skriva';
+$lang['Permissions'] = 'Behörigheter';
+$lang['private'] = 'privat';
+$lang['public'] = 'allmänt';
+$lang['Purge never used notification feeds'] = 'Utrensning använder aldrig notifikations feeds';
+$lang['Purge sessions'] = 'Sessioner för utrensning';
+$lang['randomly represented'] = 'slumpad representant';
+$lang['registration date'] = 'registrerings datum';
+$lang['clean'] = 'rensa upp';
+$lang['Create this site'] = 'Skapa denna sida';
+$lang['test'] = 'test';
+$lang['test this remote site'] = 'testa fjärrsidan';
+$lang['remove tags'] = 'ta bort taggar';
+$lang['Repair and optimize database'] = 'Reparera och optimisera databas';
+$lang['selection'] = 'markering';
+$lang['set to'] = 'inställd på';
+$lang['singly represented'] = 'fast representant';
+$lang['This site already exists'] = 'Sidan existerar redan';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Skapa ny site : (ge dess URL till create_listing_file.php)';
+$lang['created'] = 'skapad';
+$lang['delete'] = 'ta bort';
+$lang['delete this site and all its attached elements'] = 'ta bort hemsidan och all relaterad information';
+$lang['deleted'] = 'borttagen';
+$lang['an error happened'] = 'ett fel uppstod';
+$lang['Local'] = 'Lokal';
+$lang['Remote'] = 'Fjärrsida';
+$lang['update the database from files'] = 'uppdatera databasen med filer';
+$lang['status'] = 'status';
+$lang['Directory'] = 'Katalog';
+$lang['sub-albums'] = 'underkategorier';
+$lang['Synchronize metadata'] = 'synkronisera metadata';
+$lang['target'] = 'mål';
+$lang['title'] = 'titel';
+$lang['Album list management'] = 'Hantera kategorier';
+$lang['Piwigo configuration'] = 'Piwigo konfiguration';
+$lang['Edit album'] = 'Ändra en kategori';
+$lang['Group management'] = 'Grupp hantering';
+$lang['User list'] = 'Användarlista';
+$lang['Edit photo information'] = 'Modifiera bildinformation';
+$lang['Database synchronization with files'] = 'Synkronisera databas med filer';
+$lang['all'] = 'alla';
+$lang['height must be a number superior to'] = 'bildens höjd måste vara större än';
+$lang['width must be a number superior to'] = 'bildens bredd måste vara större än';
+$lang['for the file format'] = 'för filformatet';
+$lang['Photo unreachable or no support'] = 'Bilden kunde inte nås eller filformatet stöds inte';
+$lang['GD version'] = 'GD version';
+$lang['General statistics'] = 'Allmän statistik';
+$lang['average time'] = 'snitt tid';
+$lang['number of miniaturized photos'] = 'antal miniatyrer skapade';
+$lang['total time'] = 'total tid';
+$lang['for this file format'] = 'för detta filformat';
+$lang['unit mode'] = 'enkel läge';
+$lang['Unlocked'] = 'Upplåst';
+$lang['unset'] = 'obestämd';
+$lang['Update albums informations'] = 'Uppdatera information för kategori';
+$lang['Update photos information'] = 'Uppdatera information för bilder';
+$lang['Synchronize'] = 'Synkronisera';
+$lang['reduce to single existing albums'] = 'reducera till enstaka existerande kategorier';
+$lang['Choose an option'] = 'Välj ett alternativ';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'visa maximal information (tillagda kategorier och element, borttagna kategorier och element)';
+$lang['Error list'] = 'Fel lista';
+$lang['Errors caption'] = 'Fel legender';
+$lang['Detailed informations'] = 'Detaljerad information';
+$lang['File/directory read error'] = 'Läs fel i fil/katalog';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Filen eller katalogen kan inte nås (antigen existerar den inte eller tillträde nekat)';
+$lang['albums deleted in the database'] = 'kategorier borttagna ur databasen';
+$lang['photos deleted from the database'] = 'element borttagna ur databasen';
+$lang['photos candidates for metadata synchronization'] = 'bild kandidater för metadata synkronisering';
+$lang['photos informations synchronized with files metadata'] = 'element informationer synkroniserade med filernas metadata';
+$lang['errors during synchronization'] = 'fel uppstod under synkronisering';
+$lang['albums added in the database'] = 'kategorier tillagda i databas';
+$lang['photos added in the database'] = 'element tillagda i databasen';
+$lang['photos updated in the database'] = 'element i databasen uppdaterade';
+$lang['Search for new images in the directories'] = 'Sök i katalogerna efter nya bilder';
+$lang['added'] = 'tillagd';
+$lang['Metadata synchronization results'] = 'Resultat för synkronisering av metadata';
+$lang['only perform a simulation (no change in database will be made)'] = 'Utför enbart simulering (inget kommer att ändras i databasen)';
+$lang['Simulation'] = 'Simulering';
+$lang['directories + files'] = 'Kataloger + filer';
+$lang['only directories'] = 'bara kataloger';
+$lang['synchronize files structure with database'] = 'synkronisera filstruktur med databas';
+$lang['synchronize files metadata with database photos informations'] = 'synkronisera databas element med filernas metadata';
+$lang['even already synchronized photos'] = 'även redan synkroniserade element';
+$lang['Used metadata'] = 'Metadata Använd';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Namn på kataloger och filer får enbart innehålla bokstäver, siffror samt följande symboler: "-", "_" eller "."';
+$lang['wrong filename'] = 'ogiltigt filnamn';
+$lang['Upload'] = 'Ladda upp';
+$lang['user "%s" added'] = 'Användare "%s" tillagd';
+$lang['User status'] = 'Användares status';
+$lang['user_status_admin'] = 'Administratör';
+$lang['user_status_generic'] = 'Generisk';
+$lang['user_status_guest'] = 'Gäst';
+$lang['user_status_normal'] = 'Användare';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Virtuell kategori';
+$lang['Waiting'] = 'Väntande';
+$lang['default'] = 'standard';
+$lang['Toggle \'default group\' property'] = 'Omvänd egenskap för \'standard grupp\' ';
+$lang['Advanced features'] = 'Avancerade funktioner';
+$lang['Overall'] = 'Översikt';
+$lang['Year'] = 'År';
+$lang['Month'] = 'Månad';
+$lang['Day'] = 'Dag';
+$lang['Pages seen'] = 'Sidor sedda';
+$lang['Time'] = 'Tid';
+$lang['IP'] = 'IP';
+$lang['Element'] = 'Element';
+$lang['Section'] = 'Sektion';
+$lang['An information email was sent to group "%s"'] = 'E-mail med information skickat till grupp "%s"';
+$lang['Send an information email to group members'] = 'Skicka e-mail med information till medlemmar i grupp';
+$lang['Group'] = 'Grupp';
+$lang['[%s] Visit album %s'] = '[%s] Besök kategori %s';
+$lang['Hello,'] = 'Hallå,';
+$lang['See you soon.'] = 'Vi ses.';
+$lang['Discover album:'] = 'Utforska kategori:';
+$lang['Mail content'] = 'E-mail innehåll';
+$lang['none'] = 'inget';
+$lang['high'] = 'hög';
+$lang['other'] = 'annan';
+$lang['Element type'] = 'Typ av element';
+$lang['Image id'] = 'Bild id';
+$lang['Summary'] = 'Sammanfattning';
+$lang['%d line filtered'] = '%d rad filtrerad';
+$lang['%d lines filtered'] = '%d rader filtrerade';
+$lang['%d guest'] = '%d gäst';
+$lang['%d guests'] = '%d gäster';
+$lang['Hour'] = 'Timme';
+$lang['guest'] = 'gäst';
+$lang['default values'] = 'standardvärden';
+$lang['Guest cannot be deleted'] = 'Gäst kan inte tas bort';
+$lang['Default user cannot be deleted'] = 'Standard användare kan inte tas bort';
+$lang['Purge history detail'] = 'Rensa histori detaljer';
+$lang['Purge history summary'] = 'Rensa historik sammanställning';
+$lang['Check integrity'] = 'Integritets kontroll';
+$lang['Anomaly'] = 'Avvikelse';
+$lang['Correction'] = 'Rättning';
+$lang['Automatic correction'] = 'Automatisk rättning';
+$lang['Impossible automatic correction'] = 'Automatisk rättning var inte möjlig';
+$lang['Correction applied with success'] = 'Rättning utfördes med framgång';
+$lang['Correction applied with error'] = 'Rättning utfördes men med fel';
+$lang['%d anomaly has been detected.'] = '%d avvikelse har upptäckts.';
+$lang['%d anomalies have been detected.'] = '%d avvikelser har upptäckts.';
+$lang['%d anomaly has been corrected.'] = '%d avvikelse har rättats.';
+$lang['%d anomalies have been detected corrected.'] = '%d avvikelser har upptäckts och rättats.';
+$lang['%d anomaly has not been corrected.'] = '%d avvikelse kunde inte rättats.';
+$lang['%d anomalies have not been corrected.'] = '%d avvikelser kunde inte rättas.';
+$lang['Go to %s or %s for more informations'] = 'Gå till %s eller %s för mer information';
+$lang['the forum'] = 'forumet';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = '%s värde är inkorrekt eftersom att exif inte stöds';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s Måste ställas in på negativ i följande fil : your local/config/config.inc.php';
+$lang['Main "guest" user does not exist'] = 'Huvudanvändare "gäst" är inte korrekt';
+$lang['Main "guest" user status is incorrect'] = 'Huvudanvändare "gäst" är inte korrekt';
+$lang['Default user does not exist'] = 'Standard användare existerar inte';
+$lang['Main "webmaster" user does not exist'] = 'Huvudanvändare "webmaster" existerar inte';
+$lang['Main "webmaster" user status is incorrect'] = 'Huvudanvändare "webmaster" status är inkorrekt';
+$lang['User "%s" created with "%s" like password'] = 'Användare "%s" skapades med "%s" som lösenord';
+$lang['Status of user "%s" updated'] = 'Användare "%s" status uppdaterad';
+$lang['add new photos to caddie'] = 'lägg till nytt element till korg';
+$lang['No display'] = 'Inget att visa';
+$lang['Classic display'] = 'Klassisk visning';
+$lang['Hoverbox display'] = 'Hoverbox visning';
+$lang['Mail address is obligatory for all users'] = 'Mail adress är obligatorisk för alla användare';
+$lang['Minimum privacy level'] = 'Minimum privat nivå';
+$lang['Privacy level'] = 'Privat nivå';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Kontakter';
+$lang['Level 2'] = 'Vänner';
+$lang['Level 4'] = 'Familj';
+$lang['Level 8'] = 'Administratörer';
+$lang['Reinitialize check integrity'] = 'Återinitialisera integritetskontroll';
+$lang['Check all'] = 'Kontrollera alla';
+$lang['Uncheck all'] = 'Avmarkera alla';
+$lang['Check automatic corrections'] = 'Kontrollera automatiska rättningar';
+$lang['Apply selected corrections'] = 'Tillämpa markeradApply selected corrections';
+$lang['Ignore selected anomalies'] = 'Ignorera markerade avvikelser';
+$lang['Refresh'] = 'Uppdatera';
+$lang['The anomaly will be ignored until next application version'] = 'Avvikelsen kommer att ignoreras tills nästa version av applikationen';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Rättad avvikelse kommer inte längre att ignoreras';
+$lang['%d anomaly has been ignored.'] = '%d avvikelse ignorerades.';
+$lang['%d anomalies have been ignored.'] = '%d avvikelser ignorerades.';
+$lang['Plugins which need upgrade'] = 'Plugins som behöver uppdateras';
+$lang['Plugin list'] = 'Lista över plugin';
+$lang['Check for updates'] = 'Sök efter uppdateringar';
+$lang['Other plugins'] = 'Andra plugin tillgängliga';
+$lang['Last revisions'] = 'Senaste ändringar';
+$lang['Are you sure you want to delete this plugin?'] = 'Är du säker på att du vill ta bort detta plugin?';
+$lang['Are you sure you want to install this plugin?'] = 'Är du säker på att du vill installera detta plugin?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Är du säker på att du vill installera uppdateringen? Du måste verifiera nedan att denna version inte behöver yterligare avinstallering.';
+$lang['Plugin has been successfully copied'] = 'Kopiering av detta plugin utfördes med framgång';
+$lang['You might go to plugin list to install and activate it.'] = 'Gå till plugin listan för att installera och aktivera.';
+$lang['Can\'t create temporary file.'] = 'Tillfällig fil kunde inte skapas.';
+$lang['Can\'t download archive.'] = 'Arkiv kan inte laddas ner.';
+$lang['Can\'t read or extract archive.'] = 'Arkiv kunde inte läsas eller extraheras.';
+$lang['An error occured during extraction (%s).'] = 'Ett fel uppstod när följande filer packades upp: (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Kontrollera "plugins" mapp och eventuella undermappars behörigheter (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Kunde inte ansluta till servern.';
+$lang['Purge compiled templates'] = 'Rensa sammanställda mallar (templates)';
+$lang['ACCESS_0'] = 'Fritt tillträde';
+$lang['ACCESS_1'] = 'Tillgänglighet för alla';
+$lang['ACCESS_2'] = 'Tillgänglighet för registrerade användare';
+$lang['ACCESS_3'] = 'Tillgänglighet för administratörer';
+$lang['ACCESS_4'] = 'Tillgänglighet för webmasters';
+$lang['ACCESS_5'] = 'Ingen tillgänglighet';
+$lang['Support'] = 'Hjälp';
+$lang['Documentation'] = 'Dokumentation';
+$lang['A new version of Piwigo is available.'] = 'En ny version av Piwigo finns nu tillgänglig.';
+$lang['Piwigo Administration'] = 'Piwigo Administration';
+$lang['Piwigo version'] = 'Piwigo version';
+$lang['You are running the latest version of Piwigo.'] = 'Du använder senaste versionen av Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Versionen av %s [%s] installerad är inte kompatibel med versionen som krävs [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'För att utnyttja alla fördelar av programmet, uppdatera ditt system, annars kan det resultera i att programmet inte fungerar korrekt eller inte alls';
+$lang['Deleted on'] = 'Borttagen den';
+$lang['Last hit'] = 'Senaste träff';
+$lang['GD library is missing'] = 'GD bibliotek saknas';
+$lang['Templates'] = 'Mallar (Templates)';
+$lang['Extend for templates'] = 'Utvidga mallar (templates)';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Ersättning av original mallar (templates) av special anpassade mallar från "template-extension" undermappen';
+$lang['Replacers (customized templates)'] = 'Substitut (anpassade mallar)';
+$lang['Original templates'] = 'Standard mallar';
+$lang['Optional URL keyword'] = 'Standard URL nyckelord';
+$lang['Templates configuration has been recorded.'] = 'Konfiguerering av mallar har registrerats.';
+$lang['All optimizations have been successfully completed.'] = 'Alla optimeringar har slutförts.';
+$lang['Optimizations have been completed with some errors.'] = 'Optimeringar har slutförts, men fel uppstod.';
+$lang['Modify information'] = 'Modifiera information';
+$lang['nothing'] = 'inget';
+$lang['overrides existing values with empty ones'] = 'skriver över existerande värden med tomma värden';
+$lang['Manage photo ranks'] = 'Hantera bild betygsättning';
+$lang['Edit ranks'] = 'Ändra betygsättning';
+$lang['No photo in this album'] = 'Inga element i denna kategori';
+$lang['Images manual order was saved'] = 'Manuell bild ordning sparad';
+$lang['ranks'] = 'betyg';
+$lang['By rank'] = 'Efter betyg';
+$lang['Manual order'] = 'Manuell order';
+$lang['Drag to re-order'] = 'Tryck-och-dra för att ändra ordning';
+$lang['Quick Local Synchronization'] = 'Snabb Lokal Synkronisering';
+$lang['No photo can be deleted'] = 'Inga foton kan tas bort';
+$lang['Delete selected photos'] = 'Ta bort markerade foton';
+$lang['%d photo was deleted'] = '%d foto borttaget';
+$lang['%d photos were deleted'] = '%d foton borttagna';
+$lang['Downloads'] = 'Nerladdningar';
+$lang['Released on'] = 'Släppt den';
+$lang['Number of downloads'] = 'Antal nerladdningar';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Nyhetsbrev';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Håll dig uppdaterad på Piwigo projektet, anmäl dig till Piwigo nyhetsbrev. Ett e-mail kommer att skickas till dig så fort en ny uppdatering är tillgänglig (innehållande säkerhetsuppdateringar, bug fix och saker som är viktiga för säkerheten av ditt galleri) och vid viktiga händelser. Enbart några få e-mail varje år.';
+$lang['Subscribe %s'] = 'Anmäl %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Anmäl dig %s till Piwigo Nyhetsbrev';
+$lang['Purge search history'] = 'Rensa sökhistorik';
+$lang['Hide'] = 'Göm';
+$lang['Password is missing. Please enter the password.'] = 'Lösenord saknas. Ange lösenord.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Bekräftelse av lösenord saknas. Vänligen bekräfta ditt valda lösenord.';
+$lang['Allow users to edit their own comments'] = 'Tillåt användare att ändra egna kommentarer';
+$lang['Allow users to delete their own comments'] = 'Tillåt användare att ta bort egna kommentarer';
+$lang['Email administrators when a comment is modified'] = 'Notifiera administratör när en kommentar läggs till';
+$lang['Email administrators when a comment is deleted'] = 'Notifiera administratör när kommentar tas bort';
+$lang['Cannot delete the old permalink !'] = 'Kan inte ta bort gammal permalänk!';
+$lang['Hit'] = 'Träff';
+$lang['Tools'] = 'Verktyg';
+$lang['Photos'] = 'Foton';
+$lang['Themes'] = 'Teman';
+$lang['Instructions to use Piwigo'] = 'Instruktioner för användning av Piwigo';
+$lang['Installed Themes'] = 'Installerade Teman';
+$lang['Add New Theme'] = 'Lägg till nytt tema';
+$lang['Forbid this theme to users'] = 'Förbjud detta tema för användare';
+$lang['Set as default theme for unregistered and new users'] = 'Ange som standard tema för oregistrerade och nya användare';
+$lang['unknown'] = 'okänd';
+$lang['Upload Photos'] = 'Ladda upp foton';
+$lang['Drop into album'] = 'Släpp in i kategori';
+$lang['+ Add an upload box'] = '+ Lägg till en uppladdningsruta';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Skapa meppen "%s" i rotkatalogen för din Piwigo installation';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Ge tillåtelse att skriva (chmod 777) i mappen "%s" i rotkatalogen för din Piwigo installation';
+$lang['existing album'] = 'existerande kategori';
+$lang['create a new album'] = 'skapa ny kategori';
+$lang['Album name'] = 'Namn på kategori';
+$lang['Album "%s" has been added'] = 'Kategori "%s" har lagts till';
+$lang['Uploaded Photos'] = 'Uppladdade Foton';
+$lang['%d photos uploaded'] = '%d foton uppladdade';
+$lang['Privacy level set to "%s"'] = 'Sekretessnivå inställd på "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Kategir "%s" innehåller nu %d foton';
+$lang['Manage this set of %d photos'] = 'Hantera settet om %d foton';
+$lang['Select files'] = 'Markerade filer';
+$lang['Everybody'] = 'Alla';
+$lang['Who can see these photos?'] = 'Vem kan se dessa foton?';
+$lang['Who can see this photo?'] = 'Vem kan se detta foto?';
+$lang['Settings'] = 'Inställningar';
+$lang['Resize'] = 'Ändra storlek';
+$lang['Maximum Width'] = 'Maximal Bredd';
+$lang['pixels'] = 'pixlar';
+$lang['Maximum Height'] = 'Maximal höjd';
+$lang['Image Quality'] = 'Bild kvalitet';
+$lang['Thumbnail'] = 'Miniatyrbild';
+$lang['Save Settings'] = 'Spara inställningar';
+$lang['Your configuration settings are saved'] = 'Dina inställningar är nu sparade';
+$lang['Active Themes'] = 'Aktivta Teman';
+$lang['Add write access to the "%s" directory'] = 'Lägg till skrivrättigheter till "%s" katalogen';
+$lang['Administration Home'] = 'Administration Hem';
+$lang['Change Admin Colors'] = 'Ändra administrations färger';
+$lang['Delete this theme'] = 'Ta bort temat';
+$lang['Directory does not exist'] = 'Katalog existerar inte';
+$lang['Download,'] = 'Ladda ner,';
+$lang['FTP + Synchronization'] = 'FTP + Synkronisering';
+$lang['Get Support on Piwigo Forum'] = 'Support hittar du på Piwigo forum';
+$lang['Help Me'] = 'Hjälp mig';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Temat kunde inte aktiveras, följande tema verkar inte existera: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Temat kunde inte tas bort, andra teman är beroende av det: %s';
+$lang['Inactive Themes'] = 'Inaktivera teman';
+$lang['Install on your computer,'] = 'Installera på din dator,';
+$lang['Make this theme available to users'] = 'Gör temat tillgängligt för användare';
+$lang['Page end'] = 'Slut av sidan';
+$lang['Piwigo Uploader'] = 'Piwigo Uppladdare';
+$lang['Operation in progress'] = 'Behandling av bearbetning.';
+$lang['Please wait...'] = 'Vänligen vänta...';
+$lang['Read Piwigo Documentation'] = 'Läs Piwigo Dokumentation';
+$lang['Start pLoader and add your photos.'] = 'Starta pLoader och lägg till dina bilder.';
+$lang['Switch to clear or dark colors for administration'] = 'Byt till klara eller mörka färger för administration';
+$lang['Theme has been successfully installed'] = 'Temat har installerats';
+$lang['Visit Gallery'] = 'Besök galleriet';
+$lang['Visit Piwigo project website'] = 'Besök Piwigo projekts hemsida';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader står för <em>Piwigo Uploader</em>. pLoader förbereder bilder från din dator och laddar upp dom i ditt Piwigo galleri.';
+$lang['Guest Settings'] = 'Gäst inställningar';
+$lang['Main Page'] = 'Huvudsida';
+$lang['Photo Page'] = 'Fotosida';
+$lang['Activate Navigation Bar'] = 'Aktivera navigeringsfältet';
+$lang['Activate Navigation Thumbnails'] = 'Aktivera navigations miniatyrer';
+$lang['Activate icon "%s"'] = 'Aktivera ikon "%s"';
+$lang['Photo Properties'] = 'Foto inställningar';
+$lang['Allow user customization'] = 'Tillåt användaranpassning';
+$lang['Languages'] = 'Språk';
+$lang['Installed Languages'] = 'Installerade Språk';
+$lang['Add New Language'] = 'Lägg till nytt språk';
+$lang['Language has been successfully installed'] = 'Språket har installerats';
+$lang['Select:'] = 'Markera:';
+$lang['None'] = 'Inget';
+$lang['Invert'] = 'Invertera';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Det går inte att inaktivera detta tema, minst ett tema måste vara aktiverat.';
+$lang['Webmaster status is required.'] = 'Webmaster status krävs.';
+$lang['Bound Theme'] = 'Bundet Tema';
+$lang['Allow rating'] = "Tillåt röstning";
+$lang['Select at least one comment'] = 'Markera minst en kommentar';
+$lang['Active Plugins'] = 'Aktivera Plugin';
+$lang['Inactive Plugins'] = 'Inaktivera Plugin';
+$lang['Missing Plugins'] = 'Plugin som saknas';
+$lang['Uninstalled Plugins'] = 'Avinstallerade Plugin';
+$lang['By %s'] = 'Av %s';
+$lang['Visit plugin site'] = 'Besök hemsida för plugin';
+$lang['Active Languages'] = 'Aktiva Språk';
+$lang['Delete this language'] = 'Ta bort språket';
+$lang['Forbid this language to users'] = 'Förbjud språket för användare';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Det är inte möjligt att inaktivera detta språk, först ange ett annat språk som standard.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Det är inte möjligt att inaktivera detta språk, du måste ha minst ett språk.';
+$lang['Inactive Languages'] = 'Inaktivera språk';
+$lang['Make this language available to users'] = 'Gör detta språk tillgängligt för användare';
+$lang['Set as default language for unregistered and new users'] = 'Ange som standard språk för oregistrerade och nya användare';
+$lang['Add Photos'] = 'Lägg till foton';
+$lang['The following tag was deleted'] = 'Följande tagg blev borttagen';
+$lang['Miscellaneous'] = 'Diverse';
+$lang['Virtual Links'] = 'Virtuella Länkar';
+$lang['There is no other language available.'] = 'Det finns inget annat språk tillgängligt.';
+$lang['There is no other plugin available.'] = 'Det finns inget annat plugin tillgängligt.';
+$lang['There is no other theme available.'] = 'Det finns inget annat tema tillgängligt.';
+$lang['Add another set of photos'] = 'Lägg till en ny uppsättning foton';
+$lang['Order of menubar items has been updated successfully.'] = 'Ordningen för objekt i menyraden har blivit uppdaterad.';
+$lang['This theme was not designed to be directly activated'] = 'Detta tema är inte anpassat för att bli direkt aktiverat';
+$lang['Pending Comments'] = 'Väntande Kommentarer';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'I din php.ini fil, upload_max_filesize (%sB) är större än post_max_size (%sB), du rekomenderas att ändra detta';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif extension är inte tillgänglig, admin borde avaktivera användandet av exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Den uppladdade filen överskrider upload_max_filesize direktionerna i php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Den uppladdade filen överskrider post_max_size direktionerna i php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Den uppladdade filen överskrider MAX_FILE_SIZE direktiv som var specifierat i HTML form';
+$lang['The uploaded file was only partially uploaded'] = 'Den uppladdade filen blev bara delvis uppladdad';
+$lang['No file was uploaded'] = 'Ingen fil laddades upp';
+$lang['Missing a temporary folder'] = 'Saknar en temporär mapp';
+$lang['Failed to write file to disk'] = 'Kunde inte skriva filen till skivan';
+$lang['File upload stopped by extension'] = 'Uppladdning av filen stoppades av en extension';
+$lang['Unknown upload error'] = 'Okänt fel uppstod under uppladdning';
+$lang['Error on file "%s" : %s'] = 'Fel på fil "%s" : %s';
+$lang['Menu Management'] = 'Hantera menyer';
+$lang['automatic order'] = 'automatisk beställning';
+$lang['manual order'] = 'manuell beställning';
+$lang['Albums automatically sorted'] = 'Album sorteras automatiskt';
+$lang['Batch Manager'] = 'Batch hanteraren';
+$lang['include child albums'] = 'innefattar under album';
+$lang['Selection'] = 'Urval';
+$lang['Action'] = 'Åtgärd';
+$lang['Set author'] = 'Ange författare';
+$lang['Set title'] = 'Sätt rubriken';
+$lang['Set creation date'] = 'Sätt datum för skapande';
+$lang['Apply action'] = 'Utför åtgärder';
+$lang['on the %d selected photos'] = 'på %d valda bilder';
+$lang['%d of %d photos selected'] = '%d av %d markerade bilder';
+$lang['No photo selected, %d photos in current set'] = 'Inga bilder markerat, %d bilder i aktuella uppsättningen';
+$lang['All %d photos are selected'] = 'Alla %d bilder väljs';
+$lang['remove this filter'] = 'Ta bort det här filtret';
+$lang['Duplicates'] = 'dubbletter';
+$lang['Add a filter'] = 'Lägg till ett filter';
+$lang['Remove all filters'] = 'Ta bort alla filter';
+$lang['Refresh photo set'] = 'Uppdatera bilder';
+$lang['The whole page'] = 'Hela sidan';
+$lang['The whole set'] = 'Hela markeringen';
+$lang['No photo in the current set.'] = 'inga bilder i den aktuella markeringen..';
+$lang['No photo selected, no action possible.'] = 'Inga foton är valda, inga åtgärder är möjlig.';
+$lang['Choose an action'] = 'Välj en åtgärd';
+$lang['remove author'] = 'ta bort författaren';
+$lang['Type here the author name'] = 'Skriv författarens namn här';
+$lang['remove title'] = 'Ta bort rubriken';
+$lang['Type here the title'] = 'Skriv rubriken här';
+$lang['remove creation date'] = 'Ta bort skapande datum ';
+$lang['Album photos associated to the following albums: %s'] = 'Album bilder associerade till följande album: %s';
+$lang['Delete orphan tags'] = 'Ta bort anonyma taggar';
+$lang['delete photo'] = 'Ta bort bild';
+$lang['Orphan tags deleted'] = 'Anonyma taggar är readerade';
+$lang['Week starts on'] = 'Veckan börjar på';
+$lang['You have %d orphan tags: %s.'] = 'Du har %d anonyma taggar: %s.';
+$lang['Remove from caddie'] = 'Ta bort från korg';
+$lang['Themes which need upgrade'] = 'Teman som behöver uppgraderas';
+$lang['Languages which need upgrade'] = 'Språk som behöver uppgradera';
+$lang['All themes are up to date.'] = 'Alla teman är uppdaterade.';
+$lang['All plugins are up to date.'] = 'Alla plugins are up to date.';
+$lang['All languages are up to date.'] = 'Alla språk är aktuella.';
+$lang['Visit theme site'] = 'Besök temats webbplats';
+$lang['Visit language site'] = 'Besök språkets webbplats';
+$lang['New Version'] = 'Ny version';
+$lang['Obsolete Plugins'] = 'Föråldrade Plugins';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'VARNING! Detta plugin verkar inte vara kompatibla med denna version av Piwigo.';
+$lang['Do you want to activate anyway?'] = 'Vill du aktivera ändå?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'Detta plugin är nu del av PIWIGO CORE! Avinstallera det NU!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'FEL:. Detta plugin saknas men den är installerad! Avinstallera det NU'; 
+$lang['display'] = 'Visa';
+$lang['Thumbnails generation in progress...'] = 'generering av miniatyr bilder pågår ......';
+$lang['Photos generation in progress...'] = 'Bild generering pågår..';
+$lang['%s photos have been regenerated'] = '%s foton har skapats';
+$lang['%s photos can not be regenerated'] = '%s foton har inte skapats';
+$lang['new'] = 'ny';
+$lang['No results'] = 'Inga poster hittades';
+$lang['Searching...'] = 'Söker...';
+$lang['Type in a search term'] = 'Ange nytt sökord';
+$lang['Activate icon "new" next to albums and pictures'] = 'Aktivera ikonen "ny" intill album och bilder';
+$lang['Deactivate all'] = 'Avaktivera allt';
+$lang['Default photos order'] = 'Standardordning för bilder';
+$lang['Restore'] = 'Återställ';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Återställ standardkonfiguration. Du kommer att förlora inställingarna för din plugins!';
+$lang['Show menubar'] = 'Visa verktygsfält';
+$lang['Updates'] = 'Uppdateringar';
+$lang['Update in progress... Please wait.'] = 'Uppdatering körs... Var vänlig vänta.';
+$lang['Ignore this update'] = 'Ignorera denna uppdatering';
+$lang['Reset ignored updates'] = 'Nollställ ignorerade uppdateringar';
+$lang['Update All'] = 'Uppdatera allt';
+$lang['ERROR'] = 'FEL';
+$lang['Update Complete'] = 'Uppdatering avslutad';
+$lang['Piwigo Update'] = 'Piwigo Uppdatering';
+$lang['Extensions Update'] = 'Uppdatering av tillägg';
+$lang['Rate'] = 'Betygsätt';
+$lang['Average rate'] = 'Genomsnittligt betyg';
+$lang['Learn more'] = 'Läs mer';
+$lang['Some upgrades are available for extensions.'] = 'Det finns uppdateringar till några insticksmoduler.';
+$lang['Ignore All'] = 'Ignorera alla';
+$lang['Crop'] = 'Klipp';
+$lang['Width'] = 'Bredd';
+$lang['Height'] = 'Höjd';
+$lang['Follow Orientation'] = 'Följ bildformat';
+$lang['Graphics Library'] = 'Grafikbibliotek';
+$lang['... or '] = '... eller ';
+$lang['Create'] = 'Skapa';
+$lang['Start Upload'] = 'Börja uppladdning';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Du använder Flash-uppladaren. Har du problem, försök med <a href="%s">webbläsaruppladdaren</a> istället.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Du använder webbläsaruppladdaren, prova gärna <a href="%s">Flash-uppladdaren</a> istället.';
+$lang['Maximum file size: %sB.'] = 'Maximal filstorlek: %sB.';
+$lang['Allowed file types: %s.'] = 'Tillåtna filtyper: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Ungefärlig maximal upplösning: %dM pixlar (motsvarande %dx%d pixlar).';
+$lang['Manage Permissions'] = 'Hantera rättigheter';
+$lang['Photo %s of %s'] = 'Bild %s av %s';
+$lang['show details'] = 'visa detaljer';
+$lang['hide details'] = 'dölj detaljer';
+$lang['Merge tags'] = 'Sammanfoga taggar';
+$lang['Select the destination tag'] = 'Välj mål-tagg';
+$lang['(this tag will be deleted)'] = '(den här taggen kommer raderas)';
+$lang['Confirm merge'] = 'Bekräfta sammanfogning';
+$lang['Merge selected tags'] = 'Sammanfoga valda taggar';
+$lang['No destination tag selected'] = 'Ingen mål-tagg har valts';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Taggar <em>%s</em> sammanfogade som <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Välj minst två taggar för sammanfogning';
+$lang['Select an album'] = 'Välj ett album';
+$lang['Add a criteria'] = 'Lägg till ett kriterium';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Du kan inte ange en standardsortering för foton på grund av en vald inställning i din lokala konfiguration.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Du har specifierat <i>$conf[\'order_by\']</i> i din lokala konfigurationsfil, den här parametern är ersatt. Ta bort den eller döpom till <i>$conf[\'order_by_custom\']</i> !';
+$lang['All extensions are up to date.'] = 'Alla insticksmoduler är de senaste.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Följande insticksmoduler kan vara inkompatibla med senaste Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Följande teman kan vara inkompatibla med senaste Piwigo:';
+$lang['I decide to update anyway'] = 'Jag uppdaterar ändå';
+$lang['Update to Piwigo %s'] = 'Uppdatera till Piwigo %s';
+$lang['Two updates are available'] = 'Två uppdateringar är tillgängliga';
+$lang['This is a minor update, with only bug corrections.'] = 'Det här är en mindre uppdatering med bug-fixar.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Det här är en stor uppdatering med <a href="%s">nya spännande funktioner</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Några teman och insticksmoduler kan vara otillgängliga ännu.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Du kan uppdatera till to Piwigo %s direkt, utan att uppgradera till Piwigo %s (rekommenderat).';
+$lang['Save Template Directory'] = 'Spara mallkatalogen';
+$lang['Dump Database'] = 'Dumpa databasen';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Inkludera historiska data (Varning: serverns minnesgräns kan överskridas)';
+$lang['Unable to dump database.'] = 'Kan inte dumpa databasen.';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Som standard kommer Piwigo skapa en ny webbstorlek från HD (high definition) versionen av din bild.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Om ingen HD-bild är tillgänglig och den nuvarande webbstorleken är större än skalningsdimensionerna så kommer Piwigo flytta bilden till HD och skapa en nedskalad version av den.';
+$lang['An error has occured during upgrade.'] = 'Det uppstod ett fel under uppgraderingen.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Ett fel uppstod vid dekomprimeringen. Kontrollera rättigheterna på din Piwigo-installation och försök igen.<br><a href="%s">Klicka här för att visa felloggen</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo kan inte hämta uppgraderingen från servern';
+$lang['Zoom'] = 'förstora';
+$lang['Add to caddie'] = 'lägg i korgen';
+$lang['%s has been successfully updated.'] = '%s har uppdaterats.';
+$lang['Add tags'] = 'Lägg till taggar';
+$lang['Last import'] = 'Senaste import';
+$lang['Predefined filter'] = 'Fördefinierat filter';
+$lang['With no album'] = 'Utan album';
+$lang['With no tag'] = 'Utan tag';
+$lang['With no virtual album'] = 'Utan virtuellt album';
+$lang['Activate comments'] = 'Aktivera komentarer';
+$lang['Default comments order'] = 'Standardordning för kommentarer';
+$lang['Photo name'] = 'Fotonamn';
+$lang['Send connection settings by email'] = 'Skicka anslutningsinställningar med e-post';
+$lang['The original image quality must be a number between %d and %d'] = 'Originalets bildkvalitet måste vara ett nummer mellan %d %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Originalets maxhöjd måste vara ett nummer mellan %d och %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Originalets maxbredd måste vara ett nummer mellan %d och %d';
+$lang['Resize after upload'] = 'Resize after upload';
+$lang['Original Size'] = 'Originalstorlek';
+$lang['A locked gallery is only visible to administrators'] = 'Ett låst galleri är bara synligt för administratörer';
+$lang['Unlock gallery'] = 'Lås upp galleri';
+$lang['Gallery unlocked'] = 'Galleri upplåst';
+$lang['Notify administrators when a comment is'] = 'Meddela administratörer när en kommentar är';
+$lang['modified'] = 'redigerad';
+$lang['pending validation'] = 'väntar på validering';
+$lang['Save visits in history for'] = 'Sparar besök i historik för';
+$lang['simple visitors'] = 'enkla användare';
+$lang['registered users'] = 'registrerade användare';
+$lang['administrators'] = 'administratörer';
+$lang['This album contains %d photos, added on %s.'] = 'Det här albumet innehåller %d foton, tillagda på %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Det här albumet innehåller %d foton, tillagda mellan %s och %s.';
+$lang['This album contains no photo.'] = 'Det här albumet innehåller inga foton.';
+$lang['Not cropped correctly?'] = 'Ej beskuren korrekt?';
+$lang['Center of interest'] = 'Intressefokus';
+$lang['Move to album'] = 'Flytta till album';
+$lang['You can activate only one mobile theme.'] = 'Du kan enbart aktivera ett mobilt tema.';
+$lang['Automatic sort order'] = 'Automatisk sorteringsordning';
+$lang['apply automatic sort order'] = 'tillämpa automatisk sorteringsordning';
+$lang['Save manual order'] = 'Spara manuell sorteringsordning';
+$lang['cancel manual order'] = 'avbryt manuell sorteringsordning';
+$lang['Cancel'] = 'Avbryt';
+$lang['List'] = 'Lista';
+$lang['Web Form'] = 'Webbformulär';
+$lang['Applications'] = 'Applikationer';
+$lang['Available versions for'] = 'Tillgängliga versioner för';
+$lang['Available on'] = 'Tillgängliga på';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo för iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo för iOS</em> applikationer tillåter dig ansluta till ditt Piwigo galleri från din iPhone, iPad eller iPod Touch, skapa några album och ladda upp flera bilder på en gång.';
+$lang['Piwigo for Android'] = 'Piwigo för Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo för Android</em> applikationer tillåter dig ansluta till ditt Piwigo galleri från din Android telefon eller tablet, skapa några album och ladda upp flera bilder på en gång.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Publish insticksmodul för Lightroom';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom är en fotoredigeringsmjukvara designad för att hantera stora mängder bilder och göra efterredigering.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Insticksmodulen för Piwigo publicering möjliggör export och synkronisering av bilder mellan Lightroom och ditt bildgalleri.';
+$lang['Piwigo publish plugin for Shotwell'] = 'Insticksmodul för Piwigo publicering via Shotwell';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell är en Open Source digital fotohanterare för Linux som används som standard av Ubuntu och Fedora.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'I din Linux distribution, installera Shotwell via pakethanteraren och aktivera valmöjligheten Piwigo publicering.';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publicering via digiKam'; 
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam är ett avancerat program för digital mediahantering, framför allt bilder, för Linux, Windows och MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam är designat för fotografer som vill se, hantera, förbättra, organisera, märka och distribuera bilder.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'För att exportera bilder från digiKam till Piwigo, installera digiKam och Kipi-plugin för export till Piwigo.';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo export plugin för iPhoto';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto är standard för MacOSX. Piwigo export plugin låter dig skapa album och exportera dina bilder från iPhoto till ditt Piwigo galleri.';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo export plugin för Aperture';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture är ett kraftfullt verktyg för bildhantering för Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture är designat för proffs med iPhotos enkelhet.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo export modulen låter dig skapa och exportera bilder.';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) är en open source (GPL v3) Piwigo klient för the Android.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Bland annat ingår galleri-utforskning, skapande av nya album och uppladdning av bilder.';
+$lang['Generate multiple size images'] = 'Skapa flera storlekar av bilder';
+$lang['Delete multiple size images'] = 'Ta bort flera storlekar av bilder';
+$lang['any visitor can see this album'] = 'alla besökare kan se detta album';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'besökare måste lpgga in med korrekta rättigheter för att se detta album';
+$lang['Groups and users'] = 'Grupper och användare';
+$lang['Permission granted for groups'] = 'Tillstånd för följande grupper';
+$lang['Select groups...'] = 'Välj grupper...';
+$lang['There is no group in this gallery.'] = 'Det finns inga grupper i det här galleriet.';
+$lang['Permission granted for users'] = 'Tillstånd utfärdat för valda användare';
+$lang['Select users...'] = 'Välj användare...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u användare har automatiskt tillstånd eftersom de tillhör en grupp med rättigheter utfärdade.';
+
+?>
Index: tags/2.4.0RC3/language/sv_SE/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/sv_SE/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Svenska [SE]
+Version: 2.2.1
+Language URI: http://piwigo.org/ext/extension_view.php?eid=451
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Swedish';
+$lang_info['country'] = 'Sverige';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'se';
+$lang_info['zero_plural'] = true;
+
+$lang['useful when password forgotten'] = 'är användbart om du glömt lösenordet';
+$lang['Quick search'] = 'Snabbsökning';
+$lang['Connected user: %s'] = 'Anslutna användare: %s';
+$lang['IP: %s'] = 'IP: %s';
+$lang['Browser: %s'] = 'Webbläsare: %s';
+$lang['Author: %s'] = 'Fotograf: %s';
+$lang['Comment: %s'] = 'Kommentar: %s';
+$lang['Comment by %s'] = 'Kommentar av %s';
+$lang['User: %s'] = 'Användare: %s';
+$lang['Email: %s'] = 'E-post: %s';
+$lang['Admin: %s'] = 'Admin: %s';
+$lang['Registration of %s'] = 'Registrering av %s';
+$lang['Album: %s'] = 'Album: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Användarstatus för \"gäst\" är ogiltig, standard status kommer användas. Vänligen informera webbansvarig.';
+$lang['this email address is already in use'] = 'en annan användare använder redan denna e-post';
+$lang['Album results for'] = 'Albumresultat för';
+$lang['Tag results for'] = 'Tagg-resultat för';
+$lang['from %s to %s'] = 'från %s till %s';
+$lang['Play of slideshow'] = 'Starta bildspel';
+$lang['Pause of slideshow'] = 'Pausa bildspel';
+$lang['Repeat the slideshow'] = 'Repetera bildspel';
+$lang['Not repeat the slideshow'] = 'Repetera inte bildspel';
+$lang['Reduce diaporama speed'] = 'Minska bildspelets hastighet';
+$lang['Accelerate diaporama speed'] = 'Öka bildspelets hastighet';
+$lang['Submit'] = 'Skicka';
+$lang['Yes'] = 'Ja';
+$lang['No'] = 'Nej';
+$lang['%d photo'] = '%d bild';
+$lang['%d photos'] = '%d bilder';
+$lang['%d photo is also linked to current tags'] = '%d bilden är även kopplad till aktuella taggar';
+$lang['%d photos are also linked to current tags'] = '%d bilderna är även kopplade till aktuella taggar';
+$lang['display photos linked to this tag'] = 'visa enbart bilder länkade till denna tagg';
+$lang['photos posted during the last %d days'] = 'bilder postade de senaste %d dagarna';
+$lang['Piwigo Help'] = 'Piwigo Hjälp';
+$lang['Rank'] = 'Rang';
+$lang['group by letters'] = 'gruppera i bokstavsordning';
+$lang['letters'] = 'bokstäver';
+$lang['show tag cloud'] = 'Visa tagg-moln';
+$lang['cloud'] = 'moln';
+$lang['Reset to default values'] = 'Återställ till standardvärden';
+$lang['delete all photos from your favorites'] = 'radera alla bilder från dina favoriter';
+$lang['Sent by'] = 'Skickat av';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies är blockerade eller stöds inte av din webbläsare. Du måste aktivera cookies för att ansluta.';
+$lang['%d new comment'] = '%d ny kommentar';
+$lang['%d new comments'] = '%d nya kommentarer';
+$lang['%d comment'] = '%d kommentar';
+$lang['%d comments'] = '%d kommentarer';
+$lang['%d hit'] = '%d träff';
+$lang['%d hits'] = '%d träffar';
+$lang['%d new photo'] = '%d ny bild';
+$lang['%d new photos'] = '%d nya bilder';
+$lang['%d new user'] = '%d ny användare';
+$lang['%d new users'] = '%d nya användare';
+$lang['About'] = 'Om';
+$lang['All tags'] = 'Alla taggar';
+$lang['Any tag'] = 'Någon tagg';
+$lang['At least one listed rule must be satisfied.'] = 'Minst ett villkor måste uppfyllas.';
+$lang['Author'] = 'Fotograf';
+$lang['Albums'] = 'Album';
+$lang['Album'] = 'Album';
+$lang['Close this window'] = 'Stäng detta fönster';
+$lang['Complete RSS feed (photos, comments)'] = 'Komplett RSS-flöde (bilder, kommentarer)';
+$lang['Confirm Password'] = 'Bekräfta lösenord';
+$lang['Connection settings'] = 'Inställningar för anslutning';
+$lang['Login'] = 'Logga in';
+$lang['Contact webmaster'] = 'Kontakta webmaster';
+$lang['Create a new account'] = 'Skapa ett nytt konto';
+$lang['Created on'] = 'Skapad den';
+$lang['Creation date'] = 'Skapat den';
+$lang['Current password is wrong'] = 'Aktuellt lösenord är fel';
+$lang['Dimensions'] = 'Dimensioner';
+$lang['Display'] = 'Visa';
+$lang['Each listed rule must be satisfied.'] = 'Varje villkor måste vara uppfyllt.';
+$lang['Email address'] = 'E-postadress';
+$lang['Enter your personnal informations'] = 'Ange personlig information';
+$lang['Error sending email'] = 'Fel vid sändning av e-post';
+$lang['File name'] = 'Filnamn';
+$lang['File'] = 'Fil';
+$lang['Filesize'] = 'Filstorlek';
+$lang['Filter and display'] = 'Filtrera och visa';
+$lang['Filter'] = 'Filtrera';
+$lang['Forgot your password?'] = 'Har du glömt lösenordet?';
+$lang['Go through the gallery as a visitor'] = 'Navigera galleriet som besökare';
+$lang['Help'] = 'Hjälp';
+$lang['Identification'] = 'Identifiering';
+$lang['Photos only RSS feed'] = 'RSS-flöde med endast bilder';
+$lang['Keyword'] = 'Sökord';
+$lang['Links'] = 'Länkar';
+$lang['Notification'] = 'Meddelande';
+$lang['Number of items'] = 'Antal';
+$lang['Original dimensions'] = 'Originalstorlek';
+$lang['Password forgotten'] = 'Glömt lösenord';
+$lang['Password'] = 'Lösenord';
+$lang['Post date'] = 'Publiceringsdatum';
+$lang['Posted on'] = 'Publicerat';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Snabblogin';
+$lang['RSS feed'] = 'RSS-flöde';
+$lang['Register'] = 'Registrera';
+$lang['Registration'] = 'Registrering';
+$lang['Related tags'] = 'Relaterade taggar';
+$lang['Reset'] = 'Återställ';
+$lang['Retrieve password'] = 'Hämta lösenord';
+$lang['Search rules'] = 'Sökkriterier';
+$lang['Search tags'] = 'Sök taggar';
+$lang['Search'] = 'Sök';
+$lang['display available tags'] = 'visa tillgängliga taggar';
+$lang['Since'] = 'Sedan';
+$lang['Sort by'] = 'Sortera efter';
+$lang['Sort order'] = 'Sorteringsordning';
+$lang['Tag'] = 'Tagg';
+$lang['Tags'] = 'Taggar';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS-flödet ger information om nya händelser från denna webbplats: nya bilder, uppdaterade album och nya kommentarer. Används med en RSS-läsare.';
+$lang['Unknown feed identifier'] = 'Okänt RSS-flöde';
+$lang['User comments'] = 'Kommentarer';
+$lang['Username'] = 'Användarnamn';
+$lang['Visits'] = 'Besök';
+$lang['Webmaster'] = 'Webbansvarig';
+$lang['Week %d'] = 'Vecka %d';
+$lang['About Piwigo'] = 'Om Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Du har inte behörighet till den begärda sidan';
+$lang['add this photo to your favorites'] = 'lägg bilden i dina favoriter';
+$lang['Administration'] = 'Administration';
+$lang['all'] = 'alla';
+$lang['ascending'] = 'stigande';
+$lang['author(s) : %s'] = 'fotograf(er) : %s';
+$lang['Expand all albums'] = 'Visa alla album';
+$lang['posted after %s (%s)'] = 'publicerade efter %s (%s)';
+$lang['posted before %s (%s)'] = 'publicerade före %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'publicerade mellan %s (%s) och %s (%s)';
+$lang['posted on %s'] = 'Publicerad den %s';
+$lang['Best rated'] = 'Högst betygsatta';
+$lang['display best rated photos'] = 'visa högst betygsatta bilder';
+$lang['Calendar'] = 'Kalender';
+$lang['All'] = 'Alla';
+$lang['display each day with photos, month per month'] = 'visa varje dag med bilder, månad för månad';
+$lang['View'] = 'Visa';
+$lang['day'][0] = "Söndag";
+$lang['day'][1] = "Måndag";
+$lang['day'][2] = "Tisdag";
+$lang['day'][3] = "Onsdag";
+$lang['day'][4] = "Torsdag";
+$lang['day'][5] = "Fredag";
+$lang['day'][6] = "Lördag";
+$lang['month'][10] = "Oktober";
+$lang['month'][11] = "November";
+$lang['month'][12] = "December";
+$lang['month'][1] = "Januari";
+$lang['month'][2] = "Februari";
+$lang['month'][3] = "Mars";
+$lang['month'][4] = "April";
+$lang['month'][5] = "Maj";
+$lang['month'][6] = "Juni";
+$lang['month'][7] = "Juli";
+$lang['month'][8] = "Augusti";
+$lang['month'][9] = "September";
+$lang['chronology_monthly_calendar'] = 'månadskalender';
+$lang['chronology_monthly_list'] = 'månadslista';
+$lang['chronology_weekly_list'] = 'veckolista';
+$lang['Click here if your browser does not automatically forward you'] = 'Klicka här om din webbläsare inte automatiskt omdirigerar dig';
+$lang['comment date'] = 'kommentarsdatum';
+$lang['Comment'] = 'Kommentar';
+$lang['Your comment has been registered'] = 'Din kommentar har registrerats';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood-system: vänta en stund innan du försöker att skicka ytterligare en kommentar';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Din kommentar har INTE registrerats eftersom den inte överensstämmer med valideringsreglerna';
+$lang['An administrator must authorize your comment before it is visible.'] = 'En administratör måste godkänna din kommentar innan den visas.';
+$lang['This login is already used by another user'] = 'Denna inloggning används redan av en annan användare';
+$lang['Comments'] = 'Kommentarer';
+$lang['Add a comment'] = 'Lägg till en kommentar';
+$lang['created after %s (%s)'] = 'har skapats efter %s (%s)';
+$lang['created before %s (%s)'] = 'har skapats före %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'har skapats mellan %s (%s) och %s (%s)';
+$lang['created on %s'] = 'har skapats den %s';
+$lang['Customize'] = 'Anpassa';
+$lang['Your Gallery Customization'] = 'Din gallerianpassning';
+$lang['Default'] = 'Standard';
+$lang['delete this photo from your favorites'] = 'ta bort bilden från dina favoriter';
+$lang['Delete'] = 'Ta bort';
+$lang['descending'] = 'fallande';
+$lang['Download'] = 'Ladda ner';
+$lang['Download this file'] = 'ladda ner denna fil';
+$lang['edit'] = 'redigera';
+$lang['wrong date'] = 'fel datum';
+$lang['excluded'] = 'exkluderade';
+$lang['Your favorites'] = 'Mina favoriter';
+$lang['display your favorites photos'] = 'visa mina favoriterbilder';
+$lang['Favorites'] = 'Favoriter';
+$lang['First'] = 'Första';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Galleriet är stängt för underhåll. Vänligen kom tillbaka senare.';
+$lang['Page generated in'] = 'Sidan skapades';
+$lang['guest'] = 'Gäst';
+$lang['Hello'] = 'Hej';
+$lang['available for administrators only'] = 'endast för administratörer';
+$lang['display this album'] = 'visa detta album';
+$lang['display last user comments'] = 'visa de senaste användarkommentarerna';
+$lang['customize the appareance of the gallery'] = 'anpassa galleriets utseende';
+$lang['search'] = 'sök';
+$lang['Home'] = 'Hem';
+$lang['in this album'] = 'i detta album';
+$lang['in %d sub-album'] = 'i %d underliggande album';
+$lang['in %d sub-albums'] = 'i %d underliggande album';
+$lang['included'] = 'inkluderat';
+$lang['Invalid password!'] = 'Ogiltigt lösenord!';
+$lang['Language'] = 'Språk';
+$lang['last %d days'] = 'sista %d dagarna';
+$lang['Last'] = 'Sista';
+$lang['Logout'] = 'Logga ut';
+$lang['obligatory'] = 'obligatorisk';
+$lang['Maximum photo height'] = 'Maximal höjd på bilderna';
+$lang['Maximum height must be a number superior to 50'] = 'Maximal höjd måste vara större än 50';
+$lang['Maximum photo width'] = 'Maximal bredd på bilderna';
+$lang['Maximum width must be a number superior to 50'] = 'Maximal bredd måste vara större än 50';
+$lang['display a calendar by creation date'] = 'visa en kalender sorterad efter datum för skapande';
+$lang['display all photos in all sub-albums'] = 'visa alla bilder i alla underliggande album';
+$lang['return to normal view mode'] = 'återgå till normalt visningsläge';
+$lang['display a calendar by posted date'] = 'visa en kalender sorterad efter publiceringsdatum';
+$lang['Most visited'] = 'Mest besökta';
+$lang['display most visited photos'] = 'visa mest besökta bilder';
+$lang['Unknown identifier'] = 'Okänt id';
+$lang['New password'] = 'Nytt lösenord';
+$lang['Rate this photo'] = 'Betygsätt den här bilden';
+$lang['Next'] = 'Nästa';
+$lang['no rate'] = 'inget betyg';
+$lang['Photos posted within the last %d day.'] = 'Bilder postade den senaste %d dagen.';
+$lang['Photos posted within the last %d days.'] = 'Bilder postade de senaste %d dagarna.';
+$lang['password updated'] = 'lösenord uppdaterat';
+$lang['Recent period must be a positive integer value'] = 'Senaste tiden måste vara ett positivt heltal';
+$lang['photo'] = 'bild';
+$lang['Click on the photo to see it in high definition'] = 'Klicka på bilden för att se den i hög upplösning';
+$lang['Show file metadata'] = 'Visa filens metadata';
+$lang['Powered by'] = 'Baserat på';
+$lang['Preferences'] = 'Inställningar';
+$lang['Previous'] = 'Föregående';
+$lang['Random photos'] = 'Slumpmässiga bilder';
+$lang['display a set of random photos'] = 'visa en uppsättning slumpmässiga bilder';
+$lang['Recent albums'] = 'Senaste album';
+$lang['display recently updated albums'] = 'visa nyligen uppdaterade album';
+$lang['Recent period'] = 'Senaste perioden';
+$lang['Recent photos'] = 'Senaste bilder';
+$lang['display most recent photos'] = 'visa senaste bilder';
+$lang['Redirection...'] = 'Omdirigering...';
+$lang['Please, enter a login'] = 'Vänligen ange inloggning';
+$lang['login mustn\'t end with a space character'] = 'användarnamn får inte sluta med ett mellanslag';
+$lang['login mustn\'t start with a space character'] = 'användarnamn får inte börja med ett mellanslag';
+$lang['this login is already used'] = 'Detta användarnamn används redan';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'e-postadress måste vara av formen ”arne@anka.org';
+$lang['please enter your password again'] = 'vänligen ange ditt lösenord igen';
+$lang['Auto login'] = 'Automatisk inloggning';
+$lang['remove this tag from the list'] = 'ta bort taggen från listan';
+$lang['representative'] = 'representant';
+$lang['Search for Author'] = 'Sök efter en fotograf';
+$lang['Search in albums'] = 'Sök i album';
+$lang['Search by date'] = 'Sök efter datum';
+$lang['Date'] = 'Datum';
+$lang['End-Date'] = 'Slutdatum';
+$lang['Kind of date'] = 'Typ av datum';
+$lang['Search for words'] = 'Sök efter orden';
+$lang['Search for all terms'] = 'Sök efter alla termer';
+$lang['Search for any term'] = 'Sök efter någon term';
+$lang['Empty query. No criteria has been entered.'] = 'Tom fråga. Inga kriterier har angetts.';
+$lang['Search results'] = 'Sökresultat';
+$lang['Search in sub-albums'] = 'Sök i underliggande album';
+$lang['searched words : %s'] = 'sökte efter : %s';
+$lang['Contact'] = 'Kontakta';
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d album uppdaterat';
+$lang['%d albums updated'] = '%d album uppdaterade';
+$lang['%d comment to validate'] = '%d inlägg att godkänna';
+$lang['%d comments to validate'] = '%d inlägg att godkänna';
+$lang['N/A'] = 'Inte tillgängligt';
+$lang['New on %s'] = 'Nya på %s';
+$lang['set as album representative'] = 'ange som omslag för album';
+$lang['Show number of comments'] = 'Visa antal inlägg';
+$lang['Show number of hits'] = 'Visa antal träffar';
+$lang['slideshow'] = 'bildspel';
+$lang['stop the slideshow'] = 'stoppa bildspelet';
+$lang['Specials'] = 'Funktioner';
+$lang['SQL queries in'] = 'SQL-frågor i';
+$lang['display only recently posted photos'] = 'visa endast nyligen publicerade bilder';
+$lang['return to the display of all photos'] = 'återgå till visning av alla bilder';
+$lang['the beginning'] = 'början';
+$lang['Interface theme'] = 'Gränssnittstema';
+$lang['Thumbnails'] = 'Miniatyrer';
+$lang['Menu'] = 'Meny';
+$lang['A comment on your site'] = 'En kommentar på din sida';
+$lang['today'] = 'idag';
+$lang['Update your rating'] = 'Ändra ditt betyg';
+$lang['the username must be given'] = 'användarnamn krävs';
+$lang['Edit a comment'] = 'Redigera ett inlägg';
+$lang['Are you sure?'] = 'Är du säker?';
+$lang['(!) This comment requires validation'] = '(!) Detta inlägg kräver validering';
+$lang['Welcome'] = 'Välkommen';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Välkommen till ditt Piwigo-fotogalleri!';
+$lang['... or browse your empty gallery'] = '... eller bläddra i ditt tomma galleri';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... eller vänligen avaktivera detta meddelande, jag hittar själv';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Hej %s, ditt Piwigo fotogalleri är tomt!';
+$lang['I want to add photos'] = 'Jag vill lägga till bilder';
+$lang['Manage this user comment: %s'] = 'Hantera det här användarinlägget: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'E-postadressen saknas. Vänligen ange din e-postadress.';
+$lang['This author modified following comment:'] = 'Denna fotograf modifierade följande inlägg:';
+$lang['This author removed the comment with id %d'] = 'Denna fotograf raderade inlägg med id %d';
+$lang['html tags are not allowed in login'] = 'HTML-taggar är inte tillåtna vid inloggning';
+$lang['The number of photos per page must be a not null scalar'] = 'Antal foton per sida får inte vara noll';
+$lang['Number of photos per page'] = 'Antal foton per sida';
+$lang['%d rates'] = '%d röster';
+$lang['Rating score'] = 'Röstpoäng';
+$lang['Invalid username or email'] = 'Ogiltigt användarnamn eller e-postaddress';
+$lang['Password reset is not allowed for this user'] = 'Lösenordsåterställning är ej tillåtet för denna användare';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Användare "%s" har ingen e-postadress, lösenordsåterställning är ej möjlig';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Någon har begärt lösenordsåterställning för följande användarkonto:';
+$lang['Username "%s" on gallery %s'] = 'Användare "%s" i galleri %s';
+$lang['To reset your password, visit the following address:'] = 'För att återställa ditt lösenord, gå till denna adress:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Om detta var felaktigt, vänligen ignorera detta meddelande och ingen åtgärd kommer vidtas.';
+$lang['Password Reset'] = 'Lösenordsåterställning';
+$lang['Check your email for the confirmation link'] = 'Kontrollera din e-post för bekräftelselänken';
+$lang['Invalid key'] = 'Ogiltig nyckel';
+$lang['The passwords do not match'] = 'Lösenorden stämmer inte överens';
+$lang['Your password has been reset'] = 'Ditt lösenord har återställts';
+$lang['Return to home page'] = 'Gå tillbaks timm hem-sidan';
+$lang['Please enter your username or email address.'] = 'Ange ditt användarnamn och e-postadress.';
+$lang['You will receive a link to create a new password via email.'] = 'Du kommer att få en länk via e-post för att skapa ett nytt lösenord.';
+$lang['Username or email'] = 'Användanamn eller e-post';
+$lang['Change my password'] = 'Ändra mitt lösenord';
+$lang['Enter your new password below.'] = 'Ange ditt nya lösenord nedan.';
+$lang['EXIF Metadata'] = 'EXIF Metadata';
+$lang['IPTC Metadata'] = 'IPTC Metadata';
+$lang['Edit'] = 'Redigera';
+$lang['Hello %s,'] = 'Hej %s,';
+$lang['Send my connection settings by email'] = 'Skicka mina anslutningsinställningar via e-post';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Registreringen lyckades, du kommer snart få ett e-post meddelande med dina anslutningsinställningar. Välkommen!';
+$lang['Username modification'] = 'Regdigera användarnamn';
+$lang['Your username has been successfully changed to : %s'] = 'Ditt användarnamn har ändrats till: %s';
+$lang['square'] = 'Kvadrat';
+$lang['thumb'] = 'Miniatyr';
+$lang['small'] = 'Liten';
+$lang['medium'] = 'Medium';
+$lang['large'] = 'Stor';
+$lang['xlarge'] = 'XStor';
+$lang['xxlarge'] = 'XXStor';
+$lang['Original'] = 'Original';
+$lang['Thank you for registering at %s!'] = 'Tack för att du registrerat på %s!';
+$lang['Here are your connection settings'] = 'Här är dina anslutningsinställningar';
+$lang['Password: %s'] = 'Lösenord: %s';
+$lang['Username: %s'] = 'Användarnamn: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Om du anser att du har fått det här meddelandet felaktigt, vänligen kontakta oss på %s';
+$lang['Show oldest comments first'] = 'Visa äldsta kommentarer först';
+$lang['Show latest comments first'] = 'Visa senaste kommentarer först';
+$lang['Photo sizes'] = 'Bildstorlekar';
+$lang['View in'] = 'Visa i';
+$lang['Mobile'] = 'Mobil';
+$lang['Desktop'] = 'Desktop';
+$lang['2small'] = 'XXS - miniatyr';
+$lang['xsmall'] = 'XS - extra liten';
+$lang['File name, A &rarr; Z'] = 'Filnamn, A &rarr; Ö';
+$lang['File name, Z &rarr; A'] = 'Filnamn, Ö &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Bildens namn, A &rarr; Ö';
+$lang['Photo title, Z &rarr; A'] = 'Bildens namn, Z &rarr; Ö';
+$lang['Date created, new &rarr; old'] = 'Skapad datum, ny &rarr; gammal';
+$lang['Date created, old &rarr; new'] = 'Skapad datum, gammal &rarr; ny';
+$lang['Date posted, new &rarr; old'] = 'Publicerad datum, ny &rarr; gammal';
+$lang['Date posted, old &rarr; new'] = 'Publicerad datum, gammal &rarr; ny';
+$lang['Rating score, high &rarr; low'] = 'Betyg, hög &rarr; låg';
+$lang['Rating score, low &rarr; high'] = 'Betyg, låg &rarr; hög';
+$lang['Visits, high &rarr; low'] = 'Besökare, hög &rarr; låg';
+$lang['Visits, low &rarr; high'] = 'Besökare, låg &rarr; hög';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Numeriskt id, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Numeriskt id, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Manuell sortering';
+
+?>
Index: tags/2.4.0RC3/language/sv_SE/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,138 @@
+<h2>Redigera en kategori</h2>
+
+<h3>Information</h3>
+
+<ul>
+
+  <li><strong>namn</strong>: Byt namn på kategori (virtuellt namn byte
+  av en fysisk kategori).</li>
+
+  <li><strong>beskrivning</strong>: en kort text ger en allmän uppfattning om innehållet,
+  Denna text kommer att visas längst ned på miniatyrer sidan.</li>
+
+</Ul>
+
+<h3>Flytta</h3>
+
+<p>Om kategorin är virtuell, kan du flytta den. Flytta en kategori innebär
+att ändra den överordnade kategorin.</p>
+
+<h3>Alternativ</h3>
+
+<ul>
+
+  <li><strong>Åtkomsttyp</strong>: Behörigheter hantering. Om du gör en
+  kategori privat, så blir alla dess underordnade kategorier blir privata. Om du gör en
+  kategori allmän, blir alla dess överordnade kategorier allmäna.</li>
+
+  <li><strong> Låst</strong>: Den kategori och dess underkategorier kommer att
+  vara tillfällig inaktiverad för underhåll.</li>
+
+  <li><strong>Kommentarer</strong>: Auktorisera användare kan kommentera delar av dena
+  kategorin. </ li>
+
+  <li><strong>Auktoriserad att ladda upp</strong>: Auktorisera användare kan ladda upp
+  bildfiler. Det här alternativet är tillgängligt för fysisk (inte
+  virtuella) kategorier. </li>
+
+</Ul>
+
+<p> Du kan också hantera dessa alternativ på "Egenskaper"
+management skärmen (screens<span class="pwgScreen">Ladda upp</span>,<span
+class = "pwgScreen"> Kommentarer</span>,<span class="pwgScreen">Låst</span>,
+<span class="pwgScreen">Offentlig-Privata</span>,<span
+class = "pwgScreen">Representant</span> tillgänglig från <span
+class = "pwgScreen">Administration, kategorier, Egenskaper</span>).</p>
+
+<h3>Sorteringsordning</h3>
+
+<p>Använd standard sorteringsordningen för bilderna.</p>
+
+<p> Ange om denna sorteringsordningen kommer att gälla även underkategorier. </p>
+
+<p> Välj specifika sorterings kriterier som skall användas med på den här kategorin.</p>
+<ul>
+<li><strong>Skapande datum</strong>: Bild fotograferingsdatum</li>
+<li><strong>Publilerings datum</strong>: Synkronisering datum</li>
+<li><strong>Genomsnittskurs (*)</strong>: Genomsnittlig kan ändras av besökarnas röstning </li>
+<li><strong>Mest besökta (*)</strong>: Det aktuella besöket kan ändra mest besökta ordning</li>
+<li><strong>Filnamn</strong>: Namn anges i information område </ li>
+<li><strong>Id </strong>:. Internt id (senare kategorierna har ett högre id än tidigare </li>
+
+</Ul>
+<p><strong>(*)</strong>Varning: Var noga med att testa dessa sorteringsordningar av dig själv,för de kan ge oväntade resultat </p>.
+
+
+<!--no translate-->
+<h3>Representant</h3>
+
+<p>The album representative is the thumbnail displayed on the main page (<span class="pwgScreen">category.php</span>) to represent
+the album when
+it contains only sub-albums and no direct photo (just as the root album).</p>
+photo of a album :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Photo page</span>: one of the action buttons let you set the current photo as the representative for the
+  displayed album. This button is available only for administrators.</li>
+
+  <li><span class="pwgScreen">Modify informations about a photo</span> in
+  administration. This screen can be reached from <span
+  class="pwgScreen">picture.php</span> or <span class="pwgScreen">Batch
+  management</span> in <em>unit mode</em>. See the help of this screen for
+  details.</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Albums &raquo; Properties,
+  Representative</span>. See the help of this screen for details.</li>
+
+  <li><span class="pwgScreen">Edit album</span> (the present screen).</li>
+
+</ul>
+
+<p>The choice of a representative depends on the 
+<code>allow_random_representative</code> configuration parameter (see <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>In default mode (<code>allow_random_representative</code> set to false),
+each album containing at least one element is represented by a fixed
+element. Once set (at album creation), the representative changes only
+when an administrator ask for it. If the representative is not appropriate,
+you can ask to <strong>Find a new representant by random</strong>.</p>
+
+<p>If the <code>allow_random_representative</code> configuration parameter is
+set to true, a category containing photos may have no fixed
+representant. Just use <strong>Delete representant</strong> button.</p>
+
+<p>If the album contains only sub-albums and no photo, it can nonetheless be represented by any element thanks to <span class="pwgScreen">Modify
+informations about a photo</span> screen. The only option on the current screen
+is the <strong>Delete representant</strong> button.</p>
+
+<h3>Link all album photos to a new album</h3>
+
+<ul>
+
+<li><strong>Virtual album name</strong>: Name of the new album to be created, 
+all photos of the current category will be linked to the new one.</li>
+
+<li><strong>Parent album</strong>: Where the new album will be, 
+leave empty to create it at root.</li>
+
+</ul>
+
+<h3>Link all album photos to existing albums</h3>
+
+<ul>
+
+<li><strong>Albums</strong>: Choose the destination album.</li>
+
+</ul>
+
+<h3>Send an information email to group members</h3>
+
+<ul>
+
+<li><strong>Group</strong>: recipients group</li>
+
+<li><strong>Mail content</strong>: Free text to send to them.</li>
+
+</ul>  
Index: tags/2.4.0RC3/language/sv_SE/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Flytta virtuella album</h2>
+
+<p>Endast virtuella album kan få ett nytt överordnade album.</p>
+
+<h3>Virtuella album att flytta</h3>
+
+<p>Välj en eller flera virtuella album som du vill flytta.
+Om listan är tom, att betyda att du inte har skapat ett ännu.</p>
+
+<h3>Nya överliggande album</h3>
+
+<p>Välj det nya överliggande albumet (virtuellt eller fysiskt).
+Om du inte väljer någon överliggande, kommer den virtuella markerade album flyttas till roten.
+Ett album kan inte flyttas till sig själv eller till någon av sina underliggande.</p>
Index: tags/2.4.0RC3/language/sv_SE/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Albums alternativ</h2>
+
+<p>Alternativ hantering för flera album på en gång</p>
+
+<dl>
+
+<dt>kommentarer</dt>
+<dd>Ett foto kan ta emot kommentarer från fler besökare om den tillhör ett album med kommentarer aktiverad.</dd>
+
+<dt>Låst/dt>
+<dd>Låst album är avaktiverade för underhåll. Endast administratörer kan se dem i galleriet.</dd>
+
+<dt>Offentlig / privata</dt>
+<dd>När ett album blir privat, ge rättigheter till användare och grupper</dd>
+
+<dt>representant</dt>
+<dd>Det här alternativet finns när du anger i konfigurationsinställningen
+<code>allow_random_representative</code> (se <span
+class="filename">include/config_defaults.inc.php</span>) to
+<em>Sant</em>. Varje album kan representeras av en slumpmässig bild eller ett foto som valts som en unik representant.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/sv_SE/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,13 @@
+<h2>Hantera behörigheter för en kategori</h2>
+
+<p>Den här meny är bara tillgänglig för privata kategorier. Här kan du välja
+användare och grupper som godkänts för en kategori.</p>
+
+<h3>Grupper</h3>
+
+<p>Du kan neka eller bevilja grupper tillgång för den aktuella kategorin. Genom att modifiera
+en gruppstillstånd kommer användare som tillhör dessa grupper vägras eller beviljas tillträde till den kategori.</p>
+
+<h3>Användare</h3>
+
+<p>Du kan neka eller ge tillgång till enskilda användare. Användare som har tillgång till genom en grupp behörighet kan nekas tillträde med undantag.</p>
Index: tags/2.4.0RC3/language/sv_SE/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/configuration.html	(revision 14585)
@@ -0,0 +1,132 @@
+<h2>Konfiguration</h2>
+
+<p>Denna meny låter administratören utföra grundläggande konfiguration. Faktum är att denna
+meny visar endast enkel konfigurering parametrar som bör räcka för
+de allra flesta administratörer. Om du vill se andra otaliga (och
+avancerad) konfigurationsparametrar, läsa filen  <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Den här meny är uppdelad i flera avsnitt, omgruppera konfiguration
+parametrar efter tema.</p>
+
+
+<h3>Huvudsakliga</h3>
+<ul>
+  <li><strong>Galleri titel</strong>: används i RSS-feed och noteringar av
+e-post.</li>
+
+  <li><strong>Sid banner</strong>: Visas högst upp på varje public sida.</li>
+
+  <li><strong>Galleri URL</strong>: används för RSS-flöde.</li>
+
+  <li><strong>Stäng galleri</strong>: stänger hela galleriet för
+   underhåll. Endast administratörer användare kommer att kunna nå
+   galleriet.</li>
+
+  <li><strong>Betyg</strong>: Funktionen för att sätta betyg är aktiverad.</li>
+
+  <li><strong>Bestyg av gäster</strong>: Även oregistrerade användare kan betygsätta bilder.</li>
+
+  <li><strong>Tillåt användare registrering</strong>: Vem som helst kan registrera sig.</li>
+
+  <li><strong>E-post är obligatoriskt för alla användare</strong>: e-postadress kommer att kontrolleras vid registrering eller profil uppdatering, förutom om åtgärden görs av en administratör.</li>
+
+  <li><strong>Skicka e-post när nya användare regestrerar sig</strong>: administratörer kommer att meddelas via e-post för varje ny registrering.</li>
+
+</ul>
+
+<h3>Historia</h3>
+
+  <p>Besök på sidorna <span
+  class="pwgScreen">category.php</span> Och <span
+  class="pwgScreen">picture.php</span> kommer att sparas i
+  <code>historisk</code> tabell.</p>
+
+  <p>Besök kommer att visas i <span
+  class="pwgScreen">Administration, Erbjudande, Historik</span>.</p>
+
+<ul>
+  <li><strong>Spara sidan som gäster har besökt</strong>: Sidor som besökts av gäster kommer att registreras.</li>
+
+  <li><strong>Spara sidan som registrerade användare har besökt</strong>: Sidor som besökts av användare kommer att registreras.</li>
+
+  <li><strong>Spara sidan som administratörer har besökt</strong>: Sidor som besökts av administratörer kommer att registreras.</li>
+
+</ul>
+
+<h3>Comments</h3>
+<ul>
+
+  <li><strong>Kommentarer till allal</strong>: Även oregistrerade gäster kan skicka
+   kommentarer.</li>
+
+  <li><strong>Antal kommentarer per sida</strong>.</li>
+
+  <li><strong>Validering</strong>: en administratör måste validera användarens kommentarer innan de blir synliga på webbplatsen. Användarens kommentarer valideras i
+  menyn administration <span class="pwgScreen">Administration, bilder,
+  Komentarer</span>.</li>
+
+  <li><strong>Skickar e-post till admins när en komentar godkänns</strong>:
+Skickar ett mejl till administratörer när en användare anger en kommentar och den här kommentaren är godkänd.</li>
+
+  <li><strong>Skickar e-post till admins när en kommentar kräver validering</strong>:
+Skickar ett mejl till administratörer när en användare anger en kommentar som kräver godkännande av admin.
+Kommentarer validering sker på Menyn <span class="pwgScreen">Administration, bilder, Kommentarer </span>.</li>
+
+</ul>
+
+<h3>Ladda upp</h3>
+<ul>
+  <li><strong>Visa upp laddnings länk varje gång</strong>: Om uppladdade kategorier finns redan, kommer en uppladdning länk visas för varje kategor.</li>
+  <li><strong>Användarnas behörighets nivå för uppladdning</strong>: Begränsar uppladdning till vissa kategorier av användare</li>
+  <li><strong>Skickar e-post till admin när en bild är uppladdad</strong>: Administratörer kommer att meddelas via e-post varje gång en bild laddas upp av en användare.</li>
+</ul>
+
+<h3>Standard display</h3>
+
+<p>Här kan du ändra visningsalternativ som används av gäst, standard användare som inte har loggat in.
+När användaren har loggat in så får användaren sina egna alternativ
+(modifiable in <span class="pwgScreen">Profil</span>).</p>
+
+<p>Det är möjligt att ändra visningsalternativ för alla befintliga användare, på <span class="pwgScreen">Administration,
+Inloggnings id, Användare</span> menyn, där du kan välja en lista med
+användare.</p>
+
+<ul>
+
+  <li><strong>Språk /strong>: används på Piwigo
+   etiketter bara. Kategori namn, namn på bild och alla beskrivande fält är inte
+   lokala.</li>
+
+  <li><strong>Antal bilder per rad</strong></li>
+
+  <li><strong>Antal rader per sida</strong></li>
+
+  <li><strong>Tema för gränssnitt</strong></li>
+
+  <li><strong>Senaste perioden</strong>: Sorterat på dagar. Period under vilken en bild är
+   visas som nya. Måste vara större än 1 dag.</li>
+
+  <li><strong>Expandera alla kategorier</strong>: Expandera alla kategorier som
+   standard i menyn <em>Varning</em>: det här alternativet är resurs krävande
+   och kan generera stora menyn om ditt kategori träd innehåller många
+   kategorier.</li>
+
+  <li><strong>Visa antal kommentarer</strong>: visa antalet kommentarer
+   för varje bild på miniatyrerna sidan. Resurs krävande.</li>
+
+  <li><strong>Visa antal träffar</strong>: visa träffar på bilder
+  under miniatyrbilden på miniatyrerna sida.
+  Först när avancerad konfiguration parameter: <br>
+  $conf['show_nb_hits'] = Sant; <br>
+  Notice: Inte aktiverat som standard.</li>
+
+  <li><strong>Maximal bredd på bilderna</strong>: visa max bredden.
+  Bilder som är större än den här inställningen kommer att ändras på
+   i visningsläget. Välj hälldre att ändra bredden på dina bilder,
+   det skulle vara en bättre praxis.</li>
+
+  <li><strong>Maximal höjd på bilderna</strong>: Samma anmärkningar som för
+maximal bredd inställningen.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/sv_SE/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Grupp lista</h2>
+
+<p>Detta är platsen där du kan hantera grupper.</p>
+
+<h3>Lägg till en grupp</h3>
+
+<p>Administratören kan lägga till grupper.</p>
+
+<h3>Grupp lista</h3>
+
+<p>för varje element, så kan du i listan:</p>
+
+
+<ul>
+  <li>gå till listan för över medlemmar</li>
+  <li>gå till behörighets menyn</li>
+  <li>ta bort en grupp (kräver en bekräftelse)</li>
+  <li>växla status, "default" (kräver en bekräftelse)</li>
+</ul>
+
+<h3>Standard grupper</h3>
+<p>Standard grupper är grupper som automatiskt kopplade till varje ny användare vid registrering eller skapande av en administratör.</p>
Index: tags/2.4.0RC3/language/sv_SE/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,27 @@
+<p>Det finns flera sätt att lägga dina bilder i ditt galleri:</p>
+
+<ul>
+  <li><strong>Direkt uppladdning</strong> i din webbläsare är det
+   enklaste och mest direkta sättet. Beroende på din Webbläsares funktioner
+   och din webbserver så kan fel uppkomma,tex För en stor mängd bilder eller i fall du stöter på några andra problem,
+   så finns det andra metoder som bara väntar på dig!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Gå till Direkt uppladdning </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> är ett program, som installeras på din dator. Dra &amp;släpp bilder till pLoader fönstret, klicka på <em>"Ladda upp till Piwigo"</em> och låt pLoader göra jobbet. Det finns även andra program som <strong>WinToPiwigo</strong> eller <strong>Digikam</strong> som är ett export plugin till Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Gå till pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP-överföring</strong> är den mest rekommenderade sättet att lägga till en
+   mycket stor samling av bilder med ett minimalt antal klick. Följ
+   guiden att förbereda dina bilder. FTP-metod kan du kontrollera exakt
+   den fysiska organisationen av dina bilder på din server.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Gå till FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/sv_SE/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/help_groups.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p>Grupper är ett bekvämt sätt att ange behörigheter för en lista med användare.</p>
+
+<p>Skapa grupper i <span class="pwgScreen">Administration &raquo; Användare
+&raquo; Grupper</span> och associerade användare till denna grupp i
+<span class="pwgScreen">Administration &raquo; användare &raquo;
+Hantera</span>.</p>
+
+<p>En användare kan tillhöra flera grupper. Tillåtelse har företräde framför förbud:
+Om användaren "jack" tillhör gruppen "Familj" och "vänner", och att endast gruppen
+"familj" kan se kategori "jul 2003", Då kommer
+"jack" kommer att kunna se "Jul 2003".</p>
Index: tags/2.4.0RC3/language/sv_SE/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,57 @@
+<fieldset>
+<legend>Behörigheter på bilder</legend>
+
+<p>Varje bild har en <strong>behörighetsnivå</strong> .(Låsbar), Varje användare har också en behörighetsnivå (ett ID). Det finns 5 behörighetsnivåer:</p>
+<ol>
+  <li>Ingen</li>
+  <li><em>Kontakter</em></li>
+  <li><em>Vänner (vilket är högre än en kontakter)</em></li>
+  <li><em>Familj (vilket är högre än en vänner)</em></li>
+  <li><em>Administratörer (vilket är högre än någon annan nivå)</em></li>
+</ol>
+
+<p>Högre nivåer har behörighet på lägre nivåer. Ju höre behörighet användaren har, ju mer bilder kan användaren se.</p>
+
+<p>Till exempel, om foto "peter_wedding-0024.jpg" Har <em>"Familj"</em> behörighetsnivå, då:</p>
+<ul>
+  <li>Peter (som är en <em>"administratör"</em>) kommer att se bilden eftersom <em>"Adminstratör"</em> kan se alla bilder</li>
+  <li>Beth (som är en <em>"Familj"</em> member) kommer också se bilden</li>
+  <li>Mary (som är en <em>"Vänner"</em>) kommer inte se bilden</li>
+</ul>
+
+<p>En användare som inte har någon behörighet att visa innehållet i en kategori, kommer att se kategorin själv, inte ens dess titel. Samma princip gäller för en taggar</p>
+
+<p>Du kan ställa in behörighetsnivån för en användare på <span class="pwgScreen">Administration &raquo; Användare &raquo; Hantera</span> skärmen.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Behörigheter på Kategorier</legend>
+
+<p>Om behörighets niverna inte passar dina behov, kan du hantera även sätta behörigheter på kategorier för en användare eller en grupp. Du kan hantera behörigheter på bilder och kategorier samtidigt, utan konflikter.</p>
+
+<p>Du kan förbjuda tillgång till kategorier. Byt kategori åtkomst typ till
+"Privat" om du vill hantera behörigheter.</p>
+
+<p>Du kan ange en kategori som "privat" genom att redigera en kategori
+(<span class="pwgScreen">Administration &raquo; Kategorier &raquo; Hantera
+&raquo; Editera</span>) eller genom att ange alternativ för hela din kategori trädet
+(<span class="pwgScreen">Administration &raquo; Kategorier &raquo;
+Engenskaper &raquo; Publik / Privat</span>).</p>
+
+<p>När kategorin är privat, kan du hantera behörigheter för grupper och
+användare med dessa 3 menyer:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Administration &raquo; Användare &raquo; hantera &raquo;
+  behörigheter</span> (en länk per användare)</li>
+
+  <li><span class="pwgScreen">Administration &raquo; Användare &raquo; Grupper &raquo;
+  behörigheter</span> (en länk per grupp)</li>
+
+  <li><span class="pwgScreen">Administration &raquo; kategorier &raquo; hantera &raquo; editera
+  Kategori behörighet</span> (en länk per kategori)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/sv_SE/help/index.php
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/sv_SE/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,29 @@
+<h2>Skapa miniatyrer</h2>
+
+<p>Den här sidan låter dig skapa saknade miniatyrer. Det rekommenderas inte att använda den här funktionen, om ditt galleri finns på en delad server.</p>
+
+<dl>
+
+  <dt>GD version</dt>
+
+  <dd>GD är biblioteket som manipulerar bilder för PHP. Välj den version
+   som är installerat på din server. Du kommer att bli varnad av ett felmeddelande om du väljer fel sort, Gå tillbaka till föregående sida i din webbläsare och välj en annan version. Om ingen
+   version fungerar så stödjer inte din server GD.</dd>
+
+  <dt>Bredd och höjd</dt>
+
+  <dd>Max dimensioner för miniatyrbilder. Original proportionerna
+   bevaras. Standardvärdena kan ändras med hjälp av konfigurationsinställningar <code>tn_width</code> och
+<code>tn_height</code> (se <span
+class="filename">include/config_default.inc.php</span> fil).</dd>
+
+  <dt>Antal miniatyrer att skapa</dt>
+
+  <dd>Försök inte att krympa för många bilder på en gång. Miniatyrisering processen använder mycket CPU. Om ditt Piwigo galleri ligger på ett webhotell så kan för hög CPU-belastning leda till indragning av din webbplats.</dd>
+
+  <dt>Filformat</dt>
+
+  <dd>Miniatyrer skapas i JPEG-format. De
+   kan enbart skapas från PNG och JPEG-bilder.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/sv_SE/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/sv_SE/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/help/user_list.html	(revision 14585)
@@ -0,0 +1,33 @@
+<h2>Lista på användare</h2>
+
+<p>Detta är platsen för hantering av registrerade användare egenskaper, utom behörigheter som hanteras från and menyer.</p>
+
+<h3>Lägg till en användare</h3>
+
+<p>Administratören kan lägga till användare manuellt..</p>
+
+<h3>Lista på användare</h3>
+
+<p>listan kan filtreras på användarnamn (använd * som jokertecken), en grupp eller
+status. Den kan sorteras genom registrering datum eller användarnamn, i stigande
+eller fallande ordning.</p>
+
+<p>I denna meny kan du hantera flera användare samtidigt, med hjälp av olika åtgärder:</p>
+
+<ul>
+
+  <li>ta bort användare (kräver bekräftelse)</li>
+  <li>ändra status</li>
+  <li>koppla eller separera från grupper </li>
+  <li>ändra visningsegenskaper</li>
+  <li>ändra ytterligare egenskape</li>
+
+</ul>
+
+<p>Som standard är målet användaren  eller alla användare som visas i den filtrerade listan.</p>
+
+<h3>Rådgivare </h3>
+<p>Definition av en rådgivare användare: som har läst/simulering på alla menyer som tillåts av sina egna behörigheter.</p>
+
+<p>rådgivare läge är inställt med variabeln $conf['allow_adviser'].</p>
+<p>Om denna variabel är satt till "sant", kan alla användare vara rådgivare</p></h2>
Index: tags/2.4.0RC3/language/sv_SE/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/sv_SE/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/install.lang.php	(revision 14585)
@@ -0,0 +1,77 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = 'Installation';
+$lang['Basic configuration'] = 'Grund Inställningar';
+$lang['Default gallery language'] = 'Standard språk för galleriet';
+$lang['Database configuration'] = 'Databas konfiguration';
+$lang['Admin configuration'] = 'Admin konfiguration';
+$lang['Start Install'] = 'Påbörja installation';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-mail adressen måste se ut som följande: xxx@yyy.eee (exempel : jack@altern.org)';
+$lang['Webmaster login'] = 'Webbansvarig login';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Det kommer att visas för besökare. Det är nödvändigt för administrering av hemsidan.';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Ansluten till server, men kunde inte ansluta till databasen.';
+$lang['Can\'t connect to server'] = 'Kan inte ansluta till servern';
+$lang['Host'] = 'Värd';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Användare';
+$lang['user login given by your host provider'] = 'användares inloggning given av ditt webbhotell';
+$lang['Password'] = 'Lösenord';
+$lang['user password given by your host provider'] = 'användares lösenord given av ditt webbhotell';
+$lang['Database name'] = 'Databas namn';
+$lang['also given by your host provider'] = 'också tilldelad av din webbhotell';
+$lang['Database table prefix'] = 'Prefix för tabeller i Databasen';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'tabellernas namn i databasen kommer att bli prefixerad med det (detta gör att du kan hantera dina tabeller bättre)';
+$lang['enter a login for webmaster'] = 'ange inloggning för webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'login för webmaster får inte innehålla symbolerna \' eller "';
+$lang['please enter your password again'] = 'ange ditt lösenord igen';
+$lang['Webmaster password'] = 'Webmaster lösenord';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Håll det hemligt, lösenordet ger dig tillgång till administrationspanelen';
+$lang['Password [confirm]'] = 'Lösenord [bekräfta]';
+$lang['verification'] = 'verifiering';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Behöver du hjälp? Ställ din fråga på <a href="%s">Piwigo message board</a>.';
+$lang['Webmaster mail address'] = 'Webmaster e-mail adress';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Besökare kommer att kunna kontakta sidans administratör med denna e-mail adress';
+$lang['PHP 5 is required'] = 'PHP 5 krävs';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Ditt webbhotell använder just nu PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo kan kanske komma att ändra dina inställningar i PHP 5 genom att skapa eller ändra en .htaccess fil.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Notera att du kan ändra dina inställningar förutsatt att du startar om Piwigo efteråt.';
+$lang['Try to configure PHP 5'] = 'Försök att konfigurera PHP 5';
+$lang['Sorry!'] = 'Ursäkta!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo kunde inte konfigurera PHP 5.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Vi rekomenderar att du kontaktar leverantören för ditt webbhotell för att se hur du kan ändra till PHP 5.';
+$lang['Hope to see you back soon.'] = 'Välkommen tillbaka snart igen.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Gratulerar, Piwigo installationen är klar';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'En alternativ lösning är att kopiera texten ovan och klistra in i filen "local/config/database.inc.php" (Varning : database.inc.php får enbart innehålla texten från textarean, inga radbrytare eller mellanrum)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Kunde inte skapa filen local/config/database.inc.php .';
+$lang['Download the config file'] = 'Ladda ner konfigurations filen';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Du kan ladda ner konfigurationsfilen och ladda upp den till local/config .';
+$lang['Just another Piwigo gallery'] = 'Ännu ett Piwigo galleri';
+$lang['Welcome to my photo gallery'] = 'Välkommen till mitt fotogalleri';
+$lang['Welcome to your new installation of Piwigo!'] = 'Välkomment till din nya installation av Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Tveka inte att kontakta våra forum för hjälp: %s';
+
+
+?>
Index: tags/2.4.0RC3/language/sv_SE/iso.txt
===================================================================
--- tags/2.4.0RC3/language/sv_SE/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Svenska [SE]
Index: tags/2.4.0RC3/language/sv_SE/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/sv_SE/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/sv_SE/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = 'Uppgradera';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Denna sida föreslår att du ska uppgradera databasen från din gamla versionen till den nya versionen. Uppgraderingen assistenten tycker att du för närvarande kör en <strong>versionen %s </strong> (eller motsvarande).';
+$lang['Upgrade from version %s to %s'] = 'Uppgradera från version %s till %s';
+$lang['Statistics'] = 'Statistik';
+$lang['total upgrade time'] = 'total uppgraderings tid';
+$lang['total SQL time'] = 'Total SQL tid';
+$lang['SQL queries'] = 'SQL-frågor';
+$lang['Upgrade informations'] = 'Uppgraderings information';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Gör en underhållskontroll i mynyn [Administration> Verktyg> Underhåll] om du stöter på några problem. .';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Som en försiktighetsåtgärd, har följande insticksmoduler avaktiverats, Du måste kontrollera alla plugins uppgraderingar före återaktivering av dem:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Endast en administratör kan köra uppgraderingen: Logga in nedan.';
+$lang['You do not have access rights to run upgrade'] = 'Du har inte behörighet att köra uppgradering';
+$lang['All sub-albums of private albums become private'] = 'Alla underliggande album av "privata album" blir "privata';
+$lang['User permissions and group permissions have been erased'] = 'Användare och grupper behörigheter har raderats';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'miniatyrbilder Endast prefix och webmaster postadress har sparats från tidigare konfiguration';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'I <i>%s</i>, innan <b>?></b>, infoga:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Som en försiktighetsåtgärd, har följande teman har avaktiverats. Du måste kolla tema uppgraderingar innan du aktivera dem:';
+
+?>
Index: tags/2.4.0RC3/language/th_TH/about.html
===================================================================
--- tags/2.4.0RC3/language/th_TH/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/about.html	(revision 14585)
@@ -0,0 +1,13 @@
+<p>นี่คือระบบแกลลอรี่ของ Piwigo.</p>
+
+<p>Piwigo เป็นซอฟแวร์แกลอรี่รูปภาพสำหรับเว็บที่สร้างขึ้นโดยกลุ่มผู้ใช้และทีมนักพัฒนา. ซึ่งมาพร้อมกับส่วนขยายที่ปรับแต่งได้ง่าย เพราะ Piwigo คือซอร์ฟแวร์เปิด (Opensourse)</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">เยี่ยมชมเว็บไซต์ Piwigo</a></p>
+
+<p>แปลเป็นภาษาไทยและเรียบเรียงโดย (ตามลำดับตัวอักษร):
+
+<ul>
+<li><a href="http://piwigo.org/forum/profile.php?id=15276">Mr.Pradit Saenkaew</a></li>
+<li>Songchai</li>
+</ul>
+            .... ขอขอบคุณทีมแปลภาษา </p>
Index: tags/2.4.0RC3/language/th_TH/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/th_TH/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/admin.lang.php	(revision 14585)
@@ -0,0 +1,817 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+
+$lang[' and %d virtual'] = " และ %d";
+$lang[' and %d virtual'] = " และ %d";
+$lang['%d album including'] = "%d อัลบั้มที่กำลังรวม";
+$lang['%d album moved'] = "%d อัลบั้มที่ย้าย";
+$lang['%d albums including'] = "%d อัลบั้มที่กำลังรวม";
+$lang['%d albums moved'] = "%d อัลบั้มที่ย้าย";
+$lang['%d anomalies have been detected corrected.'] = "%d ความผิดปกติที่ได้ตรวจพบและแก้ไขแล้ว.";
+$lang['%d anomalies have been detected.'] = "%d ความผิดปกติที่ตรวจพบ.";
+$lang['%d anomalies have been ignored.'] = "%d ความผิดปกติที่ได้รับการละเว้น.";
+$lang['%d anomalies have not been corrected.'] = "%d ความผิดปกติที่ยังไม่ได้รับการแก้ไข.";
+$lang['%d anomaly has been corrected.'] = "%d ความผิดปกติที่ได้รับการแก้ไขแล้ว.";
+$lang['%d anomaly has been detected.'] = "%d ความผิดปกติที่ได้รับการตรวจแล้ว.";
+$lang['%d anomaly has been ignored.'] = "%d ความผิดปกติที่ถูกปฏิเสธ.";
+$lang['%d anomaly has not been corrected.'] = "%d ความผิดปกติไม่ได้รับการแก้ไข.";
+$lang['%d association'] = "%d กลุ่ม";
+$lang['%d associations'] = "%d กลุ่ม";
+$lang['%d group'] = "%d กลุ่ม";
+$lang['%d groups'] = "%d กลุ่ม";
+$lang['%d guest'] = "%d ผู้เยี่ยมชม";
+$lang['%d guests'] = "%d ผู้เยี่ยมชม";
+$lang['%d line filtered'] = "%d บรรทัดที่กรองแล้ว";
+$lang['%d lines filtered'] = "%d บรรทัดที่กรองแล้ว";
+$lang['%d mail was not sent.'] = "%d จดหมายที่ยังไม่ได้ส่ง.";
+$lang['%d mail was sent.'] = "%d จดหมายได้ส่งไปแล้ว.";
+$lang['%d mails were not sent.'] = "%d อีเมลที่ยังไม่ได้ส่ง.";
+$lang['%d mails were sent.'] = "%d อีเมลที่ได้ส่งแล้ว.";
+$lang['%d member'] = "%d สมาชิก";
+$lang['%d members'] = "%d สมาชิก";
+$lang['%d of %d photos selected'] = 'ได้เลือก %d รูปภาพ จากรูปภาพทั้งหมด %d รูปภาพ';
+$lang['%d parameter was updated.'] = "%d ตัวแปรที่ได้อัพเดต.";
+$lang['%d parameters were updated.'] = "%d ตัวแปรที่ได้อัพเดต.";
+$lang['%d photo was deleted'] = "%d รูป ได้ถูกลบแล้ว";
+$lang['%d photos uploaded'] = '%d รูป ได้ถูกอัพโหลดแล้ว';
+$lang['%d photos were deleted'] = "%d รูป ได้ถูกลบแล้ว";
+$lang['%d physical'] = " %d กายภาพ";
+$lang['%d physical'] = " %d กายภาพ";
+$lang['%d tag'] = "%d แท็ก";
+$lang['%d tags'] = "%d แท็ก";
+$lang['%d user comment rejected'] = "%d ความคิดเห็นของผู้ใช้ที่ถูกปฏิเสธ";
+$lang['%d user comment validated'] = "%d ความคิดเห็นของผู้ใช้ที่ได้รับการตรวจสอบ";
+$lang['%d user comments rejected'] = "%d ความคิดเห็นของผู้ใช้ที่ถูกปฏิเสธ";
+$lang['%d user comments validated'] = "%d ความคิดเห็นของผู้ใช้ที่ได้รับการตรวจสอบ";
+$lang['%d user deleted'] = "%d ผู้ใช้งานที่ถูกลบ";
+$lang['%d user was not updated.'] = "%d ผู้ใช้งานที่ไม่ได้อัพเดตมูล.";
+$lang['%d user was updated.'] = "%d ผู้ใช้งานที่ได้อัพเดตข้อมูล";
+$lang['%d user'] = "%d ผู้ใช้งาน";
+$lang['%d users deleted'] = "%d ผู้ใช้งานที่ถูกลบ";
+$lang['%d users were not updated.'] = "%d ผู้ใช้งานที่ไม่ได้อัพเดต.";
+$lang['%d users were updated.'] = "%d ผู้ใช้งานที่ถูกลบ.";
+$lang['%d users'] = "%d ผู้ใช้งาน";
+$lang['%d waiting for validation'] = "%d กำลังรอการตวจสอบ";
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = "%s จะต้องเข้าไปตั้งค่าไฟล์ โฟลเดอร์ Piwigoของคุณ/config/config.inc.php ให้ถูกต้อง";
+$lang['%s value is not correct file because exif are not supported'] = "%s ค่าไม่ถูกต้องเพราะระบบ Exif จะไม่สนับสนุน";
+$lang['+ Add an upload box'] = '+ เพิ่มกล่องอัพโหลด';
+$lang[', click on'] = ", คลิกที่";
+$lang['A local listing.xml file has been found for'] = "ไฟล์ listing.xml ได้ถูกตรวจพบ";
+$lang['A new version of Piwigo is available.'] = "ตรวจพบเวอร์ชั่นใหม่ของ Piwigo.";
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = "ประเภทของรูปภาพที่สามารถแสดงรูปขนาดย่อ. รูปภาพจะต้องอยู่ในไดเรกทอรีย่อย \"thumbnail\" ของไดเรกทอรีอัลบั้มดังกล่าว. ชื่อไฟล์สำหรับรูปภาพขนาดย่อต้องเริ่มต้นด้วยการกำหนดค่าคำนำหน้าชื่อ และส่วนต่อขยายต้องอยู่ในรายการต่อไปนี้ :";
+$lang['Access type'] = "ประเภทการเข้าถึง";
+$lang['ACCESS_0'] = "ไม่จำกัดการเข้าถึง";
+$lang['ACCESS_1'] = "สามารถเข้าถึงได้ทั้งหมด";
+$lang['ACCESS_2'] = "การเข้าถึงเฉพาะผู้ใช้ที่ลงทะเบียน";
+$lang['ACCESS_3'] = "การเข้าถึงเฉพาะผู้ดูแลระบบ";
+$lang['ACCESS_4'] = "การเข้าถึงเฉพาะเว็บมาสเตอร์";
+$lang['ACCESS_5'] = "จำกัดทั้งหมด";
+$lang['Action'] = 'การกระทำ';
+$lang['Actions'] = "การกระทำ";
+$lang['Activate icon "%s"'] = 'เปิดใช้งานไอคอน "%s"';
+$lang['Activate Navigation Bar'] = 'เปิดใช้งานแถบเนวิเกเตอร์';
+$lang['Activate Navigation Thumbnails'] = 'เปิดใช้งานเนวิเกเตอร์รูปภาพขนาดย่อ';
+$lang['Activate'] = "เปิดใช้งาน";
+$lang['Activate icon "new" next to albums and pictures'] = 'เปิดใช้งานปุ่ม "สร้าง" ในอัลบั้มและรูปภาพต่อไป';
+$lang['Active Languages'] = 'ภาษาที่ได้เปิดใช้งาน';
+$lang['Active Plugins'] = 'ปลั๊กอินที่ได้เปิดใช้งาน';
+$lang['Active Themes'] = 'ธีมที่ได้เปิดใช้งาน';
+$lang['Add a criteria'] = 'เพิ่มเกณฑ์';
+$lang['Add a filter'] = 'เพิ่มตัวกรอง';
+$lang['Add a tag'] = "เพิ่มแท็ก";
+$lang['Add a user'] = "เพิ่มผู้ใช้งาน";
+$lang['Add a virtual album'] = "เพิ่มอัลบั้ม";
+$lang['Add another set of photos'] = 'เพิ่มรูปภาพอื่นอีก';
+$lang['Add detailed content'] = "เพิ่มรายละเอียดเนื้อหา";
+$lang['Add group'] = "เพิ่มกลุ่ม";
+$lang['Add New Language'] = 'เพิ่มภาษาใหม่';
+$lang['add new photos to caddie'] = "เพิ่มรูปภาพไปยัง Caddie";
+$lang['Add New Theme'] = "เพิ่มธีมใหม่";
+$lang['Add Photos'] = 'เพิ่มรูปภาพ';
+$lang['Add write access to the "%s" directory'] = 'เพิ่มเขียนการกำหนดสิทธิ์การเข้าถึง "%s" ไดเรกทอรี';
+$lang['Add'] = "เพิ่ม";
+$lang['Add/delete a permalink'] = "เพิ่ม/ลบ การเชื่อมโยง";
+$lang['added'] = "ที่เพิ่มแล้ว";
+$lang['Administration Home'] = 'หน้าการจัดการระบบ';
+$lang['Advanced features'] = "คุณสมบัติขั้นสูง";
+$lang['Album "%s" has been added'] = 'อัลบั้ม "%s" ได้ถูกเพิ่มแล้ว';
+$lang['Album "%s" now contains %d photos'] = 'อัลบั้ม "%s" ตอนนี้มีรูปทั้งหมด %d รูป';
+$lang['Album photos associated to the following albums: %s'] = "อัลบั้มรูปภาพนี้ได้เกี่ยวข้องกับอัลบั้ม: %s";
+$lang['Album list management'] = "การจัดการอัลบั้ม";
+$lang['Album manual order was saved'] = "อัลบั้มที่เลือกได้บันทึกแล้ว";
+$lang['Album name'] = 'ชื่ออัลบั้ม';
+$lang['Album updated successfully'] = "อัลบั้มได้อัพเดตเรียบร้อยแล้ว";
+$lang['albums added in the database'] = "อัลบั้มที่ได้เพิ่มเข้าไปในฐานข้อมูล";
+$lang['Albums authorized thanks to group associations'] = "อัลบั้มที่ได้อนุญาตจากกลุ่มสมาคม";
+$lang['Albums automatically sorted'] = 'อัลบั้มได้ถูกเรียงแบบอัติโนมัติ';
+$lang['albums deleted in the database'] = "อัลบั้มถูกลบออกจากฐานข้อมูลแล้ว";
+$lang['All %d photos are selected'] = 'ทั้งหมด %d รูปที่ได้เลือก';
+$lang['All optimizations have been successfully completed.'] = "การปรับแต่งให้เหมาะสมทั้งหมด ได้สำเร็จเรียบร้อยแล้ว.";
+$lang['all'] = "ทั้งหมด";
+$lang['Allow rating'] = "อนุญาตให้มีการให้คะแนน";
+$lang['Allow user customization'] = 'อนุญาตให้ผู้ใช้งานปรับแต่งการตั้งค่าส่วนตัว';
+$lang['Allow user registration'] = "อนุญาตให้มีการลงทะเบียนผู้ใช้งาน";
+$lang['Allow users to delete their own comments'] = "อนุญาตให้ผู้ใช้ลบความคิดเห็นของตัวเอง";
+$lang['Allow users to edit their own comments'] = "อนุญาตให้ผู้ใช้แก้ไขข้อคิดเห็นของตัวเอง";
+$lang['an error happened'] = "เกิดความผิดพลาด";
+$lang['An error occured during extraction (%s).'] = "เกิดความผิดพลาดไฟล์ (%s) ที่กำลังแตกไฟล์.";
+$lang['An information email was sent to group "%s"'] = "อีเมลรายละเอียดข้อมูลได้ส่งไปยังกลุ่ม \"%s\"";
+$lang['and'] = "และ";
+$lang['Anomaly'] = "ความผิดปกติ";
+$lang['Anyway only webmasters can see this tab and never administrators.'] = "เว็บมาสเตอร์เท่านั้น ที่สามารถมองเห็นแท็บนี้, แต่จำกัดการเข้าถึงสำหรับผู้ดูแลระบบ.";
+$lang['Apply action'] = 'นำไปใช้';
+$lang['Apply selected corrections'] = "ใช้การแก้ไขที่เลือก";
+$lang['Apply to sub-albums'] = "นำไปใช้ยัง อัลบั้ม-ย่อย";
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = "คุณแน่ใจหรือว่าต้องการติดตั้งการอัพเกรดนี้? หากไม่ต้องการเวอร์ชั่นนี้ คุณสามารถถอนการติดตั้งนี้ได้.";
+$lang['Are you sure you want to delete this plugin?'] = "คุณแน่ใจหรือว่าต้องการลบปลั๊กอินนี้?";
+$lang['Are you sure you want to install this plugin?'] = "คุณแน่ใจหรือว่าต้องการติดตั้งปลั๊กอินนี้?";
+$lang['Associate to album'] = "เชื่อมโยงไปยังอัลบั้ม";
+$lang['associate to group'] = "เชื่อมโยงไปยังกลุ่ม";
+$lang['Associated'] = "เชื่อมโยง";
+$lang['Authorize users to add comments on selected albums'] = "อนุมัติให้ผู้ใช้เพิ่มความคิดเห็นเกี่ยวกับอัลบั้มที่เลือก";
+$lang['Authorized'] = "อนุญาต";
+$lang['Automatic correction'] = "การแก้ไขอัตโนมัติ";
+$lang['automatic order'] = 'คำสั่งอัตโนมัติ';
+$lang['Available only with HTML format'] = "ใช้ได้เฉพาะกับรูปแบบ HTML";
+$lang['Average rate'] = "คะแนนเฉลี่ย";
+$lang['average time'] = "เวลาเฉลี่ย";
+$lang['Batch Manager'] = 'การจัดการระบบ';
+$lang['between'] = "ระหว่าง";
+$lang['Bound Theme'] = 'ธีมที่เลือกไว้';
+$lang['By %s'] = 'โดย %s';
+$lang['By rank'] = 'โดยการจัดอันดับ';
+$lang['Caddie management'] = "การจัดการ Caddie";
+$lang['Caddie'] = "Caddie";
+$lang['Cannot delete the old permalink !'] = "ความคิดเห็นเก่าไม่สามารถลบได้!";
+$lang['Can\'t connect to server.'] = "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์ได้.";
+$lang['Can\'t create temporary file.'] = "แฟ้มชั่วคราวไม่สามารถสร้างได้.";
+$lang['Can\'t download archive.'] = "แฟ้มที่ถูกบีบอัดไม่สามารถดาวน์โหลดได้.";
+$lang['Can\'t read or extract archive.'] = "แฟ้มที่ถูกบีบอัดไม่สามารถอ่านหรือแตกไฟล์ได้.";
+$lang['Change Admin Colors'] = 'สลับโหมดสี';
+$lang['Check all'] = "เลือกทั้งหมด";
+$lang['Check automatic corrections'] = "ตรวจสอบการแก้ไขอัตโนมัติ";
+$lang['Check for updates'] = "ตรวจสอบการอัพเดต";
+$lang['Check for upgrade failed for unknown reasons.'] = "ไม่สามารถตรวจสอบการอัพเดตได้ เนื่องจากอาจไม่มีการเชื่อมต่ออินเตอร์เน็ต.";
+$lang['Check for upgrade'] = "ตรวจสอบการอัพเกรด";
+$lang['Check integrity'] = "ตรวจสอบความสมบูรณ์";
+$lang['Choose an action'] = 'เลือกการการดำเนินการ';
+$lang['Choose an option'] = "เลือกตัวเลือก";
+$lang['Classic display'] = "แสดงผลแบบธรรมดา";
+$lang['clean'] = "ล้าง";
+$lang['Comments for all'] = "สำหรับทุกความคิดเห็น";
+$lang['Complementary mail content'] = "เนื้อหาเมล";
+$lang['Complementary mail content'] = "เนื้อหาเมล";
+$lang['Configuration'] = "การปรับแต่ง";
+$lang['confirm'] = "ยืนยัน";
+$lang['Continue processing treatment'] = "ดำเนินกระบวนการแบบต่อเนื่อง";
+$lang['Correction applied with error'] = "การแก้ไขได้นำไปใช้กับข้อผิดพลาด";
+$lang['Correction applied with success'] = "การแก้ไขได้สำเร็จแล้ว";
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = "การแก้ไขความผิดปกติจะใช้เวลานานและอาจไม่สำเร็จ";
+$lang['Correction'] = "การแก้ไข";
+$lang['create a new album'] = 'สร้างอัลบั้มใหม่';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = "สร้างที่อยู่ใหม่ : (โดยกำหนดที่อยู่ URL ในไฟล์ create_listing_file.php)";
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'สร้าง "%s" ไว้ที่โฟลเดอร์ Piwigo ของคุณ หรือ Root ที่เดียวกับที่ Piwigo ได้ติดตั้งอยู่';
+$lang['Create this site'] = "สร้างที่อยู่นี้";
+$lang['created'] = "สร้าง";
+$lang['Current name'] = "ชื่อปัจจุบัน";
+$lang['Database synchronization with files'] = "การซิงโคไนซ์ฐานข้อมูลกับไฟล์";
+$lang['Database'] = "ฐานข้อมูลระบบ";
+$lang['Date'] = "วันที่";
+$lang['Day'] = "วัตถุ";
+$lang['Deactivate'] = "ยกเลิกการใช้งาน";
+$lang['Deactivate all'] = "ยกเลิกการใช้งานทั้งหมด";
+$lang['Default display'] = "แสดงผลค่าเริ่มต้น";
+$lang['Default photos order'] = "จัดระเบียบรูปภาพตามค่าปกติ";
+$lang['Default user cannot be deleted'] = "ผู้ใช้งานไม่สามารถลบได้";
+$lang['Default user does not exist'] = "ผู้ใช้งานไม่มีอยู่";
+$lang['default values'] = "ค่าเริ่มต้น";
+$lang['default'] = "ภาษาเริ่มต้น";
+$lang['delete album'] = "ลบอัลบั้ม";
+$lang['Delete orphan tags'] = 'ลบแท็กที่ไม่ได้ถูกใช้';
+$lang['delete photo'] = 'ลบรูปภาพ';
+$lang['Delete Representant'] = "ลบรูปภาพขนาดย่อของอัลบั้ม";
+$lang['Delete selected photos'] = "ลบรูปภาพที่เลือก";
+$lang['Delete selected tags'] = "ลบแท็กที่เลือก";
+$lang['Delete selected users'] = "ลบผู้ใช้งานที่เลือก";
+$lang['Delete this language'] = 'ลบภาษานี้';
+$lang['delete this site and all its attached elements'] = "ลบที่อยู่นี้และข้อมูลทั้งหมดที่เกี่ยวข้อง";
+$lang['Delete this theme'] = 'ลบธีมนี้';
+$lang['delete'] = "ลบ";
+$lang['Deleted on'] = "ถูกลบเมื่อ";
+$lang['deleted'] = "ถูกลบ";
+$lang['Deletions'] = "การลบ";
+$lang['Deny selected groups'] = "ปฏิเสธกลุ่มที่เลือก";
+$lang['Deny selected users'] = " ปฏิเสธผู้ใช้งานที่เลือก";
+$lang['Description'] = "บรรยายรายละเอียด";
+$lang['Detailed informations'] = "รายละเอียดข้อมูล";
+$lang['directories + files'] = "ไดเรกทอรี่ + ไฟล์";
+$lang['Directory does not exist'] = 'ไม่มีไดเรกทอรี่อยู่';
+$lang['Directory'] = "ไดเรกทอรี่";
+$lang['Discover album:'] = "ดูอัลบั้ม:";
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = "แสดงข้อมูลทั้งหมด (ที่ได้เพิ่มทั้งในอัลบั้มและภาพถ่าย, และในอัลบั้มและรูปภาพที่ได้ถูกลบไปแล้วด้วย)";
+$lang['Display options'] = "ตัวเลือกการแสดงผล";
+$lang['Dissociate from album'] = "แยกออกจากอัลบั้ม";
+$lang['dissociate from group'] = "แยกออกจากกลุ่ม";
+$lang['Dissociated'] = "ที่ได้แยก";
+$lang['Documentation'] = "เอกสารที่เกี่ยวข้อง";
+$lang['Does not represent'] = "ไม่แสดงภาพขนาดย่อสำหรับ";
+$lang['Download,'] = 'ดาวน์โหลด';
+$lang['Downloads'] = "ดาวน์โหลด";
+$lang['Drag to re-order'] = "คลิก-และ-ลาก เพื่อกำหนด";
+$lang['Drop into album'] = 'เลือกอัลบั้มรูป';
+$lang['Edit album permissions'] = "แก้ไขการเข้าถึงอัลบั้ม";
+$lang['Edit album'] = "แก้ไขอัลบั้ม";
+$lang['Edit photo information'] = "แก้ไขเพิ่มเติมข้อมูลรูปภาพ";
+$lang['Edit ranks'] = "แก้ไขอันดับ";
+$lang['Edit selected tags'] = "แก้ไขแท็กที่เลือก";
+$lang['Edit tags'] = "ไก้ไขแท็ก";
+$lang['Element type'] = "ชนิดของวัตถุ";
+$lang['Element'] = "วัตถุ";
+$lang['photos informations synchronized with files metadata'] = "รายละเอียดภาพถ่ายตรงกับข้อมูลเมตาไฟล์";
+$lang['Email administrators when a comment is deleted'] = "รายงานผู้ดูแลระบบทางอีเมล เมื่อความคิดเห็นถูกลบ";
+$lang['Email administrators when a comment is modified'] = "รายงานผู้ดูแลระบบทางอีเมล เมื่อความคิดเห็นถูกแก้ไขเปลี่ยนแปลง";
+$lang['Email admins when a comment requires validation'] = "รายงานผู้ดูแลระบบทางอีเมลเมื่อความคิดเห็น ที่จำเป็นต้องมีการตรวจสอบก่อน";
+$lang['Email admins when a new user registers'] = "รายงานผู้ดูระบบทางอีเมล เมื่อมีผู้ใช้ใหม่ที่ลงทะเบียน";
+$lang['Email admins when a valid comment is entered'] = "รายงานผู้ดูแลระบบทางอีเมล เมื่อมีความคิดเห็นแสดงเข้ามา";
+$lang['email'] = "อีเมล";
+$lang['Environment'] = "ข้อมูลระบบ";
+$lang['Error list'] = "รายการข้อผิดพลาด";
+$lang['Error on file "%s" : %s'] = 'เกิดความผิดพลาดที่ไฟล์ "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = "เกิดความผิดพลาดเมื่อตอนกำลังส่งเมลไปยัง %s [%s].";
+$lang['Errors caption'] = "Errors legends";
+$lang['errors during synchronization'] = "เกิดความผิดพลาดในขณะที่กำลังซิงโคไนซ์";
+$lang['even already synchronized photos'] = "even already synchronized photos";
+$lang['Everybody'] = 'ทุกคน';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = "เวลาการดำเนิน, จะต้องดำเนินการอีก [เวลาโดยประมาณ: %d วินาที].";
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = "เวลาการดำเนิน, จะต้องดำเนินการอีก [เวลาโดยประมาณ: %d วินาที].";
+$lang['Exif extension not available, admin should disable exif use'] = 'ระบบ Exif ไม่สามารถใช้งานได้, ผู้ดูแลระบบควรปิดการใช้งานระบบ Exif';
+$lang['existing album'] = 'อัลบั้มที่มีอยู่';
+$lang['Extend for templates'] = "ส่วนขยายแม่แบบ";
+$lang['Failed to write file to disk'] = 'ล้มเหลวในการเขียนแฟ้มไปยังดิสก์';
+$lang['file create_listing_file.php on remote site was not found'] = "ไฟล์ create_listing_file.php ไม่พบในการเชื่อมโยงระยะำไกล หรือ การรีโมตไซต์";
+$lang['File upload stopped by extension'] = 'ประเภทไฟล์นี้ได้ถูกห้ามอัพโหลด';
+$lang['File'] = "ชื่อไฟล์";
+$lang['File/directory read error'] = "เกิดความผิดพลาดในการอ่าน ไฟล์/ไดเรกทอรี่";
+$lang['Find a new representant by random'] = "Find a new random album thumbnail";
+$lang['first photo added on %s'] = "รูปภาพแรกถูกเพิ่มเมื่อ %s";
+$lang['for the file format'] = "สำหรับรูปแบบไฟล์";
+$lang['for this file format'] = "สำหรับรูปแบบไฟล์";
+$lang['Forbid this language to users'] = 'ยกเลิกการใช้งานภาษานี้สำหรับผู้ใช้งาน';
+$lang['Forbid this theme to users'] = "ยกเลิกการใช้งานธีมนี้สำหรับผู้ใช้งาน";
+$lang['Forbidden'] = "ไม่อนุญาต";
+$lang['Form'] = "จาก";
+$lang['FTP + Synchronization'] = 'FTP + Synchronization';
+$lang['Gallery title'] = "ชื่อแกลลอรี่";
+$lang['GD library is missing'] = "ไม่พบ GD ไลบรารี่";
+$lang['GD version'] = "GD เวอร์ชั่น";
+$lang['General statistics'] = "สถิติทั่วไป";
+$lang['generate file listing.xml on remote site'] = "generate file listing.xml on the remote site";
+$lang['generate listing'] = "กำลังสร้างรายการ";
+$lang['Get Support on Piwigo Forum'] = 'ขอรับการสนับสนุนของ Piwigo จากฟอรั่ม Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation';
+$lang['global mode'] = "โหมดทั่วไป";
+$lang['Go to %s or %s for more informations'] = "ไปที่ %s หรือ %s เพื่อดูข้อมูลเพิ่มเติม";
+$lang['Go to'] = "ไปที่";
+$lang['Grant selected groups'] = "อนุญาตกลุ่มที่ได้เลือกไว้";
+$lang['Grant selected users'] = "อนุญาตผู้ใช้งานที่ได้เลือกไว้";
+$lang['group "%s" added'] = "กลุ่ม \"%s\" ได้ถูกเพิ่มแล้ว";
+$lang['group "%s" deleted'] = "กลุ่ม \"%s\" ได้ถูกลบแล้ว";
+$lang['group "%s" updated'] = "กลุ่ม \"%s\" ได้ถูกอัพเดตแล้ว";
+$lang['Group management'] = "การจัดการกลุ่ม";
+$lang['Group name'] = "ชื่อกลุ่ม";
+$lang['Group'] = "กลุ่ม";
+$lang['Groups'] = "กลุ่ม";
+$lang['Guest cannot be deleted'] = "ผู้เยี่ยมชมไม่สามารถลบได้";
+$lang['Guest Settings'] = 'ตั้งค่าผู้เยี่ยมชม';
+$lang['guest'] = "ผู้เยี่ยมชม";
+$lang['Guests'] = "ผู้เยี่ยมชม";
+$lang['height must be a number superior to'] = "ความสูงจะต้องเป็นค่าตัวเลขที่มากกว่า";
+$lang['Hello'] = "สวัสดี";
+$lang['Hello,'] = "สวัสดี,";
+$lang['Help Me'] = 'ช่วยเหลือ';
+$lang['Hide'] = "ซ่อน";
+$lang['High definition enabled'] = "การแสดงผลความละเอียดสูงได้ถูกเปิดใช้งานแล้ว";
+$lang['High definition'] = "ความละเอียดสูง";
+$lang['high'] = "ความสูง";
+$lang['History'] = "ประวัติ";
+$lang['Hit'] = "เข้าชม";
+$lang['Hour'] = "ชั่วโมง";
+$lang['Hoverbox display'] = "แสดงแบบกล่อง";
+$lang['If you encounter problems or have any question, please send a message to'] = "ถ้าคุณเจอปัญหา หรือมีคำถามใดๆ, โปรดส่งข้อความไปยัง";
+$lang['Ignore selected anomalies'] = "ปฏิเสธความผิดปกติที่ได้เลือกไว้";
+$lang['Image id'] = "ไอดี รูปภาพ";
+$lang['Image Quality'] = 'คุณภาพของรูป';
+$lang['Images manual order was saved'] = "ลำดับรูปภาพแบบกำหนดเองได้ถูกบันทึกแล้ว";
+$lang['Impossible automatic correction'] = "การตรวจแก้ไขโดยอัตโนมัตไม่สามารถทำได้";
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'ธีมนี้ไม่สามารถเปิดใช้งานได้, เนื่องจากธีมหลักขาดหายไป: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'การยกเลิกการใช้งานภาษานี้ไม่สามารถทำได้, เนื่องจากมีการใช้งานภาษานี้อยู่ โปรดกำหนดภาษาอื่นเพื่อใช้งานก่อน แล้วค่อยยกเลิกภาษาดังกล่าว.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'การยกเลิกการใช้งานภาษานี้ไม่สามารถทำได้, คุณต้องมีภาษาอย่างน้อยหนึ่งภาษาที่เปิดใช้งาน.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'การยกเลิกการใช้งานธีมนี้ไม่สามารถทำได้, คุณต้องมีธีมอย่างน้อยหนึ่งธีมที่เปิดใช้งาน.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'ธีมนี้ไม่สามารถลบได้, เพราะว่ามีธีมอื่นซึ่งได้ใช้งานอยู่กับมัน: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'ไฟล์การตั้งค่า php.ini ของคุณ, สามารถอัพโหลดไฟล์ได้ขนาดสูงสุด (%sB) ซึ่งมันขนาดใหญ่กว่าขนาดไฟล์สูงสุดที่อนุญาตให้โพส (%sB), คุณควจเปลี่ยนการตั้งค่านี้';
+$lang['Inactive Languages'] = 'ภาษาที่ไม่ได้เปิดใช้งาน';
+$lang['Inactive Plugins'] = 'ปลั๊กอินที่ไม่ได้เปิดใช้งาน';
+$lang['Inactive Themes'] = 'ธีมที่ไม่ได้เปิดใช้งาน';
+$lang['include child albums'] = 'รวมอัลบั้ม';
+$lang['Include display of recent photos grouped by dates'] = "รวมถึงการแสดงของภาพถ่ายเมื่อไม่นานตามวันที่";
+$lang['Information data registered in database'] = "ข้อมูลได้ถูกบันทึกลงฐานข้อมูลแล้ว";
+$lang['Informations'] = "ข้อมูลพื้นฐาน";
+$lang['Install on your computer,'] = 'ติดตั้งลงบนเครื่องคอมพิวเตอร์ของคุณ';
+$lang['Install'] = "ติดตั้ง";
+$lang['Installed Languages'] = 'ภาษาที่ถูกติดตั้ง';
+$lang['Installed Themes'] = "ธีมที่ถูกติดตั้ง";
+$lang['Instructions to use Piwigo'] = "คำแนะนำในการใช้งาน Piwigo แกลลอรี่";
+$lang['Invert'] = 'สลับ';
+$lang['IP'] = "ไอพี";
+$lang['jump to album'] = "ไปยังอัลบั้ม";
+$lang['jump to photo'] = "ไปยังรูปภาพ";
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = "ติดต่อกับ Piwigo โปรเจค, บอกรับข่าวสารจาก Piwigo. คุณจะได้รับอีเมล เมื่อมี Piwigo เวอร์ชั่นใหม่ถูกปล่อยออกมา (บางที มีการปรับปรุงแก้ไขด้านความปลอดภัย และจุดบกพล่องต่างๆ ซึ่งมันสำคัญมากเพื่ออัพเกรดระบบ) รวมทั้งเมื่อ Piwigo โปรเจคได้ทำ เวอร์ชั่นหลัก หรือเมเจอร์เวอร์ชั่น. ซึ่งมีเมลถึงคุณต่อปีไม่กี่ฉบับเท่านั้น.";
+$lang['Language has been successfully installed'] = 'ภาษาได้ถูกติดตั้งสมบูรณ์';
+$lang['Languages'] = 'ภาษา';
+$lang['Last hit'] = "เข้าชมครั้งล่าสุด";
+$lang['Last revisions'] = "การแก้ไขครั้งล่าสุด";
+$lang['Last send'] = "ส่งครั้งล่าสุด";
+$lang['leave'] = "ปล่อยว่าง";
+$lang['Level 0'] = "---";
+$lang['Level 1'] = "ผู้ติดต่อ";
+$lang['Level 2'] = "เพื่อน";
+$lang['Level 4'] = "ครอบครัว";
+$lang['Level 8'] = "ผู้ดูแลระบบ";
+$lang['Link all album photos to a new album'] = "เชื่อมโยงอัลบั้มรูปถ่ายทั้งหมดไปยังอัลบั้มใหม่";
+$lang['Link all album photos to some existing albums'] = "เชื่อมโยงอัลบั้มรูปถ่ายทั้งหมดไปยังอัลบั้มใหม่";
+$lang['Linked albums'] = "อยู่ในอัลบั้ม";
+$lang['listing.xml file was not found on the remote site. This file is generated by choosing the "generate listing" command in the Site manager'] = "ไม่พบไฟล์ listing.xml ในการรีโมตไซต์. ไฟล์นี้จะต้องถูกสร้างไ้ว้ใน \"รายการการสร้าง\" ซึ่งอยู่ในส่วนของการ จัดการไซต์";
+$lang['listing.xml file was not found'] = "ไม่พบไฟล์ listing.xml";
+$lang['Local'] = "ภายใน";
+$lang['Lock albums'] = "ล็อคอัลบั้ม";
+$lang['Lock gallery'] = "ล็อคแกลลอรี่";
+$lang['Lock'] = "ล็อค";
+$lang['Locked'] = "ล็อค";
+$lang['Mail address is obligatory for all users'] = "ที่อยู่เมลสำหรับผู้ใช้งานทั้งหมด";
+$lang['Mail content'] = "เนื้อหาเมล";
+$lang['Mail sent to %s [%s].'] = "เมลได้ถูกส่งไปยัง %s [%s].";
+$lang['Main "guest" user does not exist'] = "หลัก \"ผู้เยี่ยมชม\" ผู้ใช้งานไม่มีอยู่";
+$lang['Main "guest" user status is incorrect'] = "หลัก \"ผู้เยี่ยมชม\" ผู้ใช้งานสถานะไม่ถูกต้อง";
+$lang['Main "webmaster" user does not exist'] = "หลัก \"เว็บมาสเตอร์\" ผู้ใช้งานไม่มีอยู่";
+$lang['Main "webmaster" user status is incorrect'] = "หลัก \"เว็บมาสเตอร์\" ผู้ใช้งานสถานะไม่ถูกต้อง";
+$lang['Main Page'] = 'หน้าหลัก';
+$lang['Main'] = "หลัก";
+$lang['Maintenance'] = "การปรับปรุง";
+$lang['Make this language available to users'] = 'กำหนดภาษานี้สำหรับผู้ใช้งาน';
+$lang['Make this theme available to users'] = 'กำหนดธีมนี้สำหรับผู้ใช้งาน';
+$lang['manage album photos'] = "จัดการอัลบั้มรูป";
+$lang['Manage authorizations for selected albums'] = "จัดการการอนุญาตสำหรับอัลบั้มที่เลือก";
+$lang['Manage permissions for group "%s"'] = "จัดการการอนุญาตสำหรับกลุ่ม \"%s\"";
+$lang['Manage permissions for user "%s"'] = "จัดการการอนุญาตสำหรับผู้ใช้งาน \"%s\"";
+$lang['Manage photo ranks'] = "จัดการอันดับภาพถ่าย";
+$lang['manage sub-albums'] = "จัดการอัลบั้ม-ย่อย";
+$lang['Manage tags'] = "จัดการแท็ก";
+$lang['Manage this set of %d photos'] = 'จัดการตั้งค่าเพิ่มเติมชุดของ %d รูปถ่ายนี้';
+$lang['Manage'] = "จัดการ";
+$lang['Manual order'] = 'คำสั่งกำหนดเอง';
+$lang['manual order'] = 'คำสั่งกำหนดเอง';
+$lang['Maximum Height'] = 'ความสูงสูงสุด';
+$lang['Maximum Width'] = 'ความกว้างสูงสุด';
+$lang['Members'] = "สมาชิก";
+$lang['Menu Management'] = 'จัดการเมนู';
+$lang['Metadata synchronization results'] = "ผลลัพธ์การซิงโคไนซ์เมตาดาต้า";
+$lang['Metadata synchronized from file'] = "ได้ถูกซิงโคไนซ์เมตาดาต้าจากไฟล์";
+$lang['Minimum privacy level'] = "ระดับของความเป็นส่วนตัวน้อยที่สุด";
+$lang['Miscellaneous'] = 'เบ็ดเตล็จ';
+$lang['Missing a temporary folder'] = 'ไม่พบโฟลเดอร์ชั่วคราว';
+$lang['Missing Plugins'] = 'ไม่พบปลั๊กอิน';
+$lang['missing thumbnail'] = "ไม่พบรูปขนาดย่อ";
+$lang['Modify information'] = "แก้ไขข้อมูล";
+$lang['Month'] = "เดือน";
+$lang['Move albums'] = "ย้ายอัลบั้ม";
+$lang['Move'] = "ย้าย";
+$lang['Name'] = "ชื่อ";
+$lang['new'] = "ใหม่";
+$lang['New name'] = "ชื่อใหม่";
+$lang['New parent album'] = "อัลบั้มหลักใหม่";
+$lang['New photos added'] = "รูปภาพใหม่ที่ได้ถูกเพิ่ม";
+$lang['New photos were added'] = "รูปภาพใหม่ที่ได้ถูกเพิ่ม";
+$lang['New tag'] = "แท็กใหม่";
+$lang['No display'] = "ไม่มีการแสดงผล";
+$lang['No file was uploaded'] = 'ไม่มีไฟล์ที่ถูกอัพโหลด';
+$lang['No mail to send.'] = "ไม่มีเมลที่ถูกส่ง.";
+$lang['No photo can be deleted'] = "ไม่มีรูปที่สามารถลบได้";
+$lang['No photo in the current set.'] = 'ไม่มีรูปภาพในชุดปัจจุบันนี้.';
+$lang['No photo in this album'] = "ไม่มีรูปภาพในอัลบั้มนี้";
+$lang['No photo selected, %d photos in current set'] = 'ไม่มีรูปที่ได้เลือกไว้,มีรูปทั้งหมด %d รูปในเซตนี้';
+$lang['No photo selected, no action possible.'] = 'ไม่มีรูปภาพที่ได้เลือกไว้.';
+$lang['No results'] = "ไม่มี ผลลัพธ์";
+$lang['No user to send notifications by mail.'] = "ไม่มีผู้ใช้งานที่ได้ติดต่อทางเมล.";
+$lang['no write access'] = "ไม่มีการเขียนการเข้าถึงข้อมูล";
+$lang['none'] = "ไม่มี";
+$lang['None'] = 'ไม่มี';
+$lang['nothing'] = "ไม่มีสิ่งใด";
+$lang['Notification'] = "การแจ้งเตือน";
+$lang['Number of comments per page'] = "จำนวนของความเห็นที่แสดงต่อหนึ่งหน้า";
+$lang['Number of downloads'] = "จำนวนครั้งที่ดาวน์โหลด";
+$lang['number of miniaturized photos'] = "จำนวนของรูปภาพขนาดย่อที่ได้ถูกสร้าง";
+$lang['Number of rates'] = "จำนวนของคะแนนนิยม";
+$lang['Number of thumbnails to create'] = "จำนวนของรูปภาพขนาดย่อที่จะสร้าง";
+$lang['on the %d selected photos'] = 'ของ %d รูปภาพที่ได้เลือกไว้';
+$lang['on'] = "ใน";
+$lang['only directories'] = "ไดเรกทอรี่อย่างเดียว";
+$lang['only perform a simulation (no change in database will be made)'] = "แค่การจำลองเสมือน (ไม่มีอะไรที่จะถูกเปลี่ยนในฐานข้อมูล)";
+$lang['Only private albums are listed'] = "อัลบั้มส่วนตัวเท่านั้น";
+$lang['Operating system'] = "ระบบปฏิบัติการ";
+$lang['Operation in progress'] = 'การดำเนินการ.';
+$lang['Optimizations have been completed with some errors.'] = "การทำให้เหมาะสมได้เสร็จแล้ว พร้อมกับมีข้อผิดพลาดบางอย่าง.";
+$lang['Optional URL keyword'] = "URL คีย์เวิร์ด";
+$lang['Options'] = "ตัวเลือก";
+$lang['Options'] = "ตัวเลือก";
+$lang['Order of menubar items has been updated successfully.'] = 'เมนูบาร์ได้ถูกอัพเดตเรียบร้อยแล้ว.';
+$lang['Original templates'] = "แม่แบบดั้งเดิม";
+$lang['Orphan tags deleted'] = 'แท็กที่ไม่ได้ใช้งานที่ได้ถูกลบ';
+$lang['Other plugins'] = "ปลั๊กอินอื่นที่ใช้งานได้";
+$lang['Other private albums'] = "อัลบั้มส่วนตัวอื่นๆ";
+$lang['other'] = "อื่นๆ";
+$lang['Overall'] = "Overview";
+$lang['overrides existing values with empty ones'] = "ยกเลิกค่าที่มีอยู่โดยกำหนดให้มันว่างเปล่า";
+$lang['Page banner'] = "สโลแกน";
+$lang['Page end'] = 'หน้าสุดท้าย';
+$lang['Pages seen'] = "จำนวนหน้าที่เปิด";
+$lang['Parameter'] = "ตั้งค่า";
+$lang['Parameters'] = "ตัวแปร";
+$lang['Parent album'] = "อัลบั้มหลัก";
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = "คุณยังไม่ได้ยืนยันรหัสผ่าน. กรุณายืนยันรหัสผ่านเดิมอีกครั้ง.";
+$lang['Password is missing. Please enter the password.'] = "คุณยังไม่ได้กำหนดรหัสผ่าน. กรุณากรอรหัสผ่าน.";
+$lang['Path'] = "ที่ตั้ง";
+$lang['Pending Comments'] = 'ความเห็นกำลังรออนุมัติ';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = "การเชื่อมโยง %s ได้มีอยู่ก่อนแล้ว และได้ถูกไใช้โดยอัลบั้ม %s. ลบมันออกจากประวัติการเชื่อมโยงในอัลบั้มก่อน";
+$lang['Permalink %s is already used by album %s'] = "การเชื่อมโยง %s มีอยู่แล้วและถูกใช้โดยอัลบั้ม %s";
+$lang['Permalink history'] = "ประวัติการเชื่อมโยง";
+$lang['Permalink'] = "การเชื่อมโยง";
+$lang['Permalinks'] = "การเชื่อมโยง";
+$lang['Permission denied'] = "ไม่อนุญาต";
+$lang['Permission granted thanks to a group'] = "การอนุญาตการเข้าถึงไปยังกลุ่ม";
+$lang['Permission granted'] = "ได้ยินยอมการอนุญาตแล้ว";
+$lang['Permissions'] = "การอนุญาต";
+$lang['Photo Page'] = 'หน้าภาพถ่าย';
+$lang['Photo Properties'] = 'คุณสมบัติรูปภาพ';
+$lang['photos added in the database'] = "รูปภาพได้ถูกเพิ่มในฐานข้อมูลแล้ว";
+$lang['photos candidates for metadata synchronization'] = "รูปภาพที่ถูกเลือกเข้ามา เพื่อการซิงโคไนซ์เมตาดาต้า";
+$lang['photos deleted from the database'] = "รูปภาพได้ถูกลบออจากฐานข้อมูลแล้ว";
+$lang['photos per page'] = "จำนวนรูปภาพต่อหน้า";
+$lang['photos updated in the database'] = "รูปภาพได้ถูกอัพเดตในฐานข้อมูลแล้ว";
+$lang['Photos'] = "รูป";
+$lang['Photo informations updated'] = "ข้อมูลรูปภาพได้ถูกบันทึกแล้ว";
+$lang['Photo unreachable or no support'] = "รูปภาพไม่สามารถเข้าถึงได้ หรือรูปแบบ ไม่สนับสนุน";
+$lang['Piwigo Administration'] = "การจัดการระบบ Piwigo";
+$lang['Piwigo Announcements Newsletter'] = "ข่าวสารและประกาศของ Piwigo";
+$lang['Piwigo configuration'] = "การตั้งค่าปรับแต่ง Piwigo";
+$lang['Piwigo Uploader'] = 'ตัวช่วยอัพโหลด Piwigo';
+$lang['Piwigo version differs on the remote site'] = "เวอร์ชั่นของ Piwigo ต่างกันกับเวอร์ชั่นที่อยู่ใน การเชื่อมโยงระยะไกล หรือการรีโมตไซต์";
+$lang['Piwigo version'] = "Piwigo เวอร์ชั่น";
+$lang['pixels'] = 'พิกเซล';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = "กรุณตรวจสอบโฟลเดอร์ \"plugins\" การกำหนดสิทธิ์การเข้าถึงทั้งโฟลเดอร์หลัก และโฟลเดอร์ย่อย (CHMOD).";
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader คือโปรแกรม <em>ตัวช่วยอัพโหลด Piwigo</em>. จากคอมพิวเตอร์ของคุณ, pLoader จะเตรียมรูปภาพของคุณพร้อมกับส่งไปยังแกลลอรี่ Piwigo.';
+$lang['Plugin list'] = "รายการปลั๊กอิน";
+$lang['Plugins which need upgrade'] = "ปลั๊กอินต้องการการอัพเกรด";
+$lang['Plugins'] = "ปลั๊กอิน";
+$lang['Position'] = "ตำแหน่ง";
+$lang['Preferences'] = "การปรับแต่ง";
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = "การเตรียมรายชื่อผู้ใช้งานเพื่อส่งเมลถึงผู้ใช้งานเหล่านั้น ซึ่งการส่งจะถูกจำกัดเฉพาะผู้ที่มีรายชื่อในรายการเท่า่นั้น. ซึ่งผู้ใช้งานที่ไม่มีชื่อในรายการจะไม่ถูกส่ง.";
+$lang['Privacy level set to "%s"'] = 'ระดับความเป็นส่วนตัว "%s"';
+$lang['Privacy level'] = "ระดับความเป็นส่วนตัว";
+$lang['Private'] = "ส่วนตัว";
+$lang['private'] = "ส่วนตัว";
+$lang['Properties'] = "คุณสมบัติพื้นฐาน";
+$lang['Public / Private'] = "สาธารณะ / ส่วนตัว";
+$lang['Public'] = "สาธารณะ";
+$lang['public'] = "สาธารณะ";
+$lang['Purge compiled templates'] = "ล้างการรวบรวมธีม";
+$lang['Purge history detail'] = "ล้างรายละเอียดประวัติของข้อมูล";
+$lang['Purge history summary'] = "ล้างประวัติ";
+$lang['Purge never used notification feeds'] = "ล้างการแจ้งเตือนที่ไม่ได้มีการถูกใช้";
+$lang['Purge search history'] = "ลางประวัติการค้นหา";
+$lang['Purge sessions'] = "ล้างระยะเวลาที่อยู่ในระบบ";
+$lang['Quick Local Synchronization'] = "เริ่มการซิงโคไนซ์อย่างรวดเร็ว";
+$lang['Random photo'] = "สุ่มรูปภาพ";
+$lang['randomly represented'] = "สุ่มรูปภาพปกอัลบั้ม";
+$lang['ranks'] = "อันดับ";
+$lang['Rate'] = "คะแนนนิยม";
+$lang['Rate date'] = "คะแนนตามวัน";
+$lang['Rating by guests'] = "ให้คะแนนโดยผู้เยี่ยมชม";
+$lang['Rating'] = "คะแนนนิยม";
+$lang['read local listing.xml and update'] = "อ่านไฟล์ listing.xml และอัพเดต";
+$lang['Read Piwigo Documentation'] = 'อ่านเอกสารที่เกี่ยวข้องกับ Piwigo';
+$lang['reduce to single existing albums'] = "รวมเข้าเป็นอัลบั้มเดียวกันกับอัลบั้มที่มีอยู่";
+$lang['Refresh photo set'] = 'รีเฟรชชุดรูปภาพ';
+$lang['Refresh'] = "รีเฟรช";
+$lang['registration date'] = "วันที่ลงทะเบียน";
+$lang['Reinitialize check integrity'] = "ตรวสอบความสมบูรณ์ของการเตรียมการเริ่มต้นใช้งานระบบใหม่";
+$lang['Reject'] = "ถอด";
+$lang['Released on'] = "ถูกปล่อย เมื่อ";
+$lang['Remote'] = "รีโมต";
+$lang['Remove all filters'] = 'ลบตัวกรองทั้งหมด';
+$lang['remove author'] = 'ลบเจ้าของรูปภาพ';
+$lang['remove creation date'] = 'ลบวันที่สร้าง';
+$lang['Remove from caddie'] = 'ลบจาก caddie';
+$lang['remove remote listing.xml file'] = "ลบการเชื่อมโยงระยะไกลของไฟล์ listing.xml";
+$lang['remove tags'] = "ลบแท็ก";
+$lang['remove this filter'] = 'ลบตัวกรองนี้';
+$lang['remove title'] = 'ลบชื่อ';
+$lang['Repair and optimize database'] = "ซ่อมแซม และทำให้ฐานข้อมูลเหมาะัสมที่สุด";
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = "แทนที่ธีมเก่า โดยการปรับแต่งธีมจาก ธีม-ส่วนขยาย ในโฟลเดอร์ย่อย";
+$lang['Replacers (customized templates)'] = "แทนที่ (ปรับแต่งแม่แบบ)";
+$lang['Representant'] = "รูปภาพขนาดย่อของอัลบั้ม";
+$lang['Representation of albums'] = "รูปภาพขนาดย่อของอัลบั้ม";
+$lang['Representative'] = 'รูปภาพขนาดย่อของอัลบั้ม';
+$lang['Represents'] = 'เป็นรูปภาพขนาดย่อสำหรับ';
+$lang['Resize'] = 'ลดขนาด';
+$lang['Restore'] = "คืนค่า";
+$lang['Restore default configuration. You will lose your plugin settings!'] = "คืนค่าการตั้งค่าปกติ. คุณอาจจะสูญเสียการตั้งค่าต่างๆ ของปลั๊กอิน!";
+$lang['Save order'] = "บันทึกคำสั่ง";
+$lang['Save page visits by administrators'] = "บันทึกการเข้าชมหน้าโดยผู้ดูแลระบบ";
+$lang['Save page visits by guests'] = "บันทึกการเข้าชมหน้าโดยผู้เยี่ยมชม";
+$lang['Save page visits by users'] = "บันทึกการเข้าชมหน้าโดยผู้ใช้งาน";
+$lang['Save Settings'] = 'บันทึกการตั้งค่า';
+$lang['Save to permalink history'] = "บันทึกไปยังประวัติการเชื่อมโยง";
+$lang['Searching...'] = "กำลังค้นหา...";
+$lang['Search for new images in the directories'] = "ค้นหารูปภาพใหม่ในไดเรกทอรี่";
+$lang['Section'] = "หมวดหมู่";
+$lang['See you soon,'] = "เจอคุณในไม่ช้า,";
+$lang['See you soon.'] = "เจอคุณในไม่ช้า.";
+$lang['Select at least one album'] = "อย่างอัลบั้มอย่างน้อยที่สุดหนึ่งอัลบั้ม";
+$lang['Select at least one comment'] = 'เลือกความเห็นอย่างน้อยที่สุดหนึ่งความเห็น';
+$lang['Select at least one photo'] = "เลือกรูปภาพอย่างน้อยที่สุดหนึ่งรูป";
+$lang['Select at least one user'] = "เลือกผู้ใช้งานอย่างน้อยที่สุดหนึ่งคน";
+$lang['Select files'] = 'เลือกไฟล์';
+$lang['Select recipients'] = "เลือกผู้รับ";
+$lang['Select:'] = 'เลือก:';
+$lang['selection'] = "เลือก";
+$lang['Selection'] = 'เลือก';
+$lang['Send an information email to group members'] = "ส่งเมลรายละเอียดข้อมูลไปยังกลุ่มสมาชิก";
+$lang['Send mail as'] = "Send mail as";
+$lang['Send mail on HTML format'] = "ส่งเมลในรูปแบบ HTML";
+$lang['Send mail to users'] = "ส่งเมลไปยังผู้ใช้งาน";
+$lang['Send'] = "ส่ง";
+$lang['Set as default language for unregistered and new users'] = 'ใช้งานภาษานี้';
+$lang['Set as default theme for unregistered and new users'] = "ใช้งานธีมนี้";
+$lang['Set author'] = 'ตั้งชื่อผู้เขียน';
+$lang['Set creation date'] = 'กำหนดวันที่สร้าง';
+$lang['Set title'] = 'ตั้งชื่อ';
+$lang['set to'] = "ตั้งค่าเป็น";
+$lang['Settings'] = 'ตั้งค่า';
+$lang['Show info'] = "แสดงรายละเอียด";
+$lang['Show menubar'] = "แสดงแถบเมนู";
+$lang['Simulation'] = "การจำลอง";
+$lang['singly represented'] = 'ถูกกำหนดเป็นรูปภาพขนาดย่อของอัลบั้ม';
+$lang['Site manager'] = "จัดการที่อยู่";
+$lang['Start pLoader and add your photos.'] = 'เริ่มการใช้งานโปรแกรม pLoader และเพิ่มรูปถ่ายของคุณ.';
+$lang['Statistics'] = "สถิติ";
+$lang['Status of user "%s" updated'] = "ผู้ใช้งาน \"%s\" ได้อัพเดตสถานะ";
+$lang['Status'] = "สถานะ";
+$lang['status'] = "สถานะ";
+$lang['Storage album'] = "อัลบัมที่ใช้จัดเก็บ";
+$lang['sub-albums'] = "อัลบั้ม-ย่อย";
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = "บอกรับ %s to จดหมายข่าวสารและประกาศของ Piwigo";
+$lang['Subscribe %s'] = "บอกรับ %s";
+$lang['Subscribe to notification by mail'] = "บอกรับการแจ้งเตือนโดยเมล";
+$lang['Subscribe'] = "บอกรับ";
+$lang['Subscribe/unsubscribe users'] = "บอกรับ/ยกเลิกการบอกนับผู้ใช้งาน";
+$lang['Subscribed'] = "ได้ถูกบอกรับ";
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = "รายชื่อผู้บอกรับในรายการ (ที่สามารถใช้ได้) เท่านั้น ที่จะได้รับการแจ้งเตือน.";
+$lang['Sum of rates'] = "ผลรวมของคะแนนนิยม";
+$lang['Summary'] = "สาระสำคัญ";
+$lang['Support'] = "ขอรับการสนับสนุน";
+$lang['Switch to clear or dark colors for administration'] = 'สลับไปยังโหมดสีสว่าง หรือ มืด สำหรับส่วนของการจัดการระบบ';
+$lang['synchronize files metadata with database photos informations'] = "ซิงโคไนซ์ฐานข้อมูลรูปภาพกับไฟล์ด้วยเมตาดาต้า";
+$lang['synchronize files structure with database'] = "ซิงโคไนซ์ไฟล์กับฐานข้อมูล";
+$lang['Synchronize'] = "ซิงโคไนซ์";
+$lang['Tag "%s" already exists'] = "แท็ก \"%s\" ได้มีอยู่แล้ว";
+$lang['Tag "%s" was added'] = "แท็ก \"%s\" ได้ถูกเพิ่มแล้ว";
+$lang['Tag selection'] = "เลือกแท็ก";
+$lang['target'] = "เป้าหมาย";
+$lang['Templates configuration has been recorded.'] = "การปรับแต่งการตั้งค่าแม่แบบได้ถูกบันทึกแล้ว.";
+$lang['Templates'] = "แม่แบบ";
+$lang['test this remote site'] = "ทดสอบการเชื่อมโยงที่อยู่ระยะไกล";
+$lang['test'] = "ทดสอบ";
+$lang['The %d following tags were deleted'] = "การติดตามแท็ก %d แท็ก ได้ถูกลบแล้ว";
+$lang['The anomaly will be ignored until next application version'] = "ความผิดปกติจะถูกเพิกเฉยไปจนถึงเวอร์ชั่นถัดไปของแอพพลิเคชั่น";
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = "ไฟล์ หรือ ไดเรกทอรี่ ไม่สามารถที่จะเข้าถึงได้ (หรือไม่ก็ มันอาจจะไม่มีอยู่ หรือถูกปฏิเสธการเข้าถึง)";
+$lang['The following tag was deleted'] = 'แท็กที่กำลังหาได้ถูกลบแล้ว';
+$lang['the forum'] = "ฟอรั่ม";
+$lang['The gallery URL is not valid.'] = "URL แกลลอรี่ไม่ถูกต้อง.";
+$lang['The name of a group must not contain " or \' or be empty.'] = "ชื่อกลุ่มจะต้องไม่ประกอบด้วยเครื่องหมาย \" หรือ ' หรือช่องเว้นว่าง.";
+$lang['The name of an album must not be empty'] = "ชื่อของอัลบั้มจะต้องไม่ปล่อยว่าง";
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = "ชื่อของไดเรกทอรี่และไฟล์ ต้องประกอบด้วยตัวอักษร, ตัวเลข, \"-\", \"_\" หรือ \".\"เท่านั้น";
+$lang['The number of comments a page must be between 5 and 50 included.'] = "จำนวนความคิดเห็นต่อหนึ่งหน้า จะต้องเป็นจำนวนระหว่าง 5 แต่ไม่เกิน 50 ความคิดเห็น.";
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = "ชื่อลิงค์จะต้องประกอบด้วย a-z, A-Z, 0-9, \"-\", \"_\" หรือ \"/\". แต่จะต้องไม่ใช่อักขระพิเศษ หรือเริ่มต้นด้วยตัวเลขแล้วตามด้วยเครื่องหมาย \"-\"";
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'ไฟล์ที่จะอัพโหลด มีขนาดใหญ่เกินไป โปรดใช้การอัพโหลดโดยตรงผ่านรูปแบบ HTML หรือการอัพโหลดแบบปกติ';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'ไฟล์ที่จะอัพโหลดมีขนาดใหญ่เกินที่กำหนดไว้ในไฟล์การตั้งค่า php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'ไฟล์ที่อัพโหลดได้ถูกอัพโหลดไปบางส่วน';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'ไฟล์ที่จะอัพโหลดมีขนาดใหญ่เกินที่กำหนดไว้ในไฟล์การตั้งค่า php.ini: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = "เวอร์ชั่นของ %s [%s] ที่ได้ติดตั้งไปไม่สามารถรองรับการทำงาน กับเวอร์ชั่นที่ต้องการ [%s]";
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = "เว็บมาสเตอร์ได้บอกรับคุณโดยการแจ้งผ่านเมล.";
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = "เว็บมาสเตอร์ได้ยกเลิกบอกรับคุณโดยการแจ้งผ่านเมล.";
+$lang['The whole page'] = 'หน้าทั้งหมด';
+$lang['The whole set'] = 'ชุดการตั้งค่าทั้งหมด';
+$lang['the wiki'] = "วิกิ wiki";
+$lang['Theme has been successfully installed'] = 'ธีมได้ถูกติดตั้งเรียบร้อยแล้ว';
+$lang['Themes'] = "ธีม";
+$lang['There is no available subscribers to mail.'] = "ไม่มีการแจ้งเตือนการบอกรับโดยทางเมล.";
+$lang['There is no other language available.'] = 'ไม่มีภาษาอื่นที่สามารถใช้ได้เพิ่มเติม.';
+$lang['There is no other plugin available.'] = 'ไม่มีปละ๊กอินอื่นที่สามารถใช้ได้เพิ่มเติม.';
+$lang['There is no other theme available.'] = 'ไม่มีธีมอื่นที่สามารถใช้ได้เพิ่มเติม.';
+$lang['This name is already used by another group.'] = "ชื่อนี้ได้ถูกใช้แล้ว.";
+$lang['This site already exists'] = "ที่อยู่นี้ได้มีอยู่แล้ว";
+$lang['This theme was not designed to be directly activated'] = 'ธีมนี้ไม่สามารถปรับแต่งได้ เนื่องจากมีการเปิดการใช้งานอยู่';
+$lang['Thumbnail'] = "รูปภาพขนาดย่อ";
+$lang['Thumbnail'] = 'รูปภาพขนาดย่อ';
+$lang['Time to send mail is limited. Others mails are skipped.'] = "เวลาในการส่งเมลถูกจำกัด. เมลอื่นๆ อาจจะไม่ได้ถูกส่ง.";
+$lang['Time'] = "เวลา";
+$lang['title'] = "ชื่อ";
+$lang['To send ?'] = "ต้องการส่ง?";
+$lang['To subscribe'] = "บอกรับ";
+$lang['To unsubscribe'] = "ยกเลิกการบอกรับ";
+$lang['Toggle \'default group\' property'] = "กลับไปยังคุณสมบัติ 'กลุ่มปกติ'";
+$lang['Tools'] = "เครื่องมือ";
+$lang['total time'] = "เวลาทั้งหมด";
+$lang['Type here the author name'] = 'ชนิดของชื่อผู้เขียน';
+$lang['Type here the title'] = 'ชนิดของชื่อ';
+$lang['Type in a search term'] = "ชนิดของการค้นหา";
+$lang['Unable to check for upgrade.'] = "ไม่สามารถตรวจสำหรับอัพเกรดได้.";
+$lang['Uncheck all'] = "ไม่เลือกทั้งหมด";
+$lang['Uninstall'] = "ถอนการติดตั้ง";
+$lang['Uninstalled Plugins'] = 'ได้ถอนการติดตั้งปลั๊กอินแล้ว';
+$lang['unit mode'] = "โหมดเฉพาะ";
+$lang['Unknown upload error'] = 'ไม่ทราบข้อผิดพลาดของการอัพโหลด';
+$lang['unknown'] = 'ไม่ทราบ';
+$lang['Unlocked'] = "ปลดล็อค";
+$lang['unset'] = "ไม่มีการตั้งค่า";
+$lang['Unsubscribe from notification by mail'] = "ยกเลิกการบอกรับการแจ้งเตือนโดยเมล";
+$lang['Unsubscribed'] = "ได้ยกเลิกการบอกรับแล้ว";
+$lang['Update albums informations'] = "อัพเดตรายละเอียดอัลบั้ม";
+$lang['Update photos information'] = "อัพเดตรายละเอียดรูปภาพ";
+$lang['update the database from files'] = "อัพเดตฐานข้อมูลกับไฟล์";
+$lang['Upload Photos'] = 'อัพโหลดรูปภาพ';
+$lang['Upload'] = "อัพโหลด";
+$lang['Uploaded Photos'] = 'รูปภาพที่ได้ถูกอัพโหลดแล้ว';
+$lang['Use the default photo sort order (defined in the configuration file)'] = "ใช้การจัดเรียงภาพถ่ายคำสั่งพื้นฐาน (ดูในการตั้งค่าไฟล์)";
+$lang['Used metadata'] = "ใช้งานเมตาดาต้า";
+$lang['user "%s" added'] = "ผู้ใช้งาน \"%s\" ได้ถูกเพิ่มแล้ว";
+$lang['User "%s" created with "%s" like password'] = "ผู้ใช้งาน \"%s\" สร้างด้วย \"%s\" รหัสผ่าน";
+$lang['User %s [%s] added.'] = "ผู้ใช้งาน %s [%s] ได้ถูกเพิ่มแล้ว.";
+$lang['User %s [%s] was added to the subscription list.'] = "ผู้ใช้งาน %s [%s] ได้เพิ่มเข้ารายการการบอกรับการเป็นสมาชิก.";
+$lang['User %s [%s] was not added to the subscription list.'] = "ผู้ใช้งาน %s [%s] ไม่ได้เพิ่มเข้ารายการการบอกรับการเป็นสมาชิก.";
+$lang['User %s [%s] was not removed from the subscription list.'] = "ผู้ใช้งาน %s [%s] ที่ไม่ได้ถูกลบจากรายการการบอกรับเป็นสมาชิก.";
+$lang['User %s [%s] was removed from the subscription list.'] = "ผู้ใช้งาน %s [%s] ที่ได้ถูกลบจากรายการการบอกรับเป็นสมาชิก.";
+$lang['User comments validation'] = "การตรวจสอบความคิดเห็นของผู้ใช้งาน";
+$lang['User list'] = "รายชื่อผู้ใช้งาน";
+$lang['User status'] = "สถานะของผู้ใช้งาน";
+$lang['User'] = "ผู้ใช้งาน";
+$lang['Users'] = "ผู้ใช้งาน";
+$lang['user_status_admin'] = "ผู้ดูแลระบบ";
+$lang['user_status_generic'] = "ผู้ใช้งานทั่วไป";
+$lang['user_status_guest'] = "ผู้เยี่ยมชม";
+$lang['user_status_normal'] = "ผู้ใช้งาน";
+$lang['user_status_webmaster'] = "เว็บมาสเตอร์";
+$lang['Validate'] = "ตรวจสอบ";
+$lang['Validation'] = "การตรวจสอบ";
+$lang['Version of create_listing_file.php on the remote site and Piwigo must be the same'] = "เวอร์ชั่นของไฟล์ create_listing_file.php ในการเชื่อมโยงที่อยู่ระยะไกล และ Piwigo จะต้องเหมือนกัน";
+$lang['Version'] = "เวอร์ชั่น";
+$lang['Virtual album added'] = "อัลบั้มได้ถูกเพิ่มแล้ว";
+$lang['Virtual album deleted'] = "อัลบั้มได้ถูกลบแล้ว";
+$lang['Virtual album name'] = "อัลบั้มชื่อ";
+$lang['Virtual album'] = "อัลบั้ม";
+$lang['Virtual albums to move'] = "ย้ายอัลบั้ม";
+$lang['Virtual Links'] = 'ลิงค์';
+$lang['Visit Gallery'] = 'เยี่ยมชมแกลลอรี่';
+$lang['Visit Piwigo project website'] = 'เยี่ยมชมเว็บไซต์อย่างเป็นทางการของ Piwigo';
+$lang['Visit plugin site'] = 'เยี่ยมชมเว็บไซต์ปลั๊กอิน';
+$lang['Waiting'] = "รออนุมัติ";
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = "คำเตือน: การบอกรับ หรือ ยกเลิกการบอกรับ จะถูกส่งไปยังผู้ใช้งานโดยเมล";
+$lang['Webmaster cannot be deleted'] = "เว็บมาสเตอร์ไม่สามารถลบได้";
+$lang['Webmaster status is required.'] = 'จำเป็นต้องมีสถานะเป็น เว็บมาสเตอร์.';
+$lang['Week starts on'] = 'เริ่มต้นสัปดาห์วัน';
+$lang['Who can see these photos?'] = 'ใครบ้างที่สามารถเข้าชมรูปภาพเหล่านี้ได้?';
+$lang['Who can see this photo?'] = 'ใครบ้างที่สามารถเข้าชมรูปภาพเหล่านี้ได้?';
+$lang['width must be a number superior to'] = "ความกว้างต้องเป็นตัวเลขจำนวนที่มากกว่า";
+$lang['With blank value, gallery title will be used'] = "ถ้าปล่อยว่าง, ชื่อแกลลอรี่ของคุณจะถูกใช้แสดงแทน";
+$lang['wrong filename'] = "ชื่อไฟล์ไม่ถูกต้อง";
+$lang['Year'] = "ปี";
+$lang['You are running on development sources, no check possible.'] = "คุณกำลังใช้งาน Piwigo เวอร์ชั่นที่กำลังพัฒนาอยู่, ซึ่งไม่ใช่เวอร์ชั่นที่ถูกปล่อยอย่างเป็นทางการ.";
+$lang['You are running the latest version of Piwigo.'] = "คุณกำลังใช้งาน Piwigo เวอร์ชั่นล่าสุดอยู่.";
+$lang['You cannot delete your account'] = "คุณไม่สามารถลบบัญชีผู้ใช้งานของคุณได้";
+$lang['You cannot move an album in its own sub album'] = "คุณไม่สามารถย้ายอัลบั้มหลักเข้าไปในอัลบั้มย่อยได้";
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'คุณไม่สามารถกำหนดค่ารูปภาพเป็นค่าปกติได้ เพราะว่าคุณได้ปรับแต่งการตั้งค่าด้วยตนเองในส่วนของ การปรับแต่งการตั้งค่าระบบ.';
+$lang['You have %d orphan tags: %s.'] = 'คุณมี %d แท็กที่ไม่ได้ใช้งาน: %s. แท็ก';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'ชื่อจะต้องเป็นชื่อเฉพาะ <i>$conf[\'order_by\']</i> ในไฟล์การตั้งค่าของคุณ, มันคือตัวแปรที่ปิดกั้นการดำเนินการ, กรุณาลบมันออก หรือ เปลี่ยนชื่อมันเป็นอย่างอื่น <i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = "คุณได้มีการบอกรับข่าวสารและจะได้รับข่าวสารและการแจ้งเตือนผ่านทางเมล.";
+$lang['You have unsubscribed from receiving notifications by mail.'] = "คุณได้ยกเลิกการบอกรับข่าวสารและจะไม่ได้ได้รับข่าวสารและการแจ้งเตือนผ่านทางเมล.";
+$lang['You might go to plugin list to install and activate it.'] = "ไปยังรายการปลั๊กอินเพื่อนติดตั้งและเปิดใช้งาน.";
+$lang['You need to confirm deletion'] = "คุณจะต้องยืนยันการลบ";
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = "คุณควรอัพเดตระบบของคุณ เพื่อประสิทธิภาพการทำงานของแอพพลิเคชั่น, ไม่เช่นนั้นแอพพลิเคชั่นของคุณอาจไม่สามารถทำงานได้อย่างถูกต้อง, หรือไม่สามารถทำงานได้อย่างสิ้นเชิง";
+$lang['Your configuration settings are saved'] = 'การเปลี่ยนแปลงการตั้งค่าของคุณได้ถูกบันทึกแล้ว';
+$lang['[%s] Visit album %s'] = "[%s] เข้าชมอัลบั้ม %s";
+$lang['[NBM] Problems or questions'] = "[NBM] ปัญหาหรือคำถาม";
+$lang['Themes which need upgrade'] = 'ธีมนี้ต้องการการอัพเกรด';
+$lang['Languages which need upgrade'] = 'ภาษานี้ต้องการการอัพเกรด';
+$lang['All themes are up to date.'] = 'ธีมทั้งหมดถูกอัพเดตแล้ว.';
+$lang['All plugins are up to date.'] = 'ปลั๊กอินทั้งหมดถูกอัพเดตแล้ว.';
+$lang['All languages are up to date.'] = 'ภาษาทั้งหมดถูกอัพเดตแล้ว.';
+$lang['Visit theme site'] = 'เยี่ยมชมเว็บไซต์ธีม';
+$lang['Visit language site'] = 'เยี่ยมชมเว็บไซต์ภาษา';
+$lang['New Version'] = 'เวอร์ชั่นใหม่';
+$lang['Obsolete Plugins'] = 'ปลั๊กอินเก่า';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'คำเตือน! ปลั๊กนี้ไม่รองรับการใช้งาน(เข้ากันไม่ได้) Piwigo เวอร์ชั่นที่ใช้อยู่.';
+$lang['Do you want to activate anyway?'] = 'คุณต้องการเปิดการใช้งาน ไม่ว่าอย่างไรก็ตาม?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ปลั๊กอินนี้ไม่ใช่ส่วนหนึ่งของ PIWIGO CORE! ถอนการติดตั้งตอนนี้!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'เกิดความผิดพลาด: ไม่พบปลั๊กอินนี้แต่มันได้ถูกติดตั้งแล้ว! ถอนการติดตั้งตอนนี้.';
+$lang['display'] = 'การแสดงผล';
+$lang['Regenerate Thumbnails'] = 'กำหนดรูปภาพขนาดย่อใหม่';
+$lang['Regenerate Websize Photos'] = 'กำหนดขนาดรูปภาพบนเว็บ';
+$lang['Thumbnails generation in progress...'] = 'การสร้างรูปภาพขนาดย่อ กำลังประมวลผล...';
+$lang['Photos generation in progress...'] = 'การสร้างรูปภาพ กำลังประมวลผล...';
+$lang['%s thumbnails have been regenerated'] = '%s รูปภาพขนาดย่อได้ถูกสร้างแล้ว';
+$lang['%s thumbnails can not be regenerated'] = '%s รูปภาพขนาดย่อไม่สามารถสร้างได้';
+$lang['%s photos have been regenerated'] = '%s รูปภาพที่ได้สร้างใหม่';
+$lang['%s photos can not be regenerated'] = '%s รูปภาพที่ไม่สามารถสร้างได้';
+$lang['Updates'] = 'อัพเดต';
+$lang['Update in progress... Please wait.'] = 'กำลังประมวลผลการอัพเดต... กรุณารอ.';
+$lang['Ignore this update'] = 'ปฏิเสธการอัพเดต';
+$lang['Reset ignored updates'] = 'คืนค่าการอัพเดตที่ถูกปฏิเสธ';
+$lang['Update All'] = 'อัพเดต ทั้งหมด';
+$lang['ERROR'] = 'ผิดพลาด';
+$lang['Update Complete'] = 'อัพเดต เรียบร้อยแล้ว';
+$lang['Piwigo Update'] = 'อัพเดต Piwigo';
+$lang['Extensions Update'] = 'อัพเดต ส่วนขยาย';
+$lang['All extensions are up to date.'] = 'ส่วนขยายทั้งหมดได้ถูกอัพเดตแล้ว.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'ปลั๊กอินนี้อาจจะไม่รองรับการทำงานบนเวอร์ชั่นใหม่ของ Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'ธีมนี้อาจจะไม่รองรับการทำงานบนเวอร์ชั่นใหม่ของ Piwigo:';
+$lang['I decide to update anyway'] = 'ฉันตัดสินใจที่จะอัพเดต';
+$lang['Update to Piwigo %s'] = 'อัพเดตไปยัง Piwigo %s';
+$lang['Two updates are available'] = 'การอัพที่สามารถทำได้';
+$lang['This is a minor update, with only bug corrections.'] = 'นี่คือไมเนอร์อัพเดต หรือ การอัพเดตเวอร์ชั่นรอง, ซึ่งมีการแก้ไขจุดบกพร่องบางประการ.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'นี่คือเมเจอร์อัพเดต หรือ การอัพเดตเวอ์ชั่นหลัก, ซึ่งมาพร้อมกับ <a href="%s">ความสามารถใหม่</a>. ที่น่าสนใจ.';
+$lang['Some themes and plugins may be not available yet.'] = 'ธีมและปลั๊กอินบางตัวอาจไม่สามารถใช้งานได้.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'คุณสามารถอัพเดต Piwigo %s ได้โดยตรง, โดยไม่ต้องอัพเกรด Piwigo %s (แนะนำ).';
+$lang['Save Template Directory'] = 'บันทึกไดเรกทอรี่แม่แบบ';
+$lang['Dump Database'] = 'ดัมพ์ฐานข้อมูล';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'นำเข้าประวัติข้อมูล (คำเตือน: อาจจะทำให้ประสิทธิภาพการทำงานหรือความเร็วของเซิร์ฟเวอร์ลดลง)';
+$lang['Unable to dump database.'] = 'ไม่สามารถดัมพ์ฐานข้อมูลได้.';
+$lang['Some upgrades are available for extensions.'] = 'มีส่วนขยายบางตัว ที่ต้องการการอัพเกรด.';
+$lang['Please wait...'] = 'กรุณารอ...';
+$lang['Ignore All'] = 'ปฏิเสธทั้่งหมด';
+$lang['Crop'] = 'ตัด';
+$lang['Width'] = 'กว้าง';
+$lang['Height'] = 'สูง';
+$lang['Follow Orientation'] = 'การติดตามแนวโน้ม';
+$lang['Graphics Library'] = 'กราฟฟิค ไลบราลี่';
+$lang['... or '] = '... หรือ ';
+$lang['Create'] = 'สร้าง';
+$lang['Start Upload'] = 'เริ่มการอัพโหลด';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'ตอนนี้คุณกำลังใช้การอัพโหลดแบบ แฟลชอัพโหลด. หากเจอปัญหา? ให้ลองใช้ <a href="%s">การอัพโหลดแบปกติ</a> แทน.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'คุณกำลังใช้การอัพโหลด แบบปกติ. ลองใช้การอัพโหลดแบบ <a href="%s">แฟลชอัพโหลด</a> แทน.';
+$lang['Maximum file size: %sB.'] = 'ขนาดไฟล์สูงสุด: %sB.';
+$lang['Allowed file types: %s.'] = 'รูปแบบไฟล์ที่อนุญาต: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'ความละเอียดสูงสุดโดยประมาณ: %dM เมกะพิกเซล. (ไม่เกินขนาด %dx%d พิกเซล).';
+$lang['Manage Permissions'] = 'จัดการการอนุญาตสิทธิ์';
+$lang['Photo %s of %s'] = 'รูปภาพ %s จาก %s';
+$lang['show details'] = 'แสดงรายละเอียด';
+$lang['hide details'] = 'ซ่อนรายละเอียด';
+$lang['Merge tags'] = 'รวมแท็ก';
+$lang['Select the destination tag'] = 'เลือกแท็กปลายทาง';
+$lang['(this tag will be deleted)'] = '(แท็กนี้จะถูกลบ)';
+$lang['Confirm merge'] = 'ยืนยันการรวม';
+$lang['Merge selected tags'] = 'รวมแท็กที่เลือก';
+$lang['No destination tag selected'] = 'ไม่มีแท็กปลายทางที่เลือก';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'แท็ก <em>%s</em> ได้ถูกรวมเข้าไปยังแท็ก <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'เลือกอย่างน้อยสองแท็กเพื่อรวม ';
+$lang['Learn more'] = 'เรียนรู้เพิ่มเติม';
+$lang['Select an album'] = 'เลือกอัลบั้มรูป';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'โดยปกติ, จะสร้างรูปภาพขนาดใหม่ ซึ่งแยกต่างหากจากภาพคุณภาพความละเอียดสูง หรือแบบ HD (high definition) หรือขนาดปกติของรูปภาพของคุณ.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'ถ้าไม่มีรูปภาพขนาดความละเอียดสูง หรือ HD และเถ้ารูปภาพของคุณขนาดใหญ่กว่าขนาดที่กำหนดเพื่อลดขนาดหรือ Resize, Piwigo จะย้ายรูปภาพเหล่านั้นไปยังขนาด HD และสร้างขนาดรูปภาพใหม่โดยการลดขนาดรูปภาพจากภาพดังกล่าวเป็นภาพขนาดที่กำหนดไว้สำหรับแสดงบนเว็บ.';
+$lang['An error has occured during upgrade.'] = 'เกิดข้อผิดพลาดในระหว่างการอัพเกรด.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'เกิดข้อผิดพลาดในระหว่างการแตกไฟล์. กรุณาตรวจสอบสิทธิ์ในการเข้าถึงโฟลเดอร์การติดตั้งของ Piwigo.<br><a href="%s">คลิกที่นี่เพื่อดูบันทึกรายการข้อผิดพลาด</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo ไม่สามารถรัับไฟล์อัพเกรดจากเซิร์ฟเวอร์ได้';
+
+?>
Index: tags/2.4.0RC3/language/th_TH/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/th_TH/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/common.lang.php	(revision 14585)
@@ -0,0 +1,384 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: ภาษาไทย [TH]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+$lang_info['language_name'] = "ภาษาไทย";
+$lang_info['country'] = "ประเทศไทย";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "th";
+$lang_info['zero_plural'] = "1";
+
+
+$lang['%d album updated'] = '%d อัลบั้มได้อัพเดตแล้ว';
+$lang['%d albums updated'] = '%d อัลบั้มที่ได้อัพเดตแล้ว';
+$lang['%d comment to validate'] = "%d ความเห็นรอการตรวจสอบ";
+$lang['%d comment'] = "%d ความคิดเห็น";
+$lang['%d comments to validate'] = "%d ความเห็นรอการตรวจสอบ";
+$lang['%d comments'] = "%d ความคิดเห็น";
+$lang['%d hit'] = "%d hit";
+$lang['%d hits'] = "%d hits";
+$lang['%d Kb'] = "%d กิโลไบต์ (Kb)";
+$lang['%d new comment'] = "%d ความคิดเห็นใหม่";
+$lang['%d new comments'] = "%d ความคิดเห็นใหม่";
+$lang['%d new photo'] = "%d รูปภาพใหม่";
+$lang['%d new photos'] = "%d รูปภาพใหม่";
+$lang['%d new user'] = "%d ผู้ใช้งานใหม่";
+$lang['%d new users'] = "%d ผู้ใช้งานใหม่";
+$lang['%d rates'] = "%d คะแนนนิยม";
+$lang['About'] = "ข้อมูลที่เกี่ยวข้อง";
+$lang['All tags'] = "แทคทั้งหมด";
+$lang['Any tag'] = "แท็คใดๆ";
+$lang['At least one listed rule must be satisfied.'] = "ต้องมีกฏของลำดับอย่างน้อยหนึ่งกฏเพื่อยอมรับ.";
+$lang['Author'] = "เจ้าของ";
+$lang['Albums'] = "อัลบั้ม";
+$lang['Album'] = "อัลบั้ม";
+$lang['Close this window'] = "ปิดหน้าต่างนี้";
+$lang['Complete RSS feed (photos, comments)'] = "RSS feed เสร็จสมบูรณ์ (รูปภาพ, ความคิดเห็น)";
+$lang['Confirm Password'] = "ยืนยันรหัสผ่าน";
+$lang['Connection settings'] = "ตั้งค่าการเชื่อมต่อ";
+$lang['Login'] = "เข้าสู่ระบบ";
+$lang['Contact webmaster'] = "ติดต่อผู้เว็บมาสเตอร์";
+$lang['Create a new account'] = "สร้างบัญชีผู้ใช้งานใหม่";
+$lang['Created on'] = "สร้างเมื่อ";
+$lang['Creation date'] = "วันที่สร้าง";
+$lang['Current password is wrong'] = "รหัสผ่านเดิมไม่ถูกต้อง";
+$lang['Dimensions'] = "ขนาด";
+$lang['Display'] = "การแสดงผล";
+$lang['Each listed rule must be satisfied.'] = "กฏของลำดับแต่ละกฏต้องได้รับการยอมรับ.";
+$lang['Email address'] = "อี-เมล์";
+$lang['Enter your personnal informations'] = "กรอกข้อมูลส่วนตัว";
+$lang['Error sending email'] = "เกิดข้อผิดพลาดขณะส่งเมล์";
+$lang['File name'] = "ชื่อไฟล์";
+$lang['File'] = "ไฟล์";
+$lang['Filesize'] = "ขนาดไฟล์";
+$lang['Filter and display'] = "ตัวกรอง และ การแสดงผล";
+$lang['Filter'] = "ตัวกรอง";
+$lang['Forgot your password?'] = "ลืมรหัสผ่าน?";
+$lang['Go through the gallery as a visitor'] = "เข้าชมแกเลอรีเหมือนผู้เยี่ชมทั่วไป";
+$lang['Help'] = "ช่วยเหลือ";
+$lang['Identification'] = "เมนูสมาชิก";
+$lang['Photos only RSS feed'] = "RSS feed สำหรับภาพเท่านั้น";
+$lang['Keyword'] = "คำค้น";
+$lang['Links'] = "การเชื่อมโยง";
+$lang['N/A'] = "ไม่ปรากฎ";
+$lang['New on %s'] = "ใหม่เมื่อ %s";
+$lang['Notification'] = "การแจ้งเตือน";
+$lang['Number of items'] = "จำนวนรายการ";
+$lang['Original dimensions'] = "ขนาดดั้งเดิม";
+$lang['Password forgotten'] = "ลืมรหัสผ่าน";
+$lang['Password'] = "รหัสผ่าน";
+$lang['Post date'] = "วันที่โพสต์";
+$lang['Posted on'] = "โพสต์ไว้เมื่อ";
+$lang['Profile'] = "ข้อมูลส่วนตัว";
+$lang['Quick connect'] = "เชื่อมต่ออย่างเร็ว";
+$lang['RSS feed'] = "RSS feed";
+$lang['Rating score'] = "คะแนนนิยม";
+$lang['Register'] = "สมัครสมาชิก";
+$lang['Registration'] = "การสมัครสมาชิก";
+$lang['Related tags'] = "แท็กใกล้เคียง";
+$lang['Reset'] = "เริ่มใหม่";
+$lang['Retrieve password'] = "Retrieve password";
+$lang['Search rules'] = "ขอบเขตการค้นหา";
+$lang['Search tags'] = "ค้นหาแท็ค";
+$lang['Search'] = "ค้นหา";
+$lang['display available tags'] = "แสดงแท็คที่ใช้ได้";
+$lang['Since'] = "ตั้งแต่";
+$lang['Sort by'] = "จัดเรียงโดย";
+$lang['Sort order'] = "ลำดับการจัดเรียง";
+$lang['Tag'] = "แท็ค";
+$lang['Tags'] = "แท็ค";
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = "RSS feed แสดงความเคลื่อนไหวต่างๆจากเว็บ: ภาพใหม่, เปลี่ยนแปลงอัลบั้ม, ความเห็นใหม่ เพื่อใช้สำหรับ RSS feed reader.";
+$lang['Unknown feed identifier'] = "feed ที่ไม่รู้จัก";
+$lang['User comments'] = "ความคิดเห็นของผู้ใช้งาน";
+$lang['Username'] = "ชื่อผู้ใช้งาน";
+$lang['Visits'] = "เข้าชม";
+$lang['Webmaster'] = "เว็บมาสเตอร์";
+$lang['Week %d'] = "สัปดาห์ %d";
+$lang['About Piwigo'] = "เกี่ยวกับ Piwigo";
+$lang['You are not authorized to access the requested page'] = "คุณไม่มีสิทธิหรืไม่ได้รับอนุญาตให้เข้าใช้งานหน้านี้";
+$lang['add this photo to your favorites'] = "เพิ่มรูปภาพนี้เป็นภาพโปรด";
+$lang['Administration'] = "จัดการระบบ";
+$lang['all'] = "ทั้งหมด";
+$lang['ascending'] = "น้อยไปหามาก";
+$lang['author(s) : %s'] = "เจ้าของ : %s";
+$lang['Expand all albums'] = "แสดงทุกอัลบั้ม";
+$lang['posted after %s (%s)'] = "โพสต์ไว้หลังจาก %s (%s)";
+$lang['posted before %s (%s)'] = "โพสต์ไว้ก่อน %s (%s)";
+$lang['posted between %s (%s) and %s (%s)'] = "โพสต์ระหว่าง %s (%s) และ %s (%s)";
+$lang['posted on %s'] = "โพสต์เมื่อ %s";
+$lang['Best rated'] = "คะแนนนิยมที่มากสุด";
+$lang['display best rated photos'] = "แสดงรูปภาพที่มีคะแนนนิยมมากที่สุด";
+$lang['Calendar'] = "ปฏิทิน";
+$lang['All'] = "ทั้งหมด";
+$lang['display each day with photos, month per month'] = "แสดงภาพในแต่ละวัน, เดือนต่อเดือน";
+$lang['View'] = "เข้าชม";
+$lang['chronology_monthly_calendar'] = "ปฏิทินแสดงเป็นเดือน";
+$lang['chronology_monthly_list'] = "แสดงรายเดือน";
+$lang['chronology_weekly_list'] = "แสดงรายสัปดาห์";
+$lang['Click here if your browser does not automatically forward you'] = "คลิกที่นี่ หากบราวเวอร์ของคุณไม่ดำเนินการโดยอัติโนมัติ";
+$lang['comment date'] = "ความคิดเห็นวันที่";
+$lang['Comment'] = "ความคิดเห็น";
+$lang['Your comment has been registered'] = "ความคิดเห็นของคุณได้ถูกบันทึกแล้ว";
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = "ป้องกันการล่ม ของระบบ : กรุณารอสักครู่ ก่อนลองโพสความคิดเห็นอื่นอีก";
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = "ความคิดเห็นของคุณไม่ได้ถูกบันทึก เพราะว่ามันอาจไม่ถูกต้องตามกฎที่กำหนดไว้";
+$lang['An administrator must authorize your comment before it is visible.'] = "จะต้องให้ผู้ดูแลระบบตรวจสอบความเห็นของท่านก่อน.";
+$lang['This login is already used by another user'] = "ื่อเข้าสู่ระบบนี้ถูกใช้ไปแล้ว โดยผู้ใช้งานอีกคน";
+$lang['Comments'] = "ความคิดเห็น";
+$lang['Add a comment'] = "เพิ่มความคิดเห็น";
+$lang['created after %s (%s)'] = "สร้างขึ้นหลังจาก %s (%s)";
+$lang['created before %s (%s)'] = "สร้างขึ้นก่อน %s (%s)";
+$lang['created between %s (%s) and %s (%s)'] = "สร้างขึ้นระหว่าง %s (%s) และ %s (%s)";
+$lang['created on %s'] = "สร้างขึ้นเมื่อ %s";
+$lang['Customize'] = "ปรับแต่งการตั้งค่า";
+$lang['Your Gallery Customization'] = "การปรับแต่งแกลอรี่ของคุณ";
+$lang['day'][0] = "วันอาทิตย์";
+$lang['day'][1] = "วันจันทร์";
+$lang['day'][2] = "วันอังคาร";
+$lang['day'][3] = "วันพุธ";
+$lang['day'][4] = "วันพฤหัสบดี";
+$lang['day'][5] = "วันศุกร์";
+$lang['day'][6] = "วันเสาร์";
+$lang['Default'] = "ค่าปกติ";
+$lang['delete this photo from your favorites'] = "ลบรูปภาพนี้ออกจากรายการโปรด";
+$lang['Delete'] = "ลบ";
+$lang['descending'] = "มาก-น้อย";
+$lang['edit'] = "แก้ไข";
+$lang['wrong date'] = "วันที่ไม่ถูกต้อง";
+$lang['excluded'] = "ได้ถูกแยกออกไป";
+$lang['Your favorites'] = "รายการโปรดของคุณ";
+$lang['display your favorites photos'] = "แสดงรูปภาพในรายการโปรดของคุณ";
+$lang['Favorites'] = "รายการโปรด";
+$lang['First'] = "ลำดับแรก";
+$lang['The gallery is locked for maintenance. Please, come back later.'] = "The gallery is locked for maintenance. Please, come back later.";
+$lang['Page generated in'] = "เวลาในการสร้างหน้านี้";
+$lang['guest'] = "ผู้เยี่ยมชม";
+$lang['Hello'] = "สวัสดี";
+$lang['available for administrators only'] = "สำหรับผู้ดูแลระบบเท่านั้น";
+$lang['display this album'] = "แสดงอัลบั้มนี้";
+$lang['display last user comments'] = "แสดงความเห็นล่าสุด";
+$lang['customize the appareance of the gallery'] = "ปรับแต่งมุมมองของแกลอรี่";
+$lang['search'] = "ค้นหา";
+$lang['Home'] = "หน้าหลัก";
+$lang['in this album'] = "ในอัลบั้มนี้";
+$lang['in %d sub-album'] = "ใน %d อัลบั้มย่อย";
+$lang['in %d sub-albums'] = "ใน %d อัลบั้มย่อย";
+$lang['included'] = "รวม";
+$lang['Invalid password!'] = "ชื่อผู้ใช้งาน หรือ รหัสผ่านไม่ถูกต้อง!";
+$lang['Language'] = "ภาษา";
+$lang['last %d days'] = "ล่าสุด %d วัน";
+$lang['Last'] = "ล่าสุด";
+$lang['Logout'] = "ออกจากระบบ";
+$lang['obligatory'] = "จำเป็น";
+$lang['Maximum photo height'] = "จำกัดความสูงรูปภาพ";
+$lang['Maximum height must be a number superior to 50'] = "การจำกัดความสูงของรูปภาพจะต้องไม่น้อยกว่า 50";
+$lang['Maximum photo width'] = "จำกัดความกว้างรูปภาพ";
+$lang['Maximum width must be a number superior to 50'] = "การจำกัดความกว้างของรูปภาพจะต้องไม่น้อยกว่า 50";
+$lang['display a calendar by creation date'] = "แสดงปฏิทินตามวันที่สร้างอัลบั้ม";
+$lang['display all photos in all sub-albums'] = "แสดงรูปภาพทั้งหมดในอัลบั้มย่อย";
+$lang['return to normal view mode'] = "กลับไปยังโหมดการดูปกติ";
+$lang['display a calendar by posted date'] = "แสดงปฏิทินตามวันที่โพส";
+$lang['month'][10] = "ตุลาคม";
+$lang['month'][11] = "พฤษจิกายน";
+$lang['month'][12] = "ธันวาคม";
+$lang['month'][1] = "มกราคม";
+$lang['month'][2] = "กุมภาพันธ์";
+$lang['month'][3] = "มีนาคม";
+$lang['month'][4] = "เมษายน";
+$lang['month'][5] = "พฤษภาคม";
+$lang['month'][6] = "มิถุยายน";
+$lang['month'][7] = "กรกฎาคม";
+$lang['month'][8] = "สิงหาคม";
+$lang['month'][9] = "กันยายน";
+$lang['Most visited'] = "เข้าชมสูงสุด";
+$lang['display most visited photos'] = "แสดงรูปภาพที่เข้าชมสูงสุด";
+$lang['The number of photos per page must be a not null scalar'] = "จำนวนของการแสดงภาพถ่ายต่อหนึ่งหน้า จะต้องเป็นเลขจำนวนเต็ม";
+$lang['Number of photos per page'] = "จำนวนรูปภาพต่อหนึ่งหน้า";
+$lang['Unknown identifier'] = "ไม่ได้ระบุตัวตน";
+$lang['New password'] = "รหัสผ่านใหม่";
+$lang['Rate this photo'] = "คะแนนนิยมรูปภาพนี้";
+$lang['Next'] = "ภาพต่อไป";
+$lang['no rate'] = "ไม่มี คะแนนนิยม";
+$lang['Photos posted within the last %d day.'] = "รูปภาพที่ถูกโพสเมื่อ %d วันก่อนนี้.";
+$lang['Photos posted within the last %d days.'] = "รูปภาพที่ถูกโพสเมื่อ %d วันก่อนนี้.";
+$lang['password updated'] = "รหัสผ่านได้ถูกอัพเดตแล้ว";
+$lang['Recent period must be a positive integer value'] = "ช่วงระยะเวลาจะต้องเป็นค่าจำนวนเต็มบวก";
+$lang['photo'] = "รูปภาพ";
+$lang['Click on the photo to see it in high definition'] = "คลิกที่รูปภาพเพื่อดูขนาดใหญ่กว่า";
+$lang['Show file metadata'] = "แสดงข้อมูลไฟล์";
+$lang['Powered by'] = "พัฒนาโดย";
+$lang['Preferences'] = "การตั้งค่า";
+$lang['Previous'] = "ก่อนหน้า";
+$lang['Random photos'] = "สุ่มรูปภาพ";
+$lang['display a set of random photos'] = "แสดงรูปภาพโดยการสุ่ม";
+$lang['Recent albums'] = "อัลบั้มล่าสุด";
+$lang['display recently updated albums'] = "แสดงอัลบั้มที่ได้อัพเดตล่าสุด";
+$lang['Recent period'] = "ช่วงเวลาล่าสุด";
+$lang['Recent photos'] = "ภาพถ่ายล่าสุด";
+$lang['display most recent photos'] = "แสดงภาพถ่ายล่าสุด";
+$lang['Redirection...'] = "กำลังเรียกไปยัง...";
+$lang['Please, enter a login'] = "กรุณากรอกชื่อและรหัสผ่านเพื่อเข้าสู่ระบบ";
+$lang['login mustn\'t end with a space character'] = "ชื่อเข้าสู่ระบบต้องไม่ลงท้ายด้วยอักขระช่องว่าง";
+$lang['login mustn\'t start with a space character'] = "ชื่อเข้าสู่ระบบไม่ต้องเริ่มต้นด้วยอักขระช่องว่าง";
+$lang['this login is already used'] = "ชื่อเข้าสู่ระบบนี้ถูกใช้ไปแล้ว";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "ที่อยู่อีเมลจะต้องมีลักษณะ xxx@yyy.eee (ตัวอย่าง : jack@altern.org)";
+$lang['please enter your password again'] = "กรุณากรอกรหัสผ่านของคุณอีกครั้ง";
+$lang['Auto login'] = "เข้าสู่ระบบอัตโนมัติ";
+$lang['remove this tag from the list'] = "ลบแท็กนี้จากรายการ";
+$lang['representative'] = 'รูปภาพขนาดย่อประจำอัลบั้ม';
+$lang['Search for Author'] = "ค้นหาช่างภาพ";
+$lang['Search in albums'] = "ค้นหาในอัลบั้ม";
+$lang['Date'] = "วันที่";
+$lang['End-Date'] = "วันสุดท้าย";
+$lang['Kind of date'] = "ชนิดของวันที่";
+$lang['Search for words'] = "ค้นหาคำ";
+$lang['Search for all terms'] = "ค้นหาคำทั้งหมด";
+$lang['Empty query. No criteria has been entered.'] = "คำถามว่างเปล่า. ไม่มีคำถามนี้ปรากฎอยู่.";
+$lang['Search results'] = "ผลการค้นหา";
+$lang['Search in sub-albums'] = "ค้นหาในอัลบั้มย่อย";
+$lang['searched words : %s'] = "คำที่ค้นหาได้ : %s";
+$lang['Contact'] = "ติดต่อ";
+$lang['set as album representative'] = "ตั้งรูปภาพนี้เป็นปกอัลบั้ม";
+$lang['Show number of comments'] = "แสดงจำนวนของความคิดเห็น";
+$lang['Show number of hits'] = "แสดงจำนวนครั้งที่เข้าชม";
+$lang['slideshow'] = "สไลด์โชว์";
+$lang['stop the slideshow'] = "หยุดการสไลด์โชว์";
+$lang['Specials'] = "เมนูพิเศษ";
+$lang['SQL queries in'] = "SQL queries ใน";
+$lang['display only recently posted photos'] = "แสดงเฉพาะรูปภาพที่เพิ่งถูกโพสเมื่อเร็วๆ นี้";
+$lang['return to the display of all photos'] = "กลับไปแสดงรูปภาพทั้งหมด";
+$lang['the beginning'] = "การเริ่มต้น";
+$lang['Interface theme'] = "ธีม";
+$lang['Thumbnails'] = "รูปภาพขนาดย่อ";
+$lang['Menu'] = "เมนู";
+$lang['A comment on your site'] = "แสดงความคิดเห็นถึงคุณ";
+$lang['today'] = "วันนี้";
+$lang['Update your rating'] = "อัพเดตคะแนนิยมของคุณ";
+$lang['the username must be given'] = "จำเป็นต้องกรอกชื่อผู้ใช้";
+$lang['useful when password forgotten'] = "ใช้ในกรณีที่ลืมรหัสผ่าน";
+$lang['Quick search'] = "ค้นหาแบบเร็ว...";
+$lang['Connected user: %s'] = "ได้เชื่อมต่อไปยังผู้ใช้งาน: %s";
+$lang['IP: %s'] = "ไอพี: %s";
+$lang['Browser: %s'] = "บราวเซอร์: %s";
+$lang['Author: %s'] = "ช่างภาพ: %s";
+$lang['Comment: %s'] = "ความคิดเห็น: %s";
+$lang['Comment by %s'] = "แสดงความคิดเห็นโดย %s";
+$lang['User: %s'] = "ผู้ใช้งาน: %s";
+$lang['Email: %s'] = "อีเมล: %s";
+$lang['Admin: %s'] = "ผู้ดูแลระบบ: %s";
+$lang['Registration of %s'] = "การสมัครสมาชิกของ %s";
+$lang['Album: %s'] = "อัลบั้ม: %s";
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = "สถานะไม่เป็นที่ยอมรับ \"ผู้เยี่ยมชม\", ปกติสถานะนี้จะถูกใช้. กรุณาแจ้งไปยังเว็บมาสเตอร์.";
+$lang['this email address is already in use'] = "อีเมลนี้ได้ถูกใข้ไปแล้ว";
+$lang['Album results for'] = "ผลการค้นหาอัลบั้มสำหรับ";
+$lang['Tag results for'] = "ผลการค้นหา";
+$lang['from %s to %s'] = "จาก %s ถึง %s";
+$lang['Play of slideshow'] = "เล่น สไลด์โชว์";
+$lang['Pause of slideshow'] = "พักการเล่น สไลด์โชว์";
+$lang['Repeat the slideshow'] = "เล่นซ้ำ สไลด์โชว์";
+$lang['Not repeat the slideshow'] = "ไม่ต้องเล่นซ้ำ สไลด์โชว์";
+$lang['Reduce diaporama speed'] = "ลดความเร็ว การเล่นสไลด์โชว์";
+$lang['Accelerate diaporama speed'] = "เพิ่มความเร็ว การเล่นสไลด์โชว์";
+$lang['Submit'] = "ยอมรับ";
+$lang['Yes'] = "ใช่";
+$lang['No'] = "ไม่";
+$lang['%d photo'] = "%d รูปภาพ";
+$lang['%d photos'] = "%d รูปภาพ";
+$lang['%d photo is also linked to current tags'] = "%d ภาพได้ถูกเชื่อมโยงไปยังแท็กปัจจุบัน";
+$lang['%d photos are also linked to current tags'] = "%d ภาพได้ถูกเชื่อมโยงไปยังแท็กปัจจุบัน";
+$lang['display photos linked to this tag'] = "แสดงภาพถ่ายที่ได้เชื่อมโยงกับแท็กนี้";
+$lang['photos posted during the last %d days'] = "รูปภาพที่ได้ถูกโพสในช่วง %d วันก่อน";
+$lang['Piwigo Help'] = "ช่วยเหลือ";
+$lang['Rank'] = "อันดับ";
+$lang['group by letters'] = "กลุ่มตามตัวอักษร";
+$lang['letters'] = "ตัวอักษร";
+$lang['show tag cloud'] = "แสดงแท็กคลาวด์";
+$lang['cloud'] = "คลาวด์";
+$lang['Reset to default values'] = "กลับไปใช้งานค่าเริ่มต้น";
+$lang['delete all photos from your favorites'] = "ลบภาพทั้งหมดออกจากรายการโปรดของคุณ";
+$lang['Sent by'] = "ถูกส่งโดย";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "คุกกี้ถูกบล็อกหรือไม่สนับสนุนในเบราว์เซอร์ของคุณ คุณต้องเปิดใช้งานคุกกี้เพื่อเข้าสู่ระบบ.";
+$lang['Edit a comment'] = "แก้ไขความคิดเห็น";
+$lang['Are you sure?'] = "คุณแน่ใจหรือไม่?";
+$lang['(!) This comment requires validation'] = '(!) ความคิดเห็นนี้จำเป็นต้องใได้รับการตรวจสอบก่อน';
+$lang['Welcome'] = 'ยินดีต้อนรับ';
+$lang['Welcome to your Piwigo photo gallery!'] = 'ยินดีต้อนรับสู่ Piwigo แกลลอรี่!';
+$lang['... or browse your empty gallery'] = '... หรือเลือกแกลลอรี่ที่ว่าง';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... ฉันยังไม่ต้องการเพิ่มรูปถ่ายในตอนนี้ (ซึ่งคุณสามารถเพิ่มรูปถ่ายได้ในภายหลัง) คลิกเพื่อเข้าชมหน้า Piwigo แกลลอรี่ของคุณ';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'สวัสดี %s, Piwigo แกลลอรี่ของคุณตอนนี้ว่างเปล่า!';
+$lang['I want to add photos'] = 'ฉันต้องการเพิ่มรูปภาพตอนนี้';
+$lang['Manage this user comment: %s'] = 'จัดการความคิดเห็นของผู้ใช้งานคนนี้: %s';
+$lang['Email address is missing. Please specify an email address.'] = "คุณยังไม่ได้ระบุอยู่อีเมล. กรุณาระบุที่อยู่อีเมล์.";
+$lang['This author modified following comment:'] = 'ผู้เขียนได้แก้ไขความคิดเห็นดังต่อไปนี้:';
+$lang['This author removed the comment with id %d'] = 'ผู้เขียนได้ลบความคิดเห็นโดย ไอดี %d';
+$lang['html tags are not allowed in login'] = 'html แท็ก นี้จะไม่ได้รับอนุญาตในการเข้าสู่ระบบ';
+$lang['Invalid username or email'] = 'ชื่อผู้ใช้ หรือ ที่อยู่อีเมล์ไม่ถูกต้อง';
+$lang['Password reset is not allowed for this user'] = 'การีเซ็ตรหัสผ่าน หรือการตั้งรหัสผ่านใหม่ไม่อนุญาตให้ผู้ใช้งานนี้ทำได้';
+$lang['User "%s" has no email address, password reset is not possible'] = 'ผู้ใช้งาน "%s" ไม่มีที่อยู่อีเมล์,ไม่สามารถรีเซ็ตรหัสผ่านได้';
+$lang['Someone requested that the password be reset for the following user account:'] = 'มีบางคนได้ร้องขอการรีเซ็ตรหัสผ่าน ดังต่อไปนี้:';
+$lang['Username "%s" on gallery %s'] = 'ชื่อผู้ใช้งาน "%s" ในแกลลอรี่ %s';
+$lang['To reset your password, visit the following address:'] = 'เพื่อรีเซ็ตรหัสผ่านของคุณ, ให้เข้าไปที่:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'ถ้านี้คือความผิดพลาด, อีเมล์ฉบับนี้จะไม่มีผลอะไรเลย.';
+$lang['Password Reset'] = 'รีเซ็ตรหัสผ่าน';
+$lang['Check your email for the confirmation link'] = 'กรุณาตรวจสอบอีเมล์ของคุณสำหรับการยืนยันการใช้งาน';
+$lang['Invalid key'] = 'คีย์ไม่ถูกต้อง';
+$lang['The passwords do not match'] = 'รหัสผ่านไม่ตรงกัน';
+$lang['Your password has been reset'] = 'รหัสผ่านของคุณได้รับการรีเซ็ตใหม่';
+$lang['Return to home page'] = 'กลับไปยังหน้าหลัก';
+$lang['Please enter your username or email address.'] = 'กรุณาใส่ชื่อผู้ใช้หรือที่อยู่อีเมลของคุณ.';
+$lang['You will receive a link to create a new password via email.'] = 'คุณจะได้รับลิงค์เพื่อสร้างรหัสผ่านใหม่ทางอีเมลของคุณ.';
+$lang['Username or email'] = 'ชื่อผู้ใช้งานหรืออีเมล';
+$lang['Change my password'] = 'เปลี่ยนรหัสผ่านของฉัน';
+$lang['Enter your new password below.'] = 'กำหนดรหัสผ่านใหม่ของคุณด้านล่าง.';
+$lang['EXIF Metadata'] = 'ข้อมูล EXIF';
+$lang['IPTC Metadata'] = 'ข้อมูล IPTC';
+$lang['Download this file'] = 'ดาวน์โหลดไฟล์นี้';
+$lang['Download'] = 'ดาวน์โหลด';
+$lang['Edit'] = 'แก้ไข';
+$lang['Hello %s,'] = 'สวัสดี %s,';
+$lang['Search by date'] = 'ค้นหาตามวัน';
+$lang['Search for any term'] = 'ค้นหาคำใด ๆ';
+$lang['Send my connection settings by email'] = 'ส่งการตั้งค่าการเชื่อมต่อของฉันโดยทางอีเมล์';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'การลงทะเบียนสำเร็จแล้ว, และคุณจะได้รับอีเมลที่มีการตั้งค่าการเชื่อมต่อของคุณ ยินดีต้อนรับ!';
+$lang['Username modification'] = 'การปรับเปลี่ยนชื่อผู้ใช้';
+$lang['Your username has been successfully changed to : %s'] = 'ชื่อผู้ใช้งานคุณได้ถูกเปลี่ยนเป็น : %s เรียบร้อยแล้ว';
+$lang['square'] = 'สี่เหลี่ยม';
+$lang['thumb'] = 'ภาพตัวอย่าง';
+$lang['small'] = 'เล็ก';
+$lang['medium'] = 'กลาง';
+$lang['large'] = 'ใหญ่';
+$lang['xlarge'] = 'ใหญ่กว่า';
+$lang['xxlarge'] = 'ใหญ่มาก';
+$lang['Original'] = 'ขนาดดั้งเดิม';
+$lang['Thank you for registering at %s!'] = 'ขอบคุณสำหรับการลงทะเบียนที่ %s!';
+$lang['Here are your connection settings'] = 'นี่คือการตั้งค่าการเชื่อมต่อของคุณ';
+$lang['Password: %s'] = 'รหัสผ่าน: %s';
+$lang['Username: %s'] = 'ชื่อผู้ใช้งาน: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'ถ้าคุณไม่ได้รับอีเมล์ หรือหากได้รับอีเมล์ที่ไม่ถูกต้อง, โปรดติดต่อเราที่ %s';
+
+?>
Index: tags/2.4.0RC3/language/th_TH/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/th_TH/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = "การติดตั้ง";
+$lang['Basic configuration'] = "การตั้งค่าพื้นฐาน";
+$lang['Default gallery language'] = "กำหนดภาษาพื้นฐานสำหรับแกลลอรี่";
+$lang['Database configuration'] = "การตั้งค่าฐานข้อมูล";
+$lang['Admin configuration'] = "การตั้งค่าผู้ดูแลระบบ";
+$lang['Start Install'] = "เริ่มการติดตั้ง";
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = "ที่อยู่อีเมลจะต้องมีลักษณะ xxx@yyy.eee (ตัวอย่าง : jack@altern.org)";
+$lang['Webmaster login'] = "ชื่อเข้าสู่ระบบ";
+$lang['It will be shown to the visitors. It is necessary for website administration'] = "มันจะแสดงส่วนนี้ไปยังผู้เยี่ยมชม. ซึ่งมันจำเป็นสำหรับผู้ดูแลระบบของเว็บไซต์";
+$lang['Connection to server succeed, but it was impossible to connect to database'] = "เชื่อมต่อเซิร์ฟเวอร์เรียบร้อยแล้ว, แต่ไม่สามารถเชื่อมต่อฐานข้อมูลได้";
+$lang['Can\'t connect to server'] = "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้";
+$lang['Host'] = "เซิร์ฟเวอร์";
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = "ตัวอย่าง localhost, sql.multimania.com, toto.freesurf.fr";
+$lang['User'] = "ชื่อผู้ใช้งาน";
+$lang['user login given by your host provider'] = "ชื่อผู้ใช้งานจะได้รับจากผู้ให้บริการเซิร์ฟเวอร์";
+$lang['Password'] = "รหัสผ่าน";
+$lang['user password given by your host provider'] = "รหัสผ่านของผู้ใช้งานจะได้รับจากผู้ให้บริการเซิร์ฟเวอร์";
+$lang['Database name'] = "ชื่อฐานข้อมูล";
+$lang['also given by your host provider'] = "ซึ่งจะได้รับจากผู้ให้บริการเซิร์ฟเวอร์ของคุณ";
+$lang['Database table prefix'] = "คำนำหน้าตารางฐานข้อมูล";
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = "ชื่อฐานข้อมูลจะถูกกำกับด้วยคำนำหน้าตารางฐานข้อมูล ที่คุณได้กำหนดไว้  (หากคุณกำหนดไว้ มันจะง่ายต่อการจัดการฐานข้อมูล)";
+$lang['enter a login for webmaster'] = "กำหนดชื่อในการเข้าสู่ระบบสำหรับเว็บมาสเตอร์";
+$lang['webmaster login can\'t contain characters \' or "'] = "ชื่อเข้าสู่ระบบจะต้องไม่ประกอบด้วยเครื่องหมาย ' หรือ \"";
+$lang['please enter your password again'] = "กรุณากรอกรหัสผ่านอีกครั้ง";
+$lang['Webmaster password'] = "รหัสผ่าน";
+$lang['Keep it confidential, it enables you to access administration panel'] = "โปรดเก็บไว้เป็นความลับ, เพราะมันสามารถใช้เพื่อเข้าถึงหน้าการจัดการระบบ Piwigo แกลลอรี่ ของคุณได้";
+$lang['Password [confirm]'] = "รหัสผ่าน [ยืนยัน]";
+$lang['verification'] = "การยืนยัน";
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = "ต้องการความช่วยเหลือ? โปรดถามคำถามไว้ได้ที่ <a href=\"%s\">บอร์ดข้อความของ Piwigo</a>.";
+$lang['Webmaster mail address'] = "ที่อยู่อีเมล";
+$lang['Visitors will be able to contact site administrator with this mail'] = "ผู้เยี่ยมชมจะสามารถที่จะใช้อีเมลนี้ เพื่อติดต่อกับผู้ดูแลระบบได้";
+$lang['PHP 5 is required'] = "PHP 5 จำเป็นต้องมี";
+$lang['It appears your webhost is currently running PHP %s.'] = "มันจะแสดงบนเวิร์ฟเวอร์ที่คุณใช้งานอยู่ ซึ่งคุณใช้งานอยู่บน PHP %s.";
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = "Piwigo อาจจะลองปรับการตั้งค่าของคุณไปยัง PHP 5 โดยการสร้างหรือแก้ไขปรับแต่งไฟล์ .htaccess.";
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = "จำไว้ว่า คุณสามารถเปลี่ยนแปลงการตั้งค่าในภายหลังได้ด้วยตนเอง.";
+$lang['Try to configure PHP 5'] = "ลองตั้งค่า PHP 5 ใหม่";
+$lang['Sorry!'] = "เสียใจ!";
+$lang['Piwigo was not able to configure PHP 5.'] = "Piwigo ไม่สามารถตั้งค่า PHP 5. ได้";
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = "คุณควรติดต่อไปยังผู้ให้บริการเซิร์ฟเวอร์ของคุณเพื่อสอบถามว่า เซิร์ฟเวอร์ดังกล่าวนี้สนับสนุนการทำงานของ PHP 5 หรือว่าคุณสามารถสลับไปใช้งาน PHP 5 ด้วยตนเอง ได้หรือไม่อย่างไร.";
+$lang['Hope to see you back soon.'] = "หวังว่าจะได้เจอคุณเร็วๆ นี้.";
+$lang['Congratulations, Piwigo installation is completed'] = 'ยินดีด้วย, การติดตั้ง Piwigo ได้ดำเนินการเสร็จเรียบร้อยแล้ว';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'คัดลอกข้อความในกล่องข้อความด้านล่าง เพื่อนำไปวางในไฟล์ "local/config/database.inc.php" (ข้อควรระวัง : ไฟล์ database.inc.php จะต้องเป็นข้อความที่ได้คัดลอกจากภายในกล่องข้อความเท่านั้น, จะต้องไม่มีบรรทัดเกิน หรืออักขระว่าง)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'การสร้างไฟล์ตั้งค่า local/config/database.inc.php ล้มเหลว.';
+$lang['Download the config file'] = 'ดาวน์โหลดไฟล์ตั้งค่า';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'คุณสามารถดาวน์โหลดไฟล์ตั้งค่า และอัพไปไว้ยังไดเรกทอรี่ local/config ของ Piwigo.';
+$lang['Just another Piwigo gallery'] = 'เพียงแค่ Piwigo แกลลอรี่ เว็บหนึ่ง';
+$lang['Welcome to my photo gallery'] = 'ยินดีต้อนรับสู่แกลลอรี่รูปภาพของฉัน';
+?>
Index: tags/2.4.0RC3/language/th_TH/iso.txt
===================================================================
--- tags/2.4.0RC3/language/th_TH/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+ภาษาไทย [TH]
Index: tags/2.4.0RC3/language/th_TH/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/th_TH/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/th_TH/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,43 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2011 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Upgrade'] = "อัพเกรด";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "หน้านี้คือ หน้าการอัพเกรดฐานข้อมูลจาก Piwigo เวอร์ชั่นเก่าของคุณ ไปยังเวอร์ชั่นใหม่. ซึ่งการอัพเกรดจะทำให้ ระบบ Piwigo แกลลอรี่ ของคุณเป็นปัจจบัน หรือเป็นการใช้งานบนเวอร์ชั่นที่ถูก <strong>ปล่อย %s</strong> (หรือ เทียบเท่า).";
+$lang['Upgrade from version %s to %s'] = "อัพเกรดจากเวอร์ชั่น %s ไปยัง %s";
+$lang['Statistics'] = "สถิติ";
+$lang['total upgrade time'] = "ระยะเวลาการอัพเกรดทั้งหมด";
+$lang['total SQL time'] = "เวลา SQL ทั้งหมด";
+$lang['SQL queries'] = "SQL queries";
+$lang['Upgrade informations'] = "ข้อมูลการอัพเกรด";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "การปรับปรุงระบบโปรดตรวจสอบใน [การจัดการระบบ>เครื่องมือ>การปรับปรุง] หากคุณพบปัญหาใดๆ ในการอัพเกรด.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "โปรดระมัดระวัง, ปลั๊กอินที่คุณใช้งานอยู่ได้ถูกยกเลิกการใช้งานแล้ว. คุณจะต้องตรวจสอบก่อนการอัพเกรดปลั๊กอิน:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "สำหรับผู้ดูแลระบบเท่านั้นที่สามารภทำการอัพเกรดระบบได้: โปรดเข้าสู่ระบบด้านล่าง.";
+$lang['You do not have access rights to run upgrade'] = "คุณไม่ได้เข้าถึงการอัพเกรดอย่างถูกต้อง";
+$lang['All sub-albums of private albums become private'] = "อัลบั้มย่อยทั้งหมดของอัลบั้มส่วนตัว จะกลายเป็นอัลบั้มส่วนตัว";
+$lang['User permissions and group permissions have been erased'] = "การอนุญาตให้สิทธฺ์ของผู้ใช้งานและกลุ่มจะถูกลบ";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "รูปภาพขนาดย่อ คำนำหน้าของรูปภาพขนาดย่อ และที่อยู่เมลของเว็บมาสเตอร์เท่านั้นที่จะได้ถูกบันทึกจากการตั้งค่าครั้งก่อน";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'ใน <i>%s</i>, ก่อน <b>?></b>, ใส่:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'โปรดระมัดระวัง, ธีมที่คุณใช้งานอยู่ได้ถูกยกเลิกการใช้งานแล้ว. คุณจะต้องตรวจสอบก่อนการอัพเกรดธีม:';
+?>
Index: tags/2.4.0RC3/language/tr_TR/about.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/about.html	(revision 14585)
@@ -0,0 +1,5 @@
+<p>Bu resim galerisi Piwigo kullanılarak oluşturulmuştur.</p>
+
+<p>Piwigo web için tasarlanan bir resim galerisi yazılımıdır, kullanıcı ve gelistiricilerden oluşan aktif bir topluluk tarafından hazırlanmıştır. Eklentiler sayesinde Piwigo kolaylıkla kişiselleştirilebilir. Piwigo'nun tamamen ücretsiz olması ve açik kaynak kodlu (geliştirilebilir) bir yapısı olması da cabası..</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Daha fazla bilgi için Piwigo'nun Web sitesini ziyaret edin!</a></p>
Index: tags/2.4.0RC3/language/tr_TR/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/tr_TR/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/admin.lang.php	(revision 14585)
@@ -0,0 +1,893 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['... or '] = '... veya ';
+$lang[' and %d virtual'] = ' ve %d sanal';
+$lang['%d album including'] = '%d albüm dahil';
+$lang['%d album moved'] = '%d albüm taşındı';
+$lang['%d albums including'] = '%d albümler dahil';
+$lang['%d albums moved'] = '%d albümler taşındı';
+$lang['%d anomalies have been detected.'] = '%d anormallikler tespit edildi.';
+$lang['%d anomalies have been detected corrected.'] = '%d anormallikler tespit edildi ve düzeltildi.';
+$lang['%d anomalies have been ignored.'] = '%d anormallikler yok sayıldı.';
+$lang['%d anomalies have not been corrected.'] = '%d anormallikler düzeltilemedi.';
+$lang['%d anomaly has been corrected.'] = '%d anormallik düzeltildi.';
+$lang['%d anomaly has been detected.'] = '%d anormallik tespit edildi.';
+$lang['%d anomaly has been ignored.'] = '%d anormallik yok sayıldı.';
+$lang['%d anomaly has not been corrected.'] = '%d anormallik düzeltilemedi.';
+$lang['%d association'] = '%d baglantı';
+$lang['%d associations'] = '%d baglantılar';
+$lang['%d group'] = '%d grup';
+$lang['%d groups'] = '%d gruplar';
+$lang['%d guest'] = '%d Misafir';
+$lang['%d guests'] = '%d Misafirler';
+$lang['%d line filtered'] = '%d satır filtre edildi';
+$lang['%d lines filtered'] = '%d satırlar filtre edildi';
+$lang['%d mail was not sent.'] = '%d posta gönderilemedi.';
+$lang['%d mail was sent.'] = '%d posta gönderildi.';
+$lang['%d mails were not sent.'] = '%d postalar gönderilemedi.';
+$lang['%d mails were sent.'] = '%d postalar gönderildi.';
+$lang['%d member'] = '%d üye';
+$lang['%d members'] = '%d üyeler';
+$lang['%d of %d photos selected'] = '%d resim seçildi %d resimden';
+$lang['%d parameter was updated.'] = '%d parametre güncellendi.';
+$lang['%d parameters were updated.'] = '%d parametreler güncellendi.';
+$lang['%d photo was deleted'] = '%d resim silindi';
+$lang['%d photos uploaded'] = '%d resimler yüklendi';
+$lang['%d photos were deleted'] = '%d resimler silindi';
+$lang['%d physical'] = ' %d fiziksel';
+$lang['%d tag'] = '%d etiket';
+$lang['%d tags'] = '%d etiketler';
+$lang['%d user comment rejected'] = '%d kullanıcı yorumu reddedildi.';
+$lang['%d user comment validated'] = '%d kullanıcı yorumu onaylandi';
+$lang['%d user comments rejected'] = '%d kullanıcı yorumlari reddedildi';
+$lang['%d user comments validated'] = '%d kullanıcı yorumlari onaylandi';
+$lang['%d user deleted'] = '%d kullanıcı silindi';
+$lang['%d user was not updated.'] = '%d kullanıcı güncellenemedi.';
+$lang['%d user was updated.'] = '%d kullanıcı güncellendi.';
+$lang['%d user'] = '%d kullanıcı';
+$lang['%d users deleted'] = '%d kullanıcılar silindi';
+$lang['%d users were not updated.'] = '%d kullanıcılar güncellenemedi.';
+$lang['%d users were updated.'] = '%d kullanıcılar güncellendi.';
+$lang['%d users'] = '%d kullanıcılar';
+$lang['%d waiting for validation'] = '%d onay bekleniyor';
+$lang['%s has been successfully updated.'] = '%s başarıyla güncellendi.';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s false olarak ayarlanmalı /config/config.inc.php dosyası içinde';
+$lang['%s photos can not be regenerated'] = '%s resimler oluşturulamadı';
+$lang['%s photos have been regenerated'] = '%s resimler oluşturuldu';
+$lang['%s value is not correct file because exif are not supported'] = '%s exif desteklenmez çünkü değeri yanlış';
+$lang['(this tag will be deleted)'] = '(bu etiket silinecek)';
+$lang['+ Add an upload box'] = '+ Bir yükleme kutusu ekleyin';
+$lang[', click on'] = ', tiklayiniz';
+$lang['[%s] Visit album %s'] = '[%s] albümü gez%s';
+$lang['[NBM] Problems or questions'] = 'Sorunlar veya sorular';
+$lang['A new version of Piwigo is available.'] = 'Piwigo yeni bir sürümü mevcut.';
+$lang['Access type'] = 'Erisim türü';
+$lang['ACCESS_0'] = 'Ücretsiz erişim';
+$lang['ACCESS_1'] = 'Herkese erişim';
+$lang['ACCESS_2'] = 'Kayıtlı kullanıcılara erişim';
+$lang['ACCESS_3'] = 'Adminlere erişim';
+$lang['ACCESS_4'] = 'Site töneticilerine erişim';
+$lang['ACCESS_5'] = 'Erişim yok';
+$lang['Action'] = 'Eylem';
+$lang['Actions'] = 'Aksiyonlar';
+$lang['Activate icon "%s"'] = 'Aktifleştir simge "%s"';
+$lang['Activate icon "new" next to albums and pictures'] = 'Resimlerin yanındaki "yeni" simgesini etkinleştir';
+$lang['Activate Navigation Bar'] = 'Gezinti çubuğunu aktiflestir';
+$lang['Activate Navigation Thumbnails'] = 'Küçük resimler gezinti çubuğunu aktiflestir';
+$lang['Activate'] = 'Aktif';
+$lang['Active Languages'] = 'Aktif Diller';
+$lang['Active Plugins'] = 'Aktif Eklentiler';
+$lang['Active Themes'] = 'Aktif temalar';
+$lang['Add a criteria'] = 'Kriter ekle';
+$lang['Add a filter'] = 'Filtre ekle';
+$lang['Add a tag'] = 'Etiket ekle';
+$lang['Add a user'] = 'Kullanıcı ekle';
+$lang['Add a virtual album'] = 'sanal albüm ekle';
+$lang['Add another set of photos'] = 'Başka bir resim seti ekleyin';
+$lang['Add detailed content'] = 'Bazi detayli içerik ekleyin';
+$lang['Add group'] = 'Grup ekle';
+$lang['Add New Language'] = 'Yeni bir dil ekle';
+$lang['add new photos to caddie'] = 'Yardımcıya yeni elemanlar ekle';
+$lang['Add New Theme'] = 'Yeni bir tema ekle';
+$lang['Add Photos'] = 'Resim ekle';
+$lang['Add tags'] = 'Etiket ekle';
+$lang['Add to caddie'] = "Yardımcıya ekle";
+$lang['Add write access to the "%s" directory'] = 'Yazma erişimi ekle "%s" dizinine';
+$lang['Add'] = 'Ekle';
+$lang['Add/delete a permalink'] = 'Kalıcı Bağlantı ekle / sil';
+$lang['added'] = 'eklendi';
+$lang['Administration Home'] = 'Yönetim Ana sayfa';
+$lang['Advanced features'] = 'Gelişmiş özellikler';
+$lang['Album "%s" has been added'] = 'kategori "%s" eklendi';
+$lang['Album "%s" now contains %d photos'] = 'kategori "%s" şimdi %d resimlerini içeriyor';
+$lang['Album list management'] = 'Albümler yönetimi';
+$lang['Album manual order was saved'] = 'Albümlerin sıralaması kayıt edildi';
+$lang['Album name'] = 'Albüm ismi';
+$lang['Album photos associated to the following albums: %s'] = 'Albüm fotoğrafları aşağıdaki albümlerle ilişkilendirildi: %s';
+$lang['Album updated successfully'] = 'Albüm bilgileri güncellendi.';
+$lang['albums added in the database'] = 'veri tabanına eklenen albümler';
+$lang['Albums authorized thanks to group associations'] = 'Albümler grup sayesinde yetkili';
+$lang['Albums automatically sorted'] = 'Albümler otomatik olarak sıralandı';
+$lang['albums deleted in the database'] = 'veri tabanından silinen albümler';
+$lang['All %d photos are selected'] = 'Bütün %d resimler seçildi';
+$lang['All extensions are up to date.'] = 'Tüm eklentiler günceldir.';
+$lang['All languages are up to date.'] = 'Bütün diller güncel.';
+$lang['All optimizations have been successfully completed.'] = 'Tüm optimizasyonları başarıyla tamamlanmıştır.';
+$lang['All plugins are up to date.'] = 'Bütün eklentiler güncel.';
+$lang['All themes are up to date.'] = 'Bütün temalar güncel.';
+$lang['all'] = 'tüm';
+$lang['Allow rating'] = 'Puanlamaya izin ver';
+$lang['Allow user customization'] = 'Kullanıcı özelleştirme izin ver';
+$lang['Allow user registration'] = 'Kullanıcı kaydına izin ver';
+$lang['Allow users to delete their own comments'] = 'Kullanıcıların kendi yorumlarını silmesine izin ver';
+$lang['Allow users to edit their own comments'] = 'Kullanıcıların kendi yorumlarını düzenlemesine izin ver';
+$lang['Allowed file types: %s.'] = 'İzin verilen dosya türleri: %s.';
+$lang['an error happened'] = 'Bir hata olustu';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Çıkarma sırasında bir hata oluştu. Lütfen Piwigo kurulum dosya izinlerini kontrol ediniz.<br><a href="%s">Hataları göstermek için buraya tıklayın</a>.';
+$lang['An error has occured during upgrade.'] = 'Yükseltme sırasında bir hata oluştu.';
+$lang['An error occured during extraction (%s).'] = '(%s) dosyaları ayıklanırken hata oluştu.';
+$lang['An information email was sent to group "%s"'] = 'Bilgi e-postası "%s" grubuna gönderildi';
+$lang['and'] = 've';
+$lang['Anomaly'] = 'Aykırılık';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Bu sekmeyi sadece site yöneticisi görebilir diger yöneticiler degil göremez. ';
+$lang['Apply action'] = 'Eylemi onayla';
+$lang['Apply selected corrections'] = 'Seçilen düzeltmeleri uygula';
+$lang['Apply to sub-albums'] = 'altalbümlere uygula';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Yaklaşık maksimum çözünürlük: %dM pixel (%dx%d pixel).';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Bu yükseltmeyi yüklemek istediğinizden emin misiniz?Bu sürüm öncesinde kaldırma ihtiyacı olmadığını doğrulamalısınız';
+$lang['Are you sure you want to delete this plugin?'] = 'Bu eklentiyi sileceğinizden emin misiniz?';
+$lang['Are you sure you want to install this plugin?'] = 'Bu eklentiyi kuracağınızdan emin misiniz?';
+$lang['Associate to album'] = 'bağla albüme';
+$lang['associate to group'] = 'Gruba iliskilendirmek';
+$lang['Associated'] = 'baglantili';
+$lang['Authorize users to add comments on selected albums'] = 'Kullanıcıları seçilen albümler için yorum yapmaya yetkilendir';
+$lang['Authorized'] = 'Yetkili';
+$lang['Automatic correction'] = 'Otomatik düzeltme';
+$lang['automatic order'] = 'otomatik sıralama';
+$lang['Available only with HTML format'] = 'Sadece HTML formatinda kullanilabilir';
+$lang['Average rate'] = 'Ortalama derecelendirme';
+$lang['average time'] = 'ortalama süre';
+$lang['Batch Manager'] = 'Küme Yöneticisi';
+$lang['between'] = 'arasinda';
+$lang['Bound Theme'] = 'Yükümlü tema';
+$lang['By %s'] = 'Tarafından %s';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Varsayılan olarak, Piwiho HD (yüksek çözünürlük) resimleri için yeni bir web boyutu oluşturacak.';
+$lang['By rank'] = 'Rütbece';
+$lang['Caddie management'] = 'yardımcı yönetimi';
+$lang['Caddie'] = 'Yardımcı';
+$lang['Can\'t connect to server.'] = 'Sunucuya bağlantı imkansız.';
+$lang['Can\'t create temporary file.'] = 'Geçici dosya oluşturulamadı.';
+$lang['Can\'t download archive.'] = 'Arşiv yüklenemedi.';
+$lang['Can\'t read or extract archive.'] = 'Arşiv okunamadı veya ayıklanamadı.';
+$lang['Cannot delete the old permalink !'] = 'Eski Kalıcı Bağlantı silinemez!';
+$lang['Change Admin Colors'] = 'Yönetim sayfa renk değişimi';
+$lang['Check all'] = 'Hepsini işaretle';
+$lang['Check automatic corrections'] = 'Otomatik düzeltme kontrol et';
+$lang['Check for updates'] = 'Güncellemeyi dene';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Güncelleme denetimi sonuçlanamıyor, Yaptığınız işlem basarısız oldu..';
+$lang['Check for upgrade'] = 'Güncellemelere bak';
+$lang['Check integrity'] = 'Bütünlüğünü kontrol';
+$lang['Choose an action'] = 'Eylem seçiniz';
+$lang['Choose an option'] = 'Bir seçenek seç';
+$lang['Classic display'] = 'Klasik ekran';
+$lang['clean'] = 'Temizle';
+$lang['Comments for all'] = 'Hepsine yorum yap';
+$lang['Complementary mail content'] = 'Tamamlayici posta içerigini';
+$lang['Configuration'] = 'Yapılandırma';
+$lang['Confirm merge'] = 'birleştirmeyi onaylayın';
+$lang['confirm'] = 'Onayla';
+$lang['Continue processing treatment'] = 'Isleme devam ediniz';
+$lang['Correction applied with error'] = 'Düzeltme hata ile uygulandı';
+$lang['Correction applied with success'] = 'Düzeltme başarıyla uygulandı';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Düzeltilmiş anormallik artık yok sayılır';
+$lang['Correction'] = 'Düzeltme';
+$lang['create a new album'] = 'yeni bir albüm oluştur';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Yeni bir siteyarat: () URL\'sine create_listing_file.php adi ver';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Bir "%s" dizini açınız Piwigo kurduğunuz yerde.';
+$lang['Create this site'] = 'Siteyi olustur';
+$lang['Create'] = 'Oluştur';
+$lang['created'] = 'yaratildi';
+$lang['Crop'] = 'Kes';
+$lang['Current name'] = 'Geçerli isim';
+$lang['Database synchronization with files'] = 'Dosya ile veritabani senkronize';
+$lang['Database'] = 'Veritabanı';
+$lang['Date'] = 'Tarih';
+$lang['Day'] = 'Gün';
+$lang['Deactivate all'] = 'Hepsini etkisizleştir';
+$lang['Deactivate'] = 'Devre dışı bırak';
+$lang['Default display'] = 'Varsayilan görüntü';
+$lang['Default photos order'] = 'Varsayılan resim düzeni';
+$lang['Default user cannot be deleted'] = 'Varsayılan kullanıcı silinemez';
+$lang['Default user does not exist'] = 'Varsayılan kullanıcı yok';
+$lang['default values'] = 'varsayılan değerler';
+$lang['default'] = 'Varsayılan';
+$lang['delete album'] = 'albümüsil';
+$lang['Delete orphan tags'] = 'etkisiz etiketleri sil';
+$lang['delete photo'] = 'resimi sil';
+$lang['Delete Representant'] = 'Temsilciyi Sil';
+$lang['Delete selected photos'] = 'Seçili resimleri sil';
+$lang['Delete selected tags'] = 'Seçilen etiketleri sil';
+$lang['Delete selected users'] = 'Seçilen kullanıcılari sil';
+$lang['Delete this language'] = 'Bu dili sil';
+$lang['delete this site and all its attached elements'] = 'bu siteyi ve eklenen tüm içerigi sil';
+$lang['Delete this theme'] = 'Bu temayı sil';
+$lang['delete'] = 'sil';
+$lang['Deleted on'] = 'Silindi';
+$lang['deleted'] = 'silindi';
+$lang['Deletions'] = 'Silinenler';
+$lang['Deny selected groups'] = 'seçilen grubu reddet';
+$lang['Deny selected users'] = 'seçilen kullanıcılari reddet.';
+$lang['Description'] = 'Tanım / açıklama';
+$lang['Detailed informations'] = 'Detaylı bilgi';
+$lang['directories + files'] = 'dizinler + resimler';
+$lang['Directory does not exist'] = 'Dizin yok';
+$lang['Directory'] = 'Dizin';
+$lang['Discover album:'] = 'Albümü tanı:';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'En fazla bilgileri göster (eklenen albümler resimler, silinen albümler resimler)';
+$lang['Display options'] = 'Görüntü özellikleri';
+$lang['display'] = 'göster';
+$lang['Dissociate from album'] = 'albümden ayır';
+$lang['dissociate from group'] = 'Gruptan ayirmak';
+$lang['Dissociated'] = 'Ayrismis';
+$lang['Do you want to activate anyway?'] = 'Yine de etkinleştirmek istiyor musunuz?';
+$lang['Documentation'] = 'Belgeler';
+$lang['Does not represent'] = 'Temsil edilmiyor / Karsiligi yok';
+$lang['Download,'] = 'indir,';
+$lang['Downloads'] = 'İndirilecekler';
+$lang['Drag to re-order'] = 'Tıkla ve sürükle yeniden yapılandır';
+$lang['Drop into album'] = 'albüm içine bırak';
+$lang['Dump Database'] = 'Vertitabanını sil';
+$lang['Duplicates'] = 'kopyalar';
+$lang['Edit album permissions'] = 'albüm yetkilerini düzenle';
+$lang['Edit album'] = 'Albüm düzenle';
+$lang['Edit photo information'] = 'Resim bilgilerini düzenle';
+$lang['Edit ranks'] = 'Rütbeleri yönet';
+$lang['Edit selected tags'] = 'Seçilen etiketleri degiştir';
+$lang['Edit tags'] = 'etiketleri degiştir';
+$lang['Element type'] = 'Eleman türü';
+$lang['Element'] = 'Eleman';
+$lang['Email administrators when a comment is deleted'] = 'Yöneticilere yorum silindiği zaman e-posta yolla.';
+$lang['Email administrators when a comment is modified'] = 'Yöneticilere yorum düzenlendiği zaman e-posta yolla.';
+$lang['Email admins when a comment requires validation'] = 'Yorum onayı oldugunda yöneticiye e-posta gönder';
+$lang['Email admins when a new user registers'] = 'Yeni kullanıcı kaydı oldugunda yöneticiye e-posta gönder';
+$lang['Email admins when a valid comment is entered'] = 'Yeni yorum eklendiginde yöneticiye e-posta gönder';
+$lang['email'] = 'E-Posta';
+$lang['Environment'] = 'Ortam / Çevre';
+$lang['Error list'] = 'Hataların Listesi';
+$lang['Error on file "%s" : %s'] = 'Hata dosyada "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = 'E-Posta gönderirken hata %s [%s].';
+$lang['ERROR'] = 'HATA';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'Hata: Bu eklenti eksik, ama yüklenmiş. Lütfen siliniz.';
+$lang['Errors caption'] = 'Hataların başlıkları';
+$lang['errors during synchronization'] = 'Senkronizasyon sırasında hatalar';
+$lang['even already synchronized photos'] = 'hatta elemanlar senkronize edildi';
+$lang['Everybody'] = 'Herkes';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Yürütme zaman asimi, islem devam etmeli [Tahmini zaman: %d saniye].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Yürütme zaman asimi, islem devam etmeli [Tahmini zaman: %d saniye].';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif eklentisi hazır değil, yönetici exif hizmet dışı bırakmalı';
+$lang['existing album'] = 'olan albüm';
+$lang['Extend for templates'] = 'Şablonları genişlet';
+$lang['Extensions Update'] = 'Eklentiler Güncellemesi';
+$lang['Failed to write file to disk'] = 'Dosya diske yazılamadı';
+$lang['File upload stopped by extension'] = 'Dosya yükleme Ek tarafından durduruldu';
+$lang['File'] = 'Dosya';
+$lang['File/directory read error'] = 'Dosya / dizin okuma hatası';
+$lang['Find a new representant by random'] = 'Rasgele yeni bir temsilci bul';
+$lang['first photo added on %s'] = 'Ilk içerigin eklenme zamani %s';
+$lang['Follow Orientation'] = 'Oryantasyonu takip edin';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Aşağıdaki eklentiler Piwigo yeni sürümü ile uyumlu olmayabilir:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Aşağıdaki temalar Piwigo yeni sürümü ile uyumlu olmayabilir:';
+$lang['for the file format'] = 'dosya biçimi için';
+$lang['for this file format'] = 'Bu dosya biçimi için';
+$lang['Forbid this language to users'] = 'Kullanıcılar için bu dili yasakla';
+$lang['Forbid this theme to users'] = 'Bu temayı kullanıcılara yasakla';
+$lang['Forbidden'] = 'Yasaklanmis';
+$lang['Form'] = 'Biçim';
+$lang['FTP + Synchronization'] = 'FTP + Senkronizasyon';
+$lang['Gallery title'] = 'Galleri Başlığı';
+$lang['GD library is missing'] = 'GD arşivi eksik';
+$lang['GD version'] = 'GD sürümü';
+$lang['General statistics'] = 'Genel istatistik';
+$lang['Get Support on Piwigo Forum'] = 'Piwigo forum destek alın';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Yetki veriniz (chmod 777) "%s" dizinine chmod 777 yapınız Piwigo kurduğunuz yerde';
+$lang['global mode'] = 'Küresel mod';
+$lang['Go to %s or %s for more informations'] = 'Daha fazla bilgi için %s veya %s';
+$lang['Go to'] = 'Git';
+$lang['Grant selected groups'] = 'Seçilen grupların kabulu';
+$lang['Grant selected users'] = 'Seçilen kullanıcıların kabulu';
+$lang['Graphics Library'] = 'Grafik Arşivi';
+$lang['group "%s" added'] = 'Grup "%s" eklendi';
+$lang['group "%s" deleted'] = 'Grup "%s" silindi';
+$lang['group "%s" updated'] = 'Grup "%s" güncellendi';
+$lang['Group management'] = 'Grup yönetimi';
+$lang['Group name'] = 'Grup Adı';
+$lang['Group'] = 'Grup';
+$lang['Groups'] = 'Gruplar';
+$lang['Guest cannot be deleted'] = 'Misafir silinemez';
+$lang['Guest Settings'] = 'Misafir ayarları';
+$lang['guest'] = 'Misafir';
+$lang['Guests'] = 'Ziyaretçiler';
+$lang['height must be a number superior to'] = 'yüksekligi bir sayi olmali';
+$lang['Height'] = 'Yükseklik';
+$lang['Hello'] = 'Merhaba';
+$lang['Hello,'] = 'Merhaba,';
+$lang['Help Me'] = 'Bana yardım edin';
+$lang['hide details'] = 'ayrıntıları gizle';
+$lang['Hide'] = 'Gizle';
+$lang['High definition enabled'] = 'Yüksek çözünürlüklü etkin';
+$lang['High definition'] = 'Yüksek çözünürlüklü';
+$lang['high'] = 'Yüksek';
+$lang['History'] = 'Geçmis';
+$lang['Hit'] = 'Tıklanma';
+$lang['Hour'] = 'Saat';
+$lang['Hoverbox display'] = 'Hoverbox ekran';
+$lang['I decide to update anyway'] = 'Güncellemeye karar verdim';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Eğer HD yoksa ve geçerli web boyutu yeniden boyutlandırma ölçülerinden büyük ise, Piwigo bu resmi HD olarak algılayacak ve yeni bir web boyutu oluşturacaktır.';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Eger sorun yasarsaniz ya da herhangi bir soruniz var ise, bir mesaj gönderiniz';
+$lang['Ignore All'] = 'Tümünü Yoksay';
+$lang['Ignore selected anomalies'] = 'Seçilen anormallikleri yoksay';
+$lang['Ignore this update'] = 'Bu güncellemeyi görmezden gel';
+$lang['Image id'] = 'Resim id';
+$lang['Image Quality'] = 'Resim kalitesi';
+$lang['Images manual order was saved'] = 'Resimlerin elle sırlandırılması kayıt edildi';
+$lang['Impossible automatic correction'] = 'Otomatik düzeltme imkansız';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ana tema eksik olduğundan bu tema, aktif olamazdı: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Bu dili devre dışı bırakmak imkansız, önce varsayılan olarak başka bir dil ayarla.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'İmkansız bu dili devre dışı bırakmak için, en az bir dil gerekir.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Bu tema devreden çıkarmak imkansız, en az bir tema gerekir.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Bu tema, silinemez çünkü diğer temalar buna bağlı %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'php.ini dosyasındaki upload_max_filesize (%sB),  post_max_size (%sB) den daha büyük bu ayarı değiştirmelisin.';
+$lang['Inactive Languages'] = 'Aktif olmayan diller';
+$lang['Inactive Plugins'] = 'Aktif olmayan Eklentiler';
+$lang['Inactive Themes'] = 'Aktif olmayan temalar';
+$lang['include child albums'] = 'alt albümler dahil';
+$lang['Include display of recent photos grouped by dates'] = 'Son resimleri tarihlerine göre gruplandirilmis görüntülenecek';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Geçmiş verileri dahil et (UYARI: sunucu belleği sınırı aşılabilir)';
+$lang['Information data registered in database'] = 'Bilgilerin veritabaninda kayitli';
+$lang['Informations'] = 'Bilgiler';
+$lang['Install on your computer,'] = 'Bilgisayarınızda yükleyin,';
+$lang['Install'] = 'Kur';
+$lang['Installed Languages'] = 'Yüklü Diller';
+$lang['Installed Themes'] = 'Yüklenen temalar';
+$lang['Instructions to use Piwigo'] = 'Piwigo kullanma talimatları';
+$lang['Invert'] = 'Ters çevir';
+$lang['IP'] = 'İp';
+$lang['jump to album'] = 'albüme geç';
+$lang['jump to photo'] = 'Resime geç';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Piwigo proje ile temas halinde olun.Piwigo Duyuru Haber Bülteni\'ne abone olun.Ne zaman yeni bir sürüm (bazen bir güvenlik veya hata çözümü dahil) ve önemli olaylar, projeye ne olduğunu anlatan e-postalar alacaksınız, önemli olan bilmek ve yükseltmek.Sadece yılda bir kaç e-posta.';
+$lang['Language has been successfully installed'] = 'Dil başarıyla yüklendi';
+$lang['Languages which need upgrade'] = 'Güncellenmesi gereken diller';
+$lang['Languages'] = 'Diller';
+$lang['Last hit'] = 'En son ziyaret';
+$lang['Last import'] = 'Son içe aktarma';
+$lang['Last revisions'] = 'Son revizyonlar';
+$lang['Last send'] = 'Son gönderilen';
+$lang['Learn more'] = 'Daha fazla bilgi edinin';
+$lang['leave'] = 'Ayril';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Tanıdıklar';
+$lang['Level 2'] = 'Arkadaşlar';
+$lang['Level 4'] = 'Aile';
+$lang['Level 8'] = 'Yöneticiler';
+$lang['Link all album photos to a new album'] = 'Bütün albüm resimlerini yeni albümü bağla';
+$lang['Link all album photos to some existing albums'] = 'Bütün albüm resimlerini olan albümlere bağla';
+$lang['Linked albums'] = 'bağlanan albümler';
+$lang['Local'] = 'Yerel';
+$lang['Lock albums'] = 'albümlerikilitle';
+$lang['Lock gallery'] = 'galeriyi kilitle';
+$lang['Lock'] = 'Kilit';
+$lang['Locked'] = 'Kilitlendi';
+$lang['Mail address is obligatory for all users'] = 'Posta adresi tüm kullanıcılar için zorunludur';
+$lang['Mail content'] = 'Posta içeriği';
+$lang['Mail sent to %s [%s].'] = 'Posta gönderildi %s [%s].';
+$lang['Main "guest" user does not exist'] = 'Ana "Misafir" kullanıcı yok';
+$lang['Main "guest" user status is incorrect'] = 'Ana "Misafir" kullanıcı durumu yanlış';
+$lang['Main "webmaster" user does not exist'] = 'Ana "Site Yöneticisi" kullanıcı yok';
+$lang['Main "webmaster" user status is incorrect'] = 'Ana "Site Yöneticisi" kullanıcı durumu yanlış';
+$lang['Main Page'] = 'Ana Sayfa';
+$lang['Main'] = 'Ana';
+$lang['Maintenance'] = 'Bakim';
+$lang['Make this language available to users'] = 'Bu dil kullanıcılara açık olsun';
+$lang['Make this theme available to users'] = 'Bu temayı kullanıcılara açık yapın';
+$lang['manage album photos'] = 'albüm resimlerini yönet';
+$lang['Manage authorizations for selected albums'] = 'Seçilen albümler için yetkileri yönetimi';
+$lang['Manage permissions for group "%s"'] = 'Grup izinlerini düzenle"%s"';
+$lang['Manage permissions for user "%s"'] = 'kullanıcı izinlerini düzenle "%s"';
+$lang['Manage Permissions'] = 'İzinlerini Yönet';
+$lang['Manage photo ranks'] = 'Resim rütbesini yönet';
+$lang['manage sub-albums'] = 'yönet alt-albümler';
+$lang['Manage tags'] = 'Etiketleri düzenle';
+$lang['Manage this set of %d photos'] = 'Düzenle bu dizi %d resimleri';
+$lang['Manage'] = 'Yönet';
+$lang['manual order'] = 'el ile düzen';
+$lang['Manual order'] = 'Eller yapılandırma';
+$lang['Maximum file size: %sB.'] = 'En büyük dosya boyutu: %sB.';
+$lang['Maximum Height'] = 'En fazla yükseklik';
+$lang['Maximum Width'] = 'En fazla genişlik';
+$lang['Members'] = 'Üyeler';
+$lang['Menu Management'] = 'Menü Yönetimi';
+$lang['Merge selected tags'] = 'Seçilen etiketleri birleştir';
+$lang['Merge tags'] = 'etiketleri birleştir';
+$lang['Metadata synchronization results'] = 'Metadata senkronizasyon sonuçları';
+$lang['Metadata synchronized from file'] = 'Metadata dosyadan senkronize edildi';
+$lang['Minimum privacy level'] = 'En az gizlilik seviyesi';
+$lang['Miscellaneous'] = 'Karışık';
+$lang['Missing a temporary folder'] = 'Geçici bir klasöre eksik';
+$lang['Missing Plugins'] = 'Eksik Eklentiler';
+$lang['Modify information'] = 'Bilgi değiştirme';
+$lang['Month'] = 'Sıra';
+$lang['Move albums'] = 'albümleri taşı';
+$lang['Move'] = 'Taşı';
+$lang['Name'] = 'Isim';
+$lang['New name'] = 'Yeni isim';
+$lang['New parent album'] = 'yeni ana albüm';
+$lang['New photos added'] = 'Yeni içerik eklendi';
+$lang['New photos were added'] = 'Yeni içerikler eklendi';
+$lang['New tag'] = 'Yeni etiket';
+$lang['New Version'] = 'Yeni Versiyon';
+$lang['new'] = 'yeni';
+$lang['No destination tag selected'] = 'Hedef etiket seçilmedi';
+$lang['No display'] = 'Görüntü yok';
+$lang['No file was uploaded'] = 'dosya yüklenmedi';
+$lang['No mail to send.'] = 'Gönderilecek posta yok';
+$lang['No photo can be deleted'] = 'Silinebilecek resim yok';
+$lang['No photo in the current set.'] = 'bu sette resim yok.';
+$lang['No photo in this album'] = 'albümde eleman yok';
+$lang['No photo selected, %d photos in current set'] = 'Resim seçilmedi, %d bu setteki resimler';
+$lang['No photo selected, no action possible.'] = 'Resim seçilmedi, eylem imkansız.';
+$lang['No results'] = 'Sonuç yok';
+$lang['No user to send notifications by mail.'] = 'Posta ile ildiri gördermek için hiç kullanıcı yok';
+$lang['no write access'] = 'Yazma yetkisi yok';
+$lang['none'] = 'Hiç';
+$lang['None'] = 'Hiçbiri';
+$lang['nothing'] = 'hiçbir şey';
+$lang['Notification'] = 'Duyuru';
+$lang['Number of comments per page'] = 'Her sayfadaki yorum sayisi';
+$lang['Number of downloads'] = 'İndirilen sayısı';
+$lang['number of miniaturized photos'] = 'oluşturulan küçük resim sayısı';
+$lang['Number of rates'] = 'Reyting sayisi';
+$lang['Number of thumbnails to create'] = 'Yaratilacak thumbnail sayisi';
+$lang['Obsolete Plugins'] = 'Eski Eklentiler';
+$lang['on the %d selected photos'] = '%d resimler seçildi';
+$lang['on'] = 'üzerinde';
+$lang['only directories'] = 'sadece dizinler';
+$lang['only perform a simulation (no change in database will be made)'] = 'sadece veritabanında değişecektir) bir simülasyon (hiçbir şey yapılmayacak)';
+$lang['Only private albums are listed'] = 'sadecee özel albümler listelendi';
+$lang['Operating system'] = 'Isletim sistemi';
+$lang['Operation in progress'] = 'Islem yapiliyor.';
+$lang['Optimizations have been completed with some errors.'] = 'ptimizasyonları bazı hatalar ile tamamlanmıştır.';
+$lang['Optional URL keyword'] = 'İsteğe bağlı URL anahtar kelime';
+$lang['Options'] = 'Seçenekler';
+$lang['Order of menubar items has been updated successfully.'] = 'Menü öğeleri sıralaması başarıyla güncellendi.';
+$lang['Original templates'] = 'Orjinal Şablonlar';
+$lang['Orphan tags deleted'] = 'etkisiz etiketler silindi';
+$lang['Other plugins'] = 'Diğer eklentiler';
+$lang['Other private albums'] = 'diğer özel albümler';
+$lang['other'] = 'Diğer';
+$lang['Overall'] = 'Genel bakış';
+$lang['overrides existing values with empty ones'] = 'boş olan değerleri geçersiz kılar';
+$lang['Page banner'] = 'Sayfa banneri';
+$lang['Page end'] = 'Sayfa sonu';
+$lang['Pages seen'] = 'Görülen Sayfalar';
+$lang['Parameter'] = 'Ayarlar';
+$lang['Parameters'] = 'Parametreler';
+$lang['Parent album'] = 'Ana albüm';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Şifre doğrulama eksik. Lütfen seçtiğiniz şifreyi onaylayın.';
+$lang['Password is missing. Please enter the password.'] = 'Şifre eksik. Lütfen şifrenizi girin.';
+$lang['Path'] = 'Yol';
+$lang['Pending Comments'] = 'Bekleyen Yorumlar';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Kalıcı Bağlantı %s albüm tarafından kullanıldı %s. Önce onu Kalıcı Bağlantı geçmişinden siliniz';
+$lang['Permalink %s is already used by album %s'] = 'Kalıcı Bağlantı %s albüm tarafından kullanıldı%s';
+$lang['Permalink history'] = 'Kalıcı Bağlantı geçmisi';
+$lang['Permalink'] = 'Kalıcı Bağlantı';
+$lang['Permalinks'] = 'Kalıcı Bağlantı';
+$lang['Permission denied'] = 'İzin verilmedi';
+$lang['Permission granted thanks to a group'] = 'Gruba tesekkür izni verildi';
+$lang['Permission granted'] = 'İzin verildi';
+$lang['Permissions'] = 'Izinler';
+$lang['Photo %s of %s'] = 'Photo %s of %s';
+$lang['Photo informations updated'] = 'Resim bilgileri güncellendi';
+$lang['Photo Page'] = 'Resim Sayfası';
+$lang['Photo Properties'] = 'Resim özellikleri';
+$lang['Photo name'] = 'Resim adı';
+$lang['Photo unreachable or no support'] = 'Resim erisilemiyor veya desteklenmeyen format';
+$lang['photos added in the database'] = 'elemanlar veritabanında ekledi';
+$lang['photos candidates for metadata synchronization'] = 'metadata senkronizasyon için görüntüleri adayları';
+$lang['photos deleted from the database'] = 'elemanlar veritabanında silindi';
+$lang['Photos generation in progress...'] = 'Resimler oluşturulmaya devam ediyor...';
+$lang['photos informations synchronized with files metadata'] = 'elemanları bilgiler dosyaları ile metadata senkronize edildi';
+$lang['photos per page'] = 'Safya basina içerikler';
+$lang['photos updated in the database'] = 'elemanlar veritabanında güncellendi';
+$lang['Photos'] = 'Resimler';
+$lang['Piwigo Administration'] = 'Piwigo Yönetim';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo Duyuru Bülteni';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo sunucudan yükseltme dosyasını alamıyor';
+$lang['Piwigo configuration'] = 'Piwigo yapılandırma';
+$lang['Piwigo Update'] = 'Piwigo Güncellemesi';
+$lang['Piwigo Uploader'] = 'Piwigo Yükleyici';
+$lang['Piwigo version'] = 'Piwigo versiyon';
+$lang['pixels'] = 'pikseller';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Lütfen "plugins" klasörünü ve alt klasörler izinleri (CHMOD) kontrol edin.';
+$lang['Please wait...'] = 'Lütfen bekleyiniz...';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader <em>Piwigo Yükleyiciyi temsil eder</em>. Bilgisayarınızdan, pLoader fotoğraflarınızı hazırlar ve Piwigo fotoğraf galerisi aktarabilirsiniz.';
+$lang['Plugin has been successfully copied'] = 'Eklenti başarıyla kopyalanmış oldu';
+$lang['Plugin list'] = 'Eklenti listesi';
+$lang['Plugins which need upgrade'] = 'Yükseltilecek eklentiler';
+$lang['Plugins'] = 'Eklentiler';
+$lang['Position'] = 'Pozisyon';
+$lang['Predefined filter'] = 'önceden tanımlanmış filtre';
+$lang['Preferences'] = 'Tercihler';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Zamanli posta gönderilecek kullanıcılar listesi. Diger kullanıcılar listelenmez.';
+$lang['Privacy level set to "%s"'] = 'Gizlilik seviyesi "%s" için';
+$lang['Privacy level'] = 'Gizlilik seviyesi';
+$lang['Private'] = 'Özel albüm';
+$lang['private'] = 'Özel';
+$lang['Properties'] = 'Özellikler';
+$lang['Public / Private'] = 'Genel / Özel';
+$lang['Public'] = 'Genel albüm';
+$lang['public'] = 'Genel';
+$lang['Purge compiled templates'] = 'Derlenmiş şablonları temizle';
+$lang['Purge history detail'] = 'Tarih detaylarını temizle';
+$lang['Purge history summary'] = 'Tarih özetini temizle';
+$lang['Purge never used notification feeds'] = 'Kullanilmamis beslemeleri temizle';
+$lang['Purge search history'] = 'Arama geçmişini temizle';
+$lang['Purge sessions'] = 'Temizleme oturumlari';
+$lang['Quick Local Synchronization'] = 'Hızlı Yerel Senkronizasyon';
+$lang['Random photo'] = 'Karisik resim';
+$lang['randomly represented'] = 'Karisik temsici';
+$lang['ranks'] = 'rütbeler';
+$lang['Rate date'] = 'Reyting tarihi';
+$lang['Rate'] = 'Oyla';
+$lang['Rating by guests'] = 'Misafir Puanları';
+$lang['Rating'] = 'Puan';
+$lang['Read Piwigo Documentation'] = 'Piwigo Belgeleri Oku';
+$lang['reduce to single existing albums'] = 'mevcut albümleri küçült';
+$lang['Refresh photo set'] = 'Resim setini yenile';
+$lang['Refresh'] = 'Yenile';
+$lang['registration date'] = 'Kayit tarihi';
+$lang['Reinitialize check integrity'] = 'Bütünlüğünü kontrolü yeniden başlat';
+$lang['Reject'] = 'Reddet';
+$lang['Released on'] = 'Eklenme zamanı';
+$lang['Remote'] = 'Uzak';
+$lang['Remove all filters'] = 'Tüm filtreleri sil';
+$lang['remove author'] = 'yazarı sil';
+$lang['remove creation date'] = 'oluşturulma tarihini sil';
+$lang['Remove from caddie'] = 'Yardımcıdan sil';
+$lang['remove tags'] = 'etiketleri sil';
+$lang['remove this filter'] = 'Bu filtreyi sil';
+$lang['remove title'] = 'başlığı sil';
+$lang['Repair and optimize database'] = 'Veritabanini onar ve en uygun hale getir';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Orjinal şablon temsilcisi özelleştirilmiş şablonlar template-extension yedek dosyasından';
+$lang['Replacers (customized templates)'] = 'Yedekler (Özelleştirilmiş şablonlar)';
+$lang['Representant'] = 'Temsilen';
+$lang['Representation of albums'] = 'Albüm gösterimi';
+$lang['Representative'] = 'Temsilci';
+$lang['Represents'] = 'Temsilciler';
+$lang['Reset ignored updates'] = 'Görmezden gelinen güncellemeleri tekrar ayarla';
+$lang['Resize'] = 'Tekrar boyutlandır';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Varsayılan yapılandırmalarınızı onarın. Eklenti ayarlrınız kaybolacaktır!';
+$lang['Restore'] = 'Onarım';
+$lang['Save order'] = 'Düzeni kaydet';
+$lang['Save Settings'] = 'Ayarları kaydet';
+$lang['Save Template Directory'] = 'Tema dizinini kaydet';
+$lang['Save to permalink history'] = 'Kalıcı Bağlantı geçmisini kaydet';
+$lang['Search for new images in the directories'] = 'Dizinlerde yeni resimler ara';
+$lang['Searching...'] = 'Arıyor...';
+$lang['Section'] = 'Bölüm';
+$lang['See you soon.'] = 'Sonra görüşürüz.';
+$lang['See you soon,'] = 'Yakinda görüsürüz,';
+$lang['Select an album'] = 'Albüm seçiniz';
+$lang['Select at least one album'] = 'en az bir albüm seçiniz';
+$lang['Select at least one comment'] = 'En az bir yorum seç';
+$lang['Select at least one photo'] = 'En az bir resim seçiniz';
+$lang['Select at least one user'] = 'En az bir kullanıcı seçiniz';
+$lang['Select at least two tags for merging'] = 'Birleştirmek için en az iki etiketleri seçin';
+$lang['Select files'] = 'Dosyaları seçin';
+$lang['Select recipients'] = 'Alicilari seç';
+$lang['Select the destination tag'] = 'Hedef etiketi seçin';
+$lang['Select:'] = 'Seç:';
+$lang['Selection'] = 'Seçim';
+$lang['selection'] = 'Seçim';
+$lang['Send an information email to group members'] = 'Grup üyelerine bilgi e-postası gönder';
+$lang['Send mail as'] = 'Posta gönderim sekli';
+$lang['Send mail on HTML format'] = 'Postayi HTML formatinda yolla';
+$lang['Send mail to users'] = 'kullanıcılara posta gönderin';
+$lang['Send'] = 'Gönder';
+$lang['Set as default language for unregistered and new users'] = 'Kayıtsız ve yeni kullanıcılar için varsayılan dil olarak ayarlamak';
+$lang['Set as default theme for unregistered and new users'] = 'Kayıtsız ve yeni kullanıcılar için varsayılan tema olarak ayarla';
+$lang['Set author'] = 'Yazar ayarla';
+$lang['Set creation date'] = 'oluşturma tarihi ayarla';
+$lang['Set title'] = 'Başlığı ayarla';
+$lang['set to'] = 'Ayarla';
+$lang['Settings'] = 'Ayarlar';
+$lang['show details'] = 'ayrıntıları göster';
+$lang['Show info'] = 'Bilgi Göster';
+$lang['Show menubar'] = 'menü çubuğunu göster';
+$lang['Simulation'] = 'Simülasyon';
+$lang['singly represented'] = 'tek basina temsil';
+$lang['Site manager'] = 'Site yöneticisi';
+$lang['Some themes and plugins may be not available yet.'] = 'Bazı tema ve eklentiler henüz hazır olamayabilir.';
+$lang['Some upgrades are available for extensions.'] = 'Eklentiler için bazı güncellemeler mevcut.';
+$lang['Start pLoader and add your photos.'] = 'pLoader başlat ve resimler yükle.';
+$lang['Start Upload'] = 'Yüklemeye başla';
+$lang['Statistics'] = 'Istatistikler';
+$lang['Status of user "%s" updated'] = 'Kullanıcı "%s" durumu güncellendi';
+$lang['Status'] = 'Durum';
+$lang['status'] = 'Durum';
+$lang['Storage album'] = 'Depola albümü';
+$lang['sub-albums'] = 'alt-albümler';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Abone %s Piwigo Bülten Duyurularına';
+$lang['Subscribe %s'] = 'Abone %s';
+$lang['Subscribe to notification by mail'] = 'Posta ile abone bildirimi';
+$lang['Subscribe'] = 'Abone';
+$lang['Subscribe/unsubscribe users'] = 'kullanıcılar Abone/Abone degil';
+$lang['Subscribed'] = 'Abone olundu';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Aboneler sadece yeni içerikler';
+$lang['Sum of rates'] = 'Toplam reytingler';
+$lang['Summary'] = 'Özet';
+$lang['Support'] = 'Destek';
+$lang['Switch to clear or dark colors for administration'] = 'Açık veya koyu renk yönetim sayfasına geç';
+$lang['synchronize files metadata with database photos informations'] = 'meta dosyaları ile veritabanı elemanları senkronize';
+$lang['synchronize files structure with database'] = 'veritabanı ile dosya yapısı senkronize et';
+$lang['Synchronize metadata'] = 'Senkronize metadata';
+$lang['Synchronize'] = 'Senkronize';
+$lang['Tag "%s" already exists'] = 'Etiket "%s" zaten var';
+$lang['Tag "%s" was added'] = 'Etiket "%s" eklendi';
+$lang['Tag selection'] = 'Etiket seçme';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Etiketler <em>%s</em> ile <em>%s</em> etiketleri birleştirildi';
+$lang['target'] = 'Hedef';
+$lang['Templates configuration has been recorded.'] = 'Şablonları yapılandırma kaydedildi.';
+$lang['Templates'] = 'Şablonlar';
+$lang['test this remote site'] = 'uzak siteyi dene';
+$lang['test'] = 'deneme';
+$lang['The %d following tags were deleted'] = 'Asagidaki %d etiketler silindi';
+$lang['The anomaly will be ignored until next application version'] = 'Bu anormallik sonraki uygulama sürümüne kadar dikkate alınmayacaktır';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Dosya veya dizin erişemez (ya yok yada erişim reddedildi)';
+$lang['The following tag was deleted'] = 'Aşağıdaki etiketi silindi';
+$lang['the forum'] = 'Forum';
+$lang['The gallery URL is not valid.'] = 'Galeri URL geçerli degil.';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Bir grubun ismi " veya \ içermemelidir yada bos olmamalidir.';
+$lang['The name of an album must not be empty'] = 'Albüm ismi boş olamaz';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Dizin ve dosya ismi sadece harfler, rakamlardan olmalı, "-", "_" veya "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Bir sayfadaki yorumlarin sayisini 5 ile 50 arasinda olmalidir.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Kalıcı Bağlantı ismi a-z, A-Z, 0-9, "-", "_" yada "/" karekterlerinden olusmalidir. Sayisal olmamali veya sayi ile baslamamalidir';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Yüklenen dosya HTML biçiminde belirtilmiş MAX_FILE_SIZE aşıyor';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Yüklenen dosyanın php.ini upload_max_filesize aşıyor: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Yüklenen dosya sadece kısmen yüklendi';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Yüklenen dosyalar php.ini post_max_size aşıyor: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Bu %s versiyonu yüklenen [%s] versiyonu ile uyumlu değildir.';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Site yöneticisi posta ile haberdar olmaniz için sizi abone etti.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Site yöneticisi posta ile haberdar edilme aboneliginizi kaldirdi.';
+$lang['The whole page'] = 'Bütün sayfa';
+$lang['The whole set'] = 'Bütün set';
+$lang['the wiki'] = 'Wiki';
+$lang['Theme has been successfully installed'] = 'Tema başarıyla yüklendi';
+$lang['Themes which need upgrade'] = 'Güncellenmesi gereken temalar';
+$lang['Themes'] = 'Temalar';
+$lang['There is no available subscribers to mail.'] = 'Hiç posta abonesi yok.';
+$lang['There is no other language available.'] = 'Kullanılabilir başka bir dil yok.';
+$lang['There is no other plugin available.'] = 'Kullanılabilir başka bir eklenti yok.';
+$lang['There is no other theme available.'] = 'Kullanılabilir başka bir teama yok';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Bu yeni büyük bir güncelleme <a href="%s">yeni heyecan verici özellikler</a> içerir.';
+$lang['This is a minor update, with only bug corrections.'] = 'Bu sadece hata düzeltmeleri ile, küçük bir güncelleştirme.';
+$lang['This name is already used by another group.'] = 'Bu isim baska bir grup tarafindan kullanilmaktadir';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'Bu eklenti şimdi Piwigo\'nun kendi parçasıdır lütfen siliniz.!';
+$lang['This site already exists'] = 'Bu site zaten var';
+$lang['This theme was not designed to be directly activated'] = 'Bu tema doğrudan harekete geçmek için tasarlanmış değildir';
+$lang['Thumbnail'] = 'Küçük resim';
+$lang['Thumbnails generation in progress...'] = 'Küçük resimler oluşturuluyor...';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Posta gönderme zamani sinirlidir.Diger postalar atlandi.';
+$lang['Time'] = 'Zaman';
+$lang['title'] = 'Baslik';
+$lang['To send ?'] = 'Göndermek için?';
+$lang['To subscribe'] = 'Abone olmak için';
+$lang['To unsubscribe'] = 'Abonelikten çikarmak için';
+$lang['Toggle \'default group\' property'] = 'Ters \'varsayılan\' özellik';
+$lang['Tools'] = 'Araçlar';
+$lang['total time'] = 'toplam zaman';
+$lang['Two updates are available'] = 'İki güncelleştirme mevcut';
+$lang['Type here the author name'] = 'Yazar adını buraya yazın';
+$lang['Type here the title'] = 'Başlığı buraya yazın';
+$lang['Type in a search term'] = 'Aramak için bir kelime yazınız';
+$lang['Unable to check for upgrade.'] = 'Yükseltme kontrolü yapilamiyor.';
+$lang['Unable to dump database.'] = 'Veritabanı silinemiyor.';
+$lang['Uncheck all'] = 'Tüm işaretleri kaldır';
+$lang['Uninstall'] = 'Kaldir';
+$lang['Uninstalled Plugins'] = 'Kaldırılan eklentiler';
+$lang['unit mode'] = 'tek modlu';
+$lang['Unknown upload error'] = 'Bilinmeyen yükleme hata';
+$lang['unknown'] = 'bilinmeyen';
+$lang['Unlocked'] = 'Kilitsiz';
+$lang['unset'] = 'Kaldırmak';
+$lang['Unsubscribe from notification by mail'] = 'Bildiri aboneliginden çik';
+$lang['Unsubscribed'] = 'Abonelikten çikarildi';
+$lang['Update albums informations'] = 'Albümlerin bilgilerini güncelle';
+$lang['Update All'] = 'Hepsini Güncelle';
+$lang['Update Complete'] = 'Güncelleme Tamamlandı';
+$lang['Update in progress... Please wait.'] = 'Güncelleniyor.. Lütfen bekleyiniz.';
+$lang['Update photos information'] = 'Resimlerin bilgilerini güncelle';
+$lang['update the database from files'] = 'Dosyalar ile veritabani güncelleme';
+$lang['Update to Piwigo %s'] = 'Piwigoyu %s\'e güncelle';
+$lang['Updates'] = 'Güncellemeler';
+$lang['Upload Photos'] = 'Resim Yükle';
+$lang['Upload'] = 'Yükle';
+$lang['Uploaded Photos'] = 'Yüklenen resimler';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'Varsayilan görüntü siralama düzenini kullan';
+$lang['Used metadata'] = 'Metadata kullanıldı';
+$lang['user "%s" added'] = 'Kullanıcı "%s" eklendi';
+$lang['User "%s" created with "%s" like password'] = 'Kullanıcı "%s" şifre "%s" ile yaratıldı';
+$lang['User %s [%s] added.'] = 'kullanıcı %s [%s] eklendi.';
+$lang['User %s [%s] was added to the subscription list.'] = 'kullanıcı %s [%s] abone listesine eklendi.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'kullanıcı %s [%s] abone listesine eklenemedi.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'kullanıcı %s [%s] abone listesinden silinemedi..';
+$lang['User %s [%s] was removed from the subscription list.'] = 'kullanıcı %s [%s] abone listesinden silindi.';
+$lang['User comments validation'] = 'kullanıcı yorumlari dogrulama';
+$lang['User list'] = 'Kullanıcılar listesi';
+$lang['User status'] = 'Kullanıcı durumu';
+$lang['User'] = 'kullanıcı';
+$lang['user_status_admin'] = 'Yönetici';
+$lang['user_status_generic'] = 'Genel';
+$lang['user_status_guest'] = 'Misafir';
+$lang['user_status_normal'] = 'Kullanıcı';
+$lang['user_status_webmaster'] = 'Site Yöneticisi';
+$lang['Users'] = 'Kullanıcılar';
+$lang['Validate'] = 'Onayla';
+$lang['Validation'] = 'Onaylama';
+$lang['Version'] = 'Versiyon';
+$lang['Virtual album added'] = 'sanal albüm eklendi';
+$lang['Virtual album deleted'] = 'sanal albüm silindi';
+$lang['Virtual album name'] = 'Sanal albüm ismi';
+$lang['Virtual album'] = 'Sanal albüm';
+$lang['Virtual albums to move'] = 'Taşınacak sanal albümler';
+$lang['Virtual Links'] = 'Sanal Linkler';
+$lang['Visit Gallery'] = 'Galeriyi ziyaret et';
+$lang['Visit language site'] = 'Dil sitesine git';
+$lang['Visit Piwigo project website'] = 'Piwigo proje sitesini ziyaret et';
+$lang['Visit plugin site'] = 'Ziyaret eklenti sitesini';
+$lang['Visit theme site'] = 'Tema sitesine git';
+$lang['Waiting'] = 'Bekleyen';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'UYARI! Bu eklenti Piwigo galerinizin bu versiyonu ile uyumlu değildir.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Uyari abone olurken veya çikarken kullanıcılara mail gönderecegiz.';
+$lang['Webmaster cannot be deleted'] = 'Site yöneticisi silinemez';
+$lang['Webmaster status is required.'] = 'Site yöneticisi durum gereklidir.';
+$lang['Week starts on'] = 'Hafta başlangıcı';
+$lang['Who can see these photos?'] = 'Kim bu resimleri görebilir?';
+$lang['Who can see this photo?'] = 'Kim bu resimi görebilir?';
+$lang['width must be a number superior to'] = 'genisligi bir sayi olmali';
+$lang['Width'] = 'Genişlik';
+$lang['With blank value, gallery title will be used'] = 'Bos olursa, galeri baslik kullanilir';
+$lang['With no album'] = 'sıfır albüm ile';
+$lang['With no tag'] = 'sıfır etiket ile';
+$lang['With no virtual album'] = 'sıfır sanal albüm ile';
+$lang['wrong filename'] = 'yanlış dosya';
+$lang['Year'] = 'Yıl';
+$lang['You are running on development sources, no check possible.'] = 'Gelistirme kaynaklarini kullaniyorsunuz incelemek mümkün degil';
+$lang['You are running the latest version of Piwigo.'] = 'Piwigo son sürümünü çalıştırıyorsunuz.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Tarayıcı yükleyiciyi kullanıyorsunuz. <a href="%s">Flash Yükleyiciyi</a> deneyiniz.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Flash Yükleyiciyi kullanıyorsunuz. Sorun mu var? <a href="%s">Tarayıcı Yükleyiciyi</a> deneyiniz.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Piwigoyu direkt olarak %s\'e güncelleyebilirsiniz, Piwigo %s\'e güncellemeden (önerilir).';
+$lang['You cannot delete your account'] = 'Kendi hesabinizi silemezsiniz';
+$lang['You cannot move an album in its own sub album'] = 'Bir albümü kendi alt bölümü içindeki albüme taşıyamazsınız';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Varsayılan resim sırasını tanımlayamazsınız, çünkü yerel yapılandırmada özel bir ayar var';
+$lang['You have %d orphan tags: %s.'] = '%d etkisiz etiketleriniz: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Yerel yapılandırma dosyasında <i>$conf[\'order_by\']</i> belirttiniz, bu parametre olarak önerilmemektedir, lütfen bu parametreyi siliniz veya <i>$conf[\'order_by_custom\']</i> olarak yeniden adlandırınız!';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Posta yoluyla bildirimleri almak için abone oldunuz.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Posta yoluyla bildirimleri almak için olan aboneliginizi iptal ettiniz.';
+$lang['You might go to plugin list to install and activate it.'] = 'Yükleme ve aktif etmek için eklentiler listesine gidiniz';
+$lang['You need to confirm deletion'] = 'Silme islemini onaylayiniz';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Sisteminizi yükseltmelisiniz aksi taktirde uygulama yanlış veya hiç çalışmayabilir.';
+$lang['Your configuration settings are saved'] = 'Yapılandırma ayarları kaydedildi';
+$lang['Zoom'] = 'Yakınlaştırma';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u kullanıcılar otomatik izine sahiptir, çünkü izin verilmiş bir gruba ait oldukları için.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Android için Piwigo</em> uygulaması ile Android telefon veya tablet\'inizden Piwigo galerinize bağlanmaya, albümler yaratmanıza ve birden fazla fotoğraf birden aktarmanıza izin verir.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo for iOS</em> uygulaması ile iPhone, iPad veya iPod Touch\'ınızdan Piwigo galerinize bağlanmaya, albümler yaratmanıza ve birden fazla fotoğraf birden aktarmanıza izin verir. ';
+$lang['A locked gallery is only visible to administrators'] = 'Kilit bir galeri sadece yöneticiler tarafından görülebilinir';
+$lang['Activate comments'] = 'Yorumları etkinleştir';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom büyük sayıda dijital görüntü yönetmek ve yapım sonrasındaki işleri gerçekleştirmek için tasarlanmış bir yazılımdır.';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture, görüntüleri tasfiye etmeye ve büyük resim kütüphaneleri yönetmek için Mac de kullanılır.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture iPhoto basitliği ile profesyonel fotoğrafcılar için tasarlanmış.';
+$lang['Applications'] = 'Uygulamalar';
+$lang['Apply watermark if height is bigger than'] = 'Filigran uygulama koşulu: Yükseklik daha büyük ise';
+$lang['Apply watermark if width is bigger than'] = 'Filigran uygulama koşulu: Genişlik daha büyük ise';
+$lang['Automatic sort order'] = 'Otomatik sıralama';
+$lang['Available on'] = 'Mevcut platform';
+$lang['Available versions for'] = 'Mevcut sürümler';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'Genelde, fotoğrafın odak noktası, fotoğrafın ortasında yer almaktadır.';
+$lang['Cancel'] = 'İptal';
+$lang['Center of interest'] = 'Odak noktası';
+$lang['Default comments order'] = 'Varsayılan yorum sırası';
+$lang['Delete multiple size images'] = 'Çoklu ebat görüntüleri sil';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'İçerdiği özellikler, galeri göz atmak, albüm yaratmak ve fotoğraf karşıya yüklemek.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Fotoğraf kırpmayla boyutlandırılır seçeneği için, örneğin "Kare", Piwigo odak noktasını içerebilmek için elinden geleni yapmaya çalışacaktır.';
+$lang['Gallery unlocked'] = 'Galeri kilidi açık';
+$lang['Generate multiple size images'] = 'Çoklu ebat görüntüleri üret';
+$lang['Groups and users'] = 'Gruplar ve Kullanıcılar';
+$lang['List'] = 'Listele';
+$lang['Move to album'] = 'Albüme taşı';
+$lang['No group is permitted to see this private album'] = 'Bu özel albüme görebilmek için hiçbir gruba izin verilmedi';
+$lang['Not cropped correctly?'] = 'Doğru kırpılmadı mı?';
+$lang['Notify administrators when a comment is'] = 'Yöneticileri uyarı durumu: yorum';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'Linux sürümünüzde kullanmış olduğunuz paket yöneticisi ile sadece Shotwell\'i kurun ve Piwigo publish eklentisini aktif hale getirin.';
+$lang['Opacity'] = 'opaklık';
+$lang['Original Size'] = 'Orjinal ebat';
+$lang['Permission granted for groups'] = 'Gruplar için izin verilmiştir';
+$lang['Permission granted for users'] = 'Kullanıcılar için izin verilmiştir';
+$lang['Permission management'] = 'İzinler yönetimi';
+$lang['Photo sizes with crop'] = 'Fotoğraf kırpmayla boyutlandırılır';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Lightroom için Piwigo Publish eklentisi ';
+$lang['Piwigo export plugin for Aperture'] = 'Aperture için Piwigo aktarım eklentisi';
+$lang['Piwigo export plugin for iPhoto'] = 'iPhoto için Piwigo aktarım eklentisi';
+$lang['Piwigo for Android'] = 'Android için Piwigo';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo for iOS (iPhone, iPad, iPod Touch)';
+$lang['Piwigo publish plugin for Shotwell'] = 'Shotwell için Piwigo publish eklentisi';
+$lang['Piwigo publish plugin for digiKam'] = 'digiKam için Piwigo publish eklentisi';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery client for Android) Android platformu için yazılmış açık kaynak kodlu (GPL v3) bir Piwigo istemcidir.';
+$lang['Resize after upload'] = 'Karşıya gönderdikten sonra yeniden boyutlandır';
+$lang['Save manual order'] = 'Manüel sıralamayı kayıt et';
+$lang['Save visits in history for'] = 'Geçmişte şu ziyaretleri kayıt et';
+$lang['Select a file'] = 'Bir dosya seçin';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Yeni bir odak noktası belirlemek için farenizle bir bölge seçiniz.';
+$lang['Select groups...'] = 'Grupları seçin...';
+$lang['Select users...'] = 'Kullanıcıları seçin...';
+$lang['Send connection settings by email'] = 'Bağlantı ayarları eposta ile gönder';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell linux altında çalışan açık kaynaklı bir dijital fotoğraf yönticisidir. Ubuntu ve Fedora için varsayılan fotoğraf yöneticisidir.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo aktarım eklentisi albümler yaratmanıza ve fotoğrafları aktarmanıza olanak tanır.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publish eklentisi Lightroom yazılımından görüntülerinizi Piwigo fotoğraf galerisine aktarmak ve senkronize etmeye izin verir. ';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Odak noktası, bir fotoğrafın en çok anlam taşıdığı bölgedir.';
+$lang['The original image quality must be a number between %d and %d'] = 'Orjinal görüntü kalitesi %d ile &d arasında bir sayı olmalı';
+$lang['The original maximum height must be a number between %d and %d'] = 'Orjinal yüksekliği %d ile %d arasında bir sayı olmalı';
+$lang['The original maximum width must be a number between %d and %d'] = 'Orjinal genişliği %d ile %d arasında bir sayı olmalı';
+$lang['There is no group in this gallery.'] = 'Bu galeride herhangi bir grup yer almamaktadır.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Bu albüm %d fotoğraf içeriyor, %s ile %s arasında eklendi.';
+$lang['This album contains %d photos, added on %s.'] = 'Bu albüm %d resim içeriyor, %d de eklendi.';
+$lang['This album contains no photo.'] = 'Bu albüm herhangi bir fotoğraf içermiyor.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'digiKam dan Piwigo\'ya fotoğraflarınızı aktarmak için, sadece digiKam ve Kipi-eklentileri kurunuz.';
+$lang['Unlock gallery'] = 'Galeri kilidini aç';
+$lang['Web Form'] = 'Web Form';
+$lang['X Position'] = 'X Pozisyonu';
+$lang['X Repeat'] = 'X Tekrarlama';
+$lang['Y Position'] = 'Y Pozisyonu';
+$lang['You can activate only one mobile theme.'] = 'Sadece bir mobil thema etkinleştirebilirsiniz.';
+$lang['add a new watermark'] = 'yeni bir filigran ekle';
+$lang['administrators'] = 'yöneticileri';
+$lang['any visitor can see this album'] = 'herhangi bir ziyaretci bu albümü görebilir';
+$lang['apply automatic sort order'] = 'otomatik sıralamayı uygula';
+$lang['bottom left corner'] = 'alt sol köşe';
+$lang['bottom right corner'] = 'alt sağ köşe';
+$lang['cancel manual order'] = 'manuel sıralamayı iptal et';
+$lang['custom'] = 'Özel';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam Linux, Windows ve MacOSX platformlar için geliştirilmiş açık ve gelişmiş bir dijital fotoğraf yönetim yazılımıdır. ';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam, fotoğraflarını görüntülemek, yönetmek, düzenlemek, geliştirmek, orgamize etmek, etiketletirmek ve paylaşmak isteyen fotoğrafcılar için tasarlanmıştır.';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto MacOSX\'in varsayılan fotoğraf yöneticisidir. Piwigo aktarım eklentisi, yeni albümler yaratmanıza ve fotoğraflarınızı direkt iPhoto\'dan Piwigo fotğraf galerisine aktarmanıza olanak tanır.';
+$lang['include photos with lower privacy level'] = 'daha düşük olan bir özel seviyesine ait olan fotoğrafları içerin ';
+$lang['middle'] = 'orta';
+$lang['modified'] = 'değiştiğinde';
+$lang['pending validation'] = 'doğrulama beklemede';
+$lang['registered users'] = 'kayıtlı kullanıcıları';
+$lang['simple visitors'] = 'normal ziyaretcileri';
+$lang['top left corner'] = 'üst sol köşe';
+$lang['top right corner'] = 'üst sağ köşe';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'bu albümü görebilmek için ziyaretciler sisteme login ve uygun izinlere sahip olmaları gerekir';
+$lang['Multiple Size'] = 'Çoklu boyut';
+?>
Index: tags/2.4.0RC3/language/tr_TR/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/tr_TR/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/common.lang.php	(revision 14585)
@@ -0,0 +1,383 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Türkçe [TR]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=436
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Turkish';
+$lang_info['country'] = 'Turkey';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'tr';
+$lang_info['zero_plural'] = true;
+
+$lang['... or browse your empty gallery'] = '... yada boş galerinizde gezin';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... yada lütfen bu mesajı deaktive edin, kendi yolumu kendim bulabilirim';
+$lang['%d album updated'] = '%d albüm güncellendi';
+$lang['%d albums updated'] = '%d albümler güncellendi';
+$lang['%d comment to validate'] = '%d onaylanacak yorum';
+$lang['%d comment'] = '%d Yorum';
+$lang['%d comments to validate'] = '%d onaylanacak yorumlar ';
+$lang['%d comments'] = '%d Yorumlar';
+$lang['%d hit'] = '%d ziyaret';
+$lang['%d hits'] = '%d ziyaret';
+$lang['%d Kb'] = '%d Kilobayt';
+$lang['%d new comment'] = '%d Yeni Yorum';
+$lang['%d new comments'] = '%d Yeni Yorumlar';
+$lang['%d new photo'] = '%d Yeni resim';
+$lang['%d new photos'] = '%d Yeni resimler';
+$lang['%d new user'] = '%d Yeni kullanıcı';
+$lang['%d new users'] = '%d Yeni kullanıcılar';
+$lang['%d photo is also linked to current tags'] = '%d resim aynı zamanda bu işaretlere sahip';
+$lang['%d photo'] = '%d resim';
+$lang['%d photos are also linked to current tags'] = '%d resimler aynı zamanda bu işaretlere sahip';
+$lang['%d photos'] = '%d resimler';
+$lang['%d rates'] = '%d oylar';
+$lang['(!) This comment requires validation'] = '(!) Bu yorum onaylama gerekmektedir.';
+$lang['A comment on your site'] = 'sitenize yorum yapıldı';
+$lang['About Piwigo'] = 'Kaynak Yazılım Hakkında';
+$lang['About'] = 'Hakkımızda';
+$lang['Accelerate diaporama speed'] = 'slayt gösterisi hızını yükselt';
+$lang['Add a comment'] = 'Yorum Ekle';
+$lang['add this photo to your favorites'] = 'Bu resimi favorilerinize ekleyin';
+$lang['Admin: %s'] = 'Yönetici: %s';
+$lang['Administration'] = 'Yönetim';
+$lang['Album results for'] = 'Albüm sonuçları';
+$lang['Album'] = 'Albüm';
+$lang['Album: %s'] = 'Albüm: %s';
+$lang['Albums'] = 'Albümler';
+$lang['All tags'] = 'Tüm Etiketler';
+$lang['All'] = 'Hepsi';
+$lang['all'] = 'Hepsi';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Yorumunuzun görünür olabilmesi için yönetici tarafindan onaylanmasi gerekir.';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Anti-flood sistemi : lütfen bir müddet bekledikten sonra ikinci yorumu gönderiniz';
+$lang['Any tag'] = 'Herhangi Etiket';
+$lang['Are you sure?'] = 'Emin misiniz?';
+$lang['ascending'] = 'Artan';
+$lang['At least one listed rule must be satisfied.'] = 'Bir listeleme kriteri seçilmeli.';
+$lang['Author'] = 'Yazar';
+$lang['author(s) : %s'] = 'Yazar(lar) : %s';
+$lang['Author: %s'] = 'Yayımcı: %s';
+$lang['Auto login'] = 'otomatik giriş';
+$lang['available for administrators only'] = 'Yöneticilere Özel';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Kullanıcı için kötü statü "ziyaretçi", varsayılan statü kullanılıyor. Lütfen webmaster\'a bildirin';
+$lang['Best rated'] = 'En çok oylanan';
+$lang['Browser: %s'] = 'Web Tarayıcı: %s';
+$lang['Calendar'] = 'Takvim';
+$lang['Change my password'] = 'Şifremi değiştir';
+$lang['Check your email for the confirmation link'] = 'E-postanızı onaylama bağlantısı için kontrol ediniz.';
+$lang['chronology_monthly_calendar'] = 'Aylık Takvim';
+$lang['chronology_monthly_list'] = 'Aylık Liste';
+$lang['chronology_weekly_list'] = 'Haftalık Liste';
+$lang['Click here if your browser does not automatically forward you'] = 'Eğer otomatik olarak yönlendirilmediyseniz tıklayınız.';
+$lang['Click on the photo to see it in high definition'] = 'yüksek çözünürlükte görmek için resima tıklayın';
+$lang['Close this window'] = 'Pencereyi Kapat';
+$lang['cloud'] = 'yapabildi';
+$lang['Comment by %s'] = 'Yorumlayan %s';
+$lang['comment date'] = 'Yorum Tarihi';
+$lang['Comment'] = 'Yorum';
+$lang['Comment: %s'] = 'Yorum: %s';
+$lang['Comments'] = 'Yorumlar';
+$lang['Complete RSS feed (photos, comments)'] = ' RSS besleme tamamla  (resimler, yorumlar)';
+$lang['Confirm Password'] = 'Şifreyi Onayla';
+$lang['Connected user: %s'] = 'Kullanıcıya bağlanılıyor: %s';
+$lang['Connection settings'] = 'Bağlantı Ayarları';
+$lang['Contact webmaster'] = 'Site Yöneticisi';
+$lang['Contact'] = 'iletişim';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'çerezler engelli yada web tarayıcınız tarafından desteklenmiyor. Giriş yapmak için çerezlere izin verin .';
+$lang['Create a new account'] = 'Yeni kullanıcı hesabı oluştur';
+$lang['created after %s (%s)'] = 'Şundan Sonra Oluşturuldu %s (%s)';
+$lang['created before %s (%s)'] = 'Şundan Önce Oluşturuldu %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'Şununla Beraber Oluşturuldu %s (%s) ve %s (%s)';
+$lang['created on %s'] = 'Oluşturulma zamanı %s';
+$lang['Created on'] = 'Oluşturuldu';
+$lang['Creation date'] = 'Oluşturulma Tarihi';
+$lang['Current password is wrong'] = 'Yanlış Parola';
+$lang['customize the appareance of the gallery'] = 'Galeri görünümünü düzenle';
+$lang['Customize'] = 'Profil';
+$lang['Date'] = 'tarih';
+$lang['day'][0] = 'Pazar';
+$lang['day'][1] = 'Pazartesi';
+$lang['day'][2] = 'Salı';
+$lang['day'][3] = 'Çarşamba';
+$lang['day'][4] = 'Perşembe';
+$lang['day'][5] = 'Cuma';
+$lang['day'][6] = 'Cumartesi';
+$lang['Default'] = 'Varsayılan';
+$lang['delete all photos from your favorites'] = 'favorilerinizdeki tüm resimlerı silin';
+$lang['delete this photo from your favorites'] = 'bu resimi favorilerinizden çıkarın';
+$lang['Delete'] = 'Sil';
+$lang['descending'] = 'Azalan';
+$lang['Dimensions'] = 'boyutları';
+$lang['display a calendar by creation date'] = 'oluşturma tarihini takvimde göster';
+$lang['display a calendar by posted date'] = 'gönderme gününü takvimde göster';
+$lang['display a set of random photos'] = 'rastgele birkaç resim göster';
+$lang['display all photos in all sub-albums'] = 'albümlere ve alt albümlere ait bütün elemanları göster';
+$lang['display available tags'] = 'Uygun Etiketler';
+$lang['display best rated photos'] = 'Çok oy alan ürünü gösterir';
+$lang['display each day with photos, month per month'] = 'Ay AY her günün ürünlerini gösterir';
+$lang['display last user comments'] = 'Son yorumları göster';
+$lang['display most recent photos'] = 'En son eklenen resimleri göster';
+$lang['display most visited photos'] = 'en çok görüntülenen resimlerı göster';
+$lang['display only recently posted photos'] = 'sadece yakın zamanda gönderilen resimlerı göster';
+$lang['display photos linked to this tag'] = 'sadece bu işarete sahip resimlerı göster';
+$lang['display recently updated albums'] = 'Son güncellenen albümleri göster';
+$lang['display this album'] = 'bu albüm kökündeki resimleri gösterir';
+$lang['display your favorites photos'] = 'Favori resimlerimi listele';
+$lang['Display'] = 'Görünüm';
+$lang['Download this file'] = 'Bu Dosyayı İndir';
+$lang['Download'] = 'İndir';
+$lang['Each listed rule must be satisfied.'] = 'Tüm listeleme kuralları seçilmeli.';
+$lang['Edit a comment'] = 'yorumu değiştir';
+$lang['Edit'] = 'Düzenle';
+$lang['Email address is missing. Please specify an email address.'] = 'E-Posta Adresi Kayıp. Lütfen E-Posta adresinizi doğrulayınız..';
+$lang['Email address'] = 'E-posta Adresi';
+$lang['Email: %s'] = 'E-Posta: %s';
+$lang['Empty query. No criteria has been entered.'] = 'boş sorgulama. arama kriteri girilmedi.';
+$lang['End-Date'] = 'tarih sonu';
+$lang['Enter your new password below.'] = 'Yeni şifrenizi alt kısıma giriniz';
+$lang['Enter your personnal informations'] = 'Kişisel Bilgilerinizi Giriniz';
+$lang['Error sending email'] = 'E-posta Gönderilemedi';
+$lang['excluded'] = 'Hariç';
+$lang['EXIF Metadata'] = 'EXIF Meta verisi';
+$lang['Expand all albums'] = 'albümleri genişlet';
+$lang['Favorites'] = 'Favoriler';
+$lang['File name'] = 'Dosya Adı';
+$lang['File'] = 'Dosya';
+$lang['Filesize'] = 'Dosya Boyutu';
+$lang['Filter and display'] = 'Filtrele ve Görüntüle';
+$lang['Filter'] = 'Filtrele';
+$lang['First'] = 'İlk';
+$lang['Forgot your password?'] = 'Şifrenizi mi Unuttunuz?';
+$lang['from %s to %s'] = 'şundan %s buna %s';
+$lang['Go through the gallery as a visitor'] = 'Ziyaretçi olarak görüntüle';
+$lang['group by letters'] = 'harf grubu';
+$lang['guest'] = 'Misafir';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'merhaba %s, Piwigo fotoğraf galeriniz boş!';
+$lang['Hello'] = 'Merhaba';
+$lang['Help'] = 'Yardım';
+$lang['Home'] = 'Anasayfa';
+$lang['html tags are not allowed in login'] = 'girişte html etiketleri kullanılamaz';
+$lang['I want to add photos'] = 'fotoğraf eklemek istiyorum';
+$lang['Identification'] = 'Kimlik';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Eğer bu bir hata ise, bu e-postayı görmezden geliniz.';
+$lang['in %d sub-album'] = '%d alt albüm';
+$lang['in %d sub-albums'] = '%d alt albüm';
+$lang['in this album'] = ' bu albüm içinde';
+$lang['included'] = 'dahili';
+$lang['Interface theme'] = 'Arayüz Temaları';
+$lang['Invalid key'] = 'Hatalı anahtar';
+$lang['Invalid password!'] = 'Yanlış Parola!';
+$lang['Invalid username or email'] = 'Hatalı kullanıcı adı veya e-posta';
+$lang['IP: %s'] = 'IP: %s';
+$lang['IPTC Metadata'] = 'IPTC Meta verisi';
+$lang['Keyword'] = 'Anahtar Kelime';
+$lang['Kind of date'] = 'tarih çeşidi';
+$lang['Language']='Dil';
+$lang['large'] = "büyük";
+$lang['last %d days'] = 'Son %d Gün';
+$lang['Last'] = 'Son';
+$lang['letters'] = 'harfler';
+$lang['Links'] = 'Bağlantılar';
+$lang['login mustn\'t end with a space character'] = 'kullanıcı adı boşluk tuşuyla bitemez';
+$lang['login mustn\'t start with a space character'] = 'kullanıcı adı boşluk tuşu ile başlayamaz';
+$lang['Login'] = 'Giriş';
+$lang['Logout'] = 'Çıkış';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-Posta yandaki gibi olmalıdır  xxx@yyy.eee (örnek : jack@altern.org)';
+$lang['Manage this user comment: %s'] = 'bu kullanıcının yorumunu yönet: %s';
+$lang['Maximum height must be a number superior to 50'] = 'Maximum yükseklik 50';
+$lang['Maximum photo height'] = 'Maximum Resim Yüksekligi';
+$lang['Maximum photo width'] = 'Maximum Resim Genisligi';
+$lang['Maximum width must be a number superior to 50'] = 'Maximum Yükseklik 50';
+$lang['medium'] = "orta";
+$lang['Menu'] = 'Menü';
+$lang['month'][1] = "Ocak";
+$lang['month'][2] = "Şubat";
+$lang['month'][3] = "Mart";
+$lang['month'][4] = "Nisan";
+$lang['month'][5] = "Mayıs";
+$lang['month'][6] = "Haziran";
+$lang['month'][7] = "Temmuz";
+$lang['month'][8] = "Ağustos";
+$lang['month'][9] = "Eylül";
+$lang['month'][10] = "Ekim";
+$lang['month'][11] = "Kasım";
+$lang['month'][12] = "Aralık";
+$lang['Most visited'] = 'En çok görüntülenenler';
+$lang['N/A'] = 'N/A';
+$lang['New on %s'] = 'Yeni %s';
+$lang['New password'] = 'yeni şifre';
+$lang['Next'] = 'sonraki';
+$lang['no rate'] = 'puan verilmemiş';
+$lang['No'] = 'hayır';
+$lang['Not repeat the slideshow'] = 'slayt gösterisini tekrar etme';
+$lang['Notification'] = 'Hatırlatma';
+$lang['Number of items'] = 'Ürün adedi';
+$lang['Number of photos per page'] = 'Sayfa başına fotoğraf sayısı';
+$lang['obligatory'] = 'obligatori';
+$lang['Original dimensions'] = 'Orijinal boyutlar';
+$lang['Original'] = "asıl";
+$lang['Page generated in'] = 'Sayfa oluşturulma';
+$lang['Password forgotten'] = 'Unutulmuş Parola';
+$lang['Password reset is not allowed for this user'] = 'Şifre yenileme bu kullanıcı için kabul edilmedi';
+$lang['Password Reset'] = 'Şifreyi yenile';
+$lang['password updated'] = 'şifre değiştirildi';
+$lang['Password'] = 'Parola';
+$lang['Pause of slideshow'] = 'slayt gösterisini dondur (Pause)';
+$lang['photo'] = 'resim';
+$lang['Photos only RSS feed'] = 'Yanlizca Resim - RSS';
+$lang['photos posted during the last %d days'] = 'son %d günde gösterilen resimler';
+$lang['Photos posted within the last %d day.'] = 'içerik en son %d gün önce yüklendi.';
+$lang['Photos posted within the last %d days.'] = 'içerikler en son %d gün önce yüklendi.';
+$lang['Piwigo Help'] = 'Piwigo yardım';
+$lang['Play of slideshow'] = 'slayt gösterisini başlat';
+$lang['please enter your password again'] = 'lütfen şifrenizi tekrar giriniz';
+$lang['Please enter your username or email address.'] = 'Lütfen kullanıcı adınızı veya e-postanızı giriniz.';
+$lang['Please, enter a login'] = 'lütfen kullanıcı adınızı giriniz';
+$lang['Post date'] = 'Gönderim Tarihi';
+$lang['posted after %s (%s)'] = 'Şundan sonra gönderildi %s (%s)';
+$lang['posted before %s (%s)'] = 'Şundan önce gönderildi %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'Şununla birlikte gönderildi %s (%s) ve %s (%s)';
+$lang['posted on %s'] = 'Gönderildi %s';
+$lang['Posted on'] = 'Gönderim Saati';
+$lang['Powered by'] = 'destekleyen :';
+$lang['Preferences'] = 'özellikler';
+$lang['Previous'] = 'önceki';
+$lang['Profile'] = 'Profil';
+$lang['Quick connect'] = 'Kolay Irtibat';
+$lang['Quick search'] = 'Hızlı arama';
+$lang['Random photos'] = 'Karışık resimler';
+$lang['Rank'] = 'kademe';
+$lang['Rate this photo'] = 'resime puan ver';
+$lang['Rating score'] = 'Oy sayısı';
+$lang['Recent albums'] = 'Son albümler';
+$lang['Recent period must be a positive integer value'] = 'yakın dönem pozitif tam sayı değere sahip olmalıdır';
+$lang['Recent period'] = 'Yakın dönem';
+$lang['Recent photos'] = 'Son eklenenler';
+$lang['Redirection...'] = 'yeniden yönlendiriliyor...';
+$lang['Reduce diaporama speed'] = 'slayt gösterisi hızını azalt';
+$lang['Register'] = 'Kayıt Ol';
+$lang['Registration of %s'] = 'Tescil Eden: %s';
+$lang['Registration'] = 'Kullanıcı Kaydı';
+$lang['Related tags'] = 'İlgili Etiketler';
+$lang['remove this tag from the list'] = 'listedeki işaretlemeyi kaldır';
+$lang['Repeat the slideshow'] = 'slayt gösterisini tekrar et';
+$lang['representative'] = 'Temsilci';
+$lang['Reset to default values'] = 'fabrika ayarlarına dönüş';
+$lang['Reset'] = 'Sıfırla';
+$lang['Retrieve password'] = 'Parolayi Getir';
+$lang['Return to home page'] = 'Anasayfaya dön';
+$lang['return to normal view mode'] = 'normal görüntü moduna geri dön';
+$lang['return to the display of all photos'] = 'tüm resimlerı göster';
+$lang['RSS feed'] = 'RSS Beslemesi';
+$lang['Search by date'] = 'tarihe göre ara';
+$lang['Search for all terms'] = 'tüm terimlerde ara';
+$lang['Search for any term'] = 'herhangi bir terimde ara';
+$lang['Search for Author'] = 'yayımcı kullanıcı adıyla ara';
+$lang['Search for words'] = 'kelimelerde ara';
+$lang['Search in albums'] = 'Albümlerde ara';
+$lang['Search in sub-albums'] = 'Altalbümlerde Ara';
+$lang['Search results'] = 'Arama sonuçları';
+$lang['Search rules'] = 'Arama Kriteri';
+$lang['Search tags'] = 'Arama Etiketi';
+$lang['Search'] = 'Arama';
+$lang['search'] = 'Arama';
+$lang['searched words : %s'] = 'aranan kelimeler : %s';
+$lang['Sent by'] = 'gönderen';
+$lang['set as album representative'] = 'albüm temsilcisi oalrak ayarla';
+$lang['Show file metadata'] = 'dosyanin meta verilerini göster';
+$lang['Show number of comments'] = 'yorumların sayısını göster';
+$lang['Show number of hits'] = 'Ziyaret sayısını göster';
+$lang['show tag cloud'] = 'yapılabilir işaretleri göster';
+$lang['Since'] = 'Şu tarihten beri:';
+$lang['slideshow'] = 'slayt gösterisi';
+$lang['small'] = "küçük";
+$lang['Someone requested that the password be reset for the following user account:'] = 'Birisi aşağıdaki kullanıcı için yeniden şifre istedi';
+$lang['Sort by'] = 'Sırala';
+$lang['Sort order'] = 'Sıralama Düzeni';
+$lang['Specials'] = 'Özeleştirmeler';
+$lang['SQL queries in'] = 'SQL Sorgulaması';
+$lang['square'] = "kare";
+$lang['stop the slideshow'] = 'slayt gösterisini durdur';
+$lang['Submit'] = 'gönder';
+$lang['Tag results for'] = 'işaretleme sonuçları';
+$lang['Tag'] = 'Etiket';
+$lang['Tags'] = 'Etiketler';
+$lang['the beginning'] = 'başlangıç';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Bakım çalışmaları nedeniyle kapalıyız. Daha sonra tekrar kontrol edin.';
+$lang['The number of photos per page must be a not null scalar'] = 'Sayfa başına fotoğraf sayısı sıfırdan farklı bir tamsayı olmalıdır';
+$lang['The passwords do not match'] = 'Şifreler eşleşmiyor';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Bu RSS beslemesi bu siteden yeni resimler, güncellenen albümler, yeni yorumlar içerir. Bir RSS okuyucu ile kullanılabilir';
+$lang['the username must be given'] = 'kullanıcı adı gerekmektedir';
+$lang['This author modified following comment:'] = 'bu yayımcı gönderdiği yorumu değiştirmiştir:';
+$lang['This author removed the comment with id %d'] = 'bu yayımcı id numarası %d olan yorumu silmiştir';
+$lang['this email address is already in use'] = 'bu e-posta adresi başka bir kullanıcı tarafından kullanılmaktadır.';
+$lang['This login is already used by another user'] = 'Bu kullanıcı adı kullanımda';
+$lang['this login is already used'] = 'seçtiğiniz kullanıcı adı kullanılmaktadır';
+$lang['thumb'] = "küçük";
+$lang['Thumbnails'] = 'Küçük resimler';
+$lang['To reset your password, visit the following address:'] = 'Şifrenizi yenilemek için bu adrese gidiniz:';
+$lang['today'] = 'bugün';
+$lang['Unknown feed identifier'] = 'Bilinmeyen besleme kimliği';
+$lang['Unknown identifier'] = 'bilinmeyen kimlik';
+$lang['Update your rating'] = 'puanlamayı güncelle';
+$lang['useful when password forgotten'] = 'şifrenizi mi unuttunuz';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Kullanıcı "%s" e-posta adresi belirtmemiş, yeniden şifre alması imkansız';
+$lang['User comments'] = 'Ziyaretçi Yorumları';
+$lang['User: %s'] = 'Kullanıcı: %s';
+$lang['Username "%s" on gallery %s'] = 'Kullanici adi "%s" zaten galeride %s';
+$lang['Username or email'] = 'Kullanıcı adı veya e-posta';
+$lang['Username'] = 'Kullanıcı Adı';
+$lang['View'] = 'Görünüm';
+$lang['Visits'] = 'Ziyaret';
+$lang['Webmaster'] = 'Site Yöneticisi';
+$lang['Week %d'] = 'Hafta %d';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Piwigo fotoğraf galerisine hoş geldiniz!';
+$lang['Welcome'] = 'Hoşgeldiniz';
+$lang['wrong date'] = 'Yanlış Tarih';
+$lang['xlarge'] = "geniş";
+$lang['xxlarge'] = "çok büyük";
+$lang['Yes'] = 'evet';
+$lang['You are not authorized to access the requested page'] = 'Bu sayfaya erişmeye yetkiniz yok';
+$lang['You will receive a link to create a new password via email.'] = 'E-posta yoluyla yeni bir şifre oluşturmak için bir bağlantı alacaksınız.';
+$lang['Your comment has been registered'] = 'Yorumunuz kaydedildi';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Doğrulama kriterlerini geçemedigi için yorumunuz kayit edilmedi';
+$lang['Your favorites'] = 'Favorilerim';
+$lang['Your Gallery Customization'] = 'Galeri Özelleştirmesi ';
+$lang['Your password has been reset'] = 'Şifreniz yenilendi';
+$lang['Hello %s,'] = 'Merhaba %s,';
+$lang['Send my connection settings by email'] = 'Bağlantı ayarlarımı eposta yoluyla gönder';
+$lang['Show latest comments first'] = 'Yeni yorumları başta göster';
+$lang['Show oldest comments first'] = 'Eski yorumları baştar göster';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Başarılı olarak kayıt oldunuz, yakında size bağlatını ayarlarınızı içeren bir eposta alacaksınız. Hoşgeldiniz.';
+$lang['Username modification'] = 'Kullanıcı adı değişikliği';
+$lang['edit'] = 'düzenle';
+$lang['2small'] = 'XXS - minicik';
+$lang['Thank you for registering at %s!'] = '%s de kayıt olmanız için teşekkürler!';
+$lang['Your username has been successfully changed to : %s'] = 'Kullanıcı adınız başarılı şekilde %s olarak değiştirildi.';
+$lang['xsmall'] = 'XS - çok küçük';
+?>
Index: tags/2.4.0RC3/language/tr_TR/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Sanal Albümler Taşınıyor</h2>
+
+<p>Sadece sanal albümler yeni bir ana albüm alabilir.</p>
+
+<h3>Taşınacak Sanal Albümler</h3>
+
+<p>Taşımak istediğiniz bir veya daha fazla sanal albümü seçiniz. 
+Bu liste boş ise, bu demektir ki henüz bir sanal albümünüz yok.</p>
+
+<h3>Yeni Ana Albüm</h3>
+
+<p>Sana yada fiziksel yeni bir ana albüm seçiniz. 
+Eğer ana albüm seçmezseniz, seçilen sana albümler root bölümüne taşınacaktır.
+Bir albüm kendi içine ya da kendi alt albümü içine taşınamaz.</p>
Index: tags/2.4.0RC3/language/tr_TR/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/cat_options.html	(revision 14585)
@@ -0,0 +1,21 @@
+<h2>Albüm seçenekleri</h2>
+
+<p>Aynı anda birkaç albüm için seçenekler yönetimi.</p>
+
+<dl>
+
+<dt>Yorumlar</dt>
+<dd>Bir resim eğer albüme bağlı ve yorum ayarları etkin ise kullanıcılarınız tarafından yorumlanabilir.</dd>
+
+<dt>Kilit</dt>
+<dd>Kilitli albümler bakım için devre dışıdır. Yalnızca yöneticiler bu albümleri galeride görüntüleyebilir.</dd>
+<dt>Özel / Genel</dt>
+<dd>Bir albüm özel olduğu zaman, kullanıcı ve gruplara gerekli izinleri veriniz</dd>
+
+<dt>Temsilci</dt>
+<dd>Yapılandırma ayarlarını tamamladığınızda bu seçenek etkinleşecektir
+<code>allow_random_representative</code> (bakınız ve <span
+ class="filename">include/config_defaults.inc.php</span>)
+<em>doğrulayınız</em>. Her albüm rastgele bir resim ya da eşsiz bir temsilci olarak seçilen bir resim ile temsil edilebilir.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/tr_TR/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>Albüm izinleri düzenle</h2>
+
+<p>Bu ekran sadece özel albümler içindir. Burada kullanıcılar ve gruplar için albüm izinlerini düzenleyebilirsiniz.</p>
+
+<h3>Gruplar</h3>
+
+<p>Bu albüm için gruplara erişim izin verebilir veya reddedebilirsiniz. Grup izinlerini değiştirerek, gruba bağlı olan kullanıcıların albüm erişim izni olup olmamasını düzenleyebilirsiniz.</p>
+
+<h3>Kullanıcılar</h3>
+
+<p>Kullanıcılar için kişisel erişim izni verebilir veya reddedebilirsiniz. Bir albüme grup erişim izni olan kullanıcın bu şekilde erişimi iptal edilebilir.</p>
Index: tags/2.4.0RC3/language/tr_TR/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/configuration.html	(revision 14585)
@@ -0,0 +1,117 @@
+<h2>Yapılandırma</h2>
+
+<p>Bu ekranda yönetici temel yapılandırma yapabilir. Nitekim, bu ekran sadece basit yapılandırma parametreleri gösterir, yöneticilerin büyük çoğunluğu için yeterli olacaktır. Eğer diğer sayısız (ve ileri) yapılandırma parametrelerini görmek istiyorsanız <span
+class="filename">include/config_default.inc.php</span> dosyasını okuyunuz.</p>
+
+<p>Bu ekran birkaç bölüme ayrılmıştır, temaya göre yapılandırma parametrelerini yeniden gruplama.</p>
+
+
+<h3>Ana</h3>
+<ul>
+  <li><strong>Galeri başlığı</strong>: E-posta bildirimleri ile RSS beslemelerinde kullanılan.</li>
+
+  <li><strong>Sayfa afişi</strong>: her bir genel sayfanın üst kısmında görüntülenen.</li>
+
+  <li><strong>Galeri URLsi</strong>: RSS beslemelerinde kullanılan.</li>
+
+  <li><strong>Galeri Kilidi</strong>: Bakım için tüm galeriyi kilitle.
+  Sadece yöneticiler galeriye ulaşabilecektir.
+  </li>
+
+  <li><strong>Derecelendirme</strong>: Resim derecelendirme özelliği açıldı.</li>
+
+  <li><strong>Misafir Derecelendirmeleri</strong>: Kayıtlı olmayan kullanıcılar resimleri derecelendirebilir.</li>
+
+  <li><strong>Kullanıcı kaydına izin ver</strong>: Herkes kayıt olabilir..</li>
+
+  <li><strong>E-Posta adresi, tüm kullanıcılar için zorunludur</strong>: işlemin yönetici tarafından yapılması durumu hariç, kayıt ve profil güncellemede kontrol edilecektir .</li>
+
+  <li><strong>Yeni bir kullanıcı kayıt olduğunda yöneticiye e-posta gönder</strong>: yöneticiler her kayıt için bir e-posta ile bildirilir.</li>
+
+</ul>
+
+<h3>Geçmiş</h3>
+
+  <p>Sayfa ziyaretleri <span
+  class="pwgScreen">category.php</span> ve <span
+  class="pwgScreen">picture.php</span>
+  <code>geçmiş</code> tablosunda kayıt edilecektir.</p>
+
+  <p>Ziyaretler <span
+  class="pwgScreen">Yönetim &raquo; Araçlar &raquo; Geçmiş</span> bölümünde gösterilecektir.</p>
+
+<ul>
+  <li><strong>Misafirler tarafından ziyaret edilen sayfaları kaydet</strong>: misafirlerin sayfa ziyaretleri kayıt altına alınacaktır.</li>
+
+  <li><strong>Kayıtlı kullanıcılar tarafından ziyaret edilen sayfaları kaydet</strong>: Kayıtlı kullanıcıların sayfa ziyaretleri kayıt altına alınacatırk.</li>
+
+  <li><strong>Yöneticiler tarafından ziyaret edilen sayfaları kaydet</strong>: Yöneticilerin sayfa ziyaretleri kayıt altına alınacaktır.</li>
+
+</ul>
+
+<h3>Yorumlar</h3>
+<ul>
+
+  <li><strong>Herkes yorum yapabilir</strong>: Misafirler dahil herkes yorum yapabilir.</li>
+
+  <li><strong>Sayfa başına yorum sayısı</strong>.</li>
+
+  <li><strong>Onaylama</strong>: yorumlar bir yöneticinin onayından geçmeden sitede görünür hale gelemez. Kullanıcı yorumlarını doğrulama ekranı <span class="pwgScreen">Yönetim &raquo; Araçlar &raquo; Bekleyen Yorumlar</span> da yer alır.</li>
+
+  <li><strong>Bir yorum eklendiği zaman yöneticilere e-posta gönder</strong>:
+Bir kullanıcı yorum yaptığı ve bu yorum onaylandığı zaman yöneticilere e-posta gönder.</li>
+
+  <li><strong>Bir yorum onaylama beklediği zaman yöneticilere e-posta gönder</strong>:
+Bir kullanıcı yorum gönderdiği ve bu yorum yönetici onayı beklediği zaman yöneticilere e-posta gönder.
+Kullanıcı yorum doğrulama ekranı  <span class="pwgScreen">Yönetim, Araçlar, Yorumlar</span>.</li>
+
+</ul>
+
+<h3>Yükleme</h3>
+<ul>
+  <li><strong>Resim yükleme linkini her zaman göster</strong>: Yüklenebilir albüm varsa, bir yükleme linki her albümde görünecek.</li>
+  <li><strong>Yükleme için kullanıcı erişim seviyesi</strong>: Kullanıcıların bazı albümlere yüklemesini kısıtla</li>
+  <li><strong>Bir resim yüklendiği zaman yöneticilere e-posta gönder</strong>: Yöneticiler her yeni bir resim yüklendiğinde bir e-posta ile haberdar edilecektir.</li>
+</ul>
+
+<h3>Varsayılan Görüntüleme</h3>
+
+<p>Burada misafirler için galerinizin nasıl görüntülenmesi gerektiği ayarlarını yapabilirsiniz. Kullanıcı giriş yaptığı zaman kendi özel görüntüleme ayarları geçerli olacaktır.
+(Düzenleme için <span class="pwgScreen">profil</span>) ayarlarına giriniz.</p>
+
+<p>Kayıtlı kullanıcıların görüntüleme ayarlarını değiştirmek için <span class="pwgScreen">Yönetim &raquo;
+Kullanıcılar &raquo; Yönet</span> penceresine gidiniz ve görüntüleme ayarlarını değiştirmek istediğiniz kullanıcıları seçerek yeni ayarları yapınız.</p>
+
+<ul>
+
+  <li><strong>Dil</strong>: Sadece Piwigo etiketleri için geçerlidir.
+  Albüm ve resim isimleri ile açıklamaları kapsamaz.
+  </li>
+
+  <li><strong>Satır başına fotoğraf sayısı</strong></li>
+
+  <li><strong>Sayfa başına satır sayısı</strong></li>
+
+  <li><strong>Tema arayüzü</strong></li>
+
+  <li><strong>Son dönem</strong>: Gün olarak. Dönem sırasında eklenen resimler yeni olarak gösterilir.
+  1 günden fazla olmalıdır.
+  </li>
+
+  <li><strong>Bütün albümleri genişlet</strong>: Varsayılan olarak bütün albümleri menüde genişlet <em>Uyarı</em>: bu seçenek kaynakları tükertir (sayfa yavaşlar)
+  ve eğer çok fazla albümünüz varsa büyük bir menü oluşturur.</li>
+
+  <li><strong>Yorum sayısını göster</strong>: küçük resimler sayfadasındaki her resim için yorum sayısını göster. Kaynakları tükertir (sayfa yavaşlar).</li>
+
+  <li><strong>Ziyaret sayısını göster</strong>: ziyaret sayılarını küçük resimlerin altında göster.
+  Yalnızca gelişmiş yapılandırma parametresi: <br>
+  $conf['show_nb_hits'] = true; <br>
+  Not: false varsayılandır.</li>
+
+  <li><strong>resimlerin azami genişliği</strong>: azami görüntülenen genişlik.
+  Bu ayardan daha büyük olan resimler yeniden boyutlandırılacaktır.
+  Bu ayarı kullanmaktan ziyade, resimlerinizin genişliğini değiştirmek daha iyi bir uygulama olacaktır.</li>
+
+  <li><strong>resimlerin azami yüksekliği</strong>: genişlik için olan sözler bu özellik içinde geçerlidir.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/tr_TR/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Gruplar listesi</h2>
+
+<p>Burası Grupları yöneteceğiniz bölümdür.</p>
+
+<h3>Grup Ekle</h3>
+
+<p>Yöneticiler grup ekleyebilir.</p>
+
+<h3>Gruplar listesi</h3>
+
+<p>Her bir seçenek için, şunlar sağlanır:</p>
+
+
+<ul>
+  <li>Üye listesini görebilme</li>
+  <li>İzinler yönetim bölümünü görebilme</li>
+  <li>Grup silebilme (oner gerektirir)</li>
+  <li>Geçiş durumu "varsayılan" (bir onay gerektirir)</li>
+</ul>
+
+<h3>Varsayılan gruplar</h3>
+<p>Varsayılan gruplar yenibir kullanıcı kayıt olduğuna veya yönetici oluşturduğunda otomatik olarak alınan gruplardır.</p>
Index: tags/2.4.0RC3/language/tr_TR/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,26 @@
+<p>Galerinize resim eklemek için farklı yollar:</p>
+
+<ul>
+  <li><strong>Doğrudan yükleme</strong> Web tarayıcısı içinde
+  ve en hızlı basit yolu. Tarayıcınızın ve web sunucunuzun yeteneklerine bağlıdır.
+  büyük miktarda ki resim yüklemelerinde veya bazı sorunlarla karşılaştığınızda,
+  diğer yöntemler sizi bekliyor!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Doğrudan yüklemeye git</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> bir masaüstü uygulamasıdır, bilgisayarınızda yüklü olması gerekmektedir. pLoader penceresine resimlerinizi sürükle &amp; bırak yöntemi ile alınız , <em>"Upload to Piwigo"</em> tıklayınız ve pLoader'in bütün işlemi yapmasına izin verin. Başka bir masaüstü uygulaması ise <strong>WinToPiwigo</strong> veya <strong>Digikam</strong> ile Piwigo galerinize resimlerinizi yükleyebilirsiniz.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">pLoader'e git</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP transferi</strong> tavsiye edilen yol olmakla birlikte, çok az sayıda tıklama ile bir çok resim eklemeniz mümkündür. Fotoğraflarınızı hazırlamak için kılavuza uyun.
+  FTP yöntemi kesin olarak sunucu üzerinde fotoğraflarınızın fiziksel organizasyonu kontrolü sağlar.
+  </li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">FTP'ye git</a></p>
+</div>
Index: tags/2.4.0RC3/language/tr_TR/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/help_groups.html	(revision 14585)
@@ -0,0 +1,10 @@
+<p>Gruplar bir liste kullanıcının izinlerini ayarlamak için uygun bir yoldur.</p>
+
+<p>Grup oluşturmak için <span class="pwgScreen">Yönetim &raquo; Kullanıcılar
+&raquo; Gruplar</span> bölümüne ve kullanıcıyı gruba eklemek için
+in <span class="pwgScreen">Yönetim &raquo; Kullanıcılar &raquo;
+Yönet</span>bölümlerine göz atınız.</p>
+
+<p>Bir kullanıcı birden fazla gruba üye olabilir. Yetkiler önceliklidir : eğer "Erkan" grup "aile" ve "arkadaşlar" üyesi ise, ve
+sadece "aile" grubu albüm "Yılbaşı 2011" görebilirse
+"Erkan" da albüm "Yılbaşı 2011" görebilecektir.</p>
Index: tags/2.4.0RC3/language/tr_TR/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Galerinizi oluşturdukdan sonra ziyaretçileriniz için ayarlamalar yapabilirsiniz
+<ul>
+	<li>Varsayılan görünüm ayarları <span class="pwgScreen">Yönetim &raquo; Yapılandırma &raquo; Seçenekler</span> bölümündeki <span class="pwgScreen">Misafir Ayarları</span> sekmesindedir</li>
+	<li>Varsayılan tema ayarları <span class="pwgScreen">Yönetim &raquo; Yapılandırma &raquo; Temalar</span></li>
+	<li>Varsayılan dil ayarları <span class="pwgScreen">Yönetim &raquo; Yapılandırma &raquo; Diller</span></li>
+ </ul>
+ Varsayılan olarak her yeni kayıtlı kullanıcı bu özellikleri alır.
+</p>
+<p>Eğer bir sorunuz varsa, Piwigo topluluğu sizi <a href="http://piwigo.org/forum">forumlarında</a> ağırlamaktan memnuniyet duyar.</p>
Index: tags/2.4.0RC3/language/tr_TR/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,54 @@
+<fieldset>
+<legend>Resim izinleri</legend>
+
+<p>Her resim bir <strong>gizlilik derecesine</strong> sahiptir. Her bir kullanıcı da gizlilik derecesine sahiptir. Tam olarak 5 gizlilik derecesi bulunmaktadır:</p>
+<ol>
+  <li>Hiç kimse</li>
+  <li><em>Kişiler</em></li>
+  <li><em>Arkadaşlar (kişilerden bir üst derecedir )</em></li>
+  <li><em>Aile (arkadaşlardan bir üst derecedir)</em></li>
+  <li><em>Yöneteciler (diğer derecelerden üst derecedir)</em></li>
+</ol>
+
+<p>Üst derecelerin alt derecelerde izinleri vardır. Bir kullanıcıya üst derece verilirse daha fazla resim görebilir.</p>
+
+<p>Örneğin, eğer resim "peter_wedding-0024.jpg"<em>"Aile"</em> gizlilik derecesine sahip ise:</p>
+<ul>
+  <li>Peter (kim ki bir <em>"Yönetici"</em>) bu resmi görecektir çünkü <em>"Yöneticiler"</em> bütün resimleri görebilir</li>
+  <li>Beth (kim ki bir <em>"Aile"</em> member) bu resmi görecektir</li>
+  <li>Mary (kim ki bir <em>"Arkadaşlar"</em>) bu resmi göremeyecektir</li>
+</ul>
+
+<p>Bir albümün içeriğini görme izni olmayan kullanıcı bu albümü, başlığını ve etiketlerini de göremez.</p>
+
+<p>Kullanıcı izinlerini <span class="pwgScreen">Yönetim &raquo; Kullanıcılar &raquo; Yönet</span> screen.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Albüm izinleri</legend>
+
+<p>Gizlilik seviyesi ihtiyaçlarınızı karşılamıyor ise, ayrıca bir kullanıcı veya grup için albüm izinleri ayarlayabilirsiniz. Resim ve albümler üzerinde çatışma olmadan izinler ayarlanabilir.</p>
+
+<p>Albümlere erişim yasaklanabilir. Albüm erişim iznine "özel" yaparak izinleri yönetebilirsiniz.</p>
+
+<p>Bir albümü düzenleyerek "özel" yapabilirsiniz
+(<span class="pwgScreen">Yönetim &raquo; Albümler &raquo; Yönet
+&raquo; düzen</span>) veya bütün albümlerin özelliklerini
+(<span class="pwgScreen">Yönetim &raquo; Albümler &raquo;
+Özellikler &raquo; Genel / Özel</span>) den ayarlayabilirsiniz.</p>
+
+<p>Bir albüm özel olduğu zaman gruplar ve kullanıcılar için izin ayarlarını 3 şekilde değiştirebilirsiniz:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Yönetim &raquo; Kullanıcılar &raquo; Yönet &raquo;
+  aksiyonlar, izinler</span> (one link per user)</li>
+
+  <li><span class="pwgScreen">Yönetim &raquo; Kullanıcılar &raquo; Gruplar &raquo;
+  aksiyonlar, izinler</span> (one link per group)</li>
+
+  <li><span class="pwgScreen">Yönetim &raquo; Albümler &raquo; Yönet &raquo; albüm izinlerini düzenleme</span> (her albüm için bir bağlantı)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/tr_TR/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>Posta ile Duyuru</h2>
+
+<p>Bu ekran sitenizdeki değişiklikleri kullanıcılara e-posta ile duyuru yapmak için gerekli yapılandırmaları ve düzenlemeleri sağlar.</p>
+
+<p>Bu ekran 3 sekmeden oluşur:</p>
+
+<h3>Ayarlar</h3>
+<p>Bu sekmeyi Site Yöneticisi görebilir ve duyuru için gerekli ayarları yapmanızı sağlar.</p>
+
+<h3>Abonelik</h3>
+<p>Bu sekmeyi Site Yöneticisi görebilir ve abonelik için gerekli ayarları yapmanızı sağlar.</p>
+
+<h3>Gönder</h3>
+<p>Bu sekmeyi Site Yöneticisi görebilir ve duyuru göndermenizi sağlar..</p>
+
Index: tags/2.4.0RC3/language/tr_TR/help/search.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>Arama</h2>
+
+<p>Bu sayfa bütün galerideki resimlerde arama yapmanızı sağlar.</p>
+
+<dl>
+
+  <dt>Kelime arama</dt>
+  <dd>Galerideki resim özelliklerine göre bir veya bir kaç kelime arama yapabilirsiniz. Kısmen uyuşanlar için joker * işaretini kullanın.</dd>
+
+  <dt>Yazar arama</dt>
+  <dd>Kısmen uyuşanlar için joker * işaretini kullanın.</dd>
+
+  <dt>Tarih arama</dt>
+  <dd>Bir başlangıç ve bitiş tarihi seçerek aramadır. Başlangıcı boş bırakarak da arayabilirsiniz. Bitiş tarihi aşağıdaki biçimde olmalıdır: AAAA (örneğin: 2004)</dd>
+
+  <dt>Albüm içinde arama</dt>
+  <dd>Bir veya bir kaç albüm seçerek arama. Alt albümler de aramak için ana albümü seçtikten sonra alt albümlerde arama seçeneği etkin olmalıdır.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/tr_TR/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/tr_TR/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/help/user_list.html	(revision 14585)
@@ -0,0 +1,25 @@
+<h2>Kullanıcı listesi</h2>
+
+<p>Bu bölüm kayıtlı kullanıcıların özelliklerini düzenlemek için olmakla beraberfarklı bölümlere ait özellikler hariçtir.</p>
+
+<h3>Kullanıcı ekle</h3>
+
+<p>Yönetici kullanıcı ekleyebilir</p>
+
+<h3>Kullanıcı listesi</h3>
+
+<p>Listede isimler filtre edilebilir ( * jokeri kullanılabilir), grup yada kullanıcı durumu. Bu liste artan, azalan, kayıt tarihi ve kullanıcı adı sıralamasına göre düzenlenmiş olabilir.</p>
+
+<p>Bu ekran farklı eylemler kullanılarak aynıanda bir çok kullanıcı yönetimi sağlar:</p>
+
+<ul>
+
+  <li>kullanıcıları silmek (onay gerektirir)</li>
+  <li>durumu değiştirmek</li>
+  <li>gruplara eklemek veya kaldırmak</li>
+  <li>görüntü özelliklerini değiştirmek</li>
+  <li>ek özelliklerini değiştirmek</li>
+
+</ul>
+
+<p>Varsayılan olarak seçilen kullanıcılar hedeftir veya listede görünün tüm kullanıcılar.</p>
Index: tags/2.4.0RC3/language/tr_TR/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/tr_TR/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/install.lang.php	(revision 14585)
@@ -0,0 +1,75 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+
+$lang['Installation'] = 'Yükleme';
+$lang['Basic configuration'] = 'Temel yapılandırma';
+$lang['Default gallery language'] = 'Varsayılan galeri dili';
+$lang['Database configuration'] = 'Veritabanı yapılandırması';
+$lang['Admin configuration'] = 'Admin yapılandırması';
+$lang['Start Install'] = 'Yüklemeye Başla';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'E-Posta adresiniz böyle olmalı: xxx@yyy.eee (örnek : erkan@test.org)';
+$lang['Webmaster login'] = 'Site yöneticisi giriş';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Bu ziyaretçilere gösterilecek. Bu web sitesi yönetimi için gereklidir';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Sunucuya bağlantı başarılı, ama veritabanına bağlantı kurulamadı';
+$lang['Can\'t connect to server'] = 'Sunucuya bağlanamadı';
+$lang['Host'] = 'Host';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Kullanıcı';
+$lang['user login given by your host provider'] = 'host sağlağıcı tarafından size verilen kullanıcı girişi';
+$lang['Password'] = 'Şifre';
+$lang['user password given by your host provider'] = 'host sağlağıcı tarafından size verilen şifre';
+$lang['Database name'] = 'Veritabanı adı';
+$lang['also given by your host provider'] = 'host sağlağıcı tarafından verildi';
+$lang['Database table prefix'] = 'Veritabanı tabloları öneki';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'veritabanı tablolarını isimlerini onunla öneki eklenecektir (daha iyi tablolar yönetmenize olanak sağlar)';
+$lang['enter a login for webmaster'] = 'Site Yöneticisi için bir giriş';
+$lang['webmaster login can\'t contain characters \' or "'] = 'Site yöneticisi  \' veya " karakterlerini içeremez';
+$lang['please enter your password again'] = 'şifrenizi tekrar giriniz';
+$lang['Webmaster password'] = 'Site yöneticisi şifresi';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'gizli tutun, yönetim paneline ulaşmanızı sağlar';
+$lang['Password [confirm]'] = 'Şifre [kabul]';
+$lang['verification'] = 'doğrulama';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Yardım ihtiyacınız var? Sorularınızı <a href="%s">Piwigo forumda sorabilirsiniz</a>.';
+$lang['Webmaster mail address'] = 'Site yöneticisi e-posta adresi';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Ziyaretçilerin site yöneticisi ile bağlantıya geçmesi için bu postayı kullanmaları mümkün olacak';
+$lang['PHP 5 is required'] = 'PHP 5 gerekli';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Web hostunuz şu anda PHP %s çalışıyor görünüyor.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo .htaccess dosyası yaparak veya değiştirerek ayarlarınızı PHP 5 için düzenlemeyi deneyebilir.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Eğer kendi başınıza yapılandırmasını değiştirirseniz bundan sonra Piwigo yeniden başlatınız.';
+$lang['Try to configure PHP 5'] = 'PHP 5 yapılandırmak için çalışın';
+$lang['Sorry!'] = 'Üzgünüm!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo PHP 5 yapılandırması mümkün değildi.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Host sağlayıcınız ile PHP 5\'e geçebilmek için konuşun.';
+$lang['Hope to see you back soon.'] = 'Sizi tekrar görmeyi umut ederiz.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Tebrikler, Piwigo kurulum tamamlandı.';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Diğer çözüm aşağıdaki kutudaki yazıyı kopyalayın ve "local/config/database.inc.php" dosyası içine pasteleyin.(Uyarı : database.inc.php sadece yazı içermeli hiçbir ifade veya boşluk karakteri içermemelidir)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Yapılandırmada dosyası local/config/database.inc.php oluşturma başarısız oldu.';
+$lang['Download the config file'] = 'Yapılandırma dosyasını indir';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Yapılandırma dosyasını indirip düzenleyebilir ve kurulum dizininde local/config bölümüne yükleyebilirsiniz.';
+$lang['Just another Piwigo gallery'] = 'Bir başka Piwigo galerisi';
+$lang['Welcome to my photo gallery'] = 'Resim galerime hoş geldiniz';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Herhangi bir yardım konusu için, forumlarımıza başvurmaktan çekinmeyin: %s. ';
+$lang['Welcome to your new installation of Piwigo!'] = 'Piwigo\'nunuzun yeni kurulumuna hoşgeldiniz!';
+?>
Index: tags/2.4.0RC3/language/tr_TR/iso.txt
===================================================================
--- tags/2.4.0RC3/language/tr_TR/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Türkçe [TR]
Index: tags/2.4.0RC3/language/tr_TR/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/tr_TR/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/tr_TR/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Upgrade'] = "Güncellestirme";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "Bu sayfa yeni sürüme Piwigo eski sürümünden veritabani yükseltme öneriyor. Yükseltme yardimcisi Su anda bir <strong> sürüm% (veya esdegeri) </ strong> çalistiran düsünüyor.";
+$lang['Upgrade from version %s to %s'] = "%s sürümden %s sürümüne güncellestir";
+$lang['Statistics'] = "Istatistik";
+$lang['total upgrade time'] = "toplam güncelleme zamani";
+$lang['total SQL time'] = "tolam SQL zamani";
+$lang['SQL queries'] = "SQL sorgulari";
+$lang['Upgrade informations'] = "Güncelleme bilgileri";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "Herhangi bir sorunla karsilasirsaniz, [Yönetim> Araçlar> Bakim] dan bakim yapiniz.";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "Bir önlem olarak, asagidaki eklentiler devre disi olmustur.Onlari aktif etmeden önce eklentileri yükseltme için kontrol etmelisiniz";
+$lang['Only administrator can run upgrade: please sign in below.'] = "Sadece yönetici güncelleme çalistirabilir: Asagidan giris yapin.";
+$lang['You do not have access rights to run upgrade'] = "Güncelleme çalistirmak için yetkiniz yok";
+$lang['All sub-albums of private albums become private'] = 'Ãzel albÃ¼mlerin alt albÃ¼mleri de Ã¶zel olur';
+$lang['User permissions and group permissions have been erased'] = "Kullanicilar ve gruplarin izinleri silinmistir";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "Sadece küçük resim ön eki ve site yöneticisi posta adresiniz önceki yapilandirman kaydedili";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '<i>%s</i> içine, <b>?></b> önce, ekleyin:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Önlem olarak, asagidaki temalar devre disi olmustur. Tekrar etkinlestirmeden önce güncelleme yapmalisiniz:';
+
+?>
Index: tags/2.4.0RC3/language/uk_UA/about.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/about.html	(revision 14585)
@@ -0,0 +1,18 @@
+<p>Ця фотогалерея базована на Piwigo.</p>
+
+<p>Piwigo - це набір веб-базованого програмного забезпечення для
+фотогалереї, побудованого активною групою користувачів та розробників.
+Завдяки розширенням Piwigo легко налаштовувати. І на додачу, Piwigo є
+безкоштовною і з відкритим вихідним кодом.</p>
+
+<p id="linkToPiwigo"><a href="http://piwigo.org">Відвідати веб-сайт
+Piwigo</a></p>
+
+<p> Український переклад підтримується (в алфавітному порядку):
+	<ul>
+		<li><a href="http://piwigo.org/forum/profile.php?id=13737">animan</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=16485">marchelly</a></li>
+		<li><a href="http://piwigo.org/forum/profile.php?id=13453">quest_tom</a></li>
+		<li>rukhov</li>
+	</ul>
+            .... велике спасибі вам </p>
Index: tags/2.4.0RC3/language/uk_UA/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/uk_UA/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/admin.lang.php	(revision 14585)
@@ -0,0 +1,894 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang[' and %d virtual'] = ' і %d віртуальних';
+$lang['%d album including'] = 'включає %d альбом';
+$lang['%d album moved'] = '%d альбом перенесено';
+$lang['%d albums including'] = 'включає %d альбомів';
+$lang['%d albums moved'] = '%d альбомів перенесено';
+$lang['%d anomalies have been detected corrected.'] = '%d аномалій було виявлено і виправлено.';
+$lang['%d anomalies have been detected.'] = '%d аномалій було виявлено.';
+$lang['%d anomalies have been ignored.'] = '%d аномалій було проігноровано.';
+$lang['%d anomalies have not been corrected.'] = '%d аномалій не було виправлено.';
+$lang['%d anomaly has been corrected.'] = '%d аномалія була виправлена.';
+$lang['%d anomaly has been detected.'] = '%d аномалія була виявлена.';
+$lang['%d anomaly has been ignored.'] = '%d аномалія була проігнорована.';
+$lang['%d anomaly has not been corrected.'] = '%d аномалія не була виправлена.';
+$lang['%d association'] = '%d асоціація';
+$lang['%d associations'] = '%d асоціацій';
+$lang['%d group'] = '%d група';
+$lang['%d groups'] = '%d груп';
+$lang['%d guest'] = '%d гість';
+$lang['%d guests'] = '%d гостей';
+$lang['%d line filtered'] = '%d лінія відфільтрована';
+$lang['%d lines filtered'] = '%d ліній відфільтровано';
+$lang['%d mail was not sent.'] = '%d лист не був відправлений.';
+$lang['%d mail was sent.'] = '%d лист був відправлений.';
+$lang['%d mails were not sent.'] = '%d листів не було відправлено.';
+$lang['%d mails were sent.'] = '%d листів було відправлено.';
+$lang['%d member'] = '%d учасник';
+$lang['%d members'] = '%d учасники';
+$lang['%d of %d photos selected'] = 'виділено %d з %d фотографій';
+$lang['%d parameter was updated.'] = '%d параметр оновлено.';
+$lang['%d parameters were updated.'] = '%d параметрів оновлено.';
+$lang['%d photo was deleted'] = '%d фотографія видалена';
+$lang['%d photos uploaded'] = '%d фотографій завантажено';
+$lang['%d photos were deleted'] = '%d фотографій видалено';
+$lang['%d physical'] = ' %d фізичні';
+$lang['%d tag'] = '%d теґ';
+$lang['%d tags'] = '%d теґів';
+$lang['%d user comment rejected'] = '%d коментар користувача відхилено';
+$lang['%d user comment validated'] = '%d коментар користувача перевірено';
+$lang['%d user comments rejected'] = '%d коментарів користувачів відхилено';
+$lang['%d user comments validated'] = '%d коментарів користувачів перевірено';
+$lang['%d user deleted'] = '%d користувач видалений';
+$lang['%d user was not updated.'] = '%d користувач не оновлений.';
+$lang['%d user was updated.'] = '%d користувач оновлений.';
+$lang['%d user'] = '%d користувач';
+$lang['Cannot delete the old permalink !'] = 'Старе посилання не може бути видалено!';
+$lang['Can\'t connect to server.'] = "З'єднання з сервером неможливе.";
+$lang['Can\'t create temporary file.'] = 'Не можна створити тимчасовий файл.';
+$lang['Can\'t download archive.'] = 'Не можна завантажити архів.';
+$lang['Can\'t read or extract archive.'] = 'Не можна прочитати чи розпакувати архів.';
+$lang['Change Admin Colors'] = 'Змінити кольори адміністрування';
+$lang['Check all'] = 'Перевірити все';
+$lang['Check automatic corrections'] = "Перевірити автоматичне з'єднання";
+$lang['Check for updates'] = 'Перевірити оновлення';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Перевірити оновлення не вдалося з невідомих причин.';
+$lang['Check for upgrade'] = 'Перевірити оновлення';
+$lang['Check integrity'] = 'Перевірка цілісності';
+$lang['Choose an action'] = 'Виберіть дію';
+$lang['Choose an option'] = 'Виберіть опцію';
+$lang['Classic display'] = 'Показувати класично';
+$lang['clean'] = 'прибрати';
+$lang['Comments for all'] = 'Коментарі для всіх';
+$lang['%d users deleted'] = '%d користувачів видалено';
+$lang['%d users were not updated.'] = '%d користувачів не оновлено.';
+$lang['%d users were updated.'] = '%d користувачів оновлено.';
+$lang['%d users'] = '%d користувачів';
+$lang['%d waiting for validation'] = '%d очікують перевірки';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '%s повинно бути встановлено в false в файлі local/config/config.inc.php';
+$lang['%s value is not correct file because exif are not supported'] = '%s значення некоректне, оскільки EXIF не підтримуються';
+$lang['+ Add an upload box'] = '+ Додати вікно завантаження';
+$lang[', click on'] = ', натисніть на';
+$lang['A new version of Piwigo is available.'] = 'Доступна нова версія Piwigo.';
+$lang['Access type'] = 'Тип доступу';
+$lang['ACCESS_0'] = 'Вільний доступ';
+$lang['ACCESS_1'] = 'Доступ для всіх';
+$lang['ACCESS_2'] = 'Доступ для зареєстрованих користувачів';
+$lang['ACCESS_3'] = 'Доступ для адміністраторів';
+$lang['ACCESS_4'] = 'Доступ для вебмайстрів';
+$lang['ACCESS_5'] = 'Немає доступу';
+$lang['Action'] = 'Дія';
+$lang['Actions'] = 'Дії';
+$lang['Activate icon "%s"'] = 'Активувати значок "%s"';
+$lang['Activate Navigation Bar'] = 'Активувати панель навігації';
+$lang['Activate Navigation Thumbnails'] = 'Активувати навігаційні мініатюри';
+$lang['Activate'] = 'Активувати';
+$lang['Active Languages'] = 'Активні мови';
+$lang['Active Plugins'] = 'Активні плаґіни';
+$lang['Active Themes'] = 'Активні теми';
+$lang['Add a filter'] = 'Додати фільтр';
+$lang['Add a tag'] = 'Додати теґ';
+$lang['Add a user'] = 'Додати користувача';
+$lang['Add a virtual album'] = 'Додати віртуальний альбом';
+$lang['Add another set of photos'] = 'Додати ще один набір фотографій';
+$lang['Add detailed content'] = 'Додати детальний зміст';
+$lang['Add group'] = 'Додати групу';
+$lang['Add New Language'] = 'Додати нову мову';
+$lang['add new photos to caddie'] = 'додати нові фотографії в кошик';
+$lang['Add New Theme'] = 'Додати нову тему';
+$lang['Add Photos'] = 'Додати фотографії';
+$lang['Add tags'] = 'Додати теґи';
+$lang['Add write access to the "%s" directory'] = 'Додати право запису в директорію "%s"';
+$lang['Add'] = 'Додати';
+$lang['Add/delete a permalink'] = 'Додати/видалити посилання';
+$lang['added'] = 'додано';
+$lang['Administration Home'] = 'Адміністрування';
+$lang['Advanced features'] = 'Розширені функції';
+$lang['Album "%s" has been added'] = 'Доданий альбом "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Альбом "%s" зараз вміщає %d фотографій';
+$lang['Album photos associated to the following albums: %s'] = 'Фотографії альбому пов\'язані з наступними альбомами: %s';
+$lang['Album list management'] = 'Список управління альбомом';
+$lang['Album manual order was saved'] = 'Альбом був збережений в ручному режимі';
+$lang['Album name'] = 'Назва альбому';
+$lang['Album updated successfully'] = 'Альбом оновлено успішно';
+$lang['albums added in the database'] = 'альбоми додано в базу даних';
+$lang['Albums authorized thanks to group associations'] = 'Альбоми авторизовані завдяки групі асоціацій';
+$lang['Albums automatically sorted'] = 'Альбоми відсортовані автоматично';
+$lang['albums deleted in the database'] = 'альбоми видалені з бази даних';
+$lang['All %d photos are selected'] = 'Виділено всі %d фотографій';
+$lang['All optimizations have been successfully completed.'] = 'Вся оптимізація була успішно завершена.';
+$lang['all'] = 'всі';
+$lang['Allow rating'] = 'Дозволити рейтинг';
+$lang['Allow user customization'] = 'Дозволити налаштування користувача';
+$lang['Allow user registration'] = 'Дозволити реєстрацію користувачів';
+$lang['Allow users to delete their own comments'] = 'Дозволити користувачам видаляти свої коментарі';
+$lang['Allow users to edit their own comments'] = 'Дозволити користувачам редагувати свої власні коментарі';
+$lang['an error happened'] = 'помилка';
+$lang['An error occured during extraction (%s).'] = 'Помилка при отриманні файлу (%s).';
+$lang['An information email was sent to group "%s"'] = 'Електронний лист з інформацією відправлений до групи "%s"';
+$lang['and'] = 'і';
+$lang['Anomaly'] = 'Аномалія';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'В усякому разі тільки веб-майстри можуть бачити цю вкладку, не адміністратори.';
+$lang['Apply action'] = 'Застосувати дії';
+$lang['Apply selected corrections'] = 'Застосувати виділені виправлення';
+$lang['Apply to sub-albums'] = 'Застосувати до під-альбомів';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Ви впевнені, що хочете встановити це оновлення? Ви повинні перевірити, чи ця версія не вимагає попереднього видалення.';
+$lang['Are you sure you want to delete this plugin?'] = 'Ви впевнені, що хочете видалити цей плаґін?';
+$lang['Are you sure you want to install this plugin?'] = 'Ви впевнені, що хочете встановити цей плаґін?';
+$lang['Associate to album'] = 'Асоціювати до альбому';
+$lang['associate to group'] = 'Асоціювати до групи';
+$lang['Associated'] = 'Асоційований';
+$lang['Authorize users to add comments on selected albums'] = 'Авторизувати користувачів для додавання коментарів у вибрані альбоми';
+$lang['Authorized'] = 'Авторизовані';
+$lang['Automatic correction'] = 'Автоматична корекція';
+$lang['automatic order'] = 'автоматичне замовлення';
+$lang['Available only with HTML format'] = 'Доступно тільки з HTML-форматом';
+$lang['average time'] = 'середній час';
+$lang['Batch Manager'] = 'Пакетний менеджер';
+$lang['between'] = 'між';
+$lang['Bound Theme'] = "Пов'язані теми";
+$lang['By %s'] = 'Автор %s';
+$lang['By rank'] = 'За рангом';
+$lang['Caddie management'] = 'Керування кошиком';
+$lang['Caddie'] = 'Кошик';
+$lang['Complementary mail content'] = 'Додатковий зміст пошти';
+$lang['Configuration'] = 'Конфігурація';
+$lang['confirm'] = 'підтвердити';
+$lang['Continue processing treatment'] = 'Продовжити лікування';
+$lang['Correction applied with error'] = 'Виправлення застосувались з помилкою';
+$lang['Correction applied with success'] = 'Виправлення успішно застосувались';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Виправлена ​​аномалія більше не ігноруватиметься';
+$lang['Correction'] = 'Виправлення';
+$lang['create a new album'] = 'створити новий альбом';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Створити новий сайт : (присвоїти йому URL create_listing_file.php)';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Створити директорію "%s" в кореневій директорії інсталяції Piwigo';
+$lang['Create this site'] = 'Створити цей сайт';
+$lang['created'] = 'створено';
+$lang['Current name'] = "Поточне ім'я";
+$lang['Database synchronization with files'] = 'Синхронізація бази даних з файлами';
+$lang['Database'] = 'База даних';
+$lang['Date'] = 'Дата';
+$lang['Day'] = 'День';
+$lang['Deactivate'] = 'Деактивувати';
+$lang['Default display'] = 'Показувати за замовчуванням';
+$lang['Default user cannot be deleted'] = 'Користувач за замовчуванням не може бути видалений';
+$lang['Default user does not exist'] = 'Користувач за замовчуванням не існує';
+$lang['default values'] = 'значення за замовчуванням';
+$lang['default'] = 'за замовчуванням';
+$lang['delete album'] = 'видалити альбом';
+$lang['Delete orphan tags'] = 'Видалити пусті теґи';
+$lang['delete photo'] = 'видалити фотографію';
+$lang['Delete Representant'] = 'Видалити представника';
+$lang['Delete selected photos'] = 'Видалити виділені фотографії';
+$lang['Delete selected tags'] = 'Видалити виділені теґи';
+$lang['Delete selected users'] = 'Видалити виділених користувачів';
+$lang['Delete this language'] = 'Видалити цю мову';
+$lang['delete this site and all its attached elements'] = "Видалити цей сайт і всю пов'язану з ним інформацію";
+$lang['Delete this theme'] = 'Видалити цю тему';
+$lang['delete'] = 'видалити';
+$lang['Deleted on'] = 'Видалено на';
+$lang['deleted'] = 'видалено';
+$lang['Deletions'] = 'Видалення';
+$lang['Deny selected groups'] = 'Заблокувати виділені групи';
+$lang['Deny selected users'] = 'Заблокувати виділених користувачів';
+$lang['Description'] = 'Опис';
+$lang['Detailed informations'] = 'Детальна інформація';
+$lang['directories + files'] = 'каталоги + файли';
+$lang['Directory does not exist'] = 'Каталог не існує';
+$lang['Directory'] = 'Каталог';
+$lang['Discover album:'] = 'Розкрити альбом:';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'відобразити максимум інформації (додані альбоми і зображення, видалені альбоми і зображення)';
+$lang['Display options'] = 'Показати опції';
+$lang['Dissociate from album'] = 'Відокремити від альбому';
+$lang['dissociate from group'] = 'відокремити від групи';
+$lang['Dissociated'] = 'Відокремлено';
+$lang['Documentation'] = 'Документація';
+$lang['Does not represent'] = 'Не відображати';
+$lang['Download,'] = 'Завантажити,';
+$lang['Downloads'] = 'Завантаження';
+$lang['Drag to re-order'] = 'Натисніть та перетягніть, щоб змінити порядок';
+$lang['Drop into album'] = 'Вибрати альбом';
+$lang['Duplicates'] = 'дублікати';
+$lang['Edit album permissions'] = 'Редагувати права альбому';
+$lang['Edit album'] = 'Редагувати альбом';
+$lang['Edit photo information'] = 'Редагувати інформацію про фотографію';
+$lang['Edit ranks'] = 'Редагувати ряди';
+$lang['Edit selected tags'] = 'Редагувати виділені теґи';
+$lang['Edit tags'] = 'Редагувати теґи';
+$lang['Element type'] = 'Тип елемента';
+$lang['Element'] = 'Елемент';
+$lang['photos informations synchronized with files metadata'] = 'інформація про зображення синхронізована з файлами метаданих';
+$lang['Email administrators when a comment is deleted'] = 'Надіслати лист адміністраторам, коли коментар видалено';
+$lang['Email administrators when a comment is modified'] = 'Надіслати лист адміністраторам, коли коментар змінено';
+$lang['Email admins when a comment requires validation'] = 'Надіслати лист адміністраторам, коли коментар вимагає валідації';
+$lang['Email admins when a new user registers'] = 'Надіслати лист адміністраторам, коли реєструється новий користувач';
+$lang['Email admins when a valid comment is entered'] = 'Надіслати лист адміністраторам, коли коментар введений валідний коментар';
+$lang['email'] = 'Електронна пошта';
+$lang['Environment'] = 'Середовище';
+$lang['Error list'] = 'Список помилок';
+$lang['Error on file "%s" : %s'] = 'Помилка файлу "%s" : %s';
+$lang['Error when sending email to %s [%s].'] = 'Помилка при відправці листа користувачу %s [%s].';
+$lang['Errors caption'] = 'Легенда помилок';
+$lang['errors during synchronization'] = 'помилки при синхронізації';
+$lang['even already synchronized photos'] = 'навіть вже синхронізовані фотографії';
+$lang['Everybody'] = 'Всі';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Час виконання вичерпався, лікування потрібно продовжити [Приблизний час: %d секунд].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Час виконання вичерпався, лікування потрібно продовжити [Приблизний час: %d секунда].';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif розширення не доступні, адміністратор повинен відключити використання exif';
+$lang['existing album'] = 'існуючий альбом';
+$lang['Extend for templates'] = 'Розширення шаблонів';
+$lang['Failed to write file to disk'] = 'Не вдалося записати файл на диск';
+$lang['File upload stopped by extension'] = 'Завантаження файлу зупинене за допомогою розширення';
+$lang['File'] = 'Файл';
+$lang['File/directory read error'] = 'Помилка читання файлу/директорії';
+$lang['Find a new representant by random'] = 'Знайти нові випадкові представлення';
+$lang['first photo added on %s'] = 'перша фотографія додана в %s';
+$lang['for the file format'] = 'для форматів файлів';
+$lang['for this file format'] = 'для цього формату файлу';
+$lang['Forbid this language to users'] = 'Заборонити цю мову для користувачів';
+$lang['Forbid this theme to users'] = 'Заборонити цю тему для користувачів';
+$lang['Forbidden'] = 'Заборонено';
+$lang['Form'] = 'Форма';
+$lang['FTP + Synchronization'] = 'FTP + Синхронізація';
+$lang['Gallery title'] = 'Заголовок галереї';
+$lang['GD library is missing'] = 'GD бібліотека відсутня';
+$lang['GD version'] = 'GD версія';
+$lang['General statistics'] = 'Загальна статистика';
+$lang['Get Support on Piwigo Forum'] = 'Отримати підтримку на форумі Piwigo';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Надайте право запису (chmod 777) директорії "%s" в кореневому каталозі установки Piwigo';
+$lang['global mode'] = 'глобальний режим';
+$lang['Go to %s or %s for more informations'] = 'Перейдіть до %s або %s для детальнішої інформації';
+$lang['Go to'] = 'До';
+$lang['Grant selected groups'] = 'Грант виділених груп';
+$lang['Grant selected users'] = 'Грант виділених користувачів';
+$lang['group "%s" added'] = 'група "%s" додана';
+$lang['group "%s" deleted'] = 'група "%s" видалена';
+$lang['group "%s" updated'] = 'група "%s" оновлена';
+$lang['Group management'] = 'Управління групами';
+$lang['Group name'] = 'Назва групи';
+$lang['Group'] = 'Група';
+$lang['Groups'] = 'Групи';
+$lang['Guest cannot be deleted'] = 'Гість не може бути видалений';
+$lang['Guest Settings'] = 'Налаштування гостя';
+$lang['guest'] = 'гість';
+$lang['Guests'] = 'Гості';
+$lang['height must be a number superior to'] = 'висота повинна бути числом, більшим ніж';
+$lang['Hello'] = 'Привіт';
+$lang['Hello,'] = 'Привіт,';
+$lang['Help Me'] = 'Допоможіть мені';
+$lang['Hide'] = 'Приховати';
+$lang['High definition enabled'] = 'Висока чіткість включена';
+$lang['High definition'] = 'Висока чіткість';
+$lang['high'] = 'високий';
+$lang['History'] = 'Історія';
+$lang['Hit'] = 'Хіт';
+$lang['Hour'] = 'Година';
+$lang['Move'] = 'Переміщення';
+$lang['Name'] = 'Ім\'я';
+$lang['New name'] = 'Нове ім\'я';
+$lang['New parent album'] = 'Новий батьківский альбом';
+$lang['New photos added'] = 'Нові світлини додано';
+$lang['New photos were added'] = 'Нові світлини було додано';
+$lang['New tag'] = 'Новий теґ';
+$lang['No display'] = 'Не показувати';
+$lang['No photo can be deleted'] = 'Світлини не можуть бути видалені';
+$lang['No photo in the current set.'] = 'Нема світлин в поточному наборі.';
+$lang['No photo in this album'] = 'Нема світлин в цьому альбомі';
+$lang['no write access'] = 'нема доступу на запис';
+$lang['none'] = 'жодного';
+$lang['None'] = 'Жодного';
+$lang['nothing'] = 'нічого';
+$lang['on'] = 'увімкнено';
+$lang['Make this language available to users'] = 'Зробити цю мову доступною для користувачів';
+$lang['Make this theme available to users'] = 'Зробити цю тему доступною для користувачів';
+$lang['manage album photos'] = 'керувати світлинами альбому';
+$lang['Manage authorizations for selected albums'] = 'Керувати дозволами для обраного альбому';
+$lang['Manage permissions for group "%s"'] = 'Керувати дозволами групи "%s"';
+$lang['Manage permissions for user "%s"'] = 'Керувати дозволами користувача "%s"';
+$lang['Manage photo ranks'] = 'Керувати рейтингами світлин';
+$lang['manage sub-albums'] = 'керувати суб-альбомами';
+$lang['Manage tags'] = 'Керувати теґами';
+$lang['Manage this set of %d photos'] = 'Керувати цьою серією з %d світлин';
+$lang['Manage'] = 'Керувати';
+$lang['Manual order'] = 'власноруч встановлений порядок';
+$lang['manual order'] = 'саморуч встановлений порядок';
+$lang['Deactivate all'] = 'Деактивувати все';
+$lang['No file was uploaded'] = 'Файл не був завантажений';
+$lang['No mail to send.'] = 'Немає пошти для відправки.';
+$lang['No photo selected, %d photos in current set'] = 'Немає виділених зображень, %d зображення в поточному наборі';
+$lang['No photo selected, no action possible.'] = 'Немає виділених фотографій, немає можливих дій.';
+$lang['No results'] = 'Немає результату';
+$lang['No user to send notifications by mail.'] = 'Немає користувачів для оповіщення поштою.';
+$lang['Notification'] = 'Оповіщення';
+$lang['Number of comments per page'] = 'Кількість коментарів на сторінку';
+$lang['Number of downloads'] = 'Кількість завантажень';
+$lang['number of miniaturized photos'] = 'кількість створених іконок';
+$lang['Number of rates'] = 'Кількість голосів';
+$lang['Number of thumbnails to create'] = 'Кількість іконок для створення';
+$lang['on the %d selected photos'] = 'на %d вибраних зображеннях';
+$lang['only directories'] = 'лише директорії';
+$lang['only perform a simulation (no change in database will be made)'] = 'виконати лише симуляцію (нічого не буде змінено в базі даних)';
+$lang['Only private albums are listed'] = 'Тільки приватні альбоми перераховані';
+$lang['Operating system'] = 'Операційна система';
+$lang['Operation in progress'] = 'Лікування в процесі.';
+$lang['Optimizations have been completed with some errors.'] = 'Оптимізації були завершені з деякими помилками.';
+$lang['Optional URL keyword'] = "Необов'язкове ключове слово URL";
+$lang['Maximum Height'] = 'Максимальна висота';
+$lang['Maximum Width'] = 'Максимальна ширина';
+$lang['Members'] = 'Члени';
+$lang['Menu Management'] = 'Меню';
+$lang['Metadata synchronization results'] = 'Результати синхронізації метаданих';
+$lang['Metadata synchronized from file'] = 'Метадані синхронізовані з файлу';
+$lang['Minimum privacy level'] = 'Мінімальний рівень приватності';
+$lang['Miscellaneous'] = 'Різне';
+$lang['Missing a temporary folder'] = 'Відсутня тимчасова папка';
+$lang['Missing Plugins'] = 'Відсутні модулі';
+$lang['Modify information'] = 'Змінити інформацію';
+$lang['Month'] = 'Місяць';
+$lang['Move albums'] = 'Перемістити альбоми';
+$lang['new'] = 'новий';
+$lang['Activate icon "new" next to albums and pictures'] = 'Активувати значок "нове" поруч з альбомами і фотографіями';
+$lang['Default photos order'] = 'Порядок фотографій за замовчуванням';
+$lang['Options'] = 'Опції';
+$lang['Order of menubar items has been updated successfully.'] = 'Порядок пунктів меню був успішно оновлений.';
+$lang['Original templates'] = 'Оригінальні шаблони';
+$lang['Orphan tags deleted'] = 'Порожні теґи видалені';
+$lang['Other plugins'] = 'Інші плаґіни';
+$lang['Other private albums'] = 'Інші приватні альбоми';
+$lang['other'] = 'інший';
+$lang['Overall'] = 'Огляд';
+$lang['overrides existing values with empty ones'] = 'скасовує існуючі порожні значення';
+$lang['Page banner'] = 'Банер сторінки';
+$lang['Page end'] = 'Кінець сторінки';
+$lang['Pages seen'] = 'Переглянуті сторінки';
+$lang['Parameter'] = 'Налаштування';
+$lang['Parameters'] = 'Параметри';
+$lang['Parent album'] = 'Батьківський альбом';
+$lang['Piwigo configuration'] = 'Конфігурація Piwigo';
+$lang['Piwigo Uploader'] = 'Piwigo Завантажувач';
+$lang['Piwigo version'] = 'Версія Piwigo';
+$lang['pixels'] = 'пікселі';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Будь ласка перевірте дозволи для теки "plugins" та вкладених тек (CHMOD).';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader стоїть для <em>Piwigo Завантажувача</em>. На вашому компьютері, pLoader готує ваши світлини та відсилає їх до вашої Piwigo галереї.';
+$lang['Plugin has been successfully copied'] = 'Плаґін було успішно скопійовано';
+$lang['Plugin list'] = 'Список плаґінів';
+$lang['Plugins which need upgrade'] = 'Плаґіни які потребують модернізації';
+$lang['Plugins'] = 'Плаґіни';
+$lang['Position'] = 'Позиція';
+$lang['Predefined filter'] = 'Попередньо встановленний фільтер';
+$lang['Preferences'] = 'Уподобання';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Час для підготовки списку користувачів яким буде відправлено листи обмежений. Інші користувачі не перераховані.';
+$lang['Privacy level set to "%s"'] = 'Рівень конфідеційності встановлено в "%s"';
+$lang['Privacy level'] = 'Рівень конфідеційності';
+$lang['Private'] = 'Приватно';
+$lang['private'] = 'конфідеційно';
+$lang['Properties'] = 'Властивості';
+$lang['Public / Private'] = 'Публічно/Приватно';
+$lang['Public'] = 'Публічно';
+$lang['public'] = 'публічно';
+$lang['Purge compiled templates'] = 'Очистити скомпільовані шаблони';
+$lang['Purge history detail'] = 'Очистити історію переглядів';
+$lang['Purge history summary'] = 'Очистити історію резюме';
+$lang['Purge never used notification feeds'] = 'Очистити невикористані канали повідомлень';
+$lang['Purge search history'] = 'Очистити історію пошуку';
+$lang['Add a criteria'] = 'Додати критерії';
+$lang['Photo informations updated'] = 'Інформацію про світлину оновлено';
+$lang['Photo unreachable or no support'] = 'Світлина недоступна або непідтримуваний формат';
+$lang['Piwigo Administration'] = 'Керування Piwigo';
+$lang['Piwigo Announcements Newsletter'] = 'Розсилка оголошень Piwigo';
+$lang['Purge sessions'] = 'Чистка сесій';
+$lang['Quick Local Synchronization'] = 'Швидка локальна синхронізація';
+$lang['Random photo'] = 'Випадклва світлина';
+$lang['randomly represented'] = 'випадково представлений';
+$lang['ranks'] = 'оцінки';
+$lang['Rate date'] = 'дата оцінювання';
+$lang['Rating by guests'] = 'оцінювання відвідувачами';
+$lang['Rating'] = 'Оцінка';
+$lang['Read Piwigo Documentation'] = 'Читати документацію Piwigo';
+$lang['reduce to single existing albums'] = 'зменшити до одного існуючи альбоми';
+$lang['Refresh photo set'] = 'Оновити серію світлин';
+$lang['Refresh'] = 'Оновити';
+$lang['registration date'] = 'дата реєстрації';
+$lang['Reinitialize check integrity'] = 'Повторно ініціалізувати перевірку цілісності';
+$lang['Reject'] = 'Забракувати';
+$lang['Released on'] = 'Випущено';
+$lang['Remote'] = 'Віддалено';
+$lang['Remove all filters'] = 'Видалити всі фільтри';
+$lang['remove author'] = 'видалити автора';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Відсутнє підтвердження пароля. Будь ласка, підтвердіть вибраний пароль.';
+$lang['Password is missing. Please enter the password.'] = 'Пароль відсутній. Будь ласка введіть пароль.';
+$lang['Path'] = 'Шлях';
+$lang['Pending Comments'] = 'Коментарі в очікуванні';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Постійне посилання %s раніше використовувалося для альбому %s. Спочатку видаліть його з історії постійних посилань';
+$lang['Permalink %s is already used by album %s'] = 'Постійне посилання %s вже використовується для альбому %s';
+$lang['Permalink history'] = 'Історія постійних посилань';
+$lang['Permalink'] = 'Постійне посилання';
+$lang['Permalinks'] = 'Постійні посилання';
+$lang['Permission denied'] = 'Доступ заборонений';
+$lang['Permission granted thanks to a group'] = 'Доступ наданий завдяки групі';
+$lang['Permission granted'] = 'Доступ наданий';
+$lang['Permissions'] = 'Дозволи';
+$lang['Photo Page'] = 'Сторінка фотографії';
+$lang['Photo Properties'] = 'Властивості фотографії';
+$lang['photos added in the database'] = 'зображення додані в базу даних';
+$lang['photos candidates for metadata synchronization'] = 'кандидати зображень для синхронізації метаданих';
+$lang['photos deleted from the database'] = 'зображення видалені з бази даних';
+$lang['photos per page'] = 'зображень на сторінку';
+$lang['photos updated in the database'] = 'зображення оновлені в базі даних';
+$lang['Photos'] = 'Фотографії';
+$lang['Themes'] = 'Теми';
+$lang['There is no available subscribers to mail.'] = 'Немає абонентів для одержування повідомлень поштою.';
+$lang['There is no other language available.'] = 'Немає іншої доступної мови.';
+$lang['There is no other plugin available.'] = 'Немає іншого доступного плагіну.';
+$lang['There is no other theme available.'] = 'Немає іншої доступної теми.';
+$lang['This name is already used by another group.'] = "Це ім'я вже використовується іншою групою.";
+$lang['This site already exists'] = 'Цей сайт вже існує';
+$lang['This theme was not designed to be directly activated'] = 'Ця тема не була призначена для безпосереднього активування';
+$lang['Thumbnail'] = 'Мініатюра';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Час для відправки пошти обмежений. Інші листи були пропущені.';
+$lang['Time'] = 'Час';
+$lang['title'] = 'назва';
+$lang['To send ?'] = 'Відправити?';
+$lang['To subscribe'] = 'Підписатися';
+$lang['To unsubscribe'] = 'Відписатися';
+$lang['Toggle \'default group\' property'] = 'Змінити властивість \'групи за замовчуванням\' на протилежну';
+$lang['Tools'] = 'Інструменти';
+$lang['total time'] = 'загальний час';
+$lang['Type here the author name'] = 'Введіть тут ім\'я автора';
+$lang['Type here the title'] = 'Введіть тут назву';
+$lang['Type in a search term'] = 'Введіть слово для пошуку';
+$lang['Save order'] = 'Порядок збереження';
+$lang['Save Settings'] = 'Зберігти налаштування';
+$lang['Save to permalink history'] = 'Зберегти в історію постіних посилань';
+$lang['Searching...'] = 'Пошук...';
+$lang['Search for new images in the directories'] = 'Шукати нові зображення в папках';
+$lang['Section'] = 'Розділ';
+$lang['See you soon,'] = 'До побачення,';
+$lang['See you soon.'] = 'До побачення.';
+$lang['Select at least one album'] = 'Виберіть принаймі один альбом';
+$lang['Select at least one comment'] = 'Віберіть принаймі один коментарій';
+$lang['Select at least one photo'] = 'Виберіть принаймі одну світлину';
+$lang['Select at least one user'] = 'Виберіть принаймі одного користувача';
+$lang['Select files'] = 'Виберіть файли';
+$lang['Select recipients'] = 'Виберіть одержувачів';
+$lang['Select:'] = 'Вибрати:';
+$lang['selection'] = 'вибір';
+$lang['Selection'] = 'Вибір';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Відновлення конфігурації за замовчуванням. Ви втратите налаштування плаґіна!';
+$lang['Send an information email to group members'] = 'Надіслати інформаційний лист членам групи';
+$lang['Send mail as'] = 'Надіслати лист як';
+$lang['Send mail on HTML format'] = 'Надіслати лист в HTML форматі';
+$lang['Send mail to users'] = 'Надіслати лист користувачам';
+$lang['Send'] = 'Надіслати';
+$lang['Set as default language for unregistered and new users'] = 'Встановити як мова за замовчуванням для незареєстрованих і нових користувачів';
+$lang['Set as default theme for unregistered and new users'] = 'Встановити як тема за замовчуванням для незареєстрованих і нових користувачів';
+$lang['Set author'] = 'Встановити автора';
+$lang['Set creation date'] = 'Встановити дату створення';
+$lang['Set title'] = 'Встановити назву';
+$lang['set to'] = 'встановити в';
+$lang['Settings'] = 'Налаштування';
+$lang['Show info'] = 'Показати інформацію';
+$lang['Show menubar'] = 'Показати меню';
+$lang['Simulation'] = 'Моделювання';
+$lang['singly represented'] = 'фіксоване представлення';
+$lang['Site manager'] = 'Менеджер сайту';
+$lang['Average rate'] = 'Середній бал';
+$lang['Rate'] = 'Оцінка';
+$lang['Start pLoader and add your photos.'] = 'Запустіть pLoader і додайте ваші фотографії.';
+$lang['Statistics'] = 'Статистика';
+$lang['Status of user "%s" updated'] = 'Для користувача "%s" оновлений статус';
+$lang['Status'] = 'Статус';
+$lang['status'] = 'статус';
+$lang['Storage album'] = 'Зберегти альбом';
+$lang['sub-albums'] = 'під-альбоми';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Підписати %s на розсилання новин Piwigo';
+$lang['Subscribe %s'] = 'Підписати %s';
+$lang['Subscribe to notification by mail'] = 'Підписатися на повідомлення поштою';
+$lang['Subscribe'] = 'Підписатися';
+$lang['Subscribe/unsubscribe users'] = 'Підписати/відписати користувачів';
+$lang['Subscribed'] = 'Підписані';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Підписані користувачі можуть бути вказані (доступні) тільки при наявності нових елементів для повідомлення.';
+$lang['Sum of rates'] = 'Сума голосів';
+$lang['Summary'] = 'Резюме';
+$lang['Support'] = 'Підтримка';
+$lang['The following tag was deleted'] = 'Наступний теґ був видалений';
+$lang['the forum'] = 'форум';
+$lang['The gallery URL is not valid.'] = 'URL на галерею не валідний.';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Назва групи не повинна вміщувати " чи \' чи бути порожньою.';
+$lang['The name of an album must not be empty'] = 'Назва альбому не повинна бути порожньою';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Назви директорій і файлів повинні включати тільки букви, цифри, "-", "_" або "."';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Число коментарів на сторінці повинно бути між 5 і 50 включно.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'Посилання повинне складатися з a-z, A-Z, 0-9, "-", "_" або "/". Воно не повинно бути числовим або починатися з цифри, що слідують за "-"';
+$lang['Switch to clear or dark colors for administration'] = 'Переключити на світлі або темні кольори для адміністрації';
+$lang['synchronize files metadata with database photos informations'] = 'синхронізувати базу даних зображень з метаданими файлів';
+$lang['synchronize files structure with database'] = 'синхронізувати структуру файлів з базою данних';
+$lang['Synchronize metadata'] = 'синхронізувати метаданні';
+$lang['Synchronize'] = 'Синхронізувати';
+$lang['Tag "%s" already exists'] = 'Теґ "%s" вже існує';
+$lang['Tag "%s" was added'] = 'Теґ "%s" додано';
+$lang['Tag selection'] = 'Вибір теґів';
+$lang['target'] = 'мета';
+$lang['Templates configuration has been recorded.'] = 'Конфігурацію шаблонів збережено.';
+$lang['Templates'] = 'Шаблони';
+$lang['test this remote site'] = 'перевірити цев віддалений вузол';
+$lang['test'] = 'тест';
+$lang['The %d following tags were deleted'] = 'Наступні %d теґи видалено';
+$lang['The anomaly will be ignored until next application version'] = 'Аномалію буде проігноровано до виходу наступної версії програми';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Файл або тека недоступні (або вони не існують або доступ заборонено)'; 
+$lang['%s has been successfully updated.'] = '%s було успішно оновлено.';
+$lang['%s photos can not be regenerated'] = '%s фотографії не можуть бути відновлені';
+$lang['%s photos have been regenerated'] = '%s фотографії були відновлені';
+$lang['(this tag will be deleted)'] = '(цей теґ буде видалений)';
+$lang['... or '] = '... або ';
+$lang['Add to caddie'] = 'Додати в кошик';
+$lang['All extensions are up to date.'] = 'Всі розширення останніх версій.';
+$lang['All languages are up to date.'] = 'Всі мови останніх версій.';
+$lang['All plugins are up to date.'] = 'Всі плаґінни останніх версій.';
+$lang['All themes are up to date.'] = 'Всі теми останніх версій.';
+$lang['Allowed file types: %s.'] = 'Дозволені типи файлів: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Сталася помилка під час вилучення. Будь ласка, перевірте права доступу до файлів установки Piwigo.<br><a href="%s">Натисніть тут, щоб показати журнал помилок</a>.';
+$lang['An error has occured during upgrade.'] = 'Сталася помилка під час оновлення.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Приблизний максимальний дозвіл: %dM пікселів (це %dx%d пікселів).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'За замовчуванням, Piwigo створить новий розмір від HD (високої чіткості) версії вашого фото.';
+$lang['Confirm merge'] = 'Підтвердіть злиття';
+$lang['Create'] = 'Створити';
+$lang['Crop'] = 'Результат';
+$lang['display'] = 'показати';
+$lang['Do you want to activate anyway?'] = 'Чи Ви таки бажаєте активувати?';
+$lang['Dump Database'] = 'Дамп бази даних';
+$lang['ERROR'] = 'ПОМИЛКА';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'ПОМИЛКА: ЦЕЙ ДОДАТОК ВІДСУТНІЙ, АЛЕ ВІН ВСТАНОВЛЕНИЙ! ВИДАЛИТИ ЙОГО ЗАРАЗ.';
+$lang['Extensions Update'] = 'Оновлення розширень';
+$lang['Follow Orientation'] = 'Дотримуватись орієнтації';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Наступні додатки можуть бути несумісні з новою версією Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Наступні теми можуть бути несумісні з новою версією Piwigo:';
+$lang['Graphics Library'] = 'Графічна бібліотека';
+$lang['Height'] = 'Висота';
+$lang['hide details'] = 'приховати деталі';
+$lang['Hoverbox display'] = 'Відображати маркерну рамку';
+$lang['I decide to update anyway'] = 'Я таки вирішив оновити';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Якшо нема HD-зображення і поточний веб-розмір більший за нові розміри, Piwigo перемістить його як HD і створить зменьшене до веб-розміру зображення.';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Якшо у Вас виникли проблеми або запитання, надішлить повідомлення до';
+$lang['Ignore All'] = 'Ігнорувати Всі';
+$lang['Ignore selected anomalies'] = 'Ігнорувати обрані аномалії';
+$lang['Ignore this update'] = 'Ігнорувати це оновлення';
+$lang['Image id'] = 'Ідентифікатор зображення';
+$lang['Image Quality'] = 'Якість зображення';
+$lang['jump to album'] = 'перейти до альбому';
+$lang['jump to photo'] = 'перейти до фото';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Залишайтесь з пректом Piwigo, підпишіться на інформаційний бюлетень Piwigo Announcement. Ви будуте одержувати повідомлення коли новий реліз буде доступний (час від часу з виправленням помилок в системі безпеки, це важливо знати і оновлювати) і коли значні події відбуваються з проектом. Лише кілька повідомлень на рік.';
+$lang['Language has been successfully installed'] = 'Мову було успішно встановлено';
+$lang['Languages which need upgrade'] = 'Мови що потребують оновлення';
+$lang['Languages'] = 'Мови';
+$lang['Last hit'] = 'Останне влучення';
+$lang['Last import'] = 'Останній імпорт';
+$lang['Last revisions'] = 'Останні зміни';
+$lang['Last send'] = 'Останне відіслане';
+$lang['Learn more'] = 'Дізнатися більше';
+$lang['leave'] = 'покинути';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Контакти';
+$lang['Level 2'] = 'Друзі';
+$lang['Level 4'] = 'Родина';
+$lang['Level 8'] = 'Адміністратори'; 
+$lang['Activate comments'] = 'Активувати коментарі';
+$lang['Default comments order'] = 'Порядок коментарів за замовчуванням';
+$lang['Images manual order was saved'] = 'Ручний порядок зображень збережено';
+$lang['Impossible automatic correction'] = 'Автоматичне виправлення неможливо';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Ця тема не може бути активована, остільки батьківська тема відсутня: %s';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Неможливо відключити цю мову, спочатку потрібно встановити іншу мову за замовчуванням.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Неможливо відключити цю мову, потрібна хоча б одна мова.';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Неможливо відключити цю тему, потрібна хоча б одна тема.';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Неможливо видалити цю тему, тому що інші теми залежать від неї: %s';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'В вашому файлі php.ini, параметр upload_max_filesize (%sB) більший за параметр post_max_size (%sB), вам необхідно змінити ці налаштування';
+$lang['Inactive Languages'] = 'Неактивні мови';
+$lang['Inactive Plugins'] = 'Неактивні плаґіни';
+$lang['Inactive Themes'] = 'Неактивні теми';
+$lang['include child albums'] = 'включити дочірні альбоми';
+$lang['Include display of recent photos grouped by dates'] = 'Включити відображення недавніх фотографій, згрупованих по датам';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Включити історичні дані (Увага: ліміт пам\'яті сервера може бути перевищений)';
+$lang['Information data registered in database'] = 'Інформація даних, зареєстрованих в базі даних';
+$lang['Informations'] = 'Інформація';
+$lang['Install on your computer,'] = 'Встановити на Ваш компьютер,';
+$lang['Install'] = 'Встановити';
+$lang['Installed Languages'] = 'Встановлені мови';
+$lang['Installed Themes'] = 'Встановлені теми';
+$lang['Instructions to use Piwigo'] = 'Інсрукції по використанню Piwigo';
+$lang['Invert'] = 'Інвертувати';
+$lang['IP'] = 'IP';
+$lang['Link all album photos to a new album'] = 'Зв`язати всі світлини альбому з новим альбомом';
+$lang['Link all album photos to some existing albums'] = 'Зв`язати всі світлини альбому з існуючим альбомом';
+$lang['Linked albums'] = 'Пов`язані альбоми';
+$lang['Local'] = 'Локальний';
+$lang['Lock albums'] = 'Зачинити альбоми';
+$lang['Lock gallery'] = 'Зачинити галерею';
+$lang['Lock'] = 'Замок';
+$lang['Locked'] = 'Зачинено';
+$lang['Mail address is obligatory for all users'] = 'електронная пошта обов`язкова для всіх користувачів';
+$lang['Mail content'] = 'Зміст листа'; 
+$lang['Mail sent to %s [%s].'] = 'Поштові повідомлення на %s [%s].';
+$lang['Main "guest" user does not exist'] = 'Основний "гість" користувача не існує';
+$lang['Main "guest" user status is incorrect'] = 'Основний "гість" статус користувача невірно';
+$lang['Main "webmaster" user does not exist'] = 'Основний "веб-майстер" користувача не існує';
+$lang['Main "webmaster" user status is incorrect'] = 'Основний "веб-майстер" статус користувача невірно';
+$lang['Main Page'] = 'Головна сторінка';
+$lang['Main'] = 'Головна';
+$lang['Maintenance'] = 'Обслуговування';
+$lang['Manage Permissions'] = 'Управління дозволами';
+$lang['Maximum file size: %sB.'] = 'Максимальний розмір файлу: %sB.';
+$lang['Merge selected tags'] = 'Злиття обраних теґів';
+$lang['Merge tags'] = 'Злиття теґів';
+$lang['New Version'] = 'Нова версія';
+$lang['No destination tag selected'] = 'Немає призначення обраний теґ';
+$lang['Obsolete Plugins'] = 'Застарілі плаґіни';
+$lang['Photo %s of %s'] = 'Фотографія %s з %s';
+$lang['Photo name'] = 'Ім\'я зображення';
+$lang['Photos generation in progress...'] = 'Процес генерації зображень...';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo не може отримати файл оновлення з сервера';
+$lang['Piwigo Update'] = 'Piwigo оновлення';
+$lang['Please wait...'] = 'Будь ласка, зачекайте...';
+$lang['remove creation date'] = 'видалити дату створення';
+$lang['Remove from caddie'] = 'Видалити з кошику';
+$lang['remove tags'] = 'видалити теґи';
+$lang['remove this filter'] = 'видалити цей фільтр';
+$lang['remove title'] = 'видалити назву';
+$lang['Repair and optimize database'] = 'Ремонт та оптимізація бази даних';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Заміна оригінальних шаблонів, налаштованих шаблонів від шаблонів розширення підтеки';
+$lang['Replacers (customized templates)'] = 'Substitutes (customized templates)';
+$lang['Representant'] = 'Ескіз альбому';
+$lang['Representation of albums'] = 'Ескіз альбомів';
+$lang['Representative'] = 'Ескіз альбому';
+$lang['Represents'] = 'Мініатюра для';
+$lang['Reset ignored updates'] = 'Скидання ігнорування оновлення';
+$lang['Resize'] = 'Зміна розміру';
+$lang['Restore'] = 'Відновлення';
+$lang['Save Template Directory'] = 'Зберегти шаблон каталогу';
+$lang['Select an album'] = 'Виберіть альбом';
+$lang['Select at least two tags for merging'] = 'Виберіть принаймні два теґа для об\'єднання';
+$lang['Select the destination tag'] = 'Виберіть призначення теґу';
+$lang['Send connection settings by email'] = 'Надіслати налаштування з\'єднання по електронній пошті';
+$lang['show details'] = 'показати деталі';
+$lang['Some themes and plugins may be not available yet.'] = 'Деякі теми і плаґіни можуть бути не доступні.';
+$lang['Some upgrades are available for extensions.'] = 'Деякі оновлення доступні для розширень.';
+$lang['Start Upload'] = 'Початок завантаження';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Теґи <em>%s</em> об\'єднані в теґ <em>%s</em>';
+$lang['The original image quality must be a number between %d and %d'] = 'Вихідна якість зображення повинна бути число від %d та %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Оригінальна максимальна висота повинна бути поряд з %d та %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Оригінальна Максимальна ширина повинна бути поряд з %d та %d';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Розмір завантаження перевищує MAX_FILE_SIZE директиву, яка була вказана в HTML-формі';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Розмір завантаження перевищує upload_max_filesize директиви php.ini: %sB';
+$lang['The uploaded file was only partially uploaded'] = 'Завантажений файл був завантажений лише частково';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Завантажених файлів перевищує post_max_size директиви php.ini: %sB';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Встановлена версія %s [%s] ​​не сумісна з версією, потрібно [%s]';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Вебмастер підписався на Вас поштою.';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Вебмастер відписався від Вас поштою.';
+$lang['The whole page'] = 'Вся сторінка';
+$lang['The whole set'] = 'Всі сторінки';
+$lang['the wiki'] = 'вікі';
+$lang['Theme has been successfully installed'] = 'Тему було успішно встановлено';
+$lang['Themes which need upgrade'] = 'Теми, які необхідно оновити';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Це велике оновлення з <a href="%s">нововведеннями</a>.';
+$lang['This is a minor update, with only bug corrections.'] = 'Це невелике оновлення, тільки з виправленнями помилок.';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'ЦЕЙ ПЛАҐІН Є ЧАСТИНОЮ CORE Piwigo! ВИДАЛІТЬ ЙОГО НЕГАЙНО!';
+$lang['Thumbnails generation in progress...'] = 'Процес генерації мініатюр...';
+$lang['Two updates are available'] = 'Два доступних оновлень';
+$lang['Unable to check for upgrade.'] = 'Неможливо перевірити наявність оновлень.';
+$lang['Unable to dump database.'] = 'Неможливо зберегти базу даних.';
+$lang['Uncheck all'] = 'Зняти все';
+$lang['Uninstall'] = 'Видалити';
+$lang['Uninstalled Plugins'] = 'Видалити плаґіни';
+$lang['unit mode'] = 'однокористувацький режим';
+$lang['unknown'] = 'невідомий';
+$lang['Unknown upload error'] = 'Невідома помилка при завантаженні';
+$lang['Unlocked'] = 'Розблоковано';
+$lang['unset'] = 'встановлено';
+$lang['Unsubscribe from notification by mail'] = 'Відмовитися від повідомлень по електронній пошті';
+$lang['Unsubscribed'] = 'Відписався';
+$lang['Update albums informations'] = 'Оновлення інформації альбомів';
+$lang['Update All'] = 'Оновити все';
+$lang['Update Complete'] = 'Оновлення завершено';
+$lang['Update in progress... Please wait.'] = 'Триває оновлення... Будь ласка, почекайте.';
+$lang['Update photos information'] = 'Оновлення інформації зображень';
+$lang['update the database from files'] = 'оновлення бази даних з файлами';
+$lang['Update to Piwigo %s'] = 'Оновлення Piwigo %s';
+$lang['Updates'] = 'Оновлення';
+$lang['Upload'] = 'Завантажити';
+$lang['Upload Photos'] = 'Завантажити фотографії';
+$lang['Uploaded Photos'] = 'Завантажено світлини';
+$lang['Use the default photo sort order (defined in the configuration file)'] = 'За допомогою сортування за замовчуванням порядку зображення (визначені в файлі конфігурації)';
+$lang['Used metadata'] = 'метадані, що використовуються';
+$lang['User'] = 'Користувач';
+$lang['user "%s" added'] = 'користувача "%s" додано';
+$lang['User "%s" created with "%s" like password'] = 'Користувачу "%s" створено "%s" в якості пароля';
+$lang['User %s [%s] added.'] = 'Користувача %s [%s] додано.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Користувача %s [%s] додано до списку підписників.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Користувача %s [%s] не додано до списку підписників.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Користувач %s [%s] не видаляється зі списку розсилки.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Користувач %s [%s] видалений зі списку розсилки.';
+$lang['User comments validation'] = 'Перевірка коментарів користувачів';
+$lang['User list'] = 'Список користувачів';
+$lang['User status'] = 'Статус користувача';
+$lang['Users'] = 'Користувачі';
+$lang['user_status_admin'] = 'Адміністратор';
+$lang['user_status_generic'] = 'Загальний';
+$lang['user_status_guest'] = 'Гість';
+$lang['user_status_normal'] = 'Користувач';
+$lang['user_status_webmaster'] = 'Веб-майстер';
+$lang['Validate'] = 'Підтвердження';
+$lang['Validation'] = 'Перевірка';
+$lang['Version'] = 'Версія';
+$lang['Virtual album'] = 'Віртуальний альбом';
+$lang['Virtual album added'] = 'Віртуальний альбом додано';
+$lang['Virtual album deleted'] = 'Віртуальний альбом видалено';
+$lang['Virtual album name'] = 'Назва віртуального альбому';
+$lang['Virtual albums to move'] = 'Віртуальні альбоми для переміщення';
+$lang['Virtual Links'] = 'Віртуальні посилання';
+$lang['Visit Gallery'] = 'Відвідайте галерею';
+$lang['Visit language site'] = 'Відвідайте сайт мови';
+$lang['Visit Piwigo project website'] = 'Відвідайте веб-сайт проекту Piwigo';
+$lang['Visit plugin site'] = 'Відвідайте сторінку плаґіну';
+$lang['Visit theme site'] = 'Відвідайте сайт теми';
+$lang['Waiting'] = 'В очікуванні';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'УВАГА! Цей плаґін, здається, не сумісні з цією версією Piwigo.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Попередження: передплата і відписка буде надсилати електронну пошту користувачів';
+$lang['Webmaster cannot be deleted'] = 'Для веб-майстрів не може бути видалений';
+$lang['Webmaster status is required.'] = 'Веб-майстеру статус не потрібен.';
+$lang['Week starts on'] = 'Початок тижня';
+$lang['Who can see these photos?'] = 'Хто може бачити ці фотографії?';
+$lang['Who can see this photo?'] = 'Хто може бачити цю фотографію?';
+$lang['Width'] = 'Ширина';
+$lang['width must be a number superior to'] = 'ширина повинна бути трохи більше, ніж';
+$lang['With blank value, gallery title will be used'] = 'Якщо це поле порожнє, галерея буде використовувати назву';
+$lang['With no album'] = 'При відсутності альбому';
+$lang['With no tag'] = 'При відсутності теґів';
+$lang['With no virtual album'] = 'При відсутності віртуального альбому';
+$lang['wrong filename'] = 'неправильне ім\'я файлу';
+$lang['A locked gallery is only visible to administrators'] = 'Заблоковано, галерею видно тільки адміністратору';
+$lang['administrators'] = 'адміністратори';
+$lang['Center of interest'] = 'Центр інтересів';
+$lang['Gallery unlocked'] = 'Галерея розблокована';
+$lang['modified'] = 'модифікований';
+$lang['Move to album'] = 'Перемістити до альбому';
+$lang['Not cropped correctly?'] = 'Не обрізати правильно?';
+$lang['Notify administrators when a comment is'] = 'Повідомити адміністратора, якщо коментар є';
+$lang['Original Size'] = 'Оригінальний розмір';
+$lang['pending validation'] = 'готовий до перевірки';
+$lang['registered users'] = 'зареєстровані користувачі';
+$lang['Resize after upload'] = 'Зміна розмірів після завантаження';
+$lang['Save visits in history for'] = 'Зберегти відвідування в історії';
+$lang['simple visitors'] = 'прості відвідувачі';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Цей альбом містить %d зображень, додано ​​між %s і %s';
+$lang['This album contains %d photos, added on %s.'] = 'Цей альбом містить %d зображень, додано %s.';
+$lang['This album contains no photo.'] = 'Цей альбом не містить зображень.';
+$lang['Unlock gallery'] = 'Розблокувати галерею';
+$lang['Year'] = 'Рік';
+$lang['You are running on development sources, no check possible.'] = 'Ви працюєте на розвиток джерела, не перевірити це можливо.';
+$lang['You are running the latest version of Piwigo.'] = 'Ви працюєте з Piwigo останньої версії.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Ви використовуєте браузерний завантажувач. Спробуйте <a href="%s">Флеш завантажувач</a>.';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Ви використовуєте Флеш завантажувач. Проблеми? Спробуйте браузерний <a href="%s">завантажувач</a>.';
+$lang['You can activate only one mobile theme.'] = 'Ви можете активувати тільки одну мобільну тему.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Ви можете оновити Piwigo %s напряму, без переходу на Piwigo %s (рекомендовано).';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Ви не можете визначити порядок за замовчуванням фотографії, тому що у Вас є налаштування користувача у вашій локальній конфігурації.';
+$lang['You cannot delete your account'] = 'Ви не можете видалити свій аккаунт';
+$lang['You cannot move an album in its own sub album'] = 'Ви не можете переміщати альбом в свій під-альбом';
+$lang['You have %d orphan tags: %s.'] = 'У вас є %d теґи-пустишки: %s.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Ви вказали <i>$conf[\'order_by\']</i> в локальному файлі конфігурації, цей параметр в застарів, будь ласка, видаліть його або перейменувати його в <i>$conf[\'order_by_custom\']</i> !';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Ви підписалися на отримання повідомлень електронною поштою.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Ви відписалися від отримання повідомлення поштою.';
+$lang['You might go to plugin list to install and activate it.'] = 'Перейти до списку плаґінів для інсталяції та активації.';
+$lang['You need to confirm deletion'] = 'Ви повинні підтвердити видалення';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Ви повинні оновити систему в повній мірі скористатися додатком, в іншому випадку програма може працювати неправильно, або взагалі не працювати';
+$lang['Your configuration settings are saved'] = 'Параметри конфігурації зберігаються';
+$lang['Zoom'] = 'Збільшити';
+$lang['[%s] Visit album %s'] = '[%s] Відвідайте альбом %s';
+$lang['[NBM] Problems or questions'] = '[НБМ] Проблеми та питання';
+$lang['apply automatic sort order'] = 'застосовувати автоматичне сортування';
+$lang['Automatic sort order'] = 'Автоматичне сортування';
+$lang['Cancel'] = 'Скасувати';
+$lang['cancel manual order'] = 'відмінити ручне сортування';
+$lang['List'] = 'Список';
+$lang['Save manual order'] = 'Зберегти ручне сортування';
+$lang['Applications'] = 'Додатки';
+$lang['Web Form'] = 'Веб-форми';
+$lang['Available on'] = 'Доступні на';
+$lang['Available versions for'] = 'Доступні версії для';
+$lang['Delete multiple size images'] = 'Видалення декількох зображень розміром';
+$lang['Generate multiple size images'] = 'Створення декількох зображень розміром';
+$lang['Piwigo for Android'] = 'Piwigo для Android';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo для iOS(iPhone, iPad, iPod Touch)';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u користувачі мають автоматичний дозвіл, тому що вони належать до наданої групи.';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo для Android</em> додаток дозволяє вам підключити ваш телефон або планшет в галерею Piwigo, створити кілька альбомів і завантажити декілька зображень одночасно.';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo для iOS</em> додаток дає можливість підключатись до вашої галереї Piwigo з вашого сенсорного iPhone, iPad та iPod, створити кілька альбомів і завантажити декілька зображень одночасно.';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe Photoshop Lightroom являє собою програмне забезпечення фотографа, призначене для управління великою кількістю цифрових зображень і робить роботу постпродакшн.';
+$lang['any visitor can see this album'] = 'будь-який відвідувач може бачити цей альбом';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture є потужним інструментом для уточнення зображення і керувати великими бібліотеками на Mac.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture призначена для професійних фотографів з iPhoto.';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam - передове цифрове безкоштовне програмне забезпечення управління зображень для Linux, Windows, і MacOSX.';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'DigiKam призначений для фотографів, які хочуть переглядати, управляти, редагувати, покращувати організацію, теґи та обміну фотографіями.';
+$lang['Features include gallery browsing, album creation and photo upload.'] = 'Особливості включають перегляд галереї, створення альбому і завантаження зображень.';
+$lang['Groups and users'] = 'Групи та користувачі';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto - менеджер зображень за замовченням на MacOSX. Доповнення Piwigo експортує до програми створені нові альбоми і ваші фото безпосередньо від iPhoto до вашої фотогалереї Piwigo.';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = 'На вашому Linux , просто встановіть Shotwell з вашим менеджером пакетів та активувати Piwigo параметр публікації.';
+$lang['Permission granted for groups'] = 'Дозвіл, наданий для груп';
+$lang['Permission granted for users'] = 'Дозвіл, наданий для користувачів';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo export плаґін для Aperture';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo export плаґін для iPhoto';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo publish плаґін для digiKam';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Видають доповнення до програми для Lightroom';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo publish плаґін для Shotwell';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid (RemoteGallery клієнт для Android) це клієнт з відкритим вихідним кодом (GPL версії 3) Piwigo для платформи Android.';
+$lang['Select groups...'] = 'Виберіть групи...';
+$lang['Select users...'] = 'Виберіть користувачів...';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell є відкритим початковим цифровим організатором зображень, який працює на Linux. Він - менеджер заданий за замовчуванню зображень в Ubuntu і Fedora.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Плаґін Piwigo експорту дозволяє створювати альбоми та експортовані зображення.';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo publish плаґін на дозволяє експортувати та синхронізувати фотографії з Lightroom безпосередньо до вашої галереї Piwigo.';
+$lang['There is no group in this gallery.'] = 'Немає ніякої групи в цій галереї.';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = 'Щоб експортувати ваші зображення з digiKam до Piwigo, просто встановіть digiKam і Kipi-plugins.';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = 'відвідувачі повинні увійти і мати відповідні дозволи, щоб побачити цей альбом';
+$lang['custom'] = 'Звичай';
+$lang['include photos with lower privacy level'] = 'включати в себе зображення з більш низьким рівнем конфіденційності';
+$lang['No group is permitted to see this private album'] = 'Ніякій групі не дозволяється бачити цей приватний альбом';
+$lang['Permission management'] = 'Управління дозволу';
+$lang['add a new watermark'] = 'додати новий водяний знак';
+$lang['Apply watermark if height is bigger than'] = 'Накладення водяних знаків, якщо висота більше, ніж';
+$lang['Apply watermark if width is bigger than'] = 'Накладення водяних знаків, якщо ширина більше, ніж';
+$lang['Select a file'] = 'Виберіть файл';
+$lang['The center of interest is the most meaningful zone in the photo.'] = 'Центр інтересу - найзначиміша зона у зображенні.';
+$lang['bottom left corner'] = 'нижній лівий кут';
+$lang['bottom right corner'] = 'нижній правий кут';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = 'За замовчуванням центр уваги знаходиться в центральній частині зображення.';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = 'Для зображень розміром з культурою, такі як "Площа", Piwigo зробить все можливе, щоб включити в центрі уваги.';
+$lang['middle'] = 'середина';
+$lang['Opacity'] = 'Непрозорість';
+$lang['Photo sizes with crop'] = 'Зображення розміром з культурою';
+$lang['Select a zone with your mouse to define a new center of interest.'] = 'Виберіть зону за допомогою миші, щоб визначити новий центр уваги.';
+$lang['top left corner'] = 'верхній лівий кут';
+$lang['top right corner'] = 'верхній правий кут';
+$lang['X Position'] = 'Позиція X';
+$lang['X Repeat'] = 'Повторення X';
+$lang['Y Position'] = 'Позиція Y';
+$lang['Multiple Size'] = 'Кілька розмірів';
+?>
Index: tags/2.4.0RC3/language/uk_UA/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/uk_UA/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/common.lang.php	(revision 14585)
@@ -0,0 +1,406 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Українська [UA]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=523
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = "Українська";
+$lang_info['country'] = "Україна";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "ua";
+$lang_info['zero_plural'] = true;
+
+$lang['%d album updated'] = '%d альбом оновлено';
+$lang['%d albums updated'] = 'альбомів оновлено: %d';
+$lang['%d comment to validate'] = '%d коментар на перевірці';
+$lang['%d comments to validate'] = 'коментарів на перевірці: %d';
+$lang['%d new comment'] = '%d новий коментар';
+$lang['%d new comments'] = 'нових коментарів: %d';
+$lang['%d comment'] = '%d коментар';
+$lang['%d comments'] = 'коментарів: %d';
+$lang['%d hit'] = '%d перегляд';
+$lang['%d hits'] = 'переглядів: %d';
+$lang['%d new photo'] = '%d нова фотографія';
+$lang['%d new photos'] = 'нових зображень: %d';
+$lang['%d new user'] = '%d новий користувач';
+$lang['%d new users'] = 'нових користувачів: %d';
+$lang['About'] = 'Про рушій';
+$lang['All tags'] = 'Всі теґи';
+$lang['Any tag'] = 'Будь-який теґ';
+$lang['At least one listed rule must be satisfied.'] = 'Хоча б одне правило повинне виконуватись.';
+$lang['Author'] = 'Автор';
+$lang['Albums'] = 'Альбоми';
+$lang['Album'] = 'Альбом';
+$lang['Close this window'] = 'Закрити це вікно';
+$lang['Complete RSS feed (photos, comments)'] = 'Повний RSS канал (фотографії, коментарі)';
+$lang['Confirm Password'] = 'Підтвердіть пароль';
+$lang['Connection settings'] = "Налаштування з'єднання";
+$lang['Login'] = 'Авторизація';
+$lang['Contact webmaster'] = 'Техпідтримка';
+$lang['Create a new account'] = 'Створити новий обліковий запис';
+$lang['Created on'] = 'Дата зйомки';
+$lang['Creation date'] = 'Дата зйомки';
+$lang['Current password is wrong'] = 'Введений невірний пароль';
+$lang['Dimensions'] = 'Розміри';
+$lang['Display'] = 'Порядок';
+$lang['Each listed rule must be satisfied.'] = 'Усі перераховані правила повинні виконуватись.';
+$lang['Email address'] = 'Адреса електронної пошти';
+$lang['Enter your personnal informations'] = 'Вкажіть вашу персональну інформацію';
+$lang['Error sending email'] = 'Помилка відправки електронної пошти';
+$lang['File name'] = "Ім'я файлу";
+$lang['File'] = 'Файл';
+$lang['Filesize'] = 'Розмір файлу';
+$lang['Filter and display'] = 'Відфільтрувати і показати';
+$lang['Filter'] = 'Фільтр';
+$lang['Forgot your password?'] = 'Забули пароль?';
+$lang['Go through the gallery as a visitor'] = 'Увійти в галерею як відвідувач';
+$lang['Help'] = 'Допомога';
+$lang['Identification'] = 'Ідентифікація';
+$lang['Photos only RSS feed'] = 'RSS канал тільки з фотографіями';
+$lang['Keyword'] = 'Ключеве слово';
+$lang['day'][0] = "Неділя";
+$lang['day'][1] = "Понеділок";
+$lang['day'][2] = "Вівторок";
+$lang['day'][3] = "Середа";
+$lang['day'][4] = "Четвер";
+$lang['day'][5] = "П'ятниця";
+$lang['day'][6] = "Субота";
+$lang['month'][10] = "Жовтень";
+$lang['month'][11] = "Листопад";
+$lang['month'][12] = "Грудень";
+$lang['month'][1] = "Січень";
+$lang['month'][2] = "Лютий";
+$lang['month'][3] = "Березень";
+$lang['month'][4] = "Квітень";
+$lang['month'][5] = "Травень";
+$lang['month'][6] = "Червень";
+$lang['month'][7] = "Липень";
+$lang['month'][8] = "Серпень";
+$lang['month'][9] = "Вересень";
+$lang['Notification'] = 'Повідомлення';
+$lang['Number of items'] = 'Кількість елементів';
+$lang['Original dimensions'] = 'Оригінальні розміри';
+$lang['Password forgotten'] = 'Забули пароль';
+$lang['Password'] = 'Пароль';
+$lang['Post date'] = 'Дата розміщення';
+$lang['Posted on'] = 'Опубліковано';
+$lang['Profile'] = 'Профіль';
+$lang['Quick connect'] = "Швидке з'єднання";
+$lang['RSS feed'] = 'RSS канал';
+$lang['Register'] = 'Реєстрація';
+$lang['Registration'] = 'Реєстрація';
+$lang['Related tags'] = 'Пов\'язані теґи';
+$lang['Reset'] = 'Скинути';
+$lang['Retrieve password'] = 'Відновити пароль';
+$lang['Search rules'] = 'Критерії пошуку';
+$lang['Search tags'] = 'Теґи пошуку';
+$lang['Search'] = 'Пошук';
+$lang['display available tags'] = 'відображати доступні теґи';
+$lang['Since'] = 'З';
+$lang['Sort by'] = 'Сортувати за';
+$lang['Sort order'] = 'Порядок сортування';
+$lang['Tag'] = 'Теґ';
+$lang['Tags'] = 'Теґи';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS канал надсилає повідомлення про нові події з цього сайту: нові фотографії, оновлені альбоми, нові коментарі. Використовуйте читання RSS каналів.';
+$lang['Unknown feed identifier'] = 'Невідомий ідентифікатор каналу';
+$lang['User comments'] = 'Коментарі користувача';
+$lang['Username'] = "Ім'я користувача";
+$lang['Visits'] = 'Відвідувань';
+$lang['Webmaster'] = 'Вебмайстер';
+$lang['Week %d'] = 'Тиждень %d';
+$lang['About Piwigo'] = 'Про Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Ви не авторизовані для доступу до запитуваної сторінки';
+$lang['add this photo to your favorites'] = 'Додати це зображення в обране';
+$lang['Administration'] = 'Адміністрування';
+$lang['all'] = 'всі';
+$lang['ascending'] = 'в порядку зростання';
+$lang['useful when password forgotten'] = "корисно, коли забули пароль";
+$lang['Quick search'] = "Швидкий пошук";
+$lang['Connected user: %s'] = "Підключений користувач: %s";
+$lang['Browser: %s'] = "Браузер: %s";
+$lang['Author: %s'] = "Автор: %s";
+$lang['Comment: %s'] = "Коментар: %s";
+$lang['Comment by %s'] = "Коментар %s";
+$lang['User: %s'] = "Користувач: %s";
+$lang['Email: %s'] = "Електронна пошта: %s";
+$lang['Admin: %s'] = "Адміністратор: %s";
+$lang['Registration of %s'] = "Зареєстровано %s";
+$lang['Tag results for'] = "Результати для";
+$lang['from %s to %s'] = "від %s до %s";
+$lang['Play of slideshow'] = "Показувати слайдшоу";
+$lang['Pause of slideshow'] = "Пауза слайдшоу";
+$lang['Repeat the slideshow'] = "Повторити слайдшоу";
+$lang['Not repeat the slideshow'] = "Не повторювати слайдшоу";
+$lang['Reduce diaporama speed'] = "Зменшити швидкість слайдшоу";
+$lang['Accelerate diaporama speed'] = "Збільшити швидкість слайдшоу";
+$lang['Submit'] = "Відправити";
+$lang['Yes'] = "Так";
+$lang['No'] = "Ні";
+$lang['Piwigo Help'] = "Допомога Piwigo";
+$lang['Rank'] = "Ранг";
+$lang['group by letters'] = "групувати по буквах";
+$lang['letters'] = "букви";
+$lang['show tag cloud'] = 'показувати хмару теґів';
+$lang['cloud'] = "хмара";
+$lang['Reset to default values'] = "Скинути на значення за замовчуванням";
+$lang['Sent by'] = "Надіслано";
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = "Куки заблоковані або не підтримуються вашим браузером. Ви повинні увімкнути куки, щоб увійти.";
+$lang['author(s) : %s'] = 'автор(и) : %s';
+$lang['Expand all albums'] = 'Розгорнути всі альбоми';
+$lang['posted after %s (%s)'] = 'додано після %s (%s)';
+$lang['posted before %s (%s)'] = 'додано до %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'додано між %s (%s) і %s (%s)';
+$lang['posted on %s'] = 'додано в %s';
+$lang['Best rated'] = 'Найбільший рейтинг';
+$lang['display best rated photos'] = 'показати фотографії з найбільшим рейтингом';
+$lang['Calendar'] = 'Календар';
+$lang['All'] = 'Всі';
+$lang['display each day with photos, month per month'] = 'показувати кожен день з фотографіями, місяць за місяцем';
+$lang['View'] = 'Перегляд';
+$lang['chronology_monthly_calendar'] = 'Місячний календар';
+$lang['chronology_monthly_list'] = 'Список місяців';
+$lang['chronology_weekly_list'] = 'Список тижнів';
+$lang['Click here if your browser does not automatically forward you'] = 'Натисніть тут, якщо ваш браузер не перенаправив вас автоматично';
+$lang['comment date'] = 'дата коментаря';
+$lang['Comment'] = 'Коментар';
+$lang['Your comment has been registered'] = 'Ваш коментар був зареєстрований';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Анти-флуд система : будь ласка, зачекайте кілька секунд перед тим, як додати новий коментар';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Ваш коментар НЕ був зареєстрований, оскільки він не відповідає вимогам';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Адміністратор повинен авторизувати ваш коментар перед тим, як він стане видимим.';
+$lang['This login is already used by another user'] = 'Цей лоґін вже використовується іншим користувачем';
+$lang['Comments'] = 'Коментарі';
+$lang['Add a comment'] = 'Додати коментар';
+$lang['created after %s (%s)'] = 'створено після %s (%s)';
+$lang['created before %s (%s)'] = 'створено до %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'створено між %s (%s) і %s (%s)';
+$lang['created on %s'] = 'створено в %s';
+$lang['Customize'] = 'Налаштування';
+$lang['Your Gallery Customization'] = 'Налаштування вашої галереї';
+$lang['Default'] = 'За замовчуванням';
+$lang['delete this photo from your favorites'] = 'видалити це зображення з обраних';
+$lang['Delete'] = 'Видалити';
+$lang['descending'] = 'в порядку спадання';
+$lang['Download'] = 'Завантажити';
+$lang['Download this file'] = 'завантажити цей файл';
+$lang['edit'] = 'редагувати';
+$lang['wrong date'] = 'невірна дата';
+$lang['excluded'] = 'вилучено';
+$lang['Your favorites'] = 'Ваше обране';
+$lang['display your favorites photos'] = 'показати ваші обрані зображення';
+$lang['Favorites'] = 'Обрані';
+$lang['First'] = 'Початок';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Галерея закрита для обслуговування. Будь ласка, зайдіть пізніше.';
+$lang['Page generated in'] = 'Сторінка згенерована за';
+$lang['guest'] = 'гість';
+$lang['Hello'] = 'Привіт';
+$lang['available for administrators only'] = 'доступно тільки для адміністраторів';
+$lang['display this album'] = 'показати цей альбом';
+$lang['display last user comments'] = 'показати останні коментарі користувачів';
+$lang['customize the appareance of the gallery'] = 'налаштувати зовнішній вигляд галереї';
+$lang['search'] = 'пошук';
+$lang['Home'] = 'Домашня сторінка';
+$lang['in this album'] = 'в цьому альбомі';
+$lang['in %d sub-album'] = 'в %d під-альбомі';
+$lang['in %d sub-albums'] = 'в %d під-альбомах';
+$lang['included'] = 'включено';
+$lang['Invalid password!'] = 'Невірний пароль!';
+$lang['Language'] = 'Мова';
+$lang['last %d days'] = 'останні %d днів';
+$lang['Last'] = 'Кінець';
+$lang['Logout'] = 'Вийти';
+$lang['Links'] = 'Посилання';
+$lang['New on %s'] = 'Нове на %s';
+$lang['obligatory'] = "обов'язкове";
+$lang['Maximum photo height'] = 'Максимальна висота фотографії';
+$lang['Maximum height must be a number superior to 50'] = 'Максимальна висота має бути числом, більшим ніж 50';
+$lang['Maximum photo width'] = 'Максимальна ширина фотографії';
+$lang['Maximum width must be a number superior to 50'] = 'Максимальна ширина повинна бути числом, більшим ніж 50';
+$lang['display a calendar by creation date'] = 'показувати календар за датою створення';
+$lang['display all photos in all sub-albums'] = 'показувати всі фотографії в усіх під-альбомах';
+$lang['return to normal view mode'] = 'повернутися до звичайного режиму перегляду';
+$lang['display a calendar by posted date'] = 'показувати календар за датою відправлення';
+$lang['Most visited'] = 'Найбільш відвідувані';
+$lang['display most visited photos'] = 'показувати найбільш відвідувані фотографії';
+$lang['The number of photos per page must be a not null scalar'] = 'Кількість зображень на сторінці повинно бути цілим ненульовим числом';
+$lang['Number of photos per page'] = 'Кількість зображень на сторінці';
+$lang['Unknown identifier'] = 'Невідомий ідентифікатор';
+$lang['New password'] = 'Новий пароль';
+$lang['Rate this photo'] = 'Оцінити цю фотографію';
+$lang['Next'] = 'Наступне';
+$lang['no rate'] = 'не оцінено';
+$lang['Photos posted within the last %d day.'] = 'Фотографії, розміщені лише протягом останнього %d дня.';
+$lang['Photos posted within the last %d days.'] = 'Фотографії, розміщені лише протягом останніх %d днів.';
+$lang['password updated'] = 'пароль оновлено';
+$lang['Recent period must be a positive integer value'] = "Останній період повинен бути невід'ємним цілим значенням";
+$lang['photo'] = 'фото';
+$lang['Click on the photo to see it in high definition'] = 'Натисніть на фото, щоб побачити його у високій якості';
+$lang['Show file metadata'] = 'Показати метадані';
+$lang['Powered by'] = 'Підтримка';
+$lang['Preferences'] = 'Налаштування';
+$lang['Previous'] = 'Попереднє';
+$lang['Random photos'] = 'Випадкові фотографії';
+$lang['display a set of random photos'] = 'показувати випадкові фотографії';
+$lang['Recent albums'] = 'Останні альбоми';
+$lang['display recently updated albums'] = 'показувати нещодавно оновлені альбоми';
+$lang['Recent period'] = 'Останній період';
+$lang['Recent photos'] = 'Останні фотографії';
+$lang['display most recent photos'] = 'показувати останні фотографії';
+$lang['Redirection...'] = 'Перенаправлення...';
+$lang['Please, enter a login'] = 'Будь ласка, введіть лоґін';
+$lang['login mustn\'t end with a space character'] = 'лоґін не повинен закінчуватися на пробіл';
+$lang['login mustn\'t start with a space character'] = 'лоґін не повинен починатися з пробілу';
+$lang['this login is already used'] = 'цей лоґін вже використовується';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'адреса електронної пошти повинна бути у вигляді xxx@yyy.eee (наприклад : jack@altern.org)';
+$lang['please enter your password again'] = 'будь ласка, введіть свій пароль ще раз';
+$lang['Auto login'] = 'Автолоґін';
+$lang['remove this tag from the list'] = 'видалити цей теґ зі списку';
+$lang['representative'] = 'зразок';
+$lang['Search for Author'] = 'Пошук по автору';
+$lang['Search in albums'] = 'Пошук в альбомах';
+$lang['Search by date'] = 'Пошук по даті';
+$lang['Date'] = 'Дата';
+$lang['End-Date'] = 'Кінцева дата';
+$lang['Kind of date'] = 'Вид дати';
+$lang['Search for words'] = 'Пошук по словам';
+$lang['Search for all terms'] = 'Пошук по всім словам';
+$lang['Search for any term'] = 'Пошук по будь-якому слову';
+$lang['Empty query. No criteria has been entered.'] = 'Порожній запит. Не був введений жоден критерій.';
+$lang['%d Kb'] = '%d Кб';
+$lang['Search results'] = 'Результати пошуку';
+$lang['Search in sub-albums'] = 'Пошук в під-альбомах';
+$lang['searched words : %s'] = 'знайдено слів : %s';
+$lang['Contact'] = 'Контакт';
+$lang['set as album representative'] = 'встановити як обкладинку альбому';
+$lang['Show number of comments'] = 'Показувати число коментарів';
+$lang['Show number of hits'] = 'Показувати число посилань';
+$lang['slideshow'] = 'слайдшоу';
+$lang['stop the slideshow'] = 'зупинити слайдшоу';
+$lang['Specials'] = 'Спеціальні';
+$lang['SQL queries in'] = 'SQL запитів за';
+$lang['display only recently posted photos'] = 'показувати тільки нещодавно завантажені фотографії';
+$lang['return to the display of all photos'] = 'повернутися до всіх зображень';
+$lang['the beginning'] = 'початок';
+$lang['Interface theme'] = 'Тема інтерфейсу';
+$lang['Thumbnails'] = 'Ескізи';
+$lang['Menu'] = 'Меню';
+$lang['A comment on your site'] = 'Коментар на вашому сайті';
+$lang['today'] = 'сьогодні';
+$lang['Update your rating'] = 'Оновити ваш рейтинг';
+$lang['the username must be given'] = "необхідно ім'я користувача";
+$lang['Album: %s'] = 'Альбом: %s';
+$lang['this email address is already in use'] = 'ця адреса електронної пошти вже використовується';
+$lang['Album results for'] = 'Результати для';
+$lang['%d photo'] = '%d фотографія';
+$lang['%d photos'] = '%d зображень';
+$lang['%d photo is also linked to current tags'] = "%d фотографія також пов'язана з поточними мітками";
+$lang['%d photos are also linked to current tags'] = "%d фотографій також пов'язані з поточними мітками";
+$lang['display photos linked to this tag'] = 'показувати фотографії, пов\'язані з поточними теґами';
+$lang['photos posted during the last %d days'] = 'фотографії, завантажені протягом останніх %d днів';
+$lang['delete all photos from your favorites'] = 'видалити всі зображення з обраних';
+$lang['Edit a comment'] = 'Редагувати коментар';
+$lang['Are you sure?'] = 'Ви впевнені?';
+$lang['(!) This comment requires validation'] = '(!) Цей коментар вимагає валідації';
+$lang['Welcome'] = 'Ласкаво просимо';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Ласкаво просимо до вашої фото-галереї Piwigo!';
+$lang['... or browse your empty gallery'] = '... або відкрити вашу порожню галерею';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... або, будь ласка, деактивуйте це повідомлення, я знайду рішення сам';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Привіт %s, ваша Piwigo фото-галерея порожня!';
+$lang['I want to add photos'] = 'Я хочу додати фотографії';
+$lang['Manage this user comment: %s'] = 'Виправити цей коментар користувача: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Відсутня адреса електронної пошти. Будь ласка, вкажіть адресу електронної пошти.';
+$lang['This author modified following comment:'] = 'Цей автор змінив наступний коментар:';
+$lang['This author removed the comment with id %d'] = 'Цей автор видалив коментар з ідентифікатором %d';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Невірний статус для користувача "гість", буде використовуватись статус за замовчуванням. Будь ласка, повідомте веб-майстра.';
+$lang['N/A'] = 'невідомий';
+$lang['IP: %s'] = "IP: %s";
+$lang['html tags are not allowed in login'] = 'лоґін не повинен містити html тегів';
+$lang['%d rates'] = '%d голосів';
+$lang['Rating score'] = 'Рейтинговий бал';
+$lang['Invalid username or email'] = 'Невірне ім\'я користувача або адреса електронної пошти';
+$lang['Password reset is not allowed for this user'] = 'Оновлення паролю не дозволено для цього користувача';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Користувач "%s" не має адреси електронної пошти, оновлення паролю неможливе';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Хтось запросив оновлення паролю для наступного облікового запису користувача:';
+$lang['Username "%s" on gallery %s'] = 'Ім\'я "%s" в галереї %s';
+$lang['To reset your password, visit the following address:'] = 'Щоб оновити пароль, відвідайте наступну адресу:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Якщо це було помилкою, просто проігноруйте це повідомлення і нічого не трапиться.';
+$lang['Password Reset'] = 'Оновлення паролю';
+$lang['Check your email for the confirmation link'] = 'Перевірте вашу пошту на наявність лінку підтвердження';
+$lang['Invalid key'] = 'Невірний ключ';
+$lang['The passwords do not match'] = 'Паролі не співпадають';
+$lang['Your password has been reset'] = 'Ваш пароль був оновлений';
+$lang['Return to home page'] = 'Повернутися на домашню сторінку';
+$lang['Please enter your username or email address.'] = 'Будь ласка введіть ваше ім\'я користувача або адресу електронної пошти.';
+$lang['You will receive a link to create a new password via email.'] = 'Ви отримаєте посилання, щоб створити новий пароль по електронній пошті.';
+$lang['Username or email'] = 'Ім\'я користувача або адреса електронної пошти';
+$lang['Change my password'] = 'Змінити мій пароль';
+$lang['Enter your new password below.'] = 'Введіть ваш новий пароль нижче.';
+$lang['EXIF Metadata'] = 'EXIF метадані';
+$lang['IPTC Metadata'] = 'IPTC метадані';
+$lang['Edit'] = 'Редагувати';
+$lang['Hello %s,'] = 'Привіт %s,';
+$lang['Send my connection settings by email'] = 'Надіслати мої дані для входу по електронній пошті';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Реєстрація успішна. Скоро ви отримаєте лист з вашими даними. Ласкаво просимо!';
+$lang['Username modification'] = 'Зміна імені користувача';
+$lang['Your username has been successfully changed to : %s'] = 'Ваше ім\'я користувача було успішно змінене на  : %s';
+$lang['square'] = 'Квадрат';
+$lang['thumb'] = 'Іконка';
+$lang['small'] = 'Малий';
+$lang['medium'] = 'Середній';
+$lang['large'] = 'Великий';
+$lang['xlarge'] = 'XВеликий';
+$lang['xxlarge'] = 'XXВеликий';
+$lang['Original'] = 'Оригінальний';
+$lang['Thank you for registering at %s!'] = 'Дякуємо вам за реєстрацію на сайті %s!';
+$lang['Here are your connection settings'] = 'Ось Ваші дані для входу';
+$lang['Password: %s'] = 'Пароль: %s';
+$lang['Username: %s'] = 'Ім\'я користувача: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Якщо Ви думаєте, що Ви отримали цей лист помилково, будь ласка, зв\'яжіться з нами за адресою %s';
+$lang['Photo sizes'] = 'Розміри зображення';
+$lang['Desktop'] = 'Робочий стіл';
+$lang['Mobile'] = 'Мобільний';
+$lang['View in'] = 'Подивитися в';
+$lang['Show latest comments first'] = 'Покажіть найновіші коментарі спочатку';
+$lang['Show oldest comments first'] = 'Покажіть найстаріші коментарі спочатку';
+$lang['2small'] = 'XXS - крихітний';
+$lang['xsmall'] = 'XS - особливо малий';
+$lang['Date created, new &rarr; old'] = 'Дата створення, новіше &rarr; старіше';
+$lang['Date created, old &rarr; new'] = 'Дата створення, старіше &rarr; новіше';
+$lang['Date posted, new &rarr; old'] = 'Дата публікації, новіше &rarr; старіше';
+$lang['Date posted, old &rarr; new'] = 'Дата публікації, старіше &rarr; новіше';
+$lang['File name, A &rarr; Z'] = 'Ім\'я файлу, А &rarr; Я';
+$lang['File name, Z &rarr; A'] = 'Ім\'я файлу, Я &rarr; А';
+$lang['Manual sort order'] = 'Ручне сортування';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Числовий ідентифікатор, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Числовий ідентифікатор, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = 'Назва зображення, А &rarr; Я';
+$lang['Photo title, Z &rarr; A'] = 'Назва зображення,, Я &rarr; А';
+$lang['Rating score, high &rarr; low'] = 'Рейтинговий бал, від найвищий &rarr; найнижчий';
+$lang['Rating score, low &rarr; high'] = 'Рейтинговий бал, від найнижчий &rarr; найвищий';
+$lang['Visits, high &rarr; low'] = 'Переглядів, більше &rarr; менше';
+$lang['Visits, low &rarr; high'] = 'Перегляди, менше &rarr; більше';
+?>
Index: tags/2.4.0RC3/language/uk_UA/help/cat_modify.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/cat_modify.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/cat_modify.html	(revision 14585)
@@ -0,0 +1,128 @@
+<h2>Редагувати альбом</h2>
+
+<h3>Інформація</h3>
+
+<ul>
+
+  <li><strong>ім'я</strong>: перейменувати альбом (віртуальне перейменування в разі
+фізичного альбому).</li>
+
+  <li><strong>опис</strong>: короткий текст, що дає загальну думку вмісту,
+цей текст буде показаний в низі сторінки згорнутих зображень.</li>
+
+</ul>
+
+<h3>Переміщення</h3>
+
+<p>Якщо альбом є віртуальним, ви можете перемістити його. Переміщення альбому означає,
+зміни його перший альбом.</p>
+
+<h3>Парметри</h3>
+
+<ul>
+
+  <li><strong>Тип доступу</strong>: Дозволи управління. Якщо ви робите
+альбом приватним, всі його під-альбоми стають приватним. Якщо ви робите
+альбом публічним, всі його батьківські альмоми стають доступними для громадськості.</li>
+
+  <li><strong>Заблоовані</strong>: Альбом і його під-альбоми будуть тимчасово вимкнуті для технічного обслуговування.</li>
+
+  <li><strong>Коментарі</strong>: Дозволити користувачам коментувати фотографії цього альбому.</li>
+
+</ul>
+
+<p>Ви також можете керувати цим параметром на "Властивості"
+екрані управління (екрани <span
+class="pwgScreen">Коментарі</span>, <span class="pwgScreen">Блокування</span>,
+<span class="pwgScreen">Публічно/Приватно</span>, <span
+class="pwgScreen">Представник</span> доступні з <span
+class="pwgScreen">Адміністрування &raquo; Альбоми &raquo; Властивості</span>).</p>
+
+<h3>Порядок сортування</h3>
+
+<p>Використовувати порядок сортування зображення за промовчанням.</p>
+
+<p>Вкажіть, чи цей порядок сортування буде застосовано до під-альбомів також.</p>
+
+<p>Виберіть специфічні сортуючі критерії, які використані з цим альбомом.</p>
+<ul>
+<li><strong>Дата створення</strong>: Дата створення зображення</li>
+<li><strong>Дата публікації</strong>: Дата синхронізації</li>
+<li><strong>Середній рейтинг (*)</strong>: Середній рейтинг змогла змінити оцінка відвідувача</li>
+<li><strong>Найбільш відвідувані (*)</strong>: Нинішній візит може змінити порядок найбільш відвідуваних</li>
+<li><strong>Ім'я файлу</strong>: Назва дана в інформаційному полі</li>
+<li><strong>Ід</strong>: Внутрішній Ід (останні категорії мають вищий ідентифікатор, ніж попередні.</li>
+
+</ul>
+<p><strong>(*)</strong>Попередження: Не забудьте перевірити цей порядок сортування за себе, оскільки вони можуть дати неочікувані результати.</p>
+
+
+<h3>Представник</h3>
+
+<p>Представник альбом є мініатюри, що відображається на головній сторінці (<span class="pwgScreen">category.php</span>) для представлення
+альбому коли
+він містить тільки вкладені альбоми і немає прямих зображень (так само, як корінь альбому).</p>
+зображення з альбому :</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Сторінка зображення</span>: одна з кнопок дозволяє налаштувати поточне зображення як представник альбому. Ця кнопка доступна лише для адміністраторів.</li>
+
+  <li><span class="pwgScreen">Змінити інформацію про фото</span> в
+  адмініструванні. Цей екран може бути досягнуто в <span
+  class="pwgScreen">picture.php</span> або <span class="pwgScreen">Пакетний
+  менеджер</span> в <em>одиничному режимі</em>. Переглянути допомогу по цьому екрану 
+  детальніше.</li>
+
+  <li><span class="pwgScreen">Адміністрування &raquo; Альбоми &raquo; Властивості,
+  Представник</span>. Переглянути допомогу по цьому екрану детальніше.</li>
+
+  <li><span class="pwgScreen">Редагувати альбом</span> (цей екран).</li>
+
+</ul>
+
+<p>Вибір представника залежить від 
+<code>allow_random_representative</code> параметра конфігурації (див. <span
+class="filename">include/config_default.inc.php</span>).</p>
+
+<p>В режимі за промовчанням (<code>allow_random_representative</code> значення false),
+кожен альбом, що містить хоча б один елемент являє собою фіксований
+елемент. Після встановлення(створення альбому), представник змінюється лише
+коли адміністратор просити про це. Якщо представник не підходить,
+Ви можете попросити <strong>знайти нових представників випадково</strong>.</p>
+
+<p>Якщо параметр конфігурації <code>allow_random_representative</code>
+встановлено вірно, категорії з зображеннями може не мають фіксованого
+передставника. Просто використовуйте кнопку <strong>Видалення передставника</strong>.</p>
+
+<p>Якщо альбом містить тільки під-альбоми і немає зображень, він тим не менше може бути представлений на будь-який елемент, завдяки екрану <span class="pwgScreen">Зміни
+інформації про зображення</span>. Єдиний варіант, на поточному екрані є кнопка <strong>Видалення передставника</strong>.</p>
+
+<h3>Пов'язати усі зображення альбому з новим альбомом</h3>
+
+<ul>
+
+<li><strong>Ім'я віртуального альбому</strong>: Ім'я нового альбому, який створений,
+усі зображення поточної категорії будуть зв'язані з новим.</li>
+
+<li><strong>Батьківський альбом</strong>: Де буде новий альбом, залиште пустим для його створення в корені.</li>
+
+</ul>
+
+<h3>Пов'язати усі зображення альбому з існуючими альбомами</h3>
+
+<ul>
+
+<li><strong>Альбоми</strong>: Виберіть призначений альбом.</li>
+
+</ul>
+
+<h3>Відправте інформаційну електронну пошту членам групи</h3>
+
+<ul>
+
+<li><strong>Група</strong>: група одержувачів</li>
+
+<li><strong>Повідомлення електронної пошти</strong>: Вільний текст для відправки їм.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/uk_UA/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Вибір альбому</h2>
+
+<p>Опції управління для кількох альбомів відразу.</p>
+
+<dl>
+
+<dt>Коментарі</dt>
+<dd>Зображення може отримати коментарі від відвідувачів, якщо воно належить до альбому з дозволеним коментуванням.</dd>
+
+<dt>Заблоковано</dt>
+<dd>Заблоковані альбоми вимкнуто для технічного обслуговування. Лише адміністратори можуть переглянути їх в галереї.</dd>
+
+<dt>Публічний / приватний</dt>
+<dd>Після того, як альбом став приватним, надайте права доступу користувачам і групам</dd>
+
+<dt>Представник</dt>
+<dd>Цей параметр доступний, якщо установлено параметр конфігурації
+<code>allow_random_representative</code> (подивіться <span
+ class="filename">include/config_defaults.inc.php</span>) значення
+<em>true</em>. Коженому альбому може бути представлено випадкові зображення або зображення, обрані у якості унікального представника.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/uk_UA/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/configuration.html	(revision 14585)
@@ -0,0 +1,101 @@
+<h2>Конфігурація</h2>
+
+<p>Цей екран дозволяє адміністратору налаштувати базові конфігурації галереї. Дійсно, цей екран відображає тільки прості параметри конфігурації, цього має бути достатньо для переважної більшості адміністраторів. Якщо ви хочете побачити інші численні(і додаткові) параметри конфігурації, прочитати файл конфігурації за замовчуванням <span
+class="filename">include/config_default.inc.php</span>.</p>
+
+<p>Екран ділиться на різні розділи групування параметри конфігурації по категоріях.</p>
+
+
+<h3>Головна</h3>
+<ul>
+  <li><strong>Назва галереї</strong>: використовується в RSS-каналі і повідомленнях по електронній пошті.</li>
+
+  <li><strong>Заголовок сторінки</strong>: відображається у верхній частині кожної відкритій сторінці.</li>
+
+  <li><strong>URL галереї</strong>: використовується для подачі RSS.</li>
+
+  <li><strong>Блокування галереї</strong>: Блокувати всю галерею на технічне обслуговування. Тільки адміністратор буде мати можливість доступу до галереї.</li>
+
+  <li><strong>Рейтинг</strong>: Функція рейтингу зображення включена.</li>
+
+  <li><strong>Рейтинг гостей</strong>: Навіть незареєстровані користувачі можуть оцінювати зображення.</li>
+
+  <li><strong>Дозволити реєстрацію користувачів</strong>: Будь-хто може зареєструватися.</li>
+
+  <li><strong>Поштова адреса є обов'язковою для всіх користувачів</strong>: пошта буде перевірятися на поновлення реєстрації або профілю, за винятком, якщо дія відбувається на адміністратора.</li>
+
+  <li><strong>Емейл повідомлення адміністраторам, коли новий користувач реєструється</strong>: адміністратори будуть повідомлені поштою про кожну реєстрацію.</li>
+  
+  <li><strong>Порядок зображень за замовчуванням</strong>: ви можете визначити персональне замовлення з цими випадаючим меню.</li>
+
+</ul>
+
+<h3>Історія</h3>
+
+  <p>Відвідувань на сторінках <span
+  class="pwgScreen">category.php</span> та <span
+  class="pwgScreen">picture.php</span> будуть збережені в таблиці <code>history</code>.</p>
+  
+  <p>Відвідування буде показано в <span  class="pwgScreen">Адміністрування &raquo; Інструменти &raquo; Історія</span>.</p>
+
+<ul>
+  <li><strong>Зберегти сторінки відвідувані гостями</strong>: відвідувані сторінки гостями будуть записані.</li>
+
+  <li><strong>Зберегти сторінки відвідувані користувачами</strong>: відвідування користувачів буде записано.</li>
+
+  <li><strong>Зберегти сторінки відвідувані адміністраторами</strong>: сторінки відвідувані адміністраторами буде записано.</li>
+
+</ul>
+
+<h3>Коментарі</h3>
+<ul>
+
+  <li><strong>Коментарі для всіх</strong>: Навіть незареєстровані гості можуть отримати можливість надсилати коментарі.</li>
+
+  <li><strong>Кількість коментарів на сторінці</strong>.</li>
+
+  <li><strong>Перевірка</strong>: адміністратор повинен перевірити коментарі користувачів, перш ніж вони стають видні на сайті. Перевірка коментарів користувача
+ відбувається на екрані <span class="pwgScreen">Адміністрування &raquo; Інструменти &raquo; Коментарі в очікуванні</span>.</li>
+
+  <li><strong>Емейл лист адміністраторам, коли вводяться дійсні коментарі</strong>: Відправлення електронною поштою адміністратору, коли користувач вводить свій коментар і цей коментар перевіряється.</li>
+
+  <li><strong>Емейл лист адміністраторам, коли коментар вимагає перевірки</strong>:
+Відправлення електронною поштою листа адміністратору, коли користувач вводить коментар, який вимагає перевірки адміністратором.
+Перевірка коментарів користувачів відбувається на екрані <span class="pwgScreen">Адміністрування &raquo; Інструменти &raquo; Коментарі в очікуванні</span>.</li>
+
+</ul>
+
+<h3>Відображення за замовчуванням</h3>
+
+<p>Тут ви можете змінити параметри відображення, які використовуються гостем, користувачем за промовчанням. Після підключення, ці параметри змінюються на власні параметри користувача
+(змінювані в <span class="pwgScreen">профілю</span>).</p>
+
+<p>Можна змінити параметри відображення для всіх існуючих користувачів на <span class="pwgScreen">Адміністрування &raquo;
+Користувачі &raquo; Управління</span> екрані, де ви можете вибрати список користувачів.</p>
+
+<ul>
+
+  <li><strong>Мова</strong>: Застосувати лише до позначки Piwigo. Назви альбомів, імена зображень і описи всіх полів не локалізовані.</li>
+
+  <li><strong>Кількість зображень в рядку</strong></li>
+
+  <li><strong>Кількість рядків на сторінці</strong></li>
+
+  <li><strong>Теми інтерфейсу</strong></li>
+
+  <li><strong>Недавній період</strong>: Вдень. Період, впродовж якого зображення показується як нове. Має бути більшим, ніж 1 день.</li>
+
+  <li><strong>Розгорнути всі альбоми</strong>: Розгортання всіх альбомів
+в меню <em>Попередження</em>: цей параметр є ресурсомістким і може генерувати величезні меню, якщо ваше дерево альбом містить багато альбомів.</li>
+
+  <li><strong>Показати кількість коментарів</strong>: Показати кількість коментарів для кожного зображення на сторінці мініатюр. Ресурсомісткий.</li>
+
+  <li><strong>Показати кількість показів</strong>: Відображення показів спостерігається на зображенні під його мініатюрою на сторінці мініатюр. Тільки тоді, коли додатковий параметр конфігурації: <br>
+  $conf['show_nb_hits'] = true; <br>
+  Примітка: false за замовчуванням.</li>
+
+  <li><strong>Максимальна ширина зображення</strong>: максимальна ширина відображення.  Зображення більше, ніж цей параметр буде змінено на показі.  Замість того, щоб вибрати цей параметр, ви можете розглянути можливість зміни ширини зображення; Це було б кращою практикою.</li>
+
+  <li><strong>Максимальна висота зображення</strong>: Те ж саме що стосується налаштування максимальної ширини.</li>
+
+</ul>
Index: tags/2.4.0RC3/language/uk_UA/help/extend_for_templates.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/extend_for_templates.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/extend_for_templates.html	(revision 14585)
@@ -0,0 +1,51 @@
+<h2>Розширення конфігурації шаблону</h2>
+
+<h3>Про</h3>
+<p>Piwigo галерея може бути налаштована шляхом заміни існуючих файлів шаблону з індивідуальних версій.  Наприклад, за замовчуванням заголовок шаблон (header.tpl) можна замінити шаблон індивідуальний заголовок (my-header.tpl).  Після подання зміни до бази даних галерея буде відображати індивідуальний заголовку замість вихідного заголовка.<br>
+Шаблон розширень ефективний спосіб створювати власні теми для нових, так і старих користувачів. Використовується разом з редактором LocalFiles ви можете створювати свої власні під-теми.</p>
+
+<h3>Оригінальний шаблон</h3>
+<p>Тема містить безліч файлів шаблонів, які складають галерею сторінок. Це оригінальні шаблони.</p>
+
+<h3>Необов'язкові ключові слова URL</h3>
+<p>Це слова, знайдені в галереї URL після ім'я модуля.  Вони також можуть бути активними постійна (див. документацію постійне посилання для отримання додаткової інформації).  <a href="#warnings">ПОПЕРЕДЖЕННЯ:</a> якщо той же оригінальний шаблон і таке ж ключове слово використаний більш ніж на одному налагодженому шаблоні тільки один є активним.</p>
+
+<h3>Зв'яжіть тему</h3>
+<p>Пов'язаних темою є тема, з якої файли шаблонів замінюються.</p>
+
+<h3>Де знаходяться оригінальні шаблони?</h3>
+<p>Оригінальні шаблони файлів шаблонів поставляється з кожною темою окремо.  Вони зберігаються в <em>/themes/default/template</em> (або <em>themes/<theme name>/template</em>).  Ці файли шаблонів не повинні бути змінені на місці, оскільки зміни будуть втрачені з оновленням теми.<br>
+Підтримка оригінальних шаблонів включають:</p>
+<ul>
+  <li><span class="filename">index.tpl</span></li>
+  <li><span class="filename">mainpage_categories.tpl</span> and/or <span class="filename">thumbnails.tpl</span></li>
+  <li><span class="filename">menubar.tpl</span></li>
+  <li><span class="filename">header.tpl</span> and/or <span class="filename">footer.tpl</span></li>
+  <li><span class="filename">picture_content.tpl</span> and/or <span class="filename">picture.tpl</span></li>
+  <!-- <li><span class="filename">slideshow.tpl</span></li> -->
+  <li><span class="filename">profile.tpl</span> and/or <span class="filename">profile_content.tpl</span></li>
+  <li><span class="filename">tags.tpl</span></li>
+  <li><span class="filename">upload.tpl</span></li>
+  <li><span class="filename">about.tpl</span></li>
+  <li><span class="filename">popuphelp.tpl</span></li>
+  <li><span class="filename">search.tpl</span> and/or <span class="filename">search_rules.tpl</span></li>
+  <li><span class="filename">nbm.tpl</span> and/or <span class="filename">notification.tpl</span></li>
+  <li><span class="filename">identification.tpl</span> and/or <span class="filename">register.tpl</span></li>
+  <li><span class="filename">redirect.tpl</span></li>
+</ul>
+<h3>Збереження індивідуальних шаблонів</h3>
+<p>Індивідуальний шаблони має бути збережено в шаблоні розширення папки та вкладені папки.  Наприклад, <em>/template-extension/my-default/header.tpl</em> (або <em>/template-extension/<my-theme-name>/header.tpl</em>)  Шаблон-файли можуть мати будь-яке ім'я з розширення .tpl.  Файли шаблонів у підпапки з'являтися у вікні конфігурації шаблону та доступні як користувацькі шаблони.</p>
+<h3>Активація індивідуальних шаблонів</h3>
+<p>Виберіть вихідний шаблон для заміни.  Можна також вибрати ключові слова URL, щоб переконатися, що індивідуальний шаблон тільки показано на сторінках за цим ключовим словом.  Виберіть приєднані теми та зміни будуть ефективні на цій темі.  Внести зміни до бази даних.</p>
+<h3>Деактивація індивідуальних шаблонів</h3>
+<p>Скасувати вибір вихідного шаблона і відправити зміни в базу даних.<br>
+Видалити файли індивідуального шаблону з папки шаблонів розширення.</p>
+
+<a name="warnings"></a>
+<h3>Попередження</h3>
+<ul>
+  <li><strong>Оригінальний шаблон</strong> повинен бути вихідний шаблон в іншому випадку у вас можуть бути непередбачувані результати.</li>
+  <li>Якщо ж вихідний шаблон та те ж саме URL ключове слово використовується більше одного індивідуального шаблону тільки останній є активний.</li>
+  <li>Розподілені файли прикладів шаблонів для тестування тільки.  Не редагуйте їх.  Створіть свої власні, або скопіюйте існуючу тему шаблонів файлів в <em>/template-extension/<my-theme>/</em></li>
+  <li>Коли індивідуальний шаблон видалено вихідний файл шаблону буде негайно відновлений.</li>
+</ul>
Index: tags/2.4.0RC3/language/uk_UA/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Список груп</h2>
+
+<p>Це місце, де можна керувати групами.</p>
+
+<h3>Додати групу</h3>
+
+<p>Адміністратор може додавати групи.</p>
+
+<h3>Список груп</h3>
+
+<p>Для кожної групи можуть бути застосовані такі дії:</p>
+
+
+<ul>
+  <li>перейти до управління користувачами (Адміністрування&raquo;Користувачі&raquo;Керувати)</li>
+  <li>перейти на дозвіл екрана управління для дозволу або заборони доступу до приватних альбомів.</li>
+  <li>видалити групу (потрібно підтвердження)</li>
+  <li>перемикання статусу "за умовчанням" (вимагає підтвердження)</li>
+</ul>
+
+<h3>Стандартні групи</h3>
+<p>Групи за замовчуванням групи, які будуть автоматично пов'язані з кожним новим користувачем при реєстрації або створенні адміністратором.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,27 @@
+<p>Кілька способів додавання зображень в галерею:</p>
+
+<ul>
+  <li><strong>Пряме завантаження</strong> усередині вашого браузера є
+найпростішим і найбезпосереднішим способом. Це залежить від ваших здібностей браузеру
+і вашого веб-серверу. Для величезної кількості зображень або у разі, якщо ви стикаєтеся з деякою проблемою,
+інші методи, тільки й чекають вас!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Перейти до прямого завантаження </a></p>
+
+<ul>
+  <li><strong>pLoader</strong> це програма, яка буде встановлена ​​на вашому комп'ютері. Перетягніть зображення в вікно pLoader, натисніть <em>"Завантажити до Piwigo"</em> і нехай pLoader робить свою роботу. Ви можете знайти інші настільні додатки, такі як <strong>WinToPiwigo</strong> або експортувати плаґін <strong>Digikam</strong> для Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Перейти до pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>Передача FTP</strong> Це найбільш рекомендований спосіб додати
+дуже велику колекцію зображень з мінімальною кількістю кліків. Ознайомтесь з
+Посібник для підготовки зображення. FTP метод дозволяє точно контролювати
+фізичну організацію зображень на вашому сервері.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Перейти до FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/uk_UA/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/help_groups.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p>Групи є зручним способом встановити дозволи для списку користувачів.</p>
+
+<p>Створення груп в <span class="pwgScreen">Адміністрування &raquo; Користувачі
+&raquo; Групи</span> і пов'язати користувачів до цієї групи
+в <span class="pwgScreen">Адміністрування &raquo; Користувачі
+&raquo; Керувати</span>.</p>
+
+<p>Користувач може належати до декількох груп. Авторизація має пріоритет над
+забороною: якщо користувач "Іван" відноситься до груп "сім'я" і "друзі", і
+що тільки група "сім'я" може бачити альбом "Різдво 2012", то альбом
+"Різдво 2012" "Іван" зможе побачити.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/help_misc.html	(revision 14585)
@@ -0,0 +1,9 @@
+<p>Після того як ви створили свою галерею, ви можете налаштувати її для ваших відвідувачів
+<ul>
+	<li>Відображення за замовчуванням, як вам подобається в <span class="pwgScreen">Адміністрування &raquo; Конфігурація &raquo; Інструменти</span> вкладка <span class="pwgScreen">Налаштування гостя</span></li>
+	<li>Тема за замовчуванням у <span class="pwgScreen">Адміністрування &raquo; Конфігурація &raquo; Теми</span></li>
+	<li>Мова за замовчуванням у <span class="pwgScreen">Адміністрування &raquo; Конфігурація &raquo; Мови</span></li>
+ </ul>
+ За замовчуванням кожен новий користувач буде наслідувати ці властивості при реєстрації.
+</p>
+<p>Якщо у Вас виникли питання, співтовариство Piwigo будуть раді допомогти Вам на <a href="http://piwigo.org/forum">форумі</a>.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,58 @@
+<fieldset>
+<legend>Дозволи на зображення</legend>
+
+<p>Кожне зображення має <strong>рівень конфіденційності</strong> (блокування). Кожен користувач також має рівень конфіденційності (ключ). 
+Є 5 рівнів конфіденційності:</p>
+<ol>
+  <li>Ніхто</li>
+  <li><em>Контакти</em></li>
+  <li><em>Друзі (який вище, ніж контакти)</em></li>
+  <li><em>Сім'я (який вище, ніж друзі)</em></li>
+  <li><em>Адміни (який вище, ніж будь-який інший рівень)</em></li>
+</ol>
+
+<p>Вищі рівні мають дозволи на нижчих рівнях. Для даного користувача, чим вище рівень конфіденційності, то більше зображень він може бачити.</p>
+
+<p>Наприклад, якщо зображення "peter_wedding-0024.jpg" має рівень конфіденційності <em>"Сім'я"</em>, тоді:</p>
+<ul>
+  <li>Peter (якщо рівень конфіденційності <em>"Адміни"</em>) бачитиме зображення, тому що <em>"Адміни"</em> можуть бачити всі зображення</li>
+  <li>Beth (якщо рівень конфіденційності <em>"Сім'я"</em>) також бачитиме зображення</li>
+  <li>Mary (якщо рівень конфіденційності <em>"Друзі"</em>) не бачитиме зображення</li>
+</ul>
+
+<p>Користувач, який не має ніякого дозволу бачити вміст альбому, не бачитиме альбом безпосередньо, навіть його заголовок. Той же принцип звертається до теґ.</p>
+
+<p>Ви можете встановити рівень конфіденційності користувача на <span class="pwgScreen">Адміністрування &raquo; Користувачі &raquo; Керувати</span>.</p>
+
+</fieldset>
+
+<fieldset>
+<legend>Дозволи на альбоми</legend>
+
+<p>Якщо рівні конфіденційності не відповідає вашим потребам, можна також керувати дозволами на альбоми для користувача або групи. Ви можете керувати дозволами на зображення та альбоми в той же час, без конфліктів.</p>
+
+<p>Ви можете заборонити доступ до альбомів. Перемкніть тип посилання альбому
+"приватний", якщо ви хочете управляти дозволами.</p>
+
+<p>Ви можете встановити альбом приватним шляхом редагування одного альбому
+(<span class="pwgScreen">Адміністрування &raquo; Альбоми &raquo; Керувати
+&raquo; редагувати</span>) або налаштування параметрів вашого дерева альбому
+(<span class="pwgScreen">Адміністрування &raquo; Альбоми &raquo;
+ Властивості &raquo; Публічно / Конфіденційно</span>).</p>
+
+<p>Після того, як альбом є приватним, ви можете керувати дозволами для груп та
+користувачів з 3 екранів:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">Адміністрування &raquo; Користувачі &raquo; Керувати &raquo;
+  permissions action</span> (one link per user)</li>
+
+  <li><span class="pwgScreen">Адміністрування &raquo; Користувачі &raquo; Групи &raquo;
+  permissions action</span> (one link per group)</li>
+
+  <li><span class="pwgScreen">Адміністрування &raquo; Альбоми &raquo; Керувати &raquo; редагувати
+  </span> дії дозволів альбому(одне посилання на альбом)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/uk_UA/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,11 @@
+<p>Зображення показуються в альбомі, що відповідає їх файлу
+директорій.</p>
+
+<p>Ви можете також показати зображення в декількох альбомах, без дублювання
+файл на вашому веб-сервері. Асоціюйте зображення до будь-якого альбому у
+екрані редагування зображень(будь-який адміністратора, може дістатисяз сторінки з зображенням на сторінку галереї).</p>
+
+<p>Віртуальні альбоми на основі цієї концепції: вони не мають відповідного
+каталогу. Створення віртуальних альбомів
+у <span class="pwgScreen">Адміністрування &raquo; Альбоми &raquo;
+Керувати</span>.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/history.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/history.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/history.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>Історія</h2>
+
+<p>На цих екранах, ви можете контролювати вашу галерею історії відвідування відповідно до параметрів, які ви вибрали в: Адміністрування &raquo; Конфігурація &raquo; Опції &raquo; Історія</p>
+	
+<h3>Статистика</h3>
+<ul>
+  <p>Якщо ви вибрали для запису відвіданих сторінок (<span class="pwgScreen">index.php</span> та <span class="pwgScreen">picture.php</span>), Ви можете слідкувати за ними з цієї вкладки.</p>
+	<li><strong>Глобальна статистика</strong>: відвідувань на рік. </li>
+	<li><strong>Щорічна статистика</strong>: відвідує за місяць у відібраному році.</li>
+	<li><strong>Щомісячна статистика</strong>: відвідувань на дні вибраного місяця.</li>
+	<li><strong>Щоденна статистика</strong>: відвідувань на годину в обраний день.</li>
+</ul>
+
+<h3>Пошук</h3>
+<ul>
+  <p>Якщо ви вибрали для запису відвідані сторінки (<span class="pwgScreen">index.php</span> and <span class="pwgScreen">picture.php</span>), Ви можете переглянути відомості на цій вкладці за допомогою різних фільтрів.</p>
+	<li><strong>Фільтр за датою:</strong> Виберіть діапазон дат для пошуку по установці дати початку і закінчення.</li>
+	<li><strong>Фільтр за типом елемента:</strong> виберіть вид елементу для статистики по цьому елементу.</li>
+	<li><strong>Фільтр за користувачем:</strong> виберіть користувача для статистики по цьому користувачеві.</li>
+	<li><strong>Фільтр за індефікатором зображення:</strong> виберіть ідентифікатор зображення для статистики по цьому зображенню.</li>
+	<li><strong>Фільтр за ім'я файлу:</strong> виберіть ім'я файлу для статистики по цьому файлу..</li>
+</ul>
Index: tags/2.4.0RC3/language/uk_UA/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Повідомлення поштою (ПП)</h2>
+
+<p>Налагодження та управління електронною поштою користувачів, повідомлення їх про зміни на вашому сайті.</p>
+
+<p>Цей екран складається з трьох вкладок:</p>
+
+<h3>Налаштування</h3>
+<p>Доступно тільки для веб-майстрів, на цій вкладці задаєються параметри повідомлення поштою.</p>
+
+<h3>Підписатися</h3>
+<p>Доступно тільки для веб-майстра, ця вкладка управляє підписками користувачів на повідомлення по електронній пошті. Додати користувача можна у вікні підписалися на їх отримання повідомлень електронною поштою.</p>
+
+<h3>Надіслати</h3>
+<p>Доступно тільки для веб-майстрів та адміністраторів, ця вкладка дозволяє адміністраторам відправляти електронні повідомлення користувачам, що підписалися.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,70 @@
+<fieldset>
+  <legend>Швидкий старт</legend>
+
+<ol>
+  <li>Створіть директорію на вашому комп'ютері.</li>  
+
+  <li>Скопіюйте кілька зображень всередину цієї директорії, змініть їх розмір для веб-дисплея. <em>Попередження</em>: ім'я директорії і файлів повинне містити тільки листи, фігури, "-", "_" or ".". Без пробілів і акцентованих символів.</li>
+
+  <li>З клієнтом FTP, копіюйте ваші директорії в директорії "Галереї" вашої Piwigo.</li>
+
+  <li>Увійдіть до своєї галереї та перейдіть до <span class="pwgScreen">Адміністрування</span> і натисніть на велику кнопку синхронізації.</li>
+</ol>
+
+<p>Вітаємо! Ви успішно створили перший альбом галереї.</p>
+</fieldset>
+
+<fieldset>
+  <legend>Організація директорій і файлів</legend>
+
+<ul>
+
+  <li>
+
+    <p>Директорії альбому знаходяться в директорії Piwigo
+"galleries". Тут слідує дерево каталогів дуже маленької галереї(але
+користується багатьма особливостями):</p>
+
+    <pre>
+galleries
+|-- wedding
+|   |-- celebration
+|   |   |-- arrival
+|   |   |   |-- paul-alone.jpg
+|   |   |   +-- sarah-alone.jpg
+|   |   +-- departure
+|   |       +-- paul-and-sarah.jpg
+|   +-- party
+|       |-- dancers001.jpg
+|       |-- dancers002.jpg
+|       +-- dancers003.jpg
++-- honeymoon
+    |-- hotel.png
+    |-- video-from-plane.avi
+    +-- pwg_representative
+        +-- video-from-plane.jpg
+</pre>
+
+  </li>
+
+  <li>За винятком "pwg_representative" (див. пояснення нижче), в кожній директорії в розділі "galleries" виступає як альбом. Немає ніяких обмежень на глибину директорій.</li>
+
+  <li>В основному, файл представлений елементом. Файл може бути на
+Piwigo елементом, якщо його розширення, серед <code>file_ext</code>
+  можливостей параметра конфігурації (див. файл <span
+  class="filename">include/config_default.inc.php</span>). Файл може
+бути зображенням, якщо його розширення серед <code>picture_ext</code>
+  можливостей параметра конфігурації.</li>
+
+  <li>Немає елементів зображень (відео, звук, файл текстів, все, що ви хочете...) представлених за замовчуванням значок відповідає імені файлу
+розширення. За бажанням, можна пов'язати мініатюру і представника
+файлу (див. video.avi у наведеному вище прикладі).</li>
+
+  <li><em>Попередження</em>: ім'я директорії і файлів повинне містити тільки листи, фігури, "-", "_" or ".". Без пробілів і акцентованих символів.</li>
+
+  <li>Як тільки фотографії правильно розташовані в
+директорії, перейдіть: <span class="pwgScreen">Адміністрування &raquo; Інструменти &raquo;
+  Синхронізація</span></li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/uk_UA/help/search.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/search.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Пошук</h2>
+
+<p>Ця сторінка дозволяє шукати зображення зі всієї галереї.</p>
+
+<dl>
+
+  <dt>Пошук слів</dt>
+  <dd>Пошук одного або декількох слів, серед атрибутів, пов'язаних з зображенням
+в галереї. Використовуйте * в якості шаблону для часткового співпадіння.</dd>
+
+  <dt>Пошук за автором</dt>
+  <dd>Використовуйте * в якості шаблону для часткового співпадіння.</dd>
+
+  <dt>Пошук за датою</dt>
+  <dd>Виберіть дату та/або Кінцеву дату для вашого запиту. Залиште порожнім поле "Дата"
+Якщо ви хочете зробити запит "до". Рік в останньому полі слід ввести у форматі : AAAA (тобто 2004)</dd>
+
+  <dt>Пошук за альбомами</dt>
+  <dd>Виберіть альбом або альбоми, які Ви хочете знайти. Всі
+вкладені альбоми можуть бути знайдені за вибором батьківських альбомів і налаштування дозволяють
+шукати по під-альбомами нижче.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/uk_UA/help/site_manager.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/site_manager.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/site_manager.html	(revision 14585)
@@ -0,0 +1,17 @@
+<h2>Віддалені сайти</h2>
+
+<p>Piwigo дає можливість використовувати декілька серверів для зберігання зображень, які наповнять вашу галерею. Це може бути корисно, якщо ваша галерея встановлена ​​на серверах з обмеженим простором і у вас є величезна кількість зображень для відображення.</p>
+
+<ol>
+  <li>Змінити файл <span class="filename">tools/create_listing_file_local.inc.php</span>, шляхом зміни параметрів розділу, таких як <code>$conf['prefix_thumbnail']</code> or <code>$conf['use_exif']</code>.</li>
+  <li>Використовуючи FTP розмістити файли <span class="filename">tools/create_listing_file.php</span> і <span class="filename">tools/create_listing_file_local.inc.php</span> (модифіковано) на вашому видаленому вебсайті, в тій же теці як ваші теки альбомів (альбому як директорій <span class="filename">галереї</span> на цьому сайті). Наприклад, давайте припустимо, що ви можете отримати доступ <span class="filename">http://example.com/galleries/create_listing_file.php</span>.</li>
+  <li>Перехід до Адміністрування &raquo; Інструменти &raquo; Менеджер сайту. Створення нового сайту, наприклад <span class="filename">http://example.com/galleries</span>.</li>
+  <li>Новий віддалений сайт зареєстрований. Ви можете виконати 4 дії:
+    <ol>
+      <li><strong>Створити список:</strong> запускає віддалений запит для отримання віддаленого списку файлів</li>
+      <li><strong>Синхронізувати:</strong> читає віддалений <span class="filename">listing.xml</span> файл і синхронізується з базою даних</li>
+      <li><strong>Очистити:</strong>видаляє віддаленій <span class="filename">listing.xml</span> файл</li>
+      <li><strong>Видалити:</strong> видалення сайту (і всі пов'язані з альбомів і зображення) у базі даних</li>
+    </ol>
+  </li>
+</ol>
Index: tags/2.4.0RC3/language/uk_UA/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/synchronize.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>Синхронізація</h2>
+
+<p>Є два різних типи синхронізації:</p>
+<ul>
+	<li>тек/файлів</li>
+	<li>файл метаданих</li>
+</ul>
+
+<p>Синхронізація тек і файлів щодо оновлення тек дерева з альбомом дерева в базі даних.
+Синхронізація файлів метаданих щодо оновлення інформації про знімок, такі, як розмір файла, розмір в пікселях, EXIF і IPTC інформації в базі даних.</p>
+
+<p>При синхронізації з завантаженням в вашу галерею, ви повинні спочатку синхронізувати каталоги і файли.</p>
+
+<p>Процес синхронізації може зайняти тривалий час (в залежності від навантаження на сервер і кількість елементів управління), так що можна це зробити альбом за альбомом.</p>
Index: tags/2.4.0RC3/language/uk_UA/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Створення мініатюр</h2>
+
+<p>Ця сторінка дозволить вам створити відсутній мініатюр. Рекомендується не використовувати цю функцію, якщо ваша галерея розташована на загальному сервері. Щоб відновити ескізи використовувати пакетний менеджер.</p>
+
+<dl>
+
+  <dt>GD версія</dt>
+
+  <dd>GD це бібліотека обробки зображень для PHP. Виберіть версію встановленої на вашому сервері: Ви будете попереджені про помилку, просто поверніться на попередню сторінку з вашого браузера і виберіть інший варіант. Якщо жодна з версій працює, то ваш сервер не підтримує GD. PHP повинні бути скомпільовані з функціями GD Бібліотека зображень для цієї роботи.</dd>
+
+  <dt>Ширина і висота</dt>
+
+  <dd>Максимальний розмір мініатюри. Оригінальна співвідношення сторін зберігається. Значення за замовчуванням можна змінити за допомогою параметрів конфігурації<code>tn_width</code> та <code>tn_height</code> (see <span class="filename">include/config_default.inc.php</span> file).</dd>
+
+  <dt>Кількість мініатюр на створення</dt>
+
+  <dd>Не намагайтеся обробляти занадто багато фотографій одночасно. В процесі створення мініатюр використовувати багато ресурсів процесора. Якщо Ваша галерея Piwigo розміщується безкоштовно хостингу, занадто високе навантаження на процесор може привести до вимкнення вашого сайту.</dd>
+
+  <dt>Формат файлів</dt>
+
+  <dd>Мініатюри створюються у форматі JPEG. Вони можуть бути створені тільки з PNG та JPEG фотографій.</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/uk_UA/help/user_list.html
===================================================================
--- tags/2.4.0RC3/language/uk_UA/help/user_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/help/user_list.html	(revision 14585)
@@ -0,0 +1,23 @@
+<h2>Список користувачів</h2>
+
+<p>Тут ви можете керувати користувачами вашої галереї Piwigo.</p>
+
+<h3>Додати нового користувача</h3>
+
+<p>Адміністратор може додавати користувачів вручну. Для кожного користувача необхідно вказати лоґін, пароль та дійсну адресу електронної пошти.</p>
+
+<h3>Список користувачів</h3>
+
+<p>Перелік існуючих користувачів можуть бути відфільтровані по імені користувача (використовуйте * як шаблон), групі або статусу. Їх можна розсортувати по даті реєстрації або ім'я користувача, в порядку зростання або спадання.</p>
+
+<p>Цей екран дозволяє керувати декількома користувачами одночасно, використовуючи різні дії:</p>
+
+<ul>
+  <li>видаляти користувачів (необхідне підтвердження)</li>
+  <li>змінити статус користувача</li>
+  <li>приєднати або від'єднати від групи</li>
+  <li>змінювати властивості відображення</li>
+  <li>змінювати додаткові дозволи</li>
+</ul>
+
+<p>Ціль обраного користувача (за замовчуванням) або всіх користувачів, яких показано в відфільтрованому списоку.</p>
Index: tags/2.4.0RC3/language/uk_UA/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/uk_UA/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/install.lang.php	(revision 14585)
@@ -0,0 +1,72 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['Admin configuration'] = 'Конфігурація адміністратора';
+$lang['also given by your host provider'] = 'також дізнайтесь у Вашого хостинг-провайдера';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Альтернативним рішенням є копіювання тексту в поле вище і вставте його в файл "local/config/database.inc.php" (Попередження: database.inc.php повинен містити тільки те, що в текстовому полі, без зворотної лінії або пропусків)';
+$lang['Basic configuration'] = 'Базова конфігурація';
+$lang['Can\'t connect to server'] = 'Не вдається підключитися до сервера';
+$lang['Congratulations, Piwigo installation is completed'] = 'Вітаємо, Piwigo завершив встановлення';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'З\'єднання з сервером успішно, але з\'єднання з базою даних неможлива';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Створення файлу конфігурації local/config/database.inc.php не вдалося.';
+$lang['Database configuration'] = 'Конфігурація бази даних';
+$lang['Database name'] = 'Ім\'я бази даних';
+$lang['Database table prefix'] = 'Префікс таблиць бази даних';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'таблиці бази даних імена, яких будуть починатися з префіксами (дозволяє управляти таблицями краще)';
+$lang['Default gallery language'] = 'Типова мова галереї';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Не соромтеся проконсультуватися на форумі першим з будь-яким питанням: %s';
+$lang['Download the config file'] = 'Завантажити файл конфігурації';
+$lang['enter a login for webmaster'] = 'введіть лоґін веб-майстра';
+$lang['Hope to see you back soon.'] = 'Сподіваюся побачити вас найближчим часом.';
+$lang['Host'] = 'Хост';
+$lang['Installation'] = 'Встановлення';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Схоже, ваш хостинг в даний час працює з PHP %s.';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Він буде показаний відвідувачам. Це необхідно для адміністрації сайту';
+$lang['Just another Piwigo gallery'] = 'Ще одна галерея Piwigo';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Тримайте його конфіденційність, він дозволяє отримати доступ до адміністративної панелі';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.hosting.com.ua, toto.1gb.ua';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'пошта повинна бути xxx@yyy.eee (наприклад: animan@pixobox.org)';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Потрібна допомога? Задайте питання на <a href="%s">Дошці оголошень Piwigo </a>.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Зверніть увагу, ви можете змінити свою конфігурацію і перезавантажити собі Piwigo після цього.';
+$lang['Password'] = 'Пароль';
+$lang['Password [confirm]'] = 'Пароль [підтвердження]';
+$lang['PHP 5 is required'] = 'Потрібен PHP 5';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo можуть спробувати перемкнути конфігурацію PHP 5 шляхом створення або зміни .htaccess файлу.';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo не зміг налаштувати PHP 5.';
+$lang['please enter your password again'] = 'введіть пароль ще раз';
+$lang['Sorry!'] = 'Вибачте!';
+$lang['Start Install'] = 'Початок встановлення';
+$lang['Try to configure PHP 5'] = 'Спробуйте налаштувати PHP 5';
+$lang['user login given by your host provider'] = 'лоґін користувача дізнайтесь у вашого хостинг-провайдера';
+$lang['user password given by your host provider'] = 'лоґін користувача дізнайтесь у Вашого хостинг-провайдера';
+$lang['verification'] = 'перевірка';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Відвідувачі зможуть використовувати цю пошту, щоб зв\'язатися з адміністратором сайту';
+$lang['Webmaster login'] = 'Лоґін веб-майстра';
+$lang['webmaster login can\'t contain characters \' or "'] = 'лоґін веб-майстера не може містити символів \' або "';
+$lang['Webmaster mail address'] = 'Адреса електронної пошти веб-майстра';
+$lang['Webmaster password'] = 'Пароль веб-майстра';
+$lang['Welcome to my photo gallery'] = 'Ласкаво просимо в фотогалерею';
+$lang['Welcome to your new installation of Piwigo!'] = 'Ласкаво просимо у ваш новий встановлений Piwigo!';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Ви можете завантажити конфігураційний файл і завантажити його до local/config каталогу встановлення.';
+$lang['You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'] = 'Ви повинні звернутися в службу підтримки вашого хостинг-провайдера і подивитися, як ви можете переключитися на PHP 5 самостійно.';
+$lang['User'] = 'Користувач';
+?>
Index: tags/2.4.0RC3/language/uk_UA/iso.txt
===================================================================
--- tags/2.4.0RC3/language/uk_UA/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Українська [UA]
Index: tags/2.4.0RC3/language/uk_UA/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/uk_UA/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/uk_UA/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,40 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['All sub-albums of private albums become private'] = 'Всі вкладені альбоми приватних альбомів стали приватними';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'В якості запобіжного заходу, наступні плаґіни були відключені. Ви повинні перевіряти оновлення плагінів до їх відновлення:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'В якості запобіжного заходу, теми вони були відключені. Ви повинні перевірити оновлення перед тим як активуєте їх:';
+$lang['In <i>%s</i>, before <b></b>, insert:'] = 'В <i>%s</i>, до <b></b>, вставити:';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Тільки адміністратор може запустити оновлення: увійдіть у систему нижче.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Тільки префікс мініатюр та адресу електронної пошти веб-майстра збережено збережено від попередньої конфігурації';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Їх виконає автоматична перевірка в [Адміністрування> Сервіс> Обслуговування], якщо у вас виникнуть якісь проблеми.';
+$lang['SQL queries'] = 'SQL запитів';
+$lang['Statistics'] = 'Статистика';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Ця сторінка пропонує оновлення базу даних, що оновлює вашу стару версію Piwigo до поточної версії. Помічник оновлення думає, що ви в даний час працюєте з <strong>релізом %s</strong>(або подібним).';
+$lang['total SQL time'] = 'загальний час SQL';
+$lang['total upgrade time'] = 'загальний час оновлення';
+$lang['Upgrade'] = 'Оновлення';
+$lang['Upgrade from version %s to %s'] = 'Оновлення з версії %s на %s';
+$lang['Upgrade informations'] = 'Інформація оновлення';
+$lang['User permissions and group permissions have been erased'] = 'Користувачі та групи дозволів було видалено';
+$lang['You do not have access rights to run upgrade'] = 'У вас немає прав доступу для запуску оновлення';
+?>
Index: tags/2.4.0RC3/language/vi_VN/README.txt
===================================================================
--- tags/2.4.0RC3/language/vi_VN/README.txt	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/README.txt	(revision 14585)
@@ -0,0 +1,6 @@
+Piwigo Vietnamese language files
+author: Tien Ho Quang
+website: http://www.quangtien.net
+e-mail: 
+
+update : 28/01/2010
Index: tags/2.4.0RC3/language/vi_VN/about.html
===================================================================
--- tags/2.4.0RC3/language/vi_VN/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/about.html	(revision 14585)
@@ -0,0 +1,10 @@
+  <li>Piwigo là một ứng dụng web đem đến cho bạn khả năng thiết lập một gallery ảnh trực tuyến một cách dễ dàng.</li>
+
+  <li>Về mặt kỹ thuật, Piwigo hoàn toàn được phát triển bằng ngôn ngữ lập trình PHP với cơ sở dữ liệu MySQL.</li>
+
+  <li>Nếu bạn có ý kiến đóng góp cho phần mềm Piwigo, vui lòng ghé vào web site chính thức của <a
+  href="http://piwigo.org">Piwigo</a> và <a href="http://forum.Piwigo.net">diễn đàn</a> dành riêng cho Piwigo.</li>
+  
+    <li>Việt hoá bởi <a
+  href="http://www.quangtien.net">TienHQ</a>.</li>
+
Index: tags/2.4.0RC3/language/vi_VN/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/vi_VN/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/admin.lang.php	(revision 14585)
@@ -0,0 +1,847 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d kết hợp';
+$lang['%d associations'] = '%d kết hợp';
+$lang['%d album including'] = '%d đề mục bao gồm ';
+$lang['%d albums including'] = '%d đề mục bao gồm ';
+$lang['%d physical'] = '%d physical';
+$lang['%d physical'] = '%d physical';
+$lang[' and %d virtual'] = ' và %d thư mục ảo';
+$lang[' and %d virtual'] = ' và %d thư mục ảo';
+$lang['%d album moved'] = '%d đề mục đã được chuyển';
+$lang['%d albums moved'] = '%d đề mục đã được chuyển';
+$lang['%d group'] = '%d nhóm';
+$lang['%d groups'] = '%d nhóm';
+$lang['%d member'] = '%d thành viên';
+$lang['%d members'] = '%d thành viên';
+$lang['%d tag'] = '%d thẻ';
+$lang['%d tags'] = '%d thẻ';
+$lang['%d user comment rejected'] = '%d lời bình của thành viên dùng đã bị từ chối';
+$lang['%d user comments rejected'] = '%d lời bình của thành viên dùng đã bị từ chối';
+$lang['%d user comment validated'] = '%d lời bình của thành viên dùng đã được xác nhận';
+$lang['%d user comments validated'] = '%d lời bình của thành viên dùng đã được xác nhận';
+$lang['%d user deleted'] = '%d tên thành viên đã được xóa';
+$lang['%d users deleted'] = '%d tên thành viên đã được xóa';
+$lang['%d user'] = '%d thành viên';
+$lang['%d users'] = '%d thành viên';
+$lang['%d waiting for validation'] = 'Có %d hình đang đợi xác nhận';
+$lang['Actions'] = 'Hành động';
+$lang['Activate'] = 'Kích hoạt';
+$lang['Add/delete a permalink'] = 'Thêm/xoá một link cố định';
+$lang['Add a tag'] = 'Thêm một tag';
+$lang['Add a user'] = 'Thêm một thành viên';
+$lang['Add group'] = 'Thêm nhóm';
+$lang['Add'] = 'Thêm';
+$lang['Allow user registration'] = 'Cho phép đăng ký';
+$lang['Apply to sub-albums'] = 'Áp dụng cho các đề mục nhỏ';
+$lang['Associated'] = 'Được kết hợp';
+$lang['Caddie management'] = 'Quản lý Caddie ';
+$lang['Caddie'] = 'Caddie';
+$lang['Albums authorized thanks to group associations'] = 'Đề mục đã được cho phép nhờ vào kết hợp nhóm';
+$lang['Album manual order was saved'] = 'Sắp xếp thủ công đề mục đã được lưu';
+$lang['Check for upgrade failed for unknown reasons.'] = 'Quá trình dò tìm phiên bản nâng cấp bị lỗi, không xác định được nguyên nhân.';
+$lang['Check for upgrade'] = 'Dò tìm phiên bản mới';
+$lang['Comments for all'] = 'Cho mọi đối tượng được phép gởi bình luận';
+$lang['Current name'] = 'Tên hiện tại';
+$lang['Database'] = 'Cơ sở dữ liệu';
+$lang['Deactivate'] = 'Bỏ kích hoạt';
+$lang['Delete Representant'] = 'Xoá mục đại diện';
+$lang['Delete selected tags'] = 'Xoá những tag đã chọn';
+$lang['Delete selected users'] = 'Xoá những thành viên đã chọn';
+$lang['Deletions'] = 'Xoá bỏ';
+$lang['Deny selected groups'] = 'Từ chối nhóm đã chọn';
+$lang['Deny selected users'] = 'Từ chối thành viên đã chọn';
+$lang['Description'] = 'Miêu tả';
+$lang['Display options'] = 'Hiển thị tuỳ chọn';
+$lang['Dissociated'] = 'Không kết hợp';
+$lang['Does not represent'] = 'Không làm đại diện';
+$lang['Edit selected tags'] = 'Biên tập các tag đã chọn';
+$lang['Edit tags'] = 'Biên tập tags';
+$lang['Email admins when a new user registers'] = 'Gởi email cho quản trị khi có một thành viên mới đăng ký';
+$lang['Email admins when a valid comment is entered'] = 'Gởi email cho quản trị khi có một lời bình đã xác nhận được gởi lên gallery.';
+$lang['Email admins when a comment requires validation'] = 'Gởi email cho quản trị khi có một mời bình cần được xác nhận';
+$lang['Environment'] = 'Môi trường';
+$lang['Form'] = 'Form';
+$lang['Gallery title'] = 'Tiêu đề của gallery';
+$lang['Grant selected groups'] = 'Cấp cho các nhóm đã chọn';
+$lang['Grant selected users'] = 'Cấp cho các thành viên đã chọn';
+$lang['Group name'] = 'Tên nhóm';
+$lang['Groups'] = 'Nhóm người dùng';
+$lang['Guests'] = 'Khách';
+$lang['History'] = 'Bản ghi';
+$lang['Informations'] = 'Thông tin';
+$lang['Install'] = 'Cài đặt';
+$lang['Link all album photos to a new album'] = 'Liên kết tất cả các thành phần của đề mục này với một đề mục mới';
+$lang['Link all album photos to some existing albums'] = 'Liên kết tất cả các thành phần của đề mục này với một số đề mục trước';
+$lang['Linked albums'] = 'Đã liên kết các đề mục trên';
+$lang['Lock gallery'] = 'Tạm khoá gallery';
+$lang['Maintenance'] = 'Bảo trì';
+$lang['Edit album permissions'] = 'Quản lý quyền truy xuất của một đề mục';
+$lang['Manage permissions for group "%s"'] = 'Quản lý quyền truy xuất của nhóm "%s"';
+$lang['Manage permissions for user "%s"'] = 'Quản lý quyền truy xuất của thành viên "%s"';
+$lang['Manage tags'] = 'Quản lý tags';
+$lang['Members'] = 'Thành viên';
+$lang['Metadata synchronized from file'] = 'Metadata đã được đồng bộ hoá từ file';
+$lang['Move albums'] = 'Di chuyển đề mục';
+$lang['Move'] = 'Di chuyển';
+$lang['Name'] = 'Tên';
+$lang['New name'] = 'Tên mới';
+$lang['New parent album'] = 'Đề mục ngoài mới';
+$lang['New tag'] = 'Tag mới';
+$lang['Number of comments per page'] = 'Số lời bình trên một trang';
+$lang['Number of rates'] = 'Số lần đánh giá';
+$lang['Number of thumbnails to create'] = 'Số hình thu nhỏ cần tạo ra';
+$lang['Only private albums are listed'] = 'Chỉ những đề mục riêng tư mới được liệt kê';
+$lang['Operating system'] = 'Hệ điều hành';
+$lang['Options'] = 'Tuỳ chọn';
+$lang['Other private albums'] = 'Các đề mục riêng tư khác';
+$lang['Page banner'] = 'Banner của trang';
+$lang['Parent album'] = 'Đề mục ngoài';
+$lang['Path'] = 'Đường dẫn';
+$lang['Permalink'] = 'Liên kết cố định';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = 'Có %s liên kết cố định đã được dùng trước đó bởi đề mục %s. Hãy xoá liên kết cố định này từ bảng ghi trước.';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = 'The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"';
+$lang['Permalink %s is already used by album %s'] = 'Liên kết cố định %s được sử dụng bởi đề mục %s';
+$lang['Permalink history'] = 'Permalink history';
+$lang['Permalinks'] = 'Liên kết cố định';
+$lang['Permission denied'] = 'Sự chấp nhận đã bị từ chối';
+$lang['Permission granted thanks to a group'] = 'Chấp nhận đã được công nhân nhờ vào một nhóm người dùng';
+$lang['Permission granted'] = 'Sự chấp nhận đã được công nhận';
+$lang['Photo informations updated'] = 'Thông tin của hình đã được cập nhật';
+$lang['Plugins'] = 'Plugins';
+$lang['Position'] = 'Vị trí';
+$lang['Preferences'] = 'Tuỳ chỉnh';
+$lang['Properties'] = 'Thuộc tính';
+$lang['Random photo'] = 'Hình ngẫu nhiên';
+$lang['Rate date'] = 'Ngày tháng đánh giá';
+$lang['Rating by guests'] = 'Đánh giá bởi khách';
+$lang['Rating'] = 'Đánh giá';
+$lang['Reject'] = 'Từ chối';
+$lang['Representant'] = 'Hình đại diện';
+$lang['Representation of albums'] = 'Hình đại diện cho các đề mục';
+$lang['Representative'] = 'Đại diện';
+$lang['Represents'] = 'Hình đại diện';
+$lang['Save order'] = 'Lưu vị trí sắp xếp';
+$lang['Save to permalink history'] = 'Lưu vào bảng ghi cố định';
+$lang['Select at least one album'] = 'Chọn ít nhất một đề mục';
+$lang['Select at least one photo'] = 'Chọn ít nhất một hình ảnh';
+$lang['Select at least one user'] = 'Chọn ít nhất một người dùng';
+$lang['Show info'] = 'Hiển thị thông tin';
+$lang['Site manager'] = 'Quản lý site';
+$lang['Status'] = 'Trạng thái';
+$lang['Statistics'] = 'Thống kê';
+$lang['Storage album'] = 'Đề mục lưu trữ';
+$lang['Sum of rates'] = 'Tổng hợp đánh giá';
+$lang['Tag "%s" already exists'] = 'Tag "%s" đã có đó';
+$lang['Tag "%s" was added'] = 'Tag "%s" đã được thêm vào';
+$lang['Tag selection'] = 'Chọn tag';
+$lang['The %d following tags were deleted'] = 'Các tag %d sau đã bị xoá';
+$lang['Unable to check for upgrade.'] = 'Không thể dò tìm bản nâng cấp.';
+$lang['Uninstall'] = 'Tháo bỏ';
+$lang['Use the default photo sort order (defined in the configuration file)']='Sử dụng tính năng sắp xếp vị trí hình ảnh mặc định (được chỉ ra trong file cấu hình)';
+$lang['User comments validation'] = 'Xác nhận lời bình của thành viên';
+$lang['Users'] = 'Thành viên';
+$lang['Validate'] = 'Xác nhận';
+$lang['Validation'] = 'Xác nhận';
+$lang['Version'] = 'Phiên bản';
+$lang['Virtual albums to move'] = 'Đề mục ảo cần di chuyển';
+$lang['Virtual album name'] = 'Tên đề mục ảo';
+$lang['Webmaster cannot be deleted'] = 'Webmaster không thể xoá được';
+$lang['You are running on development sources, no check possible.'] = 'Bạn đang sử dụng mã nguồn dạng phát triển, không thể kiểm tra được.';
+$lang['You cannot delete your account'] = "Bạn không thể tự xoá tài khoản của mình được";
+$lang['You cannot move an album in its own sub album'] = 'Bạn không thể dời một đề mục vào trong đề mục con của chính nó.';
+$lang['You need to confirm deletion'] = 'Bạn cần được xác nhận để xoá';
+$lang['Associate to album'] = 'Kết hợp với đề mục';
+$lang['associate to group'] = 'kết hợp với nhóm người dùng';
+$lang['Authorized'] = 'Được cho phép';
+$lang['Add a virtual album'] = 'Thêm vào một đề mục ảo';
+$lang['Authorize users to add comments on selected albums'] = 'Cho phép người dùng có thể gởi bình luận ở các đề mục được chọn';
+$lang['The name of an album must not be empty'] = 'Tên của đề mục không được để trống';
+$lang['Lock albums'] = 'Những đề mục bị khoá';
+$lang['Private'] = 'Đề mục riêng';
+$lang['Public'] = 'Đề mục chung (công cộng)';
+$lang['Find a new representant by random'] = 'Tìm ngẫu nhiên hình ảnh đại diện mới';
+$lang['Public / Private'] = 'Chung / Riêng tư';
+$lang['Manage authorizations for selected albums'] = 'Quản lý sự cho phép đối với những đề mục được chọn';
+$lang['Virtual album added'] = 'Đề mục ảo đã được thêm vào';
+$lang['Virtual album deleted'] = 'Đề mục ảo đã bị xoá';
+$lang['Access type'] = 'Kiểu truy cập';
+$lang['Information data registered in database'] = 'Dữ liệu thông tin đã thêm vào cơ sở dữ liệu';
+$lang['Default display'] = 'Hiển thị theo mặc định';
+$lang['The gallery URL is not valid.'] = 'Địa chỉ của gallery không tồn tại.';
+$lang['Main'] = 'Mục chính';
+$lang['The number of comments a page must be between 5 and 50 included.'] = 'Số lời bình trên một trang phải từ 5 đến 50.';
+$lang['Configuration'] = 'Cấu hình';
+$lang['confirm'] = 'xác nhận';
+$lang['Date'] = 'Ngày tháng';
+$lang['delete album'] = 'xoá bỏ đề mục';
+$lang['Dissociate from album'] = 'không kết hợp với đề mục';
+$lang['dissociate from group'] = 'Không kết hợp với nhóm người dùng';
+$lang['Album updated successfully'] = 'Thông tin của đề mục đã được cập nhập thành công.';
+$lang['photos per page'] = 'thành phần trên mỗi trang';
+$lang['High definition enabled'] = 'Bật chế độ xem hình lớn';
+$lang['File'] = 'Tệp tin';
+$lang['first photo added on %s'] = 'thành phần đầu tiên đã được thêm vào %s';
+$lang['Forbidden'] = 'Bị cấm';
+$lang['global mode'] = 'chế độ tổng thể';
+$lang['group "%s" added'] = 'nhóm người dùng tên "%s" đã được thêm vào';
+$lang['group "%s" deleted'] = 'nhóm người dùng tên "%s" đã được xoá';
+$lang['group "%s" updated'] = 'nhóm người dùng tên "%s" đã được cập nhật';
+$lang['The name of a group must not contain " or \' or be empty.'] = 'Tên của nhóm người dùng không có ký tự "\' hoặc bỏ trống.';
+$lang['This name is already used by another group.'] = 'Tên nhóm đã được đặt cho nhóm người dùng trước đó.';
+$lang['High definition'] = 'Định dạng cao';
+$lang['jump to album'] = 'nhảy đến đề mục';
+$lang['jump to photo'] = 'nhảy đến hình';
+$lang['leave'] = 'để';
+$lang['Lock'] = 'Khoá';
+$lang['Locked'] = 'Đã khoá';
+$lang['manage album photos'] = 'quản lý các thành phần đề mục';
+$lang['manage sub-albums'] = 'quản lý các đề mục con';
+$lang['Manage'] = 'Quản lý';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = 'Thời gian xử lý đã hết, quá trình xử lý cần phải được tiếp tục [Trong khoảng: %d giây].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = 'Thời gian xử lý đã hết, quá trình xử lý cần phải được tiếp tục [Trong khoảng: %d giây].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = 'Thời gian chuẩn bị cho danh sách người dùng cần gởi email là có giới hạn. Các thành viên khác không được liệt kê ra.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = 'Thời gian gởi mail là có giới hạn. Các email khác đã được bỏ qua.';
+$lang['To send ?'] = 'Để gởi ?';
+$lang['Last send'] = 'Gởi lần cuối';
+$lang['email'] = 'địa chỉ email';
+$lang['User'] = 'Người dùng';
+$lang['See you soon,'] = 'Hẹn gặp lại bạn,';
+$lang['Go to'] = 'Đi đến ';
+$lang['Hello'] = 'Xin chào ';
+$lang['New photos were added'] = 'Thành phần mới đã được thêm ';
+$lang['on'] = ' vào ';
+$lang['between'] = 'giữa ';
+$lang['and'] = ' và ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = 'Webmaster đã đăng ký bạn nhận thông báo qua email.';
+$lang['You have subscribed to receiving notifications by mail.'] = 'Bạn đã đăng ký nhận thông báo qua email.';
+$lang['To subscribe'] = 'Đăng ký';
+$lang['If you encounter problems or have any question, please send a message to'] = 'Nếu bạn bắt gặp lỗi hoặc cần hỏi điều gì liên quan đến site, vui lòng gởi email liên hệ';
+$lang['[NBM] Problems or questions'] = '[NBM] Lỗi hoặc câu hỏi';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = 'Webmaster đã xoá email của bạn ra khỏi danh sách nhận thông báo qua email.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = 'Bạn đã xoá email của mình ra khỏi danh sách nhận thông báo qua email.';
+$lang[', click on'] = ', click vào ';
+$lang['To unsubscribe'] = 'Không đăng ký';
+$lang['With blank value, gallery title will be used'] = 'Với giá trị nhập vào để trống, thì tiêu đề của gallery sẽ được sử dụng thay thế';
+$lang['Notification'] = 'Thông báo';
+$lang['Error when sending email to %s [%s].'] = 'Có lỗi khi gởi email đến %s [%s].';
+$lang['Mail sent to %s [%s].'] = 'Email đã được gởi tới %s [%s].';
+$lang['%d mail was sent.'] = 'Có %d mail đã được gởi.';
+$lang['%d mails were sent.'] = 'Có %d mails đã được gởi.';
+$lang['%d mail was not sent.'] = 'Có %d mail không gởi được.';
+$lang['%d mails were not sent.'] = 'Có %d mails không gởi được.';
+$lang['No mail to send.'] = 'Không có mail nào được gởi đi.';
+$lang['There is no available subscribers to mail.'] = 'Không có đăng ký nhận email nào.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = 'Người đăng ký có thể được liệt kê ra nếu như chỉ gởi thông báo khi có thành phần mới thêm vào.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = 'Dù sao thì chỉ có webmasters có thể xem được tab này còn đối với quản trị thì không.';
+$lang['No user to send notifications by mail.'] = 'Không có người dùng nào cần gởi email thông báo.';
+$lang['New photos added'] = 'Thành phần mới đã được thêm';
+$lang['Subscribe to notification by mail'] = 'Đăng ký nhận thông báo qua email';
+$lang['Unsubscribe from notification by mail'] = 'Bỏ đăng ký nhận thông báo qua email';
+$lang['Parameter'] = 'Tham số';
+$lang['Continue processing treatment'] = 'Tiếp tục quá trình xử lý';
+$lang['Complementary mail content'] = 'Nội dung email bổ sung';
+$lang['Add detailed content'] = 'Thêm vào nội dung chi tiết';
+$lang['Send mail as'] = 'Gởi mail như';
+$lang['Send mail to users'] = 'Gởi mail đến người dùng';
+$lang['Send'] = 'Gởi';
+$lang['Options'] = 'Tuỳ chọn';
+$lang['Subscribed'] = 'Đăng ký nhận tin';
+$lang['Subscribe'] = 'Đăng ký';
+$lang['Parameters'] = 'Tham số';
+$lang['Select recipients'] = 'Chọn người nhận';
+$lang['Subscribe/unsubscribe users'] = 'Người dùng có đăng ký/bỏ đăng ký';
+$lang['Unsubscribed'] = 'Bỏ đăng ký';
+$lang['%d parameter was updated.'] = 'Có %d tham số đã được cập nhật.';
+$lang['%d parameters were updated.'] = 'Có %d tham số đã được cập nhật.';
+$lang['%d user was not updated.'] = 'Có %d người dùng không được cập nhật.';
+$lang['%d users were not updated.'] = 'Có %d người dùng không được cập nhật.';
+$lang['User %s [%s] was removed from the subscription list.'] = 'Người dùng %s [%s] đã được xoá khỏi danh sách đăng ký nhận tin.';
+$lang['User %s [%s] was added to the subscription list.'] = 'Người dùng %s [%s] đã được thêm vào danh sách đăng ký nhận tin.';
+$lang['%d user was updated.'] = 'Có %d người dùng được cập nhật.';
+$lang['%d users were updated.'] = 'Có %d người dùng được cập nhật.';
+$lang['User %s [%s] was not removed from the subscription list.'] = 'Người dùng %s [%s] đã không xoá khỏi danh sách đăng ký nhận tin.';
+$lang['User %s [%s] was not added to the subscription list.'] = 'Người dùng %s [%s] đã không thêm vào danh sách đăng ký nhận tin.';
+$lang['User %s [%s] added.'] = 'Thành viên %s [%s] đã được thêm.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = 'Cảnh báo: đăng ký hoặc không đăng ký gởi email đến cho các thành viên.';
+$lang['Send mail on HTML format'] = 'Gởi mail với định dạng HTML';
+$lang['Include display of recent photos grouped by dates'] = 'Bao gồm cả việc hiển thị những hình ảnh gần đây được nhóm lại theo ngày tháng.';
+$lang['Available only with HTML format'] = 'Chỉ dùng được với định dạng HTML';
+$lang['no write access'] = 'không được phép ghi';
+$lang['Permissions'] = 'Quyền truy xuất';
+$lang['private'] = 'riêng tư';
+$lang['public'] = 'công cộng';
+$lang['Purge never used notification feeds'] = 'Việc dọn dẹp hệ thống không bao giờ sử dụng các feed thông báo.';
+$lang['Purge sessions'] = 'Phiên dọn dẹp';
+$lang['randomly represented'] = 'đại diện ngẫu nhiên';
+$lang['registration date'] = 'ngày tháng đăng ký';
+$lang['clean'] = 'dọn dẹp';
+$lang['Create this site'] = 'Khởi tạo site này';
+$lang['test'] = 'kiểm tra';
+$lang['test this remote site'] = 'kiểm tra site truy xuất từ xa này';
+$lang['remove tags'] = 'bỏ tags';
+$lang['Repair and optimize database'] = 'Sửa chữa và tối ưu hóa cơ sở dữ liệu';
+$lang['selection'] = 'chọn lựa';
+$lang['set to'] = 'cài đặt thành';
+$lang['singly represented'] = 'đại diện đơn';
+$lang['This site already exists'] = 'Site này đã có trước đó';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = 'Tạo một site mới : (gán địa chỉ của nó vào file create_listing_file.php)';
+$lang['created'] = 'đã được tạo';
+$lang['delete'] = 'xóa bỏ';
+$lang['delete this site and all its attached elements'] = 'xóa site này và tất cả các thành phần đính kèm';
+$lang['deleted'] = 'đã xoa bỏ';
+$lang['an error happened'] = 'có một lỗi xuất hiện';
+$lang['Local'] = 'Cục bộ';
+$lang['Remote'] = 'Từ xa';
+$lang['update the database from files'] = 'cập nhật cơ sở dữ liệu từ file';
+$lang['status'] = 'trạng thái';
+$lang['Directory'] = 'Thư mục';
+$lang['sub-albums'] = 'đề mục con';
+$lang['Synchronize metadata'] = 'đồng bộ hóa metadata';
+$lang['target'] = 'mục tiêu';
+$lang['Thumbnail'] = 'Hình thu nhỏ';
+$lang['title'] = 'Tiêu đề';
+$lang['Album list management'] = 'Quản lý đề mục';
+$lang['Piwigo configuration'] = 'Cấu hình Piwigo';
+$lang['Edit album'] = 'Biên tập một đề mục';
+$lang['Group management'] = 'Quản lý nhóm';
+$lang['User list'] = 'Danh sách thành viên';
+$lang['Edit photo information'] = 'Chỉnh sửa thông tin của hình ảnh';
+$lang['Database synchronization with files'] = 'Đồng bộ hóa cơ sở dữ liệu với tệp tin';
+$lang['all'] = 'tất cả';
+$lang['height must be a number superior to'] = 'chiều cao hình phải là số lớn hơn';
+$lang['width must be a number superior to'] = 'chiều rộng hình phải là số lớn hơn';
+$lang['for the file format'] = 'dành cho định dạng file';
+$lang['Photo unreachable or no support'] = 'Hình không đọc được hoặc định dạng không được hỗ trợ';
+$lang['GD version'] = 'Phiên bản GD';
+$lang['General statistics'] = 'Thống kê tổng quát';
+$lang['average time'] = 'thời gian trung bình';
+$lang['number of miniaturized photos'] = 'số lượng hình ảnh được tối thiểu hóa';
+$lang['total time'] = 'thời gian tổng cộng';
+$lang['for this file format'] = 'dành cho định dạng file này';
+$lang['unit mode'] = 'chế độ đơn vị hình';
+$lang['Unlocked'] = 'Bỏ khóa';
+$lang['unset'] = 'không đặt';
+$lang['Update albums informations'] = 'Cập nhật thông tin của đề mục';
+$lang['Update photos information'] = 'Cập nhật thông tin của hình ảnh';
+$lang['Synchronize'] = 'Đồng bộ hóa';
+$lang['reduce to single existing albums'] = 'rút gọn về đề mục đơn đang tồn tại';
+$lang['Choose an option'] = 'Chọn một tùy chọn';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = 'hiển thi thông tin tối đa (thành phần và đề mục được thêm vào hoặc bị xóa đi)';
+$lang['Error list'] = 'Danh sách lỗi';
+$lang['Errors caption'] = 'Ghi chú lỗi';
+$lang['Detailed informations'] = 'Thông tin chi tiết';
+$lang['File/directory read error'] = 'Lỗi đọc file/thư mục';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = 'Tệp tin hoặc thư mục không truy xuất được (có thê nó không tồn tại hoặc bị từ chối truy cập)';
+$lang['albums deleted in the database'] = 'đã xóa các đề mục trong cơ sở dữ liệu';
+$lang['photos deleted from the database'] = 'đã xóa các thành phần trong cơ sở dữ liệu';
+$lang['photos candidates for metadata synchronization'] = 'hình ảnh được bình chọn cho việc đồng bộ hóa metadata';
+$lang['photos informations synchronized with files metadata'] = 'thông tin những thành phần được đồng bộ hóa với metadata của file';
+$lang['errors during synchronization'] = 'lỗi xuất hiện trong quá trình đồng bộ hóa';
+$lang['albums added in the database'] = 'đề mục được thêm vào cơ sở dữ liệu';
+$lang['photos added in the database'] = 'thành phần được thêm vào cơ sở dữ liệu';
+$lang['photos updated in the database'] = 'thành phần được cập nhật vào cơ sở dữ liệu';
+$lang['Search for new images in the directories'] = 'Tìm kiếm hình mới trong thư mục';
+$lang['added'] = 'đã thêm vào';
+$lang['deleted'] = 'đã xóa';
+$lang['Metadata synchronization results'] = 'Kết quả đồng bộ hóa metadata';
+$lang['only perform a simulation (no change in database will be made)'] = 'chỉ thực hiện công đoạn giả lập (không có sự thay đổi nào đối với cơ sở dữ liệu)';
+$lang['Simulation'] = 'Giả lập';
+$lang['directories + files'] = 'thư mục + tệp tin';
+$lang['only directories'] = 'chỉ áp dụng cho các thư mục';
+$lang['synchronize files structure with database'] = 'đồng bộ hóa cấu trúc file với cơ sở dữ liệu';
+$lang['synchronize files metadata with database photos informations'] = 'đồng bộ hóa metadata của file với thông tin các thành phần cơ sở dữ liệu';
+$lang['even already synchronized photos'] = 'ngay cả những thành phần đã được đồng bộ hóa';
+$lang['Used metadata'] = 'Metadata được sử dụng';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = 'Tên thư mục và phải là chữ hoặc số, "-", "_" hoặc "."';
+$lang['wrong filename'] = 'sai tên file';
+$lang['Upload'] = 'Gởi hình';
+$lang['user "%s" added'] = 'thành viên "%s" đã được thêm';
+$lang['User status'] = 'Trạng thái của thành viên';
+$lang['user_status_admin'] = 'Quản trị';
+$lang['user_status_generic'] = 'Chung';
+$lang['user_status_guest'] = 'Khách';
+$lang['user_status_normal'] = 'Thành viên';
+$lang['user_status_webmaster'] = 'Webmaster';
+$lang['Virtual album'] = 'Đề mục ảo';
+$lang['Waiting'] = 'Đang đợi';
+$lang['default'] = 'mặc định';
+$lang['Toggle \'default group\' property'] = 'Dịch chuyển \'nhóm mặc định\' thuộc tính';
+$lang['Advanced features'] = 'Đặc điểm vượt trội';
+$lang['Overall'] = 'Toàn bộ';
+$lang['Year'] = 'Năm';
+$lang['Month'] = 'Tháng';
+$lang['Day'] = 'Ngày';
+$lang['Pages seen'] = 'Những trang được xem';
+$lang['Time'] = 'Thời gian';
+$lang['IP'] = 'Địa chỉ IP';
+$lang['Element'] = 'Thành phần';
+$lang['Section'] = 'Mục';
+$lang['An information email was sent to group "%s"'] = 'Một thư thông báo đã được gởi đến nhóm người dùng "%s"';
+$lang['Send an information email to group members'] = 'Gởi thư thông báo đến nhóm thành viên';
+$lang['Group'] = 'Nhóm';
+$lang['[%s] Visit album %s'] = '[%s] Đến để xem đề mục %s';
+$lang['Hello,'] = 'Xin chào,';
+$lang['See you soon.'] = 'Hẹn gặp lại bạn.';
+$lang['Discover album:'] = 'Đến để khám phá đề mục:';
+$lang['Mail content'] = 'Nội dung thư gởi';
+$lang['none'] = 'không';
+$lang['high'] = 'chiều cao';
+$lang['other'] = 'khác';
+$lang['Element type'] = 'Loại thành phần';
+$lang['Image id'] = 'Id của hình';
+$lang['Summary'] = 'Tóm tắt';
+$lang['%d line filtered'] = 'Có %d hành được lọc ra';
+$lang['%d lines filtered'] = 'Có %d hành được lọc ra';
+$lang['%d guest'] = 'Có %d khách';
+$lang['%d guests'] = 'Có %d khách';
+$lang['Hour'] = 'Giờ';
+$lang['guest'] = 'khách';
+$lang['default values'] = 'giá trị mặc định';
+$lang['Guest cannot be deleted'] = 'Tài khoản khách không thể bị xóa';
+$lang['Default user cannot be deleted'] = 'Người dùng mặc định không thể bị xóa';
+$lang['Purge history detail'] = 'Dọn dẹp bản ghi chi tiết';
+$lang['Purge history summary'] = 'Dọn dẹp tóm tắt bản ghi';
+$lang['Check integrity'] = 'Kiểm tra tính nguyên vẹn';
+$lang['Anomaly'] = 'Bất thường';
+$lang['Correction'] = 'Sửa đổi';
+$lang['Automatic correction'] = 'Sửa đổi tự động';
+$lang['Impossible automatic correction'] = 'Không thể sửa đổi tự động';
+$lang['Correction applied with success'] = 'Sửa đổi được áp dụng với những thành công';
+$lang['Correction applied with error'] = 'Sửa đổi được áp dụng với những lỗi';
+$lang['%d anomaly has been detected.'] = 'Có %d bất thường được nhận dạng.';
+$lang['%d anomalies have been detected.'] = 'Có %d bất thường được nhận dạng.';
+$lang['%d anomaly has been corrected.'] = 'Có %d bất thường đã được sửa đổi.';
+$lang['%d anomalies have been detected corrected.'] = 'Có %d bất thường đã được nhận dạng sửa đổi.';
+$lang['%d anomaly has not been corrected.'] = 'Có %d bất thường không được sửa đổi.';
+$lang['%d anomalies have not been corrected.'] = 'Có %d bất thường không được sửa đổi.';
+$lang['Go to %s or %s for more informations'] = 'Chuyển đến %s hoặc %s để có thêm thông tin';
+$lang['the forum'] = 'diễn đàn';
+$lang['the wiki'] = 'thư viện wiki';
+$lang['%s value is not correct file because exif are not supported'] = 'Có %s giá trị không phải là kiểu file đúng bởi vì exif không được hỗ trợ';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = 'Có %s phải được thiết lập là false trong file config_local.inc.php của bạn';
+$lang['Main "guest" user does not exist'] = 'Nhóm người dùng "khách chính" không tồn tại';
+$lang['Main "guest" user status is incorrect'] = 'Trạng thái nhóm người dùng "khách chính" không đúng';
+$lang['Default user does not exist'] = 'Người dùng mặc định không tồn tại';
+$lang['Main "webmaster" user does not exist'] = 'Nhóm "webmaster chính" không tồn tại';
+$lang['Main "webmaster" user status is incorrect'] = 'Trạng thái nhóm "webmaster chính" không đúng';
+$lang['User "%s" created with "%s" like password'] = 'Người dùng "%s" được tạo ra với cùng mật khẩu "%s"';
+$lang['Status of user "%s" updated'] = 'Trạng thái của người dùng "%s" đã được cập nhật';
+$lang['add new photos to caddie'] = 'thêm thành phần mới vào caddie';
+$lang['No display'] = 'Không hiển thị';
+$lang['Classic display'] = 'Hiển thị kiểu classic';
+$lang['Hoverbox display'] = 'Hiển thị  kiểu hoverbox';
+$lang['Mail address is obligatory for all users'] = 'Địa chỉ email là thành phần bắt buộc đối với mọi nhóm người dùng';
+$lang['Minimum privacy level'] = 'Mức độ riêng tư tối thiểu';
+$lang['Privacy level'] = 'Mức độ riêng tư';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = 'Liên hệ';
+$lang['Level 2'] = 'Bạn bè';
+$lang['Level 4'] = 'Gia đình';
+$lang['Level 8'] = 'Quản trị';
+$lang['Reinitialize check integrity'] = 'Tái khởi động quá trình kiểm tra tính nguyên vẹn';
+$lang['Check all'] = 'Chọn tất cả';
+$lang['Uncheck all'] = 'Bỏ chọn tất cả';
+$lang['Check automatic corrections'] = 'Kiểm tra sửa lỗi tự động';
+$lang['Apply selected corrections'] = 'Áp dụng những sửa lỗi đã chọn';
+$lang['Ignore selected anomalies'] = 'Bỏ qua những bất thường đã chọn';
+$lang['Refresh'] = 'Làm tươi lại';
+$lang['The anomaly will be ignored until next application version'] = 'Bất thường sẽ bị bỏ qua cho đến khi phiên bản tiếp theo của ứng dụng.';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = 'Sửa đổi những bất thường sẽ hủy bỏ vấ đề chính mà nó bị bỏ qua';
+$lang['%d anomaly has been ignored.'] = 'Có %d báo cáo bất thường đã được bỏ qua.';
+$lang['%d anomalies have been ignored.'] = 'Có %d báo cáo bất thường đã được bỏ qua.';
+$lang['Plugins which need upgrade'] = 'Plugins cần được nâng cấp';
+$lang['Plugin list'] = 'Danh sách plugin';
+$lang['Check for updates'] = 'Dò tìm bản bâng cấp';
+$lang['Other plugins'] = 'Các plugins khác';
+$lang['Last revisions'] = 'Lần sửa đổi cuối';
+$lang['Are you sure you want to delete this plugin?'] = 'Bạn có chắc là muốn xóa bỏ plugin này không?';
+$lang['Are you sure you want to install this plugin?'] = 'Bạn có chắc là muốn cài đặt plugin này không?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = 'Bạn có chắc là muốn cài đặt bản nâng cấp này? Bạn phải xác nhận nếu phiên bản này không yêu cầu phải tháo bỏ phiên bản cũ.';
+$lang['Plugin has been successfully copied'] = 'Plugin đã được copy xong';
+$lang['You might go to plugin list to install and activate it.'] = 'Bạn nen vào danh sách các plugin để cài đặt và kích hoạt nó.';
+$lang['Can\'t create temporary file.'] = 'Không thể tạo ra file tạm.';
+$lang['Can\'t download archive.'] = 'Không thể tải xuống tệp lưu trữ.';
+$lang['Can\'t read or extract archive.'] = 'Không thể đọc hoặc trích xuất tệp lưu trữ.';
+$lang['An error occured during extraction (%s).'] = 'Có lỗi xuất hiện trong quá trình trích xuất (%s).';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = 'Vui lòng kiểm tra quyền truy xuất của thư mục "plugins" và thư mục con (CHMOD).';
+$lang['Can\'t connect to server.'] = 'Không thể kết nối với máy chủ.';
+$lang['Purge compiled templates'] = 'Don dẹp những template kết hợp';
+$lang['ACCESS_0'] = 'Truy xuất tự to';
+$lang['ACCESS_1'] = 'Truy xuất vào tất cả';
+$lang['ACCESS_2'] = 'Truy xuất vào mục đăng ký nhân bản tin';
+$lang['ACCESS_3'] = 'Truy xuất vào phần quản trị';
+$lang['ACCESS_4'] = 'Truy xuất vào webmasters';
+$lang['ACCESS_5'] = 'Không được phép truy xuất';
+$lang['Support'] = 'Hỗ trợ';
+$lang['Documentation'] = 'Tài liệu tham khảo';
+$lang['A new version of Piwigo is available.'] = 'Đã có phiên bản Piwigo mới.';
+$lang['Piwigo Administration'] = 'Quản trị Piwigo';
+$lang['Piwigo version'] = 'Phiên bản Piwigo';
+$lang['You are running the latest version of Piwigo.'] = 'Bạn đang sử dụng phiên bản mới nhất của Piwigo.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = 'Phiên bản %s [%s] đã cài đặt không tương thích với phiên bản được yêu cầu là [%s]';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = 'Bạn cần nâng cấp hệ thống để tận dụng hết các chức năng của ứng dụng, nếu không ứng dụng sẽ không hoạt động chính xác, hoặc sẽ không vận hành được';
+$lang['Deleted on'] = 'Xóa vào';
+$lang['Last hit'] =  'Lần xem cuối';
+$lang['GD library is missing'] = 'Thư viện GD bị thiếu';
+$lang['Templates'] = 'Templates';
+$lang['Extend for templates'] = 'Mở rộng cho template';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = 'Việc thay đổi các templates gốc bằng những templates tùy biến từ thư mục con chứa thành phần template mở rộng';
+$lang['Replacers (customized templates)'] = 'Thay thế (templates được tùy biến)';
+$lang['Original templates'] = 'Templates gốc';
+$lang['Optional URL keyword'] = 'Từ khóa URL tùy chọn';
+$lang['Templates configuration has been recorded.'] = 'Cầu hình tempalte đã được ghi.';
+$lang['All optimizations have been successfully completed.'] = 'Tất cả quá trình tối ưu hóa đã hoàn thành xong.';
+$lang['Optimizations have been completed with some errors.'] = 'Quá trình tối ưu hóa đã hoàn thành với một vài lỗi.';
+$lang['Modify information'] = 'Hiệu chỉnh thông tin';
+$lang['nothing'] = 'không có gì';
+$lang['overrides existing values with empty ones'] = 'ghi đè giá trị đang tồn tại bằng giá trị rỗng';
+$lang['Manage photo ranks'] = 'Quản lý xếp hạng hình ảnh';
+$lang['Edit ranks'] = 'Biên tập xếp hạng';
+$lang['No photo in this album'] = 'Không có thành phần nào trong đề mục này';
+$lang['Images manual order was saved'] = 'Sắp xếp hình ảnh thủ công đã được lưu';
+$lang['ranks'] = 'xếp hạng';
+$lang['Drag to re-order'] = 'Kéo rê để sắp xếp lại';
+$lang['Quick Local Synchronization'] = 'Đồng bộ hóa cục bộ nhanh';
+$lang['No photo can be deleted'] = 'Không có hình nào có thể bị xóa';
+$lang['Delete selected photos'] = 'Xóa các hình được chọn';
+$lang['%d photo was deleted'] = '%d hình đã được xóa';
+$lang['%d photos were deleted'] = 'Có %d hình đã được xóa';
+$lang['Downloads'] = 'Tải xuống';
+$lang['Released on'] = 'Phát hành vào';
+$lang['Number of downloads'] = 'Số lần download';
+$lang['Piwigo Announcements Newsletter'] = 'Bản tin Piwigo';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = 'Giữ liên lạc với Piwigo Project, đăng ký nhận bản tin từ Piwigo. Bạn sẽ nhận được email mỗi khi phiên bản mới được phát hành (đôi khi cũng bao gồm bản sửa lỗi, cần thiết để biết và cập nhật) và khi sự kiện chính xảy ra đối với dự án. Chỉ có vài email trong một năm.';
+$lang['Subscribe %s'] = 'Đăng ký nhận tin %s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = 'Đăng ký %s nhận bản tin của Piwigo';
+$lang['Purge search history'] = 'Dọn dẹp bản ghi tìm kiếm';
+$lang['Hide'] = 'Ẩn';
+$lang['Menu Management'] = 'Trình đơn';
+$lang['Operation in progress'] = 'Đang tiến hành xử lý.';
+$lang['Please wait...'] = 'Vui lòng đợi...';
+$lang['By rank'] = 'Theo hạng';
+$lang['Manual order'] = 'Sắp xếp thủ công';
+$lang['Password is missing. Please enter the password.'] = 'Thiếu mật khẩu. Vui lòng nhập mật khẩu.';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = 'Xác nhận mật khẩu bị thiếu. Vui lòng xác nhận lại mật khẩu đã chọn.';
+$lang['Allow users to edit their own comments'] = 'Cho phép người dùng chỉnh sửa lời bình luận riêng của họ';
+$lang['Allow users to delete their own comments'] = 'Cho phép người dùng xóa lời bình luận riêng của họ';
+$lang['Email administrators when a comment is modified'] = 'Gởi email cho Quản trị viên có một lời bình luận được chỉnh sửa';
+$lang['Email administrators when a comment is deleted'] = 'Gởi email cho Quản trị viên có một lời bình luận bị xóa';
+$lang['Cannot delete the old permalink !'] = 'Liên kết cố định cũ thì không thể bị xóa!';
+$lang['Hit'] = 'Lần xem';
+$lang['Tools'] = 'Công cụ';
+$lang['Photos'] = 'Ảnh';
+$lang['Themes'] = 'Giao diện';
+$lang['Instructions to use Piwigo'] = 'Hướng dẫn sử dụng Piwigo';
+$lang['Installed Themes'] = 'Giao diện đã được cài đặt';
+$lang['Add New Theme'] = 'Thêm một giao diện mới';
+$lang['Forbid this theme to users'] = 'Cấm người dùng sử dụng giao diện này';
+$lang['Set as default theme for unregistered and new users'] = 'Đặt làm giao diện mặt định cho tất cả người dùng chưa đăng ký và thành viên mới';
+$lang['unknown'] = 'không xác định';
+$lang['Upload Photos'] = 'Tải ảnh lên';
+$lang['Drop into album'] = 'Chuyển vào đề mục';
+$lang['+ Add an upload box'] = '+ Thêm một mục gởi hình ';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = 'Tạo ra "%s" thư mục ở cùng thư mục cài đặt Piwigo của bạn';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = 'Gán quyền được ghi (chmod 777) cho "%s" thư mục ở cùng thư mục cài đặt Piwigo của bạn';
+$lang['existing album'] = 'đề mục hiện có';
+$lang['create a new album'] = 'tạo một đề mục mới';
+$lang['Album name'] = 'Tên đề mục';
+$lang['Album "%s" has been added'] = 'Đề mục "%s" đã được thêm vào';
+$lang['Uploaded Photos'] = 'Ảnh đã được gởi lên';
+$lang['%d photos uploaded'] = 'Đã có %d ảnh được gởi';
+$lang['Privacy level set to "%s"'] = 'Mức độ riêng tư đã được thiết lập ở mức "%s"';
+$lang['Album "%s" now contains %d photos'] = 'Đề mục "%s" hiện tại chứa %d bức ảnh';
+$lang['Manage this set of %d photos'] = 'Quản lý bộ gồm %d ảnh';
+$lang['Select files'] = 'Chọn tệp tin';
+$lang['Everybody'] = 'Mọi người';
+$lang['Who can see these photos?'] = 'Ai có thể xem được những bức ảnh này?';
+$lang['Who can see this photo?'] = 'Ai có thể xem được bức ảnh này?';
+$lang['Settings'] = 'Cài đặt';
+$lang['Resize'] = 'Định dạng lại kích thước';
+$lang['Maximum Width'] = 'Chiều rộng lớn nhất';
+$lang['pixels'] = 'pixels';
+$lang['Maximum Height'] = 'Chiều cao lớn nhất';
+$lang['Image Quality'] = 'Chất lượng hình';
+$lang['Save Settings'] = 'Lưu cài đặt';
+$lang['Your configuration settings are saved'] = 'Thiết lập cấu hình của bạn đã được lưu';
+$lang['Active Themes'] = 'Kích hoạt giao diện';
+$lang['Add write access to the "%s" directory'] = 'Gán quyền được ghi cho thư mục "%s"';
+$lang['Administration Home'] = 'Trang chủ của Quản trị';
+$lang['Change Admin Colors'] = 'Thay đổi màu trang Quản trị';
+$lang['Delete this theme'] = 'Xóa giao diện này';
+$lang['Directory does not exist'] = 'Thư mục không tồn tại';
+$lang['Download,'] = 'Tải xuống,';
+$lang['FTP + Synchronization'] = 'FTP + Đồng bộ hóa';
+$lang['Get Support on Piwigo Forum'] = 'Nhận hỗ trợ từ diễn đàn Piwigo';
+$lang['Help Me'] = 'Xin giúp tôi';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = 'Giao diện này không thể kích hoạt được, một khi giao diện chủ bị thiếu: %s';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = 'Giao diện này không thể bị xóa bởi vì có một hay một vài giao diện khác phụ thuộc vào nó: %s';
+$lang['Inactive Themes'] = 'Giao diện không được kích hoạt';
+$lang['Install on your computer,'] = 'Cài đặt trên máy của bạn,';
+$lang['Make this theme available to users'] = 'Thiết lập cho những tài khoản người dùng có thể sử dụng được';
+$lang['Page end'] = 'Kết thúc trang';
+$lang['Piwigo Uploader'] = 'Công cụ gởi hình Piwigo';
+$lang['Read Piwigo Documentation'] = 'Tham khảo tài liệu về Piwigo';
+$lang['Start pLoader and add your photos.'] = 'Bắt đầu sử dụng pLoader và gởi ảnh của bạn.';
+$lang['Switch to clear or dark colors for administration'] = 'Chuyển sang màu sáng hoặc tối đối với Quản trị viên';
+$lang['Theme has been successfully installed'] = 'Giao diện đã được cài đặt thành công';
+$lang['Visit Gallery'] = 'Ghé xem thư viện hình';
+$lang['Visit Piwigo project website'] = 'Ghé vào trang chủ của Dự án Piwigo';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'Công cụ pLoader là một <em>công cụ gởi ảnh của Piwigo</em>. Từ máy tính của bạn, pLoader sẽ chuẩn bị các bước thiết lập cho những bức ảnh và chuyển chúng lên thư viện ảnh Piwigo của bạn.';
+$lang['Guest Settings'] = 'Thiết lập cho tài khoản khách';
+$lang['Main Page'] = 'Trang chính';
+$lang['Photo Page'] = 'Trang ảnh';
+$lang['Activate Navigation Bar'] = 'Kích hoạt thanh điều hướng trang';
+$lang['Activate Navigation Thumbnails'] = 'Kích hoạt hình thu nhỏ điều hướng trang';
+$lang['Activate icon "%s"'] = 'Kích hoạt biểu tượng "%s"';
+$lang['Photo Properties'] = 'Thuộc tính ảnh';
+$lang['Allow user customization'] = 'Cho phép người dùng tùy biến ';
+$lang['Languages'] = 'Ngôn ngữ';
+$lang['Installed Languages'] = 'Gói ngôn ngữ đã được cài';
+$lang['Add New Language'] = 'Thêm gói ngôn ngữ mới';
+$lang['Language has been successfully installed'] = 'Gói ngôn ngữ đã được cài đặt thành công';
+$lang['Select:'] = 'Chọn:';
+$lang['None'] = 'Không';
+$lang['Invert'] = 'Đảo ngược';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = 'Không thể vô hiệu hóa giao diện này, bạn cần ít nhất một giao diện.';
+$lang['Webmaster status is required.'] = 'Trạng thái của Webmaster cần phải có.';
+$lang['Bound Theme'] = 'Giao diện biên';
+$lang['Allow rating'] = 'Cho phép xếp hạng';
+$lang['Select at least one comment'] = 'Chọn ít nhất một lời bình';
+$lang['Active Plugins'] = 'Plugin đang sử dụng';
+$lang['Inactive Plugins'] = 'Plugin không được sử dụng';
+$lang['Missing Plugins'] = 'Plugin bị thiếu';
+$lang['Uninstalled Plugins'] = 'Plugin đã được gỡ bỏ';
+$lang['By %s'] = 'Bởi %s';
+$lang['Visit plugin site'] = 'Xem trang web chứa plugin';
+$lang['Active Languages'] = 'Ngôn ngữ hiện đang sử dụng';
+$lang['Delete this language'] = 'Xóa gói ngôn ngữ này';
+$lang['Forbid this language to users'] = 'Cấm người dùng sử dụng gói ngôn ngữ này.';
+$lang['Impossible to deactivate this language, first set another language as default.'] = 'Không thể tắt gói ngôn ngữ này, trước tiên cần phải thiết lập gói ngôn ngữ mặc định khác.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = 'Không thể tắt gói ngôn ngữ này, bạn cần ít nhất một gói ngôn ngữ.';
+$lang['Inactive Languages'] = 'Ngôn ngữ hiện không sử dụng';
+$lang['Make this language available to users'] = 'Thiết lập cho phép sử dụng gói ngôn ngữ này cho mọi người dùng.';
+$lang['Set as default language for unregistered and new users'] = 'Thiết lập là ngôn ngữ mặc định cho nhóm người dùng mới và nhóm chưa đăng ký.';
+$lang['Add Photos'] = 'Thêm ảnh';
+$lang['The following tag was deleted'] = 'Thẻ sau đây đã bị xóa';
+$lang['Miscellaneous'] = 'Linh tinh';
+$lang['Virtual Links'] = 'Liên kết ảo';
+$lang['There is no other language available.'] = 'Không có gói ngôn ngữ nào có thể dùng được.';
+$lang['There is no other plugin available.'] = 'Không có plugin nào có thể dùng được.';
+$lang['There is no other theme available.'] = 'Không có gói giao diện nào có thể dùng được.';
+$lang['Add another set of photos'] = 'Thêm vào bộ ảnh khác';
+$lang['Order of menubar items has been updated successfully.'] = 'Vị trí của các mục trong thanh menubar đã được cập nhật thành công.';
+$lang['This theme was not designed to be directly activated'] = 'Giao diện này không được thiết kế để có thể kích hoạt trực tiếp';
+$lang['Pending Comments'] = 'Lời bình đang chờ';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = 'Trong tệp tin php.ini, biến upload_max_filesize (%sB) thì lớn hơn biến post_max_size (%sB), bạn nên thay đổi thiết lập này';
+$lang['Exif extension not available, admin should disable exif use'] = 'Nếu phần mở rộng Exif không tồn tại thì Quản trị viên nên vô hiệu hóa việc sử dụng Exif';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = 'Tệp tin gởi lên đã vượt quá giá trị hướng dẫn của biến upload_max_filesize ở tệp tin php.ini: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = 'Tệp tin gởi lên đã vượt quá giá trị hướng dẫn của biến post_max_size ở tệp tin php.ini: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = 'Tệp tin gởi lên đã vượt quá giá trị hướng dẫn của biến MAX_FILE_SIZE đã được định ra trong form HTML';
+$lang['The uploaded file was only partially uploaded'] = 'Tệp tin gởi lên chỉ được gởi một phần (không hoàn chỉnh)';
+$lang['No file was uploaded'] = 'Không có tệp tin nào được gởi lên';
+$lang['Missing a temporary folder'] = 'Còn thiếu một thư mục tạm';
+$lang['Failed to write file to disk'] = 'Bị lỗi khi ghi tệp tin lên đĩa';
+$lang['File upload stopped by extension'] = 'Quá trình gởi tệp tin đã dừng lại bởi phần mở rộng của tệp tin';
+$lang['Unknown upload error'] = 'Lỗi gởi hình không xác định được';
+$lang['Error on file "%s" : %s'] = 'Có lỗi ở tệp tin "%s" : %s';
+$lang['automatic order'] = 'sắp xếp tự động';
+$lang['manual order'] = 'sắp xếp thủ công';
+$lang['Albums automatically sorted'] = 'Albums đã được phân loại tự động';
+$lang['Batch Manager'] = 'Quản lý khối';
+$lang['include child albums'] = 'bao gồm các albums con';
+$lang['Selection'] = 'Lựa chọn';
+$lang['Action'] = 'Thực thi';
+$lang['Set author'] = 'Thiết lập tác giả';
+$lang['Set title'] = 'Thiết lập tiêu đề';
+$lang['Set creation date'] = 'Thiết lập ngày tháng khởi tạo';
+$lang['Apply action'] = 'Xác nhận thay đổi';
+$lang['on the %d selected photos'] = 'trên %d hình được chọn';
+$lang['%d of %d photos selected'] = '%d trong %d hình được chọn';
+$lang['No photo selected, %d photos in current set'] = 'Không có hình nào được chọn, có %d hình trong bộ hiện tại';
+$lang['All %d photos are selected'] = 'Tất cả %d hình đều được chọn';
+$lang['remove this filter'] = 'bỏ bộ lọc này';
+$lang['Duplicates'] = 'trùng';
+$lang['Add a filter'] = 'thêm bộ lọc';
+$lang['Remove all filters'] = 'Bỏ tất cả các bộ lọc';
+$lang['Refresh photo set'] = 'Cập nhật bộ hình';
+$lang['The whole page'] = 'Nguyên cả trang';
+$lang['The whole set'] = 'Nguyên cả bộ';
+$lang['No photo in the current set.'] = 'Không có hình nào trong bộ hiện tại.';
+$lang['No photo selected, no action possible.'] = 'Không có hình nào được chọn, không tác vụ nào được thực hiện.';
+$lang['Choose an action'] = 'Chọn một tác vụ';
+$lang['remove author'] = 'bỏ tác giả';
+$lang['Type here the author name'] = 'Nhập tên tác giả vào đây';
+$lang['remove title'] = 'bỏ tiêu đề';
+$lang['Type here the title'] = 'Nhập tiêu đề vào đây';
+$lang['remove creation date'] = 'bỏ ngày tháng khởi tạo';
+$lang['Album photos associated to the following albums: %s'] = 'Ảnh được kết hợp với những albums sau: %s';
+$lang['Delete orphan tags'] = 'Xóa các thẻ riêng lẽ';
+$lang['delete photo'] = 'xóa ảnh';
+$lang['Orphan tags deleted'] = 'Thẻ riêng lẽ đã được xóa';
+$lang['Week starts on'] = 'Tuần lễ bắt đầu vào';
+$lang['You have %d orphan tags: %s.'] = 'Bạn có %d thẻ riêng lẽ: %s.';
+$lang['Remove from caddie'] = 'Bỏ ra khỏi caddie';
+$lang['Themes which need upgrade'] = 'Giao diện cần bản nâng cấp';
+$lang['Languages which need upgrade'] = 'Ngôn ngữ cần nâng cấp';
+$lang['All themes are up to date.'] = 'Tất cả giao diện đều được cập nhật.';
+$lang['All plugins are up to date.'] = 'Tất cả plugins đều được cập nhật.';
+$lang['All languages are up to date.'] = 'Tất cả ngôn ngữ đều được cập nhật.';
+$lang['Visit theme site'] = 'Đến trang web của giao diện';
+$lang['Visit language site'] = 'Đến trang web của của ngôn ngữ';
+$lang['New Version'] = 'Phiên bản Mới';
+$lang['Obsolete Plugins'] = 'Những plugins đã cũ';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = 'CẢNH BÁO! Plugin này có thể không tương thích với phiên bản Piwigo hiện tại.';
+$lang['Do you want to activate anyway?'] = 'Bạn vẫn muốn kích hoạt?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = 'PLUGIN NÀY GIỜ LÀ MỘT PHẦN CỦA NHÂN PIWIGO! GỠ BỎ NGAY!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = 'LỖI: PLUGIN NÀY BỊ THIẾU NHƯNG NÓ ĐÃ ĐƯỢC CÀI ĐẶT! GỠ BỎ NGAY.';
+$lang['Thumbnails generation in progress...'] = 'Quá trình khởi tạo hình thu nhỏ đang được thực hiện...';
+$lang['Photos generation in progress...'] = 'Quá trình khởi tạo ảnh web đang được thực hiện...';
+$lang['%s photos have been regenerated'] = 'có %s ảnh đã được tạo ra';
+$lang['%s photos can not be regenerated'] = 'Có %s ảnh không thể tạo ra được';
+$lang['new'] = 'mới';
+$lang['No results'] = 'Không có kết quả nào';
+$lang['Searching...'] = 'Đang tìm kiếm...';
+$lang['Type in a search term'] = 'Nhập vào trong mục tìm kiếm';
+$lang['display'] = 'hiển thị';
+$lang['Deactivate all'] = 'Bỏ kích hoạt tất cả';
+$lang['Restore'] = 'Phục hồi';
+$lang['Restore default configuration. You will lose your plugin settings!'] = 'Khôi phục lại cấu hình mặc định. Các thiết lập cho plugin sẽ bị mất!';
+$lang['Show menubar'] = 'Hiển thị thanh trình đơn';
+$lang['Updates'] = 'Bản cập nhật';
+$lang['Update in progress... Please wait.'] = 'Đang tiến hành cập nhật... Vui lòng đợi.';
+$lang['Ignore this update'] = 'Bỏ qua bản cập nhật này';
+$lang['Reset ignored updates'] = 'Cài đặt lại những bản cập nhật đã bỏ qua';
+$lang['Update All'] = 'Cập nhật Tất cả';
+$lang['ERROR'] = 'CÓ LỖI';
+$lang['Update Complete'] = 'Cập nhật Hoàn thành';
+$lang['Piwigo Update'] = 'Cập nhật Piwigo';
+$lang['Extensions Update'] = 'Cập nhật thành phần mở rộng';
+$lang['All extensions are up to date.'] = 'Tất cả thành phần mở rộng đều được cập nhật.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = 'Plugins sau đây có thể không tương thích với phiên bản mới của Piwigo:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = 'Giao diện sau đây có thể không tương thích với phiên bản mới của Piwigo:';
+$lang['I decide to update anyway'] = 'Dù gì tôi cũng quyết định cập nhật';
+$lang['Update to Piwigo %s'] = 'Cập nhật Piwigo lên phiên bản %s';
+$lang['Two updates are available'] = 'Có hai bản cập nhật';
+$lang['This is a minor update, with only bug corrections.'] = 'Đây là bản nâng cấp phụ, với các bản sửa lỗi.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = 'Đây là bản cập nhật chính, với nhiều <a href="%s">tính năng mới thú vị</a>.';
+$lang['Some themes and plugins may be not available yet.'] = 'Một số giao diện và plugins có thể chưa sử dụng được.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = 'Bạn có thể cập nhật trực tiếp Piwigo lên phiên bản %s, mà không cần phải nâng cấp lên phiên bản %s (khuyến cáo).';
+$lang['Save Template Directory'] = 'Lưu thư mục khuôn mẫu';
+$lang['Dump Database'] = 'Kết xuất Cơ sở dữ liệu';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = 'Bao gồm dữ liệu lược sử (Cảnh báo: giới hạn bộ nhớ máy chủ có thể bị vượt quá)';
+$lang['Unable to dump database.'] = 'Không thể kết xuất cơ sở dữ liệu.';
+$lang['Some upgrades are available for extensions.'] = 'Một số bản nâng cấp có thể áp dụng được cho các thành phần mở rộng.';
+$lang['Ignore All'] = 'Bỏ qua Tất cả';
+$lang['Crop'] = 'Xén';
+$lang['Width'] = 'Chiều rộng';
+$lang['Height'] = 'Chiều cao';
+$lang['Follow Orientation'] = 'Định hướng Dõi theo';
+$lang['Graphics Library'] = 'Thư viện Đồ họa';
+$lang['Activate icon "new" next to albums and pictures'] = 'Kích hoạt biểu tượng "ảnh mới" kế bên albums ảnh và hình';
+$lang['Add a criteria'] = 'Thêm một tiêu chí';
+$lang['Default photos order'] = 'Thứ tự ảnh mặc định';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = 'Bạn không thể định ra một thứ tự ảnh mặc định vì đã có một thiết lập tùy chọn trong cấu hình cục bộ.';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = 'Bạn đã định ra <i>$conf[\'order_by\']</i> trong tệp tin cấu hình cục bộ của bạn, tham số này không được chấp nhận, hãy xóa bỏ hoặc đổi tên trong mục <i>$conf[\'order_by_custom\']</i> !';
+$lang['Average rate'] = 'Xếp hạng trung bình';
+$lang['Rate'] = 'Xếp hạng';
+$lang['... or '] = '... hoặc ';
+$lang['Create'] = 'Khởi tạo';
+$lang['Start Upload'] = 'Bắt đầu Tải lên';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = 'Bạn hiện đang dùng Flash Uploader. Nếu có trục trặc? Thì dùng <a href="%s">Web Uploader</a> thay thế.';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = 'Bạn hiện đang dùng Browser uploader. Hãy dùng <a href="%s">Flash uploader</a> thay thế.';
+$lang['Maximum file size: %sB.'] = 'Kích thước file lớn nhất: %sB.';
+$lang['Allowed file types: %s.'] = 'Loại file cho phép dùng: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = 'Độ phân giải lớn nhất ước chừng: %dM pixels (đó là %dx%d pixels).';
+$lang['Manage Permissions'] = 'Quản lý Quyền Hạn';
+$lang['Learn more'] = 'Tìm hiểu thêm';
+$lang['Photo %s of %s'] = 'Ảnh %s của %s';
+$lang['show details'] = 'hiện chi tiết';
+$lang['hide details'] = 'ẩn chi tiết';
+$lang['Merge tags'] = 'Sáp nhập nhãn';
+$lang['Select the destination tag'] = 'Chọn nhãn đích';
+$lang['(this tag will be deleted)'] = '(nhãn này sẽ bị xóa)';
+$lang['Confirm merge'] = 'Xác nhận sáp nhập';
+$lang['Merge selected tags'] = 'Sáp nhập những thẻ được chọn';
+$lang['No destination tag selected'] = 'Không có nhãn đích nào được chọn';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = 'Nhãn <em>%s</em> được sáp nhập vào nhãn <em>%s</em>';
+$lang['Select at least two tags for merging'] = 'Chọn ít nhất hai nhãn để sáp nhập';
+$lang['Select an album'] = 'Chọn một album ảnh';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = 'Theo mặc định, Piwigo sẽ tạo ra một kích thước web từ ảnh định dạng cao của bản.';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = 'Nếu không có định dạng cao nào và nếu kích thước web hiện tại lớn hơn kích thước đã điều chỉnh, Piwigo sẽ chuyển nó thành định dạng cao và tạo ra một ảnh có kích thước web đã thu nhỏ từ ảnh gốc.';
+$lang['An error has occured during upgrade.'] = 'Có một lỗi xuất hiện trong quá trình nâng cấp.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = 'Có một lỗi xuất hiện trong quá trình trích xuất tệp tin. Vui lòng kiểm tra quyền hiệu chỉnh tệp tin gói cài đặt Piwigo của bạn.<br><a href="%s">Click vào đây để xem lỗi.</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo không thể nhận được tệp tin nâng cấp từ  máy chủ';
+$lang['Zoom'] = 'Phóng to ảnh';
+$lang['Add to caddie'] = 'thêm vào caddie';
+$lang['%s has been successfully updated.'] = '%s cập nhật thành công.';
+$lang['Activate comments'] = 'Kích hoạt lời bình';
+$lang['Add tags'] = 'Bổ sung thẻ';
+$lang['Default comments order'] = 'Sắp xếp lời bình theo mặc định';
+$lang['Last import'] = 'Nhập sau cùng';
+$lang['Photo name'] = 'Tên ảnh';
+$lang['Predefined filter'] = 'Bộ lọc được định nghĩa trước';
+$lang['Send connection settings by email'] = 'Gởi thiết lập kết nối qua email';
+$lang['The original image quality must be a number between %d and %d'] = 'Chất lượng hình gốc phải là một số nằm giữa %d và %d';
+$lang['The original maximum height must be a number between %d and %d'] = 'Chiều cao gốc tối đa phải là một số nằm giữa %d và %d';
+$lang['The original maximum width must be a number between %d and %d'] = 'Chiều rộng gốc tối đa phải là một số nằm giữa %d và %d';
+$lang['With no album'] = 'Không kèm theo album ảnh';
+$lang['With no tag'] = 'Không kèm theo thẻ';
+$lang['With no virtual album'] = 'Không kèm theo album ảnh ảo';
+$lang['Resize after upload'] = 'Điều chỉnh kích thước sau khi gởi ảnh';
+$lang['Original Size'] = 'Kích thước gốc';
+$lang['A locked gallery is only visible to administrators'] = 'Thư viện ảnh đã khóa chỉ có thể xem được bởi Quản trị viên';
+$lang['Unlock gallery'] = 'Mở khóa thư viện ảnh';
+$lang['Gallery unlocked'] = 'Thư viện ảnh đã được mở khóa';
+$lang['Notify administrators when a comment is'] = 'Thông báo cho Quản trị viện khi có lời bình';
+$lang['modified'] = 'đã được hiệu chỉnh';
+$lang['pending validation'] = 'đang chờ xác nhận';
+$lang['Save visits in history for'] = 'Lưu giữ lượt khách trong bản ghi để';
+$lang['simple visitors'] = 'khách thăm quan bình thường';
+$lang['registered users'] = 'người dùng đã đăng ký';
+$lang['administrators'] = 'quản trị viên';
+$lang['This album contains %d photos, added on %s.'] = 'Album ảnh này có chứa %d ảnh, thêm vào %s.';
+$lang['This album contains %d photos, added between %s and %s.'] = 'Album ảnh này có chứa %d ảnh, thêm vào từ %s đến %s.';
+$lang['This album contains no photo.'] = 'Album ảnh này không chứa ảnh nào.';
+$lang['Not cropped correctly?'] = 'Ảnh không được cắt chính xách?';
+$lang['Center of interest'] = 'Tâm điểm chú ý';
+$lang['Move to album'] = 'Chuyển đến album';
+$lang['You can activate only one mobile theme.'] = 'Bạn chỉ có thể một giao diện cho phiên bản di động.';
+$lang['Automatic sort order'] = 'Tự động sắp xếp vị trí';
+$lang['apply automatic sort order'] = 'áp dụng sắp xếp vị trí tự động';
+$lang['Save manual order'] = 'Lưu vị trí sắp xếp thủ công';
+$lang['cancel manual order'] = 'hủy vị trí sắp xếp thủ công';
+$lang['Cancel'] = 'Hủy bỏ';
+$lang['List'] = 'Dach sách';
+$lang['Web Form'] = 'Mẫu Web';
+$lang['Applications'] = 'Các ứng dụng';
+$lang['Available versions for'] = 'Những phiên bản có thể dùng được cho';
+$lang['Available on'] = 'Có thể dùng được vào';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Phiên bản Piwigo cho iOS (iPhone, iPad, iPod Touch)';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Phiên bản Piwigo cho iOS</em> ứng dụng cho phép bạn kết nối Piwigo của mình từ iPhone, iPad hoặc iPod Touch, tạo albums ảnh và tải lên máy chủ lưu trữ ảnh ngay lập tức.';
+$lang['Piwigo for Android'] = 'Phiên bản Piwigo cho Android';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Phiên bản Piwigo cho  Android</em> ứng dụng cho phép bạn kết nối Piwigo của mình từ điện thoại chạy Android hoặc máy tính bảng, tạo albums ảnh và tải lên máy chủ lưu trữ ảnh ngay lập tức.';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Plugin Publish của Piwigo cho Lightroom';
+
+?>
Index: tags/2.4.0RC3/language/vi_VN/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/vi_VN/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: Tiếng Việt [VN]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=437
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = 'Tiếng Việt';
+$lang_info['country'] = 'Việt Nam';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'vn';
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = '%d Kb';
+$lang['%d album updated'] = '%d đề mục đã được cập nhật';
+$lang['%d albums updated'] = '%d đề mục đã được cập nhật';
+$lang['%d comment to validate'] = '%d lời bình cần xác nhận';
+$lang['%d comments to validate'] = '%d lời bình cần xác nhận';
+$lang['%d new comment'] = '%d lời bình mới';
+$lang['%d new comments'] = '%d lời bình mới';
+$lang['%d comment'] = '%d lời bình';
+$lang['%d comments'] = '%d lời bình';
+$lang['%d hit'] = '%d lần xem';
+$lang['%d hits'] = '%d lần xem';
+$lang['%d new photo'] = '%d hình mới';
+$lang['%d new photos'] = '%d hình mới';
+$lang['%d new user'] = '%d thành viên mới';
+$lang['%d new users'] = '%d thành viên mới';
+$lang['About'] = 'Thông tin về Piwgo';
+$lang['All tags'] = 'Tất cả các tags';
+$lang['Any tag'] = 'Tất cả các tag';
+$lang['At least one listed rule must be satisfied.'] = 'Ít nhất một điều khoản nêu trên phải được đáp ứng.';
+$lang['Author'] = 'Tác giả';
+$lang['Albums'] = 'Đề mục';
+$lang['Album'] = 'Đề mục';
+$lang['Close this window'] = 'Đóng';
+$lang['Complete RSS feed (photos, comments)'] = 'Cung cấp bản tin RSS đầy đủ (gồm hình ảnh và lời bình)';
+$lang['Confirm Password'] = 'Xác nhận lại mật khẩu';
+$lang['Connection settings'] = 'Thiết lập cài đặt';
+$lang['Login'] = 'Đăng nhập';
+$lang['Contact webmaster'] = 'Liên hệ với Quản trị';
+$lang['Create a new account'] = 'Tạo tài khoản mới';
+$lang['Created on'] = 'Khởi tạo vào';
+$lang['Creation date'] = 'Ngày khởi tạo';
+$lang['Current password is wrong'] = 'Mật khởi hiện tại bị sai';
+$lang['Dimensions'] = 'Độ phân giải';
+$lang['Display'] = 'Hiển thị';
+$lang['Each listed rule must be satisfied.'] = 'Mỗi điều khoản nêu trên phải được đáp ứng.';
+$lang['Email address'] = 'Địa chỉ email';
+$lang['Enter your personnal informations'] = 'Nhập thông tin của bạn';
+$lang['Error sending email'] = 'Lỗi gởi email';
+$lang['File name'] = 'Tên file';
+$lang['File'] = 'Tệp tin';
+$lang['Filesize'] = 'Kích thước file';
+$lang['Filter and display'] = 'Lọc và hiển thị ảnh';
+$lang['Filter'] = 'Lọc';
+$lang['Forgot your password?'] = 'Bạn quên mật khẩu?';
+$lang['Go through the gallery as a visitor'] = 'Xem gallery như một khách thăm quan';
+$lang['Help'] = 'Trợ giúp';
+$lang['Identification'] = 'Định danh';
+$lang['Photos only RSS feed'] = 'Chỉ cung cấp hình ảnh trên bản tin RSS';
+$lang['Keyword'] = 'Từ khoá';
+$lang['Links'] = 'Liên kết';
+$lang['N/A'] = 'Không có';
+$lang['New on %s'] = 'hình mới ở %s';
+$lang['Notification'] = 'Thông báo';
+$lang['Number of items'] = 'Số lượng hình';
+$lang['Original dimensions'] = 'Độ phân giải gốc';
+$lang['Password forgotten'] = 'Quên mật khẩu';
+$lang['Password'] = 'Mật khẩu';
+$lang['Post date'] = 'Ngày gởi hình';
+$lang['Posted on'] = 'Gởi vào';
+$lang['Profile'] = 'Hồ sơ';
+$lang['Quick connect'] = 'Kết nối nhanh';
+$lang['RSS feed'] = 'Bản tin RSS';
+$lang['Register'] = 'Đăng ký';
+$lang['Registration'] = 'Mục đăng ký';
+$lang['Related tags'] = 'Tag liên quan';
+$lang['Reset'] = 'Làm lại';
+$lang['Retrieve password'] = 'Nhận lại mật khẩu';
+$lang['Search rules'] = 'Điều khoản tìm kiếm';
+$lang['Search tags'] = 'Tag tìm kiếm';
+$lang['Search'] = 'Tìm kiếm';
+$lang['display available tags'] = 'Xem các tag được dùng';
+$lang['Since'] = 'Từ';
+$lang['Sort by'] = 'Sắp xếp theo';
+$lang['Sort order'] = 'Vị trí sắp xếp';
+$lang['Tag'] = 'Thẻ';
+$lang['Tags'] = 'Thẻ';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'Bản thông báo bản tin RSS cung cấp thông báo về tin tức và cập nhật trên trang này bao gồm: hình ảnh mới, đề mục được cập nhật và lời bình mới. Hãy sử dụng trình đọc tin RSS.';
+$lang['Unknown feed identifier'] = 'Nguồn cung cấp tin không xác nhận';
+$lang['User comments'] = 'Bình luận của thành viên';
+$lang['Username'] = 'Tên đăng nhập';
+$lang['Visits'] = 'Thăm quan';
+$lang['Webmaster'] = 'Quản trị';
+$lang['Week %d'] = 'Tuần %d';
+$lang['About Piwigo'] = 'Thông tin về Piwigo';
+$lang['You are not authorized to access the requested page'] = 'Bạn không được phép truy cập vào trang này';
+$lang['add this photo to your favorites'] = 'thêm hình này vào danh sách ưa thích của mình';
+$lang['Administration'] = 'Điều hành viên';
+$lang['all'] = 'tất cả';
+$lang['ascending'] = 'từ dưới lên';
+$lang['author(s) : %s'] = 'tác giả: %s';
+$lang['Expand all albums'] = 'Mở rộng các đề mục';
+$lang['posted after %s (%s)'] = 'gởi sau %s (%s)';
+$lang['posted before %s (%s)'] = 'gởi trước %s (%s)';
+$lang['posted between %s (%s) and %s (%s)'] = 'gởi vào giữa %s (%s) và %s (%s)';
+$lang['posted on %s'] = 'gởi vào %s';
+$lang['Best rated'] = 'Hình được đánh giá tốt nhất';
+$lang['display best rated photos'] = 'hiển thị các hình được đánh giá tốt nhất';
+$lang['Calendar'] = 'Xem hình theo lịch';
+$lang['All'] = 'Tất cả';
+$lang['display each day with photos, month per month'] = 'hiển thị mỗi ngày kèm hình ảnh, tháng trên tháng';
+$lang['View'] = 'Xem';
+$lang['chronology_monthly_calendar'] = 'Lịch hằng tháng';
+$lang['chronology_monthly_list'] = 'Danh sách hằng tháng';
+$lang['chronology_weekly_list'] = 'Danh sách hằng tuần';
+$lang['Click here if your browser does not automatically forward you'] = 'Nhắp chuột vào đây nếu trình duyệt web không tự động chuyển trang';
+$lang['comment date'] = 'ngày bình luận';
+$lang['Comment'] = 'Bình luận';
+$lang['Your comment has been registered'] = 'Lời bình của bạn đã được đăng ký';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = 'Hệ thống bảo vệ DDOS: vui lòng đợi trong giây lát trước khi gởi lời bình khác';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = 'Lời bình của bạn KHÔNG thể gửi được vì nó không đáp ứng được các điều khoản';
+$lang['An administrator must authorize your comment before it is visible.'] = 'Lời bình của bạn phải được quản trị viên xác nhận trước khi nó hiển thị trên gallery.';
+$lang['This login is already used by another user'] = 'Tài khoản đã được đăng ký trước đây';
+$lang['Comments'] = 'Lời bình';
+$lang['Add a comment'] = 'Thêm lời bình';
+$lang['created after %s (%s)'] = 'đã tạo sau %s (%s)';
+$lang['created before %s (%s)'] = 'đã tạo trước %s (%s)';
+$lang['created between %s (%s) and %s (%s)'] = 'đã tạo giữa %s (%s) và %s (%s)';
+$lang['created on %s'] = 'đã tạo vào %s';
+$lang['Customize'] = 'Tuỳ chọn';
+$lang['Your Gallery Customization'] = 'Tuỳ chọn cho Gallery của bạn ';
+$lang['day'][0] = 'Chủ Nhật';
+$lang['day'][1] = 'Thứ Hai';
+$lang['day'][2] = 'Thứ Ba';
+$lang['day'][3] = 'Thứ Tư';
+$lang['day'][4] = 'Thứ Năm';
+$lang['day'][5] = 'Thứ Sáu';
+$lang['day'][6] = 'Thứ Bảy';
+$lang['Default'] = 'Mặc định';
+$lang['delete this photo from your favorites'] = 'xoá hình này từ danh sách ưa thích của bạn';
+$lang['Delete'] = 'Xoá bỏ';
+$lang['descending'] = 'từ trên xuống';
+$lang['Download'] = 'Tải về';
+$lang['Download this file'] = 'tải về file này';
+$lang['edit'] = 'biên tập';
+$lang['wrong date'] = 'sai ngày tháng';
+$lang['excluded'] = 'bao gồm';
+$lang['Your favorites'] = 'Mục ưa thích của tôi';
+$lang['display your favorites photos'] = 'hiển thị những hình ưa thích của tôi';
+$lang['Favorites'] = 'Danh sách ưa thích';
+$lang['First'] = 'Đầu tiên';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = 'Gallery đã tạm khoá để bảo trì định kỳ. Mời bạn ghé lại sau.';
+$lang['Page generated in'] = 'Trang được tạo trong vòng';
+$lang['guest'] = 'khách';
+$lang['Hello'] = 'Xin chào';
+$lang['available for administrators only'] = 'chỉ dành cho Quản trị';
+$lang['display this album'] = 'hiện hình này ở phía trên của đề mục';
+$lang['display last user comments'] = 'Xem bình luận gần nhất';
+$lang['customize the appareance of the gallery'] = 'tuỳ chọn giao diện hiển thị của gallery';
+$lang['search'] = 'tìm kiếm';
+$lang['Home'] = 'Trang chủ';
+$lang['in this album'] = 'trong mục này';
+$lang['in %d sub-album'] = 'trong %d mục nhỏ';
+$lang['in %d sub-albums'] = 'trong %d các mục nhỏ';
+$lang['included'] = 'bao gồm';
+$lang['Invalid password!'] = 'Sai mật khẩu!';
+$lang['Language']='Ngôn ngữ';
+$lang['last %d days'] = '%d ngày cuối';
+$lang['Last'] = 'Cuối';
+$lang['Logout'] = 'Thoát';
+$lang['obligatory'] = 'Phần bắt buộc';
+$lang['Maximum photo height'] = 'Chiều cao tối đa của hình';
+$lang['Maximum height must be a number superior to 50'] = 'Chiều cao tối đa của hình phải trên 50 pixel';
+$lang['Maximum photo width'] = 'Chiều rộng tối đa của hình';
+$lang['Maximum width must be a number superior to 50'] = 'Chiều rộng tối đa của hình phải trên 50 pixel';
+$lang['display a calendar by creation date'] = 'hiển thị lịch theo ngày gởi hình';
+$lang['display all photos in all sub-albums'] = 'hiển thị mọi thành phần có trong tất cả mục nhỏ';
+$lang['return to normal view mode'] = 'chuyện lại chế độ xem hình bình thường';
+$lang['display a calendar by posted date'] = 'hiển thị lịch theo ngày gởi hình';
+$lang['month'][10] = 'Tháng Mười';
+$lang['month'][11] = 'Tháng Mười Một';
+$lang['month'][12] = 'Tháng Mười Hai';
+$lang['month'][1] = 'Tháng Giêng';
+$lang['month'][2] = 'Tháng Hai';
+$lang['month'][3] = 'Tháng Ba';
+$lang['month'][4] = 'Tháng Tư';
+$lang['month'][5] = 'Tháng Năm';
+$lang['month'][6] = 'Tháng Sáu';
+$lang['month'][7] = 'Tháng Bảy';
+$lang['month'][8] = 'Tháng Tám';
+$lang['month'][9] = 'Tháng Chín';
+$lang['Most visited'] = 'Hình được xem nhiều nhất';
+$lang['display most visited photos'] = 'hiển thị những hình được xem nhiều nhất';
+$lang['Unknown identifier'] = 'Định danh không xác định';
+$lang['New password'] = 'Mật khẩu mới';
+$lang['Rate this photo'] = 'Đánh giá hình này';
+$lang['Next'] = 'Tiếp theo';
+$lang['no rate'] = 'không có đánh giá';
+$lang['Photos posted within the last %d day.'] = 'Thành phần được gởi trong vòng %d ngày cuối.';
+$lang['Photos posted within the last %d days.'] = 'Các thành phần được gởi trong %d ngày cuối.';
+$lang['password updated'] = 'mật khẩu đã được cập nhật';
+$lang['Recent period must be a positive integer value'] = 'Chu kỳ gần đây phải có giá trị là số nguyên dương';
+/* DEPRECATED USED IN comments.php FOR image_id ? */ $lang['photo'] = 'hình ảnh';
+$lang['Click on the photo to see it in high definition'] = 'Click lên hình để xem ở định dạng cao';
+$lang['Show file metadata'] = 'Hiển thị metadata của hình';
+$lang['Powered by'] = 'Sản phẩm của';
+$lang['Preferences'] = 'Tuỳ chọn thêm';
+$lang['Previous'] = 'Trước';
+$lang['Random photos'] = 'Hình ngẫu nhiên';
+$lang['display a set of random photos'] = 'hiển thị một bộ các hình ngẫu nhiên';
+$lang['Recent albums'] = 'Các đề mục gần đây';
+$lang['display recently updated albums'] = 'hiển thị các đề mục gần đây';
+$lang['Recent period'] = 'Chu kỳ gần đây';
+$lang['Recent photos'] = 'Các hình gần đây';
+$lang['display most recent photos'] = 'hiển thị các hình gần đây nhất';
+$lang['Redirection...'] = 'Chuyển trang...';
+$lang['Please, enter a login'] = 'Vui lòng nhập tên tài khoản';
+$lang['login mustn\'t end with a space character'] = 'tên tài khoản không được có ký tự trắng sau cùng';
+$lang['login mustn\'t start with a space character'] = 'tên tài khoản không được có ký tự trắng đầu tiên';
+$lang['this login is already used'] = 'tài khoản này đã được đăng ký trước đó';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'địa chỉ email phải có dạng xxx@yyy.eee (ví dụ : jack@altern.org)';
+$lang['please enter your password again'] = 'vui lòng nhập lại mật khẩu';
+$lang['Auto login'] = 'Tự động đăng nhập';
+$lang['remove this tag from the list'] = 'bỏ tag này khỏi danh sách';
+$lang['representative'] = 'đại diện';
+$lang['Search for Author'] = 'Tìm kiếm theo tác giả';
+$lang['Search in albums'] = 'Tìm kiếm trong các đề mục';
+$lang['Search by date'] = 'Tìm kiếm theo ngày tháng';
+$lang['Date'] = 'Ngày tháng';
+$lang['End-Date'] = 'Ngày kết thúc';
+$lang['Kind of date'] = 'Kiểu ngày tháng';
+$lang['Search for words'] = 'Tìm kiếm theo từ';
+$lang['Search for all terms'] = 'Tìm kiếm tất cả các mục ';
+$lang['Search for any term'] = 'Tìm kiếm mọi mục';
+$lang['Empty query. No criteria has been entered.'] = 'Truy vấn xác định. Không có từ khoá nào được nhập';
+$lang['Search results'] = 'Kết quả tìm kiếm';
+$lang['Search in sub-albums'] = 'Tìm kiếm trong các mục nhỏ';
+$lang['searched words : %s'] = 'những từ khoá được tìm kiếm : %s';
+$lang['Contact'] = 'Liên hệ';
+$lang['set as album representative'] = 'đặt như là một đề mục đại diện';
+$lang['Show number of comments'] = 'Hiện số lần hình luận';
+$lang['Show number of hits'] = 'Hiện số lần xem';
+$lang['slideshow'] = 'trình chiéu';
+$lang['stop the slideshow'] = 'dừng trình chiếu';
+$lang['Specials'] = 'Đặc biệt';
+$lang['SQL queries in'] = 'Truy vấn SQL trong';
+$lang['display only recently posted photos'] = 'chỉ hiển thị những hình vừa được gởi';
+$lang['return to the display of all photos'] = 'trở lại hiển thị tất cả các hình';
+$lang['the beginning'] = 'bắt đầu';
+$lang['Interface theme'] = 'Giao diện';
+$lang['Thumbnails'] = 'Hình nhỏ';
+$lang['Menu'] = 'Trình đơn';
+$lang['A comment on your site'] = 'Một lời bình trên trang của bạn';
+$lang['today'] = 'hôm nay';
+$lang['Update your rating'] = 'Cập nhật xếp hạng của bạn';
+$lang['the username must be given'] = 'Phải có tên của thành viên';
+$lang['useful when password forgotten'] = 'có ích khi bị mất mật khẩu';
+$lang['Quick search'] = 'Tìm kiếm nhanh';
+$lang['Connected user: %s'] = 'Thành viên kết nối: %s';
+$lang['IP: %s'] = 'Địa chỉ IP: %s';
+$lang['Browser: %s'] = 'Trình duyệt: %s';
+$lang['Author: %s'] = 'Tác giả: %s';
+$lang['Comment: %s'] = 'Bình luận: %s';
+$lang['Comment by %s'] = 'Bình luận bởi %s';
+$lang['User: %s'] = 'Tài khoản: %s';
+$lang['Email: %s'] = 'Địa chỉ email: %s';
+$lang['Admin: %s'] = 'Quản trị: %s';
+$lang['Registration of %s'] = 'Mục đăng ký của %s';
+$lang['Album: %s'] = 'Đề mục: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = 'Status xấu đối với thành viên đăng thuộc nhóm "khách", sử dụng status mặc định. Thông báo ngay cho Quản trị';
+$lang['this email address is already in use'] = 'đã có thành viên sử dụng địa chỉ email này';
+$lang['Album results for'] = 'Kết quả đề mục cho';
+$lang['Tag results for'] = 'Kết quả tag cho';
+$lang['from %s to %s'] = 'từ %s đến %s';
+$lang['Play of slideshow'] = 'Bật trình chiếu';
+$lang['Pause of slideshow'] = 'Tạm dừng trình chiếu';
+$lang['Repeat the slideshow'] = 'Lặp lại trình chiếu';
+$lang['Not repeat the slideshow'] = 'Không lặp lại trình chiếu';
+$lang['Reduce diaporama speed'] = 'Giảm tốc độ xem hình tự động';
+$lang['Accelerate diaporama speed'] = 'Tăng tốc độ xem hình tự động';
+$lang['Submit'] = 'Chấp nhận';
+$lang['Yes'] = 'Có';
+$lang['No'] = 'Không';
+$lang['%d photo']='%d hình';
+$lang['%d photos']='%d hình';
+$lang['%d photo is also linked to current tags'] = '%d hình được liên kết với tag hiện tại';
+$lang['%d photos are also linked to current tags'] = '%d hình được liên kết với tag hiện tại';
+$lang['display photos linked to this tag'] = 'Chỉ xem những hình liên kết với tag này';
+$lang['photos posted during the last %d days'] = 'hình được gởi trong vòng %d ngày cuối';
+$lang['Piwigo Help'] = 'Trợ giúp của Piwigo';
+$lang['Rank'] = 'Hạng';
+$lang['group by letters'] = 'phân nhóm theo ký tự';
+$lang['letters'] = 'ký tự';
+$lang['cloud'] = 'mây';
+$lang['Reset to default values'] = 'Thiết lập lại giá trị mặc định';
+$lang['delete all photos from your favorites'] = 'xoá tất cả hình từ danh sách ưa thích';
+$lang['Sent by'] = 'Được gởi bởi';
+$lang['Are you sure?'] = 'Bạn có chắc không?';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = 'Cookies đã bị chặn lại hoặc không được trình duyệt web trên  máy bạn hỗ trợ. Bạn phải mở cookie để tiếp tục.';
+$lang['Edit a comment'] = 'Biên tập một lời bình';
+$lang['(!) This comment requires validation'] = '(!) Lời bình này yêu cầu sự xác nhận';
+$lang['Welcome'] = 'Xin chào';
+$lang['Welcome to your Piwigo photo gallery!'] = 'Chào mừng bạn đến gallery Piwigo trực tuyến của mình!';
+$lang['... or browse your empty gallery'] = '... hoặc duyệt gallery chưa có hình của bạn';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... hoặc vui lòng vô hiệu hóa thông điệp này, tôi tự tìm cách giải quyết riêng';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = 'Xin chào %s, gallery Piwigo của bạn hiện tại vẫn chưa có tấm hình nào!';
+$lang['I want to add photos'] = 'Tôi muốn thêm hình vào gallery';
+$lang['Manage this user comment: %s'] = 'Quản lý lời bình của thành viên này: %s';
+$lang['Email address is missing. Please specify an email address.'] = 'Còn thiếu địa chỉ email. Vui lòng cho biết một địa chỉ email.';
+$lang['This author modified following comment:'] = 'Tác giả này đã soạn lại lời bình sau:';
+$lang['This author removed the comment with id %d'] = 'Tác giả này đã xóa bỏ lời bình có ID là %d';
+$lang['show tag cloud'] = 'hiển thị thẻ mây';
+$lang['html tags are not allowed in login'] = 'thẻ html không được phép dùng để đăng nhập';
+$lang['The number of photos per page must be a not null scalar'] = 'Số hình trên mỗi trang phải là số nguyên khác 0';
+$lang['Number of photos per page'] = 'Số hình trên mỗi trang';
+$lang['%d rates'] = '%d hạng';
+$lang['Rating score'] = 'Bảng xếp hạng';
+$lang['Invalid username or email'] = 'Tên người dùng hoặc địa chỉ email không hợp lệ';
+$lang['Password reset is not allowed for this user'] = 'Không được phép đặt lại mật khẩu cho người dùng này';
+$lang['User "%s" has no email address, password reset is not possible'] = 'Người dùng "%s" không có địa chỉ email, nên việc đặt lại mật khẩu là không thể được';
+$lang['Someone requested that the password be reset for the following user account:'] = 'Có người yêu cầu đặt lại mật khẩu cho những người dùng sau:';
+$lang['Username "%s" on gallery %s'] = 'Người dùng "%s" trên thư viện hình %s';
+$lang['To reset your password, visit the following address:'] = 'Để đặt lại mật khẩu, hãy vào những địa chỉ sau:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = 'Nếu đây là do nhầm lẫn, thì chỉ việc bỏ qua bỏ qua email này và không có việc gì sẽ xảy ra.';
+$lang['Password Reset'] = 'Cài đặt lại mật khẩu';
+$lang['Check your email for the confirmation link'] = 'Kiểm tra email để nhận liên kết xác nhận';
+$lang['Invalid key'] = 'Key không hợp lệ';
+$lang['The passwords do not match'] = 'Mật khẩu không trùng';
+$lang['Your password has been reset'] = 'Mật khẩu của bạn đã được đặt lại';
+$lang['Return to home page'] = 'Trở lại trang chủ';
+$lang['Please enter your username or email address.'] = 'Vui lòng nhập tên người dùng và địa chỉ email.';
+$lang['You will receive a link to create a new password via email.'] = 'Bạn sẽ nhận được một liên kết để tạo mật khẩu mới qua email.';
+$lang['Username or email'] = 'Người dùng hoặc email';
+$lang['Change my password'] = 'Đổi mật khẩu của tôi';
+$lang['Enter your new password below.'] = 'Nhập mật khẩu mới của bạn ở dưới.';
+$lang['EXIF Metadata'] = 'Lý lịch dữ liệu EXIF';
+$lang['IPTC Metadata'] = 'Lý lịch dữ liệu IPTC';
+$lang['Edit'] = 'Biên tập';
+$lang['Hello %s,'] = 'Xin chào %s,';
+$lang['Send my connection settings by email'] = 'Gởi thiết lập kết nối của tôi qua email';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = 'Đã đăng ký thành công, bạn sẽ nhận được ngay email kèm theo thiết lập kết nối. Xin chào mừng!';
+$lang['Username modification'] = 'Điều chỉnh tên đăng nhập';
+$lang['Your username has been successfully changed to : %s'] = 'Tên đăng nhập của bạn đã được đổi sang : %s thành công';
+$lang['square'] = 'Hình vuông';
+$lang['thumb'] = 'Hình thu nhỏ';
+$lang['small'] = 'Nhỏ';
+$lang['medium'] = 'Vừa';
+$lang['large'] = 'Lớn';
+$lang['xlarge'] = 'Rất lớn';
+$lang['xxlarge'] = 'Cực lớn';
+$lang['Original'] = 'Bản gốc';
+$lang['Thank you for registering at %s!'] = 'Cảm ơn bạn đã đăng ký tại %s!';
+$lang['Here are your connection settings'] = 'Đây là thiết lập kết nối của bạn';
+$lang['Password: %s'] = 'Mật khẩu: %s';
+$lang['Username: %s'] = 'Tên đăng nhập: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = 'Nếu bạn nghĩ bạn đã nhận nhầm emai, vui lòng liên hệ với chúng tôi qua %s';
+$lang['Show oldest comments first'] = 'Hiển thị những lời bình trước nhất đầu tiên';
+$lang['Show latest comments first'] = 'Hiển thị những lời bình mới nhất đầu tiên';
+$lang['Photo sizes'] = 'Kích thước ảnh';
+$lang['View in'] = 'Xem ảnh ở';
+$lang['Mobile'] = 'Di động';
+$lang['2small'] = 'XXS - nhỏ';
+$lang['xsmall'] = 'XS - cực nhỏ';
+$lang['Desktop'] = 'Desktop';
+$lang['File name, A &rarr; Z'] = 'Tên tệp tin, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = 'Tên tệp tin, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = 'Tựa đề ảnh, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = 'Tựa đề ảnh, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = 'Ngày tháng khởi tạo, mới &rarr; cũ';
+$lang['Date created, old &rarr; new'] = 'Ngày tháng khởi tạo, cũ &rarr; mới';
+$lang['Date posted, new &rarr; old'] = 'Ngày tháng gởi ảnh, mới&rarr; cũ';
+$lang['Date posted, old &rarr; new'] = 'Ngày tháng gởi ảnh, cũ &rarr; mới';
+$lang['Rating score, high &rarr; low'] = 'Tỉ lệ xếp hạng, cao &rarr; thấp';
+$lang['Rating score, low &rarr; high'] = 'Tỉ lệ xếp hạng, thấp &rarr; cao';
+$lang['Visits, high &rarr; low'] = 'Số lần xem, cao &rarr; thấp';
+$lang['Visits, low &rarr; high'] = 'Số lần xem, thấp &rarr; cao';
+$lang['Numeric identifier, 1 &rarr; 9'] = 'Ký hiệu nhận dạng số học, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = 'Ký hiệu nhận dạng số học, 9 &rarr; 1';
+$lang['Manual sort order'] = 'Sắp xếp vị trí thủ công';
+
+?>
Index: tags/2.4.0RC3/language/vi_VN/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/vi_VN/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,23 @@
+<p>Một vài cách để thêm ảnh vào thư viện hình của bạn:</p>
+
+<ul>
+  <li><strong>Gởi trực tiếp</strong> từ trình duyệt của bạn là cách đơn giản và nhanh nhất. Nó phụ thuộc vào tính tương thích của trình duyệt và máy chủ web của bạn.
+ .Đối với một lượng ảnh lớn, hoặc trong trường hợp bạn sặp phải vấn đề nào đó thì bạn có thể thử những cách sau đây!</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">Vào mục Gởi trực tiếp</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> là một ứng dụng desktop, được cài vào máy của bạn. Kéo và thả ảnh vào cửa sổ của pLoader, click vào <em>"Gởi hình lên Piwigo"</em> và để pLoader thực hiện công việc. Bạn có thể tìm thấy các ứng dụng desktop khác như <strong>WinToPiwigo</strong> hoặc <strong>Digikam</strong> để xuất plugin sang Piwigo.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">Chuyển đến pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>Chuyển ảnh bằng FTP </strong> là cách được khuyến cáo nhất để thêm một số lượng lớn các bức ảnh với số lần click chuột ít nhất. Theo chỉ dẫn để chuẩn bị ảnh.
+  Cách gởi ảnh thông qua FTP này cho phép bạn điều khiển chính xác cơ cấu vật lý của những tấm ảnh trên máy chủ của bạn.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">Chuyển đến FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/vi_VN/help/index.php
===================================================================
--- tags/2.4.0RC3/language/vi_VN/help/index.php	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/help/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/language/vi_VN/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/vi_VN/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/install.lang.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = 'Cài đặt';
+$lang['Basic configuration'] = 'Cấu hình cơ bản';
+$lang['Default gallery language'] = 'Ngôn ngữ hiển thị gallery mặc định';
+$lang['Database configuration'] = 'Cấu hình cơ sở dữ liệu';
+$lang['Admin configuration'] = 'Cấu hình Quản trị';
+$lang['Start Install'] = 'Bắt đầu Cài đặt';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = 'địa chỉ thư điện tử phải có dạng xxx@yyy.eee (ví dụ : jack@altern.org)';
+$lang['Webmaster login'] = 'Đăng nhập của Webmaster';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = 'Khách thăm quan gallery sẽ thấy được thông tin của Webmaster. Điều này cần thiết cho Quản trị Webmaster';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = 'Kết nối thành công vào máy chủ, nhưng không thể kết nối vào cơ sở dữ liệu.';
+$lang['Can\'t connect to server'] = 'Không thể kết nối vào máy chủ';
+
+$lang['Host'] = 'Máy chủ MySQL';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = 'Người dùng';
+$lang['user login given by your host provider'] = 'thông tin đăng nhập của người dùng do nhà cung cấp máy chủ của của bạn đưa ra.';
+$lang['Password'] = 'Mật khẩu';
+$lang['user password given by your host provider'] = 'mật khẩu người dùng do nhà cung cấp máy chủ của bạn đưa ra';
+$lang['Database name'] = 'Tên cơ sở dữ liệu';
+$lang['also given by your host provider'] = 'cũng được cấp bởi nhà cung cấp máy chủ';
+$lang['Database table prefix'] = 'Tiếp đầu ngữ của các bảng trong cơ sở dữ liệu';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = 'tên các bảng trong cơ sở dữ liệu sẽ được thêm vào đầu bằng tiếp đầu ngữ (giúp bạn quản lý các bảng trong cơ sở dữ liệu được tốt hơn)';
+$lang['enter a login for webmaster'] = 'nhập tên đăng nhập của Webmaster';
+$lang['webmaster login can\'t contain characters \' or "'] = 'đăng nhập của Webmaster không thể chứa các ký tự hoặc';
+$lang['please enter your password again'] = 'vui lòng nhập lại mật khẩu của bạn';
+$lang['Webmaster password'] = 'Mật khẩu của Webmaster';
+$lang['Keep it confidential, it enables you to access administration panel'] = 'Bảo quản kỹ thông tin này, nó cho phép bạn truy cập vào Bảng điều khiển của Quản trị.';
+$lang['Password [confirm]'] = 'Mật khẩu [xác nhận]';
+$lang['verification'] = 'xác nhận';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = 'Cần trợ giúp ? Hãy gởi thắc mắc của bạn tại <a href="%s">diễn đàn của Piwigo</a>.';
+$lang['Webmaster mail address'] = 'Địa chỉ thư điện tử của Webmaster';
+$lang['Visitors will be able to contact site administrator with this mail'] = 'Khách tham quan có thể liên lạc với Quản trị thông qua địa chỉ thư điện tử này.';
+$lang['PHP 5 is required'] = 'Phải có PHP 5 ';
+$lang['It appears your webhost is currently running PHP %s.'] = 'Do máy chủ web của bạn đang chạy phiên bản PHP  %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo sẽ thử chuyển cấu hình của bạn sang PHP 5 bằng cách tạo ra hoặc biên tập một file .htaccess.';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = 'Chú ý rằng bạn có thể tự thay đổi cấu hình và khởi động lại Piwigo sau đó.';
+$lang['Try to configure PHP 5'] = ' Thử cấu hình PHP 5';
+$lang['Sorry!'] = 'Rất tiếc!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo không thể cấu hình cho PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = "Bạn nên yêu cầu hỗ trợ từ nhà cung cấp máy chủ và tìm hiểu xem nếu có thể tự chuyển được sang phiên bản PHP 5.";
+$lang['Hope to see you back soon.'] = 'Hi vọng nhận được phản hồi của bạn sớm.';
+$lang['Congratulations, Piwigo installation is completed'] = 'Xin chúc mừng, việc cài đặt Piwigo đã hoàn tất';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = 'Một giải pháp khác là chép những dòng text trên và dán chúng vào tệp tin nằm vị trí "local/config/database.inc.php" (Cảnh báo: tệp tin database.inc.php chỉ có những nội dung trong phạm vi nhập text, không được thêm hàng hoặc ký tự nào khác)';
+$lang['Creation of config file local/config/database.inc.php failed.'] = 'Việc tạo ra tệp tin cấu hình local/config/database.inc.php đã bị lỗi.';
+$lang['Download the config file'] = 'Tải tệp tin cấu hình xuống';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = 'Bạn có thể tải tệp tin cấu hình và upload nó vào thư mục local/config của thư mục cài đặt Piwigo.';
+$lang['Just another Piwigo gallery'] = 'Lại thêm một thư viện Piwigo nữa';
+$lang['Welcome to my photo gallery'] = 'Chào mừng bạn đến với thư viện hình của tôi';
+$lang['Welcome to your new installation of Piwigo!'] = 'Chào mừng bạn đến với bản cài đặt mới của Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = 'Đừng do dự  thảo luận tại diễn đàn của chúng tôi để được trợ giúp: %s';
+?>
Index: tags/2.4.0RC3/language/vi_VN/iso.txt
===================================================================
--- tags/2.4.0RC3/language/vi_VN/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Tiếng Việt [VN]
Index: tags/2.4.0RC3/language/vi_VN/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/vi_VN/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/vi_VN/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+// Vietnamese version is translated by Em Ku, Vietnam Piwigor!
+$lang['Upgrade'] = 'Nâng cấp';
+$lang['Upgrade from version %s to %s'] = 'Nâng cấp từ phiên bản %s lên phiên bản %s';
+$lang['Statistics'] = 'Thống kê';
+$lang['total upgrade time'] = 'tổng thời gian nâng cấp';
+$lang['total SQL time'] = 'tổng thời gian truy vấn SQL';
+$lang['SQL queries'] = 'Truy vấn SQL';
+$lang['Upgrade informations'] = 'Thông tin bản nâng cấp';
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = 'Chạy chế độ kiểm tra bảo trì trong mục [Administration>Tools>Maintenance] trong trường hợp bạn gặp lỗi.';
+$lang['Only administrator can run upgrade: please sign in below.'] = 'Chỉ có Quản trị mới có thể nâng cấp: vui lòng đăng nhập trước.';
+$lang['You do not have access rights to run upgrade'] = 'Bạn không có đủ quyền hạn để có thể nâng cấp hệ thống';
+$lang['All sub-albums of private albums become private'] = 'Tất cả các đề mục con của những đề mục riêng đều được gán thuộc tính riêng tư.';
+$lang['User permissions and group permissions have been erased'] = 'Sự cho phép người dùng và nhóm người dùng đã được xóa bỏ.';
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = 'Chỉ có hình thu nhỏ đứng trước và địa chỉ email của webmaster mới được lưu lại từ cấu hình của phiên bản cũ.';
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = 'Trang này này nhằm mục đích nâng cấp cơ sở dữ liệu từ phiên bản Piwigo cũ của bạn lên phiên bản mới. Phần hỗ trợ nâng cấp hiểu rằng bạn đang sử dụng <strong>phiên bản %s</strong> (hoặc tương đương).';
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = 'Nhằm đề phòng, những plugins sau đây đã bị vô hiệu hóa. Bạn phải kiểm tra bản nâng cấp của plugin trước khi kích hoạt lại chúng:';
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = 'Trong <i>%s</i>, trước <b>?></b>, chèn vào:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = 'Như một biện pháp dự phòng lỗi, giao diện sau đây đã bị vô hiệu hóa. Bạn phải kiểm tra bản nâng cấp giao diện trước khi kích hoạt lại:';
+
+?>
Index: tags/2.4.0RC3/language/zh_CN/about.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/about.html	(revision 14585)
@@ -0,0 +1,22 @@
+<p>此相册画廊基于Piwigo.</p>
+
+<p>Piwigo是一个网络相册画廊软件，她由一群活跃的社区用户和开发者创建。
+制作Piwigo的自定义扩展非常容易。使Piwigo更为锦上添花的是，
+她还是一个完全免费和开源的项目。</p>
+
+<p id="linkToPiwigo"><a href="http://cn.piwigo.org">浏览Piwigo网站</a></p>
+
+<p>以下是Piwigo的中文翻译与维护人员(以字母排序):
+
+<ul>
+     <li><a href="http://cn.piwigo.org/forum/profile.php?id=5407">eliotpoon</a></li>
+     <li><a href="http://cn.piwigo.org/forum/profile.php?id=5960">maramail/Edouardlicn</a></li>
+     <li><a href="http://cn.piwigo.org/forum/profile.php?id=5666">mzs777</a></li>
+     <li>Ralph.Bai</li>
+     <li><a href="http://cn.piwigo.org/forum/profile.php?id=15253">quqibing</a></li>
+	 <li><a href="http://cn.piwigo.org/forum/profile.php?id=4944">winson</a></li>
+     <li>ZHU</li>
+  </ul>
+     .... 感谢他们！</p>
+
+Last edited by maramail 
Index: tags/2.4.0RC3/language/zh_CN/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_CN/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/admin.lang.php	(revision 14585)
@@ -0,0 +1,904 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d 相关';
+$lang['%d associations'] = '%d 相关';
+$lang['%d album including'] = '%d 相册包含中';
+$lang['%d albums including'] = '%d 相册包含中';
+$lang['%d physical'] = '物理 %d';
+$lang['%d physical'] = '物理 %d ';
+$lang[' and %d virtual'] = ' 和 虚拟 %d ';
+$lang[' and %d virtual'] = ' 和 虚拟 %d ';
+$lang['%d album moved'] = '%d 相册已移动';
+$lang['%d albums moved'] = '%d 相册已移动';
+$lang['%d group'] = '%d 组';
+$lang['%d groups'] = '%d 组';
+$lang['%d member'] = '%d 成员';
+$lang['%d members'] = '%d 成员';
+$lang['%d tag'] = '%d 标签';
+$lang['%d tags'] = '%d 标签';
+$lang['%d user comment rejected'] = '%d 用户评论被删除';
+$lang['%d user comments rejected'] = '%d 用户评论被删除';
+$lang['%d user comment validated'] = '%d 用户评论已确认有效';
+$lang['%d user comments validated'] = '%d 用户评论已确认有效';
+$lang['%d user deleted'] = '%d 用户已删除';
+$lang['%d users deleted'] = '%d 用户已删除';
+$lang['%d user'] = '%d 用户';
+$lang['%d users'] = '%d 用户';
+$lang['%d waiting for validation'] = '%d 等待确认有效';
+$lang['Actions'] = '操作';
+$lang['Activate'] = '激活';
+$lang['Add/delete a permalink'] = '增加/删除一个固定链接';
+$lang['Add a tag'] = '添加标签';
+$lang['Add a user'] = '添加用户';
+$lang['Add group'] = '添加组';
+$lang['Add'] = '添加';
+$lang['Allow user registration'] = '允许用户注册';
+$lang['Apply to sub-albums'] = '应用到子相册';
+$lang['Associated'] = '关联于';
+$lang['Caddie management'] = '标记图片库管理';
+$lang['Caddie'] = '标记图片库';
+$lang['Albums authorized thanks to group associations'] = '相册组织授权感谢协会';
+$lang['Album manual order was saved'] = '相册手工排序已保存';
+$lang['Check for upgrade failed for unknown reasons.'] = '因未知原因导致更新检查失败.';
+$lang['Check for upgrade'] = '检查更新';
+$lang['Comments for all'] = '对所有成员进行评论';
+$lang['Current name'] = '现用名';
+$lang['Database'] = '数据库';
+$lang['Deactivate'] = '注销';
+$lang['Delete Representant'] = '删除代理人';
+$lang['Delete selected tags'] = '删除所选标签';
+$lang['Delete selected users'] = '删除所选用户';
+$lang['Deletions'] = '删除';
+$lang['Deny selected groups'] = '所选组禁止访问';
+$lang['Deny selected users'] = '所选用户禁止访问';
+$lang['Description'] = '描述';
+$lang['Display options'] = '显示选项';
+$lang['Dissociated'] = '取消联系';
+$lang['Does not represent'] = '不需描绘';
+$lang['Edit selected tags'] = '编辑所选标签';
+$lang['Edit tags'] = '编辑标签';
+$lang['Email admins when a new user registers'] = '一旦用户注册就通知管理员';
+$lang['Email admins when a valid comment is entered'] = '当用户发表评论时就通知管理员';
+$lang['Email admins when a comment requires validation'] = '当用户要求确认他的评论时通知管理员';
+$lang['Environment'] = '环境';
+$lang['Form'] = '表单';
+$lang['Gallery title'] = '图库标题';
+$lang['Grant selected groups'] = '对所选组授权';
+$lang['Grant selected users'] = '对所选用户授权';
+$lang['Group name'] = '组名';
+$lang['Groups'] = '组';
+$lang['Guests'] = '游客';
+$lang['History'] = '历史';
+$lang['Informations'] = '信息';
+$lang['Install'] = '安装';
+$lang['Link all album photos to a new album'] = '链接所有相册的图片到新的相册';
+$lang['Link all album photos to some existing albums'] = '链接所有相册的图片到现有的相册';
+$lang['Linked albums'] = '已链接相册';
+$lang['Lock gallery'] = '冻结图库';
+$lang['Maintenance'] = '维护';
+$lang['Edit album permissions'] = '管理相册的权限';
+$lang['Manage permissions for group "%s"'] = '对组 "%s" 进行权限管理';
+$lang['Manage permissions for user "%s"'] = '对用户 "%s" 进行权限管理';
+$lang['Manage tags'] = '标签管理';
+$lang['Members'] = '成员';
+$lang['Metadata synchronized from file'] = '对文件进行元数据同步';
+$lang['Move albums'] = '移动相册';
+$lang['Move'] = '移动';
+$lang['Name'] = '名字';
+$lang['New name'] = '新名';
+$lang['New parent album'] = '新的父相册';
+$lang['New tag'] = '新建标签';
+$lang['Number of comments per page'] = '每页评论数';
+$lang['Number of rates'] = '投票数';
+$lang['Number of thumbnails to create'] = '缩略图数';
+$lang['Only private albums are listed'] = '只列出私有相册';
+$lang['Operating system'] = '操作系统';
+$lang['Options'] = '选项';
+$lang['Other private albums'] = '其他私有相册';
+$lang['Page banner'] = '页标语';
+$lang['Parent album'] = '父相册';
+$lang['Path'] = '路径';
+$lang['Permalink'] = '固定链接';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = '固定链接 %s 已被 %s 相册使用了。请先从固定链接历史记录删除。';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = '固定链接中包含了非法字符（"a-zA-Z0-9", "-", "_" ou "/"）. 禁止使用数字和以"-"开头后面紧跟数字';
+$lang['Permalink %s is already used by album %s'] = '固定链接 %s 已被 %s 相册使用了';
+$lang['Permalink history'] = '固定链接历史记录';
+$lang['Permalinks'] = '固定链接';
+$lang['Permission denied'] = '禁止访问';
+$lang['Permission granted thanks to a group'] = '同组成员可以访问授权类';
+$lang['Permission granted'] = '允许访问';
+$lang['Photo informations updated'] = '图片更新信息';
+$lang['Plugins'] = '插件';
+$lang['Position'] = '位置';
+$lang['Preferences'] = '个人偏好';
+$lang['Properties'] = '属性';
+$lang['Random photo'] = '随机';
+$lang['Rate date'] = '投票日期';
+$lang['Rating by guests'] = '游客投票数';
+$lang['Rating'] = '投票';
+$lang['Reject'] = '取消';
+$lang['Representant'] = '代理人';
+$lang['Representation of albums'] = '相册代表';
+$lang['Representative'] = '代理人';
+$lang['Represents'] = '代理';
+$lang['Save order'] = '保存排序';
+$lang['Save to permalink history'] = '保存到固定链接的历史记录中';
+$lang['Select at least one album'] = '选择最后一个相册';
+$lang['Select at least one photo'] = '至少选中一张图片';
+$lang['Select at least one user'] = '至少选中一个用户';
+$lang['Show info'] = '显示所有信息';
+$lang['Site manager'] = '网站管理';
+$lang['Status'] = '状态';
+$lang['Statistics'] = '统计';
+$lang['Storage album'] = '存储相册';
+$lang['Sum of rates'] = '总投票分';
+$lang['Tag "%s" already exists'] = '标签 "%s" 已存在';
+$lang['Tag "%s" was added'] = '标签 "%s" 已加入';
+$lang['Tag selection'] = '标签选择';
+$lang['The %d following tags were deleted'] = '下面标签 %d 已删除';
+$lang['Unable to check for upgrade.'] = '不能检查更新.';
+$lang['Uninstall'] = '卸载';
+$lang['Use the default photo sort order (defined in the configuration file)']='使用默认图片排序(在配置文件中定义)';
+$lang['User comments validation'] = '确认用户评论';
+$lang['Users'] = '用户';
+$lang['Validate'] = '确认';
+$lang['Validation'] = '确认';
+$lang['Version'] = '版本';
+$lang['Virtual albums to move'] = '移动虚拟相册';
+$lang['Virtual album name'] = '虚拟相册名称';
+$lang['Webmaster cannot be deleted'] = '不能删除网管帐户';
+$lang['You are running on development sources, no check possible.'] = '您运行的是源码开发版本, 不能检查最新版.';
+$lang['You cannot delete your account'] = "您不能删除自己本身帐号";
+$lang['You cannot move an album in its own sub album'] = '您不能将一个相册移动到其子相册里';
+$lang['You need to confirm deletion'] = '您必须确认删除操作';
+$lang['Associate to album'] = '关联到相册';
+$lang['associate to group'] = '关联到组';
+$lang['Authorized'] = '授权';
+$lang['Add a virtual album'] = '添加一个虚拟相册';
+$lang['Authorize users to add comments on selected albums'] = '让用户可在所选相册里发表评论';
+$lang['The name of an album must not be empty'] = '相册名称不能为空';
+$lang['Lock albums'] = '锁定相册';
+$lang['Private'] = '私有相册';
+$lang['Public'] = '公共相册';
+$lang['Find a new representant by random'] = '随机寻找代理人';
+$lang['Public / Private'] = '公有 / 私有';
+$lang['Manage authorizations for selected albums'] = '管理所选相册的授权';
+$lang['Virtual album added'] = '虚拟相册已添加';
+$lang['Virtual album deleted'] = '虚拟相册已删除';
+$lang['Access type'] = '权限类型';
+$lang['Information data registered in database'] = '信息已保存到数据库中';
+$lang['Default display'] = '默认显示';
+$lang['The gallery URL is not valid.'] = '图库地址不合法.';
+$lang['Main'] = '主页';
+$lang['The number of comments a page must be between 5 and 50 included.'] = '每页用户评论数必须在5和50之间.';
+$lang['Configuration'] = '设置';
+$lang['confirm'] = '设置';
+$lang['Date'] = '日期';
+$lang['delete album'] = '删除相册';
+$lang['Dissociate from album'] = '从相册中删除';
+$lang['dissociate from group'] = '取消组关联';
+$lang['Album updated successfully'] = '相册信息已上传成功.';
+$lang['photos per page'] = '每页图片';
+$lang['High definition enabled'] = '激活高清功能';
+$lang['File'] = '文件';
+$lang['first photo added on %s'] = '于 %s 上传了第一幅图';
+$lang['Forbidden'] = '禁止';
+$lang['global mode'] = '全局模式';
+$lang['group "%s" added'] = '增加 "%s" 组';
+$lang['group "%s" deleted'] = '删除 "%s" 组';
+$lang['group "%s" updated'] = '更新 "%s" 组';
+$lang['The name of a group must not contain " or \' or be empty.'] = '组名不能包含 " 或 \' 并不能为空.';
+$lang['This name is already used by another group.'] = '组名已存在.';
+$lang['High definition'] = '高清';
+$lang['jump to album'] = '跳到相册';
+$lang['jump to photo'] = '跳转到图';
+$lang['leave'] = '留空(默认)';
+$lang['Lock'] = '上锁';
+$lang['Locked'] = '锁定';
+$lang['manage album photos'] = '管理相册里的图片';
+$lang['manage sub-albums'] = '管理子相册';
+$lang['Manage'] = '管理';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = '已超过执行时间, 处理还需时间[估计时间: %d 秒].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = '已超过执行时间, 处理还需时间[估计时间: %d 秒].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = '由于发送用户列表的准备时间受限制,其余用户将不被列出.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = '发送邮件时间有限,其余邮件被忽略.';
+$lang['To send ?'] = '发送?';
+$lang['Last send'] = '最后一次发送';
+$lang['email'] = '邮件';
+$lang['User'] = '用户';
+$lang['See you soon,'] = '再见,';
+$lang['Go to'] = '转至 ';
+$lang['Hello'] = '您好 ';
+$lang['New photos were added'] = '加入一些新图片';
+$lang['on'] = '时间: ';
+$lang['between'] = '时间: ';
+$lang['and'] = ' 至 ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = '网管开通了您的邮件通知功能.';
+$lang['You have subscribed to receiving notifications by mail.'] = '您开通了邮件通知功能.';
+$lang['To subscribe'] = '注册新用户';
+$lang['If you encounter problems or have any question, please send a message to'] = '如有遇到故障或问题,请发邮件至 ';
+$lang['[NBM] Problems or questions'] = '[NBM] 故障或问题';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = '网管取消了您的邮件通知功能.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = '您取消了您的邮件通知功能.';
+$lang[', click on'] = ', 请点击 ';
+$lang['To unsubscribe'] = '注销';
+$lang['With blank value, gallery title will be used'] = '图库标题允许为空';
+$lang['Notification'] = '通知';
+$lang['Error when sending email to %s [%s].'] = '发送邮件 给 %s [%s] 是发生了错误.';
+$lang['Mail sent to %s [%s].'] = '已发送至 %s [%s].';
+$lang['%d mail was sent.'] = '%s 邮件已发送.';
+$lang['%d mails were sent.'] = '%s 邮件已发送.';
+$lang['%d mail was not sent.'] = '%s 邮件未被发送.';
+$lang['%d mails were not sent.'] = '%s 邮件未被发送.';
+$lang['No mail to send.'] = '没有邮件要发送.';
+$lang['There is no available subscribers to mail.'] = '没有用户需要邮件通知.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = '只有当有新图片时,才能使用用户邮件通知功能.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = '任何人都不能使用此标签(网管除外).';
+$lang['No user to send notifications by mail.'] = '没有邮件通知用户.';
+$lang['New photos added'] = '新图片已加入';
+$lang['Subscribe to notification by mail'] = '注册邮件通知功能';
+$lang['Unsubscribe from notification by mail'] = '注销邮件通知功能';
+$lang['Parameter'] = '设置';
+$lang['Continue processing treatment'] = '正在继续处理中...';
+$lang['Complementary mail content'] = '邮件附加内容';
+$lang['Add detailed content'] = '增加细节内容';
+$lang['Send mail as'] = '发送邮件作为';
+$lang['Send mail to users'] = '给用户发送邮件';
+$lang['Send'] = '发送';
+$lang['Options'] = '选项';
+$lang['Subscribed'] = '已注册';
+$lang['Subscribe'] = '注册';
+$lang['Parameters'] = '设置参数';
+$lang['Select recipients'] = '选择接受邮件用户';
+$lang['Subscribe/unsubscribe users'] = '注册/注销用户';
+$lang['Unsubscribed'] = '已注销';
+$lang['%d parameter was updated.'] = '%d 参数已更新.';
+$lang['%d parameters were updated.'] = '%d 等参数已更新.';
+$lang['%d user was not updated.'] = '%d 用户没有被更新.';
+$lang['%d users were not updated.'] = '%d 等用户没有被更新.';
+$lang['User %s [%s] was removed from the subscription list.'] = '用户 %s [%s] 从注册名单中删除.';
+$lang['User %s [%s] was added to the subscription list.'] = '用户 %s [%s] 加入到注册名单中.';
+$lang['%d user was updated.'] = '%d 用户已更新.';
+$lang['%d users were updated.'] = '%d 等用户已更新.';
+$lang['User %s [%s] was not removed from the subscription list.'] = '用户 %s [%s] 没有从注册名单中删除.';
+$lang['User %s [%s] was not added to the subscription list.'] = '用户 %s [%s] 没有加到注册名当中.';
+$lang['User %s [%s] added.'] = '用户 %s [%s] 已加入.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注意, 注册或注销都会给相关用户发送邮件';
+$lang['Send mail on HTML format'] = '以HTML格式发送邮件';
+$lang['Include display of recent photos grouped by dates'] = '包括显示最近按日期分组的图片';
+$lang['Available only with HTML format'] = '只能以HTML格式';
+$lang['no write access'] = '不能写入';
+$lang['Permissions'] = '权限';
+$lang['private'] = '私有';
+$lang['public'] = '公有';
+$lang['Purge never used notification feeds'] = '清除从没使用过的通知回馈';
+$lang['Purge sessions'] = '清除会话';
+$lang['randomly represented'] = '随机显示';
+$lang['registration date'] = '保存日期';
+$lang['clean'] = '清除';
+$lang['Create this site'] = '创建网站';
+$lang['test'] = '测试';
+$lang['test this remote site'] = '测试远端站点';
+$lang['remove tags'] = '删除所有标签';
+$lang['Repair and optimize database'] = '修复和优化数据库';
+$lang['selection'] = '选择';
+$lang['set to'] = '设置为';
+$lang['singly represented'] = '固定显示';
+$lang['This site already exists'] = '此站点已存在';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = '新建远端站点 : (在create_listing_file.php文件中给出url地址)';
+$lang['created'] = '已创建';
+$lang['delete'] = '删除';
+$lang['delete this site and all its attached elements'] = '删除此站点和与其相关联的所有信息';
+$lang['an error happened'] = '发生错误';
+$lang['Local'] = '本地';
+$lang['Remote'] = '远端';
+$lang['update the database from files'] = '根据文件对数据库进行更新';
+$lang['status'] = '状态';
+$lang['Directory'] = '文件夹';
+$lang['sub-albums'] = '子相册';
+$lang['Synchronize metadata'] = '同步元数据';
+$lang['target'] = '目标';
+$lang['Thumbnail'] = '缩略图';
+$lang['title'] = '标题';
+$lang['Album list management'] = '相册管理';
+$lang['Piwigo configuration'] = '配置Piwigo';
+$lang['Edit album'] = '修改一个相册';
+$lang['Group management'] = '组管理';
+$lang['User list'] = '用户名单';
+$lang['Edit photo information'] = '修改图片信息';
+$lang['Database synchronization with files'] = '根据文件来同步数据库';
+$lang['all'] = '所有';
+$lang['height must be a number superior to'] = '图片高度必须超过(整数)';
+$lang['width must be a number superior to'] = '图片长度必须超过(整数)';
+$lang['for the file format'] = '对于文件格式';
+$lang['Photo unreachable or no support'] = '不支持图片格式或无法显示';
+$lang['GD version'] = 'GD版';
+$lang['General statistics'] = '普通统计';
+$lang['average time'] = '平均时间';
+$lang['number of miniaturized photos'] = '创建的缩略图数';
+$lang['total time'] = '总共时间';
+$lang['for this file format'] = '对于此文件格式';
+$lang['unit mode'] = '单一模式';
+$lang['Unlocked'] = '解锁';
+$lang['unset'] = '清空';
+$lang['Update albums informations'] = '上传相册信息';
+$lang['Update photos information'] = '更新图信息';
+$lang['Synchronize'] = '同步';
+$lang['reduce to single existing albums'] = '减少现有的单独相册';
+$lang['Choose an option'] = '选择一个选项';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = '显示最全的信息 (添加相册和图片，删除相册和图片)';
+$lang['Error list'] = '错误清单';
+$lang['Errors caption'] = '错误说明';
+$lang['Detailed informations'] = '详细信息';
+$lang['File/directory read error'] = '文件/文件夹打开错误';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = '无法打开文件或文件夹(要么根本不存在,要么拒绝访问)';
+$lang['albums deleted in the database'] = '相册已从数据库删除';
+$lang['photos deleted from the database'] = '图片已从数据库中删除';
+$lang['photos candidates for metadata synchronization'] = '对应同步元数据的候选图片';
+$lang['photos informations synchronized with files metadata'] = '附有元数据的同步图片信息informations des images synchronisées avec les méta-données';
+$lang['errors during synchronization'] = '同步期间发生错误';
+$lang['albums added in the database'] = '相册已添加到数据库';
+$lang['photos added in the database'] = '增加图片到数据库';
+$lang['photos updated in the database'] = '更新数据库中的图片';
+$lang['Search for new images in the directories'] = '查询文件中的新图片';
+$lang['added'] = '已加入';
+$lang['deleted'] = '已删除';
+$lang['Metadata synchronization results'] = '元数据更新结果';
+$lang['only perform a simulation (no change in database will be made)'] = '只进行模拟操作(不会改变数据库中的任何内容)';
+$lang['Simulation'] = '模拟';
+$lang['directories + files'] = '文件夹 + 文件';
+$lang['only directories'] = '只对文件夹';
+$lang['synchronize files structure with database'] = '同步文件结构和数据库';
+$lang['synchronize files metadata with database photos informations'] = '根据文件元数据同步数据库中的图片信息';
+$lang['even already synchronized photos'] = '包括已经同步的图片';
+$lang['Used metadata'] = '已使用过的元数据';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = '文件夹和文件名称只能包含字母, 数字, "-", "_" 和 "."';
+$lang['wrong filename'] = '文件名出错';
+$lang['Upload'] = '增加';
+$lang['user "%s" added'] = '用户 "%s" 已加入';
+$lang['User status'] = '用户状态';
+$lang['user_status_admin'] = '管理员';
+$lang['user_status_generic'] = '公共用户';
+$lang['user_status_guest'] = '游客';
+$lang['user_status_normal'] = '个人用户';
+$lang['user_status_webmaster'] = '网络超级管理员';
+$lang['Virtual album'] = '虚拟相册';
+$lang['Waiting'] = '等待';
+$lang['default'] = '默认';
+$lang['Toggle \'default group\' property'] = '赋予\'groupe par défaut\'默认组属性';
+$lang['Advanced features'] = '高级功能';
+$lang['Overall'] = '全局视图';
+$lang['Year'] = '年';
+$lang['Month'] = '月';
+$lang['Day'] = '日';
+$lang['Pages seen'] = '已访问过的页面';
+$lang['Time'] = '时间';
+$lang['IP'] = 'IP';
+$lang['Element'] = '图片';
+$lang['Section'] = '区域';
+$lang['An information email was sent to group "%s"'] = '已向组 "%s" 的所有成员发送了信息邮件';
+$lang['Send an information email to group members'] = '向组成员发送一份信息邮件';
+$lang['Group'] = '组';
+$lang['[%s] Visit album %s'] = '[%s] 参观相册 %s';
+$lang['Hello,'] = '您好,';
+$lang['See you soon.'] = '再见.';
+$lang['Discover album:'] = '探索相册:';
+$lang['Mail content'] = '邮件内容';
+$lang['none'] = '无';
+$lang['high'] = '高清';
+$lang['other'] = '其他';
+$lang['Element type'] = "内容类型";
+$lang['Image id'] = '图片标识符';
+$lang['Summary'] = '概述';
+$lang['%d line filtered'] = '%d 行被过滤';
+$lang['%d lines filtered'] = '%d 行被过滤';
+$lang['%d guest'] = '%d 游客';
+$lang['%d guests'] = '%d 游客';
+$lang['Hour'] = '小时';
+$lang['guest'] = '游客';
+$lang['default values'] = '默认值';
+// --------- Starting below: New or revised $lang ---- from version 1.7.1
+$lang['Guest cannot be deleted'] = '不能删除来宾';
+$lang['Default user cannot be deleted'] = '不能删除默认用户';
+$lang['Purge history detail'] = '清除历史记录';
+$lang['Purge history summary'] = '清除历史目录';
+$lang['Check integrity'] = '检查完整性';
+$lang['Anomaly'] = '异常';
+$lang['Correction'] = '修复';
+$lang['Automatic correction'] = '自动修复';
+$lang['Impossible automatic correction'] = '无法自动修复';
+$lang['Correction applied with success'] = '修复成功';
+$lang['Correction applied with error'] = '修复出错';
+$lang['%d anomaly has been detected.'] = '发现了 %d 异常.';
+$lang['%d anomalies have been detected.'] = '发现了 %d 个异常.';
+$lang['%d anomaly has been corrected.'] = '修正了 %d 异常.';
+$lang['%d anomalies have been detected corrected.'] = '修正了 %d 个异常.';
+$lang['%d anomaly has not been corrected.'] = '不能修正 %d 异常.';
+$lang['%d anomalies have not been corrected.'] = '不能修正 %d 个异常.';
+$lang['Go to %s or %s for more informations'] = '获取更多信息，请到 %s 或者 %s ';
+$lang['the forum'] = '论坛';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = ' %s 值不是一个正确文件，因为我们不支持exif格式';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '在配置文件config_local.inc.php中 %s 应该设置为"false"';
+$lang['Main "guest" user does not exist'] = '主要"guest"用户不存在';
+$lang['Main "guest" user status is incorrect'] = '主要"guest"用户状态异常';
+$lang['Default user does not exist'] = '默认帐户不再存在';
+$lang['Main "webmaster" user does not exist'] = '主要网管帐户不再存在';
+$lang['Main "webmaster" user status is incorrect'] = '主要网管用户状态异常';
+$lang['User "%s" created with "%s" like password'] = '用户 "%s" 已创建，密码是"%s"';
+$lang['Status of user "%s" updated'] = '用户 "%s" 状态已更新';
+$lang['add new photos to caddie'] = '把所有新图片放到标记图片库中';
+// --------- Starting below: New or revised $lang ---- from Butterfly
+$lang['No display'] = '不显示缩略图';
+$lang['Classic display'] = '正常显示';
+$lang['Hoverbox display'] = '俯瞰显示';
+$lang['Mail address is obligatory for all users'] = '每个用户必须提供邮箱地址';
+$lang['Minimum privacy level'] = '最小隐私等级';
+$lang['Privacy level'] = '隐私等级';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = '联系人';
+$lang['Level 2'] = '朋友';
+$lang['Level 4'] = '亲戚';
+$lang['Level 8'] = '管理员';
+$lang['Reinitialize check integrity'] = '重新完整性检查';
+$lang['Check all'] = '全选';
+$lang['Uncheck all'] = '取消全选';
+$lang['Check automatic corrections'] = '自动选择';
+$lang['Apply selected corrections'] = '应用自动选择';
+$lang['Ignore selected anomalies'] = '忽视选择异常';
+$lang['Refresh'] = '刷新';
+$lang['The anomaly will be ignored until next application version'] = '此异常将被忽略，待下次版本中解决';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = '异常更正将取消忽略事件';
+$lang['%d anomaly has been ignored.'] = '%d 异常被忽略.';
+$lang['%d anomalies have been ignored.'] = '%d 异常被忽略.';
+$lang['Plugins which need upgrade'] = '必须更新插件';
+$lang['Plugin list'] = '插件列表';
+$lang['Check for updates'] = '检查更新';
+$lang['Other plugins'] = '其他插件';
+$lang['Last revisions'] = '最新修订版';
+$lang['Are you sure you want to install this plugin?'] = '确定安装此插件吗?';
+$lang['Are you sure you want to delete this plugin?'] = '确定要删除此插件吗?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = '确定安装此更新吗? 您必须核实无需卸载操作再进行安装此更新.';
+$lang['Plugin has been successfully copied'] = '插件复制成功.';
+$lang['You might go to plugin list to install and activate it.'] = '在插件列表中安装和启动插件.';
+$lang['Can\'t create temporary file.'] = '无法创建临时文件.';
+$lang['Can\'t download archive.'] = '无法下载归档文件.';
+$lang['Can\'t read or extract archive.'] = '无法读取或解压归档文件.';
+$lang['An error occured during extraction (%s).'] = '在解压文件(%s) 发生错误.';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = '请核实"plugins"文件夹及其子文件夹的权限(CHMOD).';
+$lang['Can\'t connect to server.'] = '无法连接到服务器.';
+$lang['Purge compiled templates'] = '清除编译模板';
+$lang['Support'] = '支持';
+$lang['Documentation'] = '文档';
+$lang['ACCESS_0'] = '自由存取';
+$lang['ACCESS_1'] = '对所有人开放';
+$lang['ACCESS_2'] = '只对注册用户开放';
+$lang['ACCESS_3'] = '只对管理员开放';
+$lang['ACCESS_4'] = '只对网管开放';
+$lang['ACCESS_5'] = '对任何人都不开放';
+$lang['A new version of Piwigo is available.'] = 'Piwigo新版发布.';
+$lang['Piwigo Administration'] = 'Piwigo管理';
+$lang['Piwigo version'] = 'Piwigo版本';
+$lang['You are running the latest version of Piwigo.'] = '您运行的是Piwigo最新版.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = '%s [%s]安装版本跟[%s]版本不兼容';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = '为了获得全部功能，您应该更新系统，否则程序运行不正常。';
+$lang['Deleted on'] = '删除于';
+$lang['Last hit'] =  '最后一次查看';
+$lang['GD library is missing'] = '缺少GD库';
+$lang['Templates'] = '模板';
+$lang['Extend for templates'] = '扩展模板';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = '用位于template-extension文件夹下的用户自定义模板更换原模板';
+$lang['Replacers (customized templates)'] = '自定义模板';
+$lang['Original templates'] = '原模板';
+$lang['Optional URL keyword'] = '可选URL关键字';
+$lang['Templates configuration has been recorded.'] = '模板设置已保存.';
+$lang['All optimizations have been successfully completed.'] = '优化成功.';
+$lang['Optimizations have been completed with some errors.'] = '有些优化发生错误.';
+$lang['Modify information'] = '修改信息';
+$lang['nothing'] = '没有内容';
+$lang['overrides existing values with empty ones'] = '用空数据来删除已存在的数据';
+$lang['Manage photo ranks'] = '管理图片排序';
+$lang['Edit ranks'] = '修改排序方式';
+$lang['No photo in this album'] = '没有图片在此相册里';
+$lang['Images manual order was saved'] = '图片手动排序已保存';
+$lang['ranks'] = '顺序';
+$lang['Drag to re-order'] = '拖放进行排序';
+$lang['Quick Local Synchronization'] = '快速同步';
+$lang['No photo can be deleted'] = '没有图片可以删除';
+$lang['Delete selected photos'] = '删除图片';
+$lang['%d photo was deleted'] = '%d 图片被删除';
+$lang['%d photos were deleted'] = '%d 图片被删除';
+$lang['Downloads'] = '下载';
+$lang['Released on'] = '发布于';
+$lang['Number of downloads'] = '下载次数';
+$lang['Operation in progress'] = '正在处理.';
+$lang['Please wait...'] = '请稍后...';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = '订阅 Piwigo 最新消息，与 Piwigo 项目保持联系。当有新版本发布时，您将会收到邮件通知（有时也包括安全漏洞的修复，这对于升级是很重要的）和项目里一些重要事情的发生。一年里也只有几封邮件。';
+$lang['Password is missing. Please enter the password.'] = '密码没有输入，请输入密码。';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '密码确认未完成，请确认所选定的密码。';
+$lang['Allow users to edit their own comments'] = '允许用户修改自己的评论';
+$lang['Allow users to delete their own comments'] = '允许用户删除自己的评论';
+$lang['Email administrators when a comment is modified'] = '当评论被修改后，发邮件通知管理员';
+$lang['Email administrators when a comment is deleted'] = '当评论被删除后，发邮件通知管理员';
+$lang['Cannot delete the old permalink !'] = '旧的固定链接不能被删除!';
+$lang['Hit'] = '点击';
+$lang['Tools'] = '工具';
+$lang['Photos'] = '图片';
+$lang['Themes'] = '主题';
+$lang['Instructions to use Piwigo'] = 'Piwigo 使用指南';
+$lang['Installed Themes'] = '安装主题';
+$lang['Add New Theme'] = '添加一个新主题';
+$lang['Forbid this theme to users'] = '禁用此主题';
+$lang['Set as default theme for unregistered and new users'] = '设置为未注册者和新用户的默认主题';
+$lang['unknown'] = '未知';
+$lang['Upload Photos'] = '上传图片';
+$lang['Drop into album'] = '添加到相册';
+$lang['+ Add an upload box'] = '+ 添加一个上传框';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = '在您的根目录下创建 "%s" 目录以完成 Piwigo 的安装';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = '给予根目录下的 "%s" 目录写权限 (chmod 777) 以完成 Piwigo 的安装';
+$lang['existing album'] = '现有的相册';
+$lang['create a new album'] = '创建一个新相册';
+$lang['Album name'] = '相册名称';
+$lang['Album "%s" has been added'] = '类别 "%s" 已添加';
+$lang['Uploaded Photos'] = '图片已上传';
+$lang['%d photos uploaded'] = '%d 图片已上传';
+$lang['Privacy level set to "%s"'] = '私有级别设置为 "%s"';
+$lang['Album "%s" now contains %d photos'] = '类别 "%s" 现已包含了 %d 图片';
+$lang['Manage this set of %d photos'] = '管理此设置的 %d 张照片 ';
+$lang['Select files'] = '选择文件';
+$lang['Everybody'] = '每个人';
+$lang['Who can see these photos?'] = '哪些人可以看到这些图片?';
+$lang['Settings'] = '设置';
+$lang['Resize'] = '重置大小';
+$lang['Maximum Width'] = '最大宽度';
+$lang['pixels'] = '像素';
+$lang['Maximum Height'] = '最大高度';
+$lang['Image Quality'] = '图片质量';
+$lang['Save Settings'] = '保存设置';
+$lang['Your configuration settings are saved'] = '您的设置已保存';
+$lang['Active Themes'] = '已激活的主题';
+$lang['Add write access to the "%s" directory'] = '为 "%s" 目录添加写权限';
+$lang['Administration Home'] = '管理员首页';
+$lang['Change Admin Colors'] = '更改管理员后台颜色';
+$lang['Delete this theme'] = '删除此主题';
+$lang['Directory does not exist'] = '目录不存在';
+$lang['Download,'] = '下载,';
+$lang['FTP + Synchronization'] = 'FTP + 同步';
+$lang['Get Support on Piwigo Forum'] = '在Piwigo论坛上获取帮助';
+$lang['Help Me'] = '帮助我';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = '父主题%s丢失，此主题不能被激活。';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = '此主题不能删除，因为其他主题还有依赖与它: %s';
+$lang['Inactive Themes'] = '停用主题';
+$lang['Install on your computer,'] = '安装到您的电脑里,';
+$lang['Make this theme available to users'] = '让用户可使用此主题';
+$lang['Page end'] = '页尾';
+$lang['Piwigo Uploader'] = 'Piwigo上传客户端';
+$lang['Read Piwigo Documentation'] = '阅读Piwigo文档';
+$lang['Start pLoader and add your photos.'] = '开始使用pLoader并添加您的图片.';
+$lang['Switch to clear or dark colors for administration'] = '更改管理员后台为清爽或者炫黑的颜色';
+$lang['Theme has been successfully installed'] = '主题已成功安装';
+$lang['Visit Gallery'] = '浏览画廊';
+$lang['Visit Piwigo project website'] = '浏览 Piwigo 项目网站';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader是<em>Piwigo上传客户端</em> 的官方标准软件。pLoader可将您电脑里的图片上传到Piwigo的图片画廊里。';
+$lang['Guest Settings'] = '游客设置';
+$lang['Main Page'] = '主页';
+$lang['Photo Page'] = '图片页';
+$lang['Activate Navigation Bar'] = '激活导航条';
+$lang['Activate Navigation Thumbnails'] = '激活缩略图导航';
+$lang['Activate icon "%s"'] = '激活图标 "%s"';
+$lang['Photo Properties'] = '图片属性';
+$lang['Allow user customization'] = '允许用户自定义';
+$lang['Languages'] = '语言';
+$lang['Installed Languages'] = '安装语言';
+$lang['Add New Language'] = '添加新语言';
+$lang['Language has been successfully installed'] = '语言已成功安装';
+$lang['Select:'] = '选择:';
+$lang['None'] = '没有';
+$lang['Invert'] = '反选';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = '不能停用此主题，您至少需要使用一个主题.';
+$lang['Webmaster status is required.'] = '必须设置网站管理员.';
+$lang['Bound Theme'] = '绑定主题';
+$lang['Allow rating'] = '允许投票';
+$lang['Select at least one comment'] = '选择最新一个评论';
+$lang['Active Plugins'] = '激活插件';
+$lang['Inactive Plugins'] = '停用插件';
+$lang['Missing Plugins'] = '丢失的插件';
+$lang['Uninstalled Plugins'] = '未安装的插件';
+$lang['By %s'] = '由%s开发';
+$lang['Visit plugin site'] = '浏览插件网站';
+$lang['Active Languages'] = '激活语言';
+$lang['Delete this language'] = '删除此语言';
+$lang['Forbid this language to users'] = '禁止用户使用此语言';
+$lang['Impossible to deactivate this language, first set another language as default.'] = '不能停用此语言，请先设置一个默认语言.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = '不能停用此语言，您必须至少使用一个语言.';
+$lang['Inactive Languages'] = '停用语言';
+$lang['Make this language available to users'] = '让用户可使用此语言';
+$lang['Set as default language for unregistered and new users'] = '设置为游客和新用户的默认语言';
+$lang['Add Photos'] = '添加图片';
+$lang['The following tag was deleted'] = '以下标签已删除';
+$lang['Miscellaneous'] = '杂项';
+$lang['Virtual Links'] = '虚拟链接';
+$lang['There is no other language available.'] = '没有其他可用的语言.';
+$lang['There is no other plugin available.'] = '没有其他可用的插件.';
+$lang['There is no other theme available.'] = '没有其他可用的主题.';
+$lang['Add another set of photos'] = '添加另一组图片';
+$lang['By rank'] = '按等级';
+$lang['Manual order'] = '手工排序';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo最新消息公告';
+$lang['Subscribe %s'] = '订阅%s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = '订阅%s Piwigo中国最新消息公告';
+$lang['Purge search history'] = '清除查寻历史记录';
+$lang['Hide'] = '隐藏';
+$lang['Order of menubar items has been updated successfully.'] = '所有项目已被更新.';
+$lang['This theme was not designed to be directly activated'] = '此主题并未设计为直接激活';
+$lang['Who can see this photo?'] = '查看权限';
+$lang['Pending Comments'] = '审核评论';
+$lang['Menu Management'] = '菜单';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = '在您的 php.ini 文件, 如果 upload_max_filesize (%sB) 大于 post_max_size (%sB), 那么您需要修改此项';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif 扩展不能使用，管理员应该禁用 exif 功能。';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = '上传文件超过了在 php.ini 文件里的 upload_max_filesize 限制: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = '上传文件超过了在 php.ini 文件里的 post_max_size 限制: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = '上传文件超过了在 HTML 表单指定的 MAX_FILE_SIZE 的限制';
+$lang['The uploaded file was only partially uploaded'] = '上传文件只上传了一部分';
+$lang['No file was uploaded'] = '没有文件被上传';
+$lang['Missing a temporary folder'] = '缺少临时文件目录';
+$lang['Failed to write file to disk'] = '文件写入失败';
+$lang['File upload stopped by extension'] = '扩展使文件上传停止';
+$lang['Unknown upload error'] = '未知上传错误';
+$lang['Error on file "%s" : %s'] = '文件上的错误 "%s" : %s';
+$lang['%d of %d photos selected'] = '%d 张/总 %d 图片被选中';
+$lang['Action'] = '动作';
+$lang['Add a filter'] = '添加一个过滤器';
+$lang['Album photos associated to the following albums: %s'] = '图片已关联到以下相册: %s';
+$lang['Albums automatically sorted'] = '相册已自动排序';
+$lang['All %d photos are selected'] = '全部 %d 张图片已选中';
+$lang['Apply action'] = '应用动作';
+$lang['automatic order'] = '自动排序';
+$lang['Batch Manager'] = '批量管理';
+$lang['Choose an action'] = '选择一个动作';
+$lang['Delete orphan tags'] = '删除没被关联的标签';
+$lang['delete photo'] = '删除图片';
+$lang['Duplicates'] = '重复';
+$lang['include child albums'] = '包含子相册';
+$lang['manual order'] = '手工排序';
+$lang['No photo in the current set.'] = '当前集合没有图片.';
+$lang['No photo selected, %d photos in current set'] = '没有选择图片, 当前集合有 %d 张图片';
+$lang['No photo selected, no action possible.'] = '没有选择图片，不会执行任何动作.';
+$lang['on the %d selected photos'] = '在 %d 张已选图片上';
+$lang['Orphan tags deleted'] = '无关联标签已被删除';
+$lang['Refresh photo set'] = '刷新图片集';
+$lang['Remove all filters'] = '删除所有过滤器';
+$lang['remove author'] = '删除作者';
+$lang['remove creation date'] = '删除创建日期';
+$lang['remove this filter'] = '删除此过滤器';
+$lang['remove title'] = '删除标题';
+$lang['Selection'] = '选择';
+$lang['Set author'] = '设置作者';
+$lang['Set creation date'] = '设置创建日期';
+$lang['Set title'] = '设置标题';
+$lang['The whole page'] = '整张图片';
+$lang['The whole set'] = '整个集合';
+$lang['Type here the author name'] = '在此输入作者名称';
+$lang['Type here the title'] = '在此输入标题';
+$lang['Week starts on'] = '星期起始于';
+$lang['You have %d orphan tags: %s.'] = '您有 %d 个无关联标签: %s.';
+$lang['Remove from caddie'] = '从购物蓝里移除';
+$lang['Themes which need upgrade'] = '需更新的主题';
+$lang['Languages which need upgrade'] = '需要更新的语言';
+$lang['All themes are up to date.'] = '所有主题已更新了.';
+$lang['All plugins are up to date.'] = '所有插件已更新了.';
+$lang['All languages are up to date.'] = '所有语言已更新了.';
+$lang['Visit theme site'] = '浏览主题网站';
+$lang['Visit language site'] = '浏览语言网站';
+$lang['New Version'] = '新版本';
+
+
+
+
+$lang['Obsolete Plugins'] = '过期插件';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = '警告，此插件并不适用于这个版本的Piwigo。';
+$lang['Do you want to activate anyway?'] = '您还是想激活吗？';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = '这个插件现在已经是Piwigo核心的一部分，请马上删除它。';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = '错误：这个插件的实际内容已丢失但记录中它已被安装，请马上卸载它。';
+$lang['new'] = '新的';
+$lang['No results'] = '没有结果';
+$lang['Searching...'] = '搜索中...';
+$lang['Type in a search term'] = '输入搜索关键字';
+
+
+$lang['display'] = '显示';
+$lang['Average rate'] = "平均分";
+$lang['Rate'] = "比率";
+$lang['Activate icon "new" next to albums and pictures'] = '激活相册和图片旁边的"新建"图标';
+$lang['Add a criteria'] = '添加一个条件';
+$lang['Deactivate all'] = '解除所有';
+$lang['Default photos order'] = '默认图片排序';
+$lang['Restore'] = '恢复';
+$lang['Restore default configuration. You will lose your plugin settings!'] = '恢复默认的配置，您将失去插件的配置!';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = '您不能设置默认图片的排序，因为您已在本地配置文件里有自定义设置';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = '您已在本地配置文件里定义了 <i>$conf[\'order_by\']</i> , 此参数已不再使用了, 请在 <i>$conf[\'order_by_custom\']</i> 里移除或者改名 !';
+$lang['Thumbnails generation in progress...'] = '正在生成缩略图...';
+$lang['Photos generation in progress...'] = '正在生成图片...';
+$lang['%s photos have been regenerated'] = '%s 图片已被生成';
+$lang['%s photos can not be regenerated'] = '%s 图片不能被生成';
+$lang['Update in progress... Please wait.'] = '正在更新... 请稍等.';
+$lang['Ignore this update'] = '忽略此更新';
+$lang['Reset ignored updates'] = '重置忽略更新';
+$lang['Update All'] = '更新所有';
+$lang['ERROR'] = '错误';
+$lang['Update Complete'] = '更新完毕';
+$lang['Piwigo Update'] = 'Piwigo 更新';
+$lang['Extensions Update'] = '扩展更新';
+$lang['All extensions are up to date.'] = '所有扩展已更新.';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = '以下插件可能与新版 Piwigo 不兼容:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = '以下主题可能与新版 Piwigo 不兼容:';
+$lang['I decide to update anyway'] = '不管怎样，我决定更新';
+$lang['Update to Piwigo %s'] = '更新到 Piwigo %s';
+$lang['Two updates are available'] = '有2个可用更新';
+$lang['This is a minor update, with only bug corrections.'] = '这是一个次要更新,只是对错误的修正.';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = '这是一个重大更新, 和 <a href="%s">令人兴奋的新功能</a>.';
+$lang['Some themes and plugins may be not available yet.'] = '一些主题和插件可能还不能使用.';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = '您可以直接更新到 Piwigo %s, 不需先更新到 Piwigo %s (推荐).';
+$lang['Save Template Directory'] = '保存到模板目录';
+$lang['Dump Database'] = '转存数据库';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = '包括历史数据(注意：可能会超过服务器内存限制)';
+$lang['Unable to dump database.'] = '不能转存数据库.';
+$lang['Some upgrades are available for extensions.'] = '一些可用的扩展更新.';
+$lang['Ignore All'] = '忽略所有';
+$lang['Width'] = '宽度';
+$lang['Height'] = '高度';
+$lang['Follow Orientation'] = '按照方向';
+$lang['Graphics Library'] = '图形库';
+$lang['Show menubar'] = '显示菜单栏';
+$lang['Updates'] = '更新';
+$lang['Crop'] = '剪裁';
+$lang['... or '] = '...或 ';
+$lang['Create'] = '创建';
+$lang['Start Upload'] = '开始上传';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = '您在使用Flash上传工具，出问题了?请尝试<a href="%s">网页上传</a>。';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = '您在使用网页上传方式，出问题了?请尝试<a href="%s">Flash上传工具</a>。';
+$lang['Maximum file size: %sB.'] = '文件最大尺寸: %sB.';
+$lang['Allowed file types: %s.'] = '可上传的文件类型: %s.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = '近乎最大的分辨率: %dM 像素 (that\'s %dx%d pixels).';
+$lang['Manage Permissions'] = '管理查看权限';
+$lang['Learn more'] = '了解更多';
+$lang['Photo %s of %s'] = ' %s中的%s图片';
+$lang['show details'] = '显示详情';
+$lang['hide details'] = '隐藏详情';
+$lang['Merge tags'] = '合并标签';
+$lang['Select the destination tag'] = '选择目的标签';
+$lang['(this tag will be deleted)'] = '（此标签将被删除）';
+$lang['Confirm merge'] = '确认合并';
+$lang['Merge selected tags'] = '合并已选择的标签';
+$lang['No destination tag selected'] = '没有选中的目的标签';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '标签 <em>%s</em> 与标签 <em>%s</em>已合并';
+$lang['Select at least two tags for merging'] = '选择2个以上的标签合并';
+$lang['Select an album'] = '选择一个相册';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = '默认选项中，Piwigo将根据您相册中的高清图片（HD）创建一个新的网页尺寸。';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = '若无高清图片或当前网页尺寸大于重置标准，Piwigo会自动将其作为高清图片进行尺寸重置。';
+$lang['An error has occured during upgrade.'] = '在升级过程中出现了一个错误.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = '在解压程序时出现了一个错误。请检查您 piwigo 安装文件的读写权限.<br><a href="%s">点击此查看错误日志</a>.';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo 不能从服务器中获取升级文件';
+$lang['%s has been successfully updated.'] = '成功更新了%s';
+$lang['Activate comments'] = '激活评论';
+$lang['Add tags'] = '添加标签';
+$lang['Add to caddie'] = '添加';
+$lang['Default comments order'] = '默认评论顺序';
+$lang['Last import'] = '最后导入';
+$lang['Original Size'] = '源大小';
+$lang['Photo name'] = '图片名称';
+$lang['Predefined filter'] = '预定义过滤器';
+$lang['Resize after upload'] = '上传后修改尺寸';
+$lang['Send connection settings by email'] = '发送注册信息到邮箱';
+$lang['The original image quality must be a number between %d and %d'] = '源图片质量必须是在%d和%d之间的数字';
+$lang['The original maximum height must be a number between %d and %d'] = '源图片最大高度必须是在%d和%d之间的数字';
+$lang['The original maximum width must be a number between %d and %d'] = '源图片最大宽度必须是在%d和%d之间的数字';
+$lang['With no album'] = '没有相册';
+$lang['With no tag'] = '没有标签';
+$lang['With no virtual album'] = '没有虚拟相册';
+$lang['Zoom'] = '缩放';
+$lang['A locked gallery is only visible to administrators'] = '被锁定的相册只有管理员能够访问';
+$lang['administrators'] = '管理员';
+$lang['Center of interest'] = '兴趣中心';
+$lang['Gallery unlocked'] = '相册已解锁';
+$lang['modified'] = '已修改';
+$lang['Move to album'] = '移动到相册';
+$lang['Not cropped correctly?'] = '剪裁不正确?';
+$lang['Notify administrators when a comment is'] = '需要通知管理员的评论';
+$lang['pending validation'] = '待验证';
+$lang['registered users'] = '注册用户';
+$lang['Save visits in history for'] = '保存访问记录';
+$lang['simple visitors'] = '游客';
+$lang['This album contains %d photos, added between %s and %s.'] = '这个相册包含%d张图片,添加于%s和%s之间';
+$lang['This album contains %d photos, added on %s.'] = '这个相册包含%d张图片,添加于%s';
+$lang['This album contains no photo.'] = '相册中没有图片';
+$lang['Unlock gallery'] = '解锁相册';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Piwigo Android版</em> 允许您从您的 Android手机或平板电脑连接到Piwigo，创建相册和一次上传多张照片。';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>Piwigo iOS版</em> 允许您从您的iPhone，iPad或iPod Touch连接到Piwigo，创建相册和一次上传多张照片。';
+$lang['Applications'] = '应用程序';
+$lang['apply automatic sort order'] = '应用自动排序';
+$lang['Automatic sort order'] = '自动排序';
+$lang['Available on'] = '可用';
+$lang['Available versions for'] = '可用版本';
+$lang['cancel manual order'] = '取消手动排序';
+$lang['Cancel'] = '取消';
+$lang['List'] = '列表';
+$lang['Piwigo for Android'] = 'Piwigo Android版';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'Piwigo iOS (iPhone, iPad, iPod Touch)版';
+$lang['Save manual order'] = '保存手动排序';
+$lang['Web Form'] = 'Web窗体';
+$lang['You can activate only one mobile theme.'] = '你只能激活一套手机版主题';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '用户 %u 因为在有权限的组中, 所以自动获得权限。';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe公司的Photoshop Lightroom是图片处理软件, 用来管理大量的数字图像和做后期制作工作。';
+$lang['any visitor can see this album'] = '任何游客都可以访问此相册';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture是Mac上一个功能强大的图片管理、编辑工具。';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture用于在iPhoto上进行专业的图片处理。';
+$lang['Delete multiple size images'] = '删除多尺寸图片';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam是Linux，Windows和MacOSX平台上免费的高级数码照片管理软件。';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam可以查看，管理，编辑，增强，组织，标记和共享照片。';
+$lang['Features include gallery browsing, album creation and photo upload.'] = '其特点包括浏览画廊，创作相册和上传照片。';
+$lang['Generate multiple size images'] = '生成多尺寸图片';
+$lang['Groups and users'] = '组和用户';
+$lang['include photos with lower privacy level'] = '包括隐私级别较低的图片';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto是在MacOSX的默认照片管理器。 Piwigo的导出插件可以让您创建新的相册和照片，并直接从iPhoto输出到您的Piwigo相册。';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = '在您的Linux上，只需用安装软件包管理器安装Shotwell并激活Piwigo的发布选项。';
+$lang['Permission granted for groups'] = '为组授予的权限';
+$lang['Permission granted for users'] = '为用户授予的权限';
+$lang['Piwigo export plugin for Aperture'] = 'Piwigo Aperture导出插件';
+$lang['Piwigo export plugin for iPhoto'] = 'Piwigo iPhoto导出插件';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo digiKam发布插件';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo Lightroom发布插件';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo Shotwell发布插件';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid（Android RemoteGallery客户端）是一个开源（GPL V3）的Piwigo Android平台客户端。';
+$lang['Select groups...'] = '选择组';
+$lang['Select users...'] = '选择用户';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell是一个运行在Linux上开源的数码照片管理软件。它是Ubuntu和Fedora的默认照片管理软件。';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo的导出插件允许你创建相册和导出照片。';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo发布插件允许你从Lightroom直接导出和同步照片到您的Piwigo相册。';
+$lang['There is no group in this gallery.'] = '这个画廊中还没有组';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = '只要安装digiKam和Kipi插件， 就可以从digiKam中导出照片到Piwigo';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = '游客需要登录，并有适当的权限才访问这个相册';
+$lang['Apply watermark if height is bigger than'] = '如果高度大于此值则添加水印';
+$lang['Apply watermark if width is bigger than'] = '如果宽度大于此值则添加水印';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = '默认情况下，兴趣中心是摆在中间的照片。';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = '对于剪裁照片大小，如“正方形”，Piwigo将竭尽所能的包括兴趣中心。';
+$lang['No group is permitted to see this private album'] = '没有可以访问这个私有相册的权限组';
+$lang['Opacity'] = '不透明';
+$lang['Permission management'] = '权限管理';
+$lang['Photo sizes with crop'] = '图片剪裁大小';
+$lang['Select a file'] = '选择文件';
+$lang['Select a zone with your mouse to define a new center of interest.'] = '用鼠标选择一个区域，定义一个新的兴趣中心。';
+$lang['The center of interest is the most meaningful zone in the photo.'] = '兴趣中心(焦点)是照片中最有意义的区域。';
+$lang['X Position'] = 'X位置';
+$lang['X Repeat'] = 'X轴平铺';
+$lang['Y Position'] = 'Y位置';
+$lang['add a new watermark'] = '添加新水印';
+$lang['bottom left corner'] = '左下角';
+$lang['bottom right corner'] = '右下角';
+$lang['custom'] = '自定义';
+$lang['middle'] = '中间';
+$lang['top left corner'] = '左上角';
+$lang['top right corner'] = '右上角';
+$lang['Multiple Size'] = '多尺寸';
+?>
Index: tags/2.4.0RC3/language/zh_CN/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_CN/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/common.lang.php	(revision 14585)
@@ -0,0 +1,409 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: 简体中文 [CN]
+Version: 2.2.1
+Language URI: http://piwigo.org/ext/extension_view.php?eid=438
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = "简体中文";
+$lang_info['country'] = "中国";
+$lang_info['direction'] = "ltr";
+$lang_info['code'] = "cn";
+$lang_info['zero_plural'] = true;
+
+$lang['%d Kb'] = "%d Kb";
+$lang['%d album updated'] = "已更新 %d 个相册";
+$lang['%d albums updated'] = "已更新 %d 个相册";
+$lang['%d comment to validate'] = "有 %d 个评论等待审核";
+$lang['%d comments to validate'] = "有 %d 个评论等待审核";
+$lang['%d new comment'] = "%d 个新评论";
+$lang['%d new comments'] = "%d 个新评论";
+$lang['%d comment'] = "%d 个评论";
+$lang['%d comments'] = "%d 个评论";
+$lang['%d hit'] = "%d 次点击";
+$lang['%d hits'] = "%d 次点击";
+$lang['%d new photo'] = "%d 张新照片";
+$lang['%d new photos'] = "%d 张新照片";
+$lang['%d new user'] = "%d 个新用户";
+$lang['%d new users'] = "%d 个新用户";
+$lang['About'] = "关于";
+$lang['All tags'] = "所有标签";
+$lang['Any tag'] = "任何标签";
+$lang['At least one listed rule must be satisfied.'] = "列出的标准中至少需要满足一项。";
+$lang['Author'] = "作者";
+$lang['Albums'] = "相册";
+$lang['Album'] = "相册";
+$lang['Close this window'] = "关闭此窗口";
+$lang['Complete RSS feed (photos, comments)'] = "完整的RSS feed(照片，评论)";
+$lang['Confirm Password'] = "确认密码";
+$lang['Connection settings'] = '注册信息';
+$lang['Login'] = "登录";
+$lang['Contact webmaster'] = "联系网站管理员";
+$lang['Create a new account'] = "新建帐号";
+$lang['Created on'] = "创建日期";
+$lang['Creation date'] = "创建日期";
+$lang['Current password is wrong'] = "密码有误";
+$lang['Dimensions'] = "尺寸";
+$lang['Display'] = "显示";
+$lang['Each listed rule must be satisfied.'] = '必须符合每项标准';
+$lang['Email address is missing. Please specify an email address.'] = '缺少邮箱地址';
+$lang['Email address'] = '邮箱地址';
+$lang['Enter your personnal informations'] = '输入您的个人信息';
+$lang['Error sending email'] = '发送邮件出错';
+$lang['File name'] = '文件名';
+$lang['File'] = '文件名';
+$lang['Filesize'] = '文件大小';
+$lang['Filter and display'] = '搜索并显示';
+$lang['Filter'] = '搜索';
+$lang['Forgot your password?'] = '忘记密码?';
+$lang['Go through the gallery as a visitor'] = '以游客身份浏览图库';
+$lang['Help'] = '帮助';
+$lang['Identification'] = '用户信息';
+$lang['Photos only RSS feed'] = '图片RSS';
+$lang['Keyword'] = '关键字';
+$lang['Links'] = '链接';
+$lang['N/A'] = '不存在';
+$lang['New on %s'] = '创建于 %s';
+$lang['Notification'] = '通知';
+$lang['Number of items'] = '总数';
+$lang['Original dimensions'] = '原始大小';
+$lang['Password forgotten'] = '忘记密码';
+$lang['Password'] = '密码';
+$lang['Post date'] = '上传日期';
+$lang['Posted on'] = '上传日期';
+$lang['Profile'] = '用户信息';
+$lang['Quick connect'] = '快速登录';
+$lang['RSS feed'] = 'RSS流';
+$lang['Register'] = '注册';
+$lang['Registration'] = '注册';
+$lang['Related tags'] = '关联标签';
+$lang['Reset'] = '重置';
+$lang['Retrieve password'] = '重新获取密码';
+$lang['Search rules'] = '搜索规则';
+$lang['Search tags'] = '搜索标签';
+$lang['Search'] = '搜索';
+$lang['display available tags'] = '查看现有标签';
+$lang['Since'] = '从';
+$lang['Sort by'] = '排序';
+$lang['Sort order'] = '排序';
+$lang['Tag'] = '标签';
+$lang['Tags'] = '标签';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS摘要，从本网站上获取通知：新图片，相册更新，新评论。要使用RSS阅读器来查看这些.';
+$lang['Unknown feed identifier'] = '未知RSS流标识';
+$lang['User comments'] = '用户评论';
+$lang['Username'] = '用户名';
+$lang['Visits'] = '访问量';
+$lang['Webmaster'] = '网站管理员';
+$lang['Week %d'] = '星期 %d';
+$lang['About Piwigo'] = '关于Piwigo';
+$lang['You are not authorized to access the requested page'] = '无权访问此页';
+$lang['add this photo to your favorites'] = '把图片放入收藏夹';
+$lang['Administration'] = '后台管理';
+$lang['all'] = '所有';
+$lang['ascending'] = '升序';
+$lang['author(s) : %s'] = '拥有者: %s';
+$lang['Expand all albums'] = '展开所有相册';
+$lang['posted after %s (%s)'] = '插入到 %s (%s) 之后';
+$lang['posted before %s (%s)'] = '插入到 %s (%s) 之前';
+$lang['posted between %s (%s) and %s (%s)'] = '插入到 %s (%s) 和 le %s (%s) 之间';
+$lang['posted on %s'] = '插入 %s';
+$lang['Best rated'] = '得票最高';
+$lang['display best rated photos'] = '显示得票最高的图片';
+$lang['Calendar'] = '日历';
+$lang['All'] = '所有';
+$lang['display each day with photos, month per month'] = '按时间顺序显示';
+$lang['View'] = '视图';
+$lang['chronology_monthly_calendar'] = '月历';
+$lang['chronology_monthly_list'] = '月列表';
+$lang['chronology_weekly_list'] = '周列表';
+$lang['Click here if your browser does not automatically forward you'] = '如果您的浏览器不支持自动跳转，请点击这里。';
+$lang['comment date'] = '评论日期';
+$lang['Comment'] = '评论';
+$lang['Your comment has been registered'] = '评论已保存';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = '反灌水系统：请稍候再发表评论';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '由于不符合格式规定，您的评论不能被保存';
+$lang['An administrator must authorize your comment before it is visible.'] = '评论需经管理员确认才能显示在页面中。';
+$lang['This login is already used by another user'] = '用户名已经存在';
+$lang['Comments'] = '评论';
+$lang['Add a comment'] = '发表评论';
+$lang['created after %s (%s)'] = '创建于 %s (%s) 之后';
+$lang['created before %s (%s)'] = '创建于 %s (%s) 之前';
+$lang['created between %s (%s) and %s (%s)'] = '创建于 %s (%s) 和 le %s (%s) 之间';
+$lang['created on %s'] = '创建时间 %s';
+$lang['Customize'] = '自定义';
+$lang['Your Gallery Customization'] = '自定义页标题';
+$lang['day'][0] = '星期日';
+$lang['day'][1] = '星期一';
+$lang['day'][2] = '星期二';
+$lang['day'][3] = '星期三';
+$lang['day'][4] = '星期四';
+$lang['day'][5] = '星期五';
+$lang['day'][6] = '星期六';
+$lang['Default'] = '默认';
+$lang['delete this photo from your favorites'] = '从收藏夹中删除此图片';
+$lang['Delete'] = '删除';
+$lang['descending'] = '降序';
+$lang['Download'] = '下载';
+$lang['Download this file'] = '下载此文件';
+$lang['edit'] = '编辑';
+$lang['wrong date'] = '日期出错';
+$lang['excluded'] = '不包括';
+$lang['Your favorites'] = '收藏夹';
+$lang['display your favorites photos'] = '显示收藏图片';
+$lang['Favorites'] = '收藏';
+$lang['First'] = '首页';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = '系统维护中，请稍候再试。';
+$lang['Page generated in'] = '页面创建时间';
+$lang['guest'] = '游客';
+$lang['Hello'] = '您好';
+$lang['available for administrators only'] = '需要管理员权限';
+$lang['display this album'] = '显示此相册根目录下的图片';
+$lang['display last user comments'] = '查看最新用户评论';
+$lang['customize the appareance of the gallery'] = '个性化设置';
+$lang['search'] = '搜索';
+$lang['Home'] = '主页';
+$lang['in this album'] = '在此相册里';
+$lang['in %d sub-album'] = '在%d个子相册中';
+$lang['in %d sub-albums'] = '在%d个子相册中';
+$lang['included'] = '包括';
+$lang['Invalid password!'] = '密码不正确!';
+$lang['Language'] = '语言';
+$lang['last %d days'] = '最近%d天';
+$lang['Last'] = '最后';
+$lang['Logout'] = '注销';
+$lang['obligatory'] = '必需';
+$lang['Maximum photo height'] = '图片的最大长度';
+$lang['Maximum height must be a number superior to 50'] = '图片最大长度必须大于50';
+$lang['Maximum photo width'] = '图片的最大宽度';
+$lang['Maximum width must be a number superior to 50'] = '图片最大宽度必须大于50';
+$lang['display a calendar by creation date'] = '通过创建时间显示日历';
+$lang['display all photos in all sub-albums'] = '显示所有相册和子相册的图片';
+$lang['return to normal view mode'] = '返回到普通模式显示';
+$lang['display a calendar by posted date'] = '通过发布时间来显示日历';
+$lang['month'][10] = '十月';
+$lang['month'][11] = '十一月';
+$lang['month'][12] = '十二月';
+$lang['month'][1] = '一月';
+$lang['month'][2] = '二月';
+$lang['month'][3] = '三月';
+$lang['month'][4] = '四月';
+$lang['month'][5] = '五月';
+$lang['month'][6] = '六月';
+$lang['month'][7] = '七月';
+$lang['month'][8] = '八月';
+$lang['month'][9] = '九月';
+$lang['Most visited'] = '最受欢迎';
+$lang['display most visited photos'] = '显示查看次数最多的图片';
+$lang['Unknown identifier'] = '帐号不存在';
+$lang['New password'] = '新密码';
+$lang['Rate this photo'] = '投票';
+$lang['Next'] = '下一页';
+$lang['no rate'] = '没有投票';
+$lang['Photos posted within the last %d day.'] = '只显示最近 %d 天的图片.';
+$lang['Photos posted within the last %d days.'] = '只显示最近 %d 天的图片.';
+$lang['password updated'] = '密码已修改';
+$lang['Recent period must be a positive integer value'] = '再次发表的间隔时间必须是正整数';
+$lang['photo'] = '图片';
+$lang['Click on the photo to see it in high definition'] = '点击查看大图片';
+$lang['Show file metadata'] = '显示文件元数据';
+$lang['Powered by'] = '基于';
+$lang['Preferences'] = '使用偏好';
+$lang['Previous'] = '前页';
+$lang['Random photos'] = '随机图片';
+$lang['display a set of random photos'] = '随机显示图片';
+$lang['Recent albums'] = '最新相册';
+$lang['display recently updated albums'] = '显示最近更新的相册';
+$lang['Recent period'] = '最近时间';
+$lang['Recent photos'] = '最新图片';
+$lang['display most recent photos'] = '显示最新图片';
+$lang['Redirection...'] = '跳转至...';
+$lang['Please, enter a login'] = '请输入用户名';
+$lang['login mustn\'t end with a space character'] = '用户名不能以空格结尾';
+$lang['login mustn\'t start with a space character'] = '用户名不能以空格开头';
+$lang['this login is already used'] = '用户名已存在';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '邮件地址格式必须符合标准邮件地址格式 xxx@yyy.eee (例如 : jack@altern.org)';
+$lang['please enter your password again'] = '请输入新密码';
+$lang['Auto login'] = '自动登录';
+$lang['remove this tag from the list'] = '删除此标签';
+$lang['representative'] = '代理';
+$lang['Search for Author'] = '搜索上传者';
+$lang['Search in albums'] = '在相册里搜索';
+$lang['Search by date'] = '通过日期搜索';
+$lang['Date'] = '开始日期';
+$lang['End-Date'] = '截止日期';
+$lang['Kind of date'] = '日期类型';
+$lang['Search for words'] = '关键字';
+$lang['Search for all terms'] = '与模式';
+$lang['Search for any term'] = '或模式';
+$lang['Empty query. No criteria has been entered.'] = '搜索语句不能为空';
+$lang['Search results'] = '搜索结果';
+$lang['Search in sub-albums'] = '在子相册中搜索';
+$lang['searched words : %s'] = '搜索词: %s';
+$lang['Contact'] = '联系';
+$lang['set as album representative'] = '设置相册封面';
+$lang['Show number of comments'] = '显示评论总数';
+$lang['Show number of hits'] = '显示查看次数';
+$lang['slideshow'] = '幻灯片放映';
+$lang['stop the slideshow'] = '停止幻灯片放映';
+$lang['Specials'] = '快速访问';
+$lang['SQL queries in'] = 'SQL搜索语句';
+$lang['display only recently posted photos'] = '只显示最新图片';
+$lang['return to the display of all photos'] = '返回到所有图片页面';
+$lang['the beginning'] = '开始';
+$lang['Interface theme'] = '主题';
+$lang['Thumbnails'] = '缩略图';
+$lang['Menu'] = '菜单';
+$lang['A comment on your site'] = '网站评论';
+$lang['today'] = '今天';
+$lang['Rating score'] = '分数';
+$lang['Update your rating'] = '更改投票';
+$lang['the username must be given'] = '缺少用户名';
+$lang['useful when password forgotten'] = '忘记密码';
+$lang['Quick search'] = '快速搜索';
+$lang['Connected user: %s'] = '在线用户: %s';
+$lang['IP: %s'] = 'IP地址: %s';
+$lang['Browser: %s'] = '浏览器: %s';
+$lang['Author: %s'] = '上传者: %s';
+$lang['Comment: %s'] = '评论: %s';
+$lang['Comment by %s'] = '评论者 %s';
+$lang['User: %s'] = '用户: %s';
+$lang['Email: %s'] = '邮箱: %s';
+$lang['Admin: %s'] = '管理员: %s';
+$lang['Registration of %s'] = '注册 %s';
+$lang['Album: %s'] = '相册: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '如果游客拥有普通用户才拥有的状态，请向管理员报告。';
+$lang['this email address is already in use'] = '此邮箱已存在';
+$lang['Album results for'] = '相册的结果';
+$lang['Tag results for'] = '符合搜索标签的结果';
+$lang['from %s to %s'] = '从 %s 到 %s';
+$lang['Play of slideshow'] = '播放';
+$lang['Pause of slideshow'] = '暂停';
+$lang['Repeat the slideshow'] = '重复播放';
+$lang['Not repeat the slideshow'] = '停止重复播放';
+$lang['Reduce diaporama speed'] = '减慢播放速度';
+$lang['Accelerate diaporama speed'] = '加快播放速度';
+$lang['Submit'] = '确认';
+$lang['Yes'] = '是';
+$lang['No'] = '否';
+$lang['%d photo']='%d 张图片';
+$lang['%d photos']='%d 张图片';
+$lang['%d photo is also linked to current tags'] = '%d 张图片与当前标签相关';
+$lang['%d photos are also linked to current tags'] = '%d 张图片与当前标签相关';
+$lang['display photos linked to this tag'] = '只查看和此标签相关的图片';
+$lang['photos posted during the last %d days'] = '在最近%d天里更新的图片';
+$lang['Piwigo Help'] = 'Piwigo帮助';
+$lang['Rank'] = '分类';
+$lang['group by letters'] = '按字母顺序分类';
+$lang['letters'] = '字母';
+$lang['show tag cloud'] = '显示标签云';
+$lang['cloud'] = '云';
+$lang['Are you sure?'] = '确定?';
+$lang['Reset to default values'] = '重置为默认值';
+$lang['delete all photos from your favorites'] = '删除您的收藏夹里的所有图片';
+$lang['Sent by'] = '发送于';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = '您的浏览器已关闭或者不支持Cookies. 您必须开启 cookies 才能登录.';
+$lang['Edit a comment'] = '修改一个评论';
+$lang['(!) This comment requires validation'] = '(!) 此评论需要审核';
+$lang['Welcome'] = '欢迎';
+$lang['Welcome to your Piwigo photo gallery!'] = '欢迎来到您的 Piwigo 画廊!';
+$lang['... or browse your empty gallery'] = '... 或者浏览您的空画廊';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... 或者取消此信息，我会自己找到我的方法';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = '您好 %s, 您的 Piwigo 画廊是空的!';
+$lang['I want to add photos'] = '我想添加图片';
+$lang['Manage this user comment: %s'] = '管理此用户的评论: %s';
+$lang['This author modified following comment:'] = '此作者修改了以下的评论:';
+$lang['This author removed the comment with id %d'] = '此作者删除了 id 为 %d 的评论';
+$lang['Sent by'] = '发送人';
+$lang['html tags are not allowed in login'] = '登录名中不允许使用html标签';
+$lang['%d rates'] = '%d 评分';
+$lang['Rating score'] = '评价得分';
+$lang['The number of photos per page must be a not null scalar'] = '每页相片数量必须大于0';
+$lang['Number of photos per page'] = '每页相片数量';
+$lang['display photos linked to this tag'] = '在此标签上显示相片链接';
+$lang['Invalid username or email'] = '用户名或邮件地址无效';
+$lang['Password reset is not allowed for this user'] = '该用户无法进行密码重置';
+$lang['User "%s" has no email address, password reset is not possible'] = '用户 "%s" 无邮件地址，无法进行密码重置';
+$lang['Someone requested that the password be reset for the following user account:'] = '有人申请了重置该用户的密码：';
+$lang['Username "%s" on gallery %s'] = ' 相册 %s的用户名 "%s" ';
+$lang['To reset your password, visit the following address:'] = '请访问以下地址以对密码进行重置：';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '如果发送错误，请忽略本邮件，该邮件不会对您有任何影响。';
+$lang['Password Reset'] = '密码已重置';
+$lang['Check your email for the confirmation link'] = '请检查您邮箱中的确认链接';
+$lang['Invalid key'] = '无效的KEY';
+$lang['The passwords do not match'] = '密码不符';
+$lang['Your password has been reset'] = '您的密码已经重置';
+$lang['Return to home page'] = '返回主页';
+$lang['Please enter your username or email address.'] = '请输入您的用户名或邮件地址';
+$lang['You will receive a link to create a new password via email.'] = '您将通过邮箱收到一个新建密码链接地址。';
+$lang['Username or email'] = '用户名或邮箱地址';
+$lang['Change my password'] = '更改我的密码';
+$lang['Enter your new password below.'] = '输入您的新密码';
+$lang['EXIF Metadata'] = 'EXIF元数据';
+$lang['IPTC Metadata'] = 'IPTC Meta信息';
+$lang['Edit'] = '编辑';
+$lang['Hello %s,'] = '你好%s,';
+$lang['Here are your connection settings'] = '您的注册信息';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = '如果您觉得您收到有邮件有误，请联系我们 %s';
+$lang['large'] = '大尺寸';
+$lang['medium'] = '中尺寸';
+$lang['Original'] = '原始尺寸';
+$lang['Password: %s'] = '密码：%s';
+$lang['Send my connection settings by email'] = '发送注册信息到我的Email';
+$lang['small'] = '小尺寸';
+$lang['square'] = '图标';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = '注册成功，您马上会收到注册信息邮件。感谢您注册！';
+$lang['Thank you for registering at %s!'] = '感谢您注册%s!';
+$lang['thumb'] = '缩略图';
+$lang['Username modification'] = '修改用户名';
+$lang['Username: %s'] = '用户名：%s';
+$lang['xlarge'] = '很大尺寸';
+$lang['xxlarge'] = '非常大尺寸';
+$lang['Your username has been successfully changed to : %s'] = '您的用户名成功修改为：%s';
+$lang['Photo sizes'] = '';
+$lang['Desktop'] = '桌面版';
+$lang['Mobile'] = '手机版';
+$lang['Show latest comments first'] = '先显示新评论';
+$lang['Show oldest comments first'] = '先显示旧评论';
+$lang['View in'] = '查看';
+$lang['2small'] = 'XXS - 微小';
+$lang['xsmall'] = 'XS - 非常小';
+$lang['Date created, new &rarr; old'] = '创建日期, 新 &rarr; 旧';
+$lang['Date created, old &rarr; new'] = '创建日期, 旧 &rarr; 新';
+$lang['Date posted, new &rarr; old'] = '发布日期, 新 &rarr; 旧';
+$lang['Date posted, old &rarr; new'] = '发布日期, 旧 &rarr; 新';
+$lang['File name, A &rarr; Z'] = '文件名, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = '文件名, Z &rarr; A';
+$lang['Manual sort order'] = '手动排序';
+$lang['Numeric identifier, 1 &rarr; 9'] = '数字ID, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = '数字ID, 9 &rarr; 1';
+$lang['Photo title, A &rarr; Z'] = '图片标题, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = '图片标题, Z &rarr; A';
+$lang['Rating score, high &rarr; low'] = '评分, 高 &rarr; 低';
+$lang['Rating score, low &rarr; high'] = '评分, 低 &rarr; 高';
+$lang['Visits, high &rarr; low'] = '访问量, 高 &rarr; 低';
+$lang['Visits, low &rarr; high'] = '访问量, 低 &rarr; 高';
+?>
Index: tags/2.4.0RC3/language/zh_CN/help/cat_move.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/cat_move.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/cat_move.html	(revision 14585)
@@ -0,0 +1,14 @@
+<h2>移动虚拟相册集</h2>
+
+<p>虚拟相册集可以拥有上一级相册</p>
+
+<h3>移动虚拟相册集</h3>
+
+<p>选择你你将要移动的虚拟相册集。
+  若列表中无可选项，则说明您目前还未创建任何虚拟相册集。</p>
+
+<h3>新的上级相册</h3>
+
+<p>选择一个新的上级相册（虚拟或实际的）
+    若您没有选择任何一个上级相册集，被选中的虚拟相册集将会被移动到根目录下。
+    一个相册集无法被移动到本集当中或其子集当中去</p>
Index: tags/2.4.0RC3/language/zh_CN/help/cat_options.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/cat_options.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/cat_options.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>相册选项</h2>
+
+<p>一次性对多个相册进行选项管理</p>
+
+<dl>
+
+<dt>评论</dt>
+<dd>若相册已激活评论功能，图片将可以接收来自访问者的评论。</dd>
+
+<dt>锁定</dt>
+<dd>锁定的相册将暂时无法维护。仅有管理员可以浏览相册。</dd>
+
+<dt>公开与隐私</dt>
+<dd>若相册为隐私相册，仅授权访问的用户或组可以浏览。</dd>
+
+<dt>封面图片</dt>
+<dd>本选项仅在您将<code>allow_random_representative</code> (详情请见<span
+class="filename">include/config_defaults.inc.php</span>)中的设置参数调整为
+<em>true</em>后，方可进行管理。
+    每个相册均可以随机将目录中的图片作为封面，或您也可以自行设定将某个图片作
+为该目录的封面。</dd>
+</dl>
Index: tags/2.4.0RC3/language/zh_CN/help/cat_perm.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/cat_perm.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/cat_perm.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>编辑相册许可</h2>
+
+<p>本页仅对个人分类有效。您可以对个人或组用户进行分类访问授权。</p>
+
+<h3>组</h3>
+
+<p>可以授权或拒绝组用户对当前分类的访问。通过修改组的授权，这些组内的成员将被拒绝或授权访问该分类。</p>
+
+<h3>用</h3>
+
+<p>可以拒绝或允许个体用户连接到分类。访问异常的组内用户可以被拒绝访问。</p>
Index: tags/2.4.0RC3/language/zh_CN/help/configuration.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/configuration.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/configuration.html	(revision 14585)
@@ -0,0 +1,103 @@
+<h2>配置</h2>
+
+<p>这个页面可让管理员做基本的配置。确实，这个页面所显示的简单的配置参数已足够大多数的管理员使用，如果你想看到更多的(和高级的)配置参数，请查阅此文件 <span class="filename">include/config_default.inc.php</span>.</p>
+
+<p>这个页面分成几个章节，以主题来重组配置参数。</p>
+
+
+<h3>主要</h3>
+<ul>
+  <li><strong>相册标题</strong>: 用在RSS和电子邮件通知里。</li>
+
+  <li><strong>页面横幅</strong>: 在每个公共页面顶部显示。</li>
+
+  <li><strong>相册地址</strong>: 用在RSS通知里。</li>
+
+  <li><strong>锁定相册</strong>: 在维护时锁定所有相册，只有管理员能访问。</li>
+
+  <li><strong>等级</strong>: 开启图片的等级功能。</li>
+
+  <li><strong>客人可作等级投票</strong>: 即使没注册的用户也可以对图片进行等级投票。</li>
+
+  <li><strong>允许用户注册</strong>: 注册是免费的。</li>
+
+  <li><strong>用户注册时必须填写邮件地址</strong>: 在注册或者更新个人资料时将会对邮件地址进行检测，除了在管理员后台直接的操作之外。</li>
+
+  <li><strong>当前新用户注册时发邮件给管理员</strong>: 管理员将会收到每个注册通知。</li>
+
+</ul>
+
+<h3>历史</h3>
+
+  <p>在访问<span class="pwgScreen">category.php</span> 和 <span class="pwgScreen">picture.php</span> 页面时，将会保存到
+  <code>历史</code> 表。</p>
+  
+  <p>访问记录将会显示在 <span  class="pwgScreen">管理员, 特殊, 历史</span>.</p>
+
+<ul>
+  <li><strong>保存访客的页面记录</strong>: 访客访问过的页面将会被记录。</li>
+
+  <li><strong>保存用户的页面记录</strong>: 注册用户访问过的页面将会被记录。</li>
+
+  <li><strong>保存管理员的页面记录</strong>: 管理员访问过的页面将会被记录。</li>
+
+</ul>
+
+<h3>评论</h3>
+<ul>
+
+  <li><strong>全部皆能评论</strong>: 即使没注册的访客也能发表评论。</li>
+
+  <li><strong>每页显示的评论数。</strong></li>
+
+  <li><strong>审核Validation</strong>: 管理员在评论正式发布前需要先审核，审核用户评论的页面是 <span class="pwgScreen">管理员, 相片,
+  评论</span>.</li>
+
+  <li><strong>当有评论时即发邮件通知管理员</strong>:当用户发表了有效的评论后，即发送邮件通知管理员。</li>
+
+  <li><strong>当有评论需要审核时发邮件通知管理员</strong>:当用户发表了需要审核的评论后，即发送邮件通知管理员。
+
+审核用户评论的页面是 <span class="pwgScreen">管理员, 相片, 评论</span>.</li>
+
+</ul>
+
+<!--TODO --><h3>上传</h3>
+<ul>
+<!--TODO -->  <li><strong>每次都显示上传链接</strong>: 如果存在可以上传的类别，添加的链接将在每个类别里显示。</li>
+<!--TODO -->  <li><strong>用户访问级别的上传</strong>: 允许限制用户上传</li>
+  <li><strong>当相片上传时发邮件通知管理员</strong>: 每个用户上传相片后管理员将收到邮件通知。</li>
+</ul>
+
+<h3>默认显示</h3>
+
+<p>在这里你可以为未登录的客人改变默认的显示设置，一旦他们登录后，用户自己的设置将覆盖这些默认设置
+(在<span class="pwgScreen">自定义</span>里修改).</p>
+
+<p>每个用户都可以更改自己的显示设置，但需要注意这个页面<span class="pwgScreen">管理员,
+身份验证, 用户</span>, 在这里你可以更改用户列表里的用户的显示设置。</p>
+
+<ul>
+
+  <li><strong>语言</strong>: 主要考虑的只是 Piwigo 的标签。类别名称、相片名称和所有注解说明均不被本地化。</li>
+
+  <li><strong>每行相片数量</strong></li>
+
+  <li><strong>每页的行数</strong></li>
+
+  <li><strong>主题界面</strong></li>
+
+  <li><strong>最近的时间段</strong>: 以天为单位。在这个时间段内的相片将被显示，必须要大于1天。</li>
+
+  <li><strong>展开所有类别</strong>: 在菜单里以默认方式展开所有类别 <em>注意</em>: 这个操作是很消耗资源的，同时如果你的类别树下包含了很多子类别，将会产生一个巨大的菜单。</li>
+
+  <li><strong>显示评论的数量</strong>: 在缩略图页面显示每个相片的评论。很消耗资源。</li>
+
+  <li><strong>显示点击数</strong>: 只有在高级配置参数 $conf['show_nb_hits'] = true; 时，才会在缩略图页面里的相片缩略图下显示点击数。<br />
+  注意：此选项默认为 false 。</li>
+
+  <li><strong>相片的最大宽度</strong>: 最大宽度的显示。如果相片大于此设置，其将被调整大小以显示。如果你考虑这个选项，你最好考虑修改你的相片以代替之。</li>
+
+  <li><strong>相片最大高度</strong>: 与前一项说明相同</li>
+
+</ul>
+
Index: tags/2.4.0RC3/language/zh_CN/help/group_list.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/group_list.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/group_list.html	(revision 14585)
@@ -0,0 +1,22 @@
+<h2>组列表</h2>
+
+<p>可以在此维护组</p>
+
+<h3>添加组</h3>
+
+<p>管理员有权添加组</p>
+
+<h3>组列表</h3>
+
+<p>于以下元素，该组列表允许：</p>
+
+
+<ul>
+  <li>访问会员列表</li>
+  <li>访问管理许可证页面</li>
+  <li>删除组（需要确认）</li>
+  <li>切换为“默认”状态（需要确认）</li>
+</ul>
+
+<h3>默认组</h3>
+<p>一旦有新用户注册或有新的管理员账户创建，均会被自动加入到这个默认的组里来</p>
Index: tags/2.4.0RC3/language/zh_CN/help/help_add_photos.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/help_add_photos.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/help_add_photos.html	(revision 14585)
@@ -0,0 +1,21 @@
+<p>有几个方法可以把相片添加到您的画廊:</p>
+
+<ul>
+  <li>使用浏览器<strong>直接上传</strong> 是最简单直接的方法。这要看您浏览器和服务器的性能。如果您要上传大批量的图片，或者上传过程中遇到了一些问题，那么可以尝试另外的一些方法。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=direct">使用直接上传</a></p>
+
+<ul>
+  <li><strong>pLoader</strong> 是一个桌面应用程序，需安装到您的电脑里。您只需将相片拖拉到 pLoader 窗口里，点击 <em>"上传到 Piwigo"</em> ，然后就让 pLoader 为您做剩下的工作吧。您也可以在 Piwigo 网站里找到其他的桌面应用软件，如 <strong>WinToPiwigo</strong> 或者 <strong>Digikam</strong> 导出插件.</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ploader">使用 pLoader</a></p>
+
+<div id="helpSynchro">
+<ul>
+  <li><strong>FTP 上传</strong> 是非常推荐的方法，其可以一次性上传大批量的相片。以下向导将教您如何准备您的相片。使用 FTP 方式，您可以很精确地控制您服务器上的相片目录的物理结构。</li>
+</ul>
+
+<p class="nextStepLink"><a href="admin.php?page=photos_add&section=ftp">使用 FTP</a></p>
+</div>
Index: tags/2.4.0RC3/language/zh_CN/help/help_groups.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/help_groups.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/help_groups.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>组是设置一个用户列表权限的便捷方式。</p>
+
+<p>在 <span class="pwgScreen">管理员 &raquo; 身份验证 &raquo; 组</span> 创建组和在 <span class="pwgScreen">管理员 &raquo; 身份验证 &raquo; 用户</span> 里创建组里的用户。</p>
+
+<p>一个用户可同时存在于几个组里。授权的优先级大于禁止 : 如果用户 "jack" 同时属于 "family" 和 "friends" 组, 只有 "family" 组可以看到类别 "Christmas 2003" 那么 "jack" 就可以看到 "Christmas 2003".</p>
+
Index: tags/2.4.0RC3/language/zh_CN/help/help_misc.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/help_misc.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/help_misc.html	(revision 14585)
@@ -0,0 +1,4 @@
+<p>当你建立了相册后，就可以通过 <span class="pwgScreen">管理员 &raquo; 设置 &raquo; 默认显示</span> 修改默认的显示属性。 每个新注册的用户将使用这些默认的设置。</p>
+
+<p>如果你有其他问题，Piwigo 社区将欢迎你到 <a href="http://cn.piwigo.org/forum"> 它的论坛</a>。</p>
+
Index: tags/2.4.0RC3/language/zh_CN/help/help_permissions.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/help_permissions.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/help_permissions.html	(revision 14585)
@@ -0,0 +1,50 @@
+<fieldset>
+<legend>相片的权限</legend>
+
+<p>每张相片都有一个 <strong>私有级别</strong> (一个锁). 每个用户也有一个私有级别 (一个钥匙). 共有5个私有级别:</p>
+<ol>
+  <li>没有</li>
+  <li><em>联系人</em></li>
+  <li><em>朋友 (比联系人高级)</em></li>
+  <li><em>家庭 (比朋友高级)</em></li>
+  <li><em>管理员 (比任何级别都要高)</em></li>
+</ol>
+
+<p>高级别的拥有低级别的权限。一个拥有权限的用户，其私有级别越高，所能看到的相片也越多。</p>
+
+<p>例如，如果这张相片 "peter_wedding-0024.jpg" 拥有 <em>"家庭"</em> 的私有级别, 那么:</p>
+<ul>
+  <li>Peter (是一个 <em>"管理员"</em>) 将可以看到此相片，因为 <em>"管理员"</em> 能看到所有相片</li>
+  <li>Beth (是一个 <em>"家庭"</em> 成员) 将可以看到此相片</li>
+  <li>Mary (只是一个 <em>"朋友"</em>) 将不能看到此相片</li>
+</ul>
+
+<p>如果一个用户没有看到类别内容的权限，那么他也不能看到自己的类别，甚至是它的标题。同样的规则也适用于标签。</p>
+
+<p>您可以在 <span class="pwgScreen">管理员 &raquo; 用户 &raquo; 管理</span> 的界面里为用户设置私有级别。</p>
+
+</fieldset>
+
+<fieldset>
+<legend>类别的权限</legend>
+
+<p>如果私有级别不能满足您的需要，您也可以设置类别上的权限以管理用户或组。您可以同时设置相片和类别上的权限，这并没有冲突。</p>
+
+<p>如果您想禁止类别的访问，可以改变类别访问类型为 "私有" </p>
+
+<p>您可以通过
+(<span class="pwgScreen">管理员 &raquo; 类别 &raquo; 管理 &raquo; 修改</span>) 将某个类别设置为私有，或者通过设置选项
+(<span class="pwgScreen">管理员 &raquo; 类别 &raquo; 属性 &raquo; 公有 / 私有</span>) 设置全局的类别属性.</p>
+
+<p>当类别被设置为私有时，您可以通过以下3个界面对用户组和用户的权限进行管理:</p>
+
+<ul>
+
+  <li><span class="pwgScreen">管理员 &raquo; 用户 &raquo; 管理 &raquo;  权限设置</span> (每个用户一个链接)</li>
+
+  <li><span class="pwgScreen">管理员 &raquo; 用户 &raquo; 组 &raquo;  权限设置</span> (每个组一个链接)</li>
+
+  <li><span class="pwgScreen">管理员 &raquo; 类别 &raquo; 管理 &raquo; 权限设置</span> (每个类别一个链接)</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/zh_CN/help/help_virtual_links.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/help_virtual_links.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/help_virtual_links.html	(revision 14585)
@@ -0,0 +1,6 @@
+<p>在类别里显示的相片相当于文件夹里的文件。</p>
+
+<p>你也可以将一张图片放在多个类别里显示，在你的网站服务器里没有重复的文件。在图片修改界面可以将图片关联到任何类别里 (任何一个管理员都可以从相册进入到图片修改页面).</p>
+
+<p>虚拟类别就建立在这个概念上 : 他们并没有对应的文件夹。可以通过 <span class="pwgScreen">管理员 &raquo; 类 &raquo; 管理</span> 创建虚拟类别。</p>
+
Index: tags/2.4.0RC3/language/zh_CN/help/maintenance.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/maintenance.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/maintenance.html	(revision 14585)
@@ -0,0 +1,57 @@
+<h2>维护</h2>
+
+<p> Piwigo使用缓存信息以最优化页面生成时间。例如：为了避免每次页面载入时重新计
+算每个相册中的图片数量，信息会被自动保存在数据库中。理论上，这些信息是准确无
+误的，但是偶尔可能会出现小问题而导致一些错误从而引发缓存信息错误。</p>
+
+<p>随着时间的变更，有些信息可能无法再使用。从数据库删除这些无用的信息将会帮
+助您节约数据储存空间。</p>
+
+<ul>
+
+  <li>
+    <strong>未增加链接的图片：</strong>
+    未与任何虚拟相册相连接的图片展示。
+  </li>
+  <li>
+    <strong>在多个实际相册中出现的具有同样文件名称的文件</strong>
+	在多个相册集中图片或文件使用相同的文件名称。
+  </li>
+
+</ul>
+
+<ul>
+
+  <li><strong>更新相册信息：</strong> 如有需要，相册中的以下信息将会被定期检查并更新。
+上级相册列表、图片数目、近期图片上传时间、在兄弟相册中的位置、在所有相册中的
+位置。
+本项还会定期检查封面图片的持续性。</li>
+
+  <li><strong>更新图片信息：</strong>对于每张图片的信息更新如下：
+文件完整路径和平均分<em>警告<em>，请勿与下列信息混淆：META资料信息必须从
+<span class="pwgScreen">管理员&raquo;
+工具 &raquo; 同步</span>以完成更新，或者以单张图片的编辑面板（通过例子<span
+class="pwgScreen">图片</span>）进行。
+</li>
+
+  <li><strong>数据库维修与优化</strong>
+  在每个数据库的面板运行重置顺序、维修或优化等操作。</li>
+</ul>
+
+<ul>
+  <li><strong>清除历史记录细节：</strong> 删除来自<code>历史</code>界面的全部内容
+. 在 <span class="pwgScreen">管理员&raquo;
+工具 &raquo; 同步</span>等界面将不会再出现过去的历史记录。<em>警告</em>：您将无法以
+任何方式挽回这些数据。
+</li>
+
+  <li><strong>清除历史记录总结：</strong> 删除有关访问历史记录的总结信息。这是由历史细节计算而生的总结。</li>
+
+  <li><strong>清除会话</strong> 删除过期的用户对话</li>
+
+  <li><strong>清除从未使用过的通知</strong></li>
+
+  <li><strong>清除搜索记录</strong></li>
+  
+  <li><strong>清除编译模板</strong></li>  
+</ul>
Index: tags/2.4.0RC3/language/zh_CN/help/notification_by_mail.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/notification_by_mail.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/notification_by_mail.html	(revision 14585)
@@ -0,0 +1,15 @@
+<h2>邮件通知</h2>
+
+<p>本页面可以允许使用者设置及管理E-mail，以告知用户有关您网站的一切变更。</p>
+
+<p>本页面由3个标签组成：</p>
+
+<h3>参数</h3>
+<p>用于站长，此标签用以设置邮件通知的参数。</p>
+
+<h3>订阅</h3>
+<p>用于站长，此标签用于管理用户对邮件通知的订阅及订阅的取消。</p>
+
+<h3>后记</h3>
+<p>用于站长及管理员，此标签将允许以邮件方式发送网站变更信息。</p>
+
Index: tags/2.4.0RC3/language/zh_CN/help/permalinks.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/permalinks.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/permalinks.html	(revision 14585)
@@ -0,0 +1,7 @@
+<h2>永久链接</h2>
+
+<p>永久链接可以使相册url地址更简洁。当一个相册被定义了一个永久链接后，url地 址中则不再需要相册的id. </p>
+
+<p>当删除一个永久链接后，你可以将它保存在永久链接历史记录中，这样从外部访问 到Piwigo相册地址仍然奏效。 在永久链接历史记录中，你可以查看该链接被删除的时间，该链接的最后使用日期以及 该链接被使用过的次数。</p>
+
+<p>注意：每个相册的永久链接必须为独立的。同样，在永久链接历史记录中，同一个 永久链接地址不能被多次定义。</p>
Index: tags/2.4.0RC3/language/zh_CN/help/photos_add_ftp.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/photos_add_ftp.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/photos_add_ftp.html	(revision 14585)
@@ -0,0 +1,96 @@
+<fieldset>
+  <legend>快速开始</legend>
+
+<ol>
+  <li>在你的电脑里创建一个文件夹。</li>  
+
+  <li>复制一些图片到此文件夹，调整它们的大小以适合网上浏览。 <em>注意</em>: 文件名和文件夹必须以字母、数字、 "-"、 "_" 或者 "." 组成。没有空格，没有特别的符号。</li>
+
+  <li>使用FTP客户端，复制你的文件夹到 Piwigo 的 "galleries" 文件夹里。</li>
+
+  <li>登录你的相册，进入 <span class="pwgScreen">管理员 &raquo; 图片 &raquo; 缩略图</span> 以创建你的缩略图。</li>
+
+  <li>进入 <span class="pwgScreen">管理员</span> 然后点击“快速同步”的大按钮。</li>
+</ol>
+
+恭喜！你已成功地为你的相册创建了第一个类别。
+
+</fieldset>
+<fieldset>
+  <legend>文件夹与文件结构</legend>
+<ul>
+
+  <li>
+
+    <p>类别文件夹均放在 Piwigo 的 "galleries" 文件夹里。以下的文件夹树里有一个很小的相册(但使用了很多功能) :</p>
+
+    <pre>
+.
+|-- admin
+|-- doc
+|-- galleries
+|   |-- category-1
+|   |   |-- category-1.1
+|   |   |   |-- category-1.1.1
+|   |   |   |   |-- category-1.1.1.1
+|   |   |   |   |   |-- pwg_high
+|   |   |   |   |   |   +-- wedding.jpg
+|   |   |   |   |   |-- thumbnail
+|   |   |   |   |   |   +-- TN-wedding.jpg
+|   |   |   |   |   +-- wedding.jpg
+|   |   |   |   +-- category-1.1.1.2
+|   |   |   +-- category-1.1.2
+|   |   |-- category-1.2
+|   |   |   |-- pookie.jpg
+|   |   |   +-- thumbnail
+|   |   |       +-- TN-pookie.jpg
+|   |   +-- category-1.3
+|   +-- category-2
+|       |-- piglet.gif
+|       |-- pwg_representative
+|       |   +-- video.jpg
+|       |-- thumbnail
+|       |   +-- TN-piglet.jpg
+|       +-- video.avi
+|-- include
+|-- install
+|-- language
+|-- template
++-- tool</pre>
+
+  </li>
+  
+  <li>每个在 "galleries" 下面的文件夹都是一个产品类别。没有级别限制，即可以添加无限子级别。</li>
+
+  <li>基本上，一个文件代表一个元素。如果文件的扩展名存在于 <code>file_ext</code> 参数配置里，其将可作为 Piwigo 的一个元素(参见 <span class="filename">include/config_default.inc.php</span> 文件)。如果文件的扩展名存在于 <code>picture_ext</code> 参数配置里，其将作为一个图片。</li>
+
+  <li>图片元素必须要有一张对应的缩略图 (参见以下缩略图的相关说明)</li>
+
+  <li>图片元素可以有一个高品质的文件与其关联。如以上 wedding.jpg 的例子。高品质图片不需要前缀。</li>
+
+  <li>非图片元素 (如视频，声频，文本文件，一切你想到的...) 均以文件扩展名的默认图标显示。或者，你可以用一张缩略图来代表这个文件 (参见 video.avi 的例子)。</li>
+
+  <li><em>注意</em>: 文件名和文件夹必须以字母、数字、 "-"、 "_" 或者 "." 组成。没有空格，没有特别的符号。</li>
+
+  <li>一旦文件、缩略图都放到其正确的位置后，进入 : <span class="pwgScreen">管理员 &raquo; 类 &raquo;
+  同步</span></li>
+
+</ul>
+
+</fieldset>
+<fieldset>
+  <legend>缩略图</legend>
+<ul>
+
+  <li>每个图片必须要有一张缩略图。</li>
+
+  <li>缩略图保存在类别文件夹里名为 "thumbnail" 的子文件夹。缩略图文件名与图片的文件名一致，将会以 <em>TN-</em> 为前缀</li>
+
+  <li><em>建议</em>: 使用外部工具来创建缩略图。</li>
+
+  <li>你可以使用<span class="pwgScreen">管理员 &raquo; 图片 &raquo; 缩略图</span> 页面来创建缩略图。即使这是不被推荐的 (考虑到图片品质，网络服务器资源读取等问题)。</li>
+
+  <li>分配给所有类别文件夹写权限。</li>
+
+</ul>
+</fieldset>
Index: tags/2.4.0RC3/language/zh_CN/help/search.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/search.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/search.html	(revision 14585)
@@ -0,0 +1,19 @@
+<h2>搜索</h2>
+
+<p>可以在本页面搜索整个相册中的图片。</p>
+
+<dl>
+
+  <dt>文字搜索</dt>
+  <dd>通过相册中图片的相关属性搜索一个或多个文字。使用*作为通配符匹配的部分。</dd>
+
+  <dt>作者搜索</dt>
+  <dd>使用*作为通配符匹配的部分。</dd>
+
+  <dt>日期搜索</dt>
+  <dd>选择一个日期或者您要查询的截止日期。若要使用一个”之前“的查询，请将日期区域留空。年份栏必须以下列格式输入：AAAA（如：2004）</dd>
+
+  <dt>分类搜索</dt>
+  <dd>选择一个或多个您要搜索的分类。若搜索全部子分类，通过选择搜索母分类和子分类下面的设置启用搜索。</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/zh_CN/help/synchronize.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/synchronize.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/synchronize.html	(revision 14585)
@@ -0,0 +1,11 @@
+<h2>同</h2>
+
+<p>有两种同步方式可供选择：目录/文件 以及 文件meta数据。
+目录/文件方式可以使数据库中的相册树与目录树同步。
+Meta数据方式则是同步照片信息诸如：文件大小、像素大小、EXIF或IPTC等信息。
+</p>
+
+<p>同步的第一步必须由目录/文件方式进行。</p>
+
+<p>同步过程可能花费的时间较长（取决于您的服务器速度以及要管理的元素质量），所以
+尽可能一个相册一个相册地处理。</p>
Index: tags/2.4.0RC3/language/zh_CN/help/thumbnail.html
===================================================================
--- tags/2.4.0RC3/language/zh_CN/help/thumbnail.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/help/thumbnail.html	(revision 14585)
@@ -0,0 +1,24 @@
+<h2>创建缩略</h2>
+
+<p>可以在此页面创建丢失的缩略图。若相册使用的是共享主机，我们不建议您使用此功能。</p>
+
+<dl>
+
+  <dt>GD版本</dt>
+
+  <dd>GD是针对PHP的图像管控库。选择要植入服务器的版本。如出现错误提示，选择了错误的版本，请在同一个浏览器中选择返回上一页然后选择另外的版本。弱无匹配版本，则说明您的服务器不支持GD。</dd>
+
+  <dt>宽与高</dt>
+
+  <dd>最大缩略图尺寸。原始图像宽、高比已被保留。默认值可通过配置设置调整。<code>tn_width</code> et
+<code>tn_height</code>(见 <span class="filename">include/config_default.inc.php</span>文件)</dd>
+
+  <dt>创建缩略图序号</dt>
+
+  <dd>请不要一次压缩过多的图片。压缩过程会占用大量的CPU。若您的Piwigo相册使用的是一个免费的主机，过高的CPU负荷可能会导致您的网站被退出。</dd>
+
+  <dt>文件格式</dt>
+
+  <dd>缩略图均以JPEG格式创建。仅可被创建为PNG和JPEG图像。</dd>
+
+</dl>
Index: tags/2.4.0RC3/language/zh_CN/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_CN/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = '安装';
+$lang['Basic configuration'] = '基本设置';
+$lang['Default gallery language'] = '图库默认语言';
+$lang['Database configuration'] = '数据库设置';
+$lang['Admin configuration'] = '管理员帐户设置';
+$lang['Start Install'] = '开始安装';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '邮箱地址格式 xxx@yyy.eee (例 : jack@altern.org)';
+$lang['Webmaster login'] = '管理员';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = '所有用户都能看到此帐户。必须提供此帐户来管理网站';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = '服务器连接正常，但是无法连接到数据库';
+$lang['Can\'t connect to server'] = '无法连接到服务器';
+$lang['Host'] = 'MySQL主机地址';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = '用户';
+$lang['user login given by your host provider'] = '主机用户名';
+$lang['Password'] = '密码';
+$lang['user password given by your host provider'] = '主机用户密码';
+$lang['Database name'] = '数据库名称';
+$lang['also given by your host provider'] = '在主机设定的数据库名称';
+$lang['Database table prefix'] = '表名称前缀';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = '所有的表名称都加此前缀(有利于数据库管理)';
+$lang['enter a login for webmaster'] = '请输入网管名';
+$lang['webmaster login can\'t contain characters \' or "'] = '网管名不应包含字符 " 和 \'';
+$lang['please enter your password again'] = '请再次输入密码';
+$lang['Webmaster password'] = '密码';
+$lang['Keep it confidential, it enables you to access administration panel'] = '请小心保管好此密码，它允许你操作管理板块。';
+$lang['Password [confirm]'] = '密码 [ 确认 ]';
+$lang['verification'] = '核实';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '需要帮助？ 请到<a href="%s">Piwigo论坛</a>提出你的问题.';
+$lang['Webmaster mail address'] = '管理员Email地址';
+$lang['Visitors will be able to contact site administrator with this mail'] = '游客通过此Email跟你联系';
+$lang['PHP 5 is required'] = '必须PHP 5版本';
+$lang['It appears your webhost is currently running PHP %s.'] = '你主机PHP版本好像是PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo试着创建或修改.htaccess文件来转换到PHP 5。';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = '注意；你也可以自己修改设置PHP然后重新启动Piwigo。';
+$lang['Try to configure PHP 5'] = '试试配置PHP 5';
+$lang['Sorry!'] = '对不起!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo不能设置PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = '你应该联系你的主机管理员并向其请教如何设置PHP 5.';
+$lang['Hope to see you back soon.'] = '希望下次再见到你...';
+$lang['Congratulations, Piwigo installation is completed'] = '恭喜，Piwigo 已安装完成。';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = '另一个解决办法是，将以上文本框里的文本拷贝到 "local/config/database.inc.php" 文件里（注意：database.inc.php 必须只能包含此文本框里的内容，没有换行或者空格字符）';
+$lang['Creation of config file local/config/database.inc.php failed.'] = '创建 local/config/database.inc.php 文件失败.';
+$lang['Download the config file'] = '下载配置文件';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = '您可以下载配置文件，然后上传到 local/config 目录以完成您的安装.';
+$lang['Welcome to my photo gallery'] = '欢迎来到我的相册';
+$lang['Just another Piwigo gallery'] = '另一个崭新的Piwigo相册';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = '不要犹豫，来我们的论坛咨询任何Piwigo相关问题：%s';
+$lang['Welcome to your new installation of Piwigo!'] = '欢迎安装Piwigo！';
+?>
Index: tags/2.4.0RC3/language/zh_CN/iso.txt
===================================================================
--- tags/2.4.0RC3/language/zh_CN/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+简体中文 [CN]
Index: tags/2.4.0RC3/language/zh_CN/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_CN/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_CN/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['Upgrade'] = "升级";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "这个页面试图更新你的与Piwigo相关的数据库。 更新助手认为你现在正在运行 <strong>版本 %s</strong> （或相同的对应版本）。";
+$lang['Upgrade from version %s to %s'] = "从 %s 版本升级到 %s 版本";
+$lang['Statistics'] = "统计量";
+$lang['total upgrade time'] = "总升级时间";
+$lang['total SQL time'] = "总 SQL 时间";
+$lang['SQL queries'] = "SQL 查询";
+$lang['Upgrade informations'] = "升级信息";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "如果你遇上任何问题请到 [管理>工具>维护] 运行一次维护检查";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "请注意,以下插件已被禁用，你在激活它们之前必须先检查插件的更新：";
+$lang['Only administrator can run upgrade: please sign in below.'] = "只有管理员才能运行更新，请在下面登入。";
+$lang['You do not have access rights to run upgrade'] = "你没有权限运行更新";
+$lang['All sub-albums of private albums become private'] = "所有私有相册的子相册均变为私有的";
+$lang['User permissions and group permissions have been erased'] = "用户权限和组权限已经删除";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "之前的设置只有预览图前缀和网管电子邮件地址被保存";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '在<i>%s</i>，在<b>?></b>之前，插入';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = '请注意,以下主题已被禁用，你在激活它们之前必须先检查主题的更新：';
+?>
Index: tags/2.4.0RC3/language/zh_TW/about.html
===================================================================
--- tags/2.4.0RC3/language/zh_TW/about.html	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/about.html	(revision 14585)
@@ -0,0 +1,14 @@
+<p>此相冊畫廊是基於 Piwigo 的.</p>
+
+<p>Piwigo 是一個網絡的相冊畫廊軟件，她是由一個活躍的社區用戶和開發者創建的。
+製作 Piwigo 的自定義擴展是非常容易的。使得 Piwigo 更錦上添花的是，
+她還是一個完全免費和開源的項目。</p>
+
+<p id="linkToPiwigo"><a href="http://cn.piwigo.org">瀏覽 Piwigo 網站</a></p>
+
+<p>以下是 Piwigo 的中文翻譯與維護人員 (以字母排序):
+
+ <ul>
+     <li>周毓華</li>
+  </ul>
+     .... 感謝他們！</p>
Index: tags/2.4.0RC3/language/zh_TW/admin.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_TW/admin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/admin.lang.php	(revision 14585)
@@ -0,0 +1,897 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['%d association'] = '%d 相關';
+$lang['%d associations'] = '%d 相關';
+$lang['%d album including'] = '%d 相冊包含中';
+$lang['%d albums including'] = '%d 相冊包含中';
+$lang['%d physical'] = '物理 %d';
+$lang['%d physical'] = '物理 %d ';
+$lang[' and %d virtual'] = ' 和 虛擬 %d ';
+$lang[' and %d virtual'] = ' 和 虛擬 %d ';
+$lang['%d album moved'] = '%d 相冊已移動';
+$lang['%d albums moved'] = '%d 相冊已移動';
+$lang['%d group'] = '%d 組';
+$lang['%d groups'] = '%d 組';
+$lang['%d member'] = '%d 成員';
+$lang['%d members'] = '%d 成員';
+$lang['%d tag'] = '%d 標籤';
+$lang['%d tags'] = '%d 標籤';
+$lang['%d user comment rejected'] = '%d 用戶評論被刪除';
+$lang['%d user comments rejected'] = '%d 用戶評論被刪除';
+$lang['%d user comment validated'] = '%d 用戶評論已確認有效';
+$lang['%d user comments validated'] = '%d 用戶評論已確認有效';
+$lang['%d user deleted'] = '%d 用戶已刪除';
+$lang['%d users deleted'] = '%d 用戶已刪除';
+$lang['%d user'] = '%d 用戶';
+$lang['%d users'] = '%d 用戶';
+$lang['%d waiting for validation'] = '%d 等待確認有效';
+$lang['Actions'] = '實施';
+$lang['Activate'] = '激活';
+$lang['Add/delete a permalink'] = '增加/刪除一個固定鏈接';
+$lang['Add a tag'] = '增加標籤';
+$lang['Add a user'] = '增加用戶';
+$lang['Add group'] = '增加組';
+$lang['Add'] = '增加';
+$lang['Allow user registration'] = '允許用戶註冊';
+$lang['Apply to sub-albums'] = '應用到子相冊';
+$lang['Associated'] = '關聯於';
+$lang['Caddie management'] = '購物籃管理';
+$lang['Caddie'] = '購物籃';
+$lang['Albums authorized thanks to group associations'] = '相冊組織授權感謝協會';
+$lang['Album manual order was saved'] = '相冊手工排序已保存';
+$lang['Check for upgrade failed for unknown reasons.'] = '因未知原因導致更新檢測失敗.';
+$lang['Check for upgrade'] = '檢測更新';
+$lang['Comments for all'] = '對所有成員進行評論';
+$lang['Current name'] = '現用名';
+$lang['Database'] = '數據庫';
+$lang['Deactivate'] = '註銷';
+$lang['Delete Representant'] = '刪除代理人';
+$lang['Delete selected tags'] = '刪除所選標籤';
+$lang['Delete selected users'] = '刪除所選用戶';
+$lang['Deletions'] = '刪除';
+$lang['Deny selected groups'] = '所選組禁止訪問';
+$lang['Deny selected users'] = '所選用戶禁止訪問';
+$lang['Description'] = '描述';
+$lang['Display options'] = '顯示選項';
+$lang['Dissociated'] = '取消聯繫';
+$lang['Does not represent'] = '不需描繪';
+$lang['Edit selected tags'] = '編輯所選標籤';
+$lang['Edit tags'] = '編輯標籤';
+$lang['Email admins when a new user registers'] = '一旦用戶註冊就通知管理員';
+$lang['Email admins when a valid comment is entered'] = '當用戶發表評論時就通知管理員';
+$lang['Email admins when a comment requires validation'] = '當用戶要求確認他的評論時通知管理員';
+$lang['Environment'] = '環境';
+$lang['Form'] = '表單';
+$lang['Gallery title'] = '圖庫標題';
+$lang['Grant selected groups'] = '對所選組授權';
+$lang['Grant selected users'] = '對所選用戶授權';
+$lang['Group name'] = '組名';
+$lang['Groups'] = '組';
+$lang['Guests'] = '遊客';
+$lang['History'] = '歷史';
+$lang['Informations'] = '信息';
+$lang['Install'] = '安裝';
+$lang['Link all album photos to a new album'] = '鏈接所有相冊的相片到新的相冊';
+$lang['Link all album photos to some existing albums'] = '鏈接所有相冊的相片到現有的相冊';
+$lang['Linked albums'] = '已鏈接相冊';
+$lang['Lock gallery'] = '凍結圖庫';
+$lang['Maintenance'] = '維護';
+$lang['Edit album permissions'] = '管理相冊的權限';
+$lang['Manage permissions for group "%s"'] = '對組 "%s" 進行權限管理';
+$lang['Manage permissions for user "%s"'] = '對用戶 "%s" 進行權限管理';
+$lang['Manage tags'] = '標籤管理';
+$lang['Members'] = '成員';
+$lang['Metadata synchronized from file'] = '對文件進行元數據同步';
+$lang['Move albums'] = '移動相冊';
+$lang['Move'] = '移動';
+$lang['Name'] = '名字';
+$lang['New name'] = '新名';
+$lang['New parent album'] = '新的父相冊';
+$lang['New tag'] = '新標籤';
+$lang['Number of comments per page'] = '每頁評論數';
+$lang['Number of rates'] = '投票數';
+$lang['Number of thumbnails to create'] = '縮略圖數';
+$lang['Only private albums are listed'] = '只列出私有相冊';
+$lang['Operating system'] = '操作系統';
+$lang['Options'] = '選項';
+$lang['Other private albums'] = '其他私有相冊';
+$lang['Page banner'] = '頁標語';
+$lang['Parent album'] = '父相冊';
+$lang['Path'] = '路徑';
+$lang['Permalink'] = '固定鏈接';
+$lang['Permalink %s has been previously used by album %s. Delete from the permalink history first'] = '固定鏈接 %s 已被 %s 相冊使用了。請先從固定鏈接歷史記錄刪除。';
+$lang['The permalink name must be composed of a-z, A-Z, 0-9, "-", "_" or "/". It must not be numeric or start with number followed by "-"'] = '固定鏈接中包含了非法字符（"a-zA-Z0-9", "-", "_" ou "/"）. 禁止使用數字和以"-"開頭後面緊跟數字';
+$lang['Permalink %s is already used by album %s'] = '固定鏈接 %s 已被 %s 相冊使用了';
+$lang['Permalink history'] = '固定鏈接歷史記錄';
+$lang['Permalinks'] = '固定鏈接';
+$lang['Permission denied'] = '禁止訪問';
+$lang['Permission granted thanks to a group'] = '同組成員可以訪問授權類';
+$lang['Permission granted'] = '允許訪問';
+$lang['Photo informations updated'] = '圖片更新信息';
+$lang['Plugins'] = '插件';
+$lang['Position'] = '位置';
+$lang['Preferences'] = '個人偏好';
+$lang['Properties'] = '屬性';
+$lang['Random photo'] = '隨機';
+$lang['Rate date'] = '投票日期';
+$lang['Rating by guests'] = '遊客投票數';
+$lang['Rating'] = '投票';
+$lang['Reject'] = '取消';
+$lang['Representant'] = '代理人';
+$lang['Representation of albums'] = '相冊代表';
+$lang['Representative'] = '代理人';
+$lang['Represents'] = '代理';
+$lang['Save order'] = '保存排序';
+$lang['Save to permalink history'] = '保存到固定鏈接的歷史記錄中';
+$lang['Select at least one album'] = '選擇最後一個相冊';
+$lang['Select at least one photo'] = '至少選中一張圖片';
+$lang['Select at least one user'] = '至少選中一個用戶';
+$lang['Show info'] = '顯示所有信息';
+$lang['Site manager'] = '網管';
+$lang['Status'] = '狀態';
+$lang['Statistics'] = '統計';
+$lang['Storage album'] = '存儲相冊';
+$lang['Sum of rates'] = '總投票分';
+$lang['Tag "%s" already exists'] = '標籤 "%s" 已存在';
+$lang['Tag "%s" was added'] = '標籤 "%s" 已加入';
+$lang['Tag selection'] = '標籤選擇';
+$lang['The %d following tags were deleted'] = '下面標籤 %d 已刪除';
+$lang['Unable to check for upgrade.'] = '不能檢測更新.';
+$lang['Uninstall'] = '卸載';
+$lang['Use the default photo sort order (defined in the configuration file)']='使用默認圖片排序(在配置文件中定義)';
+$lang['User comments validation'] = '確認用戶評論';
+$lang['Users'] = '用戶';
+$lang['Validate'] = '確認';
+$lang['Validation'] = '確認';
+$lang['Version'] = '版本';
+$lang['Virtual albums to move'] = '移動虛擬相冊';
+$lang['Virtual album name'] = '虛擬相冊名稱';
+$lang['Webmaster cannot be deleted'] = '不能刪除網管帳戶';
+$lang['You are running on development sources, no check possible.'] = '你運行的是源碼開發版本, 不能檢測最新版.';
+$lang['You cannot delete your account'] = "你不能刪除自己本身帳號";
+$lang['You cannot move an album in its own sub album'] = '您不能將一個相冊移動到其子相冊裡';
+$lang['You need to confirm deletion'] = '你必須確認刪除操作';
+$lang['Associate to album'] = '聯合到相冊';
+$lang['associate to group'] = '關聯到組';
+$lang['Authorized'] = '授權';
+$lang['Add a virtual album'] = '添加一個虛擬相冊';
+$lang['Authorize users to add comments on selected albums'] = '讓用戶可在所選相冊裡發表評論';
+$lang['The name of an album must not be empty'] = '相冊名稱不能為空';
+$lang['Lock albums'] = '鎖定相冊';
+$lang['Private'] = '私有相冊';
+$lang['Public'] = '公共相冊';
+$lang['Find a new representant by random'] = '隨機尋找代理人';
+$lang['Public / Private'] = '公有 / 私有';
+$lang['Manage authorizations for selected albums'] = '管理所選相冊的授權';
+$lang['Virtual album added'] = '虛擬相冊已添加';
+$lang['Virtual album deleted'] = '虛擬相冊已刪除';
+$lang['Access type'] = '權限類型';
+$lang['Information data registered in database'] = '信息已保存到數據庫中';
+$lang['Default display'] = '默認顯示';
+$lang['The gallery URL is not valid.'] = '圖庫地址不合法.';
+$lang['Main'] = '主頁';
+$lang['The number of comments a page must be between 5 and 50 included.'] = '每頁用戶評論數必須在5和50之間.';
+$lang['Configuration'] = '設置';
+$lang['confirm'] = '設置';
+$lang['Date'] = '日期';
+$lang['delete album'] = '刪除相冊';
+$lang['Dissociate from album'] = '從相冊裡分離';
+$lang['dissociate from group'] = '取消組關聯';
+$lang['Album updated successfully'] = '相冊信息已上傳成功.';
+$lang['photos per page'] = '每頁圖片';
+$lang['High definition enabled'] = '激活高清功能';
+$lang['File'] = '文件';
+$lang['first photo added on %s'] = '於 %s 上傳了第一幅圖';
+$lang['Forbidden'] = '禁止';
+$lang['global mode'] = '全局模式';
+$lang['group "%s" added'] = '增加 "%s" 組';
+$lang['group "%s" deleted'] = '刪除 "%s" 組';
+$lang['group "%s" updated'] = '更新 "%s" 組';
+$lang['The name of a group must not contain " or \' or be empty.'] = '組名不能包含 " 或 \' 並不能為空.';
+$lang['This name is already used by another group.'] = '組名已存在.';
+$lang['High definition'] = '高清';
+$lang['jump to album'] = '跳到相冊';
+$lang['jump to photo'] = '跳轉到圖';
+$lang['leave'] = '開鎖';
+$lang['Lock'] = '上鎖';
+$lang['Locked'] = '鎖定';
+$lang['manage album photos'] = '管理相冊裡的相片';
+$lang['manage sub-albums'] = '管理子相冊';
+$lang['Manage'] = '管理';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d second].'] = '已超過執行時間, 處理還需時間[估計時間: %d 秒].';
+$lang['Execution time is out, treatment must be continue [Estimated time: %d seconds].'] = '已超過執行時間, 處理還需時間[估計時間: %d 秒].';
+$lang['Prepared time for list of users to send mail is limited. Others users are not listed.'] = '由於發送用戶列表的準備時間受限制,其餘用戶將不被列出.';
+$lang['Time to send mail is limited. Others mails are skipped.'] = '發送郵件時間有限,其餘郵件被忽略.';
+$lang['To send ?'] = '發送?';
+$lang['Last send'] = '最後一次發送';
+$lang['email'] = '郵件';
+$lang['User'] = '用戶';
+$lang['See you soon,'] = '再見,';
+$lang['Go to'] = '轉至 ';
+$lang['Hello'] = '你好 ';
+$lang['New photos were added'] = '加入一些新圖片';
+$lang['on'] = '時間: ';
+$lang['between'] = '時間: ';
+$lang['and'] = ' 至 ';
+$lang['The webmaster has subscribed you to receiving notifications by mail.'] = '網管開通了你的郵件通知功能.';
+$lang['You have subscribed to receiving notifications by mail.'] = '你開通了郵件通知功能.';
+$lang['To subscribe'] = '註冊新用戶';
+$lang['If you encounter problems or have any question, please send a message to'] = '如有遇到故障或問題,請發郵件至 ';
+$lang['[NBM] Problems or questions'] = '[NBM] 故障或問題';
+$lang['The webmaster has unsubscribed you from receiving notifications by mail.'] = '網管取消了你的郵件通知功能.';
+$lang['You have unsubscribed from receiving notifications by mail.'] = '你取消了你的郵件通知功能.';
+$lang[', click on'] = ', 請點擊 ';
+$lang['To unsubscribe'] = '註銷';
+$lang['With blank value, gallery title will be used'] = '圖庫標題允許為空';
+$lang['Notification'] = '通知';
+$lang['Error when sending email to %s [%s].'] = '發送郵件 給 %s [%s] 是發生了錯誤.';
+$lang['Mail sent to %s [%s].'] = '已發送至 %s [%s].';
+$lang['%d mail was sent.'] = '%s 郵件已發送.';
+$lang['%d mails were sent.'] = '%s 郵件已發送.';
+$lang['%d mail was not sent.'] = '%s 郵件未被發送.';
+$lang['%d mails were not sent.'] = '%s 郵件未被發送.';
+$lang['No mail to send.'] = '沒有郵件要發送.';
+$lang['There is no available subscribers to mail.'] = '沒有用戶需要郵件通知.';
+$lang['Subscribers could be listed (available) only if there is new elements to notify.'] = '只有當有新圖片時,才能使用用戶郵件通知功能.';
+$lang['Anyway only webmasters can see this tab and never administrators.'] = '任何人都不能使用此標籤(網管除外).';
+$lang['No user to send notifications by mail.'] = '沒有郵件通知用戶.';
+$lang['New photos added'] = '新圖片已加入';
+$lang['Subscribe to notification by mail'] = '註冊郵件通知功能';
+$lang['Unsubscribe from notification by mail'] = '註銷郵件通知功能';
+$lang['Parameter'] = '設置';
+$lang['Continue processing treatment'] = '正在繼續處理中...';
+$lang['Complementary mail content'] = '郵件附加內容';
+$lang['Add detailed content'] = '增加細節內容';
+$lang['Send mail as'] = '發送郵件作為';
+$lang['Send mail to users'] = '給用戶發送郵件';
+$lang['Send'] = '發送';
+$lang['Options'] = '選項';
+$lang['Subscribed'] = '已註冊';
+$lang['Subscribe'] = '註冊';
+$lang['Parameters'] = '設置參數';
+$lang['Select recipients'] = '選擇接受郵件用戶';
+$lang['Subscribe/unsubscribe users'] = '註冊/註銷用戶';
+$lang['Unsubscribed'] = '已註銷';
+$lang['%d parameter was updated.'] = '%d 參數已更新.';
+$lang['%d parameters were updated.'] = '%d 等參數已更新.';
+$lang['%d user was not updated.'] = '%d 用戶沒有被更新.';
+$lang['%d users were not updated.'] = '%d 等用戶沒有被更新.';
+$lang['User %s [%s] was removed from the subscription list.'] = '用戶 %s [%s] 從註冊名單中刪除.';
+$lang['User %s [%s] was added to the subscription list.'] = '用戶 %s [%s] 加入到註冊名單中.';
+$lang['%d user was updated.'] = '%d 用戶已更新.';
+$lang['%d users were updated.'] = '%d 等用戶已更新.';
+$lang['User %s [%s] was not removed from the subscription list.'] = '用戶 %s [%s] 沒有從註冊名單中刪除.';
+$lang['User %s [%s] was not added to the subscription list.'] = '用戶 %s [%s] 沒有加到註冊名當中.';
+$lang['User %s [%s] added.'] = '用戶 %s [%s] 已加入.';
+$lang['Warning: subscribing or unsubscribing will send mails to users'] = '注意, 註冊或註銷都會給相關用戶發送郵件';
+$lang['Send mail on HTML format'] = '以HTML格式發送郵件';
+$lang['Include display of recent photos grouped by dates'] = '包括顯示最近按日期分組的圖片';
+$lang['Available only with HTML format'] = '只能以HTML格式';
+$lang['no write access'] = '不能寫入';
+$lang['Permissions'] = '權限';
+$lang['private'] = '私有';
+$lang['public'] = '公有';
+$lang['Purge never used notification feeds'] = '清除從沒使用過的通知回饋';
+$lang['Purge sessions'] = '清除會話';
+$lang['randomly represented'] = '隨機顯示';
+$lang['registration date'] = '保存日期';
+$lang['clean'] = '清除';
+$lang['Create this site'] = '創建網站';
+$lang['test'] = '測試';
+$lang['test this remote site'] = '測試遠端站點';
+$lang['remove tags'] = '刪除所有標籤';
+$lang['Repair and optimize database'] = '修復和優化數據庫';
+$lang['selection'] = '選擇';
+$lang['set to'] = '設置為';
+$lang['singly represented'] = '固定顯示';
+$lang['This site already exists'] = '此站點已存在';
+$lang['Create a new site : (give its URL to create_listing_file.php)'] = '新建遠端站點 : (在create_listing_file.php文件中給出url地址)';
+$lang['created'] = '已創建';
+$lang['delete'] = '刪除';
+$lang['delete this site and all its attached elements'] = '刪除此站點和與其相關聯的所有信息';
+$lang['an error happened'] = '發生錯誤';
+$lang['Local'] = '本地';
+$lang['Remote'] = '遠端';
+$lang['update the database from files'] = '根據文件對數據庫進行更新';
+$lang['status'] = '狀態';
+$lang['Directory'] = '文件夾';
+$lang['sub-albums'] = '子相冊';
+$lang['Synchronize metadata'] = '同步元數據';
+$lang['target'] = '目標';
+$lang['Thumbnail'] = '縮略圖';
+$lang['title'] = '標題';
+$lang['Album list management'] = '相冊管理';
+$lang['Piwigo configuration'] = '配置Piwigo';
+$lang['Edit album'] = '修改一個相冊';
+$lang['Group management'] = '組管理';
+$lang['User list'] = '用戶名單';
+$lang['Edit photo information'] = '修改圖片信息';
+$lang['Database synchronization with files'] = '根據文件來同步數據庫';
+$lang['all'] = '所有';
+$lang['height must be a number superior to'] = '圖片高度必須超過(整數)';
+$lang['width must be a number superior to'] = '圖片長度必須超過(整數)';
+$lang['for the file format'] = '對於文件格式';
+$lang['Photo unreachable or no support'] = '不支持圖片格式或無法顯示';
+$lang['GD version'] = 'GD版';
+$lang['General statistics'] = '普通統計';
+$lang['average time'] = '平均時間';
+$lang['number of miniaturized photos'] = '創建的縮略圖數';
+$lang['total time'] = '總共時間';
+$lang['for this file format'] = '對於此文件格式';
+$lang['unit mode'] = '單一模式';
+$lang['Unlocked'] = '解鎖';
+$lang['unset'] = '清空';
+$lang['Update albums informations'] = '上傳相冊信息';
+$lang['Update photos information'] = '更新圖信息';
+$lang['Synchronize'] = '同步';
+$lang['reduce to single existing albums'] = '減少現有的單獨相冊';
+$lang['Choose an option'] = '選擇一個選項';
+$lang['display maximum informations (added albums and photos, deleted albums and photos)'] = '顯示最全的信息 (添加相冊和相片，刪除相冊和相片)';
+$lang['Error list'] = '錯誤清單';
+$lang['Errors caption'] = '錯誤說明';
+$lang['Detailed informations'] = '詳細信息';
+$lang['File/directory read error'] = '文件/文件夾打開錯誤';
+$lang['The file or directory cannot be accessed (either it does not exist or the access is denied)'] = '無法打開文件或文件夾(要麼根本不存在,要麼拒絕訪問)';
+$lang['albums deleted in the database'] = '相冊已從數據庫刪除';
+$lang['photos deleted from the database'] = '圖片已從數據庫中刪除';
+$lang['photos candidates for metadata synchronization'] = '對應同步元數據的候選圖片';
+$lang['photos informations synchronized with files metadata'] = '附有元數據的同步圖片信息informations des images synchronisees avec les meta-donnees';
+$lang['errors during synchronization'] = '同步期間發生錯誤';
+$lang['albums added in the database'] = '相冊已添加到數據庫';
+$lang['photos added in the database'] = '增加圖片到數據庫';
+$lang['photos updated in the database'] = '更新數據庫中的圖片';
+$lang['Search for new images in the directories'] = '查詢文件中的新圖片';
+$lang['added'] = '已加入';
+$lang['deleted'] = '已刪除';
+$lang['Metadata synchronization results'] = '元數據更新結果';
+$lang['only perform a simulation (no change in database will be made)'] = '只進行模擬操作(不會改變數據庫中的任何內容)';
+$lang['Simulation'] = '模擬';
+$lang['directories + files'] = '文件夾 + 文件';
+$lang['only directories'] = '只對文件夾';
+$lang['synchronize files structure with database'] = '同步文件結構和數據庫';
+$lang['synchronize files metadata with database photos informations'] = '根據文件元數據同步數據庫中的圖片信息';
+$lang['even already synchronized photos'] = '包括已經同步的圖片';
+$lang['Used metadata'] = '已使用過的元數據';
+$lang['The name of directories and files must be composed of letters, numbers, "-", "_" or "."'] = '文件夾和文件名稱只能包含字母, 數字, "-", "_" 和 "."';
+$lang['wrong filename'] = '文件名出錯';
+$lang['Upload'] = '增加';
+$lang['user "%s" added'] = '用戶 "%s" 已加入';
+$lang['User status'] = '用戶狀態';
+$lang['user_status_admin'] = '管理員';
+$lang['user_status_generic'] = '一般用戶';
+$lang['user_status_guest'] = '來賓';
+$lang['user_status_normal'] = '遊客';
+$lang['user_status_webmaster'] = '網管';
+$lang['Virtual album'] = '虛擬相冊';
+$lang['Waiting'] = '等待';
+$lang['default'] = '默認';
+$lang['Toggle \'default group\' property'] = '賦予\'groupe par defaut\'默認組屬性';
+$lang['Advanced features'] = '高級功能';
+$lang['Overall'] = '全局視圖';
+$lang['Year'] = '年';
+$lang['Month'] = '月';
+$lang['Day'] = '日';
+$lang['Pages seen'] = '已訪問過的頁面';
+$lang['Time'] = '時間';
+$lang['IP'] = 'IP';
+$lang['Element'] = '圖片';
+$lang['Section'] = '區域';
+$lang['An information email was sent to group "%s"'] = '已向組 "%s" 的所有成員發送了信息郵件';
+$lang['Send an information email to group members'] = '向組成員發送一份信息郵件';
+$lang['Group'] = '組';
+$lang['[%s] Visit album %s'] = '[%s] 參觀相冊 %s';
+$lang['Hello,'] = '你好,';
+$lang['See you soon.'] = '再見.';
+$lang['Discover album:'] = '探索相冊:';
+$lang['Mail content'] = '郵件內容';
+$lang['none'] = '沒有任何人';
+$lang['high'] = '高';
+$lang['other'] = '另外';
+$lang['Element type'] = "內容類型";
+$lang['Image id'] = '圖片標識符';
+$lang['Summary'] = '概述';
+$lang['%d line filtered'] = '%d 行被過濾';
+$lang['%d lines filtered'] = '%d 行被過濾';
+$lang['%d guest'] = '%d 來賓';
+$lang['%d guests'] = '%d 來賓';
+$lang['Hour'] = '小時';
+$lang['guest'] = '來賓';
+$lang['default values'] = '默認值';
+$lang['Guest cannot be deleted'] = '不能刪除來賓';
+$lang['Default user cannot be deleted'] = '不能刪除默認用戶';
+$lang['Purge history detail'] = '清除歷史記錄';
+$lang['Purge history summary'] = '清除歷史目錄';
+$lang['Check integrity'] = '檢測完整性';
+$lang['Anomaly'] = '異常';
+$lang['Correction'] = '修復';
+$lang['Automatic correction'] = '自動修復';
+$lang['Impossible automatic correction'] = '無法自動修復';
+$lang['Correction applied with success'] = '修復成功';
+$lang['Correction applied with error'] = '修復出錯';
+$lang['%d anomaly has been detected.'] = '發現了 %d 異常.';
+$lang['%d anomalies have been detected.'] = '發現了 %d 個異常.';
+$lang['%d anomaly has been corrected.'] = '修正了 %d 異常.';
+$lang['%d anomalies have been detected corrected.'] = '修正了 %d 個異常.';
+$lang['%d anomaly has not been corrected.'] = '不能修正 %d 異常.';
+$lang['%d anomalies have not been corrected.'] = '不能修正 %d 個異常.';
+$lang['Go to %s or %s for more informations'] = '獲取更多信息，請到 %s 或者 %s ';
+$lang['the forum'] = '論壇';
+$lang['the wiki'] = 'wiki';
+$lang['%s value is not correct file because exif are not supported'] = ' %s 值不是一個正確文件，因為我們不支持exif格式';
+$lang['%s must be to set to false in your local/config/config.inc.php file'] = '在配置文件config_local.inc.php中 %s 應該設置為"false"';
+$lang['Main "guest" user does not exist'] = '主要"guest"用戶不存在';
+$lang['Main "guest" user status is incorrect'] = '主要"guest"用戶狀態異常';
+$lang['Default user does not exist'] = '默認帳戶不再存在';
+$lang['Main "webmaster" user does not exist'] = '主要網管帳戶不再存在';
+$lang['Main "webmaster" user status is incorrect'] = '主要網管用戶狀態異常';
+$lang['User "%s" created with "%s" like password'] = '用戶 "%s" 已創建，密碼是"%s"';
+$lang['Status of user "%s" updated'] = '用戶 "%s" 狀態已更新';
+$lang['add new photos to caddie'] = '把所有新圖片放到購物籃';
+$lang['No display'] = '不顯示縮略圖';
+$lang['Classic display'] = '正常顯示';
+$lang['Hoverbox display'] = '俯瞰顯示';
+$lang['Mail address is obligatory for all users'] = '每個用戶必須提供郵箱地址';
+$lang['Minimum privacy level'] = '最小隱私等級';
+$lang['Privacy level'] = '隱私等級';
+$lang['Level 0'] = '---';
+$lang['Level 1'] = '聯繫';
+$lang['Level 2'] = '朋友';
+$lang['Level 4'] = '家庭';
+$lang['Level 8'] = '管理者';
+$lang['Reinitialize check integrity'] = '重新完整性檢測';
+$lang['Check all'] = '全選';
+$lang['Uncheck all'] = '取消全選';
+$lang['Check automatic corrections'] = '自動選擇';
+$lang['Apply selected corrections'] = '應用自動選擇';
+$lang['Ignore selected anomalies'] = '忽視選擇異常';
+$lang['Refresh'] = '刷新';
+$lang['The anomaly will be ignored until next application version'] = '此異常將被忽略，待下次版本中解決';
+$lang['Correction the anomaly will cancel the fact that it\'s ignored'] = '異常更正將取消忽略事件';
+$lang['%d anomaly has been ignored.'] = '%d 異常被忽略.';
+$lang['%d anomalies have been ignored.'] = '%d 異常被忽略.';
+$lang['Plugins which need upgrade'] = '必須更新插件';
+$lang['Plugin list'] = '插件列表';
+$lang['Check for updates'] = '檢查更新';
+$lang['Other plugins'] = '其他插件';
+$lang['Last revisions'] = '最新修訂版';
+$lang['Are you sure you want to install this plugin?'] = '確定安裝此插件嗎?';
+$lang['Are you sure you want to delete this plugin?'] = '確定要刪除此插件嗎?';
+$lang['Are you sure to install this upgrade? You must verify if this version does not need uninstallation.'] = '確定安裝此更新嗎? 你必須核實無需卸載操作再進行安裝此更新.';
+$lang['Plugin has been successfully copied'] = '插件複製成功.';
+$lang['You might go to plugin list to install and activate it.'] = '在插件列表中安裝和啟動插件.';
+$lang['Can\'t create temporary file.'] = '無法創建臨時文件.';
+$lang['Can\'t download archive.'] = '無法下載歸檔文件.';
+$lang['Can\'t read or extract archive.'] = '無法讀取或解壓歸檔文件.';
+$lang['An error occured during extraction (%s).'] = '在解壓文件(%s) 發生錯誤.';
+$lang['Please check "plugins" folder and sub-folders permissions (CHMOD).'] = '請核實"plugins"文件夾及其子文件夾的權限(CHMOD).';
+$lang['Can\'t connect to server.'] = '無法連接到服務器.';
+$lang['Purge compiled templates'] = '清除編譯模板';
+$lang['Support'] = '支持';
+$lang['Documentation'] = '文檔';
+$lang['ACCESS_0'] = '自由存取';
+$lang['ACCESS_1'] = '對所有人開放';
+$lang['ACCESS_2'] = '只對註冊用戶開放';
+$lang['ACCESS_3'] = '只對管理員開放';
+$lang['ACCESS_4'] = '只對網管開放';
+$lang['ACCESS_5'] = '對任何人都不開放';
+$lang['A new version of Piwigo is available.'] = 'Piwigo新版發佈.';
+$lang['Piwigo Administration'] = 'Piwigo管理';
+$lang['Piwigo version'] = 'Piwigo版本';
+$lang['You are running the latest version of Piwigo.'] = '你運行的是Piwigo最新版.';
+$lang['The version of %s [%s] installed is not compatible with the version required [%s]'] = '%s [%s]安裝版本跟[%s]版本不兼容';
+$lang['You need to upgrade your system to take full advantage of the application else the application will not work correctly, or not at all'] = '為了獲得全部功能，你應該更新系統，否則程序運行不正常。';
+$lang['Deleted on'] = '刪除於';
+$lang['Last hit'] =  '最後一次查看';
+$lang['GD library is missing'] = '缺少GD庫';
+$lang['Templates'] = '模板';
+$lang['Extend for templates'] = '擴展模板';
+$lang['Replacement of original templates by customized templates from template-extension subfolder'] = '用位於template-extension文件夾下的用戶自定義模板更換原模板';
+$lang['Replacers (customized templates)'] = '自定義模板';
+$lang['Original templates'] = '原模板';
+$lang['Optional URL keyword'] = '可選URL關鍵字';
+$lang['Templates configuration has been recorded.'] = '模板設置已保存.';
+$lang['All optimizations have been successfully completed.'] = '優化成功.';
+$lang['Optimizations have been completed with some errors.'] = '有些優化發生錯誤.';
+$lang['Modify information'] = '修改信息';
+$lang['nothing'] = '沒有內容';
+$lang['overrides existing values with empty ones'] = '用空數據來刪除已存在的數據';
+$lang['Manage photo ranks'] = '管理圖片排序';
+$lang['Edit ranks'] = '修改排序方式';
+$lang['No photo in this album'] = '沒有相片在此相冊裡';
+$lang['Images manual order was saved'] = '圖片手動排序已保存';
+$lang['ranks'] = '順序';
+$lang['Drag to re-order'] = '拖放進行排序';
+$lang['Quick Local Synchronization'] = '快速同步';
+$lang['No photo can be deleted'] = '沒有圖片可以刪除';
+$lang['Delete selected photos'] = '刪除圖片';
+$lang['%d photo was deleted'] = '%d 圖片被刪除';
+$lang['%d photos were deleted'] = '%d 圖片被刪除';
+$lang['Downloads'] = '下載';
+$lang['Released on'] = '發佈於';
+$lang['Number of downloads'] = '下載次數';
+$lang['Operation in progress'] = '正在處理.';
+$lang['Please wait...'] = '請稍後...';
+$lang['Keep in touch with Piwigo project, subscribe to Piwigo Announcement Newsletter. You will receive emails when a new release is available (sometimes including a security bug fix, it\'s important to know and upgrade) and when major events happen to the project. Only a few emails a year.'] = '訂閱 Piwigo 最新消息，與 Piwigo 項目保持聯繫。當有新版本發佈時，您將會收到郵件通知（有時也包括安全漏洞的修復，這對於升級是很重要的）和項目裡一些重要事情的發生。一年裡也只有幾封郵件。';
+$lang['Password is missing. Please enter the password.'] = '密碼沒有輸入，請輸入密碼。';
+$lang['Password confirmation is missing. Please confirm the chosen password.'] = '密碼確認未完成，請確認所選定的密碼。';
+$lang['Allow users to edit their own comments'] = '允許用戶修改自己的評論';
+$lang['Allow users to delete their own comments'] = '允許用戶刪除自己的評論';
+$lang['Email administrators when a comment is modified'] = '當評論被修改後，發郵件通知管理員';
+$lang['Email administrators when a comment is deleted'] = '當評論被刪除後，發郵件通知管理員';
+$lang['Cannot delete the old permalink !'] = '舊的固定鏈接不能被刪除!';
+$lang['Hit'] = '點擊';
+$lang['Tools'] = '工具';
+$lang['Photos'] = '相片';
+$lang['Themes'] = '主題';
+$lang['Instructions to use Piwigo'] = 'Piwigo 使用指南';
+$lang['Installed Themes'] = '安裝主題';
+$lang['Add New Theme'] = '添加一個新主題';
+$lang['Forbid this theme to users'] = '禁用此主題';
+$lang['Set as default theme for unregistered and new users'] = '設置為未註冊者和新用戶的默認主題';
+$lang['unknown'] = '未知';
+$lang['Upload Photos'] = '上傳相片';
+$lang['Drop into album'] = '拖進相冊';
+$lang['+ Add an upload box'] = '+ 添加一個上傳框';
+$lang['Create the "%s" directory at the root of your Piwigo installation'] = '在您的根目錄下創建 "%s" 目錄以完成 Piwigo 的安裝';
+$lang['Give write access (chmod 777) to "%s" directory at the root of your Piwigo installation'] = '給予根目錄下的 "%s" 目錄寫權限 (chmod 777) 以完成 Piwigo 的安裝';
+$lang['existing album'] = '現有的相冊';
+$lang['create a new album'] = '創建一個新相冊';
+$lang['Album name'] = '相冊名稱';
+$lang['Album "%s" has been added'] = '類別 "%s" 已添加';
+$lang['Uploaded Photos'] = '相片已上傳';
+$lang['%d photos uploaded'] = '%d 相片已上傳';
+$lang['Privacy level set to "%s"'] = '私有級別設置為 "%s"';
+$lang['Album "%s" now contains %d photos'] = '類別 "%s" 現已包含了 %d 相片';
+$lang['Manage this set of %d photos'] = '管理此設置的 %d 張照片 ';
+$lang['Select files'] = '選擇文件';
+$lang['Everybody'] = '每個人';
+$lang['Who can see these photos?'] = '哪些人可以看到這些相片?';
+$lang['Settings'] = '設置';
+$lang['Resize'] = '重置大小';
+$lang['Maximum Width'] = '最大寬度';
+$lang['pixels'] = '像素';
+$lang['Maximum Height'] = '最大高度';
+$lang['Image Quality'] = '圖片質量';
+$lang['Save Settings'] = '保存設置';
+$lang['Your configuration settings are saved'] = '你的設置已保存';
+$lang['Active Themes'] = '已激活的主題';
+$lang['Add write access to the "%s" directory'] = '為 "%s" 目錄添加寫權限';
+$lang['Administration Home'] = '管理員首頁';
+$lang['Change Admin Colors'] = '更改管理員後台顏色';
+$lang['Delete this theme'] = '刪除此主題';
+$lang['Directory does not exist'] = '目錄不存在';
+$lang['Download,'] = '下載,';
+$lang['FTP + Synchronization'] = 'FTP + 同步';
+$lang['Get Support on Piwigo Forum'] = '在 Piwigo 論壇上獲取幫助';
+$lang['Help Me'] = '幫助我';
+$lang['Impossible to activate this theme, the parent theme is missing: %s'] = '父主題  %s 丟失，此主題不能被激。';
+$lang['Impossible to delete this theme. Other themes depends on it: %s'] = '此主題不能刪除，因為其他主題還有依賴與它: %s';
+$lang['Inactive Themes'] = '停用主題';
+$lang['Install on your computer,'] = '安裝到您的電腦,';
+$lang['Make this theme available to users'] = '讓用戶可使用此主題';
+$lang['Page end'] = '頁尾';
+$lang['Piwigo Uploader'] = 'Piwigo 上傳者';
+$lang['Read Piwigo Documentation'] = '閱讀 Piwigo 文檔';
+$lang['Start pLoader and add your photos.'] = '開始使用 pLoader 並添加您的相片.';
+$lang['Switch to clear or dark colors for administration'] = '更改管理員後台為清爽或者黑暗的顏色';
+$lang['Theme has been successfully installed'] = '主題已成功安裝';
+$lang['Visit Gallery'] = '瀏覽畫廊';
+$lang['Visit Piwigo project website'] = '瀏覽 Piwigo 項目網站';
+$lang['pLoader stands for <em>Piwigo Uploader</em>. From your computer, pLoader prepares your photos and transfer them to your Piwigo photo gallery.'] = 'pLoader 是 <em>Piwigo 上傳者</em> 的官方標準軟件。pLoader 可將您電腦裡的相片傳送到 Piwigo 的相片畫廊裡。';
+$lang['Guest Settings'] = '遊客設置';
+$lang['Main Page'] = '主頁';
+$lang['Photo Page'] = '相片頁';
+$lang['Activate Navigation Bar'] = '激活導航條';
+$lang['Activate Navigation Thumbnails'] = '激活縮略圖導航';
+$lang['Activate icon "%s"'] = '激活圖標 "%s"';
+$lang['Photo Properties'] = '相片屬性';
+$lang['Allow user customization'] = '允許用戶自定義';
+$lang['Languages'] = '語言';
+$lang['Installed Languages'] = '安裝語言';
+$lang['Add New Language'] = '添加新語言';
+$lang['Language has been successfully installed'] = '語言已成功安裝';
+$lang['Select:'] = '選擇:';
+$lang['None'] = '沒有';
+$lang['Invert'] = '反轉';
+$lang['Impossible to deactivate this theme, you need at least one theme.'] = '不能停用此主題，您至少需要使用一個主題.';
+$lang['Webmaster status is required.'] = '必須設置網站管理員.';
+$lang['Bound Theme'] = '綁定主題';
+$lang['Allow rating'] = '允許投票';
+$lang['Select at least one comment'] = '選擇最新一個評論';
+$lang['Active Plugins'] = '激活插件';
+$lang['Inactive Plugins'] = '停用插件';
+$lang['Missing Plugins'] = '丟失的插件';
+$lang['Uninstalled Plugins'] = '未安裝的插件';
+$lang['By %s'] = '按 %s';
+$lang['Visit plugin site'] = '瀏覽插件網站';
+$lang['Active Languages'] = '激活語言';
+$lang['Delete this language'] = '刪除此語言';
+$lang['Forbid this language to users'] = '禁止用戶使用此語言';
+$lang['Impossible to deactivate this language, first set another language as default.'] = '不能停用此語言，請先設置一個默認語言.';
+$lang['Impossible to deactivate this language, you need at least one language.'] = '不能停用此語言，您必須至少使用一個語言.';
+$lang['Inactive Languages'] = '停用語言';
+$lang['Make this language available to users'] = '讓用戶可使用此語言';
+$lang['Set as default language for unregistered and new users'] = '設置為遊客和新用戶的默認語言';
+$lang['Add Photos'] = '添加相片';
+$lang['The following tag was deleted'] = '以下標籤已刪除';
+$lang['Miscellaneous'] = '雜項';
+$lang['Virtual Links'] = '虛擬鏈接';
+$lang['There is no other language available.'] = '沒有其他可用的語言.';
+$lang['There is no other plugin available.'] = '沒有其他可用的插件.';
+$lang['There is no other theme available.'] = '沒有其他可用的主題.';
+$lang['Add another set of photos'] = '添加另一組相片';
+$lang['By rank'] = '按等級';
+$lang['Manual order'] = '手工排序';
+$lang['Piwigo Announcements Newsletter'] = 'Piwigo最新消息公告';
+$lang['Subscribe %s'] = '訂閱%s';
+$lang['Subscribe %s to Piwigo Announcements Newsletter'] = '訂閱%s Piwigo中國最新消息公告';
+$lang['Purge search history'] = '清除查尋歷史記錄';
+$lang['Hide'] = '隱藏';
+$lang['Order of menubar items has been updated successfully.'] = '所有項目已被更新.';
+$lang['This theme was not designed to be directly activated'] = '此主題並未設計為直接激活';
+$lang['Who can see this photo?'] = '有哪些人能看這些相片?';
+$lang['Pending Comments'] = '待批的評論';
+$lang['Menu Management'] = '菜單';
+$lang['In your php.ini file, the upload_max_filesize (%sB) is bigger than post_max_size (%sB), you should change this setting'] = '在你的 php.ini 文件, 如果 upload_max_filesize (%sB) 大於 post_max_size (%sB), 那麼你需要修改此項';
+$lang['Exif extension not available, admin should disable exif use'] = 'Exif 擴展不能使用，管理員應該禁用 exif 功能。';
+$lang['The uploaded file exceeds the upload_max_filesize directive in php.ini: %sB'] = '上傳文件超過了在 php.ini 文件裡的 upload_max_filesize 限制: %sB';
+$lang['The uploaded files exceed the post_max_size directive in php.ini: %sB'] = '上傳文件超過了在 php.ini 文件裡的 post_max_size 限制: %sB';
+$lang['The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'] = '上傳文件超過了在 HTML 表單指定的 MAX_FILE_SIZE 的限制';
+$lang['The uploaded file was only partially uploaded'] = '上傳文件只上傳了一部分';
+$lang['No file was uploaded'] = '沒有文件被上傳';
+$lang['Missing a temporary folder'] = '缺少臨時文件目錄';
+$lang['Failed to write file to disk'] = '文件寫入失敗';
+$lang['File upload stopped by extension'] = '擴展使文件上傳停止';
+$lang['Unknown upload error'] = '未知上傳錯誤';
+$lang['Error on file "%s" : %s'] = '文件上的錯誤 "%s" : %s';
+$lang['%d of %d photos selected'] = '%d 張/總 %d 相片被選中';
+$lang['Action'] = '動作';
+$lang['Add a filter'] = '添加一個過濾器';
+$lang['Album photos associated to the following albums: %s'] = '相片已關聯到以下相冊: %s';
+$lang['Albums automatically sorted'] = '相冊已自動排序';
+$lang['All %d photos are selected'] = '全部 %d 張相片已選中';
+$lang['Apply action'] = '應用動作';
+$lang['automatic order'] = '自動排序';
+$lang['Batch Manager'] = '批量管理';
+$lang['Choose an action'] = '選擇一個動作';
+$lang['Delete orphan tags'] = '刪除沒被關聯的標籤';
+$lang['delete photo'] = '刪除相片';
+$lang['Duplicates'] = '重複';
+$lang['include child albums'] = '包含子相冊';
+$lang['manual order'] = '手工排序';
+$lang['No photo in the current set.'] = '當前集合沒有相片.';
+$lang['No photo selected, %d photos in current set'] = '沒有選擇相片, 當前集合有 %d 張相片';
+$lang['No photo selected, no action possible.'] = '沒有選擇相片，不會有動作執行.';
+$lang['on the %d selected photos'] = '在 %d 張已選相片上';
+$lang['Orphan tags deleted'] = '無關聯標籤已被刪除';
+$lang['Refresh photo set'] = '刷新相片集';
+$lang['Remove all filters'] = '刪除所有過濾器';
+$lang['remove author'] = '刪除作者';
+$lang['remove creation date'] = '刪除創建日期';
+$lang['remove this filter'] = '刪除此過濾器';
+$lang['remove title'] = '刪除標題';
+$lang['Selection'] = '選擇';
+$lang['Set author'] = '設置作者';
+$lang['Set creation date'] = '設置創建日期';
+$lang['Set title'] = '設置標題';
+$lang['The whole page'] = '整張相片';
+$lang['The whole set'] = '整個集合';
+$lang['Type here the author name'] = '在此輸入作者名稱';
+$lang['Type here the title'] = '在此輸入標題';
+$lang['Week starts on'] = '星期起始於';
+$lang['You have %d orphan tags: %s.'] = '您已 %d 無關聯標籤: %s.';
+$lang['Remove from caddie'] = '從購物藍裡移除';
+$lang['Themes which need upgrade'] = '需更新的主題';
+$lang['Languages which need upgrade'] = '需更新的語言';
+$lang['All themes are up to date.'] = '所有主題都是最新的';
+$lang['All plugins are up to date.'] = '所有插件都是最新的';
+$lang['All languages are up to date.'] = '所有語言都是最新的';
+$lang['Visit theme site'] = '瀏覽主題頁面';
+$lang['Visit language site'] = '瀏覽語言頁面';
+$lang['New Version'] = '新版本';
+$lang['new'] = '新增';
+$lang['No results'] = '沒有結果';
+$lang['Searching...'] = '搜尋中...';
+$lang['Type in a search term'] = '輸入搜索字詞';
+$lang['Obsolete Plugins'] = '過時(廢棄)的插件';
+$lang['WARNING! This plugin does not seem to be compatible with this version of Piwigo.'] = '警告! 這個插件與此Piwigo版本不相容!';
+$lang['Do you want to activate anyway?'] = '你無論如何都要啟動嗎?';
+$lang['THIS PLUGIN IS NOW PART OF PIWIGO CORE! DELETE IT NOW.'] = '這個插件目前是Piwigo核心一部份! 請立即移除它!';
+$lang['ERROR: THIS PLUGIN IS MISSING BUT IT IS INSTALLED! UNINSTALL IT NOW.'] = '錯誤：這個插件雖已安裝但並不存在! 請立即移除它!';
+$lang['display'] = '顯示'; 
+$lang['Learn more'] = '瞭解更多';
+$lang['Rate'] = '評分';
+$lang['Average rate'] = '評分';
+$lang['Activate icon "new" next to albums and pictures'] = '在相簿及相片旁邊加上"新"的圖示';
+$lang['Add a criteria'] = '新增標準';
+$lang['Deactivate all'] = '取消全部';
+$lang['Default photos order'] = '預設的相片順序';
+$lang['Restore'] = '復原';
+$lang['Restore default configuration. You will lose your plugin settings!'] = '復原至預設設定。你將失去你在套件上的設定！';
+$lang['Show menubar'] = '顯示選單列';
+$lang['You can\'t define a default photo order because you have a custom setting in your local configuration.'] = '無法使用預設相片順序，因你在本地端已另有設定。';
+$lang['You have specified <i>$conf[\'order_by\']</i> in your local configuration file, this parameter in deprecated, please remove it or rename it into <i>$conf[\'order_by_custom\']</i> !'] = '你已在本地設定檔選用 <i>$conf[\'order_by\']</i>，造成參數矛盾，請將它移除或重新命名為 <i>$conf[\'order_by_custom\']</i>！';
+$lang['Thumbnails generation in progress...'] = '小圖製作中...';
+$lang['Photos generation in progress...'] = '圖片製作中...';
+$lang['%s photos have been regenerated'] = '%s圖片製作完成';
+$lang['%s photos can not be regenerated'] = '無法製作%s圖片';
+$lang['Add to caddie'] = '放入購物籃';
+$lang['%s has been successfully updated.'] = '%s 已更新成功';
+$lang['(this tag will be deleted)'] = '(此標籤將被刪除)';
+$lang['... or '] = '... 或 ';
+$lang['Activate comments'] = '啟用評論';
+$lang['Add tags'] = '新增標籤';
+$lang['All extensions are up to date.'] = '所有的擴展是最新的';
+$lang['Allowed file types: %s.'] = '允許的文件類型: %s.';
+$lang['An error has occured during extract. Please check files permissions of your piwigo installation.<br><a href="%s">Click here to show log error</a>.'] = '在提取過程中發生錯誤。請檢查您piwigo安裝時的檔案權限.<br><a href="%s">點擊這裡顯示日誌中的錯誤</a>.';
+$lang['An error has occured during upgrade.'] = '升級過程中發生錯誤.';
+$lang['Approximate maximum resolution: %dM pixels (that\'s %dx%d pixels).'] = '大約最高解釋度: %dM 像素 (即 %dx%d像素).';
+$lang['By default, Piwigo will create a new websize from the HD (high definition) version of your photo.'] = '預設狀況下，Piwigo 將從原照片的高清晰度版本，建立另一個適用於網頁的尺寸版本。';
+$lang['Confirm merge'] = '確認合併';
+$lang['Create'] = '創建';
+$lang['Crop'] = '剪裁';
+$lang['Default comments order'] = '預設評論順序';
+$lang['Dump Database'] = '轉儲數據庫';
+$lang['ERROR'] = '錯誤';
+$lang['Extensions Update'] = '擴展更新';
+$lang['Follow Orientation'] = '定位';
+$lang['Following plugins may not be compatible with the new version of Piwigo:'] = '以下插件可能無法兼容新Piwigo的版本:';
+$lang['Following themes may not be compatible with the new version of Piwigo:'] = '以下主題可能無法兼容新版本Piwigo:';
+$lang['Graphics Library'] = '圖庫';
+$lang['Height'] = '高度';
+$lang['hide details'] = '隱藏細節';
+$lang['I decide to update anyway'] = '我決定要更新';
+$lang['If no HD is available and if the current websize is bigger than resize dimensions, Piwigo will move it as HD and create a downsized websize photo from it.'] = '假如圖片非高畫質，但在網頁上圖片尺寸大於調整後尺寸，Piwigo仍會將圖片標為高畫質，並另存一張縮圖';
+$lang['Ignore All'] = '忽略全部';
+$lang['Ignore this update'] = '忽略此更新';
+$lang['Include history data (Warning: server memory limit may be exceeded)'] = '包含歷史數據（警告：可能會超過伺服器儲存限制)';
+$lang['Last import'] = '最後匯入';
+$lang['Manage Permissions'] = '管理權限';
+$lang['Maximum file size: %sB.'] = '最大尺寸: %sB';
+$lang['Merge selected tags'] = '合併選定的標籤';
+$lang['Merge tags'] = '合併標籤';
+$lang['No destination tag selected'] = '未選擇目標標籤';
+$lang['Photo %s of %s'] = '圖片 %s 中的圖片 %s';
+$lang['Photo name'] = '圖片名稱';
+$lang['Piwigo cannot retrieve upgrade file from server'] = 'Piwigo 無法從伺服器中取得升級檔 ';
+$lang['Piwigo Update'] = 'Piwigo 更新';
+$lang['Predefined filter'] = '預先定義的過濾器';
+$lang['Reset ignored updates'] = '重置，忽略更新';
+$lang['Save Template Directory'] = '保存樣本目錄';
+$lang['Select an album'] = '選擇一個相冊';
+$lang['Select at least two tags for merging'] = '至少選擇兩個需合併的標籤';
+$lang['Select the destination tag'] = '選擇目的標籤';
+$lang['Send connection settings by email'] = '透過email發送連結設置';
+$lang['show details'] = '顯示細節';
+$lang['Some themes and plugins may be not available yet.'] = '一些主題和插件可能尚無法使用';
+$lang['Some upgrades are available for extensions.'] = '有延伸版本可以升級';
+$lang['Start Upload'] = '開始上傳';
+$lang['Tags <em>%s</em> merged into tag <em>%s</em>'] = '標籤 <em>%s</em> 已合併成標籤 <em>%s</em>'; 
+$lang['The original image quality must be a number between %d and %d'] = '原始圖品質必須在％d和％d之間';
+$lang['The original maximum height must be a number between %d and %d'] = '原始高度上限必須在％d和％d之間';
+$lang['The original maximum width must be a number between %d and %d'] = '原始寬度上限必須在％d和％d之間 ';
+$lang['This is a major update, with <a href="%s">new exciting features</a>.'] = '這是一個重大更新，包括<a href="%s">這個令人興奮的新功能';
+$lang['This is a minor update, with only bug corrections.'] = '這是一個次要更新，只有bug修正';
+$lang['Two updates are available'] = '兩個更新可使用';
+$lang['Unable to dump database.'] = '無法轉儲數據庫';
+$lang['Update All'] = '全部更新';
+$lang['Update Complete'] = '更新完成';
+$lang['Update in progress... Please wait.'] = '更新正在進行，請稍候';
+$lang['Update to Piwigo %s'] = '更新到Piwigo %s';
+$lang['Updates'] = '更新';
+$lang['Width'] = '寬度';
+$lang['With no album'] = '沒有相冊';
+$lang['With no tag'] = '沒有標籤';
+$lang['With no virtual album'] = '沒有虛擬相冊';
+$lang['You are using the Browser uploader. Try the <a href="%s">Flash uploader</a> instead.'] = '您正在使用瀏覽器上傳，您也可改用<a href="%s">Flash上傳器上傳。';
+$lang['You are using the Flash uploader. Problems? Try the <a href="%s">Browser uploader</a> instead.'] = '您正在使用Flash上傳器上傳；若有問題，您也可改用<a href="%s">瀏覽器上傳。';
+$lang['You can update to Piwigo %s directly, without upgrading to Piwigo %s (recommended).'] = '您可直接升級到Piwigo的％s，而不需升級到Piwigo的％（建議版本）';
+$lang['Zoom'] = '放大';
+$lang['Resize after upload'] = '上傳後調整大小';
+$lang['Original Size'] = '原始大小';
+$lang['A locked gallery is only visible to administrators'] = '鎖定的畫廊，只有管理員可以看見';
+$lang['Unlock gallery'] = '將畫廊解鎖';
+$lang['Gallery unlocked'] = '畫廊已解鎖';
+$lang['Notify administrators when a comment is'] = '當有評論時通知管理員';
+$lang['modified'] = '已修改';
+$lang['pending validation'] = '等候驗證';
+$lang['Save visits in history for'] = '保存訪問的歷史';
+$lang['simple visitors'] = '普通訪客';
+$lang['registered users'] = '註冊用戶';
+$lang['administrators'] = '管理員';
+$lang['This album contains %d photos, added on %s.'] = '這本相冊包含％d張照片，在％s上添加';
+$lang['This album contains %d photos, added between %s and %s.'] = '這本相冊包含％d張照片，在％s和％s之間添加。';
+$lang['This album contains no photo.'] = '這本相冊沒有照片';
+$lang['Not cropped correctly?'] = '不正確的裁剪?';
+$lang['Center of interest'] = '我的收藏';
+$lang['Move to album'] = '移動到相冊';
+$lang['You can activate only one mobile theme.'] = '您最多只能啟用一個移動的主題。';
+$lang['Automatic sort order'] = '自動排序';
+$lang['apply automatic sort order'] = '使用自動排序';
+$lang['Save manual order'] = '保存手動排序';
+$lang['cancel manual order'] = '取消手動排序';
+$lang['Cancel'] = '取消';
+$lang['List'] = '清單';
+$lang['Web Form'] = '網頁表格';
+$lang['Applications'] = '申請';
+$lang['Available versions for'] = '可用的版本';
+$lang['Available on'] = '可用的';
+$lang['Piwigo for iOS (iPhone, iPad, iPod Touch)'] = 'iOS (iPhone, iPad, iPod Touch) 版的 Piwigo ';
+$lang['<em>Piwigo for iOS</em> application empowers you to connect to your Piwigo gallery from your iPhone, iPad or iPod Touch, create some albums and upload several photos at once.'] = '<em>iOS 版的Piwigo</em>允許您從iPhone, iPad 或 iPod Touch 連接到您的Piwigo畫廊，建立多個相冊並一次上傳多張相片。';
+$lang['Piwigo for Android'] = 'Android 版的Piwigo';
+$lang['<em>Piwigo for Android</em> application empowers you to connect your Android phone or table to your Piwigo gallery, create some albums and upload several photos at once.'] = '<em>Android 版的Piwigo</em>允許從 Android 手機或平版連接到您的Piwigo畫廊，建立多個相冊並一次上傳多張相片。';
+$lang['Piwigo Publish plugin for Lightroom'] = 'Piwigo 的 Lightroom 照片發布插件';
+$lang['Adobe Photoshop Lightroom is a photography software designed to manage large quantities of digital images and doing post production work.'] = 'Adobe 的 Photoshop Lightroom 是一套攝影軟件，可管理大量數位影像和進行後製工作。';
+$lang['The Piwigo publish Plug-in allows you to export and synchronize photos from Lightroom directly to your Piwigo photo gallery.'] = 'Piwigo的發布插件允許你 從Lightroom匯出照片，使你的Lightroom照片與您的Piwigo相冊同步。';
+$lang['Piwigo publish plugin for Shotwell'] = 'Piwigo 的 Shotwell 照片發布插件 ';
+$lang['Shotwell is an open source digital photo organizer that runs on Linux. It is the default photo manager in Ubuntu and Fedora.'] = 'Shotwell是一套Linux作業系統下的數位相片管理工具，它是自由軟體，也是 Ubuntu 和 Fedora 中 預設的相片管理軟體。';
+$lang['On your Linux, simply install Shotwell with your package manager and the activate Piwigo publishing option.'] = '在Linux下，只需安裝Shotwell套件和啟用 Piwigo發佈選項。';
+$lang['Piwigo publish plugin for digiKam'] = 'Piwigo 的 ddgiKam 照片發布插件';
+$lang['digiKam is an advanced digital photo management free software for Linux, Windows, and MacOSX.'] = 'digiKam是一套先進的數位相片管理軟體，它是自由軟體，適用於LINUX，WINDOWS和MacOSX。';
+$lang['digiKam is designed for photographers who want to view, manage, edit, enhance, organize, tag, and share photographs.'] = 'digiKam是專為攝影師瀏覽、管理、編輯、加工、整理、標記及分享照片等用途而設計。';
+$lang['To export your photos from digiKam to Piwigo, simply install digiKam and the Kipi-plugins.'] = '從digiKam要匯出相片到Piwigo，只需安裝digiKam和Kipi-plugins插件.';
+$lang['Piwigo export plugin for iPhoto'] = 'iPhoto的Piwigo匯出插件';
+$lang['iPhoto is the default photo manager on MacOSX. The Piwigo export plugin let you create new albums and export your photos directly from iPhoto to your Piwigo photo gallery.'] = 'iPhoto是MacOSX預設的相片管理軟體。此Piwigo匯出插件，可讓你直接從iPhoto匯出相片至Piwigo圖庫，並建立新相冊';
+$lang['Piwigo export plugin for Aperture'] = 'Aperture的Piwigo匯出插件';
+$lang['Aperture is a powerful tool to refine images and manage massive libraries on Mac.'] = 'Aperture是Mac的一項強大工具，可微調讓圖像更精緻，並管理超大照片庫.';
+$lang['Aperture is designed for professional photographers with iPhoto simplicity.'] = 'Aperture是為專業攝影師設計的軟體，但使用起來又與iPhoto一樣簡單.';
+$lang['The Piwigo export plugin allows you to create albums and export photos.'] = 'Piwigo的匯出插件，允許你建立相冊和匯出照片';
+$lang['ReGalAndroid (RemoteGallery client for Android) is an open source (GPL v3) Piwigo client for the Android platform.'] = 'ReGalAndroid（Android行動相冊）是一個開放原始碼軟體（GPL V3），是Android平台上的Piwigo';
+$lang['Features include gallery browsing, album creation and photo upload.'] = '特色包括：畫廊瀏覽、建立相冊和照片上傳';
+$lang['Generate multiple size images'] = '產生多種大小的圖像';
+$lang['Delete multiple size images'] = '刪除多種大小的圖像';
+$lang['any visitor can see this album'] = '任何訪客都可以看到這本相冊';
+$lang['visitors need to login and have the appropriate permissions to see this album'] = '訪客必須登錄並擁有權限才能觀看這本相冊';
+$lang['Groups and users'] = '組別和用戶';
+$lang['Permission granted for groups'] = '組別擁有的權限';
+$lang['Select groups...'] = '選擇組別...';
+$lang['There is no group in this gallery.'] = '此畫廊內沒有組別';
+$lang['Permission granted for users'] = '用戶擁有的權限';
+$lang['Select users...'] = '選擇用戶...';
+$lang['%u users have automatic permission because they belong to a granted group.'] = '%u 用戶因屬自動許可授權組別，所以自動擁有權限.';
+$lang['include photos with lower privacy level'] = '包含隱私級別較低的相片';
+$lang['custom'] = '自定義';
+$lang['No group is permitted to see this private album'] = '沒有組別有權限觀看此私人相冊';
+$lang['Permission management'] = '權限管理';
+$lang['Photo sizes with crop'] = '相片剪裁';
+$lang['The center of interest is the most meaningful zone in the photo.'] = '焦點是相片中最有意思的部份';
+$lang['For photo sizes with crop, such as "Square", Piwigo will do its best to include the center of interest.'] = '如選擇相片剪裁（如「正方形」），Piwigo會盡可能保留相片的焦點';
+$lang['By default, the center of interest is placed in the middle of the photo.'] = '預設情況下，焦點是擺在相片的中間';
+$lang['Select a zone with your mouse to define a new center of interest.'] = '用鼠標選擇新的焦點';
+$lang['X Position'] = 'X 位置';
+$lang['Y Position'] = 'Y 位置';
+$lang['X Repeat'] = 'X 重複';
+$lang['Opacity'] = '不透明度';
+$lang['top left corner'] = '左上角';
+$lang['top right corner'] = '右上角';
+$lang['middle'] = '中間';
+$lang['bottom left corner'] = '左下角';
+$lang['bottom right corner'] = '右下角';
+$lang['Select a file'] = '選擇檔案';
+$lang['add a new watermark'] = '添加一個新的浮水印';
+$lang['Apply watermark if width is bigger than'] = '使用浮水印，假如浮水印寬度大於';
+$lang['Apply watermark if height is bigger than'] = '使用浮水印，假如浮水印高度高於';
+$lang['Multiple Size'] = '多種大小';
+
+?>
Index: tags/2.4.0RC3/language/zh_TW/common.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_TW/common.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/common.lang.php	(revision 14585)
@@ -0,0 +1,407 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+/*
+Language Name: 中文 (繁體) [TW]
+Version: 2.3.0
+Language URI: http://piwigo.org/ext/extension_view.php?eid=524
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+// Langage informations
+$lang_info['language_name'] = '中文';
+$lang_info['country'] = '中國';
+$lang_info['direction'] = 'ltr';
+$lang_info['code'] = 'cn';
+$lang_info['zero_plural'] = false;
+
+$lang['%d Kb'] = '%d KB';
+$lang['%d album updated'] = '%d 相冊已更新';
+$lang['%d albums updated'] = '%d 相冊已更新';
+$lang['%d comment to validate'] = '%d 條用戶評論被確認';
+$lang['%d comments to validate'] = '%d 條用戶評論被確認';
+$lang['%d new comment'] = '%d 新評論';
+$lang['%d new comments'] = '%d 新評論';
+$lang['%d comment'] = '%d 評論';
+$lang['%d comments'] = '%d 評論';
+$lang['%d hit'] = '查看 %d 次';
+$lang['%d hits'] = '查看 %d 次';
+$lang['%d new photo'] = '%d 新圖片';
+$lang['%d new photos'] = '%d 新圖片';
+$lang['%d new user'] = '%d 新用戶';
+$lang['%d new users'] = '%d 新用戶';
+$lang['About'] = '關於';
+$lang['All tags'] = '所有標籤';
+$lang['Any tag'] = '任何標籤';
+$lang['At least one listed rule must be satisfied.'] = '至少符合一項標準.';
+$lang['Author'] = '擁有者';
+$lang['Albums'] = '類別';
+$lang['Album'] = '相冊';
+$lang['Close this window'] = '關閉窗口';
+$lang['Complete RSS feed (photos, comments)'] = '完整RSS回饋(圖片, 評論等)';
+$lang['Confirm Password'] = '重複輸入密碼';
+$lang['Connection settings'] = '連接設置';
+$lang['Login'] = '連接';
+$lang['Contact webmaster'] = '聯繫網管';
+$lang['Create a new account'] = '新建帳號';
+$lang['Created on'] = '創建於';
+$lang['Creation date'] = '創建日期';
+$lang['Current password is wrong'] = '密碼錯誤';
+$lang['Dimensions'] = '尺寸';
+$lang['Display'] = '顯示';
+$lang['Each listed rule must be satisfied.'] = '必須符合每項標準';
+$lang['Email address is missing. Please specify an email address.'] = '缺少郵箱地址';
+$lang['Email address'] = '郵箱地址';
+$lang['Enter your personnal informations'] = '輸入您的個人信息';
+$lang['Error sending email'] = '發送郵件出錯';
+$lang['File name'] = '文件名';
+$lang['File'] = '文件';
+$lang['Filesize'] = '文件大小';
+$lang['Filter and display'] = '過濾並顯示';
+$lang['Filter'] = '過濾';
+$lang['Forgot your password?'] = '忘記密碼?';
+$lang['Go through the gallery as a visitor'] = '以遊客身份瀏覽圖庫';
+$lang['Help'] = '幫助';
+$lang['Identification'] = '身份鑒別';
+$lang['Photos only RSS feed'] = '圖片RSS';
+$lang['Keyword'] = '關鍵字';
+$lang['Links'] = '鏈接';
+$lang['N/A'] = '不存在';
+$lang['New on %s'] = '新創於 %s';
+$lang['Notification'] = '通知';
+$lang['Number of items'] = '總數';
+$lang['Original dimensions'] = '原始大小';
+$lang['Password forgotten'] = '忘記密碼';
+$lang['Password'] = '密碼';
+$lang['Post date'] = '上傳日期';
+$lang['Posted on'] = '上傳於';
+$lang['Profile'] = '用戶信息';
+$lang['Quick connect'] = '快速連接';
+$lang['RSS feed'] = 'RSS流';
+$lang['Register'] = '註冊';
+$lang['Registration'] = '註冊';
+$lang['Related tags'] = '關聯標籤';
+$lang['Reset'] = '重新設置';
+$lang['Retrieve password'] = '重新取得密碼';
+$lang['Search rules'] = '搜索規則';
+$lang['Search tags'] = '搜索標籤';
+$lang['Search'] = '搜索';
+$lang['display available tags'] = '查看現有標籤';
+$lang['Since'] = '自從';
+$lang['Sort by'] = '排序';
+$lang['Sort order'] = '排序規則';
+$lang['Tag'] = '標籤';
+$lang['Tags'] = '標籤簇';
+$lang['The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'] = 'RSS提要，從這個網站上提供新事件的通知：新相片，更新相冊，新評論。要使用 RSS 閱讀器查看new photos, updated albums, new comments. To be used with a RSS feed reader.';
+$lang['Unknown feed identifier'] = '未知流標識';
+$lang['User comments'] = '用戶評論';
+$lang['Username'] = '用戶名';
+$lang['Visits'] = '訪問';
+$lang['Webmaster'] = '網管';
+$lang['Week %d'] = '星期 %d';
+$lang['About Piwigo'] = '關於Piwigo';
+$lang['You are not authorized to access the requested page'] = '你無權訪問此頁';
+$lang['add this photo to your favorites'] = '把圖片放到收藏夾';
+$lang['Administration'] = '管理員';
+$lang['all'] = '所有';
+$lang['ascending'] = '升序';
+$lang['author(s) : %s'] = '擁有者 : %s';
+$lang['Expand all albums'] = '展開所有相冊';
+$lang['posted after %s (%s)'] = '插入到 %s (%s) 之後';
+$lang['posted before %s (%s)'] = '插入到 %s (%s) 之前';
+$lang['posted between %s (%s) and %s (%s)'] = '插入到 %s (%s) 和 le %s (%s) 之間';
+$lang['posted on %s'] = '插入 %s';
+$lang['Best rated'] = '得票最高';
+$lang['display best rated photos'] = '顯示得票最高的圖片';
+$lang['Calendar'] = '日曆';
+$lang['All'] = '所有';
+$lang['display each day with photos, month per month'] = '按時間順序來顯示';
+$lang['View'] = '視圖';
+$lang['chronology_monthly_calendar'] = '月曆';
+$lang['chronology_monthly_list'] = '月清單';
+$lang['chronology_weekly_list'] = '周清單';
+$lang['Click here if your browser does not automatically forward you'] = '如果你的瀏覽器不支持自動轉頁，請按這裡。';
+$lang['comment date'] = '評論日期';
+$lang['Comment'] = '評論';
+$lang['Your comment has been registered'] = '評論已保存';
+$lang['Anti-flood system : please wait for a moment before trying to post another comment'] = '反灌水系統 : 請稍候再加評論';
+$lang['Your comment has NOT been registered because it did not pass the validation rules'] = '由於不符合格式規定，你的評論不能被保存';
+$lang['An administrator must authorize your comment before it is visible.'] = '評論需經管理員確認才能顯示在頁面裡。';
+$lang['This login is already used by another user'] = '用戶名已存在';
+$lang['Comments'] = '評論';
+$lang['Add a comment'] = '加評論';
+$lang['created after %s (%s)'] = '創建於 %s (%s) 之後';
+$lang['created before %s (%s)'] = '創建於 %s (%s) 之前';
+$lang['created between %s (%s) and %s (%s)'] = '創建於 %s (%s) 和 le %s (%s) 之間';
+$lang['created on %s'] = '創建於 %s';
+$lang['Customize'] = '自定義';
+$lang['Your Gallery Customization'] = '自定義頁標題';
+$lang['day'][0] = '星期日';
+$lang['day'][1] = '星期一';
+$lang['day'][2] = '星期二';
+$lang['day'][3] = '星期三';
+$lang['day'][4] = '星期四';
+$lang['day'][5] = '星期五';
+$lang['day'][6] = '星期六';
+$lang['Default'] = '默認';
+$lang['delete this photo from your favorites'] = '從收藏夾中刪除此圖片';
+$lang['Delete'] = '刪除';
+$lang['descending'] = '降序';
+$lang['Download'] = '下載';
+$lang['Download this file'] = '下載此文件';
+$lang['edit'] = '編輯';
+$lang['wrong date'] = '日期出錯';
+$lang['excluded'] = '不包括';
+$lang['Your favorites'] = '我的最愛';
+$lang['display your favorites photos'] = '顯示收藏圖片';
+$lang['Favorites'] = '收藏';
+$lang['First'] = '首頁';
+$lang['The gallery is locked for maintenance. Please, come back later.'] = '系統維護，請稍候再試。';
+$lang['Page generated in'] = '頁面創建時間';
+$lang['guest'] = '遊客';
+$lang['Hello'] = '你好';
+$lang['available for administrators only'] = '只限於管理者';
+$lang['display this album'] = '顯示此相冊根目錄下的相片';
+$lang['display last user comments'] = '查看最新用戶評論';
+$lang['customize the appareance of the gallery'] = '個性化設置';
+$lang['search'] = '搜索';
+$lang['Home'] = '主頁';
+$lang['in this album'] = '在此相冊裡';
+$lang['in %d sub-album'] = '在 %d 子相冊裡';
+$lang['in %d sub-albums'] = '在n %d 子相冊裡';
+$lang['included'] = '包括';
+$lang['Invalid password!'] = '密碼不正確!';
+$lang['Language'] = '語言';
+$lang['last %d days'] = '最近%d天';
+$lang['Last'] = '最後';
+$lang['Logout'] = '註銷';
+$lang['obligatory'] = '必需';
+$lang['Maximum photo height'] = '圖片的最大長度';
+$lang['Maximum height must be a number superior to 50'] = '圖片最大長度必須大於50';
+$lang['Maximum photo width'] = '圖片的最大寬度';
+$lang['Maximum width must be a number superior to 50'] = '圖片最大寬度必須大於50';
+$lang['display a calendar by creation date'] = '通過創建時間顯示日曆';
+$lang['display all photos in all sub-albums'] = '顯示所有相冊和子相冊的相片';
+$lang['return to normal view mode'] = '返回到普通模式顯示';
+$lang['display a calendar by posted date'] = '通過發送時間來顯示日曆';
+$lang['month'][10] = '十月';
+$lang['month'][11] = '十一月';
+$lang['month'][12] = '十二月';
+$lang['month'][1] = '一月';
+$lang['month'][2] = '二月';
+$lang['month'][3] = '三月';
+$lang['month'][4] = '四月';
+$lang['month'][5] = '五月';
+$lang['month'][6] = '六月';
+$lang['month'][7] = '七月';
+$lang['month'][8] = '八月';
+$lang['month'][9] = '九月';
+$lang['Most visited'] = '最受喜歡';
+$lang['display most visited photos'] = '顯示查看次數最多的圖片';
+$lang['Unknown identifier'] = '帳戶不存在';
+$lang['New password'] = '新密碼';
+$lang['Rate this photo'] = '對圖片投票';
+$lang['Next'] = '下一頁';
+$lang['no rate'] = '沒有被投票';
+$lang['Photos posted within the last %d day.'] = '只顯示最近 %d 天的圖片.';
+$lang['Photos posted within the last %d days.'] = '只顯示最近 %d 天的圖片.';
+$lang['password updated'] = '密碼已更新';
+$lang['Recent period must be a positive integer value'] = '再次發表間隔時間必須是正整數';
+$lang['photo'] = '圖片';
+$lang['Click on the photo to see it in high definition'] = '點擊查看大圖片';
+$lang['Show file metadata'] = '顯示文件的元數據';
+$lang['Powered by'] = '基於';
+$lang['Preferences'] = '使用偏好';
+$lang['Previous'] = '前頁';
+$lang['Random photos'] = '隨機圖片';
+$lang['display a set of random photos'] = '隨機顯示圖片';
+$lang['Recent albums'] = '最新的相冊';
+$lang['display recently updated albums'] = '顯示最近更新的相冊';
+$lang['Recent period'] = '最近階段';
+$lang['Recent photos'] = '最新圖片';
+$lang['display most recent photos'] = '顯示最新圖片';
+$lang['Redirection...'] = '轉跳至...';
+$lang['Please, enter a login'] = '請輸入用戶名';
+$lang['login mustn\'t end with a space character'] = '用戶名不能以空格結尾';
+$lang['login mustn\'t start with a space character'] = '用戶名不能以空格開頭';
+$lang['this login is already used'] = '用戶名已存在';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '郵件地址格式必須符合標準郵件地址格式 xxx@yyy.eee (例如 : jack@altern.org)';
+$lang['please enter your password again'] = '請輸入新密碼';
+$lang['Auto login'] = '自動連接';
+$lang['remove this tag from the list'] = '刪除此標籤';
+$lang['representative'] = '代理人';
+$lang['Search for Author'] = '搜索上傳者';
+$lang['Search in albums'] = '在相冊裡搜索';
+$lang['Search by date'] = '通過日期查詢';
+$lang['Date'] = '開始日期';
+$lang['End-Date'] = '最終日期';
+$lang['Kind of date'] = '日期類型';
+$lang['Search for words'] = '關鍵字';
+$lang['Search for all terms'] = '以與模式查詢';
+$lang['Search for any term'] = '以或模式查詢';
+$lang['Empty query. No criteria has been entered.'] = '查詢語句不能為空';
+$lang['Search results'] = '搜索結果';
+$lang['Search in sub-albums'] = '在子相冊裡搜索';
+$lang['searched words : %s'] = '搜索詞 : %s';
+$lang['Contact'] = '聯繫';
+$lang['set as album representative'] = '設置一個相冊代表';
+$lang['Show number of comments'] = '顯示評論總數';
+$lang['Show number of hits'] = '顯示查看次數';
+$lang['slideshow'] = '幻燈片放映';
+$lang['stop the slideshow'] = '停止幻燈片放映';
+$lang['Specials'] = '特別類';
+$lang['SQL queries in'] = 'sql查詢語句';
+$lang['display only recently posted photos'] = '只顯示最近內容';
+$lang['return to the display of all photos'] = '返回到所有圖片頁面';
+$lang['the beginning'] = '開始';
+$lang['Interface theme'] = '主題';
+$lang['Thumbnails'] = '縮略圖';
+$lang['Menu'] = '菜單';
+$lang['A comment on your site'] = '網站評論';
+$lang['today'] = '今天';
+$lang['Update your rating'] = '更改投票';
+$lang['the username must be given'] = '缺少用戶名';
+$lang['useful when password forgotten'] = '忘記密碼';
+$lang['Quick search'] = '快速搜索';
+$lang['Connected user: %s'] = '在線用戶: %s';
+$lang['IP: %s'] = 'IP地址: %s';
+$lang['Browser: %s'] = '瀏覽器: %s';
+$lang['Author: %s'] = '上傳者: %s';
+$lang['Comment: %s'] = '評論: %s';
+$lang['Comment by %s'] = '評論人 %s';
+$lang['User: %s'] = '用戶: %s';
+$lang['Email: %s'] = '電子郵件: %s';
+$lang['Admin: %s'] = '管理員: %s';
+$lang['Registration of %s'] = '註冊 %s';
+$lang['Album: %s'] = '相冊: %s';
+$lang['Bad status for user "guest", using default status. Please notify the webmaster.'] = '如果遊客反常擁有普通用戶才擁有狀態，請向網絡管理員報告。';
+$lang['this email address is already in use'] = '郵箱地址已存在';
+$lang['Album results for'] = '相冊的結果';
+$lang['Tag results for'] = '符合查詢標籤結果';
+$lang['from %s to %s'] = '從 %s 到 %s';
+$lang['Play of slideshow'] = '播放';
+$lang['Pause of slideshow'] = '暫停';
+$lang['Repeat the slideshow'] = '重複播放';
+$lang['Not repeat the slideshow'] = '停止重複播放';
+$lang['Reduce diaporama speed'] = '減慢播放速度';
+$lang['Accelerate diaporama speed'] = '加快播放速度';
+$lang['Submit'] = '確認';
+$lang['Yes'] = '是';
+$lang['No'] = '否';
+$lang['%d photo']='%d 圖片';
+$lang['%d photos']='%d 圖片';
+$lang['%d photo is also linked to current tags'] = '%d 圖片同時與當前標籤相關';
+$lang['%d photos are also linked to current tags'] = '%d 圖片同時與當前標籤相關';
+$lang['display photos linked to this tag'] = '只查看和這標籤相關的圖片';
+$lang['photos posted during the last %d days'] = '圖片在最近%d天裡更新';
+$lang['Piwigo Help'] = 'Piwigo幫助';
+$lang['Rank'] = '分類';
+$lang['group by letters'] = '按字母順序分';
+$lang['letters'] = '字母';
+$lang['show tag cloud'] = '顯示標籤雲';
+$lang['cloud'] = '雲';
+$lang['Are you sure?'] = '確定?';
+$lang['Reset to default values'] = '重置為默認值';
+$lang['delete all photos from your favorites'] = '刪除您的收藏裡所有相片';
+$lang['Sent by'] = 'Sent by';
+$lang['Cookies are blocked or not supported by your browser. You must enable cookies to connect.'] = '您的瀏覽器已關閉或者不支持Cookies. 您必須開啟 cookies 才能登錄.';
+$lang['Edit a comment'] = '修改一個評論';
+$lang['(!) This comment requires validation'] = '(!) 此評論需要審核';
+$lang['Welcome'] = '歡迎';
+$lang['Welcome to your Piwigo photo gallery!'] = '歡迎來到您的 Piwigo 畫廊!';
+$lang['... or browse your empty gallery'] = '... 或者瀏覽您的空畫廊';
+$lang['... or please deactivate this message, I will find my way by myself'] = '... 或者取消此信息，我會自己找到我的方法';
+$lang['Hello %s, your Piwigo photo gallery is empty!'] = '您好 %s, 您的 Piwigo 畫廊是空的!';
+$lang['I want to add photos'] = '我想添加相片';
+$lang['Manage this user comment: %s'] = '管理此用戶的評論: %s';
+$lang['This author modified following comment:'] = '此作者修改了以下的評論:';
+$lang['This author removed the comment with id %d'] = '此作者刪除了 id 為 %d 的評論';
+$lang['Sent by'] = '發送人';
+$lang['html tags are not allowed in login'] = 'login內不允許有html標籤';
+$lang['%d rates'] = '%d 評價';
+$lang['Rating score'] = '評價得分';
+$lang['The number of photos per page must be a not null scalar'] = '每頁的照片的數量不能為零';
+$lang['Number of photos per page'] = '每頁的照片數量';
+$lang['Invalid username or email'] = '無效的用戶名稱或電子郵件';
+$lang['Password reset is not allowed for this user'] = '不允許此用戶密碼重置';
+$lang['User "%s" has no email address, password reset is not possible']= '查無用戶“％”之電子郵件地址，無法重置密碼';
+$lang['Someone requested that the password be reset for the following user account:'] = '有人要求重置以下用戶的密碼:';
+$lang['Username "%s" on gallery %s'] = '％s 畫廊中的“％S”用戶 ';
+$lang['To reset your password, visit the following address:'] = '要重置密碼，請至以下網址:';
+$lang['If this was a mistake, just ignore this email and nothing will happen.'] = '如果這是個錯誤或您並未要求重置密碼，請忽略此電子郵件，您的帳戶將不會作任何更改';
+$lang['Password Reset'] = '重設密碼';
+$lang['Check your email for the confirmation link'] = '檢查您的電子郵件並前往確認連結 ';
+$lang['Invalid key'] = '鍵入字元無效';
+$lang['The passwords do not match'] = '密碼不符';
+$lang['Your password has been reset'] = '您的密碼已經重設';
+$lang['Return to home page'] = '返回首頁';
+$lang['Please enter your username or email address.'] = '請輸入您的用戶名或電子郵件';
+$lang['You will receive a link to create a new password via email.'] ='您將收到電子郵件，裡面有用來建立新密碼的連結';
+$lang['Username or email'] = '用戶名稱或電子郵件';
+$lang['Change my password'] = '更改我的密碼';
+$lang['Enter your new password below.'] = '在下方輸入您的新密碼';
+$lang['EXIF Metadata'] = 'EXIF 元數據';
+$lang['IPTC Metadata'] = 'IPTC 元數據';
+$lang['Edit'] = '編輯';
+$lang['Hello %s,'] = '您好 %s,';
+$lang['Send my connection settings by email'] = '利用電子郵件發送我的連結設定';
+$lang['Successfully registered, you will soon receive an email with your connection settings. Welcome!'] = '註冊成功！您將收到電子郵件，內含您的連接設定。歡迎加入！';
+$lang['Username modification'] = '用戶名稱修改';
+$lang['Your username has been successfully changed to : %s'] = '您的用戶名稱已成功修改為 : %s';
+$lang['square'] = '正方形';
+$lang['thumb'] = '小圖';
+$lang['small'] = '小';
+$lang['medium'] = '中';
+$lang['large'] = '大';
+$lang['xlarge'] = 'XL';
+$lang['xxlarge'] = 'XXL';
+$lang['Original'] = '原始大小';
+$lang['Thank you for registering at %s!'] = '感謝您在%s!註冊';
+$lang['Here are your connection settings'] = '以下是您的連結設定';
+$lang['Password: %s'] = '密碼: %s';
+$lang['Username: %s'] = '用戶名稱: %s';
+$lang['If you think you\'ve received this email in error, please contact us at %s'] = ' 如您認為此電子郵件之發送為錯誤，請聯繫我們：%s';
+$lang['Show oldest comments first'] = '顯示最舊的評論在最前面';
+$lang['Show latest comments first'] = '顯示最新的評論在最前面';
+$lang['Photo sizes'] = '圖片大小';
+$lang['View in'] = '檢視';
+$lang['Mobile'] = '移動';
+$lang['Desktop'] = '桌面';
+$lang['2small'] = '極小';
+$lang['xsmall'] = '特小';
+$lang['File name, A &rarr; Z'] = '檔案名稱, A &rarr; Z';
+$lang['File name, Z &rarr; A'] = '檔案名稱, Z &rarr; A';
+$lang['Photo title, A &rarr; Z'] = '相片標題, A &rarr; Z';
+$lang['Photo title, Z &rarr; A'] = '相片標題, Z &rarr; A';
+$lang['Date created, new &rarr; old'] = '建立日期, 新 &rarr; 舊';
+$lang['Date created, old &rarr; new'] = '建立日期, 舊 &rarr; 新';
+$lang['Date posted, new &rarr; old'] = '發佈日期, 新 &rarr; 舊';
+$lang['Date posted, old &rarr; new'] = '發佈日期, 舊 &rarr; 新';
+$lang['Rating score, high &rarr; low'] = '評價得分, 高 &rarr; 低';
+$lang['Rating score, low &rarr; high'] = '評價得分, 低 &rarr; 高';
+$lang['Visits, high &rarr; low'] = '點閱率, 高 &rarr; 低';
+$lang['Visits, low &rarr; high'] = '點閱率, 低 &rarr; 高';
+$lang['Numeric identifier, 1 &rarr; 9'] = '數字標識符, 1 &rarr; 9';
+$lang['Numeric identifier, 9 &rarr; 1'] = '數字標識符, 9 &rarr; 1';
+$lang['Manual sort order'] = '手動排序';
+?>
Index: tags/2.4.0RC3/language/zh_TW/install.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_TW/install.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/install.lang.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['Installation'] = '安裝';
+$lang['Basic configuration'] = '基本設置';
+$lang['Default gallery language'] = '圖庫默認語言';
+$lang['Database configuration'] = '數據庫設置';
+$lang['Admin configuration'] = '管理員帳戶設置';
+$lang['Start Install'] = '開始安裝';
+$lang['mail address must be like xxx@yyy.eee (example : jack@altern.org)'] = '郵箱地址格式 xxx@yyy.eee (例 : jack@altern.org)';
+$lang['Webmaster login'] = '管理員';
+$lang['It will be shown to the visitors. It is necessary for website administration'] = '所有用戶都能看到此帳戶。必須提供此帳戶來管理網站';
+$lang['Connection to server succeed, but it was impossible to connect to database'] = '服務器連接正常，但是無法連接到數據庫';
+$lang['Can\'t connect to server'] = '無法連接到服務器';
+$lang['Host'] = 'MySQL主機地址';
+$lang['localhost, sql.multimania.com, toto.freesurf.fr'] = 'localhost, sql.multimania.com, toto.freesurf.fr';
+$lang['User'] = '用戶';
+$lang['user login given by your host provider'] = '主機用戶名';
+$lang['Password'] = '密碼';
+$lang['user password given by your host provider'] = '主機用戶密碼';
+$lang['Database name'] = '數據庫名稱';
+$lang['also given by your host provider'] = '在主機設定的數據庫名稱';
+$lang['Database table prefix'] = '表名稱前綴';
+$lang['database tables names will be prefixed with it (enables you to manage better your tables)'] = '所有的表名稱都加此前綴(有利於數據庫管理)';
+$lang['enter a login for webmaster'] = '請輸入網管名';
+$lang['webmaster login can\'t contain characters \' or "'] = '網管名不應包含字符 " 和 \'';
+$lang['please enter your password again'] = '請再次輸入密碼';
+$lang['Webmaster password'] = '密碼';
+$lang['Keep it confidential, it enables you to access administration panel'] = '請小心保管好此密碼，它允許你操作管理板塊。';
+$lang['Password [confirm]'] = '密碼 [ 確認 ]';
+$lang['verification'] = '核實';
+$lang['Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'] = '需要幫助？ 請到<a href="%s">Piwigo論壇</a>提出你的問題.';
+$lang['Webmaster mail address'] = '管理員Email地址';
+$lang['Visitors will be able to contact site administrator with this mail'] = '遊客通過此Email跟你聯繫';
+$lang['PHP 5 is required'] = '必須PHP 5版本';
+$lang['It appears your webhost is currently running PHP %s.'] = '你主機PHP版本好像是PHP %s.';
+$lang['Piwigo may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'] = 'Piwigo試著創建或修改.htaccess文件來轉換到PHP 5。';
+$lang['Note you can change your configuration by yourself and restart Piwigo after that.'] = '注意；你也可以自己修改設置PHP然後重新啟動Piwigo。';
+$lang['Try to configure PHP 5'] = '試試配置PHP 5';
+$lang['Sorry!'] = '對不起!';
+$lang['Piwigo was not able to configure PHP 5.'] = 'Piwigo不能設置PHP 5.';
+$lang["You may referer to your hosting provider's support and see how you could switch to PHP 5 by yourself."] = '你應該聯繫你的主機管理員並向其請教如何設置PHP 5.';
+$lang['Hope to see you back soon.'] = '希望下次再見到你...';
+$lang['Congratulations, Piwigo installation is completed'] = '恭喜，Piwigo 已安裝完成。';
+$lang['An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)'] = '另一個解決辦法是，將以上文本框裡的文本拷貝到 "local/config/database.inc.php" 文件裡（注意：database.inc.php 必須只能包含此文本框裡的內容，沒有換行或者空格字符）';
+$lang['Creation of config file local/config/database.inc.php failed.'] = '創建 local/config/database.inc.php 文件失敗.';
+$lang['Download the config file'] = '下載配置文件';
+$lang['You can download the config file and upload it to local/config directory of your installation.'] = '您可以下載配置文件，然後上傳到 local/config 目錄以完成您的安裝.';
+$lang['Just another Piwigo gallery'] = '另一本Piwigo相片集';
+$lang['Welcome to my photo gallery'] = '歡迎進入我的相片集';
+$lang['Welcome to your new installation of Piwigo!'] = '歡迎安裝Piwigo!';
+$lang['Don\'t hesitate to consult our forums for any help : %s'] = '如有任何問題，請至我們的論壇提出：%s ';
+?>
Index: tags/2.4.0RC3/language/zh_TW/iso.txt
===================================================================
--- tags/2.4.0RC3/language/zh_TW/iso.txt	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/iso.txt	(revision 14585)
@@ -0,0 +1,1 @@
+中文 (繁體) [TW]
Index: tags/2.4.0RC3/language/zh_TW/upgrade.lang.php
===================================================================
--- tags/2.4.0RC3/language/zh_TW/upgrade.lang.php	(revision 14585)
+++ tags/2.4.0RC3/language/zh_TW/upgrade.lang.php	(revision 14585)
@@ -0,0 +1,44 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+$lang['Upgrade'] = "升級";
+$lang['This page proposes to upgrade your database corresponding to your old version of Piwigo to the current version. The upgrade assistant thinks you are currently running a <strong>release %s</strong> (or equivalent).'] = "此頁面將把您的 Piwigo 舊版本的數據庫升級為新版本。
+升級助手將會認為您正在運行 <strong>版本 %s</strong> (或者相同的版本).";
+$lang['Upgrade from version %s to %s'] = "從 %s 版升級到 %s";
+$lang['Statistics'] = "統計";
+$lang['total upgrade time'] = "總共升級時間";
+$lang['total SQL time'] = "總共 SQL 時間";
+$lang['SQL queries'] = "SQL 查詢";
+$lang['Upgrade informations'] = "升級信息";
+$lang['Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.'] = "如果您遇到任何問題，請在[管理員>工具>維護]執行維護檢測";
+$lang['As a precaution, following plugins have been deactivated. You must check for plugins upgrade before reactiving them:'] = "為了預防萬一，以下插件已被停用。在您重新啟用它們之前，必須先檢查這些插件的更新:";
+$lang['Only administrator can run upgrade: please sign in below.'] = "只有管理員能運行升級操作：請先登錄。";
+$lang['You do not have access rights to run upgrade'] = "您沒有執行升級程序的權限";
+$lang['All sub-albums of private albums become private'] = '相冊裡的所有子相冊都成為私有';
+$lang['User permissions and group permissions have been erased'] = "用戶和組的權限已被清除";
+$lang['Only thumbnails prefix and webmaster mail address have been saved from previous configuration'] = "在前一個配置操作中，只有縮略圖的前綴和網站管理員的郵件地址被保存了。";
+$lang['In <i>%s</i>, before <b>?></b>, insert:'] = '在 <i>%s</i>, 之前 <b>?></b>, 插入:';
+$lang['As a precaution, following themes have been deactivated. You must check for themes upgrade before reactiving them:'] = '為小心起見，以下主題已停用。假如要重新啟用它們，你必須先檢查有沒有可更新的主題:';
+
+?>
Index: tags/2.4.0RC3/local/config/index.php
===================================================================
--- tags/2.4.0RC3/local/config/index.php	(revision 14585)
+++ tags/2.4.0RC3/local/config/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/local/css/index.php
===================================================================
--- tags/2.4.0RC3/local/css/index.php	(revision 14585)
+++ tags/2.4.0RC3/local/css/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/local/index.php
===================================================================
--- tags/2.4.0RC3/local/index.php	(revision 14585)
+++ tags/2.4.0RC3/local/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/local/language/index.php
===================================================================
--- tags/2.4.0RC3/local/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/local/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/nbm.php
===================================================================
--- tags/2.4.0RC3/nbm.php	(revision 14585)
+++ tags/2.4.0RC3/nbm.php	(revision 14585)
@@ -0,0 +1,81 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+
+//--------------------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+check_status(ACCESS_FREE);
+include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_notification_by_mail.inc.php');
+// Translations are in admin file too
+load_language('admin.lang');
+// Need to update a second time
+trigger_action('loading_lang');
+load_language('lang', PHPWG_ROOT_PATH.PWG_LOCAL_DIR, array('no_fallback'=>true, 'local'=>true) );
+
+
+// +-----------------------------------------------------------------------+
+// | Main                                                                  |
+// +-----------------------------------------------------------------------+
+if (isset($_GET['subscribe'])
+    and preg_match('/^[A-Za-z0-9]{16}$/', $_GET['subscribe']))
+{
+  subscribe_notification_by_mail(false, array($_GET['subscribe']));
+}
+else
+if (isset($_GET['unsubscribe'])
+    and preg_match('/^[A-Za-z0-9]{16}$/', $_GET['unsubscribe']))
+{
+  unsubscribe_notification_by_mail(false, array($_GET['unsubscribe']));
+}
+else
+{
+  array_push($page['errors'], l10n('Unknown identifier'));
+}
+
+// +-----------------------------------------------------------------------+
+// | template initialization                                               |
+// +-----------------------------------------------------------------------+
+$title = l10n('Notification');
+$page['body_id'] = 'theNBMPage';
+
+$template->set_filenames(array('nbm'=>'nbm.tpl'));
+
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theNBMPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+// +-----------------------------------------------------------------------+
+// | html code display                                                     |
+// +-----------------------------------------------------------------------+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->parse('nbm');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/notification.php
===================================================================
--- tags/2.4.0RC3/notification.php	(revision 14585)
+++ tags/2.4.0RC3/notification.php	(revision 14585)
@@ -0,0 +1,118 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+/**
+ * search an available feed_id
+ *
+ * @return string feed identifier
+ */
+function find_available_feed_id()
+{
+  while (true)
+  {
+    $key = generate_key(50);
+    $query = '
+SELECT COUNT(*)
+  FROM '.USER_FEED_TABLE.'
+  WHERE id = \''.$key.'\'
+;';
+    list($count) = pwg_db_fetch_row(pwg_query($query));
+    if (0 == $count)
+    {
+      return $key;
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+// +-----------------------------------------------------------------------+
+// |                          new feed creation                            |
+// +-----------------------------------------------------------------------+
+
+$page['feed'] = find_available_feed_id();
+
+$query = '
+INSERT INTO '.USER_FEED_TABLE.'
+  (id, user_id, last_check)
+  VALUES
+  (\''.$page['feed'].'\', '.$user['id'].', NULL)
+;';
+pwg_query($query);
+
+
+$feed_url=PHPWG_ROOT_PATH.'feed.php';
+if (is_a_guest())
+{
+  $feed_image_only_url=$feed_url;
+  $feed_url .= '?feed='.$page['feed'];
+}
+else
+{
+  $feed_url .= '?feed='.$page['feed'];
+  $feed_image_only_url=$feed_url.'&amp;image_only';
+}
+
+// +-----------------------------------------------------------------------+
+// |                        template initialization                        |
+// +-----------------------------------------------------------------------+
+
+$title = l10n('Notification');
+$page['body_id'] = 'theNotificationPage';
+$page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+
+
+$template->set_filenames(array('notification'=>'notification.tpl'));
+
+$template->assign(
+  array(
+    'U_FEED' => $feed_url,
+    'U_FEED_IMAGE_ONLY' => $feed_image_only_url,
+    )
+  );
+  
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theNotificationPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('notification');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+
+?>
Index: tags/2.4.0RC3/password.php
===================================================================
--- tags/2.4.0RC3/password.php	(revision 14585)
+++ tags/2.4.0RC3/password.php	(revision 14585)
@@ -0,0 +1,360 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+
+check_status(ACCESS_FREE);
+
+// +-----------------------------------------------------------------------+
+// | Functions                                                             |
+// +-----------------------------------------------------------------------+
+
+/**
+ * checks the validity of input parameters, fills $page['errors'] and
+ * $page['infos'] and send an email with confirmation link
+ *
+ * @return bool (true if email was sent, false otherwise)
+ */
+function process_password_request()
+{
+  global $page, $conf;
+  
+  if (empty($_POST['username_or_email']))
+  {
+    array_push($page['errors'], l10n('Invalid username or email'));
+    return false;
+  }
+  
+  $user_id = get_userid_by_email($_POST['username_or_email']);
+    
+  if (!is_numeric($user_id))
+  {
+    $user_id = get_userid($_POST['username_or_email']);
+  }
+
+  if (!is_numeric($user_id))
+  {
+    array_push($page['errors'], l10n('Invalid username or email'));
+    return false;
+  }
+
+  $userdata = getuserdata($user_id, false);
+
+  // password request is not possible for guest/generic users
+  $status = $userdata['status'];
+  if (is_a_guest($status) or is_generic($status))
+  {
+    array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+    return false;
+  }
+
+  if (empty($userdata['email']))
+  {
+    array_push(
+      $page['errors'],
+      sprintf(
+        l10n('User "%s" has no email address, password reset is not possible'),
+        $userdata['username']
+        )
+      );
+    return false;
+  }
+
+  if (empty($userdata['activation_key']))
+  {
+    $activation_key = get_user_activation_key();
+
+    single_update(
+      USER_INFOS_TABLE,
+      array('activation_key' => $activation_key),
+      array('user_id' => $user_id)
+      );
+
+    $userdata['activation_key'] = $activation_key;
+  }
+
+  set_make_full_url();
+  
+  $message = l10n('Someone requested that the password be reset for the following user account:') . "\r\n\r\n";
+  $message.= sprintf(
+    l10n('Username "%s" on gallery %s'),
+    $userdata['username'],
+    get_gallery_home_url()
+    );
+  $message.= "\r\n\r\n";
+  $message.= l10n('To reset your password, visit the following address:') . "\r\n";
+  $message.= get_gallery_home_url().'/password.php?key='.$userdata['activation_key']."\r\n\r\n";
+  $message.= l10n('If this was a mistake, just ignore this email and nothing will happen.')."\r\n";
+
+  unset_make_full_url();
+
+  $message = trigger_event('render_lost_password_mail_content', $message);
+
+  $email_params = array(
+    'subject' => '['.$conf['gallery_title'].'] '.l10n('Password Reset'),
+    'content' => $message,
+    'email_format' => 'text/plain',
+    );
+
+  if (pwg_mail($userdata['email'], $email_params))
+  {
+    array_push($page['infos'], l10n('Check your email for the confirmation link'));
+    return true;
+  }
+  else
+  {
+    array_push($page['errors'], l10n('Error sending email'));
+    return false;
+  }
+}
+
+/**
+ *  checks the activation key: does it match the expected pattern? is it
+ *  linked to a user? is this user allowed to reset his password?
+ *
+ * @return mixed (user_id if OK, false otherwise)
+ */
+function check_password_reset_key($key)
+{
+  global $page;
+  
+  if (!preg_match('/^[a-z0-9]{20}$/i', $key))
+  {
+    array_push($page['errors'], l10n('Invalid key'));
+    return false;
+  }
+
+  $query = '
+SELECT
+    user_id,
+    status
+  FROM '.USER_INFOS_TABLE.'
+  WHERE activation_key = \''.$key.'\'
+;';
+  $result = pwg_query($query);
+
+  if (pwg_db_num_rows($result) == 0)
+  {
+    array_push($page['errors'], l10n('Invalid key'));
+    return false;
+  }
+  
+  $userdata = pwg_db_fetch_assoc($result);
+
+  if (is_a_guest($userdata['status']) or is_generic($userdata['status']))
+  {
+    array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+    return false;
+  }
+
+  return $userdata['user_id'];
+}
+
+/**
+ * checks the passwords, checks that user is allowed to reset his password,
+ * update password, fills $page['errors'] and $page['infos'].
+ *
+ * @return bool (true if password was reset, false otherwise)
+ */
+function reset_password()
+{
+  global $page, $user, $conf;
+
+  if ($_POST['use_new_pwd'] != $_POST['passwordConf'])
+  {
+    array_push($page['errors'], l10n('The passwords do not match'));
+    return false;
+  }
+
+  if (isset($_GET['key']))
+  {
+    $user_id = check_password_reset_key($_GET['key']);
+    if (!is_numeric($user_id))
+    {
+      array_push($page['errors'], l10n('Invalid key'));
+      return false;
+    }
+  }
+  else
+  {
+    // we check the currently logged in user
+    if (is_a_guest() or is_generic())
+    {
+      array_push($page['errors'], l10n('Password reset is not allowed for this user'));
+      return false;
+    }
+
+    $user_id = $user['id'];
+  }
+    
+  single_update(
+    USERS_TABLE,
+    array($conf['user_fields']['password'] => $conf['pass_convert']($_POST['use_new_pwd'])),
+    array($conf['user_fields']['id'] => $user_id)
+    );
+
+  array_push($page['infos'], l10n('Your password has been reset'));
+
+  if (isset($_GET['key']))
+  {
+    array_push($page['infos'], '<a href="'.get_root_url().'identification.php">'.l10n('Login').'</a>');
+  }
+  else
+  {
+    array_push($page['infos'], '<a href="'.get_gallery_home_url().'">'.l10n('Return to home page').'</a>');
+  }
+
+  return true;
+}
+
+// +-----------------------------------------------------------------------+
+// | Process form                                                          |
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']))
+{
+  check_pwg_token();
+  
+  if ('lost' == $_GET['action'])
+  {
+    if (process_password_request())
+    {
+      $page['action'] = 'none';
+    }
+  }
+
+  if ('reset' == $_GET['action'])
+  {
+    if (reset_password())
+    {
+      $page['action'] = 'none';
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// | key and action                                                        |
+// +-----------------------------------------------------------------------+
+
+// a connected user can't reset the password from a mail
+if (isset($_GET['key']) and !is_a_guest())
+{
+  unset($_GET['key']);
+}
+
+if (isset($_GET['key']))
+{
+  $user_id = check_password_reset_key($_GET['key']);
+  if (is_numeric($user_id))
+  {
+    $userdata = getuserdata($user_id, false);
+    $page['username'] = $userdata['username'];
+    $template->assign('key', $_GET['key']);
+
+    if (!isset($page['action']))
+    {
+      $page['action'] = 'reset';
+    }
+  }
+  else
+  {
+    $page['action'] = 'none';
+  }
+}
+
+if (!isset($page['action']))
+{
+  if (!isset($_GET['action']))
+  {
+    $page['action'] = 'lost';
+  }
+  elseif (in_array($_GET['action'], array('lost', 'reset', 'none')))
+  {
+    $page['action'] = $_GET['action'];
+  }
+}
+
+if ('reset' == $page['action'] and !isset($_GET['key']) and (is_a_guest() or is_generic()))
+{
+  redirect(get_gallery_home_url());
+}
+
+if ('lost' == $page['action'] and !is_a_guest())
+{
+  redirect(get_gallery_home_url());
+}
+
+// +-----------------------------------------------------------------------+
+// | template initialization                                               |
+// +-----------------------------------------------------------------------+
+
+$title = l10n('Password Reset');
+if ('lost' == $page['action'])
+{
+  $title = l10n('Forgot your password?');
+
+  if (isset($_POST['username_or_email']))
+  {
+    $template->assign('username_or_email', stripslashes($_POST['username_or_email']));
+  }
+}
+
+$page['body_id'] = 'thePasswordPage';
+
+$template->set_filenames(array('password'=>'password.tpl'));
+$template->assign(
+  array(
+    'title' => $title,
+    'form_action'=> get_root_url().'password.php',
+    'action' => $page['action'],
+    'username' => isset($page['username']) ? $page['username'] : $user['username'],
+    'PWG_TOKEN' => get_pwg_token(),
+    )
+  );
+
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('thePasswordPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('password');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+
+?>
Index: tags/2.4.0RC3/picture.php
===================================================================
--- tags/2.4.0RC3/picture.php	(revision 14585)
+++ tags/2.4.0RC3/picture.php	(revision 14585)
@@ -0,0 +1,982 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+include(PHPWG_ROOT_PATH.'include/section_init.inc.php');
+include_once(PHPWG_ROOT_PATH.'include/functions_picture.inc.php');
+
+// Check Access and exit when user status is not ok
+check_status(ACCESS_GUEST);
+
+// access authorization check
+if (isset($page['category']))
+{
+  check_restrictions($page['category']['id']);
+}
+
+$page['rank_of'] = array_flip($page['items']);
+
+// if this image_id doesn't correspond to this category, an error message is
+// displayed, and execution is stopped
+if ( !isset($page['rank_of'][$page['image_id']]) )
+{
+  $query = '
+SELECT id, file, level
+  FROM '.IMAGES_TABLE.'
+  WHERE ';
+  if ($page['image_id']>0)
+  {
+    $query .= 'id = '.$page['image_id'];
+  }
+  else
+  {// url given by file name
+    assert( !empty($page['image_file']) );
+    $query .= 'file LIKE \'' .
+      str_replace(array('_','%'), array('/_','/%'), $page['image_file'] ).
+      '.%\' ESCAPE \'/\' LIMIT 1';
+  }
+  if ( ! ( $row = pwg_db_fetch_assoc(pwg_query($query)) ) )
+  {// element does not exist
+    page_not_found( 'The requested image does not exist',
+      duplicate_index_url()
+      );
+  }
+  if ($row['level']>$user['level'])
+  {
+    access_denied();
+  }
+
+  $page['image_id'] = $row['id'];
+  $page['image_file'] =  $row['file'];
+  if ( !isset($page['rank_of'][$page['image_id']]) )
+  {// the image can still be non accessible (filter/cat perm) and/or not in the set
+    global $filter;
+    if ( !empty($filter['visible_images']) and
+      !in_array($page['image_id'], explode(',',$filter['visible_images']) ) )
+    {
+      page_not_found( 'The requested image is filtered',
+          duplicate_index_url()
+        );
+    }
+    if ('categories'==$page['section'] and !isset($page['category']) )
+    {// flat view - all items
+      access_denied();
+    }
+    else
+    {// try to see if we can access it differently
+      $query = '
+SELECT id
+  FROM '.IMAGES_TABLE.' INNER JOIN '.IMAGE_CATEGORY_TABLE.' ON id=image_id
+  WHERE id='.$page['image_id']
+        . get_sql_condition_FandF(
+            array('forbidden_categories' => 'category_id'),
+            " AND"
+          ).'
+  LIMIT 1';
+      if ( pwg_db_num_rows( pwg_query($query) ) == 0 )
+      {
+        access_denied();
+      }
+      else
+      {
+        if ('best_rated'==$page['section'])
+        {
+          $page['rank_of'][$page['image_id']] = count($page['items']);
+          array_push($page['items'], $page['image_id'] );
+        }
+        else
+        {
+          $url = make_picture_url(
+              array(
+                'image_id' => $page['image_id'],
+                'image_file' => $page['image_file'],
+                'section' => 'categories',
+                'flat' => true,
+              )
+            );
+          set_status_header( 'recent_pics'==$page['section'] ? 301 : 302);
+          redirect_http( $url );
+        }
+      }
+    }
+  }
+}
+
+// There is cookie, so we must handle it at the beginning
+if ( isset($_GET['metadata']) )
+{
+  if ( pwg_get_session_var('show_metadata') == null )
+	{
+		pwg_set_session_var('show_metadata', 1 );
+	} else {
+  	pwg_unset_session_var('show_metadata');
+	}
+}
+
+// add default event handler for rendering element content
+add_event_handler(
+  'render_element_content',
+  'default_picture_content',
+  EVENT_HANDLER_PRIORITY_NEUTRAL,
+  2
+  );
+// add default event handler for rendering element description
+add_event_handler('render_element_description', 'nl2br');
+
+trigger_action('loc_begin_picture');
+
+// this is the default handler that generates the display for the element
+function default_picture_content($content, $element_info)
+{
+  if ( !empty($content) )
+  {// someone hooked us - so we skip;
+    return $content;
+  }
+
+  if (isset($_COOKIE['picture_deriv']))
+  {
+    if ( array_key_exists($_COOKIE['picture_deriv'], ImageStdParams::get_defined_type_map()) )
+    {
+      pwg_set_session_var('picture_deriv', $_COOKIE['picture_deriv']);
+    }
+    setcookie('picture_deriv', false, 0, cookie_path() );
+  }
+  $deriv_type = pwg_get_session_var('picture_deriv', IMG_LARGE);
+  $selected_derivative = $element_info['derivatives'][$deriv_type];
+
+  $unique_derivatives = array();
+  $show_original = isset($element_info['element_url']);
+  $added = array();
+  foreach($element_info['derivatives'] as $type => $derivative)
+  {
+    if ($type==IMG_SQUARE || $type==IMG_THUMB)
+      continue;
+    if (!array_key_exists($type, ImageStdParams::get_defined_type_map()))
+      continue;
+    $url = $derivative->get_url();
+    if (isset($added[$url]))
+      continue;
+    $added[$url] = 1;
+    $show_original &= !($derivative->same_as_source());
+    $unique_derivatives[$type]= $derivative;
+  }
+
+  global $page, $template;
+
+  if ($show_original)
+  {
+    $template->assign( 'U_ORIGINAL', $element_info['element_url'] );
+  }
+
+  $template->append('current', array(
+      'selected_derivative' => $selected_derivative,
+      'unique_derivatives' => $unique_derivatives,
+    ), true);
+
+
+  $template->set_filenames(
+    array('default_content'=>'picture_content.tpl')
+    );
+
+  $template->assign( array(
+      'ALT_IMG' => $element_info['file'],
+      'COOKIE_PATH' => cookie_path(),
+      )
+    );
+  return $template->parse( 'default_content', true);
+}
+
+// +-----------------------------------------------------------------------+
+// |                            initialization                             |
+// +-----------------------------------------------------------------------+
+
+// caching first_rank, last_rank, current_rank in the displayed
+// section. This should also help in readability.
+$page['first_rank']   = 0;
+$page['last_rank']    = count($page['items']) - 1;
+$page['current_rank'] = $page['rank_of'][ $page['image_id'] ];
+
+// caching current item : readability purpose
+$page['current_item'] = $page['image_id'];
+
+if ($page['current_rank'] != $page['first_rank'])
+{
+  // caching first & previous item : readability purpose
+  $page['previous_item'] = $page['items'][ $page['current_rank'] - 1 ];
+  $page['first_item'] = $page['items'][ $page['first_rank'] ];
+}
+
+if ($page['current_rank'] != $page['last_rank'])
+{
+  // caching next & last item : readability purpose
+  $page['next_item'] = $page['items'][ $page['current_rank'] + 1 ];
+  $page['last_item'] = $page['items'][ $page['last_rank'] ];
+}
+
+$url_up = duplicate_index_url(
+  array(
+    'start' =>
+      floor($page['current_rank'] / $page['nb_image_page'])
+      * $page['nb_image_page']
+    ),
+  array(
+    'start',
+    )
+  );
+
+$url_self = duplicate_picture_url();
+
+// +-----------------------------------------------------------------------+
+// |                                actions                                |
+// +-----------------------------------------------------------------------+
+
+/**
+ * Actions are favorite adding, user comment deletion, setting the picture
+ * as representative of the current category...
+ *
+ * Actions finish by a redirection
+ */
+
+if (isset($_GET['action']))
+{
+  switch ($_GET['action'])
+  {
+    case 'add_to_favorites' :
+    {
+      $query = '
+INSERT INTO '.FAVORITES_TABLE.'
+  (image_id,user_id)
+  VALUES
+  ('.$page['image_id'].','.$user['id'].')
+;';
+      pwg_query($query);
+
+      redirect($url_self);
+
+      break;
+    }
+    case 'remove_from_favorites' :
+    {
+      $query = '
+DELETE FROM '.FAVORITES_TABLE.'
+  WHERE user_id = '.$user['id'].'
+    AND image_id = '.$page['image_id'].'
+;';
+      pwg_query($query);
+
+      if ('favorites' == $page['section'])
+      {
+        redirect($url_up);
+      }
+      else
+      {
+        redirect($url_self);
+      }
+
+      break;
+    }
+    case 'set_as_representative' :
+    {
+      if (is_admin() and isset($page['category']))
+      {
+        $query = '
+UPDATE '.CATEGORIES_TABLE.'
+  SET representative_picture_id = '.$page['image_id'].'
+  WHERE id = '.$page['category']['id'].'
+;';
+        pwg_query($query);
+
+        $query = '
+UPDATE '.USER_CACHE_CATEGORIES_TABLE.'
+  SET user_representative_picture_id = NULL
+  WHERE user_id = '.$user['id'].'
+    AND cat_id = '.$page['category']['id'].'
+;';
+        pwg_query($query);
+      }
+
+      redirect($url_self);
+
+      break;
+    }
+    case 'add_to_caddie' :
+    {
+      fill_caddie(array($page['image_id']));
+      redirect($url_self);
+      break;
+    }
+    case 'rate' :
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_rate.inc.php');
+      rate_picture($page['image_id'], $_POST['rate']);
+      redirect($url_self);
+    }
+    case 'edit_comment':
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+      check_input_parameter('comment_to_edit', $_GET, false, PATTERN_ID);
+      $author_id = get_comment_author_id($_GET['comment_to_edit']);
+
+      if (can_manage_comment('edit', $author_id))
+      {
+        if (!empty($_POST['content']))
+        {
+          check_pwg_token();
+          $comment_action = update_user_comment(
+            array(
+              'comment_id' => $_GET['comment_to_edit'],
+              'image_id' => $page['image_id'],
+              'content' => $_POST['content']
+              ),
+            $_POST['key']
+            );
+
+          $perform_redirect = false;
+          switch ($comment_action)
+          {
+            case 'moderate':
+              $_SESSION['page_infos'][] = l10n('An administrator must authorize your comment before it is visible.');
+            case 'validate':
+              $_SESSION['page_infos'][] = l10n('Your comment has been registered');
+              $perform_redirect = true;
+              break;
+            case 'reject':
+              $_SESSION['page_errors'][] = l10n('Your comment has NOT been registered because it did not pass the validation rules');
+              $perform_redirect = true;
+              break;
+            default:
+              trigger_error('Invalid comment action '.$comment_action, E_USER_WARNING);
+          }
+
+          if ($perform_redirect)
+          {
+            redirect($url_self);
+          }
+          unset($_POST['content']);
+        }
+        else
+        {
+          $edit_comment = $_GET['comment_to_edit'];
+        }
+      }
+      break;
+    }
+    case 'delete_comment' :
+    {
+      check_pwg_token();
+
+      include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+      check_input_parameter('comment_to_delete', $_GET, false, PATTERN_ID);
+
+      $author_id = get_comment_author_id($_GET['comment_to_delete']);
+
+      if (can_manage_comment('delete', $author_id))
+      {
+        delete_user_comment($_GET['comment_to_delete']);
+      }
+
+      redirect($url_self);
+    }
+    case 'validate_comment' :
+    {
+      check_pwg_token();
+
+      include_once(PHPWG_ROOT_PATH.'include/functions_comment.inc.php');
+
+      check_input_parameter('comment_to_validate', $_GET, false, PATTERN_ID);
+
+      $author_id = get_comment_author_id($_GET['comment_to_validate']);
+
+      if (can_manage_comment('validate', $author_id))
+      {
+        validate_user_comment($_GET['comment_to_validate']);
+      }
+
+      redirect($url_self);
+    }
+
+  }
+}
+
+//---------- incrementation of the number of hits, we do this only if no action
+if (trigger_event('allow_increment_element_hit_count', !isset($_POST['content']) ) )
+{
+  $query = '
+UPDATE
+  '.IMAGES_TABLE.'
+  SET hit = hit+1
+  WHERE id = '.$page['image_id'].'
+;';
+  pwg_query($query);
+}
+//---------------------------------------------------------- related categories
+$query = '
+SELECT category_id,uppercats,commentable,global_rank
+  FROM '.IMAGE_CATEGORY_TABLE.'
+    INNER JOIN '.CATEGORIES_TABLE.' ON category_id = id
+  WHERE image_id = '.$page['image_id'].'
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'category_id',
+        'visible_categories' => 'category_id'
+      ),
+    'AND'
+  ).'
+;';
+$result = pwg_query($query);
+$related_categories = array();
+while ($row = pwg_db_fetch_assoc($result))
+{
+  $row['commentable'] = get_boolean($row['commentable']);
+  array_push($related_categories, $row);
+}
+usort($related_categories, 'global_rank_compare');
+//-------------------------first, prev, current, next & last picture management
+$picture = array();
+
+$ids = array($page['image_id']);
+if (isset($page['previous_item']))
+{
+  array_push($ids, $page['previous_item']);
+  array_push($ids, $page['first_item']);
+}
+if (isset($page['next_item']))
+{
+  array_push($ids, $page['next_item']);
+  array_push($ids, $page['last_item']);
+}
+
+$query = '
+SELECT *
+  FROM '.IMAGES_TABLE.'
+  WHERE id IN ('.implode(',', $ids).')
+;';
+
+$result = pwg_query($query);
+
+while ($row = pwg_db_fetch_assoc($result))
+{
+  if (isset($page['previous_item']) and $row['id'] == $page['previous_item'])
+  {
+    $i = 'previous';
+  }
+  elseif (isset($page['next_item']) and $row['id'] == $page['next_item'])
+  {
+    $i = 'next';
+  }
+  elseif (isset($page['first_item']) and $row['id'] == $page['first_item'])
+  {
+    $i = 'first';
+  }
+  elseif (isset($page['last_item']) and $row['id'] == $page['last_item'])
+  {
+    $i = 'last';
+  }
+  else
+  {
+    $i = 'current';
+  }
+
+  $row['src_image'] = new SrcImage($row);
+  $row['derivatives'] = DerivativeImage::get_all($row['src_image']);
+
+  if ($i=='current')
+  {
+    $row['element_path'] = get_element_path($row);
+
+    if ( $row['src_image']->is_original() )
+    {// we have a photo
+      if ( $user['enabled_high']=='true' )
+      {
+        $row['element_url'] = $row['src_image']->get_url();
+        $row['download_url'] = get_action_url($row['id'], 'e', true);
+      }
+    }
+    else
+    { // not a pic - need download link
+      $row['download_url'] = $row['element_url'] = get_element_url($row);;
+    }
+  }
+
+  $row['url'] = duplicate_picture_url(
+    array(
+      'image_id' => $row['id'],
+      'image_file' => $row['file'],
+      ),
+    array(
+      'start',
+      )
+    );
+
+  $picture[$i] = $row;
+  $picture[$i]['TITLE'] = render_element_name($row);
+
+  if ('previous'==$i and $page['previous_item']==$page['first_item'])
+  {
+    $picture['first'] = $picture[$i];
+  }
+  if ('next'==$i and $page['next_item']==$page['last_item'])
+  {
+    $picture['last'] = $picture[$i];
+  }
+}
+
+$slideshow_params = array();
+$slideshow_url_params = array();
+
+if (isset($_GET['slideshow']))
+{
+  $page['slideshow'] = true;
+  $page['meta_robots'] = array('noindex'=>1, 'nofollow'=>1);
+
+  $slideshow_params = decode_slideshow_params($_GET['slideshow']);
+  $slideshow_url_params['slideshow'] = encode_slideshow_params($slideshow_params);
+
+  if ($slideshow_params['play'])
+  {
+    $id_pict_redirect = '';
+    if (isset($page['next_item']))
+    {
+      $id_pict_redirect = 'next';
+    }
+    else
+    {
+      if ($slideshow_params['repeat'] and isset($page['first_item']))
+      {
+        $id_pict_redirect = 'first';
+      }
+    }
+
+    if (!empty($id_pict_redirect))
+    {
+      // $refresh, $url_link and $title are required for creating
+      // an automated refresh page in header.tpl
+      $refresh = $slideshow_params['period'];
+      $url_link = add_url_params(
+          $picture[$id_pict_redirect]['url'],
+          $slideshow_url_params
+        );
+    }
+  }
+}
+else
+{
+  $page['slideshow'] = false;
+}
+if ($page['slideshow'] and $conf['light_slideshow'])
+{
+  $template->set_filenames( array('slideshow' => 'slideshow.tpl'));
+}
+else
+{
+  $template->set_filenames( array('picture' => 'picture.tpl'));
+}
+
+$title =  $picture['current']['TITLE'];
+$title_nb = ($page['current_rank'] + 1).'/'.count($page['items']);
+
+// metadata
+$url_metadata = duplicate_picture_url();
+$url_metadata = add_url_params( $url_metadata, array('metadata'=>null) );
+
+
+// do we have a plugin that can show metadata for something else than images?
+$metadata_showable = trigger_event(
+  'get_element_metadata_available',
+  (
+    ($conf['show_exif'] or $conf['show_iptc'])
+    and !$picture['current']['src_image']->is_mimetype()
+    ),
+  $picture['current']
+  );
+
+if ( $metadata_showable and pwg_get_session_var('show_metadata') )
+{
+  $page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+}
+
+
+$page['body_id'] = 'thePicturePage';
+
+// allow plugins to change what we computed before passing data to template
+$picture = trigger_event('picture_pictures_data', $picture);
+
+//------------------------------------------------------- navigation management
+foreach (array('first','previous','next','last', 'current') as $which_image)
+{
+  if (isset($picture[$which_image]))
+  {
+    $template->assign(
+      $which_image,
+      array_merge(
+        $picture[$which_image],
+        array(
+          'THUMB_SRC' => $picture[$which_image]['derivatives'][IMG_THUMB]->get_url(),
+          // Params slideshow was transmit to navigation buttons
+          'U_IMG' =>
+            add_url_params(
+              $picture[$which_image]['url'], $slideshow_url_params),
+          )
+        )
+      );
+  }
+}
+if ($conf['picture_download_icon'] and !empty($picture['current']['download_url']))
+{
+  $template->append('current', array('U_DOWNLOAD' => $picture['current']['download_url']), true);
+}
+
+
+if ($page['slideshow'])
+{
+  $tpl_slideshow = array();
+
+  //slideshow end
+  $template->assign(
+    array(
+      'U_SLIDESHOW_STOP' => $picture['current']['url'],
+      )
+    );
+
+  foreach (array('repeat', 'play') as $p)
+  {
+    $var_name =
+      'U_'
+      .($slideshow_params[$p] ? 'STOP_' : 'START_')
+      .strtoupper($p);
+
+    $tpl_slideshow[$var_name] =
+          add_url_params(
+            $picture['current']['url'],
+            array('slideshow' =>
+              encode_slideshow_params(
+                array_merge($slideshow_params,
+                  array($p => ! $slideshow_params[$p]))
+                )
+              )
+          );
+  }
+
+  foreach (array('dec', 'inc') as $op)
+  {
+    $new_period = $slideshow_params['period'] + ((($op == 'dec') ? -1 : 1) * $conf['slideshow_period_step']);
+    $new_slideshow_params =
+      correct_slideshow_params(
+        array_merge($slideshow_params,
+                  array('period' => $new_period)));
+
+    if ($new_slideshow_params['period'] === $new_period)
+    {
+      $var_name = 'U_'.strtoupper($op).'_PERIOD';
+      $tpl_slideshow[$var_name] =
+            add_url_params(
+              $picture['current']['url'],
+              array('slideshow' => encode_slideshow_params($new_slideshow_params)
+                  )
+          );
+    }
+  }
+  $template->assign('slideshow', $tpl_slideshow );
+}
+elseif ($conf['picture_slideshow_icon'])
+{
+  $template->assign(
+    array(
+      'U_SLIDESHOW_START' =>
+        add_url_params(
+          $picture['current']['url'],
+          array( 'slideshow'=>''))
+      )
+    );
+}
+
+$template->assign(
+  array(
+    'SECTION_TITLE' => $page['title'],
+    'PHOTO' => $title_nb,
+    'IS_HOME' => ('categories'==$page['section'] and !isset($page['category']) ),
+
+    'LEVEL_SEPARATOR' => $conf['level_separator'],
+
+    'U_UP' => $url_up,
+    'DISPLAY_NAV_BUTTONS' => $conf['picture_navigation_icons'],
+    'DISPLAY_NAV_THUMB' => $conf['picture_navigation_thumb']
+    )
+  );
+
+if ($conf['picture_metadata_icon'])
+{
+  $template->assign('U_METADATA', $url_metadata);
+}
+
+
+//------------------------------------------------------- upper menu management
+
+// admin links
+if (is_admin())
+{
+  if (isset($page['category']))
+  {
+    $template->assign(
+      array(
+        'U_SET_AS_REPRESENTATIVE' => add_url_params($url_self,
+                    array('action'=>'set_as_representative')
+                 )
+        )
+      );
+  }
+
+  $url_admin =
+    get_root_url().'admin.php?page=photo-'.$page['image_id']
+    .(isset($page['category']) ? '&amp;cat_id='.$page['category']['id'] : '')
+    ;
+
+  $template->assign(
+    array(
+      'U_CADDIE' => add_url_params($url_self,
+                  array('action'=>'add_to_caddie')
+               ),
+      'U_ADMIN' => $url_admin,
+      )
+    );
+
+  $template->assign('available_permission_levels', get_privacy_level_options());
+}
+
+// favorite manipulation
+if (!is_a_guest() and $conf['picture_favorite_icon'])
+{
+  // verify if the picture is already in the favorite of the user
+  $query = '
+SELECT COUNT(*) AS nb_fav
+  FROM '.FAVORITES_TABLE.'
+  WHERE image_id = '.$page['image_id'].'
+    AND user_id = '.$user['id'].'
+;';
+  $row = pwg_db_fetch_assoc( pwg_query($query) );
+	$is_favorite = $row['nb_fav'] != 0;
+
+  $template->assign(
+    'favorite',
+    array(
+			'IS_FAVORITE' => $is_favorite,
+      'U_FAVORITE'    => add_url_params(
+        $url_self,
+        array('action'=> !$is_favorite ? 'add_to_favorites' : 'remove_from_favorites' )
+        ),
+      )
+    );
+}
+
+//--------------------------------------------------------- picture information
+// legend
+if (isset($picture['current']['comment'])
+    and !empty($picture['current']['comment']))
+{
+  $template->assign(
+      'COMMENT_IMG',
+        trigger_event('render_element_description',
+          $picture['current']['comment'])
+      );
+}
+
+// author
+if (!empty($picture['current']['author']))
+{
+  $infos['INFO_AUTHOR'] = $picture['current']['author'];
+}
+
+// creation date
+if (!empty($picture['current']['date_creation']))
+{
+  $val = format_date($picture['current']['date_creation']);
+  $url = make_index_url(
+    array(
+      'chronology_field'=>'created',
+      'chronology_style'=>'monthly',
+      'chronology_view'=>'list',
+      'chronology_date' => explode('-', substr($picture['current']['date_creation'], 0, 10))
+      )
+    );
+  $infos['INFO_CREATION_DATE'] =
+    '<a href="'.$url.'" rel="nofollow">'.$val.'</a>';
+}
+
+// date of availability
+$val = format_date($picture['current']['date_available']);
+$url = make_index_url(
+  array(
+    'chronology_field'=>'posted',
+    'chronology_style'=>'monthly',
+    'chronology_view'=>'list',
+    'chronology_date' => explode(
+      '-',
+      substr($picture['current']['date_available'], 0, 10)
+      )
+    )
+  );
+$infos['INFO_POSTED_DATE'] = '<a href="'.$url.'" rel="nofollow">'.$val.'</a>';
+
+// size in pixels
+if ($picture['current']['src_image']->is_original() and isset($picture['current']['width']) )
+{
+  $infos['INFO_DIMENSIONS'] =
+    $picture['current']['width'].'*'.$picture['current']['height'];
+}
+
+// filesize
+if (!empty($picture['current']['filesize']))
+{
+  $infos['INFO_FILESIZE'] =
+    sprintf(l10n('%d Kb'), $picture['current']['filesize']);
+}
+
+// number of visits
+$infos['INFO_VISITS'] = $picture['current']['hit'];
+
+// file
+$infos['INFO_FILE'] = $picture['current']['file'];
+
+$template->assign($infos);
+$template->assign('display_info', unserialize($conf['picture_informations']));
+
+// related tags
+$tags = get_common_tags( array($page['image_id']), -1);
+if ( count($tags) )
+{
+  foreach ($tags as $tag)
+  {
+    $template->append(
+        'related_tags',
+        array_merge( $tag,
+          array(
+            'URL' => make_index_url(
+                      array(
+                        'tags' => array($tag)
+                        )
+                      ),
+            'U_TAG_IMAGE' => duplicate_picture_url(
+                      array(
+                        'section' => 'tags',
+                        'tags' => array($tag)
+                        )
+                    )
+          )
+        )
+      );
+  }
+}
+
+// related categories
+if ( count($related_categories)==1 and
+    isset($page['category']) and
+    $related_categories[0]['category_id']==$page['category']['id'] )
+{ // no need to go to db, we have all the info
+  $template->append(
+      'related_categories',
+      get_cat_display_name( $page['category']['upper_names'] )
+    );
+}
+else
+{ // use only 1 sql query to get names for all related categories
+  $ids = array();
+  foreach ($related_categories as $category)
+  {// add all uppercats to $ids
+    $ids = array_merge($ids, explode(',', $category['uppercats']) );
+  }
+  $ids = array_unique($ids);
+  $query = '
+SELECT id, name, permalink
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.implode(',',$ids).')';
+  $cat_map = hash_from_query($query, 'id');
+  foreach ($related_categories as $category)
+  {
+    $cats = array();
+    foreach ( explode(',', $category['uppercats']) as $id )
+    {
+      $cats[] = $cat_map[$id];
+    }
+    $template->append('related_categories', get_cat_display_name($cats) );
+  }
+}
+
+// maybe someone wants a special display (call it before page_header so that
+// they can add stylesheets)
+$element_content = trigger_event(
+  'render_element_content',
+  '',
+  $picture['current']
+  );
+$template->assign( 'ELEMENT_CONTENT', $element_content );
+
+if (isset($picture['next'])
+    and $picture['next']['src_image']->is_original()
+    and strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome/') === false)
+{
+  $template->assign('U_PREFETCH', $picture['next']['derivatives'][pwg_get_session_var('picture_deriv', IMG_LARGE)]->get_url() );
+}
+
+$template->assign('U_CANONICAL', make_picture_url( array('image_id'=>$picture['current']['id'], 'image_file'=>$picture['current']['file']) ) );
+
+// +-----------------------------------------------------------------------+
+// |                               sub pages                               |
+// +-----------------------------------------------------------------------+
+
+include(PHPWG_ROOT_PATH.'include/picture_rate.inc.php');
+if ($conf['activate_comments'])
+{
+  include(PHPWG_ROOT_PATH.'include/picture_comment.inc.php');
+}
+if ($metadata_showable and pwg_get_session_var('show_metadata') <> null )
+{
+  include(PHPWG_ROOT_PATH.'include/picture_metadata.inc.php');
+}
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if ($conf['picture_menu'] AND (!isset($themeconf['hide_menu_on']) OR !in_array('thePicturePage', $themeconf['hide_menu_on'])))
+{
+  if (!isset($page['start'])) $page['start'] = 0;
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+  if (is_admin()) $template->assign('U_ADMIN', $url_admin); // overwrited by the menu
+}
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+trigger_action('loc_end_picture');
+if ($page['slideshow'] and $conf['light_slideshow'])
+{
+  $template->pparse('slideshow');
+}
+else
+{
+  $template->pparse('picture');
+}
+//------------------------------------------------------------ log informations
+pwg_log($picture['current']['id'], 'picture');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/admin.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/admin.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/admin.php	(revision 14585)
@@ -0,0 +1,151 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
+include_once(LOCALEDIT_PATH.'include/functions.inc.php');
+load_language('plugin.lang', LOCALEDIT_PATH);
+$my_base_url = get_root_url().'admin.php?page=plugin-'.basename(dirname(__FILE__));
+
+// +-----------------------------------------------------------------------+
+// |                            Tabssheet
+// +-----------------------------------------------------------------------+
+
+if (empty($conf['LocalFilesEditor_tabs']))
+{
+  $conf['LocalFilesEditor_tabs'] = array('localconf', 'css', 'tpl', 'lang', 'plug');
+}
+
+$page['tab'] = isset($_GET['tab']) ? $_GET['tab'] : $conf['LocalFilesEditor_tabs'][0];
+
+if (!in_array($page['tab'], $conf['LocalFilesEditor_tabs'])) die('Hacking attempt!');
+
+$tabsheet = new tabsheet();
+foreach ($conf['LocalFilesEditor_tabs'] as $tab)
+{
+  $tabsheet->add($tab, l10n('locfiledit_onglet_'.$tab), $my_base_url.'-'.$tab);
+}
+$tabsheet->select($page['tab']);
+$tabsheet->assign();
+
+include_once(LOCALEDIT_PATH.'include/'.$page['tab'].'.inc.php');
+
+// +-----------------------------------------------------------------------+
+// |                           Load backup file
+// +-----------------------------------------------------------------------+
+if (isset($_POST['restore']))
+{
+  $edited_file = $_POST['edited_file'];
+  $content_file = file_get_contents(get_bak_file($edited_file));
+  array_push($page['infos'],
+    l10n('locfiledit_bak_loaded1'),
+    l10n('locfiledit_bak_loaded2'));
+}
+
+// +-----------------------------------------------------------------------+
+// |                            Save file
+// +-----------------------------------------------------------------------+
+if (isset($_POST['submit']))
+{
+  if (!is_webmaster())
+  {
+    array_push($page['errors'], l10n('locfiledit_webmaster_only'));
+  }
+  else
+  {
+    $edited_file = $_POST['edited_file'];
+    $content_file = stripslashes($_POST['text']);
+    if (get_extension($edited_file) == 'php')
+    {
+      $content_file = eval_syntax($content_file);
+    }
+    if ($content_file === false)
+    {
+      array_push($page['errors'], l10n('locfiledit_syntax_error'));
+    }
+    else
+    {
+      if ($page['tab'] == 'plug' and !is_dir(PHPWG_PLUGINS_PATH . 'PersonalPlugin'))
+      {
+        @mkdir(PHPWG_PLUGINS_PATH . "PersonalPlugin");
+      }
+      if (file_exists($edited_file))
+      {
+        @copy($edited_file, get_bak_file($edited_file));
+        array_push($page['infos'], sprintf(l10n('locfiledit_saved_bak'), substr(get_bak_file($edited_file), 2)));
+      }
+      
+      if ($file = @fopen($edited_file , "w"))
+      {
+        @fwrite($file , $content_file);
+        @fclose($file);
+        array_unshift($page['infos'], l10n('locfiledit_save_config'));
+        $template->delete_compiled_templates();
+      }
+      else
+      {
+        array_push($page['errors'], l10n('locfiledit_cant_save'));
+      }
+    }
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                            template initialization
+// +-----------------------------------------------------------------------+
+$template->set_filenames(array(
+    'plugin_admin_content' => dirname(__FILE__) . '/template/admin.tpl'));
+
+if (!empty($edited_file))
+{
+  if (!empty($page['errors']))
+	{
+    $content_file = stripslashes($_POST['text']);
+  }
+  $template->assign('zone_edit',
+    array(
+      'EDITED_FILE' => $edited_file,
+      'CONTENT_FILE' => htmlspecialchars($content_file),
+      'FILE_NAME' => trim($edited_file, './\\')
+    )
+  );
+  if (file_exists(get_bak_file($edited_file)))
+  {
+    $template->assign('restore', true);
+  }
+  if (file_exists($edited_file))
+  {
+    $template->assign('restore_infos', true);
+  }
+}
+
+$template->assign(array(
+  'F_ACTION' => PHPWG_ROOT_PATH.'admin.php?page=plugin-LocalFilesEditor-'.$page['tab'],
+  'LOCALEDIT_PATH' => LOCALEDIT_PATH,
+  'CODEMIRROR_MODE' => @$codemirror_mode
+  )
+);
+
+$template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content');
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.css	(revision 14585)
@@ -0,0 +1,53 @@
+.CodeMirror {
+  overflow: auto;
+  height: 300px;
+  line-height: 1em;
+  font-family: monospace;
+  _position: relative; /* IE6 hack */
+}
+
+.CodeMirror-gutter {
+  position: absolute; left: 0; top: 0;
+  background-color: #f7f7f7;
+  border-right: 1px solid #eee;
+  min-width: 2em;
+  height: 100%;
+}
+.CodeMirror-gutter-text {
+  color: #aaa;
+  text-align: right;
+  padding: .4em .2em .4em .4em;
+}
+.CodeMirror-lines {
+  padding: .4em;
+}
+
+.CodeMirror pre {
+  -moz-border-radius: 0;
+  -webkit-border-radius: 0;
+  -o-border-radius: 0;
+  border-radius: 0;
+  border-width: 0; margin: 0; padding: 0; background: transparent;
+  font-family: inherit;
+}
+
+.CodeMirror-cursor {
+  z-index: 10;
+  position: absolute;
+  visibility: hidden;
+  border-left: 1px solid black !important;
+}
+.CodeMirror-focused .CodeMirror-cursor {
+  visibility: visible;
+}
+
+span.CodeMirror-selected {
+  background: #ccc !important;
+  color: HighlightText !important;
+}
+.CodeMirror-focused span.CodeMirror-selected {
+  background: Highlight !important;
+}
+
+.CodeMirror-matchingbracket {color: #0f0 !important;}
+.CodeMirror-nonmatchingbracket {color: #f22 !important;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/codemirror.js	(revision 14585)
@@ -0,0 +1,1915 @@
+// All functions that need access to the editor's state live inside
+// the CodeMirror function. Below that, at the bottom of the file,
+// some utilities are defined.
+
+// CodeMirror is the only global var we claim
+var CodeMirror = (function() {
+  // This is the function that produces an editor instance. It's
+  // closure is used to store the editor state.
+  function CodeMirror(place, givenOptions) {
+    // Determine effective options based on given values and defaults.
+    var options = {}, defaults = CodeMirror.defaults;
+    for (var opt in defaults)
+      if (defaults.hasOwnProperty(opt))
+        options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt) ? givenOptions : defaults)[opt];
+
+    // The element in which the editor lives. Takes care of scrolling
+    // (if enabled).
+    var wrapper = document.createElement("div");
+    wrapper.className = "CodeMirror";
+    // This mess creates the base DOM structure for the editor.
+    wrapper.innerHTML =
+      '<div style="position: relative">' + // Set to the height of the text, causes scrolling
+        '<pre style="position: relative; height: 0; visibility: hidden; overflow: hidden;">' + // To measure line/char size
+           '<span>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span></pre>' +
+        '<div style="position: relative">' + // Moved around its parent to cover visible view
+          '<div class="CodeMirror-gutter"><div class="CodeMirror-gutter-text"></div></div>' +
+          '<div style="overflow: hidden; position: absolute; width: 0; left: 0">' + // Wraps and hides input textarea
+            '<textarea style="height: 1px; position: absolute; width: 1px;" wrap="off"></textarea></div>' +
+          // Provides positioning relative to (visible) text origin
+          '<div class="CodeMirror-lines"><div style="position: relative">' +
+            '<pre class="CodeMirror-cursor">&#160;</pre>' + // Absolutely positioned blinky cursor
+            '<div></div></div></div></div></div>'; // This DIV contains the actual code
+    if (place.appendChild) place.appendChild(wrapper); else place(wrapper);
+    // I've never seen more elegant code in my life.
+    var code = wrapper.firstChild, measure = code.firstChild, mover = measure.nextSibling,
+        gutter = mover.firstChild, gutterText = gutter.firstChild,
+        inputDiv = gutter.nextSibling, input = inputDiv.firstChild,
+        lineSpace = inputDiv.nextSibling.firstChild, cursor = lineSpace.firstChild, lineDiv = cursor.nextSibling;
+    if (options.tabindex != null) input.tabindex = options.tabindex;
+    if (!options.gutter && !options.lineNumbers) gutter.style.display = "none";
+
+    // Delayed object wrap timeouts, making sure only one is active. blinker holds an interval.
+    var poll = new Delayed(), highlight = new Delayed(), blinker;
+
+    // mode holds a mode API object. lines an array of Line objects
+    // (see Line constructor), work an array of lines that should be
+    // parsed, and history the undo history (instance of History
+    // constructor).
+    var mode, lines = [new Line("")], work, history = new History(), focused;
+    loadMode();
+    // The selection. These are always maintained to point at valid
+    // positions. Inverted is used to remember that the user is
+    // selecting bottom-to-top.
+    var sel = {from: {line: 0, ch: 0}, to: {line: 0, ch: 0}, inverted: false};
+    // Selection-related flags. shiftSelecting obviously tracks
+    // whether the user is holding shift. reducedSelection is a hack
+    // to get around the fact that we can't create inverted
+    // selections. See below.
+    var shiftSelecting, reducedSelection;
+    // Variables used by startOperation/endOperation to track what
+    // happened during the operation.
+    var updateInput, changes, textChanged, selectionChanged, leaveInputAlone;
+    // Current visible range (may be bigger than the view window).
+    var showingFrom = 0, showingTo = 0, lastHeight = 0, curKeyId = null;
+    // editing will hold an object describing the things we put in the
+    // textarea, to help figure out whether something changed.
+    // bracketHighlighted is used to remember that a backet has been
+    // marked.
+    var editing, bracketHighlighted;
+
+    // Initialize the content. Somewhat hacky (delayed prepareInput)
+    // to work around browser issues.
+    operation(function(){setValue(options.value || ""); updateInput = false;})();
+    setTimeout(prepareInput, 20);
+
+    // Register our event handlers.
+    connect(wrapper, "mousedown", operation(onMouseDown));
+    // Gecko browsers fire contextmenu *after* opening the menu, at
+    // which point we can't mess with it anymore. Context menu is
+    // handled in onMouseDown for Gecko.
+    if (!gecko) connect(wrapper, "contextmenu", operation(onContextMenu));
+    connect(code, "dblclick", operation(onDblClick));
+    connect(wrapper, "scroll", function() {updateDisplay([]); if (options.onScroll) options.onScroll(instance);});
+    connect(window, "resize", function() {updateDisplay(true);});
+    connect(input, "keyup", operation(onKeyUp));
+    connect(input, "keydown", operation(onKeyDown));
+    connect(input, "keypress", operation(onKeyPress));
+    connect(input, "focus", onFocus);
+    connect(input, "blur", onBlur);
+
+    connect(wrapper, "dragenter", function(e){e.stop();});
+    connect(wrapper, "dragover", function(e){e.stop();});
+    connect(wrapper, "drop", operation(onDrop));
+    connect(wrapper, "paste", function(){input.focus(); fastPoll();});
+    connect(input, "paste", function(){fastPoll();});
+    connect(input, "cut", function(){fastPoll();});
+
+    if (document.activeElement == input) onFocus();
+    else onBlur();
+
+    function isLine(l) {return l >= 0 && l < lines.length;}
+    // The instance object that we'll return. Mostly calls out to
+    // local functions in the CodeMirror function. Some do some extra
+    // range checking and/or clipping. operation is used to wrap the
+    // call so that changes it makes are tracked, and the display is
+    // updated afterwards.
+    var instance = {
+      getValue: getValue,
+      setValue: operation(setValue),
+      getSelection: getSelection,
+      replaceSelection: operation(replaceSelection),
+      focus: function(){input.focus(); onFocus(); fastPoll();},
+      setOption: function(option, value) {
+        options[option] = value;
+        if (option == "lineNumbers" || option == "gutter") gutterChanged();
+        else if (option == "mode" || option == "indentUnit") loadMode();
+      },
+      getOption: function(option) {return options[option];},
+      undo: operation(undo),
+      redo: operation(redo),
+      indentLine: operation(function(n) {if (isLine(n)) indentLine(n, "smart");}),
+      historySize: function() {return {undo: history.done.length, redo: history.undone.length};},
+      matchBrackets: operation(function(){matchBrackets(true);}),
+      getTokenAt: function(pos) {
+        pos = clipPos(pos);
+        return lines[pos.line].getTokenAt(mode, getStateBefore(pos.line), pos.ch);
+      },
+      cursorCoords: function(start){
+        if (start == null) start = sel.inverted;
+        return pageCoords(start ? sel.from : sel.to);
+      },
+      charCoords: function(pos){return pageCoords(clipPos(pos));},
+      coordsChar: function(coords) {
+        var off = eltOffset(lineSpace);
+        var line = Math.min(showingTo - 1, showingFrom + Math.floor(coords.y / lineHeight()));
+        return clipPos({line: line, ch: charFromX(clipLine(line), coords.x)});
+      },
+      getSearchCursor: function(query, pos, caseFold) {return new SearchCursor(query, pos, caseFold);},
+      markText: operation(function(a, b, c){return operation(markText(a, b, c));}),
+      setMarker: addGutterMarker,
+      clearMarker: removeGutterMarker,
+      setLineClass: operation(setLineClass),
+      lineInfo: lineInfo,
+      addWidget: function(pos, node, scroll) {
+        var pos = localCoords(clipPos(pos), true);
+        node.style.top = (showingFrom * lineHeight() + pos.yBot + paddingTop()) + "px";
+        node.style.left = (pos.x + paddingLeft()) + "px";
+        code.appendChild(node);
+        if (scroll)
+          scrollIntoView(pos.x, pos.yBot, pos.x + node.offsetWidth, pos.yBot + node.offsetHeight);
+      },
+
+      lineCount: function() {return lines.length;},
+      getCursor: function(start) {
+        if (start == null) start = sel.inverted;
+        return copyPos(start ? sel.from : sel.to);
+      },
+      somethingSelected: function() {return !posEq(sel.from, sel.to);},
+      setCursor: operation(function(line, ch) {
+        if (ch == null && typeof line.line == "number") setCursor(line.line, line.ch);
+        else setCursor(line, ch);
+      }),
+      setSelection: operation(function(from, to) {setSelection(clipPos(from), clipPos(to || from));}),
+      getLine: function(line) {if (isLine(line)) return lines[line].text;},
+      setLine: operation(function(line, text) {
+        if (isLine(line)) replaceRange(text, {line: line, ch: 0}, {line: line, ch: lines[line].text.length});
+      }),
+      removeLine: operation(function(line) {
+        if (isLine(line)) replaceRange("", {line: line, ch: 0}, clipPos({line: line+1, ch: 0}));
+      }),
+      replaceRange: operation(replaceRange),
+      getRange: function(from, to) {return getRange(clipPos(from), clipPos(to));},
+
+      operation: function(f){return operation(f)();},
+      refresh: function(){updateDisplay(true);},
+      getInputField: function(){return input;},
+      getWrapperElement: function(){return wrapper;}
+    };
+
+    function setValue(code) {
+      history = null;
+      var top = {line: 0, ch: 0};
+      updateLines(top, {line: lines.length - 1, ch: lines[lines.length-1].text.length},
+                  splitLines(code), top, top);
+      history = new History();
+    }
+    function getValue(code) {
+      var text = [];
+      for (var i = 0, l = lines.length; i < l; ++i)
+        text.push(lines[i].text);
+      return text.join("\n");
+    }
+
+    function onMouseDown(e) {
+      // First, see if this is a click in the gutter
+      for (var n = e.target(); n != wrapper; n = n.parentNode)
+        if (n.parentNode == gutterText) {
+          if (options.onGutterClick)
+            options.onGutterClick(instance, indexOf(gutterText.childNodes, n) + showingFrom);
+          return e.stop();
+        }
+
+      if (gecko && e.button() == 3) onContextMenu(e);
+      if (e.button() != 1) return;
+      // For button 1, if it was clicked inside the editor
+      // (posFromMouse returning non-null), we have to adjust the
+      // selection.
+      var start = posFromMouse(e), last = start, going;
+      if (!start) {if (e.target() == wrapper) e.stop(); return;}
+      setCursor(start.line, start.ch, false);
+
+      if (!focused) onFocus();
+      e.stop();
+      // And then we have to see if it's a drag event, in which case
+      // the dragged-over text must be selected.
+      function end() {
+        input.focus();
+        updateInput = true;
+        move(); up();
+      }
+      function extend(e) {
+        var cur = posFromMouse(e, true);
+        if (cur && !posEq(cur, last)) {
+          if (!focused) onFocus();
+          last = cur;
+          setSelection(start, cur);
+          updateInput = false;
+          var visible = visibleLines();
+          if (cur.line >= visible.to || cur.line < visible.from)
+            going = setTimeout(operation(function(){extend(e);}), 150);
+        }
+      }
+
+      var move = connect(document, "mousemove", operation(function(e) {
+        clearTimeout(going);
+        e.stop();
+        extend(e);
+      }), true);
+      var up = connect(document, "mouseup", operation(function(e) {
+        clearTimeout(going);
+        var cur = posFromMouse(e);
+        if (cur) setSelection(start, cur);
+        e.stop();
+        end();
+      }), true);
+    }
+    function onDblClick(e) {
+      var pos = posFromMouse(e);
+      if (!pos) return;
+      selectWordAt(pos);
+      e.stop();
+    }
+    function onDrop(e) {
+      var pos = posFromMouse(e, true), files = e.e.dataTransfer.files;
+      if (!pos || options.readOnly) return;
+      if (files && files.length && window.FileReader && window.File) {
+        var n = files.length, text = Array(n), read = 0;
+        for (var i = 0; i < n; ++i) loadFile(files[i], i);
+        function loadFile(file, i) {
+          var reader = new FileReader;
+          reader.onload = function() {
+            text[i] = reader.result;
+            if (++read == n) replaceRange(text.join(""), clipPos(pos), clipPos(pos));
+          };
+          reader.readAsText(file);
+        }
+      }
+      else {
+        try {
+          var text = e.e.dataTransfer.getData("Text");
+          if (text) replaceRange(text, pos, pos);
+        }
+        catch(e){}
+      }
+    }
+    function onKeyDown(e) {
+      if (!focused) onFocus();
+
+      var code = e.e.keyCode;
+      // Tries to detect ctrl on non-mac, cmd on mac.
+      var mod = (mac ? e.e.metaKey : e.e.ctrlKey) && !e.e.altKey, anyMod = e.e.ctrlKey || e.e.altKey || e.e.metaKey;
+      if (code == 16 || e.e.shiftKey) shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from);
+      else shiftSelecting = null;
+      // First give onKeyEvent option a chance to handle this.
+      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e.e))) return;
+
+      if (code == 33 || code == 34) {scrollPage(code == 34); return e.stop();} // page up/down
+      if (mod && (code == 36 || code == 35)) {scrollEnd(code == 36); return e.stop();} // ctrl-home/end
+      if (mod && code == 65) {selectAll(); return e.stop();} // ctrl-a
+      if (!options.readOnly) {
+        if (!anyMod && code == 13) {return;} // enter
+        if (!anyMod && code == 9 && handleTab(e.e.shiftKey)) return e.stop(); // tab
+        if (mod && code == 90) {undo(); return e.stop();} // ctrl-z
+        if (mod && ((e.e.shiftKey && code == 90) || code == 89)) {redo(); return e.stop();} // ctrl-shift-z, ctrl-y
+      }
+
+      // Key id to use in the movementKeys map. We also pass it to
+      // fastPoll in order to 'self learn'. We need this because
+      // reducedSelection, the hack where we collapse the selection to
+      // its start when it is inverted and a movement key is pressed
+      // (and later restore it again), shouldn't be used for
+      // non-movement keys.
+      curKeyId = (mod ? "c" : "") + code;
+      if (sel.inverted && movementKeys.hasOwnProperty(curKeyId)) {
+        var range = selRange(input);
+        if (range) {
+          reducedSelection = {anchor: range.start};
+          setSelRange(input, range.start, range.start);
+        }
+      }
+      fastPoll(curKeyId);
+    }
+    function onKeyUp(e) {
+      if (reducedSelection) {
+        reducedSelection = null;
+        updateInput = true;
+      }
+      if (e.e.keyCode == 16) shiftSelecting = null;
+    }
+    function onKeyPress(e) {
+      if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e.e))) return;
+      if (options.electricChars && mode.electricChars) {
+        var ch = String.fromCharCode(e.e.charCode == null ? e.e.keyCode : e.e.charCode);
+        if (mode.electricChars.indexOf(ch) > -1)
+          setTimeout(operation(function() {indentLine(sel.to.line, "smart");}), 50);
+      }
+      var code = e.e.keyCode;
+      // Re-stop tab and enter. Necessary on some browsers.
+      if (code == 13) {handleEnter(); e.stop();}
+      else if (code == 9 && options.tabMode != "default") e.stop();
+      else fastPoll(curKeyId);
+    }
+
+    function onFocus() {
+      if (!focused && options.onFocus) options.onFocus(instance);
+      focused = true;
+      slowPoll();
+      if (wrapper.className.search(/\bCodeMirror-focused\b/) == -1)
+        wrapper.className += " CodeMirror-focused";
+      restartBlink();
+    }
+    function onBlur() {
+      if (focused && options.onBlur) options.onBlur(instance);
+      clearInterval(blinker);
+      shiftSelecting = null;
+      focused = false;
+      wrapper.className = wrapper.className.replace(" CodeMirror-focused", "");
+    }
+
+    // Replace the range from from to to by the strings in newText.
+    // Afterwards, set the selection to selFrom, selTo.
+    function updateLines(from, to, newText, selFrom, selTo) {
+      if (history) {
+        var old = [];
+        for (var i = from.line, e = to.line + 1; i < e; ++i) old.push(lines[i].text);
+        history.addChange(from.line, newText.length, old);
+        while (history.done.length > options.undoDepth) history.done.shift();
+      }
+      updateLinesNoUndo(from, to, newText, selFrom, selTo);
+    }
+    function unredoHelper(from, to) {
+      var change = from.pop();
+      if (change) {
+        var replaced = [], end = change.start + change.added;
+        for (var i = change.start; i < end; ++i) replaced.push(lines[i].text);
+        to.push({start: change.start, added: change.old.length, old: replaced});
+        var pos = clipPos({line: change.start + change.old.length - 1,
+                           ch: editEnd(replaced[replaced.length-1], change.old[change.old.length-1])});
+        updateLinesNoUndo({line: change.start, ch: 0}, {line: end - 1, ch: lines[end-1].text.length}, change.old, pos, pos);
+      }
+    }
+    function undo() {unredoHelper(history.done, history.undone);}
+    function redo() {unredoHelper(history.undone, history.done);}
+
+    function updateLinesNoUndo(from, to, newText, selFrom, selTo) {
+      var nlines = to.line - from.line, firstLine = lines[from.line], lastLine = lines[to.line];
+      // First adjust the line structure, taking some care to leave highlighting intact.
+      if (firstLine == lastLine) {
+        if (newText.length == 1)
+          firstLine.replace(from.ch, to.ch, newText[0]);
+        else {
+          lastLine = firstLine.split(to.ch, newText[newText.length-1]);
+          var spliceargs = [from.line + 1, nlines];
+          firstLine.replace(from.ch, firstLine.text.length, newText[0]);
+          for (var i = 1, e = newText.length - 1; i < e; ++i) spliceargs.push(new Line(newText[i]));
+          spliceargs.push(lastLine);
+          lines.splice.apply(lines, spliceargs);
+        }
+      }
+      else if (newText.length == 1) {
+        firstLine.replace(from.ch, firstLine.text.length, newText[0] + lastLine.text.slice(to.ch));
+        lines.splice(from.line + 1, nlines);
+      }
+      else {
+        var spliceargs = [from.line + 1, nlines - 1];
+        firstLine.replace(from.ch, firstLine.text.length, newText[0]);
+        lastLine.replace(0, to.ch, newText[newText.length-1]);
+        for (var i = 1, e = newText.length - 1; i < e; ++i) spliceargs.push(new Line(newText[i]));
+        lines.splice.apply(lines, spliceargs);
+      }
+
+      // Add these lines to the work array, so that they will be
+      // highlighted. Adjust work lines if lines were added/removed.
+      var newWork = [], lendiff = newText.length - nlines - 1;
+      for (var i = 0, l = work.length; i < l; ++i) {
+        var task = work[i];
+        if (task < from.line) newWork.push(task);
+        else if (task > to.line) newWork.push(task + lendiff);
+      }
+      if (newText.length) newWork.push(from.line);
+      work = newWork;
+      startWorker(100);
+      // Remember that these lines changed, for updating the display
+      changes.push({from: from.line, to: to.line + 1, diff: lendiff});
+      textChanged = true;
+
+      // Update the selection
+      function updateLine(n) {return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff;}
+      setSelection(selFrom, selTo, updateLine(sel.from.line), updateLine(sel.to.line));
+
+      // Make sure the scroll-size div has the correct height.
+      code.style.height = (lines.length * lineHeight() + 2 * paddingTop()) + "px";
+    }
+
+    function replaceRange(code, from, to) {
+      from = clipPos(from);
+      if (!to) to = from; else to = clipPos(to);
+      code = splitLines(code);
+      function adjustPos(pos) {
+        if (posLess(pos, from)) return pos;
+        if (!posLess(to, pos)) return end;
+        var line = pos.line + code.length - (to.line - from.line) - 1;
+        var ch = pos.ch;
+        if (pos.line == to.line)
+          ch += code[code.length-1].length - (to.ch - (to.line == from.line ? from.ch : 0));
+        return {line: line, ch: ch};
+      }
+      var end;
+      replaceRange1(code, from, to, function(end1) {
+        end = end1;
+        return {from: adjustPos(sel.from), to: adjustPos(sel.to)};
+      });
+      return end;
+    }
+    function replaceSelection(code, collapse) {
+      replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
+        if (collapse == "end") return {from: end, to: end};
+        else if (collapse == "start") return {from: sel.from, to: sel.from};
+        else return {from: sel.from, to: end};
+      });
+    }
+    function replaceRange1(code, from, to, computeSel) {
+      var endch = code.length == 1 ? code[0].length + from.ch : code[code.length-1].length;
+      var newSel = computeSel({line: from.line + code.length - 1, ch: endch});
+      updateLines(from, to, code, newSel.from, newSel.to);
+    }
+
+    function getRange(from, to) {
+      var l1 = from.line, l2 = to.line;
+      if (l1 == l2) return lines[l1].text.slice(from.ch, to.ch);
+      var code = [lines[l1].text.slice(from.ch)];
+      for (var i = l1 + 1; i < l2; ++i) code.push(lines[i].text);
+      code.push(lines[l2].text.slice(0, to.ch));
+      return code.join("\n");
+    }
+    function getSelection() {
+      return getRange(sel.from, sel.to);
+    }
+
+    var pollingFast = false; // Ensures slowPoll doesn't cancel fastPoll
+    function slowPoll() {
+      if (pollingFast) return;
+      poll.set(2000, function() {
+        startOperation();
+        readInput();
+        if (focused) slowPoll();
+        endOperation();
+      });
+    }
+    function fastPoll(keyId) {
+      var missed = false;
+      pollingFast = true;
+      function p() {
+        startOperation();
+        var changed = readInput();
+        if (changed == "moved" && keyId) movementKeys[keyId] = true;
+        if (!changed && !missed) {missed = true; poll.set(80, p);}
+        else {pollingFast = false; slowPoll();}
+        endOperation();
+      }
+      poll.set(20, p);
+    }
+
+    // Inspects the textarea, compares its state (content, selection)
+    // to the data in the editing variable, and updates the editor
+    // content or cursor if something changed.
+    function readInput() {
+      var changed = false, text = input.value, sr = selRange(input);
+      if (!sr) return false;
+      var changed = editing.text != text, rs = reducedSelection;
+      var moved = changed || sr.start != editing.start || sr.end != (rs ? editing.start : editing.end);
+      if (reducedSelection && !moved && sel.from.line == 0 && sel.from.ch == 0)
+        reducedSelection = null;
+      else if (!moved) return false;
+      if (changed) {
+        shiftSelecting = reducedSelection = null;
+        if (options.readOnly) {updateInput = true; return "changed";}
+      }
+
+      // Compute selection start and end based on start/end offsets in textarea
+      function computeOffset(n, startLine) {
+        var pos = 0;
+        for (;;) {
+          var found = text.indexOf("\n", pos);
+          if (found == -1 || (text.charAt(found-1) == "\r" ? found - 1 : found) >= n)
+            return {line: startLine, ch: n - pos};
+          ++startLine;
+          pos = found + 1;
+        }
+      }
+      var from = computeOffset(sr.start, editing.from),
+          to = computeOffset(sr.end, editing.from);
+      // Here we have to take the reducedSelection hack into account,
+      // so that you can, for example, press shift-up at the start of
+      // your selection and have the right thing happen.
+      if (rs) {
+        from = sr.start == rs.anchor ? to : from;
+        to = shiftSelecting ? sel.to : sr.start == rs.anchor ? from : to;
+        if (!posLess(from, to)) {
+          reducedSelection = null;
+          sel.inverted = false;
+          var tmp = from; from = to; to = tmp;
+        }
+      }
+
+      // In some cases (cursor on same line as before), we don't have
+      // to update the textarea content at all.
+      if (from.line == to.line && from.line == sel.from.line && from.line == sel.to.line && !shiftSelecting)
+        updateInput = false;
+
+      // Magic mess to extract precise edited range from the changed
+      // string.
+      if (changed) {
+        var start = 0, end = text.length, len = Math.min(end, editing.text.length);
+        var c, line = editing.from, nl = -1;
+        while (start < len && (c = text.charAt(start)) == editing.text.charAt(start)) {
+          ++start;
+          if (c == "\n") {line++; nl = start;}
+        }
+        var ch = nl > -1 ? start - nl : start, endline = editing.to - 1, edend = editing.text.length;
+        for (;;) {
+          c = editing.text.charAt(edend);
+          if (c == "\n") endline--;
+          if (text.charAt(end) != c) {++end; ++edend; break;}
+          if (edend <= start || end <= start) break;
+          --end; --edend;
+        }
+        var nl = editing.text.lastIndexOf("\n", edend - 1), endch = nl == -1 ? edend : edend - nl - 1;
+        updateLines({line: line, ch: ch}, {line: endline, ch: endch}, splitLines(text.slice(start, end)), from, to);
+        if (line != endline || from.line != line) updateInput = true;
+      }
+      else setSelection(from, to);
+
+      editing.text = text; editing.start = sr.start; editing.end = sr.end;
+      return changed ? "changed" : moved ? "moved" : false;
+    }
+
+    // Set the textarea content and selection range to match the
+    // editor state.
+    function prepareInput() {
+      var text = [];
+      var from = Math.max(0, sel.from.line - 1), to = Math.min(lines.length, sel.to.line + 2);
+      for (var i = from; i < to; ++i) text.push(lines[i].text);
+      text = input.value = text.join(lineSep);
+      var startch = sel.from.ch, endch = sel.to.ch;
+      for (var i = from; i < sel.from.line; ++i)
+        startch += lineSep.length + lines[i].text.length;
+      for (var i = from; i < sel.to.line; ++i)
+        endch += lineSep.length + lines[i].text.length;
+      editing = {text: text, from: from, to: to, start: startch, end: endch};
+      setSelRange(input, startch, reducedSelection ? startch : endch);
+    }
+
+    function scrollCursorIntoView() {
+      var cursor = localCoords(sel.inverted ? sel.from : sel.to);
+      return scrollIntoView(cursor.x, cursor.y, cursor.x, cursor.yBot);
+    }
+    function scrollIntoView(x1, y1, x2, y2) {
+      var pl = paddingLeft(), pt = paddingTop();
+      y1 += pt; y2 += pt; x1 += pl; x2 += pl;
+      var screen = wrapper.clientHeight, screentop = wrapper.scrollTop, scrolled = false, result = true;
+      if (y1 < screentop) {wrapper.scrollTop = Math.max(0, y1 - 10); scrolled = true;}
+      else if (y2 > screentop + screen) {wrapper.scrollTop = y2 + 10 - screen; scrolled = true;}
+
+      var screenw = wrapper.clientWidth, screenleft = wrapper.scrollLeft;
+      if (x1 < screenleft) {wrapper.scrollLeft = Math.max(0, x1 - 10); scrolled = true;}
+      else if (x2 > screenw + screenleft) {
+        wrapper.scrollLeft = x2 + 10 - screenw;
+        scrolled = true;
+        if (x2 > code.clientWidth) result = false;
+      }
+      if (scrolled && options.onScroll) options.onScroll(instance);
+      return result;
+    }
+
+    function visibleLines() {
+      var lh = lineHeight(), top = wrapper.scrollTop - paddingTop();
+      return {from: Math.min(lines.length, Math.max(0, Math.floor(top / lh))),
+              to: Math.min(lines.length, Math.ceil((top + wrapper.clientHeight) / lh))};
+    }
+    // Uses a set of changes plus the current scroll position to
+    // determine which DOM updates have to be made, and makes the
+    // updates.
+    function updateDisplay(changes) {
+      if (!wrapper.clientWidth) {
+        showingFrom = showingTo = 0;
+        return;
+      }
+      // First create a range of theoretically intact lines, and punch
+      // holes in that using the change info.
+      var intact = changes === true ? [] : [{from: showingFrom, to: showingTo, domStart: 0}];
+      for (var i = 0, l = changes.length || 0; i < l; ++i) {
+        var change = changes[i], intact2 = [], diff = change.diff || 0;
+        for (var j = 0, l2 = intact.length; j < l2; ++j) {
+          var range = intact[j];
+          if (change.to <= range.from)
+            intact2.push({from: range.from + diff, to: range.to + diff, domStart: range.domStart});
+          else if (range.to <= change.from)
+            intact2.push(range);
+          else {
+            if (change.from > range.from)
+              intact2.push({from: range.from, to: change.from, domStart: range.domStart})
+            if (change.to < range.to)
+              intact2.push({from: change.to + diff, to: range.to + diff,
+                            domStart: range.domStart + (change.to - range.from)});
+          }
+        }
+        intact = intact2;
+      }
+
+      // Then, determine which lines we'd want to see, and which
+      // updates have to be made to get there.
+      var visible = visibleLines();
+      var from = Math.min(showingFrom, Math.max(visible.from - 3, 0)),
+          to = Math.min(lines.length, Math.max(showingTo, visible.to + 3)),
+          updates = [], domPos = 0, domEnd = showingTo - showingFrom, pos = from, changedLines = 0;
+
+      for (var i = 0, l = intact.length; i < l; ++i) {
+        var range = intact[i];
+        if (range.to <= from) continue;
+        if (range.from >= to) break;
+        if (range.domStart > domPos || range.from > pos) {
+          updates.push({from: pos, to: range.from, domSize: range.domStart - domPos, domStart: domPos});
+          changedLines += range.from - pos;
+        }
+        pos = range.to;
+        domPos = range.domStart + (range.to - range.from);
+      }
+      if (domPos != domEnd || pos != to) {
+        changedLines += Math.abs(to - pos);
+        updates.push({from: pos, to: to, domSize: domEnd - domPos, domStart: domPos});
+      }
+
+      if (!updates.length) return;
+      lineDiv.style.display = "none";
+      // If more than 30% of the screen needs update, just do a full
+      // redraw (which is quicker than patching)
+      if (changedLines > (visible.to - visible.from) * .3)
+        refreshDisplay(from = Math.max(visible.from - 10, 0), to = Math.min(visible.to + 7, lines.length));
+      // Otherwise, only update the stuff that needs updating.
+      else
+        patchDisplay(updates);
+      lineDiv.style.display = "";
+
+      // Position the mover div to align with the lines it's supposed
+      // to be showing (which will cover the visible display)
+      var different = from != showingFrom || to != showingTo || lastHeight != wrapper.clientHeight;
+      showingFrom = from; showingTo = to;
+      mover.style.top = (from * lineHeight()) + "px";
+      if (different) {
+        lastHeight = wrapper.clientHeight;
+        code.style.height = (lines.length * lineHeight() + 2 * paddingTop()) + "px";
+        updateGutter();
+      }
+
+      // Since this is all rather error prone, it is honoured with the
+      // only assertion in the whole file.
+      if (lineDiv.childNodes.length != showingTo - showingFrom)
+        throw new Error("BAD PATCH! " + JSON.stringify(updates) + " size=" + (showingTo - showingFrom) +
+                        " nodes=" + lineDiv.childNodes.length);
+      updateCursor();
+    }
+
+    function refreshDisplay(from, to) {
+      var html = [], start = {line: from, ch: 0}, inSel = posLess(sel.from, start) && !posLess(sel.to, start);
+      for (var i = from; i < to; ++i) {
+        var ch1 = null, ch2 = null;
+        if (inSel) {
+          ch1 = 0;
+          if (sel.to.line == i) {inSel = false; ch2 = sel.to.ch;}
+        }
+        else if (sel.from.line == i) {
+          if (sel.to.line == i) {ch1 = sel.from.ch; ch2 = sel.to.ch;}
+          else {inSel = true; ch1 = sel.from.ch;}
+        }
+        html.push(lines[i].getHTML(ch1, ch2, true));
+      }
+      lineDiv.innerHTML = html.join("");
+    }
+    function patchDisplay(updates) {
+      // Slightly different algorithm for IE (badInnerHTML), since
+      // there .innerHTML on PRE nodes is dumb, and discards
+      // whitespace.
+      var sfrom = sel.from.line, sto = sel.to.line, off = 0,
+          scratch = badInnerHTML && document.createElement("div");
+      for (var i = 0, e = updates.length; i < e; ++i) {
+        var rec = updates[i];
+        var extra = (rec.to - rec.from) - rec.domSize;
+        var nodeAfter = lineDiv.childNodes[rec.domStart + rec.domSize + off] || null;
+        if (badInnerHTML)
+          for (var j = Math.max(-extra, rec.domSize); j > 0; --j)
+            lineDiv.removeChild(nodeAfter ? nodeAfter.previousSibling : lineDiv.lastChild);
+        else if (extra) {
+          for (var j = Math.max(0, extra); j > 0; --j)
+            lineDiv.insertBefore(document.createElement("pre"), nodeAfter);
+          for (var j = Math.max(0, -extra); j > 0; --j)
+            lineDiv.removeChild(nodeAfter ? nodeAfter.previousSibling : lineDiv.lastChild);
+        }
+        var node = lineDiv.childNodes[rec.domStart + off], inSel = sfrom < rec.from && sto >= rec.from;
+        for (var j = rec.from; j < rec.to; ++j) {
+          var ch1 = null, ch2 = null;
+          if (inSel) {
+            ch1 = 0;
+            if (sto == j) {inSel = false; ch2 = sel.to.ch;}
+          }
+          else if (sfrom == j) {
+            if (sto == j) {ch1 = sel.from.ch; ch2 = sel.to.ch;}
+            else {inSel = true; ch1 = sel.from.ch;}
+          }
+          if (badInnerHTML) {
+            scratch.innerHTML = lines[j].getHTML(ch1, ch2, true);
+            lineDiv.insertBefore(scratch.firstChild, nodeAfter);
+          }
+          else {
+            node.innerHTML = lines[j].getHTML(ch1, ch2, false);
+            node.className = lines[j].className || "";
+            node = node.nextSibling;
+          }
+        }
+        off += extra;
+      }
+    }
+
+    function updateGutter() {
+      if (!options.gutter && !options.lineNumbers) return;
+      var hText = mover.offsetHeight, hEditor = wrapper.clientHeight;
+      gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + "px";
+      var html = [];
+      for (var i = showingFrom; i < showingTo; ++i) {
+        var marker = lines[i].gutterMarker;
+        var text = options.lineNumbers ? i + options.firstLineNumber : null;
+        if (marker && marker.text)
+          text = marker.text.replace("%N%", text != null ? text : "");
+        else if (text == null)
+          text = "\u00a0";
+        html.push((marker && marker.style ? '<pre class="' + marker.style + '">' : "<pre>"), text, "</pre>");
+      }
+      gutter.style.display = "none";
+      gutterText.innerHTML = html.join("");
+      var minwidth = String(lines.length).length, firstNode = gutterText.firstChild, val = eltText(firstNode), pad = "";
+      while (val.length + pad.length < minwidth) pad += "\u00a0";
+      if (pad) firstNode.insertBefore(document.createTextNode(pad), firstNode.firstChild);
+      gutter.style.display = "";
+      lineSpace.style.marginLeft = gutter.offsetWidth + "px";
+    }
+    function updateCursor() {
+      var head = sel.inverted ? sel.from : sel.to;
+      var x = charX(head.line, head.ch) + "px", y = (head.line - showingFrom) * lineHeight() + "px";
+      inputDiv.style.top = y; inputDiv.style.left = x;
+      if (posEq(sel.from, sel.to)) {
+        cursor.style.top = y; cursor.style.left = x;
+        cursor.style.display = "";
+      }
+      else cursor.style.display = "none";
+    }
+
+    // Update the selection. Last two args are only used by
+    // updateLines, since they have to be expressed in the line
+    // numbers before the update.
+    function setSelection(from, to, oldFrom, oldTo) {
+      if (posEq(sel.from, from) && posEq(sel.to, to)) return;
+      var sh = shiftSelecting && clipPos(shiftSelecting);
+      if (posLess(to, from)) {var tmp = to; to = from; from = tmp;}
+      if (sh) {
+        if (posLess(sh, from)) from = sh;
+        else if (posLess(to, sh)) to = sh;
+      }
+
+      var startEq = posEq(sel.to, to), endEq = posEq(sel.from, from);
+      if (posEq(from, to)) sel.inverted = false;
+      else if (startEq && !endEq) sel.inverted = true;
+      else if (endEq && !startEq) sel.inverted = false;
+
+      // Some ugly logic used to only mark the lines that actually did
+      // see a change in selection as changed, rather than the whole
+      // selected range.
+      if (oldFrom == null) {oldFrom = sel.from.line; oldTo = sel.to.line;}
+      if (posEq(from, to)) {
+        if (!posEq(sel.from, sel.to))
+          changes.push({from: oldFrom, to: oldTo + 1});
+      }
+      else if (posEq(sel.from, sel.to)) {
+        changes.push({from: from.line, to: to.line + 1});
+      }
+      else {
+        if (!posEq(from, sel.from)) {
+          if (from.line < oldFrom)
+            changes.push({from: from.line, to: Math.min(to.line, oldFrom) + 1});
+          else
+            changes.push({from: oldFrom, to: Math.min(oldTo, from.line) + 1});
+        }
+        if (!posEq(to, sel.to)) {
+          if (to.line < oldTo)
+            changes.push({from: Math.max(oldFrom, from.line), to: oldTo + 1});
+          else
+            changes.push({from: Math.max(from.line, oldTo), to: to.line + 1});
+        }
+      }
+      sel.from = from; sel.to = to;
+      selectionChanged = true;
+    }
+    function setCursor(line, ch) {
+      var pos = clipPos({line: line, ch: ch || 0});
+      setSelection(pos, pos);
+    }
+
+    function clipLine(n) {return Math.max(0, Math.min(n, lines.length-1));}
+    function clipPos(pos) {
+      if (pos.line < 0) return {line: 0, ch: 0};
+      if (pos.line >= lines.length) return {line: lines.length-1, ch: lines[lines.length-1].text.length};
+      var ch = pos.ch, linelen = lines[pos.line].text.length;
+      if (ch == null || ch > linelen) return {line: pos.line, ch: linelen};
+      else if (ch < 0) return {line: pos.line, ch: 0};
+      else return pos;
+    }
+
+    function scrollPage(down) {
+      var linesPerPage = Math.floor(wrapper.clientHeight / lineHeight()), head = sel.inverted ? sel.from : sel.to;
+      setCursor(head.line + (Math.max(linesPerPage - 1, 1) * (down ? 1 : -1)), head.ch);
+    }
+    function scrollEnd(top) {
+      setCursor(top ? 0 : lines.length - 1);
+    }
+    function selectAll() {
+      var endLine = lines.length - 1;
+      setSelection({line: 0, ch: 0}, {line: endLine, ch: lines[endLine].text.length});
+    }
+    function selectWordAt(pos) {
+      var line = lines[pos.line].text;
+      var start = pos.ch, end = pos.ch;
+      while (start > 0 && /\w/.test(line.charAt(start - 1))) --start;
+      while (end < line.length - 1 && /\w/.test(line.charAt(end))) ++end;
+      setSelection({line: pos.line, ch: start}, {line: pos.line, ch: end});
+    }
+    function handleEnter() {
+      replaceSelection("\n", "end");
+      if (options.enterMode != "flat")
+        indentLine(sel.from.line, options.enterMode == "keep" ? "prev" : "smart");
+    }
+    function handleTab(shift) {
+      shiftSelecting = null;
+      switch (options.tabMode) {
+      case "default":
+        return false;
+      case "indent":
+        for (var i = sel.from.line, e = sel.to.line; i <= e; ++i) indentLine(i, "smart");
+        break;
+      case "classic":
+        if (posEq(sel.from, sel.to)) {
+          if (shift) indentLine(sel.from.line, "smart");
+          else replaceSelection("\t", "end");
+          break;
+        }
+      case "shift":
+        for (var i = sel.from.line, e = sel.to.line; i <= e; ++i) indentLine(i, shift ? "subtract" : "add");
+        break;
+      }
+      return true;
+    }
+
+    function indentLine(n, how) {
+      if (how == "smart") {
+        if (!mode.indent) how = "prev";
+        else var state = getStateBefore(n);
+      }
+
+      var line = lines[n], curSpace = line.indentation(), curSpaceString = line.text.match(/^\s*/)[0], indentation;
+      if (how == "prev") {
+        if (n) indentation = lines[n-1].indentation();
+        else indentation = 0;
+      }
+      else if (how == "smart") indentation = mode.indent(state, line.text.slice(curSpaceString.length));
+      else if (how == "add") indentation = curSpace + options.indentUnit;
+      else if (how == "subtract") indentation = curSpace - options.indentUnit;
+      indentation = Math.max(0, indentation);
+      var diff = indentation - curSpace;
+
+      if (!diff) {
+        if (sel.from.line != n && sel.to.line != n) return;
+        var indentString = curSpaceString;
+      }
+      else {
+        var indentString = "", pos = 0;
+        if (options.indentWithTabs)
+          for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";}
+        while (pos < indentation) {++pos; indentString += " ";}
+      }
+
+      replaceRange(indentString, {line: n, ch: 0}, {line: n, ch: curSpaceString.length});
+    }
+
+    function loadMode() {
+      mode = CodeMirror.getMode(options, options.mode);
+      for (var i = 0, l = lines.length; i < l; ++i)
+        lines[i].stateAfter = null;
+      work = [0];
+    }
+    function gutterChanged() {
+      var visible = options.gutter || options.lineNumbers;
+      gutter.style.display = visible ? "" : "none";
+      if (visible) updateGutter();
+      else lineDiv.parentNode.style.marginLeft = 0;
+    }
+
+    function markText(from, to, className) {
+      from = clipPos(from); to = clipPos(to);
+      var accum = [];
+      function add(line, from, to, className) {
+        var line = lines[line], mark = line.addMark(from, to, className);
+        mark.line = line;
+        accum.push(mark);
+      }
+      if (from.line == to.line) add(from.line, from.ch, to.ch, className);
+      else {
+        add(from.line, from.ch, null, className);
+        for (var i = from.line + 1, e = to.line; i < e; ++i)
+          add(i, 0, null, className);
+        add(to.line, 0, to.ch, className);
+      }
+      changes.push({from: from.line, to: to.line + 1});
+      return function() {
+        var start, end;
+        for (var i = 0; i < accum.length; ++i) {
+          var mark = accum[i], found = indexOf(lines, mark.line);
+          mark.line.removeMark(mark);
+          if (found > -1) {
+            if (start == null) start = found;
+            end = found;
+          }
+        }
+        if (start != null) changes.push({from: start, to: end + 1});
+      };
+    }
+
+    function addGutterMarker(line, text, className) {
+      if (typeof line == "number") line = lines[clipLine(line)];
+      line.gutterMarker = {text: text, style: className};
+      updateGutter();
+      return line;
+    }
+    function removeGutterMarker(line) {
+      if (typeof line == "number") line = lines[clipLine(line)];
+      line.gutterMarker = null;
+      updateGutter();
+    }
+    function setLineClass(line, className) {
+      if (typeof line == "number") {
+        var no = line;
+        line = lines[clipLine(line)];
+      }
+      else {
+        var no = indexOf(lines, line);
+        if (no == -1) return null;
+      }
+      line.className = className;
+      changes.push({from: no, to: no + 1});
+      return line;
+    }
+
+    function lineInfo(line) {
+      if (typeof line == "number") {
+        var n = line;
+        line = lines[line];
+        if (!line) return null;
+      }
+      else {
+        var n = indexOf(lines, line);
+        if (n == -1) return null;
+      }
+      var marker = line.gutterMarker;
+      return {line: n, text: line.text, markerText: marker && marker.text, markerClass: marker && marker.style};
+    }
+
+    // These are used to go from pixel positions to character
+    // positions, taking tabs into account.
+    function charX(line, pos) {
+      var text = lines[line].text, span = measure.firstChild;
+      if (text.lastIndexOf("\t", pos) == -1) return pos * charWidth();
+      var old = span.firstChild.nodeValue;
+      try {
+        span.firstChild.nodeValue = text.slice(0, pos);
+        return span.offsetWidth;
+      } finally {span.firstChild.nodeValue = old;}
+    }
+    function charFromX(line, x) {
+      var text = lines[line].text, cw = charWidth();
+      if (x <= 0) return 0;
+      if (text.indexOf("\t") == -1) return Math.min(text.length, Math.round(x / cw));
+      var mspan = measure.firstChild, mtext = mspan.firstChild, old = mtext.nodeValue;
+      try {
+        mtext.nodeValue = text;
+        var from = 0, fromX = 0, to = text.length, toX = mspan.offsetWidth;
+        if (x > toX) return to;
+        for (;;) {
+          if (to - from <= 1) return (toX - x > x - fromX) ? from : to;
+          var middle = Math.ceil((from + to) / 2);
+          mtext.nodeValue = text.slice(0, middle);
+          var curX = mspan.offsetWidth;
+          if (curX > x) {to = middle; toX = curX;}
+          else {from = middle; fromX = curX;}
+        }
+      } finally {mtext.nodeValue = old;}
+    }
+
+    function localCoords(pos, inLineWrap) {
+      var lh = lineHeight(), line = pos.line - (inLineWrap ? showingFrom : 0);
+      return {x: charX(pos.line, pos.ch), y: line * lh, yBot: (line + 1) * lh};
+    }
+    function pageCoords(pos) {
+      var local = localCoords(pos, true), off = eltOffset(lineSpace);
+      return {x: off.left + local.x, y: off.top + local.y, yBot: off.top + local.yBot};
+    }
+
+    function lineHeight() {
+      var nlines = lineDiv.childNodes.length;
+      if (nlines) return lineDiv.offsetHeight / nlines;
+      else return measure.firstChild.offsetHeight || 1;
+    }
+    function charWidth() {return (measure.firstChild.offsetWidth || 320) / 40;}
+    function paddingTop() {return lineSpace.offsetTop;}
+    function paddingLeft() {return lineSpace.offsetLeft;}
+
+    function posFromMouse(e, liberal) {
+      var off = eltOffset(lineSpace),
+          x = e.pageX() - off.left,
+          y = e.pageY() - off.top;
+      if (!liberal && e.target() != lineSpace.parentNode && !(e.target() == wrapper && y > (lines.length * lineHeight())))
+        for (var n = e.target(); n != lineDiv && n != cursor; n = n.parentNode)
+          if (!n || n == wrapper) return null;
+      var line = showingFrom + Math.floor(y / lineHeight());
+      return clipPos({line: line, ch: charFromX(clipLine(line), x)});
+    }
+    function onContextMenu(e) {
+      var pos = posFromMouse(e);
+      if (!pos || window.opera) return; // Opera is difficult.
+      if (posEq(sel.from, sel.to) || posLess(pos, sel.from) || !posLess(pos, sel.to))
+        setCursor(pos.line, pos.ch);
+
+      var oldCSS = input.style.cssText;
+      input.style.cssText = "position: fixed; width: 30px; height: 30px; top: " + (e.pageY() - 1) +
+        "px; left: " + (e.pageX() - 1) + "px; z-index: 1000; background: white; " +
+        "border-width: 0; outline: none; overflow: hidden;";
+      var val = input.value = getSelection();
+      input.focus();
+      setSelRange(input, 0, val.length);
+      if (gecko) e.stop();
+      leaveInputAlone = true;
+      setTimeout(function() {
+        if (input.value != val) operation(replaceSelection)(input.value, "end");
+        input.style.cssText = oldCSS;
+        leaveInputAlone = false;
+        prepareInput();
+        slowPoll();
+      }, 50);
+    }
+
+    // Cursor-blinking
+    function restartBlink() {
+      clearInterval(blinker);
+      var on = true;
+      cursor.style.visibility = "";
+      blinker = setInterval(function() {
+        cursor.style.visibility = (on = !on) ? "" : "hidden";
+      }, 650);
+    }
+
+    var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"};
+    function matchBrackets(autoclear) {
+      var head = sel.inverted ? sel.from : sel.to, line = lines[head.line], pos = head.ch - 1;
+      var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)];
+      if (!match) return;
+      var ch = match.charAt(0), forward = match.charAt(1) == ">", d = forward ? 1 : -1, st = line.styles;
+      for (var off = pos + 1, i = 0, e = st.length; i < e; i+=2)
+        if ((off -= st[i].length) <= 0) {var style = st[i+1]; break;}
+
+      var stack = [line.text.charAt(pos)], re = /[(){}[\]]/;
+      function scan(line, from, to) {
+        if (!line.text) return;
+        var st = line.styles, pos = forward ? 0 : line.text.length - 1, cur;
+        for (var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2; i != e; i += 2*d) {
+          var text = st[i];
+          if (st[i+1] != null && st[i+1] != style) {pos += d * text.length; continue;}
+          for (var j = forward ? 0 : text.length - 1, te = forward ? text.length : -1; j != te; j += d, pos+=d) {
+            if (pos >= from && pos < to && re.test(cur = text.charAt(j))) {
+              var match = matching[cur];
+              if (match.charAt(1) == ">" == forward) stack.push(cur);
+              else if (stack.pop() != match.charAt(0)) return {pos: pos, match: false};
+              else if (!stack.length) return {pos: pos, match: true};
+            }
+          }
+        }
+      }
+      for (var i = head.line, e = forward ? Math.min(i + 50, lines.length) : Math.max(0, i - 50); i != e; i+=d) {
+        var line = lines[i], first = i == head.line;
+        var found = scan(line, first && forward ? pos + 1 : 0, first && !forward ? pos : line.text.length);
+        if (found) {
+          var style = found.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket";
+          var one = markText({line: head.line, ch: pos}, {line: head.line, ch: pos+1}, style),
+              two = markText({line: i, ch: found.pos}, {line: i, ch: found.pos + 1}, style);
+          var clear = operation(function(){one(); two();});
+          if (autoclear) setTimeout(clear, 800);
+          else bracketHighlighted = clear;
+          break;
+        }
+      }
+    }
+
+    // Finds the line to start with when starting a parse. Tries to
+    // find a line with a stateAfter, so that it can start with a
+    // valid state. If that fails, it returns the line with the
+    // smallest indentation, which tends to need the least context to
+    // parse correctly.
+    function findStartLine(n) {
+      var minindent, minline;
+      for (var search = n, lim = n - 40; search > lim; --search) {
+        if (search == 0) return 0;
+        var line = lines[search-1];
+        if (line.stateAfter) return search;
+        var indented = line.indentation();
+        if (minline == null || minindent > indented) {
+          minline = search;
+          minindent = indented;
+        }
+      }
+      return minline;
+    }
+    function getStateBefore(n) {
+      var start = findStartLine(n), state = start && lines[start-1].stateAfter;
+      if (!state) state = startState(mode);
+      else state = copyState(mode, state);
+      for (var i = start; i < n; ++i) {
+        var line = lines[i];
+        line.highlight(mode, state);
+        line.stateAfter = copyState(mode, state);
+      }
+      if (!lines[n].stateAfter) work.push(n);
+      return state;
+    }
+    function highlightWorker() {
+      var end = +new Date + options.workTime;
+      while (work.length) {
+        if (!lines[showingFrom].stateAfter) var task = showingFrom;
+        else var task = work.pop();
+        if (task >= lines.length) continue;
+        var start = findStartLine(task), state = start && lines[start-1].stateAfter;
+        if (state) state = copyState(mode, state);
+        else state = startState(mode);
+
+        for (var i = start, l = lines.length; i < l; ++i) {
+          var line = lines[i], hadState = line.stateAfter;
+          if (+new Date > end) {
+            work.push(i);
+            startWorker(options.workDelay);
+            changes.push({from: task, to: i});
+            return;
+          }
+          var changed = line.highlight(mode, state);
+          line.stateAfter = copyState(mode, state);
+          if (hadState && !changed && line.text) break;
+        }
+        changes.push({from: task, to: i});
+      }
+    }
+    function startWorker(time) {
+      if (!work.length) return;
+      highlight.set(time, operation(highlightWorker));
+    }
+
+    // Operations are used to wrap changes in such a way that each
+    // change won't have to update the cursor and display (which would
+    // be awkward, slow, and error-prone), but instead updates are
+    // batched and then all combined and executed at once.
+    function startOperation() {
+      updateInput = null; changes = []; textChanged = selectionChanged = false;
+    }
+    function endOperation() {
+      var reScroll = false;
+      if (selectionChanged) reScroll = !scrollCursorIntoView();
+      if (changes.length) updateDisplay(changes);
+      else if (selectionChanged) updateCursor();
+      if (reScroll) scrollCursorIntoView();
+      if (selectionChanged) restartBlink();
+
+      // updateInput can be set to a boolean value to force/prevent an
+      // update.
+      if (!leaveInputAlone && (updateInput === true || (updateInput !== false && selectionChanged)))
+        prepareInput();
+
+      if (selectionChanged && options.onCursorActivity)
+        options.onCursorActivity(instance);
+      if (textChanged && options.onChange)
+        options.onChange(instance);
+      if (selectionChanged && options.matchBrackets)
+        setTimeout(operation(function() {
+          if (bracketHighlighted) {bracketHighlighted(); bracketHighlighted = null;}
+          matchBrackets(false);
+        }), 20);
+    }
+    var nestedOperation = 0;
+    function operation(f) {
+      return function() {
+        if (!nestedOperation++) startOperation();
+        try {var result = f.apply(this, arguments);}
+        finally {if (!--nestedOperation) endOperation();}
+        return result;
+      };
+    }
+
+    function SearchCursor(query, pos, caseFold) {
+      this.atOccurrence = false;
+      if (caseFold == null) caseFold = typeof query == "string" && query == query.toLowerCase();
+
+      if (pos && typeof pos == "object") pos = clipPos(pos);
+      else pos = {line: 0, ch: 0};
+      this.pos = {from: pos, to: pos};
+
+      // The matches method is filled in based on the type of query.
+      // It takes a position and a direction, and returns an object
+      // describing the next occurrence of the query, or null if no
+      // more matches were found.
+      if (typeof query != "string") // Regexp match
+        this.matches = function(reverse, pos) {
+          if (reverse) {
+            var line = lines[pos.line].text.slice(0, pos.ch), match = line.match(query), start = 0;
+            while (match) {
+              var ind = line.indexOf(match[0]);
+              start += ind;
+              line = line.slice(ind + 1);
+              var newmatch = line.match(query);
+              if (newmatch) match = newmatch;
+              else break;
+            }
+          }
+          else {
+            var line = lines[pos.line].text.slice(pos.ch), match = line.match(query),
+                start = match && pos.ch + line.indexOf(match[0]);
+          }
+          if (match)
+            return {from: {line: pos.line, ch: start},
+                    to: {line: pos.line, ch: start + match[0].length},
+                    match: match};
+        };
+      else { // String query
+        if (caseFold) query = query.toLowerCase();
+        var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;};
+        var target = query.split("\n");
+        // Different methods for single-line and multi-line queries
+        if (target.length == 1)
+          this.matches = function(reverse, pos) {
+            var line = fold(lines[pos.line].text), len = query.length, match;
+            if (reverse ? (pos.ch >= len && (match = line.lastIndexOf(query, pos.ch - len)) != -1)
+                        : (match = line.indexOf(query, pos.ch)) != -1)
+              return {from: {line: pos.line, ch: match},
+                      to: {line: pos.line, ch: match + len}};
+          };
+        else
+          this.matches = function(reverse, pos) {
+            var ln = pos.line, idx = (reverse ? target.length - 1 : 0), match = target[idx], line = fold(lines[ln].text);
+            var offsetA = (reverse ? line.indexOf(match) + match.length : line.lastIndexOf(match));
+            if (reverse ? offsetA >= pos.ch || offsetA != match.length
+                        : offsetA <= pos.ch || offsetA != line.length - match.length)
+              return;
+            for (;;) {
+              if (reverse ? !ln : ln == lines.length - 1) return;
+              line = fold(lines[ln += reverse ? -1 : 1].text);
+              match = target[reverse ? --idx : ++idx];
+              if (idx > 0 && idx < target.length - 1) {
+                if (line != match) return;
+                else continue;
+              }
+              var offsetB = (reverse ? line.lastIndexOf(match) : line.indexOf(match) + match.length);
+              if (reverse ? offsetB != line.length - match.length : offsetB != match.length)
+                return;
+              var start = {line: pos.line, ch: offsetA}, end = {line: ln, ch: offsetB};
+              return {from: reverse ? end : start, to: reverse ? start : end};
+            }
+          };
+      }
+    }
+
+    SearchCursor.prototype = {
+      findNext: function() {return this.find(false);},
+      findPrevious: function() {return this.find(true);},
+
+      find: function(reverse) {
+        var self = this, pos = clipPos(reverse ? this.pos.from : this.pos.to);
+        function savePosAndFail(line) {
+          var pos = {line: line, ch: 0};
+          self.pos = {from: pos, to: pos};
+          self.atOccurrence = false;
+          return false;
+        }
+
+        for (;;) {
+          if (this.pos = this.matches(reverse, pos)) {
+            this.atOccurrence = true;
+            return this.pos.match || true;
+          }
+          if (reverse) {
+            if (!pos.line) return savePosAndFail(0);
+            pos = {line: pos.line-1, ch: lines[pos.line-1].text.length};
+          }
+          else {
+            if (pos.line == lines.length - 1) return savePosAndFail(lines.length);
+            pos = {line: pos.line+1, ch: 0};
+          }
+        }
+      },
+
+      from: function() {if (this.atOccurrence) return copyPos(this.pos.from);},
+      to: function() {if (this.atOccurrence) return copyPos(this.pos.to);}
+    };
+
+    return instance;
+  } // (end of function CodeMirror)
+
+  // The default configuration options.
+  CodeMirror.defaults = {
+    value: "",
+    mode: null,
+    indentUnit: 2,
+    indentWithTabs: false,
+    tabMode: "classic",
+    enterMode: "indent",
+    electricChars: true,
+    onKeyEvent: null,
+    lineNumbers: false,
+    gutter: false,
+    firstLineNumber: 1,
+    readOnly: false,
+    onChange: null,
+    onCursorActivity: null,
+    onGutterClick: null,
+    onFocus: null, onBlur: null, onScroll: null,
+    matchBrackets: false,
+    workTime: 100,
+    workDelay: 200,
+    undoDepth: 40,
+    tabindex: null
+  };
+
+  // Known modes, by name and by MIME
+  var modes = {}, mimeModes = {};
+  CodeMirror.defineMode = function(name, mode) {
+    if (!CodeMirror.defaults.mode && name != "null") CodeMirror.defaults.mode = name;
+    modes[name] = mode;
+  };
+  CodeMirror.defineMIME = function(mime, spec) {
+    mimeModes[mime] = spec;
+  };
+  CodeMirror.getMode = function(options, spec) {
+    if (typeof spec == "string" && mimeModes.hasOwnProperty(spec))
+      spec = mimeModes[spec];
+    if (typeof spec == "string")
+      var mname = spec, config = {};
+    else
+      var mname = spec.name, config = spec;
+    var mfactory = modes[mname];
+    if (!mfactory) {
+      if (window.console) console.warn("No mode " + mname + " found, falling back to plain text.");
+      return CodeMirror.getMode(options, "text/plain");
+    }
+    return mfactory(options, config);
+  }
+  CodeMirror.listModes = function() {
+    var list = [];
+    for (var m in modes)
+      if (modes.propertyIsEnumerable(m)) list.push(m);
+    return list;
+  };
+  CodeMirror.listMIMEs = function() {
+    var list = [];
+    for (var m in mimeModes)
+      if (mimeModes.propertyIsEnumerable(m)) list.push(m);
+    return list;
+  };
+
+  CodeMirror.fromTextArea = function(textarea, options) {
+    if (!options) options = {};
+    options.value = textarea.value;
+    if (!options.tabindex && textarea.tabindex)
+      options.tabindex = textarea.tabindex;
+
+    function save() {textarea.value = instance.getValue();}
+    if (textarea.form) {
+      // Deplorable hack to make the submit method do the right thing.
+      var rmSubmit = connect(textarea.form, "submit", save, true);
+      if (typeof textarea.form.submit == "function") {
+        var realSubmit = textarea.form.submit;
+        function wrappedSubmit() {
+          save();
+          textarea.form.submit = realSubmit;
+          textarea.form.submit();
+          textarea.form.submit = wrappedSubmit;
+        }
+        textarea.form.submit = wrappedSubmit;
+      }
+    }
+
+    textarea.style.display = "none";
+    var instance = CodeMirror(function(node) {
+      textarea.parentNode.insertBefore(node, textarea.nextSibling);
+    }, options);
+    instance.save = save;
+    instance.toTextArea = function() {
+      save();
+      textarea.parentNode.removeChild(instance.getWrapperElement());
+      textarea.style.display = "";
+      if (textarea.form) {
+        rmSubmit();
+        if (typeof textarea.form.submit == "function")
+          textarea.form.submit = realSubmit;
+      }
+    };
+    return instance;
+  };
+
+  // Utility functions for working with state. Exported because modes
+  // sometimes need to do this.
+  function copyState(mode, state) {
+    if (state === true) return state;
+    if (mode.copyState) return mode.copyState(state);
+    var nstate = {};
+    for (var n in state) {
+      var val = state[n];
+      if (val instanceof Array) val = val.concat([]);
+      nstate[n] = val;
+    }
+    return nstate;
+  }
+  CodeMirror.startState = startState;
+  function startState(mode, a1, a2) {
+    return mode.startState ? mode.startState(a1, a2) : true;
+  }
+  CodeMirror.copyState = copyState;
+
+  // The character stream used by a mode's parser.
+  function StringStream(string) {
+    this.pos = this.start = 0;
+    this.string = string;
+  }
+  StringStream.prototype = {
+    eol: function() {return this.pos >= this.string.length;},
+    sol: function() {return this.pos == 0;},
+    peek: function() {return this.string.charAt(this.pos);},
+    next: function() {
+      if (this.pos < this.string.length)
+        return this.string.charAt(this.pos++);
+    },
+    eat: function(match) {
+      var ch = this.string.charAt(this.pos);
+      if (typeof match == "string") var ok = ch == match;
+      else var ok = ch && (match.test ? match.test(ch) : match(ch));
+      if (ok) {++this.pos; return ch;}
+    },
+    eatWhile: function(match) {
+      var start = this.start;
+      while (this.eat(match)){}
+      return this.pos > start;
+    },
+    eatSpace: function() {
+      var start = this.pos;
+      while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;
+      return this.pos > start;
+    },
+    skipToEnd: function() {this.pos = this.string.length;},
+    skipTo: function(ch) {
+      var found = this.string.indexOf(ch, this.pos);
+      if (found > -1) {this.pos = found; return true;}
+    },
+    backUp: function(n) {this.pos -= n;},
+    column: function() {return countColumn(this.string, this.start);},
+    indentation: function() {return countColumn(this.string);},
+    match: function(pattern, consume, caseInsensitive) {
+      if (typeof pattern == "string") {
+        function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+        if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+          if (consume !== false) this.pos += pattern.length;
+          return true;
+        }
+      }
+      else {
+        var match = this.string.slice(this.pos).match(pattern);
+        if (match && consume !== false) this.pos += match[0].length;
+        return match;
+      }
+    },
+    current: function(){return this.string.slice(this.start, this.pos);}
+  };
+
+  // Line objects. These hold state related to a line, including
+  // highlighting info (the styles array).
+  function Line(text, styles) {
+    this.styles = styles || [text, null];
+    this.stateAfter = null;
+    this.text = text;
+    this.marked = this.gutterMarker = this.className = null;
+  }
+  Line.prototype = {
+    // Replace a piece of a line, keeping the styles around it intact.
+    replace: function(from, to, text) {
+      var st = [], mk = this.marked;
+      copyStyles(0, from, this.styles, st);
+      if (text) st.push(text, null);
+      copyStyles(to, this.text.length, this.styles, st);
+      this.styles = st;
+      this.text = this.text.slice(0, from) + text + this.text.slice(to);
+      this.stateAfter = null;
+      if (mk) {
+        var diff = text.length - (to - from), end = this.text.length;
+        function fix(n) {return n <= Math.min(to, to + diff) ? n : n + diff;}
+        for (var i = 0; i < mk.length; ++i) {
+          var mark = mk[i], del = false;
+          if (mark.from >= end) del = true;
+          else {mark.from = fix(mark.from); if (mark.to != null) mark.to = fix(mark.to);}
+          if (del || mark.from >= mark.to) {mk.splice(i, 1); i--;}
+        }
+      }
+    },
+    // Split a line in two, again keeping styles intact.
+    split: function(pos, textBefore) {
+      var st = [textBefore, null];
+      copyStyles(pos, this.text.length, this.styles, st);
+      return new Line(textBefore + this.text.slice(pos), st);
+    },
+    addMark: function(from, to, style) {
+      var mk = this.marked, mark = {from: from, to: to, style: style};
+      if (this.marked == null) this.marked = [];
+      this.marked.push(mark);
+      this.marked.sort(function(a, b){return a.from - b.from;});
+      return mark;
+    },
+    removeMark: function(mark) {
+      var mk = this.marked;
+      if (!mk) return;
+      for (var i = 0; i < mk.length; ++i)
+        if (mk[i] == mark) {mk.splice(i, 1); break;}
+    },
+    // Run the given mode's parser over a line, update the styles
+    // array, which contains alternating fragments of text and CSS
+    // classes.
+    highlight: function(mode, state) {
+      var stream = new StringStream(this.text), st = this.styles, pos = 0, changed = false;
+      while (!stream.eol()) {
+        var style = mode.token(stream, state);
+        var substr = this.text.slice(stream.start, stream.pos);
+        stream.start = stream.pos;
+        if (pos && st[pos-1] == style)
+          st[pos-2] += substr;
+        else if (substr) {
+          if (!changed && st[pos] != substr || st[pos+1] != style) changed = true;
+          st[pos++] = substr; st[pos++] = style;
+        }
+        // Give up when line is ridiculously long
+        if (stream.pos > 5000) {
+          st[pos++] = this.text.slice(stream.pos); st[pos++] = null;
+          break;
+        }
+      }
+      if (st.length != pos) {st.length = pos; changed = true;}
+      return changed;
+    },
+    // Fetch the parser token for a given character. Useful for hacks
+    // that want to inspect the mode state (say, for completion).
+    getTokenAt: function(mode, state, ch) {
+      var txt = this.text, stream = new StringStream(txt);
+      while (stream.pos < ch && !stream.eol()) {
+        stream.start = stream.pos;
+        var style = mode.token(stream, state);
+      }
+      return {start: stream.start,
+              end: stream.pos,
+              string: stream.current(),
+              className: style || null,
+              state: state};
+    },
+    indentation: function() {return countColumn(this.text);},
+    // Produces an HTML fragment for the line, taking selection,
+    // marking, and highlighting into account.
+    getHTML: function(sfrom, sto, includePre) {
+      var html = [];
+      if (includePre)
+        html.push(this.className ? '<pre class="' + this.className + '">': "<pre>");
+      function span(text, style) {
+        if (!text) return;
+        if (style) html.push('<span class="', style, '">', htmlEscape(text), "</span>");
+        else html.push(htmlEscape(text));
+      }
+      var st = this.styles, allText = this.text, marked = this.marked;
+      if (sfrom == sto) sfrom = null;
+
+      if (!allText)
+        span(" ", sfrom != null && sto == null ? "CodeMirror-selected" : null);
+      else if (!marked && sfrom == null)
+        for (var i = 0, e = st.length; i < e; i+=2) span(st[i], st[i+1]);
+      else {
+        var pos = 0, i = 0, text = "", style, sg = 0;
+        var markpos = -1, mark = null;
+        function nextMark() {
+          if (marked) {
+            markpos += 1;
+            mark = (markpos < marked.length) ? marked[markpos] : null;
+          }
+        }
+        nextMark();        
+        while (pos < allText.length) {
+          var upto = allText.length;
+          var extraStyle = "";
+          if (sfrom != null) {
+            if (sfrom > pos) upto = sfrom;
+            else if (sto == null || sto > pos) {
+              extraStyle = " CodeMirror-selected";
+              if (sto != null) upto = Math.min(upto, sto);
+            }
+          }
+          while (mark && mark.to != null && mark.to <= pos) nextMark();
+          if (mark) {
+            if (mark.from > pos) upto = Math.min(upto, mark.from);
+            else {
+              extraStyle += " " + mark.style;
+              if (mark.to != null) upto = Math.min(upto, mark.to);
+            }
+          }
+          for (;;) {
+            var end = pos + text.length;
+            var apliedStyle = style;
+            if (extraStyle) apliedStyle = style ? style + extraStyle : extraStyle;
+            span(end > upto ? text.slice(0, upto - pos) : text, apliedStyle);
+            if (end >= upto) {text = text.slice(upto - pos); pos = upto; break;}
+            pos = end;
+            text = st[i++]; style = st[i++];
+          }
+        }
+        if (sfrom != null && sto == null) span(" ", "CodeMirror-selected");
+      }
+      if (includePre) html.push("</pre>");
+      return html.join("");
+    }
+  };
+  // Utility used by replace and split above
+  function copyStyles(from, to, source, dest) {
+    for (var i = 0, pos = 0, state = 0; pos < to; i+=2) {
+      var part = source[i], end = pos + part.length;
+      if (state == 0) {
+        if (end > from) dest.push(part.slice(from - pos, Math.min(part.length, to - pos)), source[i+1]);
+        if (end >= from) state = 1;
+      }
+      else if (state == 1) {
+        if (end > to) dest.push(part.slice(0, to - pos), source[i+1]);
+        else dest.push(part, source[i+1]);
+      }
+      pos = end;
+    }
+  }
+
+  // The history object 'chunks' changes that are made close together
+  // and at almost the same time into bigger undoable units.
+  function History() {
+    this.time = 0;
+    this.done = []; this.undone = [];
+  }
+  History.prototype = {
+    addChange: function(start, added, old) {
+      this.undone.length = 0;
+      var time = +new Date, last = this.done[this.done.length - 1];
+      if (time - this.time > 400 || !last ||
+          last.start > start + added || last.start + last.added < start - last.added + last.old.length)
+        this.done.push({start: start, added: added, old: old});
+      else {
+        var oldoff = 0;
+        if (start < last.start) {
+          for (var i = last.start - start - 1; i >= 0; --i)
+            last.old.unshift(old[i]);
+          last.added += last.start - start;
+          last.start = start;
+        }
+        else if (last.start < start) {
+          oldoff = start - last.start;
+          added += oldoff;
+        }
+        for (var i = last.added - oldoff, e = old.length; i < e; ++i)
+          last.old.push(old[i]);
+        if (last.added < added) last.added = added;
+      }
+      this.time = time;
+    }
+  };
+
+  // Event stopping compatibility wrapper.
+  function stopEvent() {
+    if (this.preventDefault) {this.preventDefault(); this.stopPropagation();}
+    else {this.returnValue = false; this.cancelBubble = true;}
+  }
+  // Ensure an event has a stop method.
+  function addStop(event) {
+    if (!event.stop) event.stop = stopEvent;
+    return event;
+  }
+
+  // Event wrapper, exposing the few operations we need.
+  function Event(orig) {this.e = orig;}
+  Event.prototype = {
+    stop: function() {stopEvent.call(this.e);},
+    target: function() {return this.e.target || this.e.srcElement;},
+    button: function() {
+      if (this.e.which) return this.e.which;
+      else if (this.e.button & 1) return 1;
+      else if (this.e.button & 2) return 3;
+      else if (this.e.button & 4) return 2;
+    },
+    pageX: function() {
+      if (this.e.pageX != null) return this.e.pageX;
+      else return this.e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+    },
+    pageY: function() {
+      if (this.e.pageY != null) return this.e.pageY;
+      else return this.e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
+    }
+  };
+
+  // Event handler registration. If disconnect is true, it'll return a
+  // function that unregisters the handler.
+  function connect(node, type, handler, disconnect) {
+    function wrapHandler(event) {handler(new Event(event || window.event));}
+    if (typeof node.addEventListener == "function") {
+      node.addEventListener(type, wrapHandler, false);
+      if (disconnect) return function() {node.removeEventListener(type, wrapHandler, false);};
+    }
+    else {
+      node.attachEvent("on" + type, wrapHandler);
+      if (disconnect) return function() {node.detachEvent("on" + type, wrapHandler);};
+    }
+  }
+
+  function Delayed() {this.id = null;}
+  Delayed.prototype = {set: function(ms, f) {clearTimeout(this.id); this.id = setTimeout(f, ms);}};
+
+  // Some IE versions don't preserve whitespace when setting the
+  // innerHTML of a PRE tag.
+  var badInnerHTML = (function() {
+    var pre = document.createElement("pre");
+    pre.innerHTML = " "; return !pre.innerHTML;
+  })();
+
+  var gecko = /gecko\/\d{7}/i.test(navigator.userAgent);
+
+  var lineSep = "\n";
+  // Feature-detect whether newlines in textareas are converted to \r\n
+  (function () {
+    var te = document.createElement("textarea");
+    te.value = "foo\nbar";
+    if (te.value.indexOf("\r") > -1) lineSep = "\r\n";
+  }());
+
+  var tabSize = 8;
+  var mac = /Mac/.test(navigator.platform);
+  var movementKeys = {};
+  for (var i = 35; i <= 40; ++i)
+    movementKeys[i] = movementKeys["c" + i] = true;
+
+  // Counts the column offset in a string, taking tabs into account.
+  // Used mostly to find indentation.
+  function countColumn(string, end) {
+    if (end == null) {
+      end = string.search(/[^\s\u00a0]/);
+      if (end == -1) end = string.length;
+    }
+    for (var i = 0, n = 0; i < end; ++i) {
+      if (string.charAt(i) == "\t") n += tabSize - (n % tabSize);
+      else ++n;
+    }
+    return n;
+  }
+
+  // Find the position of an element by following the offsetParent chain.
+  function eltOffset(node) {
+    var x = 0, y = 0, n2 = node;
+    for (var n = node; n; n = n.offsetParent) {x += n.offsetLeft; y += n.offsetTop;}
+    for (var n = node; n != document.body; n = n.parentNode) {x -= n.scrollLeft; y -= n.scrollTop;}
+    return {left: x, top: y};
+  }
+  // Get a node's text content.
+  function eltText(node) {
+    return node.textContent || node.innerText || node.nodeValue || "";
+  }
+
+  // Operations on {line, ch} objects.
+  function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
+  function posLess(a, b) {return a.line < b.line || (a.line == b.line && a.ch < b.ch);}
+  function copyPos(x) {return {line: x.line, ch: x.ch};}
+
+  function htmlEscape(str) {
+    return str.replace(/[<&]/g, function(str) {return str == "&" ? "&amp;" : "&lt;";});
+  }
+
+  // Used to position the cursor after an undo/redo by finding the
+  // last edited character.
+  function editEnd(from, to) {
+    if (!to) return from ? from.length : 0;
+    if (!from) return to.length;
+    for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
+      if (from.charAt(i) != to.charAt(j)) break;
+    return j + 1;
+  }
+
+  function indexOf(collection, elt) {
+    if (collection.indexOf) return collection.indexOf(elt);
+    for (var i = 0, e = collection.length; i < e; ++i)
+      if (collection[i] == elt) return i;
+    return -1;
+  }
+
+  // See if "".split is the broken IE version, if so, provide an
+  // alternative way to split lines.
+  if ("\n\nb".split(/\n/).length != 3)
+    var splitLines = function(string) {
+      var pos = 0, nl, result = [];
+      while ((nl = string.indexOf("\n", pos)) > -1) {
+        result.push(string.slice(pos, string.charAt(nl-1) == "\r" ? nl - 1 : nl));
+        pos = nl + 1;
+      }
+      result.push(string.slice(pos));
+      return result;
+    };
+  else
+    var splitLines = function(string){return string.split(/\r?\n/);};
+
+  // Sane model of finding and setting the selection in a textarea
+  if (window.getSelection) {
+    var selRange = function(te) {
+      try {return {start: te.selectionStart, end: te.selectionEnd};}
+      catch(e) {return null;}
+    };
+    var setSelRange = function(te, start, end) {
+      try {te.setSelectionRange(start, end);}
+      catch(e) {} // Fails on Firefox when textarea isn't part of the document
+    };
+  }
+  // IE model. Don't ask.
+  else {
+    var selRange = function(te) {
+      try {var range = document.selection.createRange();}
+      catch(e) {return null;}
+      if (!range || range.parentElement() != te) return null;
+      var val = te.value, len = val.length, localRange = te.createTextRange();
+      localRange.moveToBookmark(range.getBookmark());
+      var endRange = te.createTextRange();
+      endRange.collapse(false);
+
+      if (localRange.compareEndPoints("StartToEnd", endRange) > -1)
+        return {start: len, end: len};
+
+      var start = -localRange.moveStart("character", -len);
+      for (var i = val.indexOf("\r"); i > -1 && i < start; i = val.indexOf("\r", i+1), start++) {}
+
+      if (localRange.compareEndPoints("EndToEnd", endRange) > -1)
+        return {start: start, end: len};
+
+      var end = -localRange.moveEnd("character", -len);
+      for (var i = val.indexOf("\r"); i > -1 && i < end; i = val.indexOf("\r", i+1), end++) {}
+      return {start: start, end: end};
+    };
+    var setSelRange = function(te, start, end) {
+      var range = te.createTextRange();
+      range.collapse(true);
+      var endrange = range.duplicate();
+      var newlines = 0, txt = te.value;
+      for (var pos = txt.indexOf("\n"); pos > -1 && pos < start; pos = txt.indexOf("\n", pos + 1))
+        ++newlines;
+      range.move("character", start - newlines);
+      for (; pos > -1 && pos < end; pos = txt.indexOf("\n", pos + 1))
+        ++newlines;
+      endrange.move("character", end - newlines);
+      range.setEndPoint("EndToEnd", endrange);
+      range.select();
+    };
+  }
+
+  CodeMirror.defineMode("null", function() {
+    return {token: function(stream) {stream.skipToEnd();}};
+  });
+  CodeMirror.defineMIME("text/plain", "null");
+
+  return CodeMirror;
+})();
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/overlay.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/overlay.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/lib/overlay.js	(revision 14585)
@@ -0,0 +1,51 @@
+// Utility function that allows modes to be combined. The mode given
+// as the base argument takes care of most of the normal mode
+// functionality, but a second (typically simple) mode is used, which
+// can override the style of text. Both modes get to parse all of the
+// text, but when both assign a non-null style to a piece of code, the
+// overlay wins, unless the combine argument was true, in which case
+// the styles are combined.
+
+CodeMirror.overlayParser = function(base, overlay, combine) {
+  return {
+    startState: function() {
+      return {
+        base: CodeMirror.startState(base),
+        overlay: CodeMirror.startState(overlay),
+        basePos: 0, baseCur: null,
+        overlayPos: 0, overlayCur: null
+      };
+    },
+    copyState: function(state) {
+      return {
+        base: CodeMirror.copyState(base, state.base),
+        overlay: CodeMirror.copyState(overlay, state.overlay),
+        basePos: state.basePos, baseCur: null,
+        overlayPos: state.overlayPos, overlayCur: null
+      };
+    },
+
+    token: function(stream, state) {
+      if (stream.start == state.basePos) {
+        state.baseCur = base.token(stream, state.base);
+        state.basePos = stream.pos;
+      }
+      if (stream.start == state.overlayPos) {
+        stream.pos = stream.start;
+        state.overlayCur = overlay.token(stream, state.overlay);
+        state.overlayPos = stream.pos;
+      }
+      stream.pos = Math.min(state.basePos, state.overlayPos);
+      if (stream.eol()) state.basePos = state.overlayPos = 0;
+
+      if (state.overlayCur == null) return state.baseCur;
+      if (state.baseCur != null && combine) return state.baseCur + " " + state.overlayCur;
+      else return state.overlayCur;
+    },
+    
+    indent: function(state, textAfter) {
+      return base.indent(state.base, textAfter);
+    },
+    electricChars: base.electricChars
+  };
+};
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.css	(revision 14585)
@@ -0,0 +1,6 @@
+span.c-like-keyword {color: #90b;}
+span.c-like-number {color: #291;}
+span.c-like-comment {color: #a70;}
+span.c-like-string {color: #a22;}
+span.c-like-preprocessor {color: #049;}
+span.c-like-var {color: #22b;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/clike.js	(revision 14585)
@@ -0,0 +1,181 @@
+CodeMirror.defineMode("clike", function(config, parserConfig) {
+  var indentUnit = config.indentUnit, keywords = parserConfig.keywords,
+      cpp = parserConfig.useCPP, multiLineStrings = parserConfig.multiLineStrings, $vars = parserConfig.$vars;
+  var isOperatorChar = /[+\-*&%=<>!?|]/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  var type;
+  function ret(tp, style) {
+    type = tp;
+    return style;
+  }
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'")
+      return chain(stream, state, tokenString(ch));
+    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+      return ret(ch);
+    else if (ch == "#" && cpp && state.startOfLine) {
+      stream.skipToEnd();
+      return ret("directive", "c-like-preprocessor");
+    }
+    else if (/\d/.test(ch)) {
+      stream.eatWhile(/[\w\.]/)
+      return ret("number", "c-like-number");
+    }
+    else if (ch == "/") {
+      if (stream.eat("*")) {
+        return chain(stream, state, tokenComment);
+      }
+      else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "c-like-comment");
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator");
+      }
+    }
+    else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator");
+    }
+    else if ($vars && ch == "$") {
+      stream.eatWhile(/[\w\$_]/);
+      return ret("word", "c-like-var");
+    }
+    else {
+      stream.eatWhile(/[\w\$_]/);
+      if (keywords && keywords.propertyIsEnumerable(stream.current())) return ret("keyword", "c-like-keyword");
+      return ret("word", "c-like-word");
+    }
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, next, end = false;
+      while ((next = stream.next()) != null) {
+        if (next == quote && !escaped) {end = true; break;}
+        escaped = !escaped && next == "\\";
+      }
+      if (end || !(escaped || multiLineStrings))
+        state.tokenize = tokenBase;
+      return ret("string", "c-like-string");
+    };
+  }
+
+  function tokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = tokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "c-like-comment");
+  }
+
+  function Context(indented, column, type, align, prev) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.align = align;
+    this.prev = prev;
+  }
+
+  function pushContext(state, col, type) {
+    return state.context = new Context(state.indented, col, type, null, state.context);
+  }
+  function popContext(state) {
+    return state.context = state.context.prev;
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      return {
+        tokenize: tokenBase,
+        context: new Context((basecolumn || 0) - indentUnit, 0, "top", false),
+        indented: 0,
+        startOfLine: true
+      };
+    },
+
+    token: function(stream, state) {
+      var ctx = state.context;
+      if (stream.sol()) {
+        if (ctx.align == null) ctx.align = false;
+        state.indented = stream.indentation();
+        state.startOfLine = true;
+      }
+      if (stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      if (ctx.align == null) ctx.align = true;
+
+      if ((type == ";" || type == ":") && ctx.type == "statement") popContext(state);
+      else if (type == "{") pushContext(state, stream.column(), "}");
+      else if (type == "[") pushContext(state, stream.column(), "]");
+      else if (type == "(") pushContext(state, stream.column(), ")");
+      else if (type == "}") {
+        if (ctx.type == "statement") ctx = popContext(state);
+        if (ctx.type == "}") ctx = popContext(state);
+        if (ctx.type == "statement") ctx = popContext(state);
+      }
+      else if (type == ctx.type) popContext(state);
+      else if (ctx.type == "}") pushContext(state, stream.column(), "statement");
+      state.startOfLine = false;
+      return style;
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize != tokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), ctx = state.context, closing = firstChar == ctx.type;
+      if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : indentUnit);
+      else if (ctx.align) return ctx.column + (closing ? 0 : 1);
+      else return ctx.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricChars: "{}"
+  };
+});
+
+(function() {
+  function keywords(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+  var cKeywords = "auto if break int case long char register continue return default short do sizeof " +
+    "double static else struct entry switch extern typedef float union for unsigned " +
+    "goto while enum void const signed volatile";
+
+  CodeMirror.defineMIME("text/x-csrc", {
+    name: "clike",
+    useCPP: true,
+    keywords: keywords(cKeywords)
+  });
+  CodeMirror.defineMIME("text/x-c++src", {
+    name: "clike",
+    useCPP: true,
+    keywords: keywords(cKeywords + " asm dynamic_cast namespace reinterpret_cast try bool explicit new " +
+                       "static_cast typeid catch false operator template typename class friend private " +
+                       "this using const_cast inline public throw virtual delete mutable protected true " +
+                       "wchar_t")
+  });
+  CodeMirror.defineMIME("text/x-java", {
+    name: "clike",
+    keywords: keywords("abstract assert boolean break byte case catch char class const continue default " + 
+                       "do double else enum extends false final finally float for goto if implements import " +
+                       "instanceof int interface long native new null package private protected public " +
+                       "return short static strictfp super switch synchronized this throw throws transient " +
+                       "true try void volatile while")
+  });
+}());
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/clike/index.html	(revision 14585)
@@ -0,0 +1,101 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: C-like mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="clike.js"></script>
+    <link rel="stylesheet" href="clike.css">
+    <link rel="stylesheet" href="../../css/docs.css">
+    <style>.CodeMirror {border: 2px inset #dee;}</style>
+  </head>
+  <body>
+    <h1>CodeMirror 2: C-like mode</h1>
+
+<form><textarea id="code" name="code">
+/* C demo code */
+
+#include <zmq.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <time.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <malloc.h>
+
+typedef struct {
+  void* arg_socket;
+  zmq_msg_t* arg_msg;
+  char* arg_string;
+  unsigned long arg_len;
+  int arg_int, arg_command;
+
+  int signal_fd;
+  int pad;
+  void* context;
+  sem_t sem;
+} acl_zmq_context;
+
+#define p(X) (context->arg_##X)
+
+void* zmq_thread(void* context_pointer) {
+  acl_zmq_context* context = (acl_zmq_context*)context_pointer;
+  char ok = 'K', err = 'X';
+  int res;
+
+  while (1) {
+    while ((res = sem_wait(&amp;context->sem)) == EINTR);
+    if (res) {write(context->signal_fd, &amp;err, 1); goto cleanup;}
+    switch(p(command)) {
+    case 0: goto cleanup;
+    case 1: p(socket) = zmq_socket(context->context, p(int)); break;
+    case 2: p(int) = zmq_close(p(socket)); break;
+    case 3: p(int) = zmq_bind(p(socket), p(string)); break;
+    case 4: p(int) = zmq_connect(p(socket), p(string)); break;
+    case 5: p(int) = zmq_getsockopt(p(socket), p(int), (void*)p(string), &amp;p(len)); break;
+    case 6: p(int) = zmq_setsockopt(p(socket), p(int), (void*)p(string), p(len)); break;
+    case 7: p(int) = zmq_send(p(socket), p(msg), p(int)); break;
+    case 8: p(int) = zmq_recv(p(socket), p(msg), p(int)); break;
+    case 9: p(int) = zmq_poll(p(socket), p(int), p(len)); break;
+    }
+    p(command) = errno;
+    write(context->signal_fd, &amp;ok, 1);
+  }
+ cleanup:
+  close(context->signal_fd);
+  free(context_pointer);
+  return 0;
+}
+
+void* zmq_thread_init(void* zmq_context, int signal_fd) {
+  acl_zmq_context* context = malloc(sizeof(acl_zmq_context));
+  pthread_t thread;
+
+  context->context = zmq_context;
+  context->signal_fd = signal_fd;
+  sem_init(&amp;context->sem, 1, 0);
+  pthread_create(&amp;thread, 0, &amp;zmq_thread, context);
+  pthread_detach(thread);
+  return context;
+}
+</textarea></form>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        matchBrackets: true,
+        mode: "text/x-csrc"
+      });
+    </script>
+
+    <p>Simple mode that tries to handle C-like languages as well as it
+    can. Takes two configuration parameters: <code>keywords</code>, an
+    object whose property names are the keywords in the language,
+    and <code>useCPP</code>, which determines whether C preprocessor
+    directives are recognized.</p>
+
+    <p><strong>MIME types defined:</strong> <code>text/x-csrc</code>
+    (C code), <code>text/x-c++src</code> (C++
+    code), <code>text/x-java</code> (Java code).</p>
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.css	(revision 14585)
@@ -0,0 +1,9 @@
+span.css-at {color: #708;}
+span.css-unit {color: #281;}
+span.css-value {color: #708;}
+span.css-identifier {color: black;}
+span.css-selector {color: #11B;}
+span.css-important {color: #00F;}
+span.css-colorcode {color: #299;}
+span.css-comment {color: #A70;}
+span.css-string {color: #A22;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/css.js	(revision 14585)
@@ -0,0 +1,124 @@
+CodeMirror.defineMode("css", function(config) {
+  var indentUnit = config.indentUnit, type;
+  function ret(style, tp) {type = tp; return style;}
+
+  function tokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == "@") {stream.eatWhile(/\w/); return ret("css-at", stream.current());}
+    else if (ch == "/" && stream.eat("*")) {
+      state.tokenize = tokenCComment;
+      return tokenCComment(stream, state);
+    }
+    else if (ch == "<" && stream.eat("!")) {
+      state.tokenize = tokenSGMLComment;
+      return tokenSGMLComment(stream, state);
+    }
+    else if (ch == "=") ret(null, "compare");
+    else if ((ch == "~" || ch == "|") && stream.eat("=")) return ret(null, "compare");
+    else if (ch == "\"" || ch == "'") {
+      state.tokenize = tokenString(ch);
+      return state.tokenize(stream, state);
+    }
+    else if (ch == "#") {
+      stream.eatWhile(/\w/);
+      return ret("css-selector", "hash");
+    }
+    else if (ch == "!") {
+      stream.match(/^\s*\w*/);
+      return ret("css-important", "important");
+    }
+    else if (/\d/.test(ch)) {
+      stream.eatWhile(/[\w.%]/);
+      return ret("css-unit", "unit");
+    }
+    else if (/[,.+>*\/]/.test(ch)) {
+      return ret(null, "select-op");
+    }
+    else if (/[;{}:\[\]]/.test(ch)) {
+      return ret(null, ch);
+    }
+    else {
+      stream.eatWhile(/[\w\\\-_]/);
+      return ret("css-identifier", "identifier");
+    }
+  }
+
+  function tokenCComment(stream, state) {
+    var maybeEnd = false, ch;
+    while ((ch = stream.next()) != null) {
+      if (maybeEnd && ch == "/") {
+        state.tokenize = tokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("css-comment", "comment");
+  }
+
+  function tokenSGMLComment(stream, state) {
+    var dashes = 0, ch;
+    while ((ch = stream.next()) != null) {
+      if (dashes >= 2 && ch == ">") {
+        state.tokenize = tokenBase;
+        break;
+      }
+      dashes = (ch == "-") ? dashes + 1 : 0;
+    }
+    return ret("css-comment", "comment");
+  }
+
+  function tokenString(quote) {
+    return function(stream, state) {
+      var escaped = false, ch;
+      while ((ch = stream.next()) != null) {
+        if (ch == quote && !escaped)
+          break;
+        escaped = !escaped && ch == "\\";
+      }
+      if (!escaped) state.tokenize = tokenBase;
+      return ret("css-string", "string");
+    };
+  }
+
+  return {
+    startState: function(base) {
+      return {tokenize: tokenBase,
+              baseIndent: base || 0,
+              stack: []};
+    },
+
+    token: function(stream, state) {
+      if (stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+
+      var context = state.stack[state.stack.length-1];
+      if (type == "hash" && context == "rule") style = "css-colorcode";
+      else if (style == "css-identifier") {
+        if (context == "rule") style = "css-value";
+        else if (!context || context == "@media{") style = "css-selector";
+      }
+
+      if (context == "rule" && /^[\{\};]$/.test(type))
+        state.stack.pop();
+      if (type == "{") {
+        if (context == "@media") state.stack[state.stack.length-1] = "@media{";
+        else state.stack.push("{");
+      }
+      else if (type == "}") state.stack.pop();
+      else if (type == "@media") state.stack.push("@media");
+      else if (context != "rule" && context != "@media" && type != "comment") state.stack.push("rule");
+      return style;
+    },
+
+    indent: function(state, textAfter) {
+      var n = state.stack.length;
+      if (/^\}/.test(textAfter))
+        n -= state.stack[state.stack.length-1] == "rule" ? 2 : 1;
+      return state.baseIndent + n * indentUnit;
+    },
+
+    electricChars: "}"
+  };
+});
+
+CodeMirror.defineMIME("text/css", "css");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/css/index.html	(revision 14585)
@@ -0,0 +1,56 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: CSS mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="css.js"></script>
+    <link rel="stylesheet" href="css.css">
+    <style>.CodeMirror {background: #f8f8f8;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: CSS mode</h1>
+    <form><textarea id="code" name="code">
+/* Some example CSS */
+
+@import url("something.css");
+
+body {
+  margin: 0;
+  padding: 3em 6em;
+  font-family: tahoma, arial, sans-serif;
+  color: #000;
+}
+
+#navigation a {
+  font-weight: bold;
+  text-decoration: none !important;
+}
+
+h1 {
+  font-size: 2.5em;
+}
+
+h2 {
+  font-size: 1.7em;
+}
+
+h1:before, h2:before {
+  content: "::";
+}
+
+code {
+  font-family: courier, monospace;
+  font-size: 80%;
+  color: #418A8A;
+}
+</textarea></form>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
+    </script>
+
+    <p><strong>MIME types defined:</strong> <code>text/css</code>.</p>
+
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.css	(revision 14585)
@@ -0,0 +1,3 @@
+span.diff-rangeinfo {color: #a0b;}
+span.diff-minus {color: #a22;}
+span.diff-plus {color: #2b2;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/diff.js	(revision 14585)
@@ -0,0 +1,13 @@
+CodeMirror.defineMode("diff", function() {
+  return {
+    token: function(stream) {
+      var ch = stream.next();
+      stream.skipToEnd();
+      if (ch == "+") return "diff-plus";
+      if (ch == "-") return "diff-minus";
+      if (ch == "@") return "diff-rangeinfo";
+    }
+  };
+});
+
+CodeMirror.defineMIME("text/x-diff", "diff");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/diff/index.html	(revision 14585)
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: Diff mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="diff.js"></script>
+    <link rel="stylesheet" href="diff.css">
+    <style>.CodeMirror {border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: Diff mode</h1>
+    <form><textarea id="code" name="code">
+diff --git a/index.html b/index.html
+index c1d9156..7764744 100644
+--- a/index.html
++++ b/index.html
+@@ -95,7 +95,8 @@ StringStream.prototype = {
+     <script>
+       var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+         lineNumbers: true,
+-        autoMatchBrackets: true
++        autoMatchBrackets: true,
++      onGutterClick: function(x){console.log(x);}
+       });
+     </script>
+   </body>
+diff --git a/lib/codemirror.js b/lib/codemirror.js
+index 04646a9..9a39cc7 100644
+--- a/lib/codemirror.js
++++ b/lib/codemirror.js
+@@ -399,10 +399,16 @@ var CodeMirror = (function() {
+     }
+ 
+     function onMouseDown(e) {
+-      var start = posFromMouse(e), last = start;
++      var start = posFromMouse(e), last = start, target = e.target();
+       if (!start) return;
+       setCursor(start.line, start.ch, false);
+       if (e.button() != 1) return;
++      if (target.parentNode == gutter) {
++        if (options.onGutterClick)
++          options.onGutterClick(indexOf(gutter.childNodes, target) + showingFrom);
++        return;
++      }
++
+       if (!focused) onFocus();
+ 
+       e.stop();
+@@ -808,7 +814,7 @@ var CodeMirror = (function() {
+       for (var i = showingFrom; i < showingTo; ++i) {
+         var marker = lines[i].gutterMarker;
+         if (marker) html.push('<div class="' + marker.style + '">' + htmlEscape(marker.text) + '</div>');
+-        else html.push("<div>" + (options.lineNumbers ? i + 1 : "\u00a0") + "</div>");
++        else html.push("<div>" + (options.lineNumbers ? i + options.firstLineNumber : "\u00a0") + "</div>");
+       }
+       gutter.style.display = "none"; // TODO test whether this actually helps
+       gutter.innerHTML = html.join("");
+@@ -1371,10 +1377,8 @@ var CodeMirror = (function() {
+         if (option == "parser") setParser(value);
+         else if (option === "lineNumbers") setLineNumbers(value);
+         else if (option === "gutter") setGutter(value);
+-        else if (option === "readOnly") options.readOnly = value;
+-        else if (option === "indentUnit") {options.indentUnit = indentUnit = value; setParser(options.parser);}
+-        else if (/^(?:enterMode|tabMode|indentWithTabs|readOnly|autoMatchBrackets|undoDepth)$/.test(option)) options[option] = value;
+-        else throw new Error("Can't set option " + option);
++        else if (option === "indentUnit") {options.indentUnit = value; setParser(options.parser);}
++        else options[option] = value;
+       },
+       cursorCoords: cursorCoords,
+       undo: operation(undo),
+@@ -1402,7 +1406,8 @@ var CodeMirror = (function() {
+       replaceRange: operation(replaceRange),
+ 
+       operation: function(f){return operation(f)();},
+-      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);}
++      refresh: function(){updateDisplay([{from: 0, to: lines.length}]);},
++      getInputField: function(){return input;}
+     };
+     return instance;
+   }
+@@ -1420,6 +1425,7 @@ var CodeMirror = (function() {
+     readOnly: false,
+     onChange: null,
+     onCursorActivity: null,
++    onGutterClick: null,
+     autoMatchBrackets: false,
+     workTime: 200,
+     workDelay: 300,
+</textarea></form>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
+    </script>
+
+    <p><strong>MIME types defined:</strong> <code>text/x-diff</code>.</p>
+
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.css	(revision 14585)
@@ -0,0 +1,25 @@
+span.hs-char,
+span.hs-float,
+span.hs-integer,
+span.hs-string 	{color: #762;}
+
+span.hs-comment {color: #262;font-style: italic;}
+span.hs-pragma {color: #555;font-style: italic;}
+
+span.hs-special,
+span.hs-varid,
+span.hs-varsym {color: #000;}
+
+span.hs-conid,
+span.hs-consym {color: #b11;}
+
+span.hs-qualifier {color: #555;}
+
+span.hs-reservedid,
+span.hs-reservedop {color: #730;}
+
+span.hs-prelude-varid,
+span.hs-prelude-varsym {color: #30a;}
+span.hs-prelude-conid {color: #b11;}
+
+span.hs-error {background-color: #fdd;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/haskell.js	(revision 14585)
@@ -0,0 +1,242 @@
+CodeMirror.defineMode("haskell", function(cmCfg, modeCfg) {
+
+  function switchState(source, setState, f) {
+    setState(f);
+    return f(source, setState);
+  }
+  
+  // These should all be Unicode extended, as per the Haskell 2010 report
+  var smallRE = /[a-z_]/;
+  var largeRE = /[A-Z]/;
+  var digitRE = /[0-9]/;
+  var hexitRE = /[0-9A-Fa-f]/;
+  var octitRE = /[0-7]/;
+  var idRE = /[a-z_A-Z0-9']/;
+  var symbolRE = /[-!#$%&*+.\/<=>?@\\^|~:]/;
+  var specialRE = /[(),;[\]`{}]/;
+  var whiteCharRE = /[ \t\v\f]/; // newlines are handled in tokenizer
+    
+  function normal(source, setState) {
+    if (source.eatWhile(whiteCharRE)) {
+      return null;
+    }
+      
+    var ch = source.next();
+    if (specialRE.test(ch)) {
+      if (ch == '{' && source.eat('-')) {
+        var t = "hs-comment";
+        if (source.eat('#')) {
+          t = "hs-pragma";
+        }
+        return switchState(source, setState, ncomment(t, 1));
+      }
+      return "hs-special";
+    }
+    
+    if (ch == '\'') {
+      if (source.eat('\\')) {
+        source.next();  // should handle other escapes here
+      }
+      else {
+        source.next();
+      }
+      if (source.eat('\'')) {
+        return "hs-char";
+      }
+      return "hs-error";
+    }
+    
+    if (ch == '"') {
+      return switchState(source, setState, stringLiteral);
+    }
+      
+    if (largeRE.test(ch)) {
+      source.eatWhile(idRE);
+      if (source.eat('.')) {
+        return "hs-qualifier";
+      }
+      return "hs-conid";
+    }
+      
+    if (smallRE.test(ch)) {
+      source.eatWhile(idRE);
+      return "hs-varid";
+    }
+      
+    if (digitRE.test(ch)) {
+      if (ch == '0') {
+        if (source.eat(/[xX]/)) {
+          source.eatWhile(hexitRE); // should require at least 1
+          return "hs-integer";
+        }
+        if (source.eat(/[oO]/)) {
+          source.eatWhile(octitRE); // should require at least 1
+          return "hs-integer";
+        }
+      }
+      source.eatWhile(digitRE);
+      var t = "hs-integer";
+      if (source.eat('.')) {
+        t = "hs-float";
+        source.eatWhile(digitRE); // should require at least 1
+      }
+      if (source.eat(/[eE]/)) {
+        t = "hs-float";
+        source.eat(/[-+]/);
+        source.eatWhile(digitRE); // should require at least 1
+      }
+      return t;
+    }
+      
+    if (symbolRE.test(ch)) {
+      if (ch == '-' && source.eat(/-/)) {
+        source.eatWhile(/-/);
+        if (!source.eat(symbolRE)) {
+          source.skipToEnd();
+          return "hs-comment";
+        }
+      }
+      var t = "hs-varsym";
+      if (ch == ':') {
+        t = "hs-consym";
+      }
+      source.eatWhile(symbolRE);
+      return t;    
+    }
+      
+    return "hs-error";
+  }
+    
+  function ncomment(type, nest) {
+    if (nest == 0) {
+      return normal;
+    }
+    return function(source, setState) {
+      var currNest = nest;
+      while (!source.eol()) {
+        ch = source.next();
+        if (ch == '{' && source.eat('-')) {
+          ++currNest;
+        }
+        else if (ch == '-' && source.eat('}')) {
+          --currNest;
+          if (currNest == 0) {
+            setState(normal);
+            return type;
+          }
+        }
+      }
+      setState(ncomment(type, currNest));
+      return type;
+    }
+  }
+    
+  function stringLiteral(source, setState) {
+    while (!source.eol()) {
+      var ch = source.next();
+      if (ch == '"') {
+        setState(normal);
+        return "hs-string";
+      }
+      if (ch == '\\') {
+        if (source.eol() || source.eat(whiteCharRE)) {
+          setState(stringGap);
+          return "hs-string";
+        }
+        if (source.eat('&')) {
+        }
+        else {
+          source.next(); // should handle other escapes here
+        }
+      }
+    }
+    setState(normal);
+    return "hs-error";
+  }
+  
+  function stringGap(source, setState) {
+    if (source.eat('\\')) {
+      return switchState(source, setState, stringLiteral);
+    }
+    source.next();
+    setState(normal);
+    return "hs-error";
+  }
+  
+  
+  var wellKnownWords = (function() {
+    var wkw = {};
+    function setType(t) {
+      return function () {
+        for (var i = 0; i < arguments.length; i++)
+          wkw[arguments[i]] = t;
+      }
+    }
+    
+    setType("hs-reservedid")(
+      "case", "class", "data", "default", "deriving", "do", "else", "foreign",
+      "if", "import", "in", "infix", "infixl", "infixr", "instance", "let",
+      "module", "newtype", "of", "then", "type", "where", "_");
+      
+    setType("hs-reservedop")(
+      "\.\.", ":", "::", "=", "\\", "\"", "<-", "->", "@", "~", "=>");
+      
+    setType("hs-prelude-varsym")(
+      "!!", "$!", "$", "&&", "+", "++", "-", ".", "/", "/=", "<", "<=", "=<<",
+      "==", ">", ">=", ">>", ">>=", "^", "^^", "||", "*", "**");
+      
+    setType("hs-prelude-conid")(
+      "Bool", "Bounded", "Char", "Double", "EQ", "Either", "Enum", "Eq",
+      "False", "FilePath", "Float", "Floating", "Fractional", "Functor", "GT",
+      "IO", "IOError", "Int", "Integer", "Integral", "Just", "LT", "Left",
+      "Maybe", "Monad", "Nothing", "Num", "Ord", "Ordering", "Rational", "Read",
+      "ReadS", "Real", "RealFloat", "RealFrac", "Right", "Show", "ShowS",
+      "String", "True");
+      
+    setType("hs-prelude-varid")(
+      "abs", "acos", "acosh", "all", "and", "any", "appendFile", "asTypeOf",
+      "asin", "asinh", "atan", "atan2", "atanh", "break", "catch", "ceiling",
+      "compare", "concat", "concatMap", "const", "cos", "cosh", "curry",
+      "cycle", "decodeFloat", "div", "divMod", "drop", "dropWhile", "either",
+      "elem", "encodeFloat", "enumFrom", "enumFromThen", "enumFromThenTo",
+      "enumFromTo", "error", "even", "exp", "exponent", "fail", "filter",
+      "flip", "floatDigits", "floatRadix", "floatRange", "floor", "fmap",
+      "foldl", "foldl1", "foldr", "foldr1", "fromEnum", "fromInteger",
+      "fromIntegral", "fromRational", "fst", "gcd", "getChar", "getContents",
+      "getLine", "head", "id", "init", "interact", "ioError", "isDenormalized",
+      "isIEEE", "isInfinite", "isNaN", "isNegativeZero", "iterate", "last",
+      "lcm", "length", "lex", "lines", "log", "logBase", "lookup", "map",
+      "mapM", "mapM_", "max", "maxBound", "maximum", "maybe", "min", "minBound",
+      "minimum", "mod", "negate", "not", "notElem", "null", "odd", "or",
+      "otherwise", "pi", "pred", "print", "product", "properFraction",
+      "putChar", "putStr", "putStrLn", "quot", "quotRem", "read", "readFile",
+      "readIO", "readList", "readLn", "readParen", "reads", "readsPrec",
+      "realToFrac", "recip", "rem", "repeat", "replicate", "return", "reverse",
+      "round", "scaleFloat", "scanl", "scanl1", "scanr", "scanr1", "seq",
+      "sequence", "sequence_", "show", "showChar", "showList", "showParen",
+      "showString", "shows", "showsPrec", "significand", "signum", "sin",
+      "sinh", "snd", "span", "splitAt", "sqrt", "subtract", "succ", "sum",
+      "tail", "take", "takeWhile", "tan", "tanh", "toEnum", "toInteger",
+      "toRational", "truncate", "uncurry", "undefined", "unlines", "until",
+      "unwords", "unzip", "unzip3", "userError", "words", "writeFile", "zip",
+      "zip3", "zipWith", "zipWith3");
+      
+    return wkw;
+  })();
+    
+  
+  
+  return {
+    startState: function ()  { return { f: normal }; },
+    copyState:  function (s) { return { f: s.f }; },
+    
+    token: function(stream, state) {
+      var t = state.f(stream, function(s) { state.f = s; });
+      var w = stream.current();
+      return (w in wellKnownWords) ? wellKnownWords[w] : t;
+    }
+  };
+
+});
+
+CodeMirror.defineMIME("text/x-haskell", "haskell");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/haskell/index.html	(revision 14585)
@@ -0,0 +1,59 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: Haskell mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="haskell.js"></script>
+    <link rel="stylesheet" href="haskell.css">
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: Haskell mode</h1>
+
+<form><textarea id="code" name="code">
+module UniquePerms (
+    uniquePerms
+    )
+where
+
+-- | Find all unique permutations of a list where there might be duplicates.
+uniquePerms :: (Eq a) => [a] -> [[a]]
+uniquePerms = permBag . makeBag
+
+-- | An unordered collection where duplicate values are allowed,
+-- but represented with a single value and a count.
+type Bag a = [(a, Int)]
+
+makeBag :: (Eq a) => [a] -> Bag a
+makeBag [] = []
+makeBag (a:as) = mix a $ makeBag as
+  where
+    mix a []                        = [(a,1)]
+    mix a (bn@(b,n):bs) | a == b    = (b,n+1):bs
+                        | otherwise = bn : mix a bs
+
+permBag :: Bag a -> [[a]]
+permBag [] = [[]]
+permBag bs = concatMap (\(f,cs) -> map (f:) $ permBag cs) . oneOfEach $ bs
+  where
+    oneOfEach [] = []
+    oneOfEach (an@(a,n):bs) =
+        let bs' = if n == 1 then bs else (a,n-1):bs
+        in (a,bs') : mapSnd (an:) (oneOfEach bs)
+    
+    apSnd f (a,b) = (a, f b)
+    mapSnd = map . apSnd
+</textarea></form>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        matchBrackets: true
+      });
+    </script>
+
+    <p><strong>MIME types defined:</strong> <code>text/x-haskell</code>.</p>
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js	(revision 14585)
@@ -0,0 +1,66 @@
+CodeMirror.defineMode("htmlmixed", function(config, parserConfig) {
+  var htmlMode = CodeMirror.getMode(config, {name: "xml", htmlMode: true});
+  var jsMode = CodeMirror.getMode(config, "javascript");
+  var cssMode = CodeMirror.getMode(config, "css");
+
+  function html(stream, state) {
+    var style = htmlMode.token(stream, state.htmlState);
+    if (style == "xml-tag" && stream.current() == ">" && state.htmlState.context) {
+      if (/^script$/i.test(state.htmlState.context.tagName)) {
+        state.token = javascript;
+        state.localState = jsMode.startState(htmlMode.indent(state.htmlState, ""));
+      }
+      else if (/^style$/i.test(state.htmlState.context.tagName)) {
+        state.token = css;
+        state.localState = cssMode.startState(htmlMode.indent(state.htmlState, ""));
+      }
+    }
+    return style;
+  }
+  function javascript(stream, state) {
+    if (stream.match(/^<\/\s*script\s*>/i, false)) {
+      state.token = html;
+      state.curState = null;
+      return html(stream, state);
+    }
+    return jsMode.token(stream, state.localState);
+  }
+  function css(stream, state) {
+    if (stream.match(/^<\/\s*style\s*>/i, false)) {
+      state.token = html;
+      state.localState = null;
+      return html(stream, state);
+    }
+    return cssMode.token(stream, state.localState);
+  }
+
+  return {
+    startState: function() {
+      var state = htmlMode.startState();
+      return {token: html, localState: null, htmlState: state};
+    },
+
+    copyState: function(state) {
+      if (state.localState)
+        var local = CodeMirror.copyState(state.token == css ? cssMode : jsMode, state.localState);
+      return {token: state.token, localState: local, htmlState: CodeMirror.copyState(htmlMode, state.htmlState)};
+    },
+
+    token: function(stream, state) {
+      return state.token(stream, state);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.token == html || /^\s*<\//.test(textAfter))
+        return htmlMode.indent(state.htmlState, textAfter);
+      else if (state.token == javascript)
+        return jsMode.indent(state.localState, textAfter);
+      else
+        return cssMode.indent(state.localState, textAfter);
+    },
+
+    electricChars: "/{}:"
+  }
+});
+
+CodeMirror.defineMIME("text/html", "htmlmixed");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/htmlmixed/index.html	(revision 14585)
@@ -0,0 +1,54 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: HTML mixed mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="../xml/xml.js"></script>
+    <link rel="stylesheet" href="../xml/xml.css">
+    <script src="../javascript/javascript.js"></script>
+    <link rel="stylesheet" href="../javascript/javascript.css">
+    <script src="../css/css.js"></script>
+    <link rel="stylesheet" href="../css/css.css">
+    <script src="htmlmixed.js"></script>
+    <link rel="stylesheet" href="../../css/docs.css">
+    <style>.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+  </head>
+  <body>
+    <h1>CodeMirror 2: HTML mixed mode</h1>
+    <form><textarea id="code" name="code">
+<html style="color: green">
+  <!-- this is a comment -->
+  <head>
+    <title>Mixed HTML Example</title>
+    <style type="text/css">
+      h1 {font-family: comic sans; color: #f0f;}
+      div {background: yellow !important;}
+      body {
+        max-width: 50em;
+        margin: 1em 2em 1em 5em;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>Mixed HTML Example</h1>
+    <script>
+      function jsFunc(arg1, arg2) {
+        if (arg1 && arg2) document.body.innerHTML = "achoo";
+      }
+    </script>
+  </body>
+</html>
+</textarea></form>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: "text/html", tabMode: "indent"});
+    </script>
+
+    <p>The HTML mixed mode depends on the XML, JavaScript, and CSS modes.</p>
+
+    <p><strong>MIME types defined:</strong> <code>text/html</code>
+    (redefined, only takes effect if you load this parser after the
+    XML parser).</p>
+
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/index.html	(revision 14585)
@@ -0,0 +1,78 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: JavaScript mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="javascript.js"></script>
+    <link rel="stylesheet" href="javascript.css">
+    <link rel="stylesheet" href="../../css/docs.css">
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+  </head>
+  <body>
+    <h1>CodeMirror 2: JavaScript mode</h1>
+
+<div><textarea id="code" name="code">
+// Demo code (the actual new parser character stream implementation)
+
+function StringStream(string) {
+  this.pos = 0;
+  this.string = string;
+}
+
+StringStream.prototype = {
+  done: function() {return this.pos >= this.string.length;},
+  peek: function() {return this.string.charAt(this.pos);},
+  next: function() {
+    if (this.pos &lt; this.string.length)
+      return this.string.charAt(this.pos++);
+  },
+  eat: function(match) {
+    var ch = this.string.charAt(this.pos);
+    if (typeof match == "string") var ok = ch == match;
+    else var ok = ch &amp;&amp; match.test ? match.test(ch) : match(ch);
+    if (ok) {this.pos++; return ch;}
+  },
+  eatWhile: function(match) {
+    var start = this.pos;
+    while (this.eat(match));
+    if (this.pos > start) return this.string.slice(start, this.pos);
+  },
+  backUp: function(n) {this.pos -= n;},
+  column: function() {return this.pos;},
+  eatSpace: function() {
+    var start = this.pos;
+    while (/\s/.test(this.string.charAt(this.pos))) this.pos++;
+    return this.pos - start;
+  },
+  match: function(pattern, consume, caseInsensitive) {
+    if (typeof pattern == "string") {
+      function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
+      if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
+        if (consume !== false) this.pos += str.length;
+        return true;
+      }
+    }
+    else {
+      var match = this.string.slice(this.pos).match(pattern);
+      if (match &amp;&amp; consume !== false) this.pos += match[0].length;
+      return match;
+    }
+  }
+};
+</textarea></div>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        matchBrackets: true
+      });
+    </script>
+
+    <p>JavaScript mode supports a single configuration
+    option, <code>json</code>, which will set the mode to expect JSON
+    data rather than a JavaScript program.</p>
+
+    <p><strong>MIME types defined:</strong> <code>text/javascript</code>, <code>application/json</code>.</p>
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.css	(revision 14585)
@@ -0,0 +1,6 @@
+span.js-keyword {color: #90b;}
+span.js-atom {color: #291;}
+span.js-variabledef {color: #00f;}
+span.js-localvariable {color: #049;}
+span.js-comment {color: #a70;}
+span.js-string {color: #a22;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.js	(revision 14585)
@@ -0,0 +1,348 @@
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var jsonMode = parserConfig.json;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "js-keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+    var operator = kw("operator"), atom = {type: "atom", style: "js-atom"};
+    return {
+      "if": A, "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
+      "var": kw("var"), "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom
+    };
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|]/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  function nextUntilUnescaped(stream, end) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (next == end && !escaped)
+        return false;
+      escaped = !escaped && next == "\\";
+    }
+    return escaped;
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+
+  function jsTokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'")
+      return chain(stream, state, jsTokenString(ch));
+    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+      return ret(ch);
+    else if (ch == "0" && stream.eat(/x/i)) {
+      stream.eatWhile(/[\da-f]/i);
+      return ret("number", "js-atom");
+    }      
+    else if (/\d/.test(ch)) {
+      stream.match(/^\d*(?:\.\d*)?(?:e[+\-]?\d+)?/);
+      return ret("number", "js-atom");
+    }
+    else if (ch == "/") {
+      if (stream.eat("*")) {
+        return chain(stream, state, jsTokenComment);
+      }
+      else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "js-comment");
+      }
+      else if (state.reAllowed) {
+        nextUntilUnescaped(stream, "/");
+        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
+        return ret("regexp", "js-string");
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", null, stream.current());
+      }
+    }
+    else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator", null, stream.current());
+    }
+    else {
+      stream.eatWhile(/[\w\$_]/);
+      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+      return known ? ret(known.type, known.style, word) :
+                     ret("variable", "js-variable", word);
+    }
+  }
+
+  function jsTokenString(quote) {
+    return function(stream, state) {
+      if (!nextUntilUnescaped(stream, quote))
+        state.tokenize = jsTokenBase;
+      return ret("string", "js-string");
+    };
+  }
+
+  function jsTokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "js-comment");
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
+  
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "js-localvariable";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function register(varname) {
+    var state = cx.state;
+    if (state.context) {
+      cx.marked = "js-variabledef";
+      for (var v = state.localVars; v; v = v.next)
+        if (v.name == varname) return;
+      state.localVars = {name: varname, next: state.localVars};
+    }
+  }
+
+  // Combinators
+
+  var defaultVars = {name: "this", next: {name: "arguments"}};
+  function pushcontext() {
+    if (!cx.state.context) cx.state.localVars = defaultVars;
+    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars;
+    cx.state.context = cx.state.context.prev;
+  }
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state;
+      state.lexical = new JSLexical(state.indented, cx.stream.column(), type, null, state.lexical, info)
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    return function expecting(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";") return pass();
+      else return cont(arguments.callee);
+    };
+  }
+
+  function statement(type) {
+    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "{") return cont(pushlex("}"), block, poplex);
+    if (type == ";") return cont();
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
+                                      poplex, statement, poplex);
+    if (type == "variable") return cont(pushlex("stat"), maybelabel);
+    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+                                         block, poplex, poplex);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+                                        statement, poplex, popcontext);
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function expression(type) {
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator);
+    if (type == "function") return cont(functiondef);
+    if (type == "keyword c") return cont(expression);
+    if (type == "(") return cont(pushlex(")"), expression, expect(")"), poplex, maybeoperator);
+    if (type == "operator") return cont(expression);
+    if (type == "[") return cont(pushlex("]"), commasep(expression, "]"), poplex, maybeoperator);
+    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeoperator);
+    return cont();
+  }
+  function maybeoperator(type, value) {
+    if (type == "operator" && /\+\+|--/.test(value)) return cont(maybeoperator);
+    if (type == "operator") return cont(expression);
+    if (type == ";") return;
+    if (type == "(") return cont(pushlex(")"), commasep(expression, ")"), poplex, maybeoperator);
+    if (type == ".") return cont(property, maybeoperator);
+    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, maybeoperator);
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperator, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "js-property"; return cont();}
+  }
+  function objprop(type) {
+    if (type == "variable") cx.marked = "js-property";
+    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expression);
+  }
+  function commasep(what, end) {
+    function proceed(type) {
+      if (type == ",") return cont(what, proceed);
+      if (type == end) return cont();
+      return cont(expect(end));
+    }
+    return function commaSeparated(type) {
+      if (type == end) return cont();
+      else return pass(what, proceed);
+    };
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function vardef1(type, value) {
+    if (type == "variable"){register(value); return cont(vardef2);}
+    return cont();
+  }
+  function vardef2(type, value) {
+    if (value == "=") return cont(expression, vardef2);
+    if (type == ",") return cont(vardef1);
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef1, forspec2);
+    if (type == ";") return pass(forspec2);
+    if (type == "variable") return cont(formaybein);
+    return pass(forspec2);
+  }
+  function formaybein(type, value) {
+    if (value == "in") return cont(expression);
+    return cont(maybeoperator, forspec2);
+  }
+  function forspec2(type, value) {
+    if (type == ";") return cont(forspec3);
+    if (value == "in") return cont(expression);
+    return cont(expression, expect(";"), forspec3);
+  }
+  function forspec3(type) {
+    if (type != ")") cont(expression);
+  }
+  function functiondef(type, value) {
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
+  }
+  function funarg(type, value) {
+    if (type == "variable") {register(value); return cont();}
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      return {
+        tokenize: jsTokenBase,
+        reAllowed: true,
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: null,
+        context: null,
+        indented: 0
+      };
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+      }
+      if (stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.reAllowed = type == "operator" || type == "keyword c" || type.match(/^[\[{}\(,;:]$/);
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize != jsTokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical,
+          type = lexical.type, closing = firstChar == type;
+      if (type == "vardef") return lexical.indented + 4;
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "stat" || type == "form") return lexical.indented + indentUnit;
+      else if (lexical.info == "switch" && !closing)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricChars: ":{}"
+  };
+});
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/index.html	(revision 14585)
@@ -0,0 +1,52 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: PHP mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="../xml/xml.js"></script>
+    <link rel="stylesheet" href="../xml/xml.css">
+    <script src="../javascript/javascript.js"></script>
+    <link rel="stylesheet" href="../javascript/javascript.css">
+    <script src="../css/css.js"></script>
+    <link rel="stylesheet" href="../css/css.css">
+    <script src="../clike/clike.js"></script>
+    <link rel="stylesheet" href="../clike/clike.css">
+    <script src="php.js"></script>
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: PHP mode</h1>
+
+<form><textarea id="code" name="code">
+<?php
+function hello($who) {
+	return "Hello " . $who;
+}
+?>
+<p>The program says <?= hello("World") ?>.</p>
+<script>
+	alert("And here is some JS code"); // also colored
+</script>
+</textarea></form>
+
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
+        lineNumbers: true,
+        matchBrackets: true,
+        mode: "application/x-httpd-php",
+        indentUnit: 8,
+        indentWithTabs: true,
+        enterMode: "keep",
+        tabMode: "shift"
+      });
+    </script>
+
+    <p>Simple HTML/PHP mode based on
+    the <a href="../clike/">C-like</a> mode. Depends on XML,
+    JavaScript, CSS, and C-like modes.</p>
+
+    <p><strong>MIME types defined:</strong> <code>application/x-httpd-php</code>.</p>
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/php.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/php.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/php/php.js	(revision 14585)
@@ -0,0 +1,83 @@
+(function() {
+  function keywords(str) {
+    var obj = {}, words = str.split(" ");
+    for (var i = 0; i < words.length; ++i) obj[words[i]] = true;
+    return obj;
+  }
+  var phpKeywords =
+    keywords("abstract and array as break case catch cfunction class clone const continue declare " +
+             "default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends " +
+             "final for foreach function global goto if implements interface instanceof namespace " +
+             "new or private protected public static switch throw try use var while xor");
+
+  CodeMirror.defineMode("php", function(config, parserConfig) {
+    var htmlMode = CodeMirror.getMode(config, "text/html");
+    var jsMode = CodeMirror.getMode(config, "text/javascript");
+    var cssMode = CodeMirror.getMode(config, "text/css");
+    var phpMode = CodeMirror.getMode(config, {name: "clike", keywords: phpKeywords, multiLineStrings: true, $vars: true});
+
+    function dispatch(stream, state) { // TODO open PHP inside text/css
+      if (state.curMode == htmlMode) {
+        var style = htmlMode.token(stream, state.curState);
+        if (style == "xml-processing" && /^<\?/.test(stream.current())) {
+          state.curMode = phpMode;
+          state.curState = state.php;
+          state.curClose = /^\?>/;
+        }
+        else if (style == "xml-tag" && stream.current() == ">" && state.curState.context) {
+          if (/^script$/i.test(state.curState.context.tagName)) {
+            state.curMode = jsMode;
+            state.curState = jsMode.startState(htmlMode.indent(state.curState, ""));
+            state.curClose = /^<\/\s*script\s*>/i;
+          }
+          else if (/^style$/i.test(state.curState.context.tagName)) {
+            state.curMode = cssMode;
+            state.curState = cssMode.startState(htmlMode.indent(state.curState, ""));
+            state.curClose =  /^<\/\s*style\s*>/i;
+          }
+        }
+        return style;
+      }
+      else if (stream.match(state.curClose, false)) {
+        state.curMode = htmlMode;
+        state.curState = state.html;
+        state.curClose = null;
+        return dispatch(stream, state);
+      }
+      else return state.curMode.token(stream, state.curState);
+    }
+
+    return {
+      startState: function() {
+        var html = htmlMode.startState();
+        return {html: html,
+                php: phpMode.startState(),
+                curMode: htmlMode,
+                curState: html,
+                curClose: null}
+      },
+
+      copyState: function(state) {
+        var html = state.html, htmlNew = CodeMirror.copyState(htmlMode, html),
+            php = state.php, phpNew = CodeMirror.copyState(phpMode, php), cur;
+        if (state.curState == html) cur = htmlNew;
+        else if (state.curState == php) cur = phpNew;
+        else cur = CodeMirror.copyState(state.curMode, state.curState);
+        return {html: htmlNew, php: phpNew, curMode: state.curMode, curState: cur, curClose: state.curClose};
+      },
+
+      token: dispatch,
+
+      indent: function(state, textAfter) {
+        if ((state.curMode != phpMode && /^\s*<\//.test(textAfter)) ||
+            (state.curMode == phpMode && /^\?>/.test(textAfter)))
+          return htmlMode.indent(state.html, textAfter);
+        return state.curMode.indent(state.curState, textAfter);
+      },
+
+      electricChars: "/{}:"
+    }
+  });
+})();
+
+CodeMirror.defineMIME("application/x-httpd-php", "php");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/index.html	(revision 14585)
@@ -0,0 +1,96 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: sTeX mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="stex.js"></script>
+    <link rel="stylesheet" href="stex.css">
+    <style>.CodeMirror {background: #f8f8f8;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: sTeX mode</h1>
+     <form><textarea id="code" name="code">
+\begin{module}[id=bbt-size]
+\importmodule[balanced-binary-trees]{balanced-binary-trees}
+\importmodule[\KWARCslides{dmath/en/cardinality}]{cardinality}
+
+\begin{frame}
+  \frametitle{Size Lemma for Balanced Trees}
+  \begin{itemize}
+  \item
+    \begin{assertion}[id=size-lemma,type=lemma] 
+    Let $G=\tup{V,E}$ be a \termref[cd=binary-trees]{balanced binary tree} 
+    of \termref[cd=graph-depth,name=vertex-depth]{depth}$n>i$, then the set
+     $\defeq{\livar{V}i}{\setst{\inset{v}{V}}{\gdepth{v} = i}}$ of
+    \termref[cd=graphs-intro,name=node]{nodes} at 
+    \termref[cd=graph-depth,name=vertex-depth]{depth} $i$ has
+    \termref[cd=cardinality,name=cardinality]{cardinality} $\power2i$.
+   \end{assertion}
+  \item
+    \begin{sproof}[id=size-lemma-pf,proofend=,for=size-lemma]{via induction over the depth $i$.}
+      \begin{spfcases}{We have to consider two cases}
+        \begin{spfcase}{$i=0$}
+          \begin{spfstep}[display=flow]
+            then $\livar{V}i=\set{\livar{v}r}$, where $\livar{v}r$ is the root, so
+            $\eq{\card{\livar{V}0},\card{\set{\livar{v}r}},1,\power20}$.
+          \end{spfstep}
+        \end{spfcase}
+        \begin{spfcase}{$i>0$}
+          \begin{spfstep}[display=flow]
+           then $\livar{V}{i-1}$ contains $\power2{i-1}$ vertexes 
+           \begin{justification}[method=byIH](IH)\end{justification}
+          \end{spfstep}
+          \begin{spfstep}
+           By the \begin{justification}[method=byDef]definition of a binary
+              tree\end{justification}, each $\inset{v}{\livar{V}{i-1}}$ is a leaf or has
+            two children that are at depth $i$.
+          \end{spfstep}
+          \begin{spfstep}
+           As $G$ is \termref[cd=balanced-binary-trees,name=balanced-binary-tree]{balanced} and $\gdepth{G}=n>i$, $\livar{V}{i-1}$ cannot contain
+            leaves.
+          \end{spfstep}
+          \begin{spfstep}[type=conclusion]
+           Thus $\eq{\card{\livar{V}i},{\atimes[cdot]{2,\card{\livar{V}{i-1}}}},{\atimes[cdot]{2,\power2{i-1}}},\power2i}$.
+          \end{spfstep}
+        \end{spfcase}
+      \end{spfcases}
+    \end{sproof}
+  \item 
+    \begin{assertion}[id=fbbt,type=corollary]	
+      A fully balanced tree of depth $d$ has $\power2{d+1}-1$ nodes.
+    \end{assertion}
+  \item
+      \begin{sproof}[for=fbbt,id=fbbt-pf]{}
+        \begin{spfstep}
+          Let $\defeq{G}{\tup{V,E}}$ be a fully balanced tree
+        \end{spfstep}
+        \begin{spfstep}
+          Then $\card{V}=\Sumfromto{i}1d{\power2i}= \power2{d+1}-1$.
+        \end{spfstep}
+      \end{sproof}
+    \end{itemize}
+  \end{frame}
+\begin{note}
+  \begin{omtext}[type=conclusion,for=binary-tree]
+    This shows that balanced binary trees grow in breadth very quickly, a consequence of
+    this is that they are very shallow (and this compute very fast), which is the essence of
+    the next result.
+  \end{omtext}
+\end{note}
+\end{module}
+
+%%% Local Variables: 
+%%% mode: LaTeX
+%%% TeX-master: "all"
+%%% End: \end{document}
+</textarea></form>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {});
+    </script>
+
+    <p><strong>MIME types defined:</strong> <code>text/stex</code>.</p>
+
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.css	(revision 14585)
@@ -0,0 +1,20 @@
+span.css-at {color: #708;}
+span.css-unit {color: #281;}
+span.css-value {color: #708;}
+span.css-identifier {color: black;}
+span.css-selector {color: #11B;}
+span.css-important {color: #00F;}
+span.css-colorcode {color: #299;}
+span.css-comment {color: #A70;}
+span.css-string {color: #A22;}
+
+span.stex-unit { color: #281; }
+span.stex-identifier { color: black; }
+span.stex-slash { color: #FAA; }
+span.stex-command { color: #00F; }
+span.stex-comment { color: #A70; }
+span.stex-import { color: #00F; }
+span.stex-filepath { color: #852626; }
+span.stex-module { color: #852626; }
+span.stex-error { text-decoration: underline; color: red; }
+span.stex-string { color: #A22; }
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/stex/stex.js	(revision 14585)
@@ -0,0 +1,167 @@
+/*
+ * Author: Constantin Jucovschi (c.jucovschi@jacobs-university.de)
+ * Licence: MIT
+ */
+
+CodeMirror.defineMode("stex", function(cmCfg, modeCfg) 
+{    
+    function pushCommand(state, command) {
+	state.cmdState.push(command);
+    }
+
+    function peekCommand(state) { 
+	if (state.cmdState.length>0)
+	    return state.cmdState[state.cmdState.length-1];
+	else
+	    return null;
+    }
+
+    function popCommand(state) {
+	if (state.cmdState.length>0) {
+	    var plug = state.cmdState.pop();
+	    plug.closeBracket();
+	}	    
+    }
+
+    function applyMostPowerful(state) {
+      context = state.cmdState;
+      for (var i = context.length - 1; i >= 0; i--) {
+	  var plug = context[i];
+	  if (plug.name=="DEFAULT")
+	      continue;
+	  return plug.styleIdentifier();
+      }
+      return "stex-identifier";
+    }
+
+    function addPluginPattern(pluginName, cmdStyle, brackets, styles) {
+	return function () {
+	    this.name=pluginName;
+	    this.bracketNo = 0;
+	    this.style=cmdStyle;
+	    this.styles = styles;
+	    this.brackets = brackets;
+
+	    this.styleIdentifier = function(content) {
+		if (this.bracketNo<=this.styles.length)
+		    return this.styles[this.bracketNo-1];
+		else
+		    return null;
+	    };
+	    this.openBracket = function(content) {
+		this.bracketNo++;
+		return "stex-bracket";
+	    };
+	    this.closeBracket = function(content) {
+	    };
+	}
+    }
+
+    var plugins = new Array();
+   
+    plugins["importmodule"] = addPluginPattern("importmodule", "stex-command", "{[", ["stex-filepath", "stex-module"]);
+    plugins["documentclass"] = addPluginPattern("documentclass", "stex-command", "{[", ["", "stex-unit"]);
+    plugins["usepackage"] = addPluginPattern("documentclass", "stex-command", "[", ["stex-unit"]);
+    plugins["begin"] = addPluginPattern("documentclass", "stex-command", "[", ["stex-unit"]);
+    plugins["end"] = addPluginPattern("documentclass", "stex-command", "[", ["stex-unit"]);
+
+    plugins["DEFAULT"] = function () {
+	this.name="DEFAULT";
+	this.style="stex-command";
+
+	this.styleIdentifier = function(content) {
+	};
+	this.openBracket = function(content) {
+	};
+	this.closeBracket = function(content) {
+	};
+    };
+
+    function setState(state, f) {
+	state.f = f;
+    }
+
+    function normal(source, state) {
+	if (source.match(/^\\[a-z]+/)) {
+	    cmdName = source.current();
+	    cmdName = cmdName.substr(1, cmdName.length-1);
+	    var plug = plugins[cmdName];
+	    if (typeof(plug) == 'undefined') {
+		plug = plugins["DEFAULT"];
+	    }
+	    plug = new plug();
+	    pushCommand(state, plug);
+	    setState(state, beginParams);
+	    return plug.style;
+	}
+
+	var ch = source.next();
+	if (ch == "%") {
+	    setState(state, inCComment);
+	    return "stex-comment";
+	} 
+	else if (ch=='}' || ch==']') {
+	    plug = peekCommand(state);
+	    if (plug) {
+		plug.closeBracket(ch);
+		setState(state, beginParams);
+	    } else
+		return "stex-error";
+	    return "stex-bracket";
+	} else if (ch=='{' || ch=='[') {
+	    plug = plugins["DEFAULT"];	    
+	    plug = new plug();
+	    pushCommand(state, plug);
+	    return "stex-bracket";	    
+	}
+	else if (/\d/.test(ch)) {
+	    source.eatWhile(/[\w.%]/);
+	    return "stex-unit";
+	}
+	else {
+	    source.eatWhile(/[\w-_]/);
+	    return applyMostPowerful(state);
+	}
+    }
+
+    function inCComment(source, state) {
+	source.skipToEnd();
+	setState(state, normal);
+	return "css-comment";
+    }
+
+    function beginParams(source, state) {
+	var ch = source.peek();
+	if (ch == '{' || ch == '[') {
+	   lastPlug = peekCommand(state);
+	   style = lastPlug.openBracket(ch);
+	   source.eat(ch);
+	   setState(state, normal);
+	   return "stex-bracket";
+	}
+	if (/[ \t\r]/.test(ch)) {
+	    source.eat(ch);
+	    return null;
+	}
+	setState(state, normal);
+	lastPlug = peekCommand(state);
+	if (lastPlug) {
+	    popCommand(state);
+	}
+        return normal(source, state);
+    }
+
+    return {
+     startState: function() { return { f:normal, cmdState:[] }; },
+	 copyState: function(s) { return { f: s.f, cmdState: s.cmdState.slice(0, s.cmdState.length) }; },
+	 
+	 token: function(stream, state) {
+	 var t = state.f(stream, state);
+	 var w = stream.current();
+	 return t;
+     }
+ };
+});
+
+
+CodeMirror.defineMIME("text/x-stex", "stex");
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/index.html
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/index.html	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/index.html	(revision 14585)
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+  <head>
+    <title>CodeMirror 2: XML mode</title>
+    <link rel="stylesheet" href="../../lib/codemirror.css">
+    <script src="../../lib/codemirror.js"></script>
+    <script src="xml.js"></script>
+    <link rel="stylesheet" href="xml.css">
+    <style type="text/css">.CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}</style>
+    <link rel="stylesheet" href="../../css/docs.css">
+  </head>
+  <body>
+    <h1>CodeMirror 2: XML mode</h1>
+    <form><textarea id="code" name="code">
+&lt;html style="color: green"&gt;
+  &lt;!-- this is a comment --&gt;
+  &lt;head&gt;
+    &lt;title&gt;HTML Example&lt;/title&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    The indentation tries to be &lt;em&gt;somewhat &amp;quot;do what
+    I mean&amp;quot;&lt;/em&gt;... but might not match your style.
+  &lt;/body&gt;
+&lt;/html&gt;
+</textarea></form>
+    <script>
+      var editor = CodeMirror.fromTextArea(document.getElementById("code"), {mode: {name: "xml", htmlMode: true}});
+    </script>
+    <p>The XML mode supports two configuration parameters:</p>
+    <dl>
+      <dt><code>htmlMode (boolean)</code></dt>
+      <dd>This switches the mode to parse HTML instead of XML. This
+      means attributes do not have to be quoted, and some elements
+      (such as <code>br</code>) do not require a closing tag.</dd>
+      <dt><code>alignCDATA (boolean)</code></dt>
+      <dd>Setting this to true will force the opening tag of CDATA
+      blocks to not be indented.</dd>
+    </dl>
+
+    <p><strong>MIME types defined:</strong> <code>application/xml</code>, <code>text/html</code>.</p>
+  </body>
+</html>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.css	(revision 14585)
@@ -0,0 +1,7 @@
+span.xml-tag {color: #a0b;}
+span.xml-attribute {color: #281;}
+span.xml-attname {color: #00f;}
+span.xml-comment {color: #a70;}
+span.xml-cdata {color: #48a;}
+span.xml-processing {color: #999;}
+span.xml-entity {color: #a22;}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.js
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.js	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/codemirror/mode/xml/xml.js	(revision 14585)
@@ -0,0 +1,206 @@
+CodeMirror.defineMode("xml", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var Kludges = parserConfig.htmlMode ? {
+    autoSelfClosers: {"br": true, "img": true, "hr": true, "link": true, "input": true,
+                      "meta": true, "col": true, "frame": true, "base": true, "area": true},
+    doNotIndent: {"pre": true, "!cdata": true},
+    allowUnquoted: true
+  } : {autoSelfClosers: {}, doNotIndent: {"!cdata": true}, allowUnquoted: false};
+  var alignCDATA = parserConfig.alignCDATA;
+
+  // Return variables for tokenizers
+  var tagName, type;
+
+  function inText(stream, state) {
+    function chain(parser) {
+      state.tokenize = parser;
+      return parser(stream, state);
+    }
+
+    var ch = stream.next();
+    if (ch == "<") {
+      if (stream.eat("!")) {
+        if (stream.eat("[")) {
+          if (stream.match("[CDATA[")) return chain(inBlock("xml-cdata", "]]>"));
+          else return null;
+        }
+        else if (stream.match("--")) return chain(inBlock("xml-comment", "-->"));
+        else if (stream.match("DOCTYPE")) {
+          stream.eatWhile(/[\w\._\-]/);
+          return chain(inBlock("xml-doctype", ">"));
+        }
+        else return null;
+      }
+      else if (stream.eat("?")) {
+        stream.eatWhile(/[\w\._\-]/);
+        state.tokenize = inBlock("xml-processing", "?>");
+        return "xml-processing";
+      }
+      else {
+        type = stream.eat("/") ? "closeTag" : "openTag";
+        stream.eatSpace();
+        tagName = "";
+        var c;
+        while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c;
+        state.tokenize = inTag;
+        return "xml-tag";
+      }
+    }
+    else if (ch == "&") {
+      stream.eatWhile(/[^;]/);
+      stream.eat(";");
+      return "xml-entity";
+    }
+    else {
+      stream.eatWhile(/[^&<]/);
+      return null;
+    }
+  }
+
+  function inTag(stream, state) {
+    var ch = stream.next();
+    if (ch == ">" || (ch == "/" && stream.eat(">"))) {
+      state.tokenize = inText;
+      type = ch == ">" ? "endTag" : "selfcloseTag";
+      return "xml-tag";
+    }
+    else if (ch == "=") {
+      type = "equals";
+      return null;
+    }
+    else if (/[\'\"]/.test(ch)) {
+      state.tokenize = inAttribute(ch);
+      return state.tokenize(stream, state);
+    }
+    else {
+      stream.eatWhile(/[^\s\u00a0=<>\"\'\/?]/);
+      return "xml-word";
+    }
+  }
+
+  function inAttribute(quote) {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.next() == quote) {
+          state.tokenize = inTag;
+          break;
+        }
+      }
+      return "xml-attribute";
+    };
+  }
+
+  function inBlock(style, terminator) {
+    return function(stream, state) {
+      while (!stream.eol()) {
+        if (stream.match(terminator)) {
+          state.tokenize = inText;
+          break;
+        }
+        stream.next();
+      }
+      return style;
+    };
+  }
+
+  var curState, setStyle;
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) curState.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+
+  function pushContext(tagName, startOfLine) {
+    var noIndent = Kludges.doNotIndent.hasOwnProperty(tagName) || (curState.context && curState.context.noIndent);
+    curState.context = {
+      prev: curState.context,
+      tagName: tagName,
+      indent: curState.indented,
+      startOfLine: startOfLine,
+      noIndent: noIndent
+    };
+  }
+  function popContext() {
+    if (curState.context) curState.context = curState.context.prev;
+  }
+
+  function element(type) {
+    if (type == "openTag") {curState.tagName = tagName; return cont(attributes, endtag(curState.startOfLine));}
+    else if (type == "closeTag") {popContext(); return cont(endclosetag);}
+    else if (type == "xml-cdata") {
+      if (!curState.context || curState.context.name != "!cdata") pushContext("!cdata");
+      if (curState.tokenize == inText) popContext();
+      return cont();
+    }
+    else return cont();
+  }
+  function endtag(startOfLine) {
+    return function(type) {
+      if (type == "selfcloseTag" ||
+          (type == "endTag" && Kludges.autoSelfClosers.hasOwnProperty(curState.tagName.toLowerCase())))
+        return cont();
+      if (type == "endTag") {pushContext(curState.tagName, startOfLine); return cont();}
+      return cont();
+    };
+  }
+  function endclosetag(type) {
+    if (type == "endTag") return cont();
+    return pass();
+  }
+
+  function attributes(type) {
+    if (type == "xml-word") {setStyle = "xml-attname"; return cont(attributes);}
+    if (type == "equals") return cont(attvalue, attributes);
+    return pass();
+  }
+  function attvalue(type) {
+    if (type == "xml-word" && Kludges.allowUnquoted) {setStyle = "xml-attribute"; return cont();}
+    if (type == "xml-attribute") return cont();
+    return pass();
+  }
+
+  return {
+    startState: function() {
+      return {tokenize: inText, cc: [], indented: 0, startOfLine: true, tagName: null, context: null};
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        state.startOfLine = true;
+        state.indented = stream.indentation();
+      }
+      if (stream.eatSpace()) return null;
+
+      setStyle = type = tagName = null;
+      var style = state.tokenize(stream, state);
+      if ((style || type) && style != "xml-comment") {
+        curState = state;
+        while (true) {
+          var comb = state.cc.pop() || element;
+          if (comb(type || style)) break;
+        }
+      }
+      state.startOfLine = false;
+      return setStyle || style;
+    },
+
+    indent: function(state, textAfter) {
+      var context = state.context;
+      if (context && context.noIndent) return 0;
+      if (alignCDATA && /<!\[CDATA\[/.test(textAfter)) return 0;
+      if (context && /^<\//.test(textAfter))
+        context = context.prev;
+      while (context && !context.startOfLine)
+        context = context.prev;
+      if (context) return context.indent + indentUnit;
+      else return 0;
+    },
+
+    electricChars: "/"
+  };
+});
+
+CodeMirror.defineMIME("application/xml", "xml");
+CodeMirror.defineMIME("text/html", {name: "xml", htmlMode: true});
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/css.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/css.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/css.inc.php	(revision 14585)
@@ -0,0 +1,127 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+if ((isset($_POST['edit'])) and !is_numeric($_POST['file_to_edit']))
+{
+  $edited_file = $_POST['file_to_edit'];
+}
+elseif (isset($_POST['edited_file']))
+{
+  $edited_file = $_POST['edited_file'];
+}
+elseif (isset($_GET['theme']) and in_array($_GET['theme'], array_keys(get_pwg_themes(true))))
+{
+  $edited_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . 'css/'.$_GET['theme'].'-rules.css';
+}
+else
+{
+  $edited_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . 'css/'.get_default_theme().'-rules.css';
+}
+
+if (file_exists($edited_file))
+{
+  $content_file = file_get_contents($edited_file);
+}
+else
+{
+  $content_file = "/* " . l10n('locfiledit_newfile') . " */\n\n";
+}
+
+$selected = 0; 
+// $options[] = l10n('locfiledit_choose_file');
+// $options[] = '----------------------';
+$value = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . "css/rules.css";
+
+$options[$value] = (file_exists($value) ? '&#x2714;' : '&#x2718;').' local / css / rules.css';
+if ($edited_file == $value)
+{
+  $selected = $value;
+}
+
+// themes are displayed in the same order as on screen
+// [Administration > Configuration > Themes]
+
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+$themes = new themes();
+$themes->sort_fs_themes();
+$default_theme = get_default_theme();
+$db_themes = $themes->get_db_themes();
+
+$db_theme_ids = array();
+foreach ($db_themes as $db_theme)
+{
+  array_push($db_theme_ids, $db_theme['id']);
+}
+
+$active_themes = array();
+$inactive_themes = array();
+
+foreach ($themes->fs_themes as $theme_id => $fs_theme)
+{
+  if ($theme_id == 'default')
+  {
+    continue;
+  }
+
+  if (in_array($theme_id, $db_theme_ids))
+  {
+    if ($theme_id == $default_theme)
+    {
+      array_unshift($active_themes, $fs_theme);
+    }
+    else
+    {
+      array_push($active_themes, $fs_theme);
+    }
+  }
+  else
+  {
+    array_push($inactive_themes, $fs_theme);
+  }
+}
+
+$options[] = '';
+$options[] = '----- '.l10n('Active Themes').' -----';
+$options[] = '';
+foreach ($active_themes as $theme)
+{
+  $value = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . 'css/'.$theme['id'].'-rules.css';
+
+  $options[$value] = (file_exists($value) ? '&#x2714;' : '&#x2718;').' '.$theme['name'];
+
+  if ($default_theme == $theme['id'])
+  {
+    $options[$value].= ' ('.l10n('default').')';
+  }
+  
+  if ($edited_file == $value)
+  {
+    $selected = $value;
+  }
+}
+
+$options[] = '';
+$options[] = '----- '.l10n('Inactive Themes').' -----';
+$options[] = '';
+foreach ($inactive_themes as $theme)
+{
+  $value = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . 'css/'.$theme['id'].'-rules.css';
+
+  $options[$value] = (file_exists($value) ? '&#x2714;' : '&#x2718;').' '.$theme['name'];
+  
+  if ($edited_file == $value)
+  {
+    $selected = $value;
+  }
+}
+
+$template->assign('css_lang_tpl', array(
+  'OPTIONS' => $options,
+  'SELECTED' => $selected
+  )
+);
+
+$codemirror_mode = 'text/css';
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/functions.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/functions.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/functions.inc.php	(revision 14585)
@@ -0,0 +1,114 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns $code if php syntax is correct
+ * else return false
+ *
+ * @param string php code
+ */
+function eval_syntax($code)
+{
+  $code = str_replace(array('<?php', '?>'), '', $code);
+  if (function_exists('token_get_all'))
+  {
+    $b = 0;
+    foreach (token_get_all($code) as $token)
+    {
+      if ('{' == $token) ++$b;
+      else if ('}' == $token) --$b;
+    }
+    if ($b) return false;
+    else
+    {
+      ob_start();
+      $eval = eval('if(0){' . $code . '}');
+      ob_end_clean();
+      if ($eval === false) return false;
+    }
+  }
+  return '<?php' . $code . '?>';
+}
+
+/**
+ * returns true or false if $str is bool
+  * returns $str if $str is integer
+ * else "$str"
+ *
+ * @param string
+ */
+function editarea_quote($value)
+{
+  switch (gettype($value))
+  {
+    case "boolean":
+      return $value ? 'true' : 'false';
+    case "integer":
+      return $value;
+    default:
+      return '"'.$value.'"';
+  }
+}
+
+/**
+ * returns bak file for restore
+ * @param string
+ */
+function get_bak_file($file)
+{
+  if (get_extension($file) == 'php')
+  {
+    return substr_replace($file, '.bak', strrpos($file , '.'), 0);
+  }
+  else
+  {
+    return $file . '.bak';
+  }
+}
+
+/**
+ * returns dirs and subdirs
+ * retun array
+ * @param string
+ */
+function get_rec_dirs($path='')
+{
+  $options = array();
+  if (is_dir($path))
+  {
+    $fh = opendir($path);
+    while ($file = readdir($fh))
+    {
+      $pathfile = $path . '/' . $file;
+      if ($file != '.' and $file != '..' and $file != '.svn' and is_dir($pathfile))
+      {
+        $options[$pathfile] = str_replace(array('./', '/'), array('', ' / '), $pathfile);
+        $options = array_merge($options, get_rec_dirs($pathfile));
+      }
+    }
+    closedir($fh);
+  }
+  return $options;
+}
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/lang.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/lang.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/lang.inc.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+$edited_file = isset($_POST['edited_file']) ? $_POST['edited_file'] : '';
+$content_file = '';
+
+if ((isset($_POST['edit'])) and !is_numeric($_POST['file_to_edit']))
+{
+  $edited_file = $_POST['file_to_edit'];
+  if (file_exists($edited_file))
+  {
+    $content_file = file_get_contents($edited_file);
+  }
+  else
+  {
+    $content_file = "<?php\n\n/* ".l10n('locfiledit_newfile')." */\n\n\n\n\n?>";
+  }
+}
+
+$selected = 0; 
+$options[] = l10n('locfiledit_choose_file');
+$options[] = '----------------------';
+foreach (get_languages() as $language_code => $language_name)
+{
+  $value = PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'language/'.$language_code.'.lang.php';
+  if ($edited_file == $value)
+  {
+    $selected = $value;
+    $template->assign('show_default', array(
+      array(
+        'URL' => LOCALEDIT_PATH.'show_default.php?file=language/'.$language_code.'/common.lang.php',
+        'FILE' => 'common.lang.php'
+        ),
+      array(
+        'URL' => LOCALEDIT_PATH.'show_default.php?file=language/'.$language_code.'/admin.lang.php',
+        'FILE' => 'admin.lang.php'
+        )
+      )
+    );
+  }
+  $options[$value] = $language_name;
+}
+
+$template->assign('css_lang_tpl', array(
+    'OPTIONS' => $options,
+    'SELECTED' => $selected
+    )
+  );
+
+$codemirror_mode = 'application/x-httpd-php';
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/localconf.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/localconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/localconf.inc.php	(revision 14585)
@@ -0,0 +1,26 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+$edited_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR . "config/config.inc.php";
+
+if (file_exists($edited_file))
+{
+  $content_file = file_get_contents($edited_file);
+}
+else
+{
+  $content_file = "<?php\n\n/* ".l10n('locfiledit_newfile')." */\n\n\n\n\n?>";
+}
+
+$template->assign('show_default', array(
+  array(
+    'URL' => LOCALEDIT_PATH.'show_default.php?file=include/config_default.inc.php',
+    'FILE' => 'config_default.inc.php'
+    )
+  )
+);
+
+$codemirror_mode = 'application/x-httpd-php';
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/plug.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/plug.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/plug.inc.php	(revision 14585)
@@ -0,0 +1,25 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+$edited_file = PHPWG_PLUGINS_PATH . "PersonalPlugin/main.inc.php";
+
+if (file_exists($edited_file))
+{
+  $content_file = file_get_contents($edited_file);
+}
+else
+{
+  $content_file = "<?php\n/*
+Plugin Name: " . l10n('locfiledit_onglet_plug') . "
+Version: 1.0
+Description: " . l10n('locfiledit_onglet_plug') . "
+Plugin URI: http://piwigo.org
+Author:
+Author URI:
+*/\n\n\n\n\n?>";
+}
+
+$codemirror_mode = 'application/x-httpd-php';
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/include/tpl.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/include/tpl.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/include/tpl.inc.php	(revision 14585)
@@ -0,0 +1,140 @@
+<?php
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+
+$edited_file = isset($_POST['edited_file']) ? $_POST['edited_file'] : '';
+$content_file = '';
+
+if ((isset($_POST['edit'])) and !is_numeric($_POST['file_to_edit']))
+{
+  $edited_file = $_POST['file_to_edit'];
+  if (file_exists($edited_file))
+  {
+    $content_file = file_get_contents($edited_file);
+  }
+  else
+  {
+    $content_file = '';
+  }
+}
+
+$newfile_page = isset($_GET['newfile']);
+
+// Edit new tpl file
+if (isset($_POST['create_tpl']))
+{
+  $filename = $_POST['tpl_name'];
+  if (empty($filename))
+  {
+    array_push($page['errors'], l10n('locfiledit_empty_filename'));
+  }
+  if (get_extension($filename) != 'tpl')
+  {
+    $filename .= '.tpl';
+  }
+  if (!preg_match('/^[a-zA-Z0-9-_.]+$/', $filename))
+  {
+    array_push($page['errors'], l10n('locfiledit_filename_error'));
+  }
+  if (is_numeric($_POST['tpl_model']) and $_POST['tpl_model'] != '0')
+  {
+    array_push($page['errors'], l10n('locfiledit_model_error'));
+  }
+  if (file_exists($_POST['tpl_parent'] . '/' . $filename))
+  {
+    array_push($page['errors'], l10n('locfiledit_file_already_exists'));
+  }
+  if (!empty($page['errors']))
+  {
+    $newfile_page = true;
+  }
+  else
+  {
+    $edited_file = $_POST['tpl_parent'] . '/' . $filename;
+    $content_file = ($_POST['tpl_model'] == '0') ? '' : file_get_contents($_POST['tpl_model']);
+  }
+}
+
+if ($newfile_page)
+{
+  $filename = isset($_POST['tpl_name']) ? $_POST['tpl_name'] : '';
+  $selected['model'] = isset($_POST['tpl_model']) ? $_POST['tpl_model'] : '0';
+  $selected['parent'] = isset($_POST['tpl_parent']) ? $_POST['tpl_parent'] : PHPWG_ROOT_PATH . 'template-extension';
+
+  // Parent directories list
+  $options['parent'] = array(PHPWG_ROOT_PATH . 'template-extension' => 'template-extension');
+  $options['parent'] = array_merge($options['parent'], get_rec_dirs(PHPWG_ROOT_PATH . 'template-extension'));
+
+  $options['model'][] = l10n('locfiledit_empty_page');
+  $options['model'][] = '----------------------';
+  $i = 0;
+  foreach (get_extents() as $pwg_template)
+  {
+    $value = PHPWG_ROOT_PATH . 'template-extension/' . $pwg_template;
+    $options['model'][$value] =  'template-extension / ' . str_replace('/', ' / ', $pwg_template);
+    $i++;
+  }
+  foreach (get_dirs($conf['themes_dir']) as $theme_id)
+  {
+    if ($i)
+    {
+      $options['model'][] = '----------------------';
+      $i = 0;
+    }
+    $dir = $conf['themes_dir'] . '/' . $theme_id . '/template/';
+    if (is_dir($dir) and $content = opendir($dir))
+    {
+      while ($node = readdir($content))
+      {
+        if (is_file($dir.$node) and get_extension($node) == 'tpl')
+        {
+          $value = $dir . $node;
+          $options['model'][$value] = $theme_id . ' / ' . $node;
+          $i++;
+        }
+      }
+    }
+  }
+  if (end($options['model']) == '----------------------')
+  {
+    array_pop($options['model']);
+  }
+  // Assign variables to template
+  $template->assign('create_tpl', array(
+    'NEW_FILE_NAME' => $filename,
+    'MODEL_OPTIONS' => $options['model'],
+    'MODEL_SELECTED' => $selected['model'],
+    'PARENT_OPTIONS' => $options['parent'],
+    'PARENT_SELECTED' => $selected['parent']
+    )
+  );
+}
+else
+{
+  // List existing template extensions
+  $selected = 0; 
+  $options[] = l10n('locfiledit_choose_file');
+  $options[] = '----------------------';
+  foreach (get_extents() as $pwg_template)
+  {
+    $value = './template-extension/' . $pwg_template;
+    $options[$value] =  str_replace('/', ' / ', $pwg_template);
+    if ($edited_file == $value) $selected = $value;
+  }
+  if ($selected == 0 and !empty($edited_file))
+  {
+    $options[$edited_file] =  str_replace(array('./template-extension/', '/'), array('', ' / '), $edited_file);
+    $selected = $edited_file;
+  }
+  $template->assign('css_lang_tpl', array(
+    'OPTIONS' => $options,
+    'SELECTED' => $selected,
+    'NEW_FILE_URL' => $my_base_url.'-tpl&amp;newfile',
+    'NEW_FILE_CLASS' => empty($edited_file) ? '' : 'top_right'
+    )
+  );
+}
+
+$codemirror_mode = 'text/html';
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ar_SA/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'تهيئة محلية';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'القوالب';
+$lang['locfiledit_onglet_lang'] = 'اللغة';
+$lang['locfiledit_onglet_plug'] = 'مساعد شخصي';
+$lang['locfiledit_cant_save'] = 'الملف المحلي قابل او غير غابر للكتابه ، تأكد من الوصول و الكتابة الى المجلد"include/"';
+$lang['locfiledit_newfile'] = 'الملف غير موجود ، سوف يتم إنشاءه عن طريق تحرير الملفات المحلي';
+$lang['locfiledit_save_config'] = 'تمت كتابة الملف بنجاح .';
+$lang['locfiledit_show_default'] = 'عرض مرجع الملف :  ';
+$lang['locfiledit_save_bak'] = 'نسخة احتياطية أنشأت عن طريق الحفظ ';
+$lang['locfiledit_saved_bak'] = ' (%s) تم إنشاء  نسخة احتياطية من الملف';
+$lang['locfiledit_save_file'] = 'حفظ الملف ';
+$lang['locfiledit_choose_file'] = 'حدد ملف لتحريره ';
+$lang['locfiledit_edit'] = 'تحرير';
+$lang['locfiledit_restore'] = 'استعادة من  النسخة الاحتياطية';
+$lang['locfiledit_restore_confirm'] = 'نجرو التأكيد؟استعادة الملف كي يتم الحفظ في ملفات تالية';
+$lang['locfiledit_bak_loaded1'] = 'تم تحميل التخسة الاحتياطية';
+$lang['locfiledit_bak_loaded2'] = 'يجب حفظه ليتم استعادته ';
+$lang['locfiledit_syntax_error'] = 'خطأ في تركيب الجمل ، لا / يمكن حفظ المف';
+$lang['locfiledit_new_tpl'] = 'أنشأ ملف جديد';
+$lang['locfiledit_new_filename'] = 'أسم الملف';
+$lang['locfiledit_model'] = 'نموذج';
+$lang['locfiledit_empty_page'] = 'صفحة فارغه';
+$lang['locfiledit_parent_directory'] = 'أصل الدليل';
+$lang['locfiledit_filename_error'] = 'الحروف الغير مسموح بها في أسم الملف ';
+$lang['locfiledit_file_already_exists'] = 'الملف الموجود';
+$lang['locfiledit_model_error'] = 'يجب أختيار نموذج';
+$lang['locfiledit_empty_filename'] = 'يجب كتابة أسم الملف';
+$lang['locfiledit_webmaster_only'] = 'فقط مدير الموقع يمكن استخدام محرر الملفات المحلي';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Edita els teus arxius locals des del panell d'administraci&oacute;.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ca_ES/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_bak_loaded2'] = 'Cal que desis l\'arxiu per tal de poder-lo restaurar.';
+$lang['locfiledit_edit'] = 'Editar';
+$lang['locfiledit_file_already_exists'] = 'Aquest arxiu ja existeix.';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_new_filename'] = 'Nom d\'arxiu';
+$lang['locfiledit_new_tpl'] = 'Crear un nou arxiu';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Idiomes';
+$lang['locfiledit_onglet_localconf'] = 'Configuració local';
+$lang['locfiledit_onglet_plug'] = 'Complement personal';
+$lang['locfiledit_onglet_tpl'] = 'Plantilles';
+$lang['locfiledit_bak_loaded1'] = 'Arxiu de còpia de seguretat carregat.';
+$lang['locfiledit_cant_save'] = 'L\'arxiu actual no té permís d\'escriptura. Comprova si el directori "local/" disposa d\'aquest permís (chmod).';
+$lang['locfiledit_choose_file'] = 'Tria l\'arxiu a editar';
+$lang['locfiledit_empty_filename'] = 'Has d\'escriure el nom del fitxer.';
+$lang['locfiledit_empty_page'] = 'Pàgina en blanc';
+$lang['locfiledit_filename_error'] = 'Caracters prohibits en el nom del fitxer.';
+$lang['locfiledit_model_error'] = 'Has de triar un model.';
+$lang['locfiledit_newfile'] = 'El fitxer no existeix i serà creat per LocalFiles Editor';
+$lang['locfiledit_parent_directory'] = 'Directori pare';
+$lang['locfiledit_restore_confirm'] = 'Si us plau, confirma-ho?
+La restauració no serà efectiva fins que sigui desat.';
+$lang['locfiledit_restore'] = 'Restaura l\'arxiu de còpia de seguretat';
+$lang['locfiledit_save_bak'] = 'Es crearà una còpia de seguretat en el moment en què sigui desat.';
+$lang['locfiledit_save_config'] = 'L\'arxiu ha estat escrit correctament.';
+$lang['locfiledit_save_file'] = 'Desa el fitxer';
+$lang['locfiledit_saved_bak'] = 'Arxiu de còpia de seguretat creat (%s)';
+$lang['locfiledit_show_default'] = 'Mostra el fitxer de referència:';
+$lang['locfiledit_syntax_error'] = 'Error de sintaxi! L\'arxiu no es pot desar.';
+$lang['locfiledit_webmaster_only'] = 'Només els administradors web poden crear o modificar arxius locals.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Editujte lokální soubory z administračního panelu.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/cs_CZ/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// | plugin LocalFilesEditor ,czech lang by webprostor.eu                  |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokální konfigurace';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Šablony';
+$lang['locfiledit_onglet_lang'] = 'Jazyky';
+$lang['locfiledit_onglet_plug'] = 'Vlastní pluginy';
+$lang['locfiledit_cant_save'] = 'Vybraný soubor nelze přepsat.Zkontrolujte jestli je složka "local/" zapisovatelná (chmod).';
+$lang['locfiledit_newfile'] = 'Soubor neexistuje a bude vytvořen LocalFiles Editorem';
+$lang['locfiledit_save_config'] = 'Soubor byl změněn.';
+$lang['locfiledit_show_default'] = 'Zobraz referenční soubor: ';
+$lang['locfiledit_save_bak'] = 'Záloha bude vytvořena při uložení.';
+$lang['locfiledit_saved_bak'] = 'Záloha vytvořena (%s)';
+$lang['locfiledit_save_file'] = 'Uložit soubor';
+$lang['locfiledit_choose_file'] = 'Vyber soubor k editaci';
+$lang['locfiledit_edit'] = 'Editace';
+$lang['locfiledit_restore'] = 'Obnovit ze zálohy';
+$lang['locfiledit_restore_confirm'] = 'Prosím potvrďte?Obnova nebude mít efekt do dalšího uložení.';
+$lang['locfiledit_bak_loaded1'] = 'Záložní soubor nahrán.';
+$lang['locfiledit_bak_loaded2'] = 'Musíte nejprve soubor uložit aby mohl být obnoven.';
+$lang['locfiledit_syntax_error'] = 'Syntax error! Soubor nemůže být uložen.';
+$lang['locfiledit_new_tpl'] = 'Vytvořit nový soubor';
+$lang['locfiledit_new_filename'] = 'Název souboru';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Prázdná stránka';
+$lang['locfiledit_parent_directory'] = 'Nadřazená složka';
+$lang['locfiledit_filename_error'] = 'Nepovolené znaky v názvu souboru.';
+$lang['locfiledit_file_already_exists'] = 'Soubor už existuje.';
+$lang['locfiledit_model_error'] = 'Musíte zvolit model.';
+$lang['locfiledit_empty_filename'] = 'Musíte vyplnit název souboru.';
+$lang['locfiledit_webmaster_only'] = 'Pouze webmaster může vytvářet nebo měnit lokální soubory.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Editiert lokale Dateien aus der Administratoroberfläche heraus.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/de_DE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokale Konfiguration';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Vorlagen';
+$lang['locfiledit_onglet_lang'] = 'Sprachen';
+$lang['locfiledit_onglet_plug'] = 'Persönliche Plugin';
+$lang['locfiledit_cant_save'] = 'Aktuelle Datei ist nicht überschreibbar. Prüfen Sie ob Schreibrechte für das Verzeichnis "local/" bestehen (chmod)';
+$lang['locfiledit_newfile'] = 'Die Datei ist nicht vorhanden und wird erstellt vom Localfiles Editor';
+$lang['locfiledit_save_config'] = 'Datei erfolgreich geschrieben.';
+$lang['locfiledit_show_default'] = 'Zeige Referenz-Datei: ';
+$lang['locfiledit_save_bak'] = 'Backup-Kopie wird beim Speichern erstellt.';
+$lang['locfiledit_saved_bak'] = 'Backup-Datei erstellt (%s)';
+$lang['locfiledit_save_file'] = 'Datei speichern';
+$lang['locfiledit_choose_file'] = 'Wählen Sie eine Datei zum bearbeiten aus';
+$lang['locfiledit_edit'] = 'Bearbeiten';
+$lang['locfiledit_restore'] = 'Wiederherstellung der Backup-Datei';
+$lang['locfiledit_restore_confirm'] = 'Bitte bestätigen?
+Wiederherstellung wird nicht wirksam sein bis zum nächsten speichern.';
+$lang['locfiledit_bak_loaded1'] = 'Backup-Datei geladen.';
+$lang['locfiledit_bak_loaded2'] = 'Sie müssen die Datei speichern um sie wiederherstellen zu können.';
+$lang['locfiledit_syntax_error'] = 'Syntax-Fehler! Datei kann nicht gespeichert werden.';
+$lang['locfiledit_new_tpl'] = 'Erstelle eine neue Datei';
+$lang['locfiledit_new_filename'] = 'Dateiname';
+$lang['locfiledit_model'] = 'Modell';
+$lang['locfiledit_empty_page'] = 'Leere Seite';
+$lang['locfiledit_parent_directory'] = 'Übergeordnetes Verzeichnis';
+$lang['locfiledit_filename_error'] = 'Verbotene Zeichen im Dateinamen.';
+$lang['locfiledit_file_already_exists'] = 'Datei ist bereits vorhanden.';
+$lang['locfiledit_model_error'] = 'Sie müssen ein Modell wählen.';
+$lang['locfiledit_empty_filename'] = 'Sie müssen einen Dateiname eingeben.';
+$lang['locfiledit_webmaster_only'] = 'Nur Webmaster können lokale Dateien erstellen oder editieren.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Edit local files from administration panel.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/en_UK/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Local config';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Templates';
+$lang['locfiledit_onglet_lang'] = 'Languages';
+$lang['locfiledit_onglet_plug'] = 'Personal Plugin';
+$lang['locfiledit_cant_save'] = 'Current file isn\'t writeable. Check if a directory "local/" is writeable (chmod).';
+$lang['locfiledit_newfile'] = 'File is not existing and will be created by LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'File written successfully.';
+$lang['locfiledit_show_default'] = 'Display reference file: ';
+$lang['locfiledit_save_bak'] = 'Backup copy will be created on save.';
+$lang['locfiledit_saved_bak'] = 'Backup file created (%s)';
+$lang['locfiledit_save_file'] = 'Save file';
+$lang['locfiledit_choose_file'] = 'Choose the file to be edited';
+$lang['locfiledit_edit'] = 'Edit';
+$lang['locfiledit_restore'] = 'Restore the backup file';
+$lang['locfiledit_restore_confirm'] = 'Please confirm?
+Restore won\'t be effective till next save.';
+$lang['locfiledit_bak_loaded1'] = 'Backup file loaded.';
+$lang['locfiledit_bak_loaded2'] = 'You must save file to restore it.';
+$lang['locfiledit_syntax_error'] = 'Syntax error! File can\'t be saved.';
+$lang['locfiledit_new_tpl'] = 'Create new file';
+$lang['locfiledit_new_filename'] = 'File name';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Empty page';
+$lang['locfiledit_parent_directory'] = 'Parent directory';
+$lang['locfiledit_filename_error'] = 'Forbidden characters in file name.';
+$lang['locfiledit_file_already_exists'] = 'File already exists.';
+$lang['locfiledit_model_error'] = 'You must choose a model.';
+$lang['locfiledit_empty_filename'] = 'You must fill file name.';
+$lang['locfiledit_webmaster_only'] = 'Only webmasters can create or modify local files.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Edita tus archivos locales desde el panel de administración.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/es_ES/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Configuración local';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Plantillas';
+$lang['locfiledit_onglet_lang'] = 'Idiomas';
+$lang['locfiledit_onglet_plug'] = 'Plugin personal';
+$lang['locfiledit_cant_save'] = 'No ha sido posible guardar el archivo. Verifique los permisos (chmod) del directorio "local/".';
+$lang['locfiledit_newfile'] = 'El archivo no existe y será creado la primera vez que lo guarde';
+$lang['locfiledit_save_config'] = 'El archivo ha sido guardado.';
+$lang['locfiledit_show_default'] = 'Editar el archivo ';
+$lang['locfiledit_save_bak'] = 'Antes de guardar, se creará una copia de seguridad';
+$lang['locfiledit_saved_bak'] = 'Se ha creado una copia de seguridad (%s)';
+$lang['locfiledit_save_file'] = 'Guardar el archivo';
+$lang['locfiledit_choose_file'] = 'Seleccione el archivo que desea editar';
+$lang['locfiledit_edit'] = 'Editar';
+$lang['locfiledit_restore'] = 'Cargar la copia de seguridad';
+$lang['locfiledit_restore_confirm'] = '¿Confirma que desea cargar la copia de seguridad?
+Posteriormente deberá hacer clic en Guardar para restaurarla.';
+$lang['locfiledit_bak_loaded1'] = 'Se ha cargado la copia de seguridad';
+$lang['locfiledit_bak_loaded2'] = 'Para conservar la la copia de seguridad debe guardar el archivo.';
+$lang['locfiledit_syntax_error'] = 'Error de sintaxis. No es posible guardar el archivo.';
+$lang['locfiledit_new_tpl'] = 'Crear un nuevo archivo ';
+$lang['locfiledit_new_filename'] = 'Nombre del archivo ';
+$lang['locfiledit_model'] = 'Modelo ';
+$lang['locfiledit_empty_page'] = 'Página en blanco';
+$lang['locfiledit_parent_directory'] = 'Directorio de nivel superior';
+$lang['locfiledit_filename_error'] = 'El nombre de archivo tiene caracteres no permitidos.';
+$lang['locfiledit_file_already_exists'] = 'El archivo ya existe.';
+$lang['locfiledit_model_error'] = 'Por favor, seleccione un modelo.';
+$lang['locfiledit_empty_filename'] = 'Por favor, indique un nombre de archivo.';
+$lang['locfiledit_webmaster_only'] = 'Sólo los administradores pueden crear o modificar fichero locales.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Editez vos fichiers locaux à partir du panneau d'administration.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/fr_FR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Configuration locale';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Templates';
+$lang['locfiledit_onglet_lang'] = 'Langues';
+$lang['locfiledit_onglet_plug'] = 'Plugin Personnel';
+$lang['locfiledit_cant_save'] = 'Impossible d\'écrire le fichier. Vérifiez les permissions (chmod) du dossier "local/".';
+$lang['locfiledit_newfile'] = 'Dans cette fenêtre, écrivez les informations pour configurer votre galerie Piwigo.';
+$lang['locfiledit_save_config'] = 'Le fichier a été enregistré.';
+$lang['locfiledit_show_default'] = 'Afficher le fichier ';
+$lang['locfiledit_save_bak'] = 'Une copie de sauvegarde du fichier sera créée lors de l\'enregistrement';
+$lang['locfiledit_saved_bak'] = 'Une copie de sauvegarde a été créée (%s)';
+$lang['locfiledit_save_file'] = 'Enregistrer le fichier';
+$lang['locfiledit_choose_file'] = 'Choisissez un fichier à éditer';
+$lang['locfiledit_edit'] = 'Editer';
+$lang['locfiledit_restore'] = 'Charger le fichier de sauvegarde';
+$lang['locfiledit_restore_confirm'] = 'Souaitez-vous charger le fichier de sauvegarde?
+Vous devrez ensuite cliquer sur Enregistrer pour le restaurer.';
+$lang['locfiledit_bak_loaded1'] = 'Fichier de sauvegarde chargé';
+$lang['locfiledit_bak_loaded2'] = 'Vous devez l\'enregistrer pour le sauvegarder.';
+$lang['locfiledit_syntax_error'] = 'Erreur de syntaxe! Impossible d\'enregistrer le fichier.';
+$lang['locfiledit_new_tpl'] = 'Créer un nouveau fichier';
+$lang['locfiledit_new_filename'] = 'Nom du fichier';
+$lang['locfiledit_model'] = 'Modèle';
+$lang['locfiledit_empty_page'] = 'Page vierge';
+$lang['locfiledit_parent_directory'] = 'Dossier parent';
+$lang['locfiledit_filename_error'] = 'Caractères interdits dans le nom du fichier.';
+$lang['locfiledit_file_already_exists'] = 'Le fichier existe déjà.';
+$lang['locfiledit_model_error'] = 'Veuillez sélectionner un modèle.';
+$lang['locfiledit_empty_filename'] = 'Veuillez indiquer un nom de fichier.';
+$lang['locfiledit_webmaster_only'] = 'Seuls les webmasters sont autorisés à créer ou modifier les fichiers locaux.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+ערוך קבצים מקומיים מהפאנל ניהול.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/he_IL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'הגדרות מקומיות';
+$lang['locfiledit_onglet_css'] = 'גיליונות סגנון מדורגים(CSS)';
+$lang['locfiledit_onglet_tpl'] = 'תבניות';
+$lang['locfiledit_onglet_lang'] = 'ספות';
+$lang['locfiledit_onglet_plug'] = 'תוסף אישי';
+$lang['locfiledit_cant_save'] = 'לא ניתן לשנות את הקובץ. בדוק אם לתיקיה "local/" יש הרשאות לכתיבה (chmod).';
+$lang['locfiledit_newfile'] = 'הקובץ לא קיים, הקובץ ייווצר על ידי עורך הקבצים המקומיים (localfile)';
+$lang['locfiledit_save_config'] = 'הקובץ נכתב בהצלחה.';
+$lang['locfiledit_show_default'] = 'הצג את ההפניה לקובץ: ';
+$lang['locfiledit_save_bak'] = 'עותק גיבוי יווצר בעת השמירה.';
+$lang['locfiledit_saved_bak'] = 'קובץ גיבוי שנוצר (%s)';
+$lang['locfiledit_save_file'] = 'שמור קובץ';
+$lang['locfiledit_choose_file'] = 'בחר את הקובץ לעריכה';
+$lang['locfiledit_edit'] = 'ערוך';
+$lang['locfiledit_restore'] = 'שחזר את קובץ הגיבוי';
+$lang['locfiledit_restore_confirm'] = 'אשר בבקשה? שיחזור קובץ הגיבוי לא יהיה אפקטיבי עד השמירה הבאה.';
+$lang['locfiledit_bak_loaded1'] = 'קובץ גיבוי נטען.';
+$lang['locfiledit_bak_loaded2'] = 'אתה חייב לשמור את הקובץ בכדי לשחזר.';
+$lang['locfiledit_syntax_error'] = 'שגיאה תחבירית! לא ניתן לשמור את הקובץ.';
+$lang['locfiledit_new_tpl'] = 'צור קובץ חדש';
+$lang['locfiledit_new_filename'] = 'שם הקובץ';
+$lang['locfiledit_model'] = 'דגם';
+$lang['locfiledit_empty_page'] = 'דף ריק';
+$lang['locfiledit_parent_directory'] = 'מקור';
+$lang['locfiledit_filename_error'] = 'אסור תווים בשם הקובץ.';
+$lang['locfiledit_file_already_exists'] = 'הקובץ כבר קיים.';
+$lang['locfiledit_model_error'] = 'אתה חייב לחבחור דגם.';
+$lang['locfiledit_empty_filename'] = 'אתה חייב למלא את שם הקובץ.';
+$lang['locfiledit_webmaster_only'] = 'רק מנהל האתר יכול ליצור או לשנות קבצים מקומיים.';
+$lang['locfiledit_filename_error'] = 'אסור להשתמש בתווים מסויימים בשם הקובץ.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Uredivanje lokalnih datoteka iz panela za administraciju.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hr_HR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+$lang['locfiledit_onglet_localconf'] = 'Lokalno podešavanje';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Predlošci';
+$lang['locfiledit_onglet_lang'] = 'Jezici';
+$lang['locfiledit_onglet_plug'] = 'Osobni plugin';
+$lang['locfiledit_cant_save'] = 'Trenutna datoteka ne može se zapisati. Provjerite može li se zapisivati u mapu "local/" (chmod).';
+$lang['locfiledit_newfile'] = 'Datoteka ne postoji i bit ce kreirana pomocu LocalFiles Editor-a';
+$lang['locfiledit_save_config'] = 'Datoteka uspješno zapisana.';
+$lang['locfiledit_show_default'] = 'Prikaži referentnu datoteku: ';
+$lang['locfiledit_save_bak'] = 'Sigurnosna kopija ce biti kreirana kod spremanja.';
+$lang['locfiledit_saved_bak'] = 'Sigurnosna kopija kreirana (%s)';
+$lang['locfiledit_save_file'] = 'Spremi datoteku';
+$lang['locfiledit_choose_file'] = 'Odaberi datoteku za uredivanje';
+$lang['locfiledit_edit'] = 'Uredi';
+$lang['locfiledit_restore'] = 'Vrati sigurnosnu kopiju datoteke';
+$lang['locfiledit_restore_confirm'] = 'Molimo potvrdite.
+Vracanje kopije nece biti prihvaceno do sljedeceg spremanja.';
+$lang['locfiledit_bak_loaded1'] = 'Sigurnosna kopija datoteke ucitana.';
+$lang['locfiledit_bak_loaded2'] = 'Morate snimiti datoteku kako bi je vratili u prijašnje stanje.';
+$lang['locfiledit_syntax_error'] = 'Greška u sintaksi! Datoteka ne može biti spremljena.';
+$lang['locfiledit_new_tpl'] = 'Kreiraj novu datoteku';
+$lang['locfiledit_new_filename'] = 'Naziv datoteke';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Prazna stranica';
+$lang['locfiledit_parent_directory'] = 'Prethodna mapa';
+$lang['locfiledit_filename_error'] = 'Zabranjeni znakovi u nazivu datoteke.';
+$lang['locfiledit_file_already_exists'] = 'Datoteka vec postoji.';
+$lang['locfiledit_model_error'] = 'Morate odabrati model.';
+$lang['locfiledit_empty_filename'] = 'Morate popuniti naziv datoteke.';
+$lang['locfiledit_webmaster_only'] = 'Samo webmasteri mogu kreirati ili mijenjati lokalne datoteke.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Helyi fájlok szerkesztése az adminisztrációs felületen.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/hu_HU/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Helyi beállítások';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Sablonok';
+$lang['locfiledit_onglet_lang'] = 'Nyelv';
+$lang['locfiledit_onglet_plug'] = 'Egyedi bővítmény';
+$lang['locfiledit_cant_save'] = 'A fájl nem írható. Ellenőrizze a könyvtár "local/" írhatóságát (chmod)';
+$lang['locfiledit_newfile'] = 'Nincs ilyen fájl a LocalFiles Editor létre tudja hozni';
+$lang['locfiledit_save_config'] = 'A fájl módosítása sikeres.';
+$lang['locfiledit_show_default'] = 'Fájl kiválasztás: ';
+$lang['locfiledit_save_bak'] = 'Biztonsági másolat mentése.';
+$lang['locfiledit_saved_bak'] = 'Biztonsági másolat létrehozva (%s)';
+$lang['locfiledit_save_file'] = 'Fájl mentése';
+$lang['locfiledit_choose_file'] = 'Válassza ki a szerkesztendő fájlt';
+$lang['locfiledit_edit'] = 'Szerkesztés';
+$lang['locfiledit_restore'] = 'Biztonsági másolat visszatöltése';
+$lang['locfiledit_restore_confirm'] = 'Biztosan ezt akarja?
+A változtatás nem vonható vissza.';
+$lang['locfiledit_bak_loaded1'] = 'Biztonsági másolat betöltve.';
+$lang['locfiledit_bak_loaded2'] = 'Mentett fájl visszaállítása.';
+$lang['locfiledit_syntax_error'] = 'Syntax error! A fájl mentése meghiúsult.';
+$lang['locfiledit_new_tpl'] = 'Új fájl létrehozása';
+$lang['locfiledit_new_filename'] = 'Fájl neve';
+$lang['locfiledit_model'] = 'Típus';
+$lang['locfiledit_empty_page'] = 'Üres oldal';
+$lang['locfiledit_parent_directory'] = 'Szülő könyvtár';
+$lang['locfiledit_filename_error'] = 'Nem használható fájlnév vagy karakter.';
+$lang['locfiledit_file_already_exists'] = 'Ilyen fájl már létezik.';
+$lang['locfiledit_model_error'] = 'A típust ki kell választani.';
+$lang['locfiledit_empty_filename'] = 'A fájlnevet ki kell tölteni.';
+/* TODO */ $lang['locfiledit_webmaster_only'] = 'Csak a webmesterek hozhatnak létre, vagy módosíthatnak helyi fájlokat.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Modificare i file locali dal pannello di amministrazione.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/it_IT/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Configurazione locale';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Templates';
+$lang['locfiledit_onglet_lang'] = 'Lingue';
+$lang['locfiledit_onglet_plug'] = 'Plugin Personale';
+$lang['locfiledit_cant_save'] = 'Non è stato possibile scrivere il file. Verificare i permessi (chmod) della directory "local/".';
+$lang['locfiledit_newfile'] = 'Il file non esiste e sarà creato durante la fase di registrazione con LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Il file è stato salvato.';
+$lang['locfiledit_show_default'] = 'Visualizzare il file ';
+$lang['locfiledit_save_bak'] = 'Una copia di backup del file sarà creata durante la fase di registrazione';
+$lang['locfiledit_saved_bak'] = 'Una copia di backup è stata creata (%s)';
+$lang['locfiledit_save_file'] = 'Salvare il file';
+$lang['locfiledit_choose_file'] = 'Scegliere un file da editare';
+$lang['locfiledit_edit'] = 'Editare';
+$lang['locfiledit_restore'] = 'Caricare il file di backup';
+$lang['locfiledit_restore_confirm'] = 'Volete caricare il file di backup?
+Dovrete in seguito cliccare sù Salvare per restaurarlo.';
+$lang['locfiledit_bak_loaded1'] = 'Copia di backup caricata';
+$lang['locfiledit_bak_loaded2'] = 'Dovete registrarlo per salvarlo.';
+$lang['locfiledit_syntax_error'] = 'Errore di sintassi! Impossible salvare il file.';
+$lang['locfiledit_new_tpl'] = 'Creare un nuovo file';
+$lang['locfiledit_new_filename'] = 'Nom file';
+$lang['locfiledit_model'] = 'Modello';
+$lang['locfiledit_empty_page'] = 'Pagina vergine';
+$lang['locfiledit_parent_directory'] = 'Directory parente';
+$lang['locfiledit_filename_error'] = 'Caratteri vietati nel nome del file.';
+$lang['locfiledit_file_already_exists'] = 'Il file esiste già.';
+$lang['locfiledit_model_error'] = 'Selezionare un modello.';
+$lang['locfiledit_empty_filename'] = 'Indicate un nome di file.';
+$lang['locfiledit_webmaster_only'] = 'Solo i webmasters sono autorizzati a creare o modificare i file locali.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ja_JP/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'ローカルconfig';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'テンプレート';
+$lang['locfiledit_onglet_lang'] = '言語';
+$lang['locfiledit_onglet_plug'] = '個人のプラグイン';
+$lang['locfiledit_cant_save'] = '現在のファイルは書き込みできません。"local/"というディレクトリーは書き込める(chmod)か確認して下さい。';
+$lang['locfiledit_newfile'] = 'ファイルがありませんので、ローカルファイルエディターで作成されます。';
+$lang['locfiledit_save_config'] = 'ファイル書き込み成功';
+$lang['locfiledit_show_default'] = '参照ファイル展示: ';
+$lang['locfiledit_save_bak'] = '保存する時に、バックアップコピーが作成される。';
+$lang['locfiledit_saved_bak'] = 'バックアップファイル作成されました(%s)';
+$lang['locfiledit_save_file'] = 'ファイル保存';
+$lang['locfiledit_choose_file'] = '編集ファイルを選択して下さい。';
+$lang['locfiledit_edit'] = '編集';
+$lang['locfiledit_restore'] = 'バックアップファイルを復元する';
+$lang['locfiledit_restore_confirm'] = '確認して下さい?
+次の保存するまでに現在の復元は有効になりません。';
+$lang['locfiledit_bak_loaded1'] = 'バックアップファイルは起動しました。';
+$lang['locfiledit_bak_loaded2'] = '復元するために、ファイルを保存する必要があります。';
+$lang['locfiledit_syntax_error'] = 'エラー! ファイルは保存できません。';
+$lang['locfiledit_new_tpl'] = '新しいファイルを作成する';
+$lang['locfiledit_new_filename'] = 'ファイル名';
+$lang['locfiledit_model'] = 'モデル';
+$lang['locfiledit_empty_page'] = '空のページ';
+$lang['locfiledit_parent_directory'] = '親ディレクトリー';
+$lang['locfiledit_filename_error'] = '入ってはいけない文字はファイル名にあります。';
+$lang['locfiledit_file_already_exists'] = 'ファイルは既に存在しています。';
+$lang['locfiledit_model_error'] = 'モデルを選択する必要があります。';
+$lang['locfiledit_empty_filename'] = 'ファイル名を記入する必要があります。';
+$lang['locfiledit_webmaster_only'] = 'ローカルファイルはウェブマスターのみ作成するか、変更できます。';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+ლოკალური ფაილების შეცვლა ადმინისტრაციული პანელიდან.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ka_GE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'ლოკალური კონფიგურაცია';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'შაბლონები';
+$lang['locfiledit_onglet_lang'] = 'ენები';
+$lang['locfiledit_onglet_plug'] = 'პერსონალური პლაგინი';
+$lang['locfiledit_cant_save'] = 'ეს ფაილი არ არის ჩაწერის უფლებით. შეამოწმეთ დირექტორია "local/" არის თუ არა შესაბამისი (chmod)–ით.';
+$lang['locfiledit_newfile'] = 'ფაილი არ არსებობს და შეიქმნება LocalFiles რედაქტორის მიერ ';
+$lang['locfiledit_save_config'] = 'ფაილი წარმატებით წაიკითხა.';
+$lang['locfiledit_show_default'] = 'ვნახოთ გასასწორებელი ფაილი: ';
+$lang['locfiledit_save_bak'] = 'სარეზერვო ასლი შეიქმნა და შეინახა.';
+$lang['locfiledit_saved_bak'] = 'სარეზერვო ასლი შეიქმნა (%s) –ით';
+$lang['locfiledit_save_file'] = 'შევინახოთ ფაილი';
+$lang['locfiledit_choose_file'] = 'აირჩიეთ ფაილი რედაქტირებისათვის';
+$lang['locfiledit_edit'] = 'რედაქტირება';
+$lang['locfiledit_restore'] = 'სარეზერვო ფაილის აღდგენა';
+$lang['locfiledit_restore_confirm'] = 'გთხოვთ დაადასტუროთ?
+აღდგენა არ იქნება ეფექტური მომდევნო შენახვამდე.';
+$lang['locfiledit_bak_loaded1'] = 'სარეზერვო ფაილის ჩატვირთვა.';
+$lang['locfiledit_bak_loaded2'] = 'თქვენ უნდა შეინახოთ ფაილი, რომ აღდგინოთ.';
+$lang['locfiledit_syntax_error'] = 'სინტაქსური შეცდომა! ფაილი ვერ შეინახება.';
+$lang['locfiledit_new_tpl'] = 'შევქმნათ ახალი ფაილი';
+$lang['locfiledit_new_filename'] = 'ფაილის სახელი';
+$lang['locfiledit_model'] = 'მოდელი';
+$lang['locfiledit_empty_page'] = 'ცარიელი გვერდი';
+$lang['locfiledit_parent_directory'] = 'მშობლიური დირექტორია';
+$lang['locfiledit_filename_error'] = 'აკრძალული სიმბოლოები ფაილის სახელში.';
+$lang['locfiledit_file_already_exists'] = 'ფაილი უკვე არსებობს.';
+$lang['locfiledit_model_error'] = 'თქვენ უნდა აირჩიოთ მოდელი.';
+$lang['locfiledit_empty_filename'] = 'თქვენ უნდა შეავსოთ ფაილის სახელი.';
+$lang['locfiledit_webmaster_only'] = 'მხოლოდ ვებოსტატებს შეუძლიათ შექმნან ან გადააკეთონ ლოკალური ფაილები.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Rediget lokalos failus no administratora panela.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/lv_LV/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokala konfiguracija';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Veidnes';
+$lang['locfiledit_onglet_lang'] = 'Valodas';
+$lang['locfiledit_onglet_plug'] = 'Personas spraudni';
+$lang['locfiledit_cant_save'] = ' Esošais fails nav ierakstams. Parbaudit vai mape "local/" ir ar rakstišanas tiesibam (chmod).';
+$lang['locfiledit_newfile'] = 'Fails neeksiste, tas tiks izveidots izmantojot LocalFiles Editor';
+$lang['locfiledit_save_config'] = ' Fails ierakstits sekmigi.';
+$lang['locfiledit_show_default'] = ' Paradit izvelnes failu: ';
+$lang['locfiledit_save_bak'] = ' Rezerves kopija tiks izveidota veicot saglabašanu.';
+$lang['locfiledit_saved_bak'] = 'Rezerves kopija izveidota par (%s)';
+$lang['locfiledit_save_file'] = ' Saglabat failu';
+$lang['locfiledit_choose_file'] = ' Izveleties failu ko rediget';
+$lang['locfiledit_edit'] = 'Rediget';
+$lang['locfiledit_restore'] = 'Atjaunot rezerves kopiju';
+$lang['locfiledit_restore_confirm'] = 'Ludzu apstprinat?
+Atjaunošana nebus iespejama lidz nakamai saglabašanai.';
+$lang['locfiledit_bak_loaded1'] = 'Rezerves kopija ieladeta.';
+$lang['locfiledit_bak_loaded2'] = 'Jums jasaglaba fails lai to atjaunotu.';
+$lang['locfiledit_syntax_error'] = 'Sintakses kluda! Failu nav iespejams saglabat.';
+$lang['locfiledit_new_tpl'] = 'Izveidot jaunu failu';
+$lang['locfiledit_new_filename'] = 'Faila nosaukums';
+$lang['locfiledit_model'] = 'Modelis';
+$lang['locfiledit_empty_page'] = 'Tukša lapa';
+$lang['locfiledit_parent_directory'] = 'Pamatmape';
+$lang['locfiledit_filename_error'] = 'Aizliegti simboli nosaukuma.';
+$lang['locfiledit_file_already_exists'] = 'Fails jau eksiste.';
+$lang['locfiledit_model_error'] = 'Jums jaizvelas modelis.';
+$lang['locfiledit_empty_filename'] = 'Jums jaieraksta faila nosaukums.';
+$lang['locfiledit_webmaster_only'] = 'Tikai webmasters var izveidot un modificet lokalos failus.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Wijzig lokale bestanden vanaf het administratie-scherm.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/nl_NL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokale configuratie';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Templates';
+$lang['locfiledit_onglet_lang'] = 'Talen';
+$lang['locfiledit_onglet_plug'] = 'Persoonlijke Plugin';
+$lang['locfiledit_cant_save'] = 'Er kan niet naar het gebruikte bestand geschreven worden. Controleer of een directorie "local/" beschrijfbaar is (chmod).';
+$lang['locfiledit_newfile'] = 'Bestand bestaat niet en zal worden aangemaakt door de LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Bestand succesvol beschreven.';
+$lang['locfiledit_show_default'] = 'Geef het referentie-bestand weer: ';
+$lang['locfiledit_save_bak'] = 'Bij het opslaan wordt een backup-bestand aangemaakt.';
+$lang['locfiledit_saved_bak'] = 'Backup-bestand aangemaakt (%s)';
+$lang['locfiledit_save_file'] = 'opslaan bestand';
+$lang['locfiledit_choose_file'] = 'Kies het te wijzigen bestand';
+$lang['locfiledit_edit'] = 'Wijzig';
+$lang['locfiledit_restore'] = 'Restore het backup-bestand';
+$lang['locfiledit_restore_confirm'] = 'Aub bevestigen?
+Restore wordt pas effectief bij de volgende keer opslaan.';
+$lang['locfiledit_bak_loaded1'] = 'Backup-bestand geladen.';
+$lang['locfiledit_bak_loaded2'] = 'U moet het bestand opslaan om te kunnen restoren.';
+$lang['locfiledit_syntax_error'] = 'Syntax-fout! Bestand kan niet opgeslagen worden.';
+$lang['locfiledit_new_tpl'] = 'Maak nieuw bestand aan';
+$lang['locfiledit_new_filename'] = 'Bestandsnaam';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Lege pagina';
+$lang['locfiledit_parent_directory'] = 'Bovenliggende directorie';
+$lang['locfiledit_filename_error'] = 'Niet toegestane teken(s) in bestandsnaam.';
+$lang['locfiledit_file_already_exists'] = 'Bestand bestaat reeds.';
+$lang['locfiledit_model_error'] = 'U moet een model kiezen.';
+$lang['locfiledit_empty_filename'] = 'U moet een bestandsnaam opgeven.';
+$lang['locfiledit_webmaster_only'] = 'Alleen webbeheerders kunnen lokale bestanden aanmaken of wijzigen.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Rediger lokale filer fra administrasjons panelet.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/no_NO/plugin.lang.php	(revision 14585)
@@ -0,0 +1,51 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+$lang['locfiledit_onglet_localconf'] = 'Lokal konfigurasjon';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Maler (templates)';
+$lang['locfiledit_onglet_lang'] = 'Språk';
+$lang['locfiledit_onglet_plug'] = 'Personlig tilleggsprogram';
+$lang['locfiledit_cant_save'] = 'Gjeldende fil kan ikke skrives til. sjekk om mappen "local/" har skriverettigheter (chmod)(775).';
+$lang['locfiledit_newfile'] = 'Filen eksisterer ikke og vil bli laget av LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Fil er skrevet.';
+$lang['locfiledit_show_default'] = 'Vis referanse fil: ';
+$lang['locfiledit_save_bak'] = 'Sikkerhets kopi vil bli laget ved lagring.';
+$lang['locfiledit_saved_bak'] = 'Sikkerhetskopi er laget (%s)';
+$lang['locfiledit_save_file'] = 'Lagre fil';
+$lang['locfiledit_choose_file'] = 'Velg fil du vil redigering';
+$lang['locfiledit_edit'] = 'Rediger';
+$lang['locfiledit_restore'] = 'Gjennopprett sikkerhets kopi';
+$lang['locfiledit_restore_confirm'] = 'Vennligst bekreft? Gjennoppretting vil ikke gjøres før neste lagring.';
+$lang['locfiledit_bak_loaded1'] = 'Sikkerhetskopi lastet.';
+$lang['locfiledit_bak_loaded2'] = 'Du må lagre filen for å gjennopprette den.';
+$lang['locfiledit_syntax_error'] = 'Syntax feil! Filen kan ikke bli lagret.';
+$lang['locfiledit_new_tpl'] = 'Lag ny fil';
+$lang['locfiledit_new_filename'] = 'Fil navn';
+$lang['locfiledit_model'] = 'Modusl';
+$lang['locfiledit_empty_page'] = 'Tøm side';
+$lang['locfiledit_parent_directory'] = 'Underliggende mappe';
+$lang['locfiledit_filename_error'] = 'Forbudte tegn i filnavnet.';
+$lang['locfiledit_file_already_exists'] = 'Filen eksisterer allerede.';
+$lang['locfiledit_model_error'] = 'Du må velge en modell.';
+$lang['locfiledit_empty_filename'] = 'Du må fylle inn fil navnet.';
+$lang['locfiledit_webmaster_only'] = 'Kun webmaster kan lage eller endre lokale filer.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Edycja plików lokalnych z panelu administratora
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pl_PL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,55 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Konfiguracja lokalna';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Szablony';
+$lang['locfiledit_onglet_lang'] = 'Języki';
+$lang['locfiledit_onglet_plug'] = 'Wtyczki własne';
+$lang['locfiledit_cant_save'] = 'W pliku nie można zapisywać zmian. Sprawdź czy katalog "local/" jest zapisywalny (chmod).';
+$lang['locfiledit_newfile'] = 'Plik nie istnieje i zostanie utworzony przez Edytora Plików Lokalnych';
+$lang['locfiledit_save_config'] = 'Plik został zapisany pomyślnie.';
+$lang['locfiledit_show_default'] = 'Pokaż plik referencyjny: ';
+$lang['locfiledit_save_bak'] = 'Kopia zapasowa zostanie utworzona podczas zapisywania zmian.';
+$lang['locfiledit_saved_bak'] = 'Plik kopii zapasowej utworzony (%s)';
+$lang['locfiledit_save_file'] = 'Zapisz plik';
+$lang['locfiledit_choose_file'] = 'Wybierz plik do edycji';
+$lang['locfiledit_edit'] = 'Edytuj';
+$lang['locfiledit_restore'] = 'Przywróć plik z kopii zapasowej';
+$lang['locfiledit_restore_confirm'] = 'Potwierdź proszę?
+Przywrócenie nie przyniesie efektu do następnego zapisu.';
+$lang['locfiledit_bak_loaded1'] = 'Plik kopii zapasowej wczytany.';
+$lang['locfiledit_bak_loaded2'] = 'Musisz zapisać plik aby go przywrócić.';
+$lang['locfiledit_syntax_error'] = 'Błąd skłądni! Plik nie może zostać zapisany.';
+$lang['locfiledit_new_tpl'] = 'Stwórz nowy plik';
+$lang['locfiledit_new_filename'] = 'Nazwa pliku';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Pusta strona';
+$lang['locfiledit_parent_directory'] = 'Katalog nadrzędny';
+$lang['locfiledit_filename_error'] = 'Plik zawiera niedozwolone znaki.';
+$lang['locfiledit_file_already_exists'] = 'Plik już istnieje.';
+$lang['locfiledit_model_error'] = 'Musisz wybrać model.';
+$lang['locfiledit_empty_filename'] = 'Musisz wpisać nazwę pliku.';
+$lang['locfiledit_webmaster_only'] = 'Only webmasters can create or modify local files.';
+$lang['locfiledit_webmaster_only'] = 'Tylko administrator może tworzyć i modyfikować pliki lokalne.'; 
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Editar ficheiros locais a partir do Painel Administrativo de Piwigo.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/pt_PT/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Configuração Local';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Modelos';
+$lang['locfiledit_onglet_lang'] = 'Linguagens';
+$lang['locfiledit_onglet_plug'] = 'Plugin Pessoal';
+$lang['locfiledit_cant_save'] = 'O ficheiro actual não tem permissões de escrita. Confirme que a pasta "local/" tem permissões de escrita (chmod).';
+$lang['locfiledit_newfile'] = 'O ficheiro não existe e irá ser criado pelo Editor LocalFiles';
+$lang['locfiledit_save_config'] = 'Ficheiro escrito com sucesso.';
+$lang['locfiledit_show_default'] = 'Mostrar ficheiro de referência: ';
+$lang['locfiledit_save_bak'] = 'Cópia de segurança será guardada quando clicar em Salvar Ficheiro.';
+$lang['locfiledit_saved_bak'] = 'Cópia de segurança criada (%s)';
+$lang['locfiledit_save_file'] = 'Salvar Ficheiro';
+$lang['locfiledit_choose_file'] = 'Escolha o ficheiro a ser editado';
+$lang['locfiledit_edit'] = 'Editar';
+$lang['locfiledit_restore'] = 'Restaure uma cópia de segurança';
+$lang['locfiledit_restore_confirm'] = 'Por favor confirme?
+O Restauro não será efectuado até Salvar a próxima vez.';
+$lang['locfiledit_bak_loaded1'] = 'Ficheiro de cópia de segurança carregado.';
+$lang['locfiledit_bak_loaded2'] = 'Deverá salvar o ficheiro para o restaurar.';
+$lang['locfiledit_syntax_error'] = 'Erro de sintaxe! Impossível salvar ficheiro.';
+$lang['locfiledit_new_tpl'] = 'Criar novo ficheiro';
+$lang['locfiledit_new_filename'] = 'Nome do ficheiro';
+$lang['locfiledit_model'] = 'Modelo';
+$lang['locfiledit_empty_page'] = 'Página Vazia';
+$lang['locfiledit_parent_directory'] = 'Pasta Mãe';
+$lang['locfiledit_filename_error'] = 'Caracteres proibidos no nome do ficheiro.';
+$lang['locfiledit_file_already_exists'] = 'O ficheiro já existe.';
+$lang['locfiledit_model_error'] = 'Tem que escolher um Modelo.';
+$lang['locfiledit_empty_filename'] = 'Tem que preencher o Nome do ficheiro.';
+$lang['locfiledit_webmaster_only'] = 'Apenas webmasters podem criar ou modificar ficheiros locais.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Позволяет редактировать локальные файлы из панели администрирования.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/ru_RU/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Локальные настройки';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Шаблоны';
+$lang['locfiledit_onglet_lang'] = 'Языки';
+$lang['locfiledit_onglet_plug'] = 'Личный плагин';
+$lang['locfiledit_cant_save'] = 'Текущий файл не может быть записан. Проверьте, имеются ли права зависи в директории  "local/" (chmod).';
+$lang['locfiledit_newfile'] = 'Файл не существует и будет создан LocalFilesEditor';
+$lang['locfiledit_save_config'] = 'Файл записан успешно';
+$lang['locfiledit_show_default'] = 'Показать исходный файл: ';
+$lang['locfiledit_save_bak'] = 'Резервная копия файла будет создана при сохранении.';
+$lang['locfiledit_saved_bak'] = 'Резервный файл создан (%s)';
+$lang['locfiledit_save_file'] = 'Сохранить файл';
+$lang['locfiledit_choose_file'] = 'Выберите файл для редактирования';
+$lang['locfiledit_edit'] = 'Редактировать';
+$lang['locfiledit_restore'] = 'Восстановить резервный файл';
+$lang['locfiledit_restore_confirm'] = 'Пожалуйста, подтвердите действие. Восстановленный файл не будет активен до тех пор, пока не будет сохранен.';
+$lang['locfiledit_bak_loaded1'] = 'Резервный файл загружен.';
+$lang['locfiledit_bak_loaded2'] = 'Вы должны сохранить файл, чтобы восстановить его.';
+$lang['locfiledit_syntax_error'] = 'Синтаксическая ошибка! Невозможно сохранить файл.';
+$lang['locfiledit_new_tpl'] = 'Создать новый файл';
+$lang['locfiledit_new_filename'] = 'Имя файла';
+$lang['locfiledit_model'] = 'Модель';
+$lang['locfiledit_empty_page'] = 'Очистить страницу';
+$lang['locfiledit_parent_directory'] = 'Родительская директория';
+$lang['locfiledit_filename_error'] = 'Запрещенные символы в имени файла.';
+$lang['locfiledit_file_already_exists'] = 'Файл уже существует.';
+$lang['locfiledit_model_error'] = 'Выберите модель.';
+$lang['locfiledit_empty_filename'] = 'Заполните поле "Имя файла".';
+$lang['locfiledit_webmaster_only'] = 'Только вэбмастеры могут создавать или редактировать локальные файлы.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Uredite lokalne fajlove iz administratorskog panela.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sh_RS/plugin.lang.php	(revision 14585)
@@ -0,0 +1,52 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_bak_loaded1'] = 'Rezervni fajl učitan.';
+$lang['locfiledit_bak_loaded2'] = 'Morate sačuvati fajl da bi ste ga vratili.';
+$lang['locfiledit_cant_save'] = 'Trenutni fajl nije upisiv. Proverite da li je moguće pisanje u direktorijumu "local/" (chmod).';
+$lang['locfiledit_choose_file'] = 'Odaberite fajl koji će biti uređivan';
+$lang['locfiledit_edit'] = 'Uredi';
+$lang['locfiledit_empty_filename'] = 'Morate popuniti naziv fajla.';
+$lang['locfiledit_empty_page'] = 'Prazna strana';
+$lang['locfiledit_filename_error'] = 'Zabranjeni karakter u nazivu fajla.';
+$lang['locfiledit_file_already_exists'] = 'Fajl već postoji.';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_model_error'] = 'Morate odabrati model.';
+$lang['locfiledit_newfile'] = 'Fajl ne postoji i biće kreiran od strane LocalFiles editora';
+$lang['locfiledit_new_filename'] = 'Naziv fajla';
+$lang['locfiledit_new_tpl'] = 'Kreiraj novi fajl';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_lang'] = 'Jezici';
+$lang['locfiledit_onglet_localconf'] = 'Lokalno podešavanje';
+$lang['locfiledit_onglet_plug'] = 'Lični dodatak';
+$lang['locfiledit_onglet_tpl'] = 'Šabloni';
+$lang['locfiledit_parent_directory'] = 'Nadređeni direktorijum';
+$lang['locfiledit_restore'] = 'Vrati rezervni fajl';
+$lang['locfiledit_restore_confirm'] = 'Molim potvrdite? Vraćanje neće imati efekta do sledećeg snimanja.';
+$lang['locfiledit_saved_bak'] = 'Rezervan kopija fajla kreirana (%s)';
+$lang['locfiledit_save_bak'] = 'Rezervna kopija biće kreirana prilikom snimanja.';
+$lang['locfiledit_save_config'] = 'Fajl upisan uspešno.';
+$lang['locfiledit_save_file'] = 'Snimi fajl';
+$lang['locfiledit_show_default'] = 'Prikaži referentni fajl:';
+$lang['locfiledit_syntax_error'] = 'Sintaksna greška! Fajl ne može biti sačuvan.';
+$lang['locfiledit_webmaster_only'] = 'Samo webmasteri mogu kreirati ili modifikovati lokalne fajlove.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Editácia lokálnych súborov z panelu administrátora.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sk_SK/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokálna konfigurácia';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Šablóny';
+$lang['locfiledit_onglet_lang'] = 'Jazyky';
+$lang['locfiledit_onglet_plug'] = 'Osobný Plugin';
+$lang['locfiledit_cant_save'] = 'Súčasný súbor nie je zapisovateľný. Skontrolujte, či adresár "local/" je zapisovateľný (chmod).';
+$lang['locfiledit_newfile'] = 'Súbor neexistuje a bude vytvorený pomocou LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Súbor bol úspešne zapísaný.';
+$lang['locfiledit_show_default'] = 'Zobraziť referenčný súbor: ';
+$lang['locfiledit_save_bak'] = 'Záložná kópia bude vytvorená pri uložení.';
+$lang['locfiledit_saved_bak'] = 'Vytvorený záložný súbor (%s)';
+$lang['locfiledit_save_file'] = 'Uložiť súbor';
+$lang['locfiledit_choose_file'] = 'Vybrať súbor na editovanie';
+$lang['locfiledit_edit'] = 'Editovať';
+$lang['locfiledit_restore'] = 'Obnoviť záložný súbor';
+$lang['locfiledit_restore_confirm'] = 'Prosím potvrdíte?
+Obnova nebude účinná pokiaľ neuložíte.';
+$lang['locfiledit_bak_loaded1'] = 'Záložný súbor nahraný.';
+$lang['locfiledit_bak_loaded2'] = 'Musíte uložiť súbor na jeho obnovenie.';
+$lang['locfiledit_syntax_error'] = 'Syntaktický chyba! Súbor nemôže byť uložený.';
+$lang['locfiledit_new_tpl'] = 'Vytvorenie nového súboru';
+$lang['locfiledit_new_filename'] = 'Meno súboru';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Prázdna strana';
+$lang['locfiledit_parent_directory'] = 'Domovský adresár';
+$lang['locfiledit_filename_error'] = 'Nepovolené znaky v názve súboru.';
+$lang['locfiledit_file_already_exists'] = 'Súbor už existuje.';
+$lang['locfiledit_model_error'] = 'Musíte vybrať model.';
+$lang['locfiledit_empty_filename'] = 'Musíte zadať meno súboru.';
+$lang['locfiledit_webmaster_only'] = 'Len webmasteri môžu vytvoriť alebo modifikovať lokálne súbory.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Уреди локалне датотеке преко администрационе странице.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sr_RS/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf']    = 'Лична подешавања';
+$lang['locfiledit_onglet_css']          = 'css датотека';
+$lang['locfiledit_onglet_tpl']          = 'Шаблон';
+$lang['locfiledit_onglet_lang']         = 'Језици';
+$lang['locfiledit_onglet_plug']         = 'Лични додатак';
+$lang['locfiledit_cant_save']           = 'Тренутна датотека није записана. Проверите да ли је директоријум "local/" има дозволу за упис  (chmod).';
+$lang['locfiledit_newfile']             = 'Датотека не постоји и биће направљена програмом LocalFiles Editor';
+$lang['locfiledit_save_config']         = 'Датотека је успешно записана.';
+$lang['locfiledit_show_default']        = 'Прикажи подразумевану датотеку: ';
+$lang['locfiledit_save_bak']            = 'Резервна копија ће бити направљена приликом снимања.';
+$lang['locfiledit_saved_bak']           = 'Резервна копија је направљена (%s)';
+$lang['locfiledit_save_file']           = 'Запамти датотеку';
+$lang['locfiledit_choose_file']         = 'Изабери датотеку за уређивање';
+$lang['locfiledit_edit']                = 'Измени';
+$lang['locfiledit_restore']             = 'Обнови резервну копију датотеке';
+$lang['locfiledit_restore_confirm']     = 'Молимо Вас да потврдите? Обнављање ће бити важеће после снимања.';
+$lang['locfiledit_bak_loaded1']         = 'Резервна копија је учитана.';
+$lang['locfiledit_bak_loaded2']         = 'Морате да запамтите датотеку пре обнављања.';
+$lang['locfiledit_syntax_error']        = 'Синтаксна грешка! Датотека не може бити снимљена.';
+$lang['locfiledit_new_tpl']             = 'Направи нову датотеку';
+$lang['locfiledit_new_filename']        = 'Име датотеке';
+$lang['locfiledit_model']               = 'Модел';
+$lang['locfiledit_empty_page']          = 'Празна страница';
+$lang['locfiledit_parent_directory']    = 'Надређени директоријум';
+$lang['locfiledit_filename_error']      = 'Забрањени знаци у називу датотеке.';
+$lang['locfiledit_file_already_exists'] = 'Датотека већ постоји.';
+$lang['locfiledit_model_error']         = 'Морате изабрати модел.';
+$lang['locfiledit_empty_filename']      = 'Морате уписати име датотеке.';
+$lang['locfiledit_webmaster_only']      = 'Само уредник интернет страница може да направи или уреди локалне датотеке.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Ändra lokala filer från administrationspanelen.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/sv_SE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokal konfiguration';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Teman';
+$lang['locfiledit_onglet_lang'] = 'Språk';
+$lang['locfiledit_onglet_plug'] = 'Personligt Plugin';
+$lang['locfiledit_cant_save'] = 'Det går inte att skriva till aktuell fil. Kontrollera att mappen "local/" är skrivbar (chmod).';
+$lang['locfiledit_newfile'] = 'Filen existerar inte så den kommer att skapas av LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Filen skrevs med framgång.';
+$lang['locfiledit_show_default'] = 'Visa referens fil: ';
+$lang['locfiledit_save_bak'] = 'En säkerhetskopia kommer skapas när du sparar.';
+$lang['locfiledit_saved_bak'] = 'Säkerhetskopia skapad (%s)';
+$lang['locfiledit_save_file'] = 'Spara fil';
+$lang['locfiledit_choose_file'] = 'Välj fil add ändra';
+$lang['locfiledit_edit'] = 'Ändra';
+$lang['locfiledit_restore'] = 'Återställ säkerhetskopia';
+$lang['locfiledit_restore_confirm'] = 'Vänligen bekräfta? Återställning kommer inte fungera till nästa gång.';
+$lang['locfiledit_bak_loaded1'] = 'Säkerhetskopia laddad.';
+$lang['locfiledit_bak_loaded2'] = 'Du måste spara filen för att återställa den.';
+$lang['locfiledit_syntax_error'] = 'Syntax fel! Filen kan inte sparas.';
+$lang['locfiledit_new_tpl'] = 'Skapa ny fil';
+$lang['locfiledit_new_filename'] = 'Fil namn';
+$lang['locfiledit_model'] = 'Modell';
+$lang['locfiledit_empty_page'] = 'Töm sida';
+$lang['locfiledit_parent_directory'] = 'Nuvarande katalog';
+$lang['locfiledit_filename_error'] = 'Förbjudna symboler i filnamnet.';
+$lang['locfiledit_file_already_exists'] = 'Filen existerar redan.';
+$lang['locfiledit_model_error'] = 'Du måste välja en modell.';
+$lang['locfiledit_empty_filename'] = 'Du måste välja ett filnamn.';
+$lang['locfiledit_webmaster_only'] = 'Endast webmasters kan skapa eller ändra lokala filer.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/th_TH/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'ไฟล์การตั้งค่าพื้นฐาน';
+$lang['locfiledit_onglet_css'] = 'ไฟล์ CSS';
+$lang['locfiledit_onglet_tpl'] = 'ไฟล์ แม่แบบ';
+$lang['locfiledit_onglet_lang'] = 'ไฟล์ ภาษา';
+$lang['locfiledit_onglet_plug'] = 'ไฟล์ ปลั๊กอิน';
+$lang['locfiledit_cant_save'] = 'ไฟล์ปัจจุบันไม่สามารถเขียนได้. โปรดตรวจสอบสิทธิ์การเข้าถึงไดเรกทอรี่ "local/" ว่ามันสามารถเขียนได้ (โดยการปรับค่า chmod เป็นค่า 777).';
+$lang['locfiledit_newfile'] = 'ไฟล์ไม่มีอยู่ และมันจะถูกสร้างโดย LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'การเขียนไฟล์เสร็จสมบูรณ์.';
+$lang['locfiledit_show_default'] = 'แสดงไฟล์อ้างอิง: ';
+$lang['locfiledit_save_bak'] = 'คัดลอก สำรองไฟล์ที่จะสร้างเมื่อบันทึก.';
+$lang['locfiledit_saved_bak'] = 'สำรองไฟล์และสร้าง (%s)';
+$lang['locfiledit_save_file'] = 'บันทึกไฟล์';
+$lang['locfiledit_choose_file'] = 'เลือกไฟล์เพื่อทำการแก้ไข';
+$lang['locfiledit_edit'] = 'แก้ไข';
+$lang['locfiledit_restore'] = 'คืนค่าการสำรองไฟล์';
+$lang['locfiledit_restore_confirm'] = 'กรุณายืนยัน?
+การคืนค่าจะยังไม่มีผล จนกว่าจะบันทึกเสร็จเรียบร้อย.';
+$lang['locfiledit_bak_loaded1'] = 'ไฟล์สำรองได้ย้ายแล้ว.';
+$lang['locfiledit_bak_loaded2'] = 'คุณจะต้องบันทึกไฟล์เพื่อทำการคืนค่า.';
+$lang['locfiledit_syntax_error'] = 'ประโยคผิดพลาด! ไฟล์ไม่สามารถบันทึกได้.';
+$lang['locfiledit_new_tpl'] = 'สร้างไฟล์ใหม่';
+$lang['locfiledit_new_filename'] = 'ชื่อไฟล์';
+$lang['locfiledit_model'] = 'แบบ';
+$lang['locfiledit_empty_page'] = 'หน้าเปล่า';
+$lang['locfiledit_parent_directory'] = 'ไดเรกทอรี่พื้นฐาน';
+$lang['locfiledit_filename_error'] = 'ตัวอักขระถูกห้ามในการตั้งเป็นชื่อไฟล์.';
+$lang['locfiledit_file_already_exists'] = 'ไฟล์นี้มีอยู่แล้ว.';
+$lang['locfiledit_model_error'] = 'คุณจะต้องเลือกแบบ.';
+$lang['locfiledit_empty_filename'] = 'คุณจะต้องกรอกชื่อไฟล์.';
+$lang['locfiledit_webmaster_only'] = 'สำหรับเว็บมาสเตอร์เท่านั้นที่สามารถสร้างหรือแก้ไขปรับแต่งไฟล์การตั้งค่าพื้นฐานได้.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/tr_TR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,54 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Lokal Ayarlar';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Sablonlar';
+$lang['locfiledit_onglet_lang'] = 'Dil Destegi';
+$lang['locfiledit_onglet_plug'] = 'Kisisel Plugin';
+$lang['locfiledit_cant_save'] = 'Seçili dosyanin yazilabilirlik izni yok. Lütfen "local/" klasörünü yazilabilir yapiniz (chmod).';
+$lang['locfiledit_newfile'] = 'Böyle bir dosya bulunamadi ya da Lokal dosya editörü ile yaratildi';
+$lang['locfiledit_save_config'] = 'Dosya basariyla yazildi.';
+$lang['locfiledit_show_default'] = 'Referans dosyayi göster: ';
+$lang['locfiledit_save_bak'] = 'Yedekleme dosyasi basariyla kaydedildi.';
+$lang['locfiledit_saved_bak'] = 'Yedekleme dosyasi yaratildi (%s)';
+$lang['locfiledit_save_file'] = 'Dosyayi kaydet';
+$lang['locfiledit_choose_file'] = 'Editlenen dosyayi seç';
+$lang['locfiledit_edit'] = 'Editle';
+$lang['locfiledit_restore'] = 'Yedekleme dosyasini geri yükle';
+$lang['locfiledit_restore_confirm'] = 'Lütfen onayla? 
+bir sonraki kaydetmeye kadar geri yükleme yapilamayacak.';
+$lang['locfiledit_bak_loaded1'] = 'yedekleme dosyasi yüklendi.';
+$lang['locfiledit_bak_loaded2'] = 'Geri yükledikten sonra save etmeyi unutmayiniz.';
+$lang['locfiledit_syntax_error'] = 'Syntax error! Dosya kayit edilemiyor.';
+$lang['locfiledit_new_tpl'] = 'Yeni Dosya Yarat';
+$lang['locfiledit_new_filename'] = 'Dosya Adi';
+$lang['locfiledit_model'] = 'Model';
+$lang['locfiledit_empty_page'] = 'Bos Sayfa';
+$lang['locfiledit_parent_directory'] = 'Üst Klasör';
+$lang['locfiledit_filename_error'] = 'Dosya adinda tanimlanamayan karakterler kullanilmis.';
+$lang['locfiledit_file_already_exists'] = 'Bu dosya zaten var.';
+$lang['locfiledit_model_error'] = 'Model seçmek zorundasin.';
+$lang['locfiledit_empty_filename'] = 'Adi doldurmak zorundasin.';
+$lang['locfiledit_webmaster_only'] = 'Sadece yöneticiler dosyalari degistirebilir .';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/uk_UA/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['locfiledit_bak_loaded1'] = 'Резервна копія файлу завантажена.';
+$lang['locfiledit_bak_loaded2'] = 'Ви повинні зберегти файл, щоб відновити його.';
+$lang['locfiledit_cant_save'] = 'Поточний файл не доступний для запису. Переконайтеся, що каталог  "local/" доступний для запису (CHMOD).';
+$lang['locfiledit_choose_file'] = 'Виберіть файл для редагування';
+$lang['locfiledit_edit'] = 'Редагувати';
+$lang['locfiledit_empty_filename'] = 'Ви повинні заповнити ім\'я файлу.';
+$lang['locfiledit_empty_page'] = 'Порожня сторінка';
+$lang['locfiledit_filename_error'] = 'Заборонені символи в імені файлу.';
+$lang['locfiledit_file_already_exists'] = 'Файл вже існує.';
+$lang['locfiledit_model'] = 'Модель';
+$lang['locfiledit_model_error'] = 'Ви повинні вибрати модель.';
+$lang['locfiledit_newfile'] = 'Файл не існують і будуть створено через LocalFiles Editor';
+$lang['locfiledit_new_filename'] = 'Назва файлу';
+$lang['locfiledit_new_tpl'] = 'Створити новий файл';
+$lang['locfiledit_onglet_css'] = 'Стилі';
+$lang['locfiledit_onglet_lang'] = 'Мови';
+$lang['locfiledit_onglet_localconf'] = 'Локальна конфігурація';
+$lang['locfiledit_onglet_plug'] = 'Персональні плаґіни';
+$lang['locfiledit_onglet_tpl'] = 'Шаблони';
+$lang['locfiledit_parent_directory'] = 'Батьківська тека';
+$lang['locfiledit_restore'] = 'Відновлення файлу резервної копії';
+$lang['locfiledit_restore_confirm'] = 'Будь ласка, підтвердіть?
+Відновлення не буде ефективним до наступного збереження.';
+$lang['locfiledit_saved_bak'] = 'Резервне копіювання створеного файлу (%s)';
+$lang['locfiledit_save_bak'] = 'Резервна копія створюється при збереженні.';
+$lang['locfiledit_save_config'] = 'Файл успішно записаний.';
+$lang['locfiledit_save_file'] = 'Зберегти файл';
+$lang['locfiledit_show_default'] = 'Показати посилання на файл:';
+$lang['locfiledit_syntax_error'] = 'Синтаксична помилка! Файл не може бути збережений.';
+$lang['locfiledit_webmaster_only'] = 'Тільки веб-майстри можуть створювати або змінювати локальні файли.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Chỉnh sửa những tệp tin trên máy từ bảng điều khiển Quản trị viên.
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/vi_VN/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = 'Cấu hình cục bộ';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = 'Templates';
+$lang['locfiledit_onglet_lang'] = 'Ngôn ngữ';
+$lang['locfiledit_onglet_plug'] = 'Plugin cá nhân';
+$lang['locfiledit_cant_save'] = 'Tệp tin hiện tại không được phép ghi. Kiểm tra nếu thư mục "local/" có thể ghi được (chmod).';
+$lang['locfiledit_newfile'] = 'Tệp tin không tồn tại và sẽ được tạo ra bởi LocalFiles Editor';
+$lang['locfiledit_save_config'] = 'Tệp tin đã được ghi thành công.';
+$lang['locfiledit_show_default'] = 'Hiển thị tệp tin tham khảo: ';
+$lang['locfiledit_save_bak'] = 'Bản sao backup sẽ được tạo ra để dự phòng.';
+$lang['locfiledit_saved_bak'] = 'Tệp tin backup file được tạo ra (%s)';
+$lang['locfiledit_save_file'] = 'Lưu tệp tin';
+$lang['locfiledit_choose_file'] = 'Chọn tệp tin để hiệu chỉnh';
+$lang['locfiledit_edit'] = 'Hiệu chỉnh';
+$lang['locfiledit_restore'] = 'Phục hồi tệp tin backup';
+$lang['locfiledit_restore_confirm'] = 'Vui lòng xác nhận? Việc phục hồi sẽ không có hiệu lực cho đến lần dự phòng tiếp theo.';
+$lang['locfiledit_bak_loaded1'] = 'Tệp tin backup đã được nạp.';
+$lang['locfiledit_bak_loaded2'] = 'Bạn phải lưu lại tệp tin để phục hồi nó.';
+$lang['locfiledit_syntax_error'] = 'Lỗi cú pháp! Tệp tin không thể được lưu.';
+$lang['locfiledit_new_tpl'] = 'Tạo tệp tin mới';
+$lang['locfiledit_new_filename'] = 'Tên tệp tin';
+$lang['locfiledit_model'] = 'Mô hình';
+$lang['locfiledit_empty_page'] = 'Trang trống';
+$lang['locfiledit_parent_directory'] = 'Thư mục gốc';
+$lang['locfiledit_filename_error'] = 'Ký tự bị cấm trong tên tệp tin.';
+$lang['locfiledit_file_already_exists'] = 'Tệp tin đã có.';
+$lang['locfiledit_model_error'] = 'Bạn phải chọn một mô hình.';
+$lang['locfiledit_empty_filename'] = 'Bạn phải điền đủ tên tệp tin.';
+$lang['locfiledit_webmaster_only'] = 'Chỉ có webmasters mới có thể tạo hoặc biên tập tệp tin trên máy.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+通过管理员面板修改本地文件
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/language/zh_CN/plugin.lang.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['locfiledit_onglet_localconf'] = '本地配置';
+$lang['locfiledit_onglet_css'] = 'CSS';
+$lang['locfiledit_onglet_tpl'] = '模板';
+$lang['locfiledit_onglet_lang'] = '语言';
+$lang['locfiledit_onglet_plug'] = '个人插件';
+$lang['locfiledit_cant_save'] = '当前文件不可写入。请检查 "local/" 是否可写 (chmod).';
+$lang['locfiledit_newfile'] = '文件不存在，LocalFiles 编辑器将创建它';
+$lang['locfiledit_save_config'] = '文件已成功写入.';
+$lang['locfiledit_show_default'] = '显示相关文件: ';
+$lang['locfiledit_save_bak'] = '备份将被创建和保存.';
+$lang['locfiledit_saved_bak'] = '备份文件已创建 (%s)';
+$lang['locfiledit_save_file'] = '保存文件';
+$lang['locfiledit_choose_file'] = '选择要编辑的文件';
+$lang['locfiledit_edit'] = '编辑';
+$lang['locfiledit_restore'] = '恢复备份文件';
+$lang['locfiledit_restore_confirm'] = '请确认? 恢复在下一次保存前将不会生效.';
+$lang['locfiledit_bak_loaded1'] = '备份文件已加载.';
+$lang['locfiledit_bak_loaded2'] = '您必须保存文件以便将其恢复.';
+$lang['locfiledit_syntax_error'] = '语法错误! 文件不能被保存.';
+$lang['locfiledit_new_tpl'] = '创建新文件';
+$lang['locfiledit_new_filename'] = '文件名';
+$lang['locfiledit_model'] = '模块';
+$lang['locfiledit_empty_page'] = '空页面';
+$lang['locfiledit_parent_directory'] = '父目录';
+$lang['locfiledit_filename_error'] = '被禁用的文件名.';
+$lang['locfiledit_file_already_exists'] = '文件已存在.';
+$lang['locfiledit_model_error'] = '您必须选择一个模块.';
+$lang['locfiledit_empty_filename'] = '您必须填写文件名.';
+$lang['locfiledit_webmaster_only'] = '只有网站管理员才能创建或者修改本地文件.';
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/main.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/main.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/main.inc.php	(revision 14585)
@@ -0,0 +1,73 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+Plugin Name: LocalFiles Editor
+Version: 2.3.0
+Description: Edit local files from administration panel
+Plugin URI: http://piwigo.org/ext/extension_view.php?eid=144
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
+define('LOCALEDIT_PATH' , PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)) . '/');
+
+function localfiles_admin_menu($menu)
+{
+  array_push(
+    $menu,
+    array(
+      'NAME' => 'LocalFiles Editor',
+      'URL' => get_root_url().'admin.php?page=plugin-'.basename(dirname(__FILE__))
+      )
+    );
+  
+  return $menu;
+}
+
+function localfiles_css_link()
+{
+  global $template;
+  
+  $template->set_prefilter('themes', 'localfiles_css_link_prefilter');
+}
+
+function localfiles_css_link_prefilter($content, &$smarty)
+{
+  $search = '#{if isset\(\$theme.admin_uri\)}.*?{/if}#s';
+  $replacement = '
+{if isset($theme.admin_uri)}
+      <br><a href="{$theme.admin_uri}" class="tiptip" title="{\'Configuration\'|@translate}">{\'Configuration\'|@translate}</a>
+      | <a href="admin.php?page=plugin-LocalFilesEditor-css&amp;theme={$theme.id}">CSS</a>
+{else}
+      <br><a href="admin.php?page=plugin-LocalFilesEditor-css&amp;theme={$theme.id}">CSS</a>
+{/if}
+';
+
+  return preg_replace($search, $replacement, $content);
+}
+
+add_event_handler('get_admin_plugin_menu_links', 'localfiles_admin_menu');
+add_event_handler('loc_begin_admin', 'localfiles_css_link');
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/maintain.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/maintain.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/maintain.inc.php	(revision 14585)
@@ -0,0 +1,32 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+function plugin_uninstall()
+{
+  global $prefixeTable;
+
+  $query = 'DELETE FROM ' . CONFIG_TABLE . ' WHERE param=\'LocalFilesEditor\' LIMIT 1;';
+  pwg_query($query);
+}
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/show_default.php
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/show_default.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/show_default.php	(revision 14585)
@@ -0,0 +1,59 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH', '../../');
+define('IN_ADMIN', true);
+include_once(PHPWG_ROOT_PATH . 'include/common.inc.php');
+include_once(LOCALEDIT_PATH.'include/functions.inc.php');
+load_language('plugin.lang', LOCALEDIT_PATH);
+check_status(ACCESS_ADMINISTRATOR);
+
+if (isset($_GET['file']))
+{
+  $path = $_GET['file'];
+  if (!is_admin() or (!substr_count($path, 'config_default.inc.php') and !substr_count($path, '.lang.php')))
+  {
+  	die('Hacking attempt!');
+  }
+    
+  $template->set_filename('show_default', dirname(__FILE__) . '/template/show_default.tpl');
+  
+  $file = file_get_contents(PHPWG_ROOT_PATH . $path);
+  $title = str_replace('/', ' / ', $path);
+
+  $template->assign(array(
+    'TITLE' => $title,
+    'DEFAULT_CONTENT' => $file,
+    )
+  );
+
+  $page['body_id'] = 'thePopuphelpPage';
+
+  include(PHPWG_ROOT_PATH.'include/page_header.php');
+
+  $template->pparse('show_default');
+
+  include(PHPWG_ROOT_PATH.'include/page_tail.php');
+}
+
+?>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/template/admin.tpl
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/template/admin.tpl	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/template/admin.tpl	(revision 14585)
@@ -0,0 +1,103 @@
+{combine_script id="codemirror" path="plugins/LocalFilesEditor/codemirror/lib/codemirror.js"}
+{combine_script id="codemirror.xml" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/xml/xml.js"}
+{combine_script id="codemirror.javascript" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.js"}
+{combine_script id="codemirror.css" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/css/css.js"}
+{combine_script id="codemirror.clike" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/clike/clike.js"}
+{combine_script id="codemirror.htmlmixed" require="codemirror.xml,codemirror.javascript,codemirror.css" path="plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js"}
+{combine_script id="codemirror.php" require="codemirror.xml,codemirror.javascript,codemirror.css,codemirror.clike" path="plugins/LocalFilesEditor/codemirror/mode/php/php.js"}
+
+{combine_css path="plugins/LocalFilesEditor/codemirror/lib/codemirror.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/xml/xml.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/css/css.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/clike/clike.css"}
+{combine_css path="plugins/LocalFilesEditor/template/locfiledit.css"}
+
+{footer_script}
+if (document.getElementById("text") != null)
+  var editor = CodeMirror.fromTextArea(document.getElementById("text"), {ldelim}
+    matchBrackets: true,
+    mode: "{$CODEMIRROR_MODE}",
+    tabMode: "shift"
+  });
+{/footer_script}
+
+<div class="titrePage">
+  <h2>LocalFiles Editor</h2>
+</div>
+
+<form method="post" class="properties" action="{$F_ACTION}" ENCTYPE="multipart/form-data" name="form">
+
+<div id="LocalFilesEditor">
+
+<input type="hidden" value="{$zone_edit.EDITED_FILE}" name="edited_file"/>
+
+{if isset ($create_tpl)}
+  <table>
+    <tr>
+      <td style="text-align: right;">{'locfiledit_new_filename'|@translate}</td>
+      <td style="text-align: left;"><input type="text" size="55" maxlength="50" value="{$create_tpl.NEW_FILE_NAME}" name="tpl_name"/></td>
+    </tr>
+    <tr>
+      <td style="text-align: right;">{'locfiledit_parent_directory'|@translate}</td>
+      <td style="text-align: left;">{html_options name=tpl_parent options=$create_tpl.PARENT_OPTIONS selected=$create_tpl.PARENT_SELECTED}</td>
+    </tr>
+    <tr>
+      <td style="text-align: right;">{'locfiledit_model'|@translate}</td>
+      <td style="text-align: left;">{html_options name=tpl_model options=$create_tpl.MODEL_OPTIONS selected=$create_tpl.MODEL_SELECTED}</td>
+    </tr>
+  </table>
+<br><br>
+<input class="submit" type="submit" value="{'Submit'|@translate}" name="create_tpl" />
+{/if}
+
+{if isset ($css_lang_tpl)}
+<select name="file_to_edit">
+{foreach from=$css_lang_tpl.OPTIONS item=theme key=value}
+  <option value="{$value}" {if $value == $css_lang_tpl.SELECTED}selected="selected"{/if} {if is_numeric($value)}disabled="disabled"{/if}>{$theme}</option>
+{/foreach}
+</select>
+
+
+<input class="submit" type="submit" value="{'locfiledit_edit'|@translate}" name="edit" />
+<br><br>
+  {if isset ($css_lang_tpl.NEW_FILE_URL)}
+  <span class="{$css_lang_tpl.NEW_FILE_CLASS}">
+  <a href="{$css_lang_tpl.NEW_FILE_URL}">{'locfiledit_new_tpl'|@translate}</a>
+  </span>
+  {/if}
+{/if}
+
+{if isset ($zone_edit)}
+<div id="title_bar">
+{/if}
+
+{if !empty($show_default)}
+{foreach from=$show_default item=file name=default_loop}
+<span class="default_file">
+<a href="{$file.URL}" onclick="window.open( this.href, 'local_file', 'location=no,toolbar=no,menubar=no,status=no,resizable=yes,scrollbars=yes,width=800,height=700' ); return false;">{'locfiledit_show_default'|@translate} "{$file.FILE}"</a>
+</span>
+{if !($smarty.foreach.default_loop.last)}<br>{/if}
+{/foreach}
+{/if}
+
+{if isset ($zone_edit)}
+<span class="file_name">{$zone_edit.FILE_NAME}</span>
+</div> {* title_bar *}
+
+<textarea rows="30" cols="90" name="text" id="text">{$zone_edit.CONTENT_FILE}</textarea>
+<br>
+<input class="submit" type="submit" value="{'locfiledit_save_file'|@translate}" name="submit"/>
+
+{if isset ($restore)}
+<input class="submit" type="submit" value="{'locfiledit_restore'|@translate}" name="restore" onclick="return confirm('{'locfiledit_restore_confirm'|@translate|escape:'javascript'}');"/>
+{/if}
+
+{if isset ($restore_infos)}
+<br><br>
+{'locfiledit_save_bak'|@translate}
+{/if}
+
+{/if} {* zone_edit *}
+</div>
+</form>
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/template/locfiledit.css
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/template/locfiledit.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/template/locfiledit.css	(revision 14585)
@@ -0,0 +1,32 @@
+#LocalFilesEditor {
+  text-align: center;
+  margin: 0 2em;
+}
+
+#LocalFilesEditor #title_bar {
+  overflow: auto;
+}
+
+#LocalFilesEditor .file_name {
+  font-weight: bold;
+  float: left;
+}
+
+#LocalFilesEditor .default_file  {
+  float: right;
+}
+
+#LocalFilesEditor TD {
+  padding: 0.5em;
+}
+
+#LocalFilesEditor TEXTAREA, .CodeMirror {
+  background-color: #EEEEEE;
+  font-family: monospace,Arial,sans-serif;
+  font-size: 1.2em;
+  border: 1px solid #999999;
+  margin: 0.5em 0;
+  width: 100%;
+  min-height: 500px;
+  height: auto;
+}
Index: tags/2.4.0RC3/plugins/LocalFilesEditor/template/show_default.tpl
===================================================================
--- tags/2.4.0RC3/plugins/LocalFilesEditor/template/show_default.tpl	(revision 14585)
+++ tags/2.4.0RC3/plugins/LocalFilesEditor/template/show_default.tpl	(revision 14585)
@@ -0,0 +1,37 @@
+{combine_script id="codemirror" path="plugins/LocalFilesEditor/codemirror/lib/codemirror.js"}
+{combine_script id="codemirror.xml" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/xml/xml.js"}
+{combine_script id="codemirror.javascript" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.js"}
+{combine_script id="codemirror.css" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/css/css.js"}
+{combine_script id="codemirror.clike" require="codemirror" path="plugins/LocalFilesEditor/codemirror/mode/clike/clike.js"}
+{combine_script id="codemirror.htmlmixed" require="codemirror.xml,codemirror.javascript,codemirror.css" path="plugins/LocalFilesEditor/codemirror/mode/htmlmixed/htmlmixed.js"}
+{combine_script id="codemirror.php" require="codemirror.xml,codemirror.javascript,codemirror.css,codemirror.clike" path="plugins/LocalFilesEditor/codemirror/mode/php/php.js"}
+
+{combine_css path="plugins/LocalFilesEditor/codemirror/lib/codemirror.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/xml/xml.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/javascript/javascript.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/css/css.css"}
+{combine_css path="plugins/LocalFilesEditor/codemirror/mode/clike/clike.css"}
+{combine_css path="plugins/LocalFilesEditor/template/locfiledit.css"}
+
+{footer_script}
+var editor = CodeMirror.fromTextArea(document.getElementById("text"), {ldelim}
+  readOnly: true,
+  mode: "application/x-httpd-php"
+});
+{/footer_script}
+
+{html_head}
+<style type="text/css">
+#headbranch, #theHeader, #copyright {ldelim} display: none; }
+</style>
+{/html_head}
+
+<div id="LocalFilesEditor">
+
+<div id="title_bar">
+  <span class="file_name">{$TITLE}</span>
+</div>
+
+<textarea id="text" rows="30" cols="90" class="show_default_area">{$DEFAULT_CONTENT}</textarea>
+
+</div>
Index: tags/2.4.0RC3/plugins/admin_multi_view/controller.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/controller.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/controller.php	(revision 14585)
@@ -0,0 +1,250 @@
+<?php
+define('MULTIVIEW_CONTROLLER', 1);
+define('PHPWG_ROOT_PATH','../../');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+if (!is_admin() or !function_exists('multiview_user_init') )
+{
+  pwg_unset_session_var( 'multiview_as' );
+  pwg_unset_session_var( 'multiview_theme' );
+  pwg_unset_session_var( 'multiview_lang' );
+  pwg_unset_session_var( 'multiview_show_queries' );
+  pwg_unset_session_var( 'multiview_debug_l10n' );
+  pwg_unset_session_var( 'multiview_debug_template' );
+	pwg_unset_session_var( 'multiview_template_combine_files' );
+  pwg_unset_session_var( 'multiview_no_history' );
+?>
+
+<script type="text/javascript">
+  window.close();
+</script>
+<?php
+  exit();
+}
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+"http://www.w3.org/TR/html4/strict.dtd">
+<?php
+
+$refresh_main = false;
+
+if ( isset($_GET['view_as']) )
+{
+  if ($user['id']===$_GET['view_as'])
+    pwg_unset_session_var( 'multiview_as' );
+  else
+    pwg_set_session_var( 'multiview_as', (int)$_GET['view_as'] );
+  // user change resets theme/lang
+  pwg_unset_session_var( 'multiview_theme' );
+  pwg_unset_session_var( 'multiview_lang' );
+  $refresh_main = true;
+}
+if (pwg_get_session_var( 'multiview_as', $user['id']) != $user['id'] )
+  $view_as_user = build_user( pwg_get_session_var( 'multiview_as',0), false);
+else
+  $view_as_user = $user;
+
+if ( isset($_GET['theme']) )
+{
+  pwg_set_session_var( 'multiview_theme', $_GET['theme'] );
+  $refresh_main = true;
+}
+
+if ( isset($_GET['lang']) )
+{
+  pwg_set_session_var( 'multiview_lang', $_GET['lang'] );
+  $refresh_main = true;
+}
+
+if ( isset($_GET['show_queries']) )
+{
+  if ( $_GET['show_queries']> 0 )
+    pwg_set_session_var( 'multiview_show_queries', 1 );
+  else
+    pwg_unset_session_var( 'multiview_show_queries' );
+  $refresh_main = true;
+}
+
+if ( isset($_GET['debug_l10n']) )
+{
+  if ( $_GET['debug_l10n']>0 )
+    pwg_set_session_var( 'multiview_debug_l10n', 1 );
+  else
+    pwg_unset_session_var( 'multiview_debug_l10n' );
+  $refresh_main = true;
+}
+
+
+if ( isset($_GET['debug_template']) )
+{
+  if ( $_GET['debug_template']>0 )
+    pwg_set_session_var( 'multiview_debug_template', 1 );
+  else
+    pwg_unset_session_var( 'multiview_debug_template' );
+  $refresh_main = true;
+}
+
+if ( isset($_GET['template_combine_files']) )
+{
+  if ( $_GET['template_combine_files']==0 )
+    pwg_set_session_var( 'multiview_template_combine_files', 0 );
+  else
+    pwg_unset_session_var( 'multiview_template_combine_files' );
+  $refresh_main = true;
+}
+
+
+if ( isset($_GET['no_history']) )
+{
+  if ( $_GET['no_history']>0 )
+    pwg_set_session_var( 'multiview_no_history', 1 );
+  else
+    pwg_unset_session_var( 'multiview_no_history' );
+  $refresh_main = true;
+}
+
+$my_url = get_root_url().'plugins/'.basename(dirname(__FILE__)).'/'.basename(__FILE__);
+
+// +-----------------------------------------------------------------------+
+// | users                                                                 |
+$query = '
+SELECT '.$conf['user_fields']['id'].' AS id,'.$conf['user_fields']['username'].' AS username
+FROM '.USERS_TABLE.'
+  ORDER BY CONVERT('.$conf['user_fields']['username'].',CHAR)
+;';
+$user_map = simple_hash_from_query($query, 'id', 'username');
+
+$users_html = '<select onchange="document.location = this.options[this.selectedIndex].value;">';
+foreach( $user_map as $id=>$username)
+{
+  $selected = ($id==$view_as_user['id']) ? 'selected="selected"' : '';
+  $users_html .=
+    '<option value="'
+    .$my_url.'?view_as='.$id
+    .'" '.$selected.'>'
+    .$username
+    .'</option>';
+}
+$users_html.= '</select>';
+
+
+// +-----------------------------------------------------------------------+
+// | templates                                                             |
+$my_theme = '';
+$themes_html='<select onchange="document.location = this.options[this.selectedIndex].value;">';
+include_once(PHPWG_ROOT_PATH.'admin/include/themes.class.php');
+$themes = new themes();
+foreach ($themes->fs_themes as $pwg_theme => $fs_theme)
+{
+  $selected = $pwg_theme == pwg_get_session_var( 'multiview_theme', $view_as_user['theme'] ) ? 'selected="selected"' : '';
+  $my_theme = $selected == '' ? $my_theme : 'themes/'.$view_as_user['theme'];
+  $themes_html .=
+    '<option value="'
+    .$my_url.'?theme='.$pwg_theme
+    .'" '.$selected.'>'
+    .$pwg_theme
+    .'</option>';
+}
+$themes_html .= '</select>';
+
+// +-----------------------------------------------------------------------+
+// | language                                                              |
+$lang_html='<select onchange="document.location = this.options[this.selectedIndex].value;">';
+foreach (get_languages() as $language_code => $language_name)
+{
+  $selected = $language_code == pwg_get_session_var( 'multiview_lang', $view_as_user['language'] ) ? 'selected="selected"' : '';
+  $lang_html .=
+    '<option value="'
+    .$my_url.'?lang='.$language_code
+    .'" '.$selected.'>'
+    .$language_name
+    .'</option>';
+}
+$lang_html .= '</select>';
+
+// +-----------------------------------------------------------------------+
+// | show queries                                                          |
+$show_queries_html='';
+if (!$conf['show_queries'])
+{
+  if ( !pwg_get_session_var( 'multiview_show_queries', 0 ) )
+    $show_queries_html.='<a href="'.$my_url.'?show_queries=1">Show SQL queries</a>';
+  else
+    $show_queries_html.='<a href="'.$my_url.'?show_queries=0">Hide SQL queries</a>';
+}
+
+// +-----------------------------------------------------------------------+
+// | debug language                                                        |
+$debug_l10n_html='';
+if (!$conf['debug_l10n'])
+{
+  if ( !pwg_get_session_var( 'multiview_debug_l10n', 0 ) )
+    $debug_l10n_html.='<a href="'.$my_url.'?debug_l10n=1">Debug language</a>';
+  else
+    $debug_l10n_html.='<a href="'.$my_url.'?debug_l10n=0">Revert debug language</a>';
+}
+
+// +-----------------------------------------------------------------------+
+// | debug template                                                        |
+$debug_template_html='';
+if (!$conf['debug_template'])
+{
+  if ( !pwg_get_session_var( 'multiview_debug_template', 0 ) )
+    $debug_template_html.='<a href="'.$my_url.'?debug_template=1">Debug template</a>';
+  else
+    $debug_template_html.='<a href="'.$my_url.'?debug_template=0">Revert debug template</a>';
+}
+
+// +-----------------------------------------------------------------------+
+// | template combine files                                                |
+$template_combine_files_html='';
+if ($conf['template_combine_files'])
+{
+  if ( pwg_get_session_var( 'multiview_template_combine_files', 1 ) )
+    $template_combine_files_html.='<a href="'.$my_url.'?template_combine_files=0">Don\'t combine js&amp;css</a>';
+  else
+    $template_combine_files_html.='<a href="'.$my_url.'?template_combine_files=1">Combine js&amp;css</a>';
+}
+
+// +-----------------------------------------------------------------------+
+// | no history                                                            |
+$no_history_html='';
+if ( !pwg_get_session_var( 'multiview_no_history', 0 ) )
+  $no_history_html.='<a href="'.$my_url.'?no_history=1">Don\'t save to visit history</a>';
+else
+  $no_history_html.='<a href="'.$my_url.'?no_history=0">Save to visit history</a>';
+
+?>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=<?php echo get_pwg_charset() ?>">
+<title>Controller</title>
+
+</head>
+<body>
+<div>
+<script type="text/javascript">
+if (window.opener==null) {
+  window.close();
+  document.write("<"+"h2>How did you get here ???<"+"/h2>");
+}
+</script>
+
+<table>
+<tr><td>User</td><td><?php echo $users_html; ?></td></tr>
+
+<tr><td>Theme</td><td><?php echo $themes_html; ?></td></tr>
+
+<tr><td>Lang</td><td><?php echo $lang_html; ?></td></tr>
+</table>
+<?php echo implode( "<br/>\n", array($show_queries_html, $debug_l10n_html, $debug_template_html, $template_combine_files_html, $no_history_html) ); ?>
+
+<script type="text/javascript">
+<?php
+  if ($refresh_main) echo '
+window.opener.location = window.opener.location;';
+?>
+</script>
+</div>
+</body>
+</html>
Index: tags/2.4.0RC3/plugins/admin_multi_view/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/is_admin.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/is_admin.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/is_admin.inc.php	(revision 14585)
@@ -0,0 +1,53 @@
+<?php
+if (! defined('MULTIVIEW_CONTROLLER') )
+{
+  global $user;
+  $view_as = pwg_get_session_var( 'multiview_as', 0 );
+  if ($view_as)
+  {
+    $user = build_user( $view_as, true);
+  }
+  $theme = pwg_get_session_var( 'multiview_theme', '' );
+  if ( !empty($theme) )
+  {
+    $user['theme'] = $theme;
+    unset($user['admin_theme']);
+  }
+  $lang = pwg_get_session_var( 'multiview_lang', '' );
+  if ( !empty($lang) )
+  {
+    $user['language'] = $lang;
+  }
+  global $conf;
+  if (pwg_get_session_var( 'multiview_show_queries', 0 ))
+    $conf['show_queries'] = true;
+  if (pwg_get_session_var( 'multiview_debug_l10n', 0 ))
+    $conf['debug_l10n'] = true;
+  if (pwg_get_session_var( 'multiview_debug_template', 0 ))
+    $conf['debug_template'] = true;
+  if (!pwg_get_session_var( 'multiview_template_combine_files', 1 ))
+    $conf['template_combine_files'] = false;
+		if (pwg_get_session_var( 'multiview_no_history', 0 ))
+  {
+    add_event_handler( 'pwg_log_allowed', create_function( '', 'return false;' ) );
+  }
+}
+
+add_event_handler('loc_end_page_header', 'multiview_loc_end_page_header');
+
+function multiview_loc_end_page_header()
+{
+  global $template;
+  $my_root_url = get_root_url().'plugins/'. basename(dirname(__FILE__)).'/';
+  $js =
+'<script type="text/javascript">
+var theController = window.open("", "mview_controller", "alwaysRaised=yes,dependent=yes,toolbar=no,height=200,width=220,menubar=no,resizable=yes,scrollbars=yes,status=no");
+if ( theController.location.toString()=="about:blank" || !theController.location.toString().match(/^(https?.*\/)controller\.php(\?.+)?$/))
+{
+  theController.location = "'.$my_root_url.'controller.php";
+}
+</script>';
+
+  $template->append( 'head_elements', $js );
+}
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+يسمح للمسؤولين لمشاهدة المعرض كضيوف و / أو تغيير لغة و / أو واجهة عرض  . عملية لتصحيح التغييرات
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ar_SA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ca_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ca_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ca_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Aquest complement permet als administradors visualitzar la galeria com si f&oacute;s un convidat, canviar d'idioma i tema sobre la marxa. &Uacute;til per a tasques de depuraci&oacute;.
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Umožní administrátorùm pracovat s galerií jako hosté, mìnit jazyk a šablony vzhledu. Praktické na testování zmìn...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/cs_CZ/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Erlaubt Administratoren die Galerie als Gast oder in einer anderen Sprache anzusehen ohne sich abzumelden. Praktisch für die Fehlersuche...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/de_DE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Allows administrators to view gallery as guests and/or change the language and/or theme on the fly. Practical to debug changes...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/en_UK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Permite a los administradores para ver la galería como un invitado y / o cambiar el idioma y / o cambiar el tema sobre la marcha. Útiles para la depuración ...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/es_ES/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Permet aux administrateurs de voir la galerie en tant qu'invité et/ou changer la langue et/ou changer de thème à la volée. Pratique pour le débuggage...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/fr_FR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+אפשר למנהל ראשי לצפות בגלריה כאורח ו\או לשנות את השפה ו\או לשנות את הערכה. שימושי כדי לאתר באגים...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/he_IL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Dozvoljava administratorima pregledavanje galerije kao gost korisnik i/ili mijenjanje jezika i/ili teme u letu. Praktično za ispravljanje grešaka kod izmjena...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/hr_HR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Lehetővé teszi a rendszergazdák számára, hogy vendégként tekinthessék meg a galériát, módosíthatják a nyelvet és/vagy a témát menet közben. Praktikus hibakeresés, változtatásoknál ... 
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/hu_HU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Permette agli amministratori di vedere la galleria come se fosse un'ospite e/o di cambiare lingua e/o cambiare tema facilmente. Pratico per il debug...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/it_IT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ja_JP/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ja_JP/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ja_JP/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+საშუალებას აძლევს ადმინისტრატორს ნახოს გალერეა როგორც სტუმარმა და/ან შეცვალოს ენა ან/და თემა. სასარგებლოა გამართვისათვის, შეტანილი ცვლილებების გასწორებისათვის...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ka_GE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Dod iespēju Administratoriem apskatīt galeriju kā viesim un/vai nomainīt valodu un/vai tēmu ar vienu darbību. Derīgi skaņošanas darbos...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/lv_LV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Biedt administrators de mogelijkheid om een galerie als gast te bekijken en/of makkelijk van taal en/of thema te veranderen. Practisch bij het debuggen van wijzigingen...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/nl_NL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Tillater administratorer å se galleriet som gjest og/eller endre språk og/eller tema i umiddelbart. Praktisk for å feilsøke ved endringer...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/no_NO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Pozwala administratorom przeglądać galerię jako gość oraz zmieniać ustawienia języka i grafiki. Praktyczne do weryfikacji zmian...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/pl_PL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+description -> Permite aos Administradores ver a galeria como Convidados e/ou mudar a Linguagem e/ou tema instantaneamente. Práctico para testar mudanças...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/pt_PT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ro_RO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ro_RO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ro_RO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Permite administratorilor să vizualizeze galeria &icirc;n calitate de invitaţi şi/sau de a schimba limba şi/sau tema instantaneu. Practic pentru a depana schimbări făcute...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/description.txt	(revision 14585)
@@ -0,0 +1,3 @@
+Позволяет администраторам просматривать галерею в качестве гостей и / или
+изменить язык и / или тему на "лету". Практично для
+отладки изменения ...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/ru_RU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Umožňuje administrátorom vidieť galériu aho hosťom a/alebo zmeniť jazyk a-alebo šablónu. Prakticky ladiť zmeny...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sk_SK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Дозвољава администратору да види галерију као гост и/или промени језик и/или тему уживо. Практично за проверу промена...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sr_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Tilllåter administratör att se gallerier som gäst och/eller ändra språk eller tema direkt. Prakiskt vid debug av ändringar...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/sv_SE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Adminlerin galeriye misafir olarak bakmasini kabul et, yada dil veya temayi degis. Ayiklama modunu degistir.
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/tr_TR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Cho phép Quản trị viên xem thư viện hình như một tài khoản khách và/hoặc thay đổi ngôn ngữ hiển thị và/hoặc giao diện trong thời gian ghé vào thư viện hình. Rất thiết thực cho việc thay đổi những hiệu chỉnh...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/vi_VN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+允许管理员以客人身份查看相册，或者改变语言和主题。部分改变和调试等...
Index: tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/language/zh_CN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/admin_multi_view/main.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/admin_multi_view/main.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/admin_multi_view/main.inc.php	(revision 14585)
@@ -0,0 +1,42 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 Piwigo team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+Plugin Name: Multi view
+Version: 2.3.0
+Description: Allows administrators to view gallery as guests and/or change the language and/or theme on the fly. Practical to debug changes...
+Plugin URI: http://piwigo.org/ext/extension_view.php?eid=286
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+add_event_handler('user_init', 'multiview_user_init' );
+
+function multiview_user_init()
+{
+  if (!is_admin())
+    return;
+  include_once( dirname(__FILE__).'/is_admin.inc.php' );
+}
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/initialize.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/initialize.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/initialize.inc.php	(revision 14585)
@@ -0,0 +1,116 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+add_event_handler('list_check_integrity', 'c13y_upgrade');
+
+function c13y_upgrade($c13y)
+{
+  global $conf;
+
+  load_language('plugin.lang', dirname(__FILE__).'/');
+
+  $to_deactivate = true;
+
+  /* Check user with same e-mail */
+  $query = '
+select
+  count(*)
+from
+  '.USERS_TABLE.'
+where
+  '.$conf['user_fields']['email'].' is not null
+group by
+  upper('.$conf['user_fields']['email'].')
+having count(*) > 1
+limit 1
+;';
+
+  if (pwg_db_fetch_row(pwg_query($query)))
+  {
+    $to_deactivate = false;
+    $c13y->add_anomaly(
+      l10n('c13y_dbl_email_user'),
+      null,
+      null,
+      l10n('c13y_correction_dbl_email_user'));
+  }
+
+  /* Check plugin included in Piwigo sources */
+  $included_plugins = array('dew', 'UpToDate', 'PluginsManager', 'LinkRoot');
+  $query = '
+select
+  id
+from
+  '.PLUGINS_TABLE.'
+where
+  id in ('.
+    implode(
+      ',',
+      array_map(
+        create_function('$s', 'return "\'".$s."\'";'),
+        $included_plugins
+        )
+      )
+      .')
+;';
+
+  $result = pwg_query($query);
+  while ($row = pwg_db_fetch_assoc($result))
+  {
+    $to_deactivate = false;
+
+    $uninstall_msg_link =
+      '<a href="'.
+      PHPWG_ROOT_PATH.
+      'admin.php?page=plugins_list&amp;plugin='.$row['id'].'&amp;action=uninstall'.
+      '" onclick="window.open(this.href, \'\'); return false;">'.
+      sprintf(l10n('c13y_correction_obsolete_plugin'), $row['id']).'</a>';
+
+    $c13y->add_anomaly(
+      l10n('c13y_obsolete_plugin'),
+      null,
+      null,
+      $uninstall_msg_link);
+  }
+
+  /* Check if this plugin must be deactivate */
+  if ($to_deactivate)
+  {
+    $query = '
+REPLACE INTO '.PLUGINS_TABLE.'
+(id, state)
+VALUES (\'c13y_upgrade\', \'inactive\')
+;';
+    pwg_query($query);
+
+  global $page;
+  $page['infos'][] = l10n('c13y_upgrade_no_anomaly');
+  }
+}
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+التحقق من سلامة ترقيات
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ar_SA/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'الكشف عن أي شذوذ بعد ترقية التطبيق، "فحص التحديثات "البرنامج المساعد والمعطلة. ';
+$lang['c13y_dbl_email_user'] = 'المستخدمين مع نفس عنوان البريد الإلكتروني';
+$lang['c13y_correction_dbl_email_user'] = 'احذف المستخدمين المكررين';
+$lang['c13y_obsolete_plugin'] = 'اضافات مهملة';
+$lang['c13y_correction_obsolete_plugin'] = ' أضافة موجودة في هذا الاصدار، يجب إلغاء تثبيتها "%s"';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Comprova la integritat de les actualitzacions.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ca_ES/plugin.lang.php	(revision 14585)
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Eliminar usuaris duplicats';
+$lang['c13y_correction_obsolete_plugin'] = 'El complement (plug-in) "%s" ja s\'ha inclòs de sèrie en aquesta versió de l\'aplicació. Desinstal·la\'l.';
+$lang['c13y_dbl_email_user'] = 'Usuaris amb la mateixa adreça de correu electrònic';
+$lang['c13y_obsolete_plugin'] = 'Complement (plug-in) obsolet.';
+$lang['c13y_upgrade_no_anomaly'] = 'No s\'ha detectat cap anomalia després de l\'actualitzar-se l\'aplicació. El complement (plug-in) "Comprovar actualitzacions" s\'ha desactivat.';
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Kontroluje integritu aktualizací.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/cs_CZ/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Po aktualizaci aplikace nebyla detekována žádná anomálie. Doplnìk "Kontrola aktualizací" byl deaktivován.';
+$lang['c13y_dbl_email_user'] = 'Uživatelé se stejnou e-mail adresou';
+$lang['c13y_correction_dbl_email_user'] = 'Zrušit duplicitní uživatele';
+$lang['c13y_obsolete_plugin'] = 'Zastaralý doplnìk';
+$lang['c13y_correction_obsolete_plugin'] = 'Doplnìk "%s" byl souèástí této verze aplikace a musí být odinstalován.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Überprüfe die Integrität der Updates
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/de_DE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Keine Unregelmäßigkeiten festgestellt nach der Aktualisierung der Anwendung'; /* TODO , "Check upgrades" plugin was deactivated.'*/
+$lang['c13y_dbl_email_user'] = 'Benutzer mit der gleichen E-Mail-Adresse';
+$lang['c13y_correction_dbl_email_user'] = 'Lösche doppelte Benutzer';
+$lang['c13y_obsolete_plugin'] = 'Veraltete Plugin';
+$lang['c13y_correction_obsolete_plugin'] = 'Das Plugin "%s" wurde deaktiviert da es nicht kompatibel zu dieser Version der Piwigo ist. Bitte deinstallieren Sie es.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Check integrity of upgrades.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/en_UK/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'No anomaly detected after application upgrade, "Check upgrades" plugin was deactivated.';
+$lang['c13y_dbl_email_user'] = 'Users with same email address';
+$lang['c13y_correction_dbl_email_user'] = 'Delete duplicate users';
+$lang['c13y_obsolete_plugin'] = 'Obsolete plugin';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin has been included in this application version and you must uninstall it.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Comprobación de integridad de las actualizaciones.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/es_ES/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Detectada ninguna anomalía después de la puesta al día de la aplicación, el plugin Check upgrades ha sido desactivado.';
+$lang['c13y_dbl_email_user'] = 'Usuarios con mismo correo electrónico';
+$lang['c13y_correction_dbl_email_user'] = 'Suprima a los utilizadores en duplicado';
+$lang['c13y_obsolete_plugin'] = 'Plugin obsoleto';
+$lang['c13y_correction_obsolete_plugin'] = 'El plugin "%s" ha sido incluido en esta versión de la aplicación y usted debe desinstalarlo.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Contrôle d'intégrité des mises à jour.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/fr_FR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Pas d\'anomalie détectée après la mise à jour de l\'application, le plugin "Check upgrades" a été désactivé.';
+$lang['c13y_dbl_email_user'] = 'Utilisateurs avec la même adresse email';
+$lang['c13y_correction_dbl_email_user'] = 'Supprimez les utilisateurs en double';
+$lang['c13y_obsolete_plugin'] = 'Plugin obsolète';
+$lang['c13y_correction_obsolete_plugin'] = 'Le plugin "%s" a été inclus dans cette version de l\'application et vous devez le désinstaller.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+בדיקת תקינות של השדרוגים.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/he_IL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'לא זוהו חריגות לאחר שידרוג התוכנה, התוסף "בדוק עבור עדכונים"  מנוטרל.';
+$lang['c13y_dbl_email_user'] = 'יש משתמש רשום כבר עם אותו דואר אלקטרוני';
+$lang['c13y_correction_dbl_email_user'] = 'מחק משתמשים כפולים';
+$lang['c13y_obsolete_plugin'] = 'תוסף ישן';
+$lang['c13y_correction_obsolete_plugin'] = 'התוסף "%s" כבר כלול בגירסה זאת עליך להסיר אותו.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Provjera integriteta kod nadogradnji.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hr_HR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['c13y_upgrade_no_anomaly'] = 'Nisu detektirane anomalije nakon nadogradnje aplikacije, plugin "Check upgrades" je deaktiviran.';
+$lang['c13y_dbl_email_user'] = 'Korisnici s istom e-mail adresom';
+$lang['c13y_correction_dbl_email_user'] = 'Obriši duplicirane korisnike';
+$lang['c13y_obsolete_plugin'] = 'Zastarjeli plugin';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin je uključen u ovoj verziji aplikacije i morate ga deinstalirati.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Ellenőrizze a frissítés teljességét.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/hu_HU/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Nincs rendellenesség a frissítés után, "Check upgrades" bővítmény kikapcsolva.';
+$lang['c13y_dbl_email_user'] = 'Felhasználók azonos e-mail címmel';
+$lang['c13y_correction_dbl_email_user'] = 'Duplikált felhasználók törlése';
+$lang['c13y_obsolete_plugin'] = 'Elavult bővítmény';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" bővítmény nem kompatibilis a használt verzióval, el kell távolítani.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Controllo d'integrità degli aggiornamenti.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/it_IT/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Nessun anomalia individuata dopo l\'aggiornamento dell\'applicatione. Il plugin "Check upgrades" è stato disattivato.';
+$lang['c13y_dbl_email_user'] = 'Utenti con lo stesso indirizzo email';
+$lang['c13y_correction_dbl_email_user'] = 'Cancellare i doppioni';
+$lang['c13y_obsolete_plugin'] = 'Plugin obsoleto';
+$lang['c13y_correction_obsolete_plugin'] = 'Il plugin "%s" è stato incluso in questa versione dell\'applicazione e dovete disinstallarlo.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Check integrity of upgrades.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ja_JP/plugin.lang.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['c13y_upgrade_no_anomaly'] = 'アプリケーション・アップグレード後、異常なし、「アップグレード確認」のプラグインは無効化された';
+$lang['c13y_dbl_email_user'] = '同じメールアドレスがあるユーザー';
+$lang['c13y_correction_dbl_email_user'] = '複数のユーザーを削除';
+$lang['c13y_obsolete_plugin'] = '旧プラグイン';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" のプラグインはこのアプリケーションのバージョンに含まれており、アンインストールする必要があります。';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+შეამოწმეთ განახლების მთლიანობა.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ka_GE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'განახლების შემდეგ ანომალიები არ არის აღმოჩენილი, მოდული "განახლების შემოწმება"  გამორთულია.';
+$lang['c13y_dbl_email_user'] = 'მომხმარებლები ელ.ფოსტის იმავე მისამართით';
+$lang['c13y_correction_dbl_email_user'] = 'დუბლირებული მომხმარებლების წაშლა';
+$lang['c13y_obsolete_plugin'] = 'მოძველებული მოდული';
+$lang['c13y_correction_obsolete_plugin'] = 'მოდული "%s" გამორთულია, რადგან ის არ არის თავსებადი Piwigo–ს ამ ვერსიასთან. გთხოვთ წაშალოთ იგი.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Uzlabojumu integritātes pārbaude.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/lv_LV/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Pēc aplikācijas uzlabojuma nav novērotas nekādas anomālijas, "Check upgrades" spraudnis tika deaktivēts.';
+$lang['c13y_dbl_email_user'] = 'Lietotāji ar vienādām e-pasta adresēm';
+$lang['c13y_correction_dbl_email_user'] = 'Izdzēst dubultlietotājus';
+$lang['c13y_obsolete_plugin'] = 'Novecojis spraudnis';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" spraudnis jau ir iekļauts šajā aplikācijas versijā un Jums tas ir jāatinstalē.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Controleer de integriteit van de upgrades.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/nl_NL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$lang['c13y_upgrade_no_anomaly'] = 'Geen afwijkingen geconstateerd na de applicatie-upgrade, de "Check upgrades" plugin is gedeactiveerd.';
+$lang['c13y_dbl_email_user'] = 'Gebruikers met hetzelfde email-adres';
+$lang['c13y_correction_dbl_email_user'] = 'Verwijder dubbele gebruikers';
+$lang['c13y_obsolete_plugin'] = 'Verouderde plugin';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin is opgenomen in deze versie. U dient de plugin te verwijderen.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Sjekker integriteten til oppdateringer.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/no_NO/plugin.lang.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Ingen unormaliteter oppdaget etter program oppdatering, "Sjekk for oppdatering" tilleggsverktøy ble oppdaget.';
+$lang['c13y_dbl_email_user'] = 'bruker med samme email addresse';
+$lang['c13y_correction_dbl_email_user'] = 'Slett duplikat bruker';
+$lang['c13y_obsolete_plugin'] = 'Ubrukte tilleggsverktøy';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" tilleggsverktøy har blitt inkludert i denne applikasjons versjonen og du må avinstallere den.';
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Sprawdzanie integralności uaktualnień
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pl_PL/plugin.lang.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Nie wykryto żadnych problemów po aktualizacji aplikacji, wtyczka "Sprawdź aktualizacje" została wyłączona.';
+$lang['c13y_dbl_email_user'] = 'Adresy e-mail użytkowników są identyczne';
+$lang['c13y_correction_dbl_email_user'] = 'Usuwanie powtórzonych nazw użytkowników';
+$lang['c13y_obsolete_plugin'] = 'Wtyczka jest nieaktualna';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" wtyczka została dołączona do tej wersji aplikacji i musisz ją odinstalować.';
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Teste a integridade das actualizações.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/pt_PT/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Nenhuma anomalia detectada depois da actualização. O plugin "Check upgrades" foi desactivado.';
+$lang['c13y_dbl_email_user'] = 'Utilizadores com o mesmo endereço de email';
+$lang['c13y_correction_dbl_email_user'] = 'Apagar Utilizadores duplicados';
+$lang['c13y_obsolete_plugin'] = ' Plugin obsoleto';
+$lang['c13y_correction_obsolete_plugin'] = 'O plugin "%s" foi incluído nesta versão da aplicação e deverá ser desinstalado primeiro.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Проверьте целостность обновления.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/ru_RU/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Аномалии не обнаружены после применения обновления. плагин "Проверить обновления" был отключен.';
+$lang['c13y_dbl_email_user'] = 'Пользователи с тем же адресом электронной почты';
+$lang['c13y_correction_dbl_email_user'] = 'Удаление дубликатов пользователей';
+$lang['c13y_obsolete_plugin'] = 'Устаревший плагин';
+$lang['c13y_correction_obsolete_plugin'] = 'Модуль "%s" отключена, потому что она не совместима с этой версией Piwigo . Пожалуйста, удалите его.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Skontrolovať úplnosť upgradov.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sk_SK/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Žiadne anomálie neboli zistené po aplikácii upgrade, "Kontrola upgradov" plugin bol deaktivovaný.';
+$lang['c13y_dbl_email_user'] = 'Používatelia s rovnakou emailovou adresou';
+$lang['c13y_correction_dbl_email_user'] = 'Vymazanie duplicitných používateľov';
+$lang['c13y_obsolete_plugin'] = 'Zastaraný plugin';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin bol obsiahnutý v tejto verzii aplikácie a musíte ho odinštalovať.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Провера стабилности надоградње.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sr_RS/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Недостаци нису откривени после надоградње, додатак "Провера надоградње" није активиран.';
+$lang['c13y_dbl_email_user'] = 'Корисници са истом адресом електронске поште';
+$lang['c13y_correction_dbl_email_user'] = 'Обришите дупле кориснике';
+$lang['c13y_obsolete_plugin'] = 'Застарео додатак';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" додатак је укључен у ову верзију апликације и морате да га избаците.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Kolla ändringarnas integritet.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/sv_SE/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Igget onormalt upptäkt efter uppdatering av applikationen, "Kolla uppdateringar" plugin deaktiverades.';
+$lang['c13y_dbl_email_user'] = 'Änvändare med samma e-postadress';
+$lang['c13y_correction_dbl_email_user'] = 'Ta bort dubbla änvändare';
+$lang['c13y_obsolete_plugin'] = 'Utången plugin';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin har  inkluderats i denna applikationsversion och du måste avinstallera den.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Yükseltmelerin bütünlügünü kontrol edin.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/tr_TR/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Anormallik bulunamadi ,"Check upgrades" eklentisi pasiflestirildi..';
+$lang['c13y_dbl_email_user'] = 'Ayni emaili kullananlar';
+$lang['c13y_correction_dbl_email_user'] = 'Ayni emaili kullananlari sil';
+$lang['c13y_obsolete_plugin'] = 'Eski eklenti';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" Bu uygulama yeni sürümü dahil edilmistir eklentiyi kaldirmaniz gerekir.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/uk_UA/plugin.lang.php	(revision 14585)
@@ -0,0 +1,28 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+$lang['c13y_correction_dbl_email_user'] = 'Видалення дублікатів користувачів';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" плаґін був включений в цій версії програми, і ви повинні видалити його.';
+$lang['c13y_dbl_email_user'] = 'Користувачі, що мають одну і ту ж адресу електронної пошти';
+$lang['c13y_obsolete_plugin'] = 'Застарілий плаґін';
+$lang['c13y_upgrade_no_anomaly'] = 'Немає аномалії, виявленої після застосування оновлення, плаґін "Check upgrades" був відключений.';
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Kiểm tra tính nguyên vẹn của bản nâng cấp.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/vi_VN/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = 'Không có sự bất thường nào được phát hiện sau khi nâng cấp ứng dụng, plugin "Dò tìm bản nâng cấp" đã được tắt.';
+$lang['c13y_dbl_email_user'] = 'Người dùng có cùng địa chỉ email';
+$lang['c13y_correction_dbl_email_user'] = 'Xóa các người dùng có trùng tên';
+$lang['c13y_obsolete_plugin'] = 'Plugin lỗi thời';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" plugin đã được kèm theo trong phiên bản của ứng dụng này và bạn bắt buộc phải gỡ bỏ nó ra.';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+检查完整的升级.
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/language/zh_CN/plugin.lang.php	(revision 14585)
@@ -0,0 +1,31 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// --------- Starting below: New or revised $lang ---- from Butterfly (1.8)
+$lang['c13y_upgrade_no_anomaly'] = '应用程序升级后没有发现异常，"检查更新" 插件已停用.';
+$lang['c13y_dbl_email_user'] = '用户使用相同的邮件地址';
+$lang['c13y_correction_dbl_email_user'] = '删除重复的用户';
+$lang['c13y_obsolete_plugin'] = '已无效的插件';
+$lang['c13y_correction_obsolete_plugin'] = '"%s" 插件已包含此应用程序版本，您必须先卸载。';
+
+?>
Index: tags/2.4.0RC3/plugins/c13y_upgrade/main.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/c13y_upgrade/main.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/c13y_upgrade/main.inc.php	(revision 14585)
@@ -0,0 +1,46 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 Piwigo team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+Plugin Name: Check upgrades
+Version: 2.3.0
+Description: Check integrity of upgrades.
+Plugin URI: http://piwigo.org/ext/extension_view.php?eid=287
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+if (!defined('PHPWG_ROOT_PATH'))
+{
+  die('Hacking attempt!');
+}
+
+if (in_array(script_basename(), array('popuphelp', 'admin')))
+{
+  if (defined('IN_ADMIN') and IN_ADMIN)
+  {
+   include_once(dirname(__FILE__).'/initialize.inc.php');
+  }
+}
+
+?>
Index: tags/2.4.0RC3/plugins/index.php
===================================================================
--- tags/2.4.0RC3/plugins/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/flags.tpl
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/flags.tpl	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/flags.tpl	(revision 14585)
@@ -0,0 +1,50 @@
+</ul>
+<ul class="categoryActions">
+<li class="menuf">
+  <div>
+    <ul>
+      <li>
+        <a rel="nofollow" href="#" class="activeFlag">
+          <img class="flags" src="{$lang_switch.Active.img}" alt="{$lang_switch.Active.alt}" title="{$lang_switch.Active.alt}"/>
+        </a>
+<!--[if lte IE 6]>
+        <a rel="nofollow" href="#">
+          <img class="flags" src="{$lang_switch.Active.img}" alt="{$lang_switch.Active.alt}" title="{$lang_switch.Active.alt}"/>
+          <table>
+            <tr>
+              <td>
+<![endif]-->
+        <ul class="flag-pan">
+         <li class="languageSwitchBoxTitle">{'Language'|@translate}</li>
+
+{foreach from=$lang_switch.flags key=code item=flag name=f}
+          <li>
+            <a rel="nofollow" href="{$flag.url}">
+              <img class="flags" src="{$flag.img}" alt="{$flag.alt}" title="{$flag.alt}"/> {$flag.title}
+            </a>
+          </li>
+{/foreach}
+
+        </ul>
+<!--[if lte IE 6]>
+              </td>
+            </tr>
+          </table>
+        </a>
+<![endif]-->
+      </li>
+    </ul>
+  </div>
+</li>
+
+{combine_css path="plugins/language_switch/language_switch-default.css"}
+
+{if $themeconf.name eq 'Sylvia'}
+{combine_css path="plugins/language_switch/language_switch-Sylvia.css"}
+{/if}
+
+{html_head}
+<!--[if lte IE 6]>
+<link rel="stylesheet" type="text/css" href="{$ROOT_URL}plugins/language_switch/language_switch-ie6.css">
+<![endif]-->
+{/html_head}
Index: tags/2.4.0RC3/plugins/language_switch/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/ar_SA/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ar_SA/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ar_SA/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+التبديل إلى لغة أخرى من الأعلام على الصفحة الرئيسية لمعرض الصور
Index: tags/2.4.0RC3/plugins/language_switch/language/ar_SA/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ar_SA/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ar_SA/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/ca_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ca_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ca_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Canvia f&agrave;cilment l'idioma de la galeria. Es mostren banderes com a s&iacute;mbol dels idiomes. Mostra els idiomes disponibles.
Index: tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Pøepíná do jiného jazyka podle vlajeèek na hlavní stránce galerie.
Index: tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/cs_CZ/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/de_DE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/de_DE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/de_DE/description.txt	(revision 14585)
@@ -0,0 +1,2 @@
+Ändert die Sprache der Galerie durch anklicken der Länderflaggen auf der
+Seite.
Index: tags/2.4.0RC3/plugins/language_switch/language/de_DE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/de_DE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/de_DE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/en_UK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/en_UK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/en_UK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Switch to another language from flags on your gallery home page.
Index: tags/2.4.0RC3/plugins/language_switch/language/en_UK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/en_UK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/en_UK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/es_ES/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/es_ES/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/es_ES/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Cambiar el idioma de la galería con facilidad de las banderas de la página de inicio.
Index: tags/2.4.0RC3/plugins/language_switch/language/es_ES/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/es_ES/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/es_ES/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/fr_FR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/fr_FR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/fr_FR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Changez la langue de la galerie facilement à partir des drapeaux de la page d'accueil.
Index: tags/2.4.0RC3/plugins/language_switch/language/fr_FR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/fr_FR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/fr_FR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/he_IL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/he_IL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/he_IL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+שנה לשפה אחרת מהדגל בדף הבית בגלריה שלך.
Index: tags/2.4.0RC3/plugins/language_switch/language/he_IL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/he_IL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/he_IL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/hr_HR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/hr_HR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/hr_HR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Prebacivanje na drugi jezik koristeći zastave na naslovnici galerije.
Index: tags/2.4.0RC3/plugins/language_switch/language/hr_HR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/hr_HR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/hr_HR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/hu_HU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/hu_HU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/hu_HU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Galéria nyelvének változtatása a honlapon, zászló segítségével.
Index: tags/2.4.0RC3/plugins/language_switch/language/hu_HU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/hu_HU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/hu_HU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/it_IT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/it_IT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/it_IT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Cambiate facilmente la lingua della galleria grazie alle bandierine sulla pagina principale.
Index: tags/2.4.0RC3/plugins/language_switch/language/it_IT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/it_IT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/it_IT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/ja_JP/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ja_JP/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ja_JP/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/ka_GE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ka_GE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ka_GE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+გადასვლა სხვა ენაზე დროშების საშუალებით თქვენი გალერეის მთავარ გვერდზე.
Index: tags/2.4.0RC3/plugins/language_switch/language/ka_GE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ka_GE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ka_GE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/lv_LV/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/lv_LV/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/lv_LV/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Pārslēgšanās uz citu valodu, izmantojot karodziņus Jūsu galerijas mājas lapā
Index: tags/2.4.0RC3/plugins/language_switch/language/lv_LV/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/lv_LV/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/lv_LV/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/nl_NL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/nl_NL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/nl_NL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Gebruik de landen-vlaggetjes op uw galerie-startpagina om van taal te wisselen.
Index: tags/2.4.0RC3/plugins/language_switch/language/nl_NL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/nl_NL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/nl_NL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/no_NO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/no_NO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/no_NO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Bytt til et annet språk via språkvelger på ditt galleris hjemmeside.
Index: tags/2.4.0RC3/plugins/language_switch/language/no_NO/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/no_NO/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/no_NO/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/pl_PL/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/pl_PL/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/pl_PL/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Przełączanie na inny język poprzez ikony flag na Twojej stronie głównej galerii
Index: tags/2.4.0RC3/plugins/language_switch/language/pl_PL/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/pl_PL/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/pl_PL/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/pt_PT/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/pt_PT/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/pt_PT/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Mude para outra Linguagem clicando numa bandeira na página de entrada da sua galeria.
Index: tags/2.4.0RC3/plugins/language_switch/language/pt_PT/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/pt_PT/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/pt_PT/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/ro_RO/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ro_RO/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ro_RO/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Comutați &icirc;ntr-o o altă limbă folosind steagurile de pe pagina de start a galeriei.
Index: tags/2.4.0RC3/plugins/language_switch/language/ru_RU/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ru_RU/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ru_RU/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Переход на другой язык с помощью флагов на вашей домашней странице галереи.
Index: tags/2.4.0RC3/plugins/language_switch/language/ru_RU/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/ru_RU/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/ru_RU/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/sh_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sh_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sh_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Promenite jezik preko zastavica na početnoj strani Va&scaron;e galerije.
Index: tags/2.4.0RC3/plugins/language_switch/language/sk_SK/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sk_SK/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sk_SK/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Prepínac na iný jazyk z vlajok vo Vašej galérii.
Index: tags/2.4.0RC3/plugins/language_switch/language/sk_SK/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sk_SK/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sk_SK/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/sr_RS/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sr_RS/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sr_RS/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Промена на други језик преко заставе на почетној страници Ваше галерије.
Index: tags/2.4.0RC3/plugins/language_switch/language/sr_RS/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sr_RS/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sr_RS/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/sv_SE/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sv_SE/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sv_SE/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Byt till annat språk via flaggorna på dit galleri's hemsida.
Index: tags/2.4.0RC3/plugins/language_switch/language/sv_SE/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/sv_SE/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/sv_SE/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/th_TH/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/th_TH/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/th_TH/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/tr_TR/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/tr_TR/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/tr_TR/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Ana sayfadaki dil bayraklarindan dil degisimi.
Index: tags/2.4.0RC3/plugins/language_switch/language/tr_TR/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/tr_TR/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/tr_TR/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/vi_VN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/vi_VN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/vi_VN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+Chuyển sang ngôn ngữ khác từ biểu tượng lá cờ trên trang chủ Thư viện hình của bạn.
Index: tags/2.4.0RC3/plugins/language_switch/language/vi_VN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/vi_VN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/vi_VN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language/zh_CN/description.txt
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/zh_CN/description.txt	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/zh_CN/description.txt	(revision 14585)
@@ -0,0 +1,1 @@
+在您的画廊首页使用旗帜图标来选择其他语言
Index: tags/2.4.0RC3/plugins/language_switch/language/zh_CN/index.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language/zh_CN/index.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language/zh_CN/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/plugins/language_switch/language_switch-Sylvia.css
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language_switch-Sylvia.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language_switch-Sylvia.css	(revision 14585)
@@ -0,0 +1,7 @@
+.flag-pan { border:1px solid; background-color: #111; }
+.content ul.categoryActions .flag-pan a:hover {color:#ddd}
+.menuf .flags {border-color: #000 !important; }
+
+.flag-pan { 	border-radius: 8px; } /* round corners with CSS3 compliant browsers */
+.flag-pan { -moz-border-radius:8px; } 
+.flag-pan { -webkit-border-radius: 8px; }
Index: tags/2.4.0RC3/plugins/language_switch/language_switch-default.css
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language_switch-default.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language_switch-default.css	(revision 14585)
@@ -0,0 +1,19 @@
+.flag-pan { width:380px; z-index:100; border:2px solid #CDCDCD; background-color: #f0f0f0; padding: 2px 5px 10px 5px; }
+.languageSwitchBoxTitle {display:block;width:370px;text-align:center;margin:5px auto;font-weight:bold;color:#464646;}
+.content ul.categoryActions .flag-pan a img.flags { margin-bottom: -2px; }
+.content ul.categoryActions .flag-pan a { margin: 0; border:none; color:#464646;}
+.content ul.categoryActions .flag-pan a:hover {color:black}
+.menuf { width:30px; height:24px; display: inline; } 
+.menuf ul li a, .menuf ul li a:visited {display:block; text-decoration:none; width:120px; height:27px; text-align:left; line-height:27px; overflow:hidden; border:none}
+.menuf ul {padding:0; margin:0; list-style: none;}
+.menuf ul li {float:left; position:relative; right:0; top:0; margin-left:5px}
+.menuf ul li ul {display: none;}/* specific to non IE browsers */
+.menuf li a:hover { border:1px dotted #464646}
+.menuf .flags {border:1px solid #ddd !important; margin-top:5px; }
+.menuf ul li:hover ul {display:block; position:absolute; top:0px; right:0px; }
+.menuf ul li:hover ul li ul {display: none;}
+.menuf ul li:hover ul li {display: block;}
+.menuf ul li:hover ul li a {display:block;}
+.menuf ul li:hover ul li:hover ul {display:block; position:absolute; left:0px; top:0;}
+
+.menuf ul li a.activeFlag, .menuf ul li a.activeFlag:visited {width:30px;}
Index: tags/2.4.0RC3/plugins/language_switch/language_switch-ie6.css
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language_switch-ie6.css	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language_switch-ie6.css	(revision 14585)
@@ -0,0 +1,6 @@
+.menuf ul li a.hide, .menuf ul li a:visited.hide {display:none;}
+.menuf ul li a:hover ul li a.hide {display:none;}
+.menuf ul li a:hover ul { display:block; position:absolute; top:-15%; left:-85%; }
+.menuf ul li a:hover ul li a {display:block; }
+.menuf ul li a:hover ul li a ul {visibility:hidden;}
+.menuf ul li a:hover ul li a:hover ul {visibility:visible; position:absolute; left:105px; top:0;}
Index: tags/2.4.0RC3/plugins/language_switch/language_switch.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/language_switch.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/language_switch.inc.php	(revision 14585)
@@ -0,0 +1,155 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+if (!defined('LANGUAGE_SWITCH_PATH'))
+{
+  define('LANGUAGE_SWITCH_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');
+}
+
+class language_controler
+{
+  static public function _switch()
+  {
+    global $user;
+    
+    if (!defined('PHPWG_ROOT_PATH'))
+    {
+      die('Hacking attempt!');
+    }
+    
+    $same = $user['language'];
+    
+    if (isset($_GET['lang']))
+    {
+      include_once(PHPWG_ROOT_PATH . 'admin/include/languages.class.php');
+      $languages = new languages();
+      if (!in_array($_GET['lang'], array_keys($languages->fs_languages)))
+      {
+        $_GET['lang'] = PHPWG_DEFAULT_LANGUAGE;
+      }
+
+      if (!empty($_GET['lang']) and file_exists(PHPWG_ROOT_PATH.'language/'.$_GET['lang'].'/common.lang.php'))
+      {
+        if (is_a_guest() or is_generic())
+        {
+          pwg_set_session_var('lang_switch', $_GET['lang']);
+        }
+        else
+        {
+          $query = '
+UPDATE '.USER_INFOS_TABLE.'
+  SET language = \''.$_GET['lang'].'\'
+  WHERE user_id = '.$user['id'].'
+;';
+          pwg_query($query);
+        }
+        
+        $user['language'] = $_GET['lang'];
+      }
+    }
+    elseif ((is_a_guest() or is_generic()))
+    {
+      $user['language'] = pwg_get_session_var('lang_switch', $user['language']);
+    }
+    
+    // Reload language only if it isn't the same one
+    if ( $same !== $user['language'])
+    {
+      load_language('common.lang', '', array('language'=>$user['language']));
+      
+      load_language(
+        'lang',
+        PHPWG_ROOT_PATH.PWG_LOCAL_DIR,
+        array(
+          'language' => $user['language'],
+          'no_fallback' => true,
+          'local' => true
+          )
+        );
+      
+      if (defined('IN_ADMIN') and IN_ADMIN)
+      {
+        // Never currently
+        load_language('admin.lang', '', array('language'=>$user['language']));
+      }
+    }
+  }
+  
+  static public function _flags()
+  {
+    global $user, $template, $conf;
+    
+    $available_lang = get_languages();
+    
+    if (isset($conf['no_flag_languages']))
+    {
+      $available_lang = array_diff_key($available_lang, array_flip($conf['no_flag_languages']));
+    }
+    
+    $url_starting = get_query_string_diff(array('lang'));
+
+    foreach ($available_lang as $code => $displayname)
+    {
+      $qlc = array (
+        'url' => add_url_params(duplicate_index_url(), array('lang'=> $code)),
+        'alt' => ucwords($displayname),
+        'title' => substr($displayname, 0, -4), // remove [FR] or [RU]
+        'img' => get_root_url().'language/'.$code.'/'.$code.'.jpg',
+        );
+      
+      $lsw['flags'][$code] = $qlc ;
+      
+      if ($code == $user['language'])
+      {
+        $lsw['Active'] = $qlc;
+      }
+    }
+    
+    $template->set_filename('language_flags', dirname(__FILE__) . '/flags.tpl');
+    
+    $lsw['side'] = ceil(sqrt(count($available_lang)));
+    
+    $template->assign(
+      array(
+        'lang_switch'=> $lsw,
+        'LANGUAGE_SWITCH_PATH' => LANGUAGE_SWITCH_PATH,
+        )
+      );
+    
+    $flags = $template->parse('language_flags',true);
+    $template->clear_assign('lang_switch');
+    $template->concat( 'PLUGIN_INDEX_ACTIONS', $flags);
+  }
+}
+
+  /* {html_head} usage function */
+  /* See flags.tpl for example (due no catenation available) */
+if (!function_exists('Componant_exists'))
+{
+  function Componant_exists($path, $file)
+  {
+    return file_exists( $path . $file);
+  }
+}
+
+?>
Index: tags/2.4.0RC3/plugins/language_switch/main.inc.php
===================================================================
--- tags/2.4.0RC3/plugins/language_switch/main.inc.php	(revision 14585)
+++ tags/2.4.0RC3/plugins/language_switch/main.inc.php	(revision 14585)
@@ -0,0 +1,37 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/*
+Plugin Name: Language Switch
+Version: 2.3.0
+Description: Switch to another language from flags on your gallery home page.
+Plugin URI: http://piwigo.org/ext/extension_view.php?eid=123
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+
+include_once(PHPWG_PLUGINS_PATH.'language_switch/language_switch.inc.php');
+$language_controler = new language_controler();
+add_event_handler('loading_lang', array(&$language_controler, '_switch'), 5 );
+add_event_handler('loc_end_index', array(&$language_controler, '_flags'), 95 );
+?>
Index: tags/2.4.0RC3/popuphelp.php
===================================================================
--- tags/2.4.0RC3/popuphelp.php	(revision 14585)
+++ tags/2.4.0RC3/popuphelp.php	(revision 14585)
@@ -0,0 +1,81 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+define('PWG_HELP', true);
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+$page['body_id'] = 'thePopuphelpPage';
+$title = l10n('Piwigo Help');
+$page['page_banner'] = '';
+$page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+
+if
+  (
+    isset($_GET['page'])
+    and preg_match('/^[a-z_]*$/', $_GET['page'])
+  )
+{
+  $help_content =
+    load_language('help/'.$_GET['page'].'.html', '', array('return'=>true) );
+
+  if ($help_content == false)
+  {
+    $help_content = '';
+  }
+
+  $help_content = trigger_event(
+    'get_popup_help_content', $help_content, $_GET['page']);
+}
+else
+{
+  die('Hacking attempt!');
+}
+
+$template->set_filename('popuphelp','popuphelp.tpl');
+
+$template->assign(
+  array
+  (
+    'HELP_CONTENT' => $help_content
+  ));
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->pparse('popuphelp');
+
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+
+?>
Index: tags/2.4.0RC3/profile.php
===================================================================
--- tags/2.4.0RC3/profile.php	(revision 14585)
+++ tags/2.4.0RC3/profile.php	(revision 14585)
@@ -0,0 +1,342 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// customize appearance of the site for a user
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+if (!defined('PHPWG_ROOT_PATH'))
+{//direct script access
+  define('PHPWG_ROOT_PATH','./');
+  include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+
+  // +-----------------------------------------------------------------------+
+  // | Check Access and exit when user status is not ok                      |
+  // +-----------------------------------------------------------------------+
+  check_status(ACCESS_CLASSIC);
+
+  if (!empty($_POST))
+  {
+    check_pwg_token();
+  }
+
+  $userdata = $user;
+
+  trigger_action('loc_begin_profile');
+
+// Reset to default (Guest) custom settings
+  if (isset($_POST['reset_to_default']))
+  {
+    $fields = array(
+      'nb_image_page', 'expand',
+      'show_nb_comments', 'show_nb_hits', 'recent_period', 'show_nb_hits'
+      );
+
+    // Get the Guest custom settings
+    $query = '
+SELECT '.implode(',', $fields).'
+  FROM '.USER_INFOS_TABLE.'
+  WHERE user_id = '.$conf['default_user_id'].'
+;';
+    $result = pwg_query($query);
+    $default_user = pwg_db_fetch_assoc($result);
+    $userdata = array_merge($userdata, $default_user);
+  }
+
+  save_profile_from_post($userdata, $page['errors']);
+
+  $title= l10n('Your Gallery Customization');
+  $page['body_id'] = 'theProfilePage';
+  $template->set_filename('profile', 'profile.tpl');
+
+  load_profile_in_template(
+    get_root_url().'profile.php', // action
+    make_index_url(), // for redirect
+    $userdata );
+
+  
+  // include menubar
+  $themeconf = $template->get_template_vars('themeconf');
+  if (!isset($themeconf['hide_menu_on']) OR !in_array('theProfilePage', $themeconf['hide_menu_on']))
+  {
+    include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+  }
+  
+  include(PHPWG_ROOT_PATH.'include/page_header.php');
+  trigger_action('loc_end_profile');
+  $template->pparse('profile');
+  include(PHPWG_ROOT_PATH.'include/page_tail.php');
+}
+
+//------------------------------------------------------ update & customization
+function save_profile_from_post($userdata, &$errors)
+{
+  global $conf, $page;
+  $errors = array();
+
+  if (!isset($_POST['validate']))
+  {
+    return false;
+  }
+
+  $special_user = in_array($userdata['id'], array($conf['guest_id'], $conf['default_user_id']));
+  if ($special_user)
+  {
+    unset(
+      $_POST['username'],
+      $_POST['mail_address'],
+      $_POST['password'],
+      $_POST['use_new_pwd'],
+      $_POST['passwordConf'],
+      $_POST['theme'],
+      $_POST['language']
+      );
+    $_POST['theme'] = get_default_theme();
+    $_POST['language'] = get_default_language();
+  }
+  
+  if (!defined('IN_ADMIN'))
+  {
+    unset($_POST['username']);
+  }
+
+  if ($conf['allow_user_customization'] or defined('IN_ADMIN'))
+  {
+    $int_pattern = '/^\d+$/';
+    if (empty($_POST['nb_image_page'])
+        or (!preg_match($int_pattern, $_POST['nb_image_page'])))
+    {
+      $errors[] = l10n('The number of photos per page must be a not null scalar');
+    }
+
+    // periods must be integer values, they represents number of days
+    if (!preg_match($int_pattern, $_POST['recent_period'])
+        or $_POST['recent_period'] <= 0)
+    {
+      $errors[] = l10n('Recent period must be a positive integer value') ;
+    }
+
+    if (!in_array($_POST['language'], array_keys(get_languages())))
+    {
+      die('Hacking attempt, incorrect language value');
+    }
+
+    if (!in_array($_POST['theme'], array_keys(get_pwg_themes())))
+    {
+      die('Hacking attempt, incorrect theme value');
+    }
+  }
+
+  if (isset($_POST['mail_address']))
+  {
+    // if $_POST and $userdata have are same email
+    // validate_mail_address allows, however, to check email
+    $mail_error = validate_mail_address($userdata['id'], $_POST['mail_address']);
+    if (!empty($mail_error))
+    {
+      $errors[] = $mail_error;
+    }
+  }
+
+  if (!empty($_POST['use_new_pwd']))
+  {
+    // password must be the same as its confirmation
+    if ($_POST['use_new_pwd'] != $_POST['passwordConf'])
+    {
+      $errors[] = l10n('The passwords do not match');
+    }
+
+    if ( !defined('IN_ADMIN') )
+    {// changing password requires old password
+      $query = '
+  SELECT '.$conf['user_fields']['password'].' AS password
+    FROM '.USERS_TABLE.'
+    WHERE '.$conf['user_fields']['id'].' = \''.$userdata['id'].'\'
+  ;';
+      list($current_password) = pwg_db_fetch_row(pwg_query($query));
+
+      if ($conf['pass_convert']($_POST['password']) != $current_password)
+      {
+        $errors[] = l10n('Current password is wrong');
+      }
+    }
+  }
+
+  if (count($errors) == 0)
+  {
+    // mass_updates function
+    include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+    if (isset($_POST['mail_address']))
+    {
+      // update common user informations
+      $fields = array($conf['user_fields']['email']);
+
+      $data = array();
+      $data{$conf['user_fields']['id']} = $userdata['id'];
+      $data{$conf['user_fields']['email']} = $_POST['mail_address'];
+
+      // password is updated only if filled
+      if (!empty($_POST['use_new_pwd']))
+      {
+        array_push($fields, $conf['user_fields']['password']);
+        // password is encrpyted with function $conf['pass_convert']
+        $data{$conf['user_fields']['password']} = $conf['pass_convert']($_POST['use_new_pwd']);
+      }
+      
+      // username is updated only if allowed
+      if (!empty($_POST['username']))
+      {
+        if ($_POST['username'] != $userdata['username'] and get_userid($_POST['username']))
+        {
+          array_push($page['errors'], l10n('this login is already used'));
+          unset($_POST['redirect']);
+        }
+        else
+        {
+          array_push($fields, $conf['user_fields']['username']);
+          $data{$conf['user_fields']['username']} = $_POST['username'];
+          
+          // send email to the user
+          if ($_POST['username'] != $userdata['username'])
+          {
+            include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+            switch_lang_to($userdata['language']);
+            
+            $keyargs_content = array(
+              get_l10n_args('Hello', ''),
+              get_l10n_args('Your username has been successfully changed to : %s', $_POST['username']),
+              );
+              
+            pwg_mail(
+              $_POST['mail_address'],
+              array(
+                'subject' => '['.$conf['gallery_title'].'] '.l10n('Username modification'),
+                'content' => l10n_args($keyargs_content),
+                'content_format' => 'text/plain',
+                )
+              );
+              
+            switch_lang_back();
+          }
+        }
+      }
+      
+      mass_updates(USERS_TABLE,
+                   array(
+                    'primary' => array($conf['user_fields']['id']),
+                    'update' => $fields
+                    ),
+                   array($data));
+    }
+
+    if ($conf['allow_user_customization'] or defined('IN_ADMIN'))
+    {
+      // update user "additional" informations (specific to Piwigo)
+      $fields = array(
+        'nb_image_page', 'language',
+        'expand', 'show_nb_hits', 'recent_period', 'theme'
+        );
+        
+      if ($conf['activate_comments'])
+      {
+        array_push($fields, 'show_nb_comments');
+      }
+
+      $data = array();
+      $data['user_id'] = $userdata['id'];
+
+      foreach ($fields as $field)
+      {
+        if (isset($_POST[$field]))
+        {
+          $data[$field] = $_POST[$field];
+        }
+      }
+      mass_updates(USER_INFOS_TABLE,
+                   array('primary' => array('user_id'), 'update' => $fields),
+                   array($data));
+    }
+    trigger_action( 'save_profile_from_post', $userdata['id'] );
+
+    if (!empty($_POST['redirect']))
+    {
+      redirect($_POST['redirect']);
+    }
+  }
+  return true;
+}
+
+
+function load_profile_in_template($url_action, $url_redirect, $userdata)
+{
+  global $template, $conf;
+
+  $template->set_filename('profile_content', 'profile_content.tpl');
+
+  $template->assign('radio_options',
+    array(
+      'true' => l10n('Yes'),
+      'false' => l10n('No')));
+
+  $template->assign(
+    array(
+      'USERNAME'=>stripslashes($userdata['username']),
+      'EMAIL'=>get_email_address_as_display_text(@$userdata['email']),
+      'ALLOW_USER_CUSTOMIZATION'=>$conf['allow_user_customization'],
+      'ACTIVATE_COMMENTS'=>$conf['activate_comments'],
+      'NB_IMAGE_PAGE'=>$userdata['nb_image_page'],
+      'RECENT_PERIOD'=>$userdata['recent_period'],
+      'EXPAND' =>$userdata['expand'] ? 'true' : 'false',
+      'NB_COMMENTS'=>$userdata['show_nb_comments'] ? 'true' : 'false',
+      'NB_HITS'=>$userdata['show_nb_hits'] ? 'true' : 'false',
+      'REDIRECT' => $url_redirect,
+      'F_ACTION'=>$url_action,
+      ));
+
+  $template->assign('template_selection', $userdata['theme']);
+  $template->assign('template_options', get_pwg_themes());
+
+  foreach (get_languages() as $language_code => $language_name)
+  {
+    if (isset($_POST['submit']) or $userdata['language'] == $language_code)
+    {
+      $template->assign('language_selection', $language_code);
+    }
+    $language_options[$language_code] = $language_name;
+  }
+
+  $template->assign('language_options', $language_options);
+
+  $special_user = in_array($userdata['id'], array($conf['guest_id'], $conf['default_user_id']));
+  $template->assign('SPECIAL_USER', $special_user);
+  $template->assign('IN_ADMIN', defined('IN_ADMIN'));
+
+  // allow plugins to add their own form data to content
+  trigger_action( 'load_profile_in_template', $userdata );
+
+  $template->assign('PWG_TOKEN', get_pwg_token());
+  $template->assign_var_from_handle('PROFILE_CONTENT', 'profile_content');
+}
+?>
Index: tags/2.4.0RC3/qsearch.php
===================================================================
--- tags/2.4.0RC3/qsearch.php	(revision 14585)
+++ tags/2.4.0RC3/qsearch.php	(revision 14585)
@@ -0,0 +1,74 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+if (empty($_GET['q']))
+{
+  redirect( make_index_url() );
+}
+
+$search = array();
+$search['q']=$_GET['q'];
+
+$query = '
+SElECT id FROM '.SEARCH_TABLE.'
+  WHERE rules = \''.addslashes(serialize($search)).'\'
+;';
+$search_id = array_from_query( $query, 'id');
+if ( !empty($search_id) )
+{
+  $search_id = $search_id[0];
+  $query = '
+UPDATE '.SEARCH_TABLE.'
+  SET last_seen=NOW()
+  WHERE id='.$search_id;
+  pwg_query($query);
+}
+else
+{
+  $query ='
+INSERT INTO '.SEARCH_TABLE.'
+  (rules, last_seen)
+  VALUES
+  (\''.addslashes(serialize($search)).'\', NOW() )
+;';
+  pwg_query($query);
+  $search_id = pwg_db_insert_id(SEARCH_TABLE);
+}
+
+redirect(
+  make_index_url(
+    array(
+      'section' => 'search',
+      'search'  => $search_id,
+      )
+    )
+  );
+?>
Index: tags/2.4.0RC3/random.php
===================================================================
--- tags/2.4.0RC3/random.php	(revision 14585)
+++ tags/2.4.0RC3/random.php	(revision 14585)
@@ -0,0 +1,63 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                          define and include                           |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+// +-----------------------------------------------------------------------+
+// |                     generate random element list                      |
+// +-----------------------------------------------------------------------+
+
+$query = '
+SELECT id
+  FROM '.IMAGES_TABLE.'
+    INNER JOIN '.IMAGE_CATEGORY_TABLE.' AS ic ON id = ic.image_id
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'category_id',
+        'visible_categories' => 'category_id',
+        'visible_images' => 'id'
+      ),
+    'WHERE'
+  ).'
+  ORDER BY '.DB_RANDOM_FUNCTION.'()
+  LIMIT '.min(50, $conf['top_number'],$user['nb_image_page']).'
+;';
+
+// +-----------------------------------------------------------------------+
+// |                                redirect                               |
+// +-----------------------------------------------------------------------+
+
+redirect(make_index_url(array('list' => array_from_query($query, 'id'))));
+?>
Index: tags/2.4.0RC3/register.php
===================================================================
--- tags/2.4.0RC3/register.php	(revision 14585)
+++ tags/2.4.0RC3/register.php	(revision 14585)
@@ -0,0 +1,133 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//----------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_FREE);
+
+//----------------------------------------------------------- user registration
+
+if (!$conf['allow_user_registration'])
+{
+  page_forbidden('User registration closed');
+}
+
+if (isset($_POST['submit']))
+{
+  if (!verify_ephemeral_key(@$_POST['key']))
+  {
+		set_status_header(403);
+    array_push($page['errors'], 'Invalid/expired form key');
+  }
+
+  if ($_POST['password'] != $_POST['password_conf'])
+  {
+    array_push($page['errors'], l10n('please enter your password again'));
+  }
+
+  $page['errors'] =
+      register_user($_POST['login'],
+                    $_POST['password'],
+                    $_POST['mail_address'],
+                    true,
+                    $page['errors']);
+
+  if (count($page['errors']) == 0)
+  {
+    // email notification
+    if (isset($_POST['send_password_by_mail']) and isset($_POST['mail_address']))
+    {
+      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
+            
+      $keyargs_content = array(
+        get_l10n_args('Hello %s,', $_POST['login']),
+        get_l10n_args('Thank you for registering at %s!', $conf['gallery_title']),
+        get_l10n_args('', ''),
+        get_l10n_args('Here are your connection settings', ''),
+        get_l10n_args('Username: %s', $_POST['login']),
+        get_l10n_args('Password: %s', $_POST['password']),
+        get_l10n_args('Email: %s', $_POST['mail_address']),
+        get_l10n_args('', ''),
+        get_l10n_args('If you think you\'ve received this email in error, please contact us at %s', get_webmaster_mail_address()),
+        );
+        
+      pwg_mail(
+        $_POST['mail_address'],
+        array(
+          'subject' => '['.$conf['gallery_title'].'] '.l10n('Registration'),
+          'content' => l10n_args($keyargs_content),
+          'content_format' => 'text/plain',
+          )
+        );
+        
+      $_SESSION['page_infos'][] = l10n('Successfully registered, you will soon receive an email with your connection settings. Welcome!');
+    }
+    
+    // log user and redirect
+    $user_id = get_userid($_POST['login']);
+    log_user($user_id, false);
+    redirect(make_index_url());
+  }
+	$registration_post_key = get_ephemeral_key(2);
+}
+else
+{
+	$registration_post_key = get_ephemeral_key(6);
+}
+
+$login = !empty($_POST['login'])?htmlspecialchars(stripslashes($_POST['login'])):'';
+$email = !empty($_POST['mail_address'])?htmlspecialchars(stripslashes($_POST['mail_address'])):'';
+
+//----------------------------------------------------- template initialization
+//
+// Start output of page
+//
+$title= l10n('Registration');
+$page['body_id'] = 'theRegisterPage';
+
+$template->set_filenames( array('register'=>'register.tpl') );
+$template->assign(array(
+  'U_HOME' => make_index_url(),
+	'F_KEY' => $registration_post_key,
+  'F_ACTION' => 'register.php',
+  'F_LOGIN' => $login,
+  'F_EMAIL' => $email,
+  'obligatory_user_mail_address' => $conf['obligatory_user_mail_address'],
+  ));
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theRegisterPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->parse('register');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/search.php
===================================================================
--- tags/2.4.0RC3/search.php	(revision 14585)
+++ tags/2.4.0RC3/search.php	(revision 14585)
@@ -0,0 +1,236 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//--------------------------------------------------------------------- include
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when user status is not ok                      |
+// +-----------------------------------------------------------------------+
+check_status(ACCESS_GUEST);
+
+//------------------------------------------------------------------ form check
+$search = array();
+if (isset($_POST['submit']))
+{
+  foreach ($_POST as $post_key => $post_value)
+  {
+    if (!is_array($post_value))
+    {
+      $_POST[$post_key] = pwg_db_real_escape_string($post_value);
+    }
+  }  
+  
+  if (isset($_POST['search_allwords'])
+      and !preg_match('/^\s*$/', $_POST['search_allwords']))
+  {
+    $drop_char_match = array(
+      '-','^','$',';','#','&','(',')','<','>','`','\'','"','|',',','@','_',
+      '?','%','~','.','[',']','{','}',':','\\','/','=','\'','!','*');
+    $drop_char_replace = array(
+      ' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','','',' ',' ',' ',' ','',' ',
+      ' ',' ',' ',' ',' ',' ',' ',' ','' ,' ',' ',' ',' ',' ');
+
+    // Split words
+    $search['fields']['allwords'] = array(
+      'words' => array_unique(
+        preg_split(
+          '/\s+/',
+          str_replace(
+            $drop_char_match,
+            $drop_char_replace,
+            $_POST['search_allwords']
+            )
+          )
+        ),
+      'mode' => $_POST['mode'],
+      );
+  }
+
+  if (isset($_POST['tags']))
+  {
+    check_input_parameter('tags', $_POST, true, PATTERN_ID);
+    
+    $search['fields']['tags'] = array(
+      'words' => $_POST['tags'],
+      'mode'  => $_POST['tag_mode'],
+      );
+  }
+
+  if ($_POST['search_author'])
+  {
+    $search['fields']['author'] = array(
+      'words' => preg_split(
+        '/\s+/',
+        $_POST['search_author']
+        ),
+      'mode' => 'OR',
+      );
+  }
+
+  if (isset($_POST['cat']))
+  {
+    check_input_parameter('cat', $_POST, true, PATTERN_ID);
+    
+    $search['fields']['cat'] = array(
+      'words'   => $_POST['cat'],
+      'sub_inc' => ($_POST['subcats-included'] == 1) ? true : false,
+      );
+  }
+
+  // dates
+  $type_date = $_POST['date_type'];
+
+  if (!empty($_POST['start_year']))
+  {
+    $search['fields'][$type_date.'-after'] = array(
+      'date' => sprintf(
+	'%d-%02d-%02d',
+	$_POST['start_year'],
+	$_POST['start_month'] != 0 ? $_POST['start_month'] : '01',
+	$_POST['start_day']   != 0 ? $_POST['start_day']   : '01'
+        ),
+      'inc' => true,
+      );
+  }
+
+  if (!empty($_POST['end_year']))
+  {
+    $search['fields'][$type_date.'-before'] = array(
+      'date' => sprintf(
+	'%d-%02d-%02d',
+	$_POST['end_year'],
+	$_POST['end_month'] != 0 ? $_POST['end_month'] : '12',
+	$_POST['end_day']   != 0 ? $_POST['end_day']   : '31'
+      ),
+      'inc' => true,
+      );
+  }
+
+  if (!empty($search))
+  {
+    // default search mode : each clause must be respected
+    $search['mode'] = 'AND';
+
+    // register search rules in database, then they will be available on
+    // thumbnails page and picture page.
+    $query ='
+INSERT INTO '.SEARCH_TABLE.'
+  (rules, last_seen)
+  VALUES
+  (\''.serialize($search).'\', NOW())
+;';
+    pwg_query($query);
+
+    $search_id = pwg_db_insert_id(SEARCH_TABLE);
+  }
+  else
+  {
+    array_push($page['errors'], l10n('Empty query. No criteria has been entered.'));
+  }
+}
+//----------------------------------------------------------------- redirection
+if (isset($_POST['submit']) and count($page['errors']) == 0)
+{
+  redirect(
+    make_index_url(
+      array(
+        'section' => 'search',
+        'search'  => $search_id,
+        )
+      )
+    );
+}
+//----------------------------------------------------- template initialization
+
+//
+// Start output of page
+//
+$title= l10n('Search');
+$page['body_id'] = 'theSearchPage';
+
+$template->set_filename('search' ,'search.tpl' );
+
+$month_list = $lang['month'];
+$month_list[0]='------------';
+ksort($month_list);
+
+$template->assign(
+  array(
+    'F_SEARCH_ACTION' => 'search.php',
+    'U_HELP' => PHPWG_ROOT_PATH.'popuphelp.php?page=search',
+
+    'month_list' => $month_list,
+    'START_DAY_SELECTED' => @$_POST['start_day'],
+    'START_MONTH_SELECTED' => @$_POST['start_month'],
+    'END_DAY_SELECTED' => @$_POST['end_day'],
+    'END_MONTH_SELECTED' => @$_POST['end_month'],
+    )
+  );
+
+$available_tags = get_available_tags();
+
+if (count($available_tags) > 0)
+{
+  usort( $available_tags, 'tag_alpha_compare');
+
+  $template->assign(
+    'TAG_SELECTION',
+    get_html_tag_selection(
+        $available_tags,
+        'tags',
+        isset($_POST['tags']) ? $_POST['tags'] : array()
+        )
+    );
+}
+
+//------------------------------------------------------------- categories form
+$query = '
+SELECT id,name,global_rank,uppercats
+  FROM '.CATEGORIES_TABLE.'
+'.get_sql_condition_FandF
+  (
+    array
+      (
+        'forbidden_categories' => 'id',
+        'visible_categories' => 'id'
+      ),
+    'WHERE'
+  ).'
+;';
+display_select_cat_wrapper($query, array(), 'category_options', false);
+
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theSearchPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+//------------------------------------------------------------ html code display
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('search');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/search_rules.php
===================================================================
--- tags/2.4.0RC3/search_rules.php	(revision 14585)
+++ tags/2.4.0RC3/search_rules.php	(revision 14585)
@@ -0,0 +1,243 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+/**
+ * returns language value 'included' or 'excluded' depending on boolean
+ * value. This function is useful only to make duplicate code shorter
+ *
+ * @param bool is_included
+ * @return string
+ */
+function inc_exc_str($is_included)
+{
+  return $is_included ? l10n('included') : l10n('excluded');
+}
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+check_status(ACCESS_FREE);
+include_once( PHPWG_ROOT_PATH.'include/functions_search.inc.php' );
+
+$page['body_id'] = 'thePopuphelpPage';
+$title = l10n('Piwigo Help');
+$page['page_banner'] = '';
+$page['meta_robots']=array('noindex'=>1, 'nofollow'=>1);
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+
+$template->set_filenames(array('search_rules' => 'search_rules.tpl'));
+
+// +-----------------------------------------------------------------------+
+// |                        Textual rules creation                         |
+// +-----------------------------------------------------------------------+
+
+// Rules are stored in database, serialized in an array. This array must be
+// transformed into a list of textual rules.
+
+$search = get_search_array($_GET['search_id']);
+
+if (isset($search['q']))
+{
+  $template->append( 'search_words', $search['q'] );
+}
+else
+{
+  $template->assign(
+    array(
+      'INTRODUCTION'
+        => 'OR' == $search['mode']
+        ? l10n('At least one listed rule must be satisfied.')
+        : l10n('Each listed rule must be satisfied.'),
+      )
+    );
+}
+
+if (isset($search['fields']['allwords']))
+{
+  $template->append( 'search_words',
+      sprintf(
+        l10n('searched words : %s'),
+        join(', ', $search['fields']['allwords']['words'])
+        )
+      );
+}
+
+if (isset($search['fields']['tags']))
+{
+  $template->assign('SEARCH_TAGS_MODE', $search['fields']['tags']['mode']);
+  
+  $query = '
+SELECT name
+  FROM '.TAGS_TABLE.'
+  WHERE id IN ('.implode(',', $search['fields']['tags']['words']).')
+;';
+  $template->assign(
+      'search_tags',
+      array_from_query($query, 'name')
+    );
+}
+
+if (isset($search['fields']['author']))
+{
+  $template->append(
+    'search_words',
+     sprintf(
+          l10n('author(s) : %s'),
+          join(', ', $search['fields']['author']['words'])
+        )
+      );
+}
+
+if (isset($search['fields']['cat']))
+{
+  if ($search['fields']['cat']['sub_inc'])
+  {
+    // searching all the categories id of sub-categories
+    $cat_ids = get_subcat_ids($search['fields']['cat']['words']);
+  }
+  else
+  {
+    $cat_ids = $search['fields']['cat']['words'];
+  }
+
+  $query = '
+SELECT id, uppercats, global_rank
+  FROM '.CATEGORIES_TABLE.'
+  WHERE id IN ('.
+    implode(',', $cat_ids).
+    ')
+;';
+  $result = pwg_query($query);
+
+  $categories = array();
+  if (!empty($result))
+  {
+    while ($row = pwg_db_fetch_assoc($result))
+    {
+      array_push($categories, $row);
+    }
+  }
+  usort($categories, 'global_rank_compare');
+
+  foreach ($categories as $category)
+  {
+    $template->append(
+      'search_categories',
+      get_cat_display_name_cache(
+          $category['uppercats'],
+          null,                      // no url on category names
+          false                    // no blank replacement
+          )
+      );
+  }
+}
+
+foreach (array('date_available', 'date_creation') as $datefield)
+{
+  if ('date_available' == $datefield)
+  {
+    $lang_items = array(
+      'date'   => l10n('posted on %s'),
+      'period' => l10n('posted between %s (%s) and %s (%s)'),
+      'after'  => l10n('posted after %s (%s)'),
+      'before' => l10n('posted before %s (%s)'),
+      );
+  }
+  elseif ('date_creation' == $datefield)
+  {
+    $lang_items = array(
+      'date'   => l10n('created on %s'),
+      'period' => l10n('created between %s (%s) and %s (%s)'),
+      'after'  => l10n('created after %s (%s)'),
+      'before' => l10n('created before %s (%s)'),
+      );
+  }
+
+  $keys = array(
+    'date'   => $datefield,
+    'after'  => $datefield.'-after',
+    'before' => $datefield.'-before',
+    );
+
+  if (isset($search['fields'][ $keys['date'] ]))
+  {
+    $template->assign(
+      strtoupper($datefield),
+      sprintf(
+          $lang_items['date'],
+          format_date($search['fields'][ $keys['date'] ])
+          )
+      );
+  }
+  elseif (isset($search['fields'][ $keys['before'] ])
+          and isset($search['fields'][ $keys['after'] ]))
+  {
+    $template->assign(
+      strtoupper($datefield),
+      sprintf(
+          $lang_items['period'],
+
+          format_date($search['fields'][ $keys['after'] ]['date']),
+          inc_exc_str($search['fields'][ $keys['after'] ]['inc']),
+
+          format_date($search['fields'][ $keys['before'] ]['date']),
+          inc_exc_str($search['fields'][ $keys['before'] ]['inc'])
+          )
+      );
+  }
+  elseif (isset($search['fields'][ $keys['before'] ]))
+  {
+    $template->assign(
+      strtoupper($datefield),
+      sprintf(
+          $lang_items['before'],
+
+          format_date($search['fields'][ $keys['before'] ]['date']),
+          inc_exc_str($search['fields'][ $keys['before'] ]['inc'])
+          )
+      );
+  }
+  elseif (isset($search['fields'][ $keys['after'] ]))
+  {
+    $template->assign(
+      strtoupper($datefield),
+      sprintf(
+          $lang_items['after'],
+
+          format_date($search['fields'][ $keys['after'] ]['date']),
+          inc_exc_str($search['fields'][ $keys['after'] ]['inc'])
+          )
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                           html code display                           |
+// +-----------------------------------------------------------------------+
+
+$template->pparse('search_rules');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/tags.php
===================================================================
--- tags/2.4.0RC3/tags.php	(revision 14585)
+++ tags/2.4.0RC3/tags.php	(revision 14585)
@@ -0,0 +1,207 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// +-----------------------------------------------------------------------+
+// |                             functions                                 |
+// +-----------------------------------------------------------------------+
+
+function counter_compare($a, $b)
+{
+  if ($a['counter'] == $b['counter'])
+  {
+    return id_compare($a, $b);
+  }
+
+  return ($a['counter'] < $b['counter']) ? +1 : -1;
+}
+
+function id_compare($a, $b)
+{
+  return ($a['id'] < $b['id']) ? -1 : 1;
+}
+
+// +-----------------------------------------------------------------------+
+// |                           initialization                              |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH','./');
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+
+check_status(ACCESS_GUEST);
+
+// +-----------------------------------------------------------------------+
+// |                       page header and options                         |
+// +-----------------------------------------------------------------------+
+
+$title= l10n('Tags');
+$page['body_id'] = 'theTagsPage';
+
+$template->set_filenames(array('tags'=>'tags.tpl'));
+
+$page['display_mode'] = $conf['tags_default_display_mode'];
+if (isset($_GET['display_mode']))
+{
+  if (in_array($_GET['display_mode'], array('cloud', 'letters')))
+  {
+    $page['display_mode'] = $_GET['display_mode'];
+  }
+}
+
+foreach (array('cloud', 'letters') as $mode)
+{
+  $template->assign(
+    'U_'.strtoupper($mode),
+    get_root_url().'tags.php'. ($conf['tags_default_display_mode']==$mode ? '' : '?display_mode='.$mode)
+    );
+}
+
+$template->assign( 'display_mode', $page['display_mode'] );
+
+// find all tags available for the current user
+$tags = get_available_tags();
+
+// +-----------------------------------------------------------------------+
+// |                       letter groups construction                      |
+// +-----------------------------------------------------------------------+
+
+if ($page['display_mode'] == 'letters') {
+  // we want tags diplayed in alphabetic order
+  usort($tags, 'tag_alpha_compare');
+
+  $current_letter = null;
+  $nb_tags = count($tags);
+  $current_column = 1;
+  $current_tag_idx = 0;
+
+  $letter = array(
+    'tags' => array()
+    );
+
+  foreach ($tags as $tag)
+  {
+    $tag_letter = strtoupper(mb_substr(str2url($tag['name']), 0, 1, 'utf-8'));
+
+    if ($current_tag_idx==0) {
+      $current_letter = $tag_letter;
+      $letter['TITLE'] = $tag_letter;
+    }
+
+    //lettre precedente differente de la lettre suivante
+    if ($tag_letter !== $current_letter)
+    {
+      if ($current_column<$conf['tag_letters_column_number']
+          and $current_tag_idx > $current_column*$nb_tags/$conf['tag_letters_column_number'] )
+      {
+        $letter['CHANGE_COLUMN'] = true;
+        $current_column++;
+      }
+
+      $letter['TITLE'] = $current_letter;
+
+      $template->append(
+        'letters',
+        $letter
+        );
+
+      $current_letter = $tag_letter;
+      $letter = array(
+        'tags' => array()
+        );
+    }
+
+    array_push(
+      $letter['tags'],
+      array_merge(
+        $tag,
+        array(
+          'URL' => make_index_url(
+            array(
+              'tags' => array($tag),
+              )
+            ),
+          )
+        )
+      );
+
+    $current_tag_idx++;
+  }
+
+  // flush last letter
+  if (count($letter['tags']) > 0)
+  {
+    unset($letter['CHANGE_COLUMN']);
+    $letter['TITLE'] = $current_letter;
+    $template->append(
+      'letters',
+      $letter
+      );
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                        tag cloud construction                         |
+// +-----------------------------------------------------------------------+
+
+// we want only the first most represented tags, so we sort them by counter
+// and take the first tags
+usort($tags, 'counter_compare');
+$tags = array_slice($tags, 0, $conf['full_tag_cloud_items_number']);
+
+// depending on its counter and the other tags counter, each tag has a level
+$tags = add_level_to_tags($tags);
+
+// we want tags diplayed in alphabetic order
+if ('letters' != $page['display_mode'])
+{
+  usort($tags, 'tag_alpha_compare');
+}
+
+// display sorted tags
+foreach ($tags as $tag)
+{
+  $template->append(
+    'tags',
+    array_merge(
+      $tag,
+      array(
+        'URL' => make_index_url(
+          array(
+            'tags' => array($tag),
+            )
+          ),
+        )
+      )
+    );
+}
+
+// include menubar
+$themeconf = $template->get_template_vars('themeconf');
+if (!isset($themeconf['hide_menu_on']) OR !in_array('theTagsPage', $themeconf['hide_menu_on']))
+{
+  include( PHPWG_ROOT_PATH.'include/menubar.inc.php');
+}
+
+include(PHPWG_ROOT_PATH.'include/page_header.php');
+$template->pparse('tags');
+include(PHPWG_ROOT_PATH.'include/page_tail.php');
+?>
Index: tags/2.4.0RC3/template-extension/distributed/samples/my-picture.tpl
===================================================================
--- tags/2.4.0RC3/template-extension/distributed/samples/my-picture.tpl	(revision 14585)
+++ tags/2.4.0RC3/template-extension/distributed/samples/my-picture.tpl	(revision 14585)
@@ -0,0 +1,122 @@
+
+{if isset($errors)}
+<div class="errors">
+  <ul>
+    {foreach from=$errors item=error}
+    <li>{$error}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+{if isset($infos)}
+<div class="infos">
+  <ul>
+    {foreach from=$infos item=info}
+    <li>{$info}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+<div id="imageHeaderBar">
+  <div class="browsePath">
+    <a href="{$U_HOME}" rel="Home">{'Home'|@translate}</a>
+    {if !$IS_HOME}{$LEVEL_SEPARATOR}{$SECTION_TITLE}{/if}
+    {$LEVEL_SEPARATOR}{$current.TITLE}
+  </div>
+  <div class="imageNumber">{$PHOTO}</div>
+  <h2>{$current.TITLE}</h2>
+</div>
+
+{if !empty($PLUGIN_PICTURE_BEFORE)}{$PLUGIN_PICTURE_BEFORE}{/if}
+<div id="imageToolBar">
+	<div class="actionButtons">
+{if isset($U_SLIDESHOW_START)}
+		<a href="{$U_SLIDESHOW_START}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-slideshow">&nbsp;</span><span class="pwg-button-text">{'slideshow'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_SLIDESHOW_STOP)}
+		<a href="{$U_SLIDESHOW_STOP}" title="{'stop the slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-slideshow">&nbsp;</span><span class="pwg-button-text">{'stop the slideshow'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_METADATA)}
+		<a href="{$U_METADATA}" title="{'Show file metadata'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-camera-info">&nbsp;</span><span class="pwg-button-text">{'Show file metadata'|@translate}</span>
+		</a>
+{/if}
+{if isset($current.U_DOWNLOAD)}
+		<a href="{$current.U_DOWNLOAD}" title="{'Download this file'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-save">&nbsp;</span><span class="pwg-button-text">{'Download'|@translate}</span>
+		</a>
+{/if}
+{if isset($PLUGIN_PICTURE_ACTIONS)}{$PLUGIN_PICTURE_ACTIONS}{/if}
+{if isset($favorite)}
+		<a href="{$favorite.U_FAVORITE}" title="{if $favorite.IS_FAVORITE}{'delete this photo from your favorites'|@translate}{else}{'add this photo to your favorites'|@translate}{/if}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-favorite-{if $favorite.IS_FAVORITE}del{else}add{/if}">&nbsp;</span><span class="pwg-button-text">{'Favorites'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_SET_AS_REPRESENTATIVE)}
+		<a href="{$U_SET_AS_REPRESENTATIVE}" title="{'set as category representative'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-representative">&nbsp;</span><span class="pwg-button-text">{'representative'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_ADMIN)}
+		<a href="{$U_ADMIN}" title="{'Modify information'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-edit">&nbsp;</span><span class="pwg-button-text">{'Edit'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_CADDIE)}{*caddie management BEGIN*}
+<script type="text/javascript">
+{literal}function addToCadie(aElement, rootUrl, id)
+{
+if (aElement.disabled) return;
+aElement.disabled=true;
+var y = new PwgWS(rootUrl);
+
+y.callService(
+	"pwg.caddie.add", {image_id: id} ,
+	{
+		onFailure: function(num, text) { alert(num + " " + text); document.location=aElement.href; },
+		onSuccess: function(result) { aElement.disabled = false; }
+	}
+	);
+}{/literal}
+</script>
+		<a href="{$U_CADDIE}" onclick="addToCadie(this, '{$ROOT_URL|@escape:'javascript'}', {$current.id}); return false;" title="{'Add to caddie'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-caddie-add">&nbsp;</span><span class="pwg-button-text">{'Caddie'|@translate}</span>
+		</a>
+{/if}{*caddie management END*}
+	</div>   
+  {include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+</div> <!-- imageToolBar -->
+
+<div id="theImage">
+{$ELEMENT_CONTENT}
+
+{if isset($COMMENT_IMG)}
+<p>{$COMMENT_IMG}</p>
+{/if}
+
+{if isset($U_SLIDESHOW_STOP) }
+<p>
+  [ <a href="{$U_SLIDESHOW_STOP}">{'stop the slideshow'|@translate}</a> ]
+</p>
+{/if}
+
+</div>
+
+{if isset($previous) }
+<a class="navThumb" id="linkPrev" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE}" rel="prev">
+  <img src="{$previous.THUMB_SRC}" alt="{$previous.TITLE}">
+</a>
+{/if}
+{if isset($next) }
+<a class="navThumb" id="linkNext" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE}" rel="next">
+  <img src="{$next.THUMB_SRC}" alt="{$next.TITLE}">
+</a>
+{/if}
+
+{if !empty($PLUGIN_PICTURE_AFTER)}{$PLUGIN_PICTURE_AFTER}{/if}
Index: tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails.tpl
===================================================================
--- tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails.tpl	(revision 14585)
+++ tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails.tpl	(revision 14585)
@@ -0,0 +1,35 @@
+<!-- This is a sample of template extensions -->
+{if !empty($thumbnails)}
+<ul class="thumbnails">
+{foreach from=$thumbnails item=thumbnail}
+	<li>
+	<span class="wrap1">
+		<span class="wrap2">
+		<a href="{$thumbnail.URL}">
+			<img class="thumbnail" src="{$thumbnail.TN_SRC}" alt="{$thumbnail.TN_ALT}" title="{$thumbnail.TN_TITLE}">
+		</a>
+		</span>
+		<span class="thumbLegend" style="color:#F36;">
+    &copy; 2008 Piwigo<br>
+		{if !empty($thumbnail.NAME)}{$thumbnail.NAME}{/if}
+		{if !empty($thumbnail.ICON_TS)}{$thumbnail.ICON_TS}{/if}
+
+		{if isset($thumbnail.NB_COMMENTS)}
+		<span class="{if 0==$thumbnail.NB_COMMENTS}zero {/if}nb-comments">
+		<br>
+		{$pwg->l10n_dec('%d comment', '%d comments',$thumbnail.NB_COMMENTS)}
+		</span>
+		{/if}
+
+		{if isset($thumbnail.NB_HITS)}
+		<span class="{if 0==$thumbnail.NB_HITS}zero {/if}nb-hits">
+		<br>
+		{$pwg->l10n_dec('%d hit', '%d hits',$thumbnail.NB_HITS)}
+		</span>
+		{/if}
+		</span>
+	</span>
+	</li>
+{/foreach}
+</ul>
+{/if}
Index: tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.css
===================================================================
--- tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.css	(revision 14585)
+++ tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.css	(revision 14585)
@@ -0,0 +1,13 @@
+.thumbLegend { padding: 0 6px; color: #666; font-style:italic; font-size: 7px; }
+.fld1 { width: 96px; min-width: 96px; padding: 0; 
+margin: 5px; display: inline;}
+.lap2 { display: block; padding: 4px 15px 10px 15px; border: 0;}
+.fld1:hover { background-color: #000; }
+.fld1 a:hover { border:0; }
+.thumbnail { margin: 2px auto; }
+/* Advanced hacks for IE 7 */
+*+html .thumbnail { display: inline; margin: 0 auto; }
+*+html .lap2 span { position: relative; top: 50%; margin: 0 auto; }
+*+html .lap2 { display: inline; position: relative; top: 0%; }
+*+html .fld1 { width: auto; padding: 6px 0 6px 0; margin-top: 0px;}
+*+html .thumbLegend { font-size: 10px; }
Index: tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.tpl
===================================================================
--- tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.tpl	(revision 14585)
+++ tags/2.4.0RC3/template-extension/distributed/samples/my-thumbnails2.tpl	(revision 14585)
@@ -0,0 +1,18 @@
+<!-- This is a sample of template extensions -->
+{if !empty($thumbnails)}
+{html_head}<link rel="stylesheet" type="text/css" href="./template-extension/distributed/samples/my-thumbnails2.css">{/html_head}
+<ul class="thumbnails">
+{foreach from=$thumbnails item=thumbnail}
+	<li>
+	<fieldset class="fld1">
+		<legend class="thumbLegend">
+		{if !empty($thumbnail.NAME)}{$thumbnail.NAME}{/if}
+		</legend>
+		<a href="{$thumbnail.URL}" class="lap2">
+			<span><img class="thumbnail" src="{$thumbnail.TN_SRC}" alt="{$thumbnail.TN_ALT}" title="{$thumbnail.TN_TITLE}"></span>
+		</a>
+  </fieldset>
+	</li>
+{/foreach}
+</ul>
+{/if}
Index: tags/2.4.0RC3/template-extension/distributed/samples/titling_categories.tpl
===================================================================
--- tags/2.4.0RC3/template-extension/distributed/samples/titling_categories.tpl	(revision 14585)
+++ tags/2.4.0RC3/template-extension/distributed/samples/titling_categories.tpl	(revision 14585)
@@ -0,0 +1,50 @@
+{* 
+
+   Copied from mainpage_categories.tpl 
+
+*}
+{if !empty($category_thumbnails)}
+  {html_head}
+<style media="screen,handheld,projection,tv" type="text/css">
+#content ul.thumbnailCategories li {ldelim} width:100%; z-index: 55; position: relative;}
+#Titling h3 {ldelim} margin:11px 0 -13px; padding:0 3px 0 20px; text-align:left; z-index: 99; position: relative;}
+#Titling h3 a {ldelim} background-color: #222; padding: 0 10px; }
+#content ul.thumbnailCategories .unbordered {ldelim} width:49%; float:left; margin:0 0 0 5px; }
+.content div.thumbnailCategory div.description p.dates {ldelim} margin: 0 45px 0 20px; }
+#content .thumbnailCategory div.description .text {ldelim} margin: 0; padding: 0 4px; text-align: justify; }
+p.Nb_images {ldelim} text-align: left; color: #444; }
+/* hacks */
+*+html #Titling h3, * html #Titling h3 {ldelim} font-weight: normal;} /* IE browsers */
+</style>
+  {/html_head}
+  <ul class="thumbnailCategories" id="Titling"> {*                   1st difference: Titling/thumbnail *}
+    {foreach from=$category_thumbnails item=cat}
+    <div class="unbordered"> {*                                                   W3C HTML non conform *}
+    <h3> {*                                               2nd difference: h3 is outside of description *}
+      <a href="{$cat.URL}">{$cat.NAME}</a>{$cat.ICON_TS}
+    </h3>
+    <li>
+      <div class="thumbnailCategory">
+       <div class="illustration">
+          <a href="{$cat.URL}">
+            <img src="{$cat.TN_SRC}" alt="{$cat.ALT}" 
+            title="{'display this album'|@translate}">
+          </a>
+        </div>
+        <div class="description">
+  				{if isset($cat.INFO_DATES) }
+    				<p class="dates">{$cat.INFO_DATES}</p>
+  				{/if}
+          <div class="text">
+          <p class="Nb_images">{$cat.CAPTION_NB_IMAGES}</p>
+    				{if not empty($cat.DESCRIPTION)}
+    				<p>{$cat.DESCRIPTION}</p>
+    				{/if}
+          </div>
+        </div>
+      </div>
+    </li>
+    </div>    
+    {/foreach}
+  </ul>
+{/if}
Index: tags/2.4.0RC3/template-extension/index.php
===================================================================
--- tags/2.4.0RC3/template-extension/index.php	(revision 14585)
+++ tags/2.4.0RC3/template-extension/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/template-extension/yoga/index.php
===================================================================
--- tags/2.4.0RC3/template-extension/yoga/index.php	(revision 14585)
+++ tags/2.4.0RC3/template-extension/yoga/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/template-extension/yoga/local/README
===================================================================
--- tags/2.4.0RC3/template-extension/yoga/local/README	(revision 14585)
+++ tags/2.4.0RC3/template-extension/yoga/local/README	(revision 14585)
@@ -0,0 +1,19 @@
+If you want to make some template customization without building a brand new
+template, you should use this directory to store yur customized version of the
+official template files rather than editing them on place.
+Doing this, they won't be lost during the next upgrade.
+
+For example, if you want your own header file just copy 
+"template/yoga/header.tpl" to this directory with whatever, but significant,
+filename you want.
+Then edit "include/page_header.php" and replace the line :
+  $template->set_filenames(array('header'=>'header.tpl'));
+by
+  $template->set_filenames(array('header'=>'../../template-extension/yoga/local/header.tpl'));
+Or whatever new filename you gave instead of header.tpl
+
+In future version of PWG, you probably won't have to edit the php code, but
+a parameter table instead.
+
+Feel free to ask in the forum for further assistance :
+http://piwigo.org/forum
Index: tags/2.4.0RC3/template-extension/yoga/local/index.php
===================================================================
--- tags/2.4.0RC3/template-extension/yoga/local/index.php	(revision 14585)
+++ tags/2.4.0RC3/template-extension/yoga/local/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/Sylvia/icon/index.php
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/icon/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/icon/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/Sylvia/icon/mimetypes/index.php
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/icon/mimetypes/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/icon/mimetypes/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/Sylvia/index.php
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/Sylvia/local_head.tpl
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/local_head.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/local_head.tpl	(revision 14585)
@@ -0,0 +1,3 @@
+<!--[if IE]> 
+	<link rel="stylesheet" href="{$ROOT_URL}themes/Sylvia/theme-ie.css" type="text/css">
+<![endif]-->
Index: tags/2.4.0RC3/themes/Sylvia/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/mail-css.tpl	(revision 14585)
@@ -0,0 +1,13 @@
+/* Theme Sylvia mail css */
+
+body {ldelim} background-color:#111; color:#666;}
+#copyright {ldelim} background: transparent url({$ROOT_URL}themes/Sylvia/images/bottom-left-bg.jpg) no-repeat scroll left bottom;
+min-height: 220px; height: 220px; width: 100%; min-width: 100%; padding: 10px 100px 30px 100px; }
+h2 {ldelim} color:#f70;background: transparent url({$ROOT_URL}themes/Sylvia/images/fillet.gif) repeat-x scroll left bottom; padding-bottom: 5px;}
+img {ldelim} margin: 16px; border: 16px solid #444; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} padding: 15px; border: 0; background-color:#222;-moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #f70; background-color: transparent; border:0; text-decoration: none;}
+a:hover {ldelim} color: #F33; border-bottom: 1px solid #FF3363;}
+a.thumblnk:hover {ldelim} border:0;}
+a.Piwigo {ldelim} font-family: verdana, arial, helvetica, sans-serif; color : #F33; text-decoration: none; border: 0; }
+a.Piwigo:hover {ldelim} border-bottom: 1px solid #FF3363; }
Index: tags/2.4.0RC3/themes/Sylvia/theme-ie.css
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/theme-ie.css	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/theme-ie.css	(revision 14585)
@@ -0,0 +1,12 @@
+#content .thumbnailCategory .description .text {
+	scrollbar-face-color:#222;
+	scrollbar-shadow-color:#444;
+	scrollbar-highlight-color:#000;
+	scrollbar-darkshadow-color:#333;
+	scrollbar-track-color:#111;
+	scrollbar-arrow-color:#f70;
+}
+
+#debug { word-wrap:break-word; }
+/* IE6... Hacks: */
+/*\*/ * html #menubar #mbIdentification .button { margin-right:25px; } /* */ 
Index: tags/2.4.0RC3/themes/Sylvia/theme.css
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/theme.css	(revision 14585)
@@ -0,0 +1,481 @@
+/* thumbnail wrap size */
+.thumbnailCategory .illustration { 
+	min-width:165px !important; /* Usable range 162px-360px , optimal : Thumbnail width + 40px */ 
+}
+ .commentElement .illustration { 
+	min-width:220px !important; /* Usable range 219px-360px , optimal : Thumbnail width + 95px */ 
+}
+
+/**
+ * Menubar
+ */
+#menubar DL { 
+	background:transparent url(images/menuBox_top.gif) no-repeat scroll left top;
+	margin:0 0 5px 40px; 
+	padding:0; 
+	width: 231px; 
+	min-width: 231px; 
+	border: 0; 
+	min-height: 32px; 
+	overflow-x: hidden;
+}
+#menubar DT { 
+	background-color:#111; 
+	border:0; 
+	display:inline; 
+	margin-left:8px; 
+	text-align:left; 
+}
+#menubar DD { 
+	background:transparent url(images/menuBox_bottom.gif) no-repeat scroll left bottom;
+	margin:14px 0 0 0; 
+	padding:0 0 22px; 
+	width: 231px; 
+	min-width: 231px; 
+	border: 0; 
+	overflow-x: hidden;
+}
+#menubar DD P {
+  background:transparent url(images/menuBox_sides.gif) repeat-y scroll left bottom; 
+  padding: 2px 16px 0; 
+  margin: 0;
+}
+#menubar UL, #menubar #mbCategories p, #menubar .illustration  { 
+	background:transparent url(images/menuBox_sides.gif) repeat-y scroll left bottom;
+	margin:0; 
+}
+#menubar DT A { 
+	font-size: 100%; 
+}
+#menubar UL { 
+	color:#333; 
+	font-size: 16px; 
+	line-height: 15px; 
+}
+#menubar UL SPAN.menuInfoCat { 
+	color:#666;
+}
+#menubar LI { 
+	padding-left: 12px; 
+}
+#menubar LI UL {
+  background: transparent url(images/transparent.gif);
+}
+#menubar A, .menuInfoCat { 
+	font-size: 13px; 
+}
+#menubar form { 
+	background:transparent url(images/menuBox_sides.gif) repeat-y scroll left bottom; 
+	margin:0; 
+}
+#menubar p { 
+	padding: 16px 16px 0; 
+}
+
+.menubarFilter {
+	position: relative; 
+	right: 8px; 
+	top: 16px; 
+}
+
+#menubar #mbIdentification { 
+	background:transparent url(images/menuId_top.gif) no-repeat scroll left top !important;
+}
+#menubar #mbIdentification DD { 
+	background:transparent url(images/menuId_bottom.gif) no-repeat scroll left bottom; 
+}
+#menubar #mbIdentification UL, #menubar #mbIdentification p, #menubar #mbIdentification .illustration  { 
+	background:transparent url(images/menuId_sides.gif) repeat-y scroll left bottom; 
+}
+#menubar #mbIdentification form { 
+	background:transparent url(images/menuId_sides.gif) repeat-y scroll left bottom; 
+}
+#menubar #mbIdentification form  p { 
+	background:transparent none repeat-y scroll left bottom; 
+}
+#menubar #mbIdentification p { 
+	padding: 2px 16px 0; 
+	margin: 0;
+}
+#menubar #mbIdentification fieldset div input[type="text"] { 
+	margin: 0 0 3px; 
+	width: 174px; 
+	display: inline; 
+}
+#menubar #mbIdentification .button { 
+	height:24px; 
+	width:24px; 
+	right:0px; 
+	top:-40px; 
+}
+#menubar #mbIdentification fieldset { 
+	border:0; 
+	margin:0 24px 0 23px; 
+}
+#menubar #mbIdentification legend { 
+	display: none; 
+}
+#mbIdentification p, .totalImages { 
+	color:#666; 
+}
+
+#menubar #menuTagCloud { 
+	background:transparent url(images/menuBox_sides.gif) repeat-y scroll left bottom;
+	margin:0; 
+	padding: 0 12px; 
+}
+
+#qsearchInput:focus, input:focus, select:focus, textarea:focus, input.focus, form .focus { 
+	background-color:#444;
+	color:#999; 
+}
+#qsearchInput { 
+	color:#999;
+}
+
+
+/**
+ * Content
+ */
+.content { 
+	background:#222 url(images/fillet.gif) repeat-x scroll left top; 
+	min-height:466px; 
+	border: 1px solid #000; 
+	border-top: 0; 
+	margin:21px 7px 0 290px !important; 
+	padding-top:7px; 
+}
+
+#the_page { 
+	background:transparent url(images/top-left-bg.jpg) no-repeat scroll left top;
+	left:0; 
+	margin:0; 
+	padding:0; 
+	position:absolute; 
+	top:0; 
+	z-index:0; 
+	width: 100%; 
+	min-width: 100%; 
+}
+
+.content h2 { 
+	margin:0; 
+	padding:0px 10px 15px 15px; 
+	border:0;
+}
+.content .navigationBar {
+	color:#666;
+}
+/* contentWithMenu */
+.contentWithMenu {
+    margin-left: 290px;
+}
+.contentWithMenu #comments {
+  padding: 0 0 5px 0;
+}
+.contentWithMenu #imageToolBar {
+  padding-left: 0;
+}
+.contentWithMenu #imageHeaderBar .browsePath {
+    margin-left: 0;
+}
+
+/* Category thumbnails on main page */
+.thumbnailCategories li {
+	background:#222 url(images/cat_bottom-right.gif) no-repeat scroll right bottom; 
+	width:49%; 
+	margin: 0; 
+	padding:0; 
+}
+.thumbnailCategory { 
+	background:transparent url(images/cat_bottom-left.gif) no-repeat scroll left bottom; 
+	padding: 0 0 2px; 
+	margin:0; 
+}
+.thumbnailCategory .illustration { 
+	background:transparent url(images/cat_top-left.gif) no-repeat scroll left top; 
+	padding: 0 0 0 10px; 
+	margin: 0 !important; 
+}
+.thumbnailCategory .illustration a { 
+	display: block; 
+	margin: 0; 
+	padding:20px 0 0 8px; 
+  border:0;
+}
+.thumbnailCategory .description { 
+	background:transparent url(images/cat_top-right.gif) no-repeat scroll right top;
+	margin: 0; 
+	padding:15px 10px 3px 0; 
+	overflow-x: hidden !important; 
+  height:158px;
+}
+.thumbnailCategory .description .text { 
+	display:block; 
+	margin:10px 2px 0 0;
+	overflow: auto; 
+	overflow-x:hidden; 
+	padding:0 0 5px; 
+}
+.thumbnailCategory .description p.dates { 
+	margin: 0 15px 0 15px; 
+	text-align: right; 
+}
+.thumbnailCategory .description H3 { 
+	display: block; 
+}
+.thumbnailCategories li:hover { 
+	background-color:#111; 
+}
+
+/* header */
+#theHeader { 
+	min-height:110px;
+	height:110px; 
+}
+
+.header_msgs { 
+	background:transparent url(images/header_msgs-bg.gif) repeat scroll left top;
+	border:0; 
+	color:#333; 
+	font-size:24px; 
+	left:0; 
+	margin:0; 
+	padding:10px 0 6px 0; 
+	text-align:center; 
+	top:0; 
+	width:100%; 
+	z-index:99; 
+}
+.header_notes {
+	background:transparent url(images/header_msgs-bg.gif) repeat scroll left top;
+	border:0 none;
+	color:#333;
+	font-size:16px;
+	margin:0;
+	padding:0;
+	position:absolute;
+	top:0;
+	width:100%;
+	z-index:99;
+}
+.infos { 
+	color:#f70; 
+	border:0; 
+	background:transparent url(icon/infos.png) no-repeat center right;
+	margin-left:40px;
+	text-align:left; 
+}
+.errors { 
+	color:#f33; 
+	border:0; 
+	background:transparent url(icon/errors.png) no-repeat center right;
+	margin-left:40px;
+	text-align:left; 
+	font-weight:bold; 
+}
+.infos li, .errors li { 
+	list-style-type:none; 
+}
+
+/* User comments */
+#comments {
+	margin: 0 10px 5px 10px;
+}
+.content .commentElement {
+	border: 1px solid #666; 
+}
+.content .commentElement.odd { 
+	background-color: #222; 
+}
+.content .commentElement.even { 
+	background-color: #111; 
+}
+.content .commentElement .illustration { 
+	margin: 2px;
+  text-align: center;
+}
+.content .commentElement .description { 
+	padding:15px 10px 3px 0; 
+	overflow-x: hidden !important; 
+}
+
+#comments .commentsList hr {display:none;}
+#comments .filter input[type="submit"] { margin-top:1.8em; }
+
+/* Thumbnails */
+.thumbnails .wrap2 {
+	border: 1px solid #666;	/* thumbnails border color and style */
+	border-radius: 4px 4px;	/* round corners with CSS3 compliant browsers */ 
+}
+.thumbnails .wrap2:hover { 
+	color:#666;
+	background-color:#111; 
+	border:1px solid #ff3363;	/* thumbnails border color when mouse cursor is over it */ 
+}
+.calItem {
+	border:1px solid #666; 
+	margin:0 5px; 
+	padding:2px 5px 0 8px;
+}
+.calItemEmpty, td.calDayCellEmpty, td.calDayCellFull {
+	border:1px solid #666;
+}
+
+
+/**
+ * Picture
+ */
+#imageToolBar { 
+	padding:0 7%; 
+}
+#imageHeaderBar .imageNumber { 
+	margin-right:7%; 
+}
+#imageHeaderBar .browsePath { 
+	margin-left:7%; 
+}
+#imageHeaderBar, #imageToolBar A:hover { 
+	background-color: transparent; 
+}
+#imageHeaderBar H2 { 
+	border: 0; 
+}
+
+#theImage A, .illustration A, A.navThumb, A.navThumb { 
+	border-bottom-width: 0; 
+}
+.rateButtonStarFull, .rateButtonStarEmpty {   	
+	background-image: url('icon/rating-stars.gif'); 
+}
+
+#thePicturePage .commentElement {
+	padding: 15px 2px 6px 12px; 
+	border: 1px solid #666; 
+}
+#thePicturePage .commentsList { 
+	padding-left: 12px; 
+	padding-right: 12px; 
+}
+#thePicturePage .odd { 
+	background-color: #222; 
+}
+
+.pictureContent {
+	margin:0 7px 7px 290px;
+}
+
+#addComment fieldset {
+  color: #f70;
+	border-color: #f70;
+}
+#addComment fieldset  label {
+  color: #666;
+}
+
+
+/**
+ * Default Layout
+ */
+*, *:focus, *:active, input:active, a:active, input:focus, a:focus { 
+	outline: none; 
+}
+BODY { 
+	background:#111 url(images/bottom-left-bg.jpg) no-repeat fixed left bottom;
+	margin:0; 
+	min-height: 100%; 
+	height: 100%; 
+	padding:0; 
+}
+BODY, H1, H3, DT, INPUT.rateButtonSelected, H2, #menubar DT { 
+	color:#666; 
+}
+
+/* forms */
+FIELDSET, INPUT, SELECT, TEXTAREA { 
+	border: 1px solid #666; 
+}
+input[type="text"], input[type="password"], input[type="button"], input[type="submit"], input[type="reset"], input[type="file"] {
+	background-color:#444; 
+	color:#999; 
+} /* stupid Line but needed  due to inpact on other themes and deadline of Piwigo 2.0 */
+input[type="file"] {
+	background-color:#222; 
+	border: 1px solid #666;
+}
+INPUT, select, textarea { 
+	color:#999; 
+	background-color:#444; 
+}
+input[type="radio"], input[type="checkbox"], input[type="button"].rateButtonStarEmpty, input[type="button"].rateButtonStarFull { 
+	background-color: transparent; 
+}
+input[type="button"], input[type="submit"], input[type="reset"] {
+	color:#ff3363; 
+	background-color:#222; 
+	border-color:#ff3363; 
+}
+input[type="button"]:hover, input[type="submit"]:hover, input[type="reset"]:hover {
+	color:#999; 
+	border-color:#666; 
+}
+
+/* links */
+A, .rateButton { 
+	color:#f70; 
+	border-width: 0; 
+}
+A:hover, A:active { 
+	color:#f33; 
+	border-bottom: 1px solid #ff3363; 
+	cursor: pointer; 
+}
+a.external { 
+	color:#ff3363; 
+	border:0; 
+	text-decoration: none; 
+}
+a.external:hover { 
+	color:#ff7700; 
+	border:0; 
+}
+a.Piwigo {
+  font-family: verdana, arial, helvetica, sans-serif !important;
+  font-size: 11px; font-weight: normal; letter-spacing: 0;
+  color : #F33; text-decoration: none; border: 0; }
+a.Piwigo:hover {
+  border-bottom: 1px solid #ff3363;
+}
+
+.titrePage img.button[alt="x"] { margin: 0 3px 3px; }
+tr.tagLine, fieldset.tagLetter, legend.tagLetterLegend {
+	border-color: #666;
+}
+#debug { 
+	margin: 15px 15px 5px 248px; 
+	font-size:12px; 
+	clear: both; 
+}
+
+/* sprites */
+.pwg-icon {
+	background-image: url(../default/s26/outline_ff3363.png);
+}
+A:hover .pwg-icon {
+	background-image: url(../default/s26/outline_ff7700.png);
+}
+
+.message {
+  color:white;
+  background-color:#666;
+}
+
+.switchBox {
+    background-color: #222222;
+    border: 1px solid #FF3363;
+    border-radius: 0 15px 0 15px;
+}
+
+.switchBoxTitle {
+  border-color:#666;
+}
Index: tags/2.4.0RC3/themes/Sylvia/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/Sylvia/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/Sylvia/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,16 @@
+<?php
+/*
+Theme Name: Sylvia
+Version: 2.3.0
+Description: Dark background, flora and pink decorations.
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=368
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+$themeconf = array(
+  'name'         => 'Sylvia',
+  'parent'        => 'default',
+  'icon_dir'      => 'themes/Sylvia/icon',
+  'mime_icon_dir' => 'themes/Sylvia/icon/mimetypes/',
+);
+?>
Index: tags/2.4.0RC3/themes/clear/index.php
===================================================================
--- tags/2.4.0RC3/themes/clear/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/clear/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/clear/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/themes/clear/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/clear/mail-css.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+/* Theme clear mail css */
+
+body {ldelim} background-color:#fff; color:#696969;}
+#copyright {ldelim} background: transparent; color: #333;}
+h2 {ldelim} background-color: #ddd;}
+img {ldelim} margin: 16px; border: 16px solid #aaa; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#faebd7; -moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #369; background: transparent; }
+a:hover {ldelim} color: #ddd; }
Index: tags/2.4.0RC3/themes/clear/theme.css
===================================================================
--- tags/2.4.0RC3/themes/clear/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/clear/theme.css	(revision 14585)
@@ -0,0 +1,89 @@
+
+/* text color */
+BODY, H1, H2, DT,
+INPUT.rateButtonSelected /* <= why IE doesn't inherit this ? */ {
+	color:#696969;	/* dimgray */
+}
+
+/* backgrounds */
+BODY {
+	background-color: #ffffff;	/* white */
+}
+
+H2, #menubar DT, #imageHeaderBar, #imageToolBar A:hover {
+	background-color: #d3d3d3;
+}
+
+#menubar DL, .content, #imageToolBar, .switchBox, .header_notes {
+  background-color: #eeeeee;
+}
+
+/* borders */
+#menubar DL, .content, #imageToolBar, .switchBox {
+  border: 1px solid #d3d3d3;
+}
+
+#theImage IMG {
+  border: 3px solid #d3d3d3;
+}
+
+/*I think this rule is never used*/
+.content UL.thumbnail IMG {
+    border: 1px solid #a0a0a0;
+}
+
+FIELDSET, INPUT, SELECT, TEXTAREA,
+.content .thumbnailCategory,
+.content .commentElement {
+  border: 1px solid gray;
+}
+
+.thumbnails .wrap2 {
+  border: 1px solid #aaaaaa;	/* thumbnails border color and style */
+}
+
+.thumbnails .wrap2:hover,
+.content .thumbnailCategories .thumbnailCategory:hover,
+.content .thumbnailCategories .thumbnailCategory:hover A,
+.content .commentsList .commentElement:hover,
+.content .commentsList .commentElement:hover A {
+  background-color: #faebd7;
+  border-color: yellow;		/* thumbnails border color when mouse cursor is over it */
+  color: black;
+}
+
+/* links */
+A, INPUT.rateButton {
+	color: #005e89;
+	background: transparent;
+	border-bottom: 1px dotted #005e89;
+}
+
+A:hover, INPUT.rateButton:hover {
+    color: #808060;
+}
+
+A.pwg-state-default {
+	border: 0;
+}
+
+A.navThumb, A.navThumb:hover {
+    border-bottom: none;
+}
+
+/*calendar elements*/
+.calItem, .calItemEmpty
+{
+  border: 1px solid silver;
+}
+
+#qsearchInput { color: #005e89; }
+
+.pwg-icon {
+	background-image: url(../default/s26/outline_005e89.png);
+}
+
+A:hover .pwg-icon {
+	background-image: url(../default/s26/outline_808060.png);
+}
+
Index: tags/2.4.0RC3/themes/clear/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/clear/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/clear/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,14 @@
+<?php
+/*
+Theme Name: clear
+Version: 2.3.0
+Description: White background, soft gray.
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=9
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+$themeconf = array(
+  'name'  => 'clear',
+  'parent' => 'default',
+);
+?>
Index: tags/2.4.0RC3/themes/dark/images/index.php
===================================================================
--- tags/2.4.0RC3/themes/dark/images/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/dark/images/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/dark/index.php
===================================================================
--- tags/2.4.0RC3/themes/dark/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/dark/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/dark/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/themes/dark/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/dark/mail-css.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+/* Theme dark mail css */
+
+body {ldelim} background-color:#444; color:#fff;}
+#copyright {ldelim} color: #69c;}
+h2 {ldelim} background-color: #333; color:#fff48e;}
+img {ldelim} margin: 16px; border: 16px solid #111; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#444;-moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #fff48e; background: transparent;border-bottom:1px dotted #005e89; }
+a:hover {ldelim} color: #fff48e;}
Index: tags/2.4.0RC3/themes/dark/theme.css
===================================================================
--- tags/2.4.0RC3/themes/dark/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/dark/theme.css	(revision 14585)
@@ -0,0 +1,76 @@
+
+/* text color */
+BODY, H1,
+INPUT.rateButtonSelected /* <= why IE doesn't inherit this ? */ {
+	color:#d0d0d0;
+}
+
+H2, #menubar DT {
+	color: #ffff80;
+	background-image: url(images/tableh1_bg.png);
+}
+
+
+/* backgrounds */
+
+BODY, #imageToolBar A:hover {
+	background-color: #2f2f2f;
+}
+
+#menubar DL, .content, #imageToolBar, #imageHeaderBar, .switchBox, .header_notes {
+	background-color: #505050;
+}
+
+#imageHeaderBar H2 {
+	background-image: none;
+}
+
+#imageHeaderBar {
+	border-top: 1px solid #000;
+}
+
+/* borders */
+#menubar DL, .content, .switchBox {
+	border: 1px solid #000;
+}
+
+#menubar DT, #imageToolBar {
+	border-bottom: 1px solid #000;
+}
+
+FIELDSET, INPUT, SELECT, TEXTAREA,
+.thumbnailCategory ,
+.content .commentElement ,
+.thumbnails .wrap2 {
+	border: 1px solid gray;
+}
+
+
+.thumbnails .wrap2:hover,
+.thumbnailCategory:hover,
+.content  .commentElement:hover{
+	border-color: yellow;	/* thumbnails border color when mouse cursor is over it */
+}
+
+
+/* links */
+A, INPUT.rateButton {
+	color: #fff;
+}
+
+A:hover {
+	color: #ffff80;
+}
+
+.pwg-icon {
+	background-image: url(../default/s26/outline_ffffff.png);
+}
+
+A:hover .pwg-icon {
+	background-image: url(../default/s26/outline_ffff80.png);
+}
+
+.message {
+  color:white;
+  background-color:#666;
+}
Index: tags/2.4.0RC3/themes/dark/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/dark/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/dark/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,14 @@
+<?php
+/*
+Theme Name: dark
+Version: 2.3.0
+Description: Dark background, grayscale.
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=369
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+$themeconf = array(
+  'name'  => 'dark',
+  'parent' => 'default',
+);
+?>
Index: tags/2.4.0RC3/themes/default/fix-ie5-ie6.css
===================================================================
--- tags/2.4.0RC3/themes/default/fix-ie5-ie6.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/fix-ie5-ie6.css	(revision 14585)
@@ -0,0 +1,73 @@
+/* Issues in IE from 5 to 6 only not to be used with IE7 */
+
+#menubar LI.selected A {
+	font-weight: bold;
+}
+
+#menubar LI.selected LI A {
+	font-weight: normal;
+}
+
+/* fix IE with another layout for thumbnails */
+.thumbnails .wrap2 {
+  display: block;
+  position: relative;
+  text-align: left;
+}
+.thumbnails .wrap2 A,
+.thumbnails .wrap2 SPAN {
+  overflow: visible;
+  position: absolute;
+  top: 50%;
+  text-align: center;
+}
+
+.thumbnails IMG.thumbnail {
+  position: relative;
+  top: -50%;
+  /*\*//*/
+    margin-top: -40%;
+  /**/
+}
+
+/* to avoid vanishing objects in IE6 */
+H1, #theHeader {
+  width: 100%;	/* <- useless but seems to make IE6 happy */
+}
+.content {
+  height: 1em;	/* for IE6 it's like min-height */
+}
+
+/* fix category thumbnails on main page */
+.content .thumbnailCategories {
+  width: 99%;	/* buggy IE box model */
+}
+
+
+/* fix quickconnect layout */
+#quickconnect FIELDSET {
+  width: 99%;	/* correct an ugly 1 or 2 px misalignement with IE */
+}
+
+.filter LABEL INPUT,
+.filter LABEL SELECT {
+  display: block;
+  margin: 0.5em 0;
+}
+.filter FIELDSET * LABEL INPUT,
+.filter FIELDSET * LABEL SELECT {
+	display: inline;
+	vertical-align: top;
+	margin: 0 0.5em 0 0;
+}
+
+.pwg-icon {
+	display: block;
+}
+
+.imageInfoTable {display:block; margin: 0 200px;}
+.imageInfo {display:block; line-height:16px;}
+.imageInfo dt  {display:block; text-align:left; font-weight:bold; padding-right:0.5em;}
+.imageInfo dd {display:block; text-align:left; font-weight:normal;}
+.relSwitchBox {position:static;}
+#imageInfos dd { margin: 0 0 5px 20px;}
Index: tags/2.4.0RC3/themes/default/fix-ie7.css
===================================================================
--- tags/2.4.0RC3/themes/default/fix-ie7.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/fix-ie7.css	(revision 14585)
@@ -0,0 +1,31 @@
+/* fix IE with another layout for thumbnails */
+
+.thumbnails .wrap2 {
+  display: block;
+  position: relative;
+  text-align: left;
+}
+.thumbnails .wrap2 A,
+.thumbnails .wrap2 SPAN {
+  overflow: visible;
+  position: absolute;
+  top: 50%;
+  text-align: center;
+}
+
+.thumbnails IMG.thumbnail {
+  position: relative;
+  top: -50%;   
+  margin-top: 2%;
+}
+
+.pwg-icon {
+	display: block;
+}
+
+.imageInfoTable {display:block; margin: 0 200px;}
+.imageInfo {display:block; line-height:16px;}
+.imageInfo dt  {display:block; text-align:left; font-weight:bold; padding-right:0.5em;}
+.imageInfo dd {display:block; text-align:left; font-weight:normal;}
+.relSwitchBox {position:static;}
+#imageInfos dd { margin: 0 0 5px 20px;}
Index: tags/2.4.0RC3/themes/default/fix-khtml.css
===================================================================
--- tags/2.4.0RC3/themes/default/fix-khtml.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/fix-khtml.css	(revision 14585)
@@ -0,0 +1,17 @@
+/* Issue in Safari/Konqueror only                                                 */
+/* If H2 has a 0 margin-top categoryActions doesn't float right but overwrites H2 */
+.content>.titrePage>H2 {
+    margin: 1px 0 0 0;	/* add an arbitrary margin-top */
+}
+
+.content>.titrePage {
+    position: relative;
+    top: -1px;		/* move the container up by the same amount */
+    margin-bottom: 5px; 
+}
+
+#menubar #menuTagCloud SPAN
+{
+  display: inline-block;/* required for Safari 3.1 - otherwise overflows on the right */
+}
+
Index: tags/2.4.0RC3/themes/default/icon/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/icon/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/icon/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/icon/mimetypes/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/icon/mimetypes/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/icon/mimetypes/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/iconset.css
===================================================================
--- tags/2.4.0RC3/themes/default/iconset.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/iconset.css	(revision 14585)
@@ -0,0 +1,71 @@
+.pwg-icon {
+	display: inline-block; /*IE6 does not get this correctly*/
+	text-indent: -9999px; overflow: hidden; background-repeat: no-repeat;
+	width: 26px; height: 26px; background-image: url(s26/outline_808080.png);
+	vertical-align: bottom;
+}
+.pwg-button-text { display:none; }
+
+.pwg-state-disabled .pwg-icon {
+	opacity: .5;
+	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
+	filter: alpha(opacity=50);
+}
+
+.pwg-button {
+	display: inline-block;
+	vertical-align: top;
+  cursor:pointer;
+}
+
+.pwg-icon-home {background-position: -26px 0}
+.pwg-icon-camera {background-position: -52px 0}
+.pwg-icon-save {background-position: -78px 0}
+.pwg-icon-cloud {background-position: -104px 0}
+.pwg-icon-letters {background-position: -130px 0}
+.pwg-icon-calendar {background-position: -156px 0}
+.pwg-icon-camera-calendar {background-position: -182px 0}
+
+.pwg-icon-arrow-n {background-position: 0 -26px}
+.pwg-icon-arrow-e {background-position: -26px -26px}
+/*.pwg-icon-arrow-s {background-position: -52px -26px}*/
+.pwg-icon-arrow-w {background-position: -78px -26px}
+/*.pwg-icon-arrowstop-n {background-position: -104px -26px}*/
+.pwg-icon-arrowstop-e {background-position: -130px -26px}
+/*.pwg-icon-arrowstop-s {background-position: -156px -26px}*/
+.pwg-icon-arrowstop-w {background-position: -182px -26px}
+
+.pwg-icon-close {background-position: 0 -52px}
+.pwg-icon-category-edit {background-position: -26px -52px}
+.pwg-icon-sort {background-position: -52px -52px}
+.pwg-icon-sizes {background-position: -78px -52px}
+.pwg-icon-category-view-normal {background-position: -156px -52px}
+.pwg-icon-category-view-flat {background-position: -182px -52px}
+
+.pwg-icon-caddie {background-position: 0 -78px}
+.pwg-icon-caddie-add {background-position: -26px -78px}
+.pwg-icon-caddie-del {background-position: -52px -78px}
+.pwg-icon-favorite {background-position: -78px -78px}
+.pwg-icon-favorite-add {background-position: -104px -78px}
+.pwg-icon-favorite-del {background-position: -130px -78px}
+.pwg-icon-filter {background-position: -156px -78px}
+.pwg-icon-filter-del {background-position: -182px -78px}
+
+.pwg-icon-camera-info {background-position: 0 -104px}
+.pwg-icon-representative {background-position: -26px -104px}
+.pwg-icon-edit {background-position: -52px -104px}
+.pwg-icon-register {background-position: -78px -104px}
+.pwg-icon-lost-password {background-position: -104px -104px}
+
+.pwg-icon-slideshow {background-position: 0 -130px}
+.pwg-icon-play {background-position: -26px -130px}
+.pwg-icon-pause {background-position: -52px -130px}
+.pwg-icon-stop {background-position: -78px -130px}
+.pwg-icon-clock-plus {background-position: -104px -130px}
+.pwg-icon-clock-minus {background-position: -130px -130px}
+.pwg-icon-repeat-play {background-position: -156px -130px}
+.pwg-icon-repeat-stop {background-position: -182px -130px}
+
+.pwg-icon-map {background-position: 0 -156px}
+.pwg-icon-globe {background-position: -26px -156px}
+
Index: tags/2.4.0RC3/themes/default/images/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/images/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/images/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/js/datepicker.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/datepicker.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/datepicker.js	(revision 14585)
@@ -0,0 +1,191 @@
+// initialize controls
+// buttonImageName: Directory and name of calendar picture
+// day, month, year: selectors of visible date controls
+// linked_date: selector of hidden linked dates control
+// checked_on_change: selector of control to change "checked" attribut
+// min_linked_date: selector of hidden linked date control witch give min value
+// max_linked_date: selector of hidden linked date control witch give max value
+function pwg_common_initialization_datepicker(buttonImageName, day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date)
+{
+  // return formated date with control values
+  function pwg_get_fmt_from_ctrls()
+  {
+    return $(year).val() + "-" + $(month).val() + "-" + $(day).val();
+  }
+
+  // return if linked_date is valid date
+  function is_valid_linked_value(linked_date_name)
+  {
+    array_date = $(linked_date_name).val().split('-');
+    return (
+      (array_date.length == 3) &&
+      (array_date[0] != "") &&
+      (array_date[1] != "") && (array_date[1] != "0") &&
+      (array_date[2] != "") && (array_date[2] != "0")
+      )
+  }
+  
+  // Action on change date value
+  function pwg_on_date_change()
+  {
+    pwg_check_date();
+    if (checked_on_change != null)
+    {
+      $(checked_on_change).attr("checked", "true");
+    }
+  }
+
+  // In order to desable element of list
+  function pwg_disabled_selection()
+  {
+    array_date = $(linked_date).val().split('-');
+    y = array_date[0];
+    m = array_date[1];
+
+    // Init list
+    $(day + " option").removeAttr("disabled");
+    $(month + " option").removeAttr("disabled");
+
+    var daysInMonth = 32 - new Date(y, m - 1, 32).getDate();
+    $(day + " option:gt(" + (daysInMonth) +")").attr("disabled", "disabled");
+
+    if ((min_linked_date != null) && (is_valid_linked_value(min_linked_date) == true))
+    {
+      date_cmp = min_linked_date;
+      op_cmp = "lt";
+    }
+    else if ((max_linked_date != null) && (is_valid_linked_value(max_linked_date) == true))
+    {
+      date_cmp = max_linked_date;
+      op_cmp = "gt";
+    }
+    else
+    {
+      date_cmp = null;
+      op_cmp = null;
+    }
+
+    if (op_cmp != null)
+    {
+      array_date = $(date_cmp).val().split('-');
+      y_cmp = array_date[0];
+      m_cmp = array_date[1];
+      d_cmp = array_date[2];
+      
+      if (y == y_cmp)
+      {
+        $(month + " option:" + op_cmp + "(" + (m_cmp) +")").attr("disabled", "disabled");
+        if (op_cmp ==  "lt")
+        {
+            $(month + " option:eq(" + (0) +")").removeAttr("disabled");
+        }
+
+        if (m == m_cmp)
+        {
+          $(day + " option:" + op_cmp + "(" + (d_cmp) +")").attr("disabled", "disabled");
+          if (op_cmp ==  "lt")
+          {
+            $(day + " option:eq(" + (0) +")").removeAttr("disabled");
+          }
+        }
+      }
+    }
+  }
+
+  // Prevent selection of invalid dates through the select controls 
+  function pwg_check_date()
+  {
+    last_date = $(linked_date).val();
+
+    $(linked_date).val(pwg_get_fmt_from_ctrls());
+
+    if ((min_linked_date != null) && (is_valid_linked_value(min_linked_date)))
+    {
+      cancel = ($(min_linked_date).datepicker("getDate") > $(linked_date).datepicker("getDate"));
+    }
+    else if ((max_linked_date != null) && (is_valid_linked_value(max_linked_date)))
+    {
+      cancel = ($(max_linked_date).datepicker("getDate") < $(linked_date).datepicker("getDate"));
+    }
+    else
+    {
+      cancel = false;
+    }
+
+    if (cancel)
+    {
+      array_date = last_date.split('-');
+      $(year).val(array_date[0]);
+      $(month).val(array_date[1]);
+      $(day).val(array_date[2]);
+      // check again
+      pwg_check_date();
+    }
+  }
+
+  jQuery().ready(function(){
+    // Init hidden value
+    $(linked_date).val(pwg_get_fmt_from_ctrls());
+
+    // Init Datepicker
+    jQuery(linked_date).datepicker({
+      dateFormat:'yy-m-d',
+      beforeShow:
+        // Prepare to show a date picker linked to three select controls 
+        function readLinked(input) { 
+            if (min_linked_date != null)
+            {
+              return {minDate: $(min_linked_date).datepicker("getDate")};
+            }
+            else if (max_linked_date != null)
+            {
+              return {maxDate: $(max_linked_date).datepicker("getDate")};
+            }
+            else
+            {
+              return {};
+            }
+        },
+      onSelect:
+        // Update three select controls to match a date picker selection 
+        function updateLinked(date) {
+            if (date.length == 0)
+            {
+              $(year).val("");
+              $(month).val("0");
+              $(day).val("0");
+            }
+            else
+            {
+              array_date = date.split('-');
+              $(year).val(array_date[0]);
+              $(month).val(array_date[1]);
+              $(day).val(array_date[2]);
+            }
+            pwg_on_date_change();
+        },
+      showOn: "both",
+      buttonImage: buttonImageName,
+      buttonImageOnly: true,
+      buttonText: ""
+      });
+
+    // Check showed controls
+    jQuery(day + ", " + month + ", " + year).change(
+      function ()
+      {
+        pwg_on_date_change();
+      });
+
+    // Check showed controls
+    jQuery(day + ", " + month + ", " + year).focus(
+      function ()
+      {
+        pwg_disabled_selection();
+      });
+
+    // In order to init linked input
+    pwg_check_date();
+   });
+
+}
Index: tags/2.4.0RC3/themes/default/js/image.loader.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/image.loader.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/image.loader.js	(revision 14585)
@@ -0,0 +1,84 @@
+
+function ImageLoader(opts) {
+	this.opts = jQuery.extend( {
+			maxRequests: 6,
+			onChanged: jQuery.noop
+		}, opts||{} );
+}
+
+ImageLoader.prototype = {
+	loaded: 0,
+	errors: 0,
+	errorEma: 0,
+
+	pause: false,
+
+	current: [],
+	queue: [],
+	pool: [],
+
+	remaining: function() {
+		return this.current.length + this.queue.length;
+	},
+
+	add: function(urls) {
+		this.queue = this.queue.concat( urls );
+		this._fireChanged("add");
+		this._checkQueue();
+	},
+
+	clear: function() {
+		this.queue.length = 0;
+		while (this.current.length)
+			jQuery( this.current.pop() ).unbind();
+		this.loaded = this.errors = this.errorEma = 0;
+	},
+
+	pause: function(val) {
+		if (val !== undefined)
+		{
+			this.paused = val;
+			this._checkQueue();
+		}
+		return this.paused;
+	},
+
+	_checkQueue: function() {
+		while (!this.paused
+			&& this.queue.length
+			&& this.current.length < this.opts.maxRequests)
+		{
+			this._processOne( this.queue.shift() );
+		}
+	},
+
+	_processOne: function(url) {
+		var img = this.pool.shift() || new Image;
+		this.current.push(img);
+		var that = this;
+		jQuery(img).bind( "load error abort", function(e) {
+		//img.onload = function(e) {
+			jQuery(img).unbind();
+			img.onload=null;
+			that.current.splice(jQuery.inArray(img, that.current), 1);
+			if (e.type==="load") {
+				that.loaded++;
+				that.errorEma *= 0.9;
+			}
+			else {
+				that.errors++;
+				that.errorEma++;
+				if (that.errorEma>=20 && that.errorEma<21)
+					that.paused = true;
+			}
+			that._fireChanged(e.type, img);
+			that._checkQueue();
+			that.pool.push(img);
+		} );
+		img.src = url;
+	},
+
+	_fireChanged: function(type, img) {
+		this.opts.onChanged(type, img);
+	}
+}
Index: tags/2.4.0RC3/themes/default/js/jquery.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/jquery.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/jquery.js	(revision 14585)
@@ -0,0 +1,9404 @@
+/*!
+ * jQuery JavaScript Library v1.7.2
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Wed Mar 21 12:46:34 2012 -0700
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+	navigator = window.navigator,
+	location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// A simple way to check for HTML strings or ID strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Check if a string has a non-whitespace character in it
+	rnotwhite = /\S/,
+
+	// Used for trimming whitespace
+	trimLeft = /^\s+/,
+	trimRight = /\s+$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+	// Useragent RegExp
+	rwebkit = /(webkit)[ \/]([\w.]+)/,
+	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+	rmsie = /(msie) ([\w.]+)/,
+	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+	// Matches dashed string for camelizing
+	rdashAlpha = /-([a-z]|[0-9])/ig,
+	rmsPrefix = /^-ms-/,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// Keep a UserAgent string for use with jQuery.browser
+	userAgent = navigator.userAgent,
+
+	// For matching the engine and version of the browser
+	browserMatch,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// The ready event handler
+	DOMContentLoaded,
+
+	// Save a reference to some core methods
+	toString = Object.prototype.toString,
+	hasOwn = Object.prototype.hasOwnProperty,
+	push = Array.prototype.push,
+	slice = Array.prototype.slice,
+	trim = String.prototype.trim,
+	indexOf = Array.prototype.indexOf,
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), or $(undefined)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// The body element only exists once, optimize finding it
+		if ( selector === "body" && !context && document.body ) {
+			this.context = document;
+			this[0] = document.body;
+			this.selector = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = quickExpr.exec( selector );
+			}
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context ? context.ownerDocument || context : document );
+
+					// If a single string is passed in and it's a single tag
+					// just do a createElement and skip the rest
+					ret = rsingleTag.exec( selector );
+
+					if ( ret ) {
+						if ( jQuery.isPlainObject( context ) ) {
+							selector = [ document.createElement( ret[1] ) ];
+							jQuery.fn.attr.call( selector, context, true );
+
+						} else {
+							selector = [ doc.createElement( ret[1] ) ];
+						}
+
+					} else {
+						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $("#id")
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.7.2",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return slice.call( this, 0 );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = this.constructor();
+
+		if ( jQuery.isArray( elems ) ) {
+			push.apply( ret, elems );
+
+		} else {
+			jQuery.merge( ret, elems );
+		}
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Attach the listeners
+		jQuery.bindReady();
+
+		// Add the callback
+		readyList.add( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( slice.apply( this, arguments ),
+			"slice", slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+		// Either a released hold or an DOMready/load event and not yet ready
+		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+			if ( !document.body ) {
+				return setTimeout( jQuery.ready, 1 );
+			}
+
+			// Remember that the DOM is ready
+			jQuery.isReady = true;
+
+			// If a normal DOM Ready event fired, decrement, and wait if need be
+			if ( wait !== true && --jQuery.readyWait > 0 ) {
+				return;
+			}
+
+			// If there are functions bound, to execute
+			readyList.fireWith( document, [ jQuery ] );
+
+			// Trigger any bound ready events
+			if ( jQuery.fn.trigger ) {
+				jQuery( document ).trigger( "ready" ).off( "ready" );
+			}
+		}
+	},
+
+	bindReady: function() {
+		if ( readyList ) {
+			return;
+		}
+
+		readyList = jQuery.Callbacks( "once memory" );
+
+		// Catch cases where $(document).ready() is called after the
+		// browser event has already occurred.
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Mozilla, Opera and webkit nightlies currently support this event
+		if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else if ( document.attachEvent ) {
+			// ensure firing before onload,
+			// maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var toplevel = false;
+
+			try {
+				toplevel = window.frameElement == null;
+			} catch(e) {}
+
+			if ( document.documentElement.doScroll && toplevel ) {
+				doScrollCheck();
+			}
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!hasOwn.call(obj, "constructor") &&
+				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		for ( var name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	parseJSON: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		if ( typeof data !== "string" || !data ) {
+			return null;
+		}
+		var xml, tmp;
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+	},
+
+	// args is for internal usage only
+	each: function( object, callback, args ) {
+		var name, i = 0,
+			length = object.length,
+			isObj = length === undefined || jQuery.isFunction( object );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.apply( object[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( object[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in object ) {
+					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return object;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: trim ?
+		function( text ) {
+			return text == null ?
+				"" :
+				trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( array, results ) {
+		var ret = results || [];
+
+		if ( array != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			var type = jQuery.type( array );
+
+			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+				push.call( ret, array );
+			} else {
+				jQuery.merge( ret, array );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, array, i ) {
+		var len;
+
+		if ( array ) {
+			if ( indexOf ) {
+				return indexOf.call( array, elem, i );
+			}
+
+			len = array.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in array && array[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var i = first.length,
+			j = 0;
+
+		if ( typeof second.length === "number" ) {
+			for ( var l = second.length; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var ret = [], retVal;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( var i = 0, length = elems.length; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key, ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		if ( typeof context === "string" ) {
+			var tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		var args = slice.call( arguments, 2 ),
+			proxy = function() {
+				return fn.apply( context, args.concat( slice.call( arguments ) ) );
+			};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Mutifunctional method to get and set values to a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	},
+
+	// Use of jQuery.browser is frowned upon.
+	// More details: http://docs.jquery.com/Utilities/jQuery.browser
+	uaMatch: function( ua ) {
+		ua = ua.toLowerCase();
+
+		var match = rwebkit.exec( ua ) ||
+			ropera.exec( ua ) ||
+			rmsie.exec( ua ) ||
+			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+			[];
+
+		return { browser: match[1] || "", version: match[2] || "0" };
+	},
+
+	sub: function() {
+		function jQuerySub( selector, context ) {
+			return new jQuerySub.fn.init( selector, context );
+		}
+		jQuery.extend( true, jQuerySub, this );
+		jQuerySub.superclass = this;
+		jQuerySub.fn = jQuerySub.prototype = this();
+		jQuerySub.fn.constructor = jQuerySub;
+		jQuerySub.sub = this.sub;
+		jQuerySub.fn.init = function init( selector, context ) {
+			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+				context = jQuerySub( context );
+			}
+
+			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+		};
+		jQuerySub.fn.init.prototype = jQuerySub.fn;
+		var rootjQuerySub = jQuerySub(document);
+		return jQuerySub;
+	},
+
+	browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+	jQuery.browser[ browserMatch.browser ] = true;
+	jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+	jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+	trimLeft = /^[\s\xA0]+/;
+	trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+	DOMContentLoaded = function() {
+		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+		jQuery.ready();
+	};
+
+} else if ( document.attachEvent ) {
+	DOMContentLoaded = function() {
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	};
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+	if ( jQuery.isReady ) {
+		return;
+	}
+
+	try {
+		// If IE is used, use the trick by Diego Perini
+		// http://javascript.nwbox.com/IEContentLoaded/
+		document.documentElement.doScroll("left");
+	} catch(e) {
+		setTimeout( doScrollCheck, 1 );
+		return;
+	}
+
+	// and execute any waiting functions
+	jQuery.ready();
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+	var object = flagsCache[ flags ] = {},
+		i, length;
+	flags = flags.split( /\s+/ );
+	for ( i = 0, length = flags.length; i < length; i++ ) {
+		object[ flags[i] ] = true;
+	}
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	flags:	an optional list of space-separated flags that will change how
+ *			the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+	// Convert flags from String-formatted to Object-formatted
+	// (we check in cache first)
+	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+	var // Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = [],
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Add one or several callbacks to the list
+		add = function( args ) {
+			var i,
+				length,
+				elem,
+				type,
+				actual;
+			for ( i = 0, length = args.length; i < length; i++ ) {
+				elem = args[ i ];
+				type = jQuery.type( elem );
+				if ( type === "array" ) {
+					// Inspect recursively
+					add( elem );
+				} else if ( type === "function" ) {
+					// Add if not in unique mode and callback is not in
+					if ( !flags.unique || !self.has( elem ) ) {
+						list.push( elem );
+					}
+				}
+			}
+		},
+		// Fire callbacks
+		fire = function( context, args ) {
+			args = args || [];
+			memory = !flags.memory || [ context, args ];
+			fired = true;
+			firing = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+					memory = true; // Mark as halted
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( !flags.once ) {
+					if ( stack && stack.length ) {
+						memory = stack.shift();
+						self.fireWith( memory[ 0 ], memory[ 1 ] );
+					}
+				} else if ( memory === true ) {
+					self.disable();
+				} else {
+					list = [];
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					var length = list.length;
+					add( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away, unless previous
+					// firing was halted (stopOnFalse)
+					} else if ( memory && memory !== true ) {
+						firingStart = length;
+						fire( memory[ 0 ], memory[ 1 ] );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					var args = arguments,
+						argIndex = 0,
+						argLength = args.length;
+					for ( ; argIndex < argLength ; argIndex++ ) {
+						for ( var i = 0; i < list.length; i++ ) {
+							if ( args[ argIndex ] === list[ i ] ) {
+								// Handle firingIndex and firingLength
+								if ( firing ) {
+									if ( i <= firingLength ) {
+										firingLength--;
+										if ( i <= firingIndex ) {
+											firingIndex--;
+										}
+									}
+								}
+								// Remove the element
+								list.splice( i--, 1 );
+								// If we have some unicity property then
+								// we only need to do this once
+								if ( flags.unique ) {
+									break;
+								}
+							}
+						}
+					}
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				if ( list ) {
+					var i = 0,
+						length = list.length;
+					for ( ; i < length; i++ ) {
+						if ( fn === list[ i ] ) {
+							return true;
+						}
+					}
+				}
+				return false;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory || memory === true ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				if ( stack ) {
+					if ( firing ) {
+						if ( !flags.once ) {
+							stack.push( [ context, args ] );
+						}
+					} else if ( !( flags.once && memory ) ) {
+						fire( context, args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+
+
+
+
+var // Static reference to slice
+	sliceDeferred = [].slice;
+
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var doneList = jQuery.Callbacks( "once memory" ),
+			failList = jQuery.Callbacks( "once memory" ),
+			progressList = jQuery.Callbacks( "memory" ),
+			state = "pending",
+			lists = {
+				resolve: doneList,
+				reject: failList,
+				notify: progressList
+			},
+			promise = {
+				done: doneList.add,
+				fail: failList.add,
+				progress: progressList.add,
+
+				state: function() {
+					return state;
+				},
+
+				// Deprecated
+				isResolved: doneList.fired,
+				isRejected: failList.fired,
+
+				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+					return this;
+				},
+				always: function() {
+					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+					return this;
+				},
+				pipe: function( fnDone, fnFail, fnProgress ) {
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( {
+							done: [ fnDone, "resolve" ],
+							fail: [ fnFail, "reject" ],
+							progress: [ fnProgress, "notify" ]
+						}, function( handler, data ) {
+							var fn = data[ 0 ],
+								action = data[ 1 ],
+								returned;
+							if ( jQuery.isFunction( fn ) ) {
+								deferred[ handler ](function() {
+									returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								});
+							} else {
+								deferred[ handler ]( newDefer[ action ] );
+							}
+						});
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					if ( obj == null ) {
+						obj = promise;
+					} else {
+						for ( var key in promise ) {
+							obj[ key ] = promise[ key ];
+						}
+					}
+					return obj;
+				}
+			},
+			deferred = promise.promise({}),
+			key;
+
+		for ( key in lists ) {
+			deferred[ key ] = lists[ key ].fire;
+			deferred[ key + "With" ] = lists[ key ].fireWith;
+		}
+
+		// Handle state
+		deferred.done( function() {
+			state = "resolved";
+		}, failList.disable, progressList.lock ).fail( function() {
+			state = "rejected";
+		}, doneList.disable, progressList.lock );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( firstParam ) {
+		var args = sliceDeferred.call( arguments, 0 ),
+			i = 0,
+			length = args.length,
+			pValues = new Array( length ),
+			count = length,
+			pCount = length,
+			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+				firstParam :
+				jQuery.Deferred(),
+			promise = deferred.promise();
+		function resolveFunc( i ) {
+			return function( value ) {
+				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				if ( !( --count ) ) {
+					deferred.resolveWith( deferred, args );
+				}
+			};
+		}
+		function progressFunc( i ) {
+			return function( value ) {
+				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+				deferred.notifyWith( promise, pValues );
+			};
+		}
+		if ( length > 1 ) {
+			for ( ; i < length; i++ ) {
+				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+				} else {
+					--count;
+				}
+			}
+			if ( !count ) {
+				deferred.resolveWith( deferred, args );
+			}
+		} else if ( deferred !== firstParam ) {
+			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+		}
+		return promise;
+	}
+});
+
+
+
+
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		tds,
+		events,
+		eventName,
+		i,
+		isSupported,
+		div = document.createElement( "div" ),
+		documentElement = document.documentElement;
+
+	// Preliminary tests
+	div.setAttribute("className", "t");
+	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+
+	all = div.getElementsByTagName( "*" );
+	a = div.getElementsByTagName( "a" )[ 0 ];
+
+	// Can't get basic test support
+	if ( !all || !all.length || !a ) {
+		return {};
+	}
+
+	// First batch of supports tests
+	select = document.createElement( "select" );
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName( "input" )[ 0 ];
+
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.55/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form(#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		pixelMargin: true
+	};
+
+	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent( "onclick" );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute("type", "radio");
+	support.radioValue = input.value === "t";
+
+	input.setAttribute("checked", "checked");
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: 1,
+			change: 1,
+			focusin: 1
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	fragment.removeChild( div );
+
+	// Null elements to avoid leaks in IE
+	fragment = select = opt = div = input = null;
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, outer, inner, table, td, offsetSupport,
+			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+			paddingMarginBorderVisibility, paddingMarginBorder,
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		conMarginTop = 1;
+		paddingMarginBorder = "padding:0;margin:0;border:";
+		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
+			"<tr><td></td></tr></table>";
+
+		container = document.createElement("div");
+		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName( "td" );
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check if div with explicit width and no margin-right incorrectly
+		// gets computed margin-right based on width of container. For more
+		// info see bug #3333
+		// Fails in WebKit before Feb 2011 nightlies
+		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+		if ( window.getComputedStyle ) {
+			div.innerHTML = "";
+			marginDiv = document.createElement( "div" );
+			marginDiv.style.width = "0";
+			marginDiv.style.marginRight = "0";
+			div.style.width = "2px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.width = div.style.padding = "1px";
+			div.style.border = 0;
+			div.style.overflow = "hidden";
+			div.style.display = "inline";
+			div.style.zoom = 1;
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div style='width:5px;'></div>";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+		}
+
+		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+		div.innerHTML = html;
+
+		outer = div.firstChild;
+		inner = outer.firstChild;
+		td = outer.nextSibling.firstChild.firstChild;
+
+		offsetSupport = {
+			doesNotAddBorder: ( inner.offsetTop !== 5 ),
+			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+		};
+
+		inner.style.position = "fixed";
+		inner.style.top = "20px";
+
+		// safari subtracts parent border width here which is 5px
+		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+		inner.style.position = inner.style.top = "";
+
+		outer.style.overflow = "hidden";
+		outer.style.position = "relative";
+
+		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+		if ( window.getComputedStyle ) {
+			div.style.marginTop = "1%";
+			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+		}
+
+		if ( typeof container.style.zoom !== "undefined" ) {
+			container.style.zoom = 1;
+		}
+
+		body.removeChild( container );
+		marginDiv = div = container = null;
+
+		jQuery.extend( support, offsetSupport );
+	});
+
+	return support;
+})();
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	// Please use with caution
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var privateCache, thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
+			isEvents = name === "events";
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = ++jQuery.uuid;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		privateCache = thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Users should not attempt to inspect the internal events object using jQuery.data,
+		// it is undocumented and subject to change. But does anyone listen? No.
+		if ( isEvents && !thisCache[ name ] ) {
+			return privateCache.events;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			// Reference to internal data cache key
+			internalKey = jQuery.expando,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+
+			// See jQuery.data for more information
+			id = isNode ? elem[ internalKey ] : internalKey;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split( " " );
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject(cache[ id ]) ) {
+				return;
+			}
+		}
+
+		// Browsers that fail expando deletion also refuse to delete expandos on
+		// the window, but it will allow it on all other JS objects; other browsers
+		// don't care
+		// Ensure that `cache` is not a window object #10080
+		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+			delete cache[ id ];
+		} else {
+			cache[ id ] = null;
+		}
+
+		// We destroyed the cache and need to eliminate the expando on the node to avoid
+		// false lookups in the cache for entries that no longer exist
+		if ( isNode ) {
+			// IE does not allow us to delete expando properties from nodes,
+			// nor does it have a removeAttribute function on Document nodes;
+			// we must handle all of these cases
+			if ( jQuery.support.deleteExpando ) {
+				delete elem[ internalKey ];
+			} else if ( elem.removeAttribute ) {
+				elem.removeAttribute( internalKey );
+			} else {
+				elem[ internalKey ] = null;
+			}
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		if ( elem.nodeName ) {
+			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+			if ( match ) {
+				return !(match === true || elem.getAttribute("classid") !== match);
+			}
+		}
+
+		return true;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( name.indexOf( "data-" ) === 0 ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				jQuery.isNumeric( data ) ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	for ( var name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+	var deferDataKey = type + "defer",
+		queueDataKey = type + "queue",
+		markDataKey = type + "mark",
+		defer = jQuery._data( elem, deferDataKey );
+	if ( defer &&
+		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+		// Give room for hard-coded callbacks to fire first
+		// and eventually mark/queue something else on the element
+		setTimeout( function() {
+			if ( !jQuery._data( elem, queueDataKey ) &&
+				!jQuery._data( elem, markDataKey ) ) {
+				jQuery.removeData( elem, deferDataKey, true );
+				defer.fire();
+			}
+		}, 0 );
+	}
+}
+
+jQuery.extend({
+
+	_mark: function( elem, type ) {
+		if ( elem ) {
+			type = ( type || "fx" ) + "mark";
+			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+		}
+	},
+
+	_unmark: function( force, elem, type ) {
+		if ( force !== true ) {
+			type = elem;
+			elem = force;
+			force = false;
+		}
+		if ( elem ) {
+			type = type || "fx";
+			var key = type + "mark",
+				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+			if ( count ) {
+				jQuery._data( elem, key, count );
+			} else {
+				jQuery.removeData( elem, key, true );
+				handleQueueMarkDefer( elem, type, "mark" );
+			}
+		}
+	},
+
+	queue: function( elem, type, data ) {
+		var q;
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			q = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !q || jQuery.isArray(data) ) {
+					q = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					q.push( data );
+				}
+			}
+			return q || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			fn = queue.shift(),
+			hooks = {};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+		}
+
+		if ( fn ) {
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			jQuery._data( elem, type + ".run", hooks );
+			fn.call( elem, function() {
+				jQuery.dequeue( elem, type );
+			}, hooks );
+		}
+
+		if ( !queue.length ) {
+			jQuery.removeData( elem, type + "queue " + type + ".run", true );
+			handleQueueMarkDefer( elem, type, "queue" );
+		}
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, object ) {
+		if ( typeof type !== "string" ) {
+			object = type;
+			type = undefined;
+		}
+		type = type || "fx";
+		var defer = jQuery.Deferred(),
+			elements = this,
+			i = elements.length,
+			count = 1,
+			deferDataKey = type + "defer",
+			queueDataKey = type + "queue",
+			markDataKey = type + "mark",
+			tmp;
+		function resolve() {
+			if ( !( --count ) ) {
+				defer.resolveWith( elements, [ elements ] );
+			}
+		}
+		while( i-- ) {
+			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+				count++;
+				tmp.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( object );
+	}
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+	rspace = /\s+/,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea)?$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classNames, i, l, elem, className, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( (value && typeof value === "string") || value === undefined ) {
+			classNames = ( value || "" ).split( rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 && elem.className ) {
+					if ( value ) {
+						className = (" " + elem.className + " ").replace( rclass, " " );
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							className = className.replace(" " + classNames[ c ] + " ", " ");
+						}
+						elem.className = jQuery.trim( className );
+
+					} else {
+						elem.className = "";
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space seperated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var self = jQuery(this), val;
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, i, max, option,
+					index = elem.selectedIndex,
+					values = [],
+					options = elem.options,
+					one = elem.type === "select-one";
+
+				// Nothing was selected
+				if ( index < 0 ) {
+					return null;
+				}
+
+				// Loop through all the selected options
+				i = one ? index : 0;
+				max = one ? index + 1 : options.length;
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// Don't return options that are disabled or in a disabled optgroup
+					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+				if ( one && !values.length && options.length ) {
+					return jQuery( options[ index ] ).val();
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attrFn: {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true
+	},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && name in jQuery.attrFn ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, "" + value );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, l, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+			attrNames = value.toLowerCase().split( rspace );
+			l = attrNames.length;
+
+			for ( ; i < l; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+				ret.nodeValue :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.nodeValue = value + "" );
+		}
+	};
+
+	// Apply the nodeHook to tabindex
+	jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = "" + value );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+
+
+
+
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+	quickParse = function( selector ) {
+		var quick = rquickIs.exec( selector );
+		if ( quick ) {
+			//   0  1    2   3
+			// [ _, tag, id, class ]
+			quick[1] = ( quick[1] || "" ).toLowerCase();
+			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+		}
+		return quick;
+	},
+	quickIs = function( elem, m ) {
+		var attrs = elem.attributes || {};
+		return (
+			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+			(!m[2] || (attrs.id || {}).value === m[2]) &&
+			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
+		);
+	},
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, quick, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				quick: selector && quickParse( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+			t, tns, type, origType, namespaces, origCount,
+			j, events, special, handle, eventType, handleObj;
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			handle = elemData.handle;
+			if ( handle ) {
+				handle.elem = null;
+			}
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, [ "events", "handle" ], true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var type = event.type || event,
+			namespaces = [],
+			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			old = null;
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old && old === elem.ownerDocument ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = [].slice.call( arguments, 0 ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [],
+			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			// Pregenerate a single jQuery object for reuse with .is()
+			jqcur = jQuery(this);
+			jqcur.context = this.ownerDocument || this;
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process events on disabled elements (#6911, #8165)
+				if ( cur.disabled !== true ) {
+					selMatch = {};
+					matches = [];
+					jqcur[0] = cur;
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = (
+								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+							);
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+		if ( event.metaKey === undefined ) {
+			event.metaKey = event.ctrlKey;
+		}
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		ready: {
+			// Make sure the ready event is setup
+			setup: jQuery.bindReady
+		},
+
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		if ( elem.detachEvent ) {
+			elem.detachEvent( "on" + type, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector,
+				ret;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !form._submit_attached ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					form._submit_attached = true;
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+		
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+							jQuery.event.simulate( "change", this, event, true );
+						}
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					elem._change_attached = true;
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			var handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( var type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( jQuery.attrFn ) {
+		jQuery.attrFn[ name ] = true;
+	}
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ *  Copyright 2011, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+	expando = "sizcache" + (Math.random() + '').replace('.', ''),
+	done = 0,
+	toString = Object.prototype.toString,
+	hasDuplicate = false,
+	baseHasDuplicate = true,
+	rBackslash = /\\/g,
+	rReturn = /\r\n/g,
+	rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+//   Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+	baseHasDuplicate = false;
+	return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+
+	var origContext = context;
+
+	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	var m, set, checkSet, extra, ret, cur, pop, i,
+		prune = true,
+		contextXML = Sizzle.isXML( context ),
+		parts = [],
+		soFar = selector;
+
+	// Reset the position of the chunker regexp (start from head)
+	do {
+		chunker.exec( "" );
+		m = chunker.exec( soFar );
+
+		if ( m ) {
+			soFar = m[3];
+
+			parts.push( m[1] );
+
+			if ( m[2] ) {
+				extra = m[3];
+				break;
+			}
+		}
+	} while ( m );
+
+	if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+			set = posProcess( parts[0] + parts[1], context, seed );
+
+		} else {
+			set = Expr.relative[ parts[0] ] ?
+				[ context ] :
+				Sizzle( parts.shift(), context );
+
+			while ( parts.length ) {
+				selector = parts.shift();
+
+				if ( Expr.relative[ selector ] ) {
+					selector += parts.shift();
+				}
+
+				set = posProcess( selector, set, seed );
+			}
+		}
+
+	} else {
+		// Take a shortcut and set the context if the root selector is an ID
+		// (but not if it'll be faster if the inner selector is an ID)
+		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+			ret = Sizzle.find( parts.shift(), context, contextXML );
+			context = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set )[0] :
+				ret.set[0];
+		}
+
+		if ( context ) {
+			ret = seed ?
+				{ expr: parts.pop(), set: makeArray(seed) } :
+				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+			set = ret.expr ?
+				Sizzle.filter( ret.expr, ret.set ) :
+				ret.set;
+
+			if ( parts.length > 0 ) {
+				checkSet = makeArray( set );
+
+			} else {
+				prune = false;
+			}
+
+			while ( parts.length ) {
+				cur = parts.pop();
+				pop = cur;
+
+				if ( !Expr.relative[ cur ] ) {
+					cur = "";
+				} else {
+					pop = parts.pop();
+				}
+
+				if ( pop == null ) {
+					pop = context;
+				}
+
+				Expr.relative[ cur ]( checkSet, pop, contextXML );
+			}
+
+		} else {
+			checkSet = parts = [];
+		}
+	}
+
+	if ( !checkSet ) {
+		checkSet = set;
+	}
+
+	if ( !checkSet ) {
+		Sizzle.error( cur || selector );
+	}
+
+	if ( toString.call(checkSet) === "[object Array]" ) {
+		if ( !prune ) {
+			results.push.apply( results, checkSet );
+
+		} else if ( context && context.nodeType === 1 ) {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+					results.push( set[i] );
+				}
+			}
+
+		} else {
+			for ( i = 0; checkSet[i] != null; i++ ) {
+				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+					results.push( set[i] );
+				}
+			}
+		}
+
+	} else {
+		makeArray( checkSet, results );
+	}
+
+	if ( extra ) {
+		Sizzle( extra, origContext, results, seed );
+		Sizzle.uniqueSort( results );
+	}
+
+	return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+	if ( sortOrder ) {
+		hasDuplicate = baseHasDuplicate;
+		results.sort( sortOrder );
+
+		if ( hasDuplicate ) {
+			for ( var i = 1; i < results.length; i++ ) {
+				if ( results[i] === results[ i - 1 ] ) {
+					results.splice( i--, 1 );
+				}
+			}
+		}
+	}
+
+	return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+	return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+	return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+	var set, i, len, match, type, left;
+
+	if ( !expr ) {
+		return [];
+	}
+
+	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+		type = Expr.order[i];
+
+		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+			left = match[1];
+			match.splice( 1, 1 );
+
+			if ( left.substr( left.length - 1 ) !== "\\" ) {
+				match[1] = (match[1] || "").replace( rBackslash, "" );
+				set = Expr.find[ type ]( match, context, isXML );
+
+				if ( set != null ) {
+					expr = expr.replace( Expr.match[ type ], "" );
+					break;
+				}
+			}
+		}
+	}
+
+	if ( !set ) {
+		set = typeof context.getElementsByTagName !== "undefined" ?
+			context.getElementsByTagName( "*" ) :
+			[];
+	}
+
+	return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+	var match, anyFound,
+		type, found, item, filter, left,
+		i, pass,
+		old = expr,
+		result = [],
+		curLoop = set,
+		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+	while ( expr && set.length ) {
+		for ( type in Expr.filter ) {
+			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+				filter = Expr.filter[ type ];
+				left = match[1];
+
+				anyFound = false;
+
+				match.splice(1,1);
+
+				if ( left.substr( left.length - 1 ) === "\\" ) {
+					continue;
+				}
+
+				if ( curLoop === result ) {
+					result = [];
+				}
+
+				if ( Expr.preFilter[ type ] ) {
+					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+					if ( !match ) {
+						anyFound = found = true;
+
+					} else if ( match === true ) {
+						continue;
+					}
+				}
+
+				if ( match ) {
+					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+						if ( item ) {
+							found = filter( item, match, i, curLoop );
+							pass = not ^ found;
+
+							if ( inplace && found != null ) {
+								if ( pass ) {
+									anyFound = true;
+
+								} else {
+									curLoop[i] = false;
+								}
+
+							} else if ( pass ) {
+								result.push( item );
+								anyFound = true;
+							}
+						}
+					}
+				}
+
+				if ( found !== undefined ) {
+					if ( !inplace ) {
+						curLoop = result;
+					}
+
+					expr = expr.replace( Expr.match[ type ], "" );
+
+					if ( !anyFound ) {
+						return [];
+					}
+
+					break;
+				}
+			}
+		}
+
+		// Improper expression
+		if ( expr === old ) {
+			if ( anyFound == null ) {
+				Sizzle.error( expr );
+
+			} else {
+				break;
+			}
+		}
+
+		old = expr;
+	}
+
+	return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+    var i, node,
+		nodeType = elem.nodeType,
+		ret = "";
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent || innerText for elements
+			if ( typeof elem.textContent === 'string' ) {
+				return elem.textContent;
+			} else if ( typeof elem.innerText === 'string' ) {
+				// Replace IE's carriage returns
+				return elem.innerText.replace( rReturn, '' );
+			} else {
+				// Traverse it's children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( i = 0; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			if ( node.nodeType !== 8 ) {
+				ret += getText( node );
+			}
+		}
+	}
+	return ret;
+};
+
+var Expr = Sizzle.selectors = {
+	order: [ "ID", "NAME", "TAG" ],
+
+	match: {
+		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+	},
+
+	leftMatch: {},
+
+	attrMap: {
+		"class": "className",
+		"for": "htmlFor"
+	},
+
+	attrHandle: {
+		href: function( elem ) {
+			return elem.getAttribute( "href" );
+		},
+		type: function( elem ) {
+			return elem.getAttribute( "type" );
+		}
+	},
+
+	relative: {
+		"+": function(checkSet, part){
+			var isPartStr = typeof part === "string",
+				isTag = isPartStr && !rNonWord.test( part ),
+				isPartStrNotTag = isPartStr && !isTag;
+
+			if ( isTag ) {
+				part = part.toLowerCase();
+			}
+
+			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+				if ( (elem = checkSet[i]) ) {
+					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+						elem || false :
+						elem === part;
+				}
+			}
+
+			if ( isPartStrNotTag ) {
+				Sizzle.filter( part, checkSet, true );
+			}
+		},
+
+		">": function( checkSet, part ) {
+			var elem,
+				isPartStr = typeof part === "string",
+				i = 0,
+				l = checkSet.length;
+
+			if ( isPartStr && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						var parent = elem.parentNode;
+						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+					}
+				}
+
+			} else {
+				for ( ; i < l; i++ ) {
+					elem = checkSet[i];
+
+					if ( elem ) {
+						checkSet[i] = isPartStr ?
+							elem.parentNode :
+							elem.parentNode === part;
+					}
+				}
+
+				if ( isPartStr ) {
+					Sizzle.filter( part, checkSet, true );
+				}
+			}
+		},
+
+		"": function(checkSet, part, isXML){
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+		},
+
+		"~": function( checkSet, part, isXML ) {
+			var nodeCheck,
+				doneName = done++,
+				checkFn = dirCheck;
+
+			if ( typeof part === "string" && !rNonWord.test( part ) ) {
+				part = part.toLowerCase();
+				nodeCheck = part;
+				checkFn = dirNodeCheck;
+			}
+
+			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+		}
+	},
+
+	find: {
+		ID: function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		},
+
+		NAME: function( match, context ) {
+			if ( typeof context.getElementsByName !== "undefined" ) {
+				var ret = [],
+					results = context.getElementsByName( match[1] );
+
+				for ( var i = 0, l = results.length; i < l; i++ ) {
+					if ( results[i].getAttribute("name") === match[1] ) {
+						ret.push( results[i] );
+					}
+				}
+
+				return ret.length === 0 ? null : ret;
+			}
+		},
+
+		TAG: function( match, context ) {
+			if ( typeof context.getElementsByTagName !== "undefined" ) {
+				return context.getElementsByTagName( match[1] );
+			}
+		}
+	},
+	preFilter: {
+		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+			match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+			if ( isXML ) {
+				return match;
+			}
+
+			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+				if ( elem ) {
+					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+						if ( !inplace ) {
+							result.push( elem );
+						}
+
+					} else if ( inplace ) {
+						curLoop[i] = false;
+					}
+				}
+			}
+
+			return false;
+		},
+
+		ID: function( match ) {
+			return match[1].replace( rBackslash, "" );
+		},
+
+		TAG: function( match, curLoop ) {
+			return match[1].replace( rBackslash, "" ).toLowerCase();
+		},
+
+		CHILD: function( match ) {
+			if ( match[1] === "nth" ) {
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				match[2] = match[2].replace(/^\+|\s*/g, '');
+
+				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+				// calculate the numbers (first)n+(last) including if they are negative
+				match[2] = (test[1] + (test[2] || 1)) - 0;
+				match[3] = test[3] - 0;
+			}
+			else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			// TODO: Move to normal caching system
+			match[0] = done++;
+
+			return match;
+		},
+
+		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+			var name = match[1] = match[1].replace( rBackslash, "" );
+
+			if ( !isXML && Expr.attrMap[name] ) {
+				match[1] = Expr.attrMap[name];
+			}
+
+			// Handle if an un-quoted value was used
+			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[4] = " " + match[4] + " ";
+			}
+
+			return match;
+		},
+
+		PSEUDO: function( match, curLoop, inplace, result, not ) {
+			if ( match[1] === "not" ) {
+				// If we're dealing with a complex expression, or a simple one
+				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+					match[3] = Sizzle(match[3], null, null, curLoop);
+
+				} else {
+					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+					if ( !inplace ) {
+						result.push.apply( result, ret );
+					}
+
+					return false;
+				}
+
+			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+				return true;
+			}
+
+			return match;
+		},
+
+		POS: function( match ) {
+			match.unshift( true );
+
+			return match;
+		}
+	},
+
+	filters: {
+		enabled: function( elem ) {
+			return elem.disabled === false && elem.type !== "hidden";
+		},
+
+		disabled: function( elem ) {
+			return elem.disabled === true;
+		},
+
+		checked: function( elem ) {
+			return elem.checked === true;
+		},
+
+		selected: function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		parent: function( elem ) {
+			return !!elem.firstChild;
+		},
+
+		empty: function( elem ) {
+			return !elem.firstChild;
+		},
+
+		has: function( elem, i, match ) {
+			return !!Sizzle( match[3], elem ).length;
+		},
+
+		header: function( elem ) {
+			return (/h\d/i).test( elem.nodeName );
+		},
+
+		text: function( elem ) {
+			var attr = elem.getAttribute( "type" ), type = elem.type;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+		},
+
+		radio: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+		},
+
+		checkbox: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+		},
+
+		file: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+		},
+
+		password: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+		},
+
+		submit: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "submit" === elem.type;
+		},
+
+		image: function( elem ) {
+			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+		},
+
+		reset: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return (name === "input" || name === "button") && "reset" === elem.type;
+		},
+
+		button: function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && "button" === elem.type || name === "button";
+		},
+
+		input: function( elem ) {
+			return (/input|select|textarea|button/i).test( elem.nodeName );
+		},
+
+		focus: function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		}
+	},
+	setFilters: {
+		first: function( elem, i ) {
+			return i === 0;
+		},
+
+		last: function( elem, i, match, array ) {
+			return i === array.length - 1;
+		},
+
+		even: function( elem, i ) {
+			return i % 2 === 0;
+		},
+
+		odd: function( elem, i ) {
+			return i % 2 === 1;
+		},
+
+		lt: function( elem, i, match ) {
+			return i < match[3] - 0;
+		},
+
+		gt: function( elem, i, match ) {
+			return i > match[3] - 0;
+		},
+
+		nth: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		},
+
+		eq: function( elem, i, match ) {
+			return match[3] - 0 === i;
+		}
+	},
+	filter: {
+		PSEUDO: function( elem, match, i, array ) {
+			var name = match[1],
+				filter = Expr.filters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+
+			} else if ( name === "contains" ) {
+				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+			} else if ( name === "not" ) {
+				var not = match[3];
+
+				for ( var j = 0, l = not.length; j < l; j++ ) {
+					if ( not[j] === elem ) {
+						return false;
+					}
+				}
+
+				return true;
+
+			} else {
+				Sizzle.error( name );
+			}
+		},
+
+		CHILD: function( elem, match ) {
+			var first, last,
+				doneName, parent, cache,
+				count, diff,
+				type = match[1],
+				node = elem;
+
+			switch ( type ) {
+				case "only":
+				case "first":
+					while ( (node = node.previousSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					if ( type === "first" ) {
+						return true;
+					}
+
+					node = elem;
+
+					/* falls through */
+				case "last":
+					while ( (node = node.nextSibling) ) {
+						if ( node.nodeType === 1 ) {
+							return false;
+						}
+					}
+
+					return true;
+
+				case "nth":
+					first = match[2];
+					last = match[3];
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					doneName = match[0];
+					parent = elem.parentNode;
+
+					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+						count = 0;
+
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								node.nodeIndex = ++count;
+							}
+						}
+
+						parent[ expando ] = doneName;
+					}
+
+					diff = elem.nodeIndex - last;
+
+					if ( first === 0 ) {
+						return diff === 0;
+
+					} else {
+						return ( diff % first === 0 && diff / first >= 0 );
+					}
+			}
+		},
+
+		ID: function( elem, match ) {
+			return elem.nodeType === 1 && elem.getAttribute("id") === match;
+		},
+
+		TAG: function( elem, match ) {
+			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+		},
+
+		CLASS: function( elem, match ) {
+			return (" " + (elem.className || elem.getAttribute("class")) + " ")
+				.indexOf( match ) > -1;
+		},
+
+		ATTR: function( elem, match ) {
+			var name = match[1],
+				result = Sizzle.attr ?
+					Sizzle.attr( elem, name ) :
+					Expr.attrHandle[ name ] ?
+					Expr.attrHandle[ name ]( elem ) :
+					elem[ name ] != null ?
+						elem[ name ] :
+						elem.getAttribute( name ),
+				value = result + "",
+				type = match[2],
+				check = match[4];
+
+			return result == null ?
+				type === "!=" :
+				!type && Sizzle.attr ?
+				result != null :
+				type === "=" ?
+				value === check :
+				type === "*=" ?
+				value.indexOf(check) >= 0 :
+				type === "~=" ?
+				(" " + value + " ").indexOf(check) >= 0 :
+				!check ?
+				value && result !== false :
+				type === "!=" ?
+				value !== check :
+				type === "^=" ?
+				value.indexOf(check) === 0 :
+				type === "$=" ?
+				value.substr(value.length - check.length) === check :
+				type === "|=" ?
+				value === check || value.substr(0, check.length + 1) === check + "-" :
+				false;
+		},
+
+		POS: function( elem, match, i, array ) {
+			var name = match[2],
+				filter = Expr.setFilters[ name ];
+
+			if ( filter ) {
+				return filter( elem, i, match, array );
+			}
+		}
+	}
+};
+
+var origPOS = Expr.match.POS,
+	fescape = function(all, num){
+		return "\\" + (num - 0 + 1);
+	};
+
+for ( var type in Expr.match ) {
+	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+Expr.match.globalPOS = origPOS;
+
+var makeArray = function( array, results ) {
+	array = Array.prototype.slice.call( array, 0 );
+
+	if ( results ) {
+		results.push.apply( results, array );
+		return results;
+	}
+
+	return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+	makeArray = function( array, results ) {
+		var i = 0,
+			ret = results || [];
+
+		if ( toString.call(array) === "[object Array]" ) {
+			Array.prototype.push.apply( ret, array );
+
+		} else {
+			if ( typeof array.length === "number" ) {
+				for ( var l = array.length; i < l; i++ ) {
+					ret.push( array[i] );
+				}
+
+			} else {
+				for ( ; array[i]; i++ ) {
+					ret.push( array[i] );
+				}
+			}
+		}
+
+		return ret;
+	};
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+	sortOrder = function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+			return a.compareDocumentPosition ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+	};
+
+} else {
+	sortOrder = function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+	siblingCheck = function( a, b, ret ) {
+		if ( a === b ) {
+			return ret;
+		}
+
+		var cur = a.nextSibling;
+
+		while ( cur ) {
+			if ( cur === b ) {
+				return -1;
+			}
+
+			cur = cur.nextSibling;
+		}
+
+		return 1;
+	};
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+	// We're going to inject a fake input element with a specified name
+	var form = document.createElement("div"),
+		id = "script" + (new Date()).getTime(),
+		root = document.documentElement;
+
+	form.innerHTML = "<a name='" + id + "'/>";
+
+	// Inject it into the root element, check its status, and remove it quickly
+	root.insertBefore( form, root.firstChild );
+
+	// The workaround has to do additional checks after a getElementById
+	// Which slows things down for other browsers (hence the branching)
+	if ( document.getElementById( id ) ) {
+		Expr.find.ID = function( match, context, isXML ) {
+			if ( typeof context.getElementById !== "undefined" && !isXML ) {
+				var m = context.getElementById(match[1]);
+
+				return m ?
+					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+
+		Expr.filter.ID = function( elem, match ) {
+			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+			return elem.nodeType === 1 && node && node.nodeValue === match;
+		};
+	}
+
+	root.removeChild( form );
+
+	// release memory in IE
+	root = form = null;
+})();
+
+(function(){
+	// Check to see if the browser returns only elements
+	// when doing getElementsByTagName("*")
+
+	// Create a fake element
+	var div = document.createElement("div");
+	div.appendChild( document.createComment("") );
+
+	// Make sure no comments are found
+	if ( div.getElementsByTagName("*").length > 0 ) {
+		Expr.find.TAG = function( match, context ) {
+			var results = context.getElementsByTagName( match[1] );
+
+			// Filter out possible comments
+			if ( match[1] === "*" ) {
+				var tmp = [];
+
+				for ( var i = 0; results[i]; i++ ) {
+					if ( results[i].nodeType === 1 ) {
+						tmp.push( results[i] );
+					}
+				}
+
+				results = tmp;
+			}
+
+			return results;
+		};
+	}
+
+	// Check to see if an attribute returns normalized href attributes
+	div.innerHTML = "<a href='#'></a>";
+
+	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+			div.firstChild.getAttribute("href") !== "#" ) {
+
+		Expr.attrHandle.href = function( elem ) {
+			return elem.getAttribute( "href", 2 );
+		};
+	}
+
+	// release memory in IE
+	div = null;
+})();
+
+if ( document.querySelectorAll ) {
+	(function(){
+		var oldSizzle = Sizzle,
+			div = document.createElement("div"),
+			id = "__sizzle__";
+
+		div.innerHTML = "<p class='TEST'></p>";
+
+		// Safari can't handle uppercase or unicode characters when
+		// in quirks mode.
+		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+			return;
+		}
+
+		Sizzle = function( query, context, extra, seed ) {
+			context = context || document;
+
+			// Only use querySelectorAll on non-XML documents
+			// (ID selectors don't work in non-HTML documents)
+			if ( !seed && !Sizzle.isXML(context) ) {
+				// See if we find a selector to speed up
+				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+					// Speed-up: Sizzle("TAG")
+					if ( match[1] ) {
+						return makeArray( context.getElementsByTagName( query ), extra );
+
+					// Speed-up: Sizzle(".CLASS")
+					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+						return makeArray( context.getElementsByClassName( match[2] ), extra );
+					}
+				}
+
+				if ( context.nodeType === 9 ) {
+					// Speed-up: Sizzle("body")
+					// The body element only exists once, optimize finding it
+					if ( query === "body" && context.body ) {
+						return makeArray( [ context.body ], extra );
+
+					// Speed-up: Sizzle("#ID")
+					} else if ( match && match[3] ) {
+						var elem = context.getElementById( match[3] );
+
+						// Check parentNode to catch when Blackberry 4.6 returns
+						// nodes that are no longer in the document #6963
+						if ( elem && elem.parentNode ) {
+							// Handle the case where IE and Opera return items
+							// by name instead of ID
+							if ( elem.id === match[3] ) {
+								return makeArray( [ elem ], extra );
+							}
+
+						} else {
+							return makeArray( [], extra );
+						}
+					}
+
+					try {
+						return makeArray( context.querySelectorAll(query), extra );
+					} catch(qsaError) {}
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					var oldContext = context,
+						old = context.getAttribute( "id" ),
+						nid = old || id,
+						hasParent = context.parentNode,
+						relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+					if ( !old ) {
+						context.setAttribute( "id", nid );
+					} else {
+						nid = nid.replace( /'/g, "\\$&" );
+					}
+					if ( relativeHierarchySelector && hasParent ) {
+						context = context.parentNode;
+					}
+
+					try {
+						if ( !relativeHierarchySelector || hasParent ) {
+							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+						}
+
+					} catch(pseudoError) {
+					} finally {
+						if ( !old ) {
+							oldContext.removeAttribute( "id" );
+						}
+					}
+				}
+			}
+
+			return oldSizzle(query, context, extra, seed);
+		};
+
+		for ( var prop in oldSizzle ) {
+			Sizzle[ prop ] = oldSizzle[ prop ];
+		}
+
+		// release memory in IE
+		div = null;
+	})();
+}
+
+(function(){
+	var html = document.documentElement,
+		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+	if ( matches ) {
+		// Check to see if it's possible to do matchesSelector
+		// on a disconnected node (IE 9 fails this)
+		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+			pseudoWorks = false;
+
+		try {
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( document.documentElement, "[test!='']:sizzle" );
+
+		} catch( pseudoError ) {
+			pseudoWorks = true;
+		}
+
+		Sizzle.matchesSelector = function( node, expr ) {
+			// Make sure that attribute selectors are quoted
+			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+			if ( !Sizzle.isXML( node ) ) {
+				try {
+					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+						var ret = matches.call( node, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || !disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9, so check for that
+								node.document && node.document.nodeType !== 11 ) {
+							return ret;
+						}
+					}
+				} catch(e) {}
+			}
+
+			return Sizzle(expr, null, null, [node]).length > 0;
+		};
+	}
+})();
+
+(function(){
+	var div = document.createElement("div");
+
+	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+	// Opera can't find a second classname (in 9.6)
+	// Also, make sure that getElementsByClassName actually exists
+	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+		return;
+	}
+
+	// Safari caches class attributes, doesn't catch changes (in 3.2)
+	div.lastChild.className = "e";
+
+	if ( div.getElementsByClassName("e").length === 1 ) {
+		return;
+	}
+
+	Expr.order.splice(1, 0, "CLASS");
+	Expr.find.CLASS = function( match, context, isXML ) {
+		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+			return context.getElementsByClassName(match[1]);
+		}
+	};
+
+	// release memory in IE
+	div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 && !isXML ){
+					elem[ expando ] = doneName;
+					elem.sizset = i;
+				}
+
+				if ( elem.nodeName.toLowerCase() === cur ) {
+					match = elem;
+					break;
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+		var elem = checkSet[i];
+
+		if ( elem ) {
+			var match = false;
+
+			elem = elem[dir];
+
+			while ( elem ) {
+				if ( elem[ expando ] === doneName ) {
+					match = checkSet[elem.sizset];
+					break;
+				}
+
+				if ( elem.nodeType === 1 ) {
+					if ( !isXML ) {
+						elem[ expando ] = doneName;
+						elem.sizset = i;
+					}
+
+					if ( typeof cur !== "string" ) {
+						if ( elem === cur ) {
+							match = true;
+							break;
+						}
+
+					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+						match = elem;
+						break;
+					}
+				}
+
+				elem = elem[dir];
+			}
+
+			checkSet[i] = match;
+		}
+	}
+}
+
+if ( document.documentElement.contains ) {
+	Sizzle.contains = function( a, b ) {
+		return a !== b && (a.contains ? a.contains(b) : true);
+	};
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+	Sizzle.contains = function( a, b ) {
+		return !!(a.compareDocumentPosition(b) & 16);
+	};
+
+} else {
+	Sizzle.contains = function() {
+		return false;
+	};
+}
+
+Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+	var match,
+		tmpSet = [],
+		later = "",
+		root = context.nodeType ? [context] : context;
+
+	// Position selectors must be done after the filter
+	// And so must :not(positional) so we move all PSEUDOs to the end
+	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+		later += match[0];
+		selector = selector.replace( Expr.match.PSEUDO, "" );
+	}
+
+	selector = Expr.relative[selector] ? selector + "*" : selector;
+
+	for ( var i = 0, l = root.length; i < l; i++ ) {
+		Sizzle( selector, root[i], tmpSet, seed );
+	}
+
+	return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+	// Note: This RegExp should be improved, or likely pulled from Sizzle
+	rmultiselector = /,/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	slice = Array.prototype.slice,
+	POS = jQuery.expr.match.globalPOS,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var self = this,
+			i, l;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		var ret = this.pushStack( "", "find", selector ),
+			length, n, r;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var targets = jQuery( target );
+		return this.filter(function() {
+			for ( var i = 0, l = targets.length; i < l; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				POS.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var ret = [], i, l, cur = this[0];
+
+		// Array (deprecated as of jQuery 1.7)
+		if ( jQuery.isArray( selectors ) ) {
+			var level = 1;
+
+			while ( cur && cur.ownerDocument && cur !== context ) {
+				for ( i = 0; i < selectors.length; i++ ) {
+
+					if ( jQuery( cur ).is( selectors[ i ] ) ) {
+						ret.push({ selector: selectors[ i ], elem: cur, level: level });
+					}
+				}
+
+				cur = cur.parentNode;
+				level++;
+			}
+
+			return ret;
+		}
+
+		// String
+		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+
+				} else {
+					cur = cur.parentNode;
+					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+						break;
+					}
+				}
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	andSelf: function() {
+		return this.add( this.prevObject );
+	}
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return jQuery.nth( elem, 2, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return jQuery.nth( elem, 2, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.makeArray( elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	nth: function( cur, result, dir, elem ) {
+		result = result || 1;
+		var num = 0;
+
+		for ( ; cur; cur = cur[dir] ) {
+			if ( cur.nodeType === 1 && ++num === result ) {
+				break;
+			}
+		}
+
+		return cur;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+
+
+
+
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		} else if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			set.push.apply( set, this.toArray() );
+			return this.pushStack( set, "before", arguments );
+		}
+	},
+
+	after: function() {
+		if ( this[0] && this[0].parentNode ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		} else if ( arguments.length ) {
+			var set = this.pushStack( this, "after", arguments );
+			set.push.apply( set, jQuery.clean(arguments) );
+			return set;
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					null;
+			}
+
+
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( this[0] && this[0].parentNode ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		} else {
+			return this.length ?
+				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+				this;
+		}
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+		var results, first, fragment, parent,
+			value = args[0],
+			scripts = [];
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback, true );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call(this, i, table ? self.html() : undefined);
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			parent = value && value.parentNode;
+
+			// If we're in a fragment, just use that instead of building a new one
+			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+				results = { fragment: parent };
+
+			} else {
+				results = jQuery.buildFragment( args, this, scripts );
+			}
+
+			fragment = results.fragment;
+
+			if ( fragment.childNodes.length === 1 ) {
+				first = fragment = fragment.firstChild;
+			} else {
+				first = fragment.firstChild;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+					callback.call(
+						table ?
+							root(this[i], first) :
+							this[i],
+						// Make sure that we do not leak memory by inadvertently discarding
+						// the original fragment (which might have attached data) instead of
+						// using it; in addition, use the original fragment object for the last
+						// item instead of first because it can end up being emptied incorrectly
+						// in certain situations (Bug #8070).
+						// Fragments from the fragment cache must always be cloned and never used
+						// in place.
+						results.cacheable || ( l > 1 && i < lastIndex ) ?
+							jQuery.clone( fragment, true, true ) :
+							fragment
+					);
+				}
+			}
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						jQuery.ajax({
+							type: "GET",
+							global: false,
+							url: elem.src,
+							async: false,
+							dataType: "script"
+						});
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function root( elem, cur ) {
+	return jQuery.nodeName(elem, "table") ?
+		(elem.getElementsByTagName("tbody")[0] ||
+		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+		elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 fail to clone children inside object elements that use
+	// the proprietary classid attribute value (rather than the type
+	// attribute) to identify the type of content to display
+	if ( nodeName === "object" ) {
+		dest.outerHTML = src.outerHTML;
+
+	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+		if ( src.checked ) {
+			dest.defaultChecked = dest.checked = src.checked;
+		}
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+
+	// Clear flags for bubbling special change/submit events, they must
+	// be reattached when the newly cloned events are first activated
+	dest.removeAttribute( "_submit_attached" );
+	dest.removeAttribute( "_change_attached" );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+	var fragment, cacheable, cacheresults, doc,
+	first = args[ 0 ];
+
+	// nodes may contain either an explicit document object,
+	// a jQuery collection or context object.
+	// If nodes[0] contains a valid object to assign to doc
+	if ( nodes && nodes[0] ) {
+		doc = nodes[0].ownerDocument || nodes[0];
+	}
+
+	// Ensure that an attr object doesn't incorrectly stand in as a document object
+	// Chrome and Firefox seem to allow this to occur and will throw exception
+	// Fixes #8950
+	if ( !doc.createDocumentFragment ) {
+		doc = document;
+	}
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		cacheable = true;
+
+		cacheresults = jQuery.fragments[ first ];
+		if ( cacheresults && cacheresults !== 1 ) {
+			fragment = cacheresults;
+		}
+	}
+
+	if ( !fragment ) {
+		fragment = doc.createDocumentFragment();
+		jQuery.clean( args, doc, fragment, scripts );
+	}
+
+	if ( cacheable ) {
+		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var ret = [],
+			insert = jQuery( selector ),
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+
+		} else {
+			for ( var i = 0, l = insert.length; i < l; i++ ) {
+				var elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( elem.type === "checkbox" || elem.type === "radio" ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+	var nodeName = ( elem.nodeName || "" ).toLowerCase();
+	if ( nodeName === "input" ) {
+		fixDefaultChecked( elem );
+	// Skip scripts, get other children
+	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+	}
+}
+
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+	var div = document.createElement( "div" );
+	safeFragment.appendChild( div );
+
+	div.innerHTML = elem.outerHTML;
+	return div.firstChild;
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			// IE<=8 does not properly clone detached, unknown element nodes
+			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+				elem.cloneNode( true ) :
+				shimCloneNode( elem );
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var checkScriptType, script, j,
+				ret = [];
+
+		context = context || document;
+
+		// !context.createElement fails in IE with an error but returns typeof 'object'
+		if ( typeof context.createElement === "undefined" ) {
+			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+		}
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Trim whitespace, otherwise indexOf won't work as expected
+					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+						wrap = wrapMap[ tag ] || wrapMap._default,
+						depth = wrap[0],
+						div = context.createElement("div"),
+						safeChildNodes = safeFragment.childNodes,
+						remove;
+
+					// Append wrapper element to unknown element safe doc fragment
+					if ( context === document ) {
+						// Use the fragment we've already created for this document
+						safeFragment.appendChild( div );
+					} else {
+						// Use a fragment created with the owner document
+						createSafeFragment( context ).appendChild( div );
+					}
+
+					// Go to html and back, then peel off extra wrappers
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						var hasBody = rtbody.test(elem),
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Clear elements from DocumentFragment (safeFragment or otherwise)
+					// to avoid hoarding elements. Fixes #11356
+					if ( div ) {
+						div.parentNode.removeChild( div );
+
+						// Guard against -1 index exceptions in FF3.6
+						if ( safeChildNodes.length > 0 ) {
+							remove = safeChildNodes[ safeChildNodes.length - 1 ];
+
+							if ( remove && remove.parentNode ) {
+								remove.parentNode.removeChild( remove );
+							}
+						}
+					}
+				}
+			}
+
+			// Resets defaultChecked for any radios and checkboxes
+			// about to be appended to the DOM in IE 6/7 (#8060)
+			var len;
+			if ( !jQuery.support.appendChecked ) {
+				if ( elem[0] && typeof (len = elem.length) === "number" ) {
+					for ( j = 0; j < len; j++ ) {
+						findInputs( elem[j] );
+					}
+				} else {
+					findInputs( elem );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				ret = jQuery.merge( ret, elem );
+			}
+		}
+
+		if ( fragment ) {
+			checkScriptType = function( elem ) {
+				return !elem.type || rscriptType.test( elem.type );
+			};
+			for ( i = 0; ret[i]; i++ ) {
+				script = ret[i];
+				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+
+				} else {
+					if ( script.nodeType === 1 ) {
+						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+					}
+					fragment.appendChild( script );
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems ) {
+		var data, id,
+			cache = jQuery.cache,
+			special = jQuery.event.special,
+			deleteExpando = jQuery.support.deleteExpando;
+
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+				continue;
+			}
+
+			id = elem[ jQuery.expando ];
+
+			if ( id ) {
+				data = cache[ id ];
+
+				if ( data && data.events ) {
+					for ( var type in data.events ) {
+						if ( special[ type ] ) {
+							jQuery.event.remove( elem, type );
+
+						// This is a shortcut to avoid jQuery.event.remove's overhead
+						} else {
+							jQuery.removeEvent( elem, type, data.handle );
+						}
+					}
+
+					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
+					if ( data.handle ) {
+						data.handle.elem = null;
+					}
+				}
+
+				if ( deleteExpando ) {
+					delete elem[ jQuery.expando ];
+
+				} else if ( elem.removeAttribute ) {
+					elem.removeAttribute( jQuery.expando );
+				}
+
+				delete cache[ id ];
+			}
+		}
+	}
+});
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	// fixed for IE9, see #8346
+	rupper = /([A-Z]|^ms)/g,
+	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
+	rrelNum = /^([\-+])=([\-+.\de]+)/,
+	rmargin = /^margin/,
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+
+	// order is important!
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+
+	curCSS,
+
+	getComputedStyle,
+	currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+	return jQuery.access( this, function( elem, name, value ) {
+		return value !== undefined ?
+			jQuery.style( elem, name, value ) :
+			jQuery.css( elem, name );
+	}, name, value, arguments.length > 1 );
+};
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				} else {
+					return elem.style.opacity;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, origName = jQuery.camelCase( name ),
+			style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+		name = jQuery.cssProps[ origName ] || origName;
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra ) {
+		var ret, hooks;
+
+		// Make sure that we're working with the right name
+		name = jQuery.camelCase( name );
+		hooks = jQuery.cssHooks[ name ];
+		name = jQuery.cssProps[ name ] || name;
+
+		// cssFloat needs a special treatment
+		if ( name === "cssFloat" ) {
+			name = "float";
+		}
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+			return ret;
+
+		// Otherwise, if a way to get the computed value exists, use that
+		} else if ( curCSS ) {
+			return curCSS( elem, name );
+		}
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var old = {},
+			ret, name;
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// DEPRECATED in 1.3, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+	getComputedStyle = function( elem, name ) {
+		var ret, defaultView, computedStyle, width,
+			style = elem.style;
+
+		name = name.replace( rupper, "-$1" ).toLowerCase();
+
+		if ( (defaultView = elem.ownerDocument.defaultView) &&
+				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+
+			ret = computedStyle.getPropertyValue( name );
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+		}
+
+		// A tribute to the "awesome hack by Dean Edwards"
+		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+			width = style.width;
+			style.width = ret;
+			ret = computedStyle.width;
+			style.width = width;
+		}
+
+		return ret;
+	};
+}
+
+if ( document.documentElement.currentStyle ) {
+	currentStyle = function( elem, name ) {
+		var left, rsLeft, uncomputed,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && (uncomputed = style[ name ]) ) {
+			ret = uncomputed;
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		if ( rnumnonpx.test( ret ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		i = name === "width" ? 1 : 0,
+		len = 4;
+
+	if ( val > 0 ) {
+		if ( extra !== "border" ) {
+			for ( ; i < len; i += 2 ) {
+				if ( !extra ) {
+					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+				}
+				if ( extra === "margin" ) {
+					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
+				} else {
+					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+				}
+			}
+		}
+
+		return val + "px";
+	}
+
+	// Fall back to computed then uncomputed css if necessary
+	val = curCSS( elem, name );
+	if ( val < 0 || val == null ) {
+		val = elem.style[ name ];
+	}
+
+	// Computed unit is not pixels. Stop here and return.
+	if ( rnumnonpx.test(val) ) {
+		return val;
+	}
+
+	// Normalize "", auto, and prepare for extra
+	val = parseFloat( val ) || 0;
+
+	// Add padding, border, margin
+	if ( extra ) {
+		for ( ; i < len; i += 2 ) {
+			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			if ( extra !== "padding" ) {
+				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+			if ( extra === "margin" ) {
+				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
+			}
+		}
+	}
+
+	return val + "px";
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				if ( elem.offsetWidth !== 0 ) {
+					return getWidthOrHeight( elem, name, extra );
+				} else {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				}
+			}
+		},
+
+		set: function( elem, value ) {
+			return rnum.test( value ) ?
+				value + "px" :
+				value;
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( parseFloat( RegExp.$1 ) / 100 ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+jQuery(function() {
+	// This hook cannot be added until DOM ready because the support test
+	// for it is not run until after DOM ready
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "margin-right" );
+					} else {
+						return elem.style.marginRight;
+					}
+				});
+			}
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		var width = elem.offsetWidth,
+			height = elem.offsetHeight;
+
+		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+});
+
+
+
+
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rselectTextarea = /^(?:select|textarea)/i,
+	rspacesAjax = /\s+/,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Document location
+	ajaxLocation,
+
+	// Document location segments
+	ajaxLocParts,
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		if ( jQuery.isFunction( func ) ) {
+			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+				i = 0,
+				length = dataTypes.length,
+				dataType,
+				list,
+				placeBefore;
+
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters ),
+		selection;
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.extend({
+	load: function( url, params, callback ) {
+		if ( typeof url !== "string" && _load ) {
+			return _load.apply( this, arguments );
+
+		// Don't do a request if no elements are being requested
+		} else if ( !this.length ) {
+			return this;
+		}
+
+		var off = url.indexOf( " " );
+		if ( off >= 0 ) {
+			var selector = url.slice( off, url.length );
+			url = url.slice( 0, off );
+		}
+
+		// Default to a GET request
+		var type = "GET";
+
+		// If the second parameter was provided
+		if ( params ) {
+			// If it's a function
+			if ( jQuery.isFunction( params ) ) {
+				// We assume that it's the callback
+				callback = params;
+				params = undefined;
+
+			// Otherwise, build a param string
+			} else if ( typeof params === "object" ) {
+				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+				type = "POST";
+			}
+		}
+
+		var self = this;
+
+		// Request the remote document
+		jQuery.ajax({
+			url: url,
+			type: type,
+			dataType: "html",
+			data: params,
+			// Complete callback (responseText is used internally)
+			complete: function( jqXHR, status, responseText ) {
+				// Store the response as specified by the jqXHR object
+				responseText = jqXHR.responseText;
+				// If successful, inject the HTML into all the matched elements
+				if ( jqXHR.isResolved() ) {
+					// #4825: Get the actual response in case
+					// a dataFilter is present in ajaxSettings
+					jqXHR.done(function( r ) {
+						responseText = r;
+					});
+					// See if a selector was specified
+					self.html( selector ?
+						// Create a dummy div to hold the results
+						jQuery("<div>")
+							// inject the contents of the document in, removing the scripts
+							// to avoid any 'Permission Denied' errors in IE
+							.append(responseText.replace(rscript, ""))
+
+							// Locate the specified elements
+							.find(selector) :
+
+						// If not, just inject the full result
+						responseText );
+				}
+
+				if ( callback ) {
+					self.each( callback, [ responseText, status, jqXHR ] );
+				}
+			}
+		});
+
+		return this;
+	},
+
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// ifModified key
+			ifModifiedKey,
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// The jqXHR state
+			state = 0,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || "abort";
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			var isSuccess,
+				success,
+				error,
+				statusText = nativeStatusText,
+				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+				lastModified,
+				etag;
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+						jQuery.lastModified[ ifModifiedKey ] = lastModified;
+					}
+					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+						jQuery.etag[ ifModifiedKey ] = etag;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					try {
+						success = ajaxConvert( s, response );
+						statusText = "success";
+						isSuccess = true;
+					} catch(e) {
+						// We have a parsererror
+						statusText = "parsererror";
+						error = e;
+					}
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.then( tmp, tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+		// Determine if a cross-domain request is in order
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return false;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already
+				jqXHR.abort();
+				return false;
+
+		}
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Serialize an array of form elements or a set of
+	// key/values into a query string
+	param: function( a, traditional ) {
+		var s = [],
+			add = function( key, value ) {
+				// If value is a function, invoke it and return its value
+				value = jQuery.isFunction( value ) ? value() : value;
+				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+			};
+
+		// Set traditional to true for jQuery <= 1.3.2 behavior.
+		if ( traditional === undefined ) {
+			traditional = jQuery.ajaxSettings.traditional;
+		}
+
+		// If an array was passed in, assume that it is an array of form elements.
+		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+			// Serialize the form elements
+			jQuery.each( a, function() {
+				add( this.name, this.value );
+			});
+
+		} else {
+			// If traditional, encode the "old" way (the way 1.3.2 or older
+			// did it), otherwise encode params recursively.
+			for ( var prefix in a ) {
+				buildParams( prefix, a[ prefix ], traditional, add );
+			}
+		}
+
+		// Return the resulting serialization
+		return s.join( "&" ).replace( r20, "+" );
+	}
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( var name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields,
+		ct,
+		type,
+		finalDataType,
+		firstDataType;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	var dataTypes = s.dataTypes,
+		converters = {},
+		i,
+		key,
+		length = dataTypes.length,
+		tmp,
+		// Current and previous dataTypes
+		current = dataTypes[ 0 ],
+		prev,
+		// Conversion expression
+		conversion,
+		// Conversion function
+		conv,
+		// Conversion functions (transitive conversion)
+		conv1,
+		conv2;
+
+	// For each dataType in the chain
+	for ( i = 1; i < length; i++ ) {
+
+		// Create converters map
+		// with lowercased keys
+		if ( i === 1 ) {
+			for ( key in s.converters ) {
+				if ( typeof key === "string" ) {
+					converters[ key.toLowerCase() ] = s.converters[ key ];
+				}
+			}
+		}
+
+		// Get the dataTypes
+		prev = current;
+		current = dataTypes[ i ];
+
+		// If current is auto dataType, update it to prev
+		if ( current === "*" ) {
+			current = prev;
+		// If no auto and dataTypes are actually different
+		} else if ( prev !== "*" && prev !== current ) {
+
+			// Get the converter
+			conversion = prev + " " + current;
+			conv = converters[ conversion ] || converters[ "* " + current ];
+
+			// If there is no direct converter, search transitively
+			if ( !conv ) {
+				conv2 = undefined;
+				for ( conv1 in converters ) {
+					tmp = conv1.split( " " );
+					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+						conv2 = converters[ tmp[1] + " " + current ];
+						if ( conv2 ) {
+							conv1 = converters[ conv1 ];
+							if ( conv1 === true ) {
+								conv = conv2;
+							} else if ( conv2 === true ) {
+								conv = conv1;
+							}
+							break;
+						}
+					}
+				}
+			}
+			// If we found no converter, dispatch an error
+			if ( !( conv || conv2 ) ) {
+				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+			}
+			// If found converter is not an equivalence
+			if ( conv !== true ) {
+				// Convert with 1 or 2 converters accordingly
+				response = conv ? conv( response ) : conv2( conv1(response) );
+			}
+		}
+	}
+	return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+	jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		return jQuery.expando + "_" + ( jsc++ );
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
+
+	if ( s.dataTypes[ 0 ] === "jsonp" ||
+		s.jsonp !== false && ( jsre.test( s.url ) ||
+				inspectData && jsre.test( s.data ) ) ) {
+
+		var responseContainer,
+			jsonpCallback = s.jsonpCallback =
+				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+			previous = window[ jsonpCallback ],
+			url = s.url,
+			data = s.data,
+			replace = "$1" + jsonpCallback + "$2";
+
+		if ( s.jsonp !== false ) {
+			url = url.replace( jsre, replace );
+			if ( s.url === url ) {
+				if ( inspectData ) {
+					data = data.replace( jsre, replace );
+				}
+				if ( s.data === data ) {
+					// Add callback manually
+					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+				}
+			}
+		}
+
+		s.url = url;
+		s.data = data;
+
+		// Install callback
+		window[ jsonpCallback ] = function( response ) {
+			responseContainer = [ response ];
+		};
+
+		// Clean-up function
+		jqXHR.always(function() {
+			// Set callback back to previous value
+			window[ jsonpCallback ] = previous;
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( previous ) ) {
+				window[ jsonpCallback ]( responseContainer[ 0 ] );
+			}
+		});
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( jsonpCallback + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Delegate to script
+		return "script";
+	}
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0,
+	xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var xhr = s.xhr(),
+						handle,
+						i;
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occured
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( _ ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					// if we're in sync mode or it's in cache
+					// and has been retrieved directly (IE6 & IE7)
+					// we need to manually fire the callback
+					if ( !s.async || xhr.readyState === 4 ) {
+						callback();
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+
+
+
+
+var elemdisplay = {},
+	iframe, iframeDoc,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+	timerId,
+	fxAttrs = [
+		// height animations
+		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+		// width animations
+		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+		// opacity animations
+		[ "opacity" ]
+	],
+	fxNow;
+
+jQuery.fn.extend({
+	show: function( speed, easing, callback ) {
+		var elem, display;
+
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("show", 3), speed, easing, callback );
+
+		} else {
+			for ( var i = 0, j = this.length; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					// Reset the inline display of this element to learn if it is
+					// being hidden by cascaded rules or not
+					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+						display = elem.style.display = "";
+					}
+
+					// Set elements which have been overridden with display: none
+					// in a stylesheet to whatever the default browser style is
+					// for such an element
+					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+					}
+				}
+			}
+
+			// Set the display of most of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.style ) {
+					display = elem.style.display;
+
+					if ( display === "" || display === "none" ) {
+						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+					}
+				}
+			}
+
+			return this;
+		}
+	},
+
+	hide: function( speed, easing, callback ) {
+		if ( speed || speed === 0 ) {
+			return this.animate( genFx("hide", 3), speed, easing, callback);
+
+		} else {
+			var elem, display,
+				i = 0,
+				j = this.length;
+
+			for ( ; i < j; i++ ) {
+				elem = this[i];
+				if ( elem.style ) {
+					display = jQuery.css( elem, "display" );
+
+					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+						jQuery._data( elem, "olddisplay", display );
+					}
+				}
+			}
+
+			// Set the display of the elements in a second loop
+			// to avoid the constant reflow
+			for ( i = 0; i < j; i++ ) {
+				if ( this[i].style ) {
+					this[i].style.display = "none";
+				}
+			}
+
+			return this;
+		}
+	},
+
+	// Save the old toggle function
+	_toggle: jQuery.fn.toggle,
+
+	toggle: function( fn, fn2, callback ) {
+		var bool = typeof fn === "boolean";
+
+		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+			this._toggle.apply( this, arguments );
+
+		} else if ( fn == null || bool ) {
+			this.each(function() {
+				var state = bool ? fn : jQuery(this).is(":hidden");
+				jQuery(this)[ state ? "show" : "hide" ]();
+			});
+
+		} else {
+			this.animate(genFx("toggle", 3), fn, fn2, callback);
+		}
+
+		return this;
+	},
+
+	fadeTo: function( speed, to, easing, callback ) {
+		return this.filter(":hidden").css("opacity", 0).show().end()
+					.animate({opacity: to}, speed, easing, callback);
+	},
+
+	animate: function( prop, speed, easing, callback ) {
+		var optall = jQuery.speed( speed, easing, callback );
+
+		if ( jQuery.isEmptyObject( prop ) ) {
+			return this.each( optall.complete, [ false ] );
+		}
+
+		// Do not change referenced properties as per-property easing will be lost
+		prop = jQuery.extend( {}, prop );
+
+		function doAnimation() {
+			// XXX 'this' does not always have a nodeName when running the
+			// test suite
+
+			if ( optall.queue === false ) {
+				jQuery._mark( this );
+			}
+
+			var opt = jQuery.extend( {}, optall ),
+				isElement = this.nodeType === 1,
+				hidden = isElement && jQuery(this).is(":hidden"),
+				name, val, p, e, hooks, replace,
+				parts, start, end, unit,
+				method;
+
+			// will store per property easing and be used to determine when an animation is complete
+			opt.animatedProperties = {};
+
+			// first pass over propertys to expand / normalize
+			for ( p in prop ) {
+				name = jQuery.camelCase( p );
+				if ( p !== name ) {
+					prop[ name ] = prop[ p ];
+					delete prop[ p ];
+				}
+
+				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+					replace = hooks.expand( prop[ name ] );
+					delete prop[ name ];
+
+					// not quite $.extend, this wont overwrite keys already present.
+					// also - reusing 'p' from above because we have the correct "name"
+					for ( p in replace ) {
+						if ( ! ( p in prop ) ) {
+							prop[ p ] = replace[ p ];
+						}
+					}
+				}
+			}
+
+			for ( name in prop ) {
+				val = prop[ name ];
+				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+				if ( jQuery.isArray( val ) ) {
+					opt.animatedProperties[ name ] = val[ 1 ];
+					val = prop[ name ] = val[ 0 ];
+				} else {
+					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+				}
+
+				if ( val === "hide" && hidden || val === "show" && !hidden ) {
+					return opt.complete.call( this );
+				}
+
+				if ( isElement && ( name === "height" || name === "width" ) ) {
+					// Make sure that nothing sneaks out
+					// Record all 3 overflow attributes because IE does not
+					// change the overflow attribute when overflowX and
+					// overflowY are set to the same value
+					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+					// Set display property to inline-block for height/width
+					// animations on inline elements that are having width/height animated
+					if ( jQuery.css( this, "display" ) === "inline" &&
+							jQuery.css( this, "float" ) === "none" ) {
+
+						// inline-level elements accept inline-block;
+						// block-level elements need to be inline with layout
+						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+							this.style.display = "inline-block";
+
+						} else {
+							this.style.zoom = 1;
+						}
+					}
+				}
+			}
+
+			if ( opt.overflow != null ) {
+				this.style.overflow = "hidden";
+			}
+
+			for ( p in prop ) {
+				e = new jQuery.fx( this, opt, p );
+				val = prop[ p ];
+
+				if ( rfxtypes.test( val ) ) {
+
+					// Tracks whether to show or hide based on private
+					// data attached to the element
+					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+					if ( method ) {
+						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+						e[ method ]();
+					} else {
+						e[ val ]();
+					}
+
+				} else {
+					parts = rfxnum.exec( val );
+					start = e.cur();
+
+					if ( parts ) {
+						end = parseFloat( parts[2] );
+						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+						// We need to compute starting value
+						if ( unit !== "px" ) {
+							jQuery.style( this, p, (end || 1) + unit);
+							start = ( (end || 1) / e.cur() ) * start;
+							jQuery.style( this, p, start + unit);
+						}
+
+						// If a +=/-= token was provided, we're doing a relative animation
+						if ( parts[1] ) {
+							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+						}
+
+						e.custom( start, end, unit );
+
+					} else {
+						e.custom( start, val, "" );
+					}
+				}
+			}
+
+			// For JS strict compliance
+			return true;
+		}
+
+		return optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+
+	stop: function( type, clearQueue, gotoEnd ) {
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var index,
+				hadTimers = false,
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			// clear marker counters if we know they won't be
+			if ( !gotoEnd ) {
+				jQuery._unmark( true, this );
+			}
+
+			function stopQueue( elem, data, index ) {
+				var hooks = data[ index ];
+				jQuery.removeData( elem, index, true );
+				hooks.stop( gotoEnd );
+			}
+
+			if ( type == null ) {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+						stopQueue( this, data, index );
+					}
+				}
+			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+				stopQueue( this, data, index );
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					if ( gotoEnd ) {
+
+						// force the next step to be the last
+						timers[ index ]( true );
+					} else {
+						timers[ index ].saveState();
+					}
+					hadTimers = true;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( !( gotoEnd && hadTimers ) ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout( clearFxNow, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+	fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+	var obj = {};
+
+	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+		obj[ this ] = type;
+	});
+
+	return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx( "show", 1 ),
+	slideUp: genFx( "hide", 1 ),
+	slideToggle: genFx( "toggle", 1 ),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.extend({
+	speed: function( speed, easing, fn ) {
+		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+			complete: fn || !fn && easing ||
+				jQuery.isFunction( speed ) && speed,
+			duration: speed,
+			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+		};
+
+		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+		// normalize opt.queue - true/undefined/null -> "fx"
+		if ( opt.queue == null || opt.queue === true ) {
+			opt.queue = "fx";
+		}
+
+		// Queueing
+		opt.old = opt.complete;
+
+		opt.complete = function( noUnmark ) {
+			if ( jQuery.isFunction( opt.old ) ) {
+				opt.old.call( this );
+			}
+
+			if ( opt.queue ) {
+				jQuery.dequeue( this, opt.queue );
+			} else if ( noUnmark !== false ) {
+				jQuery._unmark( this );
+			}
+		};
+
+		return opt;
+	},
+
+	easing: {
+		linear: function( p ) {
+			return p;
+		},
+		swing: function( p ) {
+			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
+		}
+	},
+
+	timers: [],
+
+	fx: function( elem, options, prop ) {
+		this.options = options;
+		this.elem = elem;
+		this.prop = prop;
+
+		options.orig = options.orig || {};
+	}
+
+});
+
+jQuery.fx.prototype = {
+	// Simple function for setting a style value
+	update: function() {
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+	},
+
+	// Get the current size
+	cur: function() {
+		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+			return this.elem[ this.prop ];
+		}
+
+		var parsed,
+			r = jQuery.css( this.elem, this.prop );
+		// Empty strings, null, undefined and "auto" are converted to 0,
+		// complex values such as "rotate(1rad)" are returned as is,
+		// simple values such as "10px" are parsed to Float.
+		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+	},
+
+	// Start an animation from one number to another
+	custom: function( from, to, unit ) {
+		var self = this,
+			fx = jQuery.fx;
+
+		this.startTime = fxNow || createFxNow();
+		this.end = to;
+		this.now = this.start = from;
+		this.pos = this.state = 0;
+		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+		function t( gotoEnd ) {
+			return self.step( gotoEnd );
+		}
+
+		t.queue = this.options.queue;
+		t.elem = this.elem;
+		t.saveState = function() {
+			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+				if ( self.options.hide ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+				} else if ( self.options.show ) {
+					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+				}
+			}
+		};
+
+		if ( t() && jQuery.timers.push(t) && !timerId ) {
+			timerId = setInterval( fx.tick, fx.interval );
+		}
+	},
+
+	// Simple 'show' function
+	show: function() {
+		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+		this.options.show = true;
+
+		// Begin the animation
+		// Make sure that we start at a small width/height to avoid any flash of content
+		if ( dataShow !== undefined ) {
+			// This show is picking up where a previous hide or show left off
+			this.custom( this.cur(), dataShow );
+		} else {
+			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+		}
+
+		// Start by showing the element
+		jQuery( this.elem ).show();
+	},
+
+	// Simple 'hide' function
+	hide: function() {
+		// Remember where we started, so that we can go back to it later
+		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+		this.options.hide = true;
+
+		// Begin the animation
+		this.custom( this.cur(), 0 );
+	},
+
+	// Each step of an animation
+	step: function( gotoEnd ) {
+		var p, n, complete,
+			t = fxNow || createFxNow(),
+			done = true,
+			elem = this.elem,
+			options = this.options;
+
+		if ( gotoEnd || t >= options.duration + this.startTime ) {
+			this.now = this.end;
+			this.pos = this.state = 1;
+			this.update();
+
+			options.animatedProperties[ this.prop ] = true;
+
+			for ( p in options.animatedProperties ) {
+				if ( options.animatedProperties[ p ] !== true ) {
+					done = false;
+				}
+			}
+
+			if ( done ) {
+				// Reset the overflow
+				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+						elem.style[ "overflow" + value ] = options.overflow[ index ];
+					});
+				}
+
+				// Hide the element if the "hide" operation was done
+				if ( options.hide ) {
+					jQuery( elem ).hide();
+				}
+
+				// Reset the properties, if the item has been hidden or shown
+				if ( options.hide || options.show ) {
+					for ( p in options.animatedProperties ) {
+						jQuery.style( elem, p, options.orig[ p ] );
+						jQuery.removeData( elem, "fxshow" + p, true );
+						// Toggle data is no longer needed
+						jQuery.removeData( elem, "toggle" + p, true );
+					}
+				}
+
+				// Execute the complete function
+				// in the event that the complete function throws an exception
+				// we must ensure it won't be called twice. #5684
+
+				complete = options.complete;
+				if ( complete ) {
+
+					options.complete = false;
+					complete.call( elem );
+				}
+			}
+
+			return false;
+
+		} else {
+			// classical easing cannot be used with an Infinity duration
+			if ( options.duration == Infinity ) {
+				this.now = t;
+			} else {
+				n = t - this.startTime;
+				this.state = n / options.duration;
+
+				// Perform the easing function, defaults to swing
+				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+				this.now = this.start + ( (this.end - this.start) * this.pos );
+			}
+			// Perform the next step of the animation
+			this.update();
+		}
+
+		return true;
+	}
+};
+
+jQuery.extend( jQuery.fx, {
+	tick: function() {
+		var timer,
+			timers = jQuery.timers,
+			i = 0;
+
+		for ( ; i < timers.length; i++ ) {
+			timer = timers[ i ];
+			// Checks the timer has not already been removed
+			if ( !timer() && timers[ i ] === timer ) {
+				timers.splice( i--, 1 );
+			}
+		}
+
+		if ( !timers.length ) {
+			jQuery.fx.stop();
+		}
+	},
+
+	interval: 13,
+
+	stop: function() {
+		clearInterval( timerId );
+		timerId = null;
+	},
+
+	speeds: {
+		slow: 600,
+		fast: 200,
+		// Default speed
+		_default: 400
+	},
+
+	step: {
+		opacity: function( fx ) {
+			jQuery.style( fx.elem, "opacity", fx.now );
+		},
+
+		_default: function( fx ) {
+			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+			} else {
+				fx.elem[ fx.prop ] = fx.now;
+			}
+		}
+	}
+});
+
+// Ensure props that can't be negative don't go there on undershoot easing
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
+	if ( prop.indexOf( "margin" ) ) {
+		jQuery.fx.step[ prop ] = function( fx ) {
+			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+		};
+	}
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+	if ( !elemdisplay[ nodeName ] ) {
+
+		var body = document.body,
+			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+			display = elem.css( "display" );
+		elem.remove();
+
+		// If the simple way fails,
+		// get element's real default display by attaching it to a temp iframe
+		if ( display === "none" || display === "" ) {
+			// No iframe to use yet, so create it
+			if ( !iframe ) {
+				iframe = document.createElement( "iframe" );
+				iframe.frameBorder = iframe.width = iframe.height = 0;
+			}
+
+			body.appendChild( iframe );
+
+			// Create a cacheable copy of the iframe document on first call.
+			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+			// document to it; WebKit & Firefox won't allow reusing the iframe document.
+			if ( !iframeDoc || !iframe.createElement ) {
+				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
+				iframeDoc.close();
+			}
+
+			elem = iframeDoc.createElement( nodeName );
+
+			iframeDoc.body.appendChild( elem );
+
+			display = jQuery.css( elem, "display" );
+			body.removeChild( iframe );
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return elemdisplay[ nodeName ];
+}
+
+
+
+
+var getOffset,
+	rtable = /^t(?:able|d|h)$/i,
+	rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+	getOffset = function( elem, doc, docElem, box ) {
+		try {
+			box = elem.getBoundingClientRect();
+		} catch(e) {}
+
+		// Make sure we're not dealing with a disconnected DOM node
+		if ( !box || !jQuery.contains( docElem, elem ) ) {
+			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+		}
+
+		var body = doc.body,
+			win = getWindow( doc ),
+			clientTop  = docElem.clientTop  || body.clientTop  || 0,
+			clientLeft = docElem.clientLeft || body.clientLeft || 0,
+			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
+			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+			top  = box.top  + scrollTop  - clientTop,
+			left = box.left + scrollLeft - clientLeft;
+
+		return { top: top, left: left };
+	};
+
+} else {
+	getOffset = function( elem, doc, docElem ) {
+		var computedStyle,
+			offsetParent = elem.offsetParent,
+			prevOffsetParent = elem,
+			body = doc.body,
+			defaultView = doc.defaultView,
+			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+			top = elem.offsetTop,
+			left = elem.offsetLeft;
+
+		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+				break;
+			}
+
+			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+			top  -= elem.scrollTop;
+			left -= elem.scrollLeft;
+
+			if ( elem === offsetParent ) {
+				top  += elem.offsetTop;
+				left += elem.offsetLeft;
+
+				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+				}
+
+				prevOffsetParent = offsetParent;
+				offsetParent = elem.offsetParent;
+			}
+
+			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
+				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+			}
+
+			prevComputedStyle = computedStyle;
+		}
+
+		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+			top  += body.offsetTop;
+			left += body.offsetLeft;
+		}
+
+		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+			top  += Math.max( docElem.scrollTop, body.scrollTop );
+			left += Math.max( docElem.scrollLeft, body.scrollLeft );
+		}
+
+		return { top: top, left: left };
+	};
+}
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var elem = this[0],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return null;
+	}
+
+	if ( elem === doc.body ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	return getOffset( elem, doc, doc.documentElement );
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return null;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					jQuery.support.boxModel && win.document.documentElement[ method ] ||
+						win.document.body[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	var clientProp = "client" + name,
+		scrollProp = "scroll" + name,
+		offsetProp = "offset" + name;
+
+	// innerHeight and innerWidth
+	jQuery.fn[ "inner" + name ] = function() {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, "padding" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	// outerHeight and outerWidth
+	jQuery.fn[ "outer" + name ] = function( margin ) {
+		var elem = this[0];
+		return elem ?
+			elem.style ?
+			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+			this[ type ]() :
+			null;
+	};
+
+	jQuery.fn[ type ] = function( value ) {
+		return jQuery.access( this, function( elem, type, value ) {
+			var doc, docElemProp, orig, ret;
+
+			if ( jQuery.isWindow( elem ) ) {
+				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+				doc = elem.document;
+				docElemProp = doc.documentElement[ clientProp ];
+				return jQuery.support.boxModel && docElemProp ||
+					doc.body && doc.body[ clientProp ] || docElemProp;
+			}
+
+			// Get document width or height
+			if ( elem.nodeType === 9 ) {
+				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+				doc = elem.documentElement;
+
+				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
+				// instead we use the correct client[Width/Height]
+				// support:IE6
+				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+					return doc[ clientProp ];
+				}
+
+				return Math.max(
+					elem.body[ scrollProp ], doc[ scrollProp ],
+					elem.body[ offsetProp ], doc[ offsetProp ]
+				);
+			}
+
+			// Get width or height on the element
+			if ( value === undefined ) {
+				orig = jQuery.css( elem, type );
+				ret = parseFloat( orig );
+				return jQuery.isNumeric( ret ) ? ret : orig;
+			}
+
+			// Set the width or height on the element
+			jQuery( elem ).css( type, value );
+		}, type, value, arguments.length, null );
+	};
+});
+
+
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
Index: tags/2.4.0RC3/themes/default/js/jquery.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/jquery.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/jquery.min.js	(revision 14585)
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.2 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
+a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
+.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
Index: tags/2.4.0RC3/themes/default/js/plugins/chosen.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/chosen.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/chosen.css	(revision 14585)
@@ -0,0 +1,389 @@
+/* @group Base */
+.chzn-container {
+  font-size: 13px;
+  position: relative;
+  display: inline-block;
+  zoom: 1;
+  *display: inline;
+}
+.chzn-container .chzn-drop {
+  background: #fff;
+  border: 1px solid #aaa;
+  border-top: 0;
+  position: absolute;
+  top: 29px;
+  left: 0;
+  -webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
+  -moz-box-shadow   : 0 4px 5px rgba(0,0,0,.15);
+  -o-box-shadow     : 0 4px 5px rgba(0,0,0,.15);
+  box-shadow        : 0 4px 5px rgba(0,0,0,.15);
+  z-index: 999;
+}
+/* @end */
+
+/* @group Single Chosen */
+.chzn-container-single .chzn-single {
+  background-color: #ffffff;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 );   
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
+  background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
+  background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); 
+  -webkit-border-radius: 5px;
+  -moz-border-radius   : 5px;
+  border-radius        : 5px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  border: 1px solid #aaaaaa;
+  -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  -moz-box-shadow   : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  box-shadow        : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1);
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative;
+  height: 23px;
+  line-height: 24px;
+  padding: 0 0 0 8px;
+  color: #444444;
+  text-decoration: none;
+}
+.chzn-container-single .chzn-single span {
+  margin-right: 26px;
+  display: block;
+  overflow: hidden;
+  white-space: nowrap;
+  -o-text-overflow: ellipsis;
+  -ms-text-overflow: ellipsis;
+  text-overflow: ellipsis;
+}
+.chzn-container-single .chzn-single abbr {
+  display: block;
+  position: absolute;
+  right: 26px;
+  top: 6px;
+  width: 12px;
+  height: 13px;
+  font-size: 1px;
+  background: url(chosen-sprite.png) right top no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+  background-position: right -11px;
+}
+.chzn-container-single .chzn-single div {
+  position: absolute;
+  right: 0;
+  top: 0;
+  display: block;
+  height: 100%;
+  width: 18px;
+}
+.chzn-container-single .chzn-single div b {
+  background: url('chosen-sprite.png') no-repeat 0 0;
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+.chzn-container-single .chzn-search {
+  padding: 3px 4px;
+  position: relative;
+  margin: 0;
+  white-space: nowrap;
+  z-index: 1010;
+}
+.chzn-container-single .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
+  background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  margin: 1px 0;
+  padding: 4px 20px 4px 5px;
+  outline: 0;
+  border: 1px solid #aaa;
+  font-family: sans-serif;
+  font-size: 1em;
+}
+.chzn-container-single .chzn-drop {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius   : 0 0 4px 4px;
+  border-radius        : 0 0 4px 4px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+}
+/* @end */
+
+.chzn-container-single-nosearch .chzn-search input {
+  position: absolute;
+  left: -9000px;
+}
+
+/* @group Multi Chosen */
+.chzn-container-multi .chzn-choices {
+  background: #fff url('chosen-sprite.png') no-repeat 100% -21px;
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background-image: url('chosen-sprite.png') no-repeat 100% -21px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  border: 1px solid #aaa;
+  margin: 0;
+  padding: 0;
+  cursor: text;
+  overflow: hidden;
+  height: auto !important;
+  height: 1%;
+  position: relative;
+}
+.chzn-container-multi .chzn-choices li {
+  float: left;
+  list-style: none;
+}
+.chzn-container-multi .chzn-choices .search-field {
+  white-space: nowrap;
+  margin: 0;
+  padding: 0;
+}
+.chzn-container-multi .chzn-choices .search-field input {
+  color: #666;
+  background: transparent !important;
+  border: 0 !important;
+  font-family: sans-serif;
+  font-size: 100%;
+  height: 15px;
+  padding: 5px;
+  margin: 1px 0;
+  outline: 0;
+  -webkit-box-shadow: none;
+  -moz-box-shadow   : none;
+  -o-box-shadow     : none;
+  box-shadow        : none;
+}
+.chzn-container-multi .chzn-choices .search-field .default {
+  color: #999;
+}
+.chzn-container-multi .chzn-choices .search-choice {
+  -webkit-border-radius: 3px;
+  -moz-border-radius   : 3px;
+  border-radius        : 3px;
+  -moz-background-clip   : padding;
+  -webkit-background-clip: padding-box;
+  background-clip        : padding-box;
+  background-color: #e4e4e4;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); 
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
+  background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
+  background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); 
+  -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  -moz-box-shadow   : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  box-shadow        : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05);
+  color: #333;
+  border: 1px solid #aaaaaa;
+  line-height: 13px;
+  padding: 3px 20px 3px 5px;
+  margin: 3px 0 3px 5px;
+  position: relative;
+  cursor: default;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus {
+  background: #d4d4d4;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
+  display: block;
+  position: absolute;
+  right: 3px;
+  top: 4px;
+  width: 12px;
+  height: 13px;
+  font-size: 1px;
+  background: url(chosen-sprite.png) right top no-repeat;
+}
+.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
+  background-position: right -11px;
+}
+.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
+  background-position: right -11px;
+}
+/* @end */
+
+/* @group Results */
+.chzn-container .chzn-results {
+  margin: 0 4px 4px 0;
+  max-height: 240px;
+  padding: 0 0 0 4px;
+  position: relative;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.chzn-container-multi .chzn-results {
+  margin: -1px 0 0;
+  padding: 0;
+}
+.chzn-container .chzn-results li {
+  display: none;
+  line-height: 15px;
+  padding: 5px 6px;
+  margin: 0;
+  list-style: none;
+}
+.chzn-container .chzn-results .active-result {
+  cursor: pointer;
+  display: list-item;
+}
+.chzn-container .chzn-results .highlighted {
+  background-color: #3875d7;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 );  
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
+  background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%);
+  color: #fff;
+}
+.chzn-container .chzn-results li em {
+  background: #feffde;
+  font-style: normal;
+}
+.chzn-container .chzn-results .highlighted em {
+  background: transparent;
+}
+.chzn-container .chzn-results .no-results {
+  background: #f4f4f4;
+  display: list-item;
+}
+.chzn-container .chzn-results .group-result {
+  cursor: default;
+  color: #999;
+  font-weight: bold;
+}
+.chzn-container .chzn-results .group-option {
+  padding-left: 15px;
+}
+.chzn-container-multi .chzn-drop .result-selected {
+  display: none;
+}
+.chzn-container .chzn-results-scroll {
+  background: white;
+  margin: 0 4px;
+  position: absolute;
+  text-align: center;
+  width: 321px; /* This should by dynamic with js */
+  z-index: 1;
+}
+.chzn-container .chzn-results-scroll span {
+  display: inline-block;
+  height: 17px;
+  text-indent: -5000px;
+  width: 9px;
+}
+.chzn-container .chzn-results-scroll-down {
+  bottom: 0;
+}
+.chzn-container .chzn-results-scroll-down span {
+  background: url('chosen-sprite.png') no-repeat -4px -3px;
+}
+.chzn-container .chzn-results-scroll-up span {
+  background: url('chosen-sprite.png') no-repeat -22px -3px;
+}
+/* @end */
+
+/* @group Active  */
+.chzn-container-active .chzn-single {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  -o-box-shadow     : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-single-with-drop {
+  border: 1px solid #aaa;
+  -webkit-box-shadow: 0 1px 0 #fff inset;
+  -moz-box-shadow   : 0 1px 0 #fff inset;
+  -o-box-shadow     : 0 1px 0 #fff inset;
+  box-shadow        : 0 1px 0 #fff inset;
+  background-color: #eee;
+  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );
+  background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff));
+  background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%);
+  -webkit-border-bottom-left-radius : 0;
+  -webkit-border-bottom-right-radius: 0;
+  -moz-border-radius-bottomleft : 0;
+  -moz-border-radius-bottomright: 0;
+  border-bottom-left-radius : 0;
+  border-bottom-right-radius: 0;
+}
+.chzn-container-active .chzn-single-with-drop div {
+  background: transparent;
+  border-left: none;
+}
+.chzn-container-active .chzn-single-with-drop div b {
+  background-position: -18px 1px;
+}
+.chzn-container-active .chzn-choices {
+  -webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
+  -moz-box-shadow   : 0 0 5px rgba(0,0,0,.3);
+  -o-box-shadow     : 0 0 5px rgba(0,0,0,.3);
+  box-shadow        : 0 0 5px rgba(0,0,0,.3);
+  border: 1px solid #5897fb;
+}
+.chzn-container-active .chzn-choices .search-field input {
+  color: #111 !important;
+}
+/* @end */
+
+/* @group Disabled Support */
+.chzn-disabled {
+  cursor: default;
+  opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+  cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+  cursor: default;
+}
+
+/* @group Right to Left */
+.chzn-rtl { text-align: right; }
+.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; }
+.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; }
+
+.chzn-rtl .chzn-single div { left: 3px; right: auto; }
+.chzn-rtl .chzn-single abbr {
+  left: 26px;
+  right: auto;
+}
+.chzn-rtl .chzn-choices .search-field input { direction: rtl; }
+.chzn-rtl .chzn-choices li { float: right; }
+.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; }
+.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;}
+.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; }
+.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; }
+.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
+.chzn-rtl .chzn-search input {
+  background: #fff url('chosen-sprite.png') no-repeat -38px -22px;
+  background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff));
+  background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%);  
+  background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%);
+  padding: 4px 5px 4px 20px;
+  direction: rtl;
+}
+/* @end */
Index: tags/2.4.0RC3/themes/default/js/plugins/chosen.jquery.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/chosen.jquery.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/chosen.jquery.min.js	(revision 14585)
@@ -0,0 +1,10 @@
+// Chosen, a Select Box Enhancer for jQuery and Protoype
+// by Patrick Filler for Harvest, http://getharvest.com
+// 
+// Version 0.9.7
+// Full source at https://github.com/harvesthq/chosen
+// Copyright (c) 2011 Harvest http://getharvest.com
+
+// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
+// This file is generated by `cake build`, do not edit it by hand.
+((function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}return a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION")return a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1},a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a})).call(this),function(){var a,b;b=this,a=function(){function a(a,b){this.form_field=a,this.options=b!=null?b:{},this.set_default_values(),this.is_multiple=this.form_field.multiple,this.default_text_default=this.is_multiple?"Select Some Options":"Select an Option",this.setup(),this.set_up_html(),this.register_observers(),this.finish_setup()}return a.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.allow_single_deselect=this.options.allow_single_deselect!=null&&this.form_field.options[0]!=null&&this.form_field.options[0].text===""?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.choices=0,this.results_none_found=this.options.no_results_text||"No results match"},a.prototype.mouse_enter=function(){return this.mouse_on_container=!0},a.prototype.mouse_leave=function(){return this.mouse_on_container=!1},a.prototype.input_focus=function(a){var b=this;if(!this.active_field)return setTimeout(function(){return b.container_mousedown()},50)},a.prototype.input_blur=function(a){var b=this;if(!this.mouse_on_container)return this.active_field=!1,setTimeout(function(){return b.blur_test()},100)},a.prototype.result_add_option=function(a){var b,c;return a.disabled?"":(a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option"),a.classes!==""&&b.push(a.classes),c=a.style.cssText!==""?' style="'+a.style+'"':"",'<li id="'+a.dom_id+'" class="'+b.join(" ")+'"'+c+">"+a.html+"</li>")},a.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d,e=Object.prototype.hasOwnProperty,f=function(a,b){function d(){this.constructor=a}for(var c in b)e.call(b,c)&&(a[c]=b[c]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};d=this,a=jQuery,a.fn.extend({chosen:function(c){return!a.browser.msie||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(d){if(!a(this).hasClass("chzn-done"))return new b(this,c)}):this}}),b=function(b){function e(){e.__super__.constructor.apply(this,arguments)}return f(e,b),e.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},e.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},e.prototype.set_up_html=function(){var b,d,e,f;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("<div />",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'):b.html('<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},e.prototype.register_observers=function(){var a=this;return this.container.mousedown(function(b){return a.container_mousedown(b)}),this.container.mouseup(function(b){return a.container_mouseup(b)}),this.container.mouseenter(function(b){return a.mouse_enter(b)}),this.container.mouseleave(function(b){return a.mouse_leave(b)}),this.search_results.mouseup(function(b){return a.search_results_mouseup(b)}),this.search_results.mouseover(function(b){return a.search_results_mouseover(b)}),this.search_results.mouseout(function(b){return a.search_results_mouseout(b)}),this.form_field_jq.bind("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.blur(function(b){return a.input_blur(b)}),this.search_field.keyup(function(b){return a.keyup_checker(b)}),this.search_field.keydown(function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.click(function(b){return a.choices_click(b)}),this.search_field.focus(function(b){return a.input_focus(b)})):this.container.click(function(a){return a.preventDefault()})},e.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},e.prototype.container_mousedown=function(b){var c;if(!this.is_disabled)return c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&b.stopPropagation(),!this.pending_destroy_click&&!c?(this.active_field?!this.is_multiple&&b&&(a(b.target)[0]===this.selected_item[0]||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},e.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},e.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},e.prototype.close_field=function(){return a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},e.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},e.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},e.prototype.results_build=function(){var a,b,c,e,f;this.parsing=!0,this.results_data=d.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.find("span").text(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),a="",f=this.results_data;for(c=0,e=f.length;c<e;c++)b=f[c],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&(this.selected_item.find("span").text(b.text),this.allow_single_deselect&&this.single_deselect_control_build()));return this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.search_results.html(a),this.parsing=!1},e.prototype.result_add_group=function(b){return b.disabled?"":(b.dom_id=this.container_id+"_g_"+b.array_index,'<li id="'+b.dom_id+'" class="group-result">'+a("<div />").text(b.label).html()+"</li>")},e.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c<f)return this.search_results.scrollTop(c)}},e.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},e.prototype.results_show=function(){var a;return this.is_multiple||(this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.height():this.container.height()-1,this.dropdown.css({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results()},e.prototype.results_hide=function(){return this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.css({left:"-9000px"}),this.results_showing=!1},e.prototype.set_tab_index=function(a){var b;if(this.form_field_jq.attr("tabindex"))return b=this.form_field_jq.attr("tabindex"),this.form_field_jq.attr("tabindex",-1),this.is_multiple?this.search_field.attr("tabindex",b):(this.selected_item.attr("tabindex",b),this.search_field.attr("tabindex",-1))},e.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},e.prototype.search_results_mouseup=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c.length)return this.result_highlight=c,this.result_select(b)},e.prototype.search_results_mouseover=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c)return this.result_do_highlight(c)},e.prototype.search_results_mouseout=function(b){if(a(b.target).hasClass("active-result"))return this.result_clear_highlight()},e.prototype.choices_click=function(b){b.preventDefault();if(this.active_field&&!a(b.target).hasClass("search-choice")&&!this.results_showing)return this.results_show()},e.prototype.choice_build=function(b){var c,d,e=this;return c=this.container_id+"_c_"+b.array_index,this.choices+=1,this.search_container.before('<li class="search-choice" id="'+c+'"><span>'+b.html+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+b.array_index+'"></a></li>'),d=a("#"+c).find("a").first(),d.click(function(a){return e.choice_destroy_link_click(a)})},e.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),this.is_disabled?b.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(a(b.target)))},e.prototype.choice_destroy=function(a){return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel")),a.parents("li").first().remove()},e.prototype.results_reset=function(b){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.show_search_field_default(),a(b.target).remove(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},e.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight)return b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.result_activate=function(a){return a.addClass("active-result")},e.prototype.result_deactivate=function(a){return a.removeClass("active-result")},e.prototype.result_deselect=function(b){var c,d;return d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('<abbr class="search-choice-close"></abbr>')},e.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;this.no_results_clear(),i=0,j=this.search_field.val()===this.default_text?"":a("<div/>").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n<p;n++){c=r[n];if(!c.disabled&&!c.empty)if(c.group)a("#"+c.dom_id).css("display","none");else if(!this.is_multiple||!c.selected){b=!1,h=c.dom_id,g=a("#"+h);if(f.test(c.html))b=!0,i+=1;else if(c.html.indexOf(" ")>=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o<q;o++)d=e[o],f.test(d)&&(b=!0,i+=1)}b?(j.length?(k=c.html.search(m),l=c.html.substr(0,k+j.length)+"</em>"+c.html.substr(k+j.length),l=l.substr(0,k)+"<em>"+l.substr(k)):l=c.html,g.html(l),this.result_activate(g),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&h===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(g))}}return i<1&&j.length?this.no_results(j):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d<e;d++)b=c[d],b=a(b),b.hasClass("group-result")?f.push(b.css("display","auto")):!this.is_multiple||!b.hasClass("result-selected")?f.push(this.result_activate(b)):f.push(void 0);return f},e.prototype.winnow_results_set_highlight=function(){var a,b;if(!this.result_highlight){b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first();if(a!=null)return this.result_do_highlight(a)}},e.prototype.no_results=function(b){var c;return c=a('<li class="no-results">'+this.results_none_found+' "<span></span>"</li>'),c.find("span").first().html(b),this.search_results.append(c)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClass("search-choice-focus"))},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i<j;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return c=a("<div />",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this)
Index: tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/colorbox.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/colorbox.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/colorbox.css	(revision 14585)
@@ -0,0 +1,82 @@
+/*
+    ColorBox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of ColorBox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{}
+    #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -100px 0;}
+    #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -129px 0;}
+    #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -100px -29px;}
+    #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -129px -29px;}
+    #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+    #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+    #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+    #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+    #cboxContent{background:#fff; overflow:hidden;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{margin-bottom:28px;}
+        #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+        #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxPrevious.hover{background-position:-75px -25px;}
+        #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxNext.hover{background-position:-50px -25px;}
+        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+        #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+        #cboxClose.hover{background-position:-25px -25px;}
+
+/*
+  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to IE9.
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+  The following provides PNG transparency support for IE6
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+    _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
Index: tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/index.html
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/index.html	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/colorbox/style1/index.html	(revision 14585)
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+	<meta charset=utf-8 />
+	<title>ColorBox Examples</title>
+	<style type="text/css">
+		body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+		a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+		h2{font-size:13px; margin:15px 0 0 0;}
+	</style>
+	<link media="screen" rel="stylesheet" href="colorbox.css" />
+	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
+	<script src="../colorbox/jquery.colorbox.js"></script>
+	<script>
+		$(document).ready(function(){
+			//Examples of how to assign the ColorBox event to elements
+			$("a[rel='example1']").colorbox();
+			$("a[rel='example2']").colorbox({transition:"fade"});
+			$("a[rel='example3']").colorbox({transition:"none", width:"75%", height:"75%"});
+			$("a[rel='example4']").colorbox({slideshow:true});
+			$(".example5").colorbox();
+			$(".example6").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+			$(".example7").colorbox({width:"80%", height:"80%", iframe:true});
+			$(".example8").colorbox({width:"50%", inline:true, href:"#inline_example1"});
+			$(".example9").colorbox({
+				onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+				onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+				onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+				onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+				onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+			});
+			
+			//Example of preserving a JavaScript event for inline calls.
+			$("#click").click(function(){ 
+				$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+				return false;
+			});
+		});
+	</script>
+</head>
+<body>
+	<h1>ColorBox Demonstration</h1>
+	
+	<h2>Elastic Transition</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example1" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example1" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example1" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Fade Transition</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example2" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example2" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example2" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>No Transition + fixed width and height (75% of screen size)</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example3"  title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example3"  title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example3"  title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Slideshow</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example4"  title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example4"  title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example4"  title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Other Content Types</h2>
+	<p><a class='example5' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+	<p><a class='example5' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+	<p><a class='example6' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+	<p><a class='example7' href="http://google.com">Outside Webpage (Iframe)</a></p>
+	<p><a class='example8' href="#">Inline HTML</a></p>
+	
+	<h2>Demonstration of using callbacks</h2>
+	<p><a class='example9' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+	
+	<!-- This contains the hidden content for inline calls -->
+	<div style='display:none'>
+		<div id='inline_example1' style='padding:10px; background:#fff;'>
+		<p><strong>This content comes from a hidden element on this page.</strong></p>
+		<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.<br />
+		<a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+		
+		<p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+		<p>Updating Content Example:<br />
+		<a class="example5" href="../content/flash.html">Click here to load new content</a></p>
+		</div>
+	</div>
+</body>
+</html>
Index: tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/colorbox.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/colorbox.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/colorbox.css	(revision 14585)
@@ -0,0 +1,42 @@
+/*
+    ColorBox Core Style:
+    The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+
+/* 
+    User Style:
+    Change the following styles to modify the appearance of ColorBox.  They are
+    ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+    #cboxContent{margin-top:32px; overflow:visible;}
+        #cboxError{padding:50px; border:1px solid #ccc;}
+        #cboxLoadedContent{background:#f1f1f1; padding:1px;}
+        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+        #cboxLoadingOverlay{background:#000;}
+        #cboxTitle{position:absolute; top:-22px; left:0; color:#fff;}
+        #cboxTitle:first-letter{text-transform:capitalize;}
+        #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+        #cboxSlideshow, #cboxPrevious, #cboxNext, #cboxClose{text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+        #cboxPrevious{background-position:0px 0px; right:44px;}
+        #cboxPrevious.hover{background-position:0px -25px;}
+        #cboxNext{background-position:-25px 0px; right:22px;}
+        #cboxNext.hover{background-position:-25px -25px;}
+        #cboxClose{background-position:-50px 0px; right:0;}
+        #cboxClose.hover{background-position:-50px -25px;}
+        .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+        .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+        .cboxSlideshow_on #cboxSlideshow.hover{background-position:-100px -25px;}
+        .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+        .cboxSlideshow_off #cboxSlideshow.hover{background-position:-75px -25px;}
Index: tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/index.html
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/index.html	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/colorbox/style2/index.html	(revision 14585)
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+	<meta charset=utf-8 />
+	<title>ColorBox Examples</title>
+	<style type="text/css">
+		body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+		a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+		h2{font-size:13px; margin:15px 0 0 0;}
+	</style>
+	<link media="screen" rel="stylesheet" href="colorbox.css" />
+	<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
+	<script src="../colorbox/jquery.colorbox.js"></script>
+	<script>
+		$(document).ready(function(){
+			//Examples of how to assign the ColorBox event to elements
+			$("a[rel='example1']").colorbox();
+			$("a[rel='example2']").colorbox({transition:"fade"});
+			$("a[rel='example3']").colorbox({transition:"none", width:"75%", height:"75%"});
+			$("a[rel='example4']").colorbox({slideshow:true});
+			$(".example5").colorbox();
+			$(".example6").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+			$(".example7").colorbox({width:"80%", height:"80%", iframe:true});
+			$(".example8").colorbox({width:"50%", inline:true, href:"#inline_example1"});
+			$(".example9").colorbox({
+				onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+				onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+				onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+				onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+				onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+			});
+			
+			//Example of preserving a JavaScript event for inline calls.
+			$("#click").click(function(){ 
+				$('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+				return false;
+			});
+		});
+	</script>
+</head>
+<body>
+	<h1>ColorBox Demonstration</h1>
+	
+	<h2>Elastic Transition</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example1" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example1" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example1" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Fade Transition</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example2" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example2" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example2" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>No Transition + fixed width and height (75% of screen size)</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example3"  title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example3"  title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example3"  title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Slideshow</h2>
+	<p><a href="../content/ohoopee1.jpg" rel="example4"  title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+	<p><a href="../content/ohoopee2.jpg" rel="example4"  title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+	<p><a href="../content/ohoopee3.jpg" rel="example4"  title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+	
+	<h2>Other Content Types</h2>
+	<p><a class='example5' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+	<p><a class='example5' href="../content/flash.html" title="Royksopp: Remind Me">Flash / Video (Ajax/Embedded)</a></p>
+	<p><a class='example6' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+	<p><a class='example7' href="http://google.com">Outside Webpage (Iframe)</a></p>
+	<p><a class='example8' href="#">Inline HTML</a></p>
+	
+	<h2>Demonstration of using callbacks</h2>
+	<p><a class='example9' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+	
+	<!-- This contains the hidden content for inline calls -->
+	<div style='display:none'>
+		<div id='inline_example1' style='padding:10px; background:#fff;'>
+		<p><strong>This content comes from a hidden element on this page.</strong></p>
+		<p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.<br />
+		<a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+		
+		<p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+		<p>Updating Content Example:<br />
+		<a class="example5" href="../content/flash.html">Click here to load new content</a></p>
+		</div>
+	</div>
+</body>
+</html>
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.css	(revision 14585)
@@ -0,0 +1,35 @@
+/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */
+.jcrop-holder { text-align: left; }
+
+.jcrop-vline, .jcrop-hline
+{
+	font-size: 0px;
+	position: absolute;
+	background: white url('Jcrop.gif') top left repeat;
+}
+.jcrop-vline { height: 100%; width: 1px !important; }
+.jcrop-hline { width: 100%; height: 1px !important; }
+.jcrop-vline.right { right: 0px; }
+.jcrop-hline.bottom { bottom: 0px; }
+.jcrop-handle {
+	font-size: 1px;
+	width: 7px !important;
+	height: 7px !important;
+	border: 1px #eee solid;
+	background-color: #333;
+}
+
+.jcrop-tracker { width: 100%; height: 100%; }
+
+.custom .jcrop-vline,
+.custom .jcrop-hline
+{
+	background: yellow;
+}
+.custom .jcrop-handle
+{
+	border-color: black;
+	background-color: #C7BB00;
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+}
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.js	(revision 14585)
@@ -0,0 +1,1600 @@
+/**
+ * jquery.Jcrop.js v0.9.9
+ * jQuery Image Cropping Plugin
+ * @author Kelly Hallman <khallman@gmail.com>
+ * Copyright (c) 2008-2011 Kelly Hallman - released under MIT License {{{
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * }}}
+ */
+
+(function ($) {
+
+  $.Jcrop = function (obj, opt) {
+    var options = $.extend({}, $.Jcrop.defaults),
+        docOffset, lastcurs, ie6mode = false;
+
+    // Internal Methods {{{
+    function px(n) {
+      return parseInt(n, 10) + 'px';
+    }
+    function pct(n) {
+      return parseInt(n, 10) + '%';
+    }
+    function cssClass(cl) {
+      return options.baseClass + '-' + cl;
+    }
+    function supportsColorFade() {
+      return $.fx.step.hasOwnProperty('backgroundColor');
+    }
+    function getPos(obj) //{{{
+    {
+      // Updated in v0.9.4 to use built-in dimensions plugin
+      var pos = $(obj).offset();
+      return [pos.left, pos.top];
+    }
+    //}}}
+    function mouseAbs(e) //{{{
+    {
+      return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])];
+    }
+    //}}}
+    function setOptions(opt) //{{{
+    {
+      if (typeof(opt) !== 'object') {
+        opt = {};
+      }
+      options = $.extend(options, opt);
+
+      if (typeof(options.onChange) !== 'function') {
+        options.onChange = function () {};
+      }
+      if (typeof(options.onSelect) !== 'function') {
+        options.onSelect = function () {};
+      }
+      if (typeof(options.onRelease) !== 'function') {
+        options.onRelease = function () {};
+      }
+    }
+    //}}}
+    function myCursor(type) //{{{
+    {
+      if (type !== lastcurs) {
+        Tracker.setCursor(type);
+        lastcurs = type;
+      }
+    }
+    //}}}
+    function startDragMode(mode, pos) //{{{
+    {
+      docOffset = getPos($img);
+      Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');
+
+      if (mode === 'move') {
+        return Tracker.activateHandlers(createMover(pos), doneSelect);
+      }
+
+      var fc = Coords.getFixed();
+      var opp = oppLockCorner(mode);
+      var opc = Coords.getCorner(oppLockCorner(opp));
+
+      Coords.setPressed(Coords.getCorner(opp));
+      Coords.setCurrent(opc);
+
+      Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);
+    }
+    //}}}
+    function dragmodeHandler(mode, f) //{{{
+    {
+      return function (pos) {
+        if (!options.aspectRatio) {
+          switch (mode) {
+          case 'e':
+            pos[1] = f.y2;
+            break;
+          case 'w':
+            pos[1] = f.y2;
+            break;
+          case 'n':
+            pos[0] = f.x2;
+            break;
+          case 's':
+            pos[0] = f.x2;
+            break;
+          }
+        } else {
+          switch (mode) {
+          case 'e':
+            pos[1] = f.y + 1;
+            break;
+          case 'w':
+            pos[1] = f.y + 1;
+            break;
+          case 'n':
+            pos[0] = f.x + 1;
+            break;
+          case 's':
+            pos[0] = f.x + 1;
+            break;
+          }
+        }
+        Coords.setCurrent(pos);
+        Selection.update();
+      };
+    }
+    //}}}
+    function createMover(pos) //{{{
+    {
+      var lloc = pos;
+      KeyManager.watchKeys();
+
+      return function (pos) {
+        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
+        lloc = pos;
+
+        Selection.update();
+      };
+    }
+    //}}}
+    function oppLockCorner(ord) //{{{
+    {
+      switch (ord) {
+      case 'n':
+        return 'sw';
+      case 's':
+        return 'nw';
+      case 'e':
+        return 'nw';
+      case 'w':
+        return 'ne';
+      case 'ne':
+        return 'sw';
+      case 'nw':
+        return 'se';
+      case 'se':
+        return 'nw';
+      case 'sw':
+        return 'ne';
+      }
+    }
+    //}}}
+    function createDragger(ord) //{{{
+    {
+      return function (e) {
+        if (options.disabled) {
+          return false;
+        }
+        if ((ord === 'move') && !options.allowMove) {
+          return false;
+        }
+        btndown = true;
+        startDragMode(ord, mouseAbs(e));
+        e.stopPropagation();
+        e.preventDefault();
+        return false;
+      };
+    }
+    //}}}
+    function presize($obj, w, h) //{{{
+    {
+      var nw = $obj.width(),
+          nh = $obj.height();
+      if ((nw > w) && w > 0) {
+        nw = w;
+        nh = (w / $obj.width()) * $obj.height();
+      }
+      if ((nh > h) && h > 0) {
+        nh = h;
+        nw = (h / $obj.height()) * $obj.width();
+      }
+      xscale = $obj.width() / nw;
+      yscale = $obj.height() / nh;
+      $obj.width(nw).height(nh);
+    }
+    //}}}
+    function unscale(c) //{{{
+    {
+      return {
+        x: parseInt(c.x * xscale, 10),
+        y: parseInt(c.y * yscale, 10),
+        x2: parseInt(c.x2 * xscale, 10),
+        y2: parseInt(c.y2 * yscale, 10),
+        w: parseInt(c.w * xscale, 10),
+        h: parseInt(c.h * yscale, 10)
+      };
+    }
+    //}}}
+    function doneSelect(pos) //{{{
+    {
+      var c = Coords.getFixed();
+      if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) {
+        Selection.enableHandles();
+        Selection.done();
+      } else {
+        Selection.release();
+      }
+      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
+    }
+    //}}}
+    function newSelection(e) //{{{
+    {
+      if (options.disabled) {
+        return false;
+      }
+      if (!options.allowSelect) {
+        return false;
+      }
+      btndown = true;
+      docOffset = getPos($img);
+      Selection.disableHandles();
+      myCursor('crosshair');
+      var pos = mouseAbs(e);
+      Coords.setPressed(pos);
+      Selection.update();
+      Tracker.activateHandlers(selectDrag, doneSelect);
+      KeyManager.watchKeys();
+
+      e.stopPropagation();
+      e.preventDefault();
+      return false;
+    }
+    //}}}
+    function selectDrag(pos) //{{{
+    {
+      Coords.setCurrent(pos);
+      Selection.update();
+    }
+    //}}}
+    function newTracker() //{{{
+    {
+      var trk = $('<div></div>').addClass(cssClass('tracker'));
+      if ($.browser.msie) {
+        trk.css({
+          opacity: 0,
+          backgroundColor: 'white'
+        });
+      }
+      return trk;
+    }
+    //}}}
+
+    // }}}
+    // Initialization {{{
+    // Sanitize some options {{{
+    if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) {
+      ie6mode = true;
+    }
+    if (typeof(obj) !== 'object') {
+      obj = $(obj)[0];
+    }
+    if (typeof(opt) !== 'object') {
+      opt = {};
+    }
+    // }}}
+    setOptions(opt);
+    // Initialize some jQuery objects {{{
+    // The values are SET on the image(s) for the interface
+    // If the original image has any of these set, they will be reset
+    // However, if you destroy() the Jcrop instance the original image's
+    // character in the DOM will be as you left it.
+    var img_css = {
+      border: 'none',
+      margin: 0,
+      padding: 0,
+      position: 'absolute'
+    };
+
+    var $origimg = $(obj);
+    var $img = $origimg.clone().removeAttr('id').css(img_css);
+
+    $img.width($origimg.width());
+    $img.height($origimg.height());
+    $origimg.after($img).hide();
+
+    presize($img, options.boxWidth, options.boxHeight);
+
+    var boundx = $img.width(),
+        boundy = $img.height(),
+        
+        
+        $div = $('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({
+        position: 'relative',
+        backgroundColor: options.bgColor
+      }).insertAfter($origimg).append($img);
+
+    delete(options.bgColor);
+    if (options.addClass) {
+      $div.addClass(options.addClass);
+    }
+
+    var $img2 = $('<img />')
+        .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy),
+
+        $img_holder = $('<div />') 
+        .width(pct(100)).height(pct(100)).css({
+          zIndex: 310,
+          position: 'absolute',
+          overflow: 'hidden'
+        }).append($img2),
+
+        $hdl_holder = $('<div />') 
+        .width(pct(100)).height(pct(100)).css('zIndex', 320), 
+
+        $sel = $('<div />') 
+        .css({
+          position: 'absolute',
+          zIndex: 300
+        }).insertBefore($img).append($img_holder, $hdl_holder); 
+
+    if (ie6mode) {
+      $sel.css({
+        overflowY: 'hidden'
+      });
+    }
+
+    var bound = options.boundary;
+    var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({
+      position: 'absolute',
+      top: px(-bound),
+      left: px(-bound),
+      zIndex: 290
+    }).mousedown(newSelection);
+
+    /* }}} */
+    // Set more variables {{{
+    var bgopacity = options.bgOpacity,
+        xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true,
+        btndown, animating, shift_down;
+
+    docOffset = getPos($img);
+    // }}}
+    // }}}
+    // Internal Modules {{{
+    // Touch Module {{{ 
+    var Touch = (function () {
+      // Touch support detection function adapted (under MIT License)
+      // from code by Jeffrey Sambells - http://github.com/iamamused/
+      function hasTouchSupport() {
+        var support = {},
+            events = ['touchstart', 'touchmove', 'touchend'],
+            el = document.createElement('div'), i;
+
+        try {
+          for(i=0; i<events.length; i++) {
+            var eventName = events[i];
+            eventName = 'on' + eventName;
+            var isSupported = (eventName in el);
+            if (!isSupported) {
+              el.setAttribute(eventName, 'return;');
+              isSupported = typeof el[eventName] == 'function';
+            }
+            support[events[i]] = isSupported;
+          }
+          return support.touchstart && support.touchend && support.touchmove;
+        }
+        catch(err) {
+          return false;
+        }
+      }
+
+      function detectSupport() {
+        if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;
+          else return hasTouchSupport();
+      }
+      return {
+        createDragger: function (ord) {
+          return function (e) {
+            e.pageX = e.originalEvent.changedTouches[0].pageX;
+            e.pageY = e.originalEvent.changedTouches[0].pageY;
+            if (options.disabled) {
+              return false;
+            }
+            if ((ord === 'move') && !options.allowMove) {
+              return false;
+            }
+            btndown = true;
+            startDragMode(ord, mouseAbs(e));
+            e.stopPropagation();
+            e.preventDefault();
+            return false;
+          };
+        },
+        newSelection: function (e) {
+          e.pageX = e.originalEvent.changedTouches[0].pageX;
+          e.pageY = e.originalEvent.changedTouches[0].pageY;
+          return newSelection(e);
+        },
+        isSupported: hasTouchSupport,
+        support: detectSupport()
+      };
+    }());
+    // }}}
+    // Coords Module {{{
+    var Coords = (function () {
+      var x1 = 0,
+          y1 = 0,
+          x2 = 0,
+          y2 = 0,
+          ox, oy;
+
+      function setPressed(pos) //{{{
+      {
+        pos = rebound(pos);
+        x2 = x1 = pos[0];
+        y2 = y1 = pos[1];
+      }
+      //}}}
+      function setCurrent(pos) //{{{
+      {
+        pos = rebound(pos);
+        ox = pos[0] - x2;
+        oy = pos[1] - y2;
+        x2 = pos[0];
+        y2 = pos[1];
+      }
+      //}}}
+      function getOffset() //{{{
+      {
+        return [ox, oy];
+      }
+      //}}}
+      function moveOffset(offset) //{{{
+      {
+        var ox = offset[0],
+            oy = offset[1];
+
+        if (0 > x1 + ox) {
+          ox -= ox + x1;
+        }
+        if (0 > y1 + oy) {
+          oy -= oy + y1;
+        }
+
+        if (boundy < y2 + oy) {
+          oy += boundy - (y2 + oy);
+        }
+        if (boundx < x2 + ox) {
+          ox += boundx - (x2 + ox);
+        }
+
+        x1 += ox;
+        x2 += ox;
+        y1 += oy;
+        y2 += oy;
+      }
+      //}}}
+      function getCorner(ord) //{{{
+      {
+        var c = getFixed();
+        switch (ord) {
+        case 'ne':
+          return [c.x2, c.y];
+        case 'nw':
+          return [c.x, c.y];
+        case 'se':
+          return [c.x2, c.y2];
+        case 'sw':
+          return [c.x, c.y2];
+        }
+      }
+      //}}}
+      function getFixed() //{{{
+      {
+        if (!options.aspectRatio) {
+          return getRect();
+        }
+        // This function could use some optimization I think...
+        var aspect = options.aspectRatio,
+            min_x = options.minSize[0] / xscale,
+            
+            
+            //min_y = options.minSize[1]/yscale,
+            max_x = options.maxSize[0] / xscale,
+            max_y = options.maxSize[1] / yscale,
+            rw = x2 - x1,
+            rh = y2 - y1,
+            rwa = Math.abs(rw),
+            rha = Math.abs(rh),
+            real_ratio = rwa / rha,
+            xx, yy;
+
+        if (max_x === 0) {
+          max_x = boundx * 10;
+        }
+        if (max_y === 0) {
+          max_y = boundy * 10;
+        }
+        if (real_ratio < aspect) {
+          yy = y2;
+          w = rha * aspect;
+          xx = rw < 0 ? x1 - w : w + x1;
+
+          if (xx < 0) {
+            xx = 0;
+            h = Math.abs((xx - x1) / aspect);
+            yy = rh < 0 ? y1 - h : h + y1;
+          } else if (xx > boundx) {
+            xx = boundx;
+            h = Math.abs((xx - x1) / aspect);
+            yy = rh < 0 ? y1 - h : h + y1;
+          }
+        } else {
+          xx = x2;
+          h = rwa / aspect;
+          yy = rh < 0 ? y1 - h : y1 + h;
+          if (yy < 0) {
+            yy = 0;
+            w = Math.abs((yy - y1) * aspect);
+            xx = rw < 0 ? x1 - w : w + x1;
+          } else if (yy > boundy) {
+            yy = boundy;
+            w = Math.abs(yy - y1) * aspect;
+            xx = rw < 0 ? x1 - w : w + x1;
+          }
+        }
+
+        // Magic %-)
+        if (xx > x1) { // right side
+          if (xx - x1 < min_x) {
+            xx = x1 + min_x;
+          } else if (xx - x1 > max_x) {
+            xx = x1 + max_x;
+          }
+          if (yy > y1) {
+            yy = y1 + (xx - x1) / aspect;
+          } else {
+            yy = y1 - (xx - x1) / aspect;
+          }
+        } else if (xx < x1) { // left side
+          if (x1 - xx < min_x) {
+            xx = x1 - min_x;
+          } else if (x1 - xx > max_x) {
+            xx = x1 - max_x;
+          }
+          if (yy > y1) {
+            yy = y1 + (x1 - xx) / aspect;
+          } else {
+            yy = y1 - (x1 - xx) / aspect;
+          }
+        }
+
+        if (xx < 0) {
+          x1 -= xx;
+          xx = 0;
+        } else if (xx > boundx) {
+          x1 -= xx - boundx;
+          xx = boundx;
+        }
+
+        if (yy < 0) {
+          y1 -= yy;
+          yy = 0;
+        } else if (yy > boundy) {
+          y1 -= yy - boundy;
+          yy = boundy;
+        }
+
+        return makeObj(flipCoords(x1, y1, xx, yy));
+      }
+      //}}}
+      function rebound(p) //{{{
+      {
+        if (p[0] < 0) {
+          p[0] = 0;
+        }
+        if (p[1] < 0) {
+          p[1] = 0;
+        }
+
+        if (p[0] > boundx) {
+          p[0] = boundx;
+        }
+        if (p[1] > boundy) {
+          p[1] = boundy;
+        }
+
+        return [p[0], p[1]];
+      }
+      //}}}
+      function flipCoords(x1, y1, x2, y2) //{{{
+      {
+        var xa = x1,
+            xb = x2,
+            ya = y1,
+            yb = y2;
+        if (x2 < x1) {
+          xa = x2;
+          xb = x1;
+        }
+        if (y2 < y1) {
+          ya = y2;
+          yb = y1;
+        }
+        return [Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb)];
+      }
+      //}}}
+      function getRect() //{{{
+      {
+        var xsize = x2 - x1,
+            ysize = y2 - y1,
+            delta;
+
+        if (xlimit && (Math.abs(xsize) > xlimit)) {
+          x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);
+        }
+        if (ylimit && (Math.abs(ysize) > ylimit)) {
+          y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);
+        }
+
+        if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) {
+          y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale);
+        }
+        if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) {
+          x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale);
+        }
+
+        if (x1 < 0) {
+          x2 -= x1;
+          x1 -= x1;
+        }
+        if (y1 < 0) {
+          y2 -= y1;
+          y1 -= y1;
+        }
+        if (x2 < 0) {
+          x1 -= x2;
+          x2 -= x2;
+        }
+        if (y2 < 0) {
+          y1 -= y2;
+          y2 -= y2;
+        }
+        if (x2 > boundx) {
+          delta = x2 - boundx;
+          x1 -= delta;
+          x2 -= delta;
+        }
+        if (y2 > boundy) {
+          delta = y2 - boundy;
+          y1 -= delta;
+          y2 -= delta;
+        }
+        if (x1 > boundx) {
+          delta = x1 - boundy;
+          y2 -= delta;
+          y1 -= delta;
+        }
+        if (y1 > boundy) {
+          delta = y1 - boundy;
+          y2 -= delta;
+          y1 -= delta;
+        }
+
+        return makeObj(flipCoords(x1, y1, x2, y2));
+      }
+      //}}}
+      function makeObj(a) //{{{
+      {
+        return {
+          x: a[0],
+          y: a[1],
+          x2: a[2],
+          y2: a[3],
+          w: a[2] - a[0],
+          h: a[3] - a[1]
+        };
+      }
+      //}}}
+
+      return {
+        flipCoords: flipCoords,
+        setPressed: setPressed,
+        setCurrent: setCurrent,
+        getOffset: getOffset,
+        moveOffset: moveOffset,
+        getCorner: getCorner,
+        getFixed: getFixed
+      };
+    }());
+
+    //}}}
+    // Selection Module {{{
+    var Selection = (function () {
+      var awake, hdep = 370;
+      var borders = {};
+      var handle = {};
+      var seehandles = false;
+      var hhs = options.handleOffset;
+
+      // Private Methods
+      function insertBorder(type) //{{{
+      {
+        var jq = $('<div />').css({
+          position: 'absolute',
+          opacity: options.borderOpacity
+        }).addClass(cssClass(type));
+        $img_holder.append(jq);
+        return jq;
+      }
+      //}}}
+      function dragDiv(ord, zi) //{{{
+      {
+        var jq = $('<div />').mousedown(createDragger(ord)).css({
+          cursor: ord + '-resize',
+          position: 'absolute',
+          zIndex: zi
+        });
+
+        if (Touch.support) {
+          jq.bind('touchstart', Touch.createDragger(ord));
+        }
+
+        $hdl_holder.append(jq);
+        return jq;
+      }
+      //}}}
+      function insertHandle(ord) //{{{
+      {
+        return dragDiv(ord, hdep++).css({
+          top: px(-hhs + 1),
+          left: px(-hhs + 1),
+          opacity: options.handleOpacity
+        }).addClass(cssClass('handle'));
+      }
+      //}}}
+      function insertDragbar(ord) //{{{
+      {
+        var s = options.handleSize,
+            h = s,
+            w = s,
+            t = hhs,
+            l = hhs;
+
+        switch (ord) {
+        case 'n':
+        case 's':
+          w = pct(100);
+          break;
+        case 'e':
+        case 'w':
+          h = pct(100);
+          break;
+        }
+
+        return dragDiv(ord, hdep++).width(w).height(h).css({
+          top: px(-t + 1),
+          left: px(-l + 1)
+        });
+      }
+      //}}}
+      function createHandles(li) //{{{
+      {
+        var i;
+        for (i = 0; i < li.length; i++) {
+          handle[li[i]] = insertHandle(li[i]);
+        }
+      }
+      //}}}
+      function moveHandles(c) //{{{
+      {
+        var midvert = Math.round((c.h / 2) - hhs),
+            midhoriz = Math.round((c.w / 2) - hhs),
+            north = -hhs + 1,
+            west = -hhs + 1,
+            east = c.w - hhs,
+            south = c.h - hhs,
+            x, y;
+
+        if (handle.e) {
+          handle.e.css({
+            top: px(midvert),
+            left: px(east)
+          });
+          handle.w.css({
+            top: px(midvert)
+          });
+          handle.s.css({
+            top: px(south),
+            left: px(midhoriz)
+          });
+          handle.n.css({
+            left: px(midhoriz)
+          });
+        }
+        if (handle.ne) {
+          handle.ne.css({
+            left: px(east)
+          });
+          handle.se.css({
+            top: px(south),
+            left: px(east)
+          });
+          handle.sw.css({
+            top: px(south)
+          });
+        }
+        if (handle.b) {
+          handle.b.css({
+            top: px(south)
+          });
+          handle.r.css({
+            left: px(east)
+          });
+        }
+      }
+      //}}}
+      function moveto(x, y) //{{{
+      {
+        $img2.css({
+          top: px(-y),
+          left: px(-x)
+        });
+        $sel.css({
+          top: px(y),
+          left: px(x)
+        });
+      }
+      //}}}
+      function resize(w, h) //{{{
+      {
+        $sel.width(w).height(h);
+      }
+      //}}}
+      function refresh() //{{{
+      {
+        var c = Coords.getFixed();
+
+        Coords.setPressed([c.x, c.y]);
+        Coords.setCurrent([c.x2, c.y2]);
+
+        updateVisible();
+      }
+      //}}}
+
+      // Internal Methods
+      function updateVisible() //{{{
+      {
+        if (awake) {
+          return update();
+        }
+      }
+      //}}}
+      function update() //{{{
+      {
+        var c = Coords.getFixed();
+
+        resize(c.w, c.h);
+        moveto(c.x, c.y);
+
+/*
+			options.drawBorders &&
+				borders.right.css({ left: px(c.w-1) }) &&
+					borders.bottom.css({ top: px(c.h-1) });
+      */
+
+        if (seehandles) {
+          moveHandles(c);
+        }
+        if (!awake) {
+          show();
+        }
+
+        options.onChange.call(api, unscale(c));
+      }
+      //}}}
+      function show() //{{{
+      {
+        $sel.show();
+
+        if (options.bgFade) {
+          $img.fadeTo(options.fadeTime, bgopacity);
+        } else {
+          $img.css('opacity', bgopacity);
+        }
+
+        awake = true;
+      }
+      //}}}
+      function release() //{{{
+      {
+        disableHandles();
+        $sel.hide();
+
+        if (options.bgFade) {
+          $img.fadeTo(options.fadeTime, 1);
+        } else {
+          $img.css('opacity', 1);
+        }
+
+        awake = false;
+        options.onRelease.call(api);
+      }
+      //}}}
+      function showHandles() //{{{
+      {
+        if (seehandles) {
+          moveHandles(Coords.getFixed());
+          $hdl_holder.show();
+        }
+      }
+      //}}}
+      function enableHandles() //{{{
+      {
+        seehandles = true;
+        if (options.allowResize) {
+          moveHandles(Coords.getFixed());
+          $hdl_holder.show();
+          return true;
+        }
+      }
+      //}}}
+      function disableHandles() //{{{
+      {
+        seehandles = false;
+        $hdl_holder.hide();
+      } 
+      //}}}
+      function animMode(v) //{{{
+      {
+        if (animating === v) {
+          disableHandles();
+        } else {
+          enableHandles();
+        }
+      } 
+      //}}}
+      function done() //{{{
+      {
+        animMode(false);
+        refresh();
+      } 
+      //}}}
+      /* Insert draggable elements {{{*/
+
+      // Insert border divs for outline
+      if (options.drawBorders) {
+        borders = {
+          top: insertBorder('hline'),
+          bottom: insertBorder('hline bottom'),
+          left: insertBorder('vline'),
+          right: insertBorder('vline right')
+        };
+      }
+
+      // Insert handles on edges
+      if (options.dragEdges) {
+        handle.t = insertDragbar('n');
+        handle.b = insertDragbar('s');
+        handle.r = insertDragbar('e');
+        handle.l = insertDragbar('w');
+      }
+
+      // Insert side and corner handles
+      if (options.sideHandles) {
+        createHandles(['n', 's', 'e', 'w']);
+      }
+      if (options.cornerHandles) {
+        createHandles(['sw', 'nw', 'ne', 'se']);
+      }
+
+      
+      //}}}
+
+      var $track = newTracker().mousedown(createDragger('move')).css({
+        cursor: 'move',
+        position: 'absolute',
+        zIndex: 360
+      });
+
+      if (Touch.support) {
+        $track.bind('touchstart.jcrop', Touch.createDragger('move'));
+      }
+
+      $img_holder.append($track);
+      disableHandles();
+
+      return {
+        updateVisible: updateVisible,
+        update: update,
+        release: release,
+        refresh: refresh,
+        isAwake: function () {
+          return awake;
+        },
+        setCursor: function (cursor) {
+          $track.css('cursor', cursor);
+        },
+        enableHandles: enableHandles,
+        enableOnly: function () {
+          seehandles = true;
+        },
+        showHandles: showHandles,
+        disableHandles: disableHandles,
+        animMode: animMode,
+        done: done
+      };
+    }());
+    
+    //}}}
+    // Tracker Module {{{
+    var Tracker = (function () {
+      var onMove = function () {},
+          onDone = function () {},
+          trackDoc = options.trackDocument;
+
+      function toFront() //{{{
+      {
+        $trk.css({
+          zIndex: 450
+        });
+        if (trackDoc) {
+          $(document)
+            .bind('mousemove',trackMove)
+            .bind('mouseup',trackUp);
+        }
+      } 
+      //}}}
+      function toBack() //{{{
+      {
+        $trk.css({
+          zIndex: 290
+        });
+        if (trackDoc) {
+          $(document)
+            .unbind('mousemove', trackMove)
+            .unbind('mouseup', trackUp);
+        }
+      } 
+      //}}}
+      function trackMove(e) //{{{
+      {
+        onMove(mouseAbs(e));
+        return false;
+      } 
+      //}}}
+      function trackUp(e) //{{{
+      {
+        e.preventDefault();
+        e.stopPropagation();
+
+        if (btndown) {
+          btndown = false;
+
+          onDone(mouseAbs(e));
+
+          if (Selection.isAwake()) {
+            options.onSelect.call(api, unscale(Coords.getFixed()));
+          }
+
+          toBack();
+          onMove = function () {};
+          onDone = function () {};
+        }
+
+        return false;
+      }
+      //}}}
+      function activateHandlers(move, done) //{{{
+      {
+        btndown = true;
+        onMove = move;
+        onDone = done;
+        toFront();
+        return false;
+      }
+      //}}}
+      function trackTouchMove(e) //{{{
+      {
+        e.pageX = e.originalEvent.changedTouches[0].pageX;
+        e.pageY = e.originalEvent.changedTouches[0].pageY;
+        return trackMove(e);
+      }
+      //}}}
+      function trackTouchEnd(e) //{{{
+      {
+        e.pageX = e.originalEvent.changedTouches[0].pageX;
+        e.pageY = e.originalEvent.changedTouches[0].pageY;
+        return trackUp(e);
+      }
+      //}}}
+      function setCursor(t) //{{{
+      {
+        $trk.css('cursor', t);
+      }
+      //}}}
+
+      if (Touch.support) {
+        $(document)
+          .bind('touchmove', trackTouchMove)
+          .bind('touchend', trackTouchEnd);
+      }
+
+      if (!trackDoc) {
+        $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);
+      }
+
+      $img.before($trk);
+      return {
+        activateHandlers: activateHandlers,
+        setCursor: setCursor
+      };
+    }());
+    //}}}
+    // KeyManager Module {{{
+    var KeyManager = (function () {
+      var $keymgr = $('<input type="radio" />').css({
+        position: 'fixed',
+        left: '-120px',
+        width: '12px'
+      }),
+          $keywrap = $('<div />').css({
+          position: 'absolute',
+          overflow: 'hidden'
+        }).append($keymgr);
+
+      function watchKeys() //{{{
+      {
+        if (options.keySupport) {
+          $keymgr.show();
+          $keymgr.focus();
+        }
+      }
+      //}}}
+      function onBlur(e) //{{{
+      {
+        $keymgr.hide();
+      }
+      //}}}
+      function doNudge(e, x, y) //{{{
+      {
+        if (options.allowMove) {
+          Coords.moveOffset([x, y]);
+          Selection.updateVisible();
+        }
+        e.preventDefault();
+        e.stopPropagation();
+      }
+      //}}}
+      function parseKey(e) //{{{
+      {
+        if (e.ctrlKey) {
+          return true;
+        }
+        shift_down = e.shiftKey ? true : false;
+        var nudge = shift_down ? 10 : 1;
+
+        switch (e.keyCode) {
+        case 37:
+          doNudge(e, -nudge, 0);
+          break;
+        case 39:
+          doNudge(e, nudge, 0);
+          break;
+        case 38:
+          doNudge(e, 0, -nudge);
+          break;
+        case 40:
+          doNudge(e, 0, nudge);
+          break;
+        case 27:
+          Selection.release();
+          break;
+        case 9:
+          return true;
+        }
+
+        return false;
+      }
+      //}}}
+
+      if (options.keySupport) {
+        $keymgr.keydown(parseKey).blur(onBlur);
+        if (ie6mode || !options.fixedSupport) {
+          $keymgr.css({
+            position: 'absolute',
+            left: '-20px'
+          });
+          $keywrap.append($keymgr).insertBefore($img);
+        } else {
+          $keymgr.insertBefore($img);
+        }
+      }
+
+
+      return {
+        watchKeys: watchKeys
+      };
+    }());
+    //}}}
+    // }}}
+    // API methods {{{
+    function setClass(cname) //{{{
+    {
+      $div.removeClass().addClass(cssClass('holder')).addClass(cname);
+    }
+    //}}}
+    function animateTo(a, callback) //{{{
+    {
+      var x1 = parseInt(a[0], 10) / xscale,
+          y1 = parseInt(a[1], 10) / yscale,
+          x2 = parseInt(a[2], 10) / xscale,
+          y2 = parseInt(a[3], 10) / yscale;
+
+      if (animating) {
+        return;
+      }
+
+      var animto = Coords.flipCoords(x1, y1, x2, y2),
+          c = Coords.getFixed(),
+          initcr = [c.x, c.y, c.x2, c.y2],
+          animat = initcr,
+          interv = options.animationDelay,
+          ix1 = animto[0] - initcr[0],
+          iy1 = animto[1] - initcr[1],
+          ix2 = animto[2] - initcr[2],
+          iy2 = animto[3] - initcr[3],
+          pcent = 0,
+          velocity = options.swingSpeed;
+
+      x = animat[0];
+      y = animat[1];
+      x2 = animat[2];
+      y2 = animat[3];
+
+      Selection.animMode(true);
+      var anim_timer;
+
+      function queueAnimator() {
+        window.setTimeout(animator, interv);
+      }
+      var animator = (function () {
+        return function () {
+          pcent += (100 - pcent) / velocity;
+
+          animat[0] = x + ((pcent / 100) * ix1);
+          animat[1] = y + ((pcent / 100) * iy1);
+          animat[2] = x2 + ((pcent / 100) * ix2);
+          animat[3] = y2 + ((pcent / 100) * iy2);
+
+          if (pcent >= 99.8) {
+            pcent = 100;
+          }
+          if (pcent < 100) {
+            setSelectRaw(animat);
+            queueAnimator();
+          } else {
+            Selection.done();
+            if (typeof(callback) === 'function') {
+              callback.call(api);
+            }
+          }
+        };
+      }());
+      queueAnimator();
+    }
+    //}}}
+    function setSelect(rect) //{{{
+    {
+      setSelectRaw([
+      parseInt(rect[0], 10) / xscale, parseInt(rect[1], 10) / yscale, parseInt(rect[2], 10) / xscale, parseInt(rect[3], 10) / yscale]);
+    }
+    //}}}
+    function setSelectRaw(l) //{{{
+    {
+      Coords.setPressed([l[0], l[1]]);
+      Coords.setCurrent([l[2], l[3]]);
+      Selection.update();
+    }
+    //}}}
+    function tellSelect() //{{{
+    {
+      return unscale(Coords.getFixed());
+    }
+    //}}}
+    function tellScaled() //{{{
+    {
+      return Coords.getFixed();
+    }
+    //}}}
+    function setOptionsNew(opt) //{{{
+    {
+      setOptions(opt);
+      interfaceUpdate();
+    }
+    //}}}
+    function disableCrop() //{{{
+    {
+      options.disabled = true;
+      Selection.disableHandles();
+      Selection.setCursor('default');
+      Tracker.setCursor('default');
+    }
+    //}}}
+    function enableCrop() //{{{
+    {
+      options.disabled = false;
+      interfaceUpdate();
+    }
+    //}}}
+    function cancelCrop() //{{{
+    {
+      Selection.done();
+      Tracker.activateHandlers(null, null);
+    }
+    //}}}
+    function destroy() //{{{
+    {
+      $div.remove();
+      $origimg.show();
+      $(obj).removeData('Jcrop');
+    }
+    //}}}
+    function setImage(src, callback) //{{{
+    {
+      Selection.release();
+      disableCrop();
+      var img = new Image();
+      img.onload = function () {
+        var iw = img.width;
+        var ih = img.height;
+        var bw = options.boxWidth;
+        var bh = options.boxHeight;
+        $img.width(iw).height(ih);
+        $img.attr('src', src);
+        $img2.attr('src', src);
+        presize($img, bw, bh);
+        boundx = $img.width();
+        boundy = $img.height();
+        $img2.width(boundx).height(boundy);
+        $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2));
+        $div.width(boundx).height(boundy);
+        enableCrop();
+
+        if (typeof(callback) === 'function') {
+          callback.call(api);
+        }
+      };
+      img.src = src;
+    }
+    //}}}
+    function interfaceUpdate(alt) //{{{
+    // This method tweaks the interface based on options object.
+    // Called when options are changed and at end of initialization.
+    {
+      if (options.allowResize) {
+        if (alt) {
+          Selection.enableOnly();
+        } else {
+          Selection.enableHandles();
+        }
+      } else {
+        Selection.disableHandles();
+      }
+
+      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
+      Selection.setCursor(options.allowMove ? 'move' : 'default');
+
+
+      if (options.hasOwnProperty('setSelect')) {
+        setSelect(options.setSelect);
+        Selection.done();
+        delete(options.setSelect);
+      }
+
+      if (options.hasOwnProperty('trueSize')) {
+        xscale = options.trueSize[0] / boundx;
+        yscale = options.trueSize[1] / boundy;
+      }
+      if (options.hasOwnProperty('bgColor')) {
+
+        if (supportsColorFade() && options.fadeTime) {
+          $div.animate({
+            backgroundColor: options.bgColor
+          }, {
+            queue: false,
+            duration: options.fadeTime
+          });
+        } else {
+          $div.css('backgroundColor', options.bgColor);
+        }
+
+        delete(options.bgColor);
+      }
+      if (options.hasOwnProperty('bgOpacity')) {
+        bgopacity = options.bgOpacity;
+
+        if (Selection.isAwake()) {
+          if (options.fadeTime) {
+            $img.fadeTo(options.fadeTime, bgopacity);
+          } else {
+            $div.css('opacity', options.opacity);
+          }
+        }
+        delete(options.bgOpacity);
+      }
+
+      xlimit = options.maxSize[0] || 0;
+      ylimit = options.maxSize[1] || 0;
+      xmin = options.minSize[0] || 0;
+      ymin = options.minSize[1] || 0;
+
+      if (options.hasOwnProperty('outerImage')) {
+        $img.attr('src', options.outerImage);
+        delete(options.outerImage);
+      }
+
+      Selection.refresh();
+    }
+    //}}}
+    //}}}
+
+    if (Touch.support) {
+      $trk.bind('touchstart', Touch.newSelection);
+    }
+
+    $hdl_holder.hide();
+    interfaceUpdate(true);
+
+    var api = {
+      setImage: setImage,
+      animateTo: animateTo,
+      setSelect: setSelect,
+      setOptions: setOptionsNew,
+      tellSelect: tellSelect,
+      tellScaled: tellScaled,
+      setClass: setClass,
+
+      disable: disableCrop,
+      enable: enableCrop,
+      cancel: cancelCrop,
+      release: Selection.release,
+      destroy: destroy,
+
+      focus: KeyManager.watchKeys,
+
+      getBounds: function () {
+        return [boundx * xscale, boundy * yscale];
+      },
+      getWidgetSize: function () {
+        return [boundx, boundy];
+      },
+      getScaleFactor: function () {
+        return [xscale, yscale];
+      },
+
+      ui: {
+        holder: $div,
+        selection: $sel
+      }
+    };
+
+    if ($.browser.msie) {
+      $div.bind('selectstart', function () {
+        return false;
+      });
+    }
+
+    $origimg.data('Jcrop', api);
+    return api;
+  };
+  $.fn.Jcrop = function (options, callback) //{{{
+  {
+
+    function attachWhenDone(from) //{{{
+    {
+      var opt = (typeof(options) === 'object') ? options : {};
+      var loadsrc = opt.useImg || from.src;
+      var img = new Image();
+      img.onload = function () {
+        function attachJcrop() {
+          var api = $.Jcrop(from, opt);
+          if (typeof(callback) === 'function') {
+            callback.call(api);
+          }
+        }
+
+        function attachAttempt() {
+          if (!img.width || !img.height) {
+            window.setTimeout(attachAttempt, 50);
+          } else {
+            attachJcrop();
+          }
+        }
+        window.setTimeout(attachAttempt, 50);
+      };
+      img.src = loadsrc;
+    }
+    //}}}
+
+    // Iterate over each object, attach Jcrop
+    this.each(function () {
+      // If we've already attached to this object
+      if ($(this).data('Jcrop')) {
+        // The API can be requested this way (undocumented)
+        if (options === 'api') {
+          return $(this).data('Jcrop');
+        }
+        // Otherwise, we just reset the options...
+        else {
+          $(this).data('Jcrop').setOptions(options);
+        }
+      }
+      // If we haven't been attached, preload and attach
+      else {
+        attachWhenDone(this);
+      }
+    });
+
+    // Return "this" so the object is chainable (jQuery-style)
+    return this;
+  };
+  //}}}
+  // Global Defaults {{{
+  $.Jcrop.defaults = {
+
+    // Basic Settings
+    allowSelect: true,
+    allowMove: true,
+    allowResize: true,
+
+    trackDocument: true,
+
+    // Styling Options
+    baseClass: 'jcrop',
+    addClass: null,
+    bgColor: 'black',
+    bgOpacity: 0.6,
+    bgFade: false,
+    borderOpacity: 0.4,
+    handleOpacity: 0.5,
+    handleSize: 9,
+    handleOffset: 5,
+
+    aspectRatio: 0,
+    keySupport: true,
+    cornerHandles: true,
+    sideHandles: true,
+    drawBorders: true,
+    dragEdges: true,
+    fixedSupport: true,
+    touchSupport: null,
+
+    boxWidth: 0,
+    boxHeight: 0,
+    boundary: 2,
+    fadeTime: 400,
+    animationDelay: 20,
+    swingSpeed: 3,
+
+    minSelect: [0, 0],
+    maxSize: [0, 0],
+    minSize: [0, 0],
+
+    // Callbacks / Event Handlers
+    onChange: function () {},
+    onSelect: function () {},
+    onRelease: function () {}
+  };
+
+  // }}}
+}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.Jcrop.min.js	(revision 14585)
@@ -0,0 +1,246 @@
+/**
+ * jquery.Jcrop.min.js v0.9.9 (build:20110607)
+ * jQuery Image Cropping Plugin
+ * @author Kelly Hallman <khallman@gmail.com>
+ * Copyright (c) 2008-2011 Kelly Hallman - released under MIT License
+ * https://github.com/tapmodo/Jcrop
+ */
+
+(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,lastcurs,ie6mode=false;function px(n){return parseInt(n,10)+'px';}
+function pct(n){return parseInt(n,10)+'%';}
+function cssClass(cl){return options.baseClass+'-'+cl;}
+function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');}
+function getPos(obj)
+{var pos=$(obj).offset();return[pos.left,pos.top];}
+function mouseAbs(e)
+{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];}
+function setOptions(opt)
+{if(typeof(opt)!=='object'){opt={};}
+options=$.extend(options,opt);if(typeof(options.onChange)!=='function'){options.onChange=function(){};}
+if(typeof(options.onSelect)!=='function'){options.onSelect=function(){};}
+if(typeof(options.onRelease)!=='function'){options.onRelease=function(){};}}
+function myCursor(type)
+{if(type!==lastcurs){Tracker.setCursor(type);lastcurs=type;}}
+function startDragMode(mode,pos)
+{docOffset=getPos($img);Tracker.setCursor(mode==='move'?mode:mode+'-resize');if(mode==='move'){return Tracker.activateHandlers(createMover(pos),doneSelect);}
+var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);}
+function dragmodeHandler(mode,f)
+{return function(pos){if(!options.aspectRatio){switch(mode){case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}}else{switch(mode){case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}}
+Coords.setCurrent(pos);Selection.update();};}
+function createMover(pos)
+{var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};}
+function oppLockCorner(ord)
+{switch(ord){case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';}}
+function createDragger(ord)
+{return function(e){if(options.disabled){return false;}
+if((ord==='move')&&!options.allowMove){return false;}
+btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};}
+function presize($obj,w,h)
+{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();}
+if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();}
+xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);}
+function unscale(c)
+{return{x:parseInt(c.x*xscale,10),y:parseInt(c.y*yscale,10),x2:parseInt(c.x2*xscale,10),y2:parseInt(c.y2*yscale,10),w:parseInt(c.w*xscale,10),h:parseInt(c.h*yscale,10)};}
+function doneSelect(pos)
+{var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();}
+Tracker.setCursor(options.allowSelect?'crosshair':'default');}
+function newSelection(e)
+{if(options.disabled){return false;}
+if(!options.allowSelect){return false;}
+btndown=true;docOffset=getPos($img);Selection.disableHandles();myCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;}
+function selectDrag(pos)
+{Coords.setCurrent(pos);Selection.update();}
+function newTracker()
+{var trk=$('<div></div>').addClass(cssClass('tracker'));if($.browser.msie){trk.css({opacity:0,backgroundColor:'white'});}
+return trk;}
+if($.browser.msie&&($.browser.version.split('.')[0]==='6')){ie6mode=true;}
+if(typeof(obj)!=='object'){obj=$(obj)[0];}
+if(typeof(opt)!=='object'){opt={};}
+setOptions(opt);var img_css={border:'none',margin:0,padding:0,position:'absolute'};var $origimg=$(obj);var $img=$origimg.clone().removeAttr('id').css(img_css);$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);delete(options.bgColor);if(options.addClass){$div.addClass(options.addClass);}
+var $img2=$('<img />').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder=$('<div />').width(pct(100)).height(pct(100)).css({zIndex:310,position:'absolute',overflow:'hidden'}).append($img2),$hdl_holder=$('<div />').width(pct(100)).height(pct(100)).css('zIndex',320),$sel=$('<div />').css({position:'absolute',zIndex:300}).insertBefore($img).append($img_holder,$hdl_holder);if(ie6mode){$sel.css({overflowY:'hidden'});}
+var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;i<events.length;i++){var eventName=events[i];eventName='on'+eventName;var isSupported=(eventName in el);if(!isSupported){el.setAttribute(eventName,'return;');isSupported=typeof el[eventName]=='function';}
+support[events[i]]=isSupported;}
+return support.touchstart&&support.touchend&&support.touchmove;}
+catch(err){return false;}}
+function detectSupport(){if((options.touchSupport===true)||(options.touchSupport===false))return options.touchSupport;else return hasTouchSupport();}
+return{createDragger:function(ord){return function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;if(options.disabled){return false;}
+if((ord==='move')&&!options.allowMove){return false;}
+btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};},newSelection:function(e){e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return newSelection(e);},isSupported:hasTouchSupport,support:detectSupport()};}());var Coords=(function(){var x1=0,y1=0,x2=0,y2=0,ox,oy;function setPressed(pos)
+{pos=rebound(pos);x2=x1=pos[0];y2=y1=pos[1];}
+function setCurrent(pos)
+{pos=rebound(pos);ox=pos[0]-x2;oy=pos[1]-y2;x2=pos[0];y2=pos[1];}
+function getOffset()
+{return[ox,oy];}
+function moveOffset(offset)
+{var ox=offset[0],oy=offset[1];if(0>x1+ox){ox-=ox+x1;}
+if(0>y1+oy){oy-=oy+y1;}
+if(boundy<y2+oy){oy+=boundy-(y2+oy);}
+if(boundx<x2+ox){ox+=boundx-(x2+ox);}
+x1+=ox;x2+=ox;y1+=oy;y2+=oy;}
+function getCorner(ord)
+{var c=getFixed();switch(ord){case'ne':return[c.x2,c.y];case'nw':return[c.x,c.y];case'se':return[c.x2,c.y2];case'sw':return[c.x,c.y2];}}
+function getFixed()
+{if(!options.aspectRatio){return getRect();}
+var aspect=options.aspectRatio,min_x=options.minSize[0]/xscale,max_x=options.maxSize[0]/xscale,max_y=options.maxSize[1]/yscale,rw=x2-x1,rh=y2-y1,rwa=Math.abs(rw),rha=Math.abs(rh),real_ratio=rwa/rha,xx,yy;if(max_x===0){max_x=boundx*10;}
+if(max_y===0){max_y=boundy*10;}
+if(real_ratio<aspect){yy=y2;w=rha*aspect;xx=rw<0?x1-w:w+x1;if(xx<0){xx=0;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}else if(xx>boundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}}
+if(xx>x1){if(xx-x1<min_x){xx=x1+min_x;}else if(xx-x1>max_x){xx=x1+max_x;}
+if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xx<x1){if(x1-xx<min_x){xx=x1-min_x;}else if(x1-xx>max_x){xx=x1-max_x;}
+if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}}
+if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;}
+if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;}
+return makeObj(flipCoords(x1,y1,xx,yy));}
+function rebound(p)
+{if(p[0]<0){p[0]=0;}
+if(p[1]<0){p[1]=0;}
+if(p[0]>boundx){p[0]=boundx;}
+if(p[1]>boundy){p[1]=boundy;}
+return[p[0],p[1]];}
+function flipCoords(x1,y1,x2,y2)
+{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2<x1){xa=x2;xb=x1;}
+if(y2<y1){ya=y2;yb=y1;}
+return[Math.round(xa),Math.round(ya),Math.round(xb),Math.round(yb)];}
+function getRect()
+{var xsize=x2-x1,ysize=y2-y1,delta;if(xlimit&&(Math.abs(xsize)>xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);}
+if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit);}
+if(ymin/yscale&&(Math.abs(ysize)<ymin/yscale)){y2=(ysize>0)?(y1+ymin/yscale):(y1-ymin/yscale);}
+if(xmin/xscale&&(Math.abs(xsize)<xmin/xscale)){x2=(xsize>0)?(x1+xmin/xscale):(x1-xmin/xscale);}
+if(x1<0){x2-=x1;x1-=x1;}
+if(y1<0){y2-=y1;y1-=y1;}
+if(x2<0){x1-=x2;x2-=x2;}
+if(y2<0){y1-=y2;y2-=y2;}
+if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;}
+if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;}
+if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;}
+if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;}
+return makeObj(flipCoords(x1,y1,x2,y2));}
+function makeObj(a)
+{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};}
+return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Selection=(function(){var awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;function insertBorder(type)
+{var jq=$('<div />').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;}
+function dragDiv(ord,zi)
+{var jq=$('<div />').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi});if(Touch.support){jq.bind('touchstart',Touch.createDragger(ord));}
+$hdl_holder.append(jq);return jq;}
+function insertHandle(ord)
+{return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).addClass(cssClass('handle'));}
+function insertDragbar(ord)
+{var s=options.handleSize,h=s,w=s,t=hhs,l=hhs;switch(ord){case'n':case's':w=pct(100);break;case'e':case'w':h=pct(100);break;}
+return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});}
+function createHandles(li)
+{var i;for(i=0;i<li.length;i++){handle[li[i]]=insertHandle(li[i]);}}
+function moveHandles(c)
+{var midvert=Math.round((c.h/2)-hhs),midhoriz=Math.round((c.w/2)-hhs),north=-hhs+1,west=-hhs+1,east=c.w-hhs,south=c.h-hhs,x,y;if(handle.e){handle.e.css({top:px(midvert),left:px(east)});handle.w.css({top:px(midvert)});handle.s.css({top:px(south),left:px(midhoriz)});handle.n.css({left:px(midhoriz)});}
+if(handle.ne){handle.ne.css({left:px(east)});handle.se.css({top:px(south),left:px(east)});handle.sw.css({top:px(south)});}
+if(handle.b){handle.b.css({top:px(south)});handle.r.css({left:px(east)});}}
+function moveto(x,y)
+{$img2.css({top:px(-y),left:px(-x)});$sel.css({top:px(y),left:px(x)});}
+function resize(w,h)
+{$sel.width(w).height(h);}
+function refresh()
+{var c=Coords.getFixed();Coords.setPressed([c.x,c.y]);Coords.setCurrent([c.x2,c.y2]);updateVisible();}
+function updateVisible()
+{if(awake){return update();}}
+function update()
+{var c=Coords.getFixed();resize(c.w,c.h);moveto(c.x,c.y);if(seehandles){moveHandles(c);}
+if(!awake){show();}
+options.onChange.call(api,unscale(c));}
+function show()
+{$sel.show();if(options.bgFade){$img.fadeTo(options.fadeTime,bgopacity);}else{$img.css('opacity',bgopacity);}
+awake=true;}
+function release()
+{disableHandles();$sel.hide();if(options.bgFade){$img.fadeTo(options.fadeTime,1);}else{$img.css('opacity',1);}
+awake=false;options.onRelease.call(api);}
+function showHandles()
+{if(seehandles){moveHandles(Coords.getFixed());$hdl_holder.show();}}
+function enableHandles()
+{seehandles=true;if(options.allowResize){moveHandles(Coords.getFixed());$hdl_holder.show();return true;}}
+function disableHandles()
+{seehandles=false;$hdl_holder.hide();}
+function animMode(v)
+{if(animating===v){disableHandles();}else{enableHandles();}}
+function done()
+{animMode(false);refresh();}
+if(options.drawBorders){borders={top:insertBorder('hline'),bottom:insertBorder('hline bottom'),left:insertBorder('vline'),right:insertBorder('vline right')};}
+if(options.dragEdges){handle.t=insertDragbar('n');handle.b=insertDragbar('s');handle.r=insertDragbar('e');handle.l=insertDragbar('w');}
+if(options.sideHandles){createHandles(['n','s','e','w']);}
+if(options.cornerHandles){createHandles(['sw','nw','ne','se']);}
+var $track=newTracker().mousedown(createDragger('move')).css({cursor:'move',position:'absolute',zIndex:360});if(Touch.support){$track.bind('touchstart.jcrop',Touch.createDragger('move'));}
+$img_holder.append($track);disableHandles();return{updateVisible:updateVisible,update:update,release:release,refresh:refresh,isAwake:function(){return awake;},setCursor:function(cursor){$track.css('cursor',cursor);},enableHandles:enableHandles,enableOnly:function(){seehandles=true;},showHandles:showHandles,disableHandles:disableHandles,animMode:animMode,done:done};}());var Tracker=(function(){var onMove=function(){},onDone=function(){},trackDoc=options.trackDocument;function toFront()
+{$trk.css({zIndex:450});if(trackDoc){$(document).bind('mousemove',trackMove).bind('mouseup',trackUp);}}
+function toBack()
+{$trk.css({zIndex:290});if(trackDoc){$(document).unbind('mousemove',trackMove).unbind('mouseup',trackUp);}}
+function trackMove(e)
+{onMove(mouseAbs(e));return false;}
+function trackUp(e)
+{e.preventDefault();e.stopPropagation();if(btndown){btndown=false;onDone(mouseAbs(e));if(Selection.isAwake()){options.onSelect.call(api,unscale(Coords.getFixed()));}
+toBack();onMove=function(){};onDone=function(){};}
+return false;}
+function activateHandlers(move,done)
+{btndown=true;onMove=move;onDone=done;toFront();return false;}
+function trackTouchMove(e)
+{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackMove(e);}
+function trackTouchEnd(e)
+{e.pageX=e.originalEvent.changedTouches[0].pageX;e.pageY=e.originalEvent.changedTouches[0].pageY;return trackUp(e);}
+function setCursor(t)
+{$trk.css('cursor',t);}
+if(Touch.support){$(document).bind('touchmove',trackTouchMove).bind('touchend',trackTouchEnd);}
+if(!trackDoc){$trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);}
+$img.before($trk);return{activateHandlers:activateHandlers,setCursor:setCursor};}());var KeyManager=(function(){var $keymgr=$('<input type="radio" />').css({position:'fixed',left:'-120px',width:'12px'}),$keywrap=$('<div />').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys()
+{if(options.keySupport){$keymgr.show();$keymgr.focus();}}
+function onBlur(e)
+{$keymgr.hide();}
+function doNudge(e,x,y)
+{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible();}
+e.preventDefault();e.stopPropagation();}
+function parseKey(e)
+{if(e.ctrlKey){return true;}
+shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:Selection.release();break;case 9:return true;}
+return false;}
+if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}}
+return{watchKeys:watchKeys};}());function setClass(cname)
+{$div.removeClass().addClass(cssClass('holder')).addClass(cname);}
+function animateTo(a,callback)
+{var x1=parseInt(a[0],10)/xscale,y1=parseInt(a[1],10)/yscale,x2=parseInt(a[2],10)/xscale,y2=parseInt(a[3],10)/yscale;if(animating){return;}
+var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x=animat[0];y=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){window.setTimeout(animator,interv);}
+var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent>=99.8){pcent=100;}
+if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();}
+function setSelect(rect)
+{setSelectRaw([parseInt(rect[0],10)/xscale,parseInt(rect[1],10)/yscale,parseInt(rect[2],10)/xscale,parseInt(rect[3],10)/yscale]);}
+function setSelectRaw(l)
+{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();}
+function tellSelect()
+{return unscale(Coords.getFixed());}
+function tellScaled()
+{return Coords.getFixed();}
+function setOptionsNew(opt)
+{setOptions(opt);interfaceUpdate();}
+function disableCrop()
+{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');}
+function enableCrop()
+{options.disabled=false;interfaceUpdate();}
+function cancelCrop()
+{Selection.done();Tracker.activateHandlers(null,null);}
+function destroy()
+{$div.remove();$origimg.show();$(obj).removeData('Jcrop');}
+function setImage(src,callback)
+{Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;}
+function interfaceUpdate(alt)
+{if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();}
+Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);}
+if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;}
+if(options.hasOwnProperty('bgColor')){if(supportsColorFade()&&options.fadeTime){$div.animate({backgroundColor:options.bgColor},{queue:false,duration:options.fadeTime});}else{$div.css('backgroundColor',options.bgColor);}
+delete(options.bgColor);}
+if(options.hasOwnProperty('bgOpacity')){bgopacity=options.bgOpacity;if(Selection.isAwake()){if(options.fadeTime){$img.fadeTo(options.fadeTime,bgopacity);}else{$div.css('opacity',options.opacity);}}
+delete(options.bgOpacity);}
+xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);}
+Selection.refresh();}
+if(Touch.support){$trk.bind('touchstart',Touch.newSelection);}
+$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},ui:{holder:$div,selection:$sel}};if($.browser.msie){$div.bind('selectstart',function(){return false;});}
+$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback)
+{function attachWhenDone(from)
+{var opt=(typeof(options)==='object')?options:{};var loadsrc=opt.useImg||from.src;var img=new Image();img.onload=function(){function attachJcrop(){var api=$.Jcrop(from,opt);if(typeof(callback)==='function'){callback.call(api);}}
+function attachAttempt(){if(!img.width||!img.height){window.setTimeout(attachAttempt,50);}else{attachJcrop();}}
+window.setTimeout(attachAttempt,50);};img.src=loadsrc;}
+this.each(function(){if($(this).data('Jcrop')){if(options==='api'){return $(this).data('Jcrop');}
+else{$(this).data('Jcrop').setOptions(options);}}
+else{attachWhenDone(this);}});return this;};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true,trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:9,handleOffset:5,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onRelease:function(){}};}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.ajaxmanager.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.ajaxmanager.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.ajaxmanager.js	(revision 14585)
@@ -0,0 +1,342 @@
+/**!
+ * project-site: http://plugins.jquery.com/project/AjaxManager
+ * repository: http://github.com/aFarkas/Ajaxmanager
+ * @author Alexander Farkas
+ * @version 3.12
+ * Copyright 2010, Alexander Farkas
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ */
+
+(function($){
+	"use strict";
+	var managed = {},
+		cache   = {}
+	;
+	$.manageAjax = (function(){
+		function create(name, opts){
+			managed[name] = new $.manageAjax._manager(name, opts);
+			return managed[name];
+		}
+		
+		function destroy(name){
+			if(managed[name]){
+				managed[name].clear(true);
+				delete managed[name];
+			}
+		}
+
+		
+		var publicFns = {
+			create: create,
+			destroy: destroy
+		};
+		
+		return publicFns;
+	})();
+	
+	$.manageAjax._manager = function(name, opts){
+		this.requests = {};
+		this.inProgress = 0;
+		this.name = name;
+		this.qName = name;
+		
+		this.opts = $.extend({}, $.manageAjax.defaults, opts);
+		if(opts && opts.queue && opts.queue !== true && typeof opts.queue === 'string' && opts.queue !== 'clear'){
+			this.qName = opts.queue;
+		}
+	};
+	
+	$.manageAjax._manager.prototype = {
+		add: function(url, o){
+			if(typeof url == 'object'){
+				o = url;
+			} else if(typeof url == 'string'){
+				o = $.extend(o || {}, {url: url});
+			}
+			o = $.extend({}, this.opts, o);
+			
+			var origCom		= o.complete || $.noop,
+				origSuc		= o.success || $.noop,
+				beforeSend	= o.beforeSend || $.noop,
+				origError 	= o.error || $.noop,
+				strData 	= (typeof o.data == 'string') ? o.data : $.param(o.data || {}),
+				xhrID 		= o.type + o.url + strData,
+				that 		= this,
+				ajaxFn 		= this._createAjax(xhrID, o, origSuc, origCom)
+			;
+			if(o.preventDoubleRequests && o.queueDuplicateRequests){
+				if(o.preventDoubleRequests){
+					o.queueDuplicateRequests = false;
+				}
+				setTimeout(function(){
+					throw("preventDoubleRequests and queueDuplicateRequests can't be both true");
+				}, 0);
+			}
+			if(this.requests[xhrID] && o.preventDoubleRequests){
+				return;
+			}
+			ajaxFn.xhrID = xhrID;
+			o.xhrID = xhrID;
+			
+			o.beforeSend = function(xhr, opts){
+				var ret = beforeSend.call(this, xhr, opts);
+				if(ret === false){
+					that._removeXHR(xhrID);
+				}
+				xhr = null;
+				return ret;
+			};
+			o.complete = function(xhr, status){
+				that._complete.call(that, this, origCom, xhr, status, xhrID, o);
+				xhr = null;
+			};
+			
+			o.success = function(data, status, xhr){
+				that._success.call(that, this, origSuc, data, status, xhr, o);
+				xhr = null;
+			};
+						
+			//always add some error callback
+			o.error =  function(ahr, status, errorStr){
+				var httpStatus 	= '',
+					content 	= ''
+				;
+				if(status !== 'timeout' && ahr){
+					httpStatus = ahr.status;
+					content = ahr.responseXML || ahr.responseText;
+				}
+				if(origError) {
+					origError.call(this, ahr, status, errorStr, o);
+				} else {
+					setTimeout(function(){
+						throw status + '| status: ' + httpStatus + ' | URL: ' + o.url + ' | data: '+ strData + ' | thrown: '+ errorStr + ' | response: '+ content;
+					}, 0);
+				}
+				ahr = null;
+			};
+			
+			if(o.queue === 'clear'){
+				$(document).clearQueue(this.qName);
+			}
+			
+			if(o.queue || (o.queueDuplicateRequests && this.requests[xhrID])){
+				$.queue(document, this.qName, ajaxFn);
+				if(this.inProgress < o.maxRequests && (!this.requests[xhrID] || !o.queueDuplicateRequests)){
+					$.dequeue(document, this.qName);
+				}
+				return xhrID;
+			}
+			return ajaxFn();
+		},
+		_createAjax: function(id, o, origSuc, origCom){
+			var that = this;
+			return function(){
+				if(o.beforeCreate.call(o.context || that, id, o) === false){return;}
+				that.inProgress++;
+				if(that.inProgress === 1){
+					$.event.trigger(that.name +'AjaxStart');
+				}
+				if(o.cacheResponse && cache[id]){
+					if(!cache[id].cacheTTL || cache[id].cacheTTL < 0 || ((new Date().getTime() - cache[id].timestamp) < cache[id].cacheTTL)){
+                        that.requests[id] = {};
+                        setTimeout(function(){
+							that._success.call(that, o.context || o, origSuc, cache[id]._successData, 'success', cache[id], o);
+                        	that._complete.call(that, o.context || o, origCom, cache[id], 'success', id, o);
+                        }, 0);
+                    } else {
+						 delete cache[id];
+					}
+				} 
+				if(!o.cacheResponse || !cache[id]) {
+					if (o.async) {
+						that.requests[id] = $.ajax(o);
+					} else {
+						$.ajax(o);
+					}
+				}
+				return id;
+			};
+		},
+		_removeXHR: function(xhrID){
+			if(this.opts.queue || this.opts.queueDuplicateRequests){
+				$.dequeue(document, this.qName);
+			}
+			this.inProgress--;
+			this.requests[xhrID] = null;
+			delete this.requests[xhrID];
+		},
+		clearCache: function () {
+            cache = {};
+        },
+		_isAbort: function(xhr, status, o){
+			if(!o.abortIsNoSuccess || (!xhr && !status)){
+				return false;
+			}
+			var ret = !!(  ( !xhr || xhr.readyState === 0 || this.lastAbort === o.xhrID ) );
+			xhr = null;
+			return ret;
+		},
+		_complete: function(context, origFn, xhr, status, xhrID, o){
+			if(this._isAbort(xhr, status, o)){
+				status = 'abort';
+				o.abort.call(context, xhr, status, o);
+			}
+			origFn.call(context, xhr, status, o);
+			
+			$.event.trigger(this.name +'AjaxComplete', [xhr, status, o]);
+			
+			if(o.domCompleteTrigger){
+				$(o.domCompleteTrigger)
+					.trigger(this.name +'DOMComplete', [xhr, status, o])
+					.trigger('DOMComplete', [xhr, status, o])
+				;
+			}
+			
+			this._removeXHR(xhrID);
+			if(!this.inProgress){
+				$.event.trigger(this.name +'AjaxStop');
+			}
+			xhr = null;
+		},
+		_success: function(context, origFn, data, status, xhr, o){
+			var that = this;
+			if(this._isAbort(xhr, status, o)){
+				xhr = null;
+				return;
+			}
+			if(o.abortOld){
+				$.each(this.requests, function(name){
+					if(name === o.xhrID){
+						return false;
+					}
+					that.abort(name);
+				});
+			}
+			if(o.cacheResponse && !cache[o.xhrID]){
+				if(!xhr){
+					xhr = {};
+				}
+				cache[o.xhrID] = {
+					status: xhr.status,
+					statusText: xhr.statusText,
+					responseText: xhr.responseText,
+					responseXML: xhr.responseXML,
+					_successData: data,
+					cacheTTL: o.cacheTTL, 
+					timestamp: new Date().getTime()
+				};
+				if('getAllResponseHeaders' in xhr){
+					var responseHeaders = xhr.getAllResponseHeaders();
+					var parsedHeaders;
+					var parseHeaders = function(){
+						if(parsedHeaders){return;}
+						parsedHeaders = {};
+						$.each(responseHeaders.split("\n"), function(i, headerLine){
+							var delimiter = headerLine.indexOf(":");
+		                    parsedHeaders[headerLine.substr(0, delimiter)] = headerLine.substr(delimiter + 2);
+						});
+					};
+					$.extend(cache[o.xhrID], {
+						getAllResponseHeaders: function() {return responseHeaders;},
+						getResponseHeader: function(name) {
+							parseHeaders();
+							return (name in parsedHeaders) ? parsedHeaders[name] : null;
+						}
+					});
+				}
+			}
+			origFn.call(context, data, status, xhr, o);
+			$.event.trigger(this.name +'AjaxSuccess', [xhr, o, data]);
+			if(o.domSuccessTrigger){
+				$(o.domSuccessTrigger)
+					.trigger(this.name +'DOMSuccess', [data, o])
+					.trigger('DOMSuccess', [data, o])
+				;
+			}
+			xhr = null;
+		},
+		getData: function(id){
+			if( id ){
+				var ret = this.requests[id];
+				if(!ret && this.opts.queue) {
+					ret = $.grep($(document).queue(this.qName), function(fn, i){
+						return (fn.xhrID === id);
+					})[0];
+				}
+				return ret;
+			}
+			return {
+				requests: this.requests,
+				queue: (this.opts.queue) ? $(document).queue(this.qName) : [],
+				inProgress: this.inProgress
+			};
+		},
+		abort: function(id){
+			var xhr;
+			if(id){
+				xhr = this.getData(id);
+				
+				if(xhr && xhr.abort){
+					this.lastAbort = id;
+					xhr.abort();
+					this.lastAbort = false;
+				} else {
+					$(document).queue(
+						this.qName, $.grep($(document).queue(this.qName), function(fn, i){
+							return (fn !== xhr);
+						})
+					);
+				}
+				xhr = null;
+				return;
+			}
+			
+			var that 	= this,
+				ids 	= []
+			;
+			$.each(this.requests, function(id){
+				ids.push(id);
+			});
+			$.each(ids, function(i, id){
+				that.abort(id);
+			});
+		},
+		clear: function(shouldAbort){
+			$(document).clearQueue(this.qName); 
+			if(shouldAbort){
+				this.abort();
+			}
+		}
+	};
+	$.manageAjax._manager.prototype.getXHR = $.manageAjax._manager.prototype.getData;
+	$.manageAjax.defaults = {
+		beforeCreate: $.noop,
+		abort: $.noop,
+		abortIsNoSuccess: true,
+		maxRequests: 1,
+		cacheResponse: false,
+		async: true,
+		domCompleteTrigger: false,
+		domSuccessTrigger: false,
+		preventDoubleRequests: true,
+		queueDuplicateRequests: false,
+		cacheTTL: -1,
+		queue: false // true, false, clear
+	};
+	
+	$.each($.manageAjax._manager.prototype, function(n, fn){
+		if(n.indexOf('_') === 0 || !$.isFunction(fn)){return;}
+		$.manageAjax[n] =  function(name, o){
+			if(!managed[name]){
+				if(n === 'add'){
+					$.manageAjax.create(name, o);
+				} else {
+					return;
+				}
+			}
+			var args = Array.prototype.slice.call(arguments, 1);
+			managed[name][n].apply(managed[name], args);
+		};
+	});
+	
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.autogrow-textarea.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.autogrow-textarea.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.autogrow-textarea.js	(revision 14585)
@@ -0,0 +1,47 @@
+(function($) {
+
+    /*
+     * Auto-growing textareas; technique ripped from Facebook
+     */
+    $.fn.autogrow = function(options) {
+        
+        this.filter('textarea').each(function() {
+            
+            var $this       = $(this),
+                minHeight   = $this.height(),
+                lineHeight  = $this.css('lineHeight');
+            
+            var shadow = $('<div></div>').css({
+                position:   'absolute',
+                top:        -10000,
+                left:       -10000,
+                width:      $(this).width(),
+                fontSize:   $this.css('fontSize'),
+                fontFamily: $this.css('fontFamily'),
+                lineHeight: $this.css('lineHeight'),
+                resize:     'none'
+            }).appendTo(document.body);
+            
+            var update = function() {
+                
+                var val = this.value.replace(/</g, '&lt;')
+                                    .replace(/>/g, '&gt;')
+                                    .replace(/&/g, '&amp;')
+                                    .replace(/\n/g, '<br/>');
+                
+                shadow.html(val);
+                $(this).css('height', Math.max(shadow.height() + 20, minHeight));
+            
+            }
+            
+            $(this).change(update).keyup(update).keydown(update);
+            
+            update.apply(this);
+            
+        });
+        
+        return this;
+        
+    }
+    
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.cluetip.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.cluetip.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.cluetip.js	(revision 14585)
@@ -0,0 +1,554 @@
+/*
+ * jQuery clueTip plugin
+ * Version 1.0.7  (January 28, 2010)
+ * @requires jQuery v1.3+
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ */
+ 
+/*
+ *
+ * Full list of options/settings can be found at the bottom of this file and at http://plugins.learningjquery.com/cluetip/
+ *
+ * Examples can be found at http://plugins.learningjquery.com/cluetip/demo/
+ *
+*/
+
+;(function($) { 
+  $.cluetip = {version: '1.0.6'};
+  var $cluetip, $cluetipInner, $cluetipOuter, $cluetipTitle, $cluetipArrows, $cluetipWait, $dropShadow, imgCount;
+  
+  $.fn.cluetip = function(js, options) {
+    if (typeof js == 'object') {
+      options = js;
+      js = null;
+    }
+    if (js == 'destroy') {
+      return this.removeData('thisInfo').unbind('.cluetip');
+    }
+    return this.each(function(index) {
+      var link = this, $this = $(this);
+      
+      // support metadata plugin (v1.0 and 2.0)
+      var opts = $.extend(true, {}, $.fn.cluetip.defaults, options || {}, $.metadata ? $this.metadata() : $.meta ? $this.data() : {});
+
+      // start out with no contents (for ajax activation)
+      var cluetipContents = false;
+      var cluezIndex = +opts.cluezIndex;
+      $this.data('thisInfo', {title: link.title, zIndex: cluezIndex});
+      var isActive = false, closeOnDelay = 0;
+
+      // create the cluetip divs
+      if (!$('#cluetip').length) {
+        $(['<div id="cluetip">',
+          '<div id="cluetip-outer">',
+            '<h3 id="cluetip-title"></h3>',
+            '<div id="cluetip-inner"></div>',
+          '</div>',
+          '<div id="cluetip-extra"></div>',
+          '<div id="cluetip-arrows" class="cluetip-arrows"></div>',
+        '</div>'].join(''))
+        [insertionType](insertionElement).hide();
+        
+        $cluetip = $('#cluetip').css({position: 'absolute'});
+        $cluetipOuter = $('#cluetip-outer').css({position: 'relative', zIndex: cluezIndex});
+        $cluetipInner = $('#cluetip-inner');
+        $cluetipTitle = $('#cluetip-title');        
+        $cluetipArrows = $('#cluetip-arrows');
+        $cluetipWait = $('<div id="cluetip-waitimage"></div>')
+          .css({position: 'absolute'}).insertBefore($cluetip).hide();
+      }
+      var dropShadowSteps = (opts.dropShadow) ? +opts.dropShadowSteps : 0;
+      if (!$dropShadow) {
+        $dropShadow = $([]);
+        for (var i=0; i < dropShadowSteps; i++) {
+          $dropShadow = $dropShadow.add($('<div></div>').css({zIndex: cluezIndex-1, opacity:.1, top: 1+i, left: 1+i}));
+        }
+        $dropShadow.css({position: 'absolute', backgroundColor: '#000'})
+        .prependTo($cluetip);
+      }
+      var tipAttribute = $this.attr(opts.attribute), ctClass = opts.cluetipClass;
+      if (!tipAttribute && !opts.splitTitle && !js) {
+        return true;
+      }
+      // if hideLocal is set to true, on DOM ready hide the local content that will be displayed in the clueTip
+      if (opts.local && opts.localPrefix) {tipAttribute = opts.localPrefix + tipAttribute;}
+      if (opts.local && opts.hideLocal) { $(tipAttribute + ':first').hide(); }
+      var tOffset = parseInt(opts.topOffset, 10), lOffset = parseInt(opts.leftOffset, 10);
+      // vertical measurement variables
+      var tipHeight, wHeight,
+          defHeight = isNaN(parseInt(opts.height, 10)) ? 'auto' : (/\D/g).test(opts.height) ? opts.height : opts.height + 'px';
+      var sTop, linkTop, posY, tipY, mouseY, baseline;
+      // horizontal measurement variables
+      var tipInnerWidth = parseInt(opts.width, 10) || 275,
+          tipWidth = tipInnerWidth + (parseInt($cluetip.css('paddingLeft'),10)||0) + (parseInt($cluetip.css('paddingRight'),10)||0) + dropShadowSteps,
+          linkWidth = this.offsetWidth,
+          linkLeft, posX, tipX, mouseX, winWidth;
+            
+      // parse the title
+      var tipParts;
+      var tipTitle = (opts.attribute != 'title') ? $this.attr(opts.titleAttribute) : '';
+      if (opts.splitTitle) {
+        if (tipTitle == undefined) {tipTitle = '';}
+        tipParts = tipTitle.split(opts.splitTitle);
+        tipTitle = tipParts.shift();
+      }
+      if (opts.escapeTitle) {
+        tipTitle = tipTitle.replace(/&/g,'&amp;').replace(/>/g,'&gt;').replace(/</g,'&lt;');
+      }
+      
+      var localContent;
+      function returnFalse() { return false; }
+
+/***************************************      
+* ACTIVATION
+****************************************/
+    
+//activate clueTip
+    var activate = function(event) {
+      if (!opts.onActivate($this)) {
+        return false;
+      }
+      isActive = true;
+      $cluetip.removeClass().css({width: tipInnerWidth});
+      if (tipAttribute == $this.attr('href')) {
+        $this.css('cursor', opts.cursor);
+      }
+      if (opts.hoverClass) {
+        $this.addClass(opts.hoverClass);
+      }
+      linkTop = posY = $this.offset().top;
+      linkLeft = $this.offset().left;
+      mouseX = event.pageX;
+      mouseY = event.pageY;
+      if (link.tagName.toLowerCase() != 'area') {
+        sTop = $(document).scrollTop();
+        winWidth = $(window).width();
+      }
+// position clueTip horizontally
+      if (opts.positionBy == 'fixed') {
+        posX = linkWidth + linkLeft + lOffset;
+        $cluetip.css({left: posX});
+      } else {
+        posX = (linkWidth > linkLeft && linkLeft > tipWidth)
+          || linkLeft + linkWidth + tipWidth + lOffset > winWidth 
+          ? linkLeft - tipWidth - lOffset 
+          : linkWidth + linkLeft + lOffset;
+        if (link.tagName.toLowerCase() == 'area' || opts.positionBy == 'mouse' || linkWidth + tipWidth > winWidth) { // position by mouse
+          if (mouseX + 20 + tipWidth > winWidth) {  
+            $cluetip.addClass(' cluetip-' + ctClass);
+            posX = (mouseX - tipWidth - lOffset) >= 0 ? mouseX - tipWidth - lOffset - parseInt($cluetip.css('marginLeft'),10) + parseInt($cluetipInner.css('marginRight'),10) :  mouseX - (tipWidth/2);
+          } else {
+            posX = mouseX + lOffset;
+          }
+        }
+        var pY = posX < 0 ? event.pageY + tOffset : event.pageY;
+        $cluetip.css({
+          left: (posX > 0 && opts.positionBy != 'bottomTop') ? posX : (mouseX + (tipWidth/2) > winWidth) ? winWidth/2 - tipWidth/2 : Math.max(mouseX - (tipWidth/2),0),
+          zIndex: $this.data('thisInfo').zIndex
+        });
+        $cluetipArrows.css({zIndex: $this.data('thisInfo').zIndex+1});
+      }
+        wHeight = $(window).height();
+
+/***************************************
+* load a string from cluetip method's first argument
+***************************************/
+      if (js) {
+        if (typeof js == 'function') {
+          js = js.call(link);
+        }
+        $cluetipInner.html(js);
+        cluetipShow(pY);
+      }
+/***************************************
+* load the title attribute only (or user-selected attribute). 
+* clueTip title is the string before the first delimiter
+* subsequent delimiters place clueTip body text on separate lines
+***************************************/
+
+      else if (tipParts) {
+        var tpl = tipParts.length;
+        $cluetipInner.html(tpl ? tipParts[0] : '');
+        if (tpl > 1) {
+          for (var i=1; i < tpl; i++){
+            $cluetipInner.append('<div class="split-body">' + tipParts[i] + '</div>');
+          }          
+        }
+        cluetipShow(pY);
+      }
+/***************************************
+* load external file via ajax          
+***************************************/
+
+      else if (!opts.local && tipAttribute.indexOf('#') !== 0) {
+        if (/\.(jpe?g|tiff?|gif|png)$/i.test(tipAttribute)) {
+          $cluetipInner.html('<img src="' + tipAttribute + '" alt="' + tipTitle + '" />');
+          cluetipShow(pY);
+        } else if (cluetipContents && opts.ajaxCache) {
+          $cluetipInner.html(cluetipContents);
+          cluetipShow(pY);
+        } else {
+          var optionBeforeSend = opts.ajaxSettings.beforeSend,
+              optionError = opts.ajaxSettings.error,
+              optionSuccess = opts.ajaxSettings.success,
+              optionComplete = opts.ajaxSettings.complete;
+          var ajaxSettings = {
+            cache: false, // force requested page not to be cached by browser
+            url: tipAttribute,
+            beforeSend: function(xhr) {
+              if (optionBeforeSend) {optionBeforeSend.call(link, xhr, $cluetip, $cluetipInner);}
+              $cluetipOuter.children().empty();
+              if (opts.waitImage) {
+                $cluetipWait
+                .css({top: mouseY+20, left: mouseX+20, zIndex: $this.data('thisInfo').zIndex-1})
+                .show();
+              }
+            },
+            error: function(xhr, textStatus) {
+              if (isActive) {
+                if (optionError) {
+                  optionError.call(link, xhr, textStatus, $cluetip, $cluetipInner);
+                } else {
+                  $cluetipInner.html('<i>sorry, the contents could not be loaded</i>');  
+                }
+              }
+            },
+            success: function(data, textStatus) {       
+              cluetipContents = opts.ajaxProcess.call(link, data);
+              if (isActive) {
+                if (optionSuccess) {optionSuccess.call(link, data, textStatus, $cluetip, $cluetipInner);}
+                $cluetipInner.html(cluetipContents);
+              }
+            },
+            complete: function(xhr, textStatus) {
+              if (optionComplete) {optionComplete.call(link, xhr, textStatus, $cluetip, $cluetipInner);}
+              var imgs = $cluetipInner[0].getElementsByTagName('img');
+              imgCount = imgs.length;
+              for (var i=0, l = imgs.length; i < l; i++) {
+                if (imgs[i].complete) {
+                  imgCount--;
+                }
+              }
+              if (imgCount && !$.browser.opera) {
+                $(imgs).bind('load error', function() {
+                  imgCount--;
+                  if (imgCount<1) {
+                    $cluetipWait.hide();
+                    if (isActive) { cluetipShow(pY); }
+                  }
+                }); 
+              } else {
+                $cluetipWait.hide();
+                if (isActive) { cluetipShow(pY); }
+              } 
+            }
+          };
+          var ajaxMergedSettings = $.extend(true, {}, opts.ajaxSettings, ajaxSettings);
+          
+          $.ajax(ajaxMergedSettings);
+        }
+
+/***************************************
+* load an element from the same page
+***************************************/
+      } else if (opts.local) {
+        
+        var $localContent = $(tipAttribute + (/#\S+$/.test(tipAttribute) ? '' : ':eq(' + index + ')')).clone(true).show();
+        $cluetipInner.html($localContent);
+        cluetipShow(pY);
+      }
+    };
+
+// get dimensions and options for cluetip and prepare it to be shown
+    var cluetipShow = function(bpY) {
+      $cluetip.addClass('cluetip-' + ctClass);
+      if (opts.truncate) { 
+        var $truncloaded = $cluetipInner.text().slice(0,opts.truncate) + '...';
+        $cluetipInner.html($truncloaded);
+      }
+      function doNothing() {}; //empty function
+      tipTitle ? $cluetipTitle.show().html(tipTitle) : (opts.showTitle) ? $cluetipTitle.show().html('&nbsp;') : $cluetipTitle.hide();
+      if (opts.sticky) {
+        var $closeLink = $('<div id="cluetip-close"><a href="#">' + opts.closeText + '</a></div>');
+        (opts.closePosition == 'bottom') ? $closeLink.appendTo($cluetipInner) : (opts.closePosition == 'title') ? $closeLink.prependTo($cluetipTitle) : $closeLink.prependTo($cluetipInner);
+        $closeLink.bind('click.cluetip', function() {
+          cluetipClose();
+          return false;
+        });
+        if (opts.mouseOutClose) {
+          $cluetip.bind('mouseleave.cluetip', function() {
+            cluetipClose();
+          });
+        } else {
+          $cluetip.unbind('mouseleave.cluetip');
+        }
+      }
+// now that content is loaded, finish the positioning 
+      var direction = '';
+      $cluetipOuter.css({zIndex: $this.data('thisInfo').zIndex, overflow: defHeight == 'auto' ? 'visible' : 'auto', height: defHeight});
+      tipHeight = defHeight == 'auto' ? Math.max($cluetip.outerHeight(),$cluetip.height()) : parseInt(defHeight,10);   
+      tipY = posY;
+      baseline = sTop + wHeight;
+      if (opts.positionBy == 'fixed') {
+        tipY = posY - opts.dropShadowSteps + tOffset;
+      } else if ( (posX < mouseX && Math.max(posX, 0) + tipWidth > mouseX) || opts.positionBy == 'bottomTop') {
+        if (posY + tipHeight + tOffset > baseline && mouseY - sTop > tipHeight + tOffset) { 
+          tipY = mouseY - tipHeight - tOffset;
+          direction = 'top';
+        } else { 
+          tipY = mouseY + tOffset;
+          direction = 'bottom';
+        }
+      } else if ( posY + tipHeight + tOffset > baseline ) {
+        tipY = (tipHeight >= wHeight) ? sTop : baseline - tipHeight - tOffset;
+      } else if ($this.css('display') == 'block' || link.tagName.toLowerCase() == 'area' || opts.positionBy == "mouse") {
+        tipY = bpY - tOffset;
+      } else {
+        tipY = posY - opts.dropShadowSteps;
+      }
+      if (direction == '') {
+        posX < linkLeft ? direction = 'left' : direction = 'right';
+      }
+      $cluetip.css({top: tipY + 'px'}).removeClass().addClass('clue-' + direction + '-' + ctClass).addClass(' cluetip-' + ctClass);
+      if (opts.arrows) { // set up arrow positioning to align with element
+        var bgY = (posY - tipY - opts.dropShadowSteps);
+        $cluetipArrows.css({top: (/(left|right)/.test(direction) && posX >=0 && bgY > 0) ? bgY + 'px' : /(left|right)/.test(direction) ? 0 : ''}).show();
+      } else {
+        $cluetipArrows.hide();
+      }
+
+// (first hide, then) ***SHOW THE CLUETIP***
+      $dropShadow.hide();
+      $cluetip.hide()[opts.fx.open](opts.fx.openSpeed || 0);
+      if (opts.dropShadow) { $dropShadow.css({height: tipHeight, width: tipInnerWidth, zIndex: $this.data('thisInfo').zIndex-1}).show(); }
+      if ($.fn.bgiframe) { $cluetip.bgiframe(); }
+      // delayed close (not fully tested)
+      if (opts.delayedClose > 0) {
+        closeOnDelay = setTimeout(cluetipClose, opts.delayedClose);
+      }
+      // trigger the optional onShow function
+      opts.onShow.call(link, $cluetip, $cluetipInner);
+    };
+
+/***************************************
+   =INACTIVATION
+-------------------------------------- */
+    var inactivate = function(event) {
+      isActive = false;
+      $cluetipWait.hide();
+      if (!opts.sticky || (/click|toggle/).test(opts.activation) ) {
+        cluetipClose();
+        clearTimeout(closeOnDelay);        
+      }
+      if (opts.hoverClass) {
+        $this.removeClass(opts.hoverClass);
+      }
+    };
+// close cluetip and reset some things
+    var cluetipClose = function() {
+      $cluetipOuter 
+      .parent().hide().removeClass();
+      opts.onHide.call(link, $cluetip, $cluetipInner);
+      $this.removeClass('cluetip-clicked');
+      if (tipTitle) {
+        $this.attr(opts.titleAttribute, tipTitle);
+      }
+      $this.css('cursor','');
+      if (opts.arrows) {
+        $cluetipArrows.css({top: ''});
+      }
+    };
+
+    $(document).bind('hideCluetip', function(e) {
+      cluetipClose();
+    });
+/***************************************
+   =BIND EVENTS
+-------------------------------------- */
+  // activate by click
+      if ( (/click|toggle/).test(opts.activation) ) {
+        $this.bind('click.cluetip', function(event) {
+          if ($cluetip.is(':hidden') || !$this.is('.cluetip-clicked')) {
+            activate(event);
+            $('.cluetip-clicked').removeClass('cluetip-clicked');
+            $this.addClass('cluetip-clicked');
+          } else {
+            inactivate(event);
+          }
+          this.blur();
+          return false;
+        });
+  // activate by focus; inactivate by blur    
+      } else if (opts.activation == 'focus') {
+        $this.bind('focus.cluetip', function(event) {
+          activate(event);
+        });
+        $this.bind('blur.cluetip', function(event) {
+          inactivate(event);
+        });
+  // activate by hover
+      } else {
+        // clicking is returned false if clickThrough option is set to false
+        $this[opts.clickThrough ? 'unbind' : 'bind']('click', returnFalse);
+        //set up mouse tracking
+        var mouseTracks = function(evt) {
+          if (opts.tracking == true) {
+            var trackX = posX - evt.pageX;
+            var trackY = tipY ? tipY - evt.pageY : posY - evt.pageY;
+            $this.bind('mousemove.cluetip', function(evt) {
+              $cluetip.css({left: evt.pageX + trackX, top: evt.pageY + trackY });
+            });
+          }
+        };
+        if ($.fn.hoverIntent && opts.hoverIntent) {
+          $this.hoverIntent({
+            sensitivity: opts.hoverIntent.sensitivity,
+            interval: opts.hoverIntent.interval,  
+            over: function(event) {
+              activate(event);
+              mouseTracks(event);
+            }, 
+            timeout: opts.hoverIntent.timeout,  
+            out: function(event) {inactivate(event); $this.unbind('mousemove.cluetip');}
+          });           
+        } else {
+          $this.bind('mouseenter.cluetip', function(event) {
+            activate(event);
+            mouseTracks(event);
+          })
+          .bind('mouseleave.cluetip', function(event) {
+            inactivate(event);
+            $this.unbind('mousemove.cluetip');
+          });
+        }
+        $this.bind('mouseover.cluetip', function(event) {
+          $this.attr('title','');
+        }).bind('mouseleave.cluetip', function(event) {
+          $this.attr('title', $this.data('thisInfo').title);
+        });
+      }
+    });
+  };
+  
+/*
+ * options for clueTip
+ *
+ * each one can be explicitly overridden by changing its value. 
+ * for example: $.fn.cluetip.defaults.width = 200; 
+ * would change the default width for all clueTips to 200. 
+ *
+ * each one can also be overridden by passing an options map to the cluetip method.
+ * for example: $('a.example').cluetip({width: 200}); 
+ * would change the default width to 200 for clueTips invoked by a link with class of "example"
+ *
+ */
+  
+  $.fn.cluetip.defaults = {  // set up default options
+    width:            275,      // The width of the clueTip
+    height:           'auto',   // The height of the clueTip
+    cluezIndex:       97,       // Sets the z-index style property of the clueTip
+    positionBy:       'auto',   // Sets the type of positioning: 'auto', 'mouse','bottomTop', 'fixed'
+    topOffset:        15,       // Number of px to offset clueTip from top of invoking element
+    leftOffset:       15,       // Number of px to offset clueTip from left of invoking element
+    local:            false,    // Whether to use content from the same page for the clueTip's body
+    localPrefix:      null,       // string to be prepended to the tip attribute if local is true
+    hideLocal:        true,     // If local option is set to true, this determines whether local content
+                                // to be shown in clueTip should be hidden at its original location
+    attribute:        'rel',    // the attribute to be used for fetching the clueTip's body content
+    titleAttribute:   'title',  // the attribute to be used for fetching the clueTip's title
+    splitTitle:       '',       // A character used to split the title attribute into the clueTip title and divs
+                                // within the clueTip body. more info below [6]
+    escapeTitle:      false,    // whether to html escape the title attribute
+    showTitle:        true,     // show title bar of the clueTip, even if title attribute not set
+    cluetipClass:     'default',// class added to outermost clueTip div in the form of 'cluetip-' + clueTipClass.
+    hoverClass:       '',       // class applied to the invoking element onmouseover and removed onmouseout
+    waitImage:        true,     // whether to show a "loading" img, which is set in jquery.cluetip.css
+    cursor:           'help',
+    arrows:           false,    // if true, displays arrow on appropriate side of clueTip
+    dropShadow:       true,     // set to false if you don't want the drop-shadow effect on the clueTip
+    dropShadowSteps:  6,        // adjusts the size of the drop shadow
+    sticky:           false,    // keep visible until manually closed
+    mouseOutClose:    false,    // close when clueTip is moused out
+    activation:       'hover',  // set to 'click' to force user to click to show clueTip
+                                // set to 'focus' to show on focus of a form element and hide on blur
+    clickThrough:     false,    // if true, and activation is not 'click', then clicking on link will take user to the link's href,
+                                // even if href and tipAttribute are equal
+    tracking:         false,    // if true, clueTip will track mouse movement (experimental)
+    delayedClose:     0,        // close clueTip on a timed delay (experimental)
+    closePosition:    'top',    // location of close text for sticky cluetips; can be 'top' or 'bottom' or 'title'
+    closeText:        'Close',  // text (or HTML) to to be clicked to close sticky clueTips
+    truncate:         0,        // number of characters to truncate clueTip's contents. if 0, no truncation occurs
+    
+    // effect and speed for opening clueTips
+    fx: {             
+                      open:       'show', // can be 'show' or 'slideDown' or 'fadeIn'
+                      openSpeed:  ''
+    },     
+
+    // settings for when hoverIntent plugin is used             
+    hoverIntent: {    
+                      sensitivity:  3,
+              			  interval:     50,
+              			  timeout:      0
+    },
+
+    // short-circuit function to run just before clueTip is shown. 
+    onActivate:       function(e) {return true;},
+    // function to run just after clueTip is shown. 
+    onShow:           function(ct, ci){},
+    // function to run just after clueTip is hidden.
+    onHide:           function(ct, ci){},
+    // whether to cache results of ajax request to avoid unnecessary hits to server    
+    ajaxCache:        true,  
+
+    // process data retrieved via xhr before it's displayed
+    ajaxProcess:      function(data) {
+                        data = data.replace(/<(script|style|title)[^<]+<\/(script|style|title)>/gm, '').replace(/<(link|meta)[^>]+>/g,'');
+                        return data;
+    },                
+
+    // can pass in standard $.ajax() parameters. Callback functions, such as beforeSend, 
+    // will be queued first within the default callbacks. 
+    // The only exception is error, which overrides the default
+    ajaxSettings: {
+                      // error: function(ct, ci) { /* override default error callback */ }
+                      // beforeSend: function(ct, ci) { /* called first within default beforeSend callback }
+                      dataType: 'html'
+    },
+    debug: false
+  };
+
+
+/*
+ * Global defaults for clueTips. Apply to all calls to the clueTip plugin.
+ *
+ * @example $.cluetip.setup({
+ *   insertionType: 'prependTo',
+ *   insertionElement: '#container'
+ * });
+ * 
+ * @property
+ * @name $.cluetip.setup
+ * @type Map
+ * @cat Plugins/tooltip
+ * @option String insertionType: Default is 'appendTo'. Determines the method to be used for inserting the clueTip into the DOM. Permitted values are 'appendTo', 'prependTo', 'insertBefore', and 'insertAfter'
+ * @option String insertionElement: Default is 'body'. Determines which element in the DOM the plugin will reference when inserting the clueTip.
+ *
+ */
+   
+  var insertionType = 'appendTo', insertionElement = 'body';
+
+  $.cluetip.setup = function(options) {
+    if (options && options.insertionType && (options.insertionType).match(/appendTo|prependTo|insertBefore|insertAfter/)) {
+      insertionType = options.insertionType;
+    }
+    if (options && options.insertionElement) {
+      insertionElement = options.insertionElement;
+    }
+  };
+  
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.colorbox.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.colorbox.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.colorbox.min.js	(revision 14585)
@@ -0,0 +1,4 @@
+// ColorBox v1.3.16 - a full featured, light-weight, customizable lightbox based on jQuery 1.3+
+// Copyright (c) 2011 Jack Moore - jack@colorpowered.com
+// Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
+(function(a,b,c){function ba(b){if(!T){O=b,Z(a.extend(J,a.data(O,e))),x=a(O),P=0,J.rel!=="nofollow"&&(x=a("."+V).filter(function(){var b=a.data(this,e).rel||this.rel;return b===J.rel}),P=x.index(O),P===-1&&(x=x.add(O),P=x.length-1));if(!R){R=S=!0,q.show();if(J.returnFocus)try{O.blur(),a(O).one(k,function(){try{this.focus()}catch(a){}})}catch(c){}p.css({opacity:+J.opacity,cursor:J.overlayClose?"pointer":"auto"}).show(),J.w=X(J.initialWidth,"x"),J.h=X(J.initialHeight,"y"),U.position(0),n&&y.bind("resize."+o+" scroll."+o,function(){p.css({width:y.width(),height:y.height(),top:y.scrollTop(),left:y.scrollLeft()})}).trigger("resize."+o),$(g,J.onOpen),I.add(C).hide(),H.html(J.close).show()}U.load(!0)}}function _(){var a,b=f+"Slideshow_",c="click."+f,d,e,g;J.slideshow&&x[1]&&(d=function(){E.text(J.slideshowStop).unbind(c).bind(i,function(){if(P<x.length-1||J.loop)a=setTimeout(U.next,J.slideshowSpeed)}).bind(h,function(){clearTimeout(a)}).one(c+" "+j,e),q.removeClass(b+"off").addClass(b+"on"),a=setTimeout(U.next,J.slideshowSpeed)},e=function(){clearTimeout(a),E.text(J.slideshowStart).unbind([i,h,j,c].join(" ")).one(c,d),q.removeClass(b+"on").addClass(b+"off")},J.slideshowAuto?d():e())}function $(b,c){c&&c.call(O),a.event.trigger(b)}function Z(b){for(var c in b)a.isFunction(b[c])&&c.substring(0,2)!=="on"&&(b[c]=b[c].call(O));b.rel=b.rel||O.rel||"nofollow",b.href=a.trim(b.href||a(O).attr("href")),b.title=b.title||O.title}function Y(a){return J.photo||/\.(gif|png|jpg|jpeg|bmp)(?:\?([^#]*))?(?:#(\.*))?$/i.test(a)}function X(a,b){b=b==="x"?y.width():y.height();return typeof a=="string"?Math.round(/%/.test(a)?b/100*parseInt(a,10):parseInt(a,10)):a}function W(c,d){var e=b.createElement("div");c&&(e.id=f+c),e.style.cssText=d||!1;return a(e)}var d={transition:"elastic",speed:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",open:!1,returnFocus:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0},e="colorbox",f="cbox",g=f+"_open",h=f+"_load",i=f+"_complete",j=f+"_cleanup",k=f+"_closed",l=f+"_purge",m=a.browser.msie&&!a.support.opacity,n=m&&a.browser.version<7,o=f+"_IE6",p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J={},K,L,M,N,O,P,Q,R,S,T=!1,U,V=f+"Element";U=a.fn[e]=a[e]=function(b,c){var f=this,g;if(!f[0]&&f.selector)return f;b=b||{},c&&(b.onComplete=c);if(!f[0]||f.selector===undefined)f=a("<a/>"),b.open=!0;f.each(function(){a.data(this,e,a.extend({},a.data(this,e)||d,b)),a(this).addClass(V)}),g=b.open,a.isFunction(g)&&(g=g.call(f)),g&&ba(f[0]);return f},U.init=function(){y=a(c),q=W().attr({id:e,"class":m?f+(n?"IE6":"IE"):""}),p=W("Overlay",n?"position:absolute":"").hide(),r=W("Wrapper"),s=W("Content").append(z=W("LoadedContent","width:0; height:0; overflow:hidden"),B=W("LoadingOverlay").add(W("LoadingGraphic")),C=W("Title"),D=W("Current"),F=W("Next"),G=W("Previous"),E=W("Slideshow").bind(g,_),H=W("Close")),r.append(W().append(W("TopLeft"),t=W("TopCenter"),W("TopRight")),W(!1,"clear:left").append(u=W("MiddleLeft"),s,v=W("MiddleRight")),W(!1,"clear:left").append(W("BottomLeft"),w=W("BottomCenter"),W("BottomRight"))).children().children().css({"float":"left"}),A=W(!1,"position:absolute; width:9999px; visibility:hidden; display:none"),a("body").prepend(p,q.append(r,A)),s.children().hover(function(){a(this).addClass("hover")},function(){a(this).removeClass("hover")}).addClass("hover"),K=t.height()+w.height()+s.outerHeight(!0)-s.height(),L=u.width()+v.width()+s.outerWidth(!0)-s.width(),M=z.outerHeight(!0),N=z.outerWidth(!0),q.css({"padding-bottom":K,"padding-right":L}).hide(),F.click(function(){U.next()}),G.click(function(){U.prev()}),H.click(function(){U.close()}),I=F.add(G).add(D).add(E),s.children().removeClass("hover"),a("."+V).live("click",function(a){a.button!==0&&typeof a.button!="undefined"||a.ctrlKey||a.shiftKey||a.altKey||(a.preventDefault(),ba(this))}),p.click(function(){J.overlayClose&&U.close()}),a(b).bind("keydown."+f,function(a){var b=a.keyCode;R&&J.escKey&&b===27&&(a.preventDefault(),U.close()),R&&J.arrowKey&&x[1]&&(b===37?(a.preventDefault(),G.click()):b===39&&(a.preventDefault(),F.click()))})},U.remove=function(){q.add(p).remove(),a("."+V).die("click").removeData(e).removeClass(V)},U.position=function(a,c){function g(a){t[0].style.width=w[0].style.width=s[0].style.width=a.style.width,B[0].style.height=B[1].style.height=s[0].style.height=u[0].style.height=v[0].style.height=a.style.height}var d,e=Math.max(b.documentElement.clientHeight-J.h-M-K,0)/2+y.scrollTop(),f=Math.max(y.width()-J.w-N-L,0)/2+y.scrollLeft();d=q.width()===J.w+N&&q.height()===J.h+M?0:a,r[0].style.width=r[0].style.height="9999px",q.dequeue().animate({width:J.w+N,height:J.h+M,top:e,left:f},{duration:d,complete:function(){g(this),S=!1,r[0].style.width=J.w+N+L+"px",r[0].style.height=J.h+M+K+"px",c&&c()},step:function(){g(this)}})},U.resize=function(a){if(R){a=a||{},a.width&&(J.w=X(a.width,"x")-N-L),a.innerWidth&&(J.w=X(a.innerWidth,"x")),z.css({width:J.w}),a.height&&(J.h=X(a.height,"y")-M-K),a.innerHeight&&(J.h=X(a.innerHeight,"y"));if(!a.innerHeight&&!a.height){var b=z.wrapInner("<div style='overflow:auto'></div>").children();J.h=b.height(),b.replaceWith(b.children())}z.css({height:J.h}),U.position(J.transition==="none"?0:J.speed)}},U.prep=function(b){function h(b){U.position(b,function(){var b,d,g,h,j=x.length,k,n;!R||(n=function(){B.hide(),$(i,J.onComplete)},m&&Q&&z.fadeIn(100),C.html(J.title).add(z).show(),j>1?(typeof J.current=="string"&&D.html(J.current.replace(/\{current\}/,P+1).replace(/\{total\}/,j)).show(),F[J.loop||P<j-1?"show":"hide"]().html(J.next),G[J.loop||P?"show":"hide"]().html(J.previous),b=P?x[P-1]:x[j-1],g=P<j-1?x[P+1]:x[0],J.slideshow&&E.show(),J.preloading&&(h=a.data(g,e).href||g.href,d=a.data(b,e).href||b.href,h=a.isFunction(h)?h.call(g):h,d=a.isFunction(d)?d.call(b):d,Y(h)&&(a("<img/>")[0].src=h),Y(d)&&(a("<img/>")[0].src=d))):I.hide(),J.iframe?(k=a("<iframe/>").addClass(f+"Iframe")[0],J.fastIframe?n():a(k).load(n),k.name=f+ +(new Date),k.src=J.href,J.scrolling||(k.scrolling="no"),m&&(k.frameBorder=0,k.allowTransparency="true"),a(k).appendTo(z).one(l,function(){k.src="//about:blank"})):n(),J.transition==="fade"?q.fadeTo(c,1,function(){q[0].style.filter=""}):q[0].style.filter="",y.bind("resize."+f,function(){U.position(0)}))})}function g(){J.h=J.h||z.height(),J.h=J.mh&&J.mh<J.h?J.mh:J.h;return J.h}function d(){J.w=J.w||z.width(),J.w=J.mw&&J.mw<J.w?J.mw:J.w;return J.w}if(!!R){var c=J.transition==="none"?0:J.speed;y.unbind("resize."+f),z.remove(),z=W("LoadedContent").html(b),z.hide().appendTo(A.show()).css({width:d(),overflow:J.scrolling?"auto":"hidden"}).css({height:g()}).prependTo(s),A.hide(),a(Q).css({"float":"none"}),n&&a("select").not(q.find("select")).filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one(j,function(){this.style.visibility="inherit"}),J.transition==="fade"?q.fadeTo(c,0,function(){h(0)}):h(c)}},U.load=function(b){var c,d,g=U.prep;S=!0,Q=!1,O=x[P],b||Z(a.extend(J,a.data(O,e))),$(l),$(h,J.onLoad),J.h=J.height?X(J.height,"y")-M-K:J.innerHeight&&X(J.innerHeight,"y"),J.w=J.width?X(J.width,"x")-N-L:J.innerWidth&&X(J.innerWidth,"x"),J.mw=J.w,J.mh=J.h,J.maxWidth&&(J.mw=X(J.maxWidth,"x")-N-L,J.mw=J.w&&J.w<J.mw?J.w:J.mw),J.maxHeight&&(J.mh=X(J.maxHeight,"y")-M-K,J.mh=J.h&&J.h<J.mh?J.h:J.mh),c=J.href,B.show(),J.inline?(W().hide().insertBefore(a(c)[0]).one(l,function(){a(this).replaceWith(z.children())}),g(a(c))):J.iframe?g(" "):J.html?g(J.html):Y(c)?(a(Q=new Image).addClass(f+"Photo").error(function(){J.title=!1,g(W("Error").text("This image could not be loaded"))}).load(function(){var a;Q.onload=null,J.scalePhotos&&(d=function(){Q.height-=Q.height*a,Q.width-=Q.width*a},J.mw&&Q.width>J.mw&&(a=(Q.width-J.mw)/Q.width,d()),J.mh&&Q.height>J.mh&&(a=(Q.height-J.mh)/Q.height,d())),J.h&&(Q.style.marginTop=Math.max(J.h-Q.height,0)/2+"px"),x[1]&&(P<x.length-1||J.loop)&&(Q.style.cursor="pointer",Q.onclick=function(){U.next()}),m&&(Q.style.msInterpolationMode="bicubic"),setTimeout(function(){g(Q)},1)}),setTimeout(function(){Q.src=c},1)):c&&A.load(c,function(b,c,d){g(c==="error"?W("Error").text("Request unsuccessful: "+d.statusText):a(this).contents())})},U.next=function(){!S&&x[1]&&(P<x.length-1||J.loop)&&(P=P<x.length-1?P+1:0,U.load())},U.prev=function(){!S&&x[1]&&(P||J.loop)&&(P=P?P-1:x.length-1,U.load())},U.close=function(){R&&!T&&(T=!0,R=!1,$(j,J.onCleanup),y.unbind("."+f+" ."+o),p.fadeTo(200,0),q.stop().fadeTo(300,0,function(){q.add(p).css({opacity:1,cursor:"auto"}).hide(),$(l),z.remove(),setTimeout(function(){T=!1,$(k,J.onClosed)},1)}))},U.element=function(){return a(O)},U.settings=d,a(U.init)})(jQuery,document,this);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.jgrowl_minimized.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.jgrowl_minimized.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.jgrowl_minimized.js	(revision 14585)
@@ -0,0 +1,9 @@
+(function($){$.jGrowl=function(m,o){if($('#jGrowl').size()==0)
+$('<div id="jGrowl"></div>').addClass($.jGrowl.defaults.position).appendTo('body');$('#jGrowl').jGrowl(m,o);};$.fn.jGrowl=function(m,o){if($.isFunction(this.each)){var args=arguments;return this.each(function(){var self=this;if($(this).data('jGrowl.instance')==undefined){$(this).data('jGrowl.instance',$.extend(new $.fn.jGrowl(),{notifications:[],element:null,interval:null}));$(this).data('jGrowl.instance').startup(this);}
+if($.isFunction($(this).data('jGrowl.instance')[m])){$(this).data('jGrowl.instance')[m].apply($(this).data('jGrowl.instance'),$.makeArray(args).slice(1));}else{$(this).data('jGrowl.instance').create(m,o);}});};};$.extend($.fn.jGrowl.prototype,{defaults:{pool:0,header:'',group:'',sticky:false,position:'top-right',glue:'after',theme:'default',corners:'10px',check:250,life:3000,speed:'normal',easing:'swing',closer:true,closeTemplate:'&times;',closerTemplate:'<div>[ close all ]</div>',log:function(e,m,o){},beforeOpen:function(e,m,o){},open:function(e,m,o){},beforeClose:function(e,m,o){},close:function(e,m,o){},animateOpen:{opacity:'show'},animateClose:{opacity:'hide'}},notifications:[],element:null,interval:null,create:function(message,o){var o=$.extend({},this.defaults,o);this.notifications.push({message:message,options:o});o.log.apply(this.element,[this.element,message,o]);},render:function(notification){var self=this;var message=notification.message;var o=notification.options;var notification=$('<div class="jGrowl-notification ui-state-highlight ui-corner-all'+
+((o.group!=undefined&&o.group!='')?' '+o.group:'')+'">'+'<div class="close">'+o.closeTemplate+'</div>'+'<div class="header">'+o.header+'</div>'+'<div class="message">'+message+'</div></div>').data("jGrowl",o).addClass(o.theme).children('div.close').bind("click.jGrowl",function(){$(this).parent().trigger('jGrowl.close');}).parent();$(notification).bind("mouseover.jGrowl",function(){$('div.jGrowl-notification',self.element).data("jGrowl.pause",true);}).bind("mouseout.jGrowl",function(){$('div.jGrowl-notification',self.element).data("jGrowl.pause",false);}).bind('jGrowl.beforeOpen',function(){if(o.beforeOpen.apply(notification,[notification,message,o,self.element])!=false){$(this).trigger('jGrowl.open');}}).bind('jGrowl.open',function(){if(o.open.apply(notification,[notification,message,o,self.element])!=false){if(o.glue=='after'){$('div.jGrowl-notification:last',self.element).after(notification);}else{$('div.jGrowl-notification:first',self.element).before(notification);}
+$(this).animate(o.animateOpen,o.speed,o.easing,function(){if($.browser.msie&&(parseInt($(this).css('opacity'),10)===1||parseInt($(this).css('opacity'),10)===0))
+this.style.removeAttribute('filter');$(this).data("jGrowl").created=new Date();});}}).bind('jGrowl.beforeClose',function(){if(o.beforeClose.apply(notification,[notification,message,o,self.element])!=false)
+$(this).trigger('jGrowl.close');}).bind('jGrowl.close',function(){$(this).data('jGrowl.pause',true);$(this).animate(o.animateClose,o.speed,o.easing,function(){$(this).remove();var close=o.close.apply(notification,[notification,message,o,self.element]);if($.isFunction(close))
+close.apply(notification,[notification,message,o,self.element]);});}).trigger('jGrowl.beforeOpen');if($.fn.corner!=undefined)$(notification).corner(o.corners);if($('div.jGrowl-notification:parent',self.element).size()>1&&$('div.jGrowl-closer',self.element).size()==0&&this.defaults.closer!=false){$(this.defaults.closerTemplate).addClass('jGrowl-closer ui-state-highlight ui-corner-all').addClass(this.defaults.theme).appendTo(self.element).animate(this.defaults.animateOpen,this.defaults.speed,this.defaults.easing).bind("click.jGrowl",function(){$(this).siblings().children('div.close').trigger("click.jGrowl");if($.isFunction(self.defaults.closer)){self.defaults.closer.apply($(this).parent()[0],[$(this).parent()[0]]);}});};},update:function(){$(this.element).find('div.jGrowl-notification:parent').each(function(){if($(this).data("jGrowl")!=undefined&&$(this).data("jGrowl").created!=undefined&&($(this).data("jGrowl").created.getTime()+$(this).data("jGrowl").life)<(new Date()).getTime()&&$(this).data("jGrowl").sticky!=true&&($(this).data("jGrowl.pause")==undefined||$(this).data("jGrowl.pause")!=true)){$(this).trigger('jGrowl.beforeClose');}});if(this.notifications.length>0&&(this.defaults.pool==0||$(this.element).find('div.jGrowl-notification:parent').size()<this.defaults.pool))
+this.render(this.notifications.shift());if($(this.element).find('div.jGrowl-notification:parent').size()<2){$(this.element).find('div.jGrowl-closer').animate(this.defaults.animateClose,this.defaults.speed,this.defaults.easing,function(){$(this).remove();});}},startup:function(e){this.element=$(e).addClass('jGrowl').append('<div class="jGrowl-notification"></div>');this.interval=setInterval(function(){$(e).data('jGrowl.instance').update();},this.defaults.check);if($.browser.msie&&parseInt($.browser.version)<7&&!window["XMLHttpRequest"]){$(this.element).addClass('ie6');}},shutdown:function(){$(this.element).removeClass('jGrowl').find('div.jGrowl-notification').remove();clearInterval(this.interval);},close:function(){$(this.element).find('div.jGrowl-notification').each(function(){$(this).trigger('jGrowl.beforeClose');});}});$.jGrowl.defaults=$.fn.jGrowl.prototype.defaults;})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.js	(revision 14585)
@@ -0,0 +1,186 @@
+/*
+ * jQuery Progress Bar plugin
+ * Version 2.0 (06/22/2009)
+ * @requires jQuery v1.2.1 or later
+ *
+ * Copyright (c) 2008 Gary Teo
+ * http://t.wits.sg
+
+USAGE:
+	$(".someclass").progressBar();
+	$("#progressbar").progressBar();
+	$("#progressbar").progressBar(45);							// percentage
+	$("#progressbar").progressBar({showText: false });			// percentage with config
+	$("#progressbar").progressBar(45, {showText: false });		// percentage with config
+*/
+(function($) {
+	$.extend({
+		progressBar: new function() {
+
+			this.defaults = {
+				steps			: 20,											// steps taken to reach target
+				stepDuration	: 20,											
+				max				: 100,											// Upon 100% i'd assume, but configurable
+				showText		: true,											// show text with percentage in next to the progressbar? - default : true
+				textFormat		: 'percentage',									// Or otherwise, set to 'fraction'
+				width			: 120,											// Width of the progressbar - don't forget to adjust your image too!!!												// Image to use in the progressbar. Can be a single image too: 'images/progressbg_green.gif'
+				height			: 12,											// Height of the progressbar - don't forget to adjust your image too!!!
+				callback		: null,											// Calls back with the config object that has the current percentage, target percentage, current image, etc
+				boxImage		: 'images/progressbar.gif',						// boxImage : image around the progress bar
+				barImage		: {
+									0:	'images/progressbg_red.gif',
+									30: 'images/progressbg_orange.gif',
+									70: 'images/progressbg_green.gif'
+								},
+				
+				
+				// Internal use
+				running_value	: 0,
+				value			: 0,
+				image			: null
+			};
+			
+			/* public methods */
+			this.construct = function(arg1, arg2) {
+				var argvalue	= null;
+				var argconfig	= null;
+				
+				if (arg1 != null) {
+					if (!isNaN(arg1)) {
+						argvalue = arg1;
+						if (arg2 != null) {
+							argconfig = arg2;
+						}
+					} else {
+						argconfig = arg1; 
+					}
+				}
+				
+				return this.each(function(child) {
+					var pb		= this;
+					var config	= this.config;
+					
+					if (argvalue != null && this.bar != null && this.config != null) {
+						this.config.value 		= parseInt(argvalue)
+						if (argconfig != null)
+							pb.config			= $.extend(this.config, argconfig);
+						config	= pb.config;
+					} else {
+						var $this				= $(this);
+						var config				= $.extend({}, $.progressBar.defaults, argconfig);
+						config.id				= $this.attr('id') ? $this.attr('id') : Math.ceil(Math.random() * 100000);	// random id, if none provided
+						
+						if (argvalue == null)
+							argvalue	= $this.html().replace("%","")	// parse percentage
+						
+						config.value			= parseInt(argvalue);
+						config.running_value	= 0;
+						config.image			= getBarImage(config);
+						
+						var numeric = ['steps', 'stepDuration', 'max', 'width', 'height', 'running_value', 'value'];
+						for (var i=0; i<numeric.length; i++) 
+							config[numeric[i]] = parseInt(config[numeric[i]]);
+						
+						$this.html("");
+						var bar					= document.createElement('img');
+						var text				= document.createElement('span');
+						var $bar				= $(bar);
+						var $text				= $(text);
+						pb.bar					= $bar;
+						
+						$bar.attr('id', config.id + "_pbImage");
+						$text.attr('id', config.id + "_pbText");
+						$text.html(getText(config));
+						$bar.attr('title', getText(config));
+						$bar.attr('alt', getText(config));
+						$bar.attr('src', config.boxImage);
+						$bar.attr('width', config.width);
+						$bar.css("width", config.width + "px");
+						$bar.css("height", config.height + "px");
+						$bar.css("background-image", "url(" + config.image + ")");
+						$bar.css("background-position", ((config.width * -1)) + 'px 50%');
+						$bar.css("padding", "0");
+						$bar.css("margin", "0");
+						$this.append($bar);
+						$this.append($text);
+					}
+
+					function getPercentage(config) {
+						return config.running_value * 100 / config.max;
+					}
+
+					function getBarImage(config) {
+						var image = config.barImage;
+						if (typeof(config.barImage) == 'object') {
+							for (var i in config.barImage) {
+								if (config.running_value >= parseInt(i)) {
+									image = config.barImage[i];
+								} else { break; }
+							}
+						}
+						return image;
+					}
+					
+					function getText(config) {
+						if (config.showText) {
+							if (config.textFormat == 'percentage') {
+								return " " + Math.round(config.running_value) + "%";
+							} else if (config.textFormat == 'fraction') {
+								return " " + config.running_value + '/' + config.max;
+							}
+						}
+					}
+					
+					config.increment = Math.round((config.value - config.running_value)/config.steps);
+					if (config.increment < 0)
+						config.increment *= -1;
+					if (config.increment < 1)
+						config.increment = 1;
+					
+					var t = setInterval(function() {
+						var pixels	= config.width / 100;			// Define how many pixels go into 1%
+						
+						if (config.running_value > config.value) {
+							if (config.running_value - config.increment  < config.value) {
+								config.running_value = config.value;
+							} else {
+								config.running_value -= config.increment;
+							}
+						}
+						else if (config.running_value < config.value) {
+							if (config.running_value + config.increment  > config.value) {
+								config.running_value = config.value;
+							} else {
+								config.running_value += config.increment;
+							}
+						}
+						
+						if (config.running_value == config.value)
+							clearInterval(t);
+						
+						var $bar	= $("#" + config.id + "_pbImage");
+						var $text	= $("#" + config.id + "_pbText");
+						var image	= getBarImage(config);
+						if (image != config.image) {
+							$bar.css("background-image", "url(" + image + ")");
+							config.image = image;
+						}
+						$bar.css("background-position", (((config.width * -1)) + (getPercentage(config) * pixels)) + 'px 50%');
+						$bar.attr('title', getText(config));
+						$text.html(getText(config));
+						
+						if (config.callback != null && typeof(config.callback) == 'function')
+							config.callback(config);
+						
+						pb.config = config;
+					}, config.stepDuration); 
+				});
+			};
+		}
+	});
+		
+	$.fn.extend({
+        progressBar: $.progressBar.construct
+	});
+	
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.progressbar.min.js	(revision 14585)
@@ -0,0 +1,20 @@
+
+(function($){$.extend({progressBar:new function(){this.defaults={steps:20,stepDuration:20,max:100,showText:true,textFormat:'percentage',width:120,height:12,callback:null,boxImage:'images/progressbar.gif',barImage:{0:'images/progressbg_red.gif',30:'images/progressbg_orange.gif',70:'images/progressbg_green.gif'},running_value:0,value:0,image:null};this.construct=function(arg1,arg2){var argvalue=null;var argconfig=null;if(arg1!=null){if(!isNaN(arg1)){argvalue=arg1;if(arg2!=null){argconfig=arg2;}}else{argconfig=arg1;}}
+return this.each(function(child){var pb=this;var config=this.config;if(argvalue!=null&&this.bar!=null&&this.config!=null){this.config.value=parseInt(argvalue)
+if(argconfig!=null)
+pb.config=$.extend(this.config,argconfig);config=pb.config;}else{var $this=$(this);var config=$.extend({},$.progressBar.defaults,argconfig);config.id=$this.attr('id')?$this.attr('id'):Math.ceil(Math.random()*100000);if(argvalue==null)
+argvalue=$this.html().replace("%","")
+config.value=parseInt(argvalue);config.running_value=0;config.image=getBarImage(config);var numeric=['steps','stepDuration','max','width','height','running_value','value'];for(var i=0;i<numeric.length;i++)
+config[numeric[i]]=parseInt(config[numeric[i]]);$this.html("");var bar=document.createElement('img');var text=document.createElement('span');var $bar=$(bar);var $text=$(text);pb.bar=$bar;$bar.attr('id',config.id+"_pbImage");$text.attr('id',config.id+"_pbText");$text.html(getText(config));$bar.attr('title',getText(config));$bar.attr('alt',getText(config));$bar.attr('src',config.boxImage);$bar.attr('width',config.width);$bar.css("width",config.width+"px");$bar.css("height",config.height+"px");$bar.css("background-image","url("+config.image+")");$bar.css("background-position",((config.width*-1))+'px 50%');$bar.css("padding","0");$bar.css("margin","0");$this.append($bar);$this.append($text);}
+function getPercentage(config){return config.running_value*100/config.max;}
+function getBarImage(config){var image=config.barImage;if(typeof(config.barImage)=='object'){for(var i in config.barImage){if(config.running_value>=parseInt(i)){image=config.barImage[i];}else{break;}}}
+return image;}
+function getText(config){if(config.showText){if(config.textFormat=='percentage'){return" "+Math.round(config.running_value)+"%";}else if(config.textFormat=='fraction'){return" "+config.running_value+'/'+config.max;}}}
+config.increment=Math.round((config.value-config.running_value)/config.steps);if(config.increment<0)
+config.increment*=-1;if(config.increment<1)
+config.increment=1;var t=setInterval(function(){var pixels=config.width/100;if(config.running_value>config.value){if(config.running_value-config.increment<config.value){config.running_value=config.value;}else{config.running_value-=config.increment;}}
+else if(config.running_value<config.value){if(config.running_value+config.increment>config.value){config.running_value=config.value;}else{config.running_value+=config.increment;}}
+if(config.running_value==config.value)
+clearInterval(t);var $bar=$("#"+config.id+"_pbImage");var $text=$("#"+config.id+"_pbText");var image=getBarImage(config);if(image!=config.image){$bar.css("background-image","url("+image+")");config.image=image;}
+$bar.css("background-position",(((config.width*-1))+(getPercentage(config)*pixels))+'px 50%');$bar.attr('title',getText(config));$text.html(getText(config));if(config.callback!=null&&typeof(config.callback)=='function')
+config.callback(config);pb.config=config;},config.stepDuration);});};}});$.fn.extend({progressBar:$.progressBar.construct});})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.sort.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.sort.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.sort.js	(revision 14585)
@@ -0,0 +1,65 @@
+/**
+ * jQuery.fn.sortElements
+ * --------------
+ * @param Function comparator:
+ *   Exactly the same behaviour as [1,2,3].sort(comparator)
+ *   
+ * @param Function getSortable
+ *   A function that should return the element that is
+ *   to be sorted. The comparator will run on the
+ *   current collection, but you may want the actual
+ *   resulting sort to occur on a parent or another
+ *   associated element.
+ *   
+ *   E.g. $('td').sortElements(comparator, function(){
+ *      return this.parentNode; 
+ *   })
+ *   
+ *   The <td>'s parent (<tr>) will be sorted instead
+ *   of the <td> itself.
+ */
+jQuery.fn.sortElements = (function(){
+ 
+    var sort = [].sort;
+ 
+    return function(comparator, getSortable) {
+ 
+        getSortable = getSortable || function(){return this;};
+ 
+        var placements = this.map(function(){
+ 
+            var sortElement = getSortable.call(this),
+                parentNode = sortElement.parentNode,
+ 
+                // Since the element itself will change position, we have
+                // to have some way of storing its original position in
+                // the DOM. The easiest way is to have a 'flag' node:
+                nextSibling = parentNode.insertBefore(
+                    document.createTextNode(''),
+                    sortElement.nextSibling
+                );
+ 
+            return function() {
+ 
+                if (parentNode === this) {
+                    throw new Error(
+                        "You can't sort elements if any one is a descendant of another."
+                    );
+                }
+ 
+                // Insert before flag:
+                parentNode.insertBefore(this, nextSibling);
+                // Remove flag:
+                parentNode.removeChild(nextSibling);
+ 
+            };
+ 
+        });
+ 
+        return sort.call(this, comparator).each(function(i){
+            placements[i].call(getSortable.call(this));
+        });
+ 
+    };
+ 
+})();
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.tipTip.minified.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.tipTip.minified.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.tipTip.minified.js	(revision 14585)
@@ -0,0 +1,21 @@
+ /*
+ * TipTip
+ * Copyright 2010 Drew Wilson
+ * www.drewwilson.com
+ * code.drewwilson.com/entry/tiptip-jquery-plugin
+ *
+ * Version 1.3   -   Updated: Mar. 23, 2010
+ *
+ * This Plug-In will create a custom tooltip to replace the default
+ * browser tooltip. It is extremely lightweight and very smart in
+ * that it detects the edges of the browser window and will make sure
+ * the tooltip stays within the current window size. As a result the
+ * tooltip will adjust itself to be displayed above, below, to the left 
+ * or to the right depending on what is necessary to stay within the
+ * browser window. It is completely customizable as well via CSS.
+ *
+ * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
+ *   http://www.opensource.org/licenses/mit-license.php
+ *   http://www.gnu.org/licenses/gpl.html
+ */
+(function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('<div id="tiptip_holder" style="max-width:'+opts.maxWidth+';"></div>');var tiptip_content=$('<div id="tiptip_content"></div>');var tiptip_arrow=$('<div id="tiptip_arrow"></div>');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0").css("max-width",opts.maxWidth);tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)<parseInt($(window).scrollLeft());var left_compare=(tip_w+left)>parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/plugins/jquery.tokeninput.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/plugins/jquery.tokeninput.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/plugins/jquery.tokeninput.js	(revision 14585)
@@ -0,0 +1,777 @@
+/**
+  DON'T MAKE AUTOMATIC UPGRADE
+  This is a merged version of :
+  + https://github.com/gr2m/jquery-tokeninput/
+  + https://github.com/mistic100/jquery-tokeninput/
+*/
+
+/*
+ * jQuery Plugin: Tokenizing Autocomplete Text Entry
+ * Version 1.4.2
+ *
+ * Copyright (c) 2009 James Smith (http://loopj.com)
+ * Licensed jointly under the GPL and MIT licenses,
+ * choose which one suits your project best!
+ *
+ */
+
+(function ($) {
+// Default settings
+var DEFAULT_SETTINGS = {
+    hintText: "Type in a search term",
+    noResultsText: "No results",
+    searchingText: "Searching...",
+    newText: "(new)",
+    deleteText: "&times;",
+    searchDelay: 300,
+    minChars: 1,
+    tokenLimit: null,
+    jsonContainer: null,
+    method: "GET",
+    contentType: "json",
+    queryParam: "q",
+    tokenDelimiter: ",",
+    preventDuplicates: false,
+    prePopulate: null,
+    processPrePopulate: false,
+    animateDropdown: true,
+    onResult: null,
+    onAdd: null,
+    onDelete: null,
+    allowCreation: false
+};
+
+// Default classes to use when theming
+var DEFAULT_CLASSES = {
+    tokenList: "token-input-list",
+    token: "token-input-token",
+    tokenDelete: "token-input-delete-token",
+    selectedToken: "token-input-selected-token",
+    highlightedToken: "token-input-highlighted-token",
+    dropdown: "token-input-dropdown",
+    dropdownItem: "token-input-dropdown-item",
+    dropdownItem2: "token-input-dropdown-item2",
+    selectedDropdownItem: "token-input-selected-dropdown-item",
+    inputToken: "token-input-input-token"
+};
+
+// Input box position "enum"
+var POSITION = {
+    BEFORE: 0,
+    AFTER: 1,
+    END: 2
+};
+
+// Keys "enum"
+var KEY = {
+    BACKSPACE: 8,
+    TAB: 9,
+    ENTER: 13,
+    ESCAPE: 27,
+    SPACE: 32,
+    PAGE_UP: 33,
+    PAGE_DOWN: 34,
+    END: 35,
+    HOME: 36,
+    LEFT: 37,
+    UP: 38,
+    RIGHT: 39,
+    DOWN: 40,
+    NUMPAD_ENTER: 108,
+    COMMA: 188
+};
+
+
+// Expose the .tokenInput function to jQuery as a plugin
+$.fn.tokenInput = function (url_or_data, options) {
+    var settings = $.extend({}, DEFAULT_SETTINGS, options || {});
+
+    return this.each(function () {
+        new $.TokenList(this, url_or_data, settings);
+    });
+};
+
+
+// TokenList class for each input
+$.TokenList = function (input, url_or_data, settings) {
+    //
+    // Initialization
+    //
+
+    // Configure the data source
+    if(typeof(url_or_data) === "string") {
+        // Set the url to query against
+        settings.url = url_or_data;
+
+        // Make a smart guess about cross-domain if it wasn't explicitly specified
+        if(settings.crossDomain === undefined) {
+            if(settings.url.indexOf("://") === -1) {
+                settings.crossDomain = false;
+            } else {
+                settings.crossDomain = (location.href.split(/\/+/g)[1] !== settings.url.split(/\/+/g)[1]);
+            }
+        }
+    } else if(typeof(url_or_data) === "object") {
+        // Set the local data to search through
+        settings.local_data = url_or_data;
+    }
+
+    // Build class names
+    if(settings.classes) {
+        // Use custom class names
+        settings.classes = $.extend({}, DEFAULT_CLASSES, settings.classes);
+    } else if(settings.theme) {
+        // Use theme-suffixed default class names
+        settings.classes = {};
+        $.each(DEFAULT_CLASSES, function(key, value) {
+            settings.classes[key] = value + "-" + settings.theme;
+        });
+    } else {
+        settings.classes = DEFAULT_CLASSES;
+    }
+
+
+    // Save the tokens
+    var saved_tokens = [];
+
+    // Keep track of the number of tokens in the list
+    var token_count = 0;
+
+    // Basic cache to save on db hits
+    var cache = new $.TokenList.Cache();
+
+    // Keep track of the timeout, old vals
+    var timeout;
+    var input_val;
+
+    // Create a new text input an attach keyup events
+    var input_box = $("<input type=\"text\"  autocomplete=\"off\">")
+        .css({
+            outline: "none"
+        })
+        .focus(function () {
+            if (settings.tokenLimit === null || settings.tokenLimit !== token_count) {
+                show_dropdown_hint();
+            }
+        })
+        .blur(function () {
+            hide_dropdown();
+        })
+        .bind("keyup keydown blur update", resize_input)
+        .keydown(function (event) {
+            var previous_token;
+            var next_token;
+
+            switch(event.keyCode) {
+                case KEY.LEFT:
+                case KEY.RIGHT:
+                case KEY.UP:
+                case KEY.DOWN:
+                    if(!$(this).val()) {
+                        previous_token = input_token.prev();
+                        next_token = input_token.next();
+
+                        if((previous_token.length && previous_token.get(0) === selected_token) || (next_token.length && next_token.get(0) === selected_token)) {
+                            // Check if there is a previous/next token and it is selected
+                            if(event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) {
+                                deselect_token($(selected_token), POSITION.BEFORE);
+                            } else {
+                                deselect_token($(selected_token), POSITION.AFTER);
+                            }
+                        } else if((event.keyCode === KEY.LEFT || event.keyCode === KEY.UP) && previous_token.length) {
+                            // We are moving left, select the previous token if it exists
+                            select_token($(previous_token.get(0)));
+                        } else if((event.keyCode === KEY.RIGHT || event.keyCode === KEY.DOWN) && next_token.length) {
+                            // We are moving right, select the next token if it exists
+                            select_token($(next_token.get(0)));
+                        }
+                    } else {
+                        var dropdown_item = null;
+
+                        if(event.keyCode === KEY.DOWN || event.keyCode === KEY.RIGHT) {
+                            dropdown_item = $(selected_dropdown_item).next();
+                        } else {
+                            dropdown_item = $(selected_dropdown_item).prev();
+                        }
+
+                        if(dropdown_item.length) {
+                            select_dropdown_item(dropdown_item);
+                        }
+                        return false;
+                    }
+                    break;
+
+                case KEY.BACKSPACE:
+                    previous_token = input_token.prev();
+
+                    if(!$(this).val().length) {
+                        if(selected_token) {
+                            delete_token($(selected_token));
+                        } else if(previous_token.length) {
+                            select_token($(previous_token.get(0)));
+                        }
+
+                        return false;
+                    } else if($(this).val().length === 1) {
+                        hide_dropdown();
+                    } else {
+                        // set a timeout just long enough to let this function finish.
+                        setTimeout(function(){do_search();}, 5);
+                    }
+                    break;
+
+                case KEY.TAB:
+                case KEY.ENTER:
+                case KEY.NUMPAD_ENTER:
+                case KEY.COMMA:
+                  if(selected_dropdown_item) {
+                    add_token($(selected_dropdown_item));
+                    return false;
+                  }
+                  break;
+
+                case KEY.ESCAPE:
+                  hide_dropdown();
+                  return true;
+
+                default:
+                    if(String.fromCharCode(event.which)) {
+                        // set a timeout just long enough to let this function finish.
+                        setTimeout(function(){do_search();}, 5);
+                    }
+                    break;
+            }
+        });
+
+    if ($(input).get(0).tagName == 'SELECT') {
+    // Create a new input to store selected tokens, original will be delete later
+      var hidden_input = $("<input type=\"text\"  name=\"" + $(input).attr('name') + "\" autocomplete=\"off\">")
+                             .hide()
+                             .val("")
+                             .focus(function () {
+                                 input_box.focus();
+                             })
+                             .blur(function () {
+                                 input_box.blur();
+                             })
+                             .insertBefore(input);
+    } else {
+    // Keep a reference to the original input box
+      var hidden_input = $(input)
+                             .hide()
+                             .val("")
+                             .focus(function () {
+                                 input_box.focus();
+                             })
+                             .blur(function () {
+                                 input_box.blur();
+                             });
+    }
+
+    // Keep a reference to the selected token and dropdown item
+    var selected_token = null;
+    var selected_token_index = 0;
+    var selected_dropdown_item = null;
+
+    // The list to store the token items in
+    var token_list = $("<ul />")
+        .addClass(settings.classes.tokenList)
+        .click(function (event) {
+            var li = $(event.target).closest("li");
+            if(li && li.get(0) && $.data(li.get(0), "tokeninput")) {
+                toggle_select_token(li);
+            } else {
+                // Deselect selected token
+                if(selected_token) {
+                    deselect_token($(selected_token), POSITION.END);
+                }
+
+                // Focus input box
+                input_box.focus();
+            }
+        })
+        .mouseover(function (event) {
+            var li = $(event.target).closest("li");
+            if(li && selected_token !== this) {
+                li.addClass(settings.classes.highlightedToken);
+            }
+        })
+        .mouseout(function (event) {
+            var li = $(event.target).closest("li");
+            if(li && selected_token !== this) {
+                li.removeClass(settings.classes.highlightedToken);
+            }
+        })
+        .insertBefore(hidden_input);
+
+    // The token holding the input box
+    var input_token = $("<li />")
+        .addClass(settings.classes.inputToken)
+        .appendTo(token_list)
+        .append(input_box);
+
+    // The list to store the dropdown items in
+    var dropdown = $("<div>")
+        .addClass(settings.classes.dropdown)
+        .appendTo("body")
+        .hide();
+
+    // Magic element to help us resize the text input
+    var input_resizer = $("<tester/>")
+        .insertAfter(input_box)
+        .css({
+            position: "absolute",
+            top: -9999,
+            left: -9999,
+            width: "auto",
+            fontSize: input_box.css("fontSize"),
+            fontFamily: input_box.css("fontFamily"),
+            fontWeight: input_box.css("fontWeight"),
+            letterSpacing: input_box.css("letterSpacing"),
+            whiteSpace: "nowrap"
+        });
+
+    // Pre-populate list if items exist
+    hidden_input.val("");
+    var li_data = settings.prePopulate || hidden_input.data("pre");
+    if(settings.processPrePopulate && $.isFunction(settings.onResult)) {
+        li_data = settings.onResult.call(hidden_input, li_data);
+    }    
+    if(li_data && li_data.length) {
+        $.each(li_data, function (index, value) {
+            insert_token(value.id, value.name);
+        });
+    }
+    
+    // Pre-populate from SELECT options
+    if ($(input).get(0).tagName == 'SELECT') {
+      $(input).children('option').each(function () {
+        insert_token($(this).attr('value'), $(this).text());
+      });
+    }
+
+
+
+    //
+    // Private functions
+    //
+
+    function resize_input() {
+        if(input_val === (input_val = input_box.val())) {return;}
+
+        // Enter new content into resizer and resize input accordingly
+        var escaped = input_val.replace(/&/g, '&amp;').replace(/\s/g,' ').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+        input_resizer.html(escaped);
+        input_box.width(input_resizer.width() + 30);
+    }
+
+    function is_printable_character(keycode) {
+        return ((keycode >= 48 && keycode <= 90) ||     // 0-1a-z
+                (keycode >= 96 && keycode <= 111) ||    // numpad 0-9 + - / * .
+                (keycode >= 186 && keycode <= 192) ||   // ; = , - . / ^
+                (keycode >= 219 && keycode <= 222));    // ( \ ) '
+    }
+
+    // Inner function to a token to the list
+    function insert_token(id, value) {
+        var this_token = $("<li><p>"+ value +"</p></li>")
+          .addClass(settings.classes.token)
+          .insertBefore(input_token);
+
+        // The 'delete token' button
+        $("<span>" + settings.deleteText + "</span>")
+            .addClass(settings.classes.tokenDelete)
+            .appendTo(this_token)
+            .click(function () {
+                delete_token($(this).parent());
+                return false;
+            });
+
+        // Store data on the token
+        var token_data = {"id": id, "name": value};
+        $.data(this_token.get(0), "tokeninput", token_data);
+
+        // Save this token for duplicate checking
+        saved_tokens = saved_tokens.slice(0,selected_token_index).concat([token_data]).concat(saved_tokens.slice(selected_token_index));
+        selected_token_index++;
+
+        // Update the hidden input
+        var token_ids = $.map(saved_tokens, function (el) {
+            return el.id;
+        });
+        hidden_input.val(token_ids.join(settings.tokenDelimiter));
+
+        token_count += 1;
+
+        return this_token;
+    }
+
+    // Add a token to the token list based on user input
+    function add_token (item) {
+        var li_data = $.data(item.get(0), "tokeninput");
+        var callback = settings.onAdd;
+
+        // See if the token already exists and select it if we don't want duplicates
+        if(token_count > 0 && settings.preventDuplicates) {
+            var found_existing_token = null;
+            token_list.children().each(function () {
+                var existing_token = $(this);
+                var existing_data = $.data(existing_token.get(0), "tokeninput");
+                if(existing_data && existing_data.id === li_data.id) {
+                    found_existing_token = existing_token;
+                    return false;
+                }
+            });
+
+            if(found_existing_token) {
+                select_token(found_existing_token);
+                input_token.insertAfter(found_existing_token);
+                input_box.focus();
+                return;
+            }
+        }
+
+        // Insert the new tokens
+        insert_token(li_data.id, li_data.name);
+
+        // Check the token limit
+        if(settings.tokenLimit !== null && token_count >= settings.tokenLimit) {
+            input_box.hide();
+            hide_dropdown();
+            return;
+        } else {
+            input_box.focus();
+        }
+
+        // Clear input box
+        input_box.val("");
+
+        // Don't show the help dropdown, they've got the idea
+        hide_dropdown();
+
+        // Execute the onAdd callback if defined
+        if($.isFunction(callback)) {
+            callback.call(hidden_input,li_data);
+        }
+    }
+
+    // Select a token in the token list
+    function select_token (token) {
+        token.addClass(settings.classes.selectedToken);
+        selected_token = token.get(0);
+
+        // Hide input box
+        input_box.val("");
+
+        // Hide dropdown if it is visible (eg if we clicked to select token)
+        hide_dropdown();
+    }
+
+    // Deselect a token in the token list
+    function deselect_token (token, position) {
+        token.removeClass(settings.classes.selectedToken);
+        selected_token = null;
+
+        if(position === POSITION.BEFORE) {
+            input_token.insertBefore(token);
+            selected_token_index--;
+        } else if(position === POSITION.AFTER) {
+            input_token.insertAfter(token);
+            selected_token_index++;
+        } else {
+            input_token.appendTo(token_list);
+            selected_token_index = token_count;
+        }
+
+        // Show the input box and give it focus again
+        input_box.focus();
+    }
+
+    // Toggle selection of a token in the token list
+    function toggle_select_token(token) {
+        var previous_selected_token = selected_token;
+
+        if(selected_token) {
+            deselect_token($(selected_token), POSITION.END);
+        }
+
+        if(previous_selected_token === token.get(0)) {
+            deselect_token(token, POSITION.END);
+        } else {
+            select_token(token);
+        }
+    }
+
+    // Delete a token from the token list
+    function delete_token (token) {
+        // Remove the id from the saved list
+        var token_data = $.data(token.get(0), "tokeninput");
+        var callback = settings.onDelete;
+
+        var index = token.prevAll().length;
+        if(index > selected_token_index) index--;
+
+        // Delete the token
+        token.remove();
+        selected_token = null;
+
+        // Show the input box and give it focus again
+        input_box.focus();
+
+        // Remove this token from the saved list
+        saved_tokens = saved_tokens.slice(0,index).concat(saved_tokens.slice(index+1));
+        if(index < selected_token_index) selected_token_index--;
+
+        // Update the hidden input
+        var token_ids = $.map(saved_tokens, function (el) {
+            return el.id;
+        });
+        hidden_input.val(token_ids.join(settings.tokenDelimiter));
+
+        token_count -= 1;
+
+        if(settings.tokenLimit !== null) {
+            input_box
+                .show()
+                .val("")
+                .focus();
+        }
+
+        // Execute the onDelete callback if defined
+        if($.isFunction(callback)) {
+            callback.call(hidden_input,token_data);
+        }
+    }
+
+    // Hide and clear the results dropdown
+    function hide_dropdown () {
+        dropdown.hide().empty();
+        selected_dropdown_item = null;
+    }
+
+    function show_dropdown() {
+        dropdown
+            .css({
+                position: "absolute",
+                top: $(token_list).offset().top + $(token_list).outerHeight(),
+                left: $(token_list).offset().left,
+                zindex: 999
+            })
+            .show();
+    }
+
+    function show_dropdown_searching () {
+        if(settings.searchingText) {
+            dropdown.html("<p>"+settings.searchingText+"</p>");
+            show_dropdown();
+        }
+    }
+
+    function show_dropdown_hint () {
+        if(settings.hintText) {
+            dropdown.html("<p>"+settings.hintText+"</p>");
+            show_dropdown();
+        }
+    }
+
+    // Highlight the query part of the search term
+    function highlight_term(value, term) {
+        return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<b>$1</b>");
+    }
+
+    // Populate the results dropdown with some results
+    function populate_dropdown (query, results) {
+        if(results && results.length) {
+            dropdown.empty();
+            var dropdown_ul = $("<ul>")
+                .appendTo(dropdown)
+                .mouseover(function (event) {
+                    select_dropdown_item($(event.target).closest("li"));
+                })
+                .mousedown(function (event) {
+                    add_token($(event.target).closest("li"));
+                    return false;
+                })
+                .hide();
+
+            $.each(results, function(index, value) {
+                var this_li = $("<li>" + highlight_term(value.name, query) + "</li>")
+                                  .appendTo(dropdown_ul);
+
+                if(index % 2) {
+                    this_li.addClass(settings.classes.dropdownItem);
+                } else {
+                    this_li.addClass(settings.classes.dropdownItem2);
+                }
+
+                if(index === 0) {
+                    select_dropdown_item(this_li);
+                }
+
+                $.data(this_li.get(0), "tokeninput", {"id": value.id, "name": value.name});
+            });
+
+            show_dropdown();
+
+            if(settings.animateDropdown) {
+                dropdown_ul.slideDown("fast");
+            } else {
+                dropdown_ul.show();
+            }
+        } else {
+            if(settings.noResultsText) {
+                dropdown.html("<p>"+settings.noResultsText+"</p>");
+                show_dropdown();
+            }
+        }
+    }
+
+    // Highlight an item in the results dropdown
+    function select_dropdown_item (item) {
+        if(item) {
+            if(selected_dropdown_item) {
+                deselect_dropdown_item($(selected_dropdown_item));
+            }
+
+            item.addClass(settings.classes.selectedDropdownItem);
+            selected_dropdown_item = item.get(0);
+        }
+    }
+
+    // Remove highlighting from an item in the results dropdown
+    function deselect_dropdown_item (item) {
+        item.removeClass(settings.classes.selectedDropdownItem);
+        selected_dropdown_item = null;
+    }
+
+    // Do a search and show the "searching" dropdown if the input is longer
+    // than settings.minChars
+    function do_search() {
+        var query = input_box.val().toLowerCase();
+
+        if(query && query.length) {
+            if(selected_token) {
+                deselect_token($(selected_token), POSITION.AFTER);
+            }
+
+            if(query.length >= settings.minChars) {
+                show_dropdown_searching();
+                clearTimeout(timeout);
+
+                timeout = setTimeout(function(){
+                    run_search(query);
+                }, settings.searchDelay);
+            } else {
+                hide_dropdown();
+            }
+        }
+    }
+
+    // Do the actual search
+    function run_search(query) {
+        var cached_results = cache.get(query);
+        if(cached_results) {
+            populate_dropdown(query, cached_results);
+        } else {
+            // Are we doing an ajax search or local data search?
+            if(settings.url) {
+                // Extract exisiting get params
+                var ajax_params = {};
+                ajax_params.data = {};
+                if(settings.url.indexOf("?") > -1) {
+                    var parts = settings.url.split("?");
+                    ajax_params.url = parts[0];
+
+                    var param_array = parts[1].split("&");
+                    $.each(param_array, function (index, value) {
+                        var kv = value.split("=");
+                        ajax_params.data[kv[0]] = kv[1];
+                    });
+                } else {
+                    ajax_params.url = settings.url;
+                }
+
+                // Prepare the request
+                ajax_params.data[settings.queryParam] = query;
+                ajax_params.type = settings.method;
+                ajax_params.dataType = settings.contentType;
+                if(settings.crossDomain) {
+                    ajax_params.dataType = "jsonp";
+                }
+
+                // Attach the success callback
+                ajax_params.success = function(results) {
+                  if($.isFunction(settings.onResult)) {
+                      results = settings.onResult.call(hidden_input, results);
+                  }
+                  
+                  if(settings.allowCreation) {
+                      results.push({name: input_box.val() + settings.newText, id: input_box.val()});
+                  }
+                  cache.add(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
+
+                  // only populate the dropdown if the results are associated with the active search query
+                  if(input_box.val().toLowerCase() === query) {
+                      populate_dropdown(query, settings.jsonContainer ? results[settings.jsonContainer] : results);
+                  }
+                };
+
+                // Make the request
+                $.ajax(ajax_params);
+            } else if(settings.local_data) {
+                // Do the search through local data
+                var results = $.grep(settings.local_data, function (row) {
+                    return row.name.toLowerCase().indexOf(query.toLowerCase()) > -1;
+                });
+
+                if($.isFunction(settings.onResult)) {
+                    results = settings.onResult.call(hidden_input, results);
+                }
+                
+                if(settings.allowCreation) {
+                    results.push({name: input_box.val() + settings.newText, id: input_box.val()});
+                }
+                
+                cache.add(query, results);                
+                
+                populate_dropdown(query, results);
+            }
+        }
+    }
+    
+    if ($(input).get(0).tagName == 'SELECT') {
+      $(input).remove();
+    }
+};
+
+// Really basic cache for the results
+$.TokenList.Cache = function (options) {
+    var settings = $.extend({
+        max_size: 500
+    }, options);
+
+    var data = {};
+    var size = 0;
+
+    var flush = function () {
+        data = {};
+        size = 0;
+    };
+
+    this.add = function (query, results) {
+        if(size > settings.max_size) {
+            flush();
+        }
+
+        if(!data[query]) {
+            size += 1;
+        }
+
+        data[query] = results;
+    };
+
+    this.get = function (query) {
+        return data[query];
+    };
+};
+}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/pngfix.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/pngfix.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/pngfix.js	(revision 14585)
@@ -0,0 +1,37 @@
+
+// Correctly handle PNG transparency in Win IE 5.5 or higher.
+// http://homepage.ntlworld.com/bobosola. Updated 02-March-2004
+// 15-Jully-2006 : chrisaga use \" instead of ' in imgTitle
+//		 : to fix ' display in tooltips
+//		 : keep the alt attribute
+
+function correctPNG() 
+   {
+   for(var i=0; i<document.images.length; i++)
+      {
+      var img = document.images[i]
+      //if (img.className == "button" || img.className == "icon")
+          {
+	  var imgName = img.src.toUpperCase()
+	  if (imgName.substring(imgName.length-3, imgName.length) == "PNG")
+	     {
+		 var imgID = (img.id) ? "id='" + img.id + "' " : ""
+		 var imgClass = (img.className) ? "class='" + img.className + "' " : ""
+		 //var imgTitle = (img.title) ? "title=\"" + img.title + "\" " : "alt=\"" + img.alt + "\" "
+		 var imgTitle = (img.title) ? "title=\"" + img.title + "\" " : "";
+		 imgTitle = imgTitle + (img.alt) ? "title=\"" + img.alt + "\" " : "";
+		 var imgStyle = "display:inline-block;" + img.style.cssText 
+		 if (img.align == "left") imgStyle = "float:left;" + imgStyle
+		 if (img.align == "right") imgStyle = "float:right;" + imgStyle
+		 if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle		
+		 var strNewHTML = "<span " + imgID + imgClass + imgTitle
+		 + " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
+	     + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
+		 + "(src=\'" + img.src + "\', sizingMethod='scale');\"></span>" 
+		 img.outerHTML = strNewHTML
+		 i = i-1
+	     }
+          }
+      }
+   }
+window.attachEvent("onload", correctPNG);
Index: tags/2.4.0RC3/themes/default/js/raphael.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/raphael.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/raphael.js	(revision 14585)
@@ -0,0 +1,5501 @@
+// ┌────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël 2.0.2 - JavaScript Vector Library                          │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com)    │ \\
+// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com)              │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
+// └────────────────────────────────────────────────────────────────────┘ \\
+// ┌──────────────────────────────────────────────────────────────────────────────────────┐ \\
+// │ Eve 0.3.4 - JavaScript Events Library                                                │ \\
+// ├──────────────────────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://dmitry.baranovskiy.com/)          │ \\
+// │ Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license. │ \\
+// └──────────────────────────────────────────────────────────────────────────────────────┘ \\
+
+(function (glob) {
+    var version = "0.3.4",
+        has = "hasOwnProperty",
+        separator = /[\.\/]/,
+        wildcard = "*",
+        fun = function () {},
+        numsort = function (a, b) {
+            return a - b;
+        },
+        current_event,
+        stop,
+        events = {n: {}},
+    
+        eve = function (name, scope) {
+            var e = events,
+                oldstop = stop,
+                args = Array.prototype.slice.call(arguments, 2),
+                listeners = eve.listeners(name),
+                z = 0,
+                f = false,
+                l,
+                indexed = [],
+                queue = {},
+                out = [],
+                ce = current_event,
+                errors = [];
+            current_event = name;
+            stop = 0;
+            for (var i = 0, ii = listeners.length; i < ii; i++) if ("zIndex" in listeners[i]) {
+                indexed.push(listeners[i].zIndex);
+                if (listeners[i].zIndex < 0) {
+                    queue[listeners[i].zIndex] = listeners[i];
+                }
+            }
+            indexed.sort(numsort);
+            while (indexed[z] < 0) {
+                l = queue[indexed[z++]];
+                out.push(l.apply(scope, args));
+                if (stop) {
+                    stop = oldstop;
+                    return out;
+                }
+            }
+            for (i = 0; i < ii; i++) {
+                l = listeners[i];
+                if ("zIndex" in l) {
+                    if (l.zIndex == indexed[z]) {
+                        out.push(l.apply(scope, args));
+                        if (stop) {
+                            break;
+                        }
+                        do {
+                            z++;
+                            l = queue[indexed[z]];
+                            l && out.push(l.apply(scope, args));
+                            if (stop) {
+                                break;
+                            }
+                        } while (l)
+                    } else {
+                        queue[l.zIndex] = l;
+                    }
+                } else {
+                    out.push(l.apply(scope, args));
+                    if (stop) {
+                        break;
+                    }
+                }
+            }
+            stop = oldstop;
+            current_event = ce;
+            return out.length ? out : null;
+        };
+    
+    eve.listeners = function (name) {
+        var names = name.split(separator),
+            e = events,
+            item,
+            items,
+            k,
+            i,
+            ii,
+            j,
+            jj,
+            nes,
+            es = [e],
+            out = [];
+        for (i = 0, ii = names.length; i < ii; i++) {
+            nes = [];
+            for (j = 0, jj = es.length; j < jj; j++) {
+                e = es[j].n;
+                items = [e[names[i]], e[wildcard]];
+                k = 2;
+                while (k--) {
+                    item = items[k];
+                    if (item) {
+                        nes.push(item);
+                        out = out.concat(item.f || []);
+                    }
+                }
+            }
+            es = nes;
+        }
+        return out;
+    };
+    
+    
+    eve.on = function (name, f) {
+        var names = name.split(separator),
+            e = events;
+        for (var i = 0, ii = names.length; i < ii; i++) {
+            e = e.n;
+            !e[names[i]] && (e[names[i]] = {n: {}});
+            e = e[names[i]];
+        }
+        e.f = e.f || [];
+        for (i = 0, ii = e.f.length; i < ii; i++) if (e.f[i] == f) {
+            return fun;
+        }
+        e.f.push(f);
+        return function (zIndex) {
+            if (+zIndex == +zIndex) {
+                f.zIndex = +zIndex;
+            }
+        };
+    };
+    
+    eve.stop = function () {
+        stop = 1;
+    };
+    
+    eve.nt = function (subname) {
+        if (subname) {
+            return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event);
+        }
+        return current_event;
+    };
+    
+    
+    eve.off = eve.unbind = function (name, f) {
+        var names = name.split(separator),
+            e,
+            key,
+            splice,
+            i, ii, j, jj,
+            cur = [events];
+        for (i = 0, ii = names.length; i < ii; i++) {
+            for (j = 0; j < cur.length; j += splice.length - 2) {
+                splice = [j, 1];
+                e = cur[j].n;
+                if (names[i] != wildcard) {
+                    if (e[names[i]]) {
+                        splice.push(e[names[i]]);
+                    }
+                } else {
+                    for (key in e) if (e[has](key)) {
+                        splice.push(e[key]);
+                    }
+                }
+                cur.splice.apply(cur, splice);
+            }
+        }
+        for (i = 0, ii = cur.length; i < ii; i++) {
+            e = cur[i];
+            while (e.n) {
+                if (f) {
+                    if (e.f) {
+                        for (j = 0, jj = e.f.length; j < jj; j++) if (e.f[j] == f) {
+                            e.f.splice(j, 1);
+                            break;
+                        }
+                        !e.f.length && delete e.f;
+                    }
+                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {
+                        var funcs = e.n[key].f;
+                        for (j = 0, jj = funcs.length; j < jj; j++) if (funcs[j] == f) {
+                            funcs.splice(j, 1);
+                            break;
+                        }
+                        !funcs.length && delete e.n[key].f;
+                    }
+                } else {
+                    delete e.f;
+                    for (key in e.n) if (e.n[has](key) && e.n[key].f) {
+                        delete e.n[key].f;
+                    }
+                }
+                e = e.n;
+            }
+        }
+    };
+    
+    eve.once = function (name, f) {
+        var f2 = function () {
+            var res = f.apply(this, arguments);
+            eve.unbind(name, f2);
+            return res;
+        };
+        return eve.on(name, f2);
+    };
+    
+    eve.version = version;
+    eve.toString = function () {
+        return "You are running Eve " + version;
+    };
+    (typeof module != "undefined" && module.exports) ? (module.exports = eve) : (typeof define != "undefined" ? (define("eve", [], function() { return eve; })) : (glob.eve = eve));
+})(this);
+
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ "Raphaël 2.0.2" - JavaScript Vector Library                         │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+(function () {
+    
+    function R(first) {
+        if (R.is(first, "function")) {
+            return loaded ? first() : eve.on("DOMload", first);
+        } else if (R.is(first, array)) {
+            return R._engine.create[apply](R, first.splice(0, 3 + R.is(first[0], nu))).add(first);
+        } else {
+            var args = Array.prototype.slice.call(arguments, 0);
+            if (R.is(args[args.length - 1], "function")) {
+                var f = args.pop();
+                return loaded ? f.call(R._engine.create[apply](R, args)) : eve.on("DOMload", function () {
+                    f.call(R._engine.create[apply](R, args));
+                });
+            } else {
+                return R._engine.create[apply](R, arguments);
+            }
+        }
+    }
+    R.version = "2.0.2";
+    R.eve = eve;
+    var loaded,
+        separator = /[, ]+/,
+        elements = {circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1},
+        formatrg = /\{(\d+)\}/g,
+        proto = "prototype",
+        has = "hasOwnProperty",
+        g = {
+            doc: document,
+            win: window
+        },
+        oldRaphael = {
+            was: Object.prototype[has].call(g.win, "Raphael"),
+            is: g.win.Raphael
+        },
+        Paper = function () {
+            
+            
+            this.ca = this.customAttributes = {};
+        },
+        paperproto,
+        appendChild = "appendChild",
+        apply = "apply",
+        concat = "concat",
+        supportsTouch = "createTouch" in g.doc,
+        E = "",
+        S = " ",
+        Str = String,
+        split = "split",
+        events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[split](S),
+        touchMap = {
+            mousedown: "touchstart",
+            mousemove: "touchmove",
+            mouseup: "touchend"
+        },
+        lowerCase = Str.prototype.toLowerCase,
+        math = Math,
+        mmax = math.max,
+        mmin = math.min,
+        abs = math.abs,
+        pow = math.pow,
+        PI = math.PI,
+        nu = "number",
+        string = "string",
+        array = "array",
+        toString = "toString",
+        fillString = "fill",
+        objectToString = Object.prototype.toString,
+        paper = {},
+        push = "push",
+        ISURL = R._ISURL = /^url\(['"]?([^\)]+?)['"]?\)$/i,
+        colourRegExp = /^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,
+        isnan = {"NaN": 1, "Infinity": 1, "-Infinity": 1},
+        bezierrg = /^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,
+        round = math.round,
+        setAttribute = "setAttribute",
+        toFloat = parseFloat,
+        toInt = parseInt,
+        upperCase = Str.prototype.toUpperCase,
+        availableAttrs = R._availableAttrs = {
+            "arrow-end": "none",
+            "arrow-start": "none",
+            blur: 0,
+            "clip-rect": "0 0 1e9 1e9",
+            cursor: "default",
+            cx: 0,
+            cy: 0,
+            fill: "#fff",
+            "fill-opacity": 1,
+            font: '10px "Arial"',
+            "font-family": '"Arial"',
+            "font-size": "10",
+            "font-style": "normal",
+            "font-weight": 400,
+            gradient: 0,
+            height: 0,
+            href: "http://raphaeljs.com/",
+            "letter-spacing": 0,
+            opacity: 1,
+            path: "M0,0",
+            r: 0,
+            rx: 0,
+            ry: 0,
+            src: "",
+            stroke: "#000",
+            "stroke-dasharray": "",
+            "stroke-linecap": "butt",
+            "stroke-linejoin": "butt",
+            "stroke-miterlimit": 0,
+            "stroke-opacity": 1,
+            "stroke-width": 1,
+            target: "_blank",
+            "text-anchor": "middle",
+            title: "Raphael",
+            transform: "",
+            width: 0,
+            x: 0,
+            y: 0
+        },
+        availableAnimAttrs = R._availableAnimAttrs = {
+            blur: nu,
+            "clip-rect": "csv",
+            cx: nu,
+            cy: nu,
+            fill: "colour",
+            "fill-opacity": nu,
+            "font-size": nu,
+            height: nu,
+            opacity: nu,
+            path: "path",
+            r: nu,
+            rx: nu,
+            ry: nu,
+            stroke: "colour",
+            "stroke-opacity": nu,
+            "stroke-width": nu,
+            transform: "transform",
+            width: nu,
+            x: nu,
+            y: nu
+        },
+        whitespace = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,
+        commaSpaces = /[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,
+        hsrg = {hs: 1, rg: 1},
+        p2s = /,?([achlmqrstvxz]),?/gi,
+        pathCommand = /([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,
+        tCommand = /([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,
+        pathValues = /(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,
+        radial_gradient = R._radial_gradient = /^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,
+        eldata = {},
+        sortByKey = function (a, b) {
+            return a.key - b.key;
+        },
+        sortByNumber = function (a, b) {
+            return toFloat(a) - toFloat(b);
+        },
+        fun = function () {},
+        pipe = function (x) {
+            return x;
+        },
+        rectPath = R._rectPath = function (x, y, w, h, r) {
+            if (r) {
+                return [["M", x + r, y], ["l", w - r * 2, 0], ["a", r, r, 0, 0, 1, r, r], ["l", 0, h - r * 2], ["a", r, r, 0, 0, 1, -r, r], ["l", r * 2 - w, 0], ["a", r, r, 0, 0, 1, -r, -r], ["l", 0, r * 2 - h], ["a", r, r, 0, 0, 1, r, -r], ["z"]];
+            }
+            return [["M", x, y], ["l", w, 0], ["l", 0, h], ["l", -w, 0], ["z"]];
+        },
+        ellipsePath = function (x, y, rx, ry) {
+            if (ry == null) {
+                ry = rx;
+            }
+            return [["M", x, y], ["m", 0, -ry], ["a", rx, ry, 0, 1, 1, 0, 2 * ry], ["a", rx, ry, 0, 1, 1, 0, -2 * ry], ["z"]];
+        },
+        getPath = R._getPath = {
+            path: function (el) {
+                return el.attr("path");
+            },
+            circle: function (el) {
+                var a = el.attrs;
+                return ellipsePath(a.cx, a.cy, a.r);
+            },
+            ellipse: function (el) {
+                var a = el.attrs;
+                return ellipsePath(a.cx, a.cy, a.rx, a.ry);
+            },
+            rect: function (el) {
+                var a = el.attrs;
+                return rectPath(a.x, a.y, a.width, a.height, a.r);
+            },
+            image: function (el) {
+                var a = el.attrs;
+                return rectPath(a.x, a.y, a.width, a.height);
+            },
+            text: function (el) {
+                var bbox = el._getBBox();
+                return rectPath(bbox.x, bbox.y, bbox.width, bbox.height);
+            }
+        },
+        mapPath = R.mapPath = function (path, matrix) {
+            if (!matrix) {
+                return path;
+            }
+            var x, y, i, j, ii, jj, pathi;
+            path = path2curve(path);
+            for (i = 0, ii = path.length; i < ii; i++) {
+                pathi = path[i];
+                for (j = 1, jj = pathi.length; j < jj; j += 2) {
+                    x = matrix.x(pathi[j], pathi[j + 1]);
+                    y = matrix.y(pathi[j], pathi[j + 1]);
+                    pathi[j] = x;
+                    pathi[j + 1] = y;
+                }
+            }
+            return path;
+        };
+
+    R._g = g;
+    
+    R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML");
+    if (R.type == "VML") {
+        var d = g.doc.createElement("div"),
+            b;
+        d.innerHTML = '<v:shape adj="1"/>';
+        b = d.firstChild;
+        b.style.behavior = "url(#default#VML)";
+        if (!(b && typeof b.adj == "object")) {
+            return (R.type = E);
+        }
+        d = null;
+    }
+    
+    
+    R.svg = !(R.vml = R.type == "VML");
+    R._Paper = Paper;
+    
+    R.fn = paperproto = Paper.prototype = R.prototype;
+    R._id = 0;
+    R._oid = 0;
+    
+    R.is = function (o, type) {
+        type = lowerCase.call(type);
+        if (type == "finite") {
+            return !isnan[has](+o);
+        }
+        if (type == "array") {
+            return o instanceof Array;
+        }
+        return  (type == "null" && o === null) ||
+                (type == typeof o && o !== null) ||
+                (type == "object" && o === Object(o)) ||
+                (type == "array" && Array.isArray && Array.isArray(o)) ||
+                objectToString.call(o).slice(8, -1).toLowerCase() == type;
+    };
+    
+    R.angle = function (x1, y1, x2, y2, x3, y3) {
+        if (x3 == null) {
+            var x = x1 - x2,
+                y = y1 - y2;
+            if (!x && !y) {
+                return 0;
+            }
+            return (180 + math.atan2(-y, -x) * 180 / PI + 360) % 360;
+        } else {
+            return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3);
+        }
+    };
+    
+    R.rad = function (deg) {
+        return deg % 360 * PI / 180;
+    };
+    
+    R.deg = function (rad) {
+        return rad * 180 / PI % 360;
+    };
+    
+    R.snapTo = function (values, value, tolerance) {
+        tolerance = R.is(tolerance, "finite") ? tolerance : 10;
+        if (R.is(values, array)) {
+            var i = values.length;
+            while (i--) if (abs(values[i] - value) <= tolerance) {
+                return values[i];
+            }
+        } else {
+            values = +values;
+            var rem = value % values;
+            if (rem < tolerance) {
+                return value - rem;
+            }
+            if (rem > values - tolerance) {
+                return value - rem + values;
+            }
+        }
+        return value;
+    };
+    
+    
+    var createUUID = R.createUUID = (function (uuidRegEx, uuidReplacer) {
+        return function () {
+            return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(uuidRegEx, uuidReplacer).toUpperCase();
+        };
+    })(/[xy]/g, function (c) {
+        var r = math.random() * 16 | 0,
+            v = c == "x" ? r : (r & 3 | 8);
+        return v.toString(16);
+    });
+
+    
+    R.setWindow = function (newwin) {
+        eve("setWindow", R, g.win, newwin);
+        g.win = newwin;
+        g.doc = g.win.document;
+        if (R._engine.initWin) {
+            R._engine.initWin(g.win);
+        }
+    };
+    var toHex = function (color) {
+        if (R.vml) {
+            // http://dean.edwards.name/weblog/2009/10/convert-any-colour-value-to-hex-in-msie/
+            var trim = /^\s+|\s+$/g;
+            var bod;
+            try {
+                var docum = new ActiveXObject("htmlfile");
+                docum.write("<body>");
+                docum.close();
+                bod = docum.body;
+            } catch(e) {
+                bod = createPopup().document.body;
+            }
+            var range = bod.createTextRange();
+            toHex = cacher(function (color) {
+                try {
+                    bod.style.color = Str(color).replace(trim, E);
+                    var value = range.queryCommandValue("ForeColor");
+                    value = ((value & 255) << 16) | (value & 65280) | ((value & 16711680) >>> 16);
+                    return "#" + ("000000" + value.toString(16)).slice(-6);
+                } catch(e) {
+                    return "none";
+                }
+            });
+        } else {
+            var i = g.doc.createElement("i");
+            i.title = "Rapha\xebl Colour Picker";
+            i.style.display = "none";
+            g.doc.body.appendChild(i);
+            toHex = cacher(function (color) {
+                i.style.color = color;
+                return g.doc.defaultView.getComputedStyle(i, E).getPropertyValue("color");
+            });
+        }
+        return toHex(color);
+    },
+    hsbtoString = function () {
+        return "hsb(" + [this.h, this.s, this.b] + ")";
+    },
+    hsltoString = function () {
+        return "hsl(" + [this.h, this.s, this.l] + ")";
+    },
+    rgbtoString = function () {
+        return this.hex;
+    },
+    prepareRGB = function (r, g, b) {
+        if (g == null && R.is(r, "object") && "r" in r && "g" in r && "b" in r) {
+            b = r.b;
+            g = r.g;
+            r = r.r;
+        }
+        if (g == null && R.is(r, string)) {
+            var clr = R.getRGB(r);
+            r = clr.r;
+            g = clr.g;
+            b = clr.b;
+        }
+        if (r > 1 || g > 1 || b > 1) {
+            r /= 255;
+            g /= 255;
+            b /= 255;
+        }
+        
+        return [r, g, b];
+    },
+    packageRGB = function (r, g, b, o) {
+        r *= 255;
+        g *= 255;
+        b *= 255;
+        var rgb = {
+            r: r,
+            g: g,
+            b: b,
+            hex: R.rgb(r, g, b),
+            toString: rgbtoString
+        };
+        R.is(o, "finite") && (rgb.opacity = o);
+        return rgb;
+    };
+    
+    
+    R.color = function (clr) {
+        var rgb;
+        if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) {
+            rgb = R.hsb2rgb(clr);
+            clr.r = rgb.r;
+            clr.g = rgb.g;
+            clr.b = rgb.b;
+            clr.hex = rgb.hex;
+        } else if (R.is(clr, "object") && "h" in clr && "s" in clr && "l" in clr) {
+            rgb = R.hsl2rgb(clr);
+            clr.r = rgb.r;
+            clr.g = rgb.g;
+            clr.b = rgb.b;
+            clr.hex = rgb.hex;
+        } else {
+            if (R.is(clr, "string")) {
+                clr = R.getRGB(clr);
+            }
+            if (R.is(clr, "object") && "r" in clr && "g" in clr && "b" in clr) {
+                rgb = R.rgb2hsl(clr);
+                clr.h = rgb.h;
+                clr.s = rgb.s;
+                clr.l = rgb.l;
+                rgb = R.rgb2hsb(clr);
+                clr.v = rgb.b;
+            } else {
+                clr = {hex: "none"};
+                clr.r = clr.g = clr.b = clr.h = clr.s = clr.v = clr.l = -1;
+            }
+        }
+        clr.toString = rgbtoString;
+        return clr;
+    };
+    
+    R.hsb2rgb = function (h, s, v, o) {
+        if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) {
+            v = h.b;
+            s = h.s;
+            h = h.h;
+            o = h.o;
+        }
+        h *= 360;
+        var R, G, B, X, C;
+        h = (h % 360) / 60;
+        C = v * s;
+        X = C * (1 - abs(h % 2 - 1));
+        R = G = B = v - C;
+
+        h = ~~h;
+        R += [C, X, 0, 0, X, C][h];
+        G += [X, C, C, X, 0, 0][h];
+        B += [0, 0, X, C, C, X][h];
+        return packageRGB(R, G, B, o);
+    };
+    
+    R.hsl2rgb = function (h, s, l, o) {
+        if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) {
+            l = h.l;
+            s = h.s;
+            h = h.h;
+        }
+        if (h > 1 || s > 1 || l > 1) {
+            h /= 360;
+            s /= 100;
+            l /= 100;
+        }
+        h *= 360;
+        var R, G, B, X, C;
+        h = (h % 360) / 60;
+        C = 2 * s * (l < .5 ? l : 1 - l);
+        X = C * (1 - abs(h % 2 - 1));
+        R = G = B = l - C / 2;
+
+        h = ~~h;
+        R += [C, X, 0, 0, X, C][h];
+        G += [X, C, C, X, 0, 0][h];
+        B += [0, 0, X, C, C, X][h];
+        return packageRGB(R, G, B, o);
+    };
+    
+    R.rgb2hsb = function (r, g, b) {
+        b = prepareRGB(r, g, b);
+        r = b[0];
+        g = b[1];
+        b = b[2];
+
+        var H, S, V, C;
+        V = mmax(r, g, b);
+        C = V - mmin(r, g, b);
+        H = (C == 0 ? null :
+             V == r ? (g - b) / C :
+             V == g ? (b - r) / C + 2 :
+                      (r - g) / C + 4
+            );
+        H = ((H + 360) % 6) * 60 / 360;
+        S = C == 0 ? 0 : C / V;
+        return {h: H, s: S, b: V, toString: hsbtoString};
+    };
+    
+    R.rgb2hsl = function (r, g, b) {
+        b = prepareRGB(r, g, b);
+        r = b[0];
+        g = b[1];
+        b = b[2];
+
+        var H, S, L, M, m, C;
+        M = mmax(r, g, b);
+        m = mmin(r, g, b);
+        C = M - m;
+        H = (C == 0 ? null :
+             M == r ? (g - b) / C :
+             M == g ? (b - r) / C + 2 :
+                      (r - g) / C + 4);
+        H = ((H + 360) % 6) * 60 / 360;
+        L = (M + m) / 2;
+        S = (C == 0 ? 0 :
+             L < .5 ? C / (2 * L) :
+                      C / (2 - 2 * L));
+        return {h: H, s: S, l: L, toString: hsltoString};
+    };
+    R._path2string = function () {
+        return this.join(",").replace(p2s, "$1");
+    };
+    function repush(array, item) {
+        for (var i = 0, ii = array.length; i < ii; i++) if (array[i] === item) {
+            return array.push(array.splice(i, 1)[0]);
+        }
+    }
+    function cacher(f, scope, postprocessor) {
+        function newf() {
+            var arg = Array.prototype.slice.call(arguments, 0),
+                args = arg.join("\u2400"),
+                cache = newf.cache = newf.cache || {},
+                count = newf.count = newf.count || [];
+            if (cache[has](args)) {
+                repush(count, args);
+                return postprocessor ? postprocessor(cache[args]) : cache[args];
+            }
+            count.length >= 1e3 && delete cache[count.shift()];
+            count.push(args);
+            cache[args] = f[apply](scope, arg);
+            return postprocessor ? postprocessor(cache[args]) : cache[args];
+        }
+        return newf;
+    }
+
+    var preload = R._preload = function (src, f) {
+        var img = g.doc.createElement("img");
+        img.style.cssText = "position:absolute;left:-9999em;top:-9999em";
+        img.onload = function () {
+            f.call(this);
+            this.onload = null;
+            g.doc.body.removeChild(this);
+        };
+        img.onerror = function () {
+            g.doc.body.removeChild(this);
+        };
+        g.doc.body.appendChild(img);
+        img.src = src;
+    };
+    
+    function clrToString() {
+        return this.hex;
+    }
+
+    
+    R.getRGB = cacher(function (colour) {
+        if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) {
+            return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
+        }
+        if (colour == "none") {
+            return {r: -1, g: -1, b: -1, hex: "none", toString: clrToString};
+        }
+        !(hsrg[has](colour.toLowerCase().substring(0, 2)) || colour.charAt() == "#") && (colour = toHex(colour));
+        var res,
+            red,
+            green,
+            blue,
+            opacity,
+            t,
+            values,
+            rgb = colour.match(colourRegExp);
+        if (rgb) {
+            if (rgb[2]) {
+                blue = toInt(rgb[2].substring(5), 16);
+                green = toInt(rgb[2].substring(3, 5), 16);
+                red = toInt(rgb[2].substring(1, 3), 16);
+            }
+            if (rgb[3]) {
+                blue = toInt((t = rgb[3].charAt(3)) + t, 16);
+                green = toInt((t = rgb[3].charAt(2)) + t, 16);
+                red = toInt((t = rgb[3].charAt(1)) + t, 16);
+            }
+            if (rgb[4]) {
+                values = rgb[4][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                rgb[1].toLowerCase().slice(0, 4) == "rgba" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+            }
+            if (rgb[5]) {
+                values = rgb[5][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
+                rgb[1].toLowerCase().slice(0, 4) == "hsba" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+                return R.hsb2rgb(red, green, blue, opacity);
+            }
+            if (rgb[6]) {
+                values = rgb[6][split](commaSpaces);
+                red = toFloat(values[0]);
+                values[0].slice(-1) == "%" && (red *= 2.55);
+                green = toFloat(values[1]);
+                values[1].slice(-1) == "%" && (green *= 2.55);
+                blue = toFloat(values[2]);
+                values[2].slice(-1) == "%" && (blue *= 2.55);
+                (values[0].slice(-3) == "deg" || values[0].slice(-1) == "\xb0") && (red /= 360);
+                rgb[1].toLowerCase().slice(0, 4) == "hsla" && (opacity = toFloat(values[3]));
+                values[3] && values[3].slice(-1) == "%" && (opacity /= 100);
+                return R.hsl2rgb(red, green, blue, opacity);
+            }
+            rgb = {r: red, g: green, b: blue, toString: clrToString};
+            rgb.hex = "#" + (16777216 | blue | (green << 8) | (red << 16)).toString(16).slice(1);
+            R.is(opacity, "finite") && (rgb.opacity = opacity);
+            return rgb;
+        }
+        return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString};
+    }, R);
+    
+    R.hsb = cacher(function (h, s, b) {
+        return R.hsb2rgb(h, s, b).hex;
+    });
+    
+    R.hsl = cacher(function (h, s, l) {
+        return R.hsl2rgb(h, s, l).hex;
+    });
+    
+    R.rgb = cacher(function (r, g, b) {
+        return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1);
+    });
+    
+    R.getColor = function (value) {
+        var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75},
+            rgb = this.hsb2rgb(start.h, start.s, start.b);
+        start.h += .075;
+        if (start.h > 1) {
+            start.h = 0;
+            start.s -= .2;
+            start.s <= 0 && (this.getColor.start = {h: 0, s: 1, b: start.b});
+        }
+        return rgb.hex;
+    };
+    
+    R.getColor.reset = function () {
+        delete this.start;
+    };
+
+    // http://schepers.cc/getting-to-the-point
+    function catmullRom2bezier(crp, z) {
+        var d = [];
+        for (var i = 0, iLen = crp.length; iLen - 2 * !z > i; i += 2) {
+            var p = [
+                        {x: +crp[i - 2], y: +crp[i - 1]},
+                        {x: +crp[i],     y: +crp[i + 1]},
+                        {x: +crp[i + 2], y: +crp[i + 3]},
+                        {x: +crp[i + 4], y: +crp[i + 5]}
+                    ];
+            if (z) {
+                if (!i) {
+                    p[0] = {x: +crp[iLen - 2], y: +crp[iLen - 1]};
+                } else if (iLen - 4 == i) {
+                    p[3] = {x: +crp[0], y: +crp[1]};
+                } else if (iLen - 2 == i) {
+                    p[2] = {x: +crp[0], y: +crp[1]};
+                    p[3] = {x: +crp[2], y: +crp[3]};
+                }
+            } else {
+                if (iLen - 4 == i) {
+                    p[3] = p[2];
+                } else if (!i) {
+                    p[0] = {x: +crp[i], y: +crp[i + 1]};
+                }
+            }
+            d.push(["C",
+                  (-p[0].x + 6 * p[1].x + p[2].x) / 6,
+                  (-p[0].y + 6 * p[1].y + p[2].y) / 6,
+                  (p[1].x + 6 * p[2].x - p[3].x) / 6,
+                  (p[1].y + 6*p[2].y - p[3].y) / 6,
+                  p[2].x,
+                  p[2].y
+            ]);
+        }
+
+          return d;
+      }
+    
+    R.parsePathString = cacher(function (pathString) {
+        if (!pathString) {
+            return null;
+        }
+        var paramCounts = {a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0},
+            data = [];
+        if (R.is(pathString, array) && R.is(pathString[0], array)) { // rough assumption
+            data = pathClone(pathString);
+        }
+        if (!data.length) {
+            Str(pathString).replace(pathCommand, function (a, b, c) {
+                var params = [],
+                    name = b.toLowerCase();
+                c.replace(pathValues, function (a, b) {
+                    b && params.push(+b);
+                });
+                if (name == "m" && params.length > 2) {
+                    data.push([b][concat](params.splice(0, 2)));
+                    name = "l";
+                    b = b == "m" ? "l" : "L";
+                }
+                if (name == "r") {
+                    data.push([b][concat](params));
+                } else while (params.length >= paramCounts[name]) {
+                    data.push([b][concat](params.splice(0, paramCounts[name])));
+                    if (!paramCounts[name]) {
+                        break;
+                    }
+                }
+            });
+        }
+        data.toString = R._path2string;
+        return data;
+    });
+    
+    R.parseTransformString = cacher(function (TString) {
+        if (!TString) {
+            return null;
+        }
+        var paramCounts = {r: 3, s: 4, t: 2, m: 6},
+            data = [];
+        if (R.is(TString, array) && R.is(TString[0], array)) { // rough assumption
+            data = pathClone(TString);
+        }
+        if (!data.length) {
+            Str(TString).replace(tCommand, function (a, b, c) {
+                var params = [],
+                    name = lowerCase.call(b);
+                c.replace(pathValues, function (a, b) {
+                    b && params.push(+b);
+                });
+                data.push([b][concat](params));
+            });
+        }
+        data.toString = R._path2string;
+        return data;
+    });
+    
+    R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+        var t1 = 1 - t,
+            t13 = pow(t1, 3),
+            t12 = pow(t1, 2),
+            t2 = t * t,
+            t3 = t2 * t,
+            x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x,
+            y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y,
+            mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x),
+            my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y),
+            nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x),
+            ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y),
+            ax = t1 * p1x + t * c1x,
+            ay = t1 * p1y + t * c1y,
+            cx = t1 * c2x + t * p2x,
+            cy = t1 * c2y + t * p2y,
+            alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI);
+        (mx > nx || my < ny) && (alpha += 180);
+        return {
+            x: x,
+            y: y,
+            m: {x: mx, y: my},
+            n: {x: nx, y: ny},
+            start: {x: ax, y: ay},
+            end: {x: cx, y: cy},
+            alpha: alpha
+        };
+    };
+    R._removedFactory = function (methodname) {
+        return function () {
+            throw new Error("Rapha\xebl: you are calling to method \u201c" + methodname + "\u201d of removed object");
+        };
+    };
+    var pathDimensions = cacher(function (path) {
+        if (!path) {
+            return {x: 0, y: 0, width: 0, height: 0};
+        }
+        path = path2curve(path);
+        var x = 0, 
+            y = 0,
+            X = [],
+            Y = [],
+            p;
+        for (var i = 0, ii = path.length; i < ii; i++) {
+            p = path[i];
+            if (p[0] == "M") {
+                x = p[1];
+                y = p[2];
+                X.push(x);
+                Y.push(y);
+            } else {
+                var dim = curveDim(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+                X = X[concat](dim.min.x, dim.max.x);
+                Y = Y[concat](dim.min.y, dim.max.y);
+                x = p[5];
+                y = p[6];
+            }
+        }
+        var xmin = mmin[apply](0, X),
+            ymin = mmin[apply](0, Y);
+        return {
+            x: xmin,
+            y: ymin,
+            width: mmax[apply](0, X) - xmin,
+            height: mmax[apply](0, Y) - ymin
+        };
+    }, null, function (o) {
+        return {
+            x: o.x,
+            y: o.y,
+            width: o.width,
+            height: o.height
+        };
+    }),
+        pathClone = function (pathArray) {
+            var res = [];
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            for (var i = 0, ii = pathArray.length; i < ii; i++) {
+                res[i] = [];
+                for (var j = 0, jj = pathArray[i].length; j < jj; j++) {
+                    res[i][j] = pathArray[i][j];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        },
+        pathToRelative = R._pathToRelative = cacher(function (pathArray) {
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            var res = [],
+                x = 0,
+                y = 0,
+                mx = 0,
+                my = 0,
+                start = 0;
+            if (pathArray[0][0] == "M") {
+                x = pathArray[0][1];
+                y = pathArray[0][2];
+                mx = x;
+                my = y;
+                start++;
+                res.push(["M", x, y]);
+            }
+            for (var i = start, ii = pathArray.length; i < ii; i++) {
+                var r = res[i] = [],
+                    pa = pathArray[i];
+                if (pa[0] != lowerCase.call(pa[0])) {
+                    r[0] = lowerCase.call(pa[0]);
+                    switch (r[0]) {
+                        case "a":
+                            r[1] = pa[1];
+                            r[2] = pa[2];
+                            r[3] = pa[3];
+                            r[4] = pa[4];
+                            r[5] = pa[5];
+                            r[6] = +(pa[6] - x).toFixed(3);
+                            r[7] = +(pa[7] - y).toFixed(3);
+                            break;
+                        case "v":
+                            r[1] = +(pa[1] - y).toFixed(3);
+                            break;
+                        case "m":
+                            mx = pa[1];
+                            my = pa[2];
+                        default:
+                            for (var j = 1, jj = pa.length; j < jj; j++) {
+                                r[j] = +(pa[j] - ((j % 2) ? x : y)).toFixed(3);
+                            }
+                    }
+                } else {
+                    r = res[i] = [];
+                    if (pa[0] == "m") {
+                        mx = pa[1] + x;
+                        my = pa[2] + y;
+                    }
+                    for (var k = 0, kk = pa.length; k < kk; k++) {
+                        res[i][k] = pa[k];
+                    }
+                }
+                var len = res[i].length;
+                switch (res[i][0]) {
+                    case "z":
+                        x = mx;
+                        y = my;
+                        break;
+                    case "h":
+                        x += +res[i][len - 1];
+                        break;
+                    case "v":
+                        y += +res[i][len - 1];
+                        break;
+                    default:
+                        x += +res[i][len - 2];
+                        y += +res[i][len - 1];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        }, 0, pathClone),
+        pathToAbsolute = R._pathToAbsolute = cacher(function (pathArray) {
+            if (!R.is(pathArray, array) || !R.is(pathArray && pathArray[0], array)) { // rough assumption
+                pathArray = R.parsePathString(pathArray);
+            }
+            if (!pathArray || !pathArray.length) {
+                return [["M", 0, 0]];
+            }
+            var res = [],
+                x = 0,
+                y = 0,
+                mx = 0,
+                my = 0,
+                start = 0;
+            if (pathArray[0][0] == "M") {
+                x = +pathArray[0][1];
+                y = +pathArray[0][2];
+                mx = x;
+                my = y;
+                start++;
+                res[0] = ["M", x, y];
+            }
+            var crz = pathArray.length == 3 && pathArray[0][0] == "M" && pathArray[1][0].toUpperCase() == "R" && pathArray[2][0].toUpperCase() == "Z";
+            for (var r, pa, i = start, ii = pathArray.length; i < ii; i++) {
+                res.push(r = []);
+                pa = pathArray[i];
+                if (pa[0] != upperCase.call(pa[0])) {
+                    r[0] = upperCase.call(pa[0]);
+                    switch (r[0]) {
+                        case "A":
+                            r[1] = pa[1];
+                            r[2] = pa[2];
+                            r[3] = pa[3];
+                            r[4] = pa[4];
+                            r[5] = pa[5];
+                            r[6] = +(pa[6] + x);
+                            r[7] = +(pa[7] + y);
+                            break;
+                        case "V":
+                            r[1] = +pa[1] + y;
+                            break;
+                        case "H":
+                            r[1] = +pa[1] + x;
+                            break;
+                        case "R":
+                            var dots = [x, y][concat](pa.slice(1));
+                            for (var j = 2, jj = dots.length; j < jj; j++) {
+                                dots[j] = +dots[j] + x;
+                                dots[++j] = +dots[j] + y;
+                            }
+                            res.pop();
+                            res = res[concat](catmullRom2bezier(dots, crz));
+                            break;
+                        case "M":
+                            mx = +pa[1] + x;
+                            my = +pa[2] + y;
+                        default:
+                            for (j = 1, jj = pa.length; j < jj; j++) {
+                                r[j] = +pa[j] + ((j % 2) ? x : y);
+                            }
+                    }
+                } else if (pa[0] == "R") {
+                    dots = [x, y][concat](pa.slice(1));
+                    res.pop();
+                    res = res[concat](catmullRom2bezier(dots, crz));
+                    r = ["R"][concat](pa.slice(-2));
+                } else {
+                    for (var k = 0, kk = pa.length; k < kk; k++) {
+                        r[k] = pa[k];
+                    }
+                }
+                switch (r[0]) {
+                    case "Z":
+                        x = mx;
+                        y = my;
+                        break;
+                    case "H":
+                        x = r[1];
+                        break;
+                    case "V":
+                        y = r[1];
+                        break;
+                    case "M":
+                        mx = r[r.length - 2];
+                        my = r[r.length - 1];
+                    default:
+                        x = r[r.length - 2];
+                        y = r[r.length - 1];
+                }
+            }
+            res.toString = R._path2string;
+            return res;
+        }, null, pathClone),
+        l2c = function (x1, y1, x2, y2) {
+            return [x1, y1, x2, y2, x2, y2];
+        },
+        q2c = function (x1, y1, ax, ay, x2, y2) {
+            var _13 = 1 / 3,
+                _23 = 2 / 3;
+            return [
+                    _13 * x1 + _23 * ax,
+                    _13 * y1 + _23 * ay,
+                    _13 * x2 + _23 * ax,
+                    _13 * y2 + _23 * ay,
+                    x2,
+                    y2
+                ];
+        },
+        a2c = function (x1, y1, rx, ry, angle, large_arc_flag, sweep_flag, x2, y2, recursive) {
+            // for more information of where this math came from visit:
+            // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
+            var _120 = PI * 120 / 180,
+                rad = PI / 180 * (+angle || 0),
+                res = [],
+                xy,
+                rotate = cacher(function (x, y, rad) {
+                    var X = x * math.cos(rad) - y * math.sin(rad),
+                        Y = x * math.sin(rad) + y * math.cos(rad);
+                    return {x: X, y: Y};
+                });
+            if (!recursive) {
+                xy = rotate(x1, y1, -rad);
+                x1 = xy.x;
+                y1 = xy.y;
+                xy = rotate(x2, y2, -rad);
+                x2 = xy.x;
+                y2 = xy.y;
+                var cos = math.cos(PI / 180 * angle),
+                    sin = math.sin(PI / 180 * angle),
+                    x = (x1 - x2) / 2,
+                    y = (y1 - y2) / 2;
+                var h = (x * x) / (rx * rx) + (y * y) / (ry * ry);
+                if (h > 1) {
+                    h = math.sqrt(h);
+                    rx = h * rx;
+                    ry = h * ry;
+                }
+                var rx2 = rx * rx,
+                    ry2 = ry * ry,
+                    k = (large_arc_flag == sweep_flag ? -1 : 1) *
+                        math.sqrt(abs((rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x))),
+                    cx = k * rx * y / ry + (x1 + x2) / 2,
+                    cy = k * -ry * x / rx + (y1 + y2) / 2,
+                    f1 = math.asin(((y1 - cy) / ry).toFixed(9)),
+                    f2 = math.asin(((y2 - cy) / ry).toFixed(9));
+
+                f1 = x1 < cx ? PI - f1 : f1;
+                f2 = x2 < cx ? PI - f2 : f2;
+                f1 < 0 && (f1 = PI * 2 + f1);
+                f2 < 0 && (f2 = PI * 2 + f2);
+                if (sweep_flag && f1 > f2) {
+                    f1 = f1 - PI * 2;
+                }
+                if (!sweep_flag && f2 > f1) {
+                    f2 = f2 - PI * 2;
+                }
+            } else {
+                f1 = recursive[0];
+                f2 = recursive[1];
+                cx = recursive[2];
+                cy = recursive[3];
+            }
+            var df = f2 - f1;
+            if (abs(df) > _120) {
+                var f2old = f2,
+                    x2old = x2,
+                    y2old = y2;
+                f2 = f1 + _120 * (sweep_flag && f2 > f1 ? 1 : -1);
+                x2 = cx + rx * math.cos(f2);
+                y2 = cy + ry * math.sin(f2);
+                res = a2c(x2, y2, rx, ry, angle, 0, sweep_flag, x2old, y2old, [f2, f2old, cx, cy]);
+            }
+            df = f2 - f1;
+            var c1 = math.cos(f1),
+                s1 = math.sin(f1),
+                c2 = math.cos(f2),
+                s2 = math.sin(f2),
+                t = math.tan(df / 4),
+                hx = 4 / 3 * rx * t,
+                hy = 4 / 3 * ry * t,
+                m1 = [x1, y1],
+                m2 = [x1 + hx * s1, y1 - hy * c1],
+                m3 = [x2 + hx * s2, y2 - hy * c2],
+                m4 = [x2, y2];
+            m2[0] = 2 * m1[0] - m2[0];
+            m2[1] = 2 * m1[1] - m2[1];
+            if (recursive) {
+                return [m2, m3, m4][concat](res);
+            } else {
+                res = [m2, m3, m4][concat](res).join()[split](",");
+                var newres = [];
+                for (var i = 0, ii = res.length; i < ii; i++) {
+                    newres[i] = i % 2 ? rotate(res[i - 1], res[i], rad).y : rotate(res[i], res[i + 1], rad).x;
+                }
+                return newres;
+            }
+        },
+        findDotAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
+            var t1 = 1 - t;
+            return {
+                x: pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x,
+                y: pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y
+            };
+        },
+        curveDim = cacher(function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y) {
+            var a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x),
+                b = 2 * (c1x - p1x) - 2 * (c2x - c1x),
+                c = p1x - c1x,
+                t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a,
+                t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a,
+                y = [p1y, p2y],
+                x = [p1x, p2x],
+                dot;
+            abs(t1) > "1e12" && (t1 = .5);
+            abs(t2) > "1e12" && (t2 = .5);
+            if (t1 > 0 && t1 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            if (t2 > 0 && t2 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            a = (c2y - 2 * c1y + p1y) - (p2y - 2 * c2y + c1y);
+            b = 2 * (c1y - p1y) - 2 * (c2y - c1y);
+            c = p1y - c1y;
+            t1 = (-b + math.sqrt(b * b - 4 * a * c)) / 2 / a;
+            t2 = (-b - math.sqrt(b * b - 4 * a * c)) / 2 / a;
+            abs(t1) > "1e12" && (t1 = .5);
+            abs(t2) > "1e12" && (t2 = .5);
+            if (t1 > 0 && t1 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t1);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            if (t2 > 0 && t2 < 1) {
+                dot = findDotAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t2);
+                x.push(dot.x);
+                y.push(dot.y);
+            }
+            return {
+                min: {x: mmin[apply](0, x), y: mmin[apply](0, y)},
+                max: {x: mmax[apply](0, x), y: mmax[apply](0, y)}
+            };
+        }),
+        path2curve = R._path2curve = cacher(function (path, path2) {
+            var p = pathToAbsolute(path),
+                p2 = path2 && pathToAbsolute(path2),
+                attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+                attrs2 = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null},
+                processPath = function (path, d) {
+                    var nx, ny;
+                    if (!path) {
+                        return ["C", d.x, d.y, d.x, d.y, d.x, d.y];
+                    }
+                    !(path[0] in {T:1, Q:1}) && (d.qx = d.qy = null);
+                    switch (path[0]) {
+                        case "M":
+                            d.X = path[1];
+                            d.Y = path[2];
+                            break;
+                        case "A":
+                            path = ["C"][concat](a2c[apply](0, [d.x, d.y][concat](path.slice(1))));
+                            break;
+                        case "S":
+                            nx = d.x + (d.x - (d.bx || d.x));
+                            ny = d.y + (d.y - (d.by || d.y));
+                            path = ["C", nx, ny][concat](path.slice(1));
+                            break;
+                        case "T":
+                            d.qx = d.x + (d.x - (d.qx || d.x));
+                            d.qy = d.y + (d.y - (d.qy || d.y));
+                            path = ["C"][concat](q2c(d.x, d.y, d.qx, d.qy, path[1], path[2]));
+                            break;
+                        case "Q":
+                            d.qx = path[1];
+                            d.qy = path[2];
+                            path = ["C"][concat](q2c(d.x, d.y, path[1], path[2], path[3], path[4]));
+                            break;
+                        case "L":
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], path[2]));
+                            break;
+                        case "H":
+                            path = ["C"][concat](l2c(d.x, d.y, path[1], d.y));
+                            break;
+                        case "V":
+                            path = ["C"][concat](l2c(d.x, d.y, d.x, path[1]));
+                            break;
+                        case "Z":
+                            path = ["C"][concat](l2c(d.x, d.y, d.X, d.Y));
+                            break;
+                    }
+                    return path;
+                },
+                fixArc = function (pp, i) {
+                    if (pp[i].length > 7) {
+                        pp[i].shift();
+                        var pi = pp[i];
+                        while (pi.length) {
+                            pp.splice(i++, 0, ["C"][concat](pi.splice(0, 6)));
+                        }
+                        pp.splice(i, 1);
+                        ii = mmax(p.length, p2 && p2.length || 0);
+                    }
+                },
+                fixM = function (path1, path2, a1, a2, i) {
+                    if (path1 && path2 && path1[i][0] == "M" && path2[i][0] != "M") {
+                        path2.splice(i, 0, ["M", a2.x, a2.y]);
+                        a1.bx = 0;
+                        a1.by = 0;
+                        a1.x = path1[i][1];
+                        a1.y = path1[i][2];
+                        ii = mmax(p.length, p2 && p2.length || 0);
+                    }
+                };
+            for (var i = 0, ii = mmax(p.length, p2 && p2.length || 0); i < ii; i++) {
+                p[i] = processPath(p[i], attrs);
+                fixArc(p, i);
+                p2 && (p2[i] = processPath(p2[i], attrs2));
+                p2 && fixArc(p2, i);
+                fixM(p, p2, attrs, attrs2, i);
+                fixM(p2, p, attrs2, attrs, i);
+                var seg = p[i],
+                    seg2 = p2 && p2[i],
+                    seglen = seg.length,
+                    seg2len = p2 && seg2.length;
+                attrs.x = seg[seglen - 2];
+                attrs.y = seg[seglen - 1];
+                attrs.bx = toFloat(seg[seglen - 4]) || attrs.x;
+                attrs.by = toFloat(seg[seglen - 3]) || attrs.y;
+                attrs2.bx = p2 && (toFloat(seg2[seg2len - 4]) || attrs2.x);
+                attrs2.by = p2 && (toFloat(seg2[seg2len - 3]) || attrs2.y);
+                attrs2.x = p2 && seg2[seg2len - 2];
+                attrs2.y = p2 && seg2[seg2len - 1];
+            }
+            return p2 ? [p, p2] : p;
+        }, null, pathClone),
+        parseDots = R._parseDots = cacher(function (gradient) {
+            var dots = [];
+            for (var i = 0, ii = gradient.length; i < ii; i++) {
+                var dot = {},
+                    par = gradient[i].match(/^([^:]*):?([\d\.]*)/);
+                dot.color = R.getRGB(par[1]);
+                if (dot.color.error) {
+                    return null;
+                }
+                dot.color = dot.color.hex;
+                par[2] && (dot.offset = par[2] + "%");
+                dots.push(dot);
+            }
+            for (i = 1, ii = dots.length - 1; i < ii; i++) {
+                if (!dots[i].offset) {
+                    var start = toFloat(dots[i - 1].offset || 0),
+                        end = 0;
+                    for (var j = i + 1; j < ii; j++) {
+                        if (dots[j].offset) {
+                            end = dots[j].offset;
+                            break;
+                        }
+                    }
+                    if (!end) {
+                        end = 100;
+                        j = ii;
+                    }
+                    end = toFloat(end);
+                    var d = (end - start) / (j - i + 1);
+                    for (; i < j; i++) {
+                        start += d;
+                        dots[i].offset = start + "%";
+                    }
+                }
+            }
+            return dots;
+        }),
+        tear = R._tear = function (el, paper) {
+            el == paper.top && (paper.top = el.prev);
+            el == paper.bottom && (paper.bottom = el.next);
+            el.next && (el.next.prev = el.prev);
+            el.prev && (el.prev.next = el.next);
+        },
+        tofront = R._tofront = function (el, paper) {
+            if (paper.top === el) {
+                return;
+            }
+            tear(el, paper);
+            el.next = null;
+            el.prev = paper.top;
+            paper.top.next = el;
+            paper.top = el;
+        },
+        toback = R._toback = function (el, paper) {
+            if (paper.bottom === el) {
+                return;
+            }
+            tear(el, paper);
+            el.next = paper.bottom;
+            el.prev = null;
+            paper.bottom.prev = el;
+            paper.bottom = el;
+        },
+        insertafter = R._insertafter = function (el, el2, paper) {
+            tear(el, paper);
+            el2 == paper.top && (paper.top = el);
+            el2.next && (el2.next.prev = el);
+            el.next = el2.next;
+            el.prev = el2;
+            el2.next = el;
+        },
+        insertbefore = R._insertbefore = function (el, el2, paper) {
+            tear(el, paper);
+            el2 == paper.bottom && (paper.bottom = el);
+            el2.prev && (el2.prev.next = el);
+            el.prev = el2.prev;
+            el2.prev = el;
+            el.next = el2;
+        },
+        extractTransform = R._extractTransform = function (el, tstr) {
+            if (tstr == null) {
+                return el._.transform;
+            }
+            tstr = Str(tstr).replace(/\.{3}|\u2026/g, el._.transform || E);
+            var tdata = R.parseTransformString(tstr),
+                deg = 0,
+                dx = 0,
+                dy = 0,
+                sx = 1,
+                sy = 1,
+                _ = el._,
+                m = new Matrix;
+            _.transform = tdata || [];
+            if (tdata) {
+                for (var i = 0, ii = tdata.length; i < ii; i++) {
+                    var t = tdata[i],
+                        tlen = t.length,
+                        command = Str(t[0]).toLowerCase(),
+                        absolute = t[0] != command,
+                        inver = absolute ? m.invert() : 0,
+                        x1,
+                        y1,
+                        x2,
+                        y2,
+                        bb;
+                    if (command == "t" && tlen == 3) {
+                        if (absolute) {
+                            x1 = inver.x(0, 0);
+                            y1 = inver.y(0, 0);
+                            x2 = inver.x(t[1], t[2]);
+                            y2 = inver.y(t[1], t[2]);
+                            m.translate(x2 - x1, y2 - y1);
+                        } else {
+                            m.translate(t[1], t[2]);
+                        }
+                    } else if (command == "r") {
+                        if (tlen == 2) {
+                            bb = bb || el.getBBox(1);
+                            m.rotate(t[1], bb.x + bb.width / 2, bb.y + bb.height / 2);
+                            deg += t[1];
+                        } else if (tlen == 4) {
+                            if (absolute) {
+                                x2 = inver.x(t[2], t[3]);
+                                y2 = inver.y(t[2], t[3]);
+                                m.rotate(t[1], x2, y2);
+                            } else {
+                                m.rotate(t[1], t[2], t[3]);
+                            }
+                            deg += t[1];
+                        }
+                    } else if (command == "s") {
+                        if (tlen == 2 || tlen == 3) {
+                            bb = bb || el.getBBox(1);
+                            m.scale(t[1], t[tlen - 1], bb.x + bb.width / 2, bb.y + bb.height / 2);
+                            sx *= t[1];
+                            sy *= t[tlen - 1];
+                        } else if (tlen == 5) {
+                            if (absolute) {
+                                x2 = inver.x(t[3], t[4]);
+                                y2 = inver.y(t[3], t[4]);
+                                m.scale(t[1], t[2], x2, y2);
+                            } else {
+                                m.scale(t[1], t[2], t[3], t[4]);
+                            }
+                            sx *= t[1];
+                            sy *= t[2];
+                        }
+                    } else if (command == "m" && tlen == 7) {
+                        m.add(t[1], t[2], t[3], t[4], t[5], t[6]);
+                    }
+                    _.dirtyT = 1;
+                    el.matrix = m;
+                }
+            }
+
+            el.matrix = m;
+
+            _.sx = sx;
+            _.sy = sy;
+            _.deg = deg;
+            _.dx = dx = m.e;
+            _.dy = dy = m.f;
+
+            if (sx == 1 && sy == 1 && !deg && _.bbox) {
+                _.bbox.x += +dx;
+                _.bbox.y += +dy;
+            } else {
+                _.dirtyT = 1;
+            }
+        },
+        getEmpty = function (item) {
+            var l = item[0];
+            switch (l.toLowerCase()) {
+                case "t": return [l, 0, 0];
+                case "m": return [l, 1, 0, 0, 1, 0, 0];
+                case "r": if (item.length == 4) {
+                    return [l, 0, item[2], item[3]];
+                } else {
+                    return [l, 0];
+                }
+                case "s": if (item.length == 5) {
+                    return [l, 1, 1, item[3], item[4]];
+                } else if (item.length == 3) {
+                    return [l, 1, 1];
+                } else {
+                    return [l, 1];
+                }
+            }
+        },
+        equaliseTransform = R._equaliseTransform = function (t1, t2) {
+            t2 = Str(t2).replace(/\.{3}|\u2026/g, t1);
+            t1 = R.parseTransformString(t1) || [];
+            t2 = R.parseTransformString(t2) || [];
+            var maxlength = mmax(t1.length, t2.length),
+                from = [],
+                to = [],
+                i = 0, j, jj,
+                tt1, tt2;
+            for (; i < maxlength; i++) {
+                tt1 = t1[i] || getEmpty(t2[i]);
+                tt2 = t2[i] || getEmpty(tt1);
+                if ((tt1[0] != tt2[0]) ||
+                    (tt1[0].toLowerCase() == "r" && (tt1[2] != tt2[2] || tt1[3] != tt2[3])) ||
+                    (tt1[0].toLowerCase() == "s" && (tt1[3] != tt2[3] || tt1[4] != tt2[4]))
+                    ) {
+                    return;
+                }
+                from[i] = [];
+                to[i] = [];
+                for (j = 0, jj = mmax(tt1.length, tt2.length); j < jj; j++) {
+                    j in tt1 && (from[i][j] = tt1[j]);
+                    j in tt2 && (to[i][j] = tt2[j]);
+                }
+            }
+            return {
+                from: from,
+                to: to
+            };
+        };
+    R._getContainer = function (x, y, w, h) {
+        var container;
+        container = h == null && !R.is(x, "object") ? g.doc.getElementById(x) : x;
+        if (container == null) {
+            return;
+        }
+        if (container.tagName) {
+            if (y == null) {
+                return {
+                    container: container,
+                    width: container.style.pixelWidth || container.offsetWidth,
+                    height: container.style.pixelHeight || container.offsetHeight
+                };
+            } else {
+                return {
+                    container: container,
+                    width: y,
+                    height: w
+                };
+            }
+        }
+        return {
+            container: 1,
+            x: x,
+            y: y,
+            width: w,
+            height: h
+        };
+    };
+    
+    R.pathToRelative = pathToRelative;
+    R._engine = {};
+    
+    R.path2curve = path2curve;
+    
+    R.matrix = function (a, b, c, d, e, f) {
+        return new Matrix(a, b, c, d, e, f);
+    };
+    function Matrix(a, b, c, d, e, f) {
+        if (a != null) {
+            this.a = +a;
+            this.b = +b;
+            this.c = +c;
+            this.d = +d;
+            this.e = +e;
+            this.f = +f;
+        } else {
+            this.a = 1;
+            this.b = 0;
+            this.c = 0;
+            this.d = 1;
+            this.e = 0;
+            this.f = 0;
+        }
+    }
+    (function (matrixproto) {
+        
+        matrixproto.add = function (a, b, c, d, e, f) {
+            var out = [[], [], []],
+                m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]],
+                matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
+                x, y, z, res;
+
+            if (a && a instanceof Matrix) {
+                matrix = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]];
+            }
+
+            for (x = 0; x < 3; x++) {
+                for (y = 0; y < 3; y++) {
+                    res = 0;
+                    for (z = 0; z < 3; z++) {
+                        res += m[x][z] * matrix[z][y];
+                    }
+                    out[x][y] = res;
+                }
+            }
+            this.a = out[0][0];
+            this.b = out[1][0];
+            this.c = out[0][1];
+            this.d = out[1][1];
+            this.e = out[0][2];
+            this.f = out[1][2];
+        };
+        
+        matrixproto.invert = function () {
+            var me = this,
+                x = me.a * me.d - me.b * me.c;
+            return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x);
+        };
+        
+        matrixproto.clone = function () {
+            return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);
+        };
+        
+        matrixproto.translate = function (x, y) {
+            this.add(1, 0, 0, 1, x, y);
+        };
+        
+        matrixproto.scale = function (x, y, cx, cy) {
+            y == null && (y = x);
+            (cx || cy) && this.add(1, 0, 0, 1, cx, cy);
+            this.add(x, 0, 0, y, 0, 0);
+            (cx || cy) && this.add(1, 0, 0, 1, -cx, -cy);
+        };
+        
+        matrixproto.rotate = function (a, x, y) {
+            a = R.rad(a);
+            x = x || 0;
+            y = y || 0;
+            var cos = +math.cos(a).toFixed(9),
+                sin = +math.sin(a).toFixed(9);
+            this.add(cos, sin, -sin, cos, x, y);
+            this.add(1, 0, 0, 1, -x, -y);
+        };
+        
+        matrixproto.x = function (x, y) {
+            return x * this.a + y * this.c + this.e;
+        };
+        
+        matrixproto.y = function (x, y) {
+            return x * this.b + y * this.d + this.f;
+        };
+        matrixproto.get = function (i) {
+            return +this[Str.fromCharCode(97 + i)].toFixed(4);
+        };
+        matrixproto.toString = function () {
+            return R.svg ?
+                "matrix(" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + ")" :
+                [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join();
+        };
+        matrixproto.toFilter = function () {
+            return "progid:DXImageTransform.Microsoft.Matrix(M11=" + this.get(0) +
+                ", M12=" + this.get(2) + ", M21=" + this.get(1) + ", M22=" + this.get(3) +
+                ", Dx=" + this.get(4) + ", Dy=" + this.get(5) + ", sizingmethod='auto expand')";
+        };
+        matrixproto.offset = function () {
+            return [this.e.toFixed(4), this.f.toFixed(4)];
+        };
+        function norm(a) {
+            return a[0] * a[0] + a[1] * a[1];
+        }
+        function normalize(a) {
+            var mag = math.sqrt(norm(a));
+            a[0] && (a[0] /= mag);
+            a[1] && (a[1] /= mag);
+        }
+        
+        matrixproto.split = function () {
+            var out = {};
+            // translation
+            out.dx = this.e;
+            out.dy = this.f;
+
+            // scale and shear
+            var row = [[this.a, this.c], [this.b, this.d]];
+            out.scalex = math.sqrt(norm(row[0]));
+            normalize(row[0]);
+
+            out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
+            row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
+
+            out.scaley = math.sqrt(norm(row[1]));
+            normalize(row[1]);
+            out.shear /= out.scaley;
+
+            // rotation
+            var sin = -row[0][1],
+                cos = row[1][1];
+            if (cos < 0) {
+                out.rotate = R.deg(math.acos(cos));
+                if (sin < 0) {
+                    out.rotate = 360 - out.rotate;
+                }
+            } else {
+                out.rotate = R.deg(math.asin(sin));
+            }
+
+            out.isSimple = !+out.shear.toFixed(9) && (out.scalex.toFixed(9) == out.scaley.toFixed(9) || !out.rotate);
+            out.isSuperSimple = !+out.shear.toFixed(9) && out.scalex.toFixed(9) == out.scaley.toFixed(9) && !out.rotate;
+            out.noRotation = !+out.shear.toFixed(9) && !out.rotate;
+            return out;
+        };
+        
+        matrixproto.toTransformString = function (shorter) {
+            var s = shorter || this[split]();
+            if (s.isSimple) {
+                s.scalex = +s.scalex.toFixed(4);
+                s.scaley = +s.scaley.toFixed(4);
+                s.rotate = +s.rotate.toFixed(4);
+                return  (s.dx || s.dy ? "t" + [s.dx, s.dy] : E) + 
+                        (s.scalex != 1 || s.scaley != 1 ? "s" + [s.scalex, s.scaley, 0, 0] : E) +
+                        (s.rotate ? "r" + [s.rotate, 0, 0] : E);
+            } else {
+                return "m" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)];
+            }
+        };
+    })(Matrix.prototype);
+
+    // WebKit rendering bug workaround method
+    var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/);
+    if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") ||
+        (navigator.vendor == "Google Inc." && version && version[1] < 8)) {
+        
+        paperproto.safari = function () {
+            var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"});
+            setTimeout(function () {rect.remove();});
+        };
+    } else {
+        paperproto.safari = fun;
+    }
+ 
+    var preventDefault = function () {
+        this.returnValue = false;
+    },
+    preventTouch = function () {
+        return this.originalEvent.preventDefault();
+    },
+    stopPropagation = function () {
+        this.cancelBubble = true;
+    },
+    stopTouch = function () {
+        return this.originalEvent.stopPropagation();
+    },
+    addEvent = (function () {
+        if (g.doc.addEventListener) {
+            return function (obj, type, fn, element) {
+                var realName = supportsTouch && touchMap[type] ? touchMap[type] : type,
+                    f = function (e) {
+                        var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+                            x = e.clientX + scrollX,
+                            y = e.clientY + scrollY;
+                    if (supportsTouch && touchMap[has](type)) {
+                        for (var i = 0, ii = e.targetTouches && e.targetTouches.length; i < ii; i++) {
+                            if (e.targetTouches[i].target == obj) {
+                                var olde = e;
+                                e = e.targetTouches[i];
+                                e.originalEvent = olde;
+                                e.preventDefault = preventTouch;
+                                e.stopPropagation = stopTouch;
+                                break;
+                            }
+                        }
+                    }
+                    return fn.call(element, e, x, y);
+                };
+                obj.addEventListener(realName, f, false);
+                return function () {
+                    obj.removeEventListener(realName, f, false);
+                    return true;
+                };
+            };
+        } else if (g.doc.attachEvent) {
+            return function (obj, type, fn, element) {
+                var f = function (e) {
+                    e = e || g.win.event;
+                    var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                        scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+                        x = e.clientX + scrollX,
+                        y = e.clientY + scrollY;
+                    e.preventDefault = e.preventDefault || preventDefault;
+                    e.stopPropagation = e.stopPropagation || stopPropagation;
+                    return fn.call(element, e, x, y);
+                };
+                obj.attachEvent("on" + type, f);
+                var detacher = function () {
+                    obj.detachEvent("on" + type, f);
+                    return true;
+                };
+                return detacher;
+            };
+        }
+    })(),
+    drag = [],
+    dragMove = function (e) {
+        var x = e.clientX,
+            y = e.clientY,
+            scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+            scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft,
+            dragi,
+            j = drag.length;
+        while (j--) {
+            dragi = drag[j];
+            if (supportsTouch) {
+                var i = e.touches.length,
+                    touch;
+                while (i--) {
+                    touch = e.touches[i];
+                    if (touch.identifier == dragi.el._drag.id) {
+                        x = touch.clientX;
+                        y = touch.clientY;
+                        (e.originalEvent ? e.originalEvent : e).preventDefault();
+                        break;
+                    }
+                }
+            } else {
+                e.preventDefault();
+            }
+            var node = dragi.el.node,
+                o,
+                next = node.nextSibling,
+                parent = node.parentNode,
+                display = node.style.display;
+            g.win.opera && parent.removeChild(node);
+            node.style.display = "none";
+            o = dragi.el.paper.getElementByPoint(x, y);
+            node.style.display = display;
+            g.win.opera && (next ? parent.insertBefore(node, next) : parent.appendChild(node));
+            o && eve("drag.over." + dragi.el.id, dragi.el, o);
+            x += scrollX;
+            y += scrollY;
+            eve("drag.move." + dragi.el.id, dragi.move_scope || dragi.el, x - dragi.el._drag.x, y - dragi.el._drag.y, x, y, e);
+        }
+    },
+    dragUp = function (e) {
+        R.unmousemove(dragMove).unmouseup(dragUp);
+        var i = drag.length,
+            dragi;
+        while (i--) {
+            dragi = drag[i];
+            dragi.el._drag = {};
+            eve("drag.end." + dragi.el.id, dragi.end_scope || dragi.start_scope || dragi.move_scope || dragi.el, e);
+        }
+        drag = [];
+    },
+    
+    elproto = R.el = {};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    for (var i = events.length; i--;) {
+        (function (eventName) {
+            R[eventName] = elproto[eventName] = function (fn, scope) {
+                if (R.is(fn, "function")) {
+                    this.events = this.events || [];
+                    this.events.push({name: eventName, f: fn, unbind: addEvent(this.shape || this.node || g.doc, eventName, fn, scope || this)});
+                }
+                return this;
+            };
+            R["un" + eventName] = elproto["un" + eventName] = function (fn) {
+                var events = this.events || [],
+                    l = events.length;
+                while (l--) if (events[l].name == eventName && events[l].f == fn) {
+                    events[l].unbind();
+                    events.splice(l, 1);
+                    !events.length && delete this.events;
+                    return this;
+                }
+                return this;
+            };
+        })(events[i]);
+    }
+    
+    
+    elproto.data = function (key, value) {
+        var data = eldata[this.id] = eldata[this.id] || {};
+        if (arguments.length == 1) {
+            if (R.is(key, "object")) {
+                for (var i in key) if (key[has](i)) {
+                    this.data(i, key[i]);
+                }
+                return this;
+            }
+            eve("data.get." + this.id, this, data[key], key);
+            return data[key];
+        }
+        data[key] = value;
+        eve("data.set." + this.id, this, value, key);
+        return this;
+    };
+    
+    elproto.removeData = function (key) {
+        if (key == null) {
+            eldata[this.id] = {};
+        } else {
+            eldata[this.id] && delete eldata[this.id][key];
+        }
+        return this;
+    };
+    
+    elproto.hover = function (f_in, f_out, scope_in, scope_out) {
+        return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in);
+    };
+    
+    elproto.unhover = function (f_in, f_out) {
+        return this.unmouseover(f_in).unmouseout(f_out);
+    };
+    var draggable = [];
+    
+    elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) {
+        function start(e) {
+            (e.originalEvent || e).preventDefault();
+            var scrollY = g.doc.documentElement.scrollTop || g.doc.body.scrollTop,
+                scrollX = g.doc.documentElement.scrollLeft || g.doc.body.scrollLeft;
+            this._drag.x = e.clientX + scrollX;
+            this._drag.y = e.clientY + scrollY;
+            this._drag.id = e.identifier;
+            !drag.length && R.mousemove(dragMove).mouseup(dragUp);
+            drag.push({el: this, move_scope: move_scope, start_scope: start_scope, end_scope: end_scope});
+            onstart && eve.on("drag.start." + this.id, onstart);
+            onmove && eve.on("drag.move." + this.id, onmove);
+            onend && eve.on("drag.end." + this.id, onend);
+            eve("drag.start." + this.id, start_scope || move_scope || this, e.clientX + scrollX, e.clientY + scrollY, e);
+        }
+        this._drag = {};
+        draggable.push({el: this, start: start});
+        this.mousedown(start);
+        return this;
+    };
+    
+    elproto.onDragOver = function (f) {
+        f ? eve.on("drag.over." + this.id, f) : eve.unbind("drag.over." + this.id);
+    };
+    
+    elproto.undrag = function () {
+        var i = draggable.length;
+        while (i--) if (draggable[i].el == this) {
+            this.unmousedown(draggable[i].start);
+            draggable.splice(i, 1);
+            eve.unbind("drag.*." + this.id);
+        }
+        !draggable.length && R.unmousemove(dragMove).unmouseup(dragUp);
+    };
+    
+    paperproto.circle = function (x, y, r) {
+        var out = R._engine.circle(this, x || 0, y || 0, r || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.rect = function (x, y, w, h, r) {
+        var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.ellipse = function (x, y, rx, ry) {
+        var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.path = function (pathString) {
+        pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E);
+        var out = R._engine.path(R.format[apply](R, arguments), this);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.image = function (src, x, y, w, h) {
+        var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.text = function (x, y, text) {
+        var out = R._engine.text(this, x || 0, y || 0, Str(text));
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.set = function (itemsArray) {
+        !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length));
+        var out = new Set(itemsArray);
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    paperproto.setStart = function (set) {
+        this.__set__ = set || this.set();
+    };
+    
+    paperproto.setFinish = function (set) {
+        var out = this.__set__;
+        delete this.__set__;
+        return out;
+    };
+    
+    paperproto.setSize = function (width, height) {
+        return R._engine.setSize.call(this, width, height);
+    };
+    
+    paperproto.setViewBox = function (x, y, w, h, fit) {
+        return R._engine.setViewBox.call(this, x, y, w, h, fit);
+    };
+    
+    
+    paperproto.top = paperproto.bottom = null;
+    
+    paperproto.raphael = R;
+    var getOffset = function (elem) {
+        var box = elem.getBoundingClientRect(),
+            doc = elem.ownerDocument,
+            body = doc.body,
+            docElem = doc.documentElement,
+            clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
+            top  = box.top  + (g.win.pageYOffset || docElem.scrollTop || body.scrollTop ) - clientTop,
+            left = box.left + (g.win.pageXOffset || docElem.scrollLeft || body.scrollLeft) - clientLeft;
+        return {
+            y: top,
+            x: left
+        };
+    };
+    
+    paperproto.getElementByPoint = function (x, y) {
+        var paper = this,
+            svg = paper.canvas,
+            target = g.doc.elementFromPoint(x, y);
+        if (g.win.opera && target.tagName == "svg") {
+            var so = getOffset(svg),
+                sr = svg.createSVGRect();
+            sr.x = x - so.x;
+            sr.y = y - so.y;
+            sr.width = sr.height = 1;
+            var hits = svg.getIntersectionList(sr, null);
+            if (hits.length) {
+                target = hits[hits.length - 1];
+            }
+        }
+        if (!target) {
+            return null;
+        }
+        while (target.parentNode && target != svg.parentNode && !target.raphael) {
+            target = target.parentNode;
+        }
+        target == paper.canvas.parentNode && (target = svg);
+        target = target && target.raphael ? paper.getById(target.raphaelid) : null;
+        return target;
+    };
+    
+    paperproto.getById = function (id) {
+        var bot = this.bottom;
+        while (bot) {
+            if (bot.id == id) {
+                return bot;
+            }
+            bot = bot.next;
+        }
+        return null;
+    };
+    
+    paperproto.forEach = function (callback, thisArg) {
+        var bot = this.bottom;
+        while (bot) {
+            if (callback.call(thisArg, bot) === false) {
+                return this;
+            }
+            bot = bot.next;
+        }
+        return this;
+    };
+    function x_y() {
+        return this.x + S + this.y;
+    }
+    function x_y_w_h() {
+        return this.x + S + this.y + S + this.width + " \xd7 " + this.height;
+    }
+    
+    elproto.getBBox = function (isWithoutTransform) {
+        if (this.removed) {
+            return {};
+        }
+        var _ = this._;
+        if (isWithoutTransform) {
+            if (_.dirty || !_.bboxwt) {
+                this.realPath = getPath[this.type](this);
+                _.bboxwt = pathDimensions(this.realPath);
+                _.bboxwt.toString = x_y_w_h;
+                _.dirty = 0;
+            }
+            return _.bboxwt;
+        }
+        if (_.dirty || _.dirtyT || !_.bbox) {
+            if (_.dirty || !this.realPath) {
+                _.bboxwt = 0;
+                this.realPath = getPath[this.type](this);
+            }
+            _.bbox = pathDimensions(mapPath(this.realPath, this.matrix));
+            _.bbox.toString = x_y_w_h;
+            _.dirty = _.dirtyT = 0;
+        }
+        return _.bbox;
+    };
+    
+    elproto.clone = function () {
+        if (this.removed) {
+            return null;
+        }
+        var out = this.paper[this.type]().attr(this.attr());
+        this.__set__ && this.__set__.push(out);
+        return out;
+    };
+    
+    elproto.glow = function (glow) {
+        if (this.type == "text") {
+            return null;
+        }
+        glow = glow || {};
+        var s = {
+            width: (glow.width || 10) + (+this.attr("stroke-width") || 1),
+            fill: glow.fill || false,
+            opacity: glow.opacity || .5,
+            offsetx: glow.offsetx || 0,
+            offsety: glow.offsety || 0,
+            color: glow.color || "#000"
+        },
+            c = s.width / 2,
+            r = this.paper,
+            out = r.set(),
+            path = this.realPath || getPath[this.type](this);
+        path = this.matrix ? mapPath(path, this.matrix) : path;
+        for (var i = 1; i < c + 1; i++) {
+            out.push(r.path(path).attr({
+                stroke: s.color,
+                fill: s.fill ? s.color : "none",
+                "stroke-linejoin": "round",
+                "stroke-linecap": "round",
+                "stroke-width": +(s.width / c * i).toFixed(3),
+                opacity: +(s.opacity / c).toFixed(3)
+            }));
+        }
+        return out.insertBefore(this).translate(s.offsetx, s.offsety);
+    };
+    var curveslengths = {},
+    getPointAtSegmentLength = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, length) {
+        var len = 0,
+            precision = 100,
+            name = [p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y].join(),
+            cache = curveslengths[name],
+            old, dot;
+        !cache && (curveslengths[name] = cache = {data: []});
+        cache.timer && clearTimeout(cache.timer);
+        cache.timer = setTimeout(function () {delete curveslengths[name];}, 2e3);
+        if (length != null && !cache.precision) {
+            var total = getPointAtSegmentLength(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y);
+            cache.precision = ~~total * 10;
+            cache.data = [];
+        }
+        precision = cache.precision || precision;
+        for (var i = 0; i < precision + 1; i++) {
+            if (cache.data[i * precision]) {
+                dot = cache.data[i * precision];
+            } else {
+                dot = R.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, i / precision);
+                cache.data[i * precision] = dot;
+            }
+            i && (len += pow(pow(old.x - dot.x, 2) + pow(old.y - dot.y, 2), .5));
+            if (length != null && len >= length) {
+                return dot;
+            }
+            old = dot;
+        }
+        if (length == null) {
+            return len;
+        }
+    },
+    getLengthFactory = function (istotal, subpath) {
+        return function (path, length, onlystart) {
+            path = path2curve(path);
+            var x, y, p, l, sp = "", subpaths = {}, point,
+                len = 0;
+            for (var i = 0, ii = path.length; i < ii; i++) {
+                p = path[i];
+                if (p[0] == "M") {
+                    x = +p[1];
+                    y = +p[2];
+                } else {
+                    l = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6]);
+                    if (len + l > length) {
+                        if (subpath && !subpaths.start) {
+                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
+                            sp += ["C" + point.start.x, point.start.y, point.m.x, point.m.y, point.x, point.y];
+                            if (onlystart) {return sp;}
+                            subpaths.start = sp;
+                            sp = ["M" + point.x, point.y + "C" + point.n.x, point.n.y, point.end.x, point.end.y, p[5], p[6]].join();
+                            len += l;
+                            x = +p[5];
+                            y = +p[6];
+                            continue;
+                        }
+                        if (!istotal && !subpath) {
+                            point = getPointAtSegmentLength(x, y, p[1], p[2], p[3], p[4], p[5], p[6], length - len);
+                            return {x: point.x, y: point.y, alpha: point.alpha};
+                        }
+                    }
+                    len += l;
+                    x = +p[5];
+                    y = +p[6];
+                }
+                sp += p.shift() + p;
+            }
+            subpaths.end = sp;
+            point = istotal ? len : subpath ? subpaths : R.findDotsAtSegment(x, y, p[0], p[1], p[2], p[3], p[4], p[5], 1);
+            point.alpha && (point = {x: point.x, y: point.y, alpha: point.alpha});
+            return point;
+        };
+    };
+    var getTotalLength = getLengthFactory(1),
+        getPointAtLength = getLengthFactory(),
+        getSubpathsAtLength = getLengthFactory(0, 1);
+    
+    R.getTotalLength = getTotalLength;
+    
+    R.getPointAtLength = getPointAtLength;
+    
+    R.getSubpath = function (path, from, to) {
+        if (this.getTotalLength(path) - to < 1e-6) {
+            return getSubpathsAtLength(path, from).end;
+        }
+        var a = getSubpathsAtLength(path, to, 1);
+        return from ? getSubpathsAtLength(a, from).end : a;
+    };
+    
+    elproto.getTotalLength = function () {
+        if (this.type != "path") {return;}
+        if (this.node.getTotalLength) {
+            return this.node.getTotalLength();
+        }
+        return getTotalLength(this.attrs.path);
+    };
+    
+    elproto.getPointAtLength = function (length) {
+        if (this.type != "path") {return;}
+        return getPointAtLength(this.attrs.path, length);
+    };
+    
+    elproto.getSubpath = function (from, to) {
+        if (this.type != "path") {return;}
+        return R.getSubpath(this.attrs.path, from, to);
+    };
+    
+    var ef = R.easing_formulas = {
+        linear: function (n) {
+            return n;
+        },
+        "<": function (n) {
+            return pow(n, 1.7);
+        },
+        ">": function (n) {
+            return pow(n, .48);
+        },
+        "<>": function (n) {
+            var q = .48 - n / 1.04,
+                Q = math.sqrt(.1734 + q * q),
+                x = Q - q,
+                X = pow(abs(x), 1 / 3) * (x < 0 ? -1 : 1),
+                y = -Q - q,
+                Y = pow(abs(y), 1 / 3) * (y < 0 ? -1 : 1),
+                t = X + Y + .5;
+            return (1 - t) * 3 * t * t + t * t * t;
+        },
+        backIn: function (n) {
+            var s = 1.70158;
+            return n * n * ((s + 1) * n - s);
+        },
+        backOut: function (n) {
+            n = n - 1;
+            var s = 1.70158;
+            return n * n * ((s + 1) * n + s) + 1;
+        },
+        elastic: function (n) {
+            if (n == !!n) {
+                return n;
+            }
+            return pow(2, -10 * n) * math.sin((n - .075) * (2 * PI) / .3) + 1;
+        },
+        bounce: function (n) {
+            var s = 7.5625,
+                p = 2.75,
+                l;
+            if (n < (1 / p)) {
+                l = s * n * n;
+            } else {
+                if (n < (2 / p)) {
+                    n -= (1.5 / p);
+                    l = s * n * n + .75;
+                } else {
+                    if (n < (2.5 / p)) {
+                        n -= (2.25 / p);
+                        l = s * n * n + .9375;
+                    } else {
+                        n -= (2.625 / p);
+                        l = s * n * n + .984375;
+                    }
+                }
+            }
+            return l;
+        }
+    };
+    ef.easeIn = ef["ease-in"] = ef["<"];
+    ef.easeOut = ef["ease-out"] = ef[">"];
+    ef.easeInOut = ef["ease-in-out"] = ef["<>"];
+    ef["back-in"] = ef.backIn;
+    ef["back-out"] = ef.backOut;
+
+    var animationElements = [],
+        requestAnimFrame = window.requestAnimationFrame       ||
+                           window.webkitRequestAnimationFrame ||
+                           window.mozRequestAnimationFrame    ||
+                           window.oRequestAnimationFrame      ||
+                           window.msRequestAnimationFrame     ||
+                           function (callback) {
+                               setTimeout(callback, 16);
+                           },
+        animation = function () {
+            var Now = +new Date,
+                l = 0;
+            for (; l < animationElements.length; l++) {
+                var e = animationElements[l];
+                if (e.el.removed || e.paused) {
+                    continue;
+                }
+                var time = Now - e.start,
+                    ms = e.ms,
+                    easing = e.easing,
+                    from = e.from,
+                    diff = e.diff,
+                    to = e.to,
+                    t = e.t,
+                    that = e.el,
+                    set = {},
+                    now,
+                    init = {},
+                    key;
+                if (e.initstatus) {
+                    time = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * ms;
+                    e.status = e.initstatus;
+                    delete e.initstatus;
+                    e.stop && animationElements.splice(l--, 1);
+                } else {
+                    e.status = (e.prev + (e.percent - e.prev) * (time / ms)) / e.anim.top;
+                }
+                if (time < 0) {
+                    continue;
+                }
+                if (time < ms) {
+                    var pos = easing(time / ms);
+                    for (var attr in from) if (from[has](attr)) {
+                        switch (availableAnimAttrs[attr]) {
+                            case nu:
+                                now = +from[attr] + pos * ms * diff[attr];
+                                break;
+                            case "colour":
+                                now = "rgb(" + [
+                                    upto255(round(from[attr].r + pos * ms * diff[attr].r)),
+                                    upto255(round(from[attr].g + pos * ms * diff[attr].g)),
+                                    upto255(round(from[attr].b + pos * ms * diff[attr].b))
+                                ].join(",") + ")";
+                                break;
+                            case "path":
+                                now = [];
+                                for (var i = 0, ii = from[attr].length; i < ii; i++) {
+                                    now[i] = [from[attr][i][0]];
+                                    for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                        now[i][j] = +from[attr][i][j] + pos * ms * diff[attr][i][j];
+                                    }
+                                    now[i] = now[i].join(S);
+                                }
+                                now = now.join(S);
+                                break;
+                            case "transform":
+                                if (diff[attr].real) {
+                                    now = [];
+                                    for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                        now[i] = [from[attr][i][0]];
+                                        for (j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                            now[i][j] = from[attr][i][j] + pos * ms * diff[attr][i][j];
+                                        }
+                                    }
+                                } else {
+                                    var get = function (i) {
+                                        return +from[attr][i] + pos * ms * diff[attr][i];
+                                    };
+                                    // now = [["r", get(2), 0, 0], ["t", get(3), get(4)], ["s", get(0), get(1), 0, 0]];
+                                    now = [["m", get(0), get(1), get(2), get(3), get(4), get(5)]];
+                                }
+                                break;
+                            case "csv":
+                                if (attr == "clip-rect") {
+                                    now = [];
+                                    i = 4;
+                                    while (i--) {
+                                        now[i] = +from[attr][i] + pos * ms * diff[attr][i];
+                                    }
+                                }
+                                break;
+                            default:
+                                var from2 = [][concat](from[attr]);
+                                now = [];
+                                i = that.paper.customAttributes[attr].length;
+                                while (i--) {
+                                    now[i] = +from2[i] + pos * ms * diff[attr][i];
+                                }
+                                break;
+                        }
+                        set[attr] = now;
+                    }
+                    that.attr(set);
+                    (function (id, that, anim) {
+                        setTimeout(function () {
+                            eve("anim.frame." + id, that, anim);
+                        });
+                    })(that.id, that, e.anim);
+                } else {
+                    (function(f, el, a) {
+                        setTimeout(function() {
+                            eve("anim.frame." + el.id, el, a);
+                            eve("anim.finish." + el.id, el, a);
+                            R.is(f, "function") && f.call(el);
+                        });
+                    })(e.callback, that, e.anim);
+                    that.attr(to);
+                    animationElements.splice(l--, 1);
+                    if (e.repeat > 1 && !e.next) {
+                        for (key in to) if (to[has](key)) {
+                            init[key] = e.totalOrigin[key];
+                        }
+                        e.el.attr(init);
+                        runAnimation(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1);
+                    }
+                    if (e.next && !e.stop) {
+                        runAnimation(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat);
+                    }
+                }
+            }
+            R.svg && that && that.paper && that.paper.safari();
+            animationElements.length && requestAnimFrame(animation);
+        },
+        upto255 = function (color) {
+            return color > 255 ? 255 : color < 0 ? 0 : color;
+        };
+    
+    elproto.animateWith = function (el, anim, params, ms, easing, callback) {
+        var element = this;
+        if (element.removed) {
+            callback && callback.call(element);
+            return element;
+        }
+        var a = params instanceof Animation ? params : R.animation(params, ms, easing, callback),
+            x, y;
+        runAnimation(a, element, a.percents[0], null, element.attr());
+        for (var i = 0, ii = animationElements.length; i < ii; i++) {
+            if (animationElements[i].anim == anim && animationElements[i].el == el) {
+                animationElements[ii - 1].start = animationElements[i].start;
+                break;
+            }
+        }
+        return element;
+        // 
+        // 
+        // var a = params ? R.animation(params, ms, easing, callback) : anim,
+        //     status = element.status(anim);
+        // return this.animate(a).status(a, status * anim.ms / a.ms);
+    };
+    function CubicBezierAtTime(t, p1x, p1y, p2x, p2y, duration) {
+        var cx = 3 * p1x,
+            bx = 3 * (p2x - p1x) - cx,
+            ax = 1 - cx - bx,
+            cy = 3 * p1y,
+            by = 3 * (p2y - p1y) - cy,
+            ay = 1 - cy - by;
+        function sampleCurveX(t) {
+            return ((ax * t + bx) * t + cx) * t;
+        }
+        function solve(x, epsilon) {
+            var t = solveCurveX(x, epsilon);
+            return ((ay * t + by) * t + cy) * t;
+        }
+        function solveCurveX(x, epsilon) {
+            var t0, t1, t2, x2, d2, i;
+            for(t2 = x, i = 0; i < 8; i++) {
+                x2 = sampleCurveX(t2) - x;
+                if (abs(x2) < epsilon) {
+                    return t2;
+                }
+                d2 = (3 * ax * t2 + 2 * bx) * t2 + cx;
+                if (abs(d2) < 1e-6) {
+                    break;
+                }
+                t2 = t2 - x2 / d2;
+            }
+            t0 = 0;
+            t1 = 1;
+            t2 = x;
+            if (t2 < t0) {
+                return t0;
+            }
+            if (t2 > t1) {
+                return t1;
+            }
+            while (t0 < t1) {
+                x2 = sampleCurveX(t2);
+                if (abs(x2 - x) < epsilon) {
+                    return t2;
+                }
+                if (x > x2) {
+                    t0 = t2;
+                } else {
+                    t1 = t2;
+                }
+                t2 = (t1 - t0) / 2 + t0;
+            }
+            return t2;
+        }
+        return solve(t, 1 / (200 * duration));
+    }
+    elproto.onAnimation = function (f) {
+        f ? eve.on("anim.frame." + this.id, f) : eve.unbind("anim.frame." + this.id);
+        return this;
+    };
+    function Animation(anim, ms) {
+        var percents = [],
+            newAnim = {};
+        this.ms = ms;
+        this.times = 1;
+        if (anim) {
+            for (var attr in anim) if (anim[has](attr)) {
+                newAnim[toFloat(attr)] = anim[attr];
+                percents.push(toFloat(attr));
+            }
+            percents.sort(sortByNumber);
+        }
+        this.anim = newAnim;
+        this.top = percents[percents.length - 1];
+        this.percents = percents;
+    }
+    
+    Animation.prototype.delay = function (delay) {
+        var a = new Animation(this.anim, this.ms);
+        a.times = this.times;
+        a.del = +delay || 0;
+        return a;
+    };
+    
+    Animation.prototype.repeat = function (times) { 
+        var a = new Animation(this.anim, this.ms);
+        a.del = this.del;
+        a.times = math.floor(mmax(times, 0)) || 1;
+        return a;
+    };
+    function runAnimation(anim, element, percent, status, totalOrigin, times) {
+        percent = toFloat(percent);
+        var params,
+            isInAnim,
+            isInAnimSet,
+            percents = [],
+            next,
+            prev,
+            timestamp,
+            ms = anim.ms,
+            from = {},
+            to = {},
+            diff = {};
+        if (status) {
+            for (i = 0, ii = animationElements.length; i < ii; i++) {
+                var e = animationElements[i];
+                if (e.el.id == element.id && e.anim == anim) {
+                    if (e.percent != percent) {
+                        animationElements.splice(i, 1);
+                        isInAnimSet = 1;
+                    } else {
+                        isInAnim = e;
+                    }
+                    element.attr(e.totalOrigin);
+                    break;
+                }
+            }
+        } else {
+            status = +to; // NaN
+        }
+        for (var i = 0, ii = anim.percents.length; i < ii; i++) {
+            if (anim.percents[i] == percent || anim.percents[i] > status * anim.top) {
+                percent = anim.percents[i];
+                prev = anim.percents[i - 1] || 0;
+                ms = ms / anim.top * (percent - prev);
+                next = anim.percents[i + 1];
+                params = anim.anim[percent];
+                break;
+            } else if (status) {
+                element.attr(anim.anim[anim.percents[i]]);
+            }
+        }
+        if (!params) {
+            return;
+        }
+        if (!isInAnim) {
+            for (var attr in params) if (params[has](attr)) {
+                if (availableAnimAttrs[has](attr) || element.paper.customAttributes[has](attr)) {
+                    from[attr] = element.attr(attr);
+                    (from[attr] == null) && (from[attr] = availableAttrs[attr]);
+                    to[attr] = params[attr];
+                    switch (availableAnimAttrs[attr]) {
+                        case nu:
+                            diff[attr] = (to[attr] - from[attr]) / ms;
+                            break;
+                        case "colour":
+                            from[attr] = R.getRGB(from[attr]);
+                            var toColour = R.getRGB(to[attr]);
+                            diff[attr] = {
+                                r: (toColour.r - from[attr].r) / ms,
+                                g: (toColour.g - from[attr].g) / ms,
+                                b: (toColour.b - from[attr].b) / ms
+                            };
+                            break;
+                        case "path":
+                            var pathes = path2curve(from[attr], to[attr]),
+                                toPath = pathes[1];
+                            from[attr] = pathes[0];
+                            diff[attr] = [];
+                            for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                diff[attr][i] = [0];
+                                for (var j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                    diff[attr][i][j] = (toPath[i][j] - from[attr][i][j]) / ms;
+                                }
+                            }
+                            break;
+                        case "transform":
+                            var _ = element._,
+                                eq = equaliseTransform(_[attr], to[attr]);
+                            if (eq) {
+                                from[attr] = eq.from;
+                                to[attr] = eq.to;
+                                diff[attr] = [];
+                                diff[attr].real = true;
+                                for (i = 0, ii = from[attr].length; i < ii; i++) {
+                                    diff[attr][i] = [from[attr][i][0]];
+                                    for (j = 1, jj = from[attr][i].length; j < jj; j++) {
+                                        diff[attr][i][j] = (to[attr][i][j] - from[attr][i][j]) / ms;
+                                    }
+                                }
+                            } else {
+                                var m = (element.matrix || new Matrix),
+                                    to2 = {
+                                        _: {transform: _.transform},
+                                        getBBox: function () {
+                                            return element.getBBox(1);
+                                        }
+                                    };
+                                from[attr] = [
+                                    m.a,
+                                    m.b,
+                                    m.c,
+                                    m.d,
+                                    m.e,
+                                    m.f
+                                ];
+                                extractTransform(to2, to[attr]);
+                                to[attr] = to2._.transform;
+                                diff[attr] = [
+                                    (to2.matrix.a - m.a) / ms,
+                                    (to2.matrix.b - m.b) / ms,
+                                    (to2.matrix.c - m.c) / ms,
+                                    (to2.matrix.d - m.d) / ms,
+                                    (to2.matrix.e - m.e) / ms,
+                                    (to2.matrix.e - m.f) / ms
+                                ];
+                                // from[attr] = [_.sx, _.sy, _.deg, _.dx, _.dy];
+                                // var to2 = {_:{}, getBBox: function () { return element.getBBox(); }};
+                                // extractTransform(to2, to[attr]);
+                                // diff[attr] = [
+                                //     (to2._.sx - _.sx) / ms,
+                                //     (to2._.sy - _.sy) / ms,
+                                //     (to2._.deg - _.deg) / ms,
+                                //     (to2._.dx - _.dx) / ms,
+                                //     (to2._.dy - _.dy) / ms
+                                // ];
+                            }
+                            break;
+                        case "csv":
+                            var values = Str(params[attr])[split](separator),
+                                from2 = Str(from[attr])[split](separator);
+                            if (attr == "clip-rect") {
+                                from[attr] = from2;
+                                diff[attr] = [];
+                                i = from2.length;
+                                while (i--) {
+                                    diff[attr][i] = (values[i] - from[attr][i]) / ms;
+                                }
+                            }
+                            to[attr] = values;
+                            break;
+                        default:
+                            values = [][concat](params[attr]);
+                            from2 = [][concat](from[attr]);
+                            diff[attr] = [];
+                            i = element.paper.customAttributes[attr].length;
+                            while (i--) {
+                                diff[attr][i] = ((values[i] || 0) - (from2[i] || 0)) / ms;
+                            }
+                            break;
+                    }
+                }
+            }
+            var easing = params.easing,
+                easyeasy = R.easing_formulas[easing];
+            if (!easyeasy) {
+                easyeasy = Str(easing).match(bezierrg);
+                if (easyeasy && easyeasy.length == 5) {
+                    var curve = easyeasy;
+                    easyeasy = function (t) {
+                        return CubicBezierAtTime(t, +curve[1], +curve[2], +curve[3], +curve[4], ms);
+                    };
+                } else {
+                    easyeasy = pipe;
+                }
+            }
+            timestamp = params.start || anim.start || +new Date;
+            e = {
+                anim: anim,
+                percent: percent,
+                timestamp: timestamp,
+                start: timestamp + (anim.del || 0),
+                status: 0,
+                initstatus: status || 0,
+                stop: false,
+                ms: ms,
+                easing: easyeasy,
+                from: from,
+                diff: diff,
+                to: to,
+                el: element,
+                callback: params.callback,
+                prev: prev,
+                next: next,
+                repeat: times || anim.times,
+                origin: element.attr(),
+                totalOrigin: totalOrigin
+            };
+            animationElements.push(e);
+            if (status && !isInAnim && !isInAnimSet) {
+                e.stop = true;
+                e.start = new Date - ms * status;
+                if (animationElements.length == 1) {
+                    return animation();
+                }
+            }
+            if (isInAnimSet) {
+                e.start = new Date - e.ms * status;
+            }
+            animationElements.length == 1 && requestAnimFrame(animation);
+        } else {
+            isInAnim.initstatus = status;
+            isInAnim.start = new Date - isInAnim.ms * status;
+        }
+        eve("anim.start." + element.id, element, anim);
+    }
+    
+    R.animation = function (params, ms, easing, callback) {
+        if (params instanceof Animation) {
+            return params;
+        }
+        if (R.is(easing, "function") || !easing) {
+            callback = callback || easing || null;
+            easing = null;
+        }
+        params = Object(params);
+        ms = +ms || 0;
+        var p = {},
+            json,
+            attr;
+        for (attr in params) if (params[has](attr) && toFloat(attr) != attr && toFloat(attr) + "%" != attr) {
+            json = true;
+            p[attr] = params[attr];
+        }
+        if (!json) {
+            return new Animation(params, ms);
+        } else {
+            easing && (p.easing = easing);
+            callback && (p.callback = callback);
+            return new Animation({100: p}, ms);
+        }
+    };
+    
+    elproto.animate = function (params, ms, easing, callback) {
+        var element = this;
+        if (element.removed) {
+            callback && callback.call(element);
+            return element;
+        }
+        var anim = params instanceof Animation ? params : R.animation(params, ms, easing, callback);
+        runAnimation(anim, element, anim.percents[0], null, element.attr());
+        return element;
+    };
+    
+    elproto.setTime = function (anim, value) {
+        if (anim && value != null) {
+            this.status(anim, mmin(value, anim.ms) / anim.ms);
+        }
+        return this;
+    };
+    
+    elproto.status = function (anim, value) {
+        var out = [],
+            i = 0,
+            len,
+            e;
+        if (value != null) {
+            runAnimation(anim, this, -1, mmin(value, 1));
+            return this;
+        } else {
+            len = animationElements.length;
+            for (; i < len; i++) {
+                e = animationElements[i];
+                if (e.el.id == this.id && (!anim || e.anim == anim)) {
+                    if (anim) {
+                        return e.status;
+                    }
+                    out.push({
+                        anim: e.anim,
+                        status: e.status
+                    });
+                }
+            }
+            if (anim) {
+                return 0;
+            }
+            return out;
+        }
+    };
+    
+    elproto.pause = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            if (eve("anim.pause." + this.id, this, animationElements[i].anim) !== false) {
+                animationElements[i].paused = true;
+            }
+        }
+        return this;
+    };
+    
+    elproto.resume = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            var e = animationElements[i];
+            if (eve("anim.resume." + this.id, this, e.anim) !== false) {
+                delete e.paused;
+                this.status(e.anim, e.status);
+            }
+        }
+        return this;
+    };
+    
+    elproto.stop = function (anim) {
+        for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) {
+            if (eve("anim.stop." + this.id, this, animationElements[i].anim) !== false) {
+                animationElements.splice(i--, 1);
+            }
+        }
+        return this;
+    };
+    elproto.toString = function () {
+        return "Rapha\xebl\u2019s object";
+    };
+
+    // Set
+    var Set = function (items) {
+        this.items = [];
+        this.length = 0;
+        this.type = "set";
+        if (items) {
+            for (var i = 0, ii = items.length; i < ii; i++) {
+                if (items[i] && (items[i].constructor == elproto.constructor || items[i].constructor == Set)) {
+                    this[this.items.length] = this.items[this.items.length] = items[i];
+                    this.length++;
+                }
+            }
+        }
+    },
+    setproto = Set.prototype;
+    
+    setproto.push = function () {
+        var item,
+            len;
+        for (var i = 0, ii = arguments.length; i < ii; i++) {
+            item = arguments[i];
+            if (item && (item.constructor == elproto.constructor || item.constructor == Set)) {
+                len = this.items.length;
+                this[len] = this.items[len] = item;
+                this.length++;
+            }
+        }
+        return this;
+    };
+    
+    setproto.pop = function () {
+        this.length && delete this[this.length--];
+        return this.items.pop();
+    };
+    
+    setproto.forEach = function (callback, thisArg) {
+        for (var i = 0, ii = this.items.length; i < ii; i++) {
+            if (callback.call(thisArg, this.items[i], i) === false) {
+                return this;
+            }
+        }
+        return this;
+    };
+    for (var method in elproto) if (elproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname][apply](el, arg);
+                });
+            };
+        })(method);
+    }
+    setproto.attr = function (name, value) {
+        if (name && R.is(name, array) && R.is(name[0], "object")) {
+            for (var j = 0, jj = name.length; j < jj; j++) {
+                this.items[j].attr(name[j]);
+            }
+        } else {
+            for (var i = 0, ii = this.items.length; i < ii; i++) {
+                this.items[i].attr(name, value);
+            }
+        }
+        return this;
+    };
+    
+    setproto.clear = function () {
+        while (this.length) {
+            this.pop();
+        }
+    };
+    
+    setproto.splice = function (index, count, insertion) {
+        index = index < 0 ? mmax(this.length + index, 0) : index;
+        count = mmax(0, mmin(this.length - index, count));
+        var tail = [],
+            todel = [],
+            args = [],
+            i;
+        for (i = 2; i < arguments.length; i++) {
+            args.push(arguments[i]);
+        }
+        for (i = 0; i < count; i++) {
+            todel.push(this[index + i]);
+        }
+        for (; i < this.length - index; i++) {
+            tail.push(this[index + i]);
+        }
+        var arglen = args.length;
+        for (i = 0; i < arglen + tail.length; i++) {
+            this.items[index + i] = this[index + i] = i < arglen ? args[i] : tail[i - arglen];
+        }
+        i = this.items.length = this.length -= count - arglen;
+        while (this[i]) {
+            delete this[i++];
+        }
+        return new Set(todel);
+    };
+    
+    setproto.exclude = function (el) {
+        for (var i = 0, ii = this.length; i < ii; i++) if (this[i] == el) {
+            this.splice(i, 1);
+            return true;
+        }
+    };
+    setproto.animate = function (params, ms, easing, callback) {
+        (R.is(easing, "function") || !easing) && (callback = easing || null);
+        var len = this.items.length,
+            i = len,
+            item,
+            set = this,
+            collector;
+        if (!len) {
+            return this;
+        }
+        callback && (collector = function () {
+            !--len && callback.call(set);
+        });
+        easing = R.is(easing, string) ? easing : collector;
+        var anim = R.animation(params, ms, easing, collector);
+        item = this.items[--i].animate(anim);
+        while (i--) {
+            this.items[i] && !this.items[i].removed && this.items[i].animateWith(item, anim, anim);
+        }
+        return this;
+    };
+    setproto.insertAfter = function (el) {
+        var i = this.items.length;
+        while (i--) {
+            this.items[i].insertAfter(el);
+        }
+        return this;
+    };
+    setproto.getBBox = function () {
+        var x = [],
+            y = [],
+            w = [],
+            h = [];
+        for (var i = this.items.length; i--;) if (!this.items[i].removed) {
+            var box = this.items[i].getBBox();
+            x.push(box.x);
+            y.push(box.y);
+            w.push(box.x + box.width);
+            h.push(box.y + box.height);
+        }
+        x = mmin[apply](0, x);
+        y = mmin[apply](0, y);
+        return {
+            x: x,
+            y: y,
+            width: mmax[apply](0, w) - x,
+            height: mmax[apply](0, h) - y
+        };
+    };
+    setproto.clone = function (s) {
+        s = new Set;
+        for (var i = 0, ii = this.items.length; i < ii; i++) {
+            s.push(this.items[i].clone());
+        }
+        return s;
+    };
+    setproto.toString = function () {
+        return "Rapha\xebl\u2018s set";
+    };
+
+    
+    R.registerFont = function (font) {
+        if (!font.face) {
+            return font;
+        }
+        this.fonts = this.fonts || {};
+        var fontcopy = {
+                w: font.w,
+                face: {},
+                glyphs: {}
+            },
+            family = font.face["font-family"];
+        for (var prop in font.face) if (font.face[has](prop)) {
+            fontcopy.face[prop] = font.face[prop];
+        }
+        if (this.fonts[family]) {
+            this.fonts[family].push(fontcopy);
+        } else {
+            this.fonts[family] = [fontcopy];
+        }
+        if (!font.svg) {
+            fontcopy.face["units-per-em"] = toInt(font.face["units-per-em"], 10);
+            for (var glyph in font.glyphs) if (font.glyphs[has](glyph)) {
+                var path = font.glyphs[glyph];
+                fontcopy.glyphs[glyph] = {
+                    w: path.w,
+                    k: {},
+                    d: path.d && "M" + path.d.replace(/[mlcxtrv]/g, function (command) {
+                            return {l: "L", c: "C", x: "z", t: "m", r: "l", v: "c"}[command] || "M";
+                        }) + "z"
+                };
+                if (path.k) {
+                    for (var k in path.k) if (path[has](k)) {
+                        fontcopy.glyphs[glyph].k[k] = path.k[k];
+                    }
+                }
+            }
+        }
+        return font;
+    };
+    
+    paperproto.getFont = function (family, weight, style, stretch) {
+        stretch = stretch || "normal";
+        style = style || "normal";
+        weight = +weight || {normal: 400, bold: 700, lighter: 300, bolder: 800}[weight] || 400;
+        if (!R.fonts) {
+            return;
+        }
+        var font = R.fonts[family];
+        if (!font) {
+            var name = new RegExp("(^|\\s)" + family.replace(/[^\w\d\s+!~.:_-]/g, E) + "(\\s|$)", "i");
+            for (var fontName in R.fonts) if (R.fonts[has](fontName)) {
+                if (name.test(fontName)) {
+                    font = R.fonts[fontName];
+                    break;
+                }
+            }
+        }
+        var thefont;
+        if (font) {
+            for (var i = 0, ii = font.length; i < ii; i++) {
+                thefont = font[i];
+                if (thefont.face["font-weight"] == weight && (thefont.face["font-style"] == style || !thefont.face["font-style"]) && thefont.face["font-stretch"] == stretch) {
+                    break;
+                }
+            }
+        }
+        return thefont;
+    };
+    
+    paperproto.print = function (x, y, string, font, size, origin, letter_spacing) {
+        origin = origin || "middle"; // baseline|middle
+        letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1);
+        var out = this.set(),
+            letters = Str(string)[split](E),
+            shift = 0,
+            path = E,
+            scale;
+        R.is(font, string) && (font = this.getFont(font));
+        if (font) {
+            scale = (size || 16) / font.face["units-per-em"];
+            var bb = font.face.bbox[split](separator),
+                top = +bb[0],
+                height = +bb[1] + (origin == "baseline" ? bb[3] - bb[1] + (+font.face.descent) : (bb[3] - bb[1]) / 2);
+            for (var i = 0, ii = letters.length; i < ii; i++) {
+                var prev = i && font.glyphs[letters[i - 1]] || {},
+                    curr = font.glyphs[letters[i]];
+                shift += i ? (prev.w || font.w) + (prev.k && prev.k[letters[i]] || 0) + (font.w * letter_spacing) : 0;
+                curr && curr.d && out.push(this.path(curr.d).attr({
+                    fill: "#000",
+                    stroke: "none",
+                    transform: [["t", shift * scale, 0]]
+                }));
+            }
+            out.transform(["...s", scale, scale, top, height, "t", (x - top) / scale, (y - height) / scale]);
+        }
+        return out;
+    };
+
+    
+    paperproto.add = function (json) {
+        if (R.is(json, "array")) {
+            var res = this.set(),
+                i = 0,
+                ii = json.length,
+                j;
+            for (; i < ii; i++) {
+                j = json[i] || {};
+                elements[has](j.type) && res.push(this[j.type]().attr(j));
+            }
+        }
+        return res;
+    };
+
+    
+    R.format = function (token, params) {
+        var args = R.is(params, array) ? [0][concat](params) : arguments;
+        token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) {
+            return args[++i] == null ? E : args[i];
+        }));
+        return token || E;
+    };
+    
+    R.fullfill = (function () {
+        var tokenRegex = /\{([^\}]+)\}/g,
+            objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties
+            replacer = function (all, key, obj) {
+                var res = obj;
+                key.replace(objNotationRegex, function (all, name, quote, quotedName, isFunc) {
+                    name = name || quotedName;
+                    if (res) {
+                        if (name in res) {
+                            res = res[name];
+                        }
+                        typeof res == "function" && isFunc && (res = res());
+                    }
+                });
+                res = (res == null || res == obj ? all : res) + "";
+                return res;
+            };
+        return function (str, obj) {
+            return String(str).replace(tokenRegex, function (all, key) {
+                return replacer(all, key, obj);
+            });
+        };
+    })();
+    
+    R.ninja = function () {
+        oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael;
+        return R;
+    };
+    
+    R.st = setproto;
+    // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html
+    (function (doc, loaded, f) {
+        if (doc.readyState == null && doc.addEventListener){
+            doc.addEventListener(loaded, f = function () {
+                doc.removeEventListener(loaded, f, false);
+                doc.readyState = "complete";
+            }, false);
+            doc.readyState = "loading";
+        }
+        function isLoaded() {
+            (/in/).test(doc.readyState) ? setTimeout(isLoaded, 9) : R.eve("DOMload");
+        }
+        isLoaded();
+    })(document, "DOMContentLoaded");
+
+    oldRaphael.was ? (g.win.Raphael = R) : (Raphael = R);
+    
+    eve.on("DOMload", function () {
+        loaded = true;
+    });
+})();
+
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël - JavaScript Vector Library                                 │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ SVG Module                                                          │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+window.Raphael.svg && function (R) {
+    var has = "hasOwnProperty",
+        Str = String,
+        toFloat = parseFloat,
+        toInt = parseInt,
+        math = Math,
+        mmax = math.max,
+        abs = math.abs,
+        pow = math.pow,
+        separator = /[, ]+/,
+        eve = R.eve,
+        E = "",
+        S = " ";
+    var xlink = "http://www.w3.org/1999/xlink",
+        markers = {
+            block: "M5,0 0,2.5 5,5z",
+            classic: "M5,0 0,2.5 5,5 3.5,3 3.5,2z",
+            diamond: "M2.5,0 5,2.5 2.5,5 0,2.5z",
+            open: "M6,1 1,3.5 6,6",
+            oval: "M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"
+        },
+        markerCounter = {};
+    R.toString = function () {
+        return  "Your browser supports SVG.\nYou are running Rapha\xebl " + this.version;
+    };
+    var $ = function (el, attr) {
+        if (attr) {
+            if (typeof el == "string") {
+                el = $(el);
+            }
+            for (var key in attr) if (attr[has](key)) {
+                if (key.substring(0, 6) == "xlink:") {
+                    el.setAttributeNS(xlink, key.substring(6), Str(attr[key]));
+                } else {
+                    el.setAttribute(key, Str(attr[key]));
+                }
+            }
+        } else {
+            el = R._g.doc.createElementNS("http://www.w3.org/2000/svg", el);
+            el.style && (el.style.webkitTapHighlightColor = "rgba(0,0,0,0)");
+        }
+        return el;
+    },
+    addGradientFill = function (element, gradient) {
+        var type = "linear",
+            id = element.id + gradient,
+            fx = .5, fy = .5,
+            o = element.node,
+            SVG = element.paper,
+            s = o.style,
+            el = R._g.doc.getElementById(id);
+        if (!el) {
+            gradient = Str(gradient).replace(R._radial_gradient, function (all, _fx, _fy) {
+                type = "radial";
+                if (_fx && _fy) {
+                    fx = toFloat(_fx);
+                    fy = toFloat(_fy);
+                    var dir = ((fy > .5) * 2 - 1);
+                    pow(fx - .5, 2) + pow(fy - .5, 2) > .25 &&
+                        (fy = math.sqrt(.25 - pow(fx - .5, 2)) * dir + .5) &&
+                        fy != .5 &&
+                        (fy = fy.toFixed(5) - 1e-5 * dir);
+                }
+                return E;
+            });
+            gradient = gradient.split(/\s*\-\s*/);
+            if (type == "linear") {
+                var angle = gradient.shift();
+                angle = -toFloat(angle);
+                if (isNaN(angle)) {
+                    return null;
+                }
+                var vector = [0, 0, math.cos(R.rad(angle)), math.sin(R.rad(angle))],
+                    max = 1 / (mmax(abs(vector[2]), abs(vector[3])) || 1);
+                vector[2] *= max;
+                vector[3] *= max;
+                if (vector[2] < 0) {
+                    vector[0] = -vector[2];
+                    vector[2] = 0;
+                }
+                if (vector[3] < 0) {
+                    vector[1] = -vector[3];
+                    vector[3] = 0;
+                }
+            }
+            var dots = R._parseDots(gradient);
+            if (!dots) {
+                return null;
+            }
+            id = id.replace(/[\(\)\s,\xb0#]/g, "_");
+            
+            if (element.gradient && id != element.gradient.id) {
+                SVG.defs.removeChild(element.gradient);
+                delete element.gradient;
+            }
+
+            if (!element.gradient) {
+                el = $(type + "Gradient", {id: id});
+                element.gradient = el;
+                $(el, type == "radial" ? {
+                    fx: fx,
+                    fy: fy
+                } : {
+                    x1: vector[0],
+                    y1: vector[1],
+                    x2: vector[2],
+                    y2: vector[3],
+                    gradientTransform: element.matrix.invert()
+                });
+                SVG.defs.appendChild(el);
+                for (var i = 0, ii = dots.length; i < ii; i++) {
+                    el.appendChild($("stop", {
+                        offset: dots[i].offset ? dots[i].offset : i ? "100%" : "0%",
+                        "stop-color": dots[i].color || "#fff"
+                    }));
+                }
+            }
+        }
+        $(o, {
+            fill: "url(#" + id + ")",
+            opacity: 1,
+            "fill-opacity": 1
+        });
+        s.fill = E;
+        s.opacity = 1;
+        s.fillOpacity = 1;
+        return 1;
+    },
+    updatePosition = function (o) {
+        var bbox = o.getBBox(1);
+        $(o.pattern, {patternTransform: o.matrix.invert() + " translate(" + bbox.x + "," + bbox.y + ")"});
+    },
+    addArrow = function (o, value, isEnd) {
+        if (o.type == "path") {
+            var values = Str(value).toLowerCase().split("-"),
+                p = o.paper,
+                se = isEnd ? "end" : "start",
+                node = o.node,
+                attrs = o.attrs,
+                stroke = attrs["stroke-width"],
+                i = values.length,
+                type = "classic",
+                from,
+                to,
+                dx,
+                refX,
+                attr,
+                w = 3,
+                h = 3,
+                t = 5;
+            while (i--) {
+                switch (values[i]) {
+                    case "block":
+                    case "classic":
+                    case "oval":
+                    case "diamond":
+                    case "open":
+                    case "none":
+                        type = values[i];
+                        break;
+                    case "wide": h = 5; break;
+                    case "narrow": h = 2; break;
+                    case "long": w = 5; break;
+                    case "short": w = 2; break;
+                }
+            }
+            if (type == "open") {
+                w += 2;
+                h += 2;
+                t += 2;
+                dx = 1;
+                refX = isEnd ? 4 : 1;
+                attr = {
+                    fill: "none",
+                    stroke: attrs.stroke
+                };
+            } else {
+                refX = dx = w / 2;
+                attr = {
+                    fill: attrs.stroke,
+                    stroke: "none"
+                };
+            }
+            if (o._.arrows) {
+                if (isEnd) {
+                    o._.arrows.endPath && markerCounter[o._.arrows.endPath]--;
+                    o._.arrows.endMarker && markerCounter[o._.arrows.endMarker]--;
+                } else {
+                    o._.arrows.startPath && markerCounter[o._.arrows.startPath]--;
+                    o._.arrows.startMarker && markerCounter[o._.arrows.startMarker]--;
+                }
+            } else {
+                o._.arrows = {};
+            }
+            if (type != "none") {
+                var pathId = "raphael-marker-" + type,
+                    markerId = "raphael-marker-" + se + type + w + h;
+                if (!R._g.doc.getElementById(pathId)) {
+                    p.defs.appendChild($($("path"), {
+                        "stroke-linecap": "round",
+                        d: markers[type],
+                        id: pathId
+                    }));
+                    markerCounter[pathId] = 1;
+                } else {
+                    markerCounter[pathId]++;
+                }
+                var marker = R._g.doc.getElementById(markerId),
+                    use;
+                if (!marker) {
+                    marker = $($("marker"), {
+                        id: markerId,
+                        markerHeight: h,
+                        markerWidth: w,
+                        orient: "auto",
+                        refX: refX,
+                        refY: h / 2
+                    });
+                    use = $($("use"), {
+                        "xlink:href": "#" + pathId,
+                        transform: (isEnd ? "rotate(180 " + w / 2 + " " + h / 2 + ") " : E) + "scale(" + w / t + "," + h / t + ")",
+                        "stroke-width": (1 / ((w / t + h / t) / 2)).toFixed(4)
+                    });
+                    marker.appendChild(use);
+                    p.defs.appendChild(marker);
+                    markerCounter[markerId] = 1;
+                } else {
+                    markerCounter[markerId]++;
+                    use = marker.getElementsByTagName("use")[0];
+                }
+                $(use, attr);
+                var delta = dx * (type != "diamond" && type != "oval");
+                if (isEnd) {
+                    from = o._.arrows.startdx * stroke || 0;
+                    to = R.getTotalLength(attrs.path) - delta * stroke;
+                } else {
+                    from = delta * stroke;
+                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
+                }
+                attr = {};
+                attr["marker-" + se] = "url(#" + markerId + ")";
+                if (to || from) {
+                    attr.d = Raphael.getSubpath(attrs.path, from, to);
+                }
+                $(node, attr);
+                o._.arrows[se + "Path"] = pathId;
+                o._.arrows[se + "Marker"] = markerId;
+                o._.arrows[se + "dx"] = delta;
+                o._.arrows[se + "Type"] = type;
+                o._.arrows[se + "String"] = value;
+            } else {
+                if (isEnd) {
+                    from = o._.arrows.startdx * stroke || 0;
+                    to = R.getTotalLength(attrs.path) - from;
+                } else {
+                    from = 0;
+                    to = R.getTotalLength(attrs.path) - (o._.arrows.enddx * stroke || 0);
+                }
+                o._.arrows[se + "Path"] && $(node, {d: Raphael.getSubpath(attrs.path, from, to)});
+                delete o._.arrows[se + "Path"];
+                delete o._.arrows[se + "Marker"];
+                delete o._.arrows[se + "dx"];
+                delete o._.arrows[se + "Type"];
+                delete o._.arrows[se + "String"];
+            }
+            for (attr in markerCounter) if (markerCounter[has](attr) && !markerCounter[attr]) {
+                var item = R._g.doc.getElementById(attr);
+                item && item.parentNode.removeChild(item);
+            }
+        }
+    },
+    dasharray = {
+        "": [0],
+        "none": [0],
+        "-": [3, 1],
+        ".": [1, 1],
+        "-.": [3, 1, 1, 1],
+        "-..": [3, 1, 1, 1, 1, 1],
+        ". ": [1, 3],
+        "- ": [4, 3],
+        "--": [8, 3],
+        "- .": [4, 3, 1, 3],
+        "--.": [8, 3, 1, 3],
+        "--..": [8, 3, 1, 3, 1, 3]
+    },
+    addDashes = function (o, value, params) {
+        value = dasharray[Str(value).toLowerCase()];
+        if (value) {
+            var width = o.attrs["stroke-width"] || "1",
+                butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0,
+                dashes = [],
+                i = value.length;
+            while (i--) {
+                dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt;
+            }
+            $(o.node, {"stroke-dasharray": dashes.join(",")});
+        }
+    },
+    setFillAndStroke = function (o, params) {
+        var node = o.node,
+            attrs = o.attrs,
+            vis = node.style.visibility;
+        node.style.visibility = "hidden";
+        for (var att in params) {
+            if (params[has](att)) {
+                if (!R._availableAttrs[has](att)) {
+                    continue;
+                }
+                var value = params[att];
+                attrs[att] = value;
+                switch (att) {
+                    case "blur":
+                        o.blur(value);
+                        break;
+                    case "href":
+                    case "title":
+                    case "target":
+                        var pn = node.parentNode;
+                        if (pn.tagName.toLowerCase() != "a") {
+                            var hl = $("a");
+                            pn.insertBefore(hl, node);
+                            hl.appendChild(node);
+                            pn = hl;
+                        }
+                        if (att == "target") {
+                            pn.setAttributeNS(xlink, "show", value == "blank" ? "new" : value);
+                        } else {
+                            pn.setAttributeNS(xlink, att, value);
+                        }
+                        break;
+                    case "cursor":
+                        node.style.cursor = value;
+                        break;
+                    case "transform":
+                        o.transform(value);
+                        break;
+                    case "arrow-start":
+                        addArrow(o, value);
+                        break;
+                    case "arrow-end":
+                        addArrow(o, value, 1);
+                        break;
+                    case "clip-rect":
+                        var rect = Str(value).split(separator);
+                        if (rect.length == 4) {
+                            o.clip && o.clip.parentNode.parentNode.removeChild(o.clip.parentNode);
+                            var el = $("clipPath"),
+                                rc = $("rect");
+                            el.id = R.createUUID();
+                            $(rc, {
+                                x: rect[0],
+                                y: rect[1],
+                                width: rect[2],
+                                height: rect[3]
+                            });
+                            el.appendChild(rc);
+                            o.paper.defs.appendChild(el);
+                            $(node, {"clip-path": "url(#" + el.id + ")"});
+                            o.clip = rc;
+                        }
+                        if (!value) {
+                            var path = node.getAttribute("clip-path");
+                            if (path) {
+                                var clip = R._g.doc.getElementById(path.replace(/(^url\(#|\)$)/g, E));
+                                clip && clip.parentNode.removeChild(clip);
+                                $(node, {"clip-path": E});
+                                delete o.clip;
+                            }
+                        }
+                    break;
+                    case "path":
+                        if (o.type == "path") {
+                            $(node, {d: value ? attrs.path = R._pathToAbsolute(value) : "M0,0"});
+                            o._.dirty = 1;
+                            if (o._.arrows) {
+                                "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                                "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                            }
+                        }
+                        break;
+                    case "width":
+                        node.setAttribute(att, value);
+                        o._.dirty = 1;
+                        if (attrs.fx) {
+                            att = "x";
+                            value = attrs.x;
+                        } else {
+                            break;
+                        }
+                    case "x":
+                        if (attrs.fx) {
+                            value = -attrs.x - (attrs.width || 0);
+                        }
+                    case "rx":
+                        if (att == "rx" && o.type == "rect") {
+                            break;
+                        }
+                    case "cx":
+                        node.setAttribute(att, value);
+                        o.pattern && updatePosition(o);
+                        o._.dirty = 1;
+                        break;
+                    case "height":
+                        node.setAttribute(att, value);
+                        o._.dirty = 1;
+                        if (attrs.fy) {
+                            att = "y";
+                            value = attrs.y;
+                        } else {
+                            break;
+                        }
+                    case "y":
+                        if (attrs.fy) {
+                            value = -attrs.y - (attrs.height || 0);
+                        }
+                    case "ry":
+                        if (att == "ry" && o.type == "rect") {
+                            break;
+                        }
+                    case "cy":
+                        node.setAttribute(att, value);
+                        o.pattern && updatePosition(o);
+                        o._.dirty = 1;
+                        break;
+                    case "r":
+                        if (o.type == "rect") {
+                            $(node, {rx: value, ry: value});
+                        } else {
+                            node.setAttribute(att, value);
+                        }
+                        o._.dirty = 1;
+                        break;
+                    case "src":
+                        if (o.type == "image") {
+                            node.setAttributeNS(xlink, "href", value);
+                        }
+                        break;
+                    case "stroke-width":
+                        if (o._.sx != 1 || o._.sy != 1) {
+                            value /= mmax(abs(o._.sx), abs(o._.sy)) || 1;
+                        }
+                        if (o.paper._vbSize) {
+                            value *= o.paper._vbSize;
+                        }
+                        node.setAttribute(att, value);
+                        if (attrs["stroke-dasharray"]) {
+                            addDashes(o, attrs["stroke-dasharray"], params);
+                        }
+                        if (o._.arrows) {
+                            "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                            "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                        }
+                        break;
+                    case "stroke-dasharray":
+                        addDashes(o, value, params);
+                        break;
+                    case "fill":
+                        var isURL = Str(value).match(R._ISURL);
+                        if (isURL) {
+                            el = $("pattern");
+                            var ig = $("image");
+                            el.id = R.createUUID();
+                            $(el, {x: 0, y: 0, patternUnits: "userSpaceOnUse", height: 1, width: 1});
+                            $(ig, {x: 0, y: 0, "xlink:href": isURL[1]});
+                            el.appendChild(ig);
+
+                            (function (el) {
+                                R._preload(isURL[1], function () {
+                                    var w = this.offsetWidth,
+                                        h = this.offsetHeight;
+                                    $(el, {width: w, height: h});
+                                    $(ig, {width: w, height: h});
+                                    o.paper.safari();
+                                });
+                            })(el);
+                            o.paper.defs.appendChild(el);
+                            $(node, {fill: "url(#" + el.id + ")"});
+                            o.pattern = el;
+                            o.pattern && updatePosition(o);
+                            break;
+                        }
+                        var clr = R.getRGB(value);
+                        if (!clr.error) {
+                            delete params.gradient;
+                            delete attrs.gradient;
+                            !R.is(attrs.opacity, "undefined") &&
+                                R.is(params.opacity, "undefined") &&
+                                $(node, {opacity: attrs.opacity});
+                            !R.is(attrs["fill-opacity"], "undefined") &&
+                                R.is(params["fill-opacity"], "undefined") &&
+                                $(node, {"fill-opacity": attrs["fill-opacity"]});
+                        } else if ((o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value)) {
+                            if ("opacity" in attrs || "fill-opacity" in attrs) {
+                                var gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
+                                if (gradient) {
+                                    var stops = gradient.getElementsByTagName("stop");
+                                    $(stops[stops.length - 1], {"stop-opacity": ("opacity" in attrs ? attrs.opacity : 1) * ("fill-opacity" in attrs ? attrs["fill-opacity"] : 1)});
+                                }
+                            }
+                            attrs.gradient = value;
+                            attrs.fill = "none";
+                            break;
+                        }
+                        clr[has]("opacity") && $(node, {"fill-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
+                    case "stroke":
+                        clr = R.getRGB(value);
+                        node.setAttribute(att, clr.hex);
+                        att == "stroke" && clr[has]("opacity") && $(node, {"stroke-opacity": clr.opacity > 1 ? clr.opacity / 100 : clr.opacity});
+                        if (att == "stroke" && o._.arrows) {
+                            "startString" in o._.arrows && addArrow(o, o._.arrows.startString);
+                            "endString" in o._.arrows && addArrow(o, o._.arrows.endString, 1);
+                        }
+                        break;
+                    case "gradient":
+                        (o.type == "circle" || o.type == "ellipse" || Str(value).charAt() != "r") && addGradientFill(o, value);
+                        break;
+                    case "opacity":
+                        if (attrs.gradient && !attrs[has]("stroke-opacity")) {
+                            $(node, {"stroke-opacity": value > 1 ? value / 100 : value});
+                        }
+                        // fall
+                    case "fill-opacity":
+                        if (attrs.gradient) {
+                            gradient = R._g.doc.getElementById(node.getAttribute("fill").replace(/^url\(#|\)$/g, E));
+                            if (gradient) {
+                                stops = gradient.getElementsByTagName("stop");
+                                $(stops[stops.length - 1], {"stop-opacity": value});
+                            }
+                            break;
+                        }
+                    default:
+                        att == "font-size" && (value = toInt(value, 10) + "px");
+                        var cssrule = att.replace(/(\-.)/g, function (w) {
+                            return w.substring(1).toUpperCase();
+                        });
+                        node.style[cssrule] = value;
+                        o._.dirty = 1;
+                        node.setAttribute(att, value);
+                        break;
+                }
+            }
+        }
+
+        tuneText(o, params);
+        node.style.visibility = vis;
+    },
+    leading = 1.2,
+    tuneText = function (el, params) {
+        if (el.type != "text" || !(params[has]("text") || params[has]("font") || params[has]("font-size") || params[has]("x") || params[has]("y"))) {
+            return;
+        }
+        var a = el.attrs,
+            node = el.node,
+            fontSize = node.firstChild ? toInt(R._g.doc.defaultView.getComputedStyle(node.firstChild, E).getPropertyValue("font-size"), 10) : 10;
+
+        if (params[has]("text")) {
+            a.text = params.text;
+            while (node.firstChild) {
+                node.removeChild(node.firstChild);
+            }
+            var texts = Str(params.text).split("\n"),
+                tspans = [],
+                tspan;
+            for (var i = 0, ii = texts.length; i < ii; i++) {
+                tspan = $("tspan");
+                i && $(tspan, {dy: fontSize * leading, x: a.x});
+                tspan.appendChild(R._g.doc.createTextNode(texts[i]));
+                node.appendChild(tspan);
+                tspans[i] = tspan;
+            }
+        } else {
+            tspans = node.getElementsByTagName("tspan");
+            for (i = 0, ii = tspans.length; i < ii; i++) if (i) {
+                $(tspans[i], {dy: fontSize * leading, x: a.x});
+            } else {
+                $(tspans[0], {dy: 0});
+            }
+        }
+        $(node, {x: a.x, y: a.y});
+        el._.dirty = 1;
+        var bb = el._getBBox(),
+            dif = a.y - (bb.y + bb.height / 2);
+        dif && R.is(dif, "finite") && $(tspans[0], {dy: dif});
+    },
+    Element = function (node, svg) {
+        var X = 0,
+            Y = 0;
+        
+        this[0] = this.node = node;
+        
+        node.raphael = true;
+        
+        this.id = R._oid++;
+        node.raphaelid = this.id;
+        this.matrix = R.matrix();
+        this.realPath = null;
+        
+        this.paper = svg;
+        this.attrs = this.attrs || {};
+        this._ = {
+            transform: [],
+            sx: 1,
+            sy: 1,
+            deg: 0,
+            dx: 0,
+            dy: 0,
+            dirty: 1
+        };
+        !svg.bottom && (svg.bottom = this);
+        
+        this.prev = svg.top;
+        svg.top && (svg.top.next = this);
+        svg.top = this;
+        
+        this.next = null;
+    },
+    elproto = R.el;
+
+    Element.prototype = elproto;
+    elproto.constructor = Element;
+
+    R._engine.path = function (pathString, SVG) {
+        var el = $("path");
+        SVG.canvas && SVG.canvas.appendChild(el);
+        var p = new Element(el, SVG);
+        p.type = "path";
+        setFillAndStroke(p, {
+            fill: "none",
+            stroke: "#000",
+            path: pathString
+        });
+        return p;
+    };
+    
+    elproto.rotate = function (deg, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        deg = Str(deg).split(separator);
+        if (deg.length - 1) {
+            cx = toFloat(deg[1]);
+            cy = toFloat(deg[2]);
+        }
+        deg = toFloat(deg[0]);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+            cx = bbox.x + bbox.width / 2;
+            cy = bbox.y + bbox.height / 2;
+        }
+        this.transform(this._.transform.concat([["r", deg, cx, cy]]));
+        return this;
+    };
+    
+    elproto.scale = function (sx, sy, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        sx = Str(sx).split(separator);
+        if (sx.length - 1) {
+            sy = toFloat(sx[1]);
+            cx = toFloat(sx[2]);
+            cy = toFloat(sx[3]);
+        }
+        sx = toFloat(sx[0]);
+        (sy == null) && (sy = sx);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+        }
+        cx = cx == null ? bbox.x + bbox.width / 2 : cx;
+        cy = cy == null ? bbox.y + bbox.height / 2 : cy;
+        this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
+        return this;
+    };
+    
+    elproto.translate = function (dx, dy) {
+        if (this.removed) {
+            return this;
+        }
+        dx = Str(dx).split(separator);
+        if (dx.length - 1) {
+            dy = toFloat(dx[1]);
+        }
+        dx = toFloat(dx[0]) || 0;
+        dy = +dy || 0;
+        this.transform(this._.transform.concat([["t", dx, dy]]));
+        return this;
+    };
+    
+    elproto.transform = function (tstr) {
+        var _ = this._;
+        if (tstr == null) {
+            return _.transform;
+        }
+        R._extractTransform(this, tstr);
+
+        this.clip && $(this.clip, {transform: this.matrix.invert()});
+        this.pattern && updatePosition(this);
+        this.node && $(this.node, {transform: this.matrix});
+    
+        if (_.sx != 1 || _.sy != 1) {
+            var sw = this.attrs[has]("stroke-width") ? this.attrs["stroke-width"] : 1;
+            this.attr({"stroke-width": sw});
+        }
+
+        return this;
+    };
+    
+    elproto.hide = function () {
+        !this.removed && this.paper.safari(this.node.style.display = "none");
+        return this;
+    };
+    
+    elproto.show = function () {
+        !this.removed && this.paper.safari(this.node.style.display = "");
+        return this;
+    };
+    
+    elproto.remove = function () {
+        if (this.removed) {
+            return;
+        }
+        var paper = this.paper;
+        paper.__set__ && paper.__set__.exclude(this);
+        eve.unbind("*.*." + this.id);
+        if (this.gradient) {
+            paper.defs.removeChild(this.gradient);
+        }
+        R._tear(this, paper);
+        if (this.node.parentNode.tagName.toLowerCase() == "a") {
+            this.node.parentNode.parentNode.removeChild(this.node.parentNode);
+        } else {
+            this.node.parentNode.removeChild(this.node);
+        }
+        for (var i in this) {
+            this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
+        }
+        this.removed = true;
+    };
+    elproto._getBBox = function () {
+        if (this.node.style.display == "none") {
+            this.show();
+            var hide = true;
+        }
+        var bbox = {};
+        try {
+            bbox = this.node.getBBox();
+        } catch(e) {
+            // Firefox 3.0.x plays badly here
+        } finally {
+            bbox = bbox || {};
+        }
+        hide && this.hide();
+        return bbox;
+    };
+    
+    elproto.attr = function (name, value) {
+        if (this.removed) {
+            return this;
+        }
+        if (name == null) {
+            var res = {};
+            for (var a in this.attrs) if (this.attrs[has](a)) {
+                res[a] = this.attrs[a];
+            }
+            res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
+            res.transform = this._.transform;
+            return res;
+        }
+        if (value == null && R.is(name, "string")) {
+            if (name == "fill" && this.attrs.fill == "none" && this.attrs.gradient) {
+                return this.attrs.gradient;
+            }
+            if (name == "transform") {
+                return this._.transform;
+            }
+            var names = name.split(separator),
+                out = {};
+            for (var i = 0, ii = names.length; i < ii; i++) {
+                name = names[i];
+                if (name in this.attrs) {
+                    out[name] = this.attrs[name];
+                } else if (R.is(this.paper.customAttributes[name], "function")) {
+                    out[name] = this.paper.customAttributes[name].def;
+                } else {
+                    out[name] = R._availableAttrs[name];
+                }
+            }
+            return ii - 1 ? out : out[names[0]];
+        }
+        if (value == null && R.is(name, "array")) {
+            out = {};
+            for (i = 0, ii = name.length; i < ii; i++) {
+                out[name[i]] = this.attr(name[i]);
+            }
+            return out;
+        }
+        if (value != null) {
+            var params = {};
+            params[name] = value;
+        } else if (name != null && R.is(name, "object")) {
+            params = name;
+        }
+        for (var key in params) {
+            eve("attr." + key + "." + this.id, this, params[key]);
+        }
+        for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
+            var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
+            this.attrs[key] = params[key];
+            for (var subkey in par) if (par[has](subkey)) {
+                params[subkey] = par[subkey];
+            }
+        }
+        setFillAndStroke(this, params);
+        return this;
+    };
+    
+    elproto.toFront = function () {
+        if (this.removed) {
+            return this;
+        }
+        if (this.node.parentNode.tagName.toLowerCase() == "a") {
+            this.node.parentNode.parentNode.appendChild(this.node.parentNode);
+        } else {
+            this.node.parentNode.appendChild(this.node);
+        }
+        var svg = this.paper;
+        svg.top != this && R._tofront(this, svg);
+        return this;
+    };
+    
+    elproto.toBack = function () {
+        if (this.removed) {
+            return this;
+        }
+        var parent = this.node.parentNode;
+        if (parent.tagName.toLowerCase() == "a") {
+            parent.parentNode.insertBefore(this.node.parentNode, this.node.parentNode.parentNode.firstChild); 
+        } else if (parent.firstChild != this.node) {
+            parent.insertBefore(this.node, this.node.parentNode.firstChild);
+        }
+        R._toback(this, this.paper);
+        var svg = this.paper;
+        return this;
+    };
+    
+    elproto.insertAfter = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        var node = element.node || element[element.length - 1].node;
+        if (node.nextSibling) {
+            node.parentNode.insertBefore(this.node, node.nextSibling);
+        } else {
+            node.parentNode.appendChild(this.node);
+        }
+        R._insertafter(this, element, this.paper);
+        return this;
+    };
+    
+    elproto.insertBefore = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        var node = element.node || element[0].node;
+        node.parentNode.insertBefore(this.node, node);
+        R._insertbefore(this, element, this.paper);
+        return this;
+    };
+    elproto.blur = function (size) {
+        // Experimental. No Safari support. Use it on your own risk.
+        var t = this;
+        if (+size !== 0) {
+            var fltr = $("filter"),
+                blur = $("feGaussianBlur");
+            t.attrs.blur = size;
+            fltr.id = R.createUUID();
+            $(blur, {stdDeviation: +size || 1.5});
+            fltr.appendChild(blur);
+            t.paper.defs.appendChild(fltr);
+            t._blur = fltr;
+            $(t.node, {filter: "url(#" + fltr.id + ")"});
+        } else {
+            if (t._blur) {
+                t._blur.parentNode.removeChild(t._blur);
+                delete t._blur;
+                delete t.attrs.blur;
+            }
+            t.node.removeAttribute("filter");
+        }
+    };
+    R._engine.circle = function (svg, x, y, r) {
+        var el = $("circle");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {cx: x, cy: y, r: r, fill: "none", stroke: "#000"};
+        res.type = "circle";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.rect = function (svg, x, y, w, h, r) {
+        var el = $("rect");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {x: x, y: y, width: w, height: h, r: r || 0, rx: r || 0, ry: r || 0, fill: "none", stroke: "#000"};
+        res.type = "rect";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.ellipse = function (svg, x, y, rx, ry) {
+        var el = $("ellipse");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {cx: x, cy: y, rx: rx, ry: ry, fill: "none", stroke: "#000"};
+        res.type = "ellipse";
+        $(el, res.attrs);
+        return res;
+    };
+    R._engine.image = function (svg, src, x, y, w, h) {
+        var el = $("image");
+        $(el, {x: x, y: y, width: w, height: h, preserveAspectRatio: "none"});
+        el.setAttributeNS(xlink, "href", src);
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {x: x, y: y, width: w, height: h, src: src};
+        res.type = "image";
+        return res;
+    };
+    R._engine.text = function (svg, x, y, text) {
+        var el = $("text");
+        svg.canvas && svg.canvas.appendChild(el);
+        var res = new Element(el, svg);
+        res.attrs = {
+            x: x,
+            y: y,
+            "text-anchor": "middle",
+            text: text,
+            font: R._availableAttrs.font,
+            stroke: "none",
+            fill: "#000"
+        };
+        res.type = "text";
+        setFillAndStroke(res, res.attrs);
+        return res;
+    };
+    R._engine.setSize = function (width, height) {
+        this.width = width || this.width;
+        this.height = height || this.height;
+        this.canvas.setAttribute("width", this.width);
+        this.canvas.setAttribute("height", this.height);
+        if (this._viewBox) {
+            this.setViewBox.apply(this, this._viewBox);
+        }
+        return this;
+    };
+    R._engine.create = function () {
+        var con = R._getContainer.apply(0, arguments),
+            container = con && con.container,
+            x = con.x,
+            y = con.y,
+            width = con.width,
+            height = con.height;
+        if (!container) {
+            throw new Error("SVG container not found.");
+        }
+        var cnvs = $("svg"),
+            css = "overflow:hidden;",
+            isFloating;
+        x = x || 0;
+        y = y || 0;
+        width = width || 512;
+        height = height || 342;
+        $(cnvs, {
+            height: height,
+            version: 1.1,
+            width: width,
+            xmlns: "http://www.w3.org/2000/svg"
+        });
+        if (container == 1) {
+            cnvs.style.cssText = css + "position:absolute;left:" + x + "px;top:" + y + "px";
+            R._g.doc.body.appendChild(cnvs);
+            isFloating = 1;
+        } else {
+            cnvs.style.cssText = css + "position:relative";
+            if (container.firstChild) {
+                container.insertBefore(cnvs, container.firstChild);
+            } else {
+                container.appendChild(cnvs);
+            }
+        }
+        container = new R._Paper;
+        container.width = width;
+        container.height = height;
+        container.canvas = cnvs;
+        container.clear();
+        container._left = container._top = 0;
+        isFloating && (container.renderfix = function () {});
+        container.renderfix();
+        return container;
+    };
+    R._engine.setViewBox = function (x, y, w, h, fit) {
+        eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
+        var size = mmax(w / this.width, h / this.height),
+            top = this.top,
+            aspectRatio = fit ? "meet" : "xMinYMin",
+            vb,
+            sw;
+        if (x == null) {
+            if (this._vbSize) {
+                size = 1;
+            }
+            delete this._vbSize;
+            vb = "0 0 " + this.width + S + this.height;
+        } else {
+            this._vbSize = size;
+            vb = x + S + y + S + w + S + h;
+        }
+        $(this.canvas, {
+            viewBox: vb,
+            preserveAspectRatio: aspectRatio
+        });
+        while (size && top) {
+            sw = "stroke-width" in top.attrs ? top.attrs["stroke-width"] : 1;
+            top.attr({"stroke-width": sw});
+            top._.dirty = 1;
+            top._.dirtyT = 1;
+            top = top.prev;
+        }
+        this._viewBox = [x, y, w, h, !!fit];
+        return this;
+    };
+    
+    R.prototype.renderfix = function () {
+        var cnvs = this.canvas,
+            s = cnvs.style,
+            pos;
+        try {
+            pos = cnvs.getScreenCTM() || cnvs.createSVGMatrix();
+        } catch (e) {
+            pos = cnvs.createSVGMatrix();
+        }
+        var left = -pos.e % 1,
+            top = -pos.f % 1;
+        if (left || top) {
+            if (left) {
+                this._left = (this._left + left) % 1;
+                s.left = this._left + "px";
+            }
+            if (top) {
+                this._top = (this._top + top) % 1;
+                s.top = this._top + "px";
+            }
+        }
+    };
+    
+    R.prototype.clear = function () {
+        R.eve("clear", this);
+        var c = this.canvas;
+        while (c.firstChild) {
+            c.removeChild(c.firstChild);
+        }
+        this.bottom = this.top = null;
+        (this.desc = $("desc")).appendChild(R._g.doc.createTextNode("Created with Rapha\xebl " + R.version));
+        c.appendChild(this.desc);
+        c.appendChild(this.defs = $("defs"));
+    };
+    
+    R.prototype.remove = function () {
+        eve("remove", this);
+        this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas);
+        for (var i in this) {
+            this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
+        }
+    };
+    var setproto = R.st;
+    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname].apply(el, arg);
+                });
+            };
+        })(method);
+    }
+}(window.Raphael);
+
+// ┌─────────────────────────────────────────────────────────────────────┐ \\
+// │ Raphaël - JavaScript Vector Library                                 │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ VML Module                                                          │ \\
+// ├─────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com)   │ \\
+// │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com)             │ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\
+// └─────────────────────────────────────────────────────────────────────┘ \\
+window.Raphael.vml && function (R) {
+    var has = "hasOwnProperty",
+        Str = String,
+        toFloat = parseFloat,
+        math = Math,
+        round = math.round,
+        mmax = math.max,
+        mmin = math.min,
+        abs = math.abs,
+        fillString = "fill",
+        separator = /[, ]+/,
+        eve = R.eve,
+        ms = " progid:DXImageTransform.Microsoft",
+        S = " ",
+        E = "",
+        map = {M: "m", L: "l", C: "c", Z: "x", m: "t", l: "r", c: "v", z: "x"},
+        bites = /([clmz]),?([^clmz]*)/gi,
+        blurregexp = / progid:\S+Blur\([^\)]+\)/g,
+        val = /-?[^,\s-]+/g,
+        cssDot = "position:absolute;left:0;top:0;width:1px;height:1px",
+        zoom = 21600,
+        pathTypes = {path: 1, rect: 1, image: 1},
+        ovalTypes = {circle: 1, ellipse: 1},
+        path2vml = function (path) {
+            var total =  /[ahqstv]/ig,
+                command = R._pathToAbsolute;
+            Str(path).match(total) && (command = R._path2curve);
+            total = /[clmz]/g;
+            if (command == R._pathToAbsolute && !Str(path).match(total)) {
+                var res = Str(path).replace(bites, function (all, command, args) {
+                    var vals = [],
+                        isMove = command.toLowerCase() == "m",
+                        res = map[command];
+                    args.replace(val, function (value) {
+                        if (isMove && vals.length == 2) {
+                            res += vals + map[command == "m" ? "l" : "L"];
+                            vals = [];
+                        }
+                        vals.push(round(value * zoom));
+                    });
+                    return res + vals;
+                });
+                return res;
+            }
+            var pa = command(path), p, r;
+            res = [];
+            for (var i = 0, ii = pa.length; i < ii; i++) {
+                p = pa[i];
+                r = pa[i][0].toLowerCase();
+                r == "z" && (r = "x");
+                for (var j = 1, jj = p.length; j < jj; j++) {
+                    r += round(p[j] * zoom) + (j != jj - 1 ? "," : E);
+                }
+                res.push(r);
+            }
+            return res.join(S);
+        },
+        compensation = function (deg, dx, dy) {
+            var m = R.matrix();
+            m.rotate(-deg, .5, .5);
+            return {
+                dx: m.x(dx, dy),
+                dy: m.y(dx, dy)
+            };
+        },
+        setCoords = function (p, sx, sy, dx, dy, deg) {
+            var _ = p._,
+                m = p.matrix,
+                fillpos = _.fillpos,
+                o = p.node,
+                s = o.style,
+                y = 1,
+                flip = "",
+                dxdy,
+                kx = zoom / sx,
+                ky = zoom / sy;
+            s.visibility = "hidden";
+            if (!sx || !sy) {
+                return;
+            }
+            o.coordsize = abs(kx) + S + abs(ky);
+            s.rotation = deg * (sx * sy < 0 ? -1 : 1);
+            if (deg) {
+                var c = compensation(deg, dx, dy);
+                dx = c.dx;
+                dy = c.dy;
+            }
+            sx < 0 && (flip += "x");
+            sy < 0 && (flip += " y") && (y = -1);
+            s.flip = flip;
+            o.coordorigin = (dx * -kx) + S + (dy * -ky);
+            if (fillpos || _.fillsize) {
+                var fill = o.getElementsByTagName(fillString);
+                fill = fill && fill[0];
+                o.removeChild(fill);
+                if (fillpos) {
+                    c = compensation(deg, m.x(fillpos[0], fillpos[1]), m.y(fillpos[0], fillpos[1]));
+                    fill.position = c.dx * y + S + c.dy * y;
+                }
+                if (_.fillsize) {
+                    fill.size = _.fillsize[0] * abs(sx) + S + _.fillsize[1] * abs(sy);
+                }
+                o.appendChild(fill);
+            }
+            s.visibility = "visible";
+        };
+    R.toString = function () {
+        return  "Your browser doesn\u2019t support SVG. Falling down to VML.\nYou are running Rapha\xebl " + this.version;
+    };
+    var addArrow = function (o, value, isEnd) {
+        var values = Str(value).toLowerCase().split("-"),
+            se = isEnd ? "end" : "start",
+            i = values.length,
+            type = "classic",
+            w = "medium",
+            h = "medium";
+        while (i--) {
+            switch (values[i]) {
+                case "block":
+                case "classic":
+                case "oval":
+                case "diamond":
+                case "open":
+                case "none":
+                    type = values[i];
+                    break;
+                case "wide":
+                case "narrow": h = values[i]; break;
+                case "long":
+                case "short": w = values[i]; break;
+            }
+        }
+        var stroke = o.node.getElementsByTagName("stroke")[0];
+        stroke[se + "arrow"] = type;
+        stroke[se + "arrowlength"] = w;
+        stroke[se + "arrowwidth"] = h;
+    },
+    setFillAndStroke = function (o, params) {
+        // o.paper.canvas.style.display = "none";
+        o.attrs = o.attrs || {};
+        var node = o.node,
+            a = o.attrs,
+            s = node.style,
+            xy,
+            newpath = pathTypes[o.type] && (params.x != a.x || params.y != a.y || params.width != a.width || params.height != a.height || params.cx != a.cx || params.cy != a.cy || params.rx != a.rx || params.ry != a.ry || params.r != a.r),
+            isOval = ovalTypes[o.type] && (a.cx != params.cx || a.cy != params.cy || a.r != params.r || a.rx != params.rx || a.ry != params.ry),
+            res = o;
+
+
+        for (var par in params) if (params[has](par)) {
+            a[par] = params[par];
+        }
+        if (newpath) {
+            a.path = R._getPath[o.type](o);
+            o._.dirty = 1;
+        }
+        params.href && (node.href = params.href);
+        params.title && (node.title = params.title);
+        params.target && (node.target = params.target);
+        params.cursor && (s.cursor = params.cursor);
+        "blur" in params && o.blur(params.blur);
+        if (params.path && o.type == "path" || newpath) {
+            node.path = path2vml(~Str(a.path).toLowerCase().indexOf("r") ? R._pathToAbsolute(a.path) : a.path);
+            if (o.type == "image") {
+                o._.fillpos = [a.x, a.y];
+                o._.fillsize = [a.width, a.height];
+                setCoords(o, 1, 1, 0, 0, 0);
+            }
+        }
+        "transform" in params && o.transform(params.transform);
+        if (isOval) {
+            var cx = +a.cx,
+                cy = +a.cy,
+                rx = +a.rx || +a.r || 0,
+                ry = +a.ry || +a.r || 0;
+            node.path = R.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x", round((cx - rx) * zoom), round((cy - ry) * zoom), round((cx + rx) * zoom), round((cy + ry) * zoom), round(cx * zoom));
+        }
+        if ("clip-rect" in params) {
+            var rect = Str(params["clip-rect"]).split(separator);
+            if (rect.length == 4) {
+                rect[2] = +rect[2] + (+rect[0]);
+                rect[3] = +rect[3] + (+rect[1]);
+                var div = node.clipRect || R._g.doc.createElement("div"),
+                    dstyle = div.style;
+                dstyle.clip = R.format("rect({1}px {2}px {3}px {0}px)", rect);
+                if (!node.clipRect) {
+                    dstyle.position = "absolute";
+                    dstyle.top = 0;
+                    dstyle.left = 0;
+                    dstyle.width = o.paper.width + "px";
+                    dstyle.height = o.paper.height + "px";
+                    node.parentNode.insertBefore(div, node);
+                    div.appendChild(node);
+                    node.clipRect = div;
+                }
+            }
+            if (!params["clip-rect"]) {
+                node.clipRect && (node.clipRect.style.clip = "auto");
+            }
+        }
+        if (o.textpath) {
+            var textpathStyle = o.textpath.style;
+            params.font && (textpathStyle.font = params.font);
+            params["font-family"] && (textpathStyle.fontFamily = '"' + params["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g, E) + '"');
+            params["font-size"] && (textpathStyle.fontSize = params["font-size"]);
+            params["font-weight"] && (textpathStyle.fontWeight = params["font-weight"]);
+            params["font-style"] && (textpathStyle.fontStyle = params["font-style"]);
+        }
+        if ("arrow-start" in params) {
+            addArrow(res, params["arrow-start"]);
+        }
+        if ("arrow-end" in params) {
+            addArrow(res, params["arrow-end"], 1);
+        }
+        if (params.opacity != null || 
+            params["stroke-width"] != null ||
+            params.fill != null ||
+            params.src != null ||
+            params.stroke != null ||
+            params["stroke-width"] != null ||
+            params["stroke-opacity"] != null ||
+            params["fill-opacity"] != null ||
+            params["stroke-dasharray"] != null ||
+            params["stroke-miterlimit"] != null ||
+            params["stroke-linejoin"] != null ||
+            params["stroke-linecap"] != null) {
+            var fill = node.getElementsByTagName(fillString),
+                newfill = false;
+            fill = fill && fill[0];
+            !fill && (newfill = fill = createNode(fillString));
+            if (o.type == "image" && params.src) {
+                fill.src = params.src;
+            }
+            params.fill && (fill.on = true);
+            if (fill.on == null || params.fill == "none" || params.fill === null) {
+                fill.on = false;
+            }
+            if (fill.on && params.fill) {
+                var isURL = Str(params.fill).match(R._ISURL);
+                if (isURL) {
+                    fill.parentNode == node && node.removeChild(fill);
+                    fill.rotate = true;
+                    fill.src = isURL[1];
+                    fill.type = "tile";
+                    var bbox = o.getBBox(1);
+                    fill.position = bbox.x + S + bbox.y;
+                    o._.fillpos = [bbox.x, bbox.y];
+
+                    R._preload(isURL[1], function () {
+                        o._.fillsize = [this.offsetWidth, this.offsetHeight];
+                    });
+                } else {
+                    fill.color = R.getRGB(params.fill).hex;
+                    fill.src = E;
+                    fill.type = "solid";
+                    if (R.getRGB(params.fill).error && (res.type in {circle: 1, ellipse: 1} || Str(params.fill).charAt() != "r") && addGradientFill(res, params.fill, fill)) {
+                        a.fill = "none";
+                        a.gradient = params.fill;
+                        fill.rotate = false;
+                    }
+                }
+            }
+            if ("fill-opacity" in params || "opacity" in params) {
+                var opacity = ((+a["fill-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+R.getRGB(params.fill).o + 1 || 2) - 1);
+                opacity = mmin(mmax(opacity, 0), 1);
+                fill.opacity = opacity;
+                if (fill.src) {
+                    fill.color = "none";
+                }
+            }
+            node.appendChild(fill);
+            var stroke = (node.getElementsByTagName("stroke") && node.getElementsByTagName("stroke")[0]),
+            newstroke = false;
+            !stroke && (newstroke = stroke = createNode("stroke"));
+            if ((params.stroke && params.stroke != "none") ||
+                params["stroke-width"] ||
+                params["stroke-opacity"] != null ||
+                params["stroke-dasharray"] ||
+                params["stroke-miterlimit"] ||
+                params["stroke-linejoin"] ||
+                params["stroke-linecap"]) {
+                stroke.on = true;
+            }
+            (params.stroke == "none" || params.stroke === null || stroke.on == null || params.stroke == 0 || params["stroke-width"] == 0) && (stroke.on = false);
+            var strokeColor = R.getRGB(params.stroke);
+            stroke.on && params.stroke && (stroke.color = strokeColor.hex);
+            opacity = ((+a["stroke-opacity"] + 1 || 2) - 1) * ((+a.opacity + 1 || 2) - 1) * ((+strokeColor.o + 1 || 2) - 1);
+            var width = (toFloat(params["stroke-width"]) || 1) * .75;
+            opacity = mmin(mmax(opacity, 0), 1);
+            params["stroke-width"] == null && (width = a["stroke-width"]);
+            params["stroke-width"] && (stroke.weight = width);
+            width && width < 1 && (opacity *= width) && (stroke.weight = 1);
+            stroke.opacity = opacity;
+        
+            params["stroke-linejoin"] && (stroke.joinstyle = params["stroke-linejoin"] || "miter");
+            stroke.miterlimit = params["stroke-miterlimit"] || 8;
+            params["stroke-linecap"] && (stroke.endcap = params["stroke-linecap"] == "butt" ? "flat" : params["stroke-linecap"] == "square" ? "square" : "round");
+            if (params["stroke-dasharray"]) {
+                var dasharray = {
+                    "-": "shortdash",
+                    ".": "shortdot",
+                    "-.": "shortdashdot",
+                    "-..": "shortdashdotdot",
+                    ". ": "dot",
+                    "- ": "dash",
+                    "--": "longdash",
+                    "- .": "dashdot",
+                    "--.": "longdashdot",
+                    "--..": "longdashdotdot"
+                };
+                stroke.dashstyle = dasharray[has](params["stroke-dasharray"]) ? dasharray[params["stroke-dasharray"]] : E;
+            }
+            newstroke && node.appendChild(stroke);
+        }
+        if (res.type == "text") {
+            res.paper.canvas.style.display = E;
+            var span = res.paper.span,
+                m = 100,
+                fontSize = a.font && a.font.match(/\d+(?:\.\d*)?(?=px)/);
+            s = span.style;
+            a.font && (s.font = a.font);
+            a["font-family"] && (s.fontFamily = a["font-family"]);
+            a["font-weight"] && (s.fontWeight = a["font-weight"]);
+            a["font-style"] && (s.fontStyle = a["font-style"]);
+            fontSize = toFloat(a["font-size"] || fontSize && fontSize[0]) || 10;
+            s.fontSize = fontSize * m + "px";
+            res.textpath.string && (span.innerHTML = Str(res.textpath.string).replace(/</g, "&#60;").replace(/&/g, "&#38;").replace(/\n/g, "<br>"));
+            var brect = span.getBoundingClientRect();
+            res.W = a.w = (brect.right - brect.left) / m;
+            res.H = a.h = (brect.bottom - brect.top) / m;
+            // res.paper.canvas.style.display = "none";
+            res.X = a.x;
+            res.Y = a.y + res.H / 2;
+
+            ("x" in params || "y" in params) && (res.path.v = R.format("m{0},{1}l{2},{1}", round(a.x * zoom), round(a.y * zoom), round(a.x * zoom) + 1));
+            var dirtyattrs = ["x", "y", "text", "font", "font-family", "font-weight", "font-style", "font-size"];
+            for (var d = 0, dd = dirtyattrs.length; d < dd; d++) if (dirtyattrs[d] in params) {
+                res._.dirty = 1;
+                break;
+            }
+        
+            // text-anchor emulation
+            switch (a["text-anchor"]) {
+                case "start":
+                    res.textpath.style["v-text-align"] = "left";
+                    res.bbx = res.W / 2;
+                break;
+                case "end":
+                    res.textpath.style["v-text-align"] = "right";
+                    res.bbx = -res.W / 2;
+                break;
+                default:
+                    res.textpath.style["v-text-align"] = "center";
+                    res.bbx = 0;
+                break;
+            }
+            res.textpath.style["v-text-kern"] = true;
+        }
+        // res.paper.canvas.style.display = E;
+    },
+    addGradientFill = function (o, gradient, fill) {
+        o.attrs = o.attrs || {};
+        var attrs = o.attrs,
+            pow = Math.pow,
+            opacity,
+            oindex,
+            type = "linear",
+            fxfy = ".5 .5";
+        o.attrs.gradient = gradient;
+        gradient = Str(gradient).replace(R._radial_gradient, function (all, fx, fy) {
+            type = "radial";
+            if (fx && fy) {
+                fx = toFloat(fx);
+                fy = toFloat(fy);
+                pow(fx - .5, 2) + pow(fy - .5, 2) > .25 && (fy = math.sqrt(.25 - pow(fx - .5, 2)) * ((fy > .5) * 2 - 1) + .5);
+                fxfy = fx + S + fy;
+            }
+            return E;
+        });
+        gradient = gradient.split(/\s*\-\s*/);
+        if (type == "linear") {
+            var angle = gradient.shift();
+            angle = -toFloat(angle);
+            if (isNaN(angle)) {
+                return null;
+            }
+        }
+        var dots = R._parseDots(gradient);
+        if (!dots) {
+            return null;
+        }
+        o = o.shape || o.node;
+        if (dots.length) {
+            o.removeChild(fill);
+            fill.on = true;
+            fill.method = "none";
+            fill.color = dots[0].color;
+            fill.color2 = dots[dots.length - 1].color;
+            var clrs = [];
+            for (var i = 0, ii = dots.length; i < ii; i++) {
+                dots[i].offset && clrs.push(dots[i].offset + S + dots[i].color);
+            }
+            fill.colors = clrs.length ? clrs.join() : "0% " + fill.color;
+            if (type == "radial") {
+                fill.type = "gradientTitle";
+                fill.focus = "100%";
+                fill.focussize = "0 0";
+                fill.focusposition = fxfy;
+                fill.angle = 0;
+            } else {
+                // fill.rotate= true;
+                fill.type = "gradient";
+                fill.angle = (270 - angle) % 360;
+            }
+            o.appendChild(fill);
+        }
+        return 1;
+    },
+    Element = function (node, vml) {
+        this[0] = this.node = node;
+        node.raphael = true;
+        this.id = R._oid++;
+        node.raphaelid = this.id;
+        this.X = 0;
+        this.Y = 0;
+        this.attrs = {};
+        this.paper = vml;
+        this.matrix = R.matrix();
+        this._ = {
+            transform: [],
+            sx: 1,
+            sy: 1,
+            dx: 0,
+            dy: 0,
+            deg: 0,
+            dirty: 1,
+            dirtyT: 1
+        };
+        !vml.bottom && (vml.bottom = this);
+        this.prev = vml.top;
+        vml.top && (vml.top.next = this);
+        vml.top = this;
+        this.next = null;
+    };
+    var elproto = R.el;
+
+    Element.prototype = elproto;
+    elproto.constructor = Element;
+    elproto.transform = function (tstr) {
+        if (tstr == null) {
+            return this._.transform;
+        }
+        var vbs = this.paper._viewBoxShift,
+            vbt = vbs ? "s" + [vbs.scale, vbs.scale] + "-1-1t" + [vbs.dx, vbs.dy] : E,
+            oldt;
+        if (vbs) {
+            oldt = tstr = Str(tstr).replace(/\.{3}|\u2026/g, this._.transform || E);
+        }
+        R._extractTransform(this, vbt + tstr);
+        var matrix = this.matrix.clone(),
+            skew = this.skew,
+            o = this.node,
+            split,
+            isGrad = ~Str(this.attrs.fill).indexOf("-"),
+            isPatt = !Str(this.attrs.fill).indexOf("url(");
+        matrix.translate(-.5, -.5);
+        if (isPatt || isGrad || this.type == "image") {
+            skew.matrix = "1 0 0 1";
+            skew.offset = "0 0";
+            split = matrix.split();
+            if ((isGrad && split.noRotation) || !split.isSimple) {
+                o.style.filter = matrix.toFilter();
+                var bb = this.getBBox(),
+                    bbt = this.getBBox(1),
+                    dx = bb.x - bbt.x,
+                    dy = bb.y - bbt.y;
+                o.coordorigin = (dx * -zoom) + S + (dy * -zoom);
+                setCoords(this, 1, 1, dx, dy, 0);
+            } else {
+                o.style.filter = E;
+                setCoords(this, split.scalex, split.scaley, split.dx, split.dy, split.rotate);
+            }
+        } else {
+            o.style.filter = E;
+            skew.matrix = Str(matrix);
+            skew.offset = matrix.offset();
+        }
+        oldt && (this._.transform = oldt);
+        return this;
+    };
+    elproto.rotate = function (deg, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        if (deg == null) {
+            return;
+        }
+        deg = Str(deg).split(separator);
+        if (deg.length - 1) {
+            cx = toFloat(deg[1]);
+            cy = toFloat(deg[2]);
+        }
+        deg = toFloat(deg[0]);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+            cx = bbox.x + bbox.width / 2;
+            cy = bbox.y + bbox.height / 2;
+        }
+        this._.dirtyT = 1;
+        this.transform(this._.transform.concat([["r", deg, cx, cy]]));
+        return this;
+    };
+    elproto.translate = function (dx, dy) {
+        if (this.removed) {
+            return this;
+        }
+        dx = Str(dx).split(separator);
+        if (dx.length - 1) {
+            dy = toFloat(dx[1]);
+        }
+        dx = toFloat(dx[0]) || 0;
+        dy = +dy || 0;
+        if (this._.bbox) {
+            this._.bbox.x += dx;
+            this._.bbox.y += dy;
+        }
+        this.transform(this._.transform.concat([["t", dx, dy]]));
+        return this;
+    };
+    elproto.scale = function (sx, sy, cx, cy) {
+        if (this.removed) {
+            return this;
+        }
+        sx = Str(sx).split(separator);
+        if (sx.length - 1) {
+            sy = toFloat(sx[1]);
+            cx = toFloat(sx[2]);
+            cy = toFloat(sx[3]);
+            isNaN(cx) && (cx = null);
+            isNaN(cy) && (cy = null);
+        }
+        sx = toFloat(sx[0]);
+        (sy == null) && (sy = sx);
+        (cy == null) && (cx = cy);
+        if (cx == null || cy == null) {
+            var bbox = this.getBBox(1);
+        }
+        cx = cx == null ? bbox.x + bbox.width / 2 : cx;
+        cy = cy == null ? bbox.y + bbox.height / 2 : cy;
+    
+        this.transform(this._.transform.concat([["s", sx, sy, cx, cy]]));
+        this._.dirtyT = 1;
+        return this;
+    };
+    elproto.hide = function () {
+        !this.removed && (this.node.style.display = "none");
+        return this;
+    };
+    elproto.show = function () {
+        !this.removed && (this.node.style.display = E);
+        return this;
+    };
+    elproto._getBBox = function () {
+        if (this.removed) {
+            return {};
+        }
+        return {
+            x: this.X + (this.bbx || 0) - this.W / 2,
+            y: this.Y - this.H,
+            width: this.W,
+            height: this.H
+        };
+    };
+    elproto.remove = function () {
+        if (this.removed) {
+            return;
+        }
+        this.paper.__set__ && this.paper.__set__.exclude(this);
+        R.eve.unbind("*.*." + this.id);
+        R._tear(this, this.paper);
+        this.node.parentNode.removeChild(this.node);
+        this.shape && this.shape.parentNode.removeChild(this.shape);
+        for (var i in this) {
+            this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
+        }
+        this.removed = true;
+    };
+    elproto.attr = function (name, value) {
+        if (this.removed) {
+            return this;
+        }
+        if (name == null) {
+            var res = {};
+            for (var a in this.attrs) if (this.attrs[has](a)) {
+                res[a] = this.attrs[a];
+            }
+            res.gradient && res.fill == "none" && (res.fill = res.gradient) && delete res.gradient;
+            res.transform = this._.transform;
+            return res;
+        }
+        if (value == null && R.is(name, "string")) {
+            if (name == fillString && this.attrs.fill == "none" && this.attrs.gradient) {
+                return this.attrs.gradient;
+            }
+            var names = name.split(separator),
+                out = {};
+            for (var i = 0, ii = names.length; i < ii; i++) {
+                name = names[i];
+                if (name in this.attrs) {
+                    out[name] = this.attrs[name];
+                } else if (R.is(this.paper.customAttributes[name], "function")) {
+                    out[name] = this.paper.customAttributes[name].def;
+                } else {
+                    out[name] = R._availableAttrs[name];
+                }
+            }
+            return ii - 1 ? out : out[names[0]];
+        }
+        if (this.attrs && value == null && R.is(name, "array")) {
+            out = {};
+            for (i = 0, ii = name.length; i < ii; i++) {
+                out[name[i]] = this.attr(name[i]);
+            }
+            return out;
+        }
+        var params;
+        if (value != null) {
+            params = {};
+            params[name] = value;
+        }
+        value == null && R.is(name, "object") && (params = name);
+        for (var key in params) {
+            eve("attr." + key + "." + this.id, this, params[key]);
+        }
+        if (params) {
+            for (key in this.paper.customAttributes) if (this.paper.customAttributes[has](key) && params[has](key) && R.is(this.paper.customAttributes[key], "function")) {
+                var par = this.paper.customAttributes[key].apply(this, [].concat(params[key]));
+                this.attrs[key] = params[key];
+                for (var subkey in par) if (par[has](subkey)) {
+                    params[subkey] = par[subkey];
+                }
+            }
+            // this.paper.canvas.style.display = "none";
+            if (params.text && this.type == "text") {
+                this.textpath.string = params.text;
+            }
+            setFillAndStroke(this, params);
+            // this.paper.canvas.style.display = E;
+        }
+        return this;
+    };
+    elproto.toFront = function () {
+        !this.removed && this.node.parentNode.appendChild(this.node);
+        this.paper && this.paper.top != this && R._tofront(this, this.paper);
+        return this;
+    };
+    elproto.toBack = function () {
+        if (this.removed) {
+            return this;
+        }
+        if (this.node.parentNode.firstChild != this.node) {
+            this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild);
+            R._toback(this, this.paper);
+        }
+        return this;
+    };
+    elproto.insertAfter = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        if (element.constructor == R.st.constructor) {
+            element = element[element.length - 1];
+        }
+        if (element.node.nextSibling) {
+            element.node.parentNode.insertBefore(this.node, element.node.nextSibling);
+        } else {
+            element.node.parentNode.appendChild(this.node);
+        }
+        R._insertafter(this, element, this.paper);
+        return this;
+    };
+    elproto.insertBefore = function (element) {
+        if (this.removed) {
+            return this;
+        }
+        if (element.constructor == R.st.constructor) {
+            element = element[0];
+        }
+        element.node.parentNode.insertBefore(this.node, element.node);
+        R._insertbefore(this, element, this.paper);
+        return this;
+    };
+    elproto.blur = function (size) {
+        var s = this.node.runtimeStyle,
+            f = s.filter;
+        f = f.replace(blurregexp, E);
+        if (+size !== 0) {
+            this.attrs.blur = size;
+            s.filter = f + S + ms + ".Blur(pixelradius=" + (+size || 1.5) + ")";
+            s.margin = R.format("-{0}px 0 0 -{0}px", round(+size || 1.5));
+        } else {
+            s.filter = f;
+            s.margin = 0;
+            delete this.attrs.blur;
+        }
+    };
+
+    R._engine.path = function (pathString, vml) {
+        var el = createNode("shape");
+        el.style.cssText = cssDot;
+        el.coordsize = zoom + S + zoom;
+        el.coordorigin = vml.coordorigin;
+        var p = new Element(el, vml),
+            attr = {fill: "none", stroke: "#000"};
+        pathString && (attr.path = pathString);
+        p.type = "path";
+        p.path = [];
+        p.Path = E;
+        setFillAndStroke(p, attr);
+        vml.canvas.appendChild(el);
+        var skew = createNode("skew");
+        skew.on = true;
+        el.appendChild(skew);
+        p.skew = skew;
+        p.transform(E);
+        return p;
+    };
+    R._engine.rect = function (vml, x, y, w, h, r) {
+        var path = R._rectPath(x, y, w, h, r),
+            res = vml.path(path),
+            a = res.attrs;
+        res.X = a.x = x;
+        res.Y = a.y = y;
+        res.W = a.width = w;
+        res.H = a.height = h;
+        a.r = r;
+        a.path = path;
+        res.type = "rect";
+        return res;
+    };
+    R._engine.ellipse = function (vml, x, y, rx, ry) {
+        var res = vml.path(),
+            a = res.attrs;
+        res.X = x - rx;
+        res.Y = y - ry;
+        res.W = rx * 2;
+        res.H = ry * 2;
+        res.type = "ellipse";
+        setFillAndStroke(res, {
+            cx: x,
+            cy: y,
+            rx: rx,
+            ry: ry
+        });
+        return res;
+    };
+    R._engine.circle = function (vml, x, y, r) {
+        var res = vml.path(),
+            a = res.attrs;
+        res.X = x - r;
+        res.Y = y - r;
+        res.W = res.H = r * 2;
+        res.type = "circle";
+        setFillAndStroke(res, {
+            cx: x,
+            cy: y,
+            r: r
+        });
+        return res;
+    };
+    R._engine.image = function (vml, src, x, y, w, h) {
+        var path = R._rectPath(x, y, w, h),
+            res = vml.path(path).attr({stroke: "none"}),
+            a = res.attrs,
+            node = res.node,
+            fill = node.getElementsByTagName(fillString)[0];
+        a.src = src;
+        res.X = a.x = x;
+        res.Y = a.y = y;
+        res.W = a.width = w;
+        res.H = a.height = h;
+        a.path = path;
+        res.type = "image";
+        fill.parentNode == node && node.removeChild(fill);
+        fill.rotate = true;
+        fill.src = src;
+        fill.type = "tile";
+        res._.fillpos = [x, y];
+        res._.fillsize = [w, h];
+        node.appendChild(fill);
+        setCoords(res, 1, 1, 0, 0, 0);
+        return res;
+    };
+    R._engine.text = function (vml, x, y, text) {
+        var el = createNode("shape"),
+            path = createNode("path"),
+            o = createNode("textpath");
+        x = x || 0;
+        y = y || 0;
+        text = text || "";
+        path.v = R.format("m{0},{1}l{2},{1}", round(x * zoom), round(y * zoom), round(x * zoom) + 1);
+        path.textpathok = true;
+        o.string = Str(text);
+        o.on = true;
+        el.style.cssText = cssDot;
+        el.coordsize = zoom + S + zoom;
+        el.coordorigin = "0 0";
+        var p = new Element(el, vml),
+            attr = {
+                fill: "#000",
+                stroke: "none",
+                font: R._availableAttrs.font,
+                text: text
+            };
+        p.shape = el;
+        p.path = path;
+        p.textpath = o;
+        p.type = "text";
+        p.attrs.text = Str(text);
+        p.attrs.x = x;
+        p.attrs.y = y;
+        p.attrs.w = 1;
+        p.attrs.h = 1;
+        setFillAndStroke(p, attr);
+        el.appendChild(o);
+        el.appendChild(path);
+        vml.canvas.appendChild(el);
+        var skew = createNode("skew");
+        skew.on = true;
+        el.appendChild(skew);
+        p.skew = skew;
+        p.transform(E);
+        return p;
+    };
+    R._engine.setSize = function (width, height) {
+        var cs = this.canvas.style;
+        this.width = width;
+        this.height = height;
+        width == +width && (width += "px");
+        height == +height && (height += "px");
+        cs.width = width;
+        cs.height = height;
+        cs.clip = "rect(0 " + width + " " + height + " 0)";
+        if (this._viewBox) {
+            R._engine.setViewBox.apply(this, this._viewBox);
+        }
+        return this;
+    };
+    R._engine.setViewBox = function (x, y, w, h, fit) {
+        R.eve("setViewBox", this, this._viewBox, [x, y, w, h, fit]);
+        var width = this.width,
+            height = this.height,
+            size = 1 / mmax(w / width, h / height),
+            H, W;
+        if (fit) {
+            H = height / h;
+            W = width / w;
+            if (w * H < width) {
+                x -= (width - w * H) / 2 / H;
+            }
+            if (h * W < height) {
+                y -= (height - h * W) / 2 / W;
+            }
+        }
+        this._viewBox = [x, y, w, h, !!fit];
+        this._viewBoxShift = {
+            dx: -x,
+            dy: -y,
+            scale: size
+        };
+        this.forEach(function (el) {
+            el.transform("...");
+        });
+        return this;
+    };
+    var createNode;
+    R._engine.initWin = function (win) {
+            var doc = win.document;
+            doc.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)");
+            try {
+                !doc.namespaces.rvml && doc.namespaces.add("rvml", "urn:schemas-microsoft-com:vml");
+                createNode = function (tagName) {
+                    return doc.createElement('<rvml:' + tagName + ' class="rvml">');
+                };
+            } catch (e) {
+                createNode = function (tagName) {
+                    return doc.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');
+                };
+            }
+        };
+    R._engine.initWin(R._g.win);
+    R._engine.create = function () {
+        var con = R._getContainer.apply(0, arguments),
+            container = con.container,
+            height = con.height,
+            s,
+            width = con.width,
+            x = con.x,
+            y = con.y;
+        if (!container) {
+            throw new Error("VML container not found.");
+        }
+        var res = new R._Paper,
+            c = res.canvas = R._g.doc.createElement("div"),
+            cs = c.style;
+        x = x || 0;
+        y = y || 0;
+        width = width || 512;
+        height = height || 342;
+        res.width = width;
+        res.height = height;
+        width == +width && (width += "px");
+        height == +height && (height += "px");
+        res.coordsize = zoom * 1e3 + S + zoom * 1e3;
+        res.coordorigin = "0 0";
+        res.span = R._g.doc.createElement("span");
+        res.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;";
+        c.appendChild(res.span);
+        cs.cssText = R.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden", width, height);
+        if (container == 1) {
+            R._g.doc.body.appendChild(c);
+            cs.left = x + "px";
+            cs.top = y + "px";
+            cs.position = "absolute";
+        } else {
+            if (container.firstChild) {
+                container.insertBefore(c, container.firstChild);
+            } else {
+                container.appendChild(c);
+            }
+        }
+        // plugins.call(res, res, R.fn);
+        res.renderfix = function () {};
+        return res;
+    };
+    R.prototype.clear = function () {
+        R.eve("clear", this);
+        this.canvas.innerHTML = E;
+        this.span = R._g.doc.createElement("span");
+        this.span.style.cssText = "position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";
+        this.canvas.appendChild(this.span);
+        this.bottom = this.top = null;
+    };
+    R.prototype.remove = function () {
+        R.eve("remove", this);
+        this.canvas.parentNode.removeChild(this.canvas);
+        for (var i in this) {
+            this[i] = typeof this[i] == "function" ? R._removedFactory(i) : null;
+        }
+        return true;
+    };
+
+    var setproto = R.st;
+    for (var method in elproto) if (elproto[has](method) && !setproto[has](method)) {
+        setproto[method] = (function (methodname) {
+            return function () {
+                var arg = arguments;
+                return this.forEach(function (el) {
+                    el[methodname].apply(el, arg);
+                });
+            };
+        })(method);
+    }
+}(window.Raphael);
Index: tags/2.4.0RC3/themes/default/js/rating.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/rating.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/rating.js	(revision 14585)
@@ -0,0 +1,97 @@
+var gRatingOptions, gRatingButtons, gUserRating;
+
+function makeNiceRatingForm(options)
+{
+	gRatingOptions = options;
+	var form = document.getElementById('rateForm');
+	if (!form) return; //? template changed
+
+	gRatingButtons = form.getElementsByTagName('input');
+	gUserRating = "";
+	for (var i=0; i<gRatingButtons.length; i++)
+	{
+		if ( gRatingButtons[i].type=="button" )
+		{
+			gUserRating = gRatingButtons[i].value;
+			break;
+		}
+	}
+
+	for (var i=0; i<gRatingButtons.length; i++)
+	{
+		var rateButton = gRatingButtons[i];
+		rateButton.initialRateValue = rateButton.value; // save it as a property
+		try { rateButton.type = "button"; } catch (e){}// avoid normal submit (use ajax); not working in IE6
+
+		rateButton.value = " "; //hide the text (Apple + IE would show text above the stars)
+		with (rateButton.style)
+		{
+			marginLeft = marginRight = 0;
+		}
+
+		if (i!=gRatingButtons.length-1 && rateButton.nextSibling.nodeType == 3 /*TEXT_NODE*/)
+			rateButton.parentNode.removeChild(rateButton.nextSibling);
+		if (i>0 && rateButton.previousSibling.nodeType == 3 /*TEXT_NODE*/)
+			rateButton.parentNode.removeChild(rateButton.previousSibling);
+
+		pwgAddEventListener(rateButton, "click", updateRating);
+		pwgAddEventListener(rateButton, "mouseout", function() {updateRatingStarDisplay( gUserRating );});
+		pwgAddEventListener(rateButton, "mouseover", function(e) {
+			updateRatingStarDisplay( e.target ? e.target.initialRateValue : e.srcElement.initialRateValue);
+			});
+	}
+	updateRatingStarDisplay( gUserRating );
+}
+
+function updateRatingStarDisplay(userRating)
+{
+	for (var i=0; i<gRatingButtons.length; i++)
+		gRatingButtons[i].className = (userRating!=="" && userRating>=gRatingButtons[i].initialRateValue ) ? "rateButtonStarFull" : "rateButtonStarEmpty";
+}
+
+function updateRating(e)
+{
+	var rateButton = e.target || e.srcElement;
+	if (rateButton.initialRateValue == gUserRating)
+		return false; //nothing to do
+
+	for (var i=0; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=true;
+	var y = new PwgWS(gRatingOptions.rootUrl);
+	y.callService(
+		"pwg.images.rate", {image_id: gRatingOptions.image_id, rate: rateButton.initialRateValue } ,
+		{
+			method: "POST",
+			onFailure: function(num, text) {
+				alert(num + " " + text);
+				document.location = rateButton.form.action + "&rate="+rateButton.initialRateValue;
+			},
+			onSuccess: function(result) {
+				gUserRating = rateButton.initialRateValue;
+				for (var i=0; i<gRatingButtons.length; i++) gRatingButtons[i].disabled=false;
+				if (gRatingOptions.onSuccess) gRatingOptions.onSuccess(result);
+				if (gRatingOptions.updateRateElement) gRatingOptions.updateRateElement.innerHTML = gRatingOptions.updateRateText;
+				if (gRatingOptions.ratingSummaryElement)
+				{
+					var t = gRatingOptions.ratingSummaryText;
+					var args =[result.score, result.count, result.average], idx = 0, rexp = new RegExp( /%\.?\d*[sdf]/ );
+					while (idx<args.length) t=t.replace(rexp, args[idx++]);
+					gRatingOptions.ratingSummaryElement.innerHTML = t;
+				}
+			}
+		}
+	);
+	return false;
+}
+
+(function() {
+if (typeof _pwgRatingAutoQueue!="undefined" && _pwgRatingAutoQueue.length)
+{
+    for (var i=0; i<_pwgRatingAutoQueue.length; i++)
+        makeNiceRatingForm(_pwgRatingAutoQueue[i]);
+}
+_pwgRatingAutoQueue = {
+	push: function(opts) {
+		makeNiceRatingForm(opts);
+	}
+}
+})();
Index: tags/2.4.0RC3/themes/default/js/scripts.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/scripts.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/scripts.js	(revision 14585)
@@ -0,0 +1,155 @@
+function phpWGOpenWindow(theURL,winName,features)
+{
+	img = new Image();
+	img.src = theURL;
+	if (img.complete)
+	{
+		var width=img.width+40, height=img.height+40;
+	}
+	else
+	{
+		var width=640, height=480;
+		img.onload = function () { newWin.resizeTo( img.width+50, img.height+100); };
+	}
+	newWin = window.open(theURL,winName,features+',left=2,top=1,width=' + width + ',height=' + height);
+}
+
+function popuphelp(url)
+{
+	window.open( url, 'dc_popup',
+		'alwaysRaised=yes,dependent=yes,toolbar=no,height=420,width=500,menubar=no,resizable=yes,scrollbars=yes,status=no'
+	);
+}
+
+function pwgBind(object, method) {
+	var args = Array.prototype.slice.call(arguments,2);
+	return function() {
+			return method.apply(object, args.concat(Array.prototype.slice.call(arguments,0)) );
+	}
+}
+
+function PwgWS(urlRoot)
+{
+	this.urlRoot = urlRoot;
+	this.options = {
+		method: "GET",
+		async: true,
+		onFailure: null,
+		onSuccess: null
+	};
+};
+
+PwgWS.prototype = {
+	callService : function(method, parameters, options)
+	{
+		if (options)
+		{
+			for (var prop in options)
+				this.options[prop] = options[prop];
+		}
+		try { this.xhr = new XMLHttpRequest();}
+		catch(e) {
+			try { this.xhr = new ActiveXObject('Msxml2.XMLHTTP'); }
+			catch(e) {
+				try { this.xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
+				catch (e){
+					this.error(0, "Cannot create request object");
+					return;
+				}
+			}
+		}
+		this.xhr.onreadystatechange = pwgBind(this, this.onStateChange);
+
+		var url = this.urlRoot+"ws.php?format=json&method="+method;
+
+		var body = "";
+		if (parameters)
+		{
+			for (var prop in parameters)
+			{
+				if ( typeof parameters[prop] == 'object' && parameters[prop])
+				{
+					for (var i=0; i<parameters[prop].length; i++)
+						body += prop+"[]="+encodeURIComponent(parameters[prop][i])+"&";
+				}
+				else
+					body += prop+"="+encodeURIComponent(parameters[prop])+"&";
+			}
+		}
+
+		if (this.options.method != "POST" )
+		{
+			url += "&"+body;
+			body = null;
+		}
+		this.xhr.open(this.options.method, url, this.options.async);
+		if (this.options.method == "POST" )
+			this.xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+		try {
+			this.xhr.send(body);
+		} catch(e) {
+			this.error(0, e.message);
+		}
+	},
+
+	onStateChange: function() {
+		var readyState = this.xhr.readyState;
+		if (readyState==4)
+		{
+			try {
+				this.respondToReadyState(readyState);
+			} finally {
+				this.cleanup();
+			}
+		}
+	},
+
+	error: function( httpCode, text )
+	{
+		!this.options.onFailure || this.options.onFailure( httpCode, text);
+		this.cleanup();
+	},
+
+	respondToReadyState: function(readyState)
+	{
+		var xhr = this.xhr;
+		if (readyState==4 && xhr.status == 200)
+		{
+			var resp;
+			try {
+				resp = window.JSON && window.JSON.parse ? window.JSON.parse( xhr.responseText ) : (new Function("return " + xhr.responseText))();
+			}
+			catch (e) {
+				this.error( 200, e.message + '\n' + xhr.responseText.substr(0,512) );
+			}
+			if (resp!=null)
+			{
+				if (resp.stat==null)
+					this.error( 200, "Invalid response" );
+				else if (resp.stat=='ok')
+					!this.options.onSuccess || this.options.onSuccess( resp.result );
+				else
+					this.error( 200, resp.err + " " + resp.message);
+			}
+		}
+		if (readyState==4 && xhr.status != 200)
+			this.error( xhr.status, xhr.statusText );
+	},
+
+	cleanup: function()
+	{
+		if (this.xhr) this.xhr.onreadystatechange = null;
+		this.xhr = null;
+		this.options.onFailure = this.options.onSuccess = null;
+	},
+
+	xhr: null
+}
+
+function pwgAddEventListener(elem, evt, fn)
+{
+	if (window.addEventListener)
+		elem.addEventListener(evt, fn, false);
+	else
+		elem.attachEvent('on'+evt, fn);		
+}
Index: tags/2.4.0RC3/themes/default/js/thumbnails.loader.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/thumbnails.loader.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/thumbnails.loader.js	(revision 14585)
@@ -0,0 +1,30 @@
+var thumbnails_queue = jQuery.manageAjax.create('queued', {
+  queue: true,  
+  cacheResponse: false,
+  maxRequests: 3,
+  preventDoubleRequests: false
+});
+
+function add_thumbnail_to_queue(img, loop) {
+  thumbnails_queue.add({
+    type: 'GET', 
+    url: img.data('src'), 
+    data: { ajaxload: 'true' },
+    dataType: 'json',
+    success: function(result) {
+      img.attr('src', result.url);
+    },
+    error: function() {
+      if (loop < 3)
+        add_thumbnail_to_queue(img, ++loop); // Retry 3 times
+    }
+  }); 
+}
+
+function pwg_ajax_thumbnails_loader() {
+  jQuery('img[data-src]').each(function() {
+    add_thumbnail_to_queue(jQuery(this), 0);
+  });
+}
+
+jQuery(document).ready(pwg_ajax_thumbnails_loader);
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery-ui-i18n.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery-ui-i18n.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery-ui-i18n.js	(revision 14585)
@@ -0,0 +1,1379 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+	$.datepicker.regional['af'] = {
+		closeText: 'Selekteer',
+		prevText: 'Vorige',
+		nextText: 'Volgende',
+		currentText: 'Vandag',
+		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+		'Julie','Augustus','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['af']);
+});
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+	$.datepicker.regional['ar-DZ'] = {
+		closeText: 'إغلاق',
+		prevText: '&#x3c;السابق',
+		nextText: 'التالي&#x3e;',
+		currentText: 'اليوم',
+		monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+		'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		weekHeader: 'أسبوع',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+	$.datepicker.regional['ar'] = {
+		closeText: 'إغلاق',
+		prevText: '&#x3c;السابق',
+		nextText: 'التالي&#x3e;',
+		currentText: 'اليوم',
+		monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
+		'تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		weekHeader: 'أسبوع',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar']);
+});/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+	$.datepicker.regional['az'] = {
+		closeText: 'Bağla',
+		prevText: '&#x3c;Geri',
+		nextText: 'İrəli&#x3e;',
+		currentText: 'Bugün',
+		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+		'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+		monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+		'İyul','Avq','Sen','Okt','Noy','Dek'],
+		dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+		dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+		dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['az']);
+});/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'затвори',
+        prevText: '&#x3c;назад',
+        nextText: 'напред&#x3e;',
+		nextBigText: '&#x3e;&#x3e;',
+        currentText: 'днес',
+        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+        'Юли','Август','Септември','Октомври','Ноември','Декември'],
+        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+        'Юли','Авг','Сеп','Окт','Нов','Дек'],
+        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+		weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+        isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+	$.datepicker.regional['bs'] = {
+		closeText: 'Zatvori', 
+		prevText: '&#x3c;', 
+		nextText: '&#x3e;', 
+		currentText: 'Danas', 
+		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['bs']);
+});/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ca'] = {
+		closeText: 'Tancar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Avui',
+		monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+		'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Oct','Nov','Des'],
+		dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+		dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+		dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ca']);
+});/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+	$.datepicker.regional['cs'] = {
+		closeText: 'Zavřít',
+		prevText: '&#x3c;Dříve',
+		nextText: 'Později&#x3e;',
+		currentText: 'Nyní',
+		monthNames: ['leden','únor','březen','duben','květen','červen',
+        'červenec','srpen','září','říjen','listopad','prosinec'],
+		monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+		'čvc','srp','zář','říj','lis','pro'],
+		dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+		dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+		dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+		weekHeader: 'Týd',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['cs']);
+});
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+		closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+		nextText: 'Næste&#x3e;',
+		currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+		weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schließen',
+		prevText: '&#x3c;zurück',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','März','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+	$.datepicker.regional['el'] = {
+		closeText: 'Κλείσιμο',
+		prevText: 'Προηγούμενος',
+		nextText: 'Επόμενος',
+		currentText: 'Τρέχων Μήνας',
+		monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+		'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+		monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+		'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+		dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+		dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+		dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+		weekHeader: 'Εβδ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['el']);
+});/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-AU'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+	$.datepicker.regional['en-GB'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-NZ'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+	$.datepicker.regional['eo'] = {
+		closeText: 'Fermi',
+		prevText: '&lt;Anta',
+		nextText: 'Sekv&gt;',
+		currentText: 'Nuna',
+		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+		'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+		weekHeader: 'Sb',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eo']);
+});
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+	$.datepicker.regional['et'] = {
+		closeText: 'Sulge',
+		prevText: 'Eelnev',
+		nextText: 'Järgnev',
+		currentText: 'Täna',
+		monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+		'Juuli','August','September','Oktoober','November','Detsember'],
+		monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+		dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+		dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+		dayNamesMin: ['P','E','T','K','N','R','L'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['et']);
+}); /* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+	$.datepicker.regional['eu'] = {
+		closeText: 'Egina',
+		prevText: '&#x3c;Aur',
+		nextText: 'Hur&#x3e;',
+		currentText: 'Gaur',
+		monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+		'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+		monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+		'Uzt','Abu','Ira','Urr','Aza','Abe'],
+		dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+		dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+		dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eu']);
+});/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+	$.datepicker.regional['fa'] = {
+		closeText: 'بستن',
+		prevText: '&#x3c;قبلي',
+		nextText: 'بعدي&#x3e;',
+		currentText: 'امروز',
+		monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+		'مهر','آبان','آذر','دي','بهمن','اسفند'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+		dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+		dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+		weekHeader: 'هف',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 6,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fa']);
+});/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['fi'] = {
+		closeText: 'Sulje',
+		prevText: '&laquo;Edellinen',
+		nextText: 'Seuraava&raquo;',
+		currentText: 'T&auml;n&auml;&auml;n',
+        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
+        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
+        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
+		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+		weekHeader: 'Vk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+	$.datepicker.regional['fo'] = {
+		closeText: 'Lat aftur',
+		prevText: '&#x3c;Fyrra',
+		nextText: 'Næsta&#x3e;',
+		currentText: 'Í dag',
+		monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+		'Juli','August','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+		dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+		dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+		weekHeader: 'Vk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fo']);
+});
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+	$.datepicker.regional['fr-CH'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;Préc',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+		'Jul','Aoû','Sep','Oct','Nov','Déc'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+              Stéphane Nahmani (sholby@sholby.net),
+              Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: 'Précédent',
+		nextText: 'Suivant',
+		currentText: 'Aujourd\'hui',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+		'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+		dayNamesMin: ['D','L','M','M','J','V','S'],
+		weekHeader: 'Sem.',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+	$.datepicker.regional['gl'] = {
+		closeText: 'Pechar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Hoxe',
+		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+		'Xul','Ago','Set','Out','Nov','Dec'],
+		dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['gl']);
+});/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+	$.datepicker.regional['he'] = {
+		closeText: 'סגור',
+		prevText: '&#x3c;הקודם',
+		nextText: 'הבא&#x3e;',
+		currentText: 'היום',
+		monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+		'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+		monthNamesShort: ['1','2','3','4','5','6',
+		'7','8','9','10','11','12'],
+		dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+		dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['he']);
+});
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+	$.datepicker.regional['hr'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+		monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+		'Srp','Kol','Ruj','Lis','Stu','Pro'],
+		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Tje',
+		dateFormat: 'dd.mm.yy.',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hr']);
+});/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+	$.datepicker.regional['hu'] = {
+		closeText: 'bezárás',
+		prevText: '&laquo;&nbsp;vissza',
+		nextText: 'előre&nbsp;&raquo;',
+		currentText: 'ma',
+		monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+		'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+		monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+		'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+		dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+		dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+		weekHeader: 'Hé',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hu']);
+});
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+	$.datepicker.regional['hy'] = {
+		closeText: 'Փակել',
+		prevText: '&#x3c;Նախ.',
+		nextText: 'Հաջ.&#x3e;',
+		currentText: 'Այսօր',
+		monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+		'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+		monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+		'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+		dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+		dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		weekHeader: 'ՇԲՏ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hy']);
+});/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['id'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;mundur',
+		nextText: 'maju&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+		'Juli','Agustus','September','Oktober','Nopember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Agus','Sep','Okt','Nop','Des'],
+		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['id']);
+});/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+	$.datepicker.regional['is'] = {
+		closeText: 'Loka',
+		prevText: '&#x3c; Fyrri',
+		nextText: 'N&aelig;sti &#x3e;',
+		currentText: '&Iacute; dag',
+		monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+		'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+		'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+		dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+		dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+		dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+		weekHeader: 'Vika',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['is']);
+});/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['it'] = {
+		closeText: 'Chiudi',
+		prevText: '&#x3c;Prec',
+		nextText: 'Succ&#x3e;',
+		currentText: 'Oggi',
+		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+			'Lug','Ago','Set','Ott','Nov','Dic'],
+		dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['it']);
+});
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+	$.datepicker.regional['ja'] = {
+		closeText: '閉じる',
+		prevText: '&#x3c;前',
+		nextText: '次&#x3e;',
+		currentText: '今日',
+		monthNames: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+		dayNamesShort: ['日','月','火','水','木','金','土'],
+		dayNamesMin: ['日','月','火','水','木','金','土'],
+		weekHeader: '週',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['ja']);
+});/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ko'] = {
+		closeText: '닫기',
+		prevText: '이전달',
+		nextText: '다음달',
+		currentText: '오늘',
+		monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		dayNames: ['일','월','화','수','목','금','토'],
+		dayNamesShort: ['일','월','화','수','목','금','토'],
+		dayNamesMin: ['일','월','화','수','목','금','토'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: '년'};
+	$.datepicker.setDefaults($.datepicker.regional['ko']);
+});/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['kz'] = {
+		closeText: 'Жабу',
+		prevText: '&#x3c;Алдыңғы',
+		nextText: 'Келесі&#x3e;',
+		currentText: 'Бүгін',
+		monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+		'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+		monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+		'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+		dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+		dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+		dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+		weekHeader: 'Не',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['kz']);
+});
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+	$.datepicker.regional['lt'] = {
+		closeText: 'Uždaryti',
+		prevText: '&#x3c;Atgal',
+		nextText: 'Pirmyn&#x3e;',
+		currentText: 'Šiandien',
+		monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+		'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+		dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+		dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lt']);
+});/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+	$.datepicker.regional['lv'] = {
+		closeText: 'Aizvērt',
+		prevText: 'Iepr',
+		nextText: 'Nāka',
+		currentText: 'Šodien',
+		monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+		'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+		'Jūl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+		weekHeader: 'Nav',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lv']);
+});/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ml'] = {
+		closeText: 'ശരി',
+		prevText: 'മുന്നത്തെ',  
+		nextText: 'അടുത്തത് ',
+		currentText: 'ഇന്ന്',
+		monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
+		'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
+		monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
+		'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
+		dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+		dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+		dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
+		weekHeader: 'ആ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ml']);
+});
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+	$.datepicker.regional['ms'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;Sebelum',
+		nextText: 'Selepas&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+		'Julai','Ogos','September','Oktober','November','Disember'],
+		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+		'Jul','Ogo','Sep','Okt','Nov','Dis'],
+		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ms']);
+});/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+	$.datepicker.regional.nl = {
+		closeText: 'Sluiten',
+		prevText: '←',
+		nextText: '→',
+		currentText: 'Vandaag',
+		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional.nl);
+});/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+  $.datepicker.regional['no'] = {
+    closeText: 'Lukk',
+    prevText: '&laquo;Forrige',
+    nextText: 'Neste&raquo;',
+    currentText: 'I dag',
+    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+    weekHeader: 'Uke',
+    dateFormat: 'dd.mm.yy',
+    firstDay: 1,
+    isRTL: false,
+    showMonthAfterYear: false,
+    yearSuffix: ''
+  };
+  $.datepicker.setDefaults($.datepicker.regional['no']);
+});
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pl'] = {
+		closeText: 'Zamknij',
+		prevText: '&#x3c;Poprzedni',
+		nextText: 'Następny&#x3e;',
+		currentText: 'Dziś',
+		monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+		'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+		'Lip','Sie','Wrz','Pa','Lis','Gru'],
+		dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+		dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+		dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+		weekHeader: 'Tydz',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pl']);
+});
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pt-BR'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Pr&oacute;ximo&#x3e;',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+	$.datepicker.regional['pt'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Seguinte',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sem',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt']);
+});/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+	$.datepicker.regional['rm'] = {
+		closeText: 'Serrar',
+		prevText: '&#x3c;Suandant',
+		nextText: 'Precedent&#x3e;',
+		currentText: 'Actual',
+		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+		weekHeader: 'emna',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['rm']);
+});
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+	$.datepicker.regional['ro'] = {
+		closeText: 'Închide',
+		prevText: '&laquo; Luna precedentă',
+		nextText: 'Luna următoare &raquo;',
+		currentText: 'Azi',
+		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+		weekHeader: 'Săpt',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ro']);
+});
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ru'] = {
+		closeText: 'Закрыть',
+		prevText: '&#x3c;Пред',
+		nextText: 'След&#x3e;',
+		currentText: 'Сегодня',
+		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+		'Июл','Авг','Сен','Окт','Ноя','Дек'],
+		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Нед',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ru']);
+});/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+	$.datepicker.regional['sk'] = {
+		closeText: 'Zavrieť',
+		prevText: '&#x3c;Predchádzajúci',
+		nextText: 'Nasledujúci&#x3e;',
+		currentText: 'Dnes',
+		monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+		'Júl','August','September','Október','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+		'Júl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+		dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+		dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+		weekHeader: 'Ty',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sk']);
+});
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+	$.datepicker.regional['sl'] = {
+		closeText: 'Zapri',
+		prevText: '&lt;Prej&#x161;nji',
+		nextText: 'Naslednji&gt;',
+		currentText: 'Trenutni',
+		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+		'Julij','Avgust','September','Oktober','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+		dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+		dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+		weekHeader: 'Teden',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sl']);
+});
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['sq'] = {
+		closeText: 'mbylle',
+		prevText: '&#x3c;mbrapa',
+		nextText: 'Përpara&#x3e;',
+		currentText: 'sot',
+		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+		'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+		'Kor','Gus','Sht','Tet','Nën','Dhj'],
+		dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+		dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		weekHeader: 'Ja',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sq']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr-SR'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Sed',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr'] = {
+		closeText: 'Затвори',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Данас',
+		monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+		'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+		monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+		'Јул','Авг','Сеп','Окт','Нов','Дец'],
+		dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+		dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+		dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+		weekHeader: 'Сед',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr']);
+});
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+		closeText: 'Stäng',
+        prevText: '&laquo;Förra',
+		nextText: 'Nästa&raquo;',
+		currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+		dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+		dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+		weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+	$.datepicker.regional['ta'] = {
+		closeText: 'மூடு',
+		prevText: 'முன்னையது',
+		nextText: 'அடுத்தது',
+		currentText: 'இன்று',
+		monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+		'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+		monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+		'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+		dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+		dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+		dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ta']);
+});
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+	$.datepicker.regional['th'] = {
+		closeText: 'ปิด',
+		prevText: '&laquo;&nbsp;ย้อน',
+		nextText: 'ถัดไป&nbsp;&raquo;',
+		currentText: 'วันนี้',
+		monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+		'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+		monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+		'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+		dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+		dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['th']);
+});/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['tj'] = {
+		closeText: 'Идома',
+		prevText: '&#x3c;Қафо',
+		nextText: 'Пеш&#x3e;',
+		currentText: 'Имрӯз',
+		monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
+		'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
+		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+		'Июл','Авг','Сен','Окт','Ноя','Дек'],
+		dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
+		dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
+		dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
+		weekHeader: 'Хф',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tj']);
+});/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+	$.datepicker.regional['tr'] = {
+		closeText: 'kapat',
+		prevText: '&#x3c;geri',
+		nextText: 'ileri&#x3e',
+		currentText: 'bugün',
+		monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+		'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+		monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+		'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+		dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+		dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tr']);
+});/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['uk'] = {
+		closeText: 'Закрити',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Сьогодні',
+		monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+		'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+		monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+		'Лип','Сер','Вер','Жов','Лис','Гру'],
+		dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+		dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['uk']);
+});/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+	$.datepicker.regional['vi'] = {
+		closeText: 'Đóng',
+		prevText: '&#x3c;Trước',
+		nextText: 'Tiếp&#x3e;',
+		currentText: 'Hôm nay',
+		monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+		'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+		monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+		'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+		dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		weekHeader: 'Tu',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['vi']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-CN'] = {
+		closeText: '关闭',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-HK'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-TW'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-af.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-af.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-af.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Afrikaans initialisation for the jQuery UI date picker plugin. */
+/* Written by Renier Pretorius. */
+jQuery(function($){
+	$.datepicker.regional['af'] = {
+		closeText: 'Selekteer',
+		prevText: 'Vorige',
+		nextText: 'Volgende',
+		currentText: 'Vandag',
+		monthNames: ['Januarie','Februarie','Maart','April','Mei','Junie',
+		'Julie','Augustus','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
+		dayNames: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
+		dayNamesShort: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
+		dayNamesMin: ['So','Ma','Di','Wo','Do','Vr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['af']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar-DZ.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar-DZ.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar-DZ.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Algerian Arabic Translation for jQuery UI date picker plugin. (can be used for Tunisia)*/
+/* Mohamed Cherif BOUCHELAGHEM -- cherifbouchelaghem@yahoo.fr */
+
+jQuery(function($){
+	$.datepicker.regional['ar-DZ'] = {
+		closeText: 'إغلاق',
+		prevText: '&#x3c;السابق',
+		nextText: 'التالي&#x3e;',
+		currentText: 'اليوم',
+		monthNames: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان',
+		'جويلية', 'أوت', 'سبتمبر','أكتوبر', 'نوفمبر', 'ديسمبر'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		weekHeader: 'أسبوع',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar-DZ']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ar.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Arabic Translation for jQuery UI date picker plugin. */
+/* Khaled Alhourani -- me@khaledalhourani.com */
+/* NOTE: monthNames are the original months names and they are the Arabic names, not the new months name فبراير - يناير and there isn't any Arabic roots for these months */
+jQuery(function($){
+	$.datepicker.regional['ar'] = {
+		closeText: 'إغلاق',
+		prevText: '&#x3c;السابق',
+		nextText: 'التالي&#x3e;',
+		currentText: 'اليوم',
+		monthNames: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'مايو', 'حزيران',
+		'تموز', 'آب', 'أيلول',	'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],
+		monthNamesShort: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
+		dayNames: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesShort: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		dayNamesMin: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
+		weekHeader: 'أسبوع',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 6,
+  		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ar']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-az.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-az.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-az.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Jamil Najafov (necefov33@gmail.com). */
+jQuery(function($) {
+	$.datepicker.regional['az'] = {
+		closeText: 'Bağla',
+		prevText: '&#x3c;Geri',
+		nextText: 'İrəli&#x3e;',
+		currentText: 'Bugün',
+		monthNames: ['Yanvar','Fevral','Mart','Aprel','May','İyun',
+		'İyul','Avqust','Sentyabr','Oktyabr','Noyabr','Dekabr'],
+		monthNamesShort: ['Yan','Fev','Mar','Apr','May','İyun',
+		'İyul','Avq','Sen','Okt','Noy','Dek'],
+		dayNames: ['Bazar','Bazar ertəsi','Çərşənbə axşamı','Çərşənbə','Cümə axşamı','Cümə','Şənbə'],
+		dayNamesShort: ['B','Be','Ça','Ç','Ca','C','Ş'],
+		dayNamesMin: ['B','B','Ç','С','Ç','C','Ş'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['az']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bg.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bg.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bg.js	(revision 14585)
@@ -0,0 +1,24 @@
+/* Bulgarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Stoyan Kyosev (http://svest.org). */
+jQuery(function($){
+    $.datepicker.regional['bg'] = {
+        closeText: 'затвори',
+        prevText: '&#x3c;назад',
+        nextText: 'напред&#x3e;',
+		nextBigText: '&#x3e;&#x3e;',
+        currentText: 'днес',
+        monthNames: ['Януари','Февруари','Март','Април','Май','Юни',
+        'Юли','Август','Септември','Октомври','Ноември','Декември'],
+        monthNamesShort: ['Яну','Фев','Мар','Апр','Май','Юни',
+        'Юли','Авг','Сеп','Окт','Нов','Дек'],
+        dayNames: ['Неделя','Понеделник','Вторник','Сряда','Четвъртък','Петък','Събота'],
+        dayNamesShort: ['Нед','Пон','Вто','Сря','Чет','Пет','Съб'],
+        dayNamesMin: ['Не','По','Вт','Ср','Че','Пе','Съ'],
+		weekHeader: 'Wk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+        isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['bg']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bs.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bs.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-bs.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Bosnian i18n for the jQuery UI date picker plugin. */
+/* Written by Kenan Konjo. */
+jQuery(function($){
+	$.datepicker.regional['bs'] = {
+		closeText: 'Zatvori', 
+		prevText: '&#x3c;', 
+		nextText: '&#x3e;', 
+		currentText: 'Danas', 
+		monthNames: ['Januar','Februar','Mart','April','Maj','Juni',
+		'Juli','August','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['bs']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ca.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ca.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ca.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Inicialització en català per a l'extenció 'calendar' per jQuery. */
+/* Writers: (joan.leon@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ca'] = {
+		closeText: 'Tancar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Avui',
+		monthNames: ['Gener','Febrer','Mar&ccedil;','Abril','Maig','Juny',
+		'Juliol','Agost','Setembre','Octubre','Novembre','Desembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Oct','Nov','Des'],
+		dayNames: ['Diumenge','Dilluns','Dimarts','Dimecres','Dijous','Divendres','Dissabte'],
+		dayNamesShort: ['Dug','Dln','Dmt','Dmc','Djs','Dvn','Dsb'],
+		dayNamesMin: ['Dg','Dl','Dt','Dc','Dj','Dv','Ds'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ca']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-cs.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-cs.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-cs.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Czech initialisation for the jQuery UI date picker plugin. */
+/* Written by Tomas Muller (tomas@tomas-muller.net). */
+jQuery(function($){
+	$.datepicker.regional['cs'] = {
+		closeText: 'Zavřít',
+		prevText: '&#x3c;Dříve',
+		nextText: 'Později&#x3e;',
+		currentText: 'Nyní',
+		monthNames: ['leden','únor','březen','duben','květen','červen',
+        'červenec','srpen','září','říjen','listopad','prosinec'],
+		monthNamesShort: ['led','úno','bře','dub','kvě','čer',
+		'čvc','srp','zář','říj','lis','pro'],
+		dayNames: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],
+		dayNamesShort: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
+		dayNamesMin: ['ne','po','út','st','čt','pá','so'],
+		weekHeader: 'Týd',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['cs']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-da.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-da.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-da.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Danish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jan Christensen ( deletestuff@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['da'] = {
+		closeText: 'Luk',
+        prevText: '&#x3c;Forrige',
+		nextText: 'Næste&#x3e;',
+		currentText: 'Idag',
+        monthNames: ['Januar','Februar','Marts','April','Maj','Juni',
+        'Juli','August','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'],
+		dayNamesShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'],
+		dayNamesMin: ['Sø','Ma','Ti','On','To','Fr','Lø'],
+		weekHeader: 'Uge',
+        dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['da']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-de.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-de.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-de.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* German initialisation for the jQuery UI date picker plugin. */
+/* Written by Milian Wolff (mail@milianw.de). */
+jQuery(function($){
+	$.datepicker.regional['de'] = {
+		closeText: 'schließen',
+		prevText: '&#x3c;zurück',
+		nextText: 'Vor&#x3e;',
+		currentText: 'heute',
+		monthNames: ['Januar','Februar','März','April','Mai','Juni',
+		'Juli','August','September','Oktober','November','Dezember'],
+		monthNamesShort: ['Jan','Feb','Mär','Apr','Mai','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Dez'],
+		dayNames: ['Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'],
+		dayNamesShort: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		dayNamesMin: ['So','Mo','Di','Mi','Do','Fr','Sa'],
+		weekHeader: 'Wo',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['de']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-el.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-el.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-el.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Greek (el) initialisation for the jQuery UI date picker plugin. */
+/* Written by Alex Cicovic (http://www.alexcicovic.com) */
+jQuery(function($){
+	$.datepicker.regional['el'] = {
+		closeText: 'Κλείσιμο',
+		prevText: 'Προηγούμενος',
+		nextText: 'Επόμενος',
+		currentText: 'Τρέχων Μήνας',
+		monthNames: ['Ιανουάριος','Φεβρουάριος','Μάρτιος','Απρίλιος','Μάιος','Ιούνιος',
+		'Ιούλιος','Αύγουστος','Σεπτέμβριος','Οκτώβριος','Νοέμβριος','Δεκέμβριος'],
+		monthNamesShort: ['Ιαν','Φεβ','Μαρ','Απρ','Μαι','Ιουν',
+		'Ιουλ','Αυγ','Σεπ','Οκτ','Νοε','Δεκ'],
+		dayNames: ['Κυριακή','Δευτέρα','Τρίτη','Τετάρτη','Πέμπτη','Παρασκευή','Σάββατο'],
+		dayNamesShort: ['Κυρ','Δευ','Τρι','Τετ','Πεμ','Παρ','Σαβ'],
+		dayNamesMin: ['Κυ','Δε','Τρ','Τε','Πε','Πα','Σα'],
+		weekHeader: 'Εβδ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['el']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-AU.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-AU.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-AU.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* English/Australia initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-AU'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-AU']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-GB.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-GB.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-GB.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* English/UK initialisation for the jQuery UI date picker plugin. */
+/* Written by Stuart. */
+jQuery(function($){
+	$.datepicker.regional['en-GB'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-GB']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-NZ.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-NZ.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-en-NZ.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* English/New Zealand initialisation for the jQuery UI date picker plugin. */
+/* Based on the en-GB initialisation. */
+jQuery(function($){
+	$.datepicker.regional['en-NZ'] = {
+		closeText: 'Done',
+		prevText: 'Prev',
+		nextText: 'Next',
+		currentText: 'Today',
+		monthNames: ['January','February','March','April','May','June',
+		'July','August','September','October','November','December'],
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+		'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['en-NZ']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eo.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eo.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eo.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Esperanto initialisation for the jQuery UI date picker plugin. */
+/* Written by Olivier M. (olivierweb@ifrance.com). */
+jQuery(function($){
+	$.datepicker.regional['eo'] = {
+		closeText: 'Fermi',
+		prevText: '&lt;Anta',
+		nextText: 'Sekv&gt;',
+		currentText: 'Nuna',
+		monthNames: ['Januaro','Februaro','Marto','Aprilo','Majo','Junio',
+		'Julio','Aŭgusto','Septembro','Oktobro','Novembro','Decembro'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Aŭg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Dimanĉo','Lundo','Mardo','Merkredo','Ĵaŭdo','Vendredo','Sabato'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Ĵaŭ','Ven','Sab'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Ĵa','Ve','Sa'],
+		weekHeader: 'Sb',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eo']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-es.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-es.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-es.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Inicialización en español para la extensión 'UI date picker' para jQuery. */
+/* Traducido por Vester (xvester@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['es'] = {
+		closeText: 'Cerrar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Sig&#x3e;',
+		currentText: 'Hoy',
+		monthNames: ['Enero','Febrero','Marzo','Abril','Mayo','Junio',
+		'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'],
+		monthNamesShort: ['Ene','Feb','Mar','Abr','May','Jun',
+		'Jul','Ago','Sep','Oct','Nov','Dic'],
+		dayNames: ['Domingo','Lunes','Martes','Mi&eacute;rcoles','Jueves','Viernes','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','Mi&eacute;','Juv','Vie','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','Mi','Ju','Vi','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['es']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-et.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-et.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-et.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Estonian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */
+jQuery(function($){
+	$.datepicker.regional['et'] = {
+		closeText: 'Sulge',
+		prevText: 'Eelnev',
+		nextText: 'Järgnev',
+		currentText: 'Täna',
+		monthNames: ['Jaanuar','Veebruar','Märts','Aprill','Mai','Juuni',
+		'Juuli','August','September','Oktoober','November','Detsember'],
+		monthNamesShort: ['Jaan', 'Veebr', 'Märts', 'Apr', 'Mai', 'Juuni',
+		'Juuli', 'Aug', 'Sept', 'Okt', 'Nov', 'Dets'],
+		dayNames: ['Pühapäev', 'Esmaspäev', 'Teisipäev', 'Kolmapäev', 'Neljapäev', 'Reede', 'Laupäev'],
+		dayNamesShort: ['Pühap', 'Esmasp', 'Teisip', 'Kolmap', 'Neljap', 'Reede', 'Laup'],
+		dayNamesMin: ['P','E','T','K','N','R','L'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['et']);
+}); 
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eu.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eu.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-eu.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Euskarako oinarria 'UI date picker' jquery-ko extentsioarentzat */
+/* Karrikas-ek itzulia (karrikas@karrikas.com) */
+jQuery(function($){
+	$.datepicker.regional['eu'] = {
+		closeText: 'Egina',
+		prevText: '&#x3c;Aur',
+		nextText: 'Hur&#x3e;',
+		currentText: 'Gaur',
+		monthNames: ['Urtarrila','Otsaila','Martxoa','Apirila','Maiatza','Ekaina',
+		'Uztaila','Abuztua','Iraila','Urria','Azaroa','Abendua'],
+		monthNamesShort: ['Urt','Ots','Mar','Api','Mai','Eka',
+		'Uzt','Abu','Ira','Urr','Aza','Abe'],
+		dayNames: ['Igandea','Astelehena','Asteartea','Asteazkena','Osteguna','Ostirala','Larunbata'],
+		dayNamesShort: ['Iga','Ast','Ast','Ast','Ost','Ost','Lar'],
+		dayNamesMin: ['Ig','As','As','As','Os','Os','La'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['eu']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fa.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fa.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fa.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Persian (Farsi) Translation for the jQuery UI date picker plugin. */
+/* Javad Mowlanezhad -- jmowla@gmail.com */
+/* Jalali calendar should supported soon! (Its implemented but I have to test it) */
+jQuery(function($) {
+	$.datepicker.regional['fa'] = {
+		closeText: 'بستن',
+		prevText: '&#x3c;قبلي',
+		nextText: 'بعدي&#x3e;',
+		currentText: 'امروز',
+		monthNames: ['فروردين','ارديبهشت','خرداد','تير','مرداد','شهريور',
+		'مهر','آبان','آذر','دي','بهمن','اسفند'],
+		monthNamesShort: ['1','2','3','4','5','6','7','8','9','10','11','12'],
+		dayNames: ['يکشنبه','دوشنبه','سه‌شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه'],
+		dayNamesShort: ['ي','د','س','چ','پ','ج', 'ش'],
+		dayNamesMin: ['ي','د','س','چ','پ','ج', 'ش'],
+		weekHeader: 'هف',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 6,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fa']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fi.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fi.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fi.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Finnish initialisation for the jQuery UI date picker plugin. */
+/* Written by Harri Kilpi� (harrikilpio@gmail.com). */
+jQuery(function($){
+    $.datepicker.regional['fi'] = {
+		closeText: 'Sulje',
+		prevText: '&laquo;Edellinen',
+		nextText: 'Seuraava&raquo;',
+		currentText: 'T&auml;n&auml;&auml;n',
+        monthNames: ['Tammikuu','Helmikuu','Maaliskuu','Huhtikuu','Toukokuu','Kes&auml;kuu',
+        'Hein&auml;kuu','Elokuu','Syyskuu','Lokakuu','Marraskuu','Joulukuu'],
+        monthNamesShort: ['Tammi','Helmi','Maalis','Huhti','Touko','Kes&auml;',
+        'Hein&auml;','Elo','Syys','Loka','Marras','Joulu'],
+		dayNamesShort: ['Su','Ma','Ti','Ke','To','Pe','Su'],
+		dayNames: ['Sunnuntai','Maanantai','Tiistai','Keskiviikko','Torstai','Perjantai','Lauantai'],
+		dayNamesMin: ['Su','Ma','Ti','Ke','To','Pe','La'],
+		weekHeader: 'Vk',
+        dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['fi']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fo.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fo.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fo.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Faroese initialisation for the jQuery UI date picker plugin */
+/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */
+jQuery(function($){
+	$.datepicker.regional['fo'] = {
+		closeText: 'Lat aftur',
+		prevText: '&#x3c;Fyrra',
+		nextText: 'Næsta&#x3e;',
+		currentText: 'Í dag',
+		monthNames: ['Januar','Februar','Mars','Apríl','Mei','Juni',
+		'Juli','August','September','Oktober','November','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Aug','Sep','Okt','Nov','Des'],
+		dayNames: ['Sunnudagur','Mánadagur','Týsdagur','Mikudagur','Hósdagur','Fríggjadagur','Leyardagur'],
+		dayNamesShort: ['Sun','Mán','Týs','Mik','Hós','Frí','Ley'],
+		dayNamesMin: ['Su','Má','Tý','Mi','Hó','Fr','Le'],
+		weekHeader: 'Vk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fo']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr-CH.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr-CH.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr-CH.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Swiss-French initialisation for the jQuery UI date picker plugin. */
+/* Written Martin Voelkle (martin.voelkle@e-tc.ch). */
+jQuery(function($){
+	$.datepicker.regional['fr-CH'] = {
+		closeText: 'Fermer',
+		prevText: '&#x3c;Préc',
+		nextText: 'Suiv&#x3e;',
+		currentText: 'Courant',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+		'Jul','Aoû','Sep','Oct','Nov','Déc'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+		dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr-CH']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-fr.js	(revision 14585)
@@ -0,0 +1,25 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au),
+              Stéphane Nahmani (sholby@sholby.net),
+              Stéphane Raimbault <stephane.raimbault@gmail.com> */
+jQuery(function($){
+	$.datepicker.regional['fr'] = {
+		closeText: 'Fermer',
+		prevText: 'Précédent',
+		nextText: 'Suivant',
+		currentText: 'Aujourd\'hui',
+		monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+		'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+		monthNamesShort: ['Janv.','Févr.','Mars','Avril','Mai','Juin',
+		'Juil.','Août','Sept.','Oct.','Nov.','Déc.'],
+		dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+		dayNamesShort: ['Dim.','Lun.','Mar.','Mer.','Jeu.','Ven.','Sam.'],
+		dayNamesMin: ['D','L','M','M','J','V','S'],
+		weekHeader: 'Sem.',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['fr']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-gl.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-gl.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-gl.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Galician localization for 'UI date picker' jQuery extension. */
+/* Translated by Jorge Barreiro <yortx.barry@gmail.com>. */
+jQuery(function($){
+	$.datepicker.regional['gl'] = {
+		closeText: 'Pechar',
+		prevText: '&#x3c;Ant',
+		nextText: 'Seg&#x3e;',
+		currentText: 'Hoxe',
+		monthNames: ['Xaneiro','Febreiro','Marzo','Abril','Maio','Xuño',
+		'Xullo','Agosto','Setembro','Outubro','Novembro','Decembro'],
+		monthNamesShort: ['Xan','Feb','Mar','Abr','Mai','Xuñ',
+		'Xul','Ago','Set','Out','Nov','Dec'],
+		dayNames: ['Domingo','Luns','Martes','M&eacute;rcores','Xoves','Venres','S&aacute;bado'],
+		dayNamesShort: ['Dom','Lun','Mar','M&eacute;r','Xov','Ven','S&aacute;b'],
+		dayNamesMin: ['Do','Lu','Ma','M&eacute;','Xo','Ve','S&aacute;'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['gl']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-he.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-he.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-he.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Hebrew initialisation for the UI Datepicker extension. */
+/* Written by Amir Hardon (ahardon at gmail dot com). */
+jQuery(function($){
+	$.datepicker.regional['he'] = {
+		closeText: 'סגור',
+		prevText: '&#x3c;הקודם',
+		nextText: 'הבא&#x3e;',
+		currentText: 'היום',
+		monthNames: ['ינואר','פברואר','מרץ','אפריל','מאי','יוני',
+		'יולי','אוגוסט','ספטמבר','אוקטובר','נובמבר','דצמבר'],
+		monthNamesShort: ['1','2','3','4','5','6',
+		'7','8','9','10','11','12'],
+		dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
+		dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: true,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['he']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hr.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hr.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hr.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Croatian i18n for the jQuery UI date picker plugin. */
+/* Written by Vjekoslav Nesek. */
+jQuery(function($){
+	$.datepicker.regional['hr'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Siječanj','Veljača','Ožujak','Travanj','Svibanj','Lipanj',
+		'Srpanj','Kolovoz','Rujan','Listopad','Studeni','Prosinac'],
+		monthNamesShort: ['Sij','Velj','Ožu','Tra','Svi','Lip',
+		'Srp','Kol','Ruj','Lis','Stu','Pro'],
+		dayNames: ['Nedjelja','Ponedjeljak','Utorak','Srijeda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sri','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Tje',
+		dateFormat: 'dd.mm.yy.',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hr']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hu.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hu.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hu.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Hungarian initialisation for the jQuery UI date picker plugin. */
+/* Written by Istvan Karaszi (jquery@spam.raszi.hu). */
+jQuery(function($){
+	$.datepicker.regional['hu'] = {
+		closeText: 'bezárás',
+		prevText: '&laquo;&nbsp;vissza',
+		nextText: 'előre&nbsp;&raquo;',
+		currentText: 'ma',
+		monthNames: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június',
+		'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
+		monthNamesShort: ['Jan', 'Feb', 'Már', 'Ápr', 'Máj', 'Jún',
+		'Júl', 'Aug', 'Szep', 'Okt', 'Nov', 'Dec'],
+		dayNames: ['Vasárnap', 'Hétfö', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
+		dayNamesShort: ['Vas', 'Hét', 'Ked', 'Sze', 'Csü', 'Pén', 'Szo'],
+		dayNamesMin: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
+		weekHeader: 'Hé',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hu']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hy.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hy.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-hy.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/
+jQuery(function($){
+	$.datepicker.regional['hy'] = {
+		closeText: 'Փակել',
+		prevText: '&#x3c;Նախ.',
+		nextText: 'Հաջ.&#x3e;',
+		currentText: 'Այսօր',
+		monthNames: ['Հունվար','Փետրվար','Մարտ','Ապրիլ','Մայիս','Հունիս',
+		'Հուլիս','Օգոստոս','Սեպտեմբեր','Հոկտեմբեր','Նոյեմբեր','Դեկտեմբեր'],
+		monthNamesShort: ['Հունվ','Փետր','Մարտ','Ապր','Մայիս','Հունիս',
+		'Հուլ','Օգս','Սեպ','Հոկ','Նոյ','Դեկ'],
+		dayNames: ['կիրակի','եկուշաբթի','երեքշաբթի','չորեքշաբթի','հինգշաբթի','ուրբաթ','շաբաթ'],
+		dayNamesShort: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		dayNamesMin: ['կիր','երկ','երք','չրք','հնգ','ուրբ','շբթ'],
+		weekHeader: 'ՇԲՏ',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['hy']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-id.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-id.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-id.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Indonesian initialisation for the jQuery UI date picker plugin. */
+/* Written by Deden Fathurahman (dedenf@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['id'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;mundur',
+		nextText: 'maju&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Maret','April','Mei','Juni',
+		'Juli','Agustus','September','Oktober','Nopember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mei','Jun',
+		'Jul','Agus','Sep','Okt','Nop','Des'],
+		dayNames: ['Minggu','Senin','Selasa','Rabu','Kamis','Jumat','Sabtu'],
+		dayNamesShort: ['Min','Sen','Sel','Rab','kam','Jum','Sab'],
+		dayNamesMin: ['Mg','Sn','Sl','Rb','Km','jm','Sb'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['id']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-is.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-is.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-is.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Icelandic initialisation for the jQuery UI date picker plugin. */
+/* Written by Haukur H. Thorsson (haukur@eskill.is). */
+jQuery(function($){
+	$.datepicker.regional['is'] = {
+		closeText: 'Loka',
+		prevText: '&#x3c; Fyrri',
+		nextText: 'N&aelig;sti &#x3e;',
+		currentText: '&Iacute; dag',
+		monthNames: ['Jan&uacute;ar','Febr&uacute;ar','Mars','Apr&iacute;l','Ma&iacute','J&uacute;n&iacute;',
+		'J&uacute;l&iacute;','&Aacute;g&uacute;st','September','Okt&oacute;ber','N&oacute;vember','Desember'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Ma&iacute;','J&uacute;n',
+		'J&uacute;l','&Aacute;g&uacute;','Sep','Okt','N&oacute;v','Des'],
+		dayNames: ['Sunnudagur','M&aacute;nudagur','&THORN;ri&eth;judagur','Mi&eth;vikudagur','Fimmtudagur','F&ouml;studagur','Laugardagur'],
+		dayNamesShort: ['Sun','M&aacute;n','&THORN;ri','Mi&eth;','Fim','F&ouml;s','Lau'],
+		dayNamesMin: ['Su','M&aacute;','&THORN;r','Mi','Fi','F&ouml;','La'],
+		weekHeader: 'Vika',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['is']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-it.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-it.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-it.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Italian initialisation for the jQuery UI date picker plugin. */
+/* Written by Antonello Pasella (antonello.pasella@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['it'] = {
+		closeText: 'Chiudi',
+		prevText: '&#x3c;Prec',
+		nextText: 'Succ&#x3e;',
+		currentText: 'Oggi',
+		monthNames: ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',
+			'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'],
+		monthNamesShort: ['Gen','Feb','Mar','Apr','Mag','Giu',
+			'Lug','Ago','Set','Ott','Nov','Dic'],
+		dayNames: ['Domenica','Luned&#236','Marted&#236','Mercoled&#236','Gioved&#236','Venerd&#236','Sabato'],
+		dayNamesShort: ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'],
+		dayNamesMin: ['Do','Lu','Ma','Me','Gi','Ve','Sa'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['it']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ja.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ja.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ja.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Japanese initialisation for the jQuery UI date picker plugin. */
+/* Written by Kentaro SATO (kentaro@ranvis.com). */
+jQuery(function($){
+	$.datepicker.regional['ja'] = {
+		closeText: '閉じる',
+		prevText: '&#x3c;前',
+		nextText: '次&#x3e;',
+		currentText: '今日',
+		monthNames: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		monthNamesShort: ['1月','2月','3月','4月','5月','6月',
+		'7月','8月','9月','10月','11月','12月'],
+		dayNames: ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日'],
+		dayNamesShort: ['日','月','火','水','木','金','土'],
+		dayNamesMin: ['日','月','火','水','木','金','土'],
+		weekHeader: '週',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['ja']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ko.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ko.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ko.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Korean initialisation for the jQuery calendar extension. */
+/* Written by DaeKwon Kang (ncrash.dk@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ko'] = {
+		closeText: '닫기',
+		prevText: '이전달',
+		nextText: '다음달',
+		currentText: '오늘',
+		monthNames: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		monthNamesShort: ['1월(JAN)','2월(FEB)','3월(MAR)','4월(APR)','5월(MAY)','6월(JUN)',
+		'7월(JUL)','8월(AUG)','9월(SEP)','10월(OCT)','11월(NOV)','12월(DEC)'],
+		dayNames: ['일','월','화','수','목','금','토'],
+		dayNamesShort: ['일','월','화','수','목','금','토'],
+		dayNamesMin: ['일','월','화','수','목','금','토'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: '년'};
+	$.datepicker.setDefaults($.datepicker.regional['ko']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-kz.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-kz.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-kz.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['kz'] = {
+		closeText: 'Жабу',
+		prevText: '&#x3c;Алдыңғы',
+		nextText: 'Келесі&#x3e;',
+		currentText: 'Бүгін',
+		monthNames: ['Қаңтар','Ақпан','Наурыз','Сәуір','Мамыр','Маусым',
+		'Шілде','Тамыз','Қыркүйек','Қазан','Қараша','Желтоқсан'],
+		monthNamesShort: ['Қаң','Ақп','Нау','Сәу','Мам','Мау',
+		'Шіл','Там','Қыр','Қаз','Қар','Жел'],
+		dayNames: ['Жексенбі','Дүйсенбі','Сейсенбі','Сәрсенбі','Бейсенбі','Жұма','Сенбі'],
+		dayNamesShort: ['жкс','дсн','ссн','срс','бсн','жма','снб'],
+		dayNamesMin: ['Жк','Дс','Сс','Ср','Бс','Жм','Сн'],
+		weekHeader: 'Не',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['kz']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lt.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lt.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lt.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas@avalon.lt> */
+jQuery(function($){
+	$.datepicker.regional['lt'] = {
+		closeText: 'Uždaryti',
+		prevText: '&#x3c;Atgal',
+		nextText: 'Pirmyn&#x3e;',
+		currentText: 'Šiandien',
+		monthNames: ['Sausis','Vasaris','Kovas','Balandis','Gegužė','Birželis',
+		'Liepa','Rugpjūtis','Rugsėjis','Spalis','Lapkritis','Gruodis'],
+		monthNamesShort: ['Sau','Vas','Kov','Bal','Geg','Bir',
+		'Lie','Rugp','Rugs','Spa','Lap','Gru'],
+		dayNames: ['sekmadienis','pirmadienis','antradienis','trečiadienis','ketvirtadienis','penktadienis','šeštadienis'],
+		dayNamesShort: ['sek','pir','ant','tre','ket','pen','šeš'],
+		dayNamesMin: ['Se','Pr','An','Tr','Ke','Pe','Še'],
+		weekHeader: 'Wk',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lt']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lv.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lv.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-lv.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* @author Arturas Paleicikas <arturas.paleicikas@metasite.net> */
+jQuery(function($){
+	$.datepicker.regional['lv'] = {
+		closeText: 'Aizvērt',
+		prevText: 'Iepr',
+		nextText: 'Nāka',
+		currentText: 'Šodien',
+		monthNames: ['Janvāris','Februāris','Marts','Aprīlis','Maijs','Jūnijs',
+		'Jūlijs','Augusts','Septembris','Oktobris','Novembris','Decembris'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Mai','Jūn',
+		'Jūl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['svētdiena','pirmdiena','otrdiena','trešdiena','ceturtdiena','piektdiena','sestdiena'],
+		dayNamesShort: ['svt','prm','otr','tre','ctr','pkt','sst'],
+		dayNamesMin: ['Sv','Pr','Ot','Tr','Ct','Pk','Ss'],
+		weekHeader: 'Nav',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['lv']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ml.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ml.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ml.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Saji Nediyanchath (saji89@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ml'] = {
+		closeText: 'ശരി',
+		prevText: 'മുന്നത്തെ',  
+		nextText: 'അടുത്തത് ',
+		currentText: 'ഇന്ന്',
+		monthNames: ['ജനുവരി','ഫെബ്രുവരി','മാര്‍ച്ച്','ഏപ്രില്‍','മേയ്','ജൂണ്‍',
+		'ജൂലൈ','ആഗസ്റ്റ്','സെപ്റ്റംബര്‍','ഒക്ടോബര്‍','നവംബര്‍','ഡിസംബര്‍'],
+		monthNamesShort: ['ജനു', 'ഫെബ്', 'മാര്‍', 'ഏപ്രി', 'മേയ്', 'ജൂണ്‍',
+		'ജൂലാ', 'ആഗ', 'സെപ്', 'ഒക്ടോ', 'നവം', 'ഡിസ'],
+		dayNames: ['ഞായര്‍', 'തിങ്കള്‍', 'ചൊവ്വ', 'ബുധന്‍', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+		dayNamesShort: ['ഞായ', 'തിങ്ക', 'ചൊവ്വ', 'ബുധ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],
+		dayNamesMin: ['ഞാ','തി','ചൊ','ബു','വ്യാ','വെ','ശ'],
+		weekHeader: 'ആ',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ml']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ms.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ms.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ms.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Malaysian initialisation for the jQuery UI date picker plugin. */
+/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */
+jQuery(function($){
+	$.datepicker.regional['ms'] = {
+		closeText: 'Tutup',
+		prevText: '&#x3c;Sebelum',
+		nextText: 'Selepas&#x3e;',
+		currentText: 'hari ini',
+		monthNames: ['Januari','Februari','Mac','April','Mei','Jun',
+		'Julai','Ogos','September','Oktober','November','Disember'],
+		monthNamesShort: ['Jan','Feb','Mac','Apr','Mei','Jun',
+		'Jul','Ogo','Sep','Okt','Nov','Dis'],
+		dayNames: ['Ahad','Isnin','Selasa','Rabu','Khamis','Jumaat','Sabtu'],
+		dayNamesShort: ['Aha','Isn','Sel','Rab','kha','Jum','Sab'],
+		dayNamesMin: ['Ah','Is','Se','Ra','Kh','Ju','Sa'],
+		weekHeader: 'Mg',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ms']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-nl.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-nl.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-nl.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Mathias Bynens <http://mathiasbynens.be/> */
+jQuery(function($){
+	$.datepicker.regional.nl = {
+		closeText: 'Sluiten',
+		prevText: '←',
+		nextText: '→',
+		currentText: 'Vandaag',
+		monthNames: ['januari', 'februari', 'maart', 'april', 'mei', 'juni',
+		'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
+		monthNamesShort: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun',
+		'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
+		dayNames: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
+		dayNamesShort: ['zon', 'maa', 'din', 'woe', 'don', 'vri', 'zat'],
+		dayNamesMin: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional.nl);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-no.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-no.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-no.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Norwegian initialisation for the jQuery UI date picker plugin. */
+/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */
+
+jQuery(function($){
+  $.datepicker.regional['no'] = {
+    closeText: 'Lukk',
+    prevText: '&laquo;Forrige',
+    nextText: 'Neste&raquo;',
+    currentText: 'I dag',
+    monthNames: ['januar','februar','mars','april','mai','juni','juli','august','september','oktober','november','desember'],
+    monthNamesShort: ['jan','feb','mar','apr','mai','jun','jul','aug','sep','okt','nov','des'],
+    dayNamesShort: ['søn','man','tir','ons','tor','fre','lør'],
+    dayNames: ['søndag','mandag','tirsdag','onsdag','torsdag','fredag','lørdag'],
+    dayNamesMin: ['sø','ma','ti','on','to','fr','lø'],
+    weekHeader: 'Uke',
+    dateFormat: 'dd.mm.yy',
+    firstDay: 1,
+    isRTL: false,
+    showMonthAfterYear: false,
+    yearSuffix: ''
+  };
+  $.datepicker.setDefaults($.datepicker.regional['no']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pl.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pl.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pl.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Polish initialisation for the jQuery UI date picker plugin. */
+/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pl'] = {
+		closeText: 'Zamknij',
+		prevText: '&#x3c;Poprzedni',
+		nextText: 'Następny&#x3e;',
+		currentText: 'Dziś',
+		monthNames: ['Styczeń','Luty','Marzec','Kwiecień','Maj','Czerwiec',
+		'Lipiec','Sierpień','Wrzesień','Październik','Listopad','Grudzień'],
+		monthNamesShort: ['Sty','Lu','Mar','Kw','Maj','Cze',
+		'Lip','Sie','Wrz','Pa','Lis','Gru'],
+		dayNames: ['Niedziela','Poniedziałek','Wtorek','Środa','Czwartek','Piątek','Sobota'],
+		dayNamesShort: ['Nie','Pn','Wt','Śr','Czw','Pt','So'],
+		dayNamesMin: ['N','Pn','Wt','Śr','Cz','Pt','So'],
+		weekHeader: 'Tydz',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pl']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt-BR.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt-BR.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt-BR.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Brazilian initialisation for the jQuery UI date picker plugin. */
+/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['pt-BR'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Pr&oacute;ximo&#x3e;',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sm',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt-BR']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-pt.js	(revision 14585)
@@ -0,0 +1,22 @@
+/* Portuguese initialisation for the jQuery UI date picker plugin. */
+jQuery(function($){
+	$.datepicker.regional['pt'] = {
+		closeText: 'Fechar',
+		prevText: '&#x3c;Anterior',
+		nextText: 'Seguinte',
+		currentText: 'Hoje',
+		monthNames: ['Janeiro','Fevereiro','Mar&ccedil;o','Abril','Maio','Junho',
+		'Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'],
+		monthNamesShort: ['Jan','Fev','Mar','Abr','Mai','Jun',
+		'Jul','Ago','Set','Out','Nov','Dez'],
+		dayNames: ['Domingo','Segunda-feira','Ter&ccedil;a-feira','Quarta-feira','Quinta-feira','Sexta-feira','S&aacute;bado'],
+		dayNamesShort: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		dayNamesMin: ['Dom','Seg','Ter','Qua','Qui','Sex','S&aacute;b'],
+		weekHeader: 'Sem',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['pt']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-rm.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-rm.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-rm.js	(revision 14585)
@@ -0,0 +1,21 @@
+/* Romansh initialisation for the jQuery UI date picker plugin. */
+/* Written by Yvonne Gienal (yvonne.gienal@educa.ch). */
+jQuery(function($){
+	$.datepicker.regional['rm'] = {
+		closeText: 'Serrar',
+		prevText: '&#x3c;Suandant',
+		nextText: 'Precedent&#x3e;',
+		currentText: 'Actual',
+		monthNames: ['Schaner','Favrer','Mars','Avrigl','Matg','Zercladur', 'Fanadur','Avust','Settember','October','November','December'],
+		monthNamesShort: ['Scha','Fev','Mar','Avr','Matg','Zer', 'Fan','Avu','Sett','Oct','Nov','Dec'],
+		dayNames: ['Dumengia','Glindesdi','Mardi','Mesemna','Gievgia','Venderdi','Sonda'],
+		dayNamesShort: ['Dum','Gli','Mar','Mes','Gie','Ven','Som'],
+		dayNamesMin: ['Du','Gl','Ma','Me','Gi','Ve','So'],
+		weekHeader: 'emna',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['rm']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ro.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ro.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ro.js	(revision 14585)
@@ -0,0 +1,26 @@
+/* Romanian initialisation for the jQuery UI date picker plugin.
+ *
+ * Written by Edmond L. (ll_edmond@walla.com)
+ * and Ionut G. Stan (ionut.g.stan@gmail.com)
+ */
+jQuery(function($){
+	$.datepicker.regional['ro'] = {
+		closeText: 'Închide',
+		prevText: '&laquo; Luna precedentă',
+		nextText: 'Luna următoare &raquo;',
+		currentText: 'Azi',
+		monthNames: ['Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie',
+		'Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie'],
+		monthNamesShort: ['Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun',
+		'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+		dayNames: ['Duminică', 'Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă'],
+		dayNamesShort: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],
+		dayNamesMin: ['Du','Lu','Ma','Mi','Jo','Vi','Sâ'],
+		weekHeader: 'Săpt',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ro']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ru.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ru.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ru.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Andrew Stromnov (stromnov@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['ru'] = {
+		closeText: 'Закрыть',
+		prevText: '&#x3c;Пред',
+		nextText: 'След&#x3e;',
+		currentText: 'Сегодня',
+		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
+		'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
+		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+		'Июл','Авг','Сен','Окт','Ноя','Дек'],
+		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
+		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Нед',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ru']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sk.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sk.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sk.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Slovak initialisation for the jQuery UI date picker plugin. */
+/* Written by Vojtech Rinik (vojto@hmm.sk). */
+jQuery(function($){
+	$.datepicker.regional['sk'] = {
+		closeText: 'Zavrieť',
+		prevText: '&#x3c;Predchádzajúci',
+		nextText: 'Nasledujúci&#x3e;',
+		currentText: 'Dnes',
+		monthNames: ['Január','Február','Marec','Apríl','Máj','Jún',
+		'Júl','August','September','Október','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Máj','Jún',
+		'Júl','Aug','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota'],
+		dayNamesShort: ['Ned','Pon','Uto','Str','Štv','Pia','Sob'],
+		dayNamesMin: ['Ne','Po','Ut','St','Št','Pia','So'],
+		weekHeader: 'Ty',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sk']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sl.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sl.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sl.js	(revision 14585)
@@ -0,0 +1,24 @@
+/* Slovenian initialisation for the jQuery UI date picker plugin. */
+/* Written by Jaka Jancar (jaka@kubje.org). */
+/* c = &#x10D;, s = &#x161; z = &#x17E; C = &#x10C; S = &#x160; Z = &#x17D; */
+jQuery(function($){
+	$.datepicker.regional['sl'] = {
+		closeText: 'Zapri',
+		prevText: '&lt;Prej&#x161;nji',
+		nextText: 'Naslednji&gt;',
+		currentText: 'Trenutni',
+		monthNames: ['Januar','Februar','Marec','April','Maj','Junij',
+		'Julij','Avgust','September','Oktober','November','December'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljek','Torek','Sreda','&#x10C;etrtek','Petek','Sobota'],
+		dayNamesShort: ['Ned','Pon','Tor','Sre','&#x10C;et','Pet','Sob'],
+		dayNamesMin: ['Ne','Po','To','Sr','&#x10C;e','Pe','So'],
+		weekHeader: 'Teden',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sl']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sq.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sq.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sq.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Albanian initialisation for the jQuery UI date picker plugin. */
+/* Written by Flakron Bytyqi (flakron@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['sq'] = {
+		closeText: 'mbylle',
+		prevText: '&#x3c;mbrapa',
+		nextText: 'Përpara&#x3e;',
+		currentText: 'sot',
+		monthNames: ['Janar','Shkurt','Mars','Prill','Maj','Qershor',
+		'Korrik','Gusht','Shtator','Tetor','Nëntor','Dhjetor'],
+		monthNamesShort: ['Jan','Shk','Mar','Pri','Maj','Qer',
+		'Kor','Gus','Sht','Tet','Nën','Dhj'],
+		dayNames: ['E Diel','E Hënë','E Martë','E Mërkurë','E Enjte','E Premte','E Shtune'],
+		dayNamesShort: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		dayNamesMin: ['Di','Hë','Ma','Më','En','Pr','Sh'],
+		weekHeader: 'Ja',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sq']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr-SR.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr-SR.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr-SR.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr-SR'] = {
+		closeText: 'Zatvori',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Danas',
+		monthNames: ['Januar','Februar','Mart','April','Maj','Jun',
+		'Jul','Avgust','Septembar','Oktobar','Novembar','Decembar'],
+		monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+		'Jul','Avg','Sep','Okt','Nov','Dec'],
+		dayNames: ['Nedelja','Ponedeljak','Utorak','Sreda','Četvrtak','Petak','Subota'],
+		dayNamesShort: ['Ned','Pon','Uto','Sre','Čet','Pet','Sub'],
+		dayNamesMin: ['Ne','Po','Ut','Sr','Če','Pe','Su'],
+		weekHeader: 'Sed',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr-SR']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sr.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Serbian i18n for the jQuery UI date picker plugin. */
+/* Written by Dejan Dimić. */
+jQuery(function($){
+	$.datepicker.regional['sr'] = {
+		closeText: 'Затвори',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Данас',
+		monthNames: ['Јануар','Фебруар','Март','Април','Мај','Јун',
+		'Јул','Август','Септембар','Октобар','Новембар','Децембар'],
+		monthNamesShort: ['Јан','Феб','Мар','Апр','Мај','Јун',
+		'Јул','Авг','Сеп','Окт','Нов','Дец'],
+		dayNames: ['Недеља','Понедељак','Уторак','Среда','Четвртак','Петак','Субота'],
+		dayNamesShort: ['Нед','Пон','Уто','Сре','Чет','Пет','Суб'],
+		dayNamesMin: ['Не','По','Ут','Ср','Че','Пе','Су'],
+		weekHeader: 'Сед',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['sr']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sv.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sv.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-sv.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Swedish initialisation for the jQuery UI date picker plugin. */
+/* Written by Anders Ekdahl ( anders@nomadiz.se). */
+jQuery(function($){
+    $.datepicker.regional['sv'] = {
+		closeText: 'Stäng',
+        prevText: '&laquo;Förra',
+		nextText: 'Nästa&raquo;',
+		currentText: 'Idag',
+        monthNames: ['Januari','Februari','Mars','April','Maj','Juni',
+        'Juli','Augusti','September','Oktober','November','December'],
+        monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun',
+        'Jul','Aug','Sep','Okt','Nov','Dec'],
+		dayNamesShort: ['Sön','Mån','Tis','Ons','Tor','Fre','Lör'],
+		dayNames: ['Söndag','Måndag','Tisdag','Onsdag','Torsdag','Fredag','Lördag'],
+		dayNamesMin: ['Sö','Må','Ti','On','To','Fr','Lö'],
+		weekHeader: 'Ve',
+        dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+    $.datepicker.setDefaults($.datepicker.regional['sv']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ta.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ta.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-ta.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by S A Sureshkumar (saskumar@live.com). */
+jQuery(function($){
+	$.datepicker.regional['ta'] = {
+		closeText: 'மூடு',
+		prevText: 'முன்னையது',
+		nextText: 'அடுத்தது',
+		currentText: 'இன்று',
+		monthNames: ['தை','மாசி','பங்குனி','சித்திரை','வைகாசி','ஆனி',
+		'ஆடி','ஆவணி','புரட்டாசி','ஐப்பசி','கார்த்திகை','மார்கழி'],
+		monthNamesShort: ['தை','மாசி','பங்','சித்','வைகா','ஆனி',
+		'ஆடி','ஆவ','புர','ஐப்','கார்','மார்'],
+		dayNames: ['ஞாயிற்றுக்கிழமை','திங்கட்கிழமை','செவ்வாய்க்கிழமை','புதன்கிழமை','வியாழக்கிழமை','வெள்ளிக்கிழமை','சனிக்கிழமை'],
+		dayNamesShort: ['ஞாயிறு','திங்கள்','செவ்வாய்','புதன்','வியாழன்','வெள்ளி','சனி'],
+		dayNamesMin: ['ஞா','தி','செ','பு','வி','வெ','ச'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['ta']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-th.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-th.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-th.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Thai initialisation for the jQuery UI date picker plugin. */
+/* Written by pipo (pipo@sixhead.com). */
+jQuery(function($){
+	$.datepicker.regional['th'] = {
+		closeText: 'ปิด',
+		prevText: '&laquo;&nbsp;ย้อน',
+		nextText: 'ถัดไป&nbsp;&raquo;',
+		currentText: 'วันนี้',
+		monthNames: ['มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน',
+		'กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม'],
+		monthNamesShort: ['ม.ค.','ก.พ.','มี.ค.','เม.ย.','พ.ค.','มิ.ย.',
+		'ก.ค.','ส.ค.','ก.ย.','ต.ค.','พ.ย.','ธ.ค.'],
+		dayNames: ['อาทิตย์','จันทร์','อังคาร','พุธ','พฤหัสบดี','ศุกร์','เสาร์'],
+		dayNamesShort: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		dayNamesMin: ['อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.'],
+		weekHeader: 'Wk',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['th']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tj.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tj.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tj.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Tajiki (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Abdurahmon Saidov (saidovab@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['tj'] = {
+		closeText: 'Идома',
+		prevText: '&#x3c;Қафо',
+		nextText: 'Пеш&#x3e;',
+		currentText: 'Имрӯз',
+		monthNames: ['Январ','Феврал','Март','Апрел','Май','Июн',
+		'Июл','Август','Сентябр','Октябр','Ноябр','Декабр'],
+		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн',
+		'Июл','Авг','Сен','Окт','Ноя','Дек'],
+		dayNames: ['якшанбе','душанбе','сешанбе','чоршанбе','панҷшанбе','ҷумъа','шанбе'],
+		dayNamesShort: ['якш','душ','сеш','чор','пан','ҷум','шан'],
+		dayNamesMin: ['Як','Дш','Сш','Чш','Пш','Ҷм','Шн'],
+		weekHeader: 'Хф',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tj']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tr.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tr.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-tr.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Turkish initialisation for the jQuery UI date picker plugin. */
+/* Written by Izzet Emre Erkan (kara@karalamalar.net). */
+jQuery(function($){
+	$.datepicker.regional['tr'] = {
+		closeText: 'kapat',
+		prevText: '&#x3c;geri',
+		nextText: 'ileri&#x3e',
+		currentText: 'bugün',
+		monthNames: ['Ocak','Şubat','Mart','Nisan','Mayıs','Haziran',
+		'Temmuz','Ağustos','Eylül','Ekim','Kasım','Aralık'],
+		monthNamesShort: ['Oca','Şub','Mar','Nis','May','Haz',
+		'Tem','Ağu','Eyl','Eki','Kas','Ara'],
+		dayNames: ['Pazar','Pazartesi','Salı','Çarşamba','Perşembe','Cuma','Cumartesi'],
+		dayNamesShort: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		dayNamesMin: ['Pz','Pt','Sa','Ça','Pe','Cu','Ct'],
+		weekHeader: 'Hf',
+		dateFormat: 'dd.mm.yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['tr']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-uk.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-uk.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-uk.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Ukrainian (UTF-8) initialisation for the jQuery UI date picker plugin. */
+/* Written by Maxim Drogobitskiy (maxdao@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['uk'] = {
+		closeText: 'Закрити',
+		prevText: '&#x3c;',
+		nextText: '&#x3e;',
+		currentText: 'Сьогодні',
+		monthNames: ['Січень','Лютий','Березень','Квітень','Травень','Червень',
+		'Липень','Серпень','Вересень','Жовтень','Листопад','Грудень'],
+		monthNamesShort: ['Січ','Лют','Бер','Кві','Тра','Чер',
+		'Лип','Сер','Вер','Жов','Лис','Гру'],
+		dayNames: ['неділя','понеділок','вівторок','середа','четвер','п’ятниця','субота'],
+		dayNamesShort: ['нед','пнд','вів','срд','чтв','птн','сбт'],
+		dayNamesMin: ['Нд','Пн','Вт','Ср','Чт','Пт','Сб'],
+		weekHeader: 'Не',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['uk']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-vi.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-vi.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-vi.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Vietnamese initialisation for the jQuery UI date picker plugin. */
+/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */
+jQuery(function($){
+	$.datepicker.regional['vi'] = {
+		closeText: 'Đóng',
+		prevText: '&#x3c;Trước',
+		nextText: 'Tiếp&#x3e;',
+		currentText: 'Hôm nay',
+		monthNames: ['Tháng Một', 'Tháng Hai', 'Tháng Ba', 'Tháng Tư', 'Tháng Năm', 'Tháng Sáu',
+		'Tháng Bảy', 'Tháng Tám', 'Tháng Chín', 'Tháng Mười', 'Tháng Mười Một', 'Tháng Mười Hai'],
+		monthNamesShort: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6',
+		'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],
+		dayNames: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],
+		dayNamesShort: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		dayNamesMin: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],
+		weekHeader: 'Tu',
+		dateFormat: 'dd/mm/yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: false,
+		yearSuffix: ''};
+	$.datepicker.setDefaults($.datepicker.regional['vi']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-CN.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-CN.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-CN.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Cloudream (cloudream@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-CN'] = {
+		closeText: '关闭',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy-mm-dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-CN']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-HK.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-HK.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-HK.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by SCCY (samuelcychan@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-HK'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'dd-mm-yy',
+		firstDay: 0,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-HK']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-TW.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-TW.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/i18n/jquery.ui.datepicker-zh-TW.js	(revision 14585)
@@ -0,0 +1,23 @@
+/* Chinese initialisation for the jQuery UI date picker plugin. */
+/* Written by Ressol (ressol@gmail.com). */
+jQuery(function($){
+	$.datepicker.regional['zh-TW'] = {
+		closeText: '關閉',
+		prevText: '&#x3c;上月',
+		nextText: '下月&#x3e;',
+		currentText: '今天',
+		monthNames: ['一月','二月','三月','四月','五月','六月',
+		'七月','八月','九月','十月','十一月','十二月'],
+		monthNamesShort: ['一','二','三','四','五','六',
+		'七','八','九','十','十一','十二'],
+		dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
+		dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
+		dayNamesMin: ['日','一','二','三','四','五','六'],
+		weekHeader: '周',
+		dateFormat: 'yy/mm/dd',
+		firstDay: 1,
+		isRTL: false,
+		showMonthAfterYear: true,
+		yearSuffix: '年'};
+	$.datepicker.setDefaults($.datepicker.regional['zh-TW']);
+});
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.blind.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.blind.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.blind.js	(revision 14585)
@@ -0,0 +1,49 @@
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.blind = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'vertical') ? 'height' : 'width';
+		var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width();
+		if(mode == 'show') wrapper.css(ref, 0); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = mode == 'show' ? distance : 0;
+
+		// Animate
+		wrapper.animate(animation, o.duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.bounce.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.bounce.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.bounce.js	(revision 14585)
@@ -0,0 +1,78 @@
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.bounce = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'up'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 5; // Default # of times
+		var speed = o.duration || 250; // Default speed per bounce
+		if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+		if (mode == 'hide') distance = distance / (times * 2);
+		if (mode != 'hide') times--;
+
+		// Animate
+		if (mode == 'show') { // Show Bounce
+			var animation = {opacity: 1};
+			animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation, speed / 2, o.options.easing);
+			distance = distance / 2;
+			times--;
+		};
+		for (var i = 0; i < times; i++) { // Bounces
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing);
+			distance = (mode == 'hide') ? distance * 2 : distance / 2;
+		};
+		if (mode == 'hide') { // Last Bounce
+			var animation = {opacity: 0};
+			animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+			el.animate(animation, speed / 2, o.options.easing, function(){
+				el.hide(); // Hide
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		} else {
+			var animation1 = {}, animation2 = {};
+			animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance;
+			animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance;
+			el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){
+				$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+				if(o.callback) o.callback.apply(this, arguments); // Callback
+			});
+		};
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.clip.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.clip.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.clip.js	(revision 14585)
@@ -0,0 +1,54 @@
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.clip = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','height','width'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'vertical'; // Default direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var animate = el[0].tagName == 'IMG' ? wrapper : el;
+		var ref = {
+			size: (direction == 'vertical') ? 'height' : 'width',
+			position: (direction == 'vertical') ? 'top' : 'left'
+		};
+		var distance = (direction == 'vertical') ? animate.height() : animate.width();
+		if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref.size] = mode == 'show' ? distance : 0;
+		animation[ref.position] = mode == 'show' ? 0 : distance / 2;
+
+		// Animate
+		animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.core.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.core.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.core.js	(revision 14585)
@@ -0,0 +1,763 @@
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+;jQuery.effects || (function($, undefined) {
+
+$.effects = {};
+
+
+
+/******************************************************************************/
+/****************************** COLOR ANIMATIONS ******************************/
+/******************************************************************************/
+
+// override the animation for color styles
+$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
+	'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
+function(i, attr) {
+	$.fx.step[attr] = function(fx) {
+		if (!fx.colorInit) {
+			fx.start = getColor(fx.elem, attr);
+			fx.end = getRGB(fx.end);
+			fx.colorInit = true;
+		}
+
+		fx.elem.style[attr] = 'rgb(' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
+			Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
+	};
+});
+
+// Color Conversion functions from highlightFade
+// By Blair Mitchelmore
+// http://jquery.offput.ca/highlightFade/
+
+// Parse strings looking for color tuples [255,255,255]
+function getRGB(color) {
+		var result;
+
+		// Check if we're already dealing with an array of colors
+		if ( color && color.constructor == Array && color.length == 3 )
+				return color;
+
+		// Look for rgb(num,num,num)
+		if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
+				return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];
+
+		// Look for rgb(num%,num%,num%)
+		if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
+				return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
+
+		// Look for #a0b1c2
+		if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
+				return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
+
+		// Look for #fff
+		if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
+				return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
+
+		// Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+		if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
+				return colors['transparent'];
+
+		// Otherwise, we're most likely dealing with a named color
+		return colors[$.trim(color).toLowerCase()];
+}
+
+function getColor(elem, attr) {
+		var color;
+
+		do {
+				color = $.curCSS(elem, attr);
+
+				// Keep going until we find an element that has color, or we hit the body
+				if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
+						break;
+
+				attr = "backgroundColor";
+		} while ( elem = elem.parentNode );
+
+		return getRGB(color);
+};
+
+// Some named colors to work with
+// From Interface by Stefan Petre
+// http://interface.eyecon.ro/
+
+var colors = {
+	aqua:[0,255,255],
+	azure:[240,255,255],
+	beige:[245,245,220],
+	black:[0,0,0],
+	blue:[0,0,255],
+	brown:[165,42,42],
+	cyan:[0,255,255],
+	darkblue:[0,0,139],
+	darkcyan:[0,139,139],
+	darkgrey:[169,169,169],
+	darkgreen:[0,100,0],
+	darkkhaki:[189,183,107],
+	darkmagenta:[139,0,139],
+	darkolivegreen:[85,107,47],
+	darkorange:[255,140,0],
+	darkorchid:[153,50,204],
+	darkred:[139,0,0],
+	darksalmon:[233,150,122],
+	darkviolet:[148,0,211],
+	fuchsia:[255,0,255],
+	gold:[255,215,0],
+	green:[0,128,0],
+	indigo:[75,0,130],
+	khaki:[240,230,140],
+	lightblue:[173,216,230],
+	lightcyan:[224,255,255],
+	lightgreen:[144,238,144],
+	lightgrey:[211,211,211],
+	lightpink:[255,182,193],
+	lightyellow:[255,255,224],
+	lime:[0,255,0],
+	magenta:[255,0,255],
+	maroon:[128,0,0],
+	navy:[0,0,128],
+	olive:[128,128,0],
+	orange:[255,165,0],
+	pink:[255,192,203],
+	purple:[128,0,128],
+	violet:[128,0,128],
+	red:[255,0,0],
+	silver:[192,192,192],
+	white:[255,255,255],
+	yellow:[255,255,0],
+	transparent: [255,255,255]
+};
+
+
+
+/******************************************************************************/
+/****************************** CLASS ANIMATIONS ******************************/
+/******************************************************************************/
+
+var classAnimationActions = ['add', 'remove', 'toggle'],
+	shorthandStyles = {
+		border: 1,
+		borderBottom: 1,
+		borderColor: 1,
+		borderLeft: 1,
+		borderRight: 1,
+		borderTop: 1,
+		borderWidth: 1,
+		margin: 1,
+		padding: 1
+	};
+
+function getElementStyles() {
+	var style = document.defaultView
+			? document.defaultView.getComputedStyle(this, null)
+			: this.currentStyle,
+		newStyle = {},
+		key,
+		camelCase;
+
+	// webkit enumerates style porperties
+	if (style && style.length && style[0] && style[style[0]]) {
+		var len = style.length;
+		while (len--) {
+			key = style[len];
+			if (typeof style[key] == 'string') {
+				camelCase = key.replace(/\-(\w)/g, function(all, letter){
+					return letter.toUpperCase();
+				});
+				newStyle[camelCase] = style[key];
+			}
+		}
+	} else {
+		for (key in style) {
+			if (typeof style[key] === 'string') {
+				newStyle[key] = style[key];
+			}
+		}
+	}
+	
+	return newStyle;
+}
+
+function filterStyles(styles) {
+	var name, value;
+	for (name in styles) {
+		value = styles[name];
+		if (
+			// ignore null and undefined values
+			value == null ||
+			// ignore functions (when does this occur?)
+			$.isFunction(value) ||
+			// shorthand styles that need to be expanded
+			name in shorthandStyles ||
+			// ignore scrollbars (break in IE)
+			(/scrollbar/).test(name) ||
+
+			// only colors or values that can be converted to numbers
+			(!(/color/i).test(name) && isNaN(parseFloat(value)))
+		) {
+			delete styles[name];
+		}
+	}
+	
+	return styles;
+}
+
+function styleDifference(oldStyle, newStyle) {
+	var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459
+		name;
+
+	for (name in newStyle) {
+		if (oldStyle[name] != newStyle[name]) {
+			diff[name] = newStyle[name];
+		}
+	}
+
+	return diff;
+}
+
+$.effects.animateClass = function(value, duration, easing, callback) {
+	if ($.isFunction(easing)) {
+		callback = easing;
+		easing = null;
+	}
+
+	return this.queue(function() {
+		var that = $(this),
+			originalStyleAttr = that.attr('style') || ' ',
+			originalStyle = filterStyles(getElementStyles.call(this)),
+			newStyle,
+			className = that.attr('class');
+
+		$.each(classAnimationActions, function(i, action) {
+			if (value[action]) {
+				that[action + 'Class'](value[action]);
+			}
+		});
+		newStyle = filterStyles(getElementStyles.call(this));
+		that.attr('class', className);
+
+		that.animate(styleDifference(originalStyle, newStyle), {
+			queue: false,
+			duration: duration,
+			easing: easing,
+			complete: function() {
+				$.each(classAnimationActions, function(i, action) {
+					if (value[action]) { that[action + 'Class'](value[action]); }
+				});
+				// work around bug in IE by clearing the cssText before setting it
+				if (typeof that.attr('style') == 'object') {
+					that.attr('style').cssText = '';
+					that.attr('style').cssText = originalStyleAttr;
+				} else {
+					that.attr('style', originalStyleAttr);
+				}
+				if (callback) { callback.apply(this, arguments); }
+				$.dequeue( this );
+			}
+		});
+	});
+};
+
+$.fn.extend({
+	_addClass: $.fn.addClass,
+	addClass: function(classNames, speed, easing, callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames);
+	},
+
+	_removeClass: $.fn.removeClass,
+	removeClass: function(classNames,speed,easing,callback) {
+		return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames);
+	},
+
+	_toggleClass: $.fn.toggleClass,
+	toggleClass: function(classNames, force, speed, easing, callback) {
+		if ( typeof force == "boolean" || force === undefined ) {
+			if ( !speed ) {
+				// without speed parameter;
+				return this._toggleClass(classNames, force);
+			} else {
+				return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]);
+			}
+		} else {
+			// without switch parameter;
+			return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]);
+		}
+	},
+
+	switchClass: function(remove,add,speed,easing,callback) {
+		return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]);
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EFFECTS **********************************/
+/******************************************************************************/
+
+$.extend($.effects, {
+	version: "1.8.16",
+
+	// Saves a set of properties in a data storage
+	save: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]);
+		}
+	},
+
+	// Restores a set of previously saved properties from a data storage
+	restore: function(element, set) {
+		for(var i=0; i < set.length; i++) {
+			if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i]));
+		}
+	},
+
+	setMode: function(el, mode) {
+		if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle
+		return mode;
+	},
+
+	getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value
+		// this should be a little more flexible in the future to handle a string & hash
+		var y, x;
+		switch (origin[0]) {
+			case 'top': y = 0; break;
+			case 'middle': y = 0.5; break;
+			case 'bottom': y = 1; break;
+			default: y = origin[0] / original.height;
+		};
+		switch (origin[1]) {
+			case 'left': x = 0; break;
+			case 'center': x = 0.5; break;
+			case 'right': x = 1; break;
+			default: x = origin[1] / original.width;
+		};
+		return {x: x, y: y};
+	},
+
+	// Wraps the element around a wrapper that copies position properties
+	createWrapper: function(element) {
+
+		// if the element is already wrapped, return it
+		if (element.parent().is('.ui-effects-wrapper')) {
+			return element.parent();
+		}
+
+		// wrap the element
+		var props = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				'float': element.css('float')
+			},
+			wrapper = $('<div></div>')
+				.addClass('ui-effects-wrapper')
+				.css({
+					fontSize: '100%',
+					background: 'transparent',
+					border: 'none',
+					margin: 0,
+					padding: 0
+				}),
+			active = document.activeElement;
+
+		element.wrap(wrapper);
+
+		// Fixes #7595 - Elements lose focus when wrapped.
+		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+			$( active ).focus();
+		}
+		
+		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element
+
+		// transfer positioning properties to the wrapper
+		if (element.css('position') == 'static') {
+			wrapper.css({ position: 'relative' });
+			element.css({ position: 'relative' });
+		} else {
+			$.extend(props, {
+				position: element.css('position'),
+				zIndex: element.css('z-index')
+			});
+			$.each(['top', 'left', 'bottom', 'right'], function(i, pos) {
+				props[pos] = element.css(pos);
+				if (isNaN(parseInt(props[pos], 10))) {
+					props[pos] = 'auto';
+				}
+			});
+			element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' });
+		}
+
+		return wrapper.css(props).show();
+	},
+
+	removeWrapper: function(element) {
+		var parent,
+			active = document.activeElement;
+		
+		if (element.parent().is('.ui-effects-wrapper')) {
+			parent = element.parent().replaceWith(element);
+			// Fixes #7595 - Elements lose focus when wrapped.
+			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
+				$( active ).focus();
+			}
+			return parent;
+		}
+			
+		return element;
+	},
+
+	setTransition: function(element, list, factor, value) {
+		value = value || {};
+		$.each(list, function(i, x){
+			unit = element.cssUnit(x);
+			if (unit[0] > 0) value[x] = unit[0] * factor + unit[1];
+		});
+		return value;
+	}
+});
+
+
+function _normalizeArguments(effect, options, speed, callback) {
+	// shift params for method overloading
+	if (typeof effect == 'object') {
+		callback = options;
+		speed = null;
+		options = effect;
+		effect = options.effect;
+	}
+	if ($.isFunction(options)) {
+		callback = options;
+		speed = null;
+		options = {};
+	}
+        if (typeof options == 'number' || $.fx.speeds[options]) {
+		callback = speed;
+		speed = options;
+		options = {};
+	}
+	if ($.isFunction(speed)) {
+		callback = speed;
+		speed = null;
+	}
+
+	options = options || {};
+
+	speed = speed || options.duration;
+	speed = $.fx.off ? 0 : typeof speed == 'number'
+		? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default;
+
+	callback = callback || options.complete;
+
+	return [effect, options, speed, callback];
+}
+
+function standardSpeed( speed ) {
+	// valid standard speeds
+	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
+		return true;
+	}
+	
+	// invalid strings - treat as "normal" speed
+	if ( typeof speed === "string" && !$.effects[ speed ] ) {
+		return true;
+	}
+	
+	return false;
+}
+
+$.fn.extend({
+	effect: function(effect, options, speed, callback) {
+		var args = _normalizeArguments.apply(this, arguments),
+			// TODO: make effects take actual parameters instead of a hash
+			args2 = {
+				options: args[1],
+				duration: args[2],
+				callback: args[3]
+			},
+			mode = args2.options.mode,
+			effectMethod = $.effects[effect];
+		
+		if ( $.fx.off || !effectMethod ) {
+			// delegate to the original method (e.g., .show()) if possible
+			if ( mode ) {
+				return this[ mode ]( args2.duration, args2.callback );
+			} else {
+				return this.each(function() {
+					if ( args2.callback ) {
+						args2.callback.call( this );
+					}
+				});
+			}
+		}
+		
+		return effectMethod.call(this, args2);
+	},
+
+	_show: $.fn.show,
+	show: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._show.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'show';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	_hide: $.fn.hide,
+	hide: function(speed) {
+		if ( standardSpeed( speed ) ) {
+			return this._hide.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'hide';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// jQuery core overloads toggle and creates _toggle
+	__toggle: $.fn.toggle,
+	toggle: function(speed) {
+		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
+			return this.__toggle.apply(this, arguments);
+		} else {
+			var args = _normalizeArguments.apply(this, arguments);
+			args[1].mode = 'toggle';
+			return this.effect.apply(this, args);
+		}
+	},
+
+	// helper functions
+	cssUnit: function(key) {
+		var style = this.css(key), val = [];
+		$.each( ['em','px','%','pt'], function(i, unit){
+			if(style.indexOf(unit) > 0)
+				val = [parseFloat(style), unit];
+		});
+		return val;
+	}
+});
+
+
+
+/******************************************************************************/
+/*********************************** EASING ***********************************/
+/******************************************************************************/
+
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+$.easing.jswing = $.easing.swing;
+
+$.extend($.easing,
+{
+	def: 'easeOutQuad',
+	swing: function (x, t, b, c, d) {
+		//alert($.easing.default);
+		return $.easing[$.easing.def](x, t, b, c, d);
+	},
+	easeInQuad: function (x, t, b, c, d) {
+		return c*(t/=d)*t + b;
+	},
+	easeOutQuad: function (x, t, b, c, d) {
+		return -c *(t/=d)*(t-2) + b;
+	},
+	easeInOutQuad: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t + b;
+		return -c/2 * ((--t)*(t-2) - 1) + b;
+	},
+	easeInCubic: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t + b;
+	},
+	easeOutCubic: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t + 1) + b;
+	},
+	easeInOutCubic: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t + b;
+		return c/2*((t-=2)*t*t + 2) + b;
+	},
+	easeInQuart: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t + b;
+	},
+	easeOutQuart: function (x, t, b, c, d) {
+		return -c * ((t=t/d-1)*t*t*t - 1) + b;
+	},
+	easeInOutQuart: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+		return -c/2 * ((t-=2)*t*t*t - 2) + b;
+	},
+	easeInQuint: function (x, t, b, c, d) {
+		return c*(t/=d)*t*t*t*t + b;
+	},
+	easeOutQuint: function (x, t, b, c, d) {
+		return c*((t=t/d-1)*t*t*t*t + 1) + b;
+	},
+	easeInOutQuint: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+		return c/2*((t-=2)*t*t*t*t + 2) + b;
+	},
+	easeInSine: function (x, t, b, c, d) {
+		return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+	},
+	easeOutSine: function (x, t, b, c, d) {
+		return c * Math.sin(t/d * (Math.PI/2)) + b;
+	},
+	easeInOutSine: function (x, t, b, c, d) {
+		return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+	},
+	easeInExpo: function (x, t, b, c, d) {
+		return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+	},
+	easeOutExpo: function (x, t, b, c, d) {
+		return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+	},
+	easeInOutExpo: function (x, t, b, c, d) {
+		if (t==0) return b;
+		if (t==d) return b+c;
+		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+	},
+	easeInCirc: function (x, t, b, c, d) {
+		return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+	},
+	easeOutCirc: function (x, t, b, c, d) {
+		return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+	},
+	easeInOutCirc: function (x, t, b, c, d) {
+		if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+		return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+	},
+	easeInElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+	},
+	easeOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+	},
+	easeInOutElastic: function (x, t, b, c, d) {
+		var s=1.70158;var p=0;var a=c;
+		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
+		if (a < Math.abs(c)) { a=c; var s=p/4; }
+		else var s = p/(2*Math.PI) * Math.asin (c/a);
+		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+	},
+	easeInBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*(t/=d)*t*((s+1)*t - s) + b;
+	},
+	easeOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+	},
+	easeInOutBack: function (x, t, b, c, d, s) {
+		if (s == undefined) s = 1.70158;
+		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+	},
+	easeInBounce: function (x, t, b, c, d) {
+		return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+	},
+	easeOutBounce: function (x, t, b, c, d) {
+		if ((t/=d) < (1/2.75)) {
+			return c*(7.5625*t*t) + b;
+		} else if (t < (2/2.75)) {
+			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+		} else if (t < (2.5/2.75)) {
+			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+		} else {
+			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+		}
+	},
+	easeInOutBounce: function (x, t, b, c, d) {
+		if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+		return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+	}
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.drop.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.drop.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.drop.js	(revision 14585)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.drop = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','opacity'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2);
+		if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift
+
+		// Animation
+		var animation = {opacity: mode == 'show' ? 1 : 0};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.explode.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.explode.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.explode.js	(revision 14585)
@@ -0,0 +1,79 @@
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.explode = function(o) {
+
+	return this.queue(function() {
+
+	var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+	var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3;
+
+	o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode;
+	var el = $(this).show().css('visibility', 'hidden');
+	var offset = el.offset();
+
+	//Substract the margins - not fixing the problem yet.
+	offset.top -= parseInt(el.css("marginTop"),10) || 0;
+	offset.left -= parseInt(el.css("marginLeft"),10) || 0;
+
+	var width = el.outerWidth(true);
+	var height = el.outerHeight(true);
+
+	for(var i=0;i<rows;i++) { // =
+		for(var j=0;j<cells;j++) { // ||
+			el
+				.clone()
+				.appendTo('body')
+				.wrap('<div></div>')
+				.css({
+					position: 'absolute',
+					visibility: 'visible',
+					left: -j*(width/cells),
+					top: -i*(height/rows)
+				})
+				.parent()
+				.addClass('ui-effects-explode')
+				.css({
+					position: 'absolute',
+					overflow: 'hidden',
+					width: width/cells,
+					height: height/rows,
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0),
+					opacity: o.options.mode == 'show' ? 0 : 1
+				}).animate({
+					left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)),
+					top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)),
+					opacity: o.options.mode == 'show' ? 1 : 0
+				}, o.duration || 500);
+		}
+	}
+
+	// Set a timeout, to call the callback approx. when the other animations have finished
+	setTimeout(function() {
+
+		o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide();
+				if(o.callback) o.callback.apply(el[0]); // Callback
+				el.dequeue();
+
+				$('div.ui-effects-explode').remove();
+
+	}, o.duration || 500);
+
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fade.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fade.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fade.js	(revision 14585)
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fade = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide');
+
+		elem.animate({ opacity: mode }, {
+			queue: false,
+			duration: o.duration,
+			easing: o.options.easing,
+			complete: function() {
+				(o.callback && o.callback.apply(this, arguments));
+				elem.dequeue();
+			}
+		});
+	});
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fold.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fold.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.fold.js	(revision 14585)
@@ -0,0 +1,56 @@
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.fold = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
+		var size = o.options.size || 15; // Default fold size
+		var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value
+		var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2;
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var widthFirst = ((mode == 'show') != horizFirst);
+		var ref = widthFirst ? ['width', 'height'] : ['height', 'width'];
+		var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()];
+		var percent = /([0-9]+)%/.exec(size);
+		if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1];
+		if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift
+
+		// Animation
+		var animation1 = {}, animation2 = {};
+		animation1[ref[0]] = mode == 'show' ? distance[0] : size;
+		animation2[ref[1]] = mode == 'show' ? distance[1] : 0;
+
+		// Animate
+		wrapper.animate(animation1, duration, o.options.easing)
+		.animate(animation2, duration, o.options.easing, function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(el[0], arguments); // Callback
+			el.dequeue();
+		});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.highlight.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.highlight.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.highlight.js	(revision 14585)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.highlight = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			props = ['backgroundImage', 'backgroundColor', 'opacity'],
+			mode = $.effects.setMode(elem, o.options.mode || 'show'),
+			animation = {
+				backgroundColor: elem.css('backgroundColor')
+			};
+
+		if (mode == 'hide') {
+			animation.opacity = 0;
+		}
+
+		$.effects.save(elem, props);
+		elem
+			.show()
+			.css({
+				backgroundImage: 'none',
+				backgroundColor: o.options.color || '#ffff99'
+			})
+			.animate(animation, {
+				queue: false,
+				duration: o.duration,
+				easing: o.options.easing,
+				complete: function() {
+					(mode == 'hide' && elem.hide());
+					$.effects.restore(elem, props);
+					(mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter'));
+					(o.callback && o.callback.apply(this, arguments));
+					elem.dequeue();
+				}
+			});
+	});
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.pulsate.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.pulsate.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.pulsate.js	(revision 14585)
@@ -0,0 +1,51 @@
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.pulsate = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'show');
+			times = ((o.options.times || 5) * 2) - 1;
+			duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2,
+			isVisible = elem.is(':visible'),
+			animateTo = 0;
+
+		if (!isVisible) {
+			elem.css('opacity', 0).show();
+			animateTo = 1;
+		}
+
+		if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) {
+			times--;
+		}
+
+		for (var i = 0; i < times; i++) {
+			elem.animate({ opacity: animateTo }, duration, o.options.easing);
+			animateTo = (animateTo + 1) % 2;
+		}
+
+		elem.animate({ opacity: animateTo }, duration, o.options.easing, function() {
+			if (animateTo == 0) {
+				elem.hide();
+			}
+			(o.callback && o.callback.apply(this, arguments));
+		});
+
+		elem
+			.queue('fx', function() { elem.dequeue(); })
+			.dequeue();
+	});
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.scale.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.scale.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.scale.js	(revision 14585)
@@ -0,0 +1,178 @@
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.puff = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			mode = $.effects.setMode(elem, o.options.mode || 'hide'),
+			percent = parseInt(o.options.percent, 10) || 150,
+			factor = percent / 100,
+			original = { height: elem.height(), width: elem.width() };
+
+		$.extend(o.options, {
+			fade: true,
+			mode: mode,
+			percent: mode == 'hide' ? percent : 100,
+			from: mode == 'hide'
+				? original
+				: {
+					height: original.height * factor,
+					width: original.width * factor
+				}
+		});
+
+		elem.effect('scale', o.options, o.duration, o.callback);
+		elem.dequeue();
+	});
+};
+
+$.effects.scale = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this);
+
+		// Set options
+		var options = $.extend(true, {}, o.options);
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
+		var direction = o.options.direction || 'both'; // Set default axis
+		var origin = o.options.origin; // The origin of the scaling
+		if (mode != 'effect') { // Set default origin and restore for show/hide
+			options.origin = origin || ['middle','center'];
+			options.restore = true;
+		}
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
+
+		// Adjust
+		var factor = { // Set scaling factor
+			y: direction != 'horizontal' ? (percent / 100) : 1,
+			x: direction != 'vertical' ? (percent / 100) : 1
+		};
+		el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
+
+		if (o.options.fade) { // Fade option to support puff
+			if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
+			if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
+		};
+
+		// Animation
+		options.from = el.from; options.to = el.to; options.mode = mode;
+
+		// Animate
+		el.effect('size', options, o.duration, o.callback);
+		el.dequeue();
+	});
+
+};
+
+$.effects.size = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity'];
+		var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore
+		var props2 = ['width','height','overflow']; // Copy for children
+		var cProps = ['fontSize'];
+		var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
+		var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var restore = o.options.restore || false; // Default restore
+		var scale = o.options.scale || 'both'; // Default scale mode
+		var origin = o.options.origin; // The origin of the sizing
+		var original = {height: el.height(), width: el.width()}; // Save original
+		el.from = o.options.from || original; // Default from state
+		el.to = o.options.to || original; // Default to state
+		// Adjust
+		if (origin) { // Calculate baseline shifts
+			var baseline = $.effects.getBaseline(origin, original);
+			el.from.top = (original.height - el.from.height) * baseline.y;
+			el.from.left = (original.width - el.from.width) * baseline.x;
+			el.to.top = (original.height - el.to.height) * baseline.y;
+			el.to.left = (original.width - el.to.width) * baseline.x;
+		};
+		var factor = { // Set scaling factor
+			from: {y: el.from.height / original.height, x: el.from.width / original.width},
+			to: {y: el.to.height / original.height, x: el.to.width / original.width}
+		};
+		if (scale == 'box' || scale == 'both') { // Scale the css box
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(vProps);
+				el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
+			};
+			if (factor.from.x != factor.to.x) { // Horizontal props scaling
+				props = props.concat(hProps);
+				el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
+				el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
+			};
+		};
+		if (scale == 'content' || scale == 'both') { // Scale the content
+			if (factor.from.y != factor.to.y) { // Vertical props scaling
+				props = props.concat(cProps);
+				el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
+				el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
+			};
+		};
+		$.effects.save(el, restore ? props : props1); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		el.css('overflow','hidden').css(el.from); // Shift
+
+		// Animate
+		if (scale == 'content' || scale == 'both') { // Scale the children
+			vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
+			hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
+			props2 = props.concat(vProps).concat(hProps); // Concat
+			el.find("*[width]").each(function(){
+				child = $(this);
+				if (restore) $.effects.save(child, props2);
+				var c_original = {height: child.height(), width: child.width()}; // Save original
+				child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
+				child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
+				if (factor.from.y != factor.to.y) { // Vertical props scaling
+					child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
+					child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
+				};
+				if (factor.from.x != factor.to.x) { // Horizontal props scaling
+					child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
+					child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
+				};
+				child.css(child.from); // Shift children
+				child.animate(child.to, o.duration, o.options.easing, function(){
+					if (restore) $.effects.restore(child, props2); // Restore children
+				}); // Animate children
+			});
+		};
+
+		// Animate
+		el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if (el.to.opacity === 0) {
+				el.css('opacity', el.from.opacity);
+			}
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.shake.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.shake.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.shake.js	(revision 14585)
@@ -0,0 +1,57 @@
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.shake = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default direction
+		var distance = o.options.distance || 20; // Default distance
+		var times = o.options.times || 3; // Default # of times
+		var speed = o.duration || o.options.duration || 140; // Default speed per shake
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+
+		// Animation
+		var animation = {}, animation1 = {}, animation2 = {};
+		animation[ref] = (motion == 'pos' ? '-=' : '+=')  + distance;
+		animation1[ref] = (motion == 'pos' ? '+=' : '-=')  + distance * 2;
+		animation2[ref] = (motion == 'pos' ? '-=' : '+=')  + distance * 2;
+
+		// Animate
+		el.animate(animation, speed, o.options.easing);
+		for (var i = 1; i < times; i++) { // Shakes
+			el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing);
+		};
+		el.animate(animation1, speed, o.options.easing).
+		animate(animation, speed / 2, o.options.easing, function(){ // Last shake
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+		});
+		el.queue('fx', function() { el.dequeue(); });
+		el.dequeue();
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.slide.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.slide.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.slide.js	(revision 14585)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.slide = function(o) {
+
+	return this.queue(function() {
+
+		// Create element
+		var el = $(this), props = ['position','top','bottom','left','right'];
+
+		// Set options
+		var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode
+		var direction = o.options.direction || 'left'; // Default Direction
+
+		// Adjust
+		$.effects.save(el, props); el.show(); // Save & Show
+		$.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper
+		var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left';
+		var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg';
+		var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true}));
+		if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift
+
+		// Animation
+		var animation = {};
+		animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance;
+
+		// Animate
+		el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
+			if(mode == 'hide') el.hide(); // Hide
+			$.effects.restore(el, props); $.effects.removeWrapper(el); // Restore
+			if(o.callback) o.callback.apply(this, arguments); // Callback
+			el.dequeue();
+		}});
+
+	});
+
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.effects.transfer.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.effects.transfer.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.effects.transfer.js	(revision 14585)
@@ -0,0 +1,45 @@
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function( $, undefined ) {
+
+$.effects.transfer = function(o) {
+	return this.queue(function() {
+		var elem = $(this),
+			target = $(o.options.to),
+			endPosition = target.offset(),
+			animation = {
+				top: endPosition.top,
+				left: endPosition.left,
+				height: target.innerHeight(),
+				width: target.innerWidth()
+			},
+			startPosition = elem.offset(),
+			transfer = $('<div class="ui-effects-transfer"></div>')
+				.appendTo(document.body)
+				.addClass(o.options.className)
+				.css({
+					top: startPosition.top,
+					left: startPosition.left,
+					height: elem.innerHeight(),
+					width: elem.innerWidth(),
+					position: 'absolute'
+				})
+				.animate(animation, o.duration, o.options.easing, function() {
+					transfer.remove();
+					(o.callback && o.callback.apply(elem[0], arguments));
+					elem.dequeue();
+				});
+	});
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.accordion.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.accordion.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.accordion.js	(revision 14585)
@@ -0,0 +1,611 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.accordion", {
+	options: {
+		active: 0,
+		animated: "slide",
+		autoHeight: true,
+		clearStyle: false,
+		collapsible: false,
+		event: "click",
+		fillSpace: false,
+		header: "> li > :first-child,> :not(li):even",
+		icons: {
+			header: "ui-icon-triangle-1-e",
+			headerSelected: "ui-icon-triangle-1-s"
+		},
+		navigation: false,
+		navigationFilter: function() {
+			return this.href.toLowerCase() === location.href.toLowerCase();
+		}
+	},
+
+	_create: function() {
+		var self = this,
+			options = self.options;
+
+		self.running = 0;
+
+		self.element
+			.addClass( "ui-accordion ui-widget ui-helper-reset" )
+			// in lack of child-selectors in CSS
+			// we need to mark top-LIs in a UL-accordion for some IE-fix
+			.children( "li" )
+				.addClass( "ui-accordion-li-fix" );
+
+		self.headers = self.element.find( options.header )
+			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" )
+			.bind( "mouseenter.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+			})
+			.bind( "mouseleave.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.bind( "focus.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-focus" );
+			})
+			.bind( "blur.accordion", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		self.headers.next()
+			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" );
+
+		if ( options.navigation ) {
+			var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 );
+			if ( current.length ) {
+				var header = current.closest( ".ui-accordion-header" );
+				if ( header.length ) {
+					// anchor within header
+					self.active = header;
+				} else {
+					// anchor within content
+					self.active = current.closest( ".ui-accordion-content" ).prev();
+				}
+			}
+		}
+
+		self.active = self._findActive( self.active || options.active )
+			.addClass( "ui-state-default ui-state-active" )
+			.toggleClass( "ui-corner-all" )
+			.toggleClass( "ui-corner-top" );
+		self.active.next().addClass( "ui-accordion-content-active" );
+
+		self._createIcons();
+		self.resize();
+		
+		// ARIA
+		self.element.attr( "role", "tablist" );
+
+		self.headers
+			.attr( "role", "tab" )
+			.bind( "keydown.accordion", function( event ) {
+				return self._keydown( event );
+			})
+			.next()
+				.attr( "role", "tabpanel" );
+
+		self.headers
+			.not( self.active || "" )
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.next()
+				.hide();
+
+		// make sure at least one header is in the tab order
+		if ( !self.active.length ) {
+			self.headers.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			self.active
+				.attr({
+					"aria-expanded": "true",
+					"aria-selected": "true",
+					tabIndex: 0
+				});
+		}
+
+		// only need links in tab order for Safari
+		if ( !$.browser.safari ) {
+			self.headers.find( "a" ).attr( "tabIndex", -1 );
+		}
+
+		if ( options.event ) {
+			self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) {
+				self._clickHandler.call( self, event, this );
+				event.preventDefault();
+			});
+		}
+	},
+
+	_createIcons: function() {
+		var options = this.options;
+		if ( options.icons ) {
+			$( "<span></span>" )
+				.addClass( "ui-icon " + options.icons.header )
+				.prependTo( this.headers );
+			this.active.children( ".ui-icon" )
+				.toggleClass(options.icons.header)
+				.toggleClass(options.icons.headerSelected);
+			this.element.addClass( "ui-accordion-icons" );
+		}
+	},
+
+	_destroyIcons: function() {
+		this.headers.children( ".ui-icon" ).remove();
+		this.element.removeClass( "ui-accordion-icons" );
+	},
+
+	destroy: function() {
+		var options = this.options;
+
+		this.element
+			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
+			.removeAttr( "role" );
+
+		this.headers
+			.unbind( ".accordion" )
+			.removeClass( "ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-expanded" )
+			.removeAttr( "aria-selected" )
+			.removeAttr( "tabIndex" );
+
+		this.headers.find( "a" ).removeAttr( "tabIndex" );
+		this._destroyIcons();
+		var contents = this.headers.next()
+			.css( "display", "" )
+			.removeAttr( "role" )
+			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled" );
+		if ( options.autoHeight || options.fillHeight ) {
+			contents.css( "height", "" );
+		}
+
+		return $.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+			
+		if ( key == "active" ) {
+			this.activate( value );
+		}
+		if ( key == "icons" ) {
+			this._destroyIcons();
+			if ( value ) {
+				this._createIcons();
+			}
+		}
+		// #5332 - opacity doesn't cascade to positioned elements in IE
+		// so we need to add the disabled class to the headers and panels
+		if ( key == "disabled" ) {
+			this.headers.add(this.headers.next())
+				[ value ? "addClass" : "removeClass" ](
+					"ui-accordion-disabled ui-state-disabled" );
+		}
+	},
+
+	_keydown: function( event ) {
+		if ( this.options.disabled || event.altKey || event.ctrlKey ) {
+			return;
+		}
+
+		var keyCode = $.ui.keyCode,
+			length = this.headers.length,
+			currentIndex = this.headers.index( event.target ),
+			toFocus = false;
+
+		switch ( event.keyCode ) {
+			case keyCode.RIGHT:
+			case keyCode.DOWN:
+				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+				break;
+			case keyCode.LEFT:
+			case keyCode.UP:
+				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+				break;
+			case keyCode.SPACE:
+			case keyCode.ENTER:
+				this._clickHandler( { target: event.target }, event.target );
+				event.preventDefault();
+		}
+
+		if ( toFocus ) {
+			$( event.target ).attr( "tabIndex", -1 );
+			$( toFocus ).attr( "tabIndex", 0 );
+			toFocus.focus();
+			return false;
+		}
+
+		return true;
+	},
+
+	resize: function() {
+		var options = this.options,
+			maxHeight;
+
+		if ( options.fillSpace ) {
+			if ( $.browser.msie ) {
+				var defOverflow = this.element.parent().css( "overflow" );
+				this.element.parent().css( "overflow", "hidden");
+			}
+			maxHeight = this.element.parent().height();
+			if ($.browser.msie) {
+				this.element.parent().css( "overflow", defOverflow );
+			}
+
+			this.headers.each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.headers.next()
+				.each(function() {
+					$( this ).height( Math.max( 0, maxHeight -
+						$( this ).innerHeight() + $( this ).height() ) );
+				})
+				.css( "overflow", "auto" );
+		} else if ( options.autoHeight ) {
+			maxHeight = 0;
+			this.headers.next()
+				.each(function() {
+					maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+				})
+				.height( maxHeight );
+		}
+
+		return this;
+	},
+
+	activate: function( index ) {
+		// TODO this gets called on init, changing the option without an explicit call for that
+		this.options.active = index;
+		// call clickHandler with custom event
+		var active = this._findActive( index )[ 0 ];
+		this._clickHandler( { target: active }, active );
+
+		return this;
+	},
+
+	_findActive: function( selector ) {
+		return selector
+			? typeof selector === "number"
+				? this.headers.filter( ":eq(" + selector + ")" )
+				: this.headers.not( this.headers.not( selector ) )
+			: selector === false
+				? $( [] )
+				: this.headers.filter( ":eq(0)" );
+	},
+
+	// TODO isn't event.target enough? why the separate target argument?
+	_clickHandler: function( event, target ) {
+		var options = this.options;
+		if ( options.disabled ) {
+			return;
+		}
+
+		// called only when using activate(false) to close all parts programmatically
+		if ( !event.target ) {
+			if ( !options.collapsible ) {
+				return;
+			}
+			this.active
+				.removeClass( "ui-state-active ui-corner-top" )
+				.addClass( "ui-state-default ui-corner-all" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.headerSelected )
+					.addClass( options.icons.header );
+			this.active.next().addClass( "ui-accordion-content-active" );
+			var toHide = this.active.next(),
+				data = {
+					options: options,
+					newHeader: $( [] ),
+					oldHeader: options.active,
+					newContent: $( [] ),
+					oldContent: toHide
+				},
+				toShow = ( this.active = $( [] ) );
+			this._toggle( toShow, toHide, data );
+			return;
+		}
+
+		// get the click target
+		var clicked = $( event.currentTarget || target ),
+			clickedIsActive = clicked[0] === this.active[0];
+
+		// TODO the option is changed, is that correct?
+		// TODO if it is correct, shouldn't that happen after determining that the click is valid?
+		options.active = options.collapsible && clickedIsActive ?
+			false :
+			this.headers.index( clicked );
+
+		// if animations are still active, or the active header is the target, ignore click
+		if ( this.running || ( !options.collapsible && clickedIsActive ) ) {
+			return;
+		}
+
+		// find elements to show and hide
+		var active = this.active,
+			toShow = clicked.next(),
+			toHide = this.active.next(),
+			data = {
+				options: options,
+				newHeader: clickedIsActive && options.collapsible ? $([]) : clicked,
+				oldHeader: this.active,
+				newContent: clickedIsActive && options.collapsible ? $([]) : toShow,
+				oldContent: toHide
+			},
+			down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] );
+
+		// when the call to ._toggle() comes after the class changes
+		// it causes a very odd bug in IE 8 (see #6720)
+		this.active = clickedIsActive ? $([]) : clicked;
+		this._toggle( toShow, toHide, data, clickedIsActive, down );
+
+		// switch classes
+		active
+			.removeClass( "ui-state-active ui-corner-top" )
+			.addClass( "ui-state-default ui-corner-all" )
+			.children( ".ui-icon" )
+				.removeClass( options.icons.headerSelected )
+				.addClass( options.icons.header );
+		if ( !clickedIsActive ) {
+			clicked
+				.removeClass( "ui-state-default ui-corner-all" )
+				.addClass( "ui-state-active ui-corner-top" )
+				.children( ".ui-icon" )
+					.removeClass( options.icons.header )
+					.addClass( options.icons.headerSelected );
+			clicked
+				.next()
+				.addClass( "ui-accordion-content-active" );
+		}
+
+		return;
+	},
+
+	_toggle: function( toShow, toHide, data, clickedIsActive, down ) {
+		var self = this,
+			options = self.options;
+
+		self.toShow = toShow;
+		self.toHide = toHide;
+		self.data = data;
+
+		var complete = function() {
+			if ( !self ) {
+				return;
+			}
+			return self._completed.apply( self, arguments );
+		};
+
+		// trigger changestart event
+		self._trigger( "changestart", null, self.data );
+
+		// count elements to animate
+		self.running = toHide.size() === 0 ? toShow.size() : toHide.size();
+
+		if ( options.animated ) {
+			var animOptions = {};
+
+			if ( options.collapsible && clickedIsActive ) {
+				animOptions = {
+					toShow: $( [] ),
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			} else {
+				animOptions = {
+					toShow: toShow,
+					toHide: toHide,
+					complete: complete,
+					down: down,
+					autoHeight: options.autoHeight || options.fillSpace
+				};
+			}
+
+			if ( !options.proxied ) {
+				options.proxied = options.animated;
+			}
+
+			if ( !options.proxiedDuration ) {
+				options.proxiedDuration = options.duration;
+			}
+
+			options.animated = $.isFunction( options.proxied ) ?
+				options.proxied( animOptions ) :
+				options.proxied;
+
+			options.duration = $.isFunction( options.proxiedDuration ) ?
+				options.proxiedDuration( animOptions ) :
+				options.proxiedDuration;
+
+			var animations = $.ui.accordion.animations,
+				duration = options.duration,
+				easing = options.animated;
+
+			if ( easing && !animations[ easing ] && !$.easing[ easing ] ) {
+				easing = "slide";
+			}
+			if ( !animations[ easing ] ) {
+				animations[ easing ] = function( options ) {
+					this.slide( options, {
+						easing: easing,
+						duration: duration || 700
+					});
+				};
+			}
+
+			animations[ easing ]( animOptions );
+		} else {
+			if ( options.collapsible && clickedIsActive ) {
+				toShow.toggle();
+			} else {
+				toHide.hide();
+				toShow.show();
+			}
+
+			complete( true );
+		}
+
+		// TODO assert that the blur and focus triggers are really necessary, remove otherwise
+		toHide.prev()
+			.attr({
+				"aria-expanded": "false",
+				"aria-selected": "false",
+				tabIndex: -1
+			})
+			.blur();
+		toShow.prev()
+			.attr({
+				"aria-expanded": "true",
+				"aria-selected": "true",
+				tabIndex: 0
+			})
+			.focus();
+	},
+
+	_completed: function( cancel ) {
+		this.running = cancel ? 0 : --this.running;
+		if ( this.running ) {
+			return;
+		}
+
+		if ( this.options.clearStyle ) {
+			this.toShow.add( this.toHide ).css({
+				height: "",
+				overflow: ""
+			});
+		}
+
+		// other classes are removed before the animation; this one needs to stay until completed
+		this.toHide.removeClass( "ui-accordion-content-active" );
+		// Work around for rendering bug in IE (#5421)
+		if ( this.toHide.length ) {
+			this.toHide.parent()[0].className = this.toHide.parent()[0].className;
+		}
+
+		this._trigger( "change", null, this.data );
+	}
+});
+
+$.extend( $.ui.accordion, {
+	version: "1.8.16",
+	animations: {
+		slide: function( options, additions ) {
+			options = $.extend({
+				easing: "swing",
+				duration: 300
+			}, options, additions );
+			if ( !options.toHide.size() ) {
+				options.toShow.animate({
+					height: "show",
+					paddingTop: "show",
+					paddingBottom: "show"
+				}, options );
+				return;
+			}
+			if ( !options.toShow.size() ) {
+				options.toHide.animate({
+					height: "hide",
+					paddingTop: "hide",
+					paddingBottom: "hide"
+				}, options );
+				return;
+			}
+			var overflow = options.toShow.css( "overflow" ),
+				percentDone = 0,
+				showProps = {},
+				hideProps = {},
+				fxAttrs = [ "height", "paddingTop", "paddingBottom" ],
+				originalWidth;
+			// fix width before calculating height of hidden element
+			var s = options.toShow;
+			originalWidth = s[0].style.width;
+			s.width( parseInt( s.parent().width(), 10 )
+				- parseInt( s.css( "paddingLeft" ), 10 )
+				- parseInt( s.css( "paddingRight" ), 10 )
+				- ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 )
+				- ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) );
+
+			$.each( fxAttrs, function( i, prop ) {
+				hideProps[ prop ] = "hide";
+
+				var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ );
+				showProps[ prop ] = {
+					value: parts[ 1 ],
+					unit: parts[ 2 ] || "px"
+				};
+			});
+			options.toShow.css({ height: 0, overflow: "hidden" }).show();
+			options.toHide
+				.filter( ":hidden" )
+					.each( options.complete )
+				.end()
+				.filter( ":visible" )
+				.animate( hideProps, {
+				step: function( now, settings ) {
+					// only calculate the percent when animating height
+					// IE gets very inconsistent results when animating elements
+					// with small values, which is common for padding
+					if ( settings.prop == "height" ) {
+						percentDone = ( settings.end - settings.start === 0 ) ? 0 :
+							( settings.now - settings.start ) / ( settings.end - settings.start );
+					}
+
+					options.toShow[ 0 ].style[ settings.prop ] =
+						( percentDone * showProps[ settings.prop ].value )
+						+ showProps[ settings.prop ].unit;
+				},
+				duration: options.duration,
+				easing: options.easing,
+				complete: function() {
+					if ( !options.autoHeight ) {
+						options.toShow.css( "height", "" );
+					}
+					options.toShow.css({
+						width: originalWidth,
+						overflow: overflow
+					});
+					options.complete();
+				}
+			});
+		},
+		bounceslide: function( options ) {
+			this.slide( options, {
+				easing: options.down ? "easeOutBounce" : "swing",
+				duration: options.down ? 1000 : 200
+			});
+		}
+	}
+});
+
+})( jQuery );
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.autocomplete.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.autocomplete.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.autocomplete.js	(revision 14585)
@@ -0,0 +1,612 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function( $, undefined ) {
+
+// used to prevent race conditions with remote data sources
+var requestIndex = 0;
+
+$.widget( "ui.autocomplete", {
+	options: {
+		appendTo: "body",
+		autoFocus: false,
+		delay: 300,
+		minLength: 1,
+		position: {
+			my: "left top",
+			at: "left bottom",
+			collision: "none"
+		},
+		source: null
+	},
+
+	pending: 0,
+
+	_create: function() {
+		var self = this,
+			doc = this.element[ 0 ].ownerDocument,
+			suppressKeyPress;
+
+		this.element
+			.addClass( "ui-autocomplete-input" )
+			.attr( "autocomplete", "off" )
+			// TODO verify these actually work as intended
+			.attr({
+				role: "textbox",
+				"aria-autocomplete": "list",
+				"aria-haspopup": "true"
+			})
+			.bind( "keydown.autocomplete", function( event ) {
+				if ( self.options.disabled || self.element.propAttr( "readOnly" ) ) {
+					return;
+				}
+
+				suppressKeyPress = false;
+				var keyCode = $.ui.keyCode;
+				switch( event.keyCode ) {
+				case keyCode.PAGE_UP:
+					self._move( "previousPage", event );
+					break;
+				case keyCode.PAGE_DOWN:
+					self._move( "nextPage", event );
+					break;
+				case keyCode.UP:
+					self._move( "previous", event );
+					// prevent moving cursor to beginning of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.DOWN:
+					self._move( "next", event );
+					// prevent moving cursor to end of text field in some browsers
+					event.preventDefault();
+					break;
+				case keyCode.ENTER:
+				case keyCode.NUMPAD_ENTER:
+					// when menu is open and has focus
+					if ( self.menu.active ) {
+						// #6055 - Opera still allows the keypress to occur
+						// which causes forms to submit
+						suppressKeyPress = true;
+						event.preventDefault();
+					}
+					//passthrough - ENTER and TAB both select the current element
+				case keyCode.TAB:
+					if ( !self.menu.active ) {
+						return;
+					}
+					self.menu.select( event );
+					break;
+				case keyCode.ESCAPE:
+					self.element.val( self.term );
+					self.close( event );
+					break;
+				default:
+					// keypress is triggered before the input value is changed
+					clearTimeout( self.searching );
+					self.searching = setTimeout(function() {
+						// only search if the value has changed
+						if ( self.term != self.element.val() ) {
+							self.selectedItem = null;
+							self.search( null, event );
+						}
+					}, self.options.delay );
+					break;
+				}
+			})
+			.bind( "keypress.autocomplete", function( event ) {
+				if ( suppressKeyPress ) {
+					suppressKeyPress = false;
+					event.preventDefault();
+				}
+			})
+			.bind( "focus.autocomplete", function() {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				self.selectedItem = null;
+				self.previous = self.element.val();
+			})
+			.bind( "blur.autocomplete", function( event ) {
+				if ( self.options.disabled ) {
+					return;
+				}
+
+				clearTimeout( self.searching );
+				// clicks on the menu (or a button to trigger a search) will cause a blur event
+				self.closing = setTimeout(function() {
+					self.close( event );
+					self._change( event );
+				}, 150 );
+			});
+		this._initSource();
+		this.response = function() {
+			return self._response.apply( self, arguments );
+		};
+		this.menu = $( "<ul></ul>" )
+			.addClass( "ui-autocomplete" )
+			.appendTo( $( this.options.appendTo || "body", doc )[0] )
+			// prevent the close-on-blur in case of a "slow" click on the menu (long mousedown)
+			.mousedown(function( event ) {
+				// clicking on the scrollbar causes focus to shift to the body
+				// but we can't detect a mouseup or a click immediately afterward
+				// so we have to track the next mousedown and close the menu if
+				// the user clicks somewhere outside of the autocomplete
+				var menuElement = self.menu.element[ 0 ];
+				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
+					setTimeout(function() {
+						$( document ).one( 'mousedown', function( event ) {
+							if ( event.target !== self.element[ 0 ] &&
+								event.target !== menuElement &&
+								!$.ui.contains( menuElement, event.target ) ) {
+								self.close();
+							}
+						});
+					}, 1 );
+				}
+
+				// use another timeout to make sure the blur-event-handler on the input was already triggered
+				setTimeout(function() {
+					clearTimeout( self.closing );
+				}, 13);
+			})
+			.menu({
+				focus: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" );
+					if ( false !== self._trigger( "focus", event, { item: item } ) ) {
+						// use value to match what will end up in the input, if it was a key event
+						if ( /^key/.test(event.originalEvent.type) ) {
+							self.element.val( item.value );
+						}
+					}
+				},
+				selected: function( event, ui ) {
+					var item = ui.item.data( "item.autocomplete" ),
+						previous = self.previous;
+
+					// only trigger when focus was lost (click on menu)
+					if ( self.element[0] !== doc.activeElement ) {
+						self.element.focus();
+						self.previous = previous;
+						// #6109 - IE triggers two focus events and the second
+						// is asynchronous, so we need to reset the previous
+						// term synchronously and asynchronously :-(
+						setTimeout(function() {
+							self.previous = previous;
+							self.selectedItem = item;
+						}, 1);
+					}
+
+					if ( false !== self._trigger( "select", event, { item: item } ) ) {
+						self.element.val( item.value );
+					}
+					// reset the term after the select event
+					// this allows custom select handling to work properly
+					self.term = self.element.val();
+
+					self.close( event );
+					self.selectedItem = item;
+				},
+				blur: function( event, ui ) {
+					// don't set the value of the text field if it's already correct
+					// this prevents moving the cursor unnecessarily
+					if ( self.menu.element.is(":visible") &&
+						( self.element.val() !== self.term ) ) {
+						self.element.val( self.term );
+					}
+				}
+			})
+			.zIndex( this.element.zIndex() + 1 )
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.hide()
+			.data( "menu" );
+		if ( $.fn.bgiframe ) {
+			 this.menu.element.bgiframe();
+		}
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-autocomplete-input" )
+			.removeAttr( "autocomplete" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-autocomplete" )
+			.removeAttr( "aria-haspopup" );
+		this.menu.element.remove();
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "source" ) {
+			this._initSource();
+		}
+		if ( key === "appendTo" ) {
+			this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] )
+		}
+		if ( key === "disabled" && value && this.xhr ) {
+			this.xhr.abort();
+		}
+	},
+
+	_initSource: function() {
+		var self = this,
+			array,
+			url;
+		if ( $.isArray(this.options.source) ) {
+			array = this.options.source;
+			this.source = function( request, response ) {
+				response( $.ui.autocomplete.filter(array, request.term) );
+			};
+		} else if ( typeof this.options.source === "string" ) {
+			url = this.options.source;
+			this.source = function( request, response ) {
+				if ( self.xhr ) {
+					self.xhr.abort();
+				}
+				self.xhr = $.ajax({
+					url: url,
+					data: request,
+					dataType: "json",
+					autocompleteRequest: ++requestIndex,
+					success: function( data, status ) {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( data );
+						}
+					},
+					error: function() {
+						if ( this.autocompleteRequest === requestIndex ) {
+							response( [] );
+						}
+					}
+				});
+			};
+		} else {
+			this.source = this.options.source;
+		}
+	},
+
+	search: function( value, event ) {
+		value = value != null ? value : this.element.val();
+
+		// always save the actual value, not the one passed as an argument
+		this.term = this.element.val();
+
+		if ( value.length < this.options.minLength ) {
+			return this.close( event );
+		}
+
+		clearTimeout( this.closing );
+		if ( this._trigger( "search", event ) === false ) {
+			return;
+		}
+
+		return this._search( value );
+	},
+
+	_search: function( value ) {
+		this.pending++;
+		this.element.addClass( "ui-autocomplete-loading" );
+
+		this.source( { term: value }, this.response );
+	},
+
+	_response: function( content ) {
+		if ( !this.options.disabled && content && content.length ) {
+			content = this._normalize( content );
+			this._suggest( content );
+			this._trigger( "open" );
+		} else {
+			this.close();
+		}
+		this.pending--;
+		if ( !this.pending ) {
+			this.element.removeClass( "ui-autocomplete-loading" );
+		}
+	},
+
+	close: function( event ) {
+		clearTimeout( this.closing );
+		if ( this.menu.element.is(":visible") ) {
+			this.menu.element.hide();
+			this.menu.deactivate();
+			this._trigger( "close", event );
+		}
+	},
+	
+	_change: function( event ) {
+		if ( this.previous !== this.element.val() ) {
+			this._trigger( "change", event, { item: this.selectedItem } );
+		}
+	},
+
+	_normalize: function( items ) {
+		// assume all items have the right format when the first item is complete
+		if ( items.length && items[0].label && items[0].value ) {
+			return items;
+		}
+		return $.map( items, function(item) {
+			if ( typeof item === "string" ) {
+				return {
+					label: item,
+					value: item
+				};
+			}
+			return $.extend({
+				label: item.label || item.value,
+				value: item.value || item.label
+			}, item );
+		});
+	},
+
+	_suggest: function( items ) {
+		var ul = this.menu.element
+			.empty()
+			.zIndex( this.element.zIndex() + 1 );
+		this._renderMenu( ul, items );
+		// TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate
+		this.menu.deactivate();
+		this.menu.refresh();
+
+		// size and position menu
+		ul.show();
+		this._resizeMenu();
+		ul.position( $.extend({
+			of: this.element
+		}, this.options.position ));
+
+		if ( this.options.autoFocus ) {
+			this.menu.next( new $.Event("mouseover") );
+		}
+	},
+
+	_resizeMenu: function() {
+		var ul = this.menu.element;
+		ul.outerWidth( Math.max(
+			ul.width( "" ).outerWidth(),
+			this.element.outerWidth()
+		) );
+	},
+
+	_renderMenu: function( ul, items ) {
+		var self = this;
+		$.each( items, function( index, item ) {
+			self._renderItem( ul, item );
+		});
+	},
+
+	_renderItem: function( ul, item) {
+		return $( "<li></li>" )
+			.data( "item.autocomplete", item )
+			.append( $( "<a></a>" ).text( item.label ) )
+			.appendTo( ul );
+	},
+
+	_move: function( direction, event ) {
+		if ( !this.menu.element.is(":visible") ) {
+			this.search( null, event );
+			return;
+		}
+		if ( this.menu.first() && /^previous/.test(direction) ||
+				this.menu.last() && /^next/.test(direction) ) {
+			this.element.val( this.term );
+			this.menu.deactivate();
+			return;
+		}
+		this.menu[ direction ]( event );
+	},
+
+	widget: function() {
+		return this.menu.element;
+	}
+});
+
+$.extend( $.ui.autocomplete, {
+	escapeRegex: function( value ) {
+		return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+	},
+	filter: function(array, term) {
+		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
+		return $.grep( array, function(value) {
+			return matcher.test( value.label || value.value || value );
+		});
+	}
+});
+
+}( jQuery ));
+
+/*
+ * jQuery UI Menu (not officially released)
+ * 
+ * This widget isn't yet finished and the API is subject to change. We plan to finish
+ * it for the next release. You're welcome to give it a try anyway and give us feedback,
+ * as long as you're okay with migrating your code later on. We can help with that, too.
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *  jquery.ui.widget.js
+ */
+(function($) {
+
+$.widget("ui.menu", {
+	_create: function() {
+		var self = this;
+		this.element
+			.addClass("ui-menu ui-widget ui-widget-content ui-corner-all")
+			.attr({
+				role: "listbox",
+				"aria-activedescendant": "ui-active-menuitem"
+			})
+			.click(function( event ) {
+				if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) {
+					return;
+				}
+				// temporary
+				event.preventDefault();
+				self.select( event );
+			});
+		this.refresh();
+	},
+	
+	refresh: function() {
+		var self = this;
+
+		// don't refresh list items that are already adapted
+		var items = this.element.children("li:not(.ui-menu-item):has(a)")
+			.addClass("ui-menu-item")
+			.attr("role", "menuitem");
+		
+		items.children("a")
+			.addClass("ui-corner-all")
+			.attr("tabindex", -1)
+			// mouseenter doesn't work with event delegation
+			.mouseenter(function( event ) {
+				self.activate( event, $(this).parent() );
+			})
+			.mouseleave(function() {
+				self.deactivate();
+			});
+	},
+
+	activate: function( event, item ) {
+		this.deactivate();
+		if (this.hasScroll()) {
+			var offset = item.offset().top - this.element.offset().top,
+				scroll = this.element.scrollTop(),
+				elementHeight = this.element.height();
+			if (offset < 0) {
+				this.element.scrollTop( scroll + offset);
+			} else if (offset >= elementHeight) {
+				this.element.scrollTop( scroll + offset - elementHeight + item.height());
+			}
+		}
+		this.active = item.eq(0)
+			.children("a")
+				.addClass("ui-state-hover")
+				.attr("id", "ui-active-menuitem")
+			.end();
+		this._trigger("focus", event, { item: item });
+	},
+
+	deactivate: function() {
+		if (!this.active) { return; }
+
+		this.active.children("a")
+			.removeClass("ui-state-hover")
+			.removeAttr("id");
+		this._trigger("blur");
+		this.active = null;
+	},
+
+	next: function(event) {
+		this.move("next", ".ui-menu-item:first", event);
+	},
+
+	previous: function(event) {
+		this.move("prev", ".ui-menu-item:last", event);
+	},
+
+	first: function() {
+		return this.active && !this.active.prevAll(".ui-menu-item").length;
+	},
+
+	last: function() {
+		return this.active && !this.active.nextAll(".ui-menu-item").length;
+	},
+
+	move: function(direction, edge, event) {
+		if (!this.active) {
+			this.activate(event, this.element.children(edge));
+			return;
+		}
+		var next = this.active[direction + "All"](".ui-menu-item").eq(0);
+		if (next.length) {
+			this.activate(event, next);
+		} else {
+			this.activate(event, this.element.children(edge));
+		}
+	},
+
+	// TODO merge with previousPage
+	nextPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.last()) {
+				this.activate(event, this.element.children(".ui-menu-item:first"));
+				return;
+			}
+			var base = this.active.offset().top,
+				height = this.element.height(),
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base - height + $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:last");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.last() ? ":first" : ":last"));
+		}
+	},
+
+	// TODO merge with nextPage
+	previousPage: function(event) {
+		if (this.hasScroll()) {
+			// TODO merge with no-scroll-else
+			if (!this.active || this.first()) {
+				this.activate(event, this.element.children(".ui-menu-item:last"));
+				return;
+			}
+
+			var base = this.active.offset().top,
+				height = this.element.height();
+				result = this.element.children(".ui-menu-item").filter(function() {
+					var close = $(this).offset().top - base + height - $(this).height();
+					// TODO improve approximation
+					return close < 10 && close > -10;
+				});
+
+			// TODO try to catch this earlier when scrollTop indicates the last page anyway
+			if (!result.length) {
+				result = this.element.children(".ui-menu-item:first");
+			}
+			this.activate(event, result);
+		} else {
+			this.activate(event, this.element.children(".ui-menu-item")
+				.filter(!this.active || this.first() ? ":last" : ":first"));
+		}
+	},
+
+	hasScroll: function() {
+		return this.element.height() < this.element[ $.fn.prop ? "prop" : "attr" ]("scrollHeight");
+	},
+
+	select: function( event ) {
+		this._trigger("selected", event, { item: this.active });
+	}
+});
+
+}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.button.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.button.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.button.js	(revision 14585)
@@ -0,0 +1,416 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var lastActive, startXPos, startYPos, clickDragged,
+	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
+	stateClasses = "ui-state-hover ui-state-active ",
+	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
+	formResetHandler = function() {
+		var buttons = $( this ).find( ":ui-button" );
+		setTimeout(function() {
+			buttons.button( "refresh" );
+		}, 1 );
+	},
+	radioGroup = function( radio ) {
+		var name = radio.name,
+			form = radio.form,
+			radios = $( [] );
+		if ( name ) {
+			if ( form ) {
+				radios = $( form ).find( "[name='" + name + "']" );
+			} else {
+				radios = $( "[name='" + name + "']", radio.ownerDocument )
+					.filter(function() {
+						return !this.form;
+					});
+			}
+		}
+		return radios;
+	};
+
+$.widget( "ui.button", {
+	options: {
+		disabled: null,
+		text: true,
+		label: null,
+		icons: {
+			primary: null,
+			secondary: null
+		}
+	},
+	_create: function() {
+		this.element.closest( "form" )
+			.unbind( "reset.button" )
+			.bind( "reset.button", formResetHandler );
+
+		if ( typeof this.options.disabled !== "boolean" ) {
+			this.options.disabled = this.element.propAttr( "disabled" );
+		}
+
+		this._determineButtonType();
+		this.hasTitle = !!this.buttonElement.attr( "title" );
+
+		var self = this,
+			options = this.options,
+			toggleButton = this.type === "checkbox" || this.type === "radio",
+			hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ),
+			focusClass = "ui-state-focus";
+
+		if ( options.label === null ) {
+			options.label = this.buttonElement.html();
+		}
+
+		if ( this.element.is( ":disabled" ) ) {
+			options.disabled = true;
+		}
+
+		this.buttonElement
+			.addClass( baseClasses )
+			.attr( "role", "button" )
+			.bind( "mouseenter.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).addClass( "ui-state-hover" );
+				if ( this === lastActive ) {
+					$( this ).addClass( "ui-state-active" );
+				}
+			})
+			.bind( "mouseleave.button", function() {
+				if ( options.disabled ) {
+					return;
+				}
+				$( this ).removeClass( hoverClass );
+			})
+			.bind( "click.button", function( event ) {
+				if ( options.disabled ) {
+					event.preventDefault();
+					event.stopImmediatePropagation();
+				}
+			});
+
+		this.element
+			.bind( "focus.button", function() {
+				// no need to check disabled, focus won't be triggered anyway
+				self.buttonElement.addClass( focusClass );
+			})
+			.bind( "blur.button", function() {
+				self.buttonElement.removeClass( focusClass );
+			});
+
+		if ( toggleButton ) {
+			this.element.bind( "change.button", function() {
+				if ( clickDragged ) {
+					return;
+				}
+				self.refresh();
+			});
+			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
+			// prevents issue where button state changes but checkbox/radio checked state
+			// does not in Firefox (see ticket #6970)
+			this.buttonElement
+				.bind( "mousedown.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					clickDragged = false;
+					startXPos = event.pageX;
+					startYPos = event.pageY;
+				})
+				.bind( "mouseup.button", function( event ) {
+					if ( options.disabled ) {
+						return;
+					}
+					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
+						clickDragged = true;
+					}
+			});
+		}
+
+		if ( this.type === "checkbox" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).toggleClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", self.element[0].checked );
+			});
+		} else if ( this.type === "radio" ) {
+			this.buttonElement.bind( "click.button", function() {
+				if ( options.disabled || clickDragged ) {
+					return false;
+				}
+				$( this ).addClass( "ui-state-active" );
+				self.buttonElement.attr( "aria-pressed", "true" );
+
+				var radio = self.element[ 0 ];
+				radioGroup( radio )
+					.not( radio )
+					.map(function() {
+						return $( this ).button( "widget" )[ 0 ];
+					})
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			});
+		} else {
+			this.buttonElement
+				.bind( "mousedown.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).addClass( "ui-state-active" );
+					lastActive = this;
+					$( document ).one( "mouseup", function() {
+						lastActive = null;
+					});
+				})
+				.bind( "mouseup.button", function() {
+					if ( options.disabled ) {
+						return false;
+					}
+					$( this ).removeClass( "ui-state-active" );
+				})
+				.bind( "keydown.button", function(event) {
+					if ( options.disabled ) {
+						return false;
+					}
+					if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) {
+						$( this ).addClass( "ui-state-active" );
+					}
+				})
+				.bind( "keyup.button", function() {
+					$( this ).removeClass( "ui-state-active" );
+				});
+
+			if ( this.buttonElement.is("a") ) {
+				this.buttonElement.keyup(function(event) {
+					if ( event.keyCode === $.ui.keyCode.SPACE ) {
+						// TODO pass through original event correctly (just as 2nd argument doesn't work)
+						$( this ).click();
+					}
+				});
+			}
+		}
+
+		// TODO: pull out $.Widget's handling for the disabled option into
+		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
+		// be overridden by individual plugins
+		this._setOption( "disabled", options.disabled );
+		this._resetButton();
+	},
+
+	_determineButtonType: function() {
+
+		if ( this.element.is(":checkbox") ) {
+			this.type = "checkbox";
+		} else if ( this.element.is(":radio") ) {
+			this.type = "radio";
+		} else if ( this.element.is("input") ) {
+			this.type = "input";
+		} else {
+			this.type = "button";
+		}
+
+		if ( this.type === "checkbox" || this.type === "radio" ) {
+			// we don't search against the document in case the element
+			// is disconnected from the DOM
+			var ancestor = this.element.parents().filter(":last"),
+				labelSelector = "label[for='" + this.element.attr("id") + "']";
+			this.buttonElement = ancestor.find( labelSelector );
+			if ( !this.buttonElement.length ) {
+				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
+				this.buttonElement = ancestor.filter( labelSelector );
+				if ( !this.buttonElement.length ) {
+					this.buttonElement = ancestor.find( labelSelector );
+				}
+			}
+			this.element.addClass( "ui-helper-hidden-accessible" );
+
+			var checked = this.element.is( ":checked" );
+			if ( checked ) {
+				this.buttonElement.addClass( "ui-state-active" );
+			}
+			this.buttonElement.attr( "aria-pressed", checked );
+		} else {
+			this.buttonElement = this.element;
+		}
+	},
+
+	widget: function() {
+		return this.buttonElement;
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-helper-hidden-accessible" );
+		this.buttonElement
+			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
+			.removeAttr( "role" )
+			.removeAttr( "aria-pressed" )
+			.html( this.buttonElement.find(".ui-button-text").html() );
+
+		if ( !this.hasTitle ) {
+			this.buttonElement.removeAttr( "title" );
+		}
+
+		$.Widget.prototype.destroy.call( this );
+	},
+
+	_setOption: function( key, value ) {
+		$.Widget.prototype._setOption.apply( this, arguments );
+		if ( key === "disabled" ) {
+			if ( value ) {
+				this.element.propAttr( "disabled", true );
+			} else {
+				this.element.propAttr( "disabled", false );
+			}
+			return;
+		}
+		this._resetButton();
+	},
+
+	refresh: function() {
+		var isDisabled = this.element.is( ":disabled" );
+		if ( isDisabled !== this.options.disabled ) {
+			this._setOption( "disabled", isDisabled );
+		}
+		if ( this.type === "radio" ) {
+			radioGroup( this.element[0] ).each(function() {
+				if ( $( this ).is( ":checked" ) ) {
+					$( this ).button( "widget" )
+						.addClass( "ui-state-active" )
+						.attr( "aria-pressed", "true" );
+				} else {
+					$( this ).button( "widget" )
+						.removeClass( "ui-state-active" )
+						.attr( "aria-pressed", "false" );
+				}
+			});
+		} else if ( this.type === "checkbox" ) {
+			if ( this.element.is( ":checked" ) ) {
+				this.buttonElement
+					.addClass( "ui-state-active" )
+					.attr( "aria-pressed", "true" );
+			} else {
+				this.buttonElement
+					.removeClass( "ui-state-active" )
+					.attr( "aria-pressed", "false" );
+			}
+		}
+	},
+
+	_resetButton: function() {
+		if ( this.type === "input" ) {
+			if ( this.options.label ) {
+				this.element.val( this.options.label );
+			}
+			return;
+		}
+		var buttonElement = this.buttonElement.removeClass( typeClasses ),
+			buttonText = $( "<span></span>" )
+				.addClass( "ui-button-text" )
+				.html( this.options.label )
+				.appendTo( buttonElement.empty() )
+				.text(),
+			icons = this.options.icons,
+			multipleIcons = icons.primary && icons.secondary,
+			buttonClasses = [];  
+
+		if ( icons.primary || icons.secondary ) {
+			if ( this.options.text ) {
+				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
+			}
+
+			if ( icons.primary ) {
+				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
+			}
+
+			if ( icons.secondary ) {
+				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
+			}
+
+			if ( !this.options.text ) {
+				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
+
+				if ( !this.hasTitle ) {
+					buttonElement.attr( "title", buttonText );
+				}
+			}
+		} else {
+			buttonClasses.push( "ui-button-text-only" );
+		}
+		buttonElement.addClass( buttonClasses.join( " " ) );
+	}
+});
+
+$.widget( "ui.buttonset", {
+	options: {
+		items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)"
+	},
+
+	_create: function() {
+		this.element.addClass( "ui-buttonset" );
+	},
+	
+	_init: function() {
+		this.refresh();
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "disabled" ) {
+			this.buttons.button( "option", key, value );
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+	
+	refresh: function() {
+		var ltr = this.element.css( "direction" ) === "ltr";
+		
+		this.buttons = this.element.find( this.options.items )
+			.filter( ":ui-button" )
+				.button( "refresh" )
+			.end()
+			.not( ":ui-button" )
+				.button()
+			.end()
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
+				.filter( ":first" )
+					.addClass( ltr ? "ui-corner-left" : "ui-corner-right" )
+				.end()
+				.filter( ":last" )
+					.addClass( ltr ? "ui-corner-right" : "ui-corner-left" )
+				.end()
+			.end();
+	},
+
+	destroy: function() {
+		this.element.removeClass( "ui-buttonset" );
+		this.buttons
+			.map(function() {
+				return $( this ).button( "widget" )[ 0 ];
+			})
+				.removeClass( "ui-corner-left ui-corner-right" )
+			.end()
+			.button( "destroy" );
+
+		$.Widget.prototype.destroy.call( this );
+	}
+});
+
+}( jQuery ) );
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.core.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.core.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.core.js	(revision 14585)
@@ -0,0 +1,314 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function( $, undefined ) {
+
+// prevent duplicate loading
+// this is only a problem because we proxy existing functions
+// and we don't want to double proxy them
+$.ui = $.ui || {};
+if ( $.ui.version ) {
+	return;
+}
+
+$.extend( $.ui, {
+	version: "1.8.16",
+
+	keyCode: {
+		ALT: 18,
+		BACKSPACE: 8,
+		CAPS_LOCK: 20,
+		COMMA: 188,
+		COMMAND: 91,
+		COMMAND_LEFT: 91, // COMMAND
+		COMMAND_RIGHT: 93,
+		CONTROL: 17,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		INSERT: 45,
+		LEFT: 37,
+		MENU: 93, // COMMAND_RIGHT
+		NUMPAD_ADD: 107,
+		NUMPAD_DECIMAL: 110,
+		NUMPAD_DIVIDE: 111,
+		NUMPAD_ENTER: 108,
+		NUMPAD_MULTIPLY: 106,
+		NUMPAD_SUBTRACT: 109,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SHIFT: 16,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38,
+		WINDOWS: 91 // COMMAND
+	}
+});
+
+// plugins
+$.fn.extend({
+	propAttr: $.fn.prop || $.fn.attr,
+
+	_focus: $.fn.focus,
+	focus: function( delay, fn ) {
+		return typeof delay === "number" ?
+			this.each(function() {
+				var elem = this;
+				setTimeout(function() {
+					$( elem ).focus();
+					if ( fn ) {
+						fn.call( elem );
+					}
+				}, delay );
+			}) :
+			this._focus.apply( this, arguments );
+	},
+
+	scrollParent: function() {
+		var scrollParent;
+		if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+			scrollParent = this.parents().filter(function() {
+				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		} else {
+			scrollParent = this.parents().filter(function() {
+				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+			}).eq(0);
+		}
+
+		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), position, value;
+			while ( elem.length && elem[ 0 ] !== document ) {
+				// Ignore z-index if position is set to a value where z-index is ignored by the browser
+				// This makes behavior of this function consistent across browsers
+				// WebKit always returns auto if the element is positioned
+				position = elem.css( "position" );
+				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+					// IE returns 0 when zIndex is not specified
+					// other browsers return a string
+					// we ignore the case of nested elements with an explicit value of 0
+					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+					value = parseInt( elem.css( "zIndex" ), 10 );
+					if ( !isNaN( value ) && value !== 0 ) {
+						return value;
+					}
+				}
+				elem = elem.parent();
+			}
+		}
+
+		return 0;
+	},
+
+	disableSelection: function() {
+		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+			".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+	},
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	}
+});
+
+$.each( [ "Width", "Height" ], function( i, name ) {
+	var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+		type = name.toLowerCase(),
+		orig = {
+			innerWidth: $.fn.innerWidth,
+			innerHeight: $.fn.innerHeight,
+			outerWidth: $.fn.outerWidth,
+			outerHeight: $.fn.outerHeight
+		};
+
+	function reduce( elem, size, border, margin ) {
+		$.each( side, function() {
+			size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0;
+			if ( border ) {
+				size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0;
+			}
+			if ( margin ) {
+				size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0;
+			}
+		});
+		return size;
+	}
+
+	$.fn[ "inner" + name ] = function( size ) {
+		if ( size === undefined ) {
+			return orig[ "inner" + name ].call( this );
+		}
+
+		return this.each(function() {
+			$( this ).css( type, reduce( this, size ) + "px" );
+		});
+	};
+
+	$.fn[ "outer" + name] = function( size, margin ) {
+		if ( typeof size !== "number" ) {
+			return orig[ "outer" + name ].call( this, size );
+		}
+
+		return this.each(function() {
+			$( this).css( type, reduce( this, size, true, margin ) + "px" );
+		});
+	};
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var nodeName = element.nodeName.toLowerCase();
+	if ( "area" === nodeName ) {
+		var map = element.parentNode,
+			mapName = map.name,
+			img;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap=#" + mapName + "]" )[0];
+		return !!img && visible( img );
+	}
+	return ( /input|select|textarea|button|object/.test( nodeName )
+		? !element.disabled
+		: "a" == nodeName
+			? element.href || isTabIndexNotNaN
+			: isTabIndexNotNaN)
+		// the element and all of its ancestors must be visible
+		&& visible( element );
+}
+
+function visible( element ) {
+	return !$( element ).parents().andSelf().filter(function() {
+		return $.curCSS( this, "visibility" ) === "hidden" ||
+			$.expr.filters.hidden( this );
+	}).length;
+}
+
+$.extend( $.expr[ ":" ], {
+	data: function( elem, i, match ) {
+		return !!$.data( elem, match[ 3 ] );
+	},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support
+$(function() {
+	var body = document.body,
+		div = body.appendChild( div = document.createElement( "div" ) );
+
+	$.extend( div.style, {
+		minHeight: "100px",
+		height: "auto",
+		padding: 0,
+		borderWidth: 0
+	});
+
+	$.support.minHeight = div.offsetHeight === 100;
+	$.support.selectstart = "onselectstart" in div;
+
+	// set display to none to avoid a layout bug in IE
+	// http://dev.jquery.com/ticket/4014
+	body.removeChild( div ).style.display = "none";
+});
+
+
+
+
+
+// deprecated
+$.extend( $.ui, {
+	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
+	plugin: {
+		add: function( module, option, set ) {
+			var proto = $.ui[ module ].prototype;
+			for ( var i in set ) {
+				proto.plugins[ i ] = proto.plugins[ i ] || [];
+				proto.plugins[ i ].push( [ option, set[ i ] ] );
+			}
+		},
+		call: function( instance, name, args ) {
+			var set = instance.plugins[ name ];
+			if ( !set || !instance.element[ 0 ].parentNode ) {
+				return;
+			}
+	
+			for ( var i = 0; i < set.length; i++ ) {
+				if ( instance.options[ set[ i ][ 0 ] ] ) {
+					set[ i ][ 1 ].apply( instance.element, args );
+				}
+			}
+		}
+	},
+	
+	// will be deprecated when we switch to jQuery 1.4 - use jQuery.contains()
+	contains: function( a, b ) {
+		return document.compareDocumentPosition ?
+			a.compareDocumentPosition( b ) & 16 :
+			a !== b && a.contains( b );
+	},
+	
+	// only used by resizable
+	hasScroll: function( el, a ) {
+	
+		//If overflow is hidden, the element might have extra content, but the user wants to hide it
+		if ( $( el ).css( "overflow" ) === "hidden") {
+			return false;
+		}
+	
+		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
+			has = false;
+	
+		if ( el[ scroll ] > 0 ) {
+			return true;
+		}
+	
+		// TODO: determine which cases actually cause this to happen
+		// if the element doesn't have the scroll set, see if it's possible to
+		// set the scroll
+		el[ scroll ] = 1;
+		has = ( el[ scroll ] > 0 );
+		el[ scroll ] = 0;
+		return has;
+	},
+	
+	// these are odd functions, fix the API or move into individual plugins
+	isOverAxis: function( x, reference, size ) {
+		//Determines when x coordinate is over "b" element axis
+		return ( x > reference ) && ( x < ( reference + size ) );
+	},
+	isOver: function( y, x, top, left, height, width ) {
+		//Determines when x, y coordinates is over "b" element
+		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
+	}
+});
+
+})( jQuery );
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.datepicker.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.datepicker.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.datepicker.js	(revision 14585)
@@ -0,0 +1,1823 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function( $, undefined ) {
+
+$.extend($.ui, { datepicker: { version: "1.8.16" } });
+
+var PROP_NAME = 'datepicker';
+var dpuuid = new Date().getTime();
+var instActive;
+
+/* Date picker manager.
+   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
+   Settings for (groups of) date pickers are maintained in an instance object,
+   allowing multiple different settings on the same page. */
+
+function Datepicker() {
+	this.debug = false; // Change this to true to start debugging
+	this._curInst = null; // The current instance in use
+	this._keyEvent = false; // If the last event was a key event
+	this._disabledInputs = []; // List of date picker inputs that have been disabled
+	this._datepickerShowing = false; // True if the popup picker is showing , false if not
+	this._inDialog = false; // True if showing within a "dialog", false if not
+	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
+	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
+	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
+	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
+	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
+	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
+	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
+	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
+	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
+	this.regional = []; // Available regional settings, indexed by language code
+	this.regional[''] = { // Default regional settings
+		closeText: 'Done', // Display text for close link
+		prevText: 'Prev', // Display text for previous month link
+		nextText: 'Next', // Display text for next month link
+		currentText: 'Today', // Display text for current month link
+		monthNames: ['January','February','March','April','May','June',
+			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
+		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
+		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
+		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
+		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
+		weekHeader: 'Wk', // Column header for week of the year
+		dateFormat: 'mm/dd/yy', // See format options on parseDate
+		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
+		isRTL: false, // True if right-to-left language, false if left-to-right
+		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
+		yearSuffix: '' // Additional text to append to the year in the month headers
+	};
+	this._defaults = { // Global defaults for all the date picker instances
+		showOn: 'focus', // 'focus' for popup on focus,
+			// 'button' for trigger button, or 'both' for either
+		showAnim: 'fadeIn', // Name of jQuery animation for popup
+		showOptions: {}, // Options for enhanced animations
+		defaultDate: null, // Used when field is blank: actual date,
+			// +/-number for offset from today, null for today
+		appendText: '', // Display text following the input box, e.g. showing the format
+		buttonText: '...', // Text for trigger button
+		buttonImage: '', // URL for trigger button image
+		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
+		hideIfNoPrevNext: false, // True to hide next/previous month links
+			// if not applicable, false to just disable them
+		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
+		gotoCurrent: false, // True if today link goes back to current selection instead
+		changeMonth: false, // True if month can be selected directly, false if only prev/next
+		changeYear: false, // True if year can be selected directly, false if only prev/next
+		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
+			// either relative to today's year (-nn:+nn), relative to currently displayed year
+			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+		showOtherMonths: false, // True to show dates in other months, false to leave blank
+		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
+		showWeek: false, // True to show week of the year, false to not show it
+		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
+			// takes a Date and returns the number of the week for it
+		shortYearCutoff: '+10', // Short year values < this are in the current century,
+			// > this are in the previous century,
+			// string value starting with '+' for current year + value
+		minDate: null, // The earliest selectable date, or null for no limit
+		maxDate: null, // The latest selectable date, or null for no limit
+		duration: 'fast', // Duration of display/closure
+		beforeShowDay: null, // Function that takes a date and returns an array with
+			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
+			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
+		beforeShow: null, // Function that takes an input field and
+			// returns a set of custom settings for the date picker
+		onSelect: null, // Define a callback function when a date is selected
+		onChangeMonthYear: null, // Define a callback function when the month or year is changed
+		onClose: null, // Define a callback function when the datepicker is closed
+		numberOfMonths: 1, // Number of months to show at a time
+		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
+		stepMonths: 1, // Number of months to step back/forward
+		stepBigMonths: 12, // Number of months to step back/forward for the big links
+		altField: '', // Selector for an alternate field to store selected dates into
+		altFormat: '', // The date format to use for the alternate field
+		constrainInput: true, // The input is constrained by the current date format
+		showButtonPanel: false, // True to show button panel, false to not show it
+		autoSize: false, // True to size the input for the date format, false to leave as is
+		disabled: false // The initial disabled state
+	};
+	$.extend(this._defaults, this.regional['']);
+	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
+}
+
+$.extend(Datepicker.prototype, {
+	/* Class name added to elements to indicate already configured with a date picker. */
+	markerClassName: 'hasDatepicker',
+	
+	//Keep track of the maximum number of rows displayed (see #7043)
+	maxRows: 4,
+
+	/* Debug logging (if enabled). */
+	log: function () {
+		if (this.debug)
+			console.log.apply('', arguments);
+	},
+	
+	// TODO rename to "widget" when switching to widget factory
+	_widgetDatepicker: function() {
+		return this.dpDiv;
+	},
+
+	/* Override the default settings for all instances of the date picker.
+	   @param  settings  object - the new settings to use as defaults (anonymous object)
+	   @return the manager object */
+	setDefaults: function(settings) {
+		extendRemove(this._defaults, settings || {});
+		return this;
+	},
+
+	/* Attach the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span
+	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
+	_attachDatepicker: function(target, settings) {
+		// check for settings on the control itself - in namespace 'date:'
+		var inlineSettings = null;
+		for (var attrName in this._defaults) {
+			var attrValue = target.getAttribute('date:' + attrName);
+			if (attrValue) {
+				inlineSettings = inlineSettings || {};
+				try {
+					inlineSettings[attrName] = eval(attrValue);
+				} catch (err) {
+					inlineSettings[attrName] = attrValue;
+				}
+			}
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		var inline = (nodeName == 'div' || nodeName == 'span');
+		if (!target.id) {
+			this.uuid += 1;
+			target.id = 'dp' + this.uuid;
+		}
+		var inst = this._newInst($(target), inline);
+		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
+		if (nodeName == 'input') {
+			this._connectDatepicker(target, inst);
+		} else if (inline) {
+			this._inlineDatepicker(target, inst);
+		}
+	},
+
+	/* Create a new instance object. */
+	_newInst: function(target, inline) {
+		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
+		return {id: id, input: target, // associated target
+			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
+			drawMonth: 0, drawYear: 0, // month being drawn
+			inline: inline, // is datepicker inline or not
+			dpDiv: (!inline ? this.dpDiv : // presentation div
+			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
+	},
+
+	/* Attach the date picker to an input field. */
+	_connectDatepicker: function(target, inst) {
+		var input = $(target);
+		inst.append = $([]);
+		inst.trigger = $([]);
+		if (input.hasClass(this.markerClassName))
+			return;
+		this._attachments(input, inst);
+		input.addClass(this.markerClassName).keydown(this._doKeyDown).
+			keypress(this._doKeyPress).keyup(this._doKeyUp).
+			bind("setData.datepicker", function(event, key, value) {
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key) {
+				return this._get(inst, key);
+			});
+		this._autoSize(inst);
+		$.data(target, PROP_NAME, inst);
+		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+	},
+
+	/* Make attachments based on settings. */
+	_attachments: function(input, inst) {
+		var appendText = this._get(inst, 'appendText');
+		var isRTL = this._get(inst, 'isRTL');
+		if (inst.append)
+			inst.append.remove();
+		if (appendText) {
+			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
+			input[isRTL ? 'before' : 'after'](inst.append);
+		}
+		input.unbind('focus', this._showDatepicker);
+		if (inst.trigger)
+			inst.trigger.remove();
+		var showOn = this._get(inst, 'showOn');
+		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
+			input.focus(this._showDatepicker);
+		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
+			var buttonText = this._get(inst, 'buttonText');
+			var buttonImage = this._get(inst, 'buttonImage');
+			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
+				$('<img/>').addClass(this._triggerClass).
+					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
+				$('<button type="button"></button>').addClass(this._triggerClass).
+					html(buttonImage == '' ? buttonText : $('<img/>').attr(
+					{ src:buttonImage, alt:buttonText, title:buttonText })));
+			input[isRTL ? 'before' : 'after'](inst.trigger);
+			inst.trigger.click(function() {
+				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
+					$.datepicker._hideDatepicker();
+				else
+					$.datepicker._showDatepicker(input[0]);
+				return false;
+			});
+		}
+	},
+
+	/* Apply the maximum length for the date format. */
+	_autoSize: function(inst) {
+		if (this._get(inst, 'autoSize') && !inst.inline) {
+			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
+			var dateFormat = this._get(inst, 'dateFormat');
+			if (dateFormat.match(/[DM]/)) {
+				var findMax = function(names) {
+					var max = 0;
+					var maxI = 0;
+					for (var i = 0; i < names.length; i++) {
+						if (names[i].length > max) {
+							max = names[i].length;
+							maxI = i;
+						}
+					}
+					return maxI;
+				};
+				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
+					'monthNames' : 'monthNamesShort'))));
+				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
+					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
+			}
+			inst.input.attr('size', this._formatDate(inst, date).length);
+		}
+	},
+
+	/* Attach an inline date picker to a div. */
+	_inlineDatepicker: function(target, inst) {
+		var divSpan = $(target);
+		if (divSpan.hasClass(this.markerClassName))
+			return;
+		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
+			bind("setData.datepicker", function(event, key, value){
+				inst.settings[key] = value;
+			}).bind("getData.datepicker", function(event, key){
+				return this._get(inst, key);
+			});
+		$.data(target, PROP_NAME, inst);
+		this._setDate(inst, this._getDefaultDate(inst), true);
+		this._updateDatepicker(inst);
+		this._updateAlternate(inst);
+		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
+		if( inst.settings.disabled ) {
+			this._disableDatepicker( target );
+		}
+		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
+		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
+		inst.dpDiv.css( "display", "block" );
+	},
+
+	/* Pop-up the date picker in a "dialog" box.
+	   @param  input     element - ignored
+	   @param  date      string or Date - the initial date to display
+	   @param  onSelect  function - the function to call when a date is selected
+	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
+	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
+	                     event - with x/y coordinates or
+	                     leave empty for default (screen centre)
+	   @return the manager object */
+	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
+		var inst = this._dialogInst; // internal instance
+		if (!inst) {
+			this.uuid += 1;
+			var id = 'dp' + this.uuid;
+			this._dialogInput = $('<input type="text" id="' + id +
+				'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');
+			this._dialogInput.keydown(this._doKeyDown);
+			$('body').append(this._dialogInput);
+			inst = this._dialogInst = this._newInst(this._dialogInput, false);
+			inst.settings = {};
+			$.data(this._dialogInput[0], PROP_NAME, inst);
+		}
+		extendRemove(inst.settings, settings || {});
+		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
+		this._dialogInput.val(date);
+
+		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
+		if (!this._pos) {
+			var browserWidth = document.documentElement.clientWidth;
+			var browserHeight = document.documentElement.clientHeight;
+			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
+			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+			this._pos = // should use actual width/height below
+				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
+		}
+
+		// move input on screen for focus, but hidden behind dialog
+		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
+		inst.settings.onSelect = onSelect;
+		this._inDialog = true;
+		this.dpDiv.addClass(this._dialogClass);
+		this._showDatepicker(this._dialogInput[0]);
+		if ($.blockUI)
+			$.blockUI(this.dpDiv);
+		$.data(this._dialogInput[0], PROP_NAME, inst);
+		return this;
+	},
+
+	/* Detach a datepicker from its control.
+	   @param  target    element - the target input field or division or span */
+	_destroyDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		$.removeData(target, PROP_NAME);
+		if (nodeName == 'input') {
+			inst.append.remove();
+			inst.trigger.remove();
+			$target.removeClass(this.markerClassName).
+				unbind('focus', this._showDatepicker).
+				unbind('keydown', this._doKeyDown).
+				unbind('keypress', this._doKeyPress).
+				unbind('keyup', this._doKeyUp);
+		} else if (nodeName == 'div' || nodeName == 'span')
+			$target.removeClass(this.markerClassName).empty();
+	},
+
+	/* Enable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_enableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = false;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = false; }).end().
+				filter('img').css({opacity: '1.0', cursor: ''});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().removeClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				removeAttr("disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+	},
+
+	/* Disable the date picker to a jQuery selection.
+	   @param  target    element - the target input field or division or span */
+	_disableDatepicker: function(target) {
+		var $target = $(target);
+		var inst = $.data(target, PROP_NAME);
+		if (!$target.hasClass(this.markerClassName)) {
+			return;
+		}
+		var nodeName = target.nodeName.toLowerCase();
+		if (nodeName == 'input') {
+			target.disabled = true;
+			inst.trigger.filter('button').
+				each(function() { this.disabled = true; }).end().
+				filter('img').css({opacity: '0.5', cursor: 'default'});
+		}
+		else if (nodeName == 'div' || nodeName == 'span') {
+			var inline = $target.children('.' + this._inlineClass);
+			inline.children().addClass('ui-state-disabled');
+			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
+				attr("disabled", "disabled");
+		}
+		this._disabledInputs = $.map(this._disabledInputs,
+			function(value) { return (value == target ? null : value); }); // delete entry
+		this._disabledInputs[this._disabledInputs.length] = target;
+	},
+
+	/* Is the first field in a jQuery collection disabled as a datepicker?
+	   @param  target    element - the target input field or division or span
+	   @return boolean - true if disabled, false if enabled */
+	_isDisabledDatepicker: function(target) {
+		if (!target) {
+			return false;
+		}
+		for (var i = 0; i < this._disabledInputs.length; i++) {
+			if (this._disabledInputs[i] == target)
+				return true;
+		}
+		return false;
+	},
+
+	/* Retrieve the instance data for the target control.
+	   @param  target  element - the target input field or division or span
+	   @return  object - the associated instance data
+	   @throws  error if a jQuery problem getting data */
+	_getInst: function(target) {
+		try {
+			return $.data(target, PROP_NAME);
+		}
+		catch (err) {
+			throw 'Missing instance data for this datepicker';
+		}
+	},
+
+	/* Update or retrieve the settings for a date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span
+	   @param  name    object - the new settings to update or
+	                   string - the name of the setting to change or retrieve,
+	                   when retrieving also 'all' for all instance settings or
+	                   'defaults' for all global defaults
+	   @param  value   any - the new value for the setting
+	                   (omit if above is an object or to retrieve a value) */
+	_optionDatepicker: function(target, name, value) {
+		var inst = this._getInst(target);
+		if (arguments.length == 2 && typeof name == 'string') {
+			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
+				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
+				this._get(inst, name)) : null));
+		}
+		var settings = name || {};
+		if (typeof name == 'string') {
+			settings = {};
+			settings[name] = value;
+		}
+		if (inst) {
+			if (this._curInst == inst) {
+				this._hideDatepicker();
+			}
+			var date = this._getDateDatepicker(target, true);
+			var minDate = this._getMinMaxDate(inst, 'min');
+			var maxDate = this._getMinMaxDate(inst, 'max');
+			extendRemove(inst.settings, settings);
+			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
+			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
+				inst.settings.minDate = this._formatDate(inst, minDate);
+			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
+				inst.settings.maxDate = this._formatDate(inst, maxDate);
+			this._attachments($(target), inst);
+			this._autoSize(inst);
+			this._setDate(inst, date);
+			this._updateAlternate(inst);
+			this._updateDatepicker(inst);
+		}
+	},
+
+	// change method deprecated
+	_changeDatepicker: function(target, name, value) {
+		this._optionDatepicker(target, name, value);
+	},
+
+	/* Redraw the date picker attached to an input field or division.
+	   @param  target  element - the target input field or division or span */
+	_refreshDatepicker: function(target) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._updateDatepicker(inst);
+		}
+	},
+
+	/* Set the dates for a jQuery selection.
+	   @param  target   element - the target input field or division or span
+	   @param  date     Date - the new date */
+	_setDateDatepicker: function(target, date) {
+		var inst = this._getInst(target);
+		if (inst) {
+			this._setDate(inst, date);
+			this._updateDatepicker(inst);
+			this._updateAlternate(inst);
+		}
+	},
+
+	/* Get the date(s) for the first entry in a jQuery selection.
+	   @param  target     element - the target input field or division or span
+	   @param  noDefault  boolean - true if no default date is to be used
+	   @return Date - the current date */
+	_getDateDatepicker: function(target, noDefault) {
+		var inst = this._getInst(target);
+		if (inst && !inst.inline)
+			this._setDateFromField(inst, noDefault);
+		return (inst ? this._getDate(inst) : null);
+	},
+
+	/* Handle keystrokes. */
+	_doKeyDown: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		var handled = true;
+		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
+		inst._keyEvent = true;
+		if ($.datepicker._datepickerShowing)
+			switch (event.keyCode) {
+				case 9: $.datepicker._hideDatepicker();
+						handled = false;
+						break; // hide on tab out
+				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + 
+									$.datepicker._currentClass + ')', inst.dpDiv);
+						if (sel[0])
+							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
+							var onSelect = $.datepicker._get(inst, 'onSelect');
+							if (onSelect) {
+								var dateStr = $.datepicker._formatDate(inst);
+
+								// trigger custom callback
+								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
+							}
+						else
+							$.datepicker._hideDatepicker();
+						return false; // don't submit the form
+						break; // select the value on enter
+				case 27: $.datepicker._hideDatepicker();
+						break; // hide on escape
+				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							-$.datepicker._get(inst, 'stepBigMonths') :
+							-$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // previous month/year on page up/+ ctrl
+				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+							+$.datepicker._get(inst, 'stepBigMonths') :
+							+$.datepicker._get(inst, 'stepMonths')), 'M');
+						break; // next month/year on page down/+ ctrl
+				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // clear on ctrl or command +end
+				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
+						handled = event.ctrlKey || event.metaKey;
+						break; // current on ctrl or command +home
+				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// -1 day on ctrl or command +left
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									-$.datepicker._get(inst, 'stepBigMonths') :
+									-$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +left on Mac
+						break;
+				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // -1 week on ctrl or command +up
+				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
+						handled = event.ctrlKey || event.metaKey;
+						// +1 day on ctrl or command +right
+						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
+									+$.datepicker._get(inst, 'stepBigMonths') :
+									+$.datepicker._get(inst, 'stepMonths')), 'M');
+						// next month/year on alt +right
+						break;
+				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
+						handled = event.ctrlKey || event.metaKey;
+						break; // +1 week on ctrl or command +down
+				default: handled = false;
+			}
+		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
+			$.datepicker._showDatepicker(this);
+		else {
+			handled = false;
+		}
+		if (handled) {
+			event.preventDefault();
+			event.stopPropagation();
+		}
+	},
+
+	/* Filter entered characters - based on date format. */
+	_doKeyPress: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if ($.datepicker._get(inst, 'constrainInput')) {
+			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
+			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
+			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
+		}
+	},
+
+	/* Synchronise manual entry and field/alternate field. */
+	_doKeyUp: function(event) {
+		var inst = $.datepicker._getInst(event.target);
+		if (inst.input.val() != inst.lastVal) {
+			try {
+				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					(inst.input ? inst.input.val() : null),
+					$.datepicker._getFormatConfig(inst));
+				if (date) { // only if valid
+					$.datepicker._setDateFromField(inst);
+					$.datepicker._updateAlternate(inst);
+					$.datepicker._updateDatepicker(inst);
+				}
+			}
+			catch (event) {
+				$.datepicker.log(event);
+			}
+		}
+		return true;
+	},
+
+	/* Pop-up the date picker for a given input field.
+       If false returned from beforeShow event handler do not show. 
+	   @param  input  element - the input field attached to the date picker or
+	                  event - if triggered by focus */
+	_showDatepicker: function(input) {
+		input = input.target || input;
+		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
+			input = $('input', input.parentNode)[0];
+		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
+			return;
+		var inst = $.datepicker._getInst(input);
+		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
+			if ( $.datepicker._datepickerShowing ) {
+				$.datepicker._triggerOnClose($.datepicker._curInst);
+			}
+			$.datepicker._curInst.dpDiv.stop(true, true);
+		}
+		var beforeShow = $.datepicker._get(inst, 'beforeShow');
+		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
+		if(beforeShowSettings === false){
+            //false
+			return;
+		}
+		extendRemove(inst.settings, beforeShowSettings);
+		inst.lastVal = null;
+		$.datepicker._lastInput = input;
+		$.datepicker._setDateFromField(inst);
+		if ($.datepicker._inDialog) // hide cursor
+			input.value = '';
+		if (!$.datepicker._pos) { // position below input
+			$.datepicker._pos = $.datepicker._findPos(input);
+			$.datepicker._pos[1] += input.offsetHeight; // add the height
+		}
+		var isFixed = false;
+		$(input).parents().each(function() {
+			isFixed |= $(this).css('position') == 'fixed';
+			return !isFixed;
+		});
+		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
+			$.datepicker._pos[0] -= document.documentElement.scrollLeft;
+			$.datepicker._pos[1] -= document.documentElement.scrollTop;
+		}
+		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
+		$.datepicker._pos = null;
+		//to avoid flashes on Firefox
+		inst.dpDiv.empty();
+		// determine sizing offscreen
+		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
+		$.datepicker._updateDatepicker(inst);
+		// fix width for dynamic number of date pickers
+		// and adjust position before showing
+		offset = $.datepicker._checkOffset(inst, offset, isFixed);
+		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
+			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
+			left: offset.left + 'px', top: offset.top + 'px'});
+		if (!inst.inline) {
+			var showAnim = $.datepicker._get(inst, 'showAnim');
+			var duration = $.datepicker._get(inst, 'duration');
+			var postProcess = function() {
+				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+				if( !! cover.length ){
+					var borders = $.datepicker._getBorders(inst.dpDiv);
+					cover.css({left: -borders[0], top: -borders[1],
+						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
+				}
+			};
+			inst.dpDiv.zIndex($(input).zIndex()+1);
+			$.datepicker._datepickerShowing = true;
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
+			if (!showAnim || !duration)
+				postProcess();
+			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
+				inst.input.focus();
+			$.datepicker._curInst = inst;
+		}
+	},
+
+	/* Generate the date picker content. */
+	_updateDatepicker: function(inst) {
+		var self = this;
+		self.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
+		var borders = $.datepicker._getBorders(inst.dpDiv);
+		instActive = inst; // for delegate hover events
+		inst.dpDiv.empty().append(this._generateHTML(inst));
+		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
+		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
+			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
+		}
+		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
+		var numMonths = this._getNumberOfMonths(inst);
+		var cols = numMonths[1];
+		var width = 17;
+		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
+		if (cols > 1)
+			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
+		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
+			'Class']('ui-datepicker-multi');
+		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
+			'Class']('ui-datepicker-rtl');
+		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
+				// #6694 - don't focus the input if it's already focused
+				// this breaks the change event in IE
+				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
+			inst.input.focus();
+		// deffered render of the years select (to avoid flashes on Firefox) 
+		if( inst.yearshtml ){
+			var origyearshtml = inst.yearshtml;
+			setTimeout(function(){
+				//assure that inst.yearshtml didn't change.
+				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
+					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
+				}
+				origyearshtml = inst.yearshtml = null;
+			}, 0);
+		}
+	},
+
+	/* Retrieve the size of left and top borders for an element.
+	   @param  elem  (jQuery object) the element of interest
+	   @return  (number[2]) the left and top borders */
+	_getBorders: function(elem) {
+		var convert = function(value) {
+			return {thin: 1, medium: 2, thick: 3}[value] || value;
+		};
+		return [parseFloat(convert(elem.css('border-left-width'))),
+			parseFloat(convert(elem.css('border-top-width')))];
+	},
+
+	/* Check positioning to remain on screen. */
+	_checkOffset: function(inst, offset, isFixed) {
+		var dpWidth = inst.dpDiv.outerWidth();
+		var dpHeight = inst.dpDiv.outerHeight();
+		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
+		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
+		var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft();
+		var viewHeight = document.documentElement.clientHeight + $(document).scrollTop();
+
+		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
+		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
+		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
+
+		// now check if datepicker is showing outside window viewport - move to a better place if so.
+		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+			Math.abs(offset.left + dpWidth - viewWidth) : 0);
+		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+			Math.abs(dpHeight + inputHeight) : 0);
+
+		return offset;
+	},
+
+	/* Find an object's position on the screen. */
+	_findPos: function(obj) {
+		var inst = this._getInst(obj);
+		var isRTL = this._get(inst, 'isRTL');
+        while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
+            obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
+        }
+        var position = $(obj).offset();
+	    return [position.left, position.top];
+	},
+
+	/* Trigger custom callback of onClose. */
+	_triggerOnClose: function(inst) {
+		var onClose = this._get(inst, 'onClose');
+		if (onClose)
+			onClose.apply((inst.input ? inst.input[0] : null),
+						  [(inst.input ? inst.input.val() : ''), inst]);
+	},
+
+	/* Hide the date picker from view.
+	   @param  input  element - the input field attached to the date picker */
+	_hideDatepicker: function(input) {
+		var inst = this._curInst;
+		if (!inst || (input && inst != $.data(input, PROP_NAME)))
+			return;
+		if (this._datepickerShowing) {
+			var showAnim = this._get(inst, 'showAnim');
+			var duration = this._get(inst, 'duration');
+			var postProcess = function() {
+				$.datepicker._tidyDialog(inst);
+				this._curInst = null;
+			};
+			if ($.effects && $.effects[showAnim])
+				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
+			else
+				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
+					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
+			if (!showAnim)
+				postProcess();
+			$.datepicker._triggerOnClose(inst);
+			this._datepickerShowing = false;
+			this._lastInput = null;
+			if (this._inDialog) {
+				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
+				if ($.blockUI) {
+					$.unblockUI();
+					$('body').append(this.dpDiv);
+				}
+			}
+			this._inDialog = false;
+		}
+	},
+
+	/* Tidy up after a dialog display. */
+	_tidyDialog: function(inst) {
+		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
+	},
+
+	/* Close date picker if clicked elsewhere. */
+	_checkExternalClick: function(event) {
+		if (!$.datepicker._curInst)
+			return;
+		var $target = $(event.target);
+		if ($target[0].id != $.datepicker._mainDivId &&
+				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
+				!$target.hasClass($.datepicker.markerClassName) &&
+				!$target.hasClass($.datepicker._triggerClass) &&
+				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
+			$.datepicker._hideDatepicker();
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustDate: function(id, offset, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		this._adjustInstDate(inst, offset +
+			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
+			period);
+		this._updateDatepicker(inst);
+	},
+
+	/* Action for current link. */
+	_gotoToday: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
+			inst.selectedDay = inst.currentDay;
+			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
+			inst.drawYear = inst.selectedYear = inst.currentYear;
+		}
+		else {
+			var date = new Date();
+			inst.selectedDay = date.getDate();
+			inst.drawMonth = inst.selectedMonth = date.getMonth();
+			inst.drawYear = inst.selectedYear = date.getFullYear();
+		}
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a new month/year. */
+	_selectMonthYear: function(id, select, period) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
+		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
+			parseInt(select.options[select.selectedIndex].value,10);
+		this._notifyChange(inst);
+		this._adjustDate(target);
+	},
+
+	/* Action for selecting a day. */
+	_selectDay: function(id, month, year, td) {
+		var target = $(id);
+		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
+			return;
+		}
+		var inst = this._getInst(target[0]);
+		inst.selectedDay = inst.currentDay = $('a', td).html();
+		inst.selectedMonth = inst.currentMonth = month;
+		inst.selectedYear = inst.currentYear = year;
+		this._selectDate(id, this._formatDate(inst,
+			inst.currentDay, inst.currentMonth, inst.currentYear));
+	},
+
+	/* Erase the input field and hide the date picker. */
+	_clearDate: function(id) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		this._selectDate(target, '');
+	},
+
+	/* Update the input field with the selected date. */
+	_selectDate: function(id, dateStr) {
+		var target = $(id);
+		var inst = this._getInst(target[0]);
+		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
+		if (inst.input)
+			inst.input.val(dateStr);
+		this._updateAlternate(inst);
+		var onSelect = this._get(inst, 'onSelect');
+		if (onSelect)
+			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
+		else if (inst.input)
+			inst.input.trigger('change'); // fire the change event
+		if (inst.inline)
+			this._updateDatepicker(inst);
+		else {
+			this._hideDatepicker();
+			this._lastInput = inst.input[0];
+			if (typeof(inst.input[0]) != 'object')
+				inst.input.focus(); // restore focus
+			this._lastInput = null;
+		}
+	},
+
+	/* Update any alternate field to synchronise with the main field. */
+	_updateAlternate: function(inst) {
+		var altField = this._get(inst, 'altField');
+		if (altField) { // update alternate field too
+			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
+			var date = this._getDate(inst);
+			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
+			$(altField).each(function() { $(this).val(dateStr); });
+		}
+	},
+
+	/* Set as beforeShowDay function to prevent selection of weekends.
+	   @param  date  Date - the date to customise
+	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
+	noWeekends: function(date) {
+		var day = date.getDay();
+		return [(day > 0 && day < 6), ''];
+	},
+
+	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+	   @param  date  Date - the date to get the week for
+	   @return  number - the number of the week within the year that contains this date */
+	iso8601Week: function(date) {
+		var checkDate = new Date(date.getTime());
+		// Find Thursday of this week starting on Monday
+		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+		var time = checkDate.getTime();
+		checkDate.setMonth(0); // Compare with Jan 1
+		checkDate.setDate(1);
+		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+	},
+
+	/* Parse a string value into a date object.
+	   See formatDate below for the possible formats.
+
+	   @param  format    string - the expected format of the date
+	   @param  value     string - the date in the above format
+	   @param  settings  Object - attributes include:
+	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  Date - the extracted date value or null if value is blank */
+	parseDate: function (format, value, settings) {
+		if (format == null || value == null)
+			throw 'Invalid arguments';
+		value = (typeof value == 'object' ? value.toString() : value + '');
+		if (value == '')
+			return null;
+		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		var year = -1;
+		var month = -1;
+		var day = -1;
+		var doy = -1;
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Extract a number from the string value
+		var getNumber = function(match) {
+			var isDoubled = lookAhead(match);
+			var size = (match == '@' ? 14 : (match == '!' ? 20 :
+				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
+			var digits = new RegExp('^\\d{1,' + size + '}');
+			var num = value.substring(iValue).match(digits);
+			if (!num)
+				throw 'Missing number at position ' + iValue;
+			iValue += num[0].length;
+			return parseInt(num[0], 10);
+		};
+		// Extract a name from the string value and convert to an index
+		var getName = function(match, shortNames, longNames) {
+			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
+				return [ [k, v] ];
+			}).sort(function (a, b) {
+				return -(a[1].length - b[1].length);
+			});
+			var index = -1;
+			$.each(names, function (i, pair) {
+				var name = pair[1];
+				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
+					index = pair[0];
+					iValue += name.length;
+					return false;
+				}
+			});
+			if (index != -1)
+				return index + 1;
+			else
+				throw 'Unknown name at position ' + iValue;
+		};
+		// Confirm that a literal character matches the string value
+		var checkLiteral = function() {
+			if (value.charAt(iValue) != format.charAt(iFormat))
+				throw 'Unexpected literal at position ' + iValue;
+			iValue++;
+		};
+		var iValue = 0;
+		for (var iFormat = 0; iFormat < format.length; iFormat++) {
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					checkLiteral();
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd':
+						day = getNumber('d');
+						break;
+					case 'D':
+						getName('D', dayNamesShort, dayNames);
+						break;
+					case 'o':
+						doy = getNumber('o');
+						break;
+					case 'm':
+						month = getNumber('m');
+						break;
+					case 'M':
+						month = getName('M', monthNamesShort, monthNames);
+						break;
+					case 'y':
+						year = getNumber('y');
+						break;
+					case '@':
+						var date = new Date(getNumber('@'));
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case '!':
+						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
+						year = date.getFullYear();
+						month = date.getMonth() + 1;
+						day = date.getDate();
+						break;
+					case "'":
+						if (lookAhead("'"))
+							checkLiteral();
+						else
+							literal = true;
+						break;
+					default:
+						checkLiteral();
+				}
+		}
+		if (iValue < value.length){
+			throw "Extra/unparsed characters found in date: " + value.substring(iValue);
+		}
+		if (year == -1)
+			year = new Date().getFullYear();
+		else if (year < 100)
+			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
+				(year <= shortYearCutoff ? 0 : -100);
+		if (doy > -1) {
+			month = 1;
+			day = doy;
+			do {
+				var dim = this._getDaysInMonth(year, month - 1);
+				if (day <= dim)
+					break;
+				month++;
+				day -= dim;
+			} while (true);
+		}
+		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
+		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
+			throw 'Invalid date'; // E.g. 31/02/00
+		return date;
+	},
+
+	/* Standard date formats. */
+	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
+	COOKIE: 'D, dd M yy',
+	ISO_8601: 'yy-mm-dd',
+	RFC_822: 'D, d M y',
+	RFC_850: 'DD, dd-M-y',
+	RFC_1036: 'D, d M y',
+	RFC_1123: 'D, d M yy',
+	RFC_2822: 'D, d M yy',
+	RSS: 'D, d M y', // RFC 822
+	TICKS: '!',
+	TIMESTAMP: '@',
+	W3C: 'yy-mm-dd', // ISO 8601
+
+	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
+		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
+
+	/* Format a date object into a string value.
+	   The format can be combinations of the following:
+	   d  - day of month (no leading zero)
+	   dd - day of month (two digit)
+	   o  - day of year (no leading zeros)
+	   oo - day of year (three digit)
+	   D  - day name short
+	   DD - day name long
+	   m  - month of year (no leading zero)
+	   mm - month of year (two digit)
+	   M  - month name short
+	   MM - month name long
+	   y  - year (two digit)
+	   yy - year (four digit)
+	   @ - Unix timestamp (ms since 01/01/1970)
+	   ! - Windows ticks (100ns since 01/01/0001)
+	   '...' - literal text
+	   '' - single quote
+
+	   @param  format    string - the desired format of the date
+	   @param  date      Date - the date value to format
+	   @param  settings  Object - attributes include:
+	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
+	                     dayNames         string[7] - names of the days from Sunday (optional)
+	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
+	                     monthNames       string[12] - names of the months (optional)
+	   @return  string - the date in the above format */
+	formatDate: function (format, date, settings) {
+		if (!date)
+			return '';
+		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
+		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
+		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
+		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		// Format a number, with leading zero if necessary
+		var formatNumber = function(match, value, len) {
+			var num = '' + value;
+			if (lookAhead(match))
+				while (num.length < len)
+					num = '0' + num;
+			return num;
+		};
+		// Format a name, short or long as requested
+		var formatName = function(match, value, shortNames, longNames) {
+			return (lookAhead(match) ? longNames[value] : shortNames[value]);
+		};
+		var output = '';
+		var literal = false;
+		if (date)
+			for (var iFormat = 0; iFormat < format.length; iFormat++) {
+				if (literal)
+					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+						literal = false;
+					else
+						output += format.charAt(iFormat);
+				else
+					switch (format.charAt(iFormat)) {
+						case 'd':
+							output += formatNumber('d', date.getDate(), 2);
+							break;
+						case 'D':
+							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
+							break;
+						case 'o':
+							output += formatNumber('o',
+								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
+							break;
+						case 'm':
+							output += formatNumber('m', date.getMonth() + 1, 2);
+							break;
+						case 'M':
+							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
+							break;
+						case 'y':
+							output += (lookAhead('y') ? date.getFullYear() :
+								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
+							break;
+						case '@':
+							output += date.getTime();
+							break;
+						case '!':
+							output += date.getTime() * 10000 + this._ticksTo1970;
+							break;
+						case "'":
+							if (lookAhead("'"))
+								output += "'";
+							else
+								literal = true;
+							break;
+						default:
+							output += format.charAt(iFormat);
+					}
+			}
+		return output;
+	},
+
+	/* Extract all possible characters from the date format. */
+	_possibleChars: function (format) {
+		var chars = '';
+		var literal = false;
+		// Check whether a format character is doubled
+		var lookAhead = function(match) {
+			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
+			if (matches)
+				iFormat++;
+			return matches;
+		};
+		for (var iFormat = 0; iFormat < format.length; iFormat++)
+			if (literal)
+				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
+					literal = false;
+				else
+					chars += format.charAt(iFormat);
+			else
+				switch (format.charAt(iFormat)) {
+					case 'd': case 'm': case 'y': case '@':
+						chars += '0123456789';
+						break;
+					case 'D': case 'M':
+						return null; // Accept anything
+					case "'":
+						if (lookAhead("'"))
+							chars += "'";
+						else
+							literal = true;
+						break;
+					default:
+						chars += format.charAt(iFormat);
+				}
+		return chars;
+	},
+
+	/* Get a setting value, defaulting if necessary. */
+	_get: function(inst, name) {
+		return inst.settings[name] !== undefined ?
+			inst.settings[name] : this._defaults[name];
+	},
+
+	/* Parse existing date and initialise date picker. */
+	_setDateFromField: function(inst, noDefault) {
+		if (inst.input.val() == inst.lastVal) {
+			return;
+		}
+		var dateFormat = this._get(inst, 'dateFormat');
+		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
+		var date, defaultDate;
+		date = defaultDate = this._getDefaultDate(inst);
+		var settings = this._getFormatConfig(inst);
+		try {
+			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
+		} catch (event) {
+			this.log(event);
+			dates = (noDefault ? '' : dates);
+		}
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		inst.currentDay = (dates ? date.getDate() : 0);
+		inst.currentMonth = (dates ? date.getMonth() : 0);
+		inst.currentYear = (dates ? date.getFullYear() : 0);
+		this._adjustInstDate(inst);
+	},
+
+	/* Retrieve the default date shown on opening. */
+	_getDefaultDate: function(inst) {
+		return this._restrictMinMax(inst,
+			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
+	},
+
+	/* A date may be specified as an exact value or a relative one. */
+	_determineDate: function(inst, date, defaultDate) {
+		var offsetNumeric = function(offset) {
+			var date = new Date();
+			date.setDate(date.getDate() + offset);
+			return date;
+		};
+		var offsetString = function(offset) {
+			try {
+				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
+					offset, $.datepicker._getFormatConfig(inst));
+			}
+			catch (e) {
+				// Ignore
+			}
+			var date = (offset.toLowerCase().match(/^c/) ?
+				$.datepicker._getDate(inst) : null) || new Date();
+			var year = date.getFullYear();
+			var month = date.getMonth();
+			var day = date.getDate();
+			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
+			var matches = pattern.exec(offset);
+			while (matches) {
+				switch (matches[2] || 'd') {
+					case 'd' : case 'D' :
+						day += parseInt(matches[1],10); break;
+					case 'w' : case 'W' :
+						day += parseInt(matches[1],10) * 7; break;
+					case 'm' : case 'M' :
+						month += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+					case 'y': case 'Y' :
+						year += parseInt(matches[1],10);
+						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
+						break;
+				}
+				matches = pattern.exec(offset);
+			}
+			return new Date(year, month, day);
+		};
+		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
+			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
+		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
+		if (newDate) {
+			newDate.setHours(0);
+			newDate.setMinutes(0);
+			newDate.setSeconds(0);
+			newDate.setMilliseconds(0);
+		}
+		return this._daylightSavingAdjust(newDate);
+	},
+
+	/* Handle switch to/from daylight saving.
+	   Hours may be non-zero on daylight saving cut-over:
+	   > 12 when midnight changeover, but then cannot generate
+	   midnight datetime, so jump to 1AM, otherwise reset.
+	   @param  date  (Date) the date to check
+	   @return  (Date) the corrected date */
+	_daylightSavingAdjust: function(date) {
+		if (!date) return null;
+		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
+		return date;
+	},
+
+	/* Set the date(s) directly. */
+	_setDate: function(inst, date, noChange) {
+		var clear = !date;
+		var origMonth = inst.selectedMonth;
+		var origYear = inst.selectedYear;
+		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
+		inst.selectedDay = inst.currentDay = newDate.getDate();
+		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
+		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
+		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
+			this._notifyChange(inst);
+		this._adjustInstDate(inst);
+		if (inst.input) {
+			inst.input.val(clear ? '' : this._formatDate(inst));
+		}
+	},
+
+	/* Retrieve the date(s) directly. */
+	_getDate: function(inst) {
+		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
+			this._daylightSavingAdjust(new Date(
+			inst.currentYear, inst.currentMonth, inst.currentDay)));
+			return startDate;
+	},
+
+	/* Generate the HTML for the current state of the date picker. */
+	_generateHTML: function(inst) {
+		var today = new Date();
+		today = this._daylightSavingAdjust(
+			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
+		var isRTL = this._get(inst, 'isRTL');
+		var showButtonPanel = this._get(inst, 'showButtonPanel');
+		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
+		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
+		var numMonths = this._getNumberOfMonths(inst);
+		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
+		var stepMonths = this._get(inst, 'stepMonths');
+		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
+		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
+			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var drawMonth = inst.drawMonth - showCurrentAtPos;
+		var drawYear = inst.drawYear;
+		if (drawMonth < 0) {
+			drawMonth += 12;
+			drawYear--;
+		}
+		if (maxDate) {
+			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
+				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
+			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
+			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
+				drawMonth--;
+				if (drawMonth < 0) {
+					drawMonth = 11;
+					drawYear--;
+				}
+			}
+		}
+		inst.drawMonth = drawMonth;
+		inst.drawYear = drawYear;
+		var prevText = this._get(inst, 'prevText');
+		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
+			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
+		var nextText = this._get(inst, 'nextText');
+		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
+			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
+			this._getFormatConfig(inst)));
+		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
+			'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
+			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
+			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
+		var currentText = this._get(inst, 'currentText');
+		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
+		currentText = (!navigationAsDateFormat ? currentText :
+			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
+		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
+		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
+			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_' + dpuuid +
+			'.datepicker._gotoToday(\'#' + inst.id + '\');"' +
+			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
+		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
+		firstDay = (isNaN(firstDay) ? 0 : firstDay);
+		var showWeek = this._get(inst, 'showWeek');
+		var dayNames = this._get(inst, 'dayNames');
+		var dayNamesShort = this._get(inst, 'dayNamesShort');
+		var dayNamesMin = this._get(inst, 'dayNamesMin');
+		var monthNames = this._get(inst, 'monthNames');
+		var monthNamesShort = this._get(inst, 'monthNamesShort');
+		var beforeShowDay = this._get(inst, 'beforeShowDay');
+		var showOtherMonths = this._get(inst, 'showOtherMonths');
+		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
+		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
+		var defaultDate = this._getDefaultDate(inst);
+		var html = '';
+		for (var row = 0; row < numMonths[0]; row++) {
+			var group = '';
+			this.maxRows = 4;
+			for (var col = 0; col < numMonths[1]; col++) {
+				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
+				var cornerClass = ' ui-corner-all';
+				var calender = '';
+				if (isMultiMonth) {
+					calender += '<div class="ui-datepicker-group';
+					if (numMonths[1] > 1)
+						switch (col) {
+							case 0: calender += ' ui-datepicker-group-first';
+								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
+							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
+								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
+							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
+						}
+					calender += '">';
+				}
+				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
+					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
+					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
+					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
+					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
+					'</div><table class="ui-datepicker-calendar"><thead>' +
+					'<tr>';
+				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
+				for (var dow = 0; dow < 7; dow++) { // days of the week
+					var day = (dow + firstDay) % 7;
+					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
+						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
+				}
+				calender += thead + '</tr></thead><tbody>';
+				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
+				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
+					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
+				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
+				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
+				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
+				this.maxRows = numRows;
+				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
+				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
+					calender += '<tr>';
+					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
+						this._get(inst, 'calculateWeek')(printDate) + '</td>');
+					for (var dow = 0; dow < 7; dow++) { // create date picker days
+						var daySettings = (beforeShowDay ?
+							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
+						var otherMonth = (printDate.getMonth() != drawMonth);
+						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
+							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
+						tbody += '<td class="' +
+							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
+							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
+							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
+							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
+							// or defaultDate is current printedDate and defaultDate is selectedDate
+							' ' + this._dayOverClass : '') + // highlight selected day
+							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
+							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
+							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
+							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
+							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
+							(unselectable ? '' : ' onclick="DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
+							inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);return false;"') + '>' + // actions
+							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
+							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
+							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
+							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
+							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
+							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
+						printDate.setDate(printDate.getDate() + 1);
+						printDate = this._daylightSavingAdjust(printDate);
+					}
+					calender += tbody + '</tr>';
+				}
+				drawMonth++;
+				if (drawMonth > 11) {
+					drawMonth = 0;
+					drawYear++;
+				}
+				calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
+							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
+				group += calender;
+			}
+			html += group;
+		}
+		html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
+			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
+		inst._keyEvent = false;
+		return html;
+	},
+
+	/* Generate the month and year header. */
+	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
+			secondary, monthNames, monthNamesShort) {
+		var changeMonth = this._get(inst, 'changeMonth');
+		var changeYear = this._get(inst, 'changeYear');
+		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
+		var html = '<div class="ui-datepicker-title">';
+		var monthHtml = '';
+		// month selection
+		if (secondary || !changeMonth)
+			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
+		else {
+			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
+			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
+			monthHtml += '<select class="ui-datepicker-month" ' +
+				'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
+			 	'>';
+			for (var month = 0; month < 12; month++) {
+				if ((!inMinYear || month >= minDate.getMonth()) &&
+						(!inMaxYear || month <= maxDate.getMonth()))
+					monthHtml += '<option value="' + month + '"' +
+						(month == drawMonth ? ' selected="selected"' : '') +
+						'>' + monthNamesShort[month] + '</option>';
+			}
+			monthHtml += '</select>';
+		}
+		if (!showMonthAfterYear)
+			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
+		// year selection
+		if ( !inst.yearshtml ) {
+			inst.yearshtml = '';
+			if (secondary || !changeYear)
+				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
+			else {
+				// determine range of years to display
+				var years = this._get(inst, 'yearRange').split(':');
+				var thisYear = new Date().getFullYear();
+				var determineYear = function(value) {
+					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
+						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
+						parseInt(value, 10)));
+					return (isNaN(year) ? thisYear : year);
+				};
+				var year = determineYear(years[0]);
+				var endYear = Math.max(year, determineYear(years[1] || ''));
+				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
+				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
+				inst.yearshtml += '<select class="ui-datepicker-year" ' +
+					'onchange="DP_jQuery_' + dpuuid + '.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
+					'>';
+				for (; year <= endYear; year++) {
+					inst.yearshtml += '<option value="' + year + '"' +
+						(year == drawYear ? ' selected="selected"' : '') +
+						'>' + year + '</option>';
+				}
+				inst.yearshtml += '</select>';
+				
+				html += inst.yearshtml;
+				inst.yearshtml = null;
+			}
+		}
+		html += this._get(inst, 'yearSuffix');
+		if (showMonthAfterYear)
+			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
+		html += '</div>'; // Close datepicker_header
+		return html;
+	},
+
+	/* Adjust one of the date sub-fields. */
+	_adjustInstDate: function(inst, offset, period) {
+		var year = inst.drawYear + (period == 'Y' ? offset : 0);
+		var month = inst.drawMonth + (period == 'M' ? offset : 0);
+		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
+			(period == 'D' ? offset : 0);
+		var date = this._restrictMinMax(inst,
+			this._daylightSavingAdjust(new Date(year, month, day)));
+		inst.selectedDay = date.getDate();
+		inst.drawMonth = inst.selectedMonth = date.getMonth();
+		inst.drawYear = inst.selectedYear = date.getFullYear();
+		if (period == 'M' || period == 'Y')
+			this._notifyChange(inst);
+	},
+
+	/* Ensure a date is within any min/max bounds. */
+	_restrictMinMax: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		var newDate = (minDate && date < minDate ? minDate : date);
+		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
+		return newDate;
+	},
+
+	/* Notify change of month/year. */
+	_notifyChange: function(inst) {
+		var onChange = this._get(inst, 'onChangeMonthYear');
+		if (onChange)
+			onChange.apply((inst.input ? inst.input[0] : null),
+				[inst.selectedYear, inst.selectedMonth + 1, inst]);
+	},
+
+	/* Determine the number of months to show. */
+	_getNumberOfMonths: function(inst) {
+		var numMonths = this._get(inst, 'numberOfMonths');
+		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
+	},
+
+	/* Determine the current maximum date - ensure no time components are set. */
+	_getMinMaxDate: function(inst, minMax) {
+		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
+	},
+
+	/* Find the number of days in a given month. */
+	_getDaysInMonth: function(year, month) {
+		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
+	},
+
+	/* Find the day of the week of the first of a month. */
+	_getFirstDayOfMonth: function(year, month) {
+		return new Date(year, month, 1).getDay();
+	},
+
+	/* Determines if we should allow a "next/prev" month display change. */
+	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
+		var numMonths = this._getNumberOfMonths(inst);
+		var date = this._daylightSavingAdjust(new Date(curYear,
+			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
+		if (offset < 0)
+			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
+		return this._isInRange(inst, date);
+	},
+
+	/* Is the given date in the accepted range? */
+	_isInRange: function(inst, date) {
+		var minDate = this._getMinMaxDate(inst, 'min');
+		var maxDate = this._getMinMaxDate(inst, 'max');
+		return ((!minDate || date.getTime() >= minDate.getTime()) &&
+			(!maxDate || date.getTime() <= maxDate.getTime()));
+	},
+
+	/* Provide the configuration settings for formatting/parsing. */
+	_getFormatConfig: function(inst) {
+		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
+		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
+			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
+		return {shortYearCutoff: shortYearCutoff,
+			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
+			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
+	},
+
+	/* Format the given date for display. */
+	_formatDate: function(inst, day, month, year) {
+		if (!day) {
+			inst.currentDay = inst.selectedDay;
+			inst.currentMonth = inst.selectedMonth;
+			inst.currentYear = inst.selectedYear;
+		}
+		var date = (day ? (typeof day == 'object' ? day :
+			this._daylightSavingAdjust(new Date(year, month, day))) :
+			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
+		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
+	}
+});
+
+/*
+ * Bind hover events for datepicker elements.
+ * Done via delegate so the binding only occurs once in the lifetime of the parent div.
+ * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
+ */ 
+function bindHover(dpDiv) {
+	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
+	return dpDiv.bind('mouseout', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ( !elem.length ) {
+				return;
+			}
+			elem.removeClass( "ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover" );
+		})
+		.bind('mouseover', function(event) {
+			var elem = $( event.target ).closest( selector );
+			if ($.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0]) ||
+					!elem.length ) {
+				return;
+			}
+			elem.parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
+			elem.addClass('ui-state-hover');
+			if (elem.hasClass('ui-datepicker-prev')) elem.addClass('ui-datepicker-prev-hover');
+			if (elem.hasClass('ui-datepicker-next')) elem.addClass('ui-datepicker-next-hover');
+		});
+}
+
+/* jQuery extend now ignores nulls! */
+function extendRemove(target, props) {
+	$.extend(target, props);
+	for (var name in props)
+		if (props[name] == null || props[name] == undefined)
+			target[name] = props[name];
+	return target;
+};
+
+/* Determine whether an object is an array. */
+function isArray(a) {
+	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
+		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
+};
+
+/* Invoke the datepicker functionality.
+   @param  options  string - a command, optionally followed by additional parameters or
+                    Object - settings for attaching new datepicker functionality
+   @return  jQuery object */
+$.fn.datepicker = function(options){
+	
+	/* Verify an empty collection wasn't passed - Fixes #6976 */
+	if ( !this.length ) {
+		return this;
+	}
+	
+	/* Initialise the date picker. */
+	if (!$.datepicker.initialized) {
+		$(document).mousedown($.datepicker._checkExternalClick).
+			find('body').append($.datepicker.dpDiv);
+		$.datepicker.initialized = true;
+	}
+
+	var otherArgs = Array.prototype.slice.call(arguments, 1);
+	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
+		return $.datepicker['_' + options + 'Datepicker'].
+			apply($.datepicker, [this[0]].concat(otherArgs));
+	return this.each(function() {
+		typeof options == 'string' ?
+			$.datepicker['_' + options + 'Datepicker'].
+				apply($.datepicker, [this].concat(otherArgs)) :
+			$.datepicker._attachDatepicker(this, options);
+	});
+};
+
+$.datepicker = new Datepicker(); // singleton instance
+$.datepicker.initialized = false;
+$.datepicker.uuid = new Date().getTime();
+$.datepicker.version = "1.8.16";
+
+// Workaround for #4055
+// Add another global to avoid noConflict issues with inline event handlers
+window['DP_jQuery_' + dpuuid] = $;
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.dialog.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.dialog.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.dialog.js	(revision 14585)
@@ -0,0 +1,878 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function( $, undefined ) {
+
+var uiDialogClasses =
+		'ui-dialog ' +
+		'ui-widget ' +
+		'ui-widget-content ' +
+		'ui-corner-all ',
+	sizeRelatedOptions = {
+		buttons: true,
+		height: true,
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true,
+		width: true
+	},
+	resizableRelatedOptions = {
+		maxHeight: true,
+		maxWidth: true,
+		minHeight: true,
+		minWidth: true
+	},
+	// support for jQuery 1.3.2 - handle common attrFn methods for dialog
+	attrFn = $.attrFn || {
+		val: true,
+		css: true,
+		html: true,
+		text: true,
+		data: true,
+		width: true,
+		height: true,
+		offset: true,
+		click: true
+	};
+
+$.widget("ui.dialog", {
+	options: {
+		autoOpen: true,
+		buttons: {},
+		closeOnEscape: true,
+		closeText: 'close',
+		dialogClass: '',
+		draggable: true,
+		hide: null,
+		height: 'auto',
+		maxHeight: false,
+		maxWidth: false,
+		minHeight: 150,
+		minWidth: 150,
+		modal: false,
+		position: {
+			my: 'center',
+			at: 'center',
+			collision: 'fit',
+			// ensure that the titlebar is never outside the document
+			using: function(pos) {
+				var topOffset = $(this).css(pos).offset().top;
+				if (topOffset < 0) {
+					$(this).css('top', pos.top - topOffset);
+				}
+			}
+		},
+		resizable: true,
+		show: null,
+		stack: true,
+		title: '',
+		width: 300,
+		zIndex: 1000
+	},
+
+	_create: function() {
+		this.originalTitle = this.element.attr('title');
+		// #5742 - .attr() might return a DOMElement
+		if ( typeof this.originalTitle !== "string" ) {
+			this.originalTitle = "";
+		}
+
+		this.options.title = this.options.title || this.originalTitle;
+		var self = this,
+			options = self.options,
+
+			title = options.title || '&#160;',
+			titleId = $.ui.dialog.getTitleId(self.element),
+
+			uiDialog = (self.uiDialog = $('<div></div>'))
+				.appendTo(document.body)
+				.hide()
+				.addClass(uiDialogClasses + options.dialogClass)
+				.css({
+					zIndex: options.zIndex
+				})
+				// setting tabIndex makes the div focusable
+				// setting outline to 0 prevents a border on focus in Mozilla
+				.attr('tabIndex', -1).css('outline', 0).keydown(function(event) {
+					if (options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+						event.keyCode === $.ui.keyCode.ESCAPE) {
+						
+						self.close(event);
+						event.preventDefault();
+					}
+				})
+				.attr({
+					role: 'dialog',
+					'aria-labelledby': titleId
+				})
+				.mousedown(function(event) {
+					self.moveToTop(false, event);
+				}),
+
+			uiDialogContent = self.element
+				.show()
+				.removeAttr('title')
+				.addClass(
+					'ui-dialog-content ' +
+					'ui-widget-content')
+				.appendTo(uiDialog),
+
+			uiDialogTitlebar = (self.uiDialogTitlebar = $('<div></div>'))
+				.addClass(
+					'ui-dialog-titlebar ' +
+					'ui-widget-header ' +
+					'ui-corner-all ' +
+					'ui-helper-clearfix'
+				)
+				.prependTo(uiDialog),
+
+			uiDialogTitlebarClose = $('<a href="#"></a>')
+				.addClass(
+					'ui-dialog-titlebar-close ' +
+					'ui-corner-all'
+				)
+				.attr('role', 'button')
+				.hover(
+					function() {
+						uiDialogTitlebarClose.addClass('ui-state-hover');
+					},
+					function() {
+						uiDialogTitlebarClose.removeClass('ui-state-hover');
+					}
+				)
+				.focus(function() {
+					uiDialogTitlebarClose.addClass('ui-state-focus');
+				})
+				.blur(function() {
+					uiDialogTitlebarClose.removeClass('ui-state-focus');
+				})
+				.click(function(event) {
+					self.close(event);
+					return false;
+				})
+				.appendTo(uiDialogTitlebar),
+
+			uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('<span></span>'))
+				.addClass(
+					'ui-icon ' +
+					'ui-icon-closethick'
+				)
+				.text(options.closeText)
+				.appendTo(uiDialogTitlebarClose),
+
+			uiDialogTitle = $('<span></span>')
+				.addClass('ui-dialog-title')
+				.attr('id', titleId)
+				.html(title)
+				.prependTo(uiDialogTitlebar);
+
+		//handling of deprecated beforeclose (vs beforeClose) option
+		//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+		//TODO: remove in 1.9pre
+		if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) {
+			options.beforeClose = options.beforeclose;
+		}
+
+		uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection();
+
+		if (options.draggable && $.fn.draggable) {
+			self._makeDraggable();
+		}
+		if (options.resizable && $.fn.resizable) {
+			self._makeResizable();
+		}
+
+		self._createButtons(options.buttons);
+		self._isOpen = false;
+
+		if ($.fn.bgiframe) {
+			uiDialog.bgiframe();
+		}
+	},
+
+	_init: function() {
+		if ( this.options.autoOpen ) {
+			this.open();
+		}
+	},
+
+	destroy: function() {
+		var self = this;
+		
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.hide();
+		self.element
+			.unbind('.dialog')
+			.removeData('dialog')
+			.removeClass('ui-dialog-content ui-widget-content')
+			.hide().appendTo('body');
+		self.uiDialog.remove();
+
+		if (self.originalTitle) {
+			self.element.attr('title', self.originalTitle);
+		}
+
+		return self;
+	},
+
+	widget: function() {
+		return this.uiDialog;
+	},
+
+	close: function(event) {
+		var self = this,
+			maxZ, thisZ;
+		
+		if (false === self._trigger('beforeClose', event)) {
+			return;
+		}
+
+		if (self.overlay) {
+			self.overlay.destroy();
+		}
+		self.uiDialog.unbind('keypress.ui-dialog');
+
+		self._isOpen = false;
+
+		if (self.options.hide) {
+			self.uiDialog.hide(self.options.hide, function() {
+				self._trigger('close', event);
+			});
+		} else {
+			self.uiDialog.hide();
+			self._trigger('close', event);
+		}
+
+		$.ui.dialog.overlay.resize();
+
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		if (self.options.modal) {
+			maxZ = 0;
+			$('.ui-dialog').each(function() {
+				if (this !== self.uiDialog[0]) {
+					thisZ = $(this).css('z-index');
+					if(!isNaN(thisZ)) {
+						maxZ = Math.max(maxZ, thisZ);
+					}
+				}
+			});
+			$.ui.dialog.maxZ = maxZ;
+		}
+
+		return self;
+	},
+
+	isOpen: function() {
+		return this._isOpen;
+	},
+
+	// the force parameter allows us to move modal dialogs to their correct
+	// position on open
+	moveToTop: function(force, event) {
+		var self = this,
+			options = self.options,
+			saveScroll;
+
+		if ((options.modal && !force) ||
+			(!options.stack && !options.modal)) {
+			return self._trigger('focus', event);
+		}
+
+		if (options.zIndex > $.ui.dialog.maxZ) {
+			$.ui.dialog.maxZ = options.zIndex;
+		}
+		if (self.overlay) {
+			$.ui.dialog.maxZ += 1;
+			self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ);
+		}
+
+		//Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed.
+		//  http://ui.jquery.com/bugs/ticket/3193
+		saveScroll = { scrollTop: self.element.scrollTop(), scrollLeft: self.element.scrollLeft() };
+		$.ui.dialog.maxZ += 1;
+		self.uiDialog.css('z-index', $.ui.dialog.maxZ);
+		self.element.attr(saveScroll);
+		self._trigger('focus', event);
+
+		return self;
+	},
+
+	open: function() {
+		if (this._isOpen) { return; }
+
+		var self = this,
+			options = self.options,
+			uiDialog = self.uiDialog;
+
+		self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null;
+		self._size();
+		self._position(options.position);
+		uiDialog.show(options.show);
+		self.moveToTop(true);
+
+		// prevent tabbing out of modal dialogs
+		if (options.modal) {
+			uiDialog.bind('keypress.ui-dialog', function(event) {
+				if (event.keyCode !== $.ui.keyCode.TAB) {
+					return;
+				}
+
+				var tabbables = $(':tabbable', this),
+					first = tabbables.filter(':first'),
+					last  = tabbables.filter(':last');
+
+				if (event.target === last[0] && !event.shiftKey) {
+					first.focus(1);
+					return false;
+				} else if (event.target === first[0] && event.shiftKey) {
+					last.focus(1);
+					return false;
+				}
+			});
+		}
+
+		// set focus to the first tabbable element in the content area or the first button
+		// if there are no tabbable elements, set focus on the dialog itself
+		$(self.element.find(':tabbable').get().concat(
+			uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat(
+				uiDialog.get()))).eq(0).focus();
+
+		self._isOpen = true;
+		self._trigger('open');
+
+		return self;
+	},
+
+	_createButtons: function(buttons) {
+		var self = this,
+			hasButtons = false,
+			uiDialogButtonPane = $('<div></div>')
+				.addClass(
+					'ui-dialog-buttonpane ' +
+					'ui-widget-content ' +
+					'ui-helper-clearfix'
+				),
+			uiButtonSet = $( "<div></div>" )
+				.addClass( "ui-dialog-buttonset" )
+				.appendTo( uiDialogButtonPane );
+
+		// if we already have a button pane, remove it
+		self.uiDialog.find('.ui-dialog-buttonpane').remove();
+
+		if (typeof buttons === 'object' && buttons !== null) {
+			$.each(buttons, function() {
+				return !(hasButtons = true);
+			});
+		}
+		if (hasButtons) {
+			$.each(buttons, function(name, props) {
+				props = $.isFunction( props ) ?
+					{ click: props, text: name } :
+					props;
+				var button = $('<button type="button"></button>')
+					.click(function() {
+						props.click.apply(self.element[0], arguments);
+					})
+					.appendTo(uiButtonSet);
+				// can't use .attr( props, true ) with jQuery 1.3.2.
+				$.each( props, function( key, value ) {
+					if ( key === "click" ) {
+						return;
+					}
+					if ( key in attrFn ) {
+						button[ key ]( value );
+					} else {
+						button.attr( key, value );
+					}
+				});
+				if ($.fn.button) {
+					button.button();
+				}
+			});
+			uiDialogButtonPane.appendTo(self.uiDialog);
+		}
+	},
+
+	_makeDraggable: function() {
+		var self = this,
+			options = self.options,
+			doc = $(document),
+			heightBeforeDrag;
+
+		function filteredUi(ui) {
+			return {
+				position: ui.position,
+				offset: ui.offset
+			};
+		}
+
+		self.uiDialog.draggable({
+			cancel: '.ui-dialog-content, .ui-dialog-titlebar-close',
+			handle: '.ui-dialog-titlebar',
+			containment: 'document',
+			start: function(event, ui) {
+				heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height();
+				$(this).height($(this).height()).addClass("ui-dialog-dragging");
+				self._trigger('dragStart', event, filteredUi(ui));
+			},
+			drag: function(event, ui) {
+				self._trigger('drag', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				options.position = [ui.position.left - doc.scrollLeft(),
+					ui.position.top - doc.scrollTop()];
+				$(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag);
+				self._trigger('dragStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		});
+	},
+
+	_makeResizable: function(handles) {
+		handles = (handles === undefined ? this.options.resizable : handles);
+		var self = this,
+			options = self.options,
+			// .ui-resizable has position: relative defined in the stylesheet
+			// but dialogs have to use absolute or fixed positioning
+			position = self.uiDialog.css('position'),
+			resizeHandles = (typeof handles === 'string' ?
+				handles	:
+				'n,e,s,w,se,sw,ne,nw'
+			);
+
+		function filteredUi(ui) {
+			return {
+				originalPosition: ui.originalPosition,
+				originalSize: ui.originalSize,
+				position: ui.position,
+				size: ui.size
+			};
+		}
+
+		self.uiDialog.resizable({
+			cancel: '.ui-dialog-content',
+			containment: 'document',
+			alsoResize: self.element,
+			maxWidth: options.maxWidth,
+			maxHeight: options.maxHeight,
+			minWidth: options.minWidth,
+			minHeight: self._minHeight(),
+			handles: resizeHandles,
+			start: function(event, ui) {
+				$(this).addClass("ui-dialog-resizing");
+				self._trigger('resizeStart', event, filteredUi(ui));
+			},
+			resize: function(event, ui) {
+				self._trigger('resize', event, filteredUi(ui));
+			},
+			stop: function(event, ui) {
+				$(this).removeClass("ui-dialog-resizing");
+				options.height = $(this).height();
+				options.width = $(this).width();
+				self._trigger('resizeStop', event, filteredUi(ui));
+				$.ui.dialog.overlay.resize();
+			}
+		})
+		.css('position', position)
+		.find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se');
+	},
+
+	_minHeight: function() {
+		var options = this.options;
+
+		if (options.height === 'auto') {
+			return options.minHeight;
+		} else {
+			return Math.min(options.minHeight, options.height);
+		}
+	},
+
+	_position: function(position) {
+		var myAt = [],
+			offset = [0, 0],
+			isVisible;
+
+		if (position) {
+			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
+	//		if (typeof position == 'string' || $.isArray(position)) {
+	//			myAt = $.isArray(position) ? position : position.split(' ');
+
+			if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) {
+				myAt = position.split ? position.split(' ') : [position[0], position[1]];
+				if (myAt.length === 1) {
+					myAt[1] = myAt[0];
+				}
+
+				$.each(['left', 'top'], function(i, offsetPosition) {
+					if (+myAt[i] === myAt[i]) {
+						offset[i] = myAt[i];
+						myAt[i] = offsetPosition;
+					}
+				});
+
+				position = {
+					my: myAt.join(" "),
+					at: myAt.join(" "),
+					offset: offset.join(" ")
+				};
+			} 
+
+			position = $.extend({}, $.ui.dialog.prototype.options.position, position);
+		} else {
+			position = $.ui.dialog.prototype.options.position;
+		}
+
+		// need to show the dialog to get the actual offset in the position plugin
+		isVisible = this.uiDialog.is(':visible');
+		if (!isVisible) {
+			this.uiDialog.show();
+		}
+		this.uiDialog
+			// workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781
+			.css({ top: 0, left: 0 })
+			.position($.extend({ of: window }, position));
+		if (!isVisible) {
+			this.uiDialog.hide();
+		}
+	},
+
+	_setOptions: function( options ) {
+		var self = this,
+			resizableOptions = {},
+			resize = false;
+
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+			
+			if ( key in sizeRelatedOptions ) {
+				resize = true;
+			}
+			if ( key in resizableRelatedOptions ) {
+				resizableOptions[ key ] = value;
+			}
+		});
+
+		if ( resize ) {
+			this._size();
+		}
+		if ( this.uiDialog.is( ":data(resizable)" ) ) {
+			this.uiDialog.resizable( "option", resizableOptions );
+		}
+	},
+
+	_setOption: function(key, value){
+		var self = this,
+			uiDialog = self.uiDialog;
+
+		switch (key) {
+			//handling of deprecated beforeclose (vs beforeClose) option
+			//Ticket #4669 http://dev.jqueryui.com/ticket/4669
+			//TODO: remove in 1.9pre
+			case "beforeclose":
+				key = "beforeClose";
+				break;
+			case "buttons":
+				self._createButtons(value);
+				break;
+			case "closeText":
+				// ensure that we always pass a string
+				self.uiDialogTitlebarCloseText.text("" + value);
+				break;
+			case "dialogClass":
+				uiDialog
+					.removeClass(self.options.dialogClass)
+					.addClass(uiDialogClasses + value);
+				break;
+			case "disabled":
+				if (value) {
+					uiDialog.addClass('ui-dialog-disabled');
+				} else {
+					uiDialog.removeClass('ui-dialog-disabled');
+				}
+				break;
+			case "draggable":
+				var isDraggable = uiDialog.is( ":data(draggable)" );
+				if ( isDraggable && !value ) {
+					uiDialog.draggable( "destroy" );
+				}
+				
+				if ( !isDraggable && value ) {
+					self._makeDraggable();
+				}
+				break;
+			case "position":
+				self._position(value);
+				break;
+			case "resizable":
+				// currently resizable, becoming non-resizable
+				var isResizable = uiDialog.is( ":data(resizable)" );
+				if (isResizable && !value) {
+					uiDialog.resizable('destroy');
+				}
+
+				// currently resizable, changing handles
+				if (isResizable && typeof value === 'string') {
+					uiDialog.resizable('option', 'handles', value);
+				}
+
+				// currently non-resizable, becoming resizable
+				if (!isResizable && value !== false) {
+					self._makeResizable(value);
+				}
+				break;
+			case "title":
+				// convert whatever was passed in o a string, for html() to not throw up
+				$(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || '&#160;'));
+				break;
+		}
+
+		$.Widget.prototype._setOption.apply(self, arguments);
+	},
+
+	_size: function() {
+		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
+		 * divs will both have width and height set, so we need to reset them
+		 */
+		var options = this.options,
+			nonContentHeight,
+			minContentHeight,
+			isVisible = this.uiDialog.is( ":visible" );
+
+		// reset content sizing
+		this.element.show().css({
+			width: 'auto',
+			minHeight: 0,
+			height: 0
+		});
+
+		if (options.minWidth > options.width) {
+			options.width = options.minWidth;
+		}
+
+		// reset wrapper sizing
+		// determine the height of all the non-content elements
+		nonContentHeight = this.uiDialog.css({
+				height: 'auto',
+				width: options.width
+			})
+			.height();
+		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
+		
+		if ( options.height === "auto" ) {
+			// only needed for IE6 support
+			if ( $.support.minHeight ) {
+				this.element.css({
+					minHeight: minContentHeight,
+					height: "auto"
+				});
+			} else {
+				this.uiDialog.show();
+				var autoHeight = this.element.css( "height", "auto" ).height();
+				if ( !isVisible ) {
+					this.uiDialog.hide();
+				}
+				this.element.height( Math.max( autoHeight, minContentHeight ) );
+			}
+		} else {
+			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
+		}
+
+		if (this.uiDialog.is(':data(resizable)')) {
+			this.uiDialog.resizable('option', 'minHeight', this._minHeight());
+		}
+	}
+});
+
+$.extend($.ui.dialog, {
+	version: "1.8.16",
+
+	uuid: 0,
+	maxZ: 0,
+
+	getTitleId: function($el) {
+		var id = $el.attr('id');
+		if (!id) {
+			this.uuid += 1;
+			id = this.uuid;
+		}
+		return 'ui-dialog-title-' + id;
+	},
+
+	overlay: function(dialog) {
+		this.$el = $.ui.dialog.overlay.create(dialog);
+	}
+});
+
+$.extend($.ui.dialog.overlay, {
+	instances: [],
+	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
+	oldInstances: [],
+	maxZ: 0,
+	events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','),
+		function(event) { return event + '.dialog-overlay'; }).join(' '),
+	create: function(dialog) {
+		if (this.instances.length === 0) {
+			// prevent use of anchors and inputs
+			// we use a setTimeout in case the overlay is created from an
+			// event that we're going to be cancelling (see #2804)
+			setTimeout(function() {
+				// handle $(el).dialog().dialog('close') (see #4065)
+				if ($.ui.dialog.overlay.instances.length) {
+					$(document).bind($.ui.dialog.overlay.events, function(event) {
+						// stop events if the z-index of the target is < the z-index of the overlay
+						// we cannot return true when we don't want to cancel the event (#3523)
+						if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) {
+							return false;
+						}
+					});
+				}
+			}, 1);
+
+			// allow closing by pressing the escape key
+			$(document).bind('keydown.dialog-overlay', function(event) {
+				if (dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
+					event.keyCode === $.ui.keyCode.ESCAPE) {
+					
+					dialog.close(event);
+					event.preventDefault();
+				}
+			});
+
+			// handle window resize
+			$(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize);
+		}
+
+		var $el = (this.oldInstances.pop() || $('<div></div>').addClass('ui-widget-overlay'))
+			.appendTo(document.body)
+			.css({
+				width: this.width(),
+				height: this.height()
+			});
+
+		if ($.fn.bgiframe) {
+			$el.bgiframe();
+		}
+
+		this.instances.push($el);
+		return $el;
+	},
+
+	destroy: function($el) {
+		var indexOf = $.inArray($el, this.instances);
+		if (indexOf != -1){
+			this.oldInstances.push(this.instances.splice(indexOf, 1)[0]);
+		}
+
+		if (this.instances.length === 0) {
+			$([document, window]).unbind('.dialog-overlay');
+		}
+
+		$el.remove();
+		
+		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
+		var maxZ = 0;
+		$.each(this.instances, function() {
+			maxZ = Math.max(maxZ, this.css('z-index'));
+		});
+		this.maxZ = maxZ;
+	},
+
+	height: function() {
+		var scrollHeight,
+			offsetHeight;
+		// handle IE 6
+		if ($.browser.msie && $.browser.version < 7) {
+			scrollHeight = Math.max(
+				document.documentElement.scrollHeight,
+				document.body.scrollHeight
+			);
+			offsetHeight = Math.max(
+				document.documentElement.offsetHeight,
+				document.body.offsetHeight
+			);
+
+			if (scrollHeight < offsetHeight) {
+				return $(window).height() + 'px';
+			} else {
+				return scrollHeight + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).height() + 'px';
+		}
+	},
+
+	width: function() {
+		var scrollWidth,
+			offsetWidth;
+		// handle IE
+		if ( $.browser.msie ) {
+			scrollWidth = Math.max(
+				document.documentElement.scrollWidth,
+				document.body.scrollWidth
+			);
+			offsetWidth = Math.max(
+				document.documentElement.offsetWidth,
+				document.body.offsetWidth
+			);
+
+			if (scrollWidth < offsetWidth) {
+				return $(window).width() + 'px';
+			} else {
+				return scrollWidth + 'px';
+			}
+		// handle "good" browsers
+		} else {
+			return $(document).width() + 'px';
+		}
+	},
+
+	resize: function() {
+		/* If the dialog is draggable and the user drags it past the
+		 * right edge of the window, the document becomes wider so we
+		 * need to stretch the overlay. If the user then drags the
+		 * dialog back to the left, the document will become narrower,
+		 * so we need to shrink the overlay to the appropriate size.
+		 * This is handled by shrinking the overlay before setting it
+		 * to the full document size.
+		 */
+		var $overlays = $([]);
+		$.each($.ui.dialog.overlay.instances, function() {
+			$overlays = $overlays.add(this);
+		});
+
+		$overlays.css({
+			width: 0,
+			height: 0
+		}).css({
+			width: $.ui.dialog.overlay.width(),
+			height: $.ui.dialog.overlay.height()
+		});
+	}
+});
+
+$.extend($.ui.dialog.overlay.prototype, {
+	destroy: function() {
+		$.ui.dialog.overlay.destroy(this.$el);
+	}
+});
+
+}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.draggable.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.draggable.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.draggable.js	(revision 14585)
@@ -0,0 +1,825 @@
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.draggable", $.ui.mouse, {
+	widgetEventPrefix: "drag",
+	options: {
+		addClasses: true,
+		appendTo: "parent",
+		axis: false,
+		connectToSortable: false,
+		containment: false,
+		cursor: "auto",
+		cursorAt: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		iframeFix: false,
+		opacity: false,
+		refreshPositions: false,
+		revert: false,
+		revertDuration: 500,
+		scope: "default",
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		snap: false,
+		snapMode: "both",
+		snapTolerance: 20,
+		stack: false,
+		zIndex: false
+	},
+	_create: function() {
+
+		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+			this.element[0].style.position = 'relative';
+
+		(this.options.addClasses && this.element.addClass("ui-draggable"));
+		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		if(!this.element.data('draggable')) return;
+		this.element
+			.removeData("draggable")
+			.unbind(".draggable")
+			.removeClass("ui-draggable"
+				+ " ui-draggable-dragging"
+				+ " ui-draggable-disabled");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+
+		var o = this.options;
+
+		// among others, prevent a drag on a resizable-handle
+		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+			return false;
+
+		//Quit if we're not on a valid handle
+		this.handle = this._getHandle(event);
+		if (!this.handle)
+			return false;
+		
+		if ( o.iframeFix ) {
+			$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+				$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
+				.css({
+					width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+					position: "absolute", opacity: "0.001", zIndex: 1000
+				})
+				.css($(this).offset())
+				.appendTo("body");
+			});
+		}
+
+		return true;
+
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options;
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		//If ddmanager is used for droppables, set the global draggable
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Store the helper's css position
+		this.cssPosition = this.helper.css("position");
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.positionAbs = this.element.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this.position = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		//Trigger event + callbacks
+		if(this._trigger("start", event) === false) {
+			this._clear();
+			return false;
+		}
+
+		//Recache the helper size
+		this._cacheHelperProportions();
+
+		//Prepare the droppable offsets
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.helper.addClass("ui-draggable-dragging");
+		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
+		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
+		
+		return true;
+	},
+
+	_mouseDrag: function(event, noPropagation) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Call plugins and callbacks and use the resulting position if something is returned
+		if (!noPropagation) {
+			var ui = this._uiHash();
+			if(this._trigger('drag', event, ui) === false) {
+				this._mouseUp({});
+				return false;
+			}
+			this.position = ui.position;
+		}
+
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		//If we are using droppables, inform the manager about the drop
+		var dropped = false;
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			dropped = $.ui.ddmanager.drop(this, event);
+
+		//if a drop comes from outside (a sortable)
+		if(this.dropped) {
+			dropped = this.dropped;
+			this.dropped = false;
+		}
+		
+		//if the original element is removed, don't bother to continue if helper is set to "original"
+		if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original")
+			return false;
+
+		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+			var self = this;
+			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+				if(self._trigger("stop", event) !== false) {
+					self._clear();
+				}
+			});
+		} else {
+			if(this._trigger("stop", event) !== false) {
+				this._clear();
+			}
+		}
+
+		return false;
+	},
+	
+	_mouseUp: function(event) {
+		if (this.options.iframeFix === true) {
+			$("div.ui-draggable-iframeFix").each(function() { 
+				this.parentNode.removeChild(this); 
+			}); //Remove frame helpers
+		}
+		
+		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
+		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
+		
+		return $.ui.mouse.prototype._mouseUp.call(this, event);
+	},
+	
+	cancel: function() {
+		
+		if(this.helper.is(".ui-draggable-dragging")) {
+			this._mouseUp({});
+		} else {
+			this._clear();
+		}
+		
+		return this;
+		
+	},
+
+	_getHandle: function(event) {
+
+		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+		$(this.options.handle, this.element)
+			.find("*")
+			.andSelf()
+			.each(function() {
+				if(this == event.target) handle = true;
+			});
+
+		return handle;
+
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
+
+		if(!helper.parents('body').length)
+			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+			helper.css("position", "absolute");
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.element.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.element.css("marginLeft"),10) || 0),
+			top: (parseInt(this.element.css("marginTop"),10) || 0),
+			right: (parseInt(this.element.css("marginRight"),10) || 0),
+			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
+			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
+			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+		        var c = $(o.containment);
+			var ce = c[0]; if(!ce) return;
+			var co = c.offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
+				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
+				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
+				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
+			];
+			this.relative_container = c;
+
+		} else if(o.containment.constructor == Array) {
+			this.containment = o.containment;
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+		         var containment;
+		         if(this.containment) {
+				 if (this.relative_container){
+				     var co = this.relative_container.offset();
+				     containment = [ this.containment[0] + co.left,
+						     this.containment[1] + co.top,
+						     this.containment[2] + co.left,
+						     this.containment[3] + co.top ];
+				 }
+				 else {
+				     containment = this.containment;
+				 }
+
+				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
+				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
+				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
+				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_clear: function() {
+		this.helper.removeClass("ui-draggable-dragging");
+		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
+		this.helper = null;
+		this.cancelHelperRemoval = false;
+	},
+
+	// From now on bulk stuff - mainly helpers
+
+	_trigger: function(type, event, ui) {
+		ui = ui || this._uiHash();
+		$.ui.plugin.call(this, type, [event, ui]);
+		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+		return $.Widget.prototype._trigger.call(this, type, event, ui);
+	},
+
+	plugins: {},
+
+	_uiHash: function(event) {
+		return {
+			helper: this.helper,
+			position: this.position,
+			originalPosition: this.originalPosition,
+			offset: this.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.draggable, {
+	version: "1.8.16"
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+	start: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options,
+			uiSortable = $.extend({}, ui, { item: inst.element });
+		inst.sortables = [];
+		$(o.connectToSortable).each(function() {
+			var sortable = $.data(this, 'sortable');
+			if (sortable && !sortable.options.disabled) {
+				inst.sortables.push({
+					instance: sortable,
+					shouldRevert: sortable.options.revert
+				});
+				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
+				sortable._trigger("activate", event, uiSortable);
+			}
+		});
+
+	},
+	stop: function(event, ui) {
+
+		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+		var inst = $(this).data("draggable"),
+			uiSortable = $.extend({}, ui, { item: inst.element });
+
+		$.each(inst.sortables, function() {
+			if(this.instance.isOver) {
+
+				this.instance.isOver = 0;
+
+				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+				if(this.shouldRevert) this.instance.options.revert = true;
+
+				//Trigger the stop of the sortable
+				this.instance._mouseStop(event);
+
+				this.instance.options.helper = this.instance.options._helper;
+
+				//If the helper has been the original item, restore properties in the sortable
+				if(inst.options.helper == 'original')
+					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+			} else {
+				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+				this.instance._trigger("deactivate", event, uiSortable);
+			}
+
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), self = this;
+
+		var checkPos = function(o) {
+			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+			var itemHeight = o.height, itemWidth = o.width;
+			var itemTop = o.top, itemLeft = o.left;
+
+			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+		};
+
+		$.each(inst.sortables, function(i) {
+			
+			//Copy over some variables to allow calling the sortable's native _intersectsWith
+			this.instance.positionAbs = inst.positionAbs;
+			this.instance.helperProportions = inst.helperProportions;
+			this.instance.offset.click = inst.offset.click;
+			
+			if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+				if(!this.instance.isOver) {
+
+					this.instance.isOver = 1;
+					//Now we fake the start of dragging for the sortable instance,
+					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+					this.instance.currentItem = $(self).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
+					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+					this.instance.options.helper = function() { return ui.helper[0]; };
+
+					event.target = this.instance.currentItem[0];
+					this.instance._mouseCapture(event, true);
+					this.instance._mouseStart(event, true, true);
+
+					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+					this.instance.offset.click.top = inst.offset.click.top;
+					this.instance.offset.click.left = inst.offset.click.left;
+					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+					inst._trigger("toSortable", event);
+					inst.dropped = this.instance.element; //draggable revert needs that
+					//hack so receive/update callbacks work (mostly)
+					inst.currentItem = inst.element;
+					this.instance.fromOutside = inst;
+
+				}
+
+				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+				if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+			} else {
+
+				//If it doesn't intersect with the sortable, and it intersected before,
+				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+				if(this.instance.isOver) {
+
+					this.instance.isOver = 0;
+					this.instance.cancelHelperRemoval = true;
+					
+					//Prevent reverting on this forced stop
+					this.instance.options.revert = false;
+					
+					// The out event needs to be triggered independently
+					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+					
+					this.instance._mouseStop(event, true);
+					this.instance.options.helper = this.instance.options._helper;
+
+					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+					this.instance.currentItem.remove();
+					if(this.instance.placeholder) this.instance.placeholder.remove();
+
+					inst._trigger("fromSortable", event);
+					inst.dropped = false; //draggable revert needs that
+				}
+
+			};
+
+		});
+
+	}
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+	start: function(event, ui) {
+		var t = $('body'), o = $(this).data('draggable').options;
+		if (t.css("cursor")) o._cursor = t.css("cursor");
+		t.css("cursor", o.cursor);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if (o._cursor) $('body').css("cursor", o._cursor);
+	}
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data('draggable').options;
+		if(t.css("opacity")) o._opacity = t.css("opacity");
+		t.css('opacity', o.opacity);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data('draggable').options;
+		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+	}
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+	start: function(event, ui) {
+		var i = $(this).data("draggable");
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+	},
+	drag: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+			if(!o.axis || o.axis != 'x') {
+				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+			}
+
+		} else {
+
+			if(!o.axis || o.axis != 'x') {
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+			}
+
+			if(!o.axis || o.axis != 'y') {
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+			}
+
+		}
+
+		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(i, event);
+
+	}
+});
+
+$.ui.plugin.add("draggable", "snap", {
+	start: function(event, ui) {
+
+		var i = $(this).data("draggable"), o = i.options;
+		i.snapElements = [];
+
+		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+			var $t = $(this); var $o = $t.offset();
+			if(this != i.element[0]) i.snapElements.push({
+				item: this,
+				width: $t.outerWidth(), height: $t.outerHeight(),
+				top: $o.top, left: $o.left
+			});
+		});
+
+	},
+	drag: function(event, ui) {
+
+		var inst = $(this).data("draggable"), o = inst.options;
+		var d = o.snapTolerance;
+
+		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+		for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+			//Yes, I know, this is insane ;)
+			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+				inst.snapElements[i].snapping = false;
+				continue;
+			}
+
+			if(o.snapMode != 'inner') {
+				var ts = Math.abs(t - y2) <= d;
+				var bs = Math.abs(b - y1) <= d;
+				var ls = Math.abs(l - x2) <= d;
+				var rs = Math.abs(r - x1) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+			}
+
+			var first = (ts || bs || ls || rs);
+
+			if(o.snapMode != 'outer') {
+				var ts = Math.abs(t - y1) <= d;
+				var bs = Math.abs(b - y2) <= d;
+				var ls = Math.abs(l - x1) <= d;
+				var rs = Math.abs(r - x2) <= d;
+				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+			}
+
+			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+		};
+
+	}
+});
+
+$.ui.plugin.add("draggable", "stack", {
+	start: function(event, ui) {
+
+		var o = $(this).data("draggable").options;
+
+		var group = $.makeArray($(o.stack)).sort(function(a,b) {
+			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
+		});
+		if (!group.length) { return; }
+		
+		var min = parseInt(group[0].style.zIndex) || 0;
+		$(group).each(function(i) {
+			this.style.zIndex = min + i;
+		});
+
+		this[0].style.zIndex = min + group.length;
+
+	}
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+	start: function(event, ui) {
+		var t = $(ui.helper), o = $(this).data("draggable").options;
+		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+		t.css('zIndex', o.zIndex);
+	},
+	stop: function(event, ui) {
+		var o = $(this).data("draggable").options;
+		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+	}
+});
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.droppable.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.droppable.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.droppable.js	(revision 14585)
@@ -0,0 +1,296 @@
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.droppable", {
+	widgetEventPrefix: "drop",
+	options: {
+		accept: '*',
+		activeClass: false,
+		addClasses: true,
+		greedy: false,
+		hoverClass: false,
+		scope: 'default',
+		tolerance: 'intersect'
+	},
+	_create: function() {
+
+		var o = this.options, accept = o.accept;
+		this.isover = 0; this.isout = 1;
+
+		this.accept = $.isFunction(accept) ? accept : function(d) {
+			return d.is(accept);
+		};
+
+		//Store the droppable's proportions
+		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
+
+		// Add the reference and positions to the manager
+		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
+		$.ui.ddmanager.droppables[o.scope].push(this);
+
+		(o.addClasses && this.element.addClass("ui-droppable"));
+
+	},
+
+	destroy: function() {
+		var drop = $.ui.ddmanager.droppables[this.options.scope];
+		for ( var i = 0; i < drop.length; i++ )
+			if ( drop[i] == this )
+				drop.splice(i, 1);
+
+		this.element
+			.removeClass("ui-droppable ui-droppable-disabled")
+			.removeData("droppable")
+			.unbind(".droppable");
+
+		return this;
+	},
+
+	_setOption: function(key, value) {
+
+		if(key == 'accept') {
+			this.accept = $.isFunction(value) ? value : function(d) {
+				return d.is(value);
+			};
+		}
+		$.Widget.prototype._setOption.apply(this, arguments);
+	},
+
+	_activate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
+		(draggable && this._trigger('activate', event, this.ui(draggable)));
+	},
+
+	_deactivate: function(event) {
+		var draggable = $.ui.ddmanager.current;
+		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
+	},
+
+	_over: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
+			this._trigger('over', event, this.ui(draggable));
+		}
+
+	},
+
+	_out: function(event) {
+
+		var draggable = $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
+
+		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('out', event, this.ui(draggable));
+		}
+
+	},
+
+	_drop: function(event,custom) {
+
+		var draggable = custom || $.ui.ddmanager.current;
+		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
+
+		var childrenIntersection = false;
+		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
+			var inst = $.data(this, 'droppable');
+			if(
+				inst.options.greedy
+				&& !inst.options.disabled
+				&& inst.options.scope == draggable.options.scope
+				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
+				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
+			) { childrenIntersection = true; return false; }
+		});
+		if(childrenIntersection) return false;
+
+		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
+			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
+			this._trigger('drop', event, this.ui(draggable));
+			return this.element;
+		}
+
+		return false;
+
+	},
+
+	ui: function(c) {
+		return {
+			draggable: (c.currentItem || c.element),
+			helper: c.helper,
+			position: c.position,
+			offset: c.positionAbs
+		};
+	}
+
+});
+
+$.extend($.ui.droppable, {
+	version: "1.8.16"
+});
+
+$.ui.intersect = function(draggable, droppable, toleranceMode) {
+
+	if (!droppable.offset) return false;
+
+	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
+		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
+	var l = droppable.offset.left, r = l + droppable.proportions.width,
+		t = droppable.offset.top, b = t + droppable.proportions.height;
+
+	switch (toleranceMode) {
+		case 'fit':
+			return (l <= x1 && x2 <= r
+				&& t <= y1 && y2 <= b);
+			break;
+		case 'intersect':
+			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
+				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
+				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
+			break;
+		case 'pointer':
+			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
+				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
+				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
+			return isOver;
+			break;
+		case 'touch':
+			return (
+					(y1 >= t && y1 <= b) ||	// Top edge touching
+					(y2 >= t && y2 <= b) ||	// Bottom edge touching
+					(y1 < t && y2 > b)		// Surrounded vertically
+				) && (
+					(x1 >= l && x1 <= r) ||	// Left edge touching
+					(x2 >= l && x2 <= r) ||	// Right edge touching
+					(x1 < l && x2 > r)		// Surrounded horizontally
+				);
+			break;
+		default:
+			return false;
+			break;
+		}
+
+};
+
+/*
+	This manager tracks offsets of draggables and droppables
+*/
+$.ui.ddmanager = {
+	current: null,
+	droppables: { 'default': [] },
+	prepareOffsets: function(t, event) {
+
+		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
+		var type = event ? event.type : null; // workaround for #2317
+		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
+
+		droppablesLoop: for (var i = 0; i < m.length; i++) {
+
+			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
+			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
+			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
+
+			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
+
+			m[i].offset = m[i].element.offset();
+			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
+
+		}
+
+	},
+	drop: function(draggable, event) {
+
+		var dropped = false;
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(!this.options) return;
+			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
+				dropped = dropped || this._drop.call(this, event);
+
+			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
+				this.isout = 1; this.isover = 0;
+				this._deactivate.call(this, event);
+			}
+
+		});
+		return dropped;
+
+	},
+	dragStart: function( draggable, event ) {
+		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
+		draggable.element.parents( ":not(body,html)" ).bind( "scroll.droppable", function() {
+			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+		});
+	},
+	drag: function(draggable, event) {
+
+		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
+		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
+
+		//Run through all droppables and check their positions based on specific tolerance options
+		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
+
+			if(this.options.disabled || this.greedyChild || !this.visible) return;
+			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
+
+			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
+			if(!c) return;
+
+			var parentInstance;
+			if (this.options.greedy) {
+				var parent = this.element.parents(':data(droppable):eq(0)');
+				if (parent.length) {
+					parentInstance = $.data(parent[0], 'droppable');
+					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
+				}
+			}
+
+			// we just moved into a greedy child
+			if (parentInstance && c == 'isover') {
+				parentInstance['isover'] = 0;
+				parentInstance['isout'] = 1;
+				parentInstance._out.call(parentInstance, event);
+			}
+
+			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
+			this[c == "isover" ? "_over" : "_out"].call(this, event);
+
+			// we just moved out of a greedy child
+			if (parentInstance && c == 'isout') {
+				parentInstance['isout'] = 0;
+				parentInstance['isover'] = 1;
+				parentInstance._over.call(parentInstance, event);
+			}
+		});
+
+	},
+	dragStop: function( draggable, event ) {
+		draggable.element.parents( ":not(body,html)" ).unbind( "scroll.droppable" );
+		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
+		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
+	}
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.mouse.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.mouse.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.mouse.js	(revision 14585)
@@ -0,0 +1,162 @@
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var mouseHandled = false;
+$( document ).mouseup( function( e ) {
+	mouseHandled = false;
+});
+
+$.widget("ui.mouse", {
+	options: {
+		cancel: ':input,option',
+		distance: 1,
+		delay: 0
+	},
+	_mouseInit: function() {
+		var self = this;
+
+		this.element
+			.bind('mousedown.'+this.widgetName, function(event) {
+				return self._mouseDown(event);
+			})
+			.bind('click.'+this.widgetName, function(event) {
+				if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) {
+				    $.removeData(event.target, self.widgetName + '.preventClickEvent');
+					event.stopImmediatePropagation();
+					return false;
+				}
+			});
+
+		this.started = false;
+	},
+
+	// TODO: make sure destroying one instance of mouse doesn't mess with
+	// other instances of mouse
+	_mouseDestroy: function() {
+		this.element.unbind('.'+this.widgetName);
+	},
+
+	_mouseDown: function(event) {
+		// don't let more than one widget handle mouseStart
+		if( mouseHandled ) { return };
+
+		// we may have missed mouseup (out of window)
+		(this._mouseStarted && this._mouseUp(event));
+
+		this._mouseDownEvent = event;
+
+		var self = this,
+			btnIsLeft = (event.which == 1),
+			// event.target.nodeName works around a bug in IE 8 with
+			// disabled inputs (#7620)
+			elIsCancel = (typeof this.options.cancel == "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
+		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+			return true;
+		}
+
+		this.mouseDelayMet = !this.options.delay;
+		if (!this.mouseDelayMet) {
+			this._mouseDelayTimer = setTimeout(function() {
+				self.mouseDelayMet = true;
+			}, this.options.delay);
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted = (this._mouseStart(event) !== false);
+			if (!this._mouseStarted) {
+				event.preventDefault();
+				return true;
+			}
+		}
+
+		// Click event may never have fired (Gecko & Opera)
+		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
+			$.removeData(event.target, this.widgetName + '.preventClickEvent');
+		}
+
+		// these delegates are required to keep context
+		this._mouseMoveDelegate = function(event) {
+			return self._mouseMove(event);
+		};
+		this._mouseUpDelegate = function(event) {
+			return self._mouseUp(event);
+		};
+		$(document)
+			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		event.preventDefault();
+		
+		mouseHandled = true;
+		return true;
+	},
+
+	_mouseMove: function(event) {
+		// IE mouseup check - mouseup happened when mouse was out of window
+		if ($.browser.msie && !(document.documentMode >= 9) && !event.button) {
+			return this._mouseUp(event);
+		}
+
+		if (this._mouseStarted) {
+			this._mouseDrag(event);
+			return event.preventDefault();
+		}
+
+		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+			this._mouseStarted =
+				(this._mouseStart(this._mouseDownEvent, event) !== false);
+			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+		}
+
+		return !this._mouseStarted;
+	},
+
+	_mouseUp: function(event) {
+		$(document)
+			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+		if (this._mouseStarted) {
+			this._mouseStarted = false;
+
+			if (event.target == this._mouseDownEvent.target) {
+			    $.data(event.target, this.widgetName + '.preventClickEvent', true);
+			}
+
+			this._mouseStop(event);
+		}
+
+		return false;
+	},
+
+	_mouseDistanceMet: function(event) {
+		return (Math.max(
+				Math.abs(this._mouseDownEvent.pageX - event.pageX),
+				Math.abs(this._mouseDownEvent.pageY - event.pageY)
+			) >= this.options.distance
+		);
+	},
+
+	_mouseDelayMet: function(event) {
+		return this.mouseDelayMet;
+	},
+
+	// These are placeholder methods, to be overriden by extending plugin
+	_mouseStart: function(event) {},
+	_mouseDrag: function(event) {},
+	_mouseStop: function(event) {},
+	_mouseCapture: function(event) { return true; }
+});
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.position.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.position.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.position.js	(revision 14585)
@@ -0,0 +1,252 @@
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function( $, undefined ) {
+
+$.ui = $.ui || {};
+
+var horizontalPositions = /left|center|right/,
+	verticalPositions = /top|center|bottom/,
+	center = "center",
+	_position = $.fn.position,
+	_offset = $.fn.offset;
+
+$.fn.position = function( options ) {
+	if ( !options || !options.of ) {
+		return _position.apply( this, arguments );
+	}
+
+	// make a copy, we don't want to modify arguments
+	options = $.extend( {}, options );
+
+	var target = $( options.of ),
+		targetElem = target[0],
+		collision = ( options.collision || "flip" ).split( " " ),
+		offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ],
+		targetWidth,
+		targetHeight,
+		basePosition;
+
+	if ( targetElem.nodeType === 9 ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: 0, left: 0 };
+	// TODO: use $.isWindow() in 1.9
+	} else if ( targetElem.setTimeout ) {
+		targetWidth = target.width();
+		targetHeight = target.height();
+		basePosition = { top: target.scrollTop(), left: target.scrollLeft() };
+	} else if ( targetElem.preventDefault ) {
+		// force left top to allow flipping
+		options.at = "left top";
+		targetWidth = targetHeight = 0;
+		basePosition = { top: options.of.pageY, left: options.of.pageX };
+	} else {
+		targetWidth = target.outerWidth();
+		targetHeight = target.outerHeight();
+		basePosition = target.offset();
+	}
+
+	// force my and at to have valid horizontal and veritcal positions
+	// if a value is missing or invalid, it will be converted to center 
+	$.each( [ "my", "at" ], function() {
+		var pos = ( options[this] || "" ).split( " " );
+		if ( pos.length === 1) {
+			pos = horizontalPositions.test( pos[0] ) ?
+				pos.concat( [center] ) :
+				verticalPositions.test( pos[0] ) ?
+					[ center ].concat( pos ) :
+					[ center, center ];
+		}
+		pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center;
+		pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center;
+		options[ this ] = pos;
+	});
+
+	// normalize collision option
+	if ( collision.length === 1 ) {
+		collision[ 1 ] = collision[ 0 ];
+	}
+
+	// normalize offset option
+	offset[ 0 ] = parseInt( offset[0], 10 ) || 0;
+	if ( offset.length === 1 ) {
+		offset[ 1 ] = offset[ 0 ];
+	}
+	offset[ 1 ] = parseInt( offset[1], 10 ) || 0;
+
+	if ( options.at[0] === "right" ) {
+		basePosition.left += targetWidth;
+	} else if ( options.at[0] === center ) {
+		basePosition.left += targetWidth / 2;
+	}
+
+	if ( options.at[1] === "bottom" ) {
+		basePosition.top += targetHeight;
+	} else if ( options.at[1] === center ) {
+		basePosition.top += targetHeight / 2;
+	}
+
+	basePosition.left += offset[ 0 ];
+	basePosition.top += offset[ 1 ];
+
+	return this.each(function() {
+		var elem = $( this ),
+			elemWidth = elem.outerWidth(),
+			elemHeight = elem.outerHeight(),
+			marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0,
+			marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0,
+			collisionWidth = elemWidth + marginLeft +
+				( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ),
+			collisionHeight = elemHeight + marginTop +
+				( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ),
+			position = $.extend( {}, basePosition ),
+			collisionPosition;
+
+		if ( options.my[0] === "right" ) {
+			position.left -= elemWidth;
+		} else if ( options.my[0] === center ) {
+			position.left -= elemWidth / 2;
+		}
+
+		if ( options.my[1] === "bottom" ) {
+			position.top -= elemHeight;
+		} else if ( options.my[1] === center ) {
+			position.top -= elemHeight / 2;
+		}
+
+		// prevent fractions (see #5280)
+		position.left = Math.round( position.left );
+		position.top = Math.round( position.top );
+
+		collisionPosition = {
+			left: position.left - marginLeft,
+			top: position.top - marginTop
+		};
+
+		$.each( [ "left", "top" ], function( i, dir ) {
+			if ( $.ui.position[ collision[i] ] ) {
+				$.ui.position[ collision[i] ][ dir ]( position, {
+					targetWidth: targetWidth,
+					targetHeight: targetHeight,
+					elemWidth: elemWidth,
+					elemHeight: elemHeight,
+					collisionPosition: collisionPosition,
+					collisionWidth: collisionWidth,
+					collisionHeight: collisionHeight,
+					offset: offset,
+					my: options.my,
+					at: options.at
+				});
+			}
+		});
+
+		if ( $.fn.bgiframe ) {
+			elem.bgiframe();
+		}
+		elem.offset( $.extend( position, { using: options.using } ) );
+	});
+};
+
+$.ui.position = {
+	fit: {
+		left: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft();
+			position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left );
+		},
+		top: function( position, data ) {
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop();
+			position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top );
+		}
+	},
+
+	flip: {
+		left: function( position, data ) {
+			if ( data.at[0] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(),
+				myOffset = data.my[ 0 ] === "left" ?
+					-data.elemWidth :
+					data.my[ 0 ] === "right" ?
+						data.elemWidth :
+						0,
+				atOffset = data.at[ 0 ] === "left" ?
+					data.targetWidth :
+					-data.targetWidth,
+				offset = -2 * data.offset[ 0 ];
+			position.left += data.collisionPosition.left < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		},
+		top: function( position, data ) {
+			if ( data.at[1] === center ) {
+				return;
+			}
+			var win = $( window ),
+				over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(),
+				myOffset = data.my[ 1 ] === "top" ?
+					-data.elemHeight :
+					data.my[ 1 ] === "bottom" ?
+						data.elemHeight :
+						0,
+				atOffset = data.at[ 1 ] === "top" ?
+					data.targetHeight :
+					-data.targetHeight,
+				offset = -2 * data.offset[ 1 ];
+			position.top += data.collisionPosition.top < 0 ?
+				myOffset + atOffset + offset :
+				over > 0 ?
+					myOffset + atOffset + offset :
+					0;
+		}
+	}
+};
+
+// offset setter from jQuery 1.4
+if ( !$.offset.setOffset ) {
+	$.offset.setOffset = function( elem, options ) {
+		// set position first, in-case top/left are set even on static elem
+		if ( /static/.test( $.curCSS( elem, "position" ) ) ) {
+			elem.style.position = "relative";
+		}
+		var curElem   = $( elem ),
+			curOffset = curElem.offset(),
+			curTop    = parseInt( $.curCSS( elem, "top",  true ), 10 ) || 0,
+			curLeft   = parseInt( $.curCSS( elem, "left", true ), 10)  || 0,
+			props     = {
+				top:  (options.top  - curOffset.top)  + curTop,
+				left: (options.left - curOffset.left) + curLeft
+			};
+		
+		if ( 'using' in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	};
+
+	$.fn.offset = function( options ) {
+		var elem = this[ 0 ];
+		if ( !elem || !elem.ownerDocument ) { return null; }
+		if ( options ) { 
+			return this.each(function() {
+				$.offset.setOffset( this, options );
+			});
+		}
+		return _offset.call( this );
+	};
+}
+
+}( jQuery ));
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.progressbar.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.progressbar.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.progressbar.js	(revision 14585)
@@ -0,0 +1,109 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget( "ui.progressbar", {
+	options: {
+		value: 0,
+		max: 100
+	},
+
+	min: 0,
+
+	_create: function() {
+		this.element
+			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.attr({
+				role: "progressbar",
+				"aria-valuemin": this.min,
+				"aria-valuemax": this.options.max,
+				"aria-valuenow": this._value()
+			});
+
+		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
+			.appendTo( this.element );
+
+		this.oldValue = this._value();
+		this._refreshValue();
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
+			.removeAttr( "role" )
+			.removeAttr( "aria-valuemin" )
+			.removeAttr( "aria-valuemax" )
+			.removeAttr( "aria-valuenow" );
+
+		this.valueDiv.remove();
+
+		$.Widget.prototype.destroy.apply( this, arguments );
+	},
+
+	value: function( newValue ) {
+		if ( newValue === undefined ) {
+			return this._value();
+		}
+
+		this._setOption( "value", newValue );
+		return this;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "value" ) {
+			this.options.value = value;
+			this._refreshValue();
+			if ( this._value() === this.options.max ) {
+				this._trigger( "complete" );
+			}
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+	},
+
+	_value: function() {
+		var val = this.options.value;
+		// normalize invalid value
+		if ( typeof val !== "number" ) {
+			val = 0;
+		}
+		return Math.min( this.options.max, Math.max( this.min, val ) );
+	},
+
+	_percentage: function() {
+		return 100 * this._value() / this.options.max;
+	},
+
+	_refreshValue: function() {
+		var value = this.value();
+		var percentage = this._percentage();
+
+		if ( this.oldValue !== value ) {
+			this.oldValue = value;
+			this._trigger( "change" );
+		}
+
+		this.valueDiv
+			.toggle( value > this.min )
+			.toggleClass( "ui-corner-right", value === this.options.max )
+			.width( percentage.toFixed(0) + "%" );
+		this.element.attr( "aria-valuenow", value );
+	}
+});
+
+$.extend( $.ui.progressbar, {
+	version: "1.8.16"
+});
+
+})( jQuery );
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.resizable.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.resizable.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.resizable.js	(revision 14585)
@@ -0,0 +1,842 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.resizable", $.ui.mouse, {
+	widgetEventPrefix: "resize",
+	options: {
+		alsoResize: false,
+		animate: false,
+		animateDuration: "slow",
+		animateEasing: "swing",
+		aspectRatio: false,
+		autoHide: false,
+		containment: false,
+		ghost: false,
+		grid: false,
+		handles: "e,s,se",
+		helper: false,
+		maxHeight: null,
+		maxWidth: null,
+		minHeight: 10,
+		minWidth: 10,
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var self = this, o = this.options;
+		this.element.addClass("ui-resizable");
+
+		$.extend(this, {
+			_aspectRatio: !!(o.aspectRatio),
+			aspectRatio: o.aspectRatio,
+			originalElement: this.element,
+			_proportionallyResizeElements: [],
+			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+		});
+
+		//Wrap the element if it cannot hold child nodes
+		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+			//Opera fix for relative positioning
+			if (/relative/.test(this.element.css('position')) && $.browser.opera)
+				this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+			//Create a wrapper element and set the wrapper to the new current internal element
+			this.element.wrap(
+				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
+					position: this.element.css('position'),
+					width: this.element.outerWidth(),
+					height: this.element.outerHeight(),
+					top: this.element.css('top'),
+					left: this.element.css('left')
+				})
+			);
+
+			//Overwrite the original this.element
+			this.element = this.element.parent().data(
+				"resizable", this.element.data('resizable')
+			);
+
+			this.elementIsWrapper = true;
+
+			//Move margins to the wrapper
+			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+			//Prevent Safari textarea resize
+			this.originalResizeStyle = this.originalElement.css('resize');
+			this.originalElement.css('resize', 'none');
+
+			//Push the actual element to our proportionallyResize internal array
+			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+			// avoid IE jump (hard set the margin)
+			this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+			// fix handlers offset
+			this._proportionallyResize();
+
+		}
+
+		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+		if(this.handles.constructor == String) {
+
+			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+			var n = this.handles.split(","); this.handles = {};
+
+			for(var i = 0; i < n.length; i++) {
+
+				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
+
+				// increase zIndex of sw, se, ne, nw axis
+				//TODO : this modifies original option
+				if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+				//TODO : What's going on here?
+				if ('se' == handle) {
+					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+				};
+
+				//Insert into internal handles object and append to element
+				this.handles[handle] = '.ui-resizable-'+handle;
+				this.element.append(axis);
+			}
+
+		}
+
+		this._renderAxis = function(target) {
+
+			target = target || this.element;
+
+			for(var i in this.handles) {
+
+				if(this.handles[i].constructor == String)
+					this.handles[i] = $(this.handles[i], this.element).show();
+
+				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+					var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+					//Checking the correct pad and border
+					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+					//The padding type i have to apply...
+					var padPos = [ 'padding',
+						/ne|nw|n/.test(i) ? 'Top' :
+						/se|sw|s/.test(i) ? 'Bottom' :
+						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+					target.css(padPos, padWrapper);
+
+					this._proportionallyResize();
+
+				}
+
+				//TODO: What's that good for? There's not anything to be executed left
+				if(!$(this.handles[i]).length)
+					continue;
+
+			}
+		};
+
+		//TODO: make renderAxis a prototype function
+		this._renderAxis(this.element);
+
+		this._handles = $('.ui-resizable-handle', this.element)
+			.disableSelection();
+
+		//Matching axis name
+		this._handles.mouseover(function() {
+			if (!self.resizing) {
+				if (this.className)
+					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+				//Axis, default = se
+				self.axis = axis && axis[1] ? axis[1] : 'se';
+			}
+		});
+
+		//If we want to auto hide the elements
+		if (o.autoHide) {
+			this._handles.hide();
+			$(this.element)
+				.addClass("ui-resizable-autohide")
+				.hover(function() {
+					if (o.disabled) return;
+					$(this).removeClass("ui-resizable-autohide");
+					self._handles.show();
+				},
+				function(){
+					if (o.disabled) return;
+					if (!self.resizing) {
+						$(this).addClass("ui-resizable-autohide");
+						self._handles.hide();
+					}
+				});
+		}
+
+		//Initialize the mouse interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+
+		this._mouseDestroy();
+
+		var _destroy = function(exp) {
+			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+				.removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+		};
+
+		//TODO: Unwrap at same DOM position
+		if (this.elementIsWrapper) {
+			_destroy(this.element);
+			var wrapper = this.element;
+			wrapper.after(
+				this.originalElement.css({
+					position: wrapper.css('position'),
+					width: wrapper.outerWidth(),
+					height: wrapper.outerHeight(),
+					top: wrapper.css('top'),
+					left: wrapper.css('left')
+				})
+			).remove();
+		}
+
+		this.originalElement.css('resize', this.originalResizeStyle);
+		_destroy(this.originalElement);
+
+		return this;
+	},
+
+	_mouseCapture: function(event) {
+		var handle = false;
+		for (var i in this.handles) {
+			if ($(this.handles[i])[0] == event.target) {
+				handle = true;
+			}
+		}
+
+		return !this.options.disabled && handle;
+	},
+
+	_mouseStart: function(event) {
+
+		var o = this.options, iniPos = this.element.position(), el = this.element;
+
+		this.resizing = true;
+		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+		// bugfix for http://dev.jquery.com/ticket/1749
+		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+		}
+
+		//Opera fixing relative position
+		if ($.browser.opera && (/relative/).test(el.css('position')))
+			el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+		this._renderProxy();
+
+		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+		if (o.containment) {
+			curleft += $(o.containment).scrollLeft() || 0;
+			curtop += $(o.containment).scrollTop() || 0;
+		}
+
+		//Store needed variables
+		this.offset = this.helper.offset();
+		this.position = { left: curleft, top: curtop };
+		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+		this.originalPosition = { left: curleft, top: curtop };
+		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+		this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+		//Aspect Ratio
+		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+	    var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+	    $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+		el.addClass("ui-resizable-resizing");
+		this._propagate("start", event);
+		return true;
+	},
+
+	_mouseDrag: function(event) {
+
+		//Increase performance, avoid regex
+		var el = this.helper, o = this.options, props = {},
+			self = this, smp = this.originalMousePosition, a = this.axis;
+
+		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+		var trigger = this._change[a];
+		if (!trigger) return false;
+
+		// Calculate the attrs that will be change
+		var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
+		this._updateVirtualBoundaries(event.shiftKey);
+		if (this._aspectRatio || event.shiftKey)
+			data = this._updateRatio(data, event);
+
+		data = this._respectSize(data, event);
+
+		// plugins callbacks need to be called first
+		this._propagate("resize", event);
+
+		el.css({
+			top: this.position.top + "px", left: this.position.left + "px",
+			width: this.size.width + "px", height: this.size.height + "px"
+		});
+
+		if (!this._helper && this._proportionallyResizeElements.length)
+			this._proportionallyResize();
+
+		this._updateCache(data);
+
+		// calling the user callback at the end
+		this._trigger('resize', event, this.ui());
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+
+		this.resizing = false;
+		var o = this.options, self = this;
+
+		if(this._helper) {
+			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+				soffsetw = ista ? 0 : self.sizeDiff.width;
+
+			var s = { width: (self.helper.width()  - soffsetw), height: (self.helper.height() - soffseth) },
+				left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+				top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+			if (!o.animate)
+				this.element.css($.extend(s, { top: top, left: left }));
+
+			self.helper.height(self.size.height);
+			self.helper.width(self.size.width);
+
+			if (this._helper && !o.animate) this._proportionallyResize();
+		}
+
+		$('body').css('cursor', 'auto');
+
+		this.element.removeClass("ui-resizable-resizing");
+
+		this._propagate("stop", event);
+
+		if (this._helper) this.helper.remove();
+		return false;
+
+	},
+
+    _updateVirtualBoundaries: function(forceAspectRatio) {
+        var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
+
+        b = {
+            minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
+            maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
+            minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
+            maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
+        };
+
+        if(this._aspectRatio || forceAspectRatio) {
+            // We want to create an enclosing box whose aspect ration is the requested one
+            // First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
+            pMinWidth = b.minHeight * this.aspectRatio;
+            pMinHeight = b.minWidth / this.aspectRatio;
+            pMaxWidth = b.maxHeight * this.aspectRatio;
+            pMaxHeight = b.maxWidth / this.aspectRatio;
+
+            if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
+            if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
+            if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
+            if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
+        }
+        this._vBoundaries = b;
+    },
+
+	_updateCache: function(data) {
+		var o = this.options;
+		this.offset = this.helper.offset();
+		if (isNumber(data.left)) this.position.left = data.left;
+		if (isNumber(data.top)) this.position.top = data.top;
+		if (isNumber(data.height)) this.size.height = data.height;
+		if (isNumber(data.width)) this.size.width = data.width;
+	},
+
+	_updateRatio: function(data, event) {
+
+		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
+		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
+
+		if (a == 'sw') {
+			data.left = cpos.left + (csize.width - data.width);
+			data.top = null;
+		}
+		if (a == 'nw') {
+			data.top = cpos.top + (csize.height - data.height);
+			data.left = cpos.left + (csize.width - data.width);
+		}
+
+		return data;
+	},
+
+	_respectSize: function(data, event) {
+
+		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+		if (isminw) data.width = o.minWidth;
+		if (isminh) data.height = o.minHeight;
+		if (ismaxw) data.width = o.maxWidth;
+		if (ismaxh) data.height = o.maxHeight;
+
+		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+		if (isminw && cw) data.left = dw - o.minWidth;
+		if (ismaxw && cw) data.left = dw - o.maxWidth;
+		if (isminh && ch)	data.top = dh - o.minHeight;
+		if (ismaxh && ch)	data.top = dh - o.maxHeight;
+
+		// fixing jump error on top/left - bug #2330
+		var isNotwh = !data.width && !data.height;
+		if (isNotwh && !data.left && data.top) data.top = null;
+		else if (isNotwh && !data.top && data.left) data.left = null;
+
+		return data;
+	},
+
+	_proportionallyResize: function() {
+
+		var o = this.options;
+		if (!this._proportionallyResizeElements.length) return;
+		var element = this.helper || this.element;
+
+		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+			var prel = this._proportionallyResizeElements[i];
+
+			if (!this.borderDif) {
+				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+				this.borderDif = $.map(b, function(v, i) {
+					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+					return border + padding;
+				});
+			}
+
+			if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+				continue;
+
+			prel.css({
+				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+			});
+
+		};
+
+	},
+
+	_renderProxy: function() {
+
+		var el = this.element, o = this.options;
+		this.elementOffset = el.offset();
+
+		if(this._helper) {
+
+			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
+
+			// fix ie6 offset TODO: This seems broken
+			var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+			pxyoffset = ( ie6 ? 2 : -1 );
+
+			this.helper.addClass(this._helper).css({
+				width: this.element.outerWidth() + pxyoffset,
+				height: this.element.outerHeight() + pxyoffset,
+				position: 'absolute',
+				left: this.elementOffset.left - ie6offset +'px',
+				top: this.elementOffset.top - ie6offset +'px',
+				zIndex: ++o.zIndex //TODO: Don't modify option
+			});
+
+			this.helper
+				.appendTo("body")
+				.disableSelection();
+
+		} else {
+			this.helper = this.element;
+		}
+
+	},
+
+	_change: {
+		e: function(event, dx, dy) {
+			return { width: this.originalSize.width + dx };
+		},
+		w: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { left: sp.left + dx, width: cs.width - dx };
+		},
+		n: function(event, dx, dy) {
+			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+			return { top: sp.top + dy, height: cs.height - dy };
+		},
+		s: function(event, dx, dy) {
+			return { height: this.originalSize.height + dy };
+		},
+		se: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		sw: function(event, dx, dy) {
+			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		},
+		ne: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+		},
+		nw: function(event, dx, dy) {
+			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+		}
+	},
+
+	_propagate: function(n, event) {
+		$.ui.plugin.call(this, n, [event, this.ui()]);
+		(n != "resize" && this._trigger(n, event, this.ui()));
+	},
+
+	plugins: {},
+
+	ui: function() {
+		return {
+			originalElement: this.originalElement,
+			element: this.element,
+			helper: this.helper,
+			position: this.position,
+			size: this.size,
+			originalSize: this.originalSize,
+			originalPosition: this.originalPosition
+		};
+	}
+
+});
+
+$.extend($.ui.resizable, {
+	version: "1.8.16"
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+	start: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _store = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				el.data("resizable-alsoresize", {
+					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
+					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10),
+					position: el.css('position') // to reset Opera on stop()
+				});
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
+		}else{
+			_store(o.alsoResize);
+		}
+	},
+
+	resize: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+		var delta = {
+			height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+			top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+		},
+
+		_alsoResize = function (exp, c) {
+			$(exp).each(function() {
+				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, 
+					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
+
+				$.each(css, function (i, prop) {
+					var sum = (start[prop]||0) + (delta[prop]||0);
+					if (sum && sum >= 0)
+						style[prop] = sum || null;
+				});
+
+				// Opera fixing relative position
+				if ($.browser.opera && /relative/.test(el.css('position'))) {
+					self._revertToRelativePosition = true;
+					el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+				}
+
+				el.css(style);
+			});
+		};
+
+		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
+		}else{
+			_alsoResize(o.alsoResize);
+		}
+	},
+
+	stop: function (event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var _reset = function (exp) {
+			$(exp).each(function() {
+				var el = $(this);
+				// reset position for Opera - no need to verify it was changed
+				el.css({ position: el.data("resizable-alsoresize").position });
+			});
+		};
+
+		if (self._revertToRelativePosition) {
+			self._revertToRelativePosition = false;
+			if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+				$.each(o.alsoResize, function (exp) { _reset(exp); });
+			}else{
+				_reset(o.alsoResize);
+			}
+		}
+
+		$(this).removeData("resizable-alsoresize");
+	}
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+	stop: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options;
+
+		var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+						soffsetw = ista ? 0 : self.sizeDiff.width;
+
+		var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+					left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+						top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+		self.element.animate(
+			$.extend(style, top && left ? { top: top, left: left } : {}), {
+				duration: o.animateDuration,
+				easing: o.animateEasing,
+				step: function() {
+
+					var data = {
+						width: parseInt(self.element.css('width'), 10),
+						height: parseInt(self.element.css('height'), 10),
+						top: parseInt(self.element.css('top'), 10),
+						left: parseInt(self.element.css('left'), 10)
+					};
+
+					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+					// propagating resize, and updating values for each animation step
+					self._updateCache(data);
+					self._propagate("resize", event);
+
+				}
+			}
+		);
+	}
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+	start: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, el = self.element;
+		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+		if (!ce) return;
+
+		self.containerElement = $(ce);
+
+		if (/document/.test(oc) || oc == document) {
+			self.containerOffset = { left: 0, top: 0 };
+			self.containerPosition = { left: 0, top: 0 };
+
+			self.parentData = {
+				element: $(document), left: 0, top: 0,
+				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+			};
+		}
+
+		// i'm a node, so compute top, left, right, bottom
+		else {
+			var element = $(ce), p = [];
+			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+			self.containerOffset = element.offset();
+			self.containerPosition = element.position();
+			self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+			var co = self.containerOffset, ch = self.containerSize.height,	cw = self.containerSize.width,
+						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+			self.parentData = {
+				element: ce, left: co.left, top: co.top, width: width, height: height
+			};
+		}
+	},
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options,
+				ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+				pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+		if (cp.left < (self._helper ? co.left : 0)) {
+			self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+			if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+			self.position.left = o.helper ? co.left : 0;
+		}
+
+		if (cp.top < (self._helper ? co.top : 0)) {
+			self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+			if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+			self.position.top = self._helper ? co.top : 0;
+		}
+
+		self.offset.left = self.parentData.left+self.position.left;
+		self.offset.top = self.parentData.top+self.position.top;
+
+		var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+					hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+		var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+		    isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+		if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+		if (woset + self.size.width >= self.parentData.width) {
+			self.size.width = self.parentData.width - woset;
+			if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+		}
+
+		if (hoset + self.size.height >= self.parentData.height) {
+			self.size.height = self.parentData.height - hoset;
+			if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+		}
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options, cp = self.position,
+				co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+		var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+		if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+		if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+	}
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+	start: function(event, ui) {
+
+		var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+		self.ghost = self.originalElement.clone();
+		self.ghost
+			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+			.addClass('ui-resizable-ghost')
+			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+		self.ghost.appendTo(self.helper);
+
+	},
+
+	resize: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+	},
+
+	stop: function(event, ui){
+		var self = $(this).data("resizable"), o = self.options;
+		if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+	}
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+	resize: function(event, ui) {
+		var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+		if (/^(se|s|e)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+		}
+		else if (/^(ne)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+		}
+		else if (/^(sw)$/.test(a)) {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.left = op.left - ox;
+		}
+		else {
+			self.size.width = os.width + ox;
+			self.size.height = os.height + oy;
+			self.position.top = op.top - oy;
+			self.position.left = op.left - ox;
+		}
+	}
+
+});
+
+var num = function(v) {
+	return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+	return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.selectable.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.selectable.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.selectable.js	(revision 14585)
@@ -0,0 +1,266 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.selectable", $.ui.mouse, {
+	options: {
+		appendTo: 'body',
+		autoRefresh: true,
+		distance: 0,
+		filter: '*',
+		tolerance: 'touch'
+	},
+	_create: function() {
+		var self = this;
+
+		this.element.addClass("ui-selectable");
+
+		this.dragged = false;
+
+		// cache selectee children based on filter
+		var selectees;
+		this.refresh = function() {
+			selectees = $(self.options.filter, self.element[0]);
+			selectees.each(function() {
+				var $this = $(this);
+				var pos = $this.offset();
+				$.data(this, "selectable-item", {
+					element: this,
+					$element: $this,
+					left: pos.left,
+					top: pos.top,
+					right: pos.left + $this.outerWidth(),
+					bottom: pos.top + $this.outerHeight(),
+					startselected: false,
+					selected: $this.hasClass('ui-selected'),
+					selecting: $this.hasClass('ui-selecting'),
+					unselecting: $this.hasClass('ui-unselecting')
+				});
+			});
+		};
+		this.refresh();
+
+		this.selectees = selectees.addClass("ui-selectee");
+
+		this._mouseInit();
+
+		this.helper = $("<div class='ui-selectable-helper'></div>");
+	},
+
+	destroy: function() {
+		this.selectees
+			.removeClass("ui-selectee")
+			.removeData("selectable-item");
+		this.element
+			.removeClass("ui-selectable ui-selectable-disabled")
+			.removeData("selectable")
+			.unbind(".selectable");
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseStart: function(event) {
+		var self = this;
+
+		this.opos = [event.pageX, event.pageY];
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		this.selectees = $(options.filter, this.element[0]);
+
+		this._trigger("start", event);
+
+		$(options.appendTo).append(this.helper);
+		// position helper (lasso)
+		this.helper.css({
+			"left": event.clientX,
+			"top": event.clientY,
+			"width": 0,
+			"height": 0
+		});
+
+		if (options.autoRefresh) {
+			this.refresh();
+		}
+
+		this.selectees.filter('.ui-selected').each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.startselected = true;
+			if (!event.metaKey) {
+				selectee.$element.removeClass('ui-selected');
+				selectee.selected = false;
+				selectee.$element.addClass('ui-unselecting');
+				selectee.unselecting = true;
+				// selectable UNSELECTING callback
+				self._trigger("unselecting", event, {
+					unselecting: selectee.element
+				});
+			}
+		});
+
+		$(event.target).parents().andSelf().each(function() {
+			var selectee = $.data(this, "selectable-item");
+			if (selectee) {
+				var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected');
+				selectee.$element
+					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
+					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
+				selectee.unselecting = !doSelect;
+				selectee.selecting = doSelect;
+				selectee.selected = doSelect;
+				// selectable (UN)SELECTING callback
+				if (doSelect) {
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				} else {
+					self._trigger("unselecting", event, {
+						unselecting: selectee.element
+					});
+				}
+				return false;
+			}
+		});
+
+	},
+
+	_mouseDrag: function(event) {
+		var self = this;
+		this.dragged = true;
+
+		if (this.options.disabled)
+			return;
+
+		var options = this.options;
+
+		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
+		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
+		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
+		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
+
+		this.selectees.each(function() {
+			var selectee = $.data(this, "selectable-item");
+			//prevent helper from being selected if appendTo: selectable
+			if (!selectee || selectee.element == self.element[0])
+				return;
+			var hit = false;
+			if (options.tolerance == 'touch') {
+				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
+			} else if (options.tolerance == 'fit') {
+				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
+			}
+
+			if (hit) {
+				// SELECT
+				if (selectee.selected) {
+					selectee.$element.removeClass('ui-selected');
+					selectee.selected = false;
+				}
+				if (selectee.unselecting) {
+					selectee.$element.removeClass('ui-unselecting');
+					selectee.unselecting = false;
+				}
+				if (!selectee.selecting) {
+					selectee.$element.addClass('ui-selecting');
+					selectee.selecting = true;
+					// selectable SELECTING callback
+					self._trigger("selecting", event, {
+						selecting: selectee.element
+					});
+				}
+			} else {
+				// UNSELECT
+				if (selectee.selecting) {
+					if (event.metaKey && selectee.startselected) {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						selectee.$element.addClass('ui-selected');
+						selectee.selected = true;
+					} else {
+						selectee.$element.removeClass('ui-selecting');
+						selectee.selecting = false;
+						if (selectee.startselected) {
+							selectee.$element.addClass('ui-unselecting');
+							selectee.unselecting = true;
+						}
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+				if (selectee.selected) {
+					if (!event.metaKey && !selectee.startselected) {
+						selectee.$element.removeClass('ui-selected');
+						selectee.selected = false;
+
+						selectee.$element.addClass('ui-unselecting');
+						selectee.unselecting = true;
+						// selectable UNSELECTING callback
+						self._trigger("unselecting", event, {
+							unselecting: selectee.element
+						});
+					}
+				}
+			}
+		});
+
+		return false;
+	},
+
+	_mouseStop: function(event) {
+		var self = this;
+
+		this.dragged = false;
+
+		var options = this.options;
+
+		$('.ui-unselecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-unselecting');
+			selectee.unselecting = false;
+			selectee.startselected = false;
+			self._trigger("unselected", event, {
+				unselected: selectee.element
+			});
+		});
+		$('.ui-selecting', this.element[0]).each(function() {
+			var selectee = $.data(this, "selectable-item");
+			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
+			selectee.selecting = false;
+			selectee.selected = true;
+			selectee.startselected = true;
+			self._trigger("selected", event, {
+				selected: selectee.element
+			});
+		});
+		this._trigger("stop", event);
+
+		this.helper.remove();
+
+		return false;
+	}
+
+});
+
+$.extend($.ui.selectable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.slider.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.slider.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.slider.js	(revision 14585)
@@ -0,0 +1,666 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+// number of pages in a slider
+// (how many times can you page up/down to go through the whole range)
+var numPages = 5;
+
+$.widget( "ui.slider", $.ui.mouse, {
+
+	widgetEventPrefix: "slide",
+
+	options: {
+		animate: false,
+		distance: 0,
+		max: 100,
+		min: 0,
+		orientation: "horizontal",
+		range: false,
+		step: 1,
+		value: 0,
+		values: null
+	},
+
+	_create: function() {
+		var self = this,
+			o = this.options,
+			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
+			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
+			handleCount = ( o.values && o.values.length ) || 1,
+			handles = [];
+
+		this._keySliding = false;
+		this._mouseSliding = false;
+		this._animateOff = true;
+		this._handleIndex = null;
+		this._detectOrientation();
+		this._mouseInit();
+
+		this.element
+			.addClass( "ui-slider" +
+				" ui-slider-" + this.orientation +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" +
+				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
+
+		this.range = $([]);
+
+		if ( o.range ) {
+			if ( o.range === true ) {
+				if ( !o.values ) {
+					o.values = [ this._valueMin(), this._valueMin() ];
+				}
+				if ( o.values.length && o.values.length !== 2 ) {
+					o.values = [ o.values[0], o.values[0] ];
+				}
+			}
+
+			this.range = $( "<div></div>" )
+				.appendTo( this.element )
+				.addClass( "ui-slider-range" +
+				// note: this isn't the most fittingly semantic framework class for this element,
+				// but worked best visually with a variety of themes
+				" ui-widget-header" + 
+				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
+		}
+
+		for ( var i = existingHandles.length; i < handleCount; i += 1 ) {
+			handles.push( handle );
+		}
+
+		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( self.element ) );
+
+		this.handle = this.handles.eq( 0 );
+
+		this.handles.add( this.range ).filter( "a" )
+			.click(function( event ) {
+				event.preventDefault();
+			})
+			.hover(function() {
+				if ( !o.disabled ) {
+					$( this ).addClass( "ui-state-hover" );
+				}
+			}, function() {
+				$( this ).removeClass( "ui-state-hover" );
+			})
+			.focus(function() {
+				if ( !o.disabled ) {
+					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
+					$( this ).addClass( "ui-state-focus" );
+				} else {
+					$( this ).blur();
+				}
+			})
+			.blur(function() {
+				$( this ).removeClass( "ui-state-focus" );
+			});
+
+		this.handles.each(function( i ) {
+			$( this ).data( "index.ui-slider-handle", i );
+		});
+
+		this.handles
+			.keydown(function( event ) {
+				var ret = true,
+					index = $( this ).data( "index.ui-slider-handle" ),
+					allowed,
+					curVal,
+					newVal,
+					step;
+	
+				if ( self.options.disabled ) {
+					return;
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+					case $.ui.keyCode.END:
+					case $.ui.keyCode.PAGE_UP:
+					case $.ui.keyCode.PAGE_DOWN:
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						ret = false;
+						if ( !self._keySliding ) {
+							self._keySliding = true;
+							$( this ).addClass( "ui-state-active" );
+							allowed = self._start( event, index );
+							if ( allowed === false ) {
+								return;
+							}
+						}
+						break;
+				}
+	
+				step = self.options.step;
+				if ( self.options.values && self.options.values.length ) {
+					curVal = newVal = self.values( index );
+				} else {
+					curVal = newVal = self.value();
+				}
+	
+				switch ( event.keyCode ) {
+					case $.ui.keyCode.HOME:
+						newVal = self._valueMin();
+						break;
+					case $.ui.keyCode.END:
+						newVal = self._valueMax();
+						break;
+					case $.ui.keyCode.PAGE_UP:
+						newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.PAGE_DOWN:
+						newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) );
+						break;
+					case $.ui.keyCode.UP:
+					case $.ui.keyCode.RIGHT:
+						if ( curVal === self._valueMax() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal + step );
+						break;
+					case $.ui.keyCode.DOWN:
+					case $.ui.keyCode.LEFT:
+						if ( curVal === self._valueMin() ) {
+							return;
+						}
+						newVal = self._trimAlignValue( curVal - step );
+						break;
+				}
+	
+				self._slide( event, index, newVal );
+	
+				return ret;
+	
+			})
+			.keyup(function( event ) {
+				var index = $( this ).data( "index.ui-slider-handle" );
+	
+				if ( self._keySliding ) {
+					self._keySliding = false;
+					self._stop( event, index );
+					self._change( event, index );
+					$( this ).removeClass( "ui-state-active" );
+				}
+	
+			});
+
+		this._refreshValue();
+
+		this._animateOff = false;
+	},
+
+	destroy: function() {
+		this.handles.remove();
+		this.range.remove();
+
+		this.element
+			.removeClass( "ui-slider" +
+				" ui-slider-horizontal" +
+				" ui-slider-vertical" +
+				" ui-slider-disabled" +
+				" ui-widget" +
+				" ui-widget-content" +
+				" ui-corner-all" )
+			.removeData( "slider" )
+			.unbind( ".slider" );
+
+		this._mouseDestroy();
+
+		return this;
+	},
+
+	_mouseCapture: function( event ) {
+		var o = this.options,
+			position,
+			normValue,
+			distance,
+			closestHandle,
+			self,
+			index,
+			allowed,
+			offset,
+			mouseOverHandle;
+
+		if ( o.disabled ) {
+			return false;
+		}
+
+		this.elementSize = {
+			width: this.element.outerWidth(),
+			height: this.element.outerHeight()
+		};
+		this.elementOffset = this.element.offset();
+
+		position = { x: event.pageX, y: event.pageY };
+		normValue = this._normValueFromMouse( position );
+		distance = this._valueMax() - this._valueMin() + 1;
+		self = this;
+		this.handles.each(function( i ) {
+			var thisDistance = Math.abs( normValue - self.values(i) );
+			if ( distance > thisDistance ) {
+				distance = thisDistance;
+				closestHandle = $( this );
+				index = i;
+			}
+		});
+
+		// workaround for bug #3736 (if both handles of a range are at 0,
+		// the first is always used as the one with least distance,
+		// and moving it is obviously prevented by preventing negative ranges)
+		if( o.range === true && this.values(1) === o.min ) {
+			index += 1;
+			closestHandle = $( this.handles[index] );
+		}
+
+		allowed = this._start( event, index );
+		if ( allowed === false ) {
+			return false;
+		}
+		this._mouseSliding = true;
+
+		self._handleIndex = index;
+
+		closestHandle
+			.addClass( "ui-state-active" )
+			.focus();
+		
+		offset = closestHandle.offset();
+		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
+		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
+			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
+			top: event.pageY - offset.top -
+				( closestHandle.height() / 2 ) -
+				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
+				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
+				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
+		};
+
+		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
+			this._slide( event, index, normValue );
+		}
+		this._animateOff = true;
+		return true;
+	},
+
+	_mouseStart: function( event ) {
+		return true;
+	},
+
+	_mouseDrag: function( event ) {
+		var position = { x: event.pageX, y: event.pageY },
+			normValue = this._normValueFromMouse( position );
+		
+		this._slide( event, this._handleIndex, normValue );
+
+		return false;
+	},
+
+	_mouseStop: function( event ) {
+		this.handles.removeClass( "ui-state-active" );
+		this._mouseSliding = false;
+
+		this._stop( event, this._handleIndex );
+		this._change( event, this._handleIndex );
+
+		this._handleIndex = null;
+		this._clickOffset = null;
+		this._animateOff = false;
+
+		return false;
+	},
+	
+	_detectOrientation: function() {
+		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
+	},
+
+	_normValueFromMouse: function( position ) {
+		var pixelTotal,
+			pixelMouse,
+			percentMouse,
+			valueTotal,
+			valueMouse;
+
+		if ( this.orientation === "horizontal" ) {
+			pixelTotal = this.elementSize.width;
+			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
+		} else {
+			pixelTotal = this.elementSize.height;
+			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
+		}
+
+		percentMouse = ( pixelMouse / pixelTotal );
+		if ( percentMouse > 1 ) {
+			percentMouse = 1;
+		}
+		if ( percentMouse < 0 ) {
+			percentMouse = 0;
+		}
+		if ( this.orientation === "vertical" ) {
+			percentMouse = 1 - percentMouse;
+		}
+
+		valueTotal = this._valueMax() - this._valueMin();
+		valueMouse = this._valueMin() + percentMouse * valueTotal;
+
+		return this._trimAlignValue( valueMouse );
+	},
+
+	_start: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+		return this._trigger( "start", event, uiHash );
+	},
+
+	_slide: function( event, index, newVal ) {
+		var otherVal,
+			newValues,
+			allowed;
+
+		if ( this.options.values && this.options.values.length ) {
+			otherVal = this.values( index ? 0 : 1 );
+
+			if ( ( this.options.values.length === 2 && this.options.range === true ) && 
+					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
+				) {
+				newVal = otherVal;
+			}
+
+			if ( newVal !== this.values( index ) ) {
+				newValues = this.values();
+				newValues[ index ] = newVal;
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal,
+					values: newValues
+				} );
+				otherVal = this.values( index ? 0 : 1 );
+				if ( allowed !== false ) {
+					this.values( index, newVal, true );
+				}
+			}
+		} else {
+			if ( newVal !== this.value() ) {
+				// A slide can be canceled by returning false from the slide callback
+				allowed = this._trigger( "slide", event, {
+					handle: this.handles[ index ],
+					value: newVal
+				} );
+				if ( allowed !== false ) {
+					this.value( newVal );
+				}
+			}
+		}
+	},
+
+	_stop: function( event, index ) {
+		var uiHash = {
+			handle: this.handles[ index ],
+			value: this.value()
+		};
+		if ( this.options.values && this.options.values.length ) {
+			uiHash.value = this.values( index );
+			uiHash.values = this.values();
+		}
+
+		this._trigger( "stop", event, uiHash );
+	},
+
+	_change: function( event, index ) {
+		if ( !this._keySliding && !this._mouseSliding ) {
+			var uiHash = {
+				handle: this.handles[ index ],
+				value: this.value()
+			};
+			if ( this.options.values && this.options.values.length ) {
+				uiHash.value = this.values( index );
+				uiHash.values = this.values();
+			}
+
+			this._trigger( "change", event, uiHash );
+		}
+	},
+
+	value: function( newValue ) {
+		if ( arguments.length ) {
+			this.options.value = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, 0 );
+			return;
+		}
+
+		return this._value();
+	},
+
+	values: function( index, newValue ) {
+		var vals,
+			newValues,
+			i;
+
+		if ( arguments.length > 1 ) {
+			this.options.values[ index ] = this._trimAlignValue( newValue );
+			this._refreshValue();
+			this._change( null, index );
+			return;
+		}
+
+		if ( arguments.length ) {
+			if ( $.isArray( arguments[ 0 ] ) ) {
+				vals = this.options.values;
+				newValues = arguments[ 0 ];
+				for ( i = 0; i < vals.length; i += 1 ) {
+					vals[ i ] = this._trimAlignValue( newValues[ i ] );
+					this._change( null, i );
+				}
+				this._refreshValue();
+			} else {
+				if ( this.options.values && this.options.values.length ) {
+					return this._values( index );
+				} else {
+					return this.value();
+				}
+			}
+		} else {
+			return this._values();
+		}
+	},
+
+	_setOption: function( key, value ) {
+		var i,
+			valsLength = 0;
+
+		if ( $.isArray( this.options.values ) ) {
+			valsLength = this.options.values.length;
+		}
+
+		$.Widget.prototype._setOption.apply( this, arguments );
+
+		switch ( key ) {
+			case "disabled":
+				if ( value ) {
+					this.handles.filter( ".ui-state-focus" ).blur();
+					this.handles.removeClass( "ui-state-hover" );
+					this.handles.propAttr( "disabled", true );
+					this.element.addClass( "ui-disabled" );
+				} else {
+					this.handles.propAttr( "disabled", false );
+					this.element.removeClass( "ui-disabled" );
+				}
+				break;
+			case "orientation":
+				this._detectOrientation();
+				this.element
+					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
+					.addClass( "ui-slider-" + this.orientation );
+				this._refreshValue();
+				break;
+			case "value":
+				this._animateOff = true;
+				this._refreshValue();
+				this._change( null, 0 );
+				this._animateOff = false;
+				break;
+			case "values":
+				this._animateOff = true;
+				this._refreshValue();
+				for ( i = 0; i < valsLength; i += 1 ) {
+					this._change( null, i );
+				}
+				this._animateOff = false;
+				break;
+		}
+	},
+
+	//internal value getter
+	// _value() returns value trimmed by min and max, aligned by step
+	_value: function() {
+		var val = this.options.value;
+		val = this._trimAlignValue( val );
+
+		return val;
+	},
+
+	//internal values getter
+	// _values() returns array of values trimmed by min and max, aligned by step
+	// _values( index ) returns single value trimmed by min and max, aligned by step
+	_values: function( index ) {
+		var val,
+			vals,
+			i;
+
+		if ( arguments.length ) {
+			val = this.options.values[ index ];
+			val = this._trimAlignValue( val );
+
+			return val;
+		} else {
+			// .slice() creates a copy of the array
+			// this copy gets trimmed by min and max and then returned
+			vals = this.options.values.slice();
+			for ( i = 0; i < vals.length; i+= 1) {
+				vals[ i ] = this._trimAlignValue( vals[ i ] );
+			}
+
+			return vals;
+		}
+	},
+	
+	// returns the step-aligned value that val is closest to, between (inclusive) min and max
+	_trimAlignValue: function( val ) {
+		if ( val <= this._valueMin() ) {
+			return this._valueMin();
+		}
+		if ( val >= this._valueMax() ) {
+			return this._valueMax();
+		}
+		var step = ( this.options.step > 0 ) ? this.options.step : 1,
+			valModStep = (val - this._valueMin()) % step,
+			alignValue = val - valModStep;
+
+		if ( Math.abs(valModStep) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see #4124)
+		return parseFloat( alignValue.toFixed(5) );
+	},
+
+	_valueMin: function() {
+		return this.options.min;
+	},
+
+	_valueMax: function() {
+		return this.options.max;
+	},
+	
+	_refreshValue: function() {
+		var oRange = this.options.range,
+			o = this.options,
+			self = this,
+			animate = ( !this._animateOff ) ? o.animate : false,
+			valPercent,
+			_set = {},
+			lastValPercent,
+			value,
+			valueMin,
+			valueMax;
+
+		if ( this.options.values && this.options.values.length ) {
+			this.handles.each(function( i, j ) {
+				valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100;
+				_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+				if ( self.options.range === true ) {
+					if ( self.orientation === "horizontal" ) {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					} else {
+						if ( i === 0 ) {
+							self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
+						}
+						if ( i === 1 ) {
+							self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
+						}
+					}
+				}
+				lastValPercent = valPercent;
+			});
+		} else {
+			value = this.value();
+			valueMin = this._valueMin();
+			valueMax = this._valueMax();
+			valPercent = ( valueMax !== valueMin ) ?
+					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+					0;
+			_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
+			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
+
+			if ( oRange === "min" && this.orientation === "horizontal" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "horizontal" ) {
+				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+			if ( oRange === "min" && this.orientation === "vertical" ) {
+				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
+			}
+			if ( oRange === "max" && this.orientation === "vertical" ) {
+				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
+			}
+		}
+	}
+
+});
+
+$.extend( $.ui.slider, {
+	version: "1.8.16"
+});
+
+}(jQuery));
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.sortable.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.sortable.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.sortable.js	(revision 14585)
@@ -0,0 +1,1077 @@
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+$.widget("ui.sortable", $.ui.mouse, {
+	widgetEventPrefix: "sort",
+	options: {
+		appendTo: "parent",
+		axis: false,
+		connectWith: false,
+		containment: false,
+		cursor: 'auto',
+		cursorAt: false,
+		dropOnEmpty: true,
+		forcePlaceholderSize: false,
+		forceHelperSize: false,
+		grid: false,
+		handle: false,
+		helper: "original",
+		items: '> *',
+		opacity: false,
+		placeholder: false,
+		revert: false,
+		scroll: true,
+		scrollSensitivity: 20,
+		scrollSpeed: 20,
+		scope: "default",
+		tolerance: "intersect",
+		zIndex: 1000
+	},
+	_create: function() {
+
+		var o = this.options;
+		this.containerCache = {};
+		this.element.addClass("ui-sortable");
+
+		//Get the items
+		this.refresh();
+
+		//Let's determine if the items are being displayed horizontally
+		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
+
+		//Let's determine the parent's offset
+		this.offset = this.element.offset();
+
+		//Initialize mouse events for interaction
+		this._mouseInit();
+
+	},
+
+	destroy: function() {
+		this.element
+			.removeClass("ui-sortable ui-sortable-disabled")
+			.removeData("sortable")
+			.unbind(".sortable");
+		this._mouseDestroy();
+
+		for ( var i = this.items.length - 1; i >= 0; i-- )
+			this.items[i].item.removeData("sortable-item");
+
+		return this;
+	},
+
+	_setOption: function(key, value){
+		if ( key === "disabled" ) {
+			this.options[ key ] = value;
+	
+			this.widget()
+				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
+		} else {
+			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
+			$.Widget.prototype._setOption.apply(this, arguments);
+		}
+	},
+
+	_mouseCapture: function(event, overrideHandle) {
+
+		if (this.reverting) {
+			return false;
+		}
+
+		if(this.options.disabled || this.options.type == 'static') return false;
+
+		//We have to refresh the items data once first
+		this._refreshItems(event);
+
+		//Find out if the clicked node (or one of its parents) is a actual item in this.items
+		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
+			if($.data(this, 'sortable-item') == self) {
+				currentItem = $(this);
+				return false;
+			}
+		});
+		if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);
+
+		if(!currentItem) return false;
+		if(this.options.handle && !overrideHandle) {
+			var validHandle = false;
+
+			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
+			if(!validHandle) return false;
+		}
+
+		this.currentItem = currentItem;
+		this._removeCurrentsFromItems();
+		return true;
+
+	},
+
+	_mouseStart: function(event, overrideHandle, noActivation) {
+
+		var o = this.options, self = this;
+		this.currentContainer = this;
+
+		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
+		this.refreshPositions();
+
+		//Create and append the visible helper
+		this.helper = this._createHelper(event);
+
+		//Cache the helper size
+		this._cacheHelperProportions();
+
+		/*
+		 * - Position generation -
+		 * This block generates everything position related - it's the core of draggables.
+		 */
+
+		//Cache the margins of the original element
+		this._cacheMargins();
+
+		//Get the next scrolling parent
+		this.scrollParent = this.helper.scrollParent();
+
+		//The element's absolute position on the page minus margins
+		this.offset = this.currentItem.offset();
+		this.offset = {
+			top: this.offset.top - this.margins.top,
+			left: this.offset.left - this.margins.left
+		};
+
+		// Only after we got the offset, we can change the helper's position to absolute
+		// TODO: Still need to figure out a way to make relative sorting possible
+		this.helper.css("position", "absolute");
+		this.cssPosition = this.helper.css("position");
+
+		$.extend(this.offset, {
+			click: { //Where the click happened, relative to the element
+				left: event.pageX - this.offset.left,
+				top: event.pageY - this.offset.top
+			},
+			parent: this._getParentOffset(),
+			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+		});
+
+		//Generate the original position
+		this.originalPosition = this._generatePosition(event);
+		this.originalPageX = event.pageX;
+		this.originalPageY = event.pageY;
+
+		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
+
+		//Cache the former DOM position
+		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
+
+		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
+		if(this.helper[0] != this.currentItem[0]) {
+			this.currentItem.hide();
+		}
+
+		//Create the placeholder
+		this._createPlaceholder();
+
+		//Set a containment if given in the options
+		if(o.containment)
+			this._setContainment();
+
+		if(o.cursor) { // cursor option
+			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
+			$('body').css("cursor", o.cursor);
+		}
+
+		if(o.opacity) { // opacity option
+			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
+			this.helper.css("opacity", o.opacity);
+		}
+
+		if(o.zIndex) { // zIndex option
+			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
+			this.helper.css("zIndex", o.zIndex);
+		}
+
+		//Prepare scrolling
+		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
+			this.overflowOffset = this.scrollParent.offset();
+
+		//Call callbacks
+		this._trigger("start", event, this._uiHash());
+
+		//Recache the helper size
+		if(!this._preserveHelperProportions)
+			this._cacheHelperProportions();
+
+
+		//Post 'activate' events to possible containers
+		if(!noActivation) {
+			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
+		}
+
+		//Prepare possible droppables
+		if($.ui.ddmanager)
+			$.ui.ddmanager.current = this;
+
+		if ($.ui.ddmanager && !o.dropBehaviour)
+			$.ui.ddmanager.prepareOffsets(this, event);
+
+		this.dragging = true;
+
+		this.helper.addClass("ui-sortable-helper");
+		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+		return true;
+
+	},
+
+	_mouseDrag: function(event) {
+
+		//Compute the helpers position
+		this.position = this._generatePosition(event);
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		if (!this.lastPositionAbs) {
+			this.lastPositionAbs = this.positionAbs;
+		}
+
+		//Do scrolling
+		if(this.options.scroll) {
+			var o = this.options, scrolled = false;
+			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
+
+				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
+					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+
+				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
+					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+
+			} else {
+
+				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+
+				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+
+			}
+
+			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+				$.ui.ddmanager.prepareOffsets(this, event);
+		}
+
+		//Regenerate the absolute position used for position checks
+		this.positionAbs = this._convertPositionTo("absolute");
+
+		//Set the helper position
+		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+
+		//Rearrange
+		for (var i = this.items.length - 1; i >= 0; i--) {
+
+			//Cache variables and intersection, continue if no intersection
+			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
+			if (!intersection) continue;
+
+			if(itemElement != this.currentItem[0] //cannot intersect with itself
+				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
+				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
+				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
+				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
+			) {
+
+				this.direction = intersection == 1 ? "down" : "up";
+
+				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
+					this._rearrange(event, item);
+				} else {
+					break;
+				}
+
+				this._trigger("change", event, this._uiHash());
+				break;
+			}
+		}
+
+		//Post events to containers
+		this._contactContainers(event);
+
+		//Interconnect with droppables
+		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+		//Call callbacks
+		this._trigger('sort', event, this._uiHash());
+
+		this.lastPositionAbs = this.positionAbs;
+		return false;
+
+	},
+
+	_mouseStop: function(event, noPropagation) {
+
+		if(!event) return;
+
+		//If we are using droppables, inform the manager about the drop
+		if ($.ui.ddmanager && !this.options.dropBehaviour)
+			$.ui.ddmanager.drop(this, event);
+
+		if(this.options.revert) {
+			var self = this;
+			var cur = self.placeholder.offset();
+
+			self.reverting = true;
+
+			$(this.helper).animate({
+				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
+				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
+			}, parseInt(this.options.revert, 10) || 500, function() {
+				self._clear(event);
+			});
+		} else {
+			this._clear(event, noPropagation);
+		}
+
+		return false;
+
+	},
+
+	cancel: function() {
+
+		var self = this;
+
+		if(this.dragging) {
+
+			this._mouseUp({ target: null });
+
+			if(this.options.helper == "original")
+				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+			else
+				this.currentItem.show();
+
+			//Post deactivating events to containers
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", null, self._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+
+		if (this.placeholder) {
+			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
+
+			$.extend(this, {
+				helper: null,
+				dragging: false,
+				reverting: false,
+				_noFinalSort: null
+			});
+
+			if(this.domPosition.prev) {
+				$(this.domPosition.prev).after(this.currentItem);
+			} else {
+				$(this.domPosition.parent).prepend(this.currentItem);
+			}
+		}
+
+		return this;
+
+	},
+
+	serialize: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var str = []; o = o || {};
+
+		$(items).each(function() {
+			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
+			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
+		});
+
+		if(!str.length && o.key) {
+			str.push(o.key + '=');
+		}
+
+		return str.join('&');
+
+	},
+
+	toArray: function(o) {
+
+		var items = this._getItemsAsjQuery(o && o.connected);
+		var ret = []; o = o || {};
+
+		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
+		return ret;
+
+	},
+
+	/* Be careful with the following core functions */
+	_intersectsWith: function(item) {
+
+		var x1 = this.positionAbs.left,
+			x2 = x1 + this.helperProportions.width,
+			y1 = this.positionAbs.top,
+			y2 = y1 + this.helperProportions.height;
+
+		var l = item.left,
+			r = l + item.width,
+			t = item.top,
+			b = t + item.height;
+
+		var dyClick = this.offset.click.top,
+			dxClick = this.offset.click.left;
+
+		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
+
+		if(	   this.options.tolerance == "pointer"
+			|| this.options.forcePointerForContainers
+			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
+		) {
+			return isOverElement;
+		} else {
+
+			return (l < x1 + (this.helperProportions.width / 2) // Right Half
+				&& x2 - (this.helperProportions.width / 2) < r // Left Half
+				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
+				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
+
+		}
+	},
+
+	_intersectsWithPointer: function(item) {
+
+		var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
+			isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
+			isOverElement = isOverElementHeight && isOverElementWidth,
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (!isOverElement)
+			return false;
+
+		return this.floating ?
+			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
+			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
+
+	},
+
+	_intersectsWithSides: function(item) {
+
+		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
+			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
+			verticalDirection = this._getDragVerticalDirection(),
+			horizontalDirection = this._getDragHorizontalDirection();
+
+		if (this.floating && horizontalDirection) {
+			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
+		} else {
+			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
+		}
+
+	},
+
+	_getDragVerticalDirection: function() {
+		var delta = this.positionAbs.top - this.lastPositionAbs.top;
+		return delta != 0 && (delta > 0 ? "down" : "up");
+	},
+
+	_getDragHorizontalDirection: function() {
+		var delta = this.positionAbs.left - this.lastPositionAbs.left;
+		return delta != 0 && (delta > 0 ? "right" : "left");
+	},
+
+	refresh: function(event) {
+		this._refreshItems(event);
+		this.refreshPositions();
+		return this;
+	},
+
+	_connectWith: function() {
+		var options = this.options;
+		return options.connectWith.constructor == String
+			? [options.connectWith]
+			: options.connectWith;
+	},
+	
+	_getItemsAsjQuery: function(connected) {
+
+		var self = this;
+		var items = [];
+		var queries = [];
+		var connectWith = this._connectWith();
+
+		if(connectWith && connected) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
+					}
+				};
+			};
+		}
+
+		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
+
+		for (var i = queries.length - 1; i >= 0; i--){
+			queries[i][0].each(function() {
+				items.push(this);
+			});
+		};
+
+		return $(items);
+
+	},
+
+	_removeCurrentsFromItems: function() {
+
+		var list = this.currentItem.find(":data(sortable-item)");
+
+		for (var i=0; i < this.items.length; i++) {
+
+			for (var j=0; j < list.length; j++) {
+				if(list[j] == this.items[i].item[0])
+					this.items.splice(i,1);
+			};
+
+		};
+
+	},
+
+	_refreshItems: function(event) {
+
+		this.items = [];
+		this.containers = [this];
+		var items = this.items;
+		var self = this;
+		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
+		var connectWith = this._connectWith();
+
+		if(connectWith) {
+			for (var i = connectWith.length - 1; i >= 0; i--){
+				var cur = $(connectWith[i]);
+				for (var j = cur.length - 1; j >= 0; j--){
+					var inst = $.data(cur[j], 'sortable');
+					if(inst && inst != this && !inst.options.disabled) {
+						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
+						this.containers.push(inst);
+					}
+				};
+			};
+		}
+
+		for (var i = queries.length - 1; i >= 0; i--) {
+			var targetData = queries[i][1];
+			var _queries = queries[i][0];
+
+			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
+				var item = $(_queries[j]);
+
+				item.data('sortable-item', targetData); // Data for target checking (mouse manager)
+
+				items.push({
+					item: item,
+					instance: targetData,
+					width: 0, height: 0,
+					left: 0, top: 0
+				});
+			};
+		};
+
+	},
+
+	refreshPositions: function(fast) {
+
+		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
+		if(this.offsetParent && this.helper) {
+			this.offset.parent = this._getParentOffset();
+		}
+
+		for (var i = this.items.length - 1; i >= 0; i--){
+			var item = this.items[i];
+
+			//We ignore calculating positions of all connected containers when we're not over them
+			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
+				continue;
+
+			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
+
+			if (!fast) {
+				item.width = t.outerWidth();
+				item.height = t.outerHeight();
+			}
+
+			var p = t.offset();
+			item.left = p.left;
+			item.top = p.top;
+		};
+
+		if(this.options.custom && this.options.custom.refreshContainers) {
+			this.options.custom.refreshContainers.call(this);
+		} else {
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				var p = this.containers[i].element.offset();
+				this.containers[i].containerCache.left = p.left;
+				this.containers[i].containerCache.top = p.top;
+				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
+				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
+			};
+		}
+
+		return this;
+	},
+
+	_createPlaceholder: function(that) {
+
+		var self = that || this, o = self.options;
+
+		if(!o.placeholder || o.placeholder.constructor == String) {
+			var className = o.placeholder;
+			o.placeholder = {
+				element: function() {
+
+					var el = $(document.createElement(self.currentItem[0].nodeName))
+						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
+						.removeClass("ui-sortable-helper")[0];
+
+					if(!className)
+						el.style.visibility = "hidden";
+
+					return el;
+				},
+				update: function(container, p) {
+
+					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
+					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
+					if(className && !o.forcePlaceholderSize) return;
+
+					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
+					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
+					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
+				}
+			};
+		}
+
+		//Create the placeholder
+		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
+
+		//Append it after the actual current item
+		self.currentItem.after(self.placeholder);
+
+		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
+		o.placeholder.update(self, self.placeholder);
+
+	},
+
+	_contactContainers: function(event) {
+		
+		// get innermost container that intersects with item 
+		var innermostContainer = null, innermostIndex = null;		
+		
+		
+		for (var i = this.containers.length - 1; i >= 0; i--){
+
+			// never consider a container that's located within the item itself 
+			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
+				continue;
+
+			if(this._intersectsWith(this.containers[i].containerCache)) {
+
+				// if we've already found a container and it's more "inner" than this, then continue 
+				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
+					continue;
+
+				innermostContainer = this.containers[i]; 
+				innermostIndex = i;
+					
+			} else {
+				// container doesn't intersect. trigger "out" event if necessary 
+				if(this.containers[i].containerCache.over) {
+					this.containers[i]._trigger("out", event, this._uiHash(this));
+					this.containers[i].containerCache.over = 0;
+				}
+			}
+
+		}
+		
+		// if no intersecting containers found, return 
+		if(!innermostContainer) return; 
+
+		// move the item into the container if it's not there already
+		if(this.containers.length === 1) {
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
+			this.containers[innermostIndex].containerCache.over = 1;
+		} else if(this.currentContainer != this.containers[innermostIndex]) { 
+
+			//When entering a new container, we will find the item with the least distance and append our item near it 
+			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
+			for (var j = this.items.length - 1; j >= 0; j--) { 
+				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
+				var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
+				if(Math.abs(cur - base) < dist) { 
+					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
+				} 
+			} 
+
+			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
+				return; 
+
+			this.currentContainer = this.containers[innermostIndex]; 
+			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
+			this._trigger("change", event, this._uiHash()); 
+			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 
+
+			//Update the placeholder 
+			this.options.placeholder.update(this.currentContainer, this.placeholder); 
+		
+			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
+			this.containers[innermostIndex].containerCache.over = 1;
+		} 
+	
+		
+	},
+
+	_createHelper: function(event) {
+
+		var o = this.options;
+		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
+
+		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
+			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
+
+		if(helper[0] == this.currentItem[0])
+			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
+
+		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
+		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
+
+		return helper;
+
+	},
+
+	_adjustOffsetFromHelper: function(obj) {
+		if (typeof obj == 'string') {
+			obj = obj.split(' ');
+		}
+		if ($.isArray(obj)) {
+			obj = {left: +obj[0], top: +obj[1] || 0};
+		}
+		if ('left' in obj) {
+			this.offset.click.left = obj.left + this.margins.left;
+		}
+		if ('right' in obj) {
+			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+		}
+		if ('top' in obj) {
+			this.offset.click.top = obj.top + this.margins.top;
+		}
+		if ('bottom' in obj) {
+			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+		}
+	},
+
+	_getParentOffset: function() {
+
+
+		//Get the offsetParent and cache its position
+		this.offsetParent = this.helper.offsetParent();
+		var po = this.offsetParent.offset();
+
+		// This is a special case where we need to modify a offset calculated on start, since the following happened:
+		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+			po.left += this.scrollParent.scrollLeft();
+			po.top += this.scrollParent.scrollTop();
+		}
+
+		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+			po = { top: 0, left: 0 };
+
+		return {
+			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+		};
+
+	},
+
+	_getRelativeOffset: function() {
+
+		if(this.cssPosition == "relative") {
+			var p = this.currentItem.position();
+			return {
+				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+			};
+		} else {
+			return { top: 0, left: 0 };
+		}
+
+	},
+
+	_cacheMargins: function() {
+		this.margins = {
+			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
+			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
+		};
+	},
+
+	_cacheHelperProportions: function() {
+		this.helperProportions = {
+			width: this.helper.outerWidth(),
+			height: this.helper.outerHeight()
+		};
+	},
+
+	_setContainment: function() {
+
+		var o = this.options;
+		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+		if(o.containment == 'document' || o.containment == 'window') this.containment = [
+			0 - this.offset.relative.left - this.offset.parent.left,
+			0 - this.offset.relative.top - this.offset.parent.top,
+			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+		];
+
+		if(!(/^(document|window|parent)$/).test(o.containment)) {
+			var ce = $(o.containment)[0];
+			var co = $(o.containment).offset();
+			var over = ($(ce).css("overflow") != 'hidden');
+
+			this.containment = [
+				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+			];
+		}
+
+	},
+
+	_convertPositionTo: function(d, pos) {
+
+		if(!pos) pos = this.position;
+		var mod = d == "absolute" ? 1 : -1;
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		return {
+			top: (
+				pos.top																	// The absolute mouse position
+				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+			),
+			left: (
+				pos.left																// The absolute mouse position
+				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
+				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
+				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+			)
+		};
+
+	},
+
+	_generatePosition: function(event) {
+
+		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+		// This is another very weird special case that only happens for relative elements:
+		// 1. If the css position is relative
+		// 2. and the scroll parent is the document or similar to the offset parent
+		// we have to refresh the relative offset during the scroll so there are no jumps
+		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+			this.offset.relative = this._getRelativeOffset();
+		}
+
+		var pageX = event.pageX;
+		var pageY = event.pageY;
+
+		/*
+		 * - Position constraining -
+		 * Constrain the position to a mix of grid, containment.
+		 */
+
+		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+			if(this.containment) {
+				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+			}
+
+			if(o.grid) {
+				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+			}
+
+		}
+
+		return {
+			top: (
+				pageY																// The absolute mouse position
+				- this.offset.click.top													// Click offset (relative to the element)
+				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+			),
+			left: (
+				pageX																// The absolute mouse position
+				- this.offset.click.left												// Click offset (relative to the element)
+				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
+				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
+				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+			)
+		};
+
+	},
+
+	_rearrange: function(event, i, a, hardRefresh) {
+
+		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
+
+		//Various things done here to improve the performance:
+		// 1. we create a setTimeout, that calls refreshPositions
+		// 2. on the instance, we have a counter variable, that get's higher after every append
+		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
+		// 4. this lets only the last addition to the timeout stack through
+		this.counter = this.counter ? ++this.counter : 1;
+		var self = this, counter = this.counter;
+
+		window.setTimeout(function() {
+			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
+		},0);
+
+	},
+
+	_clear: function(event, noPropagation) {
+
+		this.reverting = false;
+		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
+		// everything else normalized again
+		var delayedTriggers = [], self = this;
+
+		// We first have to update the dom position of the actual currentItem
+		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
+		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
+		this._noFinalSort = null;
+
+		if(this.helper[0] == this.currentItem[0]) {
+			for(var i in this._storedCSS) {
+				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
+			}
+			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
+		} else {
+			this.currentItem.show();
+		}
+
+		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
+		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
+		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
+			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+			for (var i = this.containers.length - 1; i >= 0; i--){
+				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
+				}
+			};
+		};
+
+		//Post events to containers
+		for (var i = this.containers.length - 1; i >= 0; i--){
+			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+			if(this.containers[i].containerCache.over) {
+				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
+				this.containers[i].containerCache.over = 0;
+			}
+		}
+
+		//Do what was originally in plugins
+		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
+		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
+		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
+
+		this.dragging = false;
+		if(this.cancelHelperRemoval) {
+			if(!noPropagation) {
+				this._trigger("beforeStop", event, this._uiHash());
+				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+				this._trigger("stop", event, this._uiHash());
+			}
+			return false;
+		}
+
+		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
+
+		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
+		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
+
+		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
+
+		if(!noPropagation) {
+			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
+			this._trigger("stop", event, this._uiHash());
+		}
+
+		this.fromOutside = false;
+		return true;
+
+	},
+
+	_trigger: function() {
+		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
+			this.cancel();
+		}
+	},
+
+	_uiHash: function(inst) {
+		var self = inst || this;
+		return {
+			helper: self.helper,
+			placeholder: self.placeholder || $([]),
+			position: self.position,
+			originalPosition: self.originalPosition,
+			offset: self.positionAbs,
+			item: self.currentItem,
+			sender: inst ? inst.element : null
+		};
+	}
+
+});
+
+$.extend($.ui.sortable, {
+	version: "1.8.16"
+});
+
+})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.tabs.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.tabs.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.tabs.js	(revision 14585)
@@ -0,0 +1,758 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+	listId = 0;
+
+function getNextTabId() {
+	return ++tabId;
+}
+
+function getNextListId() {
+	return ++listId;
+}
+
+$.widget( "ui.tabs", {
+	options: {
+		add: null,
+		ajaxOptions: null,
+		cache: false,
+		cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
+		collapsible: false,
+		disable: null,
+		disabled: [],
+		enable: null,
+		event: "click",
+		fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 }
+		idPrefix: "ui-tabs-",
+		load: null,
+		panelTemplate: "<div></div>",
+		remove: null,
+		select: null,
+		show: null,
+		spinner: "<em>Loading&#8230;</em>",
+		tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
+	},
+
+	_create: function() {
+		this._tabify( true );
+	},
+
+	_setOption: function( key, value ) {
+		if ( key == "selected" ) {
+			if (this.options.collapsible && value == this.options.selected ) {
+				return;
+			}
+			this.select( value );
+		} else {
+			this.options[ key ] = value;
+			this._tabify();
+		}
+	},
+
+	_tabId: function( a ) {
+		return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) ||
+			this.options.idPrefix + getNextTabId();
+	},
+
+	_sanitizeSelector: function( hash ) {
+		// we need this because an id may contain a ":"
+		return hash.replace( /:/g, "\\:" );
+	},
+
+	_cookie: function() {
+		var cookie = this.cookie ||
+			( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() );
+		return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) );
+	},
+
+	_ui: function( tab, panel ) {
+		return {
+			tab: tab,
+			panel: panel,
+			index: this.anchors.index( tab )
+		};
+	},
+
+	_cleanup: function() {
+		// restore all former loading tabs labels
+		this.lis.filter( ".ui-state-processing" )
+			.removeClass( "ui-state-processing" )
+			.find( "span:data(label.tabs)" )
+				.each(function() {
+					var el = $( this );
+					el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" );
+				});
+	},
+
+	_tabify: function( init ) {
+		var self = this,
+			o = this.options,
+			fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash
+
+		this.list = this.element.find( "ol,ul" ).eq( 0 );
+		this.lis = $( " > li:has(a[href])", this.list );
+		this.anchors = this.lis.map(function() {
+			return $( "a", this )[ 0 ];
+		});
+		this.panels = $( [] );
+
+		this.anchors.each(function( i, a ) {
+			var href = $( a ).attr( "href" );
+			// For dynamically created HTML that contains a hash as href IE < 8 expands
+			// such href to the full page url with hash and then misinterprets tab as ajax.
+			// Same consideration applies for an added tab with a fragment identifier
+			// since a[href=#fragment-identifier] does unexpectedly not match.
+			// Thus normalize href attribute...
+			var hrefBase = href.split( "#" )[ 0 ],
+				baseEl;
+			if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] ||
+					( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) {
+				href = a.hash;
+				a.href = href;
+			}
+
+			// inline tab
+			if ( fragmentId.test( href ) ) {
+				self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) );
+			// remote tab
+			// prevent loading the page itself if href is just "#"
+			} else if ( href && href !== "#" ) {
+				// required for restore on destroy
+				$.data( a, "href.tabs", href );
+
+				// TODO until #3808 is fixed strip fragment identifier from url
+				// (IE fails to load from such url)
+				$.data( a, "load.tabs", href.replace( /#.*$/, "" ) );
+
+				var id = self._tabId( a );
+				a.href = "#" + id;
+				var $panel = self.element.find( "#" + id );
+				if ( !$panel.length ) {
+					$panel = $( o.panelTemplate )
+						.attr( "id", id )
+						.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+						.insertAfter( self.panels[ i - 1 ] || self.list );
+					$panel.data( "destroy.tabs", true );
+				}
+				self.panels = self.panels.add( $panel );
+			// invalid tab href
+			} else {
+				o.disabled.push( i );
+			}
+		});
+
+		// initialization from scratch
+		if ( init ) {
+			// attach necessary classes for styling
+			this.element.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" );
+			this.list.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+			this.lis.addClass( "ui-state-default ui-corner-top" );
+			this.panels.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" );
+
+			// Selected tab
+			// use "selected" option or try to retrieve:
+			// 1. from fragment identifier in url
+			// 2. from cookie
+			// 3. from selected class attribute on <li>
+			if ( o.selected === undefined ) {
+				if ( location.hash ) {
+					this.anchors.each(function( i, a ) {
+						if ( a.hash == location.hash ) {
+							o.selected = i;
+							return false;
+						}
+					});
+				}
+				if ( typeof o.selected !== "number" && o.cookie ) {
+					o.selected = parseInt( self._cookie(), 10 );
+				}
+				if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) {
+					o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+				}
+				o.selected = o.selected || ( this.lis.length ? 0 : -1 );
+			} else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release
+				o.selected = -1;
+			}
+
+			// sanity check - default to first tab...
+			o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 )
+				? o.selected
+				: 0;
+
+			// Take disabling tabs via class attribute from HTML
+			// into account and update option properly.
+			// A selected tab cannot become disabled.
+			o.disabled = $.unique( o.disabled.concat(
+				$.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) {
+					return self.lis.index( n );
+				})
+			) ).sort();
+
+			if ( $.inArray( o.selected, o.disabled ) != -1 ) {
+				o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 );
+			}
+
+			// highlight selected tab
+			this.panels.addClass( "ui-tabs-hide" );
+			this.lis.removeClass( "ui-tabs-selected ui-state-active" );
+			// check for length avoids error when initializing empty list
+			if ( o.selected >= 0 && this.anchors.length ) {
+				self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" );
+				this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" );
+
+				// seems to be expected behavior that the show callback is fired
+				self.element.queue( "tabs", function() {
+					self._trigger( "show", null,
+						self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) );
+				});
+
+				this.load( o.selected );
+			}
+
+			// clean up to avoid memory leaks in certain versions of IE 6
+			// TODO: namespace this event
+			$( window ).bind( "unload", function() {
+				self.lis.add( self.anchors ).unbind( ".tabs" );
+				self.lis = self.anchors = self.panels = null;
+			});
+		// update selected after add/remove
+		} else {
+			o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) );
+		}
+
+		// update collapsible
+		// TODO: use .toggleClass()
+		this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" );
+
+		// set or update cookie after init and add/remove respectively
+		if ( o.cookie ) {
+			this._cookie( o.selected, o.cookie );
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) {
+			$( li )[ $.inArray( i, o.disabled ) != -1 &&
+				// TODO: use .toggleClass()
+				!$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" );
+		}
+
+		// reset cache if switching from cached to not cached
+		if ( o.cache === false ) {
+			this.anchors.removeData( "cache.tabs" );
+		}
+
+		// remove all handlers before, tabify may run on existing tabs after add or option change
+		this.lis.add( this.anchors ).unbind( ".tabs" );
+
+		if ( o.event !== "mouseover" ) {
+			var addState = function( state, el ) {
+				if ( el.is( ":not(.ui-state-disabled)" ) ) {
+					el.addClass( "ui-state-" + state );
+				}
+			};
+			var removeState = function( state, el ) {
+				el.removeClass( "ui-state-" + state );
+			};
+			this.lis.bind( "mouseover.tabs" , function() {
+				addState( "hover", $( this ) );
+			});
+			this.lis.bind( "mouseout.tabs", function() {
+				removeState( "hover", $( this ) );
+			});
+			this.anchors.bind( "focus.tabs", function() {
+				addState( "focus", $( this ).closest( "li" ) );
+			});
+			this.anchors.bind( "blur.tabs", function() {
+				removeState( "focus", $( this ).closest( "li" ) );
+			});
+		}
+
+		// set up animations
+		var hideFx, showFx;
+		if ( o.fx ) {
+			if ( $.isArray( o.fx ) ) {
+				hideFx = o.fx[ 0 ];
+				showFx = o.fx[ 1 ];
+			} else {
+				hideFx = showFx = o.fx;
+			}
+		}
+
+		// Reset certain styles left over from animation
+		// and prevent IE's ClearType bug...
+		function resetStyle( $el, fx ) {
+			$el.css( "display", "" );
+			if ( !$.support.opacity && fx.opacity ) {
+				$el[ 0 ].style.removeAttribute( "filter" );
+			}
+		}
+
+		// Show a tab...
+		var showTab = showFx
+			? function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way
+					.animate( showFx, showFx.duration || "normal", function() {
+						resetStyle( $show, showFx );
+						self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+					});
+			}
+			: function( clicked, $show ) {
+				$( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" );
+				$show.removeClass( "ui-tabs-hide" );
+				self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) );
+			};
+
+		// Hide a tab, $show is optional...
+		var hideTab = hideFx
+			? function( clicked, $hide ) {
+				$hide.animate( hideFx, hideFx.duration || "normal", function() {
+					self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+					$hide.addClass( "ui-tabs-hide" );
+					resetStyle( $hide, hideFx );
+					self.element.dequeue( "tabs" );
+				});
+			}
+			: function( clicked, $hide, $show ) {
+				self.lis.removeClass( "ui-tabs-selected ui-state-active" );
+				$hide.addClass( "ui-tabs-hide" );
+				self.element.dequeue( "tabs" );
+			};
+
+		// attach tab event handler, unbind to avoid duplicates from former tabifying...
+		this.anchors.bind( o.event + ".tabs", function() {
+			var el = this,
+				$li = $(el).closest( "li" ),
+				$hide = self.panels.filter( ":not(.ui-tabs-hide)" ),
+				$show = self.element.find( self._sanitizeSelector( el.hash ) );
+
+			// If tab is already selected and not collapsible or tab disabled or
+			// or is already loading or click callback returns false stop here.
+			// Check if click handler returns false last so that it is not executed
+			// for a disabled or loading tab!
+			if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) ||
+				$li.hasClass( "ui-state-disabled" ) ||
+				$li.hasClass( "ui-state-processing" ) ||
+				self.panels.filter( ":animated" ).length ||
+				self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) {
+				this.blur();
+				return false;
+			}
+
+			o.selected = self.anchors.index( this );
+
+			self.abort();
+
+			// if tab may be closed
+			if ( o.collapsible ) {
+				if ( $li.hasClass( "ui-tabs-selected" ) ) {
+					o.selected = -1;
+
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					}).dequeue( "tabs" );
+
+					this.blur();
+					return false;
+				} else if ( !$hide.length ) {
+					if ( o.cookie ) {
+						self._cookie( o.selected, o.cookie );
+					}
+
+					self.element.queue( "tabs", function() {
+						showTab( el, $show );
+					});
+
+					// TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171
+					self.load( self.anchors.index( this ) );
+
+					this.blur();
+					return false;
+				}
+			}
+
+			if ( o.cookie ) {
+				self._cookie( o.selected, o.cookie );
+			}
+
+			// show new tab
+			if ( $show.length ) {
+				if ( $hide.length ) {
+					self.element.queue( "tabs", function() {
+						hideTab( el, $hide );
+					});
+				}
+				self.element.queue( "tabs", function() {
+					showTab( el, $show );
+				});
+
+				self.load( self.anchors.index( this ) );
+			} else {
+				throw "jQuery UI Tabs: Mismatching fragment identifier.";
+			}
+
+			// Prevent IE from keeping other link focussed when using the back button
+			// and remove dotted border from clicked link. This is controlled via CSS
+			// in modern browsers; blur() removes focus from address bar in Firefox
+			// which can become a usability and annoying problem with tabs('rotate').
+			if ( $.browser.msie ) {
+				this.blur();
+			}
+		});
+
+		// disable click in any case
+		this.anchors.bind( "click.tabs", function(){
+			return false;
+		});
+	},
+
+    _getIndex: function( index ) {
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		// also sanitizes numerical indexes to valid values.
+		if ( typeof index == "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) );
+		}
+
+		return index;
+	},
+
+	destroy: function() {
+		var o = this.options;
+
+		this.abort();
+
+		this.element
+			.unbind( ".tabs" )
+			.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" )
+			.removeData( "tabs" );
+
+		this.list.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" );
+
+		this.anchors.each(function() {
+			var href = $.data( this, "href.tabs" );
+			if ( href ) {
+				this.href = href;
+			}
+			var $this = $( this ).unbind( ".tabs" );
+			$.each( [ "href", "load", "cache" ], function( i, prefix ) {
+				$this.removeData( prefix + ".tabs" );
+			});
+		});
+
+		this.lis.unbind( ".tabs" ).add( this.panels ).each(function() {
+			if ( $.data( this, "destroy.tabs" ) ) {
+				$( this ).remove();
+			} else {
+				$( this ).removeClass([
+					"ui-state-default",
+					"ui-corner-top",
+					"ui-tabs-selected",
+					"ui-state-active",
+					"ui-state-hover",
+					"ui-state-focus",
+					"ui-state-disabled",
+					"ui-tabs-panel",
+					"ui-widget-content",
+					"ui-corner-bottom",
+					"ui-tabs-hide"
+				].join( " " ) );
+			}
+		});
+
+		if ( o.cookie ) {
+			this._cookie( null, o.cookie );
+		}
+
+		return this;
+	},
+
+	add: function( url, label, index ) {
+		if ( index === undefined ) {
+			index = this.anchors.length;
+		}
+
+		var self = this,
+			o = this.options,
+			$li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ),
+			id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] );
+
+		$li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true );
+
+		// try to find an existing element before creating a new one
+		var $panel = self.element.find( "#" + id );
+		if ( !$panel.length ) {
+			$panel = $( o.panelTemplate )
+				.attr( "id", id )
+				.data( "destroy.tabs", true );
+		}
+		$panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" );
+
+		if ( index >= this.lis.length ) {
+			$li.appendTo( this.list );
+			$panel.appendTo( this.list[ 0 ].parentNode );
+		} else {
+			$li.insertBefore( this.lis[ index ] );
+			$panel.insertBefore( this.panels[ index ] );
+		}
+
+		o.disabled = $.map( o.disabled, function( n, i ) {
+			return n >= index ? ++n : n;
+		});
+
+		this._tabify();
+
+		if ( this.anchors.length == 1 ) {
+			o.selected = 0;
+			$li.addClass( "ui-tabs-selected ui-state-active" );
+			$panel.removeClass( "ui-tabs-hide" );
+			this.element.queue( "tabs", function() {
+				self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) );
+			});
+
+			this.load( 0 );
+		}
+
+		this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	remove: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options,
+			$li = this.lis.eq( index ).remove(),
+			$panel = this.panels.eq( index ).remove();
+
+		// If selected tab was removed focus tab to the right or
+		// in case the last tab was removed the tab to the left.
+		if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) {
+			this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
+		}
+
+		o.disabled = $.map(
+			$.grep( o.disabled, function(n, i) {
+				return n != index;
+			}),
+			function( n, i ) {
+				return n >= index ? --n : n;
+			});
+
+		this._tabify();
+
+		this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) );
+		return this;
+	},
+
+	enable: function( index ) {
+		index = this._getIndex( index );
+		var o = this.options;
+		if ( $.inArray( index, o.disabled ) == -1 ) {
+			return;
+		}
+
+		this.lis.eq( index ).removeClass( "ui-state-disabled" );
+		o.disabled = $.grep( o.disabled, function( n, i ) {
+			return n != index;
+		});
+
+		this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		return this;
+	},
+
+	disable: function( index ) {
+		index = this._getIndex( index );
+		var self = this, o = this.options;
+		// cannot disable already selected tab
+		if ( index != o.selected ) {
+			this.lis.eq( index ).addClass( "ui-state-disabled" );
+
+			o.disabled.push( index );
+			o.disabled.sort();
+
+			this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
+		}
+
+		return this;
+	},
+
+	select: function( index ) {
+		index = this._getIndex( index );
+		if ( index == -1 ) {
+			if ( this.options.collapsible && this.options.selected != -1 ) {
+				index = this.options.selected;
+			} else {
+				return this;
+			}
+		}
+		this.anchors.eq( index ).trigger( this.options.event + ".tabs" );
+		return this;
+	},
+
+	load: function( index ) {
+		index = this._getIndex( index );
+		var self = this,
+			o = this.options,
+			a = this.anchors.eq( index )[ 0 ],
+			url = $.data( a, "load.tabs" );
+
+		this.abort();
+
+		// not remote or from cache
+		if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) {
+			this.element.dequeue( "tabs" );
+			return;
+		}
+
+		// load remote from here on
+		this.lis.eq( index ).addClass( "ui-state-processing" );
+
+		if ( o.spinner ) {
+			var span = $( "span", a );
+			span.data( "label.tabs", span.html() ).html( o.spinner );
+		}
+
+		this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, {
+			url: url,
+			success: function( r, s ) {
+				self.element.find( self._sanitizeSelector( a.hash ) ).html( r );
+
+				// take care of tab labels
+				self._cleanup();
+
+				if ( o.cache ) {
+					$.data( a, "cache.tabs", true );
+				}
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					o.ajaxOptions.success( r, s );
+				}
+				catch ( e ) {}
+			},
+			error: function( xhr, s, e ) {
+				// take care of tab labels
+				self._cleanup();
+
+				self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) );
+				try {
+					// Passing index avoid a race condition when this method is
+					// called after the user has selected another tab.
+					// Pass the anchor that initiated this request allows
+					// loadError to manipulate the tab content panel via $(a.hash)
+					o.ajaxOptions.error( xhr, s, index, a );
+				}
+				catch ( e ) {}
+			}
+		} ) );
+
+		// last, so that load event is fired before show...
+		self.element.dequeue( "tabs" );
+
+		return this;
+	},
+
+	abort: function() {
+		// stop possibly running animations
+		this.element.queue( [] );
+		this.panels.stop( false, true );
+
+		// "tabs" queue must not contain more than two elements,
+		// which are the callbacks for the latest clicked tab...
+		this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) );
+
+		// terminate pending requests from other tabs
+		if ( this.xhr ) {
+			this.xhr.abort();
+			delete this.xhr;
+		}
+
+		// take care of tab labels
+		this._cleanup();
+		return this;
+	},
+
+	url: function( index, url ) {
+		this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url );
+		return this;
+	},
+
+	length: function() {
+		return this.anchors.length;
+	}
+});
+
+$.extend( $.ui.tabs, {
+	version: "1.8.16"
+});
+
+/*
+ * Tabs Extensions
+ */
+
+/*
+ * Rotate
+ */
+$.extend( $.ui.tabs.prototype, {
+	rotation: null,
+	rotate: function( ms, continuing ) {
+		var self = this,
+			o = this.options;
+
+		var rotate = self._rotate || ( self._rotate = function( e ) {
+			clearTimeout( self.rotation );
+			self.rotation = setTimeout(function() {
+				var t = o.selected;
+				self.select( ++t < self.anchors.length ? t : 0 );
+			}, ms );
+			
+			if ( e ) {
+				e.stopPropagation();
+			}
+		});
+
+		var stop = self._unrotate || ( self._unrotate = !continuing
+			? function(e) {
+				if (e.clientX) { // in case of a true click
+					self.rotate(null);
+				}
+			}
+			: function( e ) {
+				t = o.selected;
+				rotate();
+			});
+
+		// start rotation
+		if ( ms ) {
+			this.element.bind( "tabsshow", rotate );
+			this.anchors.bind( o.event + ".tabs", stop );
+			rotate();
+		// stop rotation
+		} else {
+			clearTimeout( self.rotation );
+			this.element.unbind( "tabsshow", rotate );
+			this.anchors.unbind( o.event + ".tabs", stop );
+			delete this._rotate;
+			delete this._unrotate;
+		}
+
+		return this;
+	}
+});
+
+})( jQuery );
Index: tags/2.4.0RC3/themes/default/js/ui/jquery.ui.widget.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/jquery.ui.widget.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/jquery.ui.widget.js	(revision 14585)
@@ -0,0 +1,268 @@
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function( $, undefined ) {
+
+// jQuery 1.4+
+if ( $.cleanData ) {
+	var _cleanData = $.cleanData;
+	$.cleanData = function( elems ) {
+		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+			try {
+				$( elem ).triggerHandler( "remove" );
+			// http://bugs.jquery.com/ticket/8235
+			} catch( e ) {}
+		}
+		_cleanData( elems );
+	};
+} else {
+	var _remove = $.fn.remove;
+	$.fn.remove = function( selector, keepData ) {
+		return this.each(function() {
+			if ( !keepData ) {
+				if ( !selector || $.filter( selector, [ this ] ).length ) {
+					$( "*", this ).add( [ this ] ).each(function() {
+						try {
+							$( this ).triggerHandler( "remove" );
+						// http://bugs.jquery.com/ticket/8235
+						} catch( e ) {}
+					});
+				}
+			}
+			return _remove.call( $(this), selector, keepData );
+		});
+	};
+}
+
+$.widget = function( name, base, prototype ) {
+	var namespace = name.split( "." )[ 0 ],
+		fullName;
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName ] = function( elem ) {
+		return !!$.data( elem, name );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	$[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without initializing for simple inheritance
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+
+	var basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+//	$.each( basePrototype, function( key, val ) {
+//		if ( $.isPlainObject(val) ) {
+//			basePrototype[ key ] = $.extend( {}, val );
+//		}
+//	});
+	basePrototype.options = $.extend( true, {}, basePrototype.options );
+	$[ namespace ][ name ].prototype = $.extend( true, basePrototype, {
+		namespace: namespace,
+		widgetName: name,
+		widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name,
+		widgetBaseClass: fullName
+	}, prototype );
+
+	$.widget.bridge( name, $[ namespace ][ name ] );
+};
+
+$.widget.bridge = function( name, object ) {
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = Array.prototype.slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.extend.apply( null, [ true, options ].concat(args) ) :
+			options;
+
+		// prevent calls to internal methods
+		if ( isMethodCall && options.charAt( 0 ) === "_" ) {
+			return returnValue;
+		}
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var instance = $.data( this, name ),
+					methodValue = instance && $.isFunction( instance[options] ) ?
+						instance[ options ].apply( instance, args ) :
+						instance;
+				// TODO: add this back in 1.9 and use $.error() (see #5972)
+//				if ( !instance ) {
+//					throw "cannot call methods on " + name + " prior to initialization; " +
+//						"attempted to call method '" + options + "'";
+//				}
+//				if ( !$.isFunction( instance[options] ) ) {
+//					throw "no such method '" + options + "' for " + name + " widget instance";
+//				}
+//				var methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, name );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, name, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( options, element ) {
+	// allow instantiation without initializing for simple inheritance
+	if ( arguments.length ) {
+		this._createWidget( options, element );
+	}
+};
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	options: {
+		disabled: false
+	},
+	_createWidget: function( options, element ) {
+		// $.widget.bridge stores the plugin instance, but we do it anyway
+		// so that it's stored even before the _create function runs
+		$.data( element, this.widgetName, this );
+		this.element = $( element );
+		this.options = $.extend( true, {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		var self = this;
+		this.element.bind( "remove." + this.widgetName, function() {
+			self.destroy();
+		});
+
+		this._create();
+		this._trigger( "create" );
+		this._init();
+	},
+	_getCreateOptions: function() {
+		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
+	},
+	_create: function() {},
+	_init: function() {},
+
+	destroy: function() {
+		this.element
+			.unbind( "." + this.widgetName )
+			.removeData( this.widgetName );
+		this.widget()
+			.unbind( "." + this.widgetName )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetBaseClass + "-disabled " +
+				"ui-state-disabled" );
+	},
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.extend( {}, this.options );
+		}
+
+		if  (typeof key === "string" ) {
+			if ( value === undefined ) {
+				return this.options[ key ];
+			}
+			options = {};
+			options[ key ] = value;
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var self = this;
+		$.each( options, function( key, value ) {
+			self._setOption( key, value );
+		});
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				[ value ? "addClass" : "removeClass"](
+					this.widgetBaseClass + "-disabled" + " " +
+					"ui-state-disabled" )
+				.attr( "aria-disabled", value );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOption( "disabled", false );
+	},
+	disable: function() {
+		return this._setOption( "disabled", true );
+	},
+
+	_trigger: function( type, event, data ) {
+		var callback = this.options[ type ];
+
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		data = data || {};
+
+		// copy original event properties over to the new event
+		// this would happen if we could call $.event.fix instead of $.Event
+		// but we don't have a way to force an event to be fixed multiple times
+		if ( event.originalEvent ) {
+			for ( var i = $.event.props.length, prop; i; ) {
+				prop = $.event.props[ --i ];
+				event[ prop ] = event.originalEvent[ prop ];
+			}
+		}
+
+		this.element.trigger( event, data );
+
+		return !( $.isFunction(callback) &&
+			callback.call( this.element[0], event, data ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+})( jQuery );
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.blind.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.blind.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.blind.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Blind 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Blind
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a,
+g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.bounce.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.bounce.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.bounce.min.js	(revision 14585)
@@ -0,0 +1,15 @@
+/*
+ * jQuery UI Effects Bounce 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Bounce
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/
+3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g<m;g++){var j={},k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing);c=h=="hide"?c*2:c/2}if(h=="hide"){g={opacity:0};g[f]=(d=="pos"?"-=":"+=")+c;a.animate(g,i/2,b.options.easing,function(){a.hide();e.effects.restore(a,l);e.effects.removeWrapper(a);
+b.callback&&b.callback.apply(this,arguments)})}else{j={};k={};j[f]=(d=="pos"?"-=":"+=")+c;k[f]=(d=="pos"?"+=":"-=")+c;a.animate(j,i/2,b.options.easing).animate(k,i/2,b.options.easing,function(){e.effects.restore(a,l);e.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments)})}a.queue("fx",function(){a.dequeue()});a.dequeue()})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.clip.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.clip.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.clip.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Clip 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Clip
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.clip=function(e){return this.queue(function(){var a=b(this),i=["position","top","bottom","left","right","height","width"],f=b.effects.setMode(a,e.options.mode||"hide"),c=e.options.direction||"vertical";b.effects.save(a,i);a.show();var d=b.effects.createWrapper(a).css({overflow:"hidden"});d=a[0].tagName=="IMG"?d:a;var g={size:c=="vertical"?"height":"width",position:c=="vertical"?"top":"left"};c=c=="vertical"?d.height():d.width();if(f=="show"){d.css(g.size,0);d.css(g.position,
+c/2)}var h={};h[g.size]=f=="show"?c:0;h[g.position]=f=="show"?0:c/2;d.animate(h,{queue:false,duration:e.duration,easing:e.options.easing,complete:function(){f=="hide"&&a.hide();b.effects.restore(a,i);b.effects.removeWrapper(a);e.callback&&e.callback.apply(a[0],arguments);a.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.core.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.core.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.core.min.js	(revision 14585)
@@ -0,0 +1,31 @@
+/*
+ * jQuery UI Effects 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/
+ */
+jQuery.effects||function(f,j){function m(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c))return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)];if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c))return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55];if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c))return[parseInt(a[1],
+16),parseInt(a[2],16),parseInt(a[3],16)];if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c))return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)];if(/rgba\(0, 0, 0, 0\)/.exec(c))return n.transparent;return n[f.trim(c).toLowerCase()]}function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.nodeName(c,"body"))break;a="backgroundColor"}while(c=c.parentNode);return m(b)}function o(){var c=document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle,
+a={},b,d;if(c&&c.length&&c[0]&&c[c[0]])for(var e=c.length;e--;){b=c[e];if(typeof c[b]=="string"){d=b.replace(/\-(\w)/g,function(g,h){return h.toUpperCase()});a[d]=c[b]}}else for(b in c)if(typeof c[b]==="string")a[b]=c[b];return a}function p(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}function k(c,a,b,d){if(typeof c=="object"){d=
+a;b=null;a=c;c=a.effect}if(f.isFunction(a)){d=a;b=null;a={}}if(typeof a=="number"||f.fx.speeds[a]){d=b;b=a;a={}}if(f.isFunction(b)){d=b;b=null}a=a||{};b=b||a.duration;b=f.fx.off?0:typeof b=="number"?b:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function l(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor",
+"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=m(b.end);b.colorInit=true}b.elem.style[a]="rgb("+Math.max(Math.min(parseInt(b.pos*(b.end[0]-b.start[0])+b.start[0],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[1]-b.start[1])+b.start[1],10),255),0)+","+Math.max(Math.min(parseInt(b.pos*(b.end[2]-b.start[2])+b.start[2],10),255),0)+")"}});var n={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,
+0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,
+211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]},q=["add","remove","toggle"],t={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};f.effects.animateClass=function(c,a,b,
+d){if(f.isFunction(b)){d=b;b=null}return this.queue(function(){var e=f(this),g=e.attr("style")||" ",h=p(o.call(this)),r,v=e.attr("class");f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});r=p(o.call(this));e.attr("class",v);e.animate(u(h,r),{queue:false,duration:a,easing:b,complete:function(){f.each(q,function(w,i){c[i]&&e[i+"Class"](c[i])});if(typeof e.attr("style")=="object"){e.attr("style").cssText="";e.attr("style").cssText=g}else e.attr("style",g);d&&d.apply(this,arguments);f.dequeue(this)}})})};
+f.fn.extend({_addClass:f.fn.addClass,addClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{add:c},a,b,d]):this._addClass(c)},_removeClass:f.fn.removeClass,removeClass:function(c,a,b,d){return a?f.effects.animateClass.apply(this,[{remove:c},a,b,d]):this._removeClass(c)},_toggleClass:f.fn.toggleClass,toggleClass:function(c,a,b,d,e){return typeof a=="boolean"||a===j?b?f.effects.animateClass.apply(this,[a?{add:c}:{remove:c},b,d,e]):this._toggleClass(c,a):f.effects.animateClass.apply(this,
+[{toggle:c},a,b,d])},switchClass:function(c,a,b,d,e){return f.effects.animateClass.apply(this,[{add:a,remove:c},b,d,e])}});f.extend(f.effects,{version:"1.8.16",save:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.data("ec.storage."+a[b],c[0].style[a[b]])},restore:function(c,a){for(var b=0;b<a.length;b++)a[b]!==null&&c.css(a[b],c.data("ec.storage."+a[b]))},setMode:function(c,a){if(a=="toggle")a=c.is(":hidden")?"show":"hide";return a},getBaseline:function(c,a){var b;switch(c[0]){case "top":b=
+0;break;case "middle":b=0.5;break;case "bottom":b=1;break;default:b=c[0]/a.height}switch(c[1]){case "left":c=0;break;case "center":c=0.5;break;case "right":c=1;break;default:c=c[1]/a.width}return{x:c,y:b}},createWrapper:function(c){if(c.parent().is(".ui-effects-wrapper"))return c.parent();var a={width:c.outerWidth(true),height:c.outerHeight(true),"float":c.css("float")},b=f("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),
+d=document.activeElement;c.wrap(b);if(c[0]===d||f.contains(c[0],d))f(d).focus();b=c.parent();if(c.css("position")=="static"){b.css({position:"relative"});c.css({position:"relative"})}else{f.extend(a,{position:c.css("position"),zIndex:c.css("z-index")});f.each(["top","left","bottom","right"],function(e,g){a[g]=c.css(g);if(isNaN(parseInt(a[g],10)))a[g]="auto"});c.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})}return b.css(a).show()},removeWrapper:function(c){var a,b=document.activeElement;
+if(c.parent().is(".ui-effects-wrapper")){a=c.parent().replaceWith(c);if(c[0]===b||f.contains(c[0],b))f(b).focus();return a}return c},setTransition:function(c,a,b,d){d=d||{};f.each(a,function(e,g){unit=c.cssUnit(g);if(unit[0]>0)d[g]=unit[0]*b+unit[1]});return d}});f.fn.extend({effect:function(c){var a=k.apply(this,arguments),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});
+return d.call(this,b)},_show:f.fn.show,show:function(c){if(l(c))return this._show.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="show";return this.effect.apply(this,a)}},_hide:f.fn.hide,hide:function(c){if(l(c))return this._hide.apply(this,arguments);else{var a=k.apply(this,arguments);a[1].mode="hide";return this.effect.apply(this,a)}},__toggle:f.fn.toggle,toggle:function(c){if(l(c)||typeof c==="boolean"||f.isFunction(c))return this.__toggle.apply(this,arguments);else{var a=k.apply(this,
+arguments);a[1].mode="toggle";return this.effect.apply(this,a)}},cssUnit:function(c){var a=this.css(c),b=[];f.each(["em","px","%","pt"],function(d,e){if(a.indexOf(e)>0)b=[parseFloat(a),e]});return b}});f.easing.jswing=f.easing.swing;f.extend(f.easing,{def:"easeOutQuad",swing:function(c,a,b,d,e){return f.easing[f.easing.def](c,a,b,d,e)},easeInQuad:function(c,a,b,d,e){return d*(a/=e)*a+b},easeOutQuad:function(c,a,b,d,e){return-d*(a/=e)*(a-2)+b},easeInOutQuad:function(c,a,b,d,e){if((a/=e/2)<1)return d/
+2*a*a+b;return-d/2*(--a*(a-2)-1)+b},easeInCubic:function(c,a,b,d,e){return d*(a/=e)*a*a+b},easeOutCubic:function(c,a,b,d,e){return d*((a=a/e-1)*a*a+1)+b},easeInOutCubic:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a+b;return d/2*((a-=2)*a*a+2)+b},easeInQuart:function(c,a,b,d,e){return d*(a/=e)*a*a*a+b},easeOutQuart:function(c,a,b,d,e){return-d*((a=a/e-1)*a*a*a-1)+b},easeInOutQuart:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a+b;return-d/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(c,a,b,
+d,e){return d*(a/=e)*a*a*a*a+b},easeOutQuint:function(c,a,b,d,e){return d*((a=a/e-1)*a*a*a*a+1)+b},easeInOutQuint:function(c,a,b,d,e){if((a/=e/2)<1)return d/2*a*a*a*a*a+b;return d/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(c,a,b,d,e){return-d*Math.cos(a/e*(Math.PI/2))+d+b},easeOutSine:function(c,a,b,d,e){return d*Math.sin(a/e*(Math.PI/2))+b},easeInOutSine:function(c,a,b,d,e){return-d/2*(Math.cos(Math.PI*a/e)-1)+b},easeInExpo:function(c,a,b,d,e){return a==0?b:d*Math.pow(2,10*(a/e-1))+b},easeOutExpo:function(c,
+a,b,d,e){return a==e?b+d:d*(-Math.pow(2,-10*a/e)+1)+b},easeInOutExpo:function(c,a,b,d,e){if(a==0)return b;if(a==e)return b+d;if((a/=e/2)<1)return d/2*Math.pow(2,10*(a-1))+b;return d/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(c,a,b,d,e){return-d*(Math.sqrt(1-(a/=e)*a)-1)+b},easeOutCirc:function(c,a,b,d,e){return d*Math.sqrt(1-(a=a/e-1)*a)+b},easeInOutCirc:function(c,a,b,d,e){if((a/=e/2)<1)return-d/2*(Math.sqrt(1-a*a)-1)+b;return d/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(c,a,b,
+d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return-(h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g))+b},easeOutElastic:function(c,a,b,d,e){c=1.70158;var g=0,h=d;if(a==0)return b;if((a/=e)==1)return b+d;g||(g=e*0.3);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);return h*Math.pow(2,-10*a)*Math.sin((a*e-c)*2*Math.PI/g)+d+b},easeInOutElastic:function(c,a,b,d,e){c=1.70158;var g=
+0,h=d;if(a==0)return b;if((a/=e/2)==2)return b+d;g||(g=e*0.3*1.5);if(h<Math.abs(d)){h=d;c=g/4}else c=g/(2*Math.PI)*Math.asin(d/h);if(a<1)return-0.5*h*Math.pow(2,10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)+b;return h*Math.pow(2,-10*(a-=1))*Math.sin((a*e-c)*2*Math.PI/g)*0.5+d+b},easeInBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*(a/=e)*a*((g+1)*a-g)+b},easeOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;return d*((a=a/e-1)*a*((g+1)*a+g)+1)+b},easeInOutBack:function(c,a,b,d,e,g){if(g==j)g=1.70158;
+if((a/=e/2)<1)return d/2*a*a*(((g*=1.525)+1)*a-g)+b;return d/2*((a-=2)*a*(((g*=1.525)+1)*a+g)+2)+b},easeInBounce:function(c,a,b,d,e){return d-f.easing.easeOutBounce(c,e-a,0,d,e)+b},easeOutBounce:function(c,a,b,d,e){return(a/=e)<1/2.75?d*7.5625*a*a+b:a<2/2.75?d*(7.5625*(a-=1.5/2.75)*a+0.75)+b:a<2.5/2.75?d*(7.5625*(a-=2.25/2.75)*a+0.9375)+b:d*(7.5625*(a-=2.625/2.75)*a+0.984375)+b},easeInOutBounce:function(c,a,b,d,e){if(a<e/2)return f.easing.easeInBounce(c,a*2,0,d,e)*0.5+b;return f.easing.easeOutBounce(c,
+a*2-e,0,d,e)*0.5+d*0.5+b}})}(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.drop.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.drop.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.drop.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Drop 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Drop
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.drop=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right","opacity"],e=c.effects.setMode(a,d.options.mode||"hide"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a);var f=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var g=d.options.distance||(f=="top"?a.outerHeight({margin:true})/2:a.outerWidth({margin:true})/2);if(e=="show")a.css("opacity",0).css(f,b=="pos"?-g:g);var i={opacity:e==
+"show"?1:0};i[f]=(e=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+g;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){e=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.explode.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.explode.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.explode.min.js	(revision 14585)
@@ -0,0 +1,15 @@
+/*
+ * jQuery UI Effects Explode 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Explode
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(j){j.effects.explode=function(a){return this.queue(function(){var c=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3,d=a.options.pieces?Math.round(Math.sqrt(a.options.pieces)):3;a.options.mode=a.options.mode=="toggle"?j(this).is(":visible")?"hide":"show":a.options.mode;var b=j(this).show().css("visibility","hidden"),g=b.offset();g.top-=parseInt(b.css("marginTop"),10)||0;g.left-=parseInt(b.css("marginLeft"),10)||0;for(var h=b.outerWidth(true),i=b.outerHeight(true),e=0;e<c;e++)for(var f=
+0;f<d;f++)b.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-f*(h/d),top:-e*(i/c)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:h/d,height:i/c,left:g.left+f*(h/d)+(a.options.mode=="show"?(f-Math.floor(d/2))*(h/d):0),top:g.top+e*(i/c)+(a.options.mode=="show"?(e-Math.floor(c/2))*(i/c):0),opacity:a.options.mode=="show"?0:1}).animate({left:g.left+f*(h/d)+(a.options.mode=="show"?0:(f-Math.floor(d/2))*(h/d)),top:g.top+
+e*(i/c)+(a.options.mode=="show"?0:(e-Math.floor(c/2))*(i/c)),opacity:a.options.mode=="show"?1:0},a.duration||500);setTimeout(function(){a.options.mode=="show"?b.css({visibility:"visible"}):b.css({visibility:"visible"}).hide();a.callback&&a.callback.apply(b[0]);b.dequeue();j("div.ui-effects-explode").remove()},a.duration||500)})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fade.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fade.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fade.min.js	(revision 14585)
@@ -0,0 +1,13 @@
+/*
+ * jQuery UI Effects Fade 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fade
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fold.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fold.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.fold.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Fold 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Fold
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.fold=function(a){return this.queue(function(){var b=c(this),j=["position","top","bottom","left","right"],d=c.effects.setMode(b,a.options.mode||"hide"),g=a.options.size||15,h=!!a.options.horizFirst,k=a.duration?a.duration/2:c.fx.speeds._default/2;c.effects.save(b,j);b.show();var e=c.effects.createWrapper(b).css({overflow:"hidden"}),f=d=="show"!=h,l=f?["width","height"]:["height","width"];f=f?[e.width(),e.height()]:[e.height(),e.width()];var i=/([0-9]+)%/.exec(g);if(i)g=parseInt(i[1],
+10)/100*f[d=="hide"?0:1];if(d=="show")e.css(h?{height:0,width:g}:{height:g,width:0});h={};i={};h[l[0]]=d=="show"?f[0]:g;i[l[1]]=d=="show"?f[1]:0;e.animate(h,k,a.options.easing).animate(i,k,a.options.easing,function(){d=="hide"&&b.hide();c.effects.restore(b,j);c.effects.removeWrapper(b);a.callback&&a.callback.apply(b[0],arguments);b.dequeue()})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.highlight.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.highlight.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.highlight.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Highlight 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Highlight
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(b){b.effects.highlight=function(c){return this.queue(function(){var a=b(this),e=["backgroundImage","backgroundColor","opacity"],d=b.effects.setMode(a,c.options.mode||"show"),f={backgroundColor:a.css("backgroundColor")};if(d=="hide")f.opacity=0;b.effects.save(a,e);a.show().css({backgroundImage:"none",backgroundColor:c.options.color||"#ffff99"}).animate(f,{queue:false,duration:c.duration,easing:c.options.easing,complete:function(){d=="hide"&&a.hide();b.effects.restore(a,e);d=="show"&&!b.support.opacity&&
+this.style.removeAttribute("filter");c.callback&&c.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.pulsate.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.pulsate.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.pulsate.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Pulsate 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Pulsate
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.pulsate=function(a){return this.queue(function(){var b=d(this),c=d.effects.setMode(b,a.options.mode||"show");times=(a.options.times||5)*2-1;duration=a.duration?a.duration/2:d.fx.speeds._default/2;isVisible=b.is(":visible");animateTo=0;if(!isVisible){b.css("opacity",0).show();animateTo=1}if(c=="hide"&&isVisible||c=="show"&&!isVisible)times--;for(c=0;c<times;c++){b.animate({opacity:animateTo},duration,a.options.easing);animateTo=(animateTo+1)%2}b.animate({opacity:animateTo},duration,
+a.options.easing,function(){animateTo==0&&b.hide();a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()}).dequeue()})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.scale.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.scale.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.scale.min.js	(revision 14585)
@@ -0,0 +1,20 @@
+/*
+ * jQuery UI Effects Scale 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Scale
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.puff=function(b){return this.queue(function(){var a=c(this),e=c.effects.setMode(a,b.options.mode||"hide"),g=parseInt(b.options.percent,10)||150,h=g/100,i={height:a.height(),width:a.width()};c.extend(b.options,{fade:true,mode:e,percent:e=="hide"?g:100,from:e=="hide"?i:{height:i.height*h,width:i.width*h}});a.effect("scale",b.options,b.duration,b.callback);a.dequeue()})};c.effects.scale=function(b){return this.queue(function(){var a=c(this),e=c.extend(true,{},b.options),g=c.effects.setMode(a,
+b.options.mode||"effect"),h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:g=="hide"?0:100),i=b.options.direction||"both",f=b.options.origin;if(g!="effect"){e.origin=f||["middle","center"];e.restore=true}f={height:a.height(),width:a.width()};a.from=b.options.from||(g=="show"?{height:0,width:0}:f);h={y:i!="horizontal"?h/100:1,x:i!="vertical"?h/100:1};a.to={height:f.height*h.y,width:f.width*h.x};if(b.options.fade){if(g=="show"){a.from.opacity=0;a.to.opacity=1}if(g=="hide"){a.from.opacity=
+1;a.to.opacity=0}}e.from=a.from;e.to=a.to;e.mode=g;a.effect("size",e,b.duration,b.callback);a.dequeue()})};c.effects.size=function(b){return this.queue(function(){var a=c(this),e=["position","top","bottom","left","right","width","height","overflow","opacity"],g=["position","top","bottom","left","right","overflow","opacity"],h=["width","height","overflow"],i=["fontSize"],f=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],k=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],
+p=c.effects.setMode(a,b.options.mode||"effect"),n=b.options.restore||false,m=b.options.scale||"both",l=b.options.origin,j={height:a.height(),width:a.width()};a.from=b.options.from||j;a.to=b.options.to||j;if(l){l=c.effects.getBaseline(l,j);a.from.top=(j.height-a.from.height)*l.y;a.from.left=(j.width-a.from.width)*l.x;a.to.top=(j.height-a.to.height)*l.y;a.to.left=(j.width-a.to.width)*l.x}var d={from:{y:a.from.height/j.height,x:a.from.width/j.width},to:{y:a.to.height/j.height,x:a.to.width/j.width}};
+if(m=="box"||m=="both"){if(d.from.y!=d.to.y){e=e.concat(f);a.from=c.effects.setTransition(a,f,d.from.y,a.from);a.to=c.effects.setTransition(a,f,d.to.y,a.to)}if(d.from.x!=d.to.x){e=e.concat(k);a.from=c.effects.setTransition(a,k,d.from.x,a.from);a.to=c.effects.setTransition(a,k,d.to.x,a.to)}}if(m=="content"||m=="both")if(d.from.y!=d.to.y){e=e.concat(i);a.from=c.effects.setTransition(a,i,d.from.y,a.from);a.to=c.effects.setTransition(a,i,d.to.y,a.to)}c.effects.save(a,n?e:g);a.show();c.effects.createWrapper(a);
+a.css("overflow","hidden").css(a.from);if(m=="content"||m=="both"){f=f.concat(["marginTop","marginBottom"]).concat(i);k=k.concat(["marginLeft","marginRight"]);h=e.concat(f).concat(k);a.find("*[width]").each(function(){child=c(this);n&&c.effects.save(child,h);var o={height:child.height(),width:child.width()};child.from={height:o.height*d.from.y,width:o.width*d.from.x};child.to={height:o.height*d.to.y,width:o.width*d.to.x};if(d.from.y!=d.to.y){child.from=c.effects.setTransition(child,f,d.from.y,child.from);
+child.to=c.effects.setTransition(child,f,d.to.y,child.to)}if(d.from.x!=d.to.x){child.from=c.effects.setTransition(child,k,d.from.x,child.from);child.to=c.effects.setTransition(child,k,d.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){n&&c.effects.restore(child,h)})})}a.animate(a.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){a.to.opacity===0&&a.css("opacity",a.from.opacity);p=="hide"&&a.hide();c.effects.restore(a,
+n?e:g);c.effects.removeWrapper(a);b.callback&&b.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.shake.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.shake.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.shake.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Shake 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Shake
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(d){d.effects.shake=function(a){return this.queue(function(){var b=d(this),j=["position","top","bottom","left","right"];d.effects.setMode(b,a.options.mode||"effect");var c=a.options.direction||"left",e=a.options.distance||20,l=a.options.times||3,f=a.duration||a.options.duration||140;d.effects.save(b,j);b.show();d.effects.createWrapper(b);var g=c=="up"||c=="down"?"top":"left",h=c=="up"||c=="left"?"pos":"neg";c={};var i={},k={};c[g]=(h=="pos"?"-=":"+=")+e;i[g]=(h=="pos"?"+=":"-=")+e*2;k[g]=
+(h=="pos"?"-=":"+=")+e*2;b.animate(c,f,a.options.easing);for(e=1;e<l;e++)b.animate(i,f,a.options.easing).animate(k,f,a.options.easing);b.animate(i,f,a.options.easing).animate(c,f/2,a.options.easing,function(){d.effects.restore(b,j);d.effects.removeWrapper(b);a.callback&&a.callback.apply(this,arguments)});b.queue("fx",function(){b.dequeue()});b.dequeue()})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.slide.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.slide.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.slide.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Slide 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Slide
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(c){c.effects.slide=function(d){return this.queue(function(){var a=c(this),h=["position","top","bottom","left","right"],f=c.effects.setMode(a,d.options.mode||"show"),b=d.options.direction||"left";c.effects.save(a,h);a.show();c.effects.createWrapper(a).css({overflow:"hidden"});var g=b=="up"||b=="down"?"top":"left";b=b=="up"||b=="left"?"pos":"neg";var e=d.options.distance||(g=="top"?a.outerHeight({margin:true}):a.outerWidth({margin:true}));if(f=="show")a.css(g,b=="pos"?isNaN(e)?"-"+e:-e:e);
+var i={};i[g]=(f=="show"?b=="pos"?"+=":"-=":b=="pos"?"-=":"+=")+e;a.animate(i,{queue:false,duration:d.duration,easing:d.options.easing,complete:function(){f=="hide"&&a.hide();c.effects.restore(a,h);c.effects.removeWrapper(a);d.callback&&d.callback.apply(this,arguments);a.dequeue()}})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.transfer.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.transfer.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.effects.transfer.min.js	(revision 14585)
@@ -0,0 +1,14 @@
+/*
+ * jQuery UI Effects Transfer 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Effects/Transfer
+ *
+ * Depends:
+ *	jquery.effects.core.js
+ */
+(function(e){e.effects.transfer=function(a){return this.queue(function(){var b=e(this),c=e(a.options.to),d=c.offset();c={top:d.top,left:d.left,height:c.innerHeight(),width:c.innerWidth()};d=b.offset();var f=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(a.options.className).css({top:d.top,left:d.left,height:b.innerHeight(),width:b.innerWidth(),position:"absolute"}).animate(c,a.duration,a.options.easing,function(){f.remove();a.callback&&a.callback.apply(b[0],arguments);
+b.dequeue()})})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.accordion.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.accordion.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.accordion.min.js	(revision 14585)
@@ -0,0 +1,30 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> li > :first-child,> :not(li):even",icons:{header:"ui-icon-triangle-1-e",headerSelected:"ui-icon-triangle-1-s"},navigation:false,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}},_create:function(){var a=this,b=a.options;a.running=0;a.element.addClass("ui-accordion ui-widget ui-helper-reset").children("li").addClass("ui-accordion-li-fix");
+a.headers=a.element.find(b.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all").bind("mouseenter.accordion",function(){b.disabled||c(this).addClass("ui-state-hover")}).bind("mouseleave.accordion",function(){b.disabled||c(this).removeClass("ui-state-hover")}).bind("focus.accordion",function(){b.disabled||c(this).addClass("ui-state-focus")}).bind("blur.accordion",function(){b.disabled||c(this).removeClass("ui-state-focus")});a.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom");
+if(b.navigation){var d=a.element.find("a").filter(b.navigationFilter).eq(0);if(d.length){var h=d.closest(".ui-accordion-header");a.active=h.length?h:d.closest(".ui-accordion-content").prev()}}a.active=a._findActive(a.active||b.active).addClass("ui-state-default ui-state-active").toggleClass("ui-corner-all").toggleClass("ui-corner-top");a.active.next().addClass("ui-accordion-content-active");a._createIcons();a.resize();a.element.attr("role","tablist");a.headers.attr("role","tab").bind("keydown.accordion",
+function(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}):a.headers.eq(0).attr("tabIndex",0);c.browser.safari||a.headers.find("a").attr("tabIndex",-1);b.event&&a.headers.bind(b.event.split(" ").join(".accordion ")+".accordion",function(f){a._clickHandler.call(a,f,this);f.preventDefault()})},_createIcons:function(){var a=
+this.options;if(a.icons){c("<span></span>").addClass("ui-icon "+a.icons.header).prependTo(this.headers);this.active.children(".ui-icon").toggleClass(a.icons.header).toggleClass(a.icons.headerSelected);this.element.addClass("ui-accordion-icons")}},_destroyIcons:function(){this.headers.children(".ui-icon").remove();this.element.removeClass("ui-accordion-icons")},destroy:function(){var a=this.options;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role");this.headers.unbind(".accordion").removeClass("ui-accordion-header ui-accordion-disabled ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("tabIndex");
+this.headers.find("a").removeAttr("tabIndex");this._destroyIcons();var b=this.headers.next().css("display","").removeAttr("role").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-accordion-disabled ui-state-disabled");if(a.autoHeight||a.fillHeight)b.css("height","");return c.Widget.prototype.destroy.call(this)},_setOption:function(a,b){c.Widget.prototype._setOption.apply(this,arguments);a=="active"&&this.activate(b);if(a=="icons"){this._destroyIcons();
+b&&this._createIcons()}if(a=="disabled")this.headers.add(this.headers.next())[b?"addClass":"removeClass"]("ui-accordion-disabled ui-state-disabled")},_keydown:function(a){if(!(this.options.disabled||a.altKey||a.ctrlKey)){var b=c.ui.keyCode,d=this.headers.length,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target);
+a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.focus();return false}return true}},resize:function(){var a=this.options,b;if(a.fillSpace){if(c.browser.msie){var d=this.element.parent().css("overflow");this.element.parent().css("overflow","hidden")}b=this.element.parent().height();c.browser.msie&&this.element.parent().css("overflow",d);this.headers.each(function(){b-=c(this).outerHeight(true)});this.headers.next().each(function(){c(this).height(Math.max(0,b-c(this).innerHeight()+
+c(this).height()))}).css("overflow","auto")}else if(a.autoHeight){b=0;this.headers.next().each(function(){b=Math.max(b,c(this).height("").height())}).height(b)}return this},activate:function(a){this.options.active=a;a=this._findActive(a)[0];this._clickHandler({target:a},a);return this},_findActive:function(a){return a?typeof a==="number"?this.headers.filter(":eq("+a+")"):this.headers.not(this.headers.not(a)):a===false?c([]):this.headers.filter(":eq(0)")},_clickHandler:function(a,b){var d=this.options;
+if(!d.disabled)if(a.target){a=c(a.currentTarget||b);b=a[0]===this.active[0];d.active=d.collapsible&&b?false:this.headers.index(a);if(!(this.running||!d.collapsible&&b)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);
+if(!b){a.removeClass("ui-state-default ui-corner-all").addClass("ui-state-active ui-corner-top").children(".ui-icon").removeClass(d.icons.header).addClass(d.icons.headerSelected);a.next().addClass("ui-accordion-content-active")}}}else if(d.collapsible){this.active.removeClass("ui-state-active ui-corner-top").addClass("ui-state-default ui-corner-all").children(".ui-icon").removeClass(d.icons.headerSelected).addClass(d.icons.header);this.active.next().addClass("ui-accordion-content-active");var g=this.active.next(),
+e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,autoHeight:e.autoHeight||
+e.fillSpace};if(!e.proxied)e.proxied=e.animated;if(!e.proxiedDuration)e.proxiedDuration=e.duration;e.animated=c.isFunction(e.proxied)?e.proxied(d):e.proxied;e.duration=c.isFunction(e.proxiedDuration)?e.proxiedDuration(d):e.proxiedDuration;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false",
+"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"true",tabIndex:0}).focus()},_completed:function(a){this.running=a?0:--this.running;if(!this.running){this.options.clearStyle&&this.toShow.add(this.toHide).css({height:"",overflow:""});this.toHide.removeClass("ui-accordion-content-active");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.16",
+animations:{slide:function(a,b){a=c.extend({easing:"swing",duration:300},a,b);if(a.toHide.size())if(a.toShow.size()){var d=a.toShow.css("overflow"),h=0,f={},g={},e;b=a.toShow;e=b[0].style.width;b.width(parseInt(b.parent().width(),10)-parseInt(b.css("paddingLeft"),10)-parseInt(b.css("paddingRight"),10)-(parseInt(b.css("borderLeftWidth"),10)||0)-(parseInt(b.css("borderRightWidth"),10)||0));c.each(["height","paddingTop","paddingBottom"],function(j,i){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/);
+f[i]={value:j[1],unit:j[2]||"px"}});a.toShow.css({height:0,overflow:"hidden"}).show();a.toHide.filter(":hidden").each(a.complete).end().filter(":visible").animate(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[i.prop].unit},duration:a.duration,easing:a.easing,complete:function(){a.autoHeight||a.toShow.css("height","");a.toShow.css({width:e,overflow:d});a.complete()}})}else a.toHide.animate({height:"hide",
+paddingTop:"hide",paddingBottom:"hide"},a);else a.toShow.animate({height:"show",paddingTop:"show",paddingBottom:"show"},a)},bounceslide:function(a){this.slide(a,{easing:a.down?"easeOutBounce":"swing",duration:a.down?1E3:200})}}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.autocomplete.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.autocomplete.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.autocomplete.min.js	(revision 14585)
@@ -0,0 +1,32 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.position.js
+ */
+(function(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;this.element.addClass("ui-autocomplete-input").attr("autocomplete","off").attr({role:"textbox","aria-autocomplete":"list","aria-haspopup":"true"}).bind("keydown.autocomplete",function(c){if(!(a.options.disabled||a.element.propAttr("readOnly"))){g=
+false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.ESCAPE:a.element.val(a.term);a.close(c);break;default:clearTimeout(a.searching);a.searching=setTimeout(function(){if(a.term!=
+a.element.val()){a.selectedItem=null;a.search(null,c)}},a.options.delay);break}}}).bind("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).bind("focus.autocomplete",function(){if(!a.options.disabled){a.selectedItem=null;a.previous=a.element.val()}}).bind("blur.autocomplete",function(c){if(!a.options.disabled){clearTimeout(a.searching);a.closing=setTimeout(function(){a.close(c);a._change(c)},150)}});this._initSource();this.response=function(){return a._response.apply(a,arguments)};
+this.menu=d("<ul></ul>").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&&
+a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");
+d.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup");this.menu.element.remove();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&&
+b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source=
+this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length<this.options.minLength)return this.close(b);clearTimeout(this.closing);if(this._trigger("search",b)!==false)return this._search(a)},_search:function(a){this.pending++;this.element.addClass("ui-autocomplete-loading");this.source({term:a},this.response)},_response:function(a){if(!this.options.disabled&&a&&a.length){a=this._normalize(a);this._suggest(a);this._trigger("open")}else this.close();
+this.pending--;this.pending||this.element.removeClass("ui-autocomplete-loading")},close:function(a){clearTimeout(this.closing);if(this.menu.element.is(":visible")){this.menu.element.hide();this.menu.deactivate();this._trigger("close",a)}},_change:function(a){this.previous!==this.element.val()&&this._trigger("change",a,{item:this.selectedItem})},_normalize:function(a){if(a.length&&a[0].label&&a[0].value)return a;return d.map(a,function(b){if(typeof b==="string")return{label:b,value:b};return d.extend({label:b.label||
+b.value,value:b.value||b.label},b)})},_suggest:function(a){var b=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(b,a);this.menu.deactivate();this.menu.refresh();b.show();this._resizeMenu();b.position(d.extend({of:this.element},this.options.position));this.options.autoFocus&&this.menu.next(new d.Event("mouseover"))},_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))},_renderMenu:function(a,b){var g=this;
+d.each(b,function(c,f){g._renderItem(a,f)})},_renderItem:function(a,b){return d("<li></li>").data("item.autocomplete",b).append(d("<a></a>").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,
+"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery);
+(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex",
+-1).mouseenter(function(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.scrollTop(),c=this.element.height();if(b<0)this.element.scrollTop(g+b);else b>=c&&this.element.scrollTop(g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})},deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");
+this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0);e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,
+this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e,g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first"));this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||
+this.first()?":last":":first"))},hasScroll:function(){return this.element.height()<this.element[d.fn.prop?"prop":"attr"]("scrollHeight")},select:function(e){this._trigger("selected",e,{item:this.active})}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.button.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.button.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.button.min.js	(revision 14585)
@@ -0,0 +1,27 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(b){var h,i,j,g,l=function(){var a=b(this).find(":ui-button");setTimeout(function(){a.button("refresh")},1)},k=function(a){var c=a.name,e=a.form,f=b([]);if(c)f=e?b(e).find("[name='"+c+"']"):b("[name='"+c+"']",a.ownerDocument).filter(function(){return!this.form});return f};b.widget("ui.button",{options:{disabled:null,text:true,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset.button").bind("reset.button",l);if(typeof this.options.disabled!==
+"boolean")this.options.disabled=this.element.propAttr("disabled");this._determineButtonType();this.hasTitle=!!this.buttonElement.attr("title");var a=this,c=this.options,e=this.type==="checkbox"||this.type==="radio",f="ui-state-hover"+(!e?" ui-state-active":"");if(c.label===null)c.label=this.buttonElement.html();if(this.element.is(":disabled"))c.disabled=true;this.buttonElement.addClass("ui-button ui-widget ui-state-default ui-corner-all").attr("role","button").bind("mouseenter.button",function(){if(!c.disabled){b(this).addClass("ui-state-hover");
+this===h&&b(this).addClass("ui-state-active")}}).bind("mouseleave.button",function(){c.disabled||b(this).removeClass(f)}).bind("click.button",function(d){if(c.disabled){d.preventDefault();d.stopImmediatePropagation()}});this.element.bind("focus.button",function(){a.buttonElement.addClass("ui-state-focus")}).bind("blur.button",function(){a.buttonElement.removeClass("ui-state-focus")});if(e){this.element.bind("change.button",function(){g||a.refresh()});this.buttonElement.bind("mousedown.button",function(d){if(!c.disabled){g=
+false;i=d.pageX;j=d.pageY}}).bind("mouseup.button",function(d){if(!c.disabled)if(i!==d.pageX||j!==d.pageY)g=true})}if(this.type==="checkbox")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).toggleClass("ui-state-active");a.buttonElement.attr("aria-pressed",a.element[0].checked)});else if(this.type==="radio")this.buttonElement.bind("click.button",function(){if(c.disabled||g)return false;b(this).addClass("ui-state-active");a.buttonElement.attr("aria-pressed","true");
+var d=a.element[0];k(d).not(d).map(function(){return b(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")});else{this.buttonElement.bind("mousedown.button",function(){if(c.disabled)return false;b(this).addClass("ui-state-active");h=this;b(document).one("mouseup",function(){h=null})}).bind("mouseup.button",function(){if(c.disabled)return false;b(this).removeClass("ui-state-active")}).bind("keydown.button",function(d){if(c.disabled)return false;if(d.keyCode==b.ui.keyCode.SPACE||
+d.keyCode==b.ui.keyCode.ENTER)b(this).addClass("ui-state-active")}).bind("keyup.button",function(){b(this).removeClass("ui-state-active")});this.buttonElement.is("a")&&this.buttonElement.keyup(function(d){d.keyCode===b.ui.keyCode.SPACE&&b(this).click()})}this._setOption("disabled",c.disabled);this._resetButton()},_determineButtonType:function(){this.type=this.element.is(":checkbox")?"checkbox":this.element.is(":radio")?"radio":this.element.is("input")?"input":"button";if(this.type==="checkbox"||this.type===
+"radio"){var a=this.element.parents().filter(":last"),c="label[for='"+this.element.attr("id")+"']";this.buttonElement=a.find(c);if(!this.buttonElement.length){a=a.length?a.siblings():this.element.siblings();this.buttonElement=a.filter(c);if(!this.buttonElement.length)this.buttonElement=a.find(c)}this.element.addClass("ui-helper-hidden-accessible");(a=this.element.is(":checked"))&&this.buttonElement.addClass("ui-state-active");this.buttonElement.attr("aria-pressed",a)}else this.buttonElement=this.element},
+widget:function(){return this.buttonElement},destroy:function(){this.element.removeClass("ui-helper-hidden-accessible");this.buttonElement.removeClass("ui-button ui-widget ui-state-default ui-corner-all ui-state-hover ui-state-active  ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only").removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html());this.hasTitle||this.buttonElement.removeAttr("title");
+b.Widget.prototype.destroy.call(this)},_setOption:function(a,c){b.Widget.prototype._setOption.apply(this,arguments);if(a==="disabled")c?this.element.propAttr("disabled",true):this.element.propAttr("disabled",false);else this._resetButton()},refresh:function(){var a=this.element.is(":disabled");a!==this.options.disabled&&this._setOption("disabled",a);if(this.type==="radio")k(this.element[0]).each(function(){b(this).is(":checked")?b(this).button("widget").addClass("ui-state-active").attr("aria-pressed",
+"true"):b(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")});else if(this.type==="checkbox")this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false")},_resetButton:function(){if(this.type==="input")this.options.label&&this.element.val(this.options.label);else{var a=this.buttonElement.removeClass("ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only"),
+c=b("<span></span>").addClass("ui-button-text").html(this.options.label).appendTo(a.empty()).text(),e=this.options.icons,f=e.primary&&e.secondary,d=[];if(e.primary||e.secondary){if(this.options.text)d.push("ui-button-text-icon"+(f?"s":e.primary?"-primary":"-secondary"));e.primary&&a.prepend("<span class='ui-button-icon-primary ui-icon "+e.primary+"'></span>");e.secondary&&a.append("<span class='ui-button-icon-secondary ui-icon "+e.secondary+"'></span>");if(!this.options.text){d.push(f?"ui-button-icons-only":
+"ui-button-icon-only");this.hasTitle||a.attr("title",c)}}else d.push("ui-button-text-only");a.addClass(d.join(" "))}}});b.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(a,c){a==="disabled"&&this.buttons.button("option",a,c);b.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){var a=this.element.css("direction")===
+"ltr";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(a?"ui-corner-left":"ui-corner-right").end().filter(":last").addClass(a?"ui-corner-right":"ui-corner-left").end().end()},destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return b(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");
+b.Widget.prototype.destroy.call(this)}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.core.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.core.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.core.min.js	(revision 14585)
@@ -0,0 +1,18 @@
+/*!
+ * jQuery UI 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(c,j){function k(a,b){var d=a.nodeName.toLowerCase();if("area"===d){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&l(a)}return(/input|select|textarea|button|object/.test(d)?!a.disabled:"a"==d?a.href||b:b)&&l(a)}function l(a){return!c(a).parents().andSelf().filter(function(){return c.curCSS(this,"visibility")==="hidden"||c.expr.filters.hidden(this)}).length}c.ui=c.ui||{};if(!c.ui.version){c.extend(c.ui,{version:"1.8.16",
+keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({propAttr:c.fn.prop||c.fn.attr,_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=
+this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this,"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,
+"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position");if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":
+"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,m,n){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(m)g-=parseFloat(c.curCSS(f,"border"+this+"Width",true))||0;if(n)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,
+outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h,d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){return k(a,!isNaN(c.attr(a,"tabindex")))},tabbable:function(a){var b=c.attr(a,
+"tabindex"),d=isNaN(b);return(d||b>=0)&&k(a,!d)}});c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{plugin:{add:function(a,b,d){a=c.ui[a].prototype;for(var e in d){a.plugins[e]=a.plugins[e]||[];a.plugins[e].push([b,d[e]])}},call:function(a,b,d){if((b=a.plugins[b])&&
+a.element[0].parentNode)for(var e=0;e<b.length;e++)a.options[b[e][0]]&&b[e][1].apply(a.element,d)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(a,b){if(c(a).css("overflow")==="hidden")return false;b=b&&b==="left"?"scrollLeft":"scrollTop";var d=false;if(a[b]>0)return true;a[b]=1;d=a[b]>0;a[b]=0;return d},isOverAxis:function(a,b,d){return a>b&&a<b+d},isOver:function(a,b,d,e,h,i){return c.ui.isOverAxis(a,d,h)&&
+c.ui.isOverAxis(b,e,i)}})}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.datepicker.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.datepicker.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.datepicker.min.js	(revision 14585)
@@ -0,0 +1,83 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ */
+(function(d,C){function M(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._inDialog=this._datepickerShowing=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass=
+"ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su",
+"Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:false,showMonthAfterYear:false,yearSuffix:""};this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,yearRange:"c-10:c+10",showOtherMonths:false,selectOtherMonths:false,showWeek:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",
+minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false,autoSize:false,disabled:false};d.extend(this._defaults,this.regional[""]);this.dpDiv=N(d('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function N(a){return a.bind("mouseout",
+function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");b.length&&b.removeClass("ui-state-hover ui-datepicker-prev-hover ui-datepicker-next-hover")}).bind("mouseover",function(b){b=d(b.target).closest("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a");if(!(d.datepicker._isDisabledDatepicker(J.inline?a.parent()[0]:J.input[0])||!b.length)){b.parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
+b.addClass("ui-state-hover");b.hasClass("ui-datepicker-prev")&&b.addClass("ui-datepicker-prev-hover");b.hasClass("ui-datepicker-next")&&b.addClass("ui-datepicker-next-hover")}})}function H(a,b){d.extend(a,b);for(var c in b)if(b[c]==null||b[c]==C)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.16"}});var B=(new Date).getTime(),J;d.extend(M.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},
+setDefaults:function(a){H(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]=f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_-])/g,
+"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:N(d('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",
+function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b);b.settings.disabled&&this._disableDatepicker(a)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&&b.append.remove();if(c){b.append=d('<span class="'+this._appendClass+'">'+c+"</span>");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c==
+"focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("<img/>").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('<button type="button"></button>').addClass(this._triggerClass).html(f==""?c:d("<img/>").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():
+d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;g<f.length;g++)if(f[g].length>h){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,
+b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b),true);this._updateDatepicker(b);this._updateAlternate(b);b.settings.disabled&&this._disableDatepicker(a);b.dpDiv.css("display","block")}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=
+1;this._dialogInput=d('<input type="text" id="'+("dp"+this.uuid)+'" style="position: absolute; top: -100px; width: 0px; z-index: -10;"/>');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}H(a.settings,e||{});b=b&&b.constructor==Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/
+2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=
+d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=
+a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().removeClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b=d(a),c=d.data(a,
+"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span"){b=b.children("."+this._inlineClass);b.children().addClass("ui-state-disabled");b.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=d.map(this._disabledInputs,function(f){return f==
+a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false;for(var b=0;b<this._disabledInputs.length;b++)if(this._disabledInputs[b]==a)return true;return false},_getInst:function(a){try{return d.data(a,"datepicker")}catch(b){throw"Missing instance data for this datepicker";}},_optionDatepicker:function(a,b,c){var e=this._getInst(a);if(arguments.length==2&&typeof b=="string")return b=="defaults"?d.extend({},d.datepicker._defaults):e?b=="all"?
+d.extend({},e.settings):this._get(e,b):null;var f=b||{};if(typeof b=="string"){f={};f[b]=c}if(e){this._curInst==e&&this._hideDatepicker();var h=this._getDateDatepicker(a,true),i=this._getMinMaxDate(e,"min"),g=this._getMinMaxDate(e,"max");H(e.settings,f);if(i!==null&&f.dateFormat!==C&&f.minDate===C)e.settings.minDate=this._formatDate(e,i);if(g!==null&&f.dateFormat!==C&&f.maxDate===C)e.settings.maxDate=this._formatDate(e,g);this._attachments(d(a),e);this._autoSize(e);this._setDate(e,h);this._updateAlternate(e);
+this._updateDatepicker(e)}},_changeDatepicker:function(a,b,c){this._optionDatepicker(a,b,c)},_refreshDatepicker:function(a){(a=this._getInst(a))&&this._updateDatepicker(a)},_setDateDatepicker:function(a,b){if(a=this._getInst(a)){this._setDate(a,b);this._updateDatepicker(a);this._updateAlternate(a)}},_getDateDatepicker:function(a,b){(a=this._getInst(a))&&!a.inline&&this._setDateFromField(a,b);return a?this._getDate(a):null},_doKeyDown:function(a){var b=d.datepicker._getInst(a.target),c=true,e=b.dpDiv.is(".ui-datepicker-rtl");
+b._keyEvent=true;if(d.datepicker._datepickerShowing)switch(a.keyCode){case 9:d.datepicker._hideDatepicker();c=false;break;case 13:c=d("td."+d.datepicker._dayOverClass+":not(."+d.datepicker._currentClass+")",b.dpDiv);c[0]&&d.datepicker._selectDay(a.target,b.selectedMonth,b.selectedYear,c[0]);if(a=d.datepicker._get(b,"onSelect")){c=d.datepicker._formatDate(b);a.apply(b.input?b.input[0]:null,[c,b])}else d.datepicker._hideDatepicker();return false;case 27:d.datepicker._hideDatepicker();break;case 33:d.datepicker._adjustDate(a.target,
+a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 34:d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,"stepMonths"),"M");break;case 35:if(a.ctrlKey||a.metaKey)d.datepicker._clearDate(a.target);c=a.ctrlKey||a.metaKey;break;case 36:if(a.ctrlKey||a.metaKey)d.datepicker._gotoToday(a.target);c=a.ctrlKey||a.metaKey;break;case 37:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?+1:-1,"D");c=
+a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?-d.datepicker._get(b,"stepBigMonths"):-d.datepicker._get(b,"stepMonths"),"M");break;case 38:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,-7,"D");c=a.ctrlKey||a.metaKey;break;case 39:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,e?-1:+1,"D");c=a.ctrlKey||a.metaKey;if(a.originalEvent.altKey)d.datepicker._adjustDate(a.target,a.ctrlKey?+d.datepicker._get(b,"stepBigMonths"):+d.datepicker._get(b,
+"stepMonths"),"M");break;case 40:if(a.ctrlKey||a.metaKey)d.datepicker._adjustDate(a.target,+7,"D");c=a.ctrlKey||a.metaKey;break;default:c=false}else if(a.keyCode==36&&a.ctrlKey)d.datepicker._showDatepicker(this);else c=false;if(c){a.preventDefault();a.stopPropagation()}},_doKeyPress:function(a){var b=d.datepicker._getInst(a.target);if(d.datepicker._get(b,"constrainInput")){b=d.datepicker._possibleChars(d.datepicker._get(b,"dateFormat"));var c=String.fromCharCode(a.charCode==C?a.keyCode:a.charCode);
+return a.ctrlKey||a.metaKey||c<" "||!b||b.indexOf(c)>-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target||a;if(a.nodeName.toLowerCase()!="input")a=d("input",
+a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);if(d.datepicker._curInst&&d.datepicker._curInst!=b){d.datepicker._datepickerShowing&&d.datepicker._triggerOnClose(d.datepicker._curInst);d.datepicker._curInst.dpDiv.stop(true,true)}var c=d.datepicker._get(b,"beforeShow");c=c?c.apply(a,[a,b]):{};if(c!==false){H(b.settings,c);b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value=
+"";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a);d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.empty();b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);
+c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&&d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){var i=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex(d(a).zIndex()+1);d.datepicker._datepickerShowing=
+true;d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f,h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}}},_updateDatepicker:function(a){this.maxRows=4;var b=d.datepicker._getBorders(a.dpDiv);J=a;a.dpDiv.empty().append(this._generateHTML(a));var c=a.dpDiv.find("iframe.ui-datepicker-cover");c.length&&c.css({left:-b[0],top:-b[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});
+a.dpDiv.find("."+this._dayOverClass+" a").mouseover();b=this._getNumberOfMonths(a);c=b[1];a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");c>1&&a.dpDiv.addClass("ui-datepicker-multi-"+c).css("width",17*c+"em");a.dpDiv[(b[0]!=1||b[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&
+!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var e=a.yearshtml;setTimeout(function(){e===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);e=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),
+h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(),j=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>j&&j>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=
+this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1||d.expr.filters.hidden(a));)a=a[b?"previousSibling":"nextSibling"];a=d(a).offset();return[a.left,a.top]},_triggerOnClose:function(a){var b=this._get(a,"onClose");if(b)b.apply(a.input?a.input[0]:null,[a.input?a.input.val():"",a])},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);
+this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();d.datepicker._triggerOnClose(b);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},
+_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&&!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):
+0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth;b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e["selected"+(c=="M"?
+"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a=d(a);
+this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a,"altField");
+if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?
+b.toString():b+"";if(b=="")return null;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=A+1<a.length&&a.charAt(A+1)==p)&&A++;return p},m=function(p){var D=
+o(p);p=new RegExp("^\\d{1,"+(p=="@"?14:p=="!"?20:p=="y"&&D?4:p=="o"?3:2)+"}");p=b.substring(q).match(p);if(!p)throw"Missing number at position "+q;q+=p[0].length;return parseInt(p[0],10)},n=function(p,D,K){p=d.map(o(p)?K:D,function(w,x){return[[x,w]]}).sort(function(w,x){return-(w[1].length-x[1].length)});var E=-1;d.each(p,function(w,x){w=x[1];if(b.substr(q,w.length).toLowerCase()==w.toLowerCase()){E=x[0];q+=w.length;return false}});if(E!=-1)return E+1;else throw"Unknown name at position "+q;},s=
+function(){if(b.charAt(q)!=a.charAt(A))throw"Unexpected literal at position "+q;q++},q=0,A=0;A<a.length;A++)if(k)if(a.charAt(A)=="'"&&!o("'"))k=false;else s();else switch(a.charAt(A)){case "d":l=m("d");break;case "D":n("D",f,h);break;case "o":u=m("o");break;case "m":j=m("m");break;case "M":j=n("M",i,g);break;case "y":c=m("y");break;case "@":var v=new Date(m("@"));c=v.getFullYear();j=v.getMonth()+1;l=v.getDate();break;case "!":v=new Date((m("!")-this._ticksTo1970)/1E4);c=v.getFullYear();j=v.getMonth()+
+1;l=v.getDate();break;case "'":if(o("'"))s();else k=true;break;default:s()}if(q<b.length)throw"Extra/unparsed characters found in date: "+b.substring(q);if(c==-1)c=(new Date).getFullYear();else if(c<100)c+=(new Date).getFullYear()-(new Date).getFullYear()%100+(c<=e?0:-100);if(u>-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,j-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=j||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",
+COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:
+null)||this._defaults.monthNames;var i=function(o){(o=k+1<a.length&&a.charAt(k+1)==o)&&k++;return o},g=function(o,m,n){m=""+m;if(i(o))for(;m.length<n;)m="0"+m;return m},j=function(o,m,n,s){return i(o)?s[m]:n[m]},l="",u=false;if(b)for(var k=0;k<a.length;k++)if(u)if(a.charAt(k)=="'"&&!i("'"))u=false;else l+=a.charAt(k);else switch(a.charAt(k)){case "d":l+=g("d",b.getDate(),2);break;case "D":l+=j("D",b.getDay(),e,f);break;case "o":l+=g("o",Math.round(((new Date(b.getFullYear(),b.getMonth(),b.getDate())).getTime()-
+(new Date(b.getFullYear(),0,0)).getTime())/864E5),3);break;case "m":l+=g("m",b.getMonth()+1,2);break;case "M":l+=j("M",b.getMonth(),h,c);break;case "y":l+=i("y")?b.getFullYear():(b.getYear()%100<10?"0":"")+b.getYear()%100;break;case "@":l+=b.getTime();break;case "!":l+=b.getTime()*1E4+this._ticksTo1970;break;case "'":if(i("'"))l+="'";else u=true;break;default:l+=a.charAt(k)}return l},_possibleChars:function(a){for(var b="",c=false,e=function(h){(h=f+1<a.length&&a.charAt(f+1)==h)&&f++;return h},f=
+0;f<a.length;f++)if(c)if(a.charAt(f)=="'"&&!e("'"))c=false;else b+=a.charAt(f);else switch(a.charAt(f)){case "d":case "m":case "y":case "@":b+="0123456789";break;case "D":case "M":return null;case "'":if(e("'"))b+="'";else c=true;break;default:b+=a.charAt(f)}return b},_get:function(a,b){return a.settings[b]!==C?a.settings[b]:this._defaults[b]},_setDateFromField:function(a,b){if(a.input.val()!=a.lastVal){var c=this._get(a,"dateFormat"),e=a.lastVal=a.input?a.input.val():null,f,h;f=h=this._getDefaultDate(a);
+var i=this._getFormatConfig(a);try{f=this.parseDate(c,e,i)||h}catch(g){this.log(g);e=b?"":e}a.selectedDay=f.getDate();a.drawMonth=a.selectedMonth=f.getMonth();a.drawYear=a.selectedYear=f.getFullYear();a.currentDay=e?f.getDate():0;a.currentMonth=e?f.getMonth():0;a.currentYear=e?f.getFullYear():0;this._adjustInstDate(a)}},_getDefaultDate:function(a){return this._restrictMinMax(a,this._determineDate(a,this._get(a,"defaultDate"),new Date))},_determineDate:function(a,b,c){var e=function(h){var i=new Date;
+i.setDate(i.getDate()+h);return i},f=function(h){try{return d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),h,d.datepicker._getFormatConfig(a))}catch(i){}var g=(h.toLowerCase().match(/^c/)?d.datepicker._getDate(a):null)||new Date,j=g.getFullYear(),l=g.getMonth();g=g.getDate();for(var u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,k=u.exec(h);k;){switch(k[2]||"d"){case "d":case "D":g+=parseInt(k[1],10);break;case "w":case "W":g+=parseInt(k[1],10)*7;break;case "m":case "M":l+=parseInt(k[1],10);g=
+Math.min(g,d.datepicker._getDaysInMonth(j,l));break;case "y":case "Y":j+=parseInt(k[1],10);g=Math.min(g,d.datepicker._getDaysInMonth(j,l));break}k=u.exec(h)}return new Date(j,l,g)};if(b=(b=b==null||b===""?c:typeof b=="string"?f(b):typeof b=="number"?isNaN(b)?c:e(b):new Date(b.getTime()))&&b.toString()=="Invalid Date"?c:b){b.setHours(0);b.setMinutes(0);b.setSeconds(0);b.setMilliseconds(0)}return this._daylightSavingAdjust(b)},_daylightSavingAdjust:function(a){if(!a)return null;a.setHours(a.getHours()>
+12?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e?"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&
+a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),j=this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?
+new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),k=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=k&&n<k?k:n;this._daylightSavingAdjust(new Date(m,g,1))>n;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a,"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-j,1)),this._getFormatConfig(a));
+n=this._canAdjustMonth(a,-1,m,g)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', -"+j+", 'M');\" title=\""+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>":f?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+n+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"e":"w")+'">'+n+"</span></a>";var s=this._get(a,"nextText");s=!h?s:this.formatDate(s,this._daylightSavingAdjust(new Date(m,
+g+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery_'+B+".datepicker._adjustDate('#"+a.id+"', +"+j+", 'M');\" title=\""+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>":f?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+s+'"><span class="ui-icon ui-icon-circle-triangle-'+(c?"w":"e")+'">'+s+"</span></a>";j=this._get(a,"currentText");s=this._get(a,"gotoCurrent")&&
+a.currentDay?u:b;j=!h?j:this.formatDate(j,s,this._getFormatConfig(a));h=!a.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery_'+B+'.datepicker._hideDatepicker();">'+this._get(a,"closeText")+"</button>":"";e=e?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(c?h:"")+(this._isInRange(a,s)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery_'+
+B+".datepicker._gotoToday('#"+a.id+"');\">"+j+"</button>":"")+(c?"":h)+"</div>":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;j=this._get(a,"showWeek");s=this._get(a,"dayNames");this._get(a,"dayNamesShort");var q=this._get(a,"dayNamesMin"),A=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),D=this._get(a,"showOtherMonths"),K=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var E=this._getDefaultDate(a),w="",x=0;x<i[0];x++){var O=
+"";this.maxRows=4;for(var G=0;G<i[1];G++){var P=this._daylightSavingAdjust(new Date(m,g,a.selectedDay)),t=" ui-corner-all",y="";if(l){y+='<div class="ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:y+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:y+=" ui-datepicker-group-middle";t="";break}y+='">'}y+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+t+'">'+(/all|left/.test(t)&&
+x==0?c?f:n:"")+(/all|right/.test(t)&&x==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,x>0||G>0,A,v)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var z=j?'<th class="ui-datepicker-week-col">'+this._get(a,"weekHeader")+"</th>":"";for(t=0;t<7;t++){var r=(t+h)%7;z+="<th"+((t+h+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+s[r]+'">'+q[r]+"</span></th>"}y+=z+"</tr></thead><tbody>";z=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,
+z);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;z=Math.ceil((t+z)/7);this.maxRows=z=l?this.maxRows>z?this.maxRows:z:z;r=this._daylightSavingAdjust(new Date(m,g,1-t));for(var Q=0;Q<z;Q++){y+="<tr>";var R=!j?"":'<td class="ui-datepicker-week-col">'+this._get(a,"calculateWeek")(r)+"</td>";for(t=0;t<7;t++){var I=p?p.apply(a.input?a.input[0]:null,[r]):[true,""],F=r.getMonth()!=g,L=F&&!K||!I[0]||k&&r<k||o&&r>o;R+='<td class="'+((t+h+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(r.getTime()==
+P.getTime()&&g==a.selectedMonth&&a._keyEvent||E.getTime()==r.getTime()&&E.getTime()==P.getTime()?" "+this._dayOverClass:"")+(L?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!D?"":" "+I[1]+(r.getTime()==u.getTime()?" "+this._currentClass:"")+(r.getTime()==b.getTime()?" ui-datepicker-today":""))+'"'+((!F||D)&&I[2]?' title="'+I[2]+'"':"")+(L?"":' onclick="DP_jQuery_'+B+".datepicker._selectDay('#"+a.id+"',"+r.getMonth()+","+r.getFullYear()+', this);return false;"')+">"+(F&&!D?"&#xa0;":L?'<span class="ui-state-default">'+
+r.getDate()+"</span>":'<a class="ui-state-default'+(r.getTime()==b.getTime()?" ui-state-highlight":"")+(r.getTime()==u.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+'" href="#">'+r.getDate()+"</a>")+"</td>";r.setDate(r.getDate()+1);r=this._daylightSavingAdjust(r)}y+=R+"</tr>"}g++;if(g>11){g=0;m++}y+="</tbody></table>"+(l?"</div>"+(i[0]>0&&G==i[1]-1?'<div class="ui-datepicker-row-break"></div>':""):"");O+=y}w+=O}w+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':
+"");a._keyEvent=false;return w},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='<div class="ui-datepicker-title">',o="";if(h||!j)o+='<span class="ui-datepicker-month">'+i[b]+"</span>";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='<select class="ui-datepicker-month" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'M');\" >";for(var n=0;n<12;n++)if((!i||n>=e.getMonth())&&
+(!m||n<=f.getMonth()))o+='<option value="'+n+'"'+(n==b?' selected="selected"':"")+">"+g[n]+"</option>";o+="</select>"}u||(k+=o+(h||!(j&&l)?"&#xa0;":""));if(!a.yearshtml){a.yearshtml="";if(h||!l)k+='<span class="ui-datepicker-year">'+c+"</span>";else{g=this._get(a,"yearRange").split(":");var s=(new Date).getFullYear();i=function(q){q=q.match(/c[+-].*/)?c+parseInt(q.substring(1),10):q.match(/[+-].*/)?s+parseInt(q,10):parseInt(q,10);return isNaN(q)?s:q};b=i(g[0]);g=Math.max(b,i(g[1]||""));b=e?Math.max(b,
+e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(a.yearshtml+='<select class="ui-datepicker-year" onchange="DP_jQuery_'+B+".datepicker._selectMonthYear('#"+a.id+"', this, 'Y');\" >";b<=g;b++)a.yearshtml+='<option value="'+b+'"'+(b==c?' selected="selected"':"")+">"+b+"</option>";a.yearshtml+="</select>";k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?"&#xa0;":"")+o;k+="</div>";return k},_adjustInstDate:function(a,b,c){var e=a.drawYear+(c=="Y"?b:0),f=a.drawMonth+
+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&b<c?c:b;return b=a&&b>a?a:b},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");if(b)b.apply(a.input?
+a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a);c=this._daylightSavingAdjust(new Date(c,
+e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,
+"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker=function(a){if(!this.length)return this;
+if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));return this.each(function(){typeof a==
+"string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new M;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.16";window["DP_jQuery_"+B]=d})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.dialog.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.dialog.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.dialog.min.js	(revision 14585)
@@ -0,0 +1,40 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *  jquery.ui.button.js
+ *	jquery.ui.draggable.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.position.js
+ *	jquery.ui.resizable.js
+ */
+(function(c,l){var m={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},n={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true},o=c.attrFn||{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true,click:true};c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,
+position:{my:"center",at:"center",collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title");if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||"&#160;",e=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("<div></div>")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+
+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&!i.isDefaultPrevented()&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog","aria-labelledby":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(a.uiDialogTitlebar=c("<div></div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),
+h=c('<a href="#"></a>').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i);return false}).appendTo(f);(a.uiDialogTitlebarCloseText=c("<span></span>")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("<span></span>").addClass("ui-dialog-title").attr("id",
+e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;f.find("*").add(f).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&&g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");
+a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d,e;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog");b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==
+b.uiDialog[0]){e=c(this).css("z-index");isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.scrollTop(),scrollLeft:d.element.scrollLeft()};c.ui.dialog.maxZ+=1;
+d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===
+f[0]&&e.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("<div></div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("<div></div>").addClass("ui-dialog-buttonset").appendTo(e);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,
+function(){return!(d=true)});if(d){c.each(a,function(f,h){h=c.isFunction(h)?{click:h,text:f}:h;var i=c('<button type="button"></button>').click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.each(h,function(j,k){if(j!=="click")j in o?i[j](k):i.attr(j,k)});c.fn.button&&i.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",
+handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,
+originalSize:f.originalSize,position:f.position,size:f.size}}a=a===l?this.options.resizable:a;var d=this,e=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",
+f,b(h))},stop:function(f,h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight,a.height)},_position:function(a){var b=[],d=[0,0],e;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):
+[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);
+if(g in m)e=true;if(g in n)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):
+e.removeClass("ui-dialog-disabled");break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||"&#160;"));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=
+this.options,b,d,e=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-
+b,0));this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.16",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(a){return a+".dialog-overlay"}).join(" "),
+create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()<c.ui.dialog.overlay.maxZ)return false})},1);c(document).bind("keydown.dialog-overlay",function(d){if(a.options.closeOnEscape&&!d.isDefaultPrevented()&&d.keyCode&&d.keyCode===c.ui.keyCode.ESCAPE){a.close(d);d.preventDefault()}});c(window).bind("resize.dialog-overlay",c.ui.dialog.overlay.resize)}var b=(this.oldInstances.pop()||
+c("<div></div>").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},height:function(){var a,b;if(c.browser.msie&&
+c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a<b?c(window).height()+"px":a+"px"}else return c(document).height()+"px"},width:function(){var a,b;if(c.browser.msie){a=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth);b=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth);return a<b?c(window).width()+"px":a+"px"}else return c(document).width()+
+"px"},resize:function(){var a=c([]);c.each(c.ui.dialog.overlay.instances,function(){a=a.add(this)});a.css({width:0,height:0}).css({width:c.ui.dialog.overlay.width(),height:c.ui.dialog.overlay.height()})}});c.extend(c.ui.dialog.overlay.prototype,{destroy:function(){c.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.draggable.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.draggable.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.draggable.min.js	(revision 14585)
@@ -0,0 +1,50 @@
+/*
+ * jQuery UI Draggable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper==
+"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b=
+this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;if(b.iframeFix)d(b.iframeFix===true?"iframe":b.iframeFix).each(function(){d('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")});return true},_mouseStart:function(a){var b=this.options;
+this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
+this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions();d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);d.ui.ddmanager&&d.ui.ddmanager.dragStart(this,a);return true},
+_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=
+false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element,b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,
+10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},_mouseUp:function(a){this.options.iframeFix===true&&d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)});d.ui.ddmanager&&d.ui.ddmanager.dragStop(this,a);return d.ui.mouse.prototype._mouseUp.call(this,a)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||
+!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone().removeAttr("id"):this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&
+a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=
+this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),
+10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),
+10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[a.containment=="document"?0:d(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,a.containment=="document"?0:d(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,
+(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&&a.containment.constructor!=Array){a=d(a.containment);var b=a[0];if(b){a.offset();var c=d(b).css("overflow")!=
+"hidden";this.containment=[(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0),(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),
+10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom];this.relative_container=a}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+
+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&
+!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,h=a.pageY;if(this.originalPosition){var g;if(this.containment){if(this.relative_container){g=this.relative_container.offset();g=[this.containment[0]+g.left,this.containment[1]+g.top,this.containment[2]+g.left,this.containment[3]+g.top]}else g=this.containment;if(a.pageX-this.offset.click.left<g[0])e=g[0]+this.offset.click.left;
+if(a.pageY-this.offset.click.top<g[1])h=g[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>g[2])e=g[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>g[3])h=g[3]+this.offset.click.top}if(b.grid){h=b.grid[1]?this.originalPageY+Math.round((h-this.originalPageY)/b.grid[1])*b.grid[1]:this.originalPageY;h=g?!(h-this.offset.click.top<g[1]||h-this.offset.click.top>g[3])?h:!(h-this.offset.click.top<g[1])?h-b.grid[1]:h+b.grid[1]:h;e=b.grid[0]?this.originalPageX+Math.round((e-this.originalPageX)/
+b.grid[0])*b.grid[0]:this.originalPageX;e=g?!(e-this.offset.click.left<g[0]||e-this.offset.click.left>g[2])?e:!(e-this.offset.click.left<g[0])?e-b.grid[0]:e+b.grid[0]:e}}return{top:h-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop()),left:e-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&d.browser.version<
+526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():f?0:c.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove();this.helper=null;this.cancelHelperRemoval=false},_trigger:function(a,b,c){c=c||this._uiHash();d.ui.plugin.call(this,a,[b,c]);if(a=="drag")this.positionAbs=this._convertPositionTo("absolute");return d.Widget.prototype._trigger.call(this,a,b,
+c)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});d.extend(d.ui.draggable,{version:"1.8.16"});d.ui.plugin.add("draggable","connectToSortable",{start:function(a,b){var c=d(this).data("draggable"),f=c.options,e=d.extend({},b,{item:c.element});c.sortables=[];d(f.connectToSortable).each(function(){var h=d.data(this,"sortable");if(h&&!h.options.disabled){c.sortables.push({instance:h,shouldRevert:h.options.revert});
+h.refreshPositions();h._trigger("activate",a,e)}})},stop:function(a,b){var c=d(this).data("draggable"),f=d.extend({},b,{item:c.element});d.each(c.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;c.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert)this.instance.options.revert=true;this.instance._mouseStop(a);this.instance.options.helper=this.instance.options._helper;c.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})}else{this.instance.cancelHelperRemoval=
+false;this.instance._trigger("deactivate",a,f)}})},drag:function(a,b){var c=d(this).data("draggable"),f=this;d.each(c.sortables,function(){this.instance.positionAbs=c.positionAbs;this.instance.helperProportions=c.helperProportions;this.instance.offset.click=c.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=d(f).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",true);
+this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return b.helper[0]};a.target=this.instance.currentItem[0];this.instance._mouseCapture(a,true);this.instance._mouseStart(a,true,true);this.instance.offset.click.top=c.offset.click.top;this.instance.offset.click.left=c.offset.click.left;this.instance.offset.parent.left-=c.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=c.offset.parent.top-this.instance.offset.parent.top;
+c._trigger("toSortable",a);c.dropped=this.instance.element;c.currentItem=c.element;this.instance.fromOutside=c}this.instance.currentItem&&this.instance._mouseDrag(a)}else if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",a,this.instance._uiHash(this.instance));this.instance._mouseStop(a,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();this.instance.placeholder&&
+this.instance.placeholder.remove();c._trigger("fromSortable",a);c.dropped=false}})}});d.ui.plugin.add("draggable","cursor",{start:function(){var a=d("body"),b=d(this).data("draggable").options;if(a.css("cursor"))b._cursor=a.css("cursor");a.css("cursor",b.cursor)},stop:function(){var a=d(this).data("draggable").options;a._cursor&&d("body").css("cursor",a._cursor)}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("opacity"))b._opacity=
+a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){if(!c.axis||c.axis!=
+"x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop+c.scrollSpeed;else if(a.pageY-b.overflowOffset.top<c.scrollSensitivity)b.scrollParent[0].scrollTop=f=b.scrollParent[0].scrollTop-c.scrollSpeed;if(!c.axis||c.axis!="y")if(b.overflowOffset.left+b.scrollParent[0].offsetWidth-a.pageX<c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft+c.scrollSpeed;else if(a.pageX-b.overflowOffset.left<
+c.scrollSensitivity)b.scrollParent[0].scrollLeft=f=b.scrollParent[0].scrollLeft-c.scrollSpeed}else{if(!c.axis||c.axis!="x")if(a.pageY-d(document).scrollTop()<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()-c.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<c.scrollSensitivity)f=d(document).scrollTop(d(document).scrollTop()+c.scrollSpeed);if(!c.axis||c.axis!="y")if(a.pageX-d(document).scrollLeft()<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()-
+c.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<c.scrollSensitivity)f=d(document).scrollLeft(d(document).scrollLeft()+c.scrollSpeed)}f!==false&&d.ui.ddmanager&&!c.dropBehaviour&&d.ui.ddmanager.prepareOffsets(b,a)}});d.ui.plugin.add("draggable","snap",{start:function(){var a=d(this).data("draggable"),b=a.options;a.snapElements=[];d(b.snap.constructor!=String?b.snap.items||":data(draggable)":b.snap).each(function(){var c=d(this),f=c.offset();this!=a.element[0]&&a.snapElements.push({item:this,
+width:c.outerWidth(),height:c.outerHeight(),top:f.top,left:f.left})})},drag:function(a,b){for(var c=d(this).data("draggable"),f=c.options,e=f.snapTolerance,h=b.offset.left,g=h+c.helperProportions.width,n=b.offset.top,o=n+c.helperProportions.height,i=c.snapElements.length-1;i>=0;i--){var j=c.snapElements[i].left,l=j+c.snapElements[i].width,k=c.snapElements[i].top,m=k+c.snapElements[i].height;if(j-e<h&&h<l+e&&k-e<n&&n<m+e||j-e<h&&h<l+e&&k-e<o&&o<m+e||j-e<g&&g<l+e&&k-e<n&&n<m+e||j-e<g&&g<l+e&&k-e<o&&
+o<m+e){if(f.snapMode!="inner"){var p=Math.abs(k-o)<=e,q=Math.abs(m-n)<=e,r=Math.abs(j-g)<=e,s=Math.abs(l-h)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k-c.helperProportions.height,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j-c.helperProportions.width}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l}).left-c.margins.left}var t=
+p||q||r||s;if(f.snapMode!="outer"){p=Math.abs(k-n)<=e;q=Math.abs(m-o)<=e;r=Math.abs(j-h)<=e;s=Math.abs(l-g)<=e;if(p)b.position.top=c._convertPositionTo("relative",{top:k,left:0}).top-c.margins.top;if(q)b.position.top=c._convertPositionTo("relative",{top:m-c.helperProportions.height,left:0}).top-c.margins.top;if(r)b.position.left=c._convertPositionTo("relative",{top:0,left:j}).left-c.margins.left;if(s)b.position.left=c._convertPositionTo("relative",{top:0,left:l-c.helperProportions.width}).left-c.margins.left}if(!c.snapElements[i].snapping&&
+(p||q||r||s||t))c.options.snap.snap&&c.options.snap.snap.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=p||q||r||s||t}else{c.snapElements[i].snapping&&c.options.snap.release&&c.options.snap.release.call(c.element,a,d.extend(c._uiHash(),{snapItem:c.snapElements[i].item}));c.snapElements[i].snapping=false}}}});d.ui.plugin.add("draggable","stack",{start:function(){var a=d(this).data("draggable").options;a=d.makeArray(d(a.stack)).sort(function(c,f){return(parseInt(d(c).css("zIndex"),
+10)||0)-(parseInt(d(f).css("zIndex"),10)||0)});if(a.length){var b=parseInt(a[0].style.zIndex)||0;d(a).each(function(c){this.style.zIndex=b+c});this[0].style.zIndex=b+a.length}}});d.ui.plugin.add("draggable","zIndex",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options;if(a.css("zIndex"))b._zIndex=a.css("zIndex");a.css("zIndex",b.zIndex)},stop:function(a,b){a=d(this).data("draggable").options;a._zIndex&&d(b.helper).css("zIndex",a._zIndex)}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.droppable.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.droppable.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.droppable.min.js	(revision 14585)
@@ -0,0 +1,27 @@
+/*
+ * jQuery UI Droppable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Droppables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.draggable.js
+ */
+(function(d){d.widget("ui.droppable",{widgetEventPrefix:"drop",options:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"},_create:function(){var a=this.options,b=a.accept;this.isover=0;this.isout=1;this.accept=d.isFunction(b)?b:function(c){return c.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};d.ui.ddmanager.droppables[a.scope]=d.ui.ddmanager.droppables[a.scope]||[];d.ui.ddmanager.droppables[a.scope].push(this);
+a.addClasses&&this.element.addClass("ui-droppable")},destroy:function(){for(var a=d.ui.ddmanager.droppables[this.options.scope],b=0;b<a.length;b++)a[b]==this&&a.splice(b,1);this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable");return this},_setOption:function(a,b){if(a=="accept")this.accept=d.isFunction(b)?b:function(c){return c.is(b)};d.Widget.prototype._setOption.apply(this,arguments)},_activate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&
+this.element.addClass(this.options.activeClass);b&&this._trigger("activate",a,this.ui(b))},_deactivate:function(a){var b=d.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass);b&&this._trigger("deactivate",a,this.ui(b))},_over:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.addClass(this.options.hoverClass);
+this._trigger("over",a,this.ui(b))}},_out:function(a){var b=d.ui.ddmanager.current;if(!(!b||(b.currentItem||b.element)[0]==this.element[0]))if(this.accept.call(this.element[0],b.currentItem||b.element)){this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("out",a,this.ui(b))}},_drop:function(a,b){var c=b||d.ui.ddmanager.current;if(!c||(c.currentItem||c.element)[0]==this.element[0])return false;var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var g=
+d.data(this,"droppable");if(g.options.greedy&&!g.options.disabled&&g.options.scope==c.options.scope&&g.accept.call(g.element[0],c.currentItem||c.element)&&d.ui.intersect(c,d.extend(g,{offset:g.element.offset()}),g.options.tolerance)){e=true;return false}});if(e)return false;if(this.accept.call(this.element[0],c.currentItem||c.element)){this.options.activeClass&&this.element.removeClass(this.options.activeClass);this.options.hoverClass&&this.element.removeClass(this.options.hoverClass);this._trigger("drop",
+a,this.ui(c));return this.element}return false},ui:function(a){return{draggable:a.currentItem||a.element,helper:a.helper,position:a.position,offset:a.positionAbs}}});d.extend(d.ui.droppable,{version:"1.8.16"});d.ui.intersect=function(a,b,c){if(!b.offset)return false;var e=(a.positionAbs||a.position.absolute).left,g=e+a.helperProportions.width,f=(a.positionAbs||a.position.absolute).top,h=f+a.helperProportions.height,i=b.offset.left,k=i+b.proportions.width,j=b.offset.top,l=j+b.proportions.height;
+switch(c){case "fit":return i<=e&&g<=k&&j<=f&&h<=l;case "intersect":return i<e+a.helperProportions.width/2&&g-a.helperProportions.width/2<k&&j<f+a.helperProportions.height/2&&h-a.helperProportions.height/2<l;case "pointer":return d.ui.isOver((a.positionAbs||a.position.absolute).top+(a.clickOffset||a.offset.click).top,(a.positionAbs||a.position.absolute).left+(a.clickOffset||a.offset.click).left,j,i,b.proportions.height,b.proportions.width);case "touch":return(f>=j&&f<=l||h>=j&&h<=l||f<j&&h>l)&&(e>=
+i&&e<=k||g>=i&&g<=k||e<i&&g>k);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f<c.length;f++)if(!(c[f].options.disabled||a&&!c[f].accept.call(c[f].element[0],a.currentItem||a.element))){for(var h=0;h<g.length;h++)if(g[h]==c[f].element[0]){c[f].proportions.height=0;continue a}c[f].visible=c[f].element.css("display")!=
+"none";if(c[f].visible){e=="mousedown"&&c[f]._activate.call(c[f],b);c[f].offset=c[f].element.offset();c[f].proportions={width:c[f].element[0].offsetWidth,height:c[f].element[0].offsetHeight}}}},drop:function(a,b){var c=false;d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(this.options){if(!this.options.disabled&&this.visible&&d.ui.intersect(a,this,this.options.tolerance))c=c||this._drop.call(this,b);if(!this.options.disabled&&this.visible&&this.accept.call(this.element[0],a.currentItem||
+a.element)){this.isout=1;this.isover=0;this._deactivate.call(this,b)}}});return c},dragStart:function(a,b){a.element.parents(":not(body,html)").bind("scroll.droppable",function(){a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)})},drag:function(a,b){a.options.refreshPositions&&d.ui.ddmanager.prepareOffsets(a,b);d.each(d.ui.ddmanager.droppables[a.options.scope]||[],function(){if(!(this.options.disabled||this.greedyChild||!this.visible)){var c=d.ui.intersect(a,this,this.options.tolerance);
+if(c=!c&&this.isover==1?"isout":c&&this.isover==0?"isover":null){var e;if(this.options.greedy){var g=this.element.parents(":data(droppable):eq(0)");if(g.length){e=d.data(g[0],"droppable");e.greedyChild=c=="isover"?1:0}}if(e&&c=="isover"){e.isover=0;e.isout=1;e._out.call(e,b)}this[c]=1;this[c=="isout"?"isover":"isout"]=0;this[c=="isover"?"_over":"_out"].call(this,b);if(e&&c=="isout"){e.isout=0;e.isover=1;e._over.call(e,b)}}}})},dragStop:function(a,b){a.element.parents(":not(body,html)").unbind("scroll.droppable");
+a.options.refreshPositions||d.ui.ddmanager.prepareOffsets(a,b)}}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.mouse.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.mouse.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.mouse.min.js	(revision 14585)
@@ -0,0 +1,17 @@
+/*!
+ * jQuery UI Mouse 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ *	jquery.ui.widget.js
+ */
+(function(b){var d=false;b(document).mouseup(function(){d=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+
+this.widgetName)},_mouseDown:function(a){if(!d){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,f=a.which==1,g=typeof this.options.cancel=="string"&&a.target.nodeName?b(a.target).closest(this.options.cancel).length:false;if(!f||g||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
+this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(e){return c._mouseMove(e)};this._mouseUpDelegate=function(e){return c._mouseUp(e)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return d=true}},_mouseMove:function(a){if(b.browser.msie&&
+!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=
+false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.position.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.position.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.position.min.js	(revision 14585)
@@ -0,0 +1,16 @@
+/*
+ * jQuery UI Position 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Position
+ */
+(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
+left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
+k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
+m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
+d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
+a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
+g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.progressbar.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.progressbar.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.progressbar.min.js	(revision 14585)
@@ -0,0 +1,16 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar
+ *
+ * Depends:
+ *   jquery.ui.core.js
+ *   jquery.ui.widget.js
+ */
+(function(b,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()});this.valueDiv=b("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element);this.oldValue=this._value();this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow");
+this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100*
+this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggle(a>this.min).toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.16"})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.resizable.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.resizable.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.resizable.min.js	(revision 14585)
@@ -0,0 +1,49 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element,
+_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),
+top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=
+this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",
+nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d<c.length;d++){var f=e.trim(c[d]),g=e('<div class="ui-resizable-handle '+("ui-resizable-"+f)+'"></div>');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor==
+String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),l=0;l=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,l);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection();
+this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){if(!a.disabled){e(this).removeClass("ui-resizable-autohide");b._handles.show()}},function(){if(!a.disabled)if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();
+var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=
+false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(),d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});
+this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff=
+{width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio:this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];
+if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize",b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},
+_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height;f=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.height()-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,
+{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",b);this._helper&&this.helper.remove();return false},_updateVirtualBoundaries:function(b){var a=this.options,c,d,f;a={minWidth:k(a.minWidth)?a.minWidth:0,maxWidth:k(a.maxWidth)?a.maxWidth:Infinity,minHeight:k(a.minHeight)?a.minHeight:0,maxHeight:k(a.maxHeight)?a.maxHeight:
+Infinity};if(this._aspectRatio||b){b=a.minHeight*this.aspectRatio;d=a.minWidth/this.aspectRatio;c=a.maxHeight*this.aspectRatio;f=a.maxWidth/this.aspectRatio;if(b>a.minWidth)a.minWidth=b;if(d>a.minHeight)a.minHeight=d;if(c<a.maxWidth)a.maxWidth=c;if(f<a.maxHeight)a.maxHeight=f}this._vBoundaries=a},_updateCache:function(b){this.offset=this.helper.offset();if(k(b.left))this.position.left=b.left;if(k(b.top))this.position.top=b.top;if(k(b.height))this.size.height=b.height;if(k(b.width))this.size.width=
+b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(k(b.height))b.width=b.height*this.aspectRatio;else if(k(b.width))b.height=b.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top=a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this._vBoundaries,c=this.axis,d=k(b.width)&&a.maxWidth&&a.maxWidth<b.width,f=k(b.height)&&a.maxHeight&&a.maxHeight<b.height,g=k(b.width)&&a.minWidth&&
+a.minWidth>b.width,h=k(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height,l=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&l)b.left=i-a.minWidth;if(d&&l)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=
+null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a<this._proportionallyResizeElements.length;a++){var c=this._proportionallyResizeElements[a];if(!this.borderDif){var d=[c.css("borderTopWidth"),c.css("borderRightWidth"),c.css("borderBottomWidth"),c.css("borderLeftWidth")],f=[c.css("paddingTop"),c.css("paddingRight"),c.css("paddingBottom"),c.css("paddingLeft")];this.borderDif=e.map(d,function(g,h){g=parseInt(g,10)||
+0;h=parseInt(f[h],10)||0;return g+h})}e.browser.msie&&(e(b).is(":hidden")||e(b).parents(":hidden").length)||c.css({height:b.height()-this.borderDif[0]-this.borderDif[2]||0,width:b.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var b=this.options;this.elementOffset=this.element.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+
+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+
+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);
+b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable,{version:"1.8.16"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),
+10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize,function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-
+f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var l=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:l.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n=(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(l.css("position"))){c._revertToRelativePosition=true;l.css({position:"absolute",top:"auto",left:"auto"})}l.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?
+e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition=false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=
+e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left-a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,
+step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize",b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=
+e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top","Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;
+var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset,f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:
+a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left=a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-
+d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,
+f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,
+display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative",height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=
+e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=
+d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},k=function(b){return!isNaN(parseInt(b,10))}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.selectable.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.selectable.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.selectable.min.js	(revision 14585)
@@ -0,0 +1,22 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"),
+selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("<div class='ui-selectable-helper'></div>")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX,
+c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting",
+c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d=
+this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.right<b||a.top>i||a.bottom<g);else if(d.tolerance=="fit")k=a.left>b&&a.right<h&&a.top>g&&a.bottom<i;if(k){if(a.selected){a.$element.removeClass("ui-selected");a.selected=false}if(a.unselecting){a.$element.removeClass("ui-unselecting");
+a.unselecting=false}if(!a.selecting){a.$element.addClass("ui-selecting");a.selecting=true;f._trigger("selecting",c,{selecting:a.element})}}else{if(a.selecting)if(c.metaKey&&a.startselected){a.$element.removeClass("ui-selecting");a.selecting=false;a.$element.addClass("ui-selected");a.selected=true}else{a.$element.removeClass("ui-selecting");a.selecting=false;if(a.startselected){a.$element.addClass("ui-unselecting");a.unselecting=true}f._trigger("unselecting",c,{unselecting:a.element})}if(a.selected)if(!c.metaKey&&
+!a.startselected){a.$element.removeClass("ui-selected");a.selected=false;a.$element.addClass("ui-unselecting");a.unselecting=true;f._trigger("unselecting",c,{unselecting:a.element})}}}});return false}},_mouseStop:function(c){var f=this;this.dragged=false;e(".ui-unselecting",this.element[0]).each(function(){var d=e.data(this,"selectable-item");d.$element.removeClass("ui-unselecting");d.unselecting=false;d.startselected=false;f._trigger("unselected",c,{unselected:d.element})});e(".ui-selecting",this.element[0]).each(function(){var d=
+e.data(this,"selectable-item");d.$element.removeClass("ui-selecting").addClass("ui-selected");d.selecting=false;d.selected=true;d.startselected=true;f._trigger("selected",c,{selected:d.element})});this._trigger("stop",c);this.helper.remove();return false}});e.extend(e.ui.selectable,{version:"1.8.16"})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.slider.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.slider.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.slider.min.js	(revision 14585)
@@ -0,0 +1,33 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var a=this,b=this.options,c=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f=b.values&&b.values.length||1,e=[];this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+
+this.orientation+" ui-widget ui-widget-content ui-corner-all"+(b.disabled?" ui-slider-disabled ui-disabled":""));this.range=d([]);if(b.range){if(b.range===true){if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}this.range=d("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(b.range==="min"||b.range==="max"?" ui-slider-range-"+b.range:""))}for(var j=c.length;j<f;j+=1)e.push("<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>");
+this.handles=c.add(d(e.join("")).appendTo(a.element));this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(g){g.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur();else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(g){d(this).data("index.ui-slider-handle",
+g)});this.handles.keydown(function(g){var k=true,l=d(this).data("index.ui-slider-handle"),i,h,m;if(!a.options.disabled){switch(g.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:k=false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");i=a._start(g,l);if(i===false)return}break}m=a.options.step;i=a.options.values&&a.options.values.length?
+(h=a.values(l)):(h=a.value());switch(g.keyCode){case d.ui.keyCode.HOME:h=a._valueMin();break;case d.ui.keyCode.END:h=a._valueMax();break;case d.ui.keyCode.PAGE_UP:h=a._trimAlignValue(i+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:h=a._trimAlignValue(i-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(i===a._valueMax())return;h=a._trimAlignValue(i+m);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(i===a._valueMin())return;h=a._trimAlignValue(i-
+m);break}a._slide(g,l,h);return k}}).keyup(function(g){var k=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(g,k);a._change(g,k);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();
+return this},_mouseCapture:function(a){var b=this.options,c,f,e,j,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});f=this._valueMax()-this._valueMin()+1;j=this;this.handles.each(function(k){var l=Math.abs(c-j.values(k));if(f>l){f=l;e=d(this);g=k}});if(b.range===true&&this.values(1)===b.min){g+=1;e=d(this.handles[g])}if(this._start(a,g)===false)return false;
+this._mouseSliding=true;j._handleIndex=g;e.addClass("ui-state-active").focus();b=e.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-e.width()/2,top:a.pageY-b.top-e.height()/2-(parseInt(e.css("borderTopWidth"),10)||0)-(parseInt(e.css("borderBottomWidth"),10)||0)+(parseInt(e.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b=
+this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b=
+this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);
+c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var f;if(this.options.values&&this.options.values.length){f=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>f||b===1&&c<f))c=f;if(c!==this.values(b)){f=this.values();f[b]=c;a=this._trigger("slide",a,{handle:this.handles[b],value:c,values:f});this.values(b?0:1);a!==false&&this.values(b,c,true)}}else if(c!==this.value()){a=this._trigger("slide",a,{handle:this.handles[b],value:c});
+a!==false&&this.value(c)}},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b);c.values=this.values()}this._trigger("change",a,c)}},value:function(a){if(arguments.length){this.options.value=
+this._trimAlignValue(a);this._refreshValue();this._change(null,0)}else return this._value()},values:function(a,b){var c,f,e;if(arguments.length>1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}else if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;f=arguments[0];for(e=0;e<c.length;e+=1){c[e]=this._trimAlignValue(f[e]);this._change(null,e)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(a):
+this.value();else return this._values()},_setOption:function(a,b){var c,f=0;if(d.isArray(this.options.values))f=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(a){case "disabled":if(b){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.propAttr("disabled",true);this.element.addClass("ui-disabled")}else{this.handles.propAttr("disabled",false);this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
+this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<f;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var a=this.options.value;return a=this._trimAlignValue(a)},_values:function(a){var b,c;if(arguments.length){b=this.options.values[a];
+return b=this._trimAlignValue(b)}else{b=this.options.values.slice();for(c=0;c<b.length;c+=1)b[c]=this._trimAlignValue(b[c]);return b}},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a=
+this.options.range,b=this.options,c=this,f=!this._animateOff?b.animate:false,e,j={},g,k,l,i;if(this.options.values&&this.options.values.length)this.handles.each(function(h){e=(c.values(h)-c._valueMin())/(c._valueMax()-c._valueMin())*100;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";d(this).stop(1,1)[f?"animate":"css"](j,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(h===0)c.range.stop(1,1)[f?"animate":"css"]({left:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({width:e-
+g+"%"},{queue:false,duration:b.animate})}else{if(h===0)c.range.stop(1,1)[f?"animate":"css"]({bottom:e+"%"},b.animate);if(h===1)c.range[f?"animate":"css"]({height:e-g+"%"},{queue:false,duration:b.animate})}g=e});else{k=this.value();l=this._valueMin();i=this._valueMax();e=i!==l?(k-l)/(i-l)*100:0;j[c.orientation==="horizontal"?"left":"bottom"]=e+"%";this.handle.stop(1,1)[f?"animate":"css"](j,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[f?"animate":"css"]({width:e+"%"},
+b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[f?"animate":"css"]({width:100-e+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[f?"animate":"css"]({height:e+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[f?"animate":"css"]({height:100-e+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.16"})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.sortable.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.sortable.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.sortable.min.js	(revision 14585)
@@ -0,0 +1,60 @@
+/*
+ * jQuery UI Sortable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Sortables
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.mouse.js
+ *	jquery.ui.widget.js
+ */
+(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){var a=this.options;this.containerCache={};this.element.addClass("ui-sortable");
+this.refresh();this.floating=this.items.length?a.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a===
+"disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&
+!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem=c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,
+left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};
+this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment();if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=
+document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start",a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);
+return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY<b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop+b.scrollSpeed;else if(a.pageY-this.overflowOffset.top<
+b.scrollSensitivity)this.scrollParent[0].scrollTop=c=this.scrollParent[0].scrollTop-b.scrollSpeed;if(this.overflowOffset.left+this.scrollParent[0].offsetWidth-a.pageX<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft+b.scrollSpeed;else if(a.pageX-this.overflowOffset.left<b.scrollSensitivity)this.scrollParent[0].scrollLeft=c=this.scrollParent[0].scrollLeft-b.scrollSpeed}else{if(a.pageY-d(document).scrollTop()<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()-
+b.scrollSpeed);else if(d(window).height()-(a.pageY-d(document).scrollTop())<b.scrollSensitivity)c=d(document).scrollTop(d(document).scrollTop()+b.scrollSpeed);if(a.pageX-d(document).scrollLeft()<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()-b.scrollSpeed);else if(d(window).width()-(a.pageX-d(document).scrollLeft())<b.scrollSensitivity)c=d(document).scrollLeft(d(document).scrollLeft()+b.scrollSpeed)}c!==false&&d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,
+a)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(b=this.items.length-1;b>=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],
+e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a,c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();
+c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp({target:null});this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):
+this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate",null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}if(this.placeholder){this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,
+dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem):d(this.domPosition.parent).prepend(this.currentItem)}return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},
+toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute||"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+j<k&&b+l>g&&b+l<h;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||
+this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>a[this.floating?"width":"height"]?j:g<b+this.helperProportions.width/2&&c-this.helperProportions.width/2<h&&i<e+this.helperProportions.height/2&&f-this.helperProportions.height/2<k},_intersectsWithPointer:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left,a.width);b=b&&a;a=this._getDragVerticalDirection();
+var c=this._getDragHorizontalDirection();if(!b)return false;return this.floating?c&&c=="right"||a=="down"?2:1:a&&(a=="down"?2:1)},_intersectsWithSides:function(a){var b=d.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,a.top+a.height/2,a.height);a=d.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,a.left+a.width/2,a.width);var c=this._getDragVerticalDirection(),e=this._getDragHorizontalDirection();return this.floating&&e?e=="right"&&a||e=="left"&&!a:c&&(c=="down"&&b||c=="up"&&!b)},
+_getDragVerticalDirection:function(){var a=this.positionAbs.top-this.lastPositionAbs.top;return a!=0&&(a>0?"down":"up")},_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();
+if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!=this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),
+this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a=this.currentItem.find(":data(sortable-item)"),b=0;b<this.items.length;b++)for(var c=0;c<a.length;c++)a[c]==this.items[b].item[0]&&this.items.splice(b,1)},_refreshItems:function(a){this.items=[];this.containers=[this];var b=this.items,c=[[d.isFunction(this.options.items)?this.options.items.call(this.element[0],a,{item:this.currentItem}):d(this.options.items,this.element),
+this]],e=this._connectWith();if(e)for(var f=e.length-1;f>=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable");if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h<g;h++){i=d(e[h]);i.data("sortable-item",a);b.push({item:i,instance:a,width:0,height:0,left:0,top:0})}}},refreshPositions:function(a){if(this.offsetParent&&
+this.helper)this.offset.parent=this._getParentOffset();for(var b=this.items.length-1;b>=0;b--){var c=this.items[b];if(!(c.instance!=this.currentContainer&&this.currentContainer&&c.item[0]!=this.currentItem[0])){var e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=
+this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width=this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=
+d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f},update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||
+0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b=null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",
+a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-
+f)<b){b=Math.abs(h-f);e=this.items[g]}}if(e||this.options.dropOnEmpty){this.currentContainer=this.containers[c];e?this._rearrange(a,e,null,true):this._rearrange(a,null,this.containers[c].element,true);this._trigger("change",a,this._uiHash());this.containers[c]._trigger("change",a,this._uiHash(this));this.options.placeholder.update(this.currentContainer,this.placeholder);this.containers[c]._trigger("over",a,this._uiHash(this));this.containers[c].containerCache.over=1}}},_createHelper:function(a){var b=
+this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a,this.currentItem])):b.helper=="clone"?this.currentItem.clone():this.currentItem;a.parents("body").length||d(b.appendTo!="parent"?b.appendTo:this.currentItem[0].parentNode)[0].appendChild(a[0]);if(a[0]==this.currentItem[0])this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")};if(a[0].style.width==
+""||b.forceHelperSize)a.width(this.currentItem.width());if(a[0].style.height==""||b.forceHelperSize)a.height(this.currentItem.height());return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]||0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=
+this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a=
+{top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.currentItem.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),
+10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment=="parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?
+document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)){var b=d(a.containment)[0];a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),
+10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(a,b){if(!b)b=
+this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&
+this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(c[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]))this.offset.relative=this._getRelativeOffset();
+var f=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.left<this.containment[0])f=this.containment[0]+this.offset.click.left;if(a.pageY-this.offset.click.top<this.containment[1])g=this.containment[1]+this.offset.click.top;if(a.pageX-this.offset.click.left>this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-
+this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:!(g-this.offset.click.top<this.containment[1])?g-b.grid[1]:g+b.grid[1]:g;f=this.originalPageX+Math.round((f-this.originalPageX)/b.grid[0])*b.grid[0];f=this.containment?!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:!(f-this.offset.click.left<this.containment[0])?f-b.grid[0]:f+b.grid[0]:f}}return{top:g-
+this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:c.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(d.browser.safari&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:c.scrollLeft())}},_rearrange:function(a,b,c,e){c?c[0].appendChild(this.placeholder[0]):b.item[0].parentNode.insertBefore(this.placeholder[0],
+this.direction=="down"?b.item[0]:b.item[0].nextSibling);this.counter=this.counter?++this.counter:1;var f=this,g=this.counter;window.setTimeout(function(){g==f.counter&&f.refreshPositions(!e)},0)},_clear:function(a,b){this.reverting=false;var c=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem);this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var e in this._storedCSS)if(this._storedCSS[e]=="auto"||this._storedCSS[e]=="static")this._storedCSS[e]=
+"";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!b&&c.push(function(f){this._trigger("receive",f,this._uiHash(this.fromOutside))});if((this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!b)c.push(function(f){this._trigger("update",f,this._uiHash())});if(!d.ui.contains(this.element[0],this.currentItem[0])){b||c.push(function(f){this._trigger("remove",
+f,this._uiHash())});for(e=this.containers.length-1;e>=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive",g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,
+this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over=0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",
+a,this._uiHash());for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}return false}b||this._trigger("beforeStop",a,this._uiHash());this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.helper[0]!=this.currentItem[0]&&this.helper.remove();this.helper=null;if(!b){for(e=0;e<c.length;e++)c[e].call(this,a);this._trigger("stop",a,this._uiHash())}this.fromOutside=false;return true},_trigger:function(){d.Widget.prototype._trigger.apply(this,arguments)===false&&this.cancel()},
+_uiHash:function(a){var b=a||this;return{helper:b.helper,placeholder:b.placeholder||d([]),position:b.position,originalPosition:b.originalPosition,offset:b.positionAbs,item:b.currentItem,sender:a?a.element:null}}});d.extend(d.ui.sortable,{version:"1.8.16"})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.tabs.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.tabs.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.tabs.min.js	(revision 14585)
@@ -0,0 +1,35 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"<div></div>",remove:null,select:null,show:null,spinner:"<em>Loading&#8230;</em>",tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&&
+e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b=
+d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]||
+(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");
+this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(a._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected=
+this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return a.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");
+if(c.selected>=0&&this.anchors.length){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));
+this.element[c.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+
+g)};this.lis.bind("mouseover.tabs",function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",
+function(){e(f,o);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")};
+this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=
+-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";
+d.browser.msie&&this.blur()});this.anchors.bind("click.tabs",function(){return false})},_getIndex:function(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=
+d.data(this,"href.tabs");if(e)this.href=e;var a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b,
+e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]);
+j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove();
+if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1<this.anchors.length?1:-1));e.disabled=d.map(d.grep(e.disabled,function(h){return h!=b}),function(h){return h>=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null,
+this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this},
+load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c,
+"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},
+url:function(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.16"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k<a.anchors.length?k:0)},b);j&&j.stopPropagation()});e=a._unrotate||(a._unrotate=!e?function(j){j.clientX&&
+a.rotate(null)}:function(){t=c.selected;h()});if(b){this.element.bind("tabsshow",h);this.anchors.bind(c.event+".tabs",e);h()}else{clearTimeout(a.rotation);this.element.unbind("tabsshow",h);this.anchors.unbind(c.event+".tabs",e);delete this._rotate;delete this._unrotate}return this}})})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.widget.min.js
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.widget.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/minified/jquery.ui.widget.min.js	(revision 14585)
@@ -0,0 +1,15 @@
+/*!
+ * jQuery UI Widget 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)try{b(d).triggerHandler("remove")}catch(e){}k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(d){}});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=
+function(h){return!!b.data(h,a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):
+d;if(e&&d.charAt(0)==="_")return h;e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=
+b.extend(true,{},this.options,this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+
+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",
+c);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.accordion.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.accordion.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.accordion.css	(revision 14585)
@@ -0,0 +1,19 @@
+/*
+ * jQuery UI Accordion 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Accordion#theming
+ */
+/* IE/Win - Fix animation bug - #4615 */
+.ui-accordion { width: 100%; }
+.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
+.ui-accordion .ui-accordion-li-fix { display: inline; }
+.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
+.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
+.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
+.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
+.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
+.ui-accordion .ui-accordion-content-active { display: block; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.all.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.all.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.all.css	(revision 14585)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming
+ */
+@import "jquery.ui.base.css";
+@import "jquery.ui.theme.css";
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.autocomplete.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.autocomplete.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.autocomplete.css	(revision 14585)
@@ -0,0 +1,53 @@
+/*
+ * jQuery UI Autocomplete 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Autocomplete#theming
+ */
+.ui-autocomplete { position: absolute; cursor: default; }	
+
+/* workarounds */
+* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
+
+/*
+ * jQuery UI Menu 1.8.16
+ *
+ * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Menu#theming
+ */
+.ui-menu {
+	list-style:none;
+	padding: 2px;
+	margin: 0;
+	display:block;
+	float: left;
+}
+.ui-menu .ui-menu {
+	margin-top: -3px;
+}
+.ui-menu .ui-menu-item {
+	margin:0;
+	padding: 0;
+	zoom: 1;
+	float: left;
+	clear: left;
+	width: 100%;
+}
+.ui-menu .ui-menu-item a {
+	text-decoration:none;
+	display:block;
+	padding:.2em .4em;
+	line-height:1.5;
+	zoom:1;
+}
+.ui-menu .ui-menu-item a.ui-state-hover,
+.ui-menu .ui-menu-item a.ui-state-active {
+	font-weight: normal;
+	margin: -1px;
+}
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.base.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.base.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.base.css	(revision 14585)
@@ -0,0 +1,11 @@
+@import url("jquery.ui.core.css");
+@import url("jquery.ui.resizable.css");
+@import url("jquery.ui.selectable.css");
+@import url("jquery.ui.accordion.css");
+@import url("jquery.ui.autocomplete.css");
+@import url("jquery.ui.button.css");
+@import url("jquery.ui.dialog.css");
+@import url("jquery.ui.slider.css");
+@import url("jquery.ui.tabs.css");
+@import url("jquery.ui.datepicker.css");
+@import url("jquery.ui.progressbar.css");
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.button.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.button.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.button.css	(revision 14585)
@@ -0,0 +1,38 @@
+/*
+ * jQuery UI Button 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Button#theming
+ */
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.core.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.core.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.core.css	(revision 14585)
@@ -0,0 +1,41 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.datepicker.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.datepicker.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.datepicker.css	(revision 14585)
@@ -0,0 +1,68 @@
+/*
+ * jQuery UI Datepicker 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Datepicker#theming
+ */
+.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
+.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
+.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
+.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
+.ui-datepicker .ui-datepicker-prev { left:2px; }
+.ui-datepicker .ui-datepicker-next { right:2px; }
+.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
+.ui-datepicker .ui-datepicker-next-hover { right:1px; }
+.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
+.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
+.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
+.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
+.ui-datepicker select.ui-datepicker-month, 
+.ui-datepicker select.ui-datepicker-year { width: 49%;}
+.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
+.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
+.ui-datepicker td { border: 0; padding: 1px; }
+.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
+.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
+.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi { width:auto; }
+.ui-datepicker-multi .ui-datepicker-group { float:left; }
+.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
+.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
+.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
+.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
+.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
+.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
+
+/* RTL support */
+.ui-datepicker-rtl { direction: rtl; }
+.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
+.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group { float:right; }
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
+
+/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
+.ui-datepicker-cover {
+    display: none; /*sorry for IE5*/
+    display/**/: block; /*sorry for IE5*/
+    position: absolute; /*must have*/
+    z-index: -1; /*must have*/
+    filter: mask(); /*must have*/
+    top: -4px; /*must have*/
+    left: -4px; /*must have*/
+    width: 200px; /*must have*/
+    height: 200px; /*must have*/
+}
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.dialog.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.dialog.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.dialog.css	(revision 14585)
@@ -0,0 +1,21 @@
+/*
+ * jQuery UI Dialog 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Dialog#theming
+ */
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
+.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.progressbar.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.progressbar.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.progressbar.css	(revision 14585)
@@ -0,0 +1,11 @@
+/*
+ * jQuery UI Progressbar 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Progressbar#theming
+ */
+.ui-progressbar { height:2em; text-align: left; }
+.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.resizable.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.resizable.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.resizable.css	(revision 14585)
@@ -0,0 +1,20 @@
+/*
+ * jQuery UI Resizable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizable#theming
+ */
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; }
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.selectable.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.selectable.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.selectable.css	(revision 14585)
@@ -0,0 +1,10 @@
+/*
+ * jQuery UI Selectable 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Selectable#theming
+ */
+.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.slider.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.slider.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.slider.css	(revision 14585)
@@ -0,0 +1,24 @@
+/*
+ * jQuery UI Slider 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Slider#theming
+ */
+.ui-slider { position: relative; text-align: left; }
+.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
+.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
+
+.ui-slider-horizontal { height: .8em; }
+.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
+.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
+.ui-slider-horizontal .ui-slider-range-min { left: 0; }
+.ui-slider-horizontal .ui-slider-range-max { right: 0; }
+
+.ui-slider-vertical { width: .8em; height: 100px; }
+.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
+.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
+.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
+.ui-slider-vertical .ui-slider-range-max { top: 0; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.tabs.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.tabs.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.tabs.css	(revision 14585)
@@ -0,0 +1,18 @@
+/*
+ * jQuery UI Tabs 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Tabs#theming
+ */
+.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
+.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
+.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
+.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
+.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
+.ui-tabs .ui-tabs-hide { display: none !important; }
Index: tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.theme.css
===================================================================
--- tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/js/ui/theme/jquery.ui.theme.css	(revision 14585)
@@ -0,0 +1,247 @@
+/*
+ * jQuery UI CSS Framework 1.8.16
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Theming/API
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
+.ui-widget-content a { color: #222222/*{fcContent}*/; }
+.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
+.ui-widget-header a { color: #222222/*{fcHeader}*/; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
+.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
+.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
Index: tags/2.4.0RC3/themes/default/local_head.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/local_head.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/local_head.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+{if $load_css} 
+	<!--[if lt IE 7]>
+		<link rel="stylesheet" type="text/css" href="{$ROOT_URL}themes/default/fix-ie5-ie6.css">
+	<![endif]-->
+	<!--[if IE 7]>
+		<link rel="stylesheet" type="text/css" href="{$ROOT_URL}themes/default/fix-ie7.css">
+	<![endif]-->
+	{combine_css path="themes/default/print.css" order=-10}
+{/if}
Index: tags/2.4.0RC3/themes/default/print.css
===================================================================
--- tags/2.4.0RC3/themes/default/print.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/print.css	(revision 14585)
@@ -0,0 +1,16 @@
+@media print {
+#menubar, .content .navigationBar, .categoryActions, .content .calendarViews, .calendarBar,
+#imageToolBar, .navThumb, #addComment {
+	display: none;
+}
+
+BODY {
+	margin: 0;
+	color: #000;
+	background: #fff;
+}
+
+#theCategoryPage .content {
+	margin: 0 !important; 
+}
+}
Index: tags/2.4.0RC3/themes/default/s26/index.htm
===================================================================
--- tags/2.4.0RC3/themes/default/s26/index.htm	(revision 14585)
+++ tags/2.4.0RC3/themes/default/s26/index.htm	(revision 14585)
@@ -0,0 +1,1 @@
+Not allowed!
Index: tags/2.4.0RC3/themes/default/template/about.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/about.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/about.tpl	(revision 14585)
@@ -0,0 +1,24 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+  <div class="titrePage">
+    <ul class="categoryActions">
+    </ul>
+    <h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'About'|@translate}</h2>
+  </div>
+  
+  {include file='infos_errors.tpl'}
+  
+  <div id="piwigoAbout">
+  {$ABOUT_MESSAGE}
+  {if isset($THEME_ABOUT) }
+  <ul>
+   <li>{$THEME_ABOUT}</li>
+  </ul>
+  {/if}
+  {if not empty($about_msgs)}
+    {foreach from=$about_msgs item=elt}
+    {$elt}
+    {/foreach}
+  {/if}
+  </div>
+</div>
Index: tags/2.4.0RC3/themes/default/template/comment_list.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/comment_list.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/comment_list.tpl	(revision 14585)
@@ -0,0 +1,61 @@
+{if isset($comment_derivative_params)}
+{strip}{html_style}
+.commentElement .illustration{ldelim}
+	width: {$comment_derivative_params->max_width()+5}px
+}
+
+.content .commentElement .description{ldelim}
+	height: {$comment_derivative_params->max_height()+5}px
+}
+{/html_style}{/strip}
+{/if}
+<ul class="commentsList">
+{foreach from=$comments item=comment name=comment_loop}
+<li class="commentElement {if $smarty.foreach.comment_loop.index is odd}odd{else}even{/if}">
+	{if isset($comment.src_image)}
+	<div class="illustration">
+		<a href="{$comment.U_PICTURE}">
+		<img src="{$pwg->derivative_url($derivative_params, $comment.src_image)}" alt="{$comment.ALT}">
+		</a>
+	</div>
+	{/if}
+	<div class="description"{if isset($comment.IN_EDIT)} style="height:200px"{/if}>
+		{if isset($comment.U_DELETE) or isset($comment.U_VALIDATE) or isset($comment.U_EDIT)}
+		<div class="actions" style="float:right;font-size:90%">
+		{if isset($comment.U_DELETE)}
+			<a href="{$comment.U_DELETE}" onclick="return confirm('{'Are you sure?'|@translate|@escape:javascript}');">
+				{'Delete'|@translate}
+			</a>{if isset($comment.U_VALIDATE) or isset($comment.U_EDIT)} | {/if}
+		{/if}
+		{if isset($comment.U_EDIT) and !isset($comment.IN_EDIT)}
+			<a class="editComment" href="{$comment.U_EDIT}#edit_comment">
+				{'Edit'|@translate}
+			</a>{if isset($comment.U_VALIDATE)} | {/if}
+		{/if}
+		{if isset($comment.U_VALIDATE)}
+			<a href="{$comment.U_VALIDATE}">
+				{'Validate'|@translate}
+			</a>
+		{/if}&nbsp;
+		</div>
+		{/if}
+
+		<span class="commentAuthor">{$comment.AUTHOR}</span> - <span class="commentDate">{$comment.DATE}</span>
+		{if isset($comment.IN_EDIT)}
+		<a name="edit_comment"></a>
+		<form method="post" action="{$comment.U_EDIT}" id="editComment">
+			<p><label>{'Edit a comment'|@translate} :</label></p>
+			<p><textarea name="content" id="contenteditid" rows="5" cols="80">{$comment.CONTENT|@escape}</textarea></p>
+			<p><input type="hidden" name="key" value="{$comment.KEY}">
+				<input type="hidden" name="pwg_token" value="{$comment.PWG_TOKEN}">
+				<input type="hidden" name="image_id" value="{$comment.IMAGE_ID|@default:$current.id}">
+				<input type="submit" value="{'Submit'|@translate}">
+			</p>
+		</form>
+		{else}
+		<blockquote><div>{$comment.CONTENT}</div></blockquote>
+		{/if}
+	</div>
+</li>
+{/foreach}
+</ul>
Index: tags/2.4.0RC3/themes/default/template/comments.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/comments.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/comments.tpl	(revision 14585)
@@ -0,0 +1,78 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+<div class="titrePage">
+	<ul class="categoryActions">
+	</ul>
+	<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'User comments'|@translate}</h2>
+</div>
+
+{include file='infos_errors.tpl'}
+
+<form class="filter" action="{$F_ACTION}" method="get">
+
+  <fieldset>
+    <legend>{'Filter'|@translate}</legend>
+
+    <label>{'Keyword'|@translate}<input type="text" name="keyword" value="{$F_KEYWORD}"></label>
+
+    <label>{'Author'|@translate}<input type="text" name="author" value="{$F_AUTHOR}"></label>
+
+    <label>
+      {'Album'|@translate}
+      <select name="cat">
+        <option value="0">------------</option>
+        {html_options options=$categories selected=$categories_selected}
+      </select>
+    </label>
+
+    <label>
+      {'Since'|@translate}
+      <select name="since">
+        {html_options options=$since_options selected=$since_options_selected}
+      </select>
+    </label>
+
+  </fieldset>
+
+  <fieldset>
+
+    <legend>{'Display'|@translate}</legend>
+
+    <label>
+      {'Sort by'|@translate}
+      <select name="sort_by">
+        {html_options options=$sort_by_options selected=$sort_by_options_selected}
+      </select>
+    </label>
+
+    <label>
+      {'Sort order'|@translate}
+      <select name="sort_order">
+        {html_options options=$sort_order_options selected=$sort_order_options_selected}
+      </select>
+    </label>
+
+    <label>
+      {'Number of items'|@translate}
+      <select name="items_number">
+        {html_options options=$item_number_options selected=$item_number_options_selected}
+      </select>
+    </label>
+
+  </fieldset>
+
+  <p><input type="submit" value="{'Filter and display'|@translate}"></p>
+
+</form>
+
+{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+{if isset($comments)}
+<div id="comments">
+	{include file='comment_list.tpl' comment_derivative_params=$derivative_params}
+</div>
+{/if}
+
+</div> <!-- content -->
+
Index: tags/2.4.0RC3/themes/default/template/footer.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/footer.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/footer.tpl	(revision 14585)
@@ -0,0 +1,35 @@
+<div id="copyright">
+{if isset($debug.TIME)}
+	{'Page generated in'|@translate} {$debug.TIME} ({$debug.NB_QUERIES} {'SQL queries in'|@translate} {$debug.SQL_TIME}) -
+{/if}
+{*
+	Please, do not remove this copyright. If you really want to,
+			contact us on http://piwigo.org to find a solution on how
+			to show the origin of the script...
+*}
+	{'Powered by'|@translate}	<a href="{$PHPWG_URL}" class="Piwigo">Piwigo</a>
+	{$VERSION}
+	{if isset($CONTACT_MAIL)}
+	- {'Contact'|@translate}
+	<a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|@translate|@escape:url}">{'Webmaster'|@translate}</a>
+	{/if}
+	{if isset($TOGGLE_MOBILE_THEME_URL)}
+	- {'View in'|@translate} : <a href="{$TOGGLE_MOBILE_THEME_URL}">{'Mobile'|@translate}</a> | <b>{'Desktop'|@translate}</b>
+	{/if}
+
+{get_combined_scripts load='footer'}
+
+{if isset($footer_elements)}
+{foreach from=$footer_elements item=v}
+{$v}
+{/foreach}
+{/if}
+</div> {* copyright *}
+{if isset($debug.QUERIES_LIST)}
+<div id="debug">
+{$debug.QUERIES_LIST}
+</div>
+{/if}
+</div>{* the_page *}
+</body>
+</html>
Index: tags/2.4.0RC3/themes/default/template/header.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/header.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/header.tpl	(revision 14585)
@@ -0,0 +1,80 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
+<meta name="generator" content="Piwigo (aka PWG), see piwigo.org">
+{if isset($meta_ref) } 
+{if isset($INFO_AUTHOR)}
+<meta name="author" content="{$INFO_AUTHOR|@strip_tags:false|@replace:'"':' '}">
+{/if}
+{if isset($related_tags)}
+<meta name="keywords" content="{foreach from=$related_tags item=tag name=tag_loop}{if !$smarty.foreach.tag_loop.first}, {/if}{$tag.name}{/foreach}">
+{/if}
+{if isset($COMMENT_IMG)}
+<meta name="description" content="{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{else}
+<meta name="description" content="{$PAGE_TITLE}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{/if}
+{/if}
+
+{if (isset($REVERSE) and $REVERSE and $PAGE_TITLE == l10n('Home'))}
+<title>{$GALLERY_TITLE} | {$PAGE_TITLE}</title>{else}
+<title>{$PAGE_TITLE} | {$GALLERY_TITLE}</title>{/if}
+<link rel="shortcut icon" type="image/x-icon" href="{$ROOT_URL}{$themeconf.icon_dir}/favicon.ico">
+
+<link rel="start" title="{'Home'|@translate}" href="{$U_HOME}" >
+<link rel="search" title="{'Search'|@translate}" href="{$ROOT_URL}search.php" >
+{if isset($first.U_IMG)   }<link rel="first" title="{'First'|@translate}" href="{$first.U_IMG}" >{/if}
+{if isset($previous.U_IMG)}<link rel="prev" title="{'Previous'|@translate}" href="{$previous.U_IMG}" >{/if}
+{if isset($next.U_IMG)    }<link rel="next" title="{'Next'|@translate}" href="{$next.U_IMG}" >{/if}
+{if isset($last.U_IMG)    }<link rel="last" title="{'Last'|@translate}" href="{$last.U_IMG}" >{/if}
+{if isset($U_UP)          }<link rel="up" title="{'Thumbnails'|@translate}" href="{$U_UP}" >{/if}
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
+{/foreach}
+
+
+{if isset($U_PREFETCH)}<link rel="prefetch" href="{$U_PREFETCH}">{/if}
+{if isset($U_CANONICAL)}<link rel="canonical" href="{$U_CANONICAL}">{/if}
+
+{if not empty($page_refresh)    }<meta http-equiv="refresh" content="{$page_refresh.TIME};url={$page_refresh.U_REFRESH}">{/if}
+
+{get_combined_scripts load='header'}
+<!--[if lt IE 7]>
+<script type="text/javascript" src="{$ROOT_URL}themes/default/js/pngfix.js"></script>
+<![endif]-->
+
+{combine_script id="jquery" load="footer"}
+
+{if not empty($head_elements)}
+	{foreach from=$head_elements item=elt}{$elt}
+	{/foreach}
+{/if}
+
+</head>
+
+<body id="{$BODY_ID}">
+<div id="the_page">
+
+{if not empty($header_msgs)}
+<div class="header_msgs">
+	{foreach from=$header_msgs item=elt}
+	{$elt}<br>
+	{/foreach}
+</div>
+{/if}
+
+<div id="theHeader">{$PAGE_BANNER}</div>
+{if isset($theSwiftHeader)}{$theSwiftHeader}{/if}
+{if not empty($header_notes)}
+<div class="header_notes">
+	{foreach from=$header_notes item=elt}
+	<p>{$elt}</p>
+  	{/foreach}
+</div>
+{/if}
Index: tags/2.4.0RC3/themes/default/template/identification.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/identification.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/identification.tpl	(revision 14585)
@@ -0,0 +1,66 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+<div class="titrePage">
+	<ul class="categoryActions">
+	</ul>
+	<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Identification'|@translate}</h2>
+</div>
+
+{include file='infos_errors.tpl'}
+
+<form action="{$F_LOGIN_ACTION}" method="post" name="login_form" class="properties">
+  <fieldset>
+    <legend>{'Connection settings'|@translate}</legend>
+
+    <ul>
+      <li>
+        <span class="property">
+          <label for="username">{'Username'|@translate}</label>
+        </span>
+        <input tabindex="1" class="login" type="text" name="username" id="username" size="25" maxlength="40">
+      </li>
+
+      <li>
+        <span class="property">
+          <label for="password">{'Password'|@translate}</label>
+        </span>
+        <input tabindex="2" class="login" type="password" name="password" id="password" size="25" maxlength="25">
+      </li>
+
+      {if $authorize_remembering }
+      <li>
+        <span class="property">
+          <label for="remember_me">{'Auto login'|@translate}</label>
+        </span>
+        <input tabindex="3" type="checkbox" name="remember_me" id="remember_me" value="1">
+      </li>
+      {/if}
+    </ul>
+  </fieldset>
+
+  <p>
+    <input type="hidden" name="redirect" value="{$U_REDIRECT|@urlencode}">
+    <input tabindex="4" type="submit" name="login" value="{'Submit'|@translate}">
+  </p>
+
+	<p>
+{if isset($U_REGISTER)}
+		<a href="{$U_REGISTER}" title="{'Register'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-register">&nbsp;</span><span>{'Register'|@translate}</span>
+		</a>
+{/if}
+{if isset($U_LOST_PASSWORD)}
+		<a href="{$U_LOST_PASSWORD}" title="{'Forgot your password?'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-lost-password">&nbsp;</span><span>{'Forgot your password?'|@translate}</span>
+		</a>
+{/if}
+	</p>
+
+</form>
+
+<script type="text/javascript"><!--
+document.login_form.username.focus();
+//--></script>
+
+</div> <!-- content -->
Index: tags/2.4.0RC3/themes/default/template/include/autosize.inc.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/include/autosize.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/include/autosize.inc.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+{combine_script id='jquery.autogrow' load='async' require='jquery' path='themes/default/js/plugins/jquery.autogrow-textarea.js'}
+{* Auto size and auto grow textarea *}
+{footer_script require='jquery.autogrow'}{literal}
+jQuery(document).ready(function(){
+	jQuery('textarea').css('overflow-y', 'hidden');
+	// Auto size and auto grow for all text area
+	jQuery('textarea').autogrow();
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/themes/default/template/include/colorbox.inc.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/include/colorbox.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/include/colorbox.inc.tpl	(revision 14585)
@@ -0,0 +1,2 @@
+{combine_script id='jquery.colorbox' load='footer' require='jquery' path='themes/default/js/plugins/jquery.colorbox.min.js'}
+{combine_css path="themes/default/js/plugins/jquery.colorbox.css"}
Index: tags/2.4.0RC3/themes/default/template/include/datepicker.inc.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/include/datepicker.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/include/datepicker.inc.tpl	(revision 14585)
@@ -0,0 +1,18 @@
+{combine_script id='datepicker.js' load='footer' require='jquery.ui.datepicker' path='themes/default/js/datepicker.js'}
+
+{assign var="datepicker_language" value="themes/default/js/ui/i18n/jquery.ui.datepicker-`$lang_info.code`.js"}
+
+{if "PHPWG_ROOT_PATH"|@constant|@cat:$datepicker_language|@file_exists}
+{combine_script id="jquery.ui.datepicker-$lang_info.code" load='footer' path=$datepicker_language}
+{/if}
+
+{combine_css path="themes/default/js/ui/theme/jquery.ui.datepicker.css"}
+
+{footer_script require='jquery.ui.datepicker,datepicker.js'}
+function pwg_initialization_datepicker(day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date)
+{ldelim}
+  return pwg_common_initialization_datepicker(
+    "{$ROOT_URL}{$themeconf.icon_dir}/datepicker.png",
+    day, month, year, linked_date, checked_on_change, min_linked_date, max_linked_date);
+}
+{/footer_script}
Index: tags/2.4.0RC3/themes/default/template/include/resize.inc.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/include/resize.inc.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/include/resize.inc.tpl	(revision 14585)
@@ -0,0 +1,16 @@
+{* Resize possible *}
+{footer_script require='jquery.ui.resizable'}{literal}
+  jQuery().ready(function(){
+    // Resize possible for list
+    jQuery(".categoryList").resizable({
+      handles: "all",
+      animate: true,
+      animateDuration: "slow",
+      animateEasing: "swing",
+      preventDefault: true,
+      preserveCursor: true,
+      autoHide: true,
+      ghost: true
+    });
+  });
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/themes/default/template/index.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/index.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/index.tpl	(revision 14585)
@@ -0,0 +1,176 @@
+{$MENUBAR}
+{if !empty($PLUGIN_INDEX_CONTENT_BEFORE)}{$PLUGIN_INDEX_CONTENT_BEFORE}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+<div class="titrePage{if isset($chronology.TITLE)} calendarTitleBar{/if}">
+	<ul class="categoryActions">
+{if !empty($image_orders)}
+		<li>{strip}<a id="sortOrderLink" title="{'Sort order'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-sort">&nbsp;</span><span class="pwg-button-text">{'Sort order'|@translate}</span>
+		</a>
+		<div id="sortOrderBox" class="switchBox">
+			<div class="switchBoxTitle">{'Sort order'|@translate}</div>
+			{foreach from=$image_orders item=image_order name=loop}{if !$smarty.foreach.loop.first}<br>{/if}
+			{if $image_order.SELECTED}
+			<span>&#x2714; </span>{$image_order.DISPLAY}
+			{else}
+			<span style="visibility:hidden">&#x2714; </span><a href="{$image_order.URL}" rel="nofollow">{$image_order.DISPLAY}</a>
+			{/if}
+			{/foreach}
+		</div>
+		{footer_script require='jquery'}{literal}
+jQuery("#sortOrderLink").click(function() {
+	var elt = jQuery("#sortOrderBox");
+	elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
+		.css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
+		.toggle();
+});
+jQuery("#sortOrderBox").on("mouseleave", function() {
+	jQuery(this).hide();
+});
+		{/literal}{/footer_script}
+		{/strip}</li>
+{/if}
+{if !empty($image_derivatives)}
+		<li>{strip}<a id="derivativeSwitchLink" title="{'Photo sizes'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-sizes">&nbsp;</span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
+		</a>
+		<div id="derivativeSwitchBox" class="switchBox">
+			<div class="switchBoxTitle">{'Photo sizes'|@translate}</div>
+			{foreach from=$image_derivatives item=image_derivative name=loop}{if !$smarty.foreach.loop.first}<br>{/if}
+			{if $image_derivative.SELECTED}
+			<span>&#x2714; </span>{$image_derivative.DISPLAY}
+			{else}
+			<span style="visibility:hidden">&#x2714; </span><a href="{$image_derivative.URL}" rel="nofollow">{$image_derivative.DISPLAY}</a>
+			{/if}
+			{/foreach}
+		</div>
+		{footer_script require='jquery'}{literal}
+jQuery("#derivativeSwitchLink").click(function() {
+	var elt = jQuery("#derivativeSwitchBox");
+	elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
+		.css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
+		.toggle();
+});
+jQuery("#derivativeSwitchBox").on("mouseleave", function() {
+	jQuery(this).hide();
+});
+		{/literal}{/footer_script}
+		{/strip}</li>
+{/if}
+
+{if isset($favorite)}
+		<li><a href="{$favorite.U_FAVORITE}" title="{'delete all photos from your favorites'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-favorite-del">&nbsp;</span><span class="pwg-button-text">{'delete all photos from your favorites'|@translate}</span>
+		</a></li>
+{/if}
+{if isset($U_CADDIE)}
+		<li><a href="{$U_CADDIE}" title="{'Add to caddie'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-caddie-add">&nbsp;</span><span class="pwg-button-text">{'Caddie'|@translate}</span>
+		</a></li>
+{/if}
+{if isset($U_EDIT)}
+		<li><a href="{$U_EDIT}" title="{'Edit album'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-category-edit">&nbsp;</span><span class="pwg-button-text">{'Edit'|@translate}</span>
+		</a></li>
+{/if}
+{if isset($U_SEARCH_RULES)}
+		{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+		<li><a href="{$U_SEARCH_RULES}" onclick="popuphelp(this.href); return false;" title="{'Search rules'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-help">&nbsp;</span><span class="pwg-button-text">(?)</span>
+		</a></li>
+{/if}
+{if isset($U_SLIDESHOW)}
+		<li>{strip}<a href="{$U_SLIDESHOW}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-slideshow">&nbsp;</span><span class="pwg-button-text">{'slideshow'|@translate}</span>
+		</a>{/strip}</li>
+{/if}
+{if isset($U_MODE_FLAT)}
+		<li>{strip}<a href="{$U_MODE_FLAT}" title="{'display all photos in all sub-albums'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-category-view-flat">&nbsp;</span><span class="pwg-button-text">{'display all photos in all sub-albums'|@translate}</span>
+		</a>{/strip}</li>
+{/if}
+{if isset($U_MODE_NORMAL)}
+		<li>{strip}<a href="{$U_MODE_NORMAL}" title="{'return to normal view mode'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-category-view-normal">&nbsp;</span><span class="pwg-button-text">{'return to normal view mode'|@translate}</span>
+		</a>{/strip}</li>
+{/if}
+{if isset($U_MODE_POSTED)}
+		<li>{strip}<a href="{$U_MODE_POSTED}" title="{'display a calendar by posted date'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-calendar">&nbsp;</span><span class="pwg-button-text">{'Calendar'|@translate}</span>
+		</a>{/strip}</li>
+{/if}
+{if isset($U_MODE_CREATED)}
+		<li>{strip}<a href="{$U_MODE_CREATED}" title="{'display a calendar by creation date'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-camera-calendar">&nbsp;</span><span class="pwg-button-text">{'Calendar'|@translate}</span>
+		</a>{/strip}</li>
+{/if}
+{if !empty($PLUGIN_INDEX_ACTIONS)}{$PLUGIN_INDEX_ACTIONS}{/if}
+	</ul>
+
+<h2>{$TITLE}</h2>
+
+{if isset($chronology_views)}
+<div class="calendarViews">{'View'|@translate}:
+	<select onchange="document.location = this.options[this.selectedIndex].value;">
+		{foreach from=$chronology_views item=view}
+		<option value="{$view.VALUE}"{if $view.SELECTED} selected="selected"{/if}>{$view.CONTENT}</option>
+		{/foreach}
+	</select>
+</div>
+{/if}
+
+{if isset($chronology.TITLE)}
+<h2 class="calendarTitle">{$chronology.TITLE}</h2>
+{/if}
+
+</div>{* <!-- titrePage --> *}
+
+{if isset($errors) or not empty($infos)}
+{include file='infos_errors.tpl'}
+{/if}
+{if !empty($PLUGIN_INDEX_CONTENT_BEGIN)}{$PLUGIN_INDEX_CONTENT_BEGIN}{/if}
+
+{if !empty($category_search_results)}
+<div style="font-size:16px;margin:10px 16px">{'Album results for'|@translate} <strong>{$QUERY_SEARCH}</strong> :
+	<em><strong>
+	{foreach from=$category_search_results item=res name=res_loop}
+	{if !$smarty.foreach.res_loop.first} &mdash; {/if}
+	{$res}
+	{/foreach}
+	</strong></em>
+</div>
+{/if}
+
+{if !empty($tag_search_results)}
+<div style="font-size:16px;margin:10px 16px">{'Tag results for'|@translate} <strong>{$QUERY_SEARCH}</strong> :
+	<em><strong>
+	{foreach from=$tag_search_results item=res name=res_loop}
+	{if !$smarty.foreach.res_loop.first} &mdash; {/if}
+	{$res}
+	{/foreach}
+	</strong></em>
+</div>
+{/if}
+
+{if isset($FILE_CHRONOLOGY_VIEW)}
+{include file=$FILE_CHRONOLOGY_VIEW}
+{/if}
+
+{if !empty($CONTENT_DESCRIPTION)}
+<div class="additional_info">
+	{$CONTENT_DESCRIPTION}
+</div>
+{/if}
+
+{if !empty($CATEGORIES)}{$CATEGORIES}{/if}
+{if !empty($THUMBNAILS)}
+<ul class="thumbnails" id="thumbnails">
+{$THUMBNAILS}
+</ul>
+{/if}
+
+{if !empty($navbar)}{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+
+{if !empty($PLUGIN_INDEX_CONTENT_END)}{$PLUGIN_INDEX_CONTENT_END}{/if}
+</div>{* <!-- content --> *}
+{if !empty($PLUGIN_INDEX_CONTENT_AFTER)}{$PLUGIN_INDEX_CONTENT_AFTER}{/if}
Index: tags/2.4.0RC3/themes/default/template/infos_errors.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/infos_errors.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/infos_errors.tpl	(revision 14585)
@@ -0,0 +1,19 @@
+{if isset($errors) }
+<div class="errors">
+  <ul>
+    {foreach from=$errors item=error}
+    <li>{$error}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
+
+{if not empty($infos)}
+<div class="infos">
+  <ul>
+    {foreach from=$infos item=info}
+    <li>{$info}</li>
+    {/foreach}
+  </ul>
+</div>
+{/if}
Index: tags/2.4.0RC3/themes/default/template/mail/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/cat_group_info.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/cat_group_info.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/cat_group_info.tpl	(revision 14585)
@@ -0,0 +1,8 @@
+<div id="cat_group_info">
+<h2>{'Informations'|@translate}</h2>
+<p>{$IMG_URL}</p>
+<p>{'Hello,'|@translate}</p>
+<p>{'Discover album:'|@translate} <a href="{$LINK}">{$CAT_NAME}</a></p>
+<p>{$CPL_CONTENT}</p>
+<p>{'See you soon.'|@translate}</p>
+</div>
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/footer.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/footer.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/footer.tpl	(revision 14585)
@@ -0,0 +1,22 @@
+</div> <!-- content -->
+<div id="copyright">
+<hr>
+  {'Sent by'|@translate}
+  <a href="{$GALLERY_URL}">{$GALLERY_TITLE}</a>
+
+ {* Please, do not remove this copyright. If you really want to,
+      contact us on http://piwigo.org to find a solution on how
+      to show the origin of the script...*}
+  - {'Powered by'|@translate}
+  <a href="http://piwigo.org" class="Piwigo">
+  <span class="Piwigo">Piwigo</span></a>
+  {$VERSION}
+
+  - {'Contact'|@translate}
+  <a href="mailto:{$MAIL}?subject={$TITLE_MAIL}">{'Webmaster'|@translate}</a>
+
+</div> <!-- copyright -->
+</div> <!-- the_page -->
+
+</body>
+</html>
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/global-mail-css.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/global-mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/global-mail-css.tpl	(revision 14585)
@@ -0,0 +1,11 @@
+/* Global mail css */
+
+body {ldelim} font-family: Univers, Helvetica, Optima; font-size:12px; margin:0px; padding:0px; }
+#the_page {ldelim} margin:0px; padding:0px; text-align:left;}
+#content {ldelim} margin:0px; padding:30px 0px 0px 30px; width:732px;}
+hr {ldelim} width:632px; margin-left:0;}
+#copyright {ldelim} font-size:10px; margin:0px; padding:48px 0px 32px 62px;}
+.PWG {ldelim} font-family:verdana, sans-serif !important; font-size:0.9em; font-weight:normal; letter-spacing:0px;}
+h2 {ldelim} padding:7px 15px; width:617px; font-weight:bold;}
+img {ldelim} margin:16px; border:16px solid #aaa; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} padding: 15px; border: 1px solid yellow; -moz-border-radius: 4px; border-radius: 4px 4px; }
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/header.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/header.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/header.tpl	(revision 14585)
@@ -0,0 +1,17 @@
+-----={$BOUNDARY_KEY}
+Content-Type: {$CONTENT_TYPE}; charset="{$CONTENT_ENCODING}";
+Content-Transfer-Encoding: 8bit
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<title>Piwigo Mail</title>
+<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
+<style><!-- /* Mini style for mails */
+{if isset($GLOBAL_MAIL_CSS)}{$GLOBAL_MAIL_CSS}{/if}
+{if isset($MAIL_CSS)}{$MAIL_CSS}{/if}
+--></style>
+</head>
+<body>
+<div id="the_page">
+<div id="content" class="content">
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/template/mail/text/html/notification_by_mail.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/html/notification_by_mail.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/html/notification_by_mail.tpl	(revision 14585)
@@ -0,0 +1,56 @@
+<div id="nbm_message">
+<h2>{'Notification'|@translate}</h2>
+<p>{'Hello'|@translate} {$USERNAME},</p>
+
+{if isset($subscribe_by_admin)}
+<p>{'The webmaster has subscribed you to receiving notifications by mail.'|@translate}</p>
+{/if}
+{if isset($subscribe_by_himself)}
+<p>{'You have subscribed to receiving notifications by mail.'|@translate}</p>
+{/if}
+{if isset($unsubscribe_by_admin)}
+<p>{'The webmaster has unsubscribed you from receiving notifications by mail.'|@translate}</p>
+{/if}
+{if isset($unsubscribe_by_himself)}
+<p>{'You have unsubscribed from receiving notifications by mail.'|@translate}</p>
+{/if}
+{if isset($content_new_elements_single)}
+<p>{'New photos were added'|@translate} {'on'|@translate} {$content_new_elements_single.DATE_SINGLE}.</p>
+{/if}
+{if isset($content_new_elements_between)}
+<p>{'New photos were added'|@translate} {'between'|@translate} {$content_new_elements_between.DATE_BETWEEN_1} {'and'|@translate} {$content_new_elements_between.DATE_BETWEEN_2}.</p>
+{/if}
+
+{if not empty($global_new_lines)}
+<ul id="nbm_new_line">
+{foreach from=$global_new_lines item=line}
+  <li>{$line}</li>
+{/foreach}
+</ul>
+{/if}
+
+{if not empty($custom_mail_content)}
+<p>{$custom_mail_content}</p>
+{/if}
+
+{if not empty($GOTO_GALLERY_TITLE)}
+<p>{'Go to'|@translate} <a href="{$GOTO_GALLERY_URL}">{$GOTO_GALLERY_TITLE}</a>.</p>
+{/if}
+<p>{'See you soon,'|@translate}</p>
+<p style="text-align:center">{$SEND_AS_NAME}</p>
+<p>
+<br><hr>
+{'To unsubscribe'|@translate}{', click on'|@translate} <a href="{$UNSUBSCRIBE_LINK}">{$UNSUBSCRIBE_LINK}</a><br>
+{'To subscribe'|@translate}{', click on'|@translate} <a href="{$SUBSCRIBE_LINK}">{$SUBSCRIBE_LINK}</a><br>
+{'If you encounter problems or have any question, please send a message to'|@translate} <a href="mailto:{$CONTACT_EMAIL}?subject={'[NBM] Problems or questions'|@translate}">{$CONTACT_EMAIL}</a><br>
+<hr><br>
+</p>
+{if not empty($recent_posts)}
+</div>
+<div id="nbm_recent_post">
+  {foreach from=$recent_posts item=recent_post }
+  <h2>{$recent_post.TITLE}</h2>
+  {$recent_post.HTML_DATA}
+  {/foreach}
+{/if}
+</div>
Index: tags/2.4.0RC3/themes/default/template/mail/text/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/template/mail/text/plain/cat_group_info.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/plain/cat_group_info.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/plain/cat_group_info.tpl	(revision 14585)
@@ -0,0 +1,8 @@
+{'Hello,'|@translate}
+
+{'Discover album:'|@translate} {$CAT_NAME}
+{$LINK}
+
+{$CPL_CONTENT}
+
+{'See you soon.'|@translate}
Index: tags/2.4.0RC3/themes/default/template/mail/text/plain/footer.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/plain/footer.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/plain/footer.tpl	(revision 14585)
@@ -0,0 +1,5 @@
+
+-- 
+{'Sent by'|@translate} "{$GALLERY_TITLE}" {$GALLERY_URL}
+{'Contact'|@translate} {$MAIL}
+{'Powered by'|@translate} Piwigo {$VERSION}
Index: tags/2.4.0RC3/themes/default/template/mail/text/plain/header.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/plain/header.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/plain/header.tpl	(revision 14585)
@@ -0,0 +1,5 @@
+-----={$BOUNDARY_KEY}
+Content-Type: {$CONTENT_TYPE}; charset="{$CONTENT_ENCODING}";
+Content-Transfer-Encoding: 8bit{literal}
+
+{/literal}{*note that there must be an empty line to separate the mime headers*}
Index: tags/2.4.0RC3/themes/default/template/mail/text/plain/index.php
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/plain/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/plain/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/default/template/mail/text/plain/notification_by_mail.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mail/text/plain/notification_by_mail.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mail/text/plain/notification_by_mail.tpl	(revision 14585)
@@ -0,0 +1,41 @@
+{'Hello'|@translate} {$USERNAME},
+
+{if isset($subscribe_by_admin)}
+{'The webmaster has subscribed you to receiving notifications by mail.'|@translate}
+{/if}
+{if isset($subscribe_by_himself)}
+{'You have subscribed to receiving notifications by mail.'|@translate}
+{/if}
+{if isset($unsubscribe_by_admin)}
+{'The webmaster has unsubscribed you from receiving notifications by mail.'|@translate}
+{/if}
+{if isset($unsubscribe_by_himself)}
+{'You have unsubscribed from receiving notifications by mail.'|@translate}
+{/if}
+{if isset($content_new_elements_single)}
+{'New photos were added'|@translate} {'on'|@translate} {$content_new_elements_single.DATE_SINGLE}.
+{/if}
+{if isset($content_new_elements_between)}
+{'New photos were added'|@translate} {'between'|@translate} {$content_new_elements_between.DATE_BETWEEN_1} {'and'|@translate} {$content_new_elements_between.DATE_BETWEEN_2}.
+{/if}
+{if not empty($global_new_lines)}
+{foreach from=$global_new_lines item=line}
+  o {$line}
+{/foreach}
+{/if}
+{if not empty($custom_mail_content)}
+{$custom_mail_content}
+{/if}
+{if not empty($GOTO_GALLERY_TITLE)}
+.{$GOTO_GALLERY_TITLE} {$GOTO_GALLERY_URL} .
+{/if}
+
+{'See you soon,'|@translate}
+  {$SEND_AS_NAME}
+
+______________________________________________________________________________
+
+{'To unsubscribe'|@translate}{', click on'|@translate} {$UNSUBSCRIBE_LINK}
+{'To subscribe'|@translate}{', click on'|@translate} {$SUBSCRIBE_LINK}
+{'If you encounter problems or have any question, please send a message to'|@translate} {$CONTACT_EMAIL}
+______________________________________________________________________________
Index: tags/2.4.0RC3/themes/default/template/mainpage_categories.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/mainpage_categories.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/mainpage_categories.tpl	(revision 14585)
@@ -0,0 +1,39 @@
+{strip}{html_style}
+.thumbnailCategory .illustration{ldelim}
+	width: {$derivative_params->max_width()+5}px;
+}
+
+.content .thumbnailCategory .description{ldelim}
+	height: {$derivative_params->max_height()+5}px;
+}
+{/html_style}{/strip}
+<ul class="thumbnailCategories">
+{foreach from=$category_thumbnails item=cat name=cat_loop}
+	<li class="{if $smarty.foreach.comment_loop.index is odd}odd{else}even{/if}">
+		<div class="thumbnailCategory">
+			<div class="illustration">
+			<a href="{$cat.URL}">
+				<img src="{$pwg->derivative_url($derivative_params, $cat.representative.src_image)}" alt="{$cat.TN_ALT}" title="{$cat.NAME|@replace:'"':' '|@strip_tags:false} - {'display this album'|@translate}">
+			</a>
+			</div>
+			<div class="description">
+				<h3>
+					<a href="{$cat.URL}">{$cat.NAME}</a>
+					{if !empty($cat.icon_ts)}
+					<img title="{$cat.icon_ts.TITLE}" src="{$ROOT_URL}{$themeconf.icon_dir}/recent{if $cat.icon_ts.IS_CHILD_DATE}_by_child{/if}.png" alt="(!)">
+					{/if}
+				</h3>
+		<div class="text">
+				{if isset($cat.INFO_DATES) }
+				<p class="dates">{$cat.INFO_DATES}</p>
+				{/if}
+				<p class="Nb_images">{$cat.CAPTION_NB_IMAGES}</p>
+				{if not empty($cat.DESCRIPTION)}
+				<p>{$cat.DESCRIPTION}</p>
+				{/if}
+		</div>
+			</div>
+		</div>
+	</li>
+{/foreach}
+</ul>
Index: tags/2.4.0RC3/themes/default/template/menubar.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar.tpl	(revision 14585)
@@ -0,0 +1,13 @@
+{if !empty($blocks) }
+<div id="menubar">
+	{foreach from=$blocks key=id item=block}
+	<dl id="{$id}">
+		{if not empty($block->template)}
+		{include file=$block->template|@get_extent:$id }
+		{else}
+		{$block->raw_content}
+		{/if}
+	</dl>
+	{/foreach}
+</div><div id="menuSwitcher"></div>
+{/if}
Index: tags/2.4.0RC3/themes/default/template/menubar_categories.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_categories.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_categories.tpl	(revision 14585)
@@ -0,0 +1,32 @@
+<dt>
+	{if isset($U_START_FILTER)}
+	<a href="{$U_START_FILTER}" class="pwg-state-default pwg-button menubarFilter" title="{'display only recently posted photos'|@translate}" rel="nofollow"><span class="pwg-icon pwg-icon-filter"> </span></a>
+	{/if}
+	{if isset($U_STOP_FILTER)}
+	<a href="{$U_STOP_FILTER}" class="pwg-state-default pwg-button menubarFilter" title="{'return to the display of all photos'|@translate}"><span class="pwg-icon pwg-icon-filter-del"> </span></a>
+	{/if}
+	<a href="{$block->data.U_CATEGORIES}">{'Albums'|@translate}</a>
+</dt>
+<dd>
+{assign var='ref_level' value=0}
+{foreach from=$block->data.MENU_CATEGORIES item=cat}
+  {if $cat.LEVEL > $ref_level}
+  <ul>
+  {else}
+    </li>
+    {'</ul></li>'|@str_repeat:$ref_level-$cat.LEVEL}
+  {/if}
+    <li {if $cat.SELECTED}class="selected"{/if}>
+      <a href="{$cat.URL}" {if $cat.IS_UPPERCAT}rel="up"{/if} title="{$cat.TITLE}">{$cat.NAME}</a>
+      {if $cat.count_images > 0}
+      <span class="{if $cat.nb_images > 0}menuInfoCat{else}menuInfoCatByChild{/if}" title="{$cat.TITLE}">[{$cat.count_images}]</span>
+      {/if}
+      {if !empty($cat.icon_ts)}
+      <img title="{$cat.icon_ts.TITLE}" src="{$ROOT_URL}{$themeconf.icon_dir}/recent{if $cat.icon_ts.IS_CHILD_DATE}_by_child{/if}.png" class="icon" alt="(!)">
+      {/if}
+  {assign var='ref_level' value=$cat.LEVEL}
+{/foreach}
+{'</li></ul>'|@str_repeat:$ref_level}
+
+	<p class="totalImages">{$pwg->l10n_dec('%d photo', '%d photos', $block->data.NB_PICTURE)}</p>
+</dd>
Index: tags/2.4.0RC3/themes/default/template/menubar_identification.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_identification.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_identification.tpl	(revision 14585)
@@ -0,0 +1,64 @@
+<dt>{'Identification'|@translate}</dt>
+<dd>
+{strip}
+	{if isset($USERNAME)}
+	<p>{'Hello'|@translate} {$USERNAME} !</p>
+	{/if}
+	<ul>
+	{if isset($U_REGISTER)}
+	<li><a href="{$U_REGISTER}" title="{'Create a new account'|@translate}" rel="nofollow">{'Register'|@translate}</a></li>
+	{/if}
+	{if isset($U_LOGIN)}
+	<li><a href="{$U_LOGIN}" rel="nofollow">{'Login'|@translate}</a></li>
+	{/if}
+	{if isset($U_LOGOUT)}
+	<li><a href="{$U_LOGOUT}">{'Logout'|@translate}</a></li>
+	{/if}
+	{if isset($U_PROFILE)}
+	<li><a href="{$U_PROFILE}" title="{'customize the appareance of the gallery'|@translate}">{'Customize'|@translate}</a></li>
+	{/if}
+	{if isset($U_ADMIN)}
+	<li><a href="{$U_ADMIN}" title="{'available for administrators only'|@translate}">{'Administration'|@translate}</a></li>
+	{/if}
+	</ul>
+{/strip}
+	{if isset($U_LOGIN)}
+{strip}
+	<form method="post" action="{$U_LOGIN}" id="quickconnect">
+	<fieldset>
+	<legend>{'Quick connect'|@translate}</legend>
+	<div>
+	<label for="username">{'Username'|@translate}</label><br>
+	<input type="text" name="username" id="username" value="" style="width:99%">
+	</div>
+
+	<div><label for="password">{'Password'|@translate}</label><br>
+	<input type="password" name="password" id="password" style="width:99%">
+	</div>
+
+	{if $AUTHORIZE_REMEMBERING}
+	<div><label for="remember_me">
+	<input type="checkbox" name="remember_me" id="remember_me" value="1"> {'Auto login'|@translate}
+	</label></div>
+	{/if}
+
+	<div>
+	<input type="hidden" name="redirect" value="{$smarty.server.REQUEST_URI|@urlencode}">
+	<input type="submit" name="login" value="{'Submit'|@translate}">
+	<span class="categoryActions">
+{if isset($U_REGISTER)}
+		<a href="{$U_REGISTER}" title="{'Create a new account'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-register"> </span>
+		</a>
+{/if}
+		<a href="{$U_LOST_PASSWORD}" title="{'Forgot your password?'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-lost-password"> </span>
+		</a>
+	</span>
+	</div>
+
+	</fieldset>
+	</form>
+{/strip}
+	{/if}
+</dd>
Index: tags/2.4.0RC3/themes/default/template/menubar_links.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_links.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_links.tpl	(revision 14585)
@@ -0,0 +1,12 @@
+<dt>{'Links'|@translate}</dt>
+<dd>
+	<ul>{strip}
+		{foreach from=$block->data item=link}
+			<li>
+				<a href="{$link.URL}" class="external"{if isset($link.new_window)} onclick="window.open(this.href, '{$link.new_window.NAME}','{$link.new_window.FEATURES}'); return false;"{/if}>
+				{$link.LABEL}
+				</a>
+			</li>
+		{/foreach}
+	{/strip}</ul>
+</dd>
Index: tags/2.4.0RC3/themes/default/template/menubar_menu.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_menu.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_menu.tpl	(revision 14585)
@@ -0,0 +1,18 @@
+<dt>{'Menu'|@translate}</dt>
+<dd>
+{if isset($block->data.qsearch) and  $block->data.qsearch==true}
+	<form action="{$ROOT_URL}qsearch.php" method="get" id="quicksearch" onsubmit="return this.q.value!='' && this.q.value!=qsearch_prompt;">
+		<p style="margin:0;padding:0"{*this <p> is for html validation only - does not affect positioning*}>
+			<input type="text" name="q" id="qsearchInput" onfocus="if (value==qsearch_prompt) value='';" onblur="if (value=='') value=qsearch_prompt;" style="width:90%">
+		</p>
+	</form>
+	<script type="text/javascript">var qsearch_prompt="{'Quick search'|@translate|@escape:'javascript'}"; document.getElementById('qsearchInput').value=qsearch_prompt;</script>
+{/if}
+	<ul>{strip}
+	{foreach from=$block->data item=link}
+		{if is_array($link)}
+			<li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a></li>
+		{/if}
+	{/foreach}
+	{/strip}</ul>
+</dd>
Index: tags/2.4.0RC3/themes/default/template/menubar_specials.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_specials.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_specials.tpl	(revision 14585)
@@ -0,0 +1,8 @@
+<dt>{'Specials'|@translate}</dt>
+<dd>
+	<ul>{strip}
+		{foreach from=$block->data item=link}
+		<li><a href="{$link.URL}" title="{$link.TITLE}"{if isset($link.REL)} {$link.REL}{/if}>{$link.NAME}</a></li>
+		{/foreach}
+	{/strip}</ul>
+</dd>
Index: tags/2.4.0RC3/themes/default/template/menubar_tags.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/menubar_tags.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/menubar_tags.tpl	(revision 14585)
@@ -0,0 +1,16 @@
+<dt>{'Related tags'|@translate}</dt>
+<dd>
+	<div id="menuTagCloud">
+		{foreach from=$block->data item=tag}
+		<span>{strip}
+			<a class="tagLevel{$tag.level}" href=
+			{if isset($tag.U_ADD)}
+				"{$tag.U_ADD}" title="{$pwg->l10n_dec('%d photo is also linked to current tags', '%d photos are also linked to current tags', $tag.counter)}" rel="nofollow">+
+			{else}
+				"{$tag.URL}" title="{'display photos linked to this tag'|@translate}">
+			{/if}
+				{$tag.name}</a></span>{/strip}
+{* ABOVE there should be no space between text, </a> and </span> elements to avoid IE8 bug https://connect.microsoft.com/IE/feedback/ViewFeedback.aspx?FeedbackID=366567 *}
+		{/foreach}
+	</div>
+</dd>
Index: tags/2.4.0RC3/themes/default/template/month_calendar.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/month_calendar.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/month_calendar.tpl	(revision 14585)
@@ -0,0 +1,86 @@
+
+{if !empty($chronology_navigation_bars) }
+{foreach from=$chronology_navigation_bars item=bar}
+<div class="calendarBar">
+	{if isset($bar.previous)}
+		<div style="float:left">&laquo; <a href="{$bar.previous.URL}">{$bar.previous.LABEL}</a></div>
+	{/if}
+	{if isset($bar.next)}
+		<div style="float:right"><a href="{$bar.next.URL}">{$bar.next.LABEL}</a> &raquo;</div>
+	{/if}
+	{if empty($bar.items)}
+		&nbsp;
+	{else}
+		{foreach from=$bar.items item=item}
+		<span class="calItem{if !isset($item.URL)}Empty{/if}" {if isset($item.NB_IMAGES)}title="{$pwg->l10n_dec('%d photo', '%d photos', $item.NB_IMAGES)}"{/if}>
+		{if isset($item.URL)}
+		<a href="{$item.URL}">{$item.LABEL}</a>
+		{else}
+		{$item.LABEL}
+		{/if}
+		</span>
+		{/foreach}
+	{/if}
+</div>
+{/foreach}
+{/if}
+
+{if !empty($chronology_calendar.calendar_bars) }
+{foreach from=$chronology_calendar.calendar_bars item=bar}
+<div class="calendarCalBar">
+	<span class="calCalHead"><a href="{$bar.U_HEAD}">{$bar.HEAD_LABEL}</a>  ({$bar.NB_IMAGES})</span><br>
+	{foreach from=$bar.items item=item}
+	<span class="calCal{if !isset($item.URL)}Empty{/if}">
+	{if isset($item.URL)}
+	<a href="{$item.URL}">{$item.LABEL}</a>
+	{else}
+	{$item.LABEL}
+	{/if}
+	{if isset($item.NB_IMAGES)}({$item.NB_IMAGES}){/if}
+	</span>
+	{/foreach}
+</div>
+{/foreach}
+{/if}
+
+{if isset($chronology_calendar.month_view) }
+<table class="calMonth">
+ <thead>
+ <tr>
+ {foreach from=$chronology_calendar.month_view.wday_labels item=wday}
+	<th>{$wday}</th>
+ {/foreach}
+ </tr>
+ </thead>
+{html_head} {*add the style to html head for strict standard compliance*}
+<style type="text/css">
+TABLE.calMonth TBODY TD, TABLE.calMonth TBODY TD DIV.calImg {ldelim}
+  width:{$chronology_calendar.month_view.CELL_WIDTH}px;height:{$chronology_calendar.month_view.CELL_HEIGHT}px;
+}
+</style>
+{/html_head}
+ {foreach from=$chronology_calendar.month_view.weeks item=week}
+ <tr>
+ 	{foreach from=$week item=day}
+ 	{if !empty($day)}
+ 		{if isset($day.IMAGE)}
+ 			<td class="calDayCellFull">
+	 			<div class="calBackDate">{$day.DAY}</div><div class="calForeDate">{$day.DAY}</div>
+	 			<div class="calImg">
+					<a href="{$day.U_IMG_LINK}">
+			  			<img style="{$day.IMAGE_STYLE}" src="{$day.IMAGE}" alt="{$day.IMAGE_ALT}" title="{$pwg->l10n_dec('%d photo','%d photos', $day.NB_ELEMENTS)}">
+					</a>
+				</div>
+ 		{else}
+ 			<td class="calDayCellEmpty">{$day.DAY}
+ 		{/if}
+ 	{else}{*blank cell first or last row only*}
+ 		<td>
+ 	{/if}
+ 	</td>
+ 	{/foreach} {*day in week*}
+ </tr>
+ {/foreach}  {*week in month*}
+</table>
+{/if}
+
Index: tags/2.4.0RC3/themes/default/template/navigation_bar.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/navigation_bar.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/navigation_bar.tpl	(revision 14585)
@@ -0,0 +1,28 @@
+<div class="navigationBar">
+  {if isset($navbar.URL_FIRST)}
+  <a href="{$navbar.URL_FIRST}" rel="first">{'First'|@translate}</a> |
+  <a href="{$navbar.URL_PREV}" rel="prev">{'Previous'|@translate}</a> |
+  {else}
+  {'First'|@translate} |
+  {'Previous'|@translate} |
+  {/if}
+
+  {assign var='prev_page' value=0}
+  {foreach from=$navbar.pages key=page item=url}
+    {if $page > $prev_page+1}...{/if}
+    {if $page == $navbar.CURRENT_PAGE}
+    <span class="pageNumberSelected">{$page}</span>
+    {else}
+    <a href="{$url}">{$page}</a>
+    {/if}
+    {assign var='prev_page' value=$page}
+  {/foreach}
+
+  {if isset($navbar.URL_NEXT)}
+  | <a href="{$navbar.URL_NEXT}" rel="next">{'Next'|@translate}</a>
+  | <a href="{$navbar.URL_LAST}" rel="last">{'Last'|@translate}</a>
+  {else}
+  | {'Next'|@translate}
+  | {'Last'|@translate}
+  {/if}
+</div>
Index: tags/2.4.0RC3/themes/default/template/nbm.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/nbm.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/nbm.tpl	(revision 14585)
@@ -0,0 +1,11 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content">
+	<div class="titrePage">
+		<ul class="categoryActions">
+		</ul>
+		<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Notification'|@translate}</h2>
+	</div>
+
+{include file='infos_errors.tpl'}
+
+</div>
Index: tags/2.4.0RC3/themes/default/template/no_photo_yet.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/no_photo_yet.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/no_photo_yet.tpl	(revision 14585)
@@ -0,0 +1,154 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="themes/default/theme.css">
+<title>Piwigo, {'Welcome'|@translate}</title>
+{literal}
+<style type="text/css">
+body {
+margin: 0;
+padding: 0;
+background-color:#f9f9f9;
+}
+
+P {text-align:center;}
+TD {color:#888; letter-spacing:1px;}
+
+#global {
+position:absolute;
+left: 50%;
+top: 50%;
+width: 700px;
+height: 400px;
+margin-top: -200px; /* height half */
+margin-left: -350px; /* width half */
+
+background-color: #f1f1f1;
+border:2px solid #dddddd;
+}
+
+#noPhotoWelcome {font-size:25px; color:#555;text-align:center; letter-spacing:1px; margin-top:30px;}
+.bigButton {}
+
+.bigButton {text-align:center; margin-top:120px;}
+
+.bigButton a {
+    background-color:#666;
+    padding:10px;
+    text-decoration:none;
+    margin:0px 5px 0px 5px;
+    -moz-border-radius:6px;
+    -webkit-border-radius:6px;
+    color:#fff;
+    font-size:25px;
+    letter-spacing:2px;
+    padding:20px;
+}
+
+.bigButton a:hover {
+    background-color:#ff7700;
+    outline:none;
+    color:#fff;
+    border:none;
+}
+
+#deactivate {
+    position:absolute;
+    bottom:10px;
+    text-align:center;
+    width:100%;
+
+    font-style:normal;
+    font-size:1.0em;
+}
+
+.submit {font-size:1.0em; letter-spacing:2px; font-weight:normal;}
+
+#deactivate A {
+    text-decoration:none;
+    border:none;
+    color:#f70;
+}
+
+#deactivate A:hover {
+  border-bottom:1px dotted #f70;
+}
+
+#quickconnect {
+    margin:0 auto;
+    margin-top:60px;
+    width:300px;
+    color:#555;
+    font-size:14px;
+    letter-spacing:1px;
+}
+
+#quickconnect input[type="text"], #quickconnect input[type="password"] {
+  width:300px;
+  color:#555;
+  font-size:20px;
+  margin-top:3px;
+  background-color:#ddd;
+  border:2px solid #ccc;
+  -moz-border-radius:5px;
+  padding:2px;
+
+}
+
+#quickconnect input[type="text"]:focus, #quickconnect input[type="password"]:focus {
+  background-color:#fff;
+  border:2px solid #ff7700;
+}
+
+#quickconnect input[type="submit"] {
+  font-size:14px;
+  font-weight:bold;
+  letter-spacing:2px;
+  border:none;
+  background-color:#666666;
+  color:#fff;
+  padding:5px;
+  -moz-border-radius:5px;
+}
+
+#quickconnect input[type="submit"]:hover {
+  background-color:#ff7700;
+  color:white;
+}
+</style>
+{/literal}
+
+</head>
+
+<body>
+<div id="global">
+
+{if $step == 1}
+<p id="noPhotoWelcome">{'Welcome to your Piwigo photo gallery!'|@translate}</p>
+
+<form method="post" action="{$U_LOGIN}" id="quickconnect">
+{'Username'|@translate}
+<br><input type="text" name="username">
+<br>
+<br>{'Password'|@translate}
+<br><input type="password" name="password">
+
+<p><input class="submit" type="submit" name="login" value="{'Login'|@translate}"></p>
+
+</form>
+<div id="deactivate"><a href="{$deactivate_url}">{'... or browse your empty gallery'|@translate}</a></div>
+
+
+{else}
+<p id="noPhotoWelcome">{$intro}</p>
+<div class="bigButton"><a href="{$next_step_url}">{'I want to add photos'|@translate}</a></div>
+<div id="deactivate"><a href="{$deactivate_url}">{'... or please deactivate this message, I will find my way by myself'|@translate}</a></div>
+{/if}
+
+
+</div>
+</body>
+
+</html>
+
Index: tags/2.4.0RC3/themes/default/template/notification.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/notification.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/notification.tpl	(revision 14585)
@@ -0,0 +1,29 @@
+{html_head} 
+<link rel="alternate" type="application/rss+xml" title="{'Photos only RSS feed'|@translate}" href="{$U_FEED_IMAGE_ONLY}"> 
+<link rel="alternate" type="application/rss+xml" title="{'Complete RSS feed (photos, comments)'|@translate}" href="{$U_FEED}"> 
+{/html_head} 
+
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+  <div class="titrePage">
+    <ul class="categoryActions">
+    </ul>
+    <h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Notification'|@translate}</h2>
+  </div>
+  
+  {include file='infos_errors.tpl'}
+
+  <div class="notification">
+  <p>{'The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.'|@translate}</p>
+
+  <dl>
+    <dt>
+      <a href="{$U_FEED_IMAGE_ONLY}">{'Photos only RSS feed'|@translate}</a><br><br>
+    </dt>
+    <dt>
+      <a href="{$U_FEED}">{'Complete RSS feed (photos, comments)'|@translate}</a>
+    </dt>
+  </dl>
+  </div>
+</div>
Index: tags/2.4.0RC3/themes/default/template/password.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/password.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/password.tpl	(revision 14585)
@@ -0,0 +1,62 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+  <div class="titrePage">
+    <ul class="categoryActions">
+    </ul>
+
+    <h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{$title}</h2>
+  </div>
+
+{include file='infos_errors.tpl'}
+
+{if $action ne 'none'}
+<form id="lostPassword" action="{$form_action}?action={$action}{if isset($key)}&amp;key={$key}{/if}" method="post">
+  <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+
+  {if $action eq 'lost'}
+  <div class="message">{'Please enter your username or email address.'|@translate} {'You will receive a link to create a new password via email.'|@translate}</div>
+
+  <p>
+    <label>
+      {'Username or email'|@translate}
+      <br>
+      <input type="text" id="username_or_email" name="username_or_email" size="40" maxlength="40"{if isset($username_or_email)} value="{$username_or_email}"{/if}>
+    </label>
+  </p>
+
+  <p class="bottomButtons"><input type="submit" name="submit" value="{'Change my password'|@translate}"></p>
+  {elseif $action eq 'reset'}
+
+  <div class="message">{'Hello'|@translate} <em>{$username}</em>. {'Enter your new password below.'|@translate}</div>
+
+  <p>
+    <label>
+      {'New password'|@translate}
+      <br>
+      <input type="password" name="use_new_pwd" id="use_new_pwd" value="">
+    </label>
+  </p>
+
+  <p>
+    <label>
+      {'Confirm Password'|@translate}
+      <br>
+      <input type="password" name="passwordConf" id="passwordConf" value="">
+    </label>
+  </p>
+
+  <p class="bottomButtons"><input type="submit" name="submit" value="{'Submit'|@translate}"></p>
+  {/if}
+
+</form>
+{/if} {* $action ne 'none' *}
+
+<script type="text/javascript">
+{if $action eq 'lost'}
+{literal}try{document.getElementById('username_or_email').focus();}catch(e){}{/literal}
+{elseif $action eq 'reset'}
+{literal}try{document.getElementById('use_new_pwd').focus();}catch(e){}{/literal}
+{/if}
+</script>
+
+</div> <!-- content -->
Index: tags/2.4.0RC3/themes/default/template/picture.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/picture.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/picture.tpl	(revision 14585)
@@ -0,0 +1,371 @@
+{* Example of resizeable
+{include file='include/autosize.inc.tpl'}
+*}
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" {if isset($MENUBAR)}class="contentWithMenu"{/if}>
+{if isset($errors) or not empty($infos)}
+{include file='infos_errors.tpl'}
+{/if}
+{if !empty($PLUGIN_PICTURE_BEFORE)}{$PLUGIN_PICTURE_BEFORE}{/if}
+
+<div id="imageHeaderBar">
+	<div class="browsePath">
+		{$SECTION_TITLE}<span class="browsePathSeparator">{$LEVEL_SEPARATOR}</span><h2>{$current.TITLE}</h2>
+	</div>
+</div>
+
+<div id="imageToolBar">
+<div class="imageNumber">{$PHOTO}</div>
+{include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+<div class="actionButtons">
+{if count($current.unique_derivatives)>1}
+{footer_script require='jquery'}{literal}
+function changeImgSrc(url,typeSave,typeMap)
+{
+	var theImg = document.getElementById("theMainImage");
+	if (theImg)
+	{
+		theImg.removeAttribute("width");theImg.removeAttribute("height");
+		theImg.src = url;
+		theImg.useMap = "#map"+typeMap;
+	}
+	jQuery('#derivativeSwitchBox .switchCheck').css('visibility','hidden');
+	jQuery('#derivativeChecked'+typeSave).css('visibility','visible');
+	document.cookie = 'picture_deriv='+typeSave+';path={/literal}{$COOKIE_PATH}{literal}';
+}
+jQuery("#derivativeSwitchLink").click(function() {
+	var elt = jQuery("#derivativeSwitchBox");
+	elt.css("left", Math.min( jQuery(this).offset().left, jQuery(window).width() - elt.outerWidth(true) - 5))
+		.css("top", jQuery(this).offset().top + jQuery(this).outerHeight(true))
+		.toggle();
+});
+jQuery("#derivativeSwitchBox").on("mouseleave click", function() {
+	jQuery(this).hide();
+});
+{/literal}{/footer_script}
+{strip}<a id="derivativeSwitchLink" title="{'Photo sizes'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+  <span class="pwg-icon pwg-icon-sizes">&nbsp;</span><span class="pwg-button-text">{'Photo sizes'|@translate}</span>
+</a>
+<div id="derivativeSwitchBox" class="switchBox">
+  <div class="switchBoxTitle">{'Photo sizes'|@translate}</div>
+  {foreach from=$current.unique_derivatives item=derivative key=derivative_type}
+  <span class="switchCheck" id="derivativeChecked{$derivative_type}"{if $derivative->get_type() ne $current.selected_derivative->get_type()} style="visibility:hidden"{/if}>&#x2714; </span>
+  <a href="javascript:changeImgSrc('{$derivative->get_url()|@escape:javascript}','{$derivative_type}','{$derivative->get_type()}')">
+    {$derivative->get_type()|@translate}<span class="derivativeSizeDetails"> ({$derivative->get_size_hr()})</span>
+  </a><br>
+  {/foreach}
+  {if isset($U_ORIGINAL)}
+  <a href="javascript:phpWGOpenWindow('{$U_ORIGINAL}','xxx','scrollbars=yes,toolbar=no,status=no,resizable=yes')" rel="nofollow">{'Original'|@translate}</a>
+  {/if}
+</div>
+{/strip}
+{/if}
+{strip}{if isset($U_SLIDESHOW_START)}
+	<a href="{$U_SLIDESHOW_START}" title="{'slideshow'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-slideshow"> </span><span class="pwg-button-text">{'slideshow'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($U_METADATA)}
+	<a href="{$U_METADATA}" title="{'Show file metadata'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-camera-info"> </span><span class="pwg-button-text">{'Show file metadata'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($current.U_DOWNLOAD)}
+	<a href="{$current.U_DOWNLOAD}" title="{'Download this file'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-save"> </span><span class="pwg-button-text">{'Download'|@translate}</span>
+	</a>
+{/if}{/strip}
+{if isset($PLUGIN_PICTURE_ACTIONS)}{$PLUGIN_PICTURE_ACTIONS}{/if}
+{strip}{if isset($favorite)}
+	<a href="{$favorite.U_FAVORITE}" title="{if $favorite.IS_FAVORITE}{'delete this photo from your favorites'|@translate}{else}{'add this photo to your favorites'|@translate}{/if}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-favorite-{if $favorite.IS_FAVORITE}del{else}add{/if}"> </span><span class="pwg-button-text">{'Favorites'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($U_SET_AS_REPRESENTATIVE)}
+	<a href="{$U_SET_AS_REPRESENTATIVE}" title="{'set as album representative'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-representative"> </span><span class="pwg-button-text">{'representative'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($U_ADMIN)}
+	<a href="{$U_ADMIN}" title="{'Modify information'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-edit"> </span><span class="pwg-button-text">{'Edit'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($U_CADDIE)}{*caddie management BEGIN*}
+{footer_script}
+{literal}function addToCadie(aElement, rootUrl, id)
+{
+if (aElement.disabled) return;
+aElement.disabled=true;
+var y = new PwgWS(rootUrl);
+y.callService(
+	"pwg.caddie.add", {image_id: id} ,
+	{
+		onFailure: function(num, text) { alert(num + " " + text); document.location=aElement.href; },
+		onSuccess: function(result) { aElement.disabled = false; }
+	}
+	);
+}{/literal}
+{/footer_script}
+	<a href="{$U_CADDIE}" onclick="addToCadie(this, '{$ROOT_URL}', {$current.id}); return false;" title="{'Add to caddie'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+		<span class="pwg-icon pwg-icon-caddie-add"> </span><span class="pwg-button-text">{'Caddie'|@translate}</span>
+	</a>
+{/if}{/strip}{*caddie management END*}
+</div>
+</div>{*<!-- imageToolBar -->*}
+
+<div id="theImageAndInfos">
+<div id="theImage">
+{$ELEMENT_CONTENT}
+
+{if isset($COMMENT_IMG)}
+<p class="imageComment">{$COMMENT_IMG}</p>
+{/if}
+{if isset($U_SLIDESHOW_STOP)}
+<p>
+	[ <a href="{$U_SLIDESHOW_STOP}">{'stop the slideshow'|@translate}</a> ]
+</p>
+{/if}
+
+</div>{*<!-- no significant white space for elegant-->
+*}<div id="infoSwitcher"></div>{*<!-- no significant white space for elegant-->
+*}<div id="imageInfos">
+{if $DISPLAY_NAV_THUMB}
+	<div class="navThumbs">
+		{if isset($previous)}
+			<a class="navThumb" id="linkPrev" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE}" rel="prev">
+				<span class="thumbHover prevThumbHover">&nbsp;</span>
+				<img src="{$previous.derivatives.square->get_url()}" alt="{$previous.TITLE}">
+			</a>
+		{/if}
+		{if isset($next)}
+			<a class="navThumb" id="linkNext" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE}" rel="next">
+				<span class="thumbHover nextThumbHover">&nbsp;</span>
+				<img src="{$next.derivatives.square->get_url()}" alt="{$next.TITLE}">
+			</a>
+		{/if}
+	</div>
+{/if}
+
+<dl id="standard" class="imageInfoTable">
+{strip}
+	{if $display_info.author and isset($INFO_AUTHOR)}
+	<div id="Author" class="imageInfo">
+		<dt>{'Author'|@translate}</dt>
+		<dd>{$INFO_AUTHOR}</dd>
+	</div>
+	{/if}
+	{if $display_info.created_on and isset($INFO_CREATION_DATE)}
+	<div id="datecreate" class="imageInfo">
+		<dt>{'Created on'|@translate}</dt>
+		<dd>{$INFO_CREATION_DATE}</dd>
+	</div>
+	{/if}
+	{if $display_info.posted_on}
+	<div id="datepost" class="imageInfo">
+		<dt>{'Posted on'|@translate}</dt>
+		<dd>{$INFO_POSTED_DATE}</dd>
+	</div>
+	{/if}
+	{if $display_info.dimensions and isset($INFO_DIMENSIONS)}
+	<div id="Dimensions" class="imageInfo">
+		<dt>{'Dimensions'|@translate}</dt>
+		<dd>{$INFO_DIMENSIONS}</dd>
+	</div>
+	{/if}
+	{if $display_info.file}
+	<div id="File" class="imageInfo">
+		<dt>{'File'|@translate}</dt>
+		<dd>{$INFO_FILE}</dd>
+	</div>
+	{/if}
+	{if $display_info.filesize and isset($INFO_FILESIZE)}
+	<div id="Filesize" class="imageInfo">
+		<dt>{'Filesize'|@translate}</dt>
+		<dd>{$INFO_FILESIZE}</dd>
+	</div>
+	{/if}
+	{if $display_info.tags and isset($related_tags)}
+	<div id="Tags" class="imageInfo">
+		<dt>{'Tags'|@translate}</dt>
+		<dd>
+		{foreach from=$related_tags item=tag name=tag_loop}{if !$smarty.foreach.tag_loop.first}, {/if}<a href="{$tag.URL}">{$tag.name}</a>{/foreach}
+		</dd>
+	</div>
+	{/if}
+	{if $display_info.categories and isset($related_categories)}
+	<div id="Categories" class="imageInfo">
+		<dt>{'Albums'|@translate}</dt>
+		<dd>
+			<ul>
+				{foreach from=$related_categories item=cat}
+				<li>{$cat}</li>
+				{/foreach}
+			</ul>
+		</dd>
+	</div>
+	{/if}
+	{if $display_info.visits}
+	<div id="Visits" class="imageInfo">
+		<dt>{'Visits'|@translate}</dt>
+		<dd>{$INFO_VISITS}</dd>
+	</div>
+	{/if}
+
+{if $display_info.rating_score and isset($rate_summary)}
+	<div id="Average" class="imageInfo">
+		<dt>{'Rating score'|@translate}</dt>
+		<dd>
+		{if $rate_summary.count}
+			<span id="ratingScore">{$rate_summary.score}</span> <span id="ratingCount">({assign var='rate_text' value='%d rates'|@translate}{$pwg->sprintf($rate_text, $rate_summary.count)})</span>
+		{else}
+			<span id="ratingScore">{'no rate'|@translate}</span> <span id="ratingCount"></span>
+		{/if}
+		</dd>
+	</div>
+{/if}
+
+{if isset($rating)}
+	<div id="rating" class="imageInfo">
+		<dt>
+			<span id="updateRate">{if isset($rating.USER_RATE)}{'Update your rating'|@translate}{else}{'Rate this photo'|@translate}{/if}</span>
+		</dt>
+		<dd>
+			<form action="{$rating.F_ACTION}" method="post" id="rateForm" style="margin:0;">
+			<div>
+			{foreach from=$rating.marks item=mark name=rate_loop}
+			{if isset($rating.USER_RATE) && $mark==$rating.USER_RATE}
+				<input type="button" name="rate" value="{$mark}" class="rateButtonSelected" title="{$mark}">
+			{else}
+				<input type="submit" name="rate" value="{$mark}" class="rateButton" title="{$mark}">
+			{/if}
+			{/foreach}
+			{strip}{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+			{combine_script id='rating' load='async' require='core.scripts' path='themes/default/js/rating.js'}
+			{footer_script}
+				var _pwgRatingAutoQueue = _pwgRatingAutoQueue||[];
+				_pwgRatingAutoQueue.push( {ldelim}rootUrl: '{$ROOT_URL}', image_id: {$current.id},
+					onSuccess : function(rating) {ldelim}
+						var e = document.getElementById("updateRate");
+						if (e) e.innerHTML = "{'Update your rating'|@translate|@escape:'javascript'}";
+						e = document.getElementById("ratingScore");
+						if (e) e.innerHTML = rating.score;
+						e = document.getElementById("ratingCount");
+						if (e) e.innerHTML = "({'%d rates'|@translate|@escape:'javascript'})".replace( "%d", rating.count);
+					{rdelim}{rdelim} );
+			{/footer_script}
+			{/strip}
+			</div>
+			</form>
+		</dd>
+	</div>
+{/if}
+
+{if $display_info.privacy_level and isset($available_permission_levels)}
+	<div id="Privacy" class="imageInfo"><div class="relSwitchBox">
+		<dt><a id="privacyLevelLink" href="javascript:togglePrivacyLevelBox()">{'Who can see this photo?'|@translate}</a></dt>
+		<dd>
+{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+{footer_script require='jquery'}
+{literal}function setPrivacyLevel(rootUrl, id, level)
+{
+var y = new PwgWS(rootUrl);
+y.callService(
+	"pwg.images.setPrivacyLevel", {image_id: id, level:level} ,
+	{
+		method: "POST",
+		onFailure: function(num, text) { alert(num + " " + text); },
+		onSuccess: function(result) {
+			  jQuery('#privacyLevelBox .switchCheck').css('visibility','hidden');
+			  jQuery('#levelCheck'+level).css('visibility','visible');
+		}
+	}
+	);
+}
+function togglePrivacyLevelBox()
+{
+	var elt = document.getElementById("privacyLevelBox"),
+		ePos = document.getElementById("privacyLevelLink");
+	if (elt.style.display == "none")
+	{
+		elt.style.left = (ePos.offsetLeft)+"px";
+		elt.style.top = (ePos.offsetTop+ePos.offsetHeight)+"px";
+		elt.style.display="block";
+	}
+	else
+		elt.style.display="none";
+}
+{/literal}
+{/footer_script}
+
+			<div id="privacyLevelBox" class="switchBox" onclick="togglePrivacyLevelBox()" style="display:none" onmouseout="e=event.toElement||event.relatedTarget;e.parentNode==this||e==this||togglePrivacyLevelBox()">
+				{foreach from=$available_permission_levels item=label key=level}
+					<span id="levelCheck{$level}" class="switchCheck" {if $level != $current.level} style="visibility:hidden"{/if}>&#x2714; </span>
+					<a id="switchLevel{$level}" href="javascript:setPrivacyLevel('{$ROOT_URL}', {$current.id}, {$level})">{$label}</a><br>
+				{/foreach}
+			</div>
+
+		</dd>
+	</div></div>
+{/if}
+{/strip}
+</dl>
+
+{if isset($metadata)}
+<dl id="Metadata" class="imageInfoTable">
+{foreach from=$metadata item=meta}
+	<h3>{$meta.TITLE}</h3>
+	{foreach from=$meta.lines item=value key=label}
+		<div class="imageInfo">
+			<dt>{$label}</dt>
+			<dd>{$value}</dd>
+		</div>
+	{/foreach}
+{/foreach}
+</dl>
+{/if}
+</div>
+</div>
+
+{if isset($COMMENT_COUNT)}
+<div id="comments" {if (!isset($comment_add) && ($COMMENT_COUNT == 0))}class="noCommentContent"{else}class="commentContent"{/if}><div id="commentsSwitcher"></div>
+	<h3>{$pwg->l10n_dec('%d comment', '%d comments',$COMMENT_COUNT)}</h3>
+
+	<div id="pictureComments">
+		{if isset($comment_add)}
+		<div id="commentAdd">
+			<h4>{'Add a comment'|@translate}</h4>
+			<form method="post" action="{$comment_add.F_ACTION}" id="addComment">
+				{if $comment_add.SHOW_AUTHOR}
+					<p><label>{'Author'|@translate} :</label></p>
+					<p><input type="text" name="author"></p>
+					<p><label>{'Comment'|@translate} :</label></p>
+				{/if}
+				<p><textarea name="content" id="contentid" rows="5" cols="50">{$comment_add.CONTENT}</textarea></p>
+				<p><input type="hidden" name="key" value="{$comment_add.KEY}">
+					<input type="submit" value="{'Submit'|@translate}"></p>
+			</form>
+		</div>
+		{/if}
+		{if isset($comments)}
+		<div id="pictureCommentList">
+			{if (($COMMENT_COUNT > 2) || !empty($navbar))}
+				<div id="pictureCommentNavBar">
+					{if $COMMENT_COUNT > 2}
+						<a href="{$COMMENTS_ORDER_URL}#comments" rel="nofollow" class="commentsOrder">{$COMMENTS_ORDER_TITLE}</a>
+					{/if}
+					{if !empty($navbar) }{include file='navigation_bar.tpl'|@get_extent:'navbar'}{/if}
+				</div>
+			{/if}
+			{include file='comment_list.tpl'}
+		</div>
+		{/if}
+		<div style="clear:both"></div>
+	</div>
+
+</div>
+{/if}{*comments*}
+
+{if !empty($PLUGIN_PICTURE_AFTER)}{$PLUGIN_PICTURE_AFTER}{/if}
+
+</div>
Index: tags/2.4.0RC3/themes/default/template/picture_content.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/picture_content.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/picture_content.tpl	(revision 14585)
@@ -0,0 +1,14 @@
+<img src="{$current.selected_derivative->get_url()}" {$current.selected_derivative->get_size_htm()} alt="{$ALT_IMG}" id="theMainImage" usemap="#map{$current.selected_derivative->get_type()}" title="{if isset($COMMENT_IMG)}{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{else}{$current.TITLE|@replace:'"':' '} - {$ALT_IMG}{/if}">
+
+{foreach from=$current.unique_derivatives item=derivative key=derivative_type}{strip}
+<map name="map{$derivative->get_type()}">
+{assign var='size' value=$derivative->get_size()}
+{if isset($previous)}
+<area shape=rect coords="0,0,{$size[0]/4|@intval},{$size[1]}" href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE}" alt="{$previous.TITLE}">
+{/if}
+<area shape=rect coords="{$size[0]/4|@intval},0,{$size[0]/1.34|@intval},{$size[1]/4|@intval}" href="{$U_UP}" title="{'Thumbnails'|@translate}" alt="{'Thumbnails'|@translate}">
+{if isset($next)}
+<area shape=rect coords="{$size[0]/1.33|@intval},0,{$size[0]},{$size[1]}" href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE}" alt="{$next.TITLE}">
+{/if}
+</map>
+{/strip}{/foreach}
Index: tags/2.4.0RC3/themes/default/template/picture_nav_buttons.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/picture_nav_buttons.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/picture_nav_buttons.tpl	(revision 14585)
@@ -0,0 +1,121 @@
+<div class="navigationButtons">
+{if $DISPLAY_NAV_BUTTONS or isset($slideshow)}
+{if isset($slideshow)}
+{if isset($slideshow.U_INC_PERIOD)}
+	<a href="{$slideshow.U_INC_PERIOD}" title="{'Reduce diaporama speed'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-clock-minus">&nbsp;</span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button">
+		<span class="pwg-icon pwg-icon-clock-minus">&nbsp;</span><span class="pwg-button-text">{'Reduce diaporama speed'|@translate}</span>
+	</span>
+{/if}
+{if isset($slideshow.U_DEC_PERIOD)}
+	<a href="{$slideshow.U_DEC_PERIOD}" title="{'Accelerate diaporama speed'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-clock-plus">&nbsp;</span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button">
+		<span class="pwg-icon pwg-icon-clock-plus">&nbsp;</span><span class="pwg-button-text">{'Accelerate diaporama speed'|@translate}</span>
+	</span>
+{/if}
+{/if}
+{if isset($slideshow.U_START_REPEAT)}
+	<a href="{$slideshow.U_START_REPEAT}" title="{'Repeat the slideshow'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-repeat-play">&nbsp;</span><span class="pwg-button-text">{'Repeat the slideshow'|@translate}</span>
+	</a>
+{/if}
+{if isset($slideshow.U_STOP_REPEAT)}
+	<a href="{$slideshow.U_STOP_REPEAT}" title="{'Not repeat the slideshow'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-repeat-stop">&nbsp;</span><span class="pwg-button-text">{'Not repeat the slideshow'|@translate}</span>
+	</a>
+{/if}
+{*<!--{strip}{if isset($first)}
+	<a href="{$first.U_IMG}" title="{'First'|@translate} : {$first.TITLE}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-arrowstop-w">&nbsp;</span><span class="pwg-button-text">{'First'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button">
+		<span class="pwg-icon pwg-icon-arrowstop-w">&nbsp;</span><span class="pwg-button-text">{'First'|@translate}</span>
+	</span>
+{/if}{/strip}-->*}
+{strip}{if isset($previous)}
+	<a href="{$previous.U_IMG}" title="{'Previous'|@translate} : {$previous.TITLE}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-arrow-w">&nbsp;</span><span class="pwg-button-text">{'Previous'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button">
+		<span class="pwg-icon pwg-icon-arrow-w">&nbsp;</span><span class="pwg-button-text">{'Previous'|@translate}</span>
+	</span>
+{/if}{/strip}
+{if isset($slideshow.U_START_PLAY)}
+	<a href="{$slideshow.U_START_PLAY}" title="{'Play of slideshow'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-play">&nbsp;</span><span class="pwg-button-text">{'Play of slideshow'|@translate}</span>
+	</a>
+{/if}
+{if isset($slideshow.U_STOP_PLAY)}
+	<a href="{$slideshow.U_STOP_PLAY}" title="{'Pause of slideshow'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-pause">&nbsp;</span><span class="pwg-button-text">{'Pause of slideshow'|@translate}</span>
+	</a>
+{/if}
+{strip}{if isset($U_UP) and !isset($slideshow)}
+	<a href="{$U_UP}" title="{'Thumbnails'|@translate}" class="pwg-state-default pwg-button">
+		<span class="pwg-icon pwg-icon-arrow-n">&nbsp;</span><span class="pwg-button-text">{'Thumbnails'|@translate}</span>
+	</a>
+{/if}{/strip}
+{strip}{if isset($next)}
+	<a href="{$next.U_IMG}" title="{'Next'|@translate} : {$next.TITLE}" class="pwg-state-default pwg-button pwg-button-icon-right">
+		<span class="pwg-icon pwg-icon-arrow-e">&nbsp;</span><span class="pwg-button-text">{'Next'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button pwg-button-icon-right">
+		<span class="pwg-icon pwg-icon-arrow-e">&nbsp;</span><span class="pwg-button-text">{'Next'|@translate}</span>
+	</span>
+{/if}{/strip}
+{*<!--{strip}{if isset($last)}
+	<a href="{$last.U_IMG}" title="{'Last'|@translate} : {$last.TITLE}" class="pwg-state-default pwg-button pwg-button-icon-right">
+		<span class="pwg-icon pwg-icon-arrowstop-e"></span><span class="pwg-button-text">{'Last'|@translate}</span>
+	</a>
+{else}
+	<span class="pwg-state-disabled pwg-button pwg-button-icon-right">
+		<span class="pwg-icon pwg-icon-arrowstop-e">&nbsp;</span><span class="pwg-button-text">{'Last'|@translate}</span>
+	</span>
+{/if}{/strip}-->*}
+{/if}
+</div>
+{strip}
+{footer_script}
+document.onkeydown = function(e){ldelim}
+	e=e||window.event;
+	if (e.altKey) return true;
+	var target=e.target||e.srcElement;
+	if (target && target.type) return true;{* an input editable element *}
+	var keyCode=e.keyCode||e.which, docElem=document.documentElement, url;
+	switch(keyCode){ldelim}
+{if isset($next)}
+	case 63235: case 39: if (e.ctrlKey || docElem.scrollLeft==docElem.scrollWidth-docElem.clientWidth)url="{$next.U_IMG}"; break;
+{/if}
+{if isset($previous)}
+	case 63234: case 37: if (e.ctrlKey || docElem.scrollLeft==0)url="{$previous.U_IMG}"; break;
+{/if}
+{if isset($first)}
+	{* Home *}case 36: if (e.ctrlKey)url="{$first.U_IMG}"; break;
+{/if}
+{if isset($last)}
+	{* End *}case 35: if (e.ctrlKey)url="{$last.U_IMG}"; break;
+{/if}
+{if isset($U_UP) and !isset($slideshow)}
+	{* Up *}case 38: if (e.ctrlKey)url="{$U_UP}"; break;
+{/if}
+{if isset($slideshow.U_START_PLAY)}
+	{* Pause *}case 32: url="{$slideshow.U_START_PLAY}"; break;
+{/if}
+{if isset($slideshow.U_STOP_PLAY)}
+	{* Play *}case 32: url="{$slideshow.U_STOP_PLAY}"; break;
+{/if}
+	}
+	if (url) {ldelim}window.location=url.replace("&amp;","&"); return false;}
+	return true;
+}
+{/footer_script}
+{/strip}
Index: tags/2.4.0RC3/themes/default/template/popuphelp.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/popuphelp.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/popuphelp.tpl	(revision 14585)
@@ -0,0 +1,19 @@
+<div id="content" class="content">
+	<div class="titrePage">
+	<ul class="categoryActions">
+		<li><a href="#" onclick="window.close();" title="{'Close this window'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-close">&nbsp;</span><span class="pwg-button-text">exit</span>
+		</a></li>
+	</ul>
+	<h2>{$PAGE_TITLE}</h2>
+	</div>
+
+{$HELP_CONTENT}
+
+<p>
+    <a href="#" onclick="window.close();">{'Close this window'|@translate}</a>
+</p>
+
+</div> <!-- content -->
+
+
Index: tags/2.4.0RC3/themes/default/template/profile.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/profile.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/profile.tpl	(revision 14585)
@@ -0,0 +1,13 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+<div class="titrePage">
+	<ul class="categoryActions">
+	</ul>
+	<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Profile'|@translate}</h2>
+</div>
+
+{include file='infos_errors.tpl'}
+
+{$PROFILE_CONTENT}
+</div> <!-- content -->
Index: tags/2.4.0RC3/themes/default/template/profile_content.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/profile_content.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/profile_content.tpl	(revision 14585)
@@ -0,0 +1,96 @@
+<form method="post" name="profile" action="{$F_ACTION}" id="profile" class="properties">
+
+  <fieldset>
+    <legend>{'Registration'|@translate}</legend>
+    <input type="hidden" name="redirect" value="{$REDIRECT}">
+    <ul>
+      <li>
+        <span class="property">{'Username'|@translate}</span>
+        {$USERNAME}
+      </li>
+    {if not $SPECIAL_USER} {* can modify password + email*}
+      <li>
+        <span class="property">
+          <label for="mail_address">{'Email address'|@translate}</label>
+        </span>
+        <input type="text" name="mail_address" id="mail_address" value="{$EMAIL}">
+      </li>
+      <li>
+        <span class="property">
+          <label for="password">{'Password'|@translate}</label>
+        </span>
+        <input type="password" name="password" id="password" value="">
+      </li>
+      <li>
+        <span class="property">
+          <label for="use_new_pwd">{'New password'|@translate}</label>
+        </span>
+        <input type="password" name="use_new_pwd" id="use_new_pwd" value="">
+      </li>
+      <li>
+        <span class="property">
+          <label for="passwordConf">{'Confirm Password'|@translate}</label>
+        </span>
+        <input type="password" name="passwordConf" id="passwordConf" value="">
+      </li>
+    {/if}
+    </ul>
+  </fieldset>
+
+{if $ALLOW_USER_CUSTOMIZATION}
+  <fieldset>
+    <legend>{'Preferences'|@translate}</legend>
+
+    <ul>
+      <li>
+        <span class="property">
+          <label for="nb_image_page">{'Number of photos per page'|@translate}</label>
+        </span>
+        <input type="text" size="4" maxlength="3" name="nb_image_page" id="nb_image_page" value="{$NB_IMAGE_PAGE}">
+      </li>
+      <li>
+        <span class="property">
+          <label for="template">{'Interface theme'|@translate}</label>
+        </span>
+        {html_options name=theme options=$template_options selected=$template_selection}
+      </li>
+      <li>
+        <span class="property">
+          <label for="Language">{'Language'|@translate}</label>
+        </span>
+        {html_options name=language options=$language_options selected=$language_selection}
+      </li>
+      <li>
+        <span class="property">
+          <label for="Recent period">{'Recent period'|@translate}</label>
+        </span>
+        <input type="text" size="3" maxlength="2" name="recent_period" id="recent_period" value="{$RECENT_PERIOD}">
+      </li>
+      <li>
+        <span class="property">{'Expand all albums'|@translate}</span>
+        {html_radios name='expand' options=$radio_options selected=$EXPAND}
+      </li>
+    {if $ACTIVATE_COMMENTS}
+      <li>
+        <span class="property">{'Show number of comments'|@translate}</span>
+        {html_radios name='show_nb_comments' options=$radio_options selected=$NB_COMMENTS}
+      </li>
+    {/if}
+      <li>
+        <span class="property">{'Show number of hits'|@translate}</span>
+        {html_radios name='show_nb_hits' options=$radio_options selected=$NB_HITS}
+      </li>
+    </ul>
+  </fieldset>
+{/if}
+
+  <p class="bottomButtons">
+    <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+    <input class="submit" type="submit" name="validate" value="{'Submit'|@translate}">
+    <input class="submit" type="reset" name="reset" value="{'Reset'|@translate}">
+    {if $ALLOW_USER_CUSTOMIZATION}
+    <input class="submit" type="submit" name="reset_to_default" value="{'Reset to default values'|@translate}">
+    {/if}
+  </p>
+
+</form>
Index: tags/2.4.0RC3/themes/default/template/redirect.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/redirect.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/redirect.tpl	(revision 14585)
@@ -0,0 +1,13 @@
+{html_head}
+<style type="text/css">#the_page {ldelim}text-align:center;} </style>
+{/html_head}
+
+<div>
+	{$REDIRECT_MSG}
+</div>
+
+<p style="margin: 2em">
+	<a href="{$page_refresh.U_REFRESH}">
+		{'Click here if your browser does not automatically forward you'|@translate}
+	</a>
+</p>
Index: tags/2.4.0RC3/themes/default/template/register.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/register.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/register.tpl	(revision 14585)
@@ -0,0 +1,69 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="registerPage">
+
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+<div class="titrePage">
+	<ul class="categoryActions">
+	</ul>
+	<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Registration'|@translate}</h2>
+</div>
+
+{include file='infos_errors.tpl'}
+
+<form method="post" action="{$F_ACTION}" class="properties" name="register_form">
+  <fieldset>
+    <legend>{'Enter your personnal informations'|@translate}</legend>
+
+    <ul>
+      <li>
+        <span class="property">
+          <label for="login">* {'Username'|@translate}</label>
+        </span>
+        <input type="text" name="login" id="login" value="{$F_LOGIN}" >
+      </li>
+      <li>
+        <span class="property">
+          <label for="password">* {'Password'|@translate}</label>
+        </span>
+        <input type="password" name="password" id="password" >
+      </li>
+      <li>
+        <span class="property">
+          <label for="password_conf">* {'Confirm Password'|@translate}</label>
+        </span>
+        <input type="password" name="password_conf" id="password_conf" >
+      </li>
+      <li>
+        <span class="property">
+          <label for="mail_address">{if $obligatory_user_mail_address}* {/if}{'Email address'|@translate}</label>
+        </span>
+        <input type="text" name="mail_address" id="mail_address" value="{$F_EMAIL}" >
+      {if not $obligatory_user_mail_address}
+        ({'useful when password forgotten'|@translate})
+      {/if}
+      </li>
+      <li>
+        <span class="property">
+          <label for="send_password_by_mail">{'Send my connection settings by email'|@translate}</label>
+        </span>
+        <input type="checkbox" name="send_password_by_mail" id="send_password_by_mail" value="1" checked="checked">
+      </li>
+    </ul>
+
+  </fieldset>
+
+  <p class="bottomButtons">
+		<input type="hidden" name="key" value="{$F_KEY}" >
+    <input class="submit" type="submit" name="submit" value="{'Register'|@translate}">
+    <input class="submit" type="reset" value="{'Reset'|@translate}">
+  </p>
+
+</form>
+
+<script type="text/javascript"><!--
+document.register_form.login.focus();
+//--></script>
+
+</div> <!-- content -->
+</div> <!-- registerPage -->
Index: tags/2.4.0RC3/themes/default/template/search.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/search.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/search.tpl	(revision 14585)
@@ -0,0 +1,138 @@
+{* Example of resizeable *}
+{*
+{include file='include/resize.inc.tpl'}
+*}
+
+{* Example of datepicker *}
+{*
+{include file='include/datepicker.inc.tpl'}
+
+{footer_script}{literal}
+  pwg_initialization_datepicker("#start_day", "#start_month", "#start_year", "#start_linked_date", null, null, "#end_linked_date");
+  pwg_initialization_datepicker("#end_day", "#end_month", "#end_year", "#end_linked_date", null, "#start_linked_date", null);
+ jQuery().ready(function(){ $(".date_today").hide(); });
+{/literal}{/footer_script}
+*}
+
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+	<div class="titrePage">
+		<ul class="categoryActions">
+			{combine_script id='core.scripts' load='async' path='themes/default/js/scripts.js'}
+			<li><a href="{$U_HELP}" onclick="popuphelp(this.href); return false;" title="{'Help'|@translate}" class="pwg-state-default pwg-button">
+				<span class="pwg-icon pwg-icon-help">&nbsp;</span><span class="pwg-button-text">{'Help'|@translate}</span>
+			</a></li>
+		</ul>
+		<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Search'|@translate}</h2>
+	</div>
+
+{include file='infos_errors.tpl'}
+
+<form class="filter" method="post" name="search" action="{$F_SEARCH_ACTION}">
+<fieldset>
+  <legend>{'Filter'|@translate}</legend>
+  <label>{'Search for words'|@translate}
+    <input type="text" style="width: 300px" name="search_allwords" size="30">
+  </label>
+  <ul>
+    <li><label>
+      <input type="radio" name="mode" value="AND" checked="checked">{'Search for all terms'|@translate}
+    </label></li>
+    <li><label>
+      <input type="radio" name="mode" value="OR">{'Search for any term'|@translate}
+    </label></li>
+  </ul>
+  <label>{'Search for Author'|@translate}
+    <input type="text" style="width: 300px" name="search_author" size="30">
+  </label>
+</fieldset>
+
+{if isset($TAG_SELECTION)}
+<fieldset>
+  <legend>{'Search tags'|@translate}</legend>
+  {$TAG_SELECTION}
+  <label><span><input type="radio" name="tag_mode" value="AND" checked="checked"> {'All tags'|@translate}</span></label>
+  <label><span><input type="radio" name="tag_mode" value="OR"> {'Any tag'|@translate}</span></label>
+</fieldset>
+{/if}
+
+<fieldset>
+  <legend>{'Search by date'|@translate}</legend>
+  <ul>
+    <li><label>{'Kind of date'|@translate}</label></li>
+    <li><label>
+      <input type="radio" name="date_type" value="date_creation" checked="checked">{'Creation date'|@translate}
+    </label></li>
+    <li><label>
+      <input type="radio" name="date_type" value="date_available">{'Post date'|@translate}
+    </label></li>
+  </ul>
+  <ul>
+    <li><label>{'Date'|@translate}</label></li>
+    <li>
+      <select id="start_day" name="start_day">
+          <option value="0">--</option>
+        {section name=day start=1 loop=32}
+          <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$START_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
+        {/section}
+      </select>
+      <select id="start_month" name="start_month">
+        {html_options options=$month_list selected=$START_MONTH_SELECTED}
+      </select>
+      <input id="start_year" name="start_year" type="text" size="4" maxlength="4" >
+      <input id="start_linked_date" name="start_linked_date" type="hidden" size="10" disabled="disabled">
+    </li>
+    <li>
+      <a class="date_today" href="#" onClick="document.search.start_day.value={$smarty.now|date_format:"%d"};document.search.start_month.value={$smarty.now|date_format:"%m"};document.search.start_year.value={$smarty.now|date_format:"%Y"};return false;">{'today'|@translate}</a>
+    </li>
+  </ul>
+  <ul>
+    <li><label>{'End-Date'|@translate}</label></li>
+    <li>
+      <select id="end_day" name="end_day">
+          <option value="0">--</option>
+        {section name=day start=1 loop=32}
+          <option value="{$smarty.section.day.index}" {if $smarty.section.day.index==$END_DAY_SELECTED}selected="selected"{/if}>{$smarty.section.day.index}</option>
+        {/section}
+      </select>
+      <select id="end_month" name="end_month">
+        {html_options options=$month_list selected=$END_MONTH_SELECTED}
+      </select>
+      <input id="end_year" name="end_year" type="text" size="4" maxlength="4" >
+      <input id="end_linked_date" name="end_linked_date" type="hidden" size="10" disabled="disabled">
+    </li>
+    <li>
+      <a class="date_today" href="#" onClick="document.search.end_day.value={$smarty.now|date_format:"%d"};document.search.end_month.value={$smarty.now|date_format:"%m"};document.search.end_year.value={$smarty.now|date_format:"%Y"};return false;">{'today'|@translate}</a>
+    </li>
+  </ul>
+</fieldset>
+
+<fieldset>
+  <legend>{'Search in albums'|@translate}</legend>
+  <label>{'Albums'|@translate}
+    <select class="categoryList" name="cat[]" multiple="multiple" >
+      {html_options options=$category_options selected=$category_options_selected}
+    </select>
+  </label>
+  <ul>
+    <li><label>{'Search in sub-albums'|@translate}</label></li>
+    <li><label>
+      <input type="radio" name="subcats-included" value="1" checked="checked">{'Yes'|@translate}
+    </label></li>
+    <li><label>
+      <input type="radio" name="subcats-included" value="0">{'No'|@translate}
+    </label></li>
+  </ul>
+</fieldset>
+<p>
+  <input class="submit" type="submit" name="submit" value="{'Submit'|@translate}">
+  <input class="submit" type="reset" value="{'Reset'|@translate}">
+</p>
+</form>
+
+<script type="text/javascript"><!--
+document.search.search_allwords.focus();
+//--></script>
+
+</div> <!-- content -->
Index: tags/2.4.0RC3/themes/default/template/search_rules.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/search_rules.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/search_rules.tpl	(revision 14585)
@@ -0,0 +1,61 @@
+<div id="content" class="content">
+	<div class="titrePage">
+	<ul class="categoryActions">
+		<li><a href="#" onclick="window.close();" title="{'Close this window'|@translate} class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-close">&nbsp;</span><span class="pwg-button-text">exit</span>
+		</a></li>
+	</ul>
+	<h2>{'Search rules'|@translate}</h2>
+	</div>
+
+{if isset($INTRODUCTION)}
+<p>{$INTRODUCTION}</p>
+{/if}
+
+<ul>
+
+  {if isset($search_words)}
+  {foreach from=$search_words item=v}
+  <li>{$v}</li>
+  {/foreach}
+  {/if}
+
+  {if isset($SEARCH_TAGS_MODE) }
+  <li>
+    <p>{if 'AND'==$SEARCH_TAGS_MODE}{'All tags'|@translate}{else}{'Any tag'|@translate}{/if}</p>
+    <ul>
+      {foreach from=$search_tags item=v}
+      <li>{$v}</li>
+      {/foreach}
+    </ul>
+  </li>
+  {/if}
+  
+  {if isset($DATE_CREATION)}
+  <li>{$DATE_CREATION}</li>
+  {/if}
+
+  {if isset($DATE_AVAILABLE)}
+  <li>{$DATE_AVAILABLE}</li>
+  {/if}
+
+  {if isset($search_categories)}
+  <li>
+    <p>{'Albums'|@translate}</p>
+
+    <ul>
+      {foreach from=$search_categories item=v}
+      <li>{$v}</li>
+      {/foreach}
+    </ul>
+  </li>
+  {/if}
+  
+</ul>
+
+<p>
+    <a href="#" onclick="window.close();">{'Close this window'|@translate}</a>
+</p>
+
+</div> <!-- content -->
+
Index: tags/2.4.0RC3/themes/default/template/slideshow.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/slideshow.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/slideshow.tpl	(revision 14585)
@@ -0,0 +1,24 @@
+<div id="slideshow">
+	<div id="imageHeaderBar">
+	  <div class="browsePath">
+		{if isset($U_SLIDESHOW_STOP) }
+		[ <a href="{$U_SLIDESHOW_STOP}">{'stop the slideshow'|@translate}</a> ]
+		{/if}
+			<h2 class="showtitle">{$current.TITLE}</h2>
+	  </div>
+	</div>
+
+	<div id="imageToolBar">
+	  <div class="imageNumber">{$PHOTO}</div>
+	  {include file='picture_nav_buttons.tpl'|@get_extent:'picture_nav_buttons'}
+	</div>
+
+	<div id="content">
+	<div id="theImage">
+	  {$ELEMENT_CONTENT}
+	  {if isset($COMMENT_IMG)}
+	  <p class="showlegend">{$COMMENT_IMG}</p>
+	  {/if}
+	</div>
+	</div>
+<div>
Index: tags/2.4.0RC3/themes/default/template/tags.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/tags.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/tags.tpl	(revision 14585)
@@ -0,0 +1,58 @@
+{if isset($MENUBAR)}{$MENUBAR}{/if}
+<div id="content" class="content{if isset($MENUBAR)} contentWithMenu{/if}">
+
+<div class="titrePage">
+	<ul class="categoryActions">
+{if $display_mode == 'letters'}
+		<li><a href="{$U_CLOUD}" title="{'show tag cloud'|@translate}" class="pwg-state-default pwg-button">
+			<span class="pwg-icon pwg-icon-cloud">&nbsp;</span><span class="pwg-button-text">{'cloud'|@translate}</span>
+		</a></li>
+{/if}
+{if $display_mode == 'cloud'}
+		<li><a href="{$U_LETTERS}" title="{'group by letters'|@translate}" class="pwg-state-default pwg-button" rel="nofollow">
+			<span class="pwg-icon pwg-icon-letters">&nbsp;</span><span class="pwg-button-text">{'letters'|@translate}</span>
+		</a></li>
+{/if}
+	</ul>
+	<h2><a href="{$U_HOME}">{'Home'|@translate}</a>{$LEVEL_SEPARATOR}{'Tags'|@translate}</h2>
+</div>
+
+{include file='infos_errors.tpl'}
+
+{if isset($tags)}
+	{if $display_mode == 'cloud'}
+	<div id="fullTagCloud">
+		{foreach from=$tags item=tag}
+		<span><a href="{$tag.URL}" class="tagLevel{$tag.level}" title="{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}">{$tag.name}</a></span>
+		{/foreach}
+	</div>
+	{/if}
+
+  {if $display_mode == 'letters'}
+  <table>
+    <tr>
+      <td valign="top">
+    {foreach from=$letters item=letter}
+  <fieldset class="tagLetter">
+    <legend class="tagLetterLegend">{$letter.TITLE}</legend>
+    <table class="tagLetterContent">
+      {foreach from=$letter.tags item=tag}
+      <tr class="tagLine">
+        <td><a href="{$tag.URL}" title="{$tag.name}">{$tag.name}</a></td>
+        <td class="nbEntries">{$pwg->l10n_dec('%d photo', '%d photos', $tag.counter)}</td>
+      </tr>
+      {/foreach}
+    </table>
+  </fieldset>
+      {if isset($letter.CHANGE_COLUMN) }
+      </td>
+      <td valign="top">
+      {/if}
+    {/foreach}
+      </td>
+    </tr>
+  </table>
+  {/if}
+{/if}
+
+</div> <!-- content -->
Index: tags/2.4.0RC3/themes/default/template/thumbnails.tpl
===================================================================
--- tags/2.4.0RC3/themes/default/template/thumbnails.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/default/template/thumbnails.tpl	(revision 14585)
@@ -0,0 +1,59 @@
+{if !empty($thumbnails)}{strip}
+{combine_script id='jquery.ajaxmanager' path='themes/default/js/plugins/jquery.ajaxmanager.js' load='footer'}
+{combine_script id='thumbnails.loader' path='themes/default/js/thumbnails.loader.js' require='jquery.ajaxmanager' load='footer'}
+{*define_derivative name='derivative_params' width=160 height=90 crop=true*}
+{html_style}
+{*Set some sizes according to maximum thumbnail width and height*}
+.thumbnails SPAN,
+.thumbnails .wrap2 A,
+.thumbnails LABEL{ldelim}
+	width: {$derivative_params->max_width()+2}px;
+}
+
+.thumbnails .wrap2{ldelim}
+	height: {$derivative_params->max_height()+3}px;
+}
+{if $derivative_params->max_width() > 600}
+.thumbLegend {ldelim}font-size: 130%}
+{else}
+{if $derivative_params->max_width() > 400}
+.thumbLegend {ldelim}font-size: 110%}
+{else}
+.thumbLegend {ldelim}font-size: 90%}
+{/if}
+{/if}
+{/html_style}
+{foreach from=$thumbnails item=thumbnail}
+{assign var=derivative value=$pwg->derivative($derivative_params, $thumbnail.src_image)}
+	<li>
+	<span class="wrap1">
+		<span class="wrap2">
+		<a href="{$thumbnail.URL}">
+			<img class="thumbnail" {if !$derivative->is_cached()}data-{/if}src="{$derivative->get_url()}" alt="{$thumbnail.TN_ALT}" title="{$thumbnail.TN_TITLE}">
+		</a>
+		</span>
+		{if $SHOW_THUMBNAIL_CAPTION }
+		<span class="thumbLegend">
+		<span class="thumbName">{$thumbnail.NAME}</span>
+		{if !empty($thumbnail.icon_ts)}
+		<img title="{$thumbnail.icon_ts.TITLE}" src="{$ROOT_URL}{$themeconf.icon_dir}/recent.png" alt="(!)">
+		{/if}
+		{if isset($thumbnail.NB_COMMENTS)}
+		<span class="{if 0==$thumbnail.NB_COMMENTS}zero {/if}nb-comments">
+		<br>
+		{$pwg->l10n_dec('%d comment', '%d comments',$thumbnail.NB_COMMENTS)}
+		</span>
+		{/if}
+
+		{if isset($thumbnail.NB_HITS)}
+		<span class="{if 0==$thumbnail.NB_HITS}zero {/if}nb-hits">
+		<br>
+		{$pwg->l10n_dec('%d hit', '%d hits',$thumbnail.NB_HITS)}
+		</span>
+		{/if}
+		</span>
+		{/if}
+	</span>
+	</li>
+{/foreach}{/strip}
+{/if}
Index: tags/2.4.0RC3/themes/default/theme.css
===================================================================
--- tags/2.4.0RC3/themes/default/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/default/theme.css	(revision 14585)
@@ -0,0 +1,787 @@
+@import "iconset.css";
+/**
+ * Menubar
+ */
+#menubar {
+	float: left;
+	margin: 0 0 10px 1em;
+	padding: 0;
+	display: inline;
+	width: 18em;
+}
+
+#menubar DL, #menubar DT, #menubar DD {
+	margin: 0; padding: 0; display: block;
+}
+
+.menubarFilter {
+	float: right;
+	margin: -4px 0 0;
+}
+
+/* H2 properties copied here */
+#menubar DT {
+	font-weight: bold;
+	padding: 5px;
+	font-size: 120%;
+	text-align: center;
+}
+
+#menubar UL,
+#menubar FORM,
+#menubar P {
+	font-size: 92%;
+	margin: 10px 0 10px 5px;
+}
+#menubar UL {
+	list-style-type: square;
+	list-style-position: inside;
+	padding: 0 0 0 2px;
+}
+#menubar UL UL {
+	font-size: 100%;
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+/*IE6 needs override because of > selector*/
+#menubar LI.selected>A {
+	font-weight: bold;
+}
+
+#menubar .menuInfoCatByChild {
+	font-size: 80%;
+	font-style: italic;
+}
+
+#mbCategories IMG {
+	vertical-align: bottom; /*otherwise line height changes*/
+}
+
+#menubar INPUT {
+	text-indent: 2px;
+}
+
+/* quickconnect form */
+
+#quickconnect FIELDSET {
+	margin: 0 5px 0 0;
+	padding: 0; /*IE6 requires padding 0*/
+}
+
+#quickconnect DIV {
+	margin: 8px 5px;
+	padding: 0;
+}
+
+#menuTagCloud {
+	text-align: center;
+	margin: 5px 0;
+}
+
+#menuTagCloud SPAN {
+	white-space: nowrap;
+	margin-right: 5px;
+}
+
+/**
+ * Content
+ */
+.contentWithMenu {
+	margin-left: 20em;  /* = #menubar width + 2em */
+}
+
+.content H2 { margin-bottom: 3px;} /*<- for IE otherwise calendar select is displaced to middle of page*/
+
+.content .navigationBar, .content .additional_info, .content .calendarBar {
+	margin: 8px 4px;
+	text-align: center;
+}
+
+.content .pageNumberSelected {
+	font-style: italic;
+	font-weight: bold;
+}
+
+.content .additional_info {
+	font-size: 110%;
+}
+
+.content .titrePage {
+	padding: 0 0 3px;
+}
+
+.content .notification {
+  padding:0 25px;
+}
+
+/* actions */
+.categoryActions {
+	margin: 0 2px;
+	width: auto;
+	padding: 0;
+	text-indent: 0;
+	list-style: none;
+	text-align: center;
+	float: right;
+}
+
+.categoryActions LI {
+	display: inline;
+}
+
+/* begin chronology/calendar elements*/
+.calendarViews {
+	display: block;
+	float: right;
+	margin: 2px 0 0;
+}
+
+.calItem, .calItemEmpty {
+	font-weight: bold;
+	margin: 0 1px;
+	border: 1px solid gray;
+}
+
+.calItem A { border:0 }
+
+.calendarCalBar {
+	margin: 10px;
+	text-align: left;
+}
+
+.calCalHead {
+	font-weight: bold;
+	font-size: 110%;
+	margin: 0 2px;
+}
+
+.calCal { margin: 0 2px; }
+
+/* nice looking month calendar*/
+TABLE.calMonth {
+	border: 0;
+	border-collapse: collapse;
+	margin-bottom: 10px;	/*<-IE ignores this */
+}
+
+TD.calDayCellFull, TD.calDayCellEmpty {
+	vertical-align: top;
+	font-weight: bold;
+	font-size: 18px;
+	border: 1px solid gray;
+}
+
+.calImg {
+	overflow: hidden;
+	vertical-align: bottom;
+	z-index: 1;
+	position: relative; /*<- this required by IE*/
+}
+
+.calImg IMG {
+	position: relative;
+	border: 0;
+}
+
+.calBackDate {
+	padding-left: 4px;
+	padding-top: 0;
+	z-index: 2;
+	position: absolute;
+	vertical-align: top;
+	color: #000;
+}
+
+.calForeDate {
+	padding-left: 5px;
+	padding-top: 1px;
+	z-index: 3;
+	position: absolute;
+	vertical-align: top;
+	color: #fff;
+}
+
+/* Category thumbnails on main page, CSS code inspired from MOD subcatify */
+.thumbnailCategories {
+	margin: 0;
+	padding: 0;
+	list-style: none;
+	overflow: hidden;
+	width: 100%;
+}
+
+.thumbnailCategories LI {
+	margin: 0;
+	padding: 0;
+	float: left;
+	width: 49.7%;    /* 49.7% for 2 per line, 33.2% for 3 per line*/
+}
+
+.thumbnailCategory {
+	display:block;
+	padding: 2px 0 0 2px;
+	margin: 5px;
+}
+
+.thumbnailCategory .description {
+	font-size: 90%;
+	overflow: auto;
+	/*width: inherit;*/
+}
+
+.thumbnailCategory .description H3 {
+	text-align: left;
+	margin: 0;
+	padding: 0.1em;
+	font-size: 120%;
+}
+
+.thumbnailCategory .description P {
+	margin: 0;
+}
+
+.illustration {/*also used by comment lists*/
+	text-align: left;
+	margin: 2px 0 0 2px;
+	float: left;
+}
+
+
+/* User comments */
+#comments {
+	padding-left: 5px;
+	padding-right: 5px;
+}
+
+.commentsList {
+	margin: 0;
+	padding: 0;
+	list-style: none;
+	overflow: hidden;
+	width: 100%;
+}
+
+.commentElement {
+	border-radius: 5px;
+	margin: 5px;
+	padding: 2px 0 0 2px;
+	float: left;
+	width:99%;
+}
+
+.commentElement .description {
+	overflow: auto;
+	/*width: inherit;*/
+}
+
+/* Thumbnails */
+
+/* Thumbnail "elastic" layout */
+.thumbnails {
+	margin: 0;
+	padding: 0;
+	list-style: none;
+	text-align: center;	/* to center the whole collection in .content */
+}
+.thumbnails LI { display: inline }
+
+.thumbnails .wrap1 {
+	margin: 0 7px 5px 7px;
+	display: table-cell; display: inline-table;
+	display: inline-block;/* Why 3 display option ??? */
+	vertical-align: top;	/* OK with Opera and IE6 not Geko */
+	text-align: center;		/* to center the thumbnail and legend in Geko/Opera */
+}
+.thumbnails .wrap2 {
+	margin: 0;			/* important reset the margins */
+	display: table-cell;/* block prevents vertical-align here */
+	vertical-align: middle;/* Ok with Opera and Geko not IE6 */
+	border-radius: 4px;	/* round corners with CSS3 compliant browsers */
+}
+
+.thumbnails .wrap2 A {
+	display: block;
+	border-bottom: 0;
+}
+.thumbnails IMG {
+	vertical-align: middle;
+}
+
+.thumbnails SPAN.thumbLegend {
+	overflow: hidden;/* oversized legend is clipped */
+	display: block;  /* display: none; if you don't want legend */
+	height: 4em;    /* legend height (don't set auto to be Gecko friendly)*/
+}
+
+/**
+ * Picture
+ */
+#imageHeaderBar {
+	padding-top: 2px;
+	padding-bottom: 2px;
+	overflow: hidden;
+	width: 100%;
+}
+
+#imageHeaderBar .browsePath {
+	float: left;
+	margin-left: 10px;
+}
+
+#imageToolBar .imageNumber {
+	float: right;
+	margin:-20px 9px 0 0;
+}
+
+#imageHeaderBar H2 {
+	display: inline;
+	text-align: center;
+	padding: 0;
+}
+
+#imageToolBar {
+	text-align: center;
+	clear: both;
+	margin-bottom: 2px;
+	padding: 0;
+	height: 28px;
+}
+
+#imageToolBar .actionButtons { float: left; }
+#imageToolBar .navigationButtons   { float: right; }
+#imageToolBar .pwg-button {width:42px;}
+
+.switchBox {
+	padding: 0.5em 5px;
+	border-radius: 4px;
+	z-index: 100;
+	text-align:left;
+	display: none;
+	position: absolute;
+	left: 0; top: 0; /*left, right set through js*/
+}
+
+.switchBoxTitle {
+  border-bottom:1px solid #ccc;
+  padding-bottom:5px;
+  margin-bottom:5px;
+}
+
+.relSwitchBox {
+	position: relative;
+}
+
+#theImage {
+	clear: left;
+	text-align: center;
+}
+
+#imageInfos {
+	position: relative;
+	min-height: 120px;
+}
+
+#linkPrev {
+	float: left;
+	margin: 5px 10px 0 5px;
+}
+
+#linkNext {
+	float: right;
+	margin: 5px 5px 0 10px;
+}
+
+.imageInfoTable UL { /*this is the album list*/
+	margin: 0;
+	padding: 0 0 0 1em;
+	list-style-type: square;
+}
+
+.rateButton, .rateButtonSelected, .rateButtonStarFull, .rateButtonStarEmpty  {
+	padding:0;
+	border:0;
+	color:inherit;
+	background-color:transparent !important;	/* Konqueror doesn't accept transparent here */
+}
+
+.rateButton, .rateButtonStarFull, .rateButtonStarEmpty {
+	cursor: pointer;
+}
+
+.rateButtonSelected {
+	font-weight:bold;
+	font-size:120%;
+}
+
+.rateButtonStarFull {
+	background: url('icon/rating-stars.gif') no-repeat -16px center; width:16px;
+}
+
+.rateButtonStarEmpty {
+	background: url('icon/rating-stars.gif') no-repeat 0 center; width:16px;
+}
+
+.contentWithMenu #imageToolBar, 
+.contentWithMenu #theImage { 
+	clear: none;
+}
+
+/**
+ * Default Layout
+ */
+BODY {
+	margin: 5px;
+	padding: 0;
+	font-size: 0.8em;
+	font-family: Arial,Helvetica,sans-serif;
+	min-width: 60em;  /* ~ 3* #menubar width; width of the page before getting a scrollbar; IE6 doesn't get that*/
+}
+
+IMG {
+	border: 0; /*IE<=9 adds border for linked images*/
+}
+
+#thePopuphelpPage {
+	min-width: 0; /*reset the min width*/
+}
+
+
+H1 {
+	text-align: center;
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 0.5em 0 1em 0;
+}
+
+H2 {
+	margin: 0;
+	padding: 5px 0.5em;
+	text-align: left;
+	font-size: 120%;
+}
+
+A {
+	text-decoration:none;
+}
+A:hover {
+	border-bottom: 1px solid #858460;
+}
+A.pwg-state-default:hover {
+	border-bottom: 0; /*reset above for icons*/
+}
+
+#copyright {
+	clear: both;
+	font-size: 83%;
+	text-align: center;
+	margin: 0 0 10px 0;
+}
+
+INPUT, SELECT {
+	margin: 0;
+	font-size: 1em;	/* <= some browsers don't set it correctly */
+}
+
+TABLE {	/* horizontaly centered */
+	margin-left: auto;
+	margin-right: auto;
+}
+
+
+FORM { padding: 0; margin: 0; }
+
+FORM P {
+	text-align: center;
+	margin-top: 2em;
+	margin-bottom: 2em;
+}
+
+SELECT.categoryList {
+	height: 20em;
+	width: 500px;
+}
+
+
+/**
+ * Filter forms are displayed label by label with the input (or select...)
+ * below the label. Use an UL to make a group (radiobox for instance).
+ * Use a SPAN to group objects in line
+ */
+FIELDSET {
+	padding: 1em;
+	margin: 1em;
+	overflow: hidden; /* <- makes Opera happy */
+}
+
+.filter UL,
+.filter LABEL {
+	display: block;
+	float: left;
+	margin-right: 1em;
+	padding: 0;
+}
+
+.filter LI {
+	list-style: none;
+	margin-bottom: 0.5em;
+}
+
+.filter LI LABEL {
+	display: inline;
+	float: none;
+}
+
+/*IE6 needs override because of > selector*/
+.filter LABEL>INPUT,
+.filter LABEL>SELECT {
+	display: block;
+	margin: 0.5em 0;
+}
+
+.filter FIELDSET * LABEL>INPUT {
+	display: inline;
+	vertical-align: top;
+	margin: 0 0.5em 0 0;
+}
+
+
+.properties UL {
+	list-style-type: none;
+	margin: 0;
+	padding: 0;
+}
+
+.properties LI {
+	margin-bottom: 0.5em;
+	padding: 0;
+	line-height: 1.8em;
+	clear: left;
+}
+
+.properties SPAN.property {
+	font-weight: bold;
+	float: left;
+	width: 50%;
+	text-align: right;
+	margin: 0;
+	padding: 0 0.5em 0 0;
+}
+
+.tagSelection {
+	width: 99%;
+	margin: 1em 0;
+	padding: 0;
+}
+
+.tagSelection LI {
+	display:inline-block;
+	width:150px!important;
+	overflow:hidden;
+	white-space: nowrap;
+}
+
+#fullTagCloud {
+	font-size: 120%;
+	text-align: justify;
+	padding: 0;
+	margin: 1em 2em;
+}
+
+#fullTagCloud SPAN {
+	white-space: nowrap;
+	margin: 0 2px;
+}
+
+
+.tagLevel5 { font-size: 150% !important; }
+.tagLevel4 { font-size: 140% !important; }
+.tagLevel3 { font-size: 120% !important; }
+.tagLevel2 { font-size: 100% !important; }
+.tagLevel1 { font-size: 90%  !important; }
+
+
+/* Popup help page */
+#thePopuphelpPage #copyright {
+	display: none;
+}
+
+#thePopuphelpPage P {
+	padding: 0.5em;
+}
+
+#thePopuphelpPage DL  {
+	margin: 0 25px 25px; 
+}
+
+TR.tagLine {
+	border-bottom: 1px solid #ddd;
+}
+TD.nbEntries {
+	text-align: right;
+	font-style: italic;
+	font-size: 90%;
+}
+
+FIELDSET.tagLetter {
+	border: 1px solid #d3d3d3;
+	width: 200px;
+	margin: 0.5em;
+	padding: 10px;
+}
+
+LEGEND.tagLetterLegend {
+	border: 1px solid #d3d3d3;
+	font-size:120%;
+	font-weight: bold;
+	padding: 0 5px;
+	font-style: normal;
+}
+
+TABLE.tagLetterContent {
+	width:100%;
+	font-size:80%;
+	border-collapse : collapse;
+}
+
+#theHeader {text-align: center;}
+
+/* jQuery datepicker */
+IMG.ui-datepicker-trigger {
+	cursor : pointer;
+}
+
+
+/**
+ * Default colors
+ */
+
+ /* So that non-links are slightly greyed out */
+.content .navigationBar, .calItemEmpty, TD.calDayCellEmpty {
+	color: #b0b0b0;
+}
+
+/* Tables & forms */
+/* IE <= 6 is so bad with this that you can't merge with the following rule */
+INPUT[type="text"], INPUT[type="password"], INPUT[type="button"],
+INPUT[type="submit"], INPUT[type="reset"], INPUT[type="file"] {
+	color: #000;
+	background-color: #d3d3d3;	/* lightgrey */
+}
+
+SELECT, TEXTAREA {
+	color: #000;
+	background-color: #d3d3d3;	/* lightgrey */
+}
+
+INPUT:focus, SELECT:focus, TEXTAREA:focus {
+	background-color: #f5f5f5;	/* whitesmoke */
+}
+
+/* some theme set a border on INPUT  which is not pretty for radio/checkbox */
+INPUT[type="radio"], INPUT[type="checkbox"] {
+	border: none;	/* <= Opera needs this */
+}
+
+
+.errors { /* Errors display */
+	color: red;
+	font-weight: bold;
+	margin: 5px;
+	border: 1px solid red;
+	background: #ffe1e1 url(icon/errors.png) no-repeat center right;
+	padding: 10px 50px 10px 10px;
+}
+
+/* Informations box */
+.infos {
+	color: #002000;
+	background: #98fb98 url(icon/infos.png) no-repeat center right;
+	margin: 5px;
+	padding: 10px 50px 10px 10px;
+}
+
+/* Header message like upgrade*/
+.header_msgs {
+	text-align:center;
+	font-weight: bold;
+	color:#696969;	/* dimgray */
+	background-color: #d3d3d3;
+	margin: 1px;
+	padding: 1px;
+}
+
+/* Header notes box */
+.header_notes {
+	border: 1px solid #aaa;
+	text-align: center;
+	background-image: url(icon/note.png);
+	background-repeat: no-repeat;
+	background-position: top left;
+	font-weight: bold;
+	margin: 14px;
+	padding: 5px 0 0 0;
+}
+
+LEGEND {
+	font-style: italic;
+}
+
+#piwigoAbout {width:600px;margin:0 auto;}
+#linkToPiwigo {text-align:center;}
+
+.message {
+  background-color: lightyellow;
+  color:#333;
+  margin-bottom:1em;
+  padding: 12px;
+  -moz-border-radius: 3px;
+  -khtml-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  border-radius: 3px;
+}
+
+#lostPassword {
+  padding: 1em;
+}
+
+#lostPassword p {
+  text-align: left;
+  margin: 1.5em 0;
+  line-height: 1.5em;
+}
+
+/* image comments rules */
+
+#commentAdd, #pictureCommentList 	{ width: 48%; padding: 0 1%;}
+#commentAdd  						{ float: left; }
+#pictureCommentList 					{ float: right; }
+
+#commentAdd input[type="text"],
+#comments TEXTAREA {
+	max-width: 99%;
+	width: 99%;
+}
+
+.commentAuthor {
+	font-weight: bold;
+}
+
+.commentDate {
+	font-style: italic
+}
+
+#pictureCommentList .commentsOrder	{ float: left; margin-bottom: 5px;}
+#pictureCommentList .navigationBar	{ float: right; margin-bottom: 5px;}
+#pictureComments h4					{ margin: 0;}
+#comments FORM P	 {
+	margin: 5px 0; text-align: left;
+}
+
+/* image info table */
+
+.imageInfoTable {display:table; margin: auto;}
+.imageInfo {display:table-row; line-height:20px;}
+.imageInfo dt {display:table-cell; text-align:right; font-weight:bold; padding-right:0.5em;}
+.imageInfo dd {display:table-cell; text-align:left; font-weight:normal;}
Index: tags/2.4.0RC3/themes/default/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/default/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/default/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,8 @@
+<?php
+$themeconf = array(
+  'name'         => 'default',
+  'icon_dir'      => 'themes/default/icon',
+  'mime_icon_dir' => 'themes/default/icon/mimetypes/',
+  'local_head'    => 'local_head.tpl',
+);
+?>
Index: tags/2.4.0RC3/themes/elegant/fix-ie7.css
===================================================================
--- tags/2.4.0RC3/themes/elegant/fix-ie7.css	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/fix-ie7.css	(revision 14585)
@@ -0,0 +1,3 @@
+#theImage.infoshown			{ float: left;}
+#theImage.infohidden		{ float: right;}
+#imageToolBar .actionButtons	{ float: right;}
Index: tags/2.4.0RC3/themes/elegant/index.php
===================================================================
--- tags/2.4.0RC3/themes/elegant/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/elegant/local_head.tpl
===================================================================
--- tags/2.4.0RC3/themes/elegant/local_head.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/local_head.tpl	(revision 14585)
@@ -0,0 +1,8 @@
+{if $BODY_ID=='thePicturePage'}
+	{combine_script id='elegant.scripts_pp' load='footer' require='jquery' path='themes/elegant/scripts_pp.js'}
+{else}
+	{combine_script id='elegant.scripts' load='footer' require='jquery' path='themes/elegant/scripts.js'}
+{/if}
+	<!--[if lt IE 8]>
+		<link rel="stylesheet" type="text/css" href="{$ROOT_URL}themes/elegant/fix-ie7.css">
+	<![endif]-->
Index: tags/2.4.0RC3/themes/elegant/mail-css.tpl
===================================================================
--- tags/2.4.0RC3/themes/elegant/mail-css.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/mail-css.tpl	(revision 14585)
@@ -0,0 +1,9 @@
+/* Theme dark mail css */
+
+body {ldelim} background-color:#444; color:#fff;}
+#copyright {ldelim} color: #69c;}
+h2 {ldelim} background-color: #333; color:#fff48e;}
+img {ldelim} margin: 16px; border: 16px solid #111; -moz-border-radius: 4px; border-radius: 4px 4px; }
+img:hover {ldelim} padding: 15px; border: 1px solid yellow;background-color:#444;-moz-border-radius: 4px; border-radius: 4px 4px; }
+a {ldelim} color: #fff48e; background: transparent;border-bottom:1px dotted #005e89; }
+a:hover {ldelim} color: #fff48e;}
Index: tags/2.4.0RC3/themes/elegant/scripts.js
===================================================================
--- tags/2.4.0RC3/themes/elegant/scripts.js	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/scripts.js	(revision 14585)
@@ -0,0 +1,78 @@
+﻿/**
+ * Cookie plugin
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ */
+jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=jQuery.extend({},options);options.expires=-1;}
+var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
+expires='; expires='+date.toUTCString();}
+var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
+return cookieValue;}};
+
+if (jQuery.cookie('page-menu') == 'hidden') {
+	jQuery("head").append("<style type=\"text/css\">#the_page #menubar {display:none;} #content.contentWithMenu, #the_page > .content {margin-left:35px;}</style>");
+} else {
+	jQuery("head").append("<style type=\"text/css\">#content.contentWithMenu, #the_page > .content {margin-left:240px;}</style>");
+}
+
+function hideMenu(delay) {
+	var menubar=jQuery("#menubar");
+	var menuswitcher=jQuery("#menuSwitcher");
+	var content=jQuery("#the_page > .content");
+	var pcontent=jQuery("#content");
+	
+	menubar.hide(delay);
+	menuswitcher.addClass("menuhidden").removeClass("menushown");
+	content.addClass("menuhidden").removeClass("menushown");
+	pcontent.addClass("menuhidden").removeClass("menushown");
+	jQuery.cookie('page-menu', 'hidden', {path: "/"});
+	
+}
+
+function showMenu(delay) {
+
+	var menubar=jQuery("#menubar");
+	var menuswitcher=jQuery("#menuSwitcher");
+	var content=jQuery("#the_page > .content");
+	var pcontent=jQuery("#content");
+
+	menubar.show(delay);
+	menuswitcher.addClass("menushown").removeClass("menuhidden");
+	content.addClass("menushown").removeClass("menuhidden");
+	pcontent.addClass("menushown").removeClass("menuhidden");
+	jQuery.cookie('page-menu', 'visible', {path: "/"});
+	
+}
+
+jQuery("document").ready(function(jQuery){
+
+	var sidemenu = jQuery.cookie('page-menu');
+	var menubar=jQuery("#menubar");
+
+	if (menubar.length == 1) {
+
+		jQuery("#menuSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
+
+		// if cookie says the menu is hiding, keep it hidden!
+		if (sidemenu == 'hidden') {
+			hideMenu(0);
+		} else {
+			showMenu(0);
+		}
+	
+		jQuery("#menuSwitcher").click(function(){
+			if (jQuery("#menubar").is(":hidden")) {
+				showMenu(0);
+				return false;
+			} else {
+				hideMenu(0);
+				return false;
+			}
+		});
+
+
+	}	
+	
+});
+
+
Index: tags/2.4.0RC3/themes/elegant/scripts_pp.js
===================================================================
--- tags/2.4.0RC3/themes/elegant/scripts_pp.js	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/scripts_pp.js	(revision 14585)
@@ -0,0 +1,176 @@
+﻿/**
+ * Cookie plugin
+ * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
+ * Dual licensed under the MIT and GPL licenses:
+ */
+jQuery.cookie=function(name,value,options){if(typeof value!='undefined'){options=options||{};if(value===null){value='';options=jQuery.extend({},options);options.expires=-1;}
+var expires='';if(options.expires&&(typeof options.expires=='number'||options.expires.toUTCString)){var date;if(typeof options.expires=='number'){date=new Date();date.setTime(date.getTime()+(options.expires*24*60*60*1000));}else{date=options.expires;}
+expires='; expires='+date.toUTCString();}
+var path=options.path?'; path='+(options.path):'';var domain=options.domain?'; domain='+(options.domain):'';var secure=options.secure?'; secure':'';document.cookie=[name,'=',encodeURIComponent(value),expires,path,domain,secure].join('');}else{var cookieValue=null;if(document.cookie&&document.cookie!=''){var cookies=document.cookie.split(';');for(var i=0;i<cookies.length;i++){var cookie=jQuery.trim(cookies[i]);if(cookie.substring(0,name.length+1)==(name+'=')){cookieValue=decodeURIComponent(cookie.substring(name.length+1));break;}}}
+return cookieValue;}};
+
+if (jQuery.cookie('picture-menu') == 'visible') {
+	jQuery("head").append("<style type=\"text/css\">#content.contentWithMenu, #the_page > .content {margin-left:240px;}</style>");
+} else {
+	jQuery("head").append("<style type=\"text/css\">#the_page #menubar {display:none;} #content.contentWithMenu, #the_page > .content {margin-left:35px;}</style>");
+}
+
+function hideMenu(delay) {
+	var menubar=jQuery("#menubar");
+	var menuswitcher=jQuery("#menuSwitcher");
+	var content=jQuery("#the_page > .content");
+	var pcontent=jQuery("#content");
+	
+	menubar.hide(delay);
+	menuswitcher.addClass("menuhidden").removeClass("menushown");
+	content.addClass("menuhidden").removeClass("menushown");
+	pcontent.addClass("menuhidden").removeClass("menushown");
+	jQuery.cookie('picture-menu', 'hidden', {path: "/"});
+	
+}
+
+function showMenu(delay) {
+
+	var menubar=jQuery("#menubar");
+	var menuswitcher=jQuery("#menuSwitcher");
+	var content=jQuery("#the_page > .content");
+	var pcontent=jQuery("#content");
+
+	menubar.show(delay);
+	menuswitcher.addClass("menushown").removeClass("menuhidden");
+	content.addClass("menushown").removeClass("menuhidden");
+	pcontent.addClass("menushown").removeClass("menuhidden");
+	jQuery.cookie('picture-menu', 'visible', {path: "/"});
+	
+}
+
+function hideInfo(delay) {
+
+	var imageInfos=jQuery("#imageInfos");
+	var infoswitcher=jQuery("#infoSwitcher");
+	var theImage=jQuery("#theImage");
+	
+	imageInfos.hide(delay);
+	infoswitcher.addClass("infohidden").removeClass("infoshown");
+	theImage.addClass("infohidden").removeClass("infoshown");
+	jQuery.cookie('side-info', 'hidden', {path: "/"});
+
+}
+
+function showInfo(delay) {
+
+	var imageInfos=jQuery("#imageInfos");
+	var infoswitcher=jQuery("#infoSwitcher");
+	var theImage=jQuery("#theImage");
+	
+	imageInfos.show(delay);
+	infoswitcher.addClass("infoshown").removeClass("infohidden");
+	theImage.addClass("infoshown").removeClass("infohidden");
+	jQuery.cookie('side-info', 'visible', {path: "/"});
+
+}
+
+jQuery("document").ready(function(jQuery){
+	
+	// side-menu show/hide
+
+	var sidemenu = jQuery.cookie('picture-menu');
+	var menubar=jQuery("#menubar");
+
+	if (menubar.length == 1) {
+
+		jQuery("#menuSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
+
+		// if cookie says the menu is hiding, keep it hidden!
+		if (sidemenu == 'visible') {
+			showMenu(0);
+		} else {
+			hideMenu(0);
+		}
+	
+		jQuery("#menuSwitcher").click(function(){
+			if (jQuery("#menubar").is(":hidden")) {
+				showMenu(0);
+				return false;
+			} else {
+				hideMenu(0);
+				return false;
+			}
+		});
+	
+	}
+
+	// info show/hide
+	
+	var sideinfo = jQuery.cookie('side-info');
+	var imageInfos=jQuery("#imageInfos");
+
+	if (imageInfos.length == 1) {
+
+		jQuery("#infoSwitcher").html("<div class=\"switchArrow\">&nbsp;</div>");
+
+		// if cookie says the menu is hiding, keep it hidden!
+		if (sideinfo == 'hidden') {
+			hideInfo(0);
+		} else {
+			showInfo(0);
+		}
+	
+		jQuery("#infoSwitcher").click(function(){
+			if (jQuery("#imageInfos").is(":hidden")) {
+				showInfo(0);
+				return false;
+			} else {
+				hideInfo(0);
+				return false;
+			}
+		});
+	
+	}
+
+	// comments show/hide
+
+	var commentsswicther=jQuery("#commentsSwitcher");
+	var comments=jQuery("#thePicturePage #comments");
+	
+	commentsswicther.html("<div class=\"switchArrow\">&nbsp;</div>");
+	
+	if (comments.length == 1) {
+		var comments_button=jQuery("#comments h3");
+
+		if (comments_button.length == 0) {
+			jQuery("#addComment").before("<h3>Comments</h3>");
+			comments_button=jQuery("#comments h3");
+		}
+	
+		if (jQuery.cookie('comments') == 'visible') {
+			comments.addClass("commentsshown");
+			comments_button.addClass("comments_toggle").addClass("comments_toggle_off");
+		} else {
+			comments.addClass("commentshidden");
+			comments_button.addClass("comments_toggle").addClass("comments_toggle_on");
+		}
+		
+		comments_button.click(function() { commentsToggle() });
+		commentsswicther.click(function() { commentsToggle() });
+	
+	}
+	
+	
+});
+
+function commentsToggle() {
+	var comments=jQuery("#thePicturePage #comments");
+	var comments_button=jQuery("#comments h3");
+
+	if (comments.hasClass("commentshidden")) {
+			comments.removeClass("commentshidden").addClass("commentsshown");
+			comments_button.addClass("comments_toggle_off").removeClass("comments_toggle_on");;
+			jQuery.cookie('comments', 'visible', {path: "/"});
+		} else {
+			comments.addClass("commentshidden").removeClass("commentsshown");
+			comments_button.addClass("comments_toggle_on").removeClass("comments_toggle_off");;
+			jQuery.cookie('comments', 'hidden', {path: "/"});
+		}
+
+}
Index: tags/2.4.0RC3/themes/elegant/theme.css
===================================================================
--- tags/2.4.0RC3/themes/elegant/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/theme.css	(revision 14585)
@@ -0,0 +1,277 @@
+﻿/* backgrounds */
+
+html, body									{ background-color: #111;}
+
+#content, .content 							{ background-color: #222;}
+.content .titrePage 							{ background-color: #111;}
+
+#menubar, #the_page #menuSwitcher.menuhidden	{ background-color: #222;}
+
+#thePicturePage, #imageHeaderBar			{ background-color: #111;}
+#imageInfos, #infoSwitcher.infohidden 		{ background-color: #333;}
+#thePicturePage #comments 					{ background-color: #333;}
+#pictureCommentList li 						{ background-color: #444;}
+
+.calendarTitle								{ background-color: #222;}
+
+.switchBox, .header_notes 					{ background-color: #555;}
+.thumbnailCategory , .commentElement			{ background-color: #333;}
+.message									{ background-color: #666;}
+
+INPUT[type="text"], INPUT[type="password"],
+INPUT[type="button"], INPUT[type="submit"],
+INPUT[type="reset"], INPUT[type="file"],
+SELECT, TEXTAREA							{ background-color: #555;}
+INPUT:focus, SELECT:focus, TEXTAREA:focus	{ background-color: #666;}
+
+
+/* font colors */
+
+body, legend									{ color: #aaa;}
+a											{ color: #ccc;}
+a:hover 										{ color: #fff;}
+INPUT.rateButton							{ color: #fff;}
+H1, H3, INPUT.rateButtonSelected 			{ color: #ccc;}
+.message									{ color: #fff;}
+.commentContent .comments_toggle:hover		{ color: #fff;}
+INPUT[type="text"], INPUT[type="password"],
+INPUT[type="button"], INPUT[type="submit"],
+INPUT[type="reset"], INPUT[type="file"],
+SELECT, TEXTAREA							{ color: #ccc;}
+INPUT:focus, SELECT:focus, TEXTAREA:focus	{ color: #fff;}
+
+
+/* borders */
+
+#content,.content, .content .titrePage		{ border-bottom: 2px solid #444;}
+#imageHeaderBar 								{ border: solid 0 #444; border-bottom-width:2px;}
+#copyright								 	{ border-top-width:2px;}
+#content .calendarTitleBar 					{ border-bottom: none;}
+.calendarTitle								{ border-top: 2px solid #444;}
+.switchBox 									{ border: 1px solid #000;}
+.switchBoxTitle 								{ border-bottom: 1px solid #444;}
+INPUT, SELECT, TEXTAREA 			{ border: 1px solid #666;}
+FIELDSET {border: 2px solid #444;}
+
+/* form */
+legend {font-style:normal;}
+#qsearchInput {margin-left:-20px}
+
+/* icons */ 
+
+.pwg-icon									{ background-image: url(../default/s26/outline_808080.png);}
+A:hover .pwg-icon 							{ background-image: url(../default/s26/outline_ffffff.png);}
+
+
+/* general rules */
+
+body 		{ margin: 5px 0;}
+a:hover 		{ border-bottom: none;}
+#copyright	{ padding:0 4px 0 0; text-align:right;}
+
+
+/* content */
+
+#the_page  #content.menushown, #the_page > .content.menushown, .contentWithMenu 	{ margin-left: 240px;}
+#the_page  #content.menuhidden, #the_page > .content.menuhidden 					{ margin-left: 35px;}
+#the_page  #content, #the_page > .content											{ margin-right: 0;}
+
+#content,.content 			{ margin-bottom: 4px; padding-bottom: 4px;}
+#thePicturePage #content 	{ padding-bottom: 0;}
+.content .titrePage 			{ padding:0; margin-bottom:4px;}
+.content .titrePage H2 		{ line-height: 20px; margin: 0; padding: 8px 0 0 2px;}
+
+
+/* menubar */
+
+#menubar  {
+	display: inline;
+	width: 230px;
+	float: left;
+	margin: 28px 8px 10px 0;
+	padding: 0;
+}
+#menubar DT				{ text-align: left;}
+#menubar dd 				{ padding: 0 0 1em 1em;}
+#menubar .pwg-icon-filter { display: none;}
+
+#quickconnect FIELDSET {
+    margin: 0 10px 0 -10px;
+    border: 2px solid #444444;
+}
+
+/* switchers */
+
+#menuSwitcher {
+	display: block;
+	text-align: center;
+	height: 32px;
+	cursor: pointer;
+	float: left;
+	margin: 28px 0 0 -34px;
+}
+
+
+#imageInfos, #infoSwitcher.infohidden 		{ border-radius: 10px 0 0 10px;}
+#menubar, #the_page #menuSwitcher.menuhidden	{ border-radius: 0 10px 10px 0;}
+#the_page #menuSwitcher.menuhidden 			{ width: 25px; margin-left: 0;}
+
+#infoSwitcher {
+	display: block;
+	text-align: center;
+	height: 32px;
+	cursor: pointer;
+	position:absolute;
+	left:75%;
+	top:0;
+	margin: 10px 0 0 7px;
+	z-index:99;
+}
+
+#infoSwitcher.infohidden {
+	width:25px;
+	top:10px;
+	right:0;
+	left:auto;
+	margin:0;
+}
+
+#slideshow #theImage			{ width: 100%; margin: auto; overflow: visible;}
+#theImage.infohidden 		{ width: 100%;}
+
+#commentsSwitcher 					{ float: left; margin: 2px 0; cursor:pointer;}
+.noCommentContent #commentsSwitcher	{ display: none;}
+
+.switchArrow				{ width: 16px; height: 16px; margin: 8px 5px 8px 4px;}
+.switchArrow				{ background: transparent url("icon/arrows_ccc.png");}
+.switchArrow:hover 			{ background: transparent url("icon/arrows_fff.png");}
+.menuhidden .switchArrow		{ background-position: 0 0;}
+.menushown   .switchArrow		{ background-position: -16px 0;}
+.infohidden .switchArrow		{ background-position: -16px 0;}
+.infoshown   .switchArrow		{ background-position: 0 0;}
+.commentshidden .switchArrow	{ background-position: -48px 0;}
+.commentsshown   .switchArrow	{ background-position: -32px 0;}
+
+
+/* switchboxes */
+
+.switchBox {
+    border-radius: 4px 4px 4px 4px;
+    padding: 0.5em 10px;
+    text-align: left;
+    z-index: 100;
+}
+.derivativeSizeDetails				{ display: none;}
+
+/* thumbnails */
+
+#thumbnails  						{ padding-top: 5px;}
+.thumbnailCategory .illustration,
+.commentElement .illustration 		{ margin: 2px; text-align: center;}
+
+
+/* picture page */
+
+.contentWithMenu #imageHeaderBar 	{ padding: 0;}
+#imageHeaderBar 						{ padding: 0 0 0 10px;}
+#imageHeaderBar 						{ width: auto;}
+#imageHeaderBar h2 					{ font-size: 100%; font-weight: inherit;}
+#imageHeaderBar .browsePath {
+	display:inline-block;
+	float:left;
+	font-size:120%;
+	line-height:20px;
+	padding: 8px 0 0 2px;
+	font-weight:bold;
+	margin:0;
+}
+#imageToolBar .imageNumber 			{ display: inline-block; float: right; line-height: 26px; margin: 0 2px 0 0; min-width: 40px; text-align: center;}
+#imageToolBar 						{ margin-top: -28px; margin-bottom: 0; float: right;}
+#thePicturePage .pwg-button 			{ width: 26px;}
+#thePicturePage .actionButtons 		{ margin-right: 26px;}
+
+#theImageAndInfos {
+	display: block;
+	width: 100%;
+	position: relative;
+}
+#theImage {
+	display: inline-block;
+	width: 75%;
+	vertical-align: top;
+	overflow: auto;
+	padding: 10px 0 5px 0;
+}
+
+.rateButtonStarFull 					{ background: url('icon/rating-stars.png') no-repeat -16px center; width:16px;}
+.rateButtonStarEmpty 				{ background: url('icon/rating-stars.png') no-repeat 0 center; width:16px;}
+
+
+/* image infos */
+
+#imageInfos {
+	display: inline-block;
+	width: 24.5%;
+	vertical-align: top;
+	padding-top: 35px;
+	padding-bottom: 5px;
+	margin: 10px 0 10px 0.5%;
+	word-wrap:break-word;
+}
+
+#imageInfos .navThumbs 				{ width: 250px; height: 130px; margin: auto; padding: 0 5px;}
+#imageInfos .navThumb 				{ position: relative; width: 120px; height: 120px; margin: 0; overflow: hidden;}
+#imageInfos #linkPrev 				{ float: left;}
+#imageInfos #linkNext				{ float: right;} 
+#imageInfos .thumbHover 				{ position: absolute; width: 100%; height: 100%;}
+#imageInfos .prevThumbHover 			{ background: transparent url(icon/none.png) no-repeat center center;}
+#imageInfos .prevThumbHover:hover 	{ background: transparent url(icon/img_prev.png) no-repeat center center;}
+#imageInfos .nextThumbHover 			{ background: transparent url(icon/none.png) no-repeat center center;}
+#imageInfos .nextThumbHover:hover 	{ background: transparent url(icon/img_next.png) no-repeat center center;}
+
+#imageInfos dl.imageInfoTable		{ display: block; padding: 0 15px; margin: 12px auto;}
+#imageInfos .imageInfo 				{ display: block; line-height: 16px;}
+#imageInfos .imageInfo dt				{ display: block; font-weight: bold; text-align: left; padding: 0;}
+#imageInfos .imageInfo dd			{ display: block; text-align: left; margin: 0 0 5px 20px;}
+#imageInfos h3						{ margin: 20px 0 10px;}
+
+
+/* image comments */
+
+#thePicturePage #comments 			{ padding: 2px 5px;}
+#thePicturePage #comments h3 			{ margin: 10px 0;}
+#thePicturePage #comments form 		{ margin: 10px 0;}
+#thePicturePage #comments fieldset		{ margin: 0 1em;}
+
+.commentshidden #pictureComments		{ display: none;}
+.commentContent .comments_toggle 	{ cursor: pointer;}
+
+#commentAdd, #pictureCommentList 	{ width: 48%; padding: 0 1%;}
+#commentAdd  						{ float: left; }
+#pictureCommentList 					{ float: right; }
+
+#commentAdd input[type="text"],
+#commentAdd textarea {
+	width: 95%;
+	font-family: Arial,Helvetica,sans-serif;
+	font-size: 100%;
+}
+
+#pictureCommentList .commentsOrder	{ float: left; margin-bottom: 5px;}
+#pictureCommentList .navigationBar	{ float: right; margin-bottom: 5px;}
+#pictureComments h4					{ margin: 0;}
+#pictureComments form p				{ margin: 5px 0;}
+#pictureComments form p textarea		{ margin: 10px 0;}
+#pictureComments INPUT				{ margin: 10px;}
+#pictureComments INPUT[type=submit]	{ margin: 0;}
+.commentElement .description 		{ padding: 5px;} 
+
+
+/* calendar */
+
+.calendarViews		{ margin-top: 4px;}
+
+/* plugins */
+
+#the_page .content .stuffs 		{ margin: 0!important}
+.categoryActions .theme_menuf 	{ display: none;}
Index: tags/2.4.0RC3/themes/elegant/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/elegant/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/elegant/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,15 @@
+<?php
+/*
+Theme Name: elegant
+Version: 2.3.0
+Description: Dark background, grayscale.
+Theme URI: 
+Author: Piwigo team
+Author URI: http://piwigo.org
+*/
+$themeconf = array(
+  'name'  => 'elegant',
+  'parent' => 'default',
+  'local_head'  => 'local_head.tpl'
+);
+?>
Index: tags/2.4.0RC3/themes/index.php
===================================================================
--- tags/2.4.0RC3/themes/index.php	(revision 14585)
+++ tags/2.4.0RC3/themes/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/themes/smartpocket/jquery.mobile.css
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/jquery.mobile.css	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/jquery.mobile.css	(revision 14585)
@@ -0,0 +1,1869 @@
+/*
+* jQuery Mobile Framework 1.0.1
+* http://jquerymobile.com
+*
+* Copyright 2011-2012 (c) jQuery Project
+* Dual licensed under the MIT or GPL Version 2 licenses.
+* http://jquery.org/license
+*
+*/
+/* Swatches */
+
+/* A
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-bar-a {
+	border: 1px solid 		#2A2A2A /*{a-bar-border}*/;
+	background: 			#111111 /*{a-bar-background-color}*/;
+	color: 					#ffffff /*{a-bar-color}*/;
+	font-weight: bold;
+	text-shadow: 0 /*{a-bar-shadow-x}*/ -1px /*{a-bar-shadow-y}*/ 1px /*{a-bar-shadow-radius}*/ #000000 /*{a-bar-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #3c3c3c /*{a-bar-background-start}*/), to( #111 /*{a-bar-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#3c3c3c /*{a-bar-background-start}*/, #111 /*{a-bar-background-end}*/);
+}
+.ui-bar-a, 
+.ui-bar-a input, 
+.ui-bar-a select, 
+.ui-bar-a textarea, 
+.ui-bar-a button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-a .ui-link-inherit {
+	color: #fff /*{a-bar-color}*/;
+}
+
+.ui-bar-a .ui-link {
+	color: #7cc4e7 /*{a-bar-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-bar-a .ui-link:hover {
+	color: #2489CE /*{a-bar-link-hover}*/;
+}
+
+.ui-bar-a .ui-link:active {
+	color: #2489CE /*{a-bar-link-active}*/;
+}
+
+.ui-bar-a .ui-link:visited {
+    color: #2489CE /*{a-bar-link-visited}*/;
+}
+.ui-body-a,
+.ui-dialog.ui-overlay-a {
+	border: 1px solid 		#2A2A2A /*{a-body-border}*/;
+	background: 			#222222 /*{a-body-background-color}*/;
+	color: 					#fff /*{a-body-color}*/;
+	 text-shadow: 0 /*{a-body-shadow-x}*/ 1px /*{a-body-shadow-y}*/ 0 /*{a-body-shadow-radius}*/ #000 /*{a-body-shadow-color}*/;
+	font-weight: normal;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-body-background-start}*/), to( #222 /*{a-body-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#666 /*{a-body-background-start}*/, #222 /*{a-body-background-end}*/);	
+}
+.ui-body-a,
+.ui-body-a input,
+.ui-body-a select,
+.ui-body-a textarea,
+.ui-body-a button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-a .ui-link-inherit {
+	color: 	#fff /*{a-body-color}*/;
+}
+
+.ui-body-a .ui-link {
+	color: #2489CE /*{a-body-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-body-a .ui-link:hover {
+	color: #2489CE /*{a-body-link-hover}*/;
+}
+
+.ui-body-a .ui-link:active {
+	color: #2489CE /*{a-body-link-active}*/;
+}
+
+.ui-body-a .ui-link:visited {
+    color: #2489CE /*{a-body-link-visited}*/;
+}
+
+.ui-btn-up-a {
+	border: 1px solid 		#222 /*{a-bup-border}*/;
+	background: 			#333333 /*{a-bup-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{a-bup-color}*/;
+	text-shadow: 0 /*{a-bup-shadow-x}*/ -1px /*{a-bup-shadow-y}*/ 1px /*{a-bup-shadow-radius}*/ #000 /*{a-bup-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #555 /*{a-bup-background-start}*/), to( #333 /*{a-bup-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#555 /*{a-bup-background-start}*/, #333 /*{a-bup-background-end}*/);
+}
+.ui-btn-up-a a.ui-link-inherit {
+	color: 					#fff /*{a-bup-color}*/;
+}
+.ui-btn-hover-a {
+	border: 1px solid 		#000 /*{a-bhover-border}*/;
+	background: 			#444444 /*{a-bhover-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{a-bhover-color}*/;
+	text-shadow: 0 /*{a-bhover-shadow-x}*/ -1px /*{a-bhover-shadow-y}*/ 1px /*{a-bhover-shadow-radius}*/ #000 /*{a-bhover-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #666 /*{a-bhover-background-start}*/), to( #444 /*{a-bhover-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#666 /*{a-bhover-background-start}*/, #444 /*{a-bhover-background-end}*/);
+}
+.ui-btn-hover-a a.ui-link-inherit {
+	color: 					#fff /*{a-bhover-color}*/;
+}
+.ui-btn-down-a {
+	border: 1px solid 		#000 /*{a-bdown-border}*/;
+	background: 			#3d3d3d /*{a-bdown-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{a-bdown-color}*/;
+	text-shadow: 0 /*{a-bdown-shadow-x}*/ -1px /*{a-bdown-shadow-y}*/ 1px /*{a-bdown-shadow-radius}*/ #000 /*{a-bdown-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #333 /*{a-bdown-background-start}*/), to( #5a5a5a /*{a-bdown-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#333 /*{a-bdown-background-start}*/, #5a5a5a /*{a-bdown-background-end}*/);
+}
+.ui-btn-down-a a.ui-link-inherit {
+	color: 					#fff /*{a-bdown-color}*/;
+}
+.ui-btn-up-a,
+.ui-btn-hover-a,
+.ui-btn-down-a {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+	text-decoration: none;
+}
+
+
+/* B
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-bar-b {
+	border: 1px solid 		#456f9a /*{b-bar-border}*/;
+	background: 			#5e87b0 /*{b-bar-background-color}*/;
+	color: 					#fff /*{b-bar-color}*/;
+	font-weight: bold;
+	text-shadow: 0 /*{b-bar-shadow-x}*/ -1px /*{b-bar-shadow-y}*/ 1px /*{b-bar-shadow-radius}*/ #254f7a /*{b-bar-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #81a8ce /*{b-bar-background-start}*/), to( #5e87b0 /*{b-bar-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#81a8ce /*{b-bar-background-start}*/, #5e87b0 /*{b-bar-background-end}*/);
+}
+.ui-bar-b,
+.ui-bar-b input,
+.ui-bar-b select,
+.ui-bar-b textarea,
+.ui-bar-b button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-b .ui-link-inherit {
+	color: 	#fff /*{b-bar-color}*/;
+}
+.ui-bar-b .ui-link {
+	color: #ddf0f8 /*{b-bar-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-bar-b .ui-link:hover {
+	color: #ddf0f8 /*{b-bar-link-hover}*/;
+}
+
+.ui-bar-b .ui-link:active {
+	color: #ddf0f8 /*{b-bar-link-active}*/;
+}
+
+.ui-bar-b .ui-link:visited {
+    color: #ddf0f8 /*{b-bar-link-visited}*/;
+}
+.ui-body-b,
+.ui-dialog.ui-overlay-b {
+	border: 1px solid 		#C6C6C6 /*{b-body-border}*/;
+	background: 			#cccccc /*{b-body-background-color}*/;
+	color: 					#333333 /*{b-body-color}*/;
+	text-shadow: 0 /*{b-body-shadow-x}*/ 1px /*{b-body-shadow-y}*/ 0 /*{b-body-shadow-radius}*/ #fff /*{b-body-shadow-color}*/;
+	font-weight: normal;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #e6e6e6 /*{b-body-background-start}*/), to( #ccc /*{b-body-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#e6e6e6 /*{b-body-background-start}*/, #ccc /*{b-body-background-end}*/);
+}
+.ui-body-b,
+.ui-body-b input,
+.ui-body-b select,
+.ui-body-b textarea,
+.ui-body-b button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-b .ui-link-inherit {
+	color: 	#333333 /*{b-body-color}*/;
+}
+
+.ui-body-b .ui-link {
+	color: #2489CE /*{b-body-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-body-b .ui-link:hover {
+	color: #2489CE /*{b-body-link-hover}*/;
+}
+
+.ui-body-b .ui-link:active {
+	color: #2489CE /*{b-body-link-active}*/;
+}
+
+.ui-body-b .ui-link:visited {
+    color: #2489CE /*{b-body-link-visited}*/;
+}
+
+.ui-btn-up-b {
+	border: 1px solid 		#145072 /*{b-bup-border}*/;
+	background: 			#2567ab /*{b-bup-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{b-bup-color}*/;
+	text-shadow: 0 /*{b-bup-shadow-x}*/ -1px /*{b-bup-shadow-y}*/ 1px /*{b-bup-shadow-radius}*/ #145072 /*{b-bup-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #5f9cc5 /*{b-bup-background-start}*/), to( #396b9e /*{b-bup-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#5f9cc5 /*{b-bup-background-start}*/, #396b9e /*{b-bup-background-end}*/);
+}
+.ui-btn-up-b a.ui-link-inherit {
+	color: 					#fff /*{b-bup-color}*/;
+}
+.ui-btn-hover-b {
+	border: 1px solid 		#00516e /*{b-bhover-border}*/;
+	background: 			#4b88b6 /*{b-bhover-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{b-bhover-color}*/;
+	text-shadow: 0 /*{b-bhover-shadow-x}*/ -1px /*{b-bhover-shadow-y}*/ 1px /*{b-bhover-shadow-radius}*/ #014D68 /*{b-bhover-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #72b0d4 /*{b-bhover-background-start}*/), to( #4b88b6 /*{b-bhover-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#72b0d4 /*{b-bhover-background-start}*/, #4b88b6 /*{b-bhover-background-end}*/);
+}
+.ui-btn-hover-b a.ui-link-inherit {
+	color: 					#fff /*{b-bhover-color}*/;
+}
+.ui-btn-down-b {
+	border: 1px solid 		#225377 /*{b-bdown-border}*/;
+	background: 			#4e89c5 /*{b-bdown-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{b-bdown-color}*/;
+	text-shadow: 0 /*{b-bdown-shadow-x}*/ -1px /*{b-bdown-shadow-y}*/ 1px /*{b-bdown-shadow-radius}*/ #225377 /*{b-bdown-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #396b9e /*{b-bdown-background-start}*/), to( #4e89c5 /*{b-bdown-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#396b9e /*{b-bdown-background-start}*/, #4e89c5 /*{b-bdown-background-end}*/);
+}
+.ui-btn-down-b a.ui-link-inherit {
+	color: 					#fff /*{b-bdown-color}*/;
+}
+.ui-btn-up-b,
+.ui-btn-hover-b,
+.ui-btn-down-b {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+	text-decoration: none;
+}
+
+
+/* C
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-bar-c {
+	border: 1px solid 		#B3B3B3 /*{c-bar-border}*/;
+	background: 			#e9eaeb /*{c-bar-background-color}*/;
+	color: 					#3E3E3E /*{c-bar-color}*/;
+	font-weight: bold;
+	text-shadow: 0 /*{c-bar-shadow-x}*/ 1px /*{c-bar-shadow-y}*/ 1px /*{c-bar-shadow-radius}*/ 	#fff /*{c-bar-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #f0f0f0 /*{c-bar-background-start}*/), to( #e9eaeb /*{c-bar-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#f0f0f0 /*{c-bar-background-start}*/, #e9eaeb /*{c-bar-background-end}*/);
+}
+
+.ui-bar-c .ui-link-inherit {
+	color: 	#3E3E3E /*{c-bar-color}*/;
+}
+.ui-bar-c .ui-link {
+	color: #7cc4e7 /*{c-bar-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-bar-c .ui-link:hover {
+	color: #2489CE /*{c-bar-link-hover}*/;
+}
+
+.ui-bar-c .ui-link:active {
+	color: #2489CE /*{c-bar-link-active}*/;
+}
+
+.ui-bar-c .ui-link:visited {
+    color: #2489CE /*{c-bar-link-visited}*/;
+}
+
+.ui-bar-c,
+.ui-bar-c input,
+.ui-bar-c select,
+.ui-bar-c textarea,
+.ui-bar-c button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-c,
+.ui-dialog.ui-overlay-c {
+	border: 1px solid 		#B3B3B3 /*{c-body-border}*/;
+	color: 					#333333 /*{c-body-color}*/;
+	text-shadow: 0 /*{c-body-shadow-x}*/ 1px /*{c-body-shadow-y}*/ 0 /*{c-body-shadow-radius}*/ #fff /*{c-body-shadow-color}*/;
+	background: 			#f0f0f0 /*{c-body-background-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-body-background-start}*/), to( #ddd /*{c-body-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#eee /*{c-body-background-start}*/, #ddd /*{c-body-background-end}*/);
+}
+.ui-body-c,
+.ui-body-c input,
+.ui-body-c select,
+.ui-body-c textarea,
+.ui-body-c button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+
+.ui-body-c .ui-link-inherit {
+	color: 	#333333 /*{c-body-color}*/;
+}
+
+.ui-body-c .ui-link {
+	color: #2489CE /*{c-body-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-body-c .ui-link:hover {
+	color: #2489CE /*{c-body-link-hover}*/;
+}
+
+.ui-body-c .ui-link:active {
+	color: #2489CE /*{c-body-link-active}*/;
+}
+
+.ui-body-c .ui-link:visited {
+    color: #2489CE /*{c-body-link-visited}*/;
+}
+
+.ui-btn-up-c {
+	border: 1px solid 		#ccc /*{c-bup-border}*/;
+	background: 			#eee /*{c-bup-background-color}*/;
+	font-weight: bold;
+	color: 					#444 /*{c-bup-color}*/;
+	text-shadow: 0 /*{c-bup-shadow-x}*/ 1px /*{c-bup-shadow-y}*/ 1px /*{c-bup-shadow-radius}*/ #f6f6f6 /*{c-bup-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd /*{c-bup-background-start}*/), to( #eee /*{c-bup-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fdfdfd /*{c-bup-background-start}*/, #eee /*{c-bup-background-end}*/);
+}
+.ui-btn-up-c a.ui-link-inherit {
+	color: 					#2F3E46 /*{c-bup-color}*/;
+}
+
+.ui-btn-hover-c {
+	border: 1px solid 		#bbbbbb /*{c-bhover-border}*/;
+	background: 			#dadada /*{c-bhover-background-color}*/;
+	font-weight: bold;
+	color: 					#101010 /*{c-bhover-color}*/;
+	text-shadow: 0 /*{c-bhover-shadow-x}*/ 1px /*{c-bhover-shadow-y}*/ 1px /*{c-bhover-shadow-radius}*/ #fff /*{c-bhover-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #ededed /*{c-bhover-background-start}*/), to( #dadada /*{c-bhover-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#ededed /*{c-bhover-background-start}*/, #dadada /*{c-bhover-background-end}*/);
+}
+.ui-btn-hover-c a.ui-link-inherit {
+	color: 					#2F3E46 /*{c-bhover-color}*/;
+}
+.ui-btn-down-c {
+	border: 1px solid 		#808080 /*{c-bdown-border}*/;
+	background: 			#fdfdfd /*{c-bdown-background-color}*/;
+	font-weight: bold;
+	color: 					#111111 /*{c-bdown-color}*/;
+	text-shadow: 0 /*{c-bdown-shadow-x}*/ 1px /*{c-bdown-shadow-y}*/ 1px /*{c-bdown-shadow-radius}*/ #ffffff /*{c-bdown-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{c-bdown-background-start}*/), to( #fdfdfd /*{c-bdown-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#eee /*{c-bdown-background-start}*/, #fdfdfd /*{c-bdown-background-end}*/);
+}
+.ui-btn-down-c a.ui-link-inherit {
+	color: 					#2F3E46 /*{c-bdown-color}*/;
+}
+.ui-btn-up-c,
+.ui-btn-hover-c,
+.ui-btn-down-c {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+	text-decoration: none;
+}
+
+
+/* D
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-bar-d {
+	border: 1px solid 		#ccc /*{d-bar-border}*/;
+	background: 			#bbb /*{d-bar-background-color}*/;
+	color: 					#333 /*{d-bar-color}*/;
+	text-shadow: 0 /*{d-bar-shadow-x}*/ 1px /*{d-bar-shadow-y}*/ 0 /*{d-bar-shadow-radius}*/ #eee /*{d-bar-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #ddd /*{d-bar-background-start}*/), to( #bbb /*{d-bar-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#ddd /*{d-bar-background-start}*/, #bbb /*{d-bar-background-end}*/);
+}
+.ui-bar-d,
+.ui-bar-d input,
+.ui-bar-d select,
+.ui-bar-d textarea,
+.ui-bar-d button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+
+.ui-bar-d .ui-link-inherit {
+	color: 	#333333 /*{d-bar-color}*/;
+}
+.ui-bar-d .ui-link {
+	color: #2489CE /*{d-bar-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-bar-d .ui-link:hover {
+	color: #2489CE /*{d-bar-link-hover}*/;
+}
+
+.ui-bar-d .ui-link:active {
+	color: #2489CE /*{d-bar-link-active}*/;
+}
+
+.ui-bar-d .ui-link:visited {
+    color: #2489CE /*{d-bar-link-visited}*/;
+}
+
+.ui-body-d,
+.ui-dialog.ui-overlay-d {
+	border: 1px solid 		#ccc /*{d-body-border}*/;
+	color: 					#333333 /*{d-body-color}*/;
+	text-shadow: 0 /*{d-body-shadow-x}*/ 1px /*{d-body-shadow-y}*/ 0 /*{d-body-shadow-radius}*/ 	#fff /*{d-body-shadow-color}*/;
+	background: 			#ffffff /*{d-body-background-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-body-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fff /*{d-body-background-start}*/, #fff /*{d-body-background-end}*/);
+}
+.ui-body-d,
+.ui-body-d input,
+.ui-body-d select,
+.ui-body-d textarea,
+.ui-body-d button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+
+.ui-body-d .ui-link-inherit {
+	color: 	#333333 /*{d-body-color}*/;
+}
+
+.ui-body-d .ui-link {
+	color: #2489CE /*{d-body-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-body-d .ui-link:hover {
+	color: #2489CE /*{d-body-link-hover}*/;
+}
+
+.ui-body-d .ui-link:active {
+	color: #2489CE /*{d-body-link-active}*/;
+}
+
+.ui-body-d .ui-link:visited {
+    color: #2489CE /*{d-body-link-visited}*/;
+}
+
+.ui-btn-up-d {
+	border: 1px solid 		#ccc /*{d-bup-border}*/;
+	background: 			#fff /*{d-bup-background-color}*/;
+	font-weight: bold;
+	color: 					#444 /*{d-bup-color}*/;
+	text-shadow: 0 /*{d-bup-shadow-x}*/ 1px /*{d-bup-shadow-y}*/ 1px /*{d-bup-shadow-radius}*/ #fff /*{d-bup-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fff), to( #fff /*{d-bup-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fff /*{d-bup-background-start}*/, #fff /*{d-bup-background-end}*/);
+}
+.ui-btn-up-d a.ui-link-inherit {
+	color: 					#333 /*{d-bup-color}*/;
+}
+.ui-btn-hover-d {
+	border: 1px solid 		#aaa /*{d-bhover-border}*/;
+	background: 			#eeeeee /*{d-bhover-background-color}*/;
+	font-weight: bold;
+	color: 					#222 /*{d-bhover-color}*/;
+	cursor: pointer;
+	text-shadow: 0 /*{d-bhover-shadow-x}*/ 1px /*{d-bhover-shadow-y}*/ 1px /*{d-bhover-shadow-radius}*/ 	#fff /*{d-bhover-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fdfdfd), to( #eee /*{d-bhover-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fdfdfd /*{d-bhover-background-start}*/, #eee /*{d-bhover-background-end}*/);
+}
+.ui-btn-hover-d a.ui-link-inherit {
+	color: 					#222 /*{d-bhover-color}*/;
+}
+.ui-btn-down-d {
+	border: 1px solid 		#aaaaaa /*{d-bdown-border}*/;
+	background: 			#ffffff /*{d-bdown-background-color}*/;
+	font-weight: bold;
+	color: 					#111 /*{d-bdown-color}*/;
+	text-shadow: 0 /*{d-bdown-shadow-x}*/ 1px /*{d-bdown-shadow-y}*/ 1px /*{d-bdown-shadow-radius}*/ 	#ffffff /*{d-bdown-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #eee /*{d-bdown-background-start}*/), to( #fff /*{d-bdown-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#eee /*{d-bdown-background-start}*/, #fff /*{d-bdown-background-end}*/);
+}
+.ui-btn-down-d a.ui-link-inherit {
+	color: 					#111 /*{d-bdown-color}*/;
+}
+.ui-btn-up-d,
+.ui-btn-hover-d,
+.ui-btn-down-d {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+	text-decoration: none;
+}
+
+
+/* E
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-bar-e {
+	border: 1px solid 		#F7C942 /*{e-bar-border}*/;
+	background: 			#fadb4e /*{e-bar-background-color}*/;
+	color: 					#333 /*{e-bar-color}*/;
+	text-shadow: 0 /*{e-bar-shadow-x}*/ 1px /*{e-bar-shadow-y}*/ 0 /*{e-bar-shadow-radius}*/ 	#fff /*{e-bar-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bar-background-start}*/), to( #fadb4e /*{e-bar-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fceda7 /*{e-bar-background-start}*/, #fadb4e /*{e-bar-background-end}*/);
+}
+.ui-bar-e,
+.ui-bar-e input,
+.ui-bar-e select,
+.ui-bar-e textarea,
+.ui-bar-e button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-bar-e .ui-link-inherit {
+	color: 	#333333 /*{e-bar-color}*/;
+}
+.ui-bar-e .ui-link {
+	color: #2489CE /*{e-bar-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-bar-e .ui-link:hover {
+	color: #2489CE /*{e-bar-link-hover}*/;
+}
+
+.ui-bar-e .ui-link:active {
+	color: #2489CE /*{e-bar-link-active}*/;
+}
+
+.ui-bar-e .ui-link:visited {
+    color: #2489CE /*{e-bar-link-visited}*/;
+}
+
+.ui-body-e,
+.ui-dialog.ui-overlay-e {
+	border: 1px solid 		#F7C942 /*{e-body-border}*/;
+	color: 					#333333 /*{e-body-color}*/;
+	text-shadow: 0 /*{e-body-shadow-x}*/ 1px /*{e-body-shadow-y}*/ 0 /*{e-body-shadow-radius}*/ 	#fff /*{e-body-shadow-color}*/;
+	background: 			#faeb9e /*{e-body-background-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fff /*{e-body-background-start}*/), to( #faeb9e /*{e-body-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fff /*{e-body-background-start}*/, #faeb9e /*{e-body-background-end}*/);
+}
+.ui-body-e,
+.ui-body-e input,
+.ui-body-e select,
+.ui-body-e textarea,
+.ui-body-e button {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-body-e .ui-link-inherit {
+	color: 	#333333 /*{e-body-color}*/;
+}
+
+.ui-body-e .ui-link {
+	color: #2489CE /*{e-body-link-color}*/;
+	font-weight: bold;
+}
+
+.ui-body-e .ui-link:hover {
+	color: #2489CE /*{e-body-link-hover}*/;
+}
+
+.ui-body-e .ui-link:active {
+	color: #2489CE /*{e-body-link-active}*/;
+}
+
+.ui-body-e .ui-link:visited {
+    color: #2489CE /*{e-body-link-visited}*/;
+}
+
+.ui-btn-up-e {
+	border: 1px solid 		#F7C942 /*{e-bup-border}*/;
+	background: 			#fadb4e /*{e-bup-background-color}*/;
+	font-weight: bold;
+	color: 					#333 /*{e-bup-color}*/;
+	text-shadow: 0 /*{e-bup-shadow-x}*/ 1px /*{e-bup-shadow-y}*/ 0 /*{e-bup-shadow-radius}*/ 	#fff /*{e-bup-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fceda7 /*{e-bup-background-start}*/), to( #fadb4e /*{e-bup-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fceda7 /*{e-bup-background-start}*/, #fadb4e /*{e-bup-background-end}*/);
+}
+.ui-btn-up-e a.ui-link-inherit {
+	color: 					#333 /*{e-bup-color}*/;
+}
+.ui-btn-hover-e {
+	border: 1px solid 		#e79952 /*{e-bhover-border}*/;
+	background: 			#fbe26f /*{e-bhover-background-color}*/;
+	font-weight: bold;
+	color: 					#111 /*{e-bhover-color}*/;
+	text-shadow: 0 /*{e-bhover-shadow-x}*/ 1px /*{e-bhover-shadow-y}*/ 1px /*{e-bhover-shadow-radius}*/ 	#fff /*{e-bhover-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fcf0b5 /*{e-bhover-background-start}*/), to( #fbe26f /*{e-bhover-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fcf0b5 /*{e-bhover-background-start}*/, #fbe26f /*{e-bhover-background-end}*/);
+}
+
+.ui-btn-hover-e a.ui-link-inherit {
+	color: 					#333 /*{e-bhover-color}*/;
+}
+.ui-btn-down-e {
+	border: 1px solid 		#F7C942 /*{e-bdown-border}*/;
+	background: 			#fceda7 /*{e-bdown-background-color}*/;
+	font-weight: bold;
+	color: 					#111 /*{e-bdown-color}*/;
+	text-shadow: 0 /*{e-bdown-shadow-x}*/ 1px /*{e-bdown-shadow-y}*/ 1px /*{e-bdown-shadow-radius}*/ 	#ffffff /*{e-bdown-shadow-color}*/;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #fadb4e /*{e-bdown-background-start}*/), to( #fceda7 /*{e-bdown-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#fadb4e /*{e-bdown-background-start}*/, #fceda7 /*{e-bdown-background-end}*/);
+}
+.ui-btn-down-e a.ui-link-inherit {
+	color: 					#333 /*{e-bdown-color}*/;
+}
+.ui-btn-up-e,
+.ui-btn-hover-e,
+.ui-btn-down-e {
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+	text-decoration: none;
+}
+
+/* Structure */
+
+/* links within "buttons" 
+-----------------------------------------------------------------------------------------------------------*/
+
+a.ui-link-inherit {
+	text-decoration: none !important;
+}
+
+
+/* Active class used as the "on" state across all themes
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-btn-active {
+	border: 1px solid 		#155678 /*{global-active-border}*/;
+	background: 			#4596ce /*{global-active-background-color}*/;
+	font-weight: bold;
+	color: 					#fff /*{global-active-color}*/;
+	cursor: pointer;
+	text-shadow: 0 /*{global-active-shadow-x}*/ -1px /*{global-active-shadow-y}*/ 1px /*{global-active-shadow-radius}*/ #145072 /*{global-active-shadow-color}*/;
+	text-decoration: none;
+	background-image: -webkit-gradient(linear, left top, left bottom, from( #85bae4 /*{global-active-background-start}*/), to( #5393c5 /*{global-active-background-end}*/)); /* Saf4+, Chrome */
+	background-image: -webkit-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Chrome 10+, Saf5.1+ */
+	background-image:    -moz-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* FF3.6 */
+	background-image:     -ms-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* IE10 */
+	background-image:      -o-linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/); /* Opera 11.10+ */
+	background-image:         linear-gradient(#85bae4 /*{global-active-background-start}*/, #5393c5 /*{global-active-background-end}*/);
+	font-family: Helvetica, Arial, sans-serif /*{global-font-family}*/;
+}
+.ui-btn-active a.ui-link-inherit {
+	color: 					#fff /*{global-active-color}*/;
+}
+
+
+/* button inner top highlight
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-btn-inner {
+	border-top: 1px solid 	#fff;
+	border-color: 			rgba(255,255,255,.3);
+}
+
+
+/* corner rounding classes
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-corner-tl {
+	-moz-border-radius-topleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-left-radius: 			.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-tr {
+	-moz-border-radius-topright: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-right-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-right-radius: 			.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-bl {
+	-moz-border-radius-bottomleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-bottom-left-radius: 			.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-br {
+	-moz-border-radius-bottomright: 	.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+	border-bottom-right-radius: 		.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-top {
+	-moz-border-radius-topleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-left-radius: 			.6em /*{global-radii-blocks}*/;
+	-moz-border-radius-topright: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-right-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-right-radius: 			.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-bottom {
+	-moz-border-radius-bottomleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-bottom-left-radius: 			.6em /*{global-radii-blocks}*/;
+	-moz-border-radius-bottomright: 	.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+	border-bottom-right-radius: 		.6em /*{global-radii-blocks}*/;
+	}
+.ui-corner-right {
+	-moz-border-radius-topright: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-right-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-right-radius: 			.6em /*{global-radii-blocks}*/;
+	-moz-border-radius-bottomright: 	.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-right-radius: .6em /*{global-radii-blocks}*/;
+	border-bottom-right-radius: 		.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-left {
+	-moz-border-radius-topleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-top-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-top-left-radius: 			.6em /*{global-radii-blocks}*/;
+	-moz-border-radius-bottomleft: 		.6em /*{global-radii-blocks}*/;
+	-webkit-border-bottom-left-radius: 	.6em /*{global-radii-blocks}*/;
+	border-bottom-left-radius: 			.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-all {
+	-moz-border-radius: 				.6em /*{global-radii-blocks}*/;
+	-webkit-border-radius: 				.6em /*{global-radii-blocks}*/;
+	border-radius: 						.6em /*{global-radii-blocks}*/;
+}
+.ui-corner-none {
+	-moz-border-radius: 				   0;
+	-webkit-border-radius: 				   0;
+	border-radius: 						   0;
+}
+
+/* Form field separator
+-----------------------------------------------------------------------------------------------------------*/
+.ui-br {
+	border-bottom: rgb(130,130,130);
+	border-bottom: rgba(130,130,130,.3);
+	border-bottom-width: 1px;
+	border-bottom-style: solid;
+}
+
+/* Interaction cues
+-----------------------------------------------------------------------------------------------------------*/
+.ui-disabled {
+	opacity: 							.3;
+}
+.ui-disabled,
+.ui-disabled a {
+	pointer-events: none;
+	cursor: default;
+}
+
+/* Icons
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-icon,
+.ui-icon-searchfield:after {
+	background: 						#666 /*{global-icon-color}*/;
+	background: 						rgba(0,0,0,.4) /*{global-icon-disc}*/;
+	background-image: url(images/icons-18-white.png) /*{global-icon-set}*/;
+	background-repeat: no-repeat;
+	-moz-border-radius: 				9px;
+	-webkit-border-radius: 				9px;
+	border-radius: 						9px;
+}
+
+
+/* Alt icon color
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-icon-alt {
+	background: 						#fff;
+	background: 						rgba(255,255,255,.3);
+	background-image: url(images/icons-18-black.png);
+	background-repeat: no-repeat;
+}
+
+/* HD/"retina" sprite
+-----------------------------------------------------------------------------------------------------------*/
+
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+       only screen and (min--moz-device-pixel-ratio: 1.5),
+       only screen and (min-resolution: 240dpi) {
+	
+	.ui-icon-plus, .ui-icon-minus, .ui-icon-delete, .ui-icon-arrow-r,
+	.ui-icon-arrow-l, .ui-icon-arrow-u, .ui-icon-arrow-d, .ui-icon-check,
+	.ui-icon-gear, .ui-icon-refresh, .ui-icon-forward, .ui-icon-back,
+	.ui-icon-grid, .ui-icon-star, .ui-icon-alert, .ui-icon-info, .ui-icon-home, .ui-icon-search, .ui-icon-searchfield:after, 
+	.ui-icon-checkbox-off, .ui-icon-checkbox-on, .ui-icon-radio-off, .ui-icon-radio-on {
+		background-image: url(images/icons-36-white.png);
+		-moz-background-size: 776px 18px;
+		-o-background-size: 776px 18px;
+		-webkit-background-size: 776px 18px;
+		background-size: 776px 18px;
+	}
+	.ui-icon-alt {
+		background-image: url(images/icons-36-black.png);
+	}
+}
+
+/* plus minus */
+.ui-icon-plus {
+	background-position: 	-0 50%;
+}
+.ui-icon-minus {
+	background-position: 	-36px 50%;
+}
+
+/* delete/close */
+.ui-icon-delete {
+	background-position: 	-72px 50%;
+}
+
+/* arrows */
+.ui-icon-arrow-r {
+	background-position: 	-108px 50%;
+}
+.ui-icon-arrow-l {
+	background-position: 	-144px 50%;
+}
+.ui-icon-arrow-u {
+	background-position: 	-180px 50%;
+}
+.ui-icon-arrow-d {
+	background-position: 	-216px 50%;
+}
+
+/* misc */
+.ui-icon-check {
+	background-position: 	-252px 50%;
+}
+.ui-icon-gear {
+	background-position: 	-288px 50%;
+}
+.ui-icon-refresh {
+	background-position: 	-324px 50%;
+}
+.ui-icon-forward {
+	background-position: 	-360px 50%;
+}
+.ui-icon-back {
+	background-position: 	-396px 50%;
+}
+.ui-icon-grid {
+	background-position: 	-432px 50%;
+}
+.ui-icon-star {
+	background-position: 	-468px 50%;
+}
+.ui-icon-alert {
+	background-position: 	-504px 50%;
+}
+.ui-icon-info {
+	background-position: 	-540px 50%;
+}
+.ui-icon-home {
+	background-position: 	-576px 50%;
+}
+.ui-icon-search,
+.ui-icon-searchfield:after {
+	background-position: 	-612px 50%;
+}
+.ui-icon-checkbox-off {
+	background-position: 	-684px 50%;
+}
+.ui-icon-checkbox-on {
+	background-position: 	-648px 50%;
+}
+.ui-icon-radio-off {
+	background-position: 	-756px 50%;
+}
+.ui-icon-radio-on {
+	background-position: 	-720px 50%;
+}
+
+
+/* checks,radios */
+.ui-checkbox .ui-icon {
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+.ui-icon-checkbox-off,
+.ui-icon-radio-off {
+	background-color: transparent;	
+}
+.ui-checkbox-on .ui-icon,
+.ui-radio-on .ui-icon {
+	background-color: #4596ce /*{global-active-background-color}*/; /* NOTE: this hex should match the active state color. It's repeated here for cascade */
+}
+
+/* loading icon */
+.ui-icon-loading {
+	background-image: url(images/ajax-loader.png);
+	width: 40px;
+	height: 40px;
+	-moz-border-radius: 20px;
+	-webkit-border-radius: 20px;
+	border-radius: 20px;
+	background-size: 35px 35px;
+}
+
+
+/* Button corner classes
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-btn-corner-tl {
+	-moz-border-radius-topleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-left-radius: 			1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-tr {
+	-moz-border-radius-topright: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-right-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-right-radius: 			1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-bl {
+	-moz-border-radius-bottomleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-bottom-left-radius: 			1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-br {
+	-moz-border-radius-bottomright: 	1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+	border-bottom-right-radius: 		1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-top {
+	-moz-border-radius-topleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-left-radius: 			1em /*{global-radii-buttons}*/;
+	-moz-border-radius-topright: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-right-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-right-radius: 			1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-bottom {
+	-moz-border-radius-bottomleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-bottom-left-radius: 			1em /*{global-radii-buttons}*/;
+	-moz-border-radius-bottomright: 	1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+	border-bottom-right-radius: 		1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-right {
+	 -moz-border-radius-topright: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-right-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-right-radius: 			1em /*{global-radii-buttons}*/;
+	-moz-border-radius-bottomright: 	1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-right-radius: 1em /*{global-radii-buttons}*/;
+	border-bottom-right-radius: 		1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-left {
+	-moz-border-radius-topleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-top-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-top-left-radius: 			1em /*{global-radii-buttons}*/;
+	-moz-border-radius-bottomleft: 		1em /*{global-radii-buttons}*/;
+	-webkit-border-bottom-left-radius: 	1em /*{global-radii-buttons}*/;
+	border-bottom-left-radius: 			1em /*{global-radii-buttons}*/;
+}
+.ui-btn-corner-all {
+	-moz-border-radius: 				1em /*{global-radii-buttons}*/;
+	-webkit-border-radius: 				1em /*{global-radii-buttons}*/;
+	border-radius: 						1em /*{global-radii-buttons}*/;
+}
+
+/* radius clip workaround for cleaning up corner trapping */
+.ui-corner-tl,
+.ui-corner-tr,
+.ui-corner-bl, 
+.ui-corner-br,
+.ui-corner-top,
+.ui-corner-bottom, 
+.ui-corner-right,
+.ui-corner-left,
+.ui-corner-all,
+.ui-btn-corner-tl,
+.ui-btn-corner-tr,
+.ui-btn-corner-bl, 
+.ui-btn-corner-br,
+.ui-btn-corner-top,
+.ui-btn-corner-bottom, 
+.ui-btn-corner-right,
+.ui-btn-corner-left,
+.ui-btn-corner-all {
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+/* Overlay / modal
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-overlay {
+	background: #666;
+	opacity: .5;
+	filter: Alpha(Opacity=50);
+	position: absolute;
+	width: 100%;
+	height: 100%;
+}
+.ui-overlay-shadow {
+	-moz-box-shadow: 0px 0px 12px 			rgba(0,0,0,.6);
+	-webkit-box-shadow: 0px 0px 12px 		rgba(0,0,0,.6);
+	box-shadow: 0px 0px 12px 				rgba(0,0,0,.6);
+}
+.ui-shadow {
+	-moz-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ 			rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+	-webkit-box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ 		rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+	box-shadow: 0px 1px 4px /*{global-box-shadow-size}*/ 				rgba(0,0,0,.3) /*{global-box-shadow-color}*/;
+}
+.ui-bar-a .ui-shadow,
+.ui-bar-b .ui-shadow ,
+.ui-bar-c .ui-shadow  {
+	-moz-box-shadow: 0px 1px 0 				rgba(255,255,255,.3);
+	-webkit-box-shadow: 0px 1px 0 			rgba(255,255,255,.3);
+	box-shadow: 0px 1px 0 					rgba(255,255,255,.3);
+}
+.ui-shadow-inset {
+	-moz-box-shadow: inset 0px 1px 4px 		rgba(0,0,0,.2);
+	-webkit-box-shadow: inset 0px 1px 4px 	rgba(0,0,0,.2);
+	box-shadow: inset 0px 1px 4px 			rgba(0,0,0,.2);
+}
+.ui-icon-shadow {
+	-moz-box-shadow: 0px 1px 0 				rgba(255,255,255,.4);
+	-webkit-box-shadow: 0px 1px 0 			rgba(255,255,255,.4);
+	box-shadow: 0px 1px 0 					rgba(255,255,255,.4);
+}
+
+/* Focus state - set here for specificity
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-focus {
+	-moz-box-shadow: 0px 0px 12px 		#387bbe /*{global-active-background-color}*/;
+	-webkit-box-shadow: 0px 0px 12px 	#387bbe /*{global-active-background-color}*/;
+	box-shadow: 0px 0px 12px 			#387bbe /*{global-active-background-color}*/;
+}
+
+/* unset box shadow in browsers that don't do it right
+-----------------------------------------------------------------------------------------------------------*/
+
+.ui-mobile-nosupport-boxshadow * {
+	-moz-box-shadow: none !important;
+	-webkit-box-shadow: none !important;
+	box-shadow: none !important;
+}
+
+/* ...and bring back focus */
+.ui-mobile-nosupport-boxshadow .ui-focus {
+	outline-width: 2px;
+}
+/* some unsets - more probably needed */
+.ui-mobile, .ui-mobile body { height: 100%; }
+.ui-mobile fieldset, .ui-page { padding: 0; margin: 0; }
+.ui-mobile a img, .ui-mobile fieldset { border-width: 0; }
+
+/* responsive page widths */
+.ui-mobile-viewport {  margin: 0; overflow-x: visible; -webkit-text-size-adjust: none; -ms-text-size-adjust:none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+/* Issue #2066 */
+body.ui-mobile-viewport,
+div.ui-mobile-viewport { overflow-x: hidden; }
+
+/* "page" containers - full-screen views, one should always be in view post-pageload */
+.ui-mobile [data-role=page], .ui-mobile [data-role=dialog], .ui-page { top: 0; left: 0; width: 100%; min-height: 100%; position: absolute; display: none; border: 0; }
+.ui-mobile .ui-page-active { display: block; overflow: visible; }
+
+/* on ios4, setting focus on the page element causes flashing during transitions when there is an outline, so we turn off outlines */
+.ui-page { outline: none; }
+
+/*orientations from js are available */
+@media screen and (orientation: portrait){
+.ui-mobile, .ui-mobile .ui-page { min-height: 420px; }
+}
+@media screen and (orientation: landscape){
+.ui-mobile, .ui-mobile .ui-page { min-height: 300px; }
+}
+
+/* native overflow scrolling */
+.ui-page.ui-mobile-touch-overflow,
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+	overflow: auto;
+	height: 100%;
+	left: 0;
+	right: 0;
+	-webkit-overflow-scrolling: touch;
+	-moz-overflow-scrolling: touch;
+	-o-overflow-scrolling: touch;
+	-ms-overflow-scrolling: touch;
+	overflow-scrolling: touch;
+}
+.ui-page.ui-mobile-touch-overflow,
+.ui-page.ui-mobile-touch-overflow * {
+	/* some level of transform keeps elements from blinking out of visibility on iOS */
+	-webkit-transform: rotateY(0);
+}
+.ui-page.ui-mobile-pre-transition {
+	display: block;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview {
+	margin-top: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-inset {
+	margin-top: 1em;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-filter {
+	margin-top: .2em;
+	margin-bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content .ui-listview-filter-inset {
+	margin-bottom: -.9em;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-header .ui-btn { 
+	z-index: 10;
+}
+
+/* loading screen */
+.ui-loading .ui-mobile-viewport { overflow: hidden !important; }
+.ui-loading .ui-loader { display: block; }
+.ui-loading .ui-page { overflow: hidden;  }
+.ui-loader { display: none; position: absolute; opacity: .85; z-index: 100; left: 50%; width: 200px; margin-left: -130px; margin-top: -35px; padding: 10px 30px; }
+.ui-loader h1 { font-size: 15px; text-align: center; }
+.ui-loader .ui-icon { position: static; display: block; opacity: .9; margin: 0 auto; width: 35px; height: 35px; background-color: transparent; }
+
+/*fouc*/
+.ui-mobile-rendering > * { visibility: hidden; }
+
+/*headers, content panels*/
+.ui-bar, .ui-body { position: relative; padding: .4em 15px;  overflow: hidden; display: block;  clear:both;  }
+.ui-bar { font-size: 16px; margin: 0; }
+.ui-bar h1, .ui-bar h2, .ui-bar h3, .ui-bar h4, .ui-bar h5, .ui-bar h6 { margin: 0; padding: 0; font-size: 16px; display: inline-block; }
+
+.ui-header, .ui-footer { display: block; }
+.ui-page .ui-header, .ui-page .ui-footer { position: relative; }
+.ui-header .ui-btn-left { position: absolute; left: 10px; top: .4em;  }
+.ui-header .ui-btn-right { position: absolute; right: 10px; top: .4em; }
+.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 90px .8em;  padding: 0;  text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; }
+.ui-footer .ui-title { margin: .6em 15px .8em;  }
+
+/*content area*/
+.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; }
+.ui-page-fullscreen .ui-content { padding:0; }
+
+/* native fixed headers and footers */
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed,
+.ui-mobile-touch-overflow.ui-page.ui-native-fullscreen {
+	overflow: visible;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-header,
+.ui-mobile-touch-overflow.ui-native-fixed .ui-footer {
+	position: fixed;
+	left: 0;
+	right: 0;
+	top: 0;
+	z-index: 200;
+}
+.ui-mobile-touch-overflow.ui-page.ui-native-fixed .ui-footer {
+	top: auto;
+	bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+	padding-top: 2.5em;
+	padding-bottom: 3em;
+	top: 0;
+	bottom: 0;
+	height: auto;
+	position: absolute;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content {
+	padding-top: 0;
+	padding-bottom: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-header,
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-footer {
+	opacity: .9;
+}
+.ui-native-bars-hidden {
+	display: none;
+}
+
+/* icons sizing */
+.ui-icon { width: 18px; height: 18px; }
+
+/* fullscreen class on ui-content div */
+.ui-fullscreen {  }
+.ui-fullscreen img { max-width: 100%; }
+
+/* non-js content hiding */
+.ui-nojs { position: absolute; left: -9999px; }
+
+/* accessible content hiding */
+.ui-hide-label label,
+.ui-hidden-accessible { position: absolute !important; left: -9999px; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
+.spin  {
+	-webkit-transform: rotate(360deg);
+	-webkit-animation-name: spin;
+	-webkit-animation-duration: 1s;
+	-webkit-animation-iteration-count:  infinite;
+	-webkit-animation-timing-function: linear;
+}
+@-webkit-keyframes spin {
+	from {-webkit-transform: rotate(0deg);}
+  	to {-webkit-transform: rotate(360deg);}
+}
+
+/* Transitions from jQtouch (with small modifications): http://www.jqtouch.com/
+Built by David Kaneda and maintained by Jonathan Stark.
+*/
+.in, .out {
+	-webkit-animation-timing-function: ease-in-out;
+	-webkit-animation-duration: 350ms;
+}
+
+
+.slide.out {
+	-webkit-transform: translateX(-100%);
+	-webkit-animation-name: slideouttoleft;
+}
+
+.slide.in {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromright;
+}
+
+.slide.out.reverse {
+	-webkit-transform: translateX(100%);
+	-webkit-animation-name: slideouttoright;
+}
+
+.slide.in.reverse {
+	-webkit-transform: translateX(0);
+	-webkit-animation-name: slideinfromleft;
+}
+
+.slideup.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slideup.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfrombottom;
+	z-index: 10;
+}
+
+.slideup.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slideup.out.reverse {
+	-webkit-transform: translateY(100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttobottom;
+}
+
+.slidedown.out {
+	-webkit-animation-name: dontmove;
+	z-index: 0;
+}
+
+.slidedown.in {
+	-webkit-transform: translateY(0);
+	-webkit-animation-name: slideinfromtop;
+	z-index: 10;
+}
+
+.slidedown.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.slidedown.out.reverse {
+	-webkit-transform: translateY(-100%);
+	z-index: 10;
+	-webkit-animation-name: slideouttotop;
+}
+
+@-webkit-keyframes slideinfromright {
+    from { -webkit-transform: translateX(100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideinfromleft {
+    from { -webkit-transform: translateX(-100%); }
+    to { -webkit-transform: translateX(0); }
+}
+
+@-webkit-keyframes slideouttoleft {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(-100%); }
+}
+
+@-webkit-keyframes slideouttoright {
+    from { -webkit-transform: translateX(0); }
+    to { -webkit-transform: translateX(100%); }
+}
+
+@-webkit-keyframes slideinfromtop {
+    from { -webkit-transform: translateY(-100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideinfrombottom {
+    from { -webkit-transform: translateY(100%); }
+    to { -webkit-transform: translateY(0); }
+}
+
+@-webkit-keyframes slideouttobottom {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(100%); }
+}
+
+@-webkit-keyframes slideouttotop {
+    from { -webkit-transform: translateY(0); }
+    to { -webkit-transform: translateY(-100%); }
+}
+@-webkit-keyframes fadein {
+    from { opacity: 0; }
+    to { opacity: 1; }
+}
+
+@-webkit-keyframes fadeout {
+    from { opacity: 1; }
+    to { opacity: 0; }
+}
+
+.fade.out {
+	z-index: 0;
+	-webkit-animation-name: fadeout;
+}
+
+.fade.in {
+	opacity: 1;
+	z-index: 10;
+	-webkit-animation-name: fadein;
+}
+
+/* The properties in this rule are only necessary for the 'flip' transition.
+ * We need specify the perspective to create a projection matrix. This will add
+ * some depth as the element flips. The depth number represents the distance of
+ * the viewer from the z-plane. According to the CSS3 spec, 1000 is a moderate
+ * value.
+ */
+.viewport-flip {
+	-webkit-perspective: 1000;
+	position: absolute;
+}
+
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+	width: 100%;
+	height: 100%;
+	overflow: hidden;
+}
+
+.flip {
+	-webkit-animation-duration: .65s;
+	-webkit-backface-visibility:hidden;
+	-webkit-transform:translateX(0); /* Needed to work around an iOS 3.1 bug that causes listview thumbs to disappear when -webkit-visibility:hidden is used. */
+}
+
+.flip.out {
+	-webkit-transform: rotateY(-180deg) scale(.8);
+	-webkit-animation-name: flipouttoleft;
+}
+
+.flip.in {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromleft;
+}
+
+/* Shake it all about */
+
+.flip.out.reverse {
+	-webkit-transform: rotateY(180deg) scale(.8);
+	-webkit-animation-name: flipouttoright;
+}
+
+.flip.in.reverse {
+	-webkit-transform: rotateY(0) scale(1);
+	-webkit-animation-name: flipinfromright;
+}
+
+@-webkit-keyframes flipinfromright {
+    from { -webkit-transform: rotateY(-180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipinfromleft {
+    from { -webkit-transform: rotateY(180deg) scale(.8); }
+    to { -webkit-transform: rotateY(0) scale(1); }
+}
+
+@-webkit-keyframes flipouttoleft {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(-180deg) scale(.8); }
+}
+
+@-webkit-keyframes flipouttoright {
+    from { -webkit-transform: rotateY(0) scale(1); }
+    to { -webkit-transform: rotateY(180deg) scale(.8); }
+}
+
+
+/* Hackish, but reliable. */
+
+@-webkit-keyframes dontmove {
+    from { opacity: 1; }
+    to { opacity: 1; }
+}
+
+.pop {
+	-webkit-transform-origin: 50% 50%;
+}
+
+.pop.in {
+	-webkit-transform: scale(1);
+    opacity: 1;
+	-webkit-animation-name: popin;
+	z-index: 10;
+}
+
+.pop.in.reverse {
+	z-index: 0;
+	-webkit-animation-name: dontmove;
+}
+
+.pop.out.reverse {
+	-webkit-transform: scale(.2);
+	opacity: 0;
+	-webkit-animation-name: popout;
+	z-index: 10;
+}
+
+@-webkit-keyframes popin {
+    from {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+    to {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+}
+
+@-webkit-keyframes popout {
+    from {
+        -webkit-transform: scale(1);
+        opacity: 1;
+    }
+    to {
+        -webkit-transform: scale(.2);
+        opacity: 0;
+    }
+}/* content configurations. */
+.ui-grid-a, .ui-grid-b, .ui-grid-c, .ui-grid-d { overflow: hidden; }
+.ui-block-a, .ui-block-b, .ui-block-c, .ui-block-d, .ui-block-e { margin: 0; padding: 0; border: 0; float: left; min-height:1px;}
+
+/* grid solo: 100 - single item fallback */
+.ui-grid-solo .ui-block-a { width: 100%; float: none; }
+
+/* grid a: 50/50 */
+.ui-grid-a .ui-block-a, .ui-grid-a .ui-block-b { width: 50%; }
+.ui-grid-a .ui-block-a { clear: left; }
+
+/* grid b: 33/33/33 */
+.ui-grid-b .ui-block-a, .ui-grid-b .ui-block-b, .ui-grid-b .ui-block-c { width: 33.333%; }
+.ui-grid-b .ui-block-a { clear: left; }
+
+/* grid c: 25/25/25/25 */
+.ui-grid-c .ui-block-a, .ui-grid-c .ui-block-b, .ui-grid-c .ui-block-c, .ui-grid-c .ui-block-d { width: 25%; }
+.ui-grid-c .ui-block-a { clear: left; }
+
+/* grid d: 20/20/20/20/20 */
+.ui-grid-d .ui-block-a, .ui-grid-d .ui-block-b, .ui-grid-d .ui-block-c, .ui-grid-d .ui-block-d, .ui-grid-d .ui-block-e { width: 20%; }
+.ui-grid-d .ui-block-a { clear: left; }
+/* fixed page header & footer configuration */
+.ui-header, .ui-footer, .ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer  { position: absolute;  overflow: hidden; width: 100%; border-left-width: 0; border-right-width: 0; }
+.ui-header-fixed, .ui-footer-fixed {
+	z-index: 1000;
+	-webkit-transform: translateZ(0); /* Force header/footer rendering to go through the same rendering pipeline as native page scrolling. */
+}
+.ui-footer-duplicate, .ui-page-fullscreen .ui-fixed-inline { display: none; }
+.ui-page-fullscreen .ui-header, .ui-page-fullscreen .ui-footer { opacity: .9; }
+.ui-navbar { overflow: hidden;  }
+.ui-navbar ul, .ui-navbar-expanded ul { list-style:none; padding: 0; margin: 0; position: relative; display: block; border: 0;}
+.ui-navbar-collapsed ul { float: left; width: 75%; margin-right: -2px; }
+.ui-navbar-collapsed .ui-navbar-toggle { float: left; width: 25%; }
+.ui-navbar li.ui-navbar-truncate { position: absolute; left: -9999px; top: -9999px; }
+.ui-navbar li .ui-btn, .ui-navbar .ui-navbar-toggle .ui-btn { display: block; font-size: 12px; text-align: center; margin: 0; border-right-width: 0; max-width: 100%; }
+.ui-navbar li .ui-btn {  margin-right: -1px; }
+.ui-navbar li .ui-btn:last-child { margin-right: 0; }
+.ui-header .ui-navbar li .ui-btn, .ui-header .ui-navbar .ui-navbar-toggle .ui-btn,
+.ui-footer .ui-navbar li .ui-btn, .ui-footer .ui-navbar .ui-navbar-toggle .ui-btn { border-top-width: 0; border-bottom-width: 0; }
+.ui-navbar .ui-btn-inner { padding-left: 2px; padding-right: 2px; }
+.ui-navbar-noicons li .ui-btn .ui-btn-inner, .ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner { padding-top: .8em; padding-bottom: .9em; }
+/*expanded page styles*/
+.ui-navbar-expanded .ui-btn { margin: 0; font-size: 14px; }
+.ui-navbar-expanded .ui-btn-inner { padding-left: 5px; padding-right: 5px;  }
+.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner { padding: 45px 5px 15px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-top .ui-icon { top: 15px; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner { padding: 15px 5px 45px; text-align: center; }
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon { bottom: 15px; }
+.ui-navbar-expanded li .ui-btn .ui-btn-inner { min-height: 2.5em; }
+.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner { padding-top: 1.8em; padding-bottom: 1.9em; }
+.ui-btn { display: block; text-align: center; cursor:pointer;  position: relative; margin: .5em 5px; padding: 0; }
+.ui-header .ui-btn, .ui-footer .ui-btn, .ui-bar .ui-btn { display: inline-block; font-size: 13px; margin: 0; }
+.ui-btn-inline { display: inline-block; }
+.ui-btn-inner { padding: .6em 25px; display: block; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; position: relative; zoom: 1; }
+.ui-btn input, .ui-btn button { z-index: 2; }
+.ui-header .ui-btn-inner, .ui-footer .ui-btn-inner, .ui-bar .ui-btn-inner { padding: .4em 8px .5em; }
+.ui-btn-icon-notext { width: 24px; height: 24px; }
+.ui-btn-icon-notext .ui-btn-inner { padding: 2px 1px 2px 3px; }
+.ui-btn-text { position: relative; z-index: 1; }
+.ui-btn-icon-notext .ui-btn-text { position: absolute; left: -9999px; }
+.ui-btn-icon-left .ui-btn-inner { padding-left: 33px; }
+.ui-header .ui-btn-icon-left .ui-btn-inner,
+.ui-footer .ui-btn-icon-left .ui-btn-inner,
+.ui-bar .ui-btn-icon-left .ui-btn-inner { padding-left: 27px; }
+.ui-btn-icon-right .ui-btn-inner { padding-right: 33px; }
+.ui-header .ui-btn-icon-right .ui-btn-inner,
+.ui-footer .ui-btn-icon-right .ui-btn-inner,
+.ui-bar .ui-btn-icon-right .ui-btn-inner { padding-right: 27px; }
+.ui-btn-icon-top .ui-btn-inner { padding-top: 33px; }
+.ui-header .ui-btn-icon-top .ui-btn-inner,
+.ui-footer .ui-btn-icon-top .ui-btn-inner,
+.ui-bar .ui-btn-icon-top .ui-btn-inner { padding-top: 27px; }
+.ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 33px; }
+.ui-header .ui-btn-icon-bottom .ui-btn-inner,
+.ui-footer .ui-btn-icon-bottom .ui-btn-inner,
+.ui-bar .ui-btn-icon-bottom .ui-btn-inner { padding-bottom: 27px; }
+
+/*btn icon positioning*/
+.ui-btn-icon-notext .ui-icon { display: block; z-index: 0;}
+.ui-btn-icon-left .ui-icon, .ui-btn-icon-right .ui-icon { position: absolute; top: 50%; margin-top: -9px; }
+.ui-btn-icon-top .ui-icon, .ui-btn-icon-bottom .ui-icon { position: absolute; left: 50%;  margin-left: -9px; }
+.ui-btn-icon-left .ui-icon { left: 10px; }
+.ui-btn-icon-right .ui-icon { right: 10px; }
+.ui-btn-icon-top .ui-icon { top: 10px; }
+.ui-btn-icon-bottom .ui-icon { bottom: 10px; }
+.ui-header .ui-btn-icon-left .ui-icon,
+.ui-footer .ui-btn-icon-left .ui-icon,
+.ui-bar .ui-btn-icon-left .ui-icon { left: 4px; }
+.ui-header .ui-btn-icon-right .ui-icon,
+.ui-footer .ui-btn-icon-right .ui-icon,
+.ui-bar .ui-btn-icon-right .ui-icon { right: 4px; }
+.ui-header .ui-btn-icon-top .ui-icon,
+.ui-footer .ui-btn-icon-top .ui-icon,
+.ui-bar .ui-btn-icon-top .ui-icon { top: 4px; }
+.ui-header .ui-btn-icon-bottom .ui-icon,
+.ui-footer .ui-btn-icon-bottom .ui-icon,
+.ui-bar .ui-btn-icon-bottom .ui-icon { bottom: 4px; }
+
+/*hiding native button,inputs */
+.ui-btn-hidden { position: absolute; top: 0; left: 0; width: 100%; height: 100%; -webkit-appearance: button; opacity: .1; cursor: pointer; background: #fff; background: rgba(255,255,255,0); filter: Alpha(Opacity=.0001); font-size: 1px; border: none; line-height: 999px; }
+.ui-collapsible { margin: .5em 0; }
+.ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -8px; padding: 0; border-width: 0 0 1px 0; position: relative; }
+.ui-collapsible-heading a { text-align: left; margin: 0;  }
+.ui-collapsible-heading a .ui-btn-inner { padding-left: 40px; }
+.ui-collapsible-heading a span.ui-btn { position: absolute; left: 6px; top: 50%; margin: -12px 0 0 0; width: 20px; height: 20px; padding: 1px 0px 1px 2px; text-indent: -9999px; }
+.ui-collapsible-heading a span.ui-btn .ui-btn-inner { padding: 10px 0; }
+.ui-collapsible-heading a span.ui-btn .ui-icon { left: 0; margin-top: -10px; }
+.ui-collapsible-heading-status { position: absolute; top: -9999px; left:0px; }
+.ui-collapsible-content {
+	display: block;
+	margin:  0 -8px;
+	padding: 10px 16px;
+	border-top:  none;      /* Overrides ui-btn-up-* */
+	background-image: none; /* Overrides ui-btn-up-* */
+	font-weight: normal;    /* Overrides ui-btn-up-* */
+}
+.ui-collapsible-content-collapsed { display: none; }
+
+.ui-collapsible-set { margin: .5em 0; }
+.ui-collapsible-set .ui-collapsible { margin: -1px 0 0; }
+.ui-controlgroup, fieldset.ui-controlgroup { padding: 0; margin: .5em 0 1em; }
+.ui-bar .ui-controlgroup { margin: 0 .3em; }
+.ui-controlgroup-label { font-size: 16px; line-height: 1.4; font-weight: normal; margin: 0 0 .3em; }
+.ui-controlgroup-controls { display: block; width: 100%;}
+.ui-controlgroup li { list-style: none; }
+.ui-controlgroup-vertical .ui-btn,
+.ui-controlgroup-vertical .ui-checkbox, .ui-controlgroup-vertical .ui-radio { margin: 0; border-bottom-width: 0;  }
+.ui-controlgroup-controls label.ui-select { position: absolute; left: -9999px; }
+
+.ui-controlgroup-vertical .ui-controlgroup-last { border-bottom-width: 1px; }
+.ui-controlgroup-horizontal { padding: 0; }
+.ui-controlgroup-horizontal .ui-btn, .ui-controlgroup-horizontal .ui-select { display: inline-block; margin: 0 -5px 0 0; }
+.ui-controlgroup-horizontal .ui-checkbox, .ui-controlgroup-horizontal .ui-radio { float: left; margin: 0 -1px 0 0; }
+.ui-controlgroup-horizontal .ui-checkbox .ui-btn, .ui-controlgroup-horizontal .ui-radio .ui-btn,
+.ui-controlgroup-horizontal .ui-checkbox:last-child, .ui-controlgroup-horizontal .ui-radio:last-child { margin-right: 0; }
+.ui-controlgroup-horizontal .ui-controlgroup-last { margin-right: 0; }
+.ui-controlgroup .ui-checkbox label, .ui-controlgroup .ui-radio label { font-size: 16px;  }
+/* conflicts with listview..
+.ui-controlgroup .ui-btn-icon-notext { width: 30px; height: 30px; text-indent: -9999px; }
+.ui-controlgroup .ui-btn-icon-notext .ui-btn-inner {  padding: 5px 6px 5px 5px; }
+*/
+
+@media all and (min-width: 450px){
+	.ui-field-contain .ui-controlgroup-label { vertical-align: top; display: inline-block;  width: 20%;  margin: 0 2% 0 0;  }
+	.ui-field-contain .ui-controlgroup-controls { width: 60%; display: inline-block; }
+	.ui-field-contain .ui-controlgroup .ui-select { width: 100%; } 
+	.ui-field-contain .ui-controlgroup-horizontal .ui-select { width: auto; }
+}	.ui-dialog { min-height: 480px; }
+.ui-dialog .ui-header, 
+.ui-dialog .ui-content, 
+.ui-dialog .ui-footer { 
+	max-width: 500px; 
+	margin: 10% auto 15px auto; 
+	width: 85%; 
+	position: relative; 
+}
+.ui-dialog .ui-header, 
+.ui-dialog .ui-footer  { 
+	padding: 0 15px; 
+	z-index: 10; 
+}
+.ui-dialog .ui-content { 
+	padding: 15px; 
+}
+.ui-dialog .ui-content, 
+.ui-dialog .ui-footer { 
+	margin-top: -15px;  
+}
+.ui-checkbox, .ui-radio { position:relative;  margin: .2em 0 .5em; z-index: 1;  }
+.ui-checkbox .ui-btn, .ui-radio .ui-btn { margin: 0; text-align: left; z-index: 2; }
+.ui-checkbox .ui-btn-inner, .ui-radio .ui-btn-inner { white-space: normal; }
+.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner { padding-left: 45px; }
+.ui-checkbox .ui-btn-icon-right .ui-btn-inner, .ui-radio .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
+.ui-checkbox .ui-icon, .ui-radio .ui-icon { top: 1.1em; }
+.ui-checkbox .ui-btn-icon-left .ui-icon, .ui-radio .ui-btn-icon-left .ui-icon {left: 15px; }
+.ui-checkbox .ui-btn-icon-right .ui-icon, .ui-radio .ui-btn-icon-right .ui-icon {right: 15px; }
+/* input, label positioning */
+.ui-checkbox input,.ui-radio input { position:absolute; left:20px; top:50%; width: 10px; height: 10px;  margin:-5px 0 0 0; outline: 0 !important; z-index: 1; }.ui-field-contain, fieldset.ui-field-contain { padding: 1.5em 0; margin: 0; border-width: 0 0 1px 0; overflow: visible; }
+.ui-field-contain:first-child { border-top-width: 0; }
+@media all and (min-width: 450px){
+	.ui-field-contain, .ui-mobile fieldset.ui-field-contain { border-width: 0; padding: 0; margin: 1em 0; }
+}	.ui-select { display: block; position: relative; }
+.ui-select select { position: absolute; left: -9999px; top: -9999px; }
+.ui-select .ui-btn { overflow: hidden; }
+
+
+.ui-select .ui-btn { opacity: 1; }
+
+/* Fixes #2588 — When Windows Phone 7.5 (Mango) tries to calculate a numeric opacity for a select—including “inherit”—without explicitly specifying an opacity on the parent to give it context, a bug appears where clicking elsewhere on the page after opening the select will open the select again. */
+.ui-select .ui-btn select { cursor: pointer; -webkit-appearance: button; left: 0; top:0; width: 100%;  min-height: 1.5em; min-height: 100%; height: 3em; max-height: 100%; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); z-index: 2; }
+
+.ui-select .ui-disabled { opacity: .3; }
+
+@-moz-document url-prefix() {.ui-select .ui-btn select { opacity: 0.0001; }}
+.ui-select .ui-btn select.ui-select-nativeonly { opacity: 1; text-indent: 0; }
+
+.ui-select .ui-btn-icon-right .ui-btn-inner { padding-right: 45px; }
+.ui-select .ui-btn-icon-right .ui-icon { right: 15px;  }
+
+/* labels */
+label.ui-select { font-size: 16px; line-height: 1.4;  font-weight: normal; margin: 0 0 .3em; display: block; }
+
+/*listbox*/
+.ui-select .ui-btn-text, .ui-selectmenu .ui-btn-text { display: block; min-height: 1em; overflow: hidden; }
+.ui-select .ui-btn-text { text-overflow: ellipsis; }
+
+.ui-selectmenu { position: absolute; padding: 0; z-index: 1100 !important; width: 80%; max-width: 350px; padding: 6px; }
+.ui-selectmenu .ui-listview { margin: 0; }
+.ui-selectmenu .ui-btn.ui-li-divider { cursor: default; }
+.ui-selectmenu-hidden { top: -9999px; left: -9999px; }
+.ui-selectmenu-screen { position: absolute; top: 0; left: 0; width: 100%; height: 100%;  z-index: 99; }
+.ui-screen-hidden, .ui-selectmenu-list .ui-li .ui-icon { display: none; }
+.ui-selectmenu-list .ui-li .ui-icon { display: block; }
+.ui-li.ui-selectmenu-placeholder { display: none; }
+.ui-selectmenu .ui-header .ui-title { margin: 0.6em 46px 0.8em; }
+
+@media all and (min-width: 450px){
+	.ui-field-contain label.ui-select { vertical-align: top;  display: inline-block;  width: 20%;  margin: 0 2% 0 0; }
+	.ui-field-contain .ui-select { width: 60%; display: inline-block; }
+}
+
+/* when no placeholder is defined in a multiple select, the header height doesn't even extend past the close button.  this shim's content in there */
+.ui-selectmenu .ui-header h1:after { content: '.'; visibility: hidden; }
+
+/* TODO when the custom select css us moved out to it's own file this should be included */
+.ui-li-static .ui-select .ui-li-count { right: 38px; }
+label.ui-input-text { font-size: 16px; line-height: 1.4; display: block; font-weight: normal; margin: 0 0 .3em; }
+input.ui-input-text, textarea.ui-input-text { background-image: none; padding: .4em; line-height: 1.4; font-size: 16px; display: block; width: 97%; }
+input.ui-input-text { -webkit-appearance: none; }
+textarea.ui-input-text { height: 50px; -webkit-transition: height 200ms linear; -moz-transition: height 200ms linear; -o-transition: height 200ms linear; transition: height 200ms linear; }
+.ui-input-search { padding: 0 30px; background-image: none; position: relative; }
+.ui-icon-searchfield:after { position: absolute; left: 7px; top: 50%; margin-top: -9px; content: ""; width: 18px; height: 18px; opacity: .5; }
+.ui-input-search input.ui-input-text { border: none; width: 98%; padding: .4em 0; margin: 0; display: block; background: transparent none; outline: 0 !important; }
+.ui-input-search .ui-input-clear { position: absolute; right: 0; top: 50%; margin-top: -13px; }
+.ui-input-search .ui-input-clear-hidden { display: none; }
+
+/* orientation adjustments - incomplete!*/
+@media all and (min-width: 450px){
+	.ui-field-contain label.ui-input-text  { vertical-align: top; display: inline-block;  width: 20%;  margin: 0 2% 0 0 }
+	.ui-field-contain input.ui-input-text, 
+	.ui-field-contain textarea.ui-input-text, 
+	.ui-field-contain .ui-input-search { width: 60%; display: inline-block; } 
+	.ui-field-contain .ui-input-search { width: 50%; }
+	.ui-hide-label input.ui-input-text, 
+	.ui-hide-label textarea.ui-input-text, 
+	.ui-hide-label .ui-input-search { padding: .4em; width: 97%; } 
+	.ui-input-search input.ui-input-text { width: 98%; /*echos rule from above*/ }
+}.ui-listview { margin: 0; counter-reset: listnumbering; }
+.ui-content .ui-listview { margin: -15px; }
+.ui-content .ui-listview-inset { margin: 1em 0;  }
+.ui-listview, .ui-li { list-style:none; padding:0; }
+.ui-li, .ui-li.ui-field-contain { display: block; margin:0; position: relative; overflow: visible; text-align: left; border-width: 0; border-top-width: 1px; }
+.ui-li .ui-btn-text a.ui-link-inherit { text-overflow: ellipsis; overflow: hidden; white-space: nowrap;  }
+.ui-li-divider, .ui-li-static { padding: .5em 15px; font-size: 14px; font-weight: bold;  }
+.ui-li-divider { counter-reset: listnumbering;  }
+ol.ui-listview .ui-link-inherit:before, ol.ui-listview .ui-li-static:before, .ui-li-dec { font-size: .8em; display: inline-block; padding-right: .3em; font-weight: normal;counter-increment: listnumbering; content: counter(listnumbering) ". "; }
+ol.ui-listview .ui-li-jsnumbering:before { content: "" !important; } /* to avoid chance of duplication */
+.ui-listview-inset .ui-li { border-right-width: 1px; border-left-width: 1px; }
+.ui-li:last-child, .ui-li.ui-field-contain:last-child { border-bottom-width: 1px; }
+.ui-li>.ui-btn-inner { display: block; position: relative; padding: 0; }
+.ui-li .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li { padding: .7em 15px .7em 15px; display: block; }
+.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-thumb  { min-height: 60px; padding-left: 100px; }
+.ui-li-has-icon .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-icon {  min-height: 20px; padding-left: 40px; }
+.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-count { padding-right: 45px; }
+.ui-li-has-arrow .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow { padding-right: 30px; }
+.ui-li-has-arrow.ui-li-has-count .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-arrow.ui-li-has-count { padding-right: 75px; }
+.ui-li-has-count .ui-btn-text { padding-right: 15px; }
+.ui-li-heading { font-size: 16px; font-weight: bold; display: block; margin: .6em 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;  }
+.ui-li-desc {  font-size: 12px; font-weight: normal; display: block; margin: -.5em 0 .6em; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; }
+.ui-li-thumb, .ui-listview .ui-li-icon { position: absolute; left: 1px; top: 0; max-height: 80px; max-width: 80px; }
+.ui-listview .ui-li-icon { max-height: 40px; max-width: 40px; left: 10px; top: .9em; }
+.ui-li-thumb, .ui-listview .ui-li-icon, .ui-li-content { float: left; margin-right: 10px; }
+
+.ui-li-aside { float: right; width: 50%; text-align: right; margin: .3em 0; }
+@media all and (min-width: 480px){
+	 .ui-li-aside { width: 45%; }
+}	 
+.ui-li-divider { cursor: default; }
+.ui-li-has-alt .ui-btn-inner a.ui-link-inherit, .ui-li-static.ui-li-has-alt { padding-right: 95px; }
+.ui-li-has-count .ui-li-count { position: absolute; font-size: 11px; font-weight: bold; padding: .2em .5em; top: 50%; margin-top: -.9em; right: 38px; }
+.ui-li-divider .ui-li-count, .ui-li-static .ui-li-count { right: 10px; }
+.ui-li-has-alt .ui-li-count { right: 55px; }
+.ui-li-link-alt { position: absolute; width: 40px; height: 100%; border-width: 0; border-left-width: 1px; top: 0; right: 0; margin: 0; padding: 0; z-index: 2; }
+.ui-li-link-alt .ui-btn { overflow: hidden; position: absolute; right: 8px; top: 50%; margin: -11px 0 0 0; border-bottom-width: 1px; z-index: -1;}
+.ui-li-link-alt .ui-btn-inner { padding: 0; height: 100%; position: absolute; width: 100%; top: 0; left: 0;}
+.ui-li-link-alt .ui-btn .ui-icon { right: 50%; margin-right: -9px;  }
+
+.ui-listview * .ui-btn-inner > .ui-btn > .ui-btn-inner { border-top: 0px; }
+
+.ui-listview-filter { border-width: 0; overflow: hidden; margin: -15px -15px 15px -15px }
+.ui-listview-filter .ui-input-search { margin: 5px; width: auto; display: block; }
+
+.ui-listview-filter-inset { margin: -15px -5px -15px -5px; background: transparent; }
+.ui-li.ui-screen-hidden{display:none;}
+/* Odd iPad positioning issue. */
+@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) {
+    .ui-li .ui-btn-text { overflow:  visible; }
+}label.ui-slider { font-size: 16px; line-height: 1.4;  font-weight: normal; margin: 0 0 .3em; display: block; }
+input.ui-slider-input,
+.ui-field-contain input.ui-slider-input { display: inline-block; width: 50px; }
+select.ui-slider-switch { display: none; }
+div.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 60%; }
+div.ui-slider-switch { width: 99.8%; }
+a.ui-slider-handle { position: absolute; z-index: 10;  top: 50%; width: 28px; height: 28px; margin-top: -15px; margin-left: -15px; }
+a.ui-slider-handle .ui-btn-inner { padding-left: 0; padding-right: 0; }
+@media all and (min-width: 480px){
+	.ui-field-contain label.ui-slider { vertical-align: top;  display: inline-block;  width: 20%;  margin: 0 2% 0 0; }
+	.ui-field-contain div.ui-slider { width: 43%; }
+}	
+
+div.ui-slider-switch { height: 32px;  overflow: hidden; margin-left: 0; }
+div.ui-slider-inneroffset { margin-left: 50%; position: absolute; top: 1px; height: 100%; width: 50%; }
+a.ui-slider-handle-snapping { -webkit-transition: left 70ms linear; -moz-transition: left 70ms linear; }
+div.ui-slider-labelbg { position: absolute; top:0; margin: 0; border-width: 0; }
+div.ui-slider-switch div.ui-slider-labelbg-a { width: 60%; height: 100%; left: 0; }
+div.ui-slider-switch div.ui-slider-labelbg-b { width: 60%; height: 100%; right: 0; }
+.ui-slider-switch-a div.ui-slider-labelbg-a, .ui-slider-switch-b div.ui-slider-labelbg-b { z-index: -1; }
+.ui-slider-switch-a div.ui-slider-labelbg-b, .ui-slider-switch-b div.ui-slider-labelbg-a { z-index: 0; }
+
+div.ui-slider-switch a.ui-slider-handle { z-index: 20;  width: 101%; height: 32px; margin-top: -18px; margin-left: -101%; }
+span.ui-slider-label { width: 100%; position: absolute;height: 32px;  font-size: 16px; text-align: center; line-height: 2; background: none; border-color: transparent; }
+span.ui-slider-label-a { left: -100%;  margin-right: -1px }
+span.ui-slider-label-b { right: -100%;  margin-left: -1px }
Index: tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.jquery.min.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.jquery.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.jquery.min.js	(revision 14585)
@@ -0,0 +1,164 @@
+// PhotoSwipe - http://www.photoswipe.com/
+// Copyright (c) 2011 by Code Computerlove (http://www.codecomputerlove.com)
+// Licensed under the MIT license
+// version: 3.0.4
+(function(e){if(!Function.prototype.bind)Function.prototype.bind=function(d){var a=[].slice,b=a.call(arguments,1),c=this,g=function(){},f=function(){return c.apply(this instanceof g?this:d||{},b.concat(a.call(arguments)))};g.prototype=c.prototype;f.prototype=new g;return f};if(typeof e.Code==="undefined")e.Code={};e.Code.Util={registerNamespace:function(){var d=arguments,a=null,b,c,g,f,i;b=0;for(f=d.length;b<f;b++){g=d[b];g=g.split(".");a=g[0];typeof e[a]==="undefined"&&(e[a]={});a=e[a];c=1;for(i=
+g.length;c<i;++c)a[g[c]]=a[g[c]]||{},a=a[g[c]]}},coalesce:function(){var d,a;d=0;for(a=arguments.length;d<a;d++)if(!this.isNothing(arguments[d]))return arguments[d];return null},extend:function(d,a,b){var c;this.isNothing(b)&&(b=!0);if(d&&a&&this.isObject(a))for(c in a)this.objectHasProperty(a,c)&&(b?d[c]=a[c]:typeof d[c]==="undefined"&&(d[c]=a[c]))},clone:function(d){var a={};this.extend(a,d);return a},isObject:function(d){return d instanceof Object},isFunction:function(d){return{}.toString.call(d)===
+"[object Function]"},isArray:function(d){return d instanceof Array},isLikeArray:function(d){return typeof d.length==="number"},isNumber:function(d){return typeof d==="number"},isString:function(d){return typeof d==="string"},isNothing:function(d){if(typeof d==="undefined"||d===null)return!0;return!1},swapArrayElements:function(d,a,b){var c=d[a];d[a]=d[b];d[b]=c},trim:function(d){return d.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},toCamelCase:function(d){return d.replace(/(\-[a-z])/g,function(a){return a.toUpperCase().replace("-",
+"")})},toDashedCase:function(d){return d.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})},arrayIndexOf:function(d,a,b){var c,g,f,e;f=-1;c=0;for(g=a.length;c<g;c++)if(e=a[c],this.isNothing(b)){if(e===d){f=c;break}}else if(this.objectHasProperty(e,b)&&e[b]===d){f=c;break}return f},objectHasProperty:function(d,a){return d.hasOwnProperty?d.hasOwnProperty(a):"undefined"!==typeof d[a]}}})(window);
+(function(e,d){d.Browser={ua:null,version:null,safari:null,webkit:null,opera:null,msie:null,chrome:null,mozilla:null,android:null,blackberry:null,iPad:null,iPhone:null,iPod:null,iOS:null,is3dSupported:null,isCSSTransformSupported:null,isTouchSupported:null,isGestureSupported:null,_detect:function(){this.ua=e.navigator.userAgent;this.version=this.ua.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[];this.safari=/Safari/gi.test(e.navigator.appVersion);this.webkit=/webkit/i.test(this.ua);this.opera=/opera/i.test(this.ua);
+this.msie=/msie/i.test(this.ua)&&!this.opera;this.chrome=/Chrome/i.test(this.ua);this.firefox=/Firefox/i.test(this.ua);this.fennec=/Fennec/i.test(this.ua);this.mozilla=/mozilla/i.test(this.ua)&&!/(compatible|webkit)/.test(this.ua);this.android=/android/i.test(this.ua);this.blackberry=/blackberry/i.test(this.ua);this.iOS=/iphone|ipod|ipad/gi.test(e.navigator.platform);this.iPad=/ipad/gi.test(e.navigator.platform);this.iPhone=/iphone/gi.test(e.navigator.platform);this.iPod=/ipod/gi.test(e.navigator.platform);
+var a=document.createElement("div");this.is3dSupported=!d.isNothing(a.style.WebkitPerspective);this.isCSSTransformSupported=!d.isNothing(a.style.WebkitTransform)||!d.isNothing(a.style.MozTransform)||!d.isNothing(a.style.transformProperty);this.isTouchSupported=this.isEventSupported("touchstart");this.isGestureSupported=this.isEventSupported("gesturestart")},_eventTagNames:{select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"},isEventSupported:function(a){var b=
+document.createElement(this._eventTagNames[a]||"div"),c,a="on"+a;c=d.objectHasProperty(b,a);c||(b.setAttribute(a,"return;"),c=typeof b[a]==="function");return c},isLandscape:function(){return d.DOM.windowWidth()>d.DOM.windowHeight()}};d.Browser._detect()})(window,window.Code.Util);
+(function(e,d,a){a.extend(a,{Events:{add:function(a,c,g){d(a).bind(c,g)},remove:function(a,c,g){d(a).unbind(c,g)},fire:function(a,c){var g,f=Array.prototype.slice.call(arguments).splice(2);g=typeof c==="string"?{type:c}:c;d(a).trigger(d.Event(g.type,g),f)},getMousePosition:function(a){return{x:a.pageX,y:a.pageY}},getTouchEvent:function(a){return a.originalEvent},getWheelDelta:function(b){var c=0;a.isNothing(b.wheelDelta)?a.isNothing(b.detail)||(c=-b.detail/3):c=b.wheelDelta/120;return c},domReady:function(a){d(document).ready(a)}}})})(window,
+window.jQuery,window.Code.Util);
+(function(e,d,a){a.extend(a,{DOM:{setData:function(b,c,g){if(a.isLikeArray(b)){var f,d;f=0;for(d=b.length;f<d;f++)a.DOM._setData(b[f],c,g)}else a.DOM._setData(b,c,g)},_setData:function(b,c,g){a.DOM.setAttribute(b,"data-"+c,g)},getData:function(b,c,g){return a.DOM.getAttribute(b,"data-"+c,g)},removeData:function(b,c){if(a.isLikeArray(b)){var g,f;g=0;for(f=b.length;g<f;g++)a.DOM._removeData(b[g],c)}else a.DOM._removeData(b,c)},_removeData:function(b,c){a.DOM.removeAttribute(b,"data-"+c)},isChildOf:function(a,
+c){if(c===a)return!1;for(;a&&a!==c;)a=a.parentNode;return a===c},find:function(b,c){if(a.isNothing(c))c=e.document;var g=d(b,c),f=[],i,j;i=0;for(j=g.length;i<j;i++)f.push(g[i]);return f},createElement:function(a,c,g){a=d("<"+a+"></"+a+">");a.attr(c);a.append(g);return a[0]},appendChild:function(a,c){d(c).append(a)},insertBefore:function(a,c){d(a).insertBefore(c)},appendText:function(a,c){d(c).text(a)},appendToBody:function(a){d("body").append(a)},removeChild:function(a){d(a).empty().remove()},removeChildren:function(a){d(a).empty()},
+hasAttribute:function(b,c){return!a.isNothing(d(b).attr(c))},getAttribute:function(b,c,g){b=d(b).attr(c);a.isNothing(b)&&!a.isNothing(g)&&(b=g);return b},setAttribute:function(b,c,g){if(a.isLikeArray(b)){var f,d;f=0;for(d=b.length;f<d;f++)a.DOM._setAttribute(b[f],c,g)}else a.DOM._setAttribute(b,c,g)},_setAttribute:function(a,c,g){d(a).attr(c,g)},removeAttribute:function(b,c){if(a.isLikeArray(b)){var g,f;g=0;for(f=b.length;g<f;g++)a.DOM._removeAttribute(b[g],c)}else a.DOM._removeAttribute(b,c)},_removeAttribute:function(a,
+c){d(a).removeAttr(c)},addClass:function(b,c){if(a.isLikeArray(b)){var g,f;g=0;for(f=b.length;g<f;g++)a.DOM._addClass(b[g],c)}else a.DOM._addClass(b,c)},_addClass:function(a,c){d(a).addClass(c)},removeClass:function(b,c){if(a.isLikeArray(b)){var g,f;g=0;for(f=b.length;g<f;g++)a.DOM._removeClass(b[g],c)}else a.DOM._removeClass(b,c)},_removeClass:function(a,c){d(a).removeClass(c)},hasClass:function(a,c){d(a).hasClass(c)},setStyle:function(b,c,g){if(a.isLikeArray(b)){var f,d;f=0;for(d=b.length;f<d;f++)a.DOM._setStyle(b[f],
+c,g)}else a.DOM._setStyle(b,c,g)},_setStyle:function(b,c,g){var f;if(a.isObject(c))for(f in c)a.objectHasProperty(c,f)&&(f==="width"?a.DOM.width(b,c[f]):f==="height"?a.DOM.height(b,c[f]):d(b).css(f,c[f]));else d(b).css(c,g)},getStyle:function(a,c){return d(a).css(c)},hide:function(b){if(a.isLikeArray(b)){var c,g;c=0;for(g=b.length;c<g;c++)a.DOM._hide(b[c])}else a.DOM._hide(b)},_hide:function(a){d(a).hide()},show:function(b){if(a.isLikeArray(b)){var c,g;c=0;for(g=b.length;c<g;c++)a.DOM._show(b[c])}else a.DOM._show(b)},
+_show:function(a){d(a).show()},width:function(b,c){a.isNothing(c)||d(b).width(c);return d(b).width()},outerWidth:function(a){return d(a).outerWidth()},height:function(b,c){a.isNothing(c)||d(b).height(c);return d(b).height()},outerHeight:function(a){return d(a).outerHeight()},documentWidth:function(){return d(document.documentElement).width()},documentHeight:function(){return d(document.documentElement).height()},documentOuterWidth:function(){return a.DOM.width(document.documentElement)},documentOuterHeight:function(){return a.DOM.outerHeight(document.documentElement)},
+bodyWidth:function(){return d(document.body).width()},bodyHeight:function(){return d(document.body).height()},bodyOuterWidth:function(){return a.DOM.outerWidth(document.body)},bodyOuterHeight:function(){return a.DOM.outerHeight(document.body)},windowWidth:function(){if(!e.innerWidth)return d(e).width();return e.innerWidth},windowHeight:function(){if(!e.innerHeight)return d(e).height();return e.innerHeight},windowScrollLeft:function(){if(!e.pageXOffset)return d(e).scrollLeft();return e.pageXOffset},
+windowScrollTop:function(){if(!e.pageYOffset)return d(e).scrollTop();return e.pageYOffset}}})})(window,window.jQuery,window.Code.Util);
+(function(e,d){d.extend(d,{Animation:{_applyTransitionDelay:50,_transitionEndLabel:e.document.documentElement.style.webkitTransition!==void 0?"webkitTransitionEnd":"transitionend",_transitionEndHandler:null,_transitionPrefix:e.document.documentElement.style.webkitTransition!==void 0?"webkitTransition":e.document.documentElement.style.MozTransition!==void 0?"MozTransition":"transition",_transformLabel:e.document.documentElement.style.webkitTransform!==void 0?"webkitTransform":e.document.documentElement.style.MozTransition!==
+void 0?"MozTransform":"transform",_getTransitionEndHandler:function(){if(d.isNothing(this._transitionEndHandler))this._transitionEndHandler=this._onTransitionEnd.bind(this);return this._transitionEndHandler},stop:function(a){if(d.Browser.isCSSTransformSupported){var b={};d.Events.remove(a,this._transitionEndLabel,this._getTransitionEndHandler());d.isNothing(a.callbackLabel)&&delete a.callbackLabel;b[this._transitionPrefix+"Property"]="";b[this._transitionPrefix+"Duration"]="";b[this._transitionPrefix+
+"TimingFunction"]="";b[this._transitionPrefix+"Delay"]="";b[this._transformLabel]="";d.DOM.setStyle(a,b)}else d.isNothing(e.jQuery)||e.jQuery(a).stop(!0,!0)},fadeIn:function(a,b,c,g,f){f=d.coalesce(f,1);f<=0&&(f=1);if(b<=0&&(d.DOM.setStyle(a,"opacity",f),!d.isNothing(c))){c(a);return}d.DOM.getStyle(a,"opacity")>=1&&d.DOM.setStyle(a,"opacity",0);d.Browser.isCSSTransformSupported?this._applyTransition(a,"opacity",f,b,c,g):d.isNothing(e.jQuery)||e.jQuery(a).fadeTo(b,f,c)},fadeTo:function(a,b,c,g,f){this.fadeIn(a,
+c,g,f,b)},fadeOut:function(a,b,c,g){if(b<=0&&(d.DOM.setStyle(a,"opacity",0),!d.isNothing(c))){c(a);return}d.Browser.isCSSTransformSupported?this._applyTransition(a,"opacity",0,b,c,g):e.jQuery(a).fadeTo(b,0,c)},slideBy:function(a,b,c,g,f,i){var j={},b=d.coalesce(b,0),c=d.coalesce(c,0),i=d.coalesce(i,"ease-out");j[this._transitionPrefix+"Property"]="all";j[this._transitionPrefix+"Delay"]="0";g===0?(j[this._transitionPrefix+"Duration"]="",j[this._transitionPrefix+"TimingFunction"]=""):(j[this._transitionPrefix+
+"Duration"]=g+"ms",j[this._transitionPrefix+"TimingFunction"]=d.coalesce(i,"ease-out"),d.Events.add(a,this._transitionEndLabel,this._getTransitionEndHandler()));j[this._transformLabel]=d.Browser.is3dSupported?"translate3d("+b+"px, "+c+"px, 0px)":"translate("+b+"px, "+c+"px)";if(!d.isNothing(f))a.cclallcallback=f;d.DOM.setStyle(a,j);g===0&&e.setTimeout(function(){this._leaveTransforms(a)}.bind(this),this._applyTransitionDelay)},resetTranslate:function(a){var b={};b[this._transformLabel]=b[this._transformLabel]=
+d.Browser.is3dSupported?"translate3d(0px, 0px, 0px)":"translate(0px, 0px)";d.DOM.setStyle(a,b)},_applyTransition:function(a,b,c,g,f,i){var j={},i=d.coalesce(i,"ease-in");j[this._transitionPrefix+"Property"]=b;j[this._transitionPrefix+"Duration"]=g+"ms";j[this._transitionPrefix+"TimingFunction"]=i;j[this._transitionPrefix+"Delay"]="0";d.Events.add(a,this._transitionEndLabel,this._getTransitionEndHandler());d.DOM.setStyle(a,j);d.isNothing(f)||(a["ccl"+b+"callback"]=f);e.setTimeout(function(){d.DOM.setStyle(a,
+b,c)},this._applyTransitionDelay)},_onTransitionEnd:function(a){d.Events.remove(a.currentTarget,this._transitionEndLabel,this._getTransitionEndHandler());this._leaveTransforms(a.currentTarget)},_leaveTransforms:function(a){var b=a.style[this._transitionPrefix+"Property"],c=b!==""?"ccl"+b+"callback":"cclallcallback",g,b=d.coalesce(a.style.webkitTransform,a.style.MozTransform,a.style.transform),f,i=e.parseInt(d.DOM.getStyle(a,"left"),0),j=e.parseInt(d.DOM.getStyle(a,"top"),0),h,l,k={};b!==""&&(b=d.Browser.is3dSupported?
+b.match(/translate3d\((.*?)\)/):b.match(/translate\((.*?)\)/),d.isNothing(b)||(f=b[1].split(", "),h=e.parseInt(f[0],0),l=e.parseInt(f[1],0)));k[this._transitionPrefix+"Property"]="";k[this._transitionPrefix+"Duration"]="";k[this._transitionPrefix+"TimingFunction"]="";k[this._transitionPrefix+"Delay"]="";d.DOM.setStyle(a,k);e.setTimeout(function(){if(!d.isNothing(f))k={},k[this._transformLabel]="",k.left=i+h+"px",k.top=j+l+"px",d.DOM.setStyle(a,k);d.isNothing(a[c])||(g=a[c],delete a[c],g(a))}.bind(this),
+this._applyTransitionDelay)}}})})(window,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.Util.TouchElement");a.TouchElement.EventTypes={onTouch:"CodeUtilTouchElementOnTouch"};a.TouchElement.ActionTypes={touchStart:"touchStart",touchMove:"touchMove",touchEnd:"touchEnd",touchMoveEnd:"touchMoveEnd",tap:"tap",doubleTap:"doubleTap",swipeLeft:"swipeLeft",swipeRight:"swipeRight",swipeUp:"swipeUp",swipeDown:"swipeDown",gestureStart:"gestureStart",gestureChange:"gestureChange",gestureEnd:"gestureEnd"}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.Util.TouchElement");a.TouchElement.TouchElementClass=d({el:null,captureSettings:null,touchStartPoint:null,touchEndPoint:null,touchStartTime:null,doubleTapTimeout:null,touchStartHandler:null,touchMoveHandler:null,touchEndHandler:null,mouseDownHandler:null,mouseMoveHandler:null,mouseUpHandler:null,mouseOutHandler:null,gestureStartHandler:null,gestureChangeHandler:null,gestureEndHandler:null,swipeThreshold:null,swipeTimeThreshold:null,doubleTapSpeed:null,dispose:function(){var b;
+this.removeEventHandlers();for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(b,c){this.el=b;this.captureSettings={swipe:!1,move:!1,gesture:!1,doubleTap:!1,preventDefaultTouchEvents:!0};a.extend(this.captureSettings,c);this.swipeThreshold=50;this.doubleTapSpeed=this.swipeTimeThreshold=250;this.touchStartPoint={x:0,y:0};this.touchEndPoint={x:0,y:0}},addEventHandlers:function(){if(a.isNothing(this.touchStartHandler))this.touchStartHandler=this.onTouchStart.bind(this),this.touchMoveHandler=
+this.onTouchMove.bind(this),this.touchEndHandler=this.onTouchEnd.bind(this),this.mouseDownHandler=this.onMouseDown.bind(this),this.mouseMoveHandler=this.onMouseMove.bind(this),this.mouseUpHandler=this.onMouseUp.bind(this),this.mouseOutHandler=this.onMouseOut.bind(this),this.gestureStartHandler=this.onGestureStart.bind(this),this.gestureChangeHandler=this.onGestureChange.bind(this),this.gestureEndHandler=this.onGestureEnd.bind(this);a.Events.add(this.el,"touchstart",this.touchStartHandler);this.captureSettings.move&&
+a.Events.add(this.el,"touchmove",this.touchMoveHandler);a.Events.add(this.el,"touchend",this.touchEndHandler);a.Events.add(this.el,"mousedown",this.mouseDownHandler);a.Browser.isGestureSupported&&this.captureSettings.gesture&&(a.Events.add(this.el,"gesturestart",this.gestureStartHandler),a.Events.add(this.el,"gesturechange",this.gestureChangeHandler),a.Events.add(this.el,"gestureend",this.gestureEndHandler))},removeEventHandlers:function(){a.Events.remove(this.el,"touchstart",this.touchStartHandler);
+this.captureSettings.move&&a.Events.remove(this.el,"touchmove",this.touchMoveHandler);a.Events.remove(this.el,"touchend",this.touchEndHandler);a.Events.remove(this.el,"mousedown",this.mouseDownHandler);a.Browser.isGestureSupported&&this.captureSettings.gesture&&(a.Events.remove(this.el,"gesturestart",this.gestureStartHandler),a.Events.remove(this.el,"gesturechange",this.gestureChangeHandler),a.Events.remove(this.el,"gestureend",this.gestureEndHandler))},getTouchPoint:function(a){return{x:a[0].pageX,
+y:a[0].pageY}},fireTouchEvent:function(b){var c=0,g=0,f=0,d,c=this.touchEndPoint.x-this.touchStartPoint.x,g=this.touchEndPoint.y-this.touchStartPoint.y,f=Math.sqrt(c*c+g*g);if(this.captureSettings.swipe&&(d=new Date,d-=this.touchStartTime,d<=this.swipeTimeThreshold)){if(e.Math.abs(c)>=this.swipeThreshold){a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:c<0?a.TouchElement.ActionTypes.swipeLeft:a.TouchElement.ActionTypes.swipeRight,targetEl:b.target,
+currentTargetEl:b.currentTarget});return}if(e.Math.abs(g)>=this.swipeThreshold){a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:g<0?a.TouchElement.ActionTypes.swipeUp:a.TouchElement.ActionTypes.swipeDown,targetEl:b.target,currentTargetEl:b.currentTarget});return}}f>1?a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMoveEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget}):
+this.captureSettings.doubleTap?a.isNothing(this.doubleTapTimeout)?this.doubleTapTimeout=e.setTimeout(function(){this.doubleTapTimeout=null;a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:a.TouchElement.ActionTypes.tap,targetEl:b.target,currentTargetEl:b.currentTarget})}.bind(this),this.doubleTapSpeed):(e.clearTimeout(this.doubleTapTimeout),this.doubleTapTimeout=null,a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,
+action:a.TouchElement.ActionTypes.doubleTap,targetEl:b.target,currentTargetEl:b.currentTarget})):a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:a.TouchElement.ActionTypes.tap,targetEl:b.target,currentTargetEl:b.currentTarget})},onTouchStart:function(b){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();a.Events.remove(this.el,"mousedown",this.mouseDownHandler);var c=a.Events.getTouchEvent(b).touches;c.length>1&&this.captureSettings.gesture?
+this.isGesture=!0:(this.touchStartTime=new Date,this.isGesture=!1,this.touchStartPoint=this.getTouchPoint(c),a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchStart,point:this.touchStartPoint,targetEl:b.target,currentTargetEl:b.currentTarget}))},onTouchMove:function(b){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();if(!this.isGesture||!this.captureSettings.gesture){var c=a.Events.getTouchEvent(b).touches;a.Events.fire(this,
+{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMove,point:this.getTouchPoint(c),targetEl:b.target,currentTargetEl:b.currentTarget})}},onTouchEnd:function(b){if(!this.isGesture||!this.captureSettings.gesture){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();var c=a.Events.getTouchEvent(b);this.touchEndPoint=this.getTouchPoint(!a.isNothing(c.changedTouches)?c.changedTouches:c.touches);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,
+target:this,action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget});this.fireTouchEvent(b)}},onMouseDown:function(b){b.preventDefault();a.Events.remove(this.el,"touchstart",this.mouseDownHandler);a.Events.remove(this.el,"touchmove",this.touchMoveHandler);a.Events.remove(this.el,"touchend",this.touchEndHandler);this.captureSettings.move&&a.Events.add(this.el,"mousemove",this.mouseMoveHandler);a.Events.add(this.el,"mouseup",this.mouseUpHandler);
+a.Events.add(this.el,"mouseout",this.mouseOutHandler);this.touchStartTime=new Date;this.isGesture=!1;this.touchStartPoint=a.Events.getMousePosition(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchStart,point:this.touchStartPoint,targetEl:b.target,currentTargetEl:b.currentTarget})},onMouseMove:function(b){b.preventDefault();a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMove,
+point:a.Events.getMousePosition(b),targetEl:b.target,currentTargetEl:b.currentTarget})},onMouseUp:function(b){b.preventDefault();this.captureSettings.move&&a.Events.remove(this.el,"mousemove",this.mouseMoveHandler);a.Events.remove(this.el,"mouseup",this.mouseUpHandler);a.Events.remove(this.el,"mouseout",this.mouseOutHandler);this.touchEndPoint=a.Events.getMousePosition(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,
+targetEl:b.target,currentTargetEl:b.currentTarget});this.fireTouchEvent(b)},onMouseOut:function(b){var c=b.relatedTarget;if(!(this.el===c||a.DOM.isChildOf(c,this.el)))b.preventDefault(),this.captureSettings.move&&a.Events.remove(this.el,"mousemove",this.mouseMoveHandler),a.Events.remove(this.el,"mouseup",this.mouseUpHandler),a.Events.remove(this.el,"mouseout",this.mouseOutHandler),this.touchEndPoint=a.Events.getMousePosition(b),a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,
+action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget}),this.fireTouchEvent(b)},onGestureStart:function(b){b.preventDefault();var c=a.Events.getTouchEvent(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureStart,scale:c.scale,rotation:c.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})},onGestureChange:function(b){b.preventDefault();var c=a.Events.getTouchEvent(b);
+a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureChange,scale:c.scale,rotation:c.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})},onGestureEnd:function(b){b.preventDefault();var c=a.Events.getTouchEvent(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureEnd,scale:c.scale,rotation:c.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})}})})(window,window.klass,
+window.Code.Util);(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Image");e.Code.PhotoSwipe.Image.EventTypes={onLoad:"onLoad",onError:"onError"}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Image");var b=e.Code.PhotoSwipe;b.Image.ImageClass=d({refObj:null,imageEl:null,src:null,caption:null,metaData:null,imageLoadHandler:null,imageErrorHandler:null,dispose:function(){var c;this.shrinkImage();for(c in this)a.objectHasProperty(this,c)&&(this[c]=null)},initialize:function(a,b,f,d){this.refObj=a;this.src=this.originalSrc=b;this.caption=f;this.metaData=d;this.imageEl=new e.Image;this.imageLoadHandler=this.onImageLoad.bind(this);this.imageErrorHandler=
+this.onImageError.bind(this)},load:function(){this.imageEl.originalSrc=a.coalesce(this.imageEl.originalSrc,"");this.imageEl.originalSrc===this.src?this.imageEl.isError?a.Events.fire(this,{type:b.Image.EventTypes.onError,target:this}):a.Events.fire(this,{type:b.Image.EventTypes.onLoad,target:this}):(this.imageEl.isError=!1,this.imageEl.isLoading=!0,this.imageEl.naturalWidth=null,this.imageEl.naturalHeight=null,this.imageEl.isLandscape=!1,this.imageEl.onload=this.imageLoadHandler,this.imageEl.onerror=
+this.imageErrorHandler,this.imageEl.onabort=this.imageErrorHandler,this.imageEl.originalSrc=this.src,this.imageEl.src=this.src)},shrinkImage:function(){if(!a.isNothing(this.imageEl)&&this.imageEl.src.indexOf(this.src)>-1)this.imageEl.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",a.isNothing(this.imageEl.parentNode)||a.DOM.removeChild(this.imageEl,this.imageEl.parentNode)},onImageLoad:function(){this.imageEl.onload=null;this.imageEl.naturalWidth=a.coalesce(this.imageEl.naturalWidth,
+this.imageEl.width);this.imageEl.naturalHeight=a.coalesce(this.imageEl.naturalHeight,this.imageEl.height);this.imageEl.isLandscape=this.imageEl.naturalWidth>this.imageEl.naturalHeight;this.imageEl.isLoading=!1;a.Events.fire(this,{type:b.Image.EventTypes.onLoad,target:this})},onImageError:function(){this.imageEl.onload=null;this.imageEl.onerror=null;this.imageEl.onabort=null;this.imageEl.isLoading=!1;this.imageEl.isError=!0;a.Events.fire(this,{type:b.Image.EventTypes.onError,target:this})}})})(window,
+window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Cache");e=e.Code.PhotoSwipe;e.Cache.Mode={normal:"normal",aggressive:"aggressive"};e.Cache.Functions={getImageSource:function(a){return a.href},getImageCaption:function(b){if(b.nodeName==="IMG")return a.DOM.getAttribute(b,"alt");var c,g,f;c=0;for(g=b.childNodes.length;c<g;c++)if(f=b.childNodes[c],b.childNodes[c].nodeName==="IMG")return a.DOM.getAttribute(f,"alt")},getImageMetaData:function(){return{}}}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Cache");var b=e.Code.PhotoSwipe;b.Cache.CacheClass=d({images:null,settings:null,dispose:function(){var c,b,f;if(!a.isNothing(this.images)){b=0;for(f=this.images.length;b<f;b++)this.images[b].dispose();this.images.length=0}for(c in this)a.objectHasProperty(this,c)&&(this[c]=null)},initialize:function(a,g){var f,d,e,h,l,k;this.settings=g;this.images=[];f=0;for(d=a.length;f<d;f++)e=a[f],h=this.settings.getImageSource(e),l=this.settings.getImageCaption(e),
+k=this.settings.getImageMetaData(e),this.images.push(new b.Image.ImageClass(e,h,l,k))},getImages:function(c){var g,f,d=[],e;g=0;for(f=c.length;g<f;g++){e=this.images[c[g]];if(this.settings.cacheMode===b.Cache.Mode.aggressive)e.cacheDoNotShrink=!0;d.push(e)}if(this.settings.cacheMode===b.Cache.Mode.aggressive){g=0;for(f=this.images.length;g<f;g++)e=this.images[g],a.objectHasProperty(e,"cacheDoNotShrink")?delete e.cacheDoNotShrink:e.shrinkImage()}return d}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.Image);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.DocumentOverlay");e.Code.PhotoSwipe.DocumentOverlay.CssClasses={documentOverlay:"ps-document-overlay"}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.DocumentOverlay");var b=e.Code.PhotoSwipe;b.DocumentOverlay.DocumentOverlayClass=d({el:null,settings:null,initialBodyHeight:null,dispose:function(){var c;a.Animation.stop(this.el);a.DOM.removeChild(this.el,this.el.parentNode);for(c in this)a.objectHasProperty(this,c)&&(this[c]=null)},initialize:function(c){this.settings=c;this.el=a.DOM.createElement("div",{"class":b.DocumentOverlay.CssClasses.documentOverlay},"");a.DOM.setStyle(this.el,{display:"block",
+position:"absolute",left:0,top:0,zIndex:this.settings.zIndex});a.DOM.hide(this.el);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target);a.Animation.resetTranslate(this.el);this.initialBodyHeight=a.DOM.bodyOuterHeight()},resetPosition:function(){var c,b,f;if(this.settings.target===e){c=a.DOM.windowWidth();b=a.DOM.bodyOuterHeight()*2;f=this.settings.jQueryMobile?a.DOM.windowScrollTop()+"px":"0px";if(b<1)b=this.initialBodyHeight;a.DOM.windowHeight()>b&&
+(b=a.DOM.windowHeight())}else c=a.DOM.width(this.settings.target),b=a.DOM.height(this.settings.target),f="0px";a.DOM.setStyle(this.el,{width:c,height:b,top:f})},fadeIn:function(c,b){this.resetPosition();a.DOM.setStyle(this.el,"opacity",0);a.DOM.show(this.el);a.Animation.fadeIn(this.el,c,b)}})})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Carousel");e=e.Code.PhotoSwipe;e.Carousel.EventTypes={onSlideByEnd:"PhotoSwipeCarouselOnSlideByEnd",onSlideshowStart:"PhotoSwipeCarouselOnSlideshowStart",onSlideshowStop:"PhotoSwipeCarouselOnSlideshowStop"};e.Carousel.CssClasses={carousel:"ps-carousel",content:"ps-carousel-content",item:"ps-carousel-item",itemLoading:"ps-carousel-item-loading",itemError:"ps-carousel-item-error"};e.Carousel.SlideByAction={previous:"previous",current:"current",next:"next"}})(window,
+window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Carousel");var b=e.Code.PhotoSwipe;b.Carousel.CarouselClass=d({el:null,contentEl:null,settings:null,cache:null,slideByEndHandler:null,currentCacheIndex:null,isSliding:null,isSlideshowActive:null,lastSlideByAction:null,touchStartPoint:null,touchStartPosition:null,imageLoadHandler:null,imageErrorHandler:null,slideshowTimeout:null,dispose:function(){var c,g,f;g=0;for(f=this.cache.images.length;g<f;g++)a.Events.remove(this.cache.images[g],b.Image.EventTypes.onLoad,
+this.imageLoadHandler),a.Events.remove(this.cache.images[g],b.Image.EventTypes.onError,this.imageErrorHandler);this.stopSlideshow();a.Animation.stop(this.el);a.DOM.removeChild(this.el,this.el.parentNode);for(c in this)a.objectHasProperty(this,c)&&(this[c]=null)},initialize:function(c,g){var f,d,j;this.cache=c;this.settings=g;this.slideByEndHandler=this.onSlideByEnd.bind(this);this.imageLoadHandler=this.onImageLoad.bind(this);this.imageErrorHandler=this.onImageError.bind(this);this.currentCacheIndex=
+0;this.isSlideshowActive=this.isSliding=!1;if(this.cache.images.length<3)this.settings.loop=!1;this.el=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.carousel},"");a.DOM.setStyle(this.el,{display:"block",position:"absolute",left:0,top:0,overflow:"hidden",zIndex:this.settings.zIndex});a.DOM.hide(this.el);this.contentEl=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.content},"");a.DOM.setStyle(this.contentEl,{display:"block",position:"absolute",left:0,top:0});a.DOM.appendChild(this.contentEl,
+this.el);d=c.images.length<3?c.images.length:3;for(f=0;f<d;f++)j=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.item+" "+b.Carousel.CssClasses.item+"-"+f},""),a.DOM.setAttribute(j,"style","float: left;"),a.DOM.setStyle(j,{display:"block",position:"relative",left:0,top:0,overflow:"hidden"}),this.settings.margin>0&&a.DOM.setStyle(j,{marginRight:this.settings.margin+"px"}),a.DOM.appendChild(j,this.contentEl);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target)},
+resetPosition:function(){var c,g,f,d,j,h;this.settings.target===e?(c=a.DOM.windowWidth(),g=a.DOM.windowHeight(),f=a.DOM.windowScrollTop()+"px"):(c=a.DOM.width(this.settings.target),g=a.DOM.height(this.settings.target),f="0px");d=this.settings.margin>0?c+this.settings.margin:c;j=a.DOM.find("."+b.Carousel.CssClasses.item,this.contentEl);d*=j.length;a.DOM.setStyle(this.el,{top:f,width:c,height:g});a.DOM.setStyle(this.contentEl,{width:d,height:g});f=0;for(d=j.length;f<d;f++)h=j[f],a.DOM.setStyle(h,{width:c,
+height:g}),h=a.DOM.find("img",h)[0],a.isNothing(h)||this.resetImagePosition(h);this.setContentLeftPosition()},resetImagePosition:function(c){if(!a.isNothing(c)){a.DOM.getAttribute(c,"src");var b,f,d,e=a.DOM.width(this.el),h=a.DOM.height(this.el);this.settings.imageScaleMethod==="fitNoUpscale"?(f=c.naturalWidth,d=c.naturalHeight,f>e&&(b=e/f,f=Math.round(f*b),d=Math.round(d*b)),d>h&&(b=h/d,d=Math.round(d*b),f=Math.round(f*b))):(b=c.isLandscape?e/c.naturalWidth:h/c.naturalHeight,f=Math.round(c.naturalWidth*
+b),d=Math.round(c.naturalHeight*b),this.settings.imageScaleMethod==="zoom"?(b=1,d<h?b=h/d:f<e&&(b=e/f),b!==1&&(f=Math.round(f*b),d=Math.round(d*b))):this.settings.imageScaleMethod==="fit"&&(b=1,f>e?b=e/f:d>h&&(b=h/d),b!==1&&(f=Math.round(f*b),d=Math.round(d*b))));a.DOM.setStyle(c,{position:"absolute",width:f,height:d,top:Math.round((h-d)/2)+"px",left:Math.round((e-f)/2)+"px",display:"block"})}},setContentLeftPosition:function(){var c,b,d;c=this.settings.target===e?a.DOM.windowWidth():a.DOM.width(this.settings.target);
+b=this.getItemEls();d=0;this.settings.loop?d=(c+this.settings.margin)*-1:this.currentCacheIndex===this.cache.images.length-1?d=(b.length-1)*(c+this.settings.margin)*-1:this.currentCacheIndex>0&&(d=(c+this.settings.margin)*-1);a.DOM.setStyle(this.contentEl,{left:d+"px"})},show:function(c){this.currentCacheIndex=c;this.resetPosition();this.setImages(!1);a.DOM.show(this.el);a.Animation.resetTranslate(this.contentEl);var c=this.getItemEls(),d,f;d=0;for(f=c.length;d<f;d++)a.Animation.resetTranslate(c[d]);
+a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideByEnd,target:this,action:b.Carousel.SlideByAction.current,cacheIndex:this.currentCacheIndex})},setImages:function(a){var b,d=this.getItemEls();b=this.currentCacheIndex+1;var e=this.currentCacheIndex-1;this.settings.loop?(b>this.cache.images.length-1&&(b=0),e<0&&(e=this.cache.images.length-1),b=this.cache.getImages([e,this.currentCacheIndex,b]),a||this.addCacheImageToItemEl(b[1],d[1]),this.addCacheImageToItemEl(b[2],d[2]),this.addCacheImageToItemEl(b[0],
+d[0])):d.length===1?a||(b=this.cache.getImages([this.currentCacheIndex]),this.addCacheImageToItemEl(b[0],d[0])):d.length===2?this.currentCacheIndex===0?(b=this.cache.getImages([this.currentCacheIndex,this.currentCacheIndex+1]),a||this.addCacheImageToItemEl(b[0],d[0]),this.addCacheImageToItemEl(b[1],d[1])):(b=this.cache.getImages([this.currentCacheIndex-1,this.currentCacheIndex]),a||this.addCacheImageToItemEl(b[1],d[1]),this.addCacheImageToItemEl(b[0],d[0])):this.currentCacheIndex===0?(b=this.cache.getImages([this.currentCacheIndex,
+this.currentCacheIndex+1,this.currentCacheIndex+2]),a||this.addCacheImageToItemEl(b[0],d[0]),this.addCacheImageToItemEl(b[1],d[1]),this.addCacheImageToItemEl(b[2],d[2])):(this.currentCacheIndex===this.cache.images.length-1?(b=this.cache.getImages([this.currentCacheIndex-2,this.currentCacheIndex-1,this.currentCacheIndex]),a||this.addCacheImageToItemEl(b[2],d[2]),this.addCacheImageToItemEl(b[1],d[1])):(b=this.cache.getImages([this.currentCacheIndex-1,this.currentCacheIndex,this.currentCacheIndex+1]),
+a||this.addCacheImageToItemEl(b[1],d[1]),this.addCacheImageToItemEl(b[2],d[2])),this.addCacheImageToItemEl(b[0],d[0]))},addCacheImageToItemEl:function(c,d){a.DOM.removeClass(d,b.Carousel.CssClasses.itemError);a.DOM.addClass(d,b.Carousel.CssClasses.itemLoading);a.DOM.removeChildren(d);a.DOM.setStyle(c.imageEl,{display:"none"});a.DOM.appendChild(c.imageEl,d);a.Animation.resetTranslate(c.imageEl);a.Events.add(c,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.add(c,b.Image.EventTypes.onError,
+this.imageErrorHandler);c.load()},slideCarousel:function(c,d,f){if(!this.isSliding){var i,j;i=this.settings.target===e?a.DOM.windowWidth()+this.settings.margin:a.DOM.width(this.settings.target)+this.settings.margin;f=a.coalesce(f,this.settings.slideSpeed);if(!(e.Math.abs(j)<1)){switch(d){case a.TouchElement.ActionTypes.swipeLeft:c=i*-1;break;case a.TouchElement.ActionTypes.swipeRight:c=i;break;default:j=c.x-this.touchStartPoint.x,c=e.Math.abs(j)>i/2?j>0?i:i*-1:0}this.lastSlideByAction=c<0?b.Carousel.SlideByAction.next:
+c>0?b.Carousel.SlideByAction.previous:b.Carousel.SlideByAction.current;if(!this.settings.loop&&(this.lastSlideByAction===b.Carousel.SlideByAction.previous&&this.currentCacheIndex===0||this.lastSlideByAction===b.Carousel.SlideByAction.next&&this.currentCacheIndex===this.cache.images.length-1))c=0,this.lastSlideByAction=b.Carousel.SlideByAction.current;this.isSliding=!0;this.doSlideCarousel(c,f)}}},moveCarousel:function(a){this.isSliding||this.settings.enableDrag&&this.doMoveCarousel(a.x-this.touchStartPoint.x)},
+getItemEls:function(){return a.DOM.find("."+b.Carousel.CssClasses.item,this.contentEl)},previous:function(){this.stopSlideshow();this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeRight,this.settings.nextPreviousSlideSpeed)},next:function(){this.stopSlideshow();this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeLeft,this.settings.nextPreviousSlideSpeed)},slideshowNext:function(){this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeLeft)},startSlideshow:function(){this.stopSlideshow();
+this.isSlideshowActive=!0;this.slideshowTimeout=e.setTimeout(this.slideshowNext.bind(this),this.settings.slideshowDelay);a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideshowStart,target:this})},stopSlideshow:function(){if(!a.isNothing(this.slideshowTimeout))e.clearTimeout(this.slideshowTimeout),this.slideshowTimeout=null,this.isSlideshowActive=!1,a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideshowStop,target:this})},onSlideByEnd:function(){if(!a.isNothing(this.isSliding)){var c=this.getItemEls();
+this.isSliding=!1;this.lastSlideByAction===b.Carousel.SlideByAction.next?this.currentCacheIndex+=1:this.lastSlideByAction===b.Carousel.SlideByAction.previous&&(this.currentCacheIndex-=1);if(this.settings.loop)if(this.lastSlideByAction===b.Carousel.SlideByAction.next?a.DOM.appendChild(c[0],this.contentEl):this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(c[c.length-1],c[0],this.contentEl),this.currentCacheIndex<0)this.currentCacheIndex=this.cache.images.length-1;else{if(this.currentCacheIndex===
+this.cache.images.length)this.currentCacheIndex=0}else this.cache.images.length>3&&(this.currentCacheIndex>1&&this.currentCacheIndex<this.cache.images.length-2?this.lastSlideByAction===b.Carousel.SlideByAction.next?a.DOM.appendChild(c[0],this.contentEl):this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(c[c.length-1],c[0],this.contentEl):this.currentCacheIndex===1?this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(c[c.length-1],c[0],this.contentEl):
+this.currentCacheIndex===this.cache.images.length-2&&this.lastSlideByAction===b.Carousel.SlideByAction.next&&a.DOM.appendChild(c[0],this.contentEl));this.lastSlideByAction!==b.Carousel.SlideByAction.current&&(this.setContentLeftPosition(),this.setImages(!0));a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideByEnd,target:this,action:this.lastSlideByAction,cacheIndex:this.currentCacheIndex});this.isSlideshowActive&&(this.lastSlideByAction!==b.Carousel.SlideByAction.current?this.startSlideshow():
+this.stopSlideshow())}},onTouch:function(b,d){this.stopSlideshow();switch(b){case a.TouchElement.ActionTypes.touchStart:this.touchStartPoint=d;this.touchStartPosition={x:e.parseInt(a.DOM.getStyle(this.contentEl,"left"),0),y:e.parseInt(a.DOM.getStyle(this.contentEl,"top"),0)};break;case a.TouchElement.ActionTypes.touchMove:this.moveCarousel(d);break;case a.TouchElement.ActionTypes.touchMoveEnd:case a.TouchElement.ActionTypes.swipeLeft:case a.TouchElement.ActionTypes.swipeRight:this.slideCarousel(d,
+b)}},onImageLoad:function(c){c=c.target;a.isNothing(c.imageEl.parentNode)||(a.DOM.removeClass(c.imageEl.parentNode,b.Carousel.CssClasses.itemLoading),this.resetImagePosition(c.imageEl));a.Events.remove(c,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.remove(c,b.Image.EventTypes.onError,this.imageErrorHandler)},onImageError:function(c){c=c.target;a.isNothing(c.imageEl.parentNode)||(a.DOM.removeClass(c.imageEl.parentNode,b.Carousel.CssClasses.itemLoading),a.DOM.addClass(c.imageEl.parentNode,
+b.Carousel.CssClasses.itemError));a.Events.remove(c,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.remove(c,b.Image.EventTypes.onError,this.imageErrorHandler)}})})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Carousel");d=e.Code.PhotoSwipe;d.Carousel.CarouselClass=d.Carousel.CarouselClass.extend({getStartingPos:function(){var b=this.touchStartPosition;a.isNothing(b)&&(b={x:e.parseInt(a.DOM.getStyle(this.contentEl,"left"),0),y:e.parseInt(a.DOM.getStyle(this.contentEl,"top"),0)});return b},doMoveCarousel:function(b){var c;a.Browser.isCSSTransformSupported?(c={},c[a.Animation._transitionPrefix+"Property"]="all",c[a.Animation._transitionPrefix+"Duration"]=
+"",c[a.Animation._transitionPrefix+"TimingFunction"]="",c[a.Animation._transitionPrefix+"Delay"]="0",c[a.Animation._transformLabel]=a.Browser.is3dSupported?"translate3d("+b+"px, 0px, 0px)":"translate("+b+"px, 0px)",a.DOM.setStyle(this.contentEl,c)):a.isNothing(e.jQuery)||e.jQuery(this.contentEl).stop().css("left",this.getStartingPos().x+b+"px")},doSlideCarousel:function(b,c){var d;if(c<=0)this.slideByEndHandler();else if(a.Browser.isCSSTransformSupported)d=a.coalesce(this.contentEl.style.webkitTransform,
+this.contentEl.style.MozTransform,this.contentEl.style.transform,""),d.indexOf("translate3d("+b)===0?this.slideByEndHandler():d.indexOf("translate("+b)===0?this.slideByEndHandler():a.Animation.slideBy(this.contentEl,b,0,c,this.slideByEndHandler,this.settings.slideTimingFunction);else if(!a.isNothing(e.jQuery)){d={left:this.getStartingPos().x+b+"px"};if(this.settings.animationTimingFunction==="ease-out")this.settings.animationTimingFunction="easeOutQuad";if(a.isNothing(e.jQuery.easing[this.settings.animationTimingFunction]))this.settings.animationTimingFunction=
+"linear";e.jQuery(this.contentEl).animate(d,this.settings.slideSpeed,this.settings.animationTimingFunction,this.slideByEndHandler)}}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.TouchElement);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Toolbar");var b=e.Code.PhotoSwipe;b.Toolbar.CssClasses={toolbar:"ps-toolbar",toolbarContent:"ps-toolbar-content",toolbarTop:"ps-toolbar-top",caption:"ps-caption",captionBottom:"ps-caption-bottom",captionContent:"ps-caption-content",close:"ps-toolbar-close",play:"ps-toolbar-play",previous:"ps-toolbar-previous",previousDisabled:"ps-toolbar-previous-disabled",next:"ps-toolbar-next",nextDisabled:"ps-toolbar-next-disabled"};b.Toolbar.ToolbarAction=
+{close:"close",play:"play",next:"next",previous:"previous",none:"none"};b.Toolbar.EventTypes={onTap:"PhotoSwipeToolbarOnClick",onBeforeShow:"PhotoSwipeToolbarOnBeforeShow",onShow:"PhotoSwipeToolbarOnShow",onBeforeHide:"PhotoSwipeToolbarOnBeforeHide",onHide:"PhotoSwipeToolbarOnHide"};b.Toolbar.getToolbar=function(){return'<div class="'+b.Toolbar.CssClasses.close+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div><div class="'+b.Toolbar.CssClasses.play+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+
+'"></div></div><div class="'+b.Toolbar.CssClasses.previous+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div><div class="'+b.Toolbar.CssClasses.next+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div>'}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.Toolbar");var b=e.Code.PhotoSwipe;b.Toolbar.ToolbarClass=d({toolbarEl:null,closeEl:null,playEl:null,previousEl:null,nextEl:null,captionEl:null,captionContentEl:null,currentCaption:null,settings:null,cache:null,timeout:null,isVisible:null,fadeOutHandler:null,touchStartHandler:null,touchMoveHandler:null,clickHandler:null,dispose:function(){var b;this.clearTimeout();this.removeEventHandlers();a.Animation.stop(this.toolbarEl);a.Animation.stop(this.captionEl);
+a.DOM.removeChild(this.toolbarEl,this.toolbarEl.parentNode);a.DOM.removeChild(this.captionEl,this.captionEl.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,d){var f;this.settings=d;this.cache=c;this.isVisible=!1;this.fadeOutHandler=this.onFadeOut.bind(this);this.touchStartHandler=this.onTouchStart.bind(this);this.touchMoveHandler=this.onTouchMove.bind(this);this.clickHandler=this.onClick.bind(this);f=b.Toolbar.CssClasses.toolbar;this.settings.captionAndToolbarFlipPosition&&
+(f=f+" "+b.Toolbar.CssClasses.toolbarTop);this.toolbarEl=a.DOM.createElement("div",{"class":f},this.settings.getToolbar());a.DOM.setStyle(this.toolbarEl,{left:0,position:"absolute",overflow:"hidden",zIndex:this.settings.zIndex});this.settings.target===e?a.DOM.appendToBody(this.toolbarEl):a.DOM.appendChild(this.toolbarEl,this.settings.target);a.DOM.hide(this.toolbarEl);this.closeEl=a.DOM.find("."+b.Toolbar.CssClasses.close,this.toolbarEl)[0];this.settings.preventHide&&!a.isNothing(this.closeEl)&&a.DOM.hide(this.closeEl);
+this.playEl=a.DOM.find("."+b.Toolbar.CssClasses.play,this.toolbarEl)[0];this.settings.preventSlideshow&&!a.isNothing(this.playEl)&&a.DOM.hide(this.playEl);this.nextEl=a.DOM.find("."+b.Toolbar.CssClasses.next,this.toolbarEl)[0];this.previousEl=a.DOM.find("."+b.Toolbar.CssClasses.previous,this.toolbarEl)[0];f=b.Toolbar.CssClasses.caption;this.settings.captionAndToolbarFlipPosition&&(f=f+" "+b.Toolbar.CssClasses.captionBottom);this.captionEl=a.DOM.createElement("div",{"class":f},"");a.DOM.setStyle(this.captionEl,
+{left:0,position:"absolute",overflow:"hidden",zIndex:this.settings.zIndex});this.settings.target===e?a.DOM.appendToBody(this.captionEl):a.DOM.appendChild(this.captionEl,this.settings.target);a.DOM.hide(this.captionEl);this.captionContentEl=a.DOM.createElement("div",{"class":b.Toolbar.CssClasses.captionContent},"");a.DOM.appendChild(this.captionContentEl,this.captionEl);this.addEventHandlers()},resetPosition:function(){var b,d,f;this.settings.target===e?(this.settings.captionAndToolbarFlipPosition?
+(d=a.DOM.windowScrollTop(),f=a.DOM.windowScrollTop()+a.DOM.windowHeight()-a.DOM.height(this.captionEl)):(d=a.DOM.windowScrollTop()+a.DOM.windowHeight()-a.DOM.height(this.toolbarEl),f=a.DOM.windowScrollTop()),b=a.DOM.windowWidth()):(this.settings.captionAndToolbarFlipPosition?(d="0",f=a.DOM.height(this.settings.target)-a.DOM.height(this.captionEl)):(d=a.DOM.height(this.settings.target)-a.DOM.height(this.toolbarEl),f=0),b=a.DOM.width(this.settings.target));a.DOM.setStyle(this.toolbarEl,{top:d+"px",
+width:b});a.DOM.setStyle(this.captionEl,{top:f+"px",width:b})},toggleVisibility:function(a){this.isVisible?this.fadeOut():this.show(a)},show:function(c){a.Animation.stop(this.toolbarEl);a.Animation.stop(this.captionEl);this.resetPosition();this.setToolbarStatus(c);a.Events.fire(this,{type:b.Toolbar.EventTypes.onBeforeShow,target:this});this.showToolbar();this.setCaption(c);this.showCaption();this.isVisible=!0;this.setTimeout();a.Events.fire(this,{type:b.Toolbar.EventTypes.onShow,target:this})},setTimeout:function(){if(this.settings.captionAndToolbarAutoHideDelay>
+0)this.clearTimeout(),this.timeout=e.setTimeout(this.fadeOut.bind(this),this.settings.captionAndToolbarAutoHideDelay)},clearTimeout:function(){if(!a.isNothing(this.timeout))e.clearTimeout(this.timeout),this.timeout=null},fadeOut:function(){this.clearTimeout();a.Events.fire(this,{type:b.Toolbar.EventTypes.onBeforeHide,target:this});a.Animation.fadeOut(this.toolbarEl,this.settings.fadeOutSpeed);a.Animation.fadeOut(this.captionEl,this.settings.fadeOutSpeed,this.fadeOutHandler);this.isVisible=!1},addEventHandlers:function(){a.Browser.isTouchSupported&&
+(a.Browser.blackberry||a.Events.add(this.toolbarEl,"touchstart",this.touchStartHandler),a.Events.add(this.toolbarEl,"touchmove",this.touchMoveHandler),a.Events.add(this.captionEl,"touchmove",this.touchMoveHandler));a.Events.add(this.toolbarEl,"click",this.clickHandler)},removeEventHandlers:function(){a.Browser.isTouchSupported&&(a.Browser.blackberry||a.Events.remove(this.toolbarEl,"touchstart",this.touchStartHandler),a.Events.remove(this.toolbarEl,"touchmove",this.touchMoveHandler),a.Events.remove(this.captionEl,
+"touchmove",this.touchMoveHandler));a.Events.remove(this.toolbarEl,"click",this.clickHandler)},handleTap:function(c){this.clearTimeout();var d;if(c.target===this.nextEl||a.DOM.isChildOf(c.target,this.nextEl))d=b.Toolbar.ToolbarAction.next;else if(c.target===this.previousEl||a.DOM.isChildOf(c.target,this.previousEl))d=b.Toolbar.ToolbarAction.previous;else if(c.target===this.closeEl||a.DOM.isChildOf(c.target,this.closeEl))d=b.Toolbar.ToolbarAction.close;else if(c.target===this.playEl||a.DOM.isChildOf(c.target,
+this.playEl))d=b.Toolbar.ToolbarAction.play;this.setTimeout();if(a.isNothing(d))d=b.Toolbar.ToolbarAction.none;a.Events.fire(this,{type:b.Toolbar.EventTypes.onTap,target:this,action:d,tapTarget:c.target})},setCaption:function(b){a.DOM.removeChildren(this.captionContentEl);this.currentCaption=a.coalesce(this.cache.images[b].caption,"\u00a0");if(a.isObject(this.currentCaption))a.DOM.appendChild(this.currentCaption,this.captionContentEl);else{if(this.currentCaption==="")this.currentCaption="\u00a0";
+a.DOM.appendText(this.currentCaption,this.captionContentEl)}this.currentCaption=this.currentCaption==="\u00a0"?"":this.currentCaption;this.resetPosition()},showToolbar:function(){a.DOM.setStyle(this.toolbarEl,{opacity:this.settings.captionAndToolbarOpacity});a.DOM.show(this.toolbarEl)},showCaption:function(){(this.currentCaption===""||this.captionContentEl.childNodes.length<1)&&!this.settings.captionAndToolbarShowEmptyCaptions?a.DOM.hide(this.captionEl):(a.DOM.setStyle(this.captionEl,{opacity:this.settings.captionAndToolbarOpacity}),
+a.DOM.show(this.captionEl))},setToolbarStatus:function(c){this.settings.loop||(a.DOM.removeClass(this.previousEl,b.Toolbar.CssClasses.previousDisabled),a.DOM.removeClass(this.nextEl,b.Toolbar.CssClasses.nextDisabled),c>0&&c<this.cache.images.length-1||(c===0&&(a.isNothing(this.previousEl)||a.DOM.addClass(this.previousEl,b.Toolbar.CssClasses.previousDisabled)),c===this.cache.images.length-1&&(a.isNothing(this.nextEl)||a.DOM.addClass(this.nextEl,b.Toolbar.CssClasses.nextDisabled))))},onFadeOut:function(){a.DOM.hide(this.toolbarEl);
+a.DOM.hide(this.captionEl);a.Events.fire(this,{type:b.Toolbar.EventTypes.onHide,target:this})},onTouchStart:function(b){b.preventDefault();a.Events.remove(this.toolbarEl,"click",this.clickHandler);this.handleTap(b)},onTouchMove:function(a){a.preventDefault()},onClick:function(a){a.preventDefault();this.handleTap(a)}})})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.UILayer");e.Code.PhotoSwipe.UILayer.CssClasses={uiLayer:"ps-uilayer"}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.UILayer");var b=e.Code.PhotoSwipe;b.UILayer.UILayerClass=a.TouchElement.TouchElementClass.extend({el:null,settings:null,dispose:function(){var b;this.removeEventHandlers();a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c){this.settings=c;this.el=a.DOM.createElement("div",{"class":b.UILayer.CssClasses.uiLayer},"");a.DOM.setStyle(this.el,{display:"block",position:"absolute",
+left:0,top:0,overflow:"hidden",zIndex:this.settings.zIndex,opacity:0});a.DOM.hide(this.el);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target);this.supr(this.el,{swipe:!0,move:!0,gesture:a.Browser.iOS,doubleTap:!0,preventDefaultTouchEvents:this.settings.preventDefaultTouchEvents})},resetPosition:function(){this.settings.target===e?a.DOM.setStyle(this.el,{top:a.DOM.windowScrollTop()+"px",width:a.DOM.windowWidth(),height:a.DOM.windowHeight()}):a.DOM.setStyle(this.el,
+{top:"0px",width:a.DOM.width(this.settings.target),height:a.DOM.height(this.settings.target)})},show:function(){this.resetPosition();a.DOM.show(this.el);this.addEventHandlers()},addEventHandlers:function(){this.supr()},removeEventHandlers:function(){this.supr()}})})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");e=e.Code.PhotoSwipe;e.ZoomPanRotate.CssClasses={zoomPanRotate:"ps-zoom-pan-rotate"};e.ZoomPanRotate.EventTypes={onTransform:"PhotoSwipeZoomPanRotateOnTransform"}})(window,window.klass,window.Code.Util);
+(function(e,d,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");var b=e.Code.PhotoSwipe;b.ZoomPanRotate.ZoomPanRotateClass=d({el:null,settings:null,containerEl:null,imageEl:null,transformSettings:null,panStartingPoint:null,transformEl:null,dispose:function(){var b;a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,d,f){var i,j,h;this.settings=c;this.settings.target===e?(c=document.body,i=a.DOM.windowWidth(),j=a.DOM.windowHeight(),
+h=a.DOM.windowScrollTop()+"px"):(c=this.settings.target,i=a.DOM.width(c),j=a.DOM.height(c),h="0px");this.imageEl=d.imageEl.cloneNode(!1);a.DOM.setStyle(this.imageEl,{zIndex:1});this.transformSettings={startingScale:1,scale:1,startingRotation:0,rotation:0,startingTranslateX:0,startingTranslateY:0,translateX:0,translateY:0};this.el=a.DOM.createElement("div",{"class":b.ZoomPanRotate.CssClasses.zoomPanRotate},"");a.DOM.setStyle(this.el,{left:0,top:h,position:"absolute",width:i,height:j,zIndex:this.settings.zIndex,
+display:"block"});a.DOM.insertBefore(this.el,f.el,c);a.Browser.iOS?(this.containerEl=a.DOM.createElement("div"),a.DOM.setStyle(this.containerEl,{left:0,top:0,width:i,height:j,position:"absolute",zIndex:1}),a.DOM.appendChild(this.imageEl,this.containerEl),a.DOM.appendChild(this.containerEl,this.el),a.Animation.resetTranslate(this.containerEl),a.Animation.resetTranslate(this.imageEl),this.transformEl=this.containerEl):(a.DOM.appendChild(this.imageEl,this.el),this.transformEl=this.imageEl)},setStartingTranslateFromCurrentTransform:function(){var b=
+a.coalesce(this.transformEl.style.webkitTransform,this.transformEl.style.MozTransform,this.transformEl.style.transform);if(!a.isNothing(b)&&(b=b.match(/translate\((.*?)\)/),!a.isNothing(b)))b=b[1].split(", "),this.transformSettings.startingTranslateX=e.parseInt(b[0],10),this.transformSettings.startingTranslateY=e.parseInt(b[1],10)},getScale:function(a){a*=this.transformSettings.startingScale;if(this.settings.minUserZoom!==0&&a<this.settings.minUserZoom)a=this.settings.minUserZoom;else if(this.settings.maxUserZoom!==
+0&&a>this.settings.maxUserZoom)a=this.settings.maxUserZoom;return a},setStartingScaleAndRotation:function(a,b){this.transformSettings.startingScale=this.getScale(a);this.transformSettings.startingRotation=(this.transformSettings.startingRotation+b)%360},zoomRotate:function(a,b){this.transformSettings.scale=this.getScale(a);this.transformSettings.rotation=this.transformSettings.startingRotation+b;this.applyTransform()},panStart:function(a){this.setStartingTranslateFromCurrentTransform();this.panStartingPoint=
+{x:a.x,y:a.y}},pan:function(a){var b=(a.y-this.panStartingPoint.y)/this.transformSettings.scale;this.transformSettings.translateX=this.transformSettings.startingTranslateX+(a.x-this.panStartingPoint.x)/this.transformSettings.scale;this.transformSettings.translateY=this.transformSettings.startingTranslateY+b;this.applyTransform()},zoomAndPanToPoint:function(b,d){if(this.settings.target===e){this.panStart({x:a.DOM.windowWidth()/2,y:a.DOM.windowHeight()/2});var f=(d.y-this.panStartingPoint.y)/this.transformSettings.scale;
+this.transformSettings.translateX=(this.transformSettings.startingTranslateX+(d.x-this.panStartingPoint.x)/this.transformSettings.scale)*-1;this.transformSettings.translateY=(this.transformSettings.startingTranslateY+f)*-1}this.setStartingScaleAndRotation(b,0);this.transformSettings.scale=this.transformSettings.startingScale;this.transformSettings.rotation=0;this.applyTransform()},applyTransform:function(){var c=this.transformSettings.rotation%360,d=e.parseInt(this.transformSettings.translateX,10),
+f=e.parseInt(this.transformSettings.translateY,10),i="scale("+this.transformSettings.scale+") rotate("+c+"deg) translate("+d+"px, "+f+"px)";a.DOM.setStyle(this.transformEl,{webkitTransform:i,MozTransform:i,msTransform:i,transform:i});a.Events.fire(this,{target:this,type:b.ZoomPanRotate.EventTypes.onTransform,scale:this.transformSettings.scale,rotation:this.transformSettings.rotation,rotationDegs:c,translateX:d,translateY:f})}})})(window,window.klass,window.Code.Util);
+(function(e,d){d.registerNamespace("Code.PhotoSwipe");var a=e.Code.PhotoSwipe;a.CssClasses={buildingBody:"ps-building",activeBody:"ps-active"};a.EventTypes={onBeforeShow:"PhotoSwipeOnBeforeShow",onShow:"PhotoSwipeOnShow",onBeforeHide:"PhotoSwipeOnBeforeHide",onHide:"PhotoSwipeOnHide",onDisplayImage:"PhotoSwipeOnDisplayImage",onResetPosition:"PhotoSwipeOnResetPosition",onSlideshowStart:"PhotoSwipeOnSlideshowStart",onSlideshowStop:"PhotoSwipeOnSlideshowStop",onTouch:"PhotoSwipeOnTouch",onBeforeCaptionAndToolbarShow:"PhotoSwipeOnBeforeCaptionAndToolbarShow",
+onCaptionAndToolbarShow:"PhotoSwipeOnCaptionAndToolbarShow",onBeforeCaptionAndToolbarHide:"PhotoSwipeOnBeforeCaptionAndToolbarHide",onCaptionAndToolbarHide:"PhotoSwipeOnCaptionAndToolbarHide",onToolbarTap:"PhotoSwipeOnToolbarTap",onBeforeZoomPanRotateShow:"PhotoSwipeOnBeforeZoomPanRotateShow",onZoomPanRotateShow:"PhotoSwipeOnZoomPanRotateShow",onBeforeZoomPanRotateHide:"PhotoSwipeOnBeforeZoomPanRotateHide",onZoomPanRotateHide:"PhotoSwipeOnZoomPanRotateHide",onZoomPanRotateTransform:"PhotoSwipeOnZoomPanRotateTransform"};
+a.instances=[];a.activeInstances=[];a.setActivateInstance=function(b){if(d.arrayIndexOf(b.settings.target,a.activeInstances,"target")>-1)throw"Code.PhotoSwipe.activateInstance: Unable to active instance as another instance is already active for this target";a.activeInstances.push({target:b.settings.target,instance:b})};a.unsetActivateInstance=function(b){b=d.arrayIndexOf(b,a.activeInstances,"instance");a.activeInstances.splice(b,1)};a.attach=function(b,c,e){var f,i;f=a.createInstance(b,c,e);c=0;for(e=
+b.length;c<e;c++)if(i=b[c],!d.isNothing(i.nodeType)&&i.nodeType===1)i.__photoSwipeClickHandler=a.onTriggerElementClick.bind(f),d.Events.remove(i,"click",i.__photoSwipeClickHandler),d.Events.add(i,"click",i.__photoSwipeClickHandler);return f};if(e.jQuery)e.jQuery.fn.photoSwipe=function(b,c){return a.attach(this,b,c)};a.detatch=function(b){var c,e,f;c=0;for(e=b.originalImages.length;c<e;c++)f=b.originalImages[c],!d.isNothing(f.nodeType)&&f.nodeType===1&&(d.Events.remove(f,"click",f.__photoSwipeClickHandler),
+delete f.__photoSwipeClickHandler);a.disposeInstance(b)};a.createInstance=function(b,c,e){var f;if(d.isNothing(b))throw"Code.PhotoSwipe.attach: No images passed.";if(!d.isLikeArray(b))throw"Code.PhotoSwipe.createInstance: Images must be an array of elements or image urls.";if(b.length<1)throw"Code.PhotoSwipe.createInstance: No images to passed.";c=d.coalesce(c,{});f=a.getInstance(e);if(d.isNothing(f))f=new a.PhotoSwipeClass(b,c,e),a.instances.push(f);else throw'Code.PhotoSwipe.createInstance: Instance with id "'+
+e+' already exists."';return f};a.disposeInstance=function(b){var c=a.getInstanceIndex(b);if(c<0)throw"Code.PhotoSwipe.disposeInstance: Unable to find instance to dispose.";b.dispose();a.instances.splice(c,1)};a.onTriggerElementClick=function(a){a.preventDefault();this.show(a.currentTarget)};a.getInstance=function(b){var c,d,e;c=0;for(d=a.instances.length;c<d;c++)if(e=a.instances[c],e.id===b)return e;return null};a.getInstanceIndex=function(b){var c,d,e=-1;c=0;for(d=a.instances.length;c<d;c++)if(a.instances[c]===
+b){e=c;break}return e}})(window,window.Code.Util);
+(function(e,d,a,b,c,g,f,i,j){a.registerNamespace("Code.PhotoSwipe");var h=e.Code.PhotoSwipe;h.PhotoSwipeClass=d({id:null,settings:null,isBackEventSupported:null,backButtonClicked:null,currentIndex:null,originalImages:null,mouseWheelStartTime:null,windowDimensions:null,cache:null,documentOverlay:null,carousel:null,uiLayer:null,toolbar:null,zoomPanRotate:null,windowOrientationChangeHandler:null,windowScrollHandler:null,windowHashChangeHandler:null,keyDownHandler:null,windowOrientationEventName:null,
+uiLayerTouchHandler:null,carouselSlideByEndHandler:null,carouselSlideshowStartHandler:null,carouselSlideshowStopHandler:null,toolbarTapHandler:null,toolbarBeforeShowHandler:null,toolbarShowHandler:null,toolbarBeforeHideHandler:null,toolbarHideHandler:null,mouseWheelHandler:null,zoomPanRotateTransformHandler:null,_isResettingPosition:null,_uiWebViewResetPositionTimeout:null,dispose:function(){var b;a.Events.remove(this,h.EventTypes.onBeforeShow);a.Events.remove(this,h.EventTypes.onShow);a.Events.remove(this,
+h.EventTypes.onBeforeHide);a.Events.remove(this,h.EventTypes.onHide);a.Events.remove(this,h.EventTypes.onDisplayImage);a.Events.remove(this,h.EventTypes.onResetPosition);a.Events.remove(this,h.EventTypes.onSlideshowStart);a.Events.remove(this,h.EventTypes.onSlideshowStop);a.Events.remove(this,h.EventTypes.onTouch);a.Events.remove(this,h.EventTypes.onBeforeCaptionAndToolbarShow);a.Events.remove(this,h.EventTypes.onCaptionAndToolbarShow);a.Events.remove(this,h.EventTypes.onBeforeCaptionAndToolbarHide);
+a.Events.remove(this,h.EventTypes.onCaptionAndToolbarHide);a.Events.remove(this,h.EventTypes.onZoomPanRotateTransform);this.removeEventHandlers();a.isNothing(this.documentOverlay)||this.documentOverlay.dispose();a.isNothing(this.carousel)||this.carousel.dispose();a.isNothing(this.uiLayer)||this.uiLayer.dispose();a.isNothing(this.toolbar)||this.toolbar.dispose();this.destroyZoomPanRotate();a.isNothing(this.cache)||this.cache.dispose();for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,
+d,f){this.id=a.isNothing(f)?"PhotoSwipe"+(new Date).getTime().toString():f;this.originalImages=c;if(a.Browser.android&&e.navigator.userAgent.match(/Android (\d+.\d+)/).toString().replace(/^.*\,/,"")>=2.1)this.isBackEventSupported=!0;if(!this.isBackEventSupported)this.isBackEventSupported=a.objectHasProperty(e,"onhashchange");this.settings={fadeInSpeed:250,fadeOutSpeed:250,preventHide:!1,preventSlideshow:!1,zIndex:1E3,backButtonHideEnabled:!0,enableKeyboard:!0,enableMouseWheel:!0,mouseWheelSpeed:350,
+autoStartSlideshow:!1,jQueryMobile:!a.isNothing(e.jQuery)&&!a.isNothing(e.jQuery.mobile),jQueryMobileDialogHash:"&ui-state=dialog",enableUIWebViewRepositionTimeout:!1,uiWebViewResetPositionDelay:500,target:e,preventDefaultTouchEvents:!0,loop:!0,slideSpeed:250,nextPreviousSlideSpeed:0,enableDrag:!0,swipeThreshold:50,swipeTimeThreshold:250,slideTimingFunction:"ease-out",slideshowDelay:3E3,doubleTapSpeed:250,margin:20,imageScaleMethod:"fit",captionAndToolbarHide:!1,captionAndToolbarFlipPosition:!1,captionAndToolbarAutoHideDelay:5E3,
+captionAndToolbarOpacity:0.8,captionAndToolbarShowEmptyCaptions:!0,getToolbar:h.Toolbar.getToolbar,allowUserZoom:!0,allowRotationOnUserZoom:!1,maxUserZoom:5,minUserZoom:0.5,doubleTapZoomLevel:2.5,getImageSource:h.Cache.Functions.getImageSource,getImageCaption:h.Cache.Functions.getImageCaption,getImageMetaData:h.Cache.Functions.getImageMetaData,cacheMode:h.Cache.Mode.normal};a.extend(this.settings,d);this.settings.target!==e&&(d=a.DOM.getStyle(this.settings.target,"position"),(d!=="relative"||d!==
+"absolute")&&a.DOM.setStyle(this.settings.target,"position","relative"));if(this.settings.target!==e)this.isBackEventSupported=!1,this.settings.backButtonHideEnabled=!1;else if(this.settings.preventHide)this.settings.backButtonHideEnabled=!1;this.cache=new b.CacheClass(c,this.settings)},show:function(b){var c,d;this.backButtonClicked=this._isResettingPosition=!1;if(a.isNumber(b))this.currentIndex=b;else{this.currentIndex=-1;c=0;for(d=this.originalImages.length;c<d;c++)if(this.originalImages[c]===
+b){this.currentIndex=c;break}}if(this.currentIndex<0||this.currentIndex>this.originalImages.length-1)throw"Code.PhotoSwipe.PhotoSwipeClass.show: Starting index out of range";this.isAlreadyGettingPage=this.getWindowDimensions();h.setActivateInstance(this);this.windowDimensions=this.getWindowDimensions();this.settings.target===e?a.DOM.addClass(e.document.body,h.CssClasses.buildingBody):a.DOM.addClass(this.settings.target,h.CssClasses.buildingBody);this.createComponents();a.Events.fire(this,{type:h.EventTypes.onBeforeShow,
+target:this});this.documentOverlay.fadeIn(this.settings.fadeInSpeed,this.onDocumentOverlayFadeIn.bind(this))},getWindowDimensions:function(){return{width:a.DOM.windowWidth(),height:a.DOM.windowHeight()}},createComponents:function(){this.documentOverlay=new c.DocumentOverlayClass(this.settings);this.carousel=new g.CarouselClass(this.cache,this.settings);this.uiLayer=new i.UILayerClass(this.settings);if(!this.settings.captionAndToolbarHide)this.toolbar=new f.ToolbarClass(this.cache,this.settings)},
+resetPosition:function(){if(!this._isResettingPosition){var b=this.getWindowDimensions();if(a.isNothing(this.windowDimensions)||!(b.width===this.windowDimensions.width&&b.height===this.windowDimensions.height))this._isResettingPosition=!0,this.windowDimensions=b,this.destroyZoomPanRotate(),this.documentOverlay.resetPosition(),this.carousel.resetPosition(),a.isNothing(this.toolbar)||this.toolbar.resetPosition(),this.uiLayer.resetPosition(),this._isResettingPosition=!1,a.Events.fire(this,{type:h.EventTypes.onResetPosition,
+target:this})}},addEventHandler:function(b,c){a.Events.add(this,b,c)},addEventHandlers:function(){if(a.isNothing(this.windowOrientationChangeHandler))this.windowOrientationChangeHandler=this.onWindowOrientationChange.bind(this),this.windowScrollHandler=this.onWindowScroll.bind(this),this.keyDownHandler=this.onKeyDown.bind(this),this.windowHashChangeHandler=this.onWindowHashChange.bind(this),this.uiLayerTouchHandler=this.onUILayerTouch.bind(this),this.carouselSlideByEndHandler=this.onCarouselSlideByEnd.bind(this),
+this.carouselSlideshowStartHandler=this.onCarouselSlideshowStart.bind(this),this.carouselSlideshowStopHandler=this.onCarouselSlideshowStop.bind(this),this.toolbarTapHandler=this.onToolbarTap.bind(this),this.toolbarBeforeShowHandler=this.onToolbarBeforeShow.bind(this),this.toolbarShowHandler=this.onToolbarShow.bind(this),this.toolbarBeforeHideHandler=this.onToolbarBeforeHide.bind(this),this.toolbarHideHandler=this.onToolbarHide.bind(this),this.mouseWheelHandler=this.onMouseWheel.bind(this),this.zoomPanRotateTransformHandler=
+this.onZoomPanRotateTransform.bind(this);a.Browser.android?this.orientationEventName="resize":a.Browser.iOS&&!a.Browser.safari?a.Events.add(e.document.body,"orientationchange",this.windowOrientationChangeHandler):this.orientationEventName=!a.isNothing(e.onorientationchange)?"orientationchange":"resize";a.isNothing(this.orientationEventName)||a.Events.add(e,this.orientationEventName,this.windowOrientationChangeHandler);this.settings.target===e&&a.Events.add(e,"scroll",this.windowScrollHandler);this.settings.enableKeyboard&&
+a.Events.add(e.document,"keydown",this.keyDownHandler);if(this.isBackEventSupported&&this.settings.backButtonHideEnabled)this.windowHashChangeHandler=this.onWindowHashChange.bind(this),this.settings.jQueryMobile?e.location.hash=this.settings.jQueryMobileDialogHash:(this.currentHistoryHashValue="PhotoSwipe"+(new Date).getTime().toString(),e.location.hash=this.currentHistoryHashValue),a.Events.add(e,"hashchange",this.windowHashChangeHandler);this.settings.enableMouseWheel&&a.Events.add(e,"mousewheel",
+this.mouseWheelHandler);a.Events.add(this.uiLayer,a.TouchElement.EventTypes.onTouch,this.uiLayerTouchHandler);a.Events.add(this.carousel,g.EventTypes.onSlideByEnd,this.carouselSlideByEndHandler);a.Events.add(this.carousel,g.EventTypes.onSlideshowStart,this.carouselSlideshowStartHandler);a.Events.add(this.carousel,g.EventTypes.onSlideshowStop,this.carouselSlideshowStopHandler);a.isNothing(this.toolbar)||(a.Events.add(this.toolbar,f.EventTypes.onTap,this.toolbarTapHandler),a.Events.add(this.toolbar,
+f.EventTypes.onBeforeShow,this.toolbarBeforeShowHandler),a.Events.add(this.toolbar,f.EventTypes.onShow,this.toolbarShowHandler),a.Events.add(this.toolbar,f.EventTypes.onBeforeHide,this.toolbarBeforeHideHandler),a.Events.add(this.toolbar,f.EventTypes.onHide,this.toolbarHideHandler))},removeEventHandlers:function(){a.Browser.iOS&&!a.Browser.safari&&a.Events.remove(e.document.body,"orientationchange",this.windowOrientationChangeHandler);a.isNothing(this.orientationEventName)||a.Events.remove(e,this.orientationEventName,
+this.windowOrientationChangeHandler);a.Events.remove(e,"scroll",this.windowScrollHandler);this.settings.enableKeyboard&&a.Events.remove(e.document,"keydown",this.keyDownHandler);this.isBackEventSupported&&this.settings.backButtonHideEnabled&&a.Events.remove(e,"hashchange",this.windowHashChangeHandler);this.settings.enableMouseWheel&&a.Events.remove(e,"mousewheel",this.mouseWheelHandler);a.isNothing(this.uiLayer)||a.Events.remove(this.uiLayer,a.TouchElement.EventTypes.onTouch,this.uiLayerTouchHandler);
+a.isNothing(this.toolbar)||(a.Events.remove(this.carousel,g.EventTypes.onSlideByEnd,this.carouselSlideByEndHandler),a.Events.remove(this.carousel,g.EventTypes.onSlideshowStart,this.carouselSlideshowStartHandler),a.Events.remove(this.carousel,g.EventTypes.onSlideshowStop,this.carouselSlideshowStopHandler));a.isNothing(this.toolbar)||(a.Events.remove(this.toolbar,f.EventTypes.onTap,this.toolbarTapHandler),a.Events.remove(this.toolbar,f.EventTypes.onBeforeShow,this.toolbarBeforeShowHandler),a.Events.remove(this.toolbar,
+f.EventTypes.onShow,this.toolbarShowHandler),a.Events.remove(this.toolbar,f.EventTypes.onBeforeHide,this.toolbarBeforeHideHandler),a.Events.remove(this.toolbar,f.EventTypes.onHide,this.toolbarHideHandler))},hide:function(){if(!this.settings.preventHide){if(a.isNothing(this.documentOverlay))throw"Code.PhotoSwipe.PhotoSwipeClass.hide: PhotoSwipe instance is already hidden";if(a.isNothing(this.hiding)){this.clearUIWebViewResetPositionTimeout();this.destroyZoomPanRotate();this.removeEventHandlers();a.Events.fire(this,
+{type:h.EventTypes.onBeforeHide,target:this});this.uiLayer.dispose();this.uiLayer=null;if(!a.isNothing(this.toolbar))this.toolbar.dispose(),this.toolbar=null;this.carousel.dispose();this.carousel=null;a.DOM.removeClass(e.document.body,h.CssClasses.activeBody);this.documentOverlay.dispose();this.documentOverlay=null;this._isResettingPosition=!1;h.unsetActivateInstance(this);a.Events.fire(this,{type:h.EventTypes.onHide,target:this});this.goBackInHistory()}}},goBackInHistory:function(){this.isBackEventSupported&&
+this.settings.backButtonHideEnabled&&(this.backButtonClicked||e.history.back())},play:function(){!this.isZoomActive()&&!this.settings.preventSlideshow&&!a.isNothing(this.carousel)&&(!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.toolbar.fadeOut(),this.carousel.startSlideshow())},stop:function(){this.isZoomActive()||a.isNothing(this.carousel)||this.carousel.stopSlideshow()},previous:function(){this.isZoomActive()||a.isNothing(this.carousel)||this.carousel.previous()},next:function(){this.isZoomActive()||
+a.isNothing(this.carousel)||this.carousel.next()},toggleToolbar:function(){this.isZoomActive()||a.isNothing(this.toolbar)||this.toolbar.toggleVisibility(this.currentIndex)},fadeOutToolbarIfVisible:function(){!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.settings.captionAndToolbarAutoHideDelay>0&&this.toolbar.fadeOut()},createZoomPanRotate:function(){this.stop();if(this.canUserZoom()&&!this.isZoomActive())a.Events.fire(this,h.EventTypes.onBeforeZoomPanRotateShow),this.zoomPanRotate=new j.ZoomPanRotateClass(this.settings,
+this.cache.images[this.currentIndex],this.uiLayer),this.uiLayer.captureSettings.preventDefaultTouchEvents=!0,a.Events.add(this.zoomPanRotate,h.ZoomPanRotate.EventTypes.onTransform,this.zoomPanRotateTransformHandler),a.Events.fire(this,h.EventTypes.onZoomPanRotateShow),!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.toolbar.fadeOut()},destroyZoomPanRotate:function(){if(!a.isNothing(this.zoomPanRotate))a.Events.fire(this,h.EventTypes.onBeforeZoomPanRotateHide),a.Events.remove(this.zoomPanRotate,
+h.ZoomPanRotate.EventTypes.onTransform,this.zoomPanRotateTransformHandler),this.zoomPanRotate.dispose(),this.zoomPanRotate=null,this.uiLayer.captureSettings.preventDefaultTouchEvents=this.settings.preventDefaultTouchEvents,a.Events.fire(this,h.EventTypes.onZoomPanRotateHide)},canUserZoom:function(){var b;if(a.Browser.msie){if(b=document.createElement("div"),a.isNothing(b.style.msTransform))return!1}else if(!a.Browser.isCSSTransformSupported)return!1;if(!this.settings.allowUserZoom)return!1;if(this.carousel.isSliding)return!1;
+b=this.cache.images[this.currentIndex];if(a.isNothing(b))return!1;if(b.isLoading)return!1;return!0},isZoomActive:function(){return!a.isNothing(this.zoomPanRotate)},getCurrentImage:function(){return this.cache.images[this.currentIndex]},onDocumentOverlayFadeIn:function(){e.setTimeout(function(){var b=this.settings.target===e?e.document.body:this.settings.target;a.DOM.removeClass(b,h.CssClasses.buildingBody);a.DOM.addClass(b,h.CssClasses.activeBody);this.addEventHandlers();this.carousel.show(this.currentIndex);
+this.uiLayer.show();this.settings.autoStartSlideshow?this.play():a.isNothing(this.toolbar)||this.toolbar.show(this.currentIndex);a.Events.fire(this,{type:h.EventTypes.onShow,target:this});this.setUIWebViewResetPositionTimeout()}.bind(this),250)},setUIWebViewResetPositionTimeout:function(){if(this.settings.enableUIWebViewRepositionTimeout&&a.Browser.iOS&&!a.Browser.safari)a.isNothing(this._uiWebViewResetPositionTimeout)||e.clearTimeout(this._uiWebViewResetPositionTimeout),this._uiWebViewResetPositionTimeout=
+e.setTimeout(function(){this.resetPosition();this.setUIWebViewResetPositionTimeout()}.bind(this),this.settings.uiWebViewResetPositionDelay)},clearUIWebViewResetPositionTimeout:function(){a.isNothing(this._uiWebViewResetPositionTimeout)||e.clearTimeout(this._uiWebViewResetPositionTimeout)},onWindowScroll:function(){this.resetPosition()},onWindowOrientationChange:function(){this.resetPosition()},onWindowHashChange:function(){if(e.location.hash!=="#"+(this.settings.jQueryMobile?this.settings.jQueryMobileDialogHash:
+this.currentHistoryHashValue))this.backButtonClicked=!0,this.hide()},onKeyDown:function(a){a.keyCode===37?(a.preventDefault(),this.previous()):a.keyCode===39?(a.preventDefault(),this.next()):a.keyCode===38||a.keyCode===40?a.preventDefault():a.keyCode===27?(a.preventDefault(),this.hide()):a.keyCode===32?(this.settings.hideToolbar?this.hide():this.toggleToolbar(),a.preventDefault()):a.keyCode===13&&(a.preventDefault(),this.play())},onUILayerTouch:function(b){if(this.isZoomActive())switch(b.action){case a.TouchElement.ActionTypes.gestureChange:this.zoomPanRotate.zoomRotate(b.scale,
+this.settings.allowRotationOnUserZoom?b.rotation:0);break;case a.TouchElement.ActionTypes.gestureEnd:this.zoomPanRotate.setStartingScaleAndRotation(b.scale,this.settings.allowRotationOnUserZoom?b.rotation:0);break;case a.TouchElement.ActionTypes.touchStart:this.zoomPanRotate.panStart(b.point);break;case a.TouchElement.ActionTypes.touchMove:this.zoomPanRotate.pan(b.point);break;case a.TouchElement.ActionTypes.doubleTap:this.destroyZoomPanRotate();this.toggleToolbar();break;case a.TouchElement.ActionTypes.swipeLeft:this.destroyZoomPanRotate();
+this.next();this.toggleToolbar();break;case a.TouchElement.ActionTypes.swipeRight:this.destroyZoomPanRotate(),this.previous(),this.toggleToolbar()}else switch(b.action){case a.TouchElement.ActionTypes.touchMove:case a.TouchElement.ActionTypes.swipeLeft:case a.TouchElement.ActionTypes.swipeRight:this.fadeOutToolbarIfVisible();this.carousel.onTouch(b.action,b.point);break;case a.TouchElement.ActionTypes.touchStart:case a.TouchElement.ActionTypes.touchMoveEnd:this.carousel.onTouch(b.action,b.point);
+break;case a.TouchElement.ActionTypes.tap:this.toggleToolbar();break;case a.TouchElement.ActionTypes.doubleTap:this.settings.target===e&&(b.point.x-=a.DOM.windowScrollLeft(),b.point.y-=a.DOM.windowScrollTop());var c=this.cache.images[this.currentIndex].imageEl,d=e.parseInt(a.DOM.getStyle(c,"top"),10),f=e.parseInt(a.DOM.getStyle(c,"left"),10),g=f+a.DOM.width(c),c=d+a.DOM.height(c);if(b.point.x<f)b.point.x=f;else if(b.point.x>g)b.point.x=g;if(b.point.y<d)b.point.y=d;else if(b.point.y>c)b.point.y=c;
+this.createZoomPanRotate();this.isZoomActive()&&this.zoomPanRotate.zoomAndPanToPoint(this.settings.doubleTapZoomLevel,b.point);break;case a.TouchElement.ActionTypes.gestureStart:this.createZoomPanRotate()}a.Events.fire(this,{type:h.EventTypes.onTouch,target:this,point:b.point,action:b.action})},onCarouselSlideByEnd:function(b){this.currentIndex=b.cacheIndex;a.isNothing(this.toolbar)||(this.toolbar.setCaption(this.currentIndex),this.toolbar.setToolbarStatus(this.currentIndex));a.Events.fire(this,{type:h.EventTypes.onDisplayImage,
+target:this,action:b.action,index:b.cacheIndex})},onToolbarTap:function(b){switch(b.action){case f.ToolbarAction.next:this.next();break;case f.ToolbarAction.previous:this.previous();break;case f.ToolbarAction.close:this.hide();break;case f.ToolbarAction.play:this.play()}a.Events.fire(this,{type:h.EventTypes.onToolbarTap,target:this,toolbarAction:b.action,tapTarget:b.tapTarget})},onMouseWheel:function(b){var c=a.Events.getWheelDelta(b);if(!(b.timeStamp-(this.mouseWheelStartTime||0)<this.settings.mouseWheelSpeed))this.mouseWheelStartTime=
+b.timeStamp,this.settings.invertMouseWheel&&(c*=-1),c<0?this.next():c>0&&this.previous()},onCarouselSlideshowStart:function(){a.Events.fire(this,{type:h.EventTypes.onSlideshowStart,target:this})},onCarouselSlideshowStop:function(){a.Events.fire(this,{type:h.EventTypes.onSlideshowStop,target:this})},onToolbarBeforeShow:function(){a.Events.fire(this,{type:h.EventTypes.onBeforeCaptionAndToolbarShow,target:this})},onToolbarShow:function(){a.Events.fire(this,{type:h.EventTypes.onCaptionAndToolbarShow,
+target:this})},onToolbarBeforeHide:function(){a.Events.fire(this,{type:h.EventTypes.onBeforeCaptionAndToolbarHide,target:this})},onToolbarHide:function(){a.Events.fire(this,{type:h.EventTypes.onCaptionAndToolbarHide,target:this})},onZoomPanRotateTransform:function(b){a.Events.fire(this,{target:this,type:h.EventTypes.onZoomPanRotateTransform,scale:b.scale,rotation:b.rotation,rotationDegs:b.rotationDegs,translateX:b.translateX,translateY:b.translateY})}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.Cache,
+window.Code.PhotoSwipe.DocumentOverlay,window.Code.PhotoSwipe.Carousel,window.Code.PhotoSwipe.Toolbar,window.Code.PhotoSwipe.UILayer,window.Code.PhotoSwipe.ZoomPanRotate);
Index: tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.min.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/code.photoswipe.min.js	(revision 14585)
@@ -0,0 +1,172 @@
+// PhotoSwipe - http://www.photoswipe.com/
+// Copyright (c) 2011 by Code Computerlove (http://www.codecomputerlove.com)
+// Licensed under the MIT license
+// version: 3.0.4
+(function(e){if(!Function.prototype.bind)Function.prototype.bind=function(c){var a=[].slice,b=a.call(arguments,1),d=this,f=function(){},g=function(){return d.apply(this instanceof f?this:c||{},b.concat(a.call(arguments)))};f.prototype=d.prototype;g.prototype=new f;return g};if(typeof e.Code==="undefined")e.Code={};e.Code.Util={registerNamespace:function(){var c=arguments,a=null,b,d,f,g,h;b=0;for(g=c.length;b<g;b++){f=c[b];f=f.split(".");a=f[0];typeof e[a]==="undefined"&&(e[a]={});a=e[a];d=1;for(h=
+f.length;d<h;++d)a[f[d]]=a[f[d]]||{},a=a[f[d]]}},coalesce:function(){var c,a;c=0;for(a=arguments.length;c<a;c++)if(!this.isNothing(arguments[c]))return arguments[c];return null},extend:function(c,a,b){var d;this.isNothing(b)&&(b=!0);if(c&&a&&this.isObject(a))for(d in a)this.objectHasProperty(a,d)&&(b?c[d]=a[d]:typeof c[d]==="undefined"&&(c[d]=a[d]))},clone:function(c){var a={};this.extend(a,c);return a},isObject:function(c){return c instanceof Object},isFunction:function(c){return{}.toString.call(c)===
+"[object Function]"},isArray:function(c){return c instanceof Array},isLikeArray:function(c){return typeof c.length==="number"},isNumber:function(c){return typeof c==="number"},isString:function(c){return typeof c==="string"},isNothing:function(c){if(typeof c==="undefined"||c===null)return!0;return!1},swapArrayElements:function(c,a,b){var d=c[a];c[a]=c[b];c[b]=d},trim:function(c){return c.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},toCamelCase:function(c){return c.replace(/(\-[a-z])/g,function(a){return a.toUpperCase().replace("-",
+"")})},toDashedCase:function(c){return c.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})},arrayIndexOf:function(c,a,b){var d,f,g,e;g=-1;d=0;for(f=a.length;d<f;d++)if(e=a[d],this.isNothing(b)){if(e===c){g=d;break}}else if(this.objectHasProperty(e,b)&&e[b]===c){g=d;break}return g},objectHasProperty:function(c,a){return c.hasOwnProperty?c.hasOwnProperty(a):"undefined"!==typeof c[a]}}})(window);
+(function(e,c){c.Browser={ua:null,version:null,safari:null,webkit:null,opera:null,msie:null,chrome:null,mozilla:null,android:null,blackberry:null,iPad:null,iPhone:null,iPod:null,iOS:null,is3dSupported:null,isCSSTransformSupported:null,isTouchSupported:null,isGestureSupported:null,_detect:function(){this.ua=e.navigator.userAgent;this.version=this.ua.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[];this.safari=/Safari/gi.test(e.navigator.appVersion);this.webkit=/webkit/i.test(this.ua);this.opera=/opera/i.test(this.ua);
+this.msie=/msie/i.test(this.ua)&&!this.opera;this.chrome=/Chrome/i.test(this.ua);this.firefox=/Firefox/i.test(this.ua);this.fennec=/Fennec/i.test(this.ua);this.mozilla=/mozilla/i.test(this.ua)&&!/(compatible|webkit)/.test(this.ua);this.android=/android/i.test(this.ua);this.blackberry=/blackberry/i.test(this.ua);this.iOS=/iphone|ipod|ipad/gi.test(e.navigator.platform);this.iPad=/ipad/gi.test(e.navigator.platform);this.iPhone=/iphone/gi.test(e.navigator.platform);this.iPod=/ipod/gi.test(e.navigator.platform);
+var a=document.createElement("div");this.is3dSupported=!c.isNothing(a.style.WebkitPerspective);this.isCSSTransformSupported=!c.isNothing(a.style.WebkitTransform)||!c.isNothing(a.style.MozTransform)||!c.isNothing(a.style.transformProperty);this.isTouchSupported=this.isEventSupported("touchstart");this.isGestureSupported=this.isEventSupported("gesturestart")},_eventTagNames:{select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"},isEventSupported:function(a){var b=
+document.createElement(this._eventTagNames[a]||"div"),d,a="on"+a;d=c.objectHasProperty(b,a);d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function");return d},isLandscape:function(){return c.DOM.windowWidth()>c.DOM.windowHeight()}};c.Browser._detect()})(window,window.Code.Util);
+(function(e,c){c.extend(c,{Events:{add:function(a,b,d){this._checkHandlersProperty(a);b==="mousewheel"&&(b=this._normaliseMouseWheelType());typeof a.__eventHandlers[b]==="undefined"&&(a.__eventHandlers[b]=[]);a.__eventHandlers[b].push(d);this._isBrowserObject(a)&&a.addEventListener(b,d,!1)},remove:function(a,b,d){this._checkHandlersProperty(a);b==="mousewheel"&&(b=this._normaliseMouseWheelType());if(a.__eventHandlers[b]instanceof Array){var f,g,e=a.__eventHandlers[b];if(c.isNothing(d)){if(this._isBrowserObject(a)){f=
+0;for(g=e.length;f<g;f++)a.removeEventListener(b,e[f],!1)}a.__eventHandlers[b]=[]}else{f=0;for(g=e.length;f<g;f++)if(e[f]===d){e.splice(f,1);break}this._isBrowserObject(a)&&a.removeEventListener(b,d,!1)}}},fire:function(a,b){var d,f,g,h,j=Array.prototype.slice.call(arguments).splice(2);b==="mousewheel"&&(b=this._normaliseMouseWheelType());if(this._isBrowserObject(a)){if(typeof b!=="string")throw"type must be a string for DOM elements";g=this._NATIVE_EVENTS[b];d=document.createEvent(g?"HTMLEvents":
+"UIEvents");d[g?"initEvent":"initUIEvent"](b,!0,!0,e,1);if(j.length<1){a.dispatchEvent(d);return}}this._checkHandlersProperty(a);d=typeof b==="string"?{type:b}:b;if(!d.target)d.target=a;if(!d.type)throw Error("Event object missing 'type' property.");if(a.__eventHandlers[d.type]instanceof Array){g=a.__eventHandlers[d.type];j.unshift(d);d=0;for(f=g.length;d<f;d++)h=g[d],c.isNothing(h)||h.apply(a,j)}},getMousePosition:function(a){var b={x:0,y:0};if(a.pageX)b.x=a.pageX;else if(a.clientX)b.x=a.clientX+
+(document.documentElement.scrollLeft||document.body.scrollLeft);if(a.pageY)b.y=a.pageY;else if(a.clientY)b.y=a.clientY+(document.documentElement.scrollTop||document.body.scrollTop);return b},getTouchEvent:function(a){return a},getWheelDelta:function(a){var b=0;c.isNothing(a.wheelDelta)?c.isNothing(a.detail)||(b=-a.detail/3):b=a.wheelDelta/120;return b},domReady:function(a){document.addEventListener("DOMContentLoaded",a,!1)},_checkHandlersProperty:function(a){c.isNothing(a.__eventHandlers)&&c.extend(a,
+{__eventHandlers:{}})},_isBrowserObject:function(a){if(a===e||a===e.document)return!0;return this._isElement(a)||this._isNode(a)},_isElement:function(a){return typeof e.HTMLElement==="object"?a instanceof e.HTMLElement:typeof a==="object"&&a.nodeType===1&&typeof a.nodeName==="string"},_isNode:function(a){return typeof e.Node==="object"?a instanceof e.Node:typeof a==="object"&&typeof a.nodeType==="number"&&typeof a.nodeName==="string"},_normaliseMouseWheelType:function(){if(c.Browser.isEventSupported("mousewheel"))return"mousewheel";
+return"DOMMouseScroll"},_NATIVE_EVENTS:{click:1,dblclick:1,mouseup:1,mousedown:1,contextmenu:1,mousewheel:1,DOMMouseScroll:1,mouseover:1,mouseout:1,mousemove:1,selectstart:1,selectend:1,keydown:1,keypress:1,keyup:1,orientationchange:1,touchstart:1,touchmove:1,touchend:1,touchcancel:1,gesturestart:1,gesturechange:1,gestureend:1,focus:1,blur:1,change:1,reset:1,select:1,submit:1,load:1,unload:1,beforeunload:1,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}}})})(window,
+window.Code.Util);
+(function(e,c){c.extend(c,{DOM:{setData:function(a,b,d){if(c.isLikeArray(a)){var f,g;f=0;for(g=a.length;f<g;f++)c.DOM._setData(a[f],b,d)}else c.DOM._setData(a,b,d)},_setData:function(a,b,d){c.DOM.setAttribute(a,"data-"+b,d)},getData:function(a,b,d){return c.DOM.getAttribute(a,"data-"+b,d)},removeData:function(a,b){if(c.isLikeArray(a)){var d,f;d=0;for(f=a.length;d<f;d++)c.DOM._removeData(a[d],b)}else c.DOM._removeData(a,b)},_removeData:function(a,b){c.DOM.removeAttribute(a,"data-"+b)},isChildOf:function(a,
+b){if(b===a)return!1;for(;a&&a!==b;)a=a.parentNode;return a===b},find:function(a,b){if(c.isNothing(b))b=e.document;var d=b.querySelectorAll(a),f=[],g,h;g=0;for(h=d.length;g<h;g++)f.push(d[g]);return f},createElement:function(a,b,d){var f,a=document.createElement(a);for(f in b)c.objectHasProperty(b,f)&&a.setAttribute(f,b[f]);a.innerHTML=d||"";return a},appendChild:function(a,b){b.appendChild(a)},insertBefore:function(a,b,d){d.insertBefore(a,b)},appendText:function(a,b){c.DOM.appendChild(document.createTextNode(a),
+b)},appendToBody:function(a){this.appendChild(a,document.body)},removeChild:function(a,b){b.removeChild(a)},removeChildren:function(a){if(a.hasChildNodes())for(;a.childNodes.length>=1;)a.removeChild(a.childNodes[a.childNodes.length-1])},hasAttribute:function(a,b){return!c.isNothing(a.getAttribute(b))},getAttribute:function(a,b,d){a=a.getAttribute(b);c.isNothing(a)&&!c.isNothing(d)&&(a=d);return a},setAttribute:function(a,b,d){if(c.isLikeArray(a)){var f,g;f=0;for(g=a.length;f<g;f++)c.DOM._setAttribute(a[f],
+b,d)}else c.DOM._setAttribute(a,b,d)},_setAttribute:function(a,b,d){a.setAttribute(b,d)},removeAttribute:function(a,b){if(c.isLikeArray(a)){var d,f;d=0;for(f=a.length;d<f;d++)c.DOM._removeAttribute(a[d],b)}else c.DOM._removeAttribute(a,b)},_removeAttribute:function(a,b){this.hasAttribute(a,b)&&a.removeAttribute(b)},addClass:function(a,b){if(c.isLikeArray(a)){var d,f;d=0;for(f=a.length;d<f;d++)c.DOM._addClass(a[d],b)}else c.DOM._addClass(a,b)},_addClass:function(a,b){var d=c.DOM.getAttribute(a,"class",
+"");RegExp("(?:^|\\s+)"+b+"(?:\\s+|$)").test(d)||(d!==""&&(d+=" "),d+=b,c.DOM.setAttribute(a,"class",d))},removeClass:function(a,b){if(c.isLikeArray(a)){var d,f;d=0;for(f=a.length;d<f;d++)c.DOM._removeClass(a[d],b)}else c.DOM._removeClass(a,b)},_removeClass:function(a,b){var d=c.DOM.getAttribute(a,"class",""),d=c.trim(d).split(" "),f="",g,e;g=0;for(e=d.length;g<e;g++)d[g]!==b&&(f!==""&&(f+=" "),f+=d[g]);f===""?c.DOM.removeAttribute(a,"class"):c.DOM.setAttribute(a,"class",f)},hasClass:function(a,b){return RegExp("(?:^|\\s+)"+
+b+"(?:\\s+|$)").test(c.DOM.getAttribute(a,"class",""))},setStyle:function(a,b,d){if(c.isLikeArray(a)){var f,g;f=0;for(g=a.length;f<g;f++)c.DOM._setStyle(a[f],b,d)}else c.DOM._setStyle(a,b,d)},_setStyle:function(a,b,d){var f;if(c.isObject(b))for(f in b)c.objectHasProperty(b,f)&&(f==="width"?c.DOM.width(a,b[f]):f==="height"?c.DOM.height(a,b[f]):a.style[f]=b[f]);else a.style[b]=d},getStyle:function(a,b){var d=e.getComputedStyle(a,"").getPropertyValue(b);d===""&&(d=a.style[b]);return d},hide:function(a){if(c.isLikeArray(a)){var b,
+d;b=0;for(d=a.length;b<d;b++)c.DOM._hide(a[b])}else c.DOM._hide(a)},_hide:function(a){c.DOM.setData(a,"ccl-disp",c.DOM.getStyle(a,"display"));c.DOM.setStyle(a,"display","none")},show:function(a){if(c.isLikeArray(a)){var b,d;b=0;for(d=a.length;b<d;b++)c.DOM._show(a[b])}else c.DOM._show(a)},_show:function(a){if(c.DOM.getStyle(a,"display")==="none"){var b=c.DOM.getData(a,"ccl-disp","block");if(b==="none"||b==="")b="block";c.DOM.setStyle(a,"display",b)}},width:function(a,b){if(!c.isNothing(b))c.isNumber(b)&&
+(b+="px"),a.style.width=b;return this._getDimension(a,"width")},outerWidth:function(a){var b=c.DOM.width(a);b+=parseInt(c.DOM.getStyle(a,"padding-left"),10)+parseInt(c.DOM.getStyle(a,"padding-right"),10);b+=parseInt(c.DOM.getStyle(a,"margin-left"),10)+parseInt(c.DOM.getStyle(a,"margin-right"),10);b+=parseInt(c.DOM.getStyle(a,"border-left-width"),10)+parseInt(c.DOM.getStyle(a,"border-right-width"),10);return b},height:function(a,b){if(!c.isNothing(b))c.isNumber(b)&&(b+="px"),a.style.height=b;return this._getDimension(a,
+"height")},_getDimension:function(a,b){var d=e.parseInt(e.getComputedStyle(a,"").getPropertyValue(b)),f;if(isNaN(d))f={display:a.style.display,left:a.style.left},a.style.display="block",a.style.left="-1000000px",d=e.parseInt(e.getComputedStyle(a,"").getPropertyValue(b)),a.style.display=f.display,a.style.left=f.left;return d},outerHeight:function(a){var b=c.DOM.height(a);b+=parseInt(c.DOM.getStyle(a,"padding-top"),10)+parseInt(c.DOM.getStyle(a,"padding-bottom"),10);b+=parseInt(c.DOM.getStyle(a,"margin-top"),
+10)+parseInt(c.DOM.getStyle(a,"margin-bottom"),10);b+=parseInt(c.DOM.getStyle(a,"border-top-width"),10)+parseInt(c.DOM.getStyle(a,"border-bottom-width"),10);return b},documentWidth:function(){return c.DOM.width(document.documentElement)},documentHeight:function(){return c.DOM.height(document.documentElement)},documentOuterWidth:function(){return c.DOM.width(document.documentElement)},documentOuterHeight:function(){return c.DOM.outerHeight(document.documentElement)},bodyWidth:function(){return c.DOM.width(document.body)},
+bodyHeight:function(){return c.DOM.height(document.body)},bodyOuterWidth:function(){return c.DOM.outerWidth(document.body)},bodyOuterHeight:function(){return c.DOM.outerHeight(document.body)},windowWidth:function(){return e.innerWidth},windowHeight:function(){return e.innerHeight},windowScrollLeft:function(){return e.pageXOffset},windowScrollTop:function(){return e.pageYOffset}}})})(window,window.Code.Util);
+(function(e,c){c.extend(c,{Animation:{_applyTransitionDelay:50,_transitionEndLabel:e.document.documentElement.style.webkitTransition!==void 0?"webkitTransitionEnd":"transitionend",_transitionEndHandler:null,_transitionPrefix:e.document.documentElement.style.webkitTransition!==void 0?"webkitTransition":e.document.documentElement.style.MozTransition!==void 0?"MozTransition":"transition",_transformLabel:e.document.documentElement.style.webkitTransform!==void 0?"webkitTransform":e.document.documentElement.style.MozTransition!==
+void 0?"MozTransform":"transform",_getTransitionEndHandler:function(){if(c.isNothing(this._transitionEndHandler))this._transitionEndHandler=this._onTransitionEnd.bind(this);return this._transitionEndHandler},stop:function(a){if(c.Browser.isCSSTransformSupported){var b={};c.Events.remove(a,this._transitionEndLabel,this._getTransitionEndHandler());c.isNothing(a.callbackLabel)&&delete a.callbackLabel;b[this._transitionPrefix+"Property"]="";b[this._transitionPrefix+"Duration"]="";b[this._transitionPrefix+
+"TimingFunction"]="";b[this._transitionPrefix+"Delay"]="";b[this._transformLabel]="";c.DOM.setStyle(a,b)}else c.isNothing(e.jQuery)||e.jQuery(a).stop(!0,!0)},fadeIn:function(a,b,d,f,g){g=c.coalesce(g,1);g<=0&&(g=1);if(b<=0&&(c.DOM.setStyle(a,"opacity",g),!c.isNothing(d))){d(a);return}c.DOM.getStyle(a,"opacity")>=1&&c.DOM.setStyle(a,"opacity",0);c.Browser.isCSSTransformSupported?this._applyTransition(a,"opacity",g,b,d,f):c.isNothing(e.jQuery)||e.jQuery(a).fadeTo(b,g,d)},fadeTo:function(a,b,d,f,c){this.fadeIn(a,
+d,f,c,b)},fadeOut:function(a,b,d,f){if(b<=0&&(c.DOM.setStyle(a,"opacity",0),!c.isNothing(d))){d(a);return}c.Browser.isCSSTransformSupported?this._applyTransition(a,"opacity",0,b,d,f):e.jQuery(a).fadeTo(b,0,d)},slideBy:function(a,b,d,f,g,h){var j={},b=c.coalesce(b,0),d=c.coalesce(d,0),h=c.coalesce(h,"ease-out");j[this._transitionPrefix+"Property"]="all";j[this._transitionPrefix+"Delay"]="0";f===0?(j[this._transitionPrefix+"Duration"]="",j[this._transitionPrefix+"TimingFunction"]=""):(j[this._transitionPrefix+
+"Duration"]=f+"ms",j[this._transitionPrefix+"TimingFunction"]=c.coalesce(h,"ease-out"),c.Events.add(a,this._transitionEndLabel,this._getTransitionEndHandler()));j[this._transformLabel]=c.Browser.is3dSupported?"translate3d("+b+"px, "+d+"px, 0px)":"translate("+b+"px, "+d+"px)";if(!c.isNothing(g))a.cclallcallback=g;c.DOM.setStyle(a,j);f===0&&e.setTimeout(function(){this._leaveTransforms(a)}.bind(this),this._applyTransitionDelay)},resetTranslate:function(a){var b={};b[this._transformLabel]=b[this._transformLabel]=
+c.Browser.is3dSupported?"translate3d(0px, 0px, 0px)":"translate(0px, 0px)";c.DOM.setStyle(a,b)},_applyTransition:function(a,b,d,f,g,h){var j={},h=c.coalesce(h,"ease-in");j[this._transitionPrefix+"Property"]=b;j[this._transitionPrefix+"Duration"]=f+"ms";j[this._transitionPrefix+"TimingFunction"]=h;j[this._transitionPrefix+"Delay"]="0";c.Events.add(a,this._transitionEndLabel,this._getTransitionEndHandler());c.DOM.setStyle(a,j);c.isNothing(g)||(a["ccl"+b+"callback"]=g);e.setTimeout(function(){c.DOM.setStyle(a,
+b,d)},this._applyTransitionDelay)},_onTransitionEnd:function(a){c.Events.remove(a.currentTarget,this._transitionEndLabel,this._getTransitionEndHandler());this._leaveTransforms(a.currentTarget)},_leaveTransforms:function(a){var b=a.style[this._transitionPrefix+"Property"],d=b!==""?"ccl"+b+"callback":"cclallcallback",f,b=c.coalesce(a.style.webkitTransform,a.style.MozTransform,a.style.transform),g,h=e.parseInt(c.DOM.getStyle(a,"left"),0),j=e.parseInt(c.DOM.getStyle(a,"top"),0),i,l,k={};b!==""&&(b=c.Browser.is3dSupported?
+b.match(/translate3d\((.*?)\)/):b.match(/translate\((.*?)\)/),c.isNothing(b)||(g=b[1].split(", "),i=e.parseInt(g[0],0),l=e.parseInt(g[1],0)));k[this._transitionPrefix+"Property"]="";k[this._transitionPrefix+"Duration"]="";k[this._transitionPrefix+"TimingFunction"]="";k[this._transitionPrefix+"Delay"]="";c.DOM.setStyle(a,k);e.setTimeout(function(){if(!c.isNothing(g))k={},k[this._transformLabel]="",k.left=h+i+"px",k.top=j+l+"px",c.DOM.setStyle(a,k);c.isNothing(a[d])||(f=a[d],delete a[d],f(a))}.bind(this),
+this._applyTransitionDelay)}}})})(window,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.Util.TouchElement");a.TouchElement.EventTypes={onTouch:"CodeUtilTouchElementOnTouch"};a.TouchElement.ActionTypes={touchStart:"touchStart",touchMove:"touchMove",touchEnd:"touchEnd",touchMoveEnd:"touchMoveEnd",tap:"tap",doubleTap:"doubleTap",swipeLeft:"swipeLeft",swipeRight:"swipeRight",swipeUp:"swipeUp",swipeDown:"swipeDown",gestureStart:"gestureStart",gestureChange:"gestureChange",gestureEnd:"gestureEnd"}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.Util.TouchElement");a.TouchElement.TouchElementClass=c({el:null,captureSettings:null,touchStartPoint:null,touchEndPoint:null,touchStartTime:null,doubleTapTimeout:null,touchStartHandler:null,touchMoveHandler:null,touchEndHandler:null,mouseDownHandler:null,mouseMoveHandler:null,mouseUpHandler:null,mouseOutHandler:null,gestureStartHandler:null,gestureChangeHandler:null,gestureEndHandler:null,swipeThreshold:null,swipeTimeThreshold:null,doubleTapSpeed:null,dispose:function(){var b;
+this.removeEventHandlers();for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(b,d){this.el=b;this.captureSettings={swipe:!1,move:!1,gesture:!1,doubleTap:!1,preventDefaultTouchEvents:!0};a.extend(this.captureSettings,d);this.swipeThreshold=50;this.doubleTapSpeed=this.swipeTimeThreshold=250;this.touchStartPoint={x:0,y:0};this.touchEndPoint={x:0,y:0}},addEventHandlers:function(){if(a.isNothing(this.touchStartHandler))this.touchStartHandler=this.onTouchStart.bind(this),this.touchMoveHandler=
+this.onTouchMove.bind(this),this.touchEndHandler=this.onTouchEnd.bind(this),this.mouseDownHandler=this.onMouseDown.bind(this),this.mouseMoveHandler=this.onMouseMove.bind(this),this.mouseUpHandler=this.onMouseUp.bind(this),this.mouseOutHandler=this.onMouseOut.bind(this),this.gestureStartHandler=this.onGestureStart.bind(this),this.gestureChangeHandler=this.onGestureChange.bind(this),this.gestureEndHandler=this.onGestureEnd.bind(this);a.Events.add(this.el,"touchstart",this.touchStartHandler);this.captureSettings.move&&
+a.Events.add(this.el,"touchmove",this.touchMoveHandler);a.Events.add(this.el,"touchend",this.touchEndHandler);a.Events.add(this.el,"mousedown",this.mouseDownHandler);a.Browser.isGestureSupported&&this.captureSettings.gesture&&(a.Events.add(this.el,"gesturestart",this.gestureStartHandler),a.Events.add(this.el,"gesturechange",this.gestureChangeHandler),a.Events.add(this.el,"gestureend",this.gestureEndHandler))},removeEventHandlers:function(){a.Events.remove(this.el,"touchstart",this.touchStartHandler);
+this.captureSettings.move&&a.Events.remove(this.el,"touchmove",this.touchMoveHandler);a.Events.remove(this.el,"touchend",this.touchEndHandler);a.Events.remove(this.el,"mousedown",this.mouseDownHandler);a.Browser.isGestureSupported&&this.captureSettings.gesture&&(a.Events.remove(this.el,"gesturestart",this.gestureStartHandler),a.Events.remove(this.el,"gesturechange",this.gestureChangeHandler),a.Events.remove(this.el,"gestureend",this.gestureEndHandler))},getTouchPoint:function(a){return{x:a[0].pageX,
+y:a[0].pageY}},fireTouchEvent:function(b){var d=0,f=0,c=0,h,d=this.touchEndPoint.x-this.touchStartPoint.x,f=this.touchEndPoint.y-this.touchStartPoint.y,c=Math.sqrt(d*d+f*f);if(this.captureSettings.swipe&&(h=new Date,h-=this.touchStartTime,h<=this.swipeTimeThreshold)){if(e.Math.abs(d)>=this.swipeThreshold){a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:d<0?a.TouchElement.ActionTypes.swipeLeft:a.TouchElement.ActionTypes.swipeRight,targetEl:b.target,
+currentTargetEl:b.currentTarget});return}if(e.Math.abs(f)>=this.swipeThreshold){a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:f<0?a.TouchElement.ActionTypes.swipeUp:a.TouchElement.ActionTypes.swipeDown,targetEl:b.target,currentTargetEl:b.currentTarget});return}}c>1?a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMoveEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget}):
+this.captureSettings.doubleTap?a.isNothing(this.doubleTapTimeout)?this.doubleTapTimeout=e.setTimeout(function(){this.doubleTapTimeout=null;a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:a.TouchElement.ActionTypes.tap,targetEl:b.target,currentTargetEl:b.currentTarget})}.bind(this),this.doubleTapSpeed):(e.clearTimeout(this.doubleTapTimeout),this.doubleTapTimeout=null,a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,
+action:a.TouchElement.ActionTypes.doubleTap,targetEl:b.target,currentTargetEl:b.currentTarget})):a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,point:this.touchEndPoint,action:a.TouchElement.ActionTypes.tap,targetEl:b.target,currentTargetEl:b.currentTarget})},onTouchStart:function(b){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();a.Events.remove(this.el,"mousedown",this.mouseDownHandler);var d=a.Events.getTouchEvent(b).touches;d.length>1&&this.captureSettings.gesture?
+this.isGesture=!0:(this.touchStartTime=new Date,this.isGesture=!1,this.touchStartPoint=this.getTouchPoint(d),a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchStart,point:this.touchStartPoint,targetEl:b.target,currentTargetEl:b.currentTarget}))},onTouchMove:function(b){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();if(!this.isGesture||!this.captureSettings.gesture){var d=a.Events.getTouchEvent(b).touches;a.Events.fire(this,
+{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMove,point:this.getTouchPoint(d),targetEl:b.target,currentTargetEl:b.currentTarget})}},onTouchEnd:function(b){if(!this.isGesture||!this.captureSettings.gesture){this.captureSettings.preventDefaultTouchEvents&&b.preventDefault();var d=a.Events.getTouchEvent(b);this.touchEndPoint=this.getTouchPoint(!a.isNothing(d.changedTouches)?d.changedTouches:d.touches);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,
+target:this,action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget});this.fireTouchEvent(b)}},onMouseDown:function(b){b.preventDefault();a.Events.remove(this.el,"touchstart",this.mouseDownHandler);a.Events.remove(this.el,"touchmove",this.touchMoveHandler);a.Events.remove(this.el,"touchend",this.touchEndHandler);this.captureSettings.move&&a.Events.add(this.el,"mousemove",this.mouseMoveHandler);a.Events.add(this.el,"mouseup",this.mouseUpHandler);
+a.Events.add(this.el,"mouseout",this.mouseOutHandler);this.touchStartTime=new Date;this.isGesture=!1;this.touchStartPoint=a.Events.getMousePosition(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchStart,point:this.touchStartPoint,targetEl:b.target,currentTargetEl:b.currentTarget})},onMouseMove:function(b){b.preventDefault();a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchMove,
+point:a.Events.getMousePosition(b),targetEl:b.target,currentTargetEl:b.currentTarget})},onMouseUp:function(b){b.preventDefault();this.captureSettings.move&&a.Events.remove(this.el,"mousemove",this.mouseMoveHandler);a.Events.remove(this.el,"mouseup",this.mouseUpHandler);a.Events.remove(this.el,"mouseout",this.mouseOutHandler);this.touchEndPoint=a.Events.getMousePosition(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,
+targetEl:b.target,currentTargetEl:b.currentTarget});this.fireTouchEvent(b)},onMouseOut:function(b){var d=b.relatedTarget;if(!(this.el===d||a.DOM.isChildOf(d,this.el)))b.preventDefault(),this.captureSettings.move&&a.Events.remove(this.el,"mousemove",this.mouseMoveHandler),a.Events.remove(this.el,"mouseup",this.mouseUpHandler),a.Events.remove(this.el,"mouseout",this.mouseOutHandler),this.touchEndPoint=a.Events.getMousePosition(b),a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,
+action:a.TouchElement.ActionTypes.touchEnd,point:this.touchEndPoint,targetEl:b.target,currentTargetEl:b.currentTarget}),this.fireTouchEvent(b)},onGestureStart:function(b){b.preventDefault();var d=a.Events.getTouchEvent(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureStart,scale:d.scale,rotation:d.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})},onGestureChange:function(b){b.preventDefault();var d=a.Events.getTouchEvent(b);
+a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureChange,scale:d.scale,rotation:d.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})},onGestureEnd:function(b){b.preventDefault();var d=a.Events.getTouchEvent(b);a.Events.fire(this,{type:a.TouchElement.EventTypes.onTouch,target:this,action:a.TouchElement.ActionTypes.gestureEnd,scale:d.scale,rotation:d.rotation,targetEl:b.target,currentTargetEl:b.currentTarget})}})})(window,window.klass,
+window.Code.Util);(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Image");e.Code.PhotoSwipe.Image.EventTypes={onLoad:"onLoad",onError:"onError"}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Image");var b=e.Code.PhotoSwipe;b.Image.ImageClass=c({refObj:null,imageEl:null,src:null,caption:null,metaData:null,imageLoadHandler:null,imageErrorHandler:null,dispose:function(){var d;this.shrinkImage();for(d in this)a.objectHasProperty(this,d)&&(this[d]=null)},initialize:function(a,b,c,h){this.refObj=a;this.src=this.originalSrc=b;this.caption=c;this.metaData=h;this.imageEl=new e.Image;this.imageLoadHandler=this.onImageLoad.bind(this);this.imageErrorHandler=
+this.onImageError.bind(this)},load:function(){this.imageEl.originalSrc=a.coalesce(this.imageEl.originalSrc,"");this.imageEl.originalSrc===this.src?this.imageEl.isError?a.Events.fire(this,{type:b.Image.EventTypes.onError,target:this}):a.Events.fire(this,{type:b.Image.EventTypes.onLoad,target:this}):(this.imageEl.isError=!1,this.imageEl.isLoading=!0,this.imageEl.naturalWidth=null,this.imageEl.naturalHeight=null,this.imageEl.isLandscape=!1,this.imageEl.onload=this.imageLoadHandler,this.imageEl.onerror=
+this.imageErrorHandler,this.imageEl.onabort=this.imageErrorHandler,this.imageEl.originalSrc=this.src,this.imageEl.src=this.src)},shrinkImage:function(){if(!a.isNothing(this.imageEl)&&this.imageEl.src.indexOf(this.src)>-1)this.imageEl.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",a.isNothing(this.imageEl.parentNode)||a.DOM.removeChild(this.imageEl,this.imageEl.parentNode)},onImageLoad:function(){this.imageEl.onload=null;this.imageEl.naturalWidth=a.coalesce(this.imageEl.naturalWidth,
+this.imageEl.width);this.imageEl.naturalHeight=a.coalesce(this.imageEl.naturalHeight,this.imageEl.height);this.imageEl.isLandscape=this.imageEl.naturalWidth>this.imageEl.naturalHeight;this.imageEl.isLoading=!1;a.Events.fire(this,{type:b.Image.EventTypes.onLoad,target:this})},onImageError:function(){this.imageEl.onload=null;this.imageEl.onerror=null;this.imageEl.onabort=null;this.imageEl.isLoading=!1;this.imageEl.isError=!0;a.Events.fire(this,{type:b.Image.EventTypes.onError,target:this})}})})(window,
+window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Cache");e=e.Code.PhotoSwipe;e.Cache.Mode={normal:"normal",aggressive:"aggressive"};e.Cache.Functions={getImageSource:function(a){return a.href},getImageCaption:function(b){if(b.nodeName==="IMG")return a.DOM.getAttribute(b,"alt");var d,f,c;d=0;for(f=b.childNodes.length;d<f;d++)if(c=b.childNodes[d],b.childNodes[d].nodeName==="IMG")return a.DOM.getAttribute(c,"alt")},getImageMetaData:function(){return{}}}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Cache");var b=e.Code.PhotoSwipe;b.Cache.CacheClass=c({images:null,settings:null,dispose:function(){var b,f,c;if(!a.isNothing(this.images)){f=0;for(c=this.images.length;f<c;f++)this.images[f].dispose();this.images.length=0}for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(a,f){var c,e,j,i,l,k;this.settings=f;this.images=[];c=0;for(e=a.length;c<e;c++)j=a[c],i=this.settings.getImageSource(j),l=this.settings.getImageCaption(j),
+k=this.settings.getImageMetaData(j),this.images.push(new b.Image.ImageClass(j,i,l,k))},getImages:function(d){var f,c,e=[],j;f=0;for(c=d.length;f<c;f++){j=this.images[d[f]];if(this.settings.cacheMode===b.Cache.Mode.aggressive)j.cacheDoNotShrink=!0;e.push(j)}if(this.settings.cacheMode===b.Cache.Mode.aggressive){f=0;for(c=this.images.length;f<c;f++)j=this.images[f],a.objectHasProperty(j,"cacheDoNotShrink")?delete j.cacheDoNotShrink:j.shrinkImage()}return e}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.Image);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.DocumentOverlay");e.Code.PhotoSwipe.DocumentOverlay.CssClasses={documentOverlay:"ps-document-overlay"}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.DocumentOverlay");var b=e.Code.PhotoSwipe;b.DocumentOverlay.DocumentOverlayClass=c({el:null,settings:null,initialBodyHeight:null,dispose:function(){var b;a.Animation.stop(this.el);a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(d){this.settings=d;this.el=a.DOM.createElement("div",{"class":b.DocumentOverlay.CssClasses.documentOverlay},"");a.DOM.setStyle(this.el,{display:"block",
+position:"absolute",left:0,top:0,zIndex:this.settings.zIndex});a.DOM.hide(this.el);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target);a.Animation.resetTranslate(this.el);this.initialBodyHeight=a.DOM.bodyOuterHeight()},resetPosition:function(){var b,f,c;if(this.settings.target===e){b=a.DOM.windowWidth();f=a.DOM.bodyOuterHeight()*2;c=this.settings.jQueryMobile?a.DOM.windowScrollTop()+"px":"0px";if(f<1)f=this.initialBodyHeight;a.DOM.windowHeight()>f&&
+(f=a.DOM.windowHeight())}else b=a.DOM.width(this.settings.target),f=a.DOM.height(this.settings.target),c="0px";a.DOM.setStyle(this.el,{width:b,height:f,top:c})},fadeIn:function(b,f){this.resetPosition();a.DOM.setStyle(this.el,"opacity",0);a.DOM.show(this.el);a.Animation.fadeIn(this.el,b,f)}})})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Carousel");e=e.Code.PhotoSwipe;e.Carousel.EventTypes={onSlideByEnd:"PhotoSwipeCarouselOnSlideByEnd",onSlideshowStart:"PhotoSwipeCarouselOnSlideshowStart",onSlideshowStop:"PhotoSwipeCarouselOnSlideshowStop"};e.Carousel.CssClasses={carousel:"ps-carousel",content:"ps-carousel-content",item:"ps-carousel-item",itemLoading:"ps-carousel-item-loading",itemError:"ps-carousel-item-error"};e.Carousel.SlideByAction={previous:"previous",current:"current",next:"next"}})(window,
+window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Carousel");var b=e.Code.PhotoSwipe;b.Carousel.CarouselClass=c({el:null,contentEl:null,settings:null,cache:null,slideByEndHandler:null,currentCacheIndex:null,isSliding:null,isSlideshowActive:null,lastSlideByAction:null,touchStartPoint:null,touchStartPosition:null,imageLoadHandler:null,imageErrorHandler:null,slideshowTimeout:null,dispose:function(){var d,f,c;f=0;for(c=this.cache.images.length;f<c;f++)a.Events.remove(this.cache.images[f],b.Image.EventTypes.onLoad,
+this.imageLoadHandler),a.Events.remove(this.cache.images[f],b.Image.EventTypes.onError,this.imageErrorHandler);this.stopSlideshow();a.Animation.stop(this.el);a.DOM.removeChild(this.el,this.el.parentNode);for(d in this)a.objectHasProperty(this,d)&&(this[d]=null)},initialize:function(d,f){var c,h,j;this.cache=d;this.settings=f;this.slideByEndHandler=this.onSlideByEnd.bind(this);this.imageLoadHandler=this.onImageLoad.bind(this);this.imageErrorHandler=this.onImageError.bind(this);this.currentCacheIndex=
+0;this.isSlideshowActive=this.isSliding=!1;if(this.cache.images.length<3)this.settings.loop=!1;this.el=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.carousel},"");a.DOM.setStyle(this.el,{display:"block",position:"absolute",left:0,top:0,overflow:"hidden",zIndex:this.settings.zIndex});a.DOM.hide(this.el);this.contentEl=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.content},"");a.DOM.setStyle(this.contentEl,{display:"block",position:"absolute",left:0,top:0});a.DOM.appendChild(this.contentEl,
+this.el);h=d.images.length<3?d.images.length:3;for(c=0;c<h;c++)j=a.DOM.createElement("div",{"class":b.Carousel.CssClasses.item+" "+b.Carousel.CssClasses.item+"-"+c},""),a.DOM.setAttribute(j,"style","float: left;"),a.DOM.setStyle(j,{display:"block",position:"relative",left:0,top:0,overflow:"hidden"}),this.settings.margin>0&&a.DOM.setStyle(j,{marginRight:this.settings.margin+"px"}),a.DOM.appendChild(j,this.contentEl);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target)},
+resetPosition:function(){var d,f,c,h,j,i;this.settings.target===e?(d=a.DOM.windowWidth(),f=a.DOM.windowHeight(),c=a.DOM.windowScrollTop()+"px"):(d=a.DOM.width(this.settings.target),f=a.DOM.height(this.settings.target),c="0px");h=this.settings.margin>0?d+this.settings.margin:d;j=a.DOM.find("."+b.Carousel.CssClasses.item,this.contentEl);h*=j.length;a.DOM.setStyle(this.el,{top:c,width:d,height:f});a.DOM.setStyle(this.contentEl,{width:h,height:f});c=0;for(h=j.length;c<h;c++)i=j[c],a.DOM.setStyle(i,{width:d,
+height:f}),i=a.DOM.find("img",i)[0],a.isNothing(i)||this.resetImagePosition(i);this.setContentLeftPosition()},resetImagePosition:function(b){if(!a.isNothing(b)){a.DOM.getAttribute(b,"src");var c,e,h,j=a.DOM.width(this.el),i=a.DOM.height(this.el);this.settings.imageScaleMethod==="fitNoUpscale"?(e=b.naturalWidth,h=b.naturalHeight,e>j&&(c=j/e,e=Math.round(e*c),h=Math.round(h*c)),h>i&&(c=i/h,h=Math.round(h*c),e=Math.round(e*c))):(c=b.isLandscape?j/b.naturalWidth:i/b.naturalHeight,e=Math.round(b.naturalWidth*
+c),h=Math.round(b.naturalHeight*c),this.settings.imageScaleMethod==="zoom"?(c=1,h<i?c=i/h:e<j&&(c=j/e),c!==1&&(e=Math.round(e*c),h=Math.round(h*c))):this.settings.imageScaleMethod==="fit"&&(c=1,e>j?c=j/e:h>i&&(c=i/h),c!==1&&(e=Math.round(e*c),h=Math.round(h*c))));a.DOM.setStyle(b,{position:"absolute",width:e,height:h,top:Math.round((i-h)/2)+"px",left:Math.round((j-e)/2)+"px",display:"block"})}},setContentLeftPosition:function(){var b,c,g;b=this.settings.target===e?a.DOM.windowWidth():a.DOM.width(this.settings.target);
+c=this.getItemEls();g=0;this.settings.loop?g=(b+this.settings.margin)*-1:this.currentCacheIndex===this.cache.images.length-1?g=(c.length-1)*(b+this.settings.margin)*-1:this.currentCacheIndex>0&&(g=(b+this.settings.margin)*-1);a.DOM.setStyle(this.contentEl,{left:g+"px"})},show:function(d){this.currentCacheIndex=d;this.resetPosition();this.setImages(!1);a.DOM.show(this.el);a.Animation.resetTranslate(this.contentEl);var d=this.getItemEls(),c,e;c=0;for(e=d.length;c<e;c++)a.Animation.resetTranslate(d[c]);
+a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideByEnd,target:this,action:b.Carousel.SlideByAction.current,cacheIndex:this.currentCacheIndex})},setImages:function(a){var b,c=this.getItemEls();b=this.currentCacheIndex+1;var e=this.currentCacheIndex-1;this.settings.loop?(b>this.cache.images.length-1&&(b=0),e<0&&(e=this.cache.images.length-1),b=this.cache.getImages([e,this.currentCacheIndex,b]),a||this.addCacheImageToItemEl(b[1],c[1]),this.addCacheImageToItemEl(b[2],c[2]),this.addCacheImageToItemEl(b[0],
+c[0])):c.length===1?a||(b=this.cache.getImages([this.currentCacheIndex]),this.addCacheImageToItemEl(b[0],c[0])):c.length===2?this.currentCacheIndex===0?(b=this.cache.getImages([this.currentCacheIndex,this.currentCacheIndex+1]),a||this.addCacheImageToItemEl(b[0],c[0]),this.addCacheImageToItemEl(b[1],c[1])):(b=this.cache.getImages([this.currentCacheIndex-1,this.currentCacheIndex]),a||this.addCacheImageToItemEl(b[1],c[1]),this.addCacheImageToItemEl(b[0],c[0])):this.currentCacheIndex===0?(b=this.cache.getImages([this.currentCacheIndex,
+this.currentCacheIndex+1,this.currentCacheIndex+2]),a||this.addCacheImageToItemEl(b[0],c[0]),this.addCacheImageToItemEl(b[1],c[1]),this.addCacheImageToItemEl(b[2],c[2])):(this.currentCacheIndex===this.cache.images.length-1?(b=this.cache.getImages([this.currentCacheIndex-2,this.currentCacheIndex-1,this.currentCacheIndex]),a||this.addCacheImageToItemEl(b[2],c[2]),this.addCacheImageToItemEl(b[1],c[1])):(b=this.cache.getImages([this.currentCacheIndex-1,this.currentCacheIndex,this.currentCacheIndex+1]),
+a||this.addCacheImageToItemEl(b[1],c[1]),this.addCacheImageToItemEl(b[2],c[2])),this.addCacheImageToItemEl(b[0],c[0]))},addCacheImageToItemEl:function(d,c){a.DOM.removeClass(c,b.Carousel.CssClasses.itemError);a.DOM.addClass(c,b.Carousel.CssClasses.itemLoading);a.DOM.removeChildren(c);a.DOM.setStyle(d.imageEl,{display:"none"});a.DOM.appendChild(d.imageEl,c);a.Animation.resetTranslate(d.imageEl);a.Events.add(d,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.add(d,b.Image.EventTypes.onError,
+this.imageErrorHandler);d.load()},slideCarousel:function(d,c,g){if(!this.isSliding){var h,j;h=this.settings.target===e?a.DOM.windowWidth()+this.settings.margin:a.DOM.width(this.settings.target)+this.settings.margin;g=a.coalesce(g,this.settings.slideSpeed);if(!(e.Math.abs(j)<1)){switch(c){case a.TouchElement.ActionTypes.swipeLeft:d=h*-1;break;case a.TouchElement.ActionTypes.swipeRight:d=h;break;default:j=d.x-this.touchStartPoint.x,d=e.Math.abs(j)>h/2?j>0?h:h*-1:0}this.lastSlideByAction=d<0?b.Carousel.SlideByAction.next:
+d>0?b.Carousel.SlideByAction.previous:b.Carousel.SlideByAction.current;if(!this.settings.loop&&(this.lastSlideByAction===b.Carousel.SlideByAction.previous&&this.currentCacheIndex===0||this.lastSlideByAction===b.Carousel.SlideByAction.next&&this.currentCacheIndex===this.cache.images.length-1))d=0,this.lastSlideByAction=b.Carousel.SlideByAction.current;this.isSliding=!0;this.doSlideCarousel(d,g)}}},moveCarousel:function(a){this.isSliding||this.settings.enableDrag&&this.doMoveCarousel(a.x-this.touchStartPoint.x)},
+getItemEls:function(){return a.DOM.find("."+b.Carousel.CssClasses.item,this.contentEl)},previous:function(){this.stopSlideshow();this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeRight,this.settings.nextPreviousSlideSpeed)},next:function(){this.stopSlideshow();this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeLeft,this.settings.nextPreviousSlideSpeed)},slideshowNext:function(){this.slideCarousel({x:0,y:0},a.TouchElement.ActionTypes.swipeLeft)},startSlideshow:function(){this.stopSlideshow();
+this.isSlideshowActive=!0;this.slideshowTimeout=e.setTimeout(this.slideshowNext.bind(this),this.settings.slideshowDelay);a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideshowStart,target:this})},stopSlideshow:function(){if(!a.isNothing(this.slideshowTimeout))e.clearTimeout(this.slideshowTimeout),this.slideshowTimeout=null,this.isSlideshowActive=!1,a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideshowStop,target:this})},onSlideByEnd:function(){if(!a.isNothing(this.isSliding)){var d=this.getItemEls();
+this.isSliding=!1;this.lastSlideByAction===b.Carousel.SlideByAction.next?this.currentCacheIndex+=1:this.lastSlideByAction===b.Carousel.SlideByAction.previous&&(this.currentCacheIndex-=1);if(this.settings.loop)if(this.lastSlideByAction===b.Carousel.SlideByAction.next?a.DOM.appendChild(d[0],this.contentEl):this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(d[d.length-1],d[0],this.contentEl),this.currentCacheIndex<0)this.currentCacheIndex=this.cache.images.length-1;else{if(this.currentCacheIndex===
+this.cache.images.length)this.currentCacheIndex=0}else this.cache.images.length>3&&(this.currentCacheIndex>1&&this.currentCacheIndex<this.cache.images.length-2?this.lastSlideByAction===b.Carousel.SlideByAction.next?a.DOM.appendChild(d[0],this.contentEl):this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(d[d.length-1],d[0],this.contentEl):this.currentCacheIndex===1?this.lastSlideByAction===b.Carousel.SlideByAction.previous&&a.DOM.insertBefore(d[d.length-1],d[0],this.contentEl):
+this.currentCacheIndex===this.cache.images.length-2&&this.lastSlideByAction===b.Carousel.SlideByAction.next&&a.DOM.appendChild(d[0],this.contentEl));this.lastSlideByAction!==b.Carousel.SlideByAction.current&&(this.setContentLeftPosition(),this.setImages(!0));a.Events.fire(this,{type:b.Carousel.EventTypes.onSlideByEnd,target:this,action:this.lastSlideByAction,cacheIndex:this.currentCacheIndex});this.isSlideshowActive&&(this.lastSlideByAction!==b.Carousel.SlideByAction.current?this.startSlideshow():
+this.stopSlideshow())}},onTouch:function(b,c){this.stopSlideshow();switch(b){case a.TouchElement.ActionTypes.touchStart:this.touchStartPoint=c;this.touchStartPosition={x:e.parseInt(a.DOM.getStyle(this.contentEl,"left"),0),y:e.parseInt(a.DOM.getStyle(this.contentEl,"top"),0)};break;case a.TouchElement.ActionTypes.touchMove:this.moveCarousel(c);break;case a.TouchElement.ActionTypes.touchMoveEnd:case a.TouchElement.ActionTypes.swipeLeft:case a.TouchElement.ActionTypes.swipeRight:this.slideCarousel(c,
+b)}},onImageLoad:function(d){d=d.target;a.isNothing(d.imageEl.parentNode)||(a.DOM.removeClass(d.imageEl.parentNode,b.Carousel.CssClasses.itemLoading),this.resetImagePosition(d.imageEl));a.Events.remove(d,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.remove(d,b.Image.EventTypes.onError,this.imageErrorHandler)},onImageError:function(d){d=d.target;a.isNothing(d.imageEl.parentNode)||(a.DOM.removeClass(d.imageEl.parentNode,b.Carousel.CssClasses.itemLoading),a.DOM.addClass(d.imageEl.parentNode,
+b.Carousel.CssClasses.itemError));a.Events.remove(d,b.Image.EventTypes.onLoad,this.imageLoadHandler);a.Events.remove(d,b.Image.EventTypes.onError,this.imageErrorHandler)}})})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Carousel");c=e.Code.PhotoSwipe;c.Carousel.CarouselClass=c.Carousel.CarouselClass.extend({getStartingPos:function(){var b=this.touchStartPosition;a.isNothing(b)&&(b={x:e.parseInt(a.DOM.getStyle(this.contentEl,"left"),0),y:e.parseInt(a.DOM.getStyle(this.contentEl,"top"),0)});return b},doMoveCarousel:function(b){var d;a.Browser.isCSSTransformSupported?(d={},d[a.Animation._transitionPrefix+"Property"]="all",d[a.Animation._transitionPrefix+"Duration"]=
+"",d[a.Animation._transitionPrefix+"TimingFunction"]="",d[a.Animation._transitionPrefix+"Delay"]="0",d[a.Animation._transformLabel]=a.Browser.is3dSupported?"translate3d("+b+"px, 0px, 0px)":"translate("+b+"px, 0px)",a.DOM.setStyle(this.contentEl,d)):a.isNothing(e.jQuery)||e.jQuery(this.contentEl).stop().css("left",this.getStartingPos().x+b+"px")},doSlideCarousel:function(b,d){var c;if(d<=0)this.slideByEndHandler();else if(a.Browser.isCSSTransformSupported)c=a.coalesce(this.contentEl.style.webkitTransform,
+this.contentEl.style.MozTransform,this.contentEl.style.transform,""),c.indexOf("translate3d("+b)===0?this.slideByEndHandler():c.indexOf("translate("+b)===0?this.slideByEndHandler():a.Animation.slideBy(this.contentEl,b,0,d,this.slideByEndHandler,this.settings.slideTimingFunction);else if(!a.isNothing(e.jQuery)){c={left:this.getStartingPos().x+b+"px"};if(this.settings.animationTimingFunction==="ease-out")this.settings.animationTimingFunction="easeOutQuad";if(a.isNothing(e.jQuery.easing[this.settings.animationTimingFunction]))this.settings.animationTimingFunction=
+"linear";e.jQuery(this.contentEl).animate(c,this.settings.slideSpeed,this.settings.animationTimingFunction,this.slideByEndHandler)}}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.TouchElement);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Toolbar");var b=e.Code.PhotoSwipe;b.Toolbar.CssClasses={toolbar:"ps-toolbar",toolbarContent:"ps-toolbar-content",toolbarTop:"ps-toolbar-top",caption:"ps-caption",captionBottom:"ps-caption-bottom",captionContent:"ps-caption-content",close:"ps-toolbar-close",play:"ps-toolbar-play",previous:"ps-toolbar-previous",previousDisabled:"ps-toolbar-previous-disabled",next:"ps-toolbar-next",nextDisabled:"ps-toolbar-next-disabled"};b.Toolbar.ToolbarAction=
+{close:"close",play:"play",next:"next",previous:"previous",none:"none"};b.Toolbar.EventTypes={onTap:"PhotoSwipeToolbarOnClick",onBeforeShow:"PhotoSwipeToolbarOnBeforeShow",onShow:"PhotoSwipeToolbarOnShow",onBeforeHide:"PhotoSwipeToolbarOnBeforeHide",onHide:"PhotoSwipeToolbarOnHide"};b.Toolbar.getToolbar=function(){return'<div class="'+b.Toolbar.CssClasses.close+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div><div class="'+b.Toolbar.CssClasses.play+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+
+'"></div></div><div class="'+b.Toolbar.CssClasses.previous+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div><div class="'+b.Toolbar.CssClasses.next+'"><div class="'+b.Toolbar.CssClasses.toolbarContent+'"></div></div>'}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.Toolbar");var b=e.Code.PhotoSwipe;b.Toolbar.ToolbarClass=c({toolbarEl:null,closeEl:null,playEl:null,previousEl:null,nextEl:null,captionEl:null,captionContentEl:null,currentCaption:null,settings:null,cache:null,timeout:null,isVisible:null,fadeOutHandler:null,touchStartHandler:null,touchMoveHandler:null,clickHandler:null,dispose:function(){var b;this.clearTimeout();this.removeEventHandlers();a.Animation.stop(this.toolbarEl);a.Animation.stop(this.captionEl);
+a.DOM.removeChild(this.toolbarEl,this.toolbarEl.parentNode);a.DOM.removeChild(this.captionEl,this.captionEl.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(d,c){var g;this.settings=c;this.cache=d;this.isVisible=!1;this.fadeOutHandler=this.onFadeOut.bind(this);this.touchStartHandler=this.onTouchStart.bind(this);this.touchMoveHandler=this.onTouchMove.bind(this);this.clickHandler=this.onClick.bind(this);g=b.Toolbar.CssClasses.toolbar;this.settings.captionAndToolbarFlipPosition&&
+(g=g+" "+b.Toolbar.CssClasses.toolbarTop);this.toolbarEl=a.DOM.createElement("div",{"class":g},this.settings.getToolbar());a.DOM.setStyle(this.toolbarEl,{left:0,position:"absolute",overflow:"hidden",zIndex:this.settings.zIndex});this.settings.target===e?a.DOM.appendToBody(this.toolbarEl):a.DOM.appendChild(this.toolbarEl,this.settings.target);a.DOM.hide(this.toolbarEl);this.closeEl=a.DOM.find("."+b.Toolbar.CssClasses.close,this.toolbarEl)[0];this.settings.preventHide&&!a.isNothing(this.closeEl)&&a.DOM.hide(this.closeEl);
+this.playEl=a.DOM.find("."+b.Toolbar.CssClasses.play,this.toolbarEl)[0];this.settings.preventSlideshow&&!a.isNothing(this.playEl)&&a.DOM.hide(this.playEl);this.nextEl=a.DOM.find("."+b.Toolbar.CssClasses.next,this.toolbarEl)[0];this.previousEl=a.DOM.find("."+b.Toolbar.CssClasses.previous,this.toolbarEl)[0];g=b.Toolbar.CssClasses.caption;this.settings.captionAndToolbarFlipPosition&&(g=g+" "+b.Toolbar.CssClasses.captionBottom);this.captionEl=a.DOM.createElement("div",{"class":g},"");a.DOM.setStyle(this.captionEl,
+{left:0,position:"absolute",overflow:"hidden",zIndex:this.settings.zIndex});this.settings.target===e?a.DOM.appendToBody(this.captionEl):a.DOM.appendChild(this.captionEl,this.settings.target);a.DOM.hide(this.captionEl);this.captionContentEl=a.DOM.createElement("div",{"class":b.Toolbar.CssClasses.captionContent},"");a.DOM.appendChild(this.captionContentEl,this.captionEl);this.addEventHandlers()},resetPosition:function(){var b,c,g;this.settings.target===e?(this.settings.captionAndToolbarFlipPosition?
+(c=a.DOM.windowScrollTop(),g=a.DOM.windowScrollTop()+a.DOM.windowHeight()-a.DOM.height(this.captionEl)):(c=a.DOM.windowScrollTop()+a.DOM.windowHeight()-a.DOM.height(this.toolbarEl),g=a.DOM.windowScrollTop()),b=a.DOM.windowWidth()):(this.settings.captionAndToolbarFlipPosition?(c="0",g=a.DOM.height(this.settings.target)-a.DOM.height(this.captionEl)):(c=a.DOM.height(this.settings.target)-a.DOM.height(this.toolbarEl),g=0),b=a.DOM.width(this.settings.target));a.DOM.setStyle(this.toolbarEl,{top:c+"px",
+width:b});a.DOM.setStyle(this.captionEl,{top:g+"px",width:b})},toggleVisibility:function(a){this.isVisible?this.fadeOut():this.show(a)},show:function(d){a.Animation.stop(this.toolbarEl);a.Animation.stop(this.captionEl);this.resetPosition();this.setToolbarStatus(d);a.Events.fire(this,{type:b.Toolbar.EventTypes.onBeforeShow,target:this});this.showToolbar();this.setCaption(d);this.showCaption();this.isVisible=!0;this.setTimeout();a.Events.fire(this,{type:b.Toolbar.EventTypes.onShow,target:this})},setTimeout:function(){if(this.settings.captionAndToolbarAutoHideDelay>
+0)this.clearTimeout(),this.timeout=e.setTimeout(this.fadeOut.bind(this),this.settings.captionAndToolbarAutoHideDelay)},clearTimeout:function(){if(!a.isNothing(this.timeout))e.clearTimeout(this.timeout),this.timeout=null},fadeOut:function(){this.clearTimeout();a.Events.fire(this,{type:b.Toolbar.EventTypes.onBeforeHide,target:this});a.Animation.fadeOut(this.toolbarEl,this.settings.fadeOutSpeed);a.Animation.fadeOut(this.captionEl,this.settings.fadeOutSpeed,this.fadeOutHandler);this.isVisible=!1},addEventHandlers:function(){a.Browser.isTouchSupported&&
+(a.Browser.blackberry||a.Events.add(this.toolbarEl,"touchstart",this.touchStartHandler),a.Events.add(this.toolbarEl,"touchmove",this.touchMoveHandler),a.Events.add(this.captionEl,"touchmove",this.touchMoveHandler));a.Events.add(this.toolbarEl,"click",this.clickHandler)},removeEventHandlers:function(){a.Browser.isTouchSupported&&(a.Browser.blackberry||a.Events.remove(this.toolbarEl,"touchstart",this.touchStartHandler),a.Events.remove(this.toolbarEl,"touchmove",this.touchMoveHandler),a.Events.remove(this.captionEl,
+"touchmove",this.touchMoveHandler));a.Events.remove(this.toolbarEl,"click",this.clickHandler)},handleTap:function(d){this.clearTimeout();var c;if(d.target===this.nextEl||a.DOM.isChildOf(d.target,this.nextEl))c=b.Toolbar.ToolbarAction.next;else if(d.target===this.previousEl||a.DOM.isChildOf(d.target,this.previousEl))c=b.Toolbar.ToolbarAction.previous;else if(d.target===this.closeEl||a.DOM.isChildOf(d.target,this.closeEl))c=b.Toolbar.ToolbarAction.close;else if(d.target===this.playEl||a.DOM.isChildOf(d.target,
+this.playEl))c=b.Toolbar.ToolbarAction.play;this.setTimeout();if(a.isNothing(c))c=b.Toolbar.ToolbarAction.none;a.Events.fire(this,{type:b.Toolbar.EventTypes.onTap,target:this,action:c,tapTarget:d.target})},setCaption:function(b){a.DOM.removeChildren(this.captionContentEl);this.currentCaption=a.coalesce(this.cache.images[b].caption,"\u00a0");if(a.isObject(this.currentCaption))a.DOM.appendChild(this.currentCaption,this.captionContentEl);else{if(this.currentCaption==="")this.currentCaption="\u00a0";
+a.DOM.appendText(this.currentCaption,this.captionContentEl)}this.currentCaption=this.currentCaption==="\u00a0"?"":this.currentCaption;this.resetPosition()},showToolbar:function(){a.DOM.setStyle(this.toolbarEl,{opacity:this.settings.captionAndToolbarOpacity});a.DOM.show(this.toolbarEl)},showCaption:function(){(this.currentCaption===""||this.captionContentEl.childNodes.length<1)&&!this.settings.captionAndToolbarShowEmptyCaptions?a.DOM.hide(this.captionEl):(a.DOM.setStyle(this.captionEl,{opacity:this.settings.captionAndToolbarOpacity}),
+a.DOM.show(this.captionEl))},setToolbarStatus:function(d){this.settings.loop||(a.DOM.removeClass(this.previousEl,b.Toolbar.CssClasses.previousDisabled),a.DOM.removeClass(this.nextEl,b.Toolbar.CssClasses.nextDisabled),d>0&&d<this.cache.images.length-1||(d===0&&(a.isNothing(this.previousEl)||a.DOM.addClass(this.previousEl,b.Toolbar.CssClasses.previousDisabled)),d===this.cache.images.length-1&&(a.isNothing(this.nextEl)||a.DOM.addClass(this.nextEl,b.Toolbar.CssClasses.nextDisabled))))},onFadeOut:function(){a.DOM.hide(this.toolbarEl);
+a.DOM.hide(this.captionEl);a.Events.fire(this,{type:b.Toolbar.EventTypes.onHide,target:this})},onTouchStart:function(b){b.preventDefault();a.Events.remove(this.toolbarEl,"click",this.clickHandler);this.handleTap(b)},onTouchMove:function(a){a.preventDefault()},onClick:function(a){a.preventDefault();this.handleTap(a)}})})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.UILayer");e.Code.PhotoSwipe.UILayer.CssClasses={uiLayer:"ps-uilayer"}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.UILayer");var b=e.Code.PhotoSwipe;b.UILayer.UILayerClass=a.TouchElement.TouchElementClass.extend({el:null,settings:null,dispose:function(){var b;this.removeEventHandlers();a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(d){this.settings=d;this.el=a.DOM.createElement("div",{"class":b.UILayer.CssClasses.uiLayer},"");a.DOM.setStyle(this.el,{display:"block",position:"absolute",
+left:0,top:0,overflow:"hidden",zIndex:this.settings.zIndex,opacity:0});a.DOM.hide(this.el);this.settings.target===e?a.DOM.appendToBody(this.el):a.DOM.appendChild(this.el,this.settings.target);this.supr(this.el,{swipe:!0,move:!0,gesture:a.Browser.iOS,doubleTap:!0,preventDefaultTouchEvents:this.settings.preventDefaultTouchEvents})},resetPosition:function(){this.settings.target===e?a.DOM.setStyle(this.el,{top:a.DOM.windowScrollTop()+"px",width:a.DOM.windowWidth(),height:a.DOM.windowHeight()}):a.DOM.setStyle(this.el,
+{top:"0px",width:a.DOM.width(this.settings.target),height:a.DOM.height(this.settings.target)})},show:function(){this.resetPosition();a.DOM.show(this.el);this.addEventHandlers()},addEventHandlers:function(){this.supr()},removeEventHandlers:function(){this.supr()}})})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");e=e.Code.PhotoSwipe;e.ZoomPanRotate.CssClasses={zoomPanRotate:"ps-zoom-pan-rotate"};e.ZoomPanRotate.EventTypes={onTransform:"PhotoSwipeZoomPanRotateOnTransform"}})(window,window.klass,window.Code.Util);
+(function(e,c,a){a.registerNamespace("Code.PhotoSwipe.ZoomPanRotate");var b=e.Code.PhotoSwipe;b.ZoomPanRotate.ZoomPanRotateClass=c({el:null,settings:null,containerEl:null,imageEl:null,transformSettings:null,panStartingPoint:null,transformEl:null,dispose:function(){var b;a.DOM.removeChild(this.el,this.el.parentNode);for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,f,g){var h,j,i;this.settings=c;this.settings.target===e?(c=document.body,h=a.DOM.windowWidth(),j=a.DOM.windowHeight(),
+i=a.DOM.windowScrollTop()+"px"):(c=this.settings.target,h=a.DOM.width(c),j=a.DOM.height(c),i="0px");this.imageEl=f.imageEl.cloneNode(!1);a.DOM.setStyle(this.imageEl,{zIndex:1});this.transformSettings={startingScale:1,scale:1,startingRotation:0,rotation:0,startingTranslateX:0,startingTranslateY:0,translateX:0,translateY:0};this.el=a.DOM.createElement("div",{"class":b.ZoomPanRotate.CssClasses.zoomPanRotate},"");a.DOM.setStyle(this.el,{left:0,top:i,position:"absolute",width:h,height:j,zIndex:this.settings.zIndex,
+display:"block"});a.DOM.insertBefore(this.el,g.el,c);a.Browser.iOS?(this.containerEl=a.DOM.createElement("div"),a.DOM.setStyle(this.containerEl,{left:0,top:0,width:h,height:j,position:"absolute",zIndex:1}),a.DOM.appendChild(this.imageEl,this.containerEl),a.DOM.appendChild(this.containerEl,this.el),a.Animation.resetTranslate(this.containerEl),a.Animation.resetTranslate(this.imageEl),this.transformEl=this.containerEl):(a.DOM.appendChild(this.imageEl,this.el),this.transformEl=this.imageEl)},setStartingTranslateFromCurrentTransform:function(){var b=
+a.coalesce(this.transformEl.style.webkitTransform,this.transformEl.style.MozTransform,this.transformEl.style.transform);if(!a.isNothing(b)&&(b=b.match(/translate\((.*?)\)/),!a.isNothing(b)))b=b[1].split(", "),this.transformSettings.startingTranslateX=e.parseInt(b[0],10),this.transformSettings.startingTranslateY=e.parseInt(b[1],10)},getScale:function(a){a*=this.transformSettings.startingScale;if(this.settings.minUserZoom!==0&&a<this.settings.minUserZoom)a=this.settings.minUserZoom;else if(this.settings.maxUserZoom!==
+0&&a>this.settings.maxUserZoom)a=this.settings.maxUserZoom;return a},setStartingScaleAndRotation:function(a,b){this.transformSettings.startingScale=this.getScale(a);this.transformSettings.startingRotation=(this.transformSettings.startingRotation+b)%360},zoomRotate:function(a,b){this.transformSettings.scale=this.getScale(a);this.transformSettings.rotation=this.transformSettings.startingRotation+b;this.applyTransform()},panStart:function(a){this.setStartingTranslateFromCurrentTransform();this.panStartingPoint=
+{x:a.x,y:a.y}},pan:function(a){var b=(a.y-this.panStartingPoint.y)/this.transformSettings.scale;this.transformSettings.translateX=this.transformSettings.startingTranslateX+(a.x-this.panStartingPoint.x)/this.transformSettings.scale;this.transformSettings.translateY=this.transformSettings.startingTranslateY+b;this.applyTransform()},zoomAndPanToPoint:function(b,c){if(this.settings.target===e){this.panStart({x:a.DOM.windowWidth()/2,y:a.DOM.windowHeight()/2});var g=(c.y-this.panStartingPoint.y)/this.transformSettings.scale;
+this.transformSettings.translateX=(this.transformSettings.startingTranslateX+(c.x-this.panStartingPoint.x)/this.transformSettings.scale)*-1;this.transformSettings.translateY=(this.transformSettings.startingTranslateY+g)*-1}this.setStartingScaleAndRotation(b,0);this.transformSettings.scale=this.transformSettings.startingScale;this.transformSettings.rotation=0;this.applyTransform()},applyTransform:function(){var c=this.transformSettings.rotation%360,f=e.parseInt(this.transformSettings.translateX,10),
+g=e.parseInt(this.transformSettings.translateY,10),h="scale("+this.transformSettings.scale+") rotate("+c+"deg) translate("+f+"px, "+g+"px)";a.DOM.setStyle(this.transformEl,{webkitTransform:h,MozTransform:h,msTransform:h,transform:h});a.Events.fire(this,{target:this,type:b.ZoomPanRotate.EventTypes.onTransform,scale:this.transformSettings.scale,rotation:this.transformSettings.rotation,rotationDegs:c,translateX:f,translateY:g})}})})(window,window.klass,window.Code.Util);
+(function(e,c){c.registerNamespace("Code.PhotoSwipe");var a=e.Code.PhotoSwipe;a.CssClasses={buildingBody:"ps-building",activeBody:"ps-active"};a.EventTypes={onBeforeShow:"PhotoSwipeOnBeforeShow",onShow:"PhotoSwipeOnShow",onBeforeHide:"PhotoSwipeOnBeforeHide",onHide:"PhotoSwipeOnHide",onDisplayImage:"PhotoSwipeOnDisplayImage",onResetPosition:"PhotoSwipeOnResetPosition",onSlideshowStart:"PhotoSwipeOnSlideshowStart",onSlideshowStop:"PhotoSwipeOnSlideshowStop",onTouch:"PhotoSwipeOnTouch",onBeforeCaptionAndToolbarShow:"PhotoSwipeOnBeforeCaptionAndToolbarShow",
+onCaptionAndToolbarShow:"PhotoSwipeOnCaptionAndToolbarShow",onBeforeCaptionAndToolbarHide:"PhotoSwipeOnBeforeCaptionAndToolbarHide",onCaptionAndToolbarHide:"PhotoSwipeOnCaptionAndToolbarHide",onToolbarTap:"PhotoSwipeOnToolbarTap",onBeforeZoomPanRotateShow:"PhotoSwipeOnBeforeZoomPanRotateShow",onZoomPanRotateShow:"PhotoSwipeOnZoomPanRotateShow",onBeforeZoomPanRotateHide:"PhotoSwipeOnBeforeZoomPanRotateHide",onZoomPanRotateHide:"PhotoSwipeOnZoomPanRotateHide",onZoomPanRotateTransform:"PhotoSwipeOnZoomPanRotateTransform"};
+a.instances=[];a.activeInstances=[];a.setActivateInstance=function(b){if(c.arrayIndexOf(b.settings.target,a.activeInstances,"target")>-1)throw"Code.PhotoSwipe.activateInstance: Unable to active instance as another instance is already active for this target";a.activeInstances.push({target:b.settings.target,instance:b})};a.unsetActivateInstance=function(b){b=c.arrayIndexOf(b,a.activeInstances,"instance");a.activeInstances.splice(b,1)};a.attach=function(b,d,e){var g,h;g=a.createInstance(b,d,e);d=0;for(e=
+b.length;d<e;d++)if(h=b[d],!c.isNothing(h.nodeType)&&h.nodeType===1)h.__photoSwipeClickHandler=a.onTriggerElementClick.bind(g),c.Events.remove(h,"click",h.__photoSwipeClickHandler),c.Events.add(h,"click",h.__photoSwipeClickHandler);return g};if(e.jQuery)e.jQuery.fn.photoSwipe=function(b,c){return a.attach(this,b,c)};a.detatch=function(b){var d,e,g;d=0;for(e=b.originalImages.length;d<e;d++)g=b.originalImages[d],!c.isNothing(g.nodeType)&&g.nodeType===1&&(c.Events.remove(g,"click",g.__photoSwipeClickHandler),
+delete g.__photoSwipeClickHandler);a.disposeInstance(b)};a.createInstance=function(b,d,e){var g;if(c.isNothing(b))throw"Code.PhotoSwipe.attach: No images passed.";if(!c.isLikeArray(b))throw"Code.PhotoSwipe.createInstance: Images must be an array of elements or image urls.";if(b.length<1)throw"Code.PhotoSwipe.createInstance: No images to passed.";d=c.coalesce(d,{});g=a.getInstance(e);if(c.isNothing(g))g=new a.PhotoSwipeClass(b,d,e),a.instances.push(g);else throw'Code.PhotoSwipe.createInstance: Instance with id "'+
+e+' already exists."';return g};a.disposeInstance=function(b){var c=a.getInstanceIndex(b);if(c<0)throw"Code.PhotoSwipe.disposeInstance: Unable to find instance to dispose.";b.dispose();a.instances.splice(c,1)};a.onTriggerElementClick=function(a){a.preventDefault();this.show(a.currentTarget)};a.getInstance=function(b){var c,e,g;c=0;for(e=a.instances.length;c<e;c++)if(g=a.instances[c],g.id===b)return g;return null};a.getInstanceIndex=function(b){var c,e,g=-1;c=0;for(e=a.instances.length;c<e;c++)if(a.instances[c]===
+b){g=c;break}return g}})(window,window.Code.Util);
+(function(e,c,a,b,d,f,g,h,j){a.registerNamespace("Code.PhotoSwipe");var i=e.Code.PhotoSwipe;i.PhotoSwipeClass=c({id:null,settings:null,isBackEventSupported:null,backButtonClicked:null,currentIndex:null,originalImages:null,mouseWheelStartTime:null,windowDimensions:null,cache:null,documentOverlay:null,carousel:null,uiLayer:null,toolbar:null,zoomPanRotate:null,windowOrientationChangeHandler:null,windowScrollHandler:null,windowHashChangeHandler:null,keyDownHandler:null,windowOrientationEventName:null,
+uiLayerTouchHandler:null,carouselSlideByEndHandler:null,carouselSlideshowStartHandler:null,carouselSlideshowStopHandler:null,toolbarTapHandler:null,toolbarBeforeShowHandler:null,toolbarShowHandler:null,toolbarBeforeHideHandler:null,toolbarHideHandler:null,mouseWheelHandler:null,zoomPanRotateTransformHandler:null,_isResettingPosition:null,_uiWebViewResetPositionTimeout:null,dispose:function(){var b;a.Events.remove(this,i.EventTypes.onBeforeShow);a.Events.remove(this,i.EventTypes.onShow);a.Events.remove(this,
+i.EventTypes.onBeforeHide);a.Events.remove(this,i.EventTypes.onHide);a.Events.remove(this,i.EventTypes.onDisplayImage);a.Events.remove(this,i.EventTypes.onResetPosition);a.Events.remove(this,i.EventTypes.onSlideshowStart);a.Events.remove(this,i.EventTypes.onSlideshowStop);a.Events.remove(this,i.EventTypes.onTouch);a.Events.remove(this,i.EventTypes.onBeforeCaptionAndToolbarShow);a.Events.remove(this,i.EventTypes.onCaptionAndToolbarShow);a.Events.remove(this,i.EventTypes.onBeforeCaptionAndToolbarHide);
+a.Events.remove(this,i.EventTypes.onCaptionAndToolbarHide);a.Events.remove(this,i.EventTypes.onZoomPanRotateTransform);this.removeEventHandlers();a.isNothing(this.documentOverlay)||this.documentOverlay.dispose();a.isNothing(this.carousel)||this.carousel.dispose();a.isNothing(this.uiLayer)||this.uiLayer.dispose();a.isNothing(this.toolbar)||this.toolbar.dispose();this.destroyZoomPanRotate();a.isNothing(this.cache)||this.cache.dispose();for(b in this)a.objectHasProperty(this,b)&&(this[b]=null)},initialize:function(c,
+d,f){this.id=a.isNothing(f)?"PhotoSwipe"+(new Date).getTime().toString():f;this.originalImages=c;if(a.Browser.android&&e.navigator.userAgent.match(/Android (\d+.\d+)/).toString().replace(/^.*\,/,"")>=2.1)this.isBackEventSupported=!0;if(!this.isBackEventSupported)this.isBackEventSupported=a.objectHasProperty(e,"onhashchange");this.settings={fadeInSpeed:250,fadeOutSpeed:250,preventHide:!1,preventSlideshow:!1,zIndex:1E3,backButtonHideEnabled:!0,enableKeyboard:!0,enableMouseWheel:!0,mouseWheelSpeed:350,
+autoStartSlideshow:!1,jQueryMobile:!a.isNothing(e.jQuery)&&!a.isNothing(e.jQuery.mobile),jQueryMobileDialogHash:"&ui-state=dialog",enableUIWebViewRepositionTimeout:!1,uiWebViewResetPositionDelay:500,target:e,preventDefaultTouchEvents:!0,loop:!0,slideSpeed:250,nextPreviousSlideSpeed:0,enableDrag:!0,swipeThreshold:50,swipeTimeThreshold:250,slideTimingFunction:"ease-out",slideshowDelay:3E3,doubleTapSpeed:250,margin:20,imageScaleMethod:"fit",captionAndToolbarHide:!1,captionAndToolbarFlipPosition:!1,captionAndToolbarAutoHideDelay:5E3,
+captionAndToolbarOpacity:0.8,captionAndToolbarShowEmptyCaptions:!0,getToolbar:i.Toolbar.getToolbar,allowUserZoom:!0,allowRotationOnUserZoom:!1,maxUserZoom:5,minUserZoom:0.5,doubleTapZoomLevel:2.5,getImageSource:i.Cache.Functions.getImageSource,getImageCaption:i.Cache.Functions.getImageCaption,getImageMetaData:i.Cache.Functions.getImageMetaData,cacheMode:i.Cache.Mode.normal};a.extend(this.settings,d);this.settings.target!==e&&(d=a.DOM.getStyle(this.settings.target,"position"),(d!=="relative"||d!==
+"absolute")&&a.DOM.setStyle(this.settings.target,"position","relative"));if(this.settings.target!==e)this.isBackEventSupported=!1,this.settings.backButtonHideEnabled=!1;else if(this.settings.preventHide)this.settings.backButtonHideEnabled=!1;this.cache=new b.CacheClass(c,this.settings)},show:function(b){var c,d;this.backButtonClicked=this._isResettingPosition=!1;if(a.isNumber(b))this.currentIndex=b;else{this.currentIndex=-1;c=0;for(d=this.originalImages.length;c<d;c++)if(this.originalImages[c]===
+b){this.currentIndex=c;break}}if(this.currentIndex<0||this.currentIndex>this.originalImages.length-1)throw"Code.PhotoSwipe.PhotoSwipeClass.show: Starting index out of range";this.isAlreadyGettingPage=this.getWindowDimensions();i.setActivateInstance(this);this.windowDimensions=this.getWindowDimensions();this.settings.target===e?a.DOM.addClass(e.document.body,i.CssClasses.buildingBody):a.DOM.addClass(this.settings.target,i.CssClasses.buildingBody);this.createComponents();a.Events.fire(this,{type:i.EventTypes.onBeforeShow,
+target:this});this.documentOverlay.fadeIn(this.settings.fadeInSpeed,this.onDocumentOverlayFadeIn.bind(this))},getWindowDimensions:function(){return{width:a.DOM.windowWidth(),height:a.DOM.windowHeight()}},createComponents:function(){this.documentOverlay=new d.DocumentOverlayClass(this.settings);this.carousel=new f.CarouselClass(this.cache,this.settings);this.uiLayer=new h.UILayerClass(this.settings);if(!this.settings.captionAndToolbarHide)this.toolbar=new g.ToolbarClass(this.cache,this.settings)},
+resetPosition:function(){if(!this._isResettingPosition){var b=this.getWindowDimensions();if(a.isNothing(this.windowDimensions)||!(b.width===this.windowDimensions.width&&b.height===this.windowDimensions.height))this._isResettingPosition=!0,this.windowDimensions=b,this.destroyZoomPanRotate(),this.documentOverlay.resetPosition(),this.carousel.resetPosition(),a.isNothing(this.toolbar)||this.toolbar.resetPosition(),this.uiLayer.resetPosition(),this._isResettingPosition=!1,a.Events.fire(this,{type:i.EventTypes.onResetPosition,
+target:this})}},addEventHandler:function(b,c){a.Events.add(this,b,c)},addEventHandlers:function(){if(a.isNothing(this.windowOrientationChangeHandler))this.windowOrientationChangeHandler=this.onWindowOrientationChange.bind(this),this.windowScrollHandler=this.onWindowScroll.bind(this),this.keyDownHandler=this.onKeyDown.bind(this),this.windowHashChangeHandler=this.onWindowHashChange.bind(this),this.uiLayerTouchHandler=this.onUILayerTouch.bind(this),this.carouselSlideByEndHandler=this.onCarouselSlideByEnd.bind(this),
+this.carouselSlideshowStartHandler=this.onCarouselSlideshowStart.bind(this),this.carouselSlideshowStopHandler=this.onCarouselSlideshowStop.bind(this),this.toolbarTapHandler=this.onToolbarTap.bind(this),this.toolbarBeforeShowHandler=this.onToolbarBeforeShow.bind(this),this.toolbarShowHandler=this.onToolbarShow.bind(this),this.toolbarBeforeHideHandler=this.onToolbarBeforeHide.bind(this),this.toolbarHideHandler=this.onToolbarHide.bind(this),this.mouseWheelHandler=this.onMouseWheel.bind(this),this.zoomPanRotateTransformHandler=
+this.onZoomPanRotateTransform.bind(this);a.Browser.android?this.orientationEventName="resize":a.Browser.iOS&&!a.Browser.safari?a.Events.add(e.document.body,"orientationchange",this.windowOrientationChangeHandler):this.orientationEventName=!a.isNothing(e.onorientationchange)?"orientationchange":"resize";a.isNothing(this.orientationEventName)||a.Events.add(e,this.orientationEventName,this.windowOrientationChangeHandler);this.settings.target===e&&a.Events.add(e,"scroll",this.windowScrollHandler);this.settings.enableKeyboard&&
+a.Events.add(e.document,"keydown",this.keyDownHandler);if(this.isBackEventSupported&&this.settings.backButtonHideEnabled)this.windowHashChangeHandler=this.onWindowHashChange.bind(this),this.settings.jQueryMobile?e.location.hash=this.settings.jQueryMobileDialogHash:(this.currentHistoryHashValue="PhotoSwipe"+(new Date).getTime().toString(),e.location.hash=this.currentHistoryHashValue),a.Events.add(e,"hashchange",this.windowHashChangeHandler);this.settings.enableMouseWheel&&a.Events.add(e,"mousewheel",
+this.mouseWheelHandler);a.Events.add(this.uiLayer,a.TouchElement.EventTypes.onTouch,this.uiLayerTouchHandler);a.Events.add(this.carousel,f.EventTypes.onSlideByEnd,this.carouselSlideByEndHandler);a.Events.add(this.carousel,f.EventTypes.onSlideshowStart,this.carouselSlideshowStartHandler);a.Events.add(this.carousel,f.EventTypes.onSlideshowStop,this.carouselSlideshowStopHandler);a.isNothing(this.toolbar)||(a.Events.add(this.toolbar,g.EventTypes.onTap,this.toolbarTapHandler),a.Events.add(this.toolbar,
+g.EventTypes.onBeforeShow,this.toolbarBeforeShowHandler),a.Events.add(this.toolbar,g.EventTypes.onShow,this.toolbarShowHandler),a.Events.add(this.toolbar,g.EventTypes.onBeforeHide,this.toolbarBeforeHideHandler),a.Events.add(this.toolbar,g.EventTypes.onHide,this.toolbarHideHandler))},removeEventHandlers:function(){a.Browser.iOS&&!a.Browser.safari&&a.Events.remove(e.document.body,"orientationchange",this.windowOrientationChangeHandler);a.isNothing(this.orientationEventName)||a.Events.remove(e,this.orientationEventName,
+this.windowOrientationChangeHandler);a.Events.remove(e,"scroll",this.windowScrollHandler);this.settings.enableKeyboard&&a.Events.remove(e.document,"keydown",this.keyDownHandler);this.isBackEventSupported&&this.settings.backButtonHideEnabled&&a.Events.remove(e,"hashchange",this.windowHashChangeHandler);this.settings.enableMouseWheel&&a.Events.remove(e,"mousewheel",this.mouseWheelHandler);a.isNothing(this.uiLayer)||a.Events.remove(this.uiLayer,a.TouchElement.EventTypes.onTouch,this.uiLayerTouchHandler);
+a.isNothing(this.toolbar)||(a.Events.remove(this.carousel,f.EventTypes.onSlideByEnd,this.carouselSlideByEndHandler),a.Events.remove(this.carousel,f.EventTypes.onSlideshowStart,this.carouselSlideshowStartHandler),a.Events.remove(this.carousel,f.EventTypes.onSlideshowStop,this.carouselSlideshowStopHandler));a.isNothing(this.toolbar)||(a.Events.remove(this.toolbar,g.EventTypes.onTap,this.toolbarTapHandler),a.Events.remove(this.toolbar,g.EventTypes.onBeforeShow,this.toolbarBeforeShowHandler),a.Events.remove(this.toolbar,
+g.EventTypes.onShow,this.toolbarShowHandler),a.Events.remove(this.toolbar,g.EventTypes.onBeforeHide,this.toolbarBeforeHideHandler),a.Events.remove(this.toolbar,g.EventTypes.onHide,this.toolbarHideHandler))},hide:function(){if(!this.settings.preventHide){if(a.isNothing(this.documentOverlay))throw"Code.PhotoSwipe.PhotoSwipeClass.hide: PhotoSwipe instance is already hidden";if(a.isNothing(this.hiding)){this.clearUIWebViewResetPositionTimeout();this.destroyZoomPanRotate();this.removeEventHandlers();a.Events.fire(this,
+{type:i.EventTypes.onBeforeHide,target:this});this.uiLayer.dispose();this.uiLayer=null;if(!a.isNothing(this.toolbar))this.toolbar.dispose(),this.toolbar=null;this.carousel.dispose();this.carousel=null;a.DOM.removeClass(e.document.body,i.CssClasses.activeBody);this.documentOverlay.dispose();this.documentOverlay=null;this._isResettingPosition=!1;i.unsetActivateInstance(this);a.Events.fire(this,{type:i.EventTypes.onHide,target:this});this.goBackInHistory()}}},goBackInHistory:function(){this.isBackEventSupported&&
+this.settings.backButtonHideEnabled&&(this.backButtonClicked||e.history.back())},play:function(){!this.isZoomActive()&&!this.settings.preventSlideshow&&!a.isNothing(this.carousel)&&(!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.toolbar.fadeOut(),this.carousel.startSlideshow())},stop:function(){this.isZoomActive()||a.isNothing(this.carousel)||this.carousel.stopSlideshow()},previous:function(){this.isZoomActive()||a.isNothing(this.carousel)||this.carousel.previous()},next:function(){this.isZoomActive()||
+a.isNothing(this.carousel)||this.carousel.next()},toggleToolbar:function(){this.isZoomActive()||a.isNothing(this.toolbar)||this.toolbar.toggleVisibility(this.currentIndex)},fadeOutToolbarIfVisible:function(){!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.settings.captionAndToolbarAutoHideDelay>0&&this.toolbar.fadeOut()},createZoomPanRotate:function(){this.stop();if(this.canUserZoom()&&!this.isZoomActive())a.Events.fire(this,i.EventTypes.onBeforeZoomPanRotateShow),this.zoomPanRotate=new j.ZoomPanRotateClass(this.settings,
+this.cache.images[this.currentIndex],this.uiLayer),this.uiLayer.captureSettings.preventDefaultTouchEvents=!0,a.Events.add(this.zoomPanRotate,i.ZoomPanRotate.EventTypes.onTransform,this.zoomPanRotateTransformHandler),a.Events.fire(this,i.EventTypes.onZoomPanRotateShow),!a.isNothing(this.toolbar)&&this.toolbar.isVisible&&this.toolbar.fadeOut()},destroyZoomPanRotate:function(){if(!a.isNothing(this.zoomPanRotate))a.Events.fire(this,i.EventTypes.onBeforeZoomPanRotateHide),a.Events.remove(this.zoomPanRotate,
+i.ZoomPanRotate.EventTypes.onTransform,this.zoomPanRotateTransformHandler),this.zoomPanRotate.dispose(),this.zoomPanRotate=null,this.uiLayer.captureSettings.preventDefaultTouchEvents=this.settings.preventDefaultTouchEvents,a.Events.fire(this,i.EventTypes.onZoomPanRotateHide)},canUserZoom:function(){var b;if(a.Browser.msie){if(b=document.createElement("div"),a.isNothing(b.style.msTransform))return!1}else if(!a.Browser.isCSSTransformSupported)return!1;if(!this.settings.allowUserZoom)return!1;if(this.carousel.isSliding)return!1;
+b=this.cache.images[this.currentIndex];if(a.isNothing(b))return!1;if(b.isLoading)return!1;return!0},isZoomActive:function(){return!a.isNothing(this.zoomPanRotate)},getCurrentImage:function(){return this.cache.images[this.currentIndex]},onDocumentOverlayFadeIn:function(){e.setTimeout(function(){var b=this.settings.target===e?e.document.body:this.settings.target;a.DOM.removeClass(b,i.CssClasses.buildingBody);a.DOM.addClass(b,i.CssClasses.activeBody);this.addEventHandlers();this.carousel.show(this.currentIndex);
+this.uiLayer.show();this.settings.autoStartSlideshow?this.play():a.isNothing(this.toolbar)||this.toolbar.show(this.currentIndex);a.Events.fire(this,{type:i.EventTypes.onShow,target:this});this.setUIWebViewResetPositionTimeout()}.bind(this),250)},setUIWebViewResetPositionTimeout:function(){if(this.settings.enableUIWebViewRepositionTimeout&&a.Browser.iOS&&!a.Browser.safari)a.isNothing(this._uiWebViewResetPositionTimeout)||e.clearTimeout(this._uiWebViewResetPositionTimeout),this._uiWebViewResetPositionTimeout=
+e.setTimeout(function(){this.resetPosition();this.setUIWebViewResetPositionTimeout()}.bind(this),this.settings.uiWebViewResetPositionDelay)},clearUIWebViewResetPositionTimeout:function(){a.isNothing(this._uiWebViewResetPositionTimeout)||e.clearTimeout(this._uiWebViewResetPositionTimeout)},onWindowScroll:function(){this.resetPosition()},onWindowOrientationChange:function(){this.resetPosition()},onWindowHashChange:function(){if(e.location.hash!=="#"+(this.settings.jQueryMobile?this.settings.jQueryMobileDialogHash:
+this.currentHistoryHashValue))this.backButtonClicked=!0,this.hide()},onKeyDown:function(a){a.keyCode===37?(a.preventDefault(),this.previous()):a.keyCode===39?(a.preventDefault(),this.next()):a.keyCode===38||a.keyCode===40?a.preventDefault():a.keyCode===27?(a.preventDefault(),this.hide()):a.keyCode===32?(this.settings.hideToolbar?this.hide():this.toggleToolbar(),a.preventDefault()):a.keyCode===13&&(a.preventDefault(),this.play())},onUILayerTouch:function(b){if(this.isZoomActive())switch(b.action){case a.TouchElement.ActionTypes.gestureChange:this.zoomPanRotate.zoomRotate(b.scale,
+this.settings.allowRotationOnUserZoom?b.rotation:0);break;case a.TouchElement.ActionTypes.gestureEnd:this.zoomPanRotate.setStartingScaleAndRotation(b.scale,this.settings.allowRotationOnUserZoom?b.rotation:0);break;case a.TouchElement.ActionTypes.touchStart:this.zoomPanRotate.panStart(b.point);break;case a.TouchElement.ActionTypes.touchMove:this.zoomPanRotate.pan(b.point);break;case a.TouchElement.ActionTypes.doubleTap:this.destroyZoomPanRotate();this.toggleToolbar();break;case a.TouchElement.ActionTypes.swipeLeft:this.destroyZoomPanRotate();
+this.next();this.toggleToolbar();break;case a.TouchElement.ActionTypes.swipeRight:this.destroyZoomPanRotate(),this.previous(),this.toggleToolbar()}else switch(b.action){case a.TouchElement.ActionTypes.touchMove:case a.TouchElement.ActionTypes.swipeLeft:case a.TouchElement.ActionTypes.swipeRight:this.fadeOutToolbarIfVisible();this.carousel.onTouch(b.action,b.point);break;case a.TouchElement.ActionTypes.touchStart:case a.TouchElement.ActionTypes.touchMoveEnd:this.carousel.onTouch(b.action,b.point);
+break;case a.TouchElement.ActionTypes.tap:this.toggleToolbar();break;case a.TouchElement.ActionTypes.doubleTap:this.settings.target===e&&(b.point.x-=a.DOM.windowScrollLeft(),b.point.y-=a.DOM.windowScrollTop());var c=this.cache.images[this.currentIndex].imageEl,d=e.parseInt(a.DOM.getStyle(c,"top"),10),f=e.parseInt(a.DOM.getStyle(c,"left"),10),g=f+a.DOM.width(c),c=d+a.DOM.height(c);if(b.point.x<f)b.point.x=f;else if(b.point.x>g)b.point.x=g;if(b.point.y<d)b.point.y=d;else if(b.point.y>c)b.point.y=c;
+this.createZoomPanRotate();this.isZoomActive()&&this.zoomPanRotate.zoomAndPanToPoint(this.settings.doubleTapZoomLevel,b.point);break;case a.TouchElement.ActionTypes.gestureStart:this.createZoomPanRotate()}a.Events.fire(this,{type:i.EventTypes.onTouch,target:this,point:b.point,action:b.action})},onCarouselSlideByEnd:function(b){this.currentIndex=b.cacheIndex;a.isNothing(this.toolbar)||(this.toolbar.setCaption(this.currentIndex),this.toolbar.setToolbarStatus(this.currentIndex));a.Events.fire(this,{type:i.EventTypes.onDisplayImage,
+target:this,action:b.action,index:b.cacheIndex})},onToolbarTap:function(b){switch(b.action){case g.ToolbarAction.next:this.next();break;case g.ToolbarAction.previous:this.previous();break;case g.ToolbarAction.close:this.hide();break;case g.ToolbarAction.play:this.play()}a.Events.fire(this,{type:i.EventTypes.onToolbarTap,target:this,toolbarAction:b.action,tapTarget:b.tapTarget})},onMouseWheel:function(b){var c=a.Events.getWheelDelta(b);if(!(b.timeStamp-(this.mouseWheelStartTime||0)<this.settings.mouseWheelSpeed))this.mouseWheelStartTime=
+b.timeStamp,this.settings.invertMouseWheel&&(c*=-1),c<0?this.next():c>0&&this.previous()},onCarouselSlideshowStart:function(){a.Events.fire(this,{type:i.EventTypes.onSlideshowStart,target:this})},onCarouselSlideshowStop:function(){a.Events.fire(this,{type:i.EventTypes.onSlideshowStop,target:this})},onToolbarBeforeShow:function(){a.Events.fire(this,{type:i.EventTypes.onBeforeCaptionAndToolbarShow,target:this})},onToolbarShow:function(){a.Events.fire(this,{type:i.EventTypes.onCaptionAndToolbarShow,
+target:this})},onToolbarBeforeHide:function(){a.Events.fire(this,{type:i.EventTypes.onBeforeCaptionAndToolbarHide,target:this})},onToolbarHide:function(){a.Events.fire(this,{type:i.EventTypes.onCaptionAndToolbarHide,target:this})},onZoomPanRotateTransform:function(b){a.Events.fire(this,{target:this,type:i.EventTypes.onZoomPanRotateTransform,scale:b.scale,rotation:b.rotation,rotationDegs:b.rotationDegs,translateX:b.translateX,translateY:b.translateY})}})})(window,window.klass,window.Code.Util,window.Code.PhotoSwipe.Cache,
+window.Code.PhotoSwipe.DocumentOverlay,window.Code.PhotoSwipe.Carousel,window.Code.PhotoSwipe.Toolbar,window.Code.PhotoSwipe.UILayer,window.Code.PhotoSwipe.ZoomPanRotate);
Index: tags/2.4.0RC3/themes/smartpocket/js/config.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/config.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/config.js	(revision 14585)
@@ -0,0 +1,7 @@
+$(document).bind("mobileinit", function(){
+  $.extend(  $.mobile , {
+    ajaxEnabled: false,
+    hashListeningEnabled: false,
+    pushStateEnabled: false
+  });
+});
Index: tags/2.4.0RC3/themes/smartpocket/js/jquery-1.6.4.min.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/jquery-1.6.4.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/jquery-1.6.4.min.js	(revision 14585)
@@ -0,0 +1,4 @@
+/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */
+(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bA.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bW(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bP,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bW(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bW(a,c,d,e,"*",g));return l}function bV(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bL),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function by(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bt:bu;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bf(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function V(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(Q.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(w,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:H?function(a){return a==null?"":H.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?F.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(!b)return-1;if(I)return I.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=G.call(arguments,2),g=function(){return a.apply(c,f.concat(G.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){J["[object "+b+"]"]=b.toLowerCase()}),A=e.uaMatch(z),A.browser&&(e.browser[A.browser]=!0,e.browser.version=A.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?C=function(){c.removeEventListener("DOMContentLoaded",C,!1),e.ready()}:c.attachEvent&&(C=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",C),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g+"With"](this===b?d:this,[h])}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u,v;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete 
+t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,M(a.origType,a.selector),f.extend({},a,{handler:L,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,M(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?D:C):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=D;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=D;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=D,this.stopPropagation()},isDefaultPrevented:C,isPropagationStopped:C,isImmediatePropagationStopped:C};var E=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},F=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?F:E,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?F:E)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=f.nodeName(b,"input")||f.nodeName(b,"button")?b.type:"";(c==="submit"||c==="image")&&f(b).closest("form").length&&J("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=f.nodeName(b,"input")||f.nodeName(b,"button")?b.type:"";(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&J("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var G,H=function(a){var b=f.nodeName(a,"input")?a.type:"",c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var K={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||C,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=w.exec(h),k="",j&&(k=j[0],h=h.replace(w,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,K[h]?(a.push(K[h]+k),h=h+k):h=(K[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+M(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+M(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var N=/Until$/,O=/^(?:parents|prevUntil|prevAll)/,P=/,/,Q=/^.[^:#\[\.,]*$/,R=Array.prototype.slice,S=f.expr.match.POS,T={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(V(this,a,!1),"not",a)},filter:function(a){return this.pushStack(V(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=S.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|object|embed|option|style)/i,bb=/checked\s*(?:[^=]|=\s*.checked.)/i,bc=/\/(java|ecma)script/i,bd=/^\s*<!(?:\[CDATA\[|\-\-)/,be={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bb.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bf(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bl)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!ba.test(a[0])&&(f.support.checkClone||!bb.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean
+(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bk(k[i]);else bk(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bc.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bm=/alpha\([^)]*\)/i,bn=/opacity=([^)]*)/,bo=/([A-Z]|^ms)/g,bp=/^-?\d+(?:px)?$/i,bq=/^-?\d/,br=/^([\-+])=([\-+.\de]+)/,bs={position:"absolute",visibility:"hidden",display:"block"},bt=["Left","Right"],bu=["Top","Bottom"],bv,bw,bx;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bv(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=br.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bv)return bv(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return by(a,b,d);f.swap(a,bs,function(){e=by(a,b,d)});return e}},set:function(a,b){if(!bp.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cr(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cq("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cq("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cr(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cq("show",1),slideUp:cq("hide",1),slideToggle:cq("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return d.step(a)}var d=this,e=f.fx;this.startTime=cn||co(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&f.timers.push(g)&&!cl&&(cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||co(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cs=/^t(?:able|d|h)$/i,ct=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cu(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!cs.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
Index: tags/2.4.0RC3/themes/smartpocket/js/jquery.mobile.min.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/jquery.mobile.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/jquery.mobile.min.js	(revision 14585)
@@ -0,0 +1,177 @@
+/*! jQuery Mobile v1.0.1 jquerymobile.com | jquery.org/license */
+(function(a,e){if(a.cleanData){var b=a.cleanData;a.cleanData=function(f){for(var c=0,d;(d=f[c])!=null;c++)a(d).triggerHandler("remove");b(f)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){a(this).triggerHandler("remove")});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],i,b=b.split(".")[1];i=e+"-"+b;if(!d)d=c,c=a.Widget;a.expr[":"][i]=function(c){return!!a.data(c,
+b)};a[e]=a[e]||{};a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};c=new c;c.options=a.extend(true,{},c.options);a[e][b].prototype=a.extend(true,c,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:i},d);a.widget.bridge(b,a[e][b])};a.widget.bridge=function(b,c){a.fn[b]=function(d){var g=typeof d==="string",i=Array.prototype.slice.call(arguments,1),l=this,d=!g&&i.length?a.extend.apply(null,[true,d].concat(i)):d;if(g&&d.charAt(0)==="_")return l;
+g?this.each(function(){var c=a.data(this,b);if(!c)throw"cannot call methods on "+b+" prior to initialization; attempted to call method '"+d+"'";if(!a.isFunction(c[d]))throw"no such method '"+d+"' for "+b+" widget instance";var g=c[d].apply(c,i);if(g!==c&&g!==e)return l=g,false}):this.each(function(){var e=a.data(this,b);e?e.option(d||{})._init():a.data(this,b,new c(d,this))});return l}};a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)};a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",
+options:{disabled:false},_createWidget:function(b,c){a.data(c,this.widgetName,this);this.element=a(c);this.options=a.extend(true,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){var b={};a.metadata&&(b=a.metadata.get(element)[this.widgetName]);return b},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);
+this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(b,c){var d=b;if(arguments.length===0)return a.extend({},this.options);if(typeof b==="string"){if(c===e)return this.options[b];d={};d[b]=c}this._setOptions(d);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b;a==="disabled"&&
+this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(b,c,d){var e=this.options[b],c=a.Event(c);c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase();d=d||{};if(c.originalEvent)for(var b=a.event.props.length,i;b;)i=a.event.props[--b],c[i]=c.originalEvent[i];this.element.trigger(c,
+d);return!(a.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
+(function(a,e){a.widget("mobile.widget",{_createWidget:function(){a.Widget.prototype._createWidget.apply(this,arguments);this._trigger("init")},_getCreateOptions:function(){var b=this.element,d={};a.each(this.options,function(a){var c=b.jqmData(a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}));c!==e&&(d[a]=c)});return d},enhanceWithin:function(b){var d=a.mobile.closestPageData(a(b)),d=d&&d.keepNativeSelector()||"";a(this.options.initSelector,b).not(d)[this.widgetName]()}})})(jQuery);
+(function(a){a(window);var e=a("html");a.mobile.media=function(){var b={},d=a("<div id='jquery-mediatest'>"),f=a("<body>").append(d);return function(a){if(!(a in b)){var h=document.createElement("style"),g="@media "+a+" { #jquery-mediatest { position:absolute; } }";h.type="text/css";h.styleSheet?h.styleSheet.cssText=g:h.appendChild(document.createTextNode(g));e.prepend(f).prepend(h);b[a]=d.css("position")==="absolute";f.add(h).remove()}return b[a]}}()})(jQuery);
+(function(a,e){function b(a){var b=a.charAt(0).toUpperCase()+a.substr(1),a=(a+" "+c.join(b+" ")+b).split(" "),d;for(d in a)if(f[a[d]]!==e)return true}var d=a("<body>").prependTo("html"),f=d[0].style,c=["Webkit","Moz","O"],h="palmGetResource"in window,g=window.operamini&&{}.toString.call(window.operamini)==="[object OperaMini]",i=window.blackberry;a.mobile.browser={};a.mobile.browser.ie=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<\!--[if gt IE "+ ++a+"]><br><![endif]--\>",
+c[0];);return a>4?a:!a}();a.extend(a.support,{orientation:"orientation"in window&&"onorientationchange"in window,touch:"ontouchend"in document,cssTransitions:"WebKitTransitionEvent"in window,pushState:"pushState"in history&&"replaceState"in history,mediaquery:a.mobile.media("only all"),cssPseudoElement:!!b("content"),touchOverflow:!!b("overflowScrolling"),boxShadow:!!b("boxShadow")&&!i,scrollTop:("pageXOffset"in window||"scrollTop"in document.documentElement||"scrollTop"in d[0])&&!h&&!g,dynamicBaseTag:function(){var b=
+location.protocol+"//"+location.host+location.pathname+"ui-dir/",c=a("head base"),f=null,e="",h;c.length?e=c.attr("href"):c=f=a("<base>",{href:b}).appendTo("head");h=a("<a href='testurl' />").prependTo(d)[0].href;c[0].href=e||location.pathname;f&&f.remove();return h.indexOf(b)===0}()});d.remove();h=function(){var a=window.navigator.userAgent;return a.indexOf("Nokia")>-1&&(a.indexOf("Symbian/3")>-1||a.indexOf("Series60/5")>-1)&&a.indexOf("AppleWebKit")>-1&&a.match(/(BrowserNG|NokiaBrowser)\/7\.[0-3]/)}();
+a.mobile.ajaxBlacklist=window.blackberry&&!window.WebKitPoint||g||h;h&&a(function(){a("head link[rel='stylesheet']").attr("rel","alternate stylesheet").attr("rel","stylesheet")});a.support.boxShadow||a("html").addClass("ui-mobile-nosupport-boxshadow")})(jQuery);
+(function(a,e,b,d){function f(a){for(;a&&typeof a.originalEvent!=="undefined";)a=a.originalEvent;return a}function c(b){for(var c={},f,d;b;){f=a.data(b,m);for(d in f)if(f[d])c[d]=c.hasVirtualBinding=true;b=b.parentNode}return c}function h(){w&&(clearTimeout(w),w=0);w=setTimeout(function(){D=w=0;u.length=0;C=false;y=true},a.vmouse.resetTimerDuration)}function g(b,c,r){var e,h;if(!(h=r&&r[b])){if(r=!r)a:{for(r=c.target;r;){if((h=a.data(r,m))&&(!b||h[b]))break a;r=r.parentNode}r=null}h=r}if(h){e=c;var r=
+e.type,g,i;e=a.Event(e);e.type=b;h=e.originalEvent;g=a.event.props;if(h)for(i=g.length;i;)b=g[--i],e[b]=h[b];if(r.search(/mouse(down|up)|click/)>-1&&!e.which)e.which=1;if(r.search(/^touch/)!==-1&&(b=f(h),r=b.touches,b=b.changedTouches,r=r&&r.length?r[0]:b&&b.length?b[0]:d))for(h=0,len=z.length;h<len;h++)b=z[h],e[b]=r[b];a(c.target).trigger(e)}return e}function i(b){var c=a.data(b.target,A);if(!C&&(!D||D!==c))if(c=g("v"+b.type,b))c.isDefaultPrevented()&&b.preventDefault(),c.isPropagationStopped()&&
+b.stopPropagation(),c.isImmediatePropagationStopped()&&b.stopImmediatePropagation()}function l(b){var d=f(b).touches,e;if(d&&d.length===1&&(e=b.target,d=c(e),d.hasVirtualBinding))D=r++,a.data(e,A,D),w&&(clearTimeout(w),w=0),x=y=false,e=f(b).touches[0],v=e.pageX,s=e.pageY,g("vmouseover",b,d),g("vmousedown",b,d)}function k(a){y||(x||g("vmousecancel",a,c(a.target)),x=true,h())}function o(b){if(!y){var d=f(b).touches[0],r=x,e=a.vmouse.moveDistanceThreshold;x=x||Math.abs(d.pageX-v)>e||Math.abs(d.pageY-
+s)>e;flags=c(b.target);x&&!r&&g("vmousecancel",b,flags);g("vmousemove",b,flags);h()}}function n(a){if(!y){y=true;var b=c(a.target),d;g("vmouseup",a,b);if(!x&&(d=g("vclick",a,b))&&d.isDefaultPrevented())d=f(a).changedTouches[0],u.push({touchID:D,x:d.clientX,y:d.clientY}),C=true;g("vmouseout",a,b);x=false;h()}}function q(b){var b=a.data(b,m),c;if(b)for(c in b)if(b[c])return true;return false}function j(){}function p(b){var c=b.substr(1);return{setup:function(){q(this)||a.data(this,m,{});a.data(this,
+m)[b]=true;t[b]=(t[b]||0)+1;t[b]===1&&B.bind(c,i);a(this).bind(c,j);if(E)t.touchstart=(t.touchstart||0)+1,t.touchstart===1&&B.bind("touchstart",l).bind("touchend",n).bind("touchmove",o).bind("scroll",k)},teardown:function(){--t[b];t[b]||B.unbind(c,i);E&&(--t.touchstart,t.touchstart||B.unbind("touchstart",l).unbind("touchmove",o).unbind("touchend",n).unbind("scroll",k));var d=a(this),f=a.data(this,m);f&&(f[b]=false);d.unbind(c,j);q(this)||d.removeData(m)}}}var m="virtualMouseBindings",A="virtualTouchID",
+e="vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split(" "),z="clientX clientY pageX pageY screenX screenY".split(" "),t={},w=0,v=0,s=0,x=false,u=[],C=false,y=false,E="addEventListener"in b,B=a(b),r=1,D=0;a.vmouse={moveDistanceThreshold:10,clickDistanceThreshold:10,resetTimerDuration:1500};for(var F=0;F<e.length;F++)a.event.special[e[F]]=p(e[F]);E&&b.addEventListener("click",function(b){var c=u.length,d=b.target,f,r,e,h,g;if(c){f=b.clientX;r=b.clientY;threshold=a.vmouse.clickDistanceThreshold;
+for(e=d;e;){for(h=0;h<c;h++)if(g=u[h],e===d&&Math.abs(g.x-f)<threshold&&Math.abs(g.y-r)<threshold||a.data(e,A)===g.touchID){b.preventDefault();b.stopPropagation();return}e=e.parentNode}}},true)})(jQuery,window,document);
+(function(a,e,b){function d(b,c,d){var f=d.type;d.type=c;a.event.handle.call(b,d);d.type=f}a.each("touchstart touchmove touchend orientationchange throttledresize tap taphold swipe swipeleft swiperight scrollstart scrollstop".split(" "),function(b,c){a.fn[c]=function(a){return a?this.bind(c,a):this.trigger(c)};a.attrFn[c]=true});var f=a.support.touch,c=f?"touchstart":"mousedown",h=f?"touchend":"mouseup",g=f?"touchmove":"mousemove";a.event.special.scrollstart={enabled:true,setup:function(){function b(a,
+e){f=e;d(c,f?"scrollstart":"scrollstop",a)}var c=this,f,e;a(c).bind("touchmove scroll",function(c){a.event.special.scrollstart.enabled&&(f||b(c,true),clearTimeout(e),e=setTimeout(function(){b(c,false)},50))})}};a.event.special.tap={setup:function(){var b=this,c=a(b);c.bind("vmousedown",function(f){function e(){clearTimeout(p)}function h(){e();c.unbind("vclick",g).unbind("vmouseup",e).unbind("vmousecancel",h)}function g(a){h();j==a.target&&d(b,"tap",a)}if(f.which&&f.which!==1)return false;var j=f.target,
+p;c.bind("vmousecancel",h).bind("vmouseup",e).bind("vclick",g);p=setTimeout(function(){d(b,"taphold",a.Event("taphold"))},750)})}};a.event.special.swipe={scrollSupressionThreshold:10,durationThreshold:1E3,horizontalDistanceThreshold:30,verticalDistanceThreshold:75,setup:function(){var d=a(this);d.bind(c,function(c){function f(b){if(n){var c=b.originalEvent.touches?b.originalEvent.touches[0]:b;q={time:(new Date).getTime(),coords:[c.pageX,c.pageY]};Math.abs(n.coords[0]-q.coords[0])>a.event.special.swipe.scrollSupressionThreshold&&
+b.preventDefault()}}var e=c.originalEvent.touches?c.originalEvent.touches[0]:c,n={time:(new Date).getTime(),coords:[e.pageX,e.pageY],origin:a(c.target)},q;d.bind(g,f).one(h,function(){d.unbind(g,f);n&&q&&q.time-n.time<a.event.special.swipe.durationThreshold&&Math.abs(n.coords[0]-q.coords[0])>a.event.special.swipe.horizontalDistanceThreshold&&Math.abs(n.coords[1]-q.coords[1])<a.event.special.swipe.verticalDistanceThreshold&&n.origin.trigger("swipe").trigger(n.coords[0]>q.coords[0]?"swipeleft":"swiperight");
+n=q=b})})}};(function(a,b){function c(){var a=f();a!==e&&(e=a,d.trigger("orientationchange"))}var d=a(b),f,e,h,g,m={0:true,180:true};if(a.support.orientation&&(h=a.mobile.media("all and (orientation: landscape)"),g=m[b.orientation],h&&g||!h&&!g))m={"-90":true,90:true};a.event.special.orientationchange={setup:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;e=f();d.bind("throttledresize",c)},teardown:function(){if(a.support.orientation&&a.mobile.orientationChangeEnabled)return false;
+d.unbind("throttledresize",c)},add:function(a){var b=a.handler;a.handler=function(a){a.orientation=f();return b.apply(this,arguments)}}};a.event.special.orientationchange.orientation=f=function(){var c=true,c=document.documentElement;return(c=a.support.orientation?m[b.orientation]:c&&c.clientWidth/c.clientHeight<1.1)?"portrait":"landscape"}})(jQuery,e);(function(){a.event.special.throttledresize={setup:function(){a(this).bind("resize",b)},teardown:function(){a(this).unbind("resize",b)}};var b=function(){f=
+(new Date).getTime();e=f-c;e>=250?(c=f,a(this).trigger("throttledresize")):(d&&clearTimeout(d),d=setTimeout(b,250-e))},c=0,d,f,e})();a.each({scrollstop:"scrollstart",taphold:"tap",swipeleft:"swipe",swiperight:"swipe"},function(b,c){a.event.special[b]={setup:function(){a(this).bind(c,a.noop)}}})})(jQuery,this);
+(function(a,e,b){function d(a){a=a||location.href;return"#"+a.replace(/^[^#]*#?(.*)$/,"$1")}var f="hashchange",c=document,h,g=a.event.special,i=c.documentMode,l="on"+f in e&&(i===b||i>7);a.fn[f]=function(a){return a?this.bind(f,a):this.trigger(f)};a.fn[f].delay=50;g[f]=a.extend(g[f],{setup:function(){if(l)return false;a(h.start)},teardown:function(){if(l)return false;a(h.stop)}});h=function(){function h(){var b=d(),c=m(q);if(b!==q)p(q=b,c),a(e).trigger(f);else if(c!==q)location.href=location.href.replace(/#.*/,
+"")+c;i=setTimeout(h,a.fn[f].delay)}var g={},i,q=d(),j=function(a){return a},p=j,m=j;g.start=function(){i||h()};g.stop=function(){i&&clearTimeout(i);i=b};a.browser.msie&&!l&&function(){var b,e;g.start=function(){if(!b)e=(e=a.fn[f].src)&&e+d(),b=a('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){e||p(d());h()}).attr("src",e||"javascript:0").insertAfter("body")[0].contentWindow,c.onpropertychange=function(){try{if(event.propertyName==="title")b.document.title=c.title}catch(a){}}};
+g.stop=j;m=function(){return d(b.location.href)};p=function(d,e){var h=b.document,g=a.fn[f].domain;if(d!==e)h.title=c.title,h.open(),g&&h.write('<script>document.domain="'+g+'"<\/script>'),h.close(),b.location.hash=d}}();return g}()})(jQuery,this);
+(function(a){a.widget("mobile.page",a.mobile.widget,{options:{theme:"c",domCache:false,keepNativeDefault:":jqmData(role='none'), :jqmData(role='nojs')"},_create:function(){this._trigger("beforecreate");this.element.attr("tabindex","0").addClass("ui-page ui-body-"+this.options.theme)},keepNativeSelector:function(){var e=this.options;return e.keepNative&&a.trim(e.keepNative)&&e.keepNative!==e.keepNativeDefault?[e.keepNative,e.keepNativeDefault].join(", "):e.keepNativeDefault}})})(jQuery);
+(function(a,e){var b={};a.extend(a.mobile,{ns:"",subPageUrlKey:"ui-page",activePageClass:"ui-page-active",activeBtnClass:"ui-btn-active",ajaxEnabled:true,hashListeningEnabled:true,linkBindingEnabled:true,defaultPageTransition:"slide",minScrollBack:250,defaultDialogTransition:"pop",loadingMessage:"loading",pageLoadErrorMessage:"Error Loading Page",autoInitializePage:true,pushStateEnabled:true,orientationChangeEnabled:true,gradeA:function(){return a.support.mediaquery||a.mobile.browser.ie&&a.mobile.browser.ie>=
+7},keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},silentScroll:function(b){if(a.type(b)!=="number")b=a.mobile.defaultHomeScroll;a.event.special.scrollstart.enabled=false;
+setTimeout(function(){e.scrollTo(0,b);a(document).trigger("silentscroll",{x:0,y:b})},20);setTimeout(function(){a.event.special.scrollstart.enabled=true},150)},nsNormalizeDict:b,nsNormalize:function(c){return!c?void 0:b[c]||(b[c]=a.camelCase(a.mobile.ns+c))},getInheritedTheme:function(a,b){for(var d=a[0],f="",e=/ui-(bar|body)-([a-z])\b/,k,o;d;){k=d.className||"";if((o=e.exec(k))&&(f=o[2]))break;d=d.parentNode}return f||b||"a"},closestPageData:function(a){return a.closest(':jqmData(role="page"), :jqmData(role="dialog")').data("page")}});
+a.fn.jqmData=function(b,d){var f;typeof b!="undefined"&&(f=this.data(b?a.mobile.nsNormalize(b):b,d));return f};a.jqmData=function(b,d,f){var e;typeof d!="undefined"&&(e=a.data(b,d?a.mobile.nsNormalize(d):d,f));return e};a.fn.jqmRemoveData=function(b){return this.removeData(a.mobile.nsNormalize(b))};a.jqmRemoveData=function(b,d){return a.removeData(b,a.mobile.nsNormalize(d))};a.fn.removeWithDependents=function(){a.removeWithDependents(this)};a.removeWithDependents=function(b){b=a(b);(b.jqmData("dependents")||
+a()).remove();b.remove()};a.fn.addDependents=function(b){a.addDependents(a(this),b)};a.addDependents=function(b,d){var f=a(b).jqmData("dependents")||a();a(b).jqmData("dependents",a.merge(f,d))};a.fn.getEncodedText=function(){return a("<div/>").text(a(this).text()).html()};var d=a.find,f=/:jqmData\(([^)]*)\)/g;a.find=function(b,e,g,i){b=b.replace(f,"[data-"+(a.mobile.ns||"")+"$1]");return d.call(this,b,e,g,i)};a.extend(a.find,d);a.find.matches=function(b,d){return a.find(b,null,null,d)};a.find.matchesSelector=
+function(b,d){return a.find(d,null,null,[b]).length>0}})(jQuery,this);
+(function(a,e){function b(a){var b=a.find(".ui-title:eq(0)");b.length?b.focus():a.focus()}function d(b){p&&(!p.closest(".ui-page-active").length||b)&&p.removeClass(a.mobile.activeBtnClass);p=null}function f(){z=false;A.length>0&&a.mobile.changePage.apply(null,A.pop())}function c(c,d,f,e){var g=a.mobile.urlHistory.getActive(),j=a.support.touchOverflow&&a.mobile.touchOverflowEnabled,i=g.lastScroll||(j?0:a.mobile.defaultHomeScroll),g=h();window.scrollTo(0,a.mobile.defaultHomeScroll);d&&d.data("page")._trigger("beforehide",
+null,{nextPage:c});j||c.height(g+i);c.data("page")._trigger("beforeshow",null,{prevPage:d||a("")});a.mobile.hidePageLoadingMsg();j&&i&&(c.addClass("ui-mobile-pre-transition"),b(c),c.is(".ui-native-fixed")?c.find(".ui-content").scrollTop(i):c.scrollTop(i));f=(a.mobile.transitionHandlers[f||"none"]||a.mobile.defaultTransitionHandler)(f,e,c,d);f.done(function(){j||(c.height(""),b(c));j||a.mobile.silentScroll(i);d&&(j||d.height(""),d.data("page")._trigger("hide",null,{nextPage:c}));c.data("page")._trigger("show",
+null,{prevPage:d||a("")})});return f}function h(){var b=a.event.special.orientationchange.orientation()==="portrait",c=b?screen.availHeight:screen.availWidth,b=Math.max(b?480:320,a(window).height());return Math.min(c,b)}function g(){(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)&&a("."+a.mobile.activePageClass).css("min-height",h())}function i(b,c){c&&b.attr("data-"+a.mobile.ns+"role",c);b.page()}function l(a){for(;a;){if(typeof a.nodeName==="string"&&a.nodeName.toLowerCase()=="a")break;
+a=a.parentNode}return a}function k(b){var b=a(b).closest(".ui-page").jqmData("url"),c=s.hrefNoHash;if(!b||!j.isPath(b))b=c;return j.makeUrlAbsolute(b,c)}var o=a(window),n=a("html"),q=a("head"),j={urlParseRE:/^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,parseUrl:function(b){if(a.type(b)==="object")return b;b=j.urlParseRE.exec(b||"")||[];return{href:b[0]||"",hrefNoHash:b[1]||
+"",hrefNoSearch:b[2]||"",domain:b[3]||"",protocol:b[4]||"",doubleSlash:b[5]||"",authority:b[6]||"",username:b[8]||"",password:b[9]||"",host:b[10]||"",hostname:b[11]||"",port:b[12]||"",pathname:b[13]||"",directory:b[14]||"",filename:b[15]||"",search:b[16]||"",hash:b[17]||""}},makePathAbsolute:function(a,b){if(a&&a.charAt(0)==="/")return a;for(var a=a||"",c=(b=b?b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"")?b.split("/"):[],d=a.split("/"),f=0;f<d.length;f++){var e=d[f];switch(e){case ".":break;case "..":c.length&&
+c.pop();break;default:c.push(e)}}return"/"+c.join("/")},isSameDomain:function(a,b){return j.parseUrl(a).domain===j.parseUrl(b).domain},isRelativeUrl:function(a){return j.parseUrl(a).protocol===""},isAbsoluteUrl:function(a){return j.parseUrl(a).protocol!==""},makeUrlAbsolute:function(a,b){if(!j.isRelativeUrl(a))return a;var c=j.parseUrl(a),d=j.parseUrl(b),f=c.protocol||d.protocol,e=c.protocol?c.doubleSlash:c.doubleSlash||d.doubleSlash,h=c.authority||d.authority,g=c.pathname!=="",i=j.makePathAbsolute(c.pathname||
+d.filename,d.pathname);return f+e+h+i+(c.search||!g&&d.search||"")+c.hash},addSearchParams:function(b,c){var d=j.parseUrl(b),f=typeof c==="object"?a.param(c):c,e=d.search||"?";return d.hrefNoSearch+e+(e.charAt(e.length-1)!=="?"?"&":"")+f+(d.hash||"")},convertUrlToDataUrl:function(a){var b=j.parseUrl(a);if(j.isEmbeddedPage(b))return b.hash.split(t)[0].replace(/^#/,"");else if(j.isSameDomain(b,s))return b.hrefNoHash.replace(s.domain,"");return a},get:function(a){if(a===e)a=location.hash;return j.stripHash(a).replace(/[^\/]*\.[^\/*]+$/,
+"")},getFilePath:function(b){var c="&"+a.mobile.subPageUrlKey;return b&&b.split(c)[0].split(t)[0]},set:function(a){location.hash=a},isPath:function(a){return/\//.test(a)},clean:function(a){return a.replace(s.domain,"")},stripHash:function(a){return a.replace(/^#/,"")},cleanHash:function(a){return j.stripHash(a.replace(/\?.*$/,"").replace(t,""))},isExternal:function(a){a=j.parseUrl(a);return a.protocol&&a.domain!==v.domain?true:false},hasProtocol:function(a){return/^(:?\w+:)/.test(a)},isFirstPageUrl:function(b){var b=
+j.parseUrl(j.makeUrlAbsolute(b,s)),c=a.mobile.firstPage,c=c&&c[0]?c[0].id:e;return(b.hrefNoHash===v.hrefNoHash||x&&b.hrefNoHash===s.hrefNoHash)&&(!b.hash||b.hash==="#"||c&&b.hash.replace(/^#/,"")===c)},isEmbeddedPage:function(a){a=j.parseUrl(a);return a.protocol!==""?a.hash&&(a.hrefNoHash===v.hrefNoHash||x&&a.hrefNoHash===s.hrefNoHash):/^#/.test(a.href)},isPermittedCrossDomainRequest:function(b,c){return a.mobile.allowCrossDomainPages&&b.protocol==="file:"&&c.search(/^https?:/)!=-1}},p=null,m={stack:[],
+activeIndex:0,getActive:function(){return m.stack[m.activeIndex]},getPrev:function(){return m.stack[m.activeIndex-1]},getNext:function(){return m.stack[m.activeIndex+1]},addNew:function(a,b,c,d,f){m.getNext()&&m.clearForward();m.stack.push({url:a,transition:b,title:c,pageUrl:d,role:f});m.activeIndex=m.stack.length-1},clearForward:function(){m.stack=m.stack.slice(0,m.activeIndex+1)},directHashChange:function(b){var c,d,f;this.getActive();a.each(m.stack,function(a,e){b.currentUrl===e.url&&(c=a<m.activeIndex,
+d=!c,f=a)});this.activeIndex=f!==e?f:this.activeIndex;c?(b.either||b.isBack)(true):d&&(b.either||b.isForward)(false)},ignoreNextHashChange:false},A=[],z=false,t="&ui-state=dialog",w=q.children("base"),v=j.parseUrl(location.href),s=w.length?j.parseUrl(j.makeUrlAbsolute(w.attr("href"),v.href)):v,x=v.hrefNoHash!==s.hrefNoHash,u=a.support.dynamicBaseTag?{element:w.length?w:a("<base>",{href:s.hrefNoHash}).prependTo(q),set:function(a){u.element.attr("href",j.makeUrlAbsolute(a,s))},reset:function(){u.element.attr("href",
+s.hrefNoHash)}}:e,C=true,y,E,B;y=function(){var b=o;a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(b=a(".ui-page-active"),b=b.is(".ui-native-fixed")?b.find(".ui-content"):b);return b};E=function(b){if(C){var c=a.mobile.urlHistory.getActive();if(c)b=b&&b.scrollTop(),c.lastScroll=b<a.mobile.minScrollBack?a.mobile.defaultHomeScroll:b}};B=function(){setTimeout(E,100,a(this))};o.bind(a.support.pushState?"popstate":"hashchange",function(){C=false});o.one(a.support.pushState?"popstate":"hashchange",
+function(){C=true});o.one("pagecontainercreate",function(){a.mobile.pageContainer.bind("pagechange",function(){var a=y();C=true;a.unbind("scrollstop",B);a.bind("scrollstop",B)})});y().bind("scrollstop",B);a.mobile.getScreenHeight=h;a.fn.animationComplete=function(b){return a.support.cssTransitions?a(this).one("webkitAnimationEnd",b):(setTimeout(b,0),a(this))};a.mobile.path=j;a.mobile.base=u;a.mobile.urlHistory=m;a.mobile.dialogHashKey=t;a.mobile.noneTransitionHandler=function(b,c,d,f){f&&f.removeClass(a.mobile.activePageClass);
+d.addClass(a.mobile.activePageClass);return a.Deferred().resolve(b,c,d,f).promise()};a.mobile.defaultTransitionHandler=a.mobile.noneTransitionHandler;a.mobile.transitionHandlers={none:a.mobile.defaultTransitionHandler};a.mobile.allowCrossDomainPages=false;a.mobile.getDocumentUrl=function(b){return b?a.extend({},v):v.href};a.mobile.getDocumentBase=function(b){return b?a.extend({},s):s.href};a.mobile._bindPageRemove=function(){var b=a(this);!b.data("page").options.domCache&&b.is(":jqmData(external-page='true')")&&
+b.bind("pagehide.remove",function(){var b=a(this),c=new a.Event("pageremove");b.trigger(c);c.isDefaultPrevented()||b.removeWithDependents()})};a.mobile.loadPage=function(b,c){var d=a.Deferred(),f=a.extend({},a.mobile.loadPage.defaults,c),h=null,g=null,n=j.makeUrlAbsolute(b,a.mobile.activePage&&k(a.mobile.activePage)||s.hrefNoHash);if(f.data&&f.type==="get")n=j.addSearchParams(n,f.data),f.data=e;if(f.data&&f.type==="post")f.reloadPage=true;var t=j.getFilePath(n),m=j.convertUrlToDataUrl(n);f.pageContainer=
+f.pageContainer||a.mobile.pageContainer;h=f.pageContainer.children(":jqmData(url='"+m+"')");h.length===0&&m&&!j.isPath(m)&&(h=f.pageContainer.children("#"+m).attr("data-"+a.mobile.ns+"url",m));if(h.length===0)if(a.mobile.firstPage&&j.isFirstPageUrl(t))a.mobile.firstPage.parent().length&&(h=a(a.mobile.firstPage));else if(j.isEmbeddedPage(t))return d.reject(n,c),d.promise();u&&u.reset();if(h.length){if(!f.reloadPage)return i(h,f.role),d.resolve(n,c,h),d.promise();g=h}var q=f.pageContainer,l=new a.Event("pagebeforeload"),
+p={url:b,absUrl:n,dataUrl:m,deferred:d,options:f};q.trigger(l,p);if(l.isDefaultPrevented())return d.promise();if(f.showLoadMsg)var w=setTimeout(function(){a.mobile.showPageLoadingMsg()},f.loadMsgDelay);!a.mobile.allowCrossDomainPages&&!j.isSameDomain(v,n)?d.reject(n,c):a.ajax({url:t,type:f.type,data:f.data,dataType:"html",success:function(e,q,k){var l=a("<div></div>"),o=e.match(/<title[^>]*>([^<]*)/)&&RegExp.$1,s=RegExp("\\bdata-"+a.mobile.ns+"url=[\"']?([^\"'>]*)[\"']?");RegExp("(<[^>]+\\bdata-"+
+a.mobile.ns+"role=[\"']?page[\"']?[^>]*>)").test(e)&&RegExp.$1&&s.test(RegExp.$1)&&RegExp.$1&&(b=t=j.getFilePath(RegExp.$1));u&&u.set(t);l.get(0).innerHTML=e;h=l.find(":jqmData(role='page'), :jqmData(role='dialog')").first();h.length||(h=a("<div data-"+a.mobile.ns+"role='page'>"+e.split(/<\/?body[^>]*>/gmi)[1]+"</div>"));o&&!h.jqmData("title")&&(~o.indexOf("&")&&(o=a("<div>"+o+"</div>").text()),h.jqmData("title",o));if(!a.support.dynamicBaseTag){var v=j.get(t);h.find("[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]").each(function(){var b=
+a(this).is("[href]")?"href":a(this).is("[src]")?"src":"action",c=a(this).attr(b),c=c.replace(location.protocol+"//"+location.host+location.pathname,"");/^(\w+:|#|\/)/.test(c)||a(this).attr(b,v+c)})}h.attr("data-"+a.mobile.ns+"url",j.convertUrlToDataUrl(t)).attr("data-"+a.mobile.ns+"external-page",true).appendTo(f.pageContainer);h.one("pagecreate",a.mobile._bindPageRemove);i(h,f.role);n.indexOf("&"+a.mobile.subPageUrlKey)>-1&&(h=f.pageContainer.children(":jqmData(url='"+m+"')"));f.showLoadMsg&&(clearTimeout(w),
+a.mobile.hidePageLoadingMsg());p.xhr=k;p.textStatus=q;p.page=h;f.pageContainer.trigger("pageload",p);d.resolve(n,c,h,g)},error:function(b,e,h){u&&u.set(j.get());p.xhr=b;p.textStatus=e;p.errorThrown=h;b=new a.Event("pageloadfailed");f.pageContainer.trigger(b,p);b.isDefaultPrevented()||(f.showLoadMsg&&(clearTimeout(w),a.mobile.hidePageLoadingMsg(),a("<div class='ui-loader ui-overlay-shadow ui-body-e ui-corner-all'><h1>"+a.mobile.pageLoadErrorMessage+"</h1></div>").css({display:"block",opacity:0.96,
+top:o.scrollTop()+100}).appendTo(f.pageContainer).delay(800).fadeOut(400,function(){a(this).remove()})),d.reject(n,c))}});return d.promise()};a.mobile.loadPage.defaults={type:"get",data:e,reloadPage:false,role:e,showLoadMsg:false,pageContainer:e,loadMsgDelay:50};a.mobile.changePage=function(b,h){if(z)A.unshift(arguments);else{var g=a.extend({},a.mobile.changePage.defaults,h);g.pageContainer=g.pageContainer||a.mobile.pageContainer;g.fromPage=g.fromPage||a.mobile.activePage;var q=g.pageContainer,l=
+new a.Event("pagebeforechange"),k={toPage:b,options:g};q.trigger(l,k);if(!l.isDefaultPrevented())if(b=k.toPage,z=true,typeof b=="string")a.mobile.loadPage(b,g).done(function(b,c,d,f){z=false;c.duplicateCachedPage=f;a.mobile.changePage(d,c)}).fail(function(){z=false;d(true);f();g.pageContainer.trigger("pagechangefailed",k)});else{if(b[0]===a.mobile.firstPage[0]&&!g.dataUrl)g.dataUrl=v.hrefNoHash;var l=g.fromPage,p=g.dataUrl&&j.convertUrlToDataUrl(g.dataUrl)||b.jqmData("url"),o=p;j.getFilePath(p);var s=
+m.getActive(),w=m.activeIndex===0,x=0,u=document.title,y=g.role==="dialog"||b.jqmData("role")==="dialog";if(l&&l[0]===b[0]&&!g.allowSamePageTransition)z=false,q.trigger("pagechange",k);else{i(b,g.role);g.fromHashChange&&m.directHashChange({currentUrl:p,isBack:function(){x=-1},isForward:function(){x=1}});try{document.activeElement&&document.activeElement.nodeName.toLowerCase()!="body"?a(document.activeElement).blur():a("input:focus, textarea:focus, select:focus").blur()}catch(C){}y&&s&&(p=(s.url||
+"")+t);if(g.changeHash!==false&&p)m.ignoreNextHashChange=true,j.set(p);var B=!s?u:b.jqmData("title")||b.children(":jqmData(role='header')").find(".ui-title").getEncodedText();B&&u==document.title&&(u=B);b.jqmData("title")||b.jqmData("title",u);g.transition=g.transition||(x&&!w?s.transition:e)||(y?a.mobile.defaultDialogTransition:a.mobile.defaultPageTransition);x||m.addNew(p,g.transition,u,o,g.role);document.title=m.getActive().title;a.mobile.activePage=b;g.reverse=g.reverse||x<0;c(b,l,g.transition,
+g.reverse).done(function(){d();g.duplicateCachedPage&&g.duplicateCachedPage.remove();n.removeClass("ui-mobile-rendering");f();q.trigger("pagechange",k)})}}}};a.mobile.changePage.defaults={transition:e,reverse:false,changeHash:true,fromHashChange:false,role:e,duplicateCachedPage:e,pageContainer:e,showLoadMsg:true,dataUrl:e,fromPage:e,allowSamePageTransition:false};a.mobile._registerInternalEvents=function(){a(document).delegate("form","submit",function(b){var c=a(this);if(a.mobile.ajaxEnabled&&!c.is(":jqmData(ajax='false')")){var d=
+c.attr("method"),f=c.attr("target"),e=c.attr("action");if(!e&&(e=k(c),e===s.hrefNoHash))e=v.hrefNoSearch;e=j.makeUrlAbsolute(e,k(c));j.isExternal(e)&&!j.isPermittedCrossDomainRequest(v,e)||f||(a.mobile.changePage(e,{type:d&&d.length&&d.toLowerCase()||"get",data:c.serialize(),transition:c.jqmData("transition"),direction:c.jqmData("direction"),reloadPage:true}),b.preventDefault())}});a(document).bind("vclick",function(b){if(!(b.which>1)&&a.mobile.linkBindingEnabled&&(b=l(b.target))&&j.parseUrl(b.getAttribute("href")||
+"#").hash!=="#")d(true),p=a(b).closest(".ui-btn").not(".ui-disabled"),p.addClass(a.mobile.activeBtnClass),a("."+a.mobile.activePageClass+" .ui-btn").not(b).blur()});a(document).bind("click",function(b){if(a.mobile.linkBindingEnabled){var c=l(b.target);if(c&&!(b.which>1)){var f=a(c),h=function(){window.setTimeout(function(){d(true)},200)};if(f.is(":jqmData(rel='back')"))return window.history.back(),false;var g=k(f),c=j.makeUrlAbsolute(f.attr("href")||"#",g);if(!a.mobile.ajaxEnabled&&!j.isEmbeddedPage(c))h();
+else{if(c.search("#")!=-1)if(c=c.replace(/[^#]*#/,""))c=j.isPath(c)?j.makeUrlAbsolute(c,g):j.makeUrlAbsolute("#"+c,v.hrefNoHash);else{b.preventDefault();return}f.is("[rel='external']")||f.is(":jqmData(ajax='false')")||f.is("[target]")||j.isExternal(c)&&!j.isPermittedCrossDomainRequest(v,c)?h():(h=f.jqmData("transition"),g=(g=f.jqmData("direction"))&&g==="reverse"||f.jqmData("back"),f=f.attr("data-"+a.mobile.ns+"rel")||e,a.mobile.changePage(c,{transition:h,reverse:g,role:f}),b.preventDefault())}}}});
+a(document).delegate(".ui-page","pageshow.prefetch",function(){var b=[];a(this).find("a:jqmData(prefetch)").each(function(){var c=a(this),f=c.attr("href");f&&a.inArray(f,b)===-1&&(b.push(f),a.mobile.loadPage(f,{role:c.attr("data-"+a.mobile.ns+"rel")}))})});a.mobile._handleHashChange=function(b){var c=j.stripHash(b),f={transition:a.mobile.urlHistory.stack.length===0?"none":e,changeHash:false,fromHashChange:true};if(!a.mobile.hashListeningEnabled||m.ignoreNextHashChange)m.ignoreNextHashChange=false;
+else{if(m.stack.length>1&&c.indexOf(t)>-1)if(a.mobile.activePage.is(".ui-dialog"))m.directHashChange({currentUrl:c,either:function(b){var d=a.mobile.urlHistory.getActive();c=d.pageUrl;a.extend(f,{role:d.role,transition:d.transition,reverse:b})}});else{m.directHashChange({currentUrl:c,isBack:function(){window.history.back()},isForward:function(){window.history.forward()}});return}c?(c=typeof c==="string"&&!j.isPath(c)?j.makeUrlAbsolute("#"+c,s):c,a.mobile.changePage(c,f)):a.mobile.changePage(a.mobile.firstPage,
+f)}};o.bind("hashchange",function(){a.mobile._handleHashChange(location.hash)});a(document).bind("pageshow",g);a(window).bind("throttledresize",g)}})(jQuery);
+(function(a,e){var b={},d=a(e),f=a.mobile.path.parseUrl(location.href);a.extend(b,{initialFilePath:f.pathname+f.search,initialHref:f.hrefNoHash,hashchangeFired:false,state:function(){return{hash:location.hash||"#"+b.initialFilePath,title:document.title,initialHref:b.initialHref}},resetUIKeys:function(b){var f="&"+a.mobile.subPageUrlKey,d=b.indexOf(a.mobile.dialogHashKey);d>-1?b=b.slice(0,d)+"#"+b.slice(d):b.indexOf(f)>-1&&(b=b.split(f).join("#"+f));return b},nextHashChangePrevented:function(c){a.mobile.urlHistory.ignoreNextHashChange=
+c;b.onHashChangeDisabled=c},onHashChange:function(){if(!b.onHashChangeDisabled){var c,f;c=location.hash;var d=a.mobile.path.isPath(c),e=d?location.href:a.mobile.getDocumentUrl();c=d?c.replace("#",""):c;f=b.state();c=a.mobile.path.makeUrlAbsolute(c,e);d&&(c=b.resetUIKeys(c));history.replaceState(f,document.title,c)}},onPopState:function(c){var f=c.originalEvent.state;f&&(b.nextHashChangePrevented(true),setTimeout(function(){b.nextHashChangePrevented(false);a.mobile._handleHashChange(f.hash)},100))},
+init:function(){d.bind("hashchange",b.onHashChange);d.bind("popstate",b.onPopState);location.hash===""&&history.replaceState(b.state(),document.title,location.href)}});a(function(){a.mobile.pushStateEnabled&&a.support.pushState&&b.init()})})(jQuery,this);
+(function(a){function e(b,d,f,c){var e=new a.Deferred,g=d?" reverse":"",i="ui-mobile-viewport-transitioning viewport-"+b;f.animationComplete(function(){f.add(c).removeClass("out in reverse "+b);c&&c[0]!==f[0]&&c.removeClass(a.mobile.activePageClass);f.parent().removeClass(i);e.resolve(b,d,f,c)});f.parent().addClass(i);c&&c.addClass(b+" out"+g);f.addClass(a.mobile.activePageClass+" "+b+" in"+g);return e.promise()}a.mobile.css3TransitionHandler=e;if(a.mobile.defaultTransitionHandler===a.mobile.noneTransitionHandler)a.mobile.defaultTransitionHandler=
+e})(jQuery,this);
+(function(a){a.mobile.page.prototype.options.degradeInputs={color:false,date:false,datetime:false,"datetime-local":false,email:false,month:false,number:false,range:"number",search:"text",tel:false,time:false,url:false,week:false};a(document).bind("pagecreate create",function(e){var b=a.mobile.closestPageData(a(e.target));if(b)options=b.options,a(e.target).find("input").not(b.keepNativeSelector()).each(function(){var b=a(this),f=this.getAttribute("type"),c=options.degradeInputs[f]||"text";if(options.degradeInputs[f]){var e=
+a("<div>").html(b.clone()).html(),g=e.indexOf(" type=")>-1;b.replaceWith(e.replace(g?/\s+type=["']?\w+['"]?/:/\/?>/,' type="'+c+'" data-'+a.mobile.ns+'type="'+f+'"'+(g?"":">")))}})})})(jQuery);
+(function(a,e){a.widget("mobile.dialog",a.mobile.widget,{options:{closeBtnText:"Close",overlayTheme:"a",initSelector:":jqmData(role='dialog')"},_create:function(){var b=this,d=this.element,f=a("<a href='#' data-"+a.mobile.ns+"icon='delete' data-"+a.mobile.ns+"iconpos='notext'>"+this.options.closeBtnText+"</a>");d.addClass("ui-overlay-"+this.options.overlayTheme);d.attr("role","dialog").addClass("ui-dialog").find(":jqmData(role='header')").addClass("ui-corner-top ui-overlay-shadow").prepend(f).end().find(":jqmData(role='content'),:jqmData(role='footer')").addClass("ui-overlay-shadow").last().addClass("ui-corner-bottom");
+f.bind("click",function(){b.close()});d.bind("vclick submit",function(b){var b=a(b.target).closest(b.type==="vclick"?"a":"form"),f;b.length&&!b.jqmData("transition")&&(f=a.mobile.urlHistory.getActive()||{},b.attr("data-"+a.mobile.ns+"transition",f.transition||a.mobile.defaultDialogTransition).attr("data-"+a.mobile.ns+"direction","reverse"))}).bind("pagehide",function(){a(this).find("."+a.mobile.activeBtnClass).removeClass(a.mobile.activeBtnClass)})},close:function(){e.history.back()}});a(document).delegate(a.mobile.dialog.prototype.options.initSelector,
+"pagecreate",function(){a(this).dialog()})})(jQuery,this);
+(function(a){a.mobile.page.prototype.options.backBtnText="Back";a.mobile.page.prototype.options.addBackBtn=false;a.mobile.page.prototype.options.backBtnTheme=null;a.mobile.page.prototype.options.headerTheme="a";a.mobile.page.prototype.options.footerTheme="a";a.mobile.page.prototype.options.contentTheme=null;a(document).delegate(":jqmData(role='page'), :jqmData(role='dialog')","pagecreate",function(){var e=a(this),b=e.data("page").options,d=e.jqmData("role"),f=b.theme;a(":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')",
+this).each(function(){var c=a(this),e=c.jqmData("role"),g=c.jqmData("theme"),i=g||b.contentTheme||d==="dialog"&&f,l;c.addClass("ui-"+e);if(e==="header"||e==="footer"){var k=g||(e==="header"?b.headerTheme:b.footerTheme)||f;c.addClass("ui-bar-"+k).attr("role",e==="header"?"banner":"contentinfo");g=c.children("a");i=g.hasClass("ui-btn-left");l=g.hasClass("ui-btn-right");i=i||g.eq(0).not(".ui-btn-right").addClass("ui-btn-left").length;l||g.eq(1).addClass("ui-btn-right");b.addBackBtn&&e==="header"&&a(".ui-page").length>
+1&&c.jqmData("url")!==a.mobile.path.stripHash(location.hash)&&!i&&a("<a href='#' class='ui-btn-left' data-"+a.mobile.ns+"rel='back' data-"+a.mobile.ns+"icon='arrow-l'>"+b.backBtnText+"</a>").attr("data-"+a.mobile.ns+"theme",b.backBtnTheme||k).prependTo(c);c.children("h1, h2, h3, h4, h5, h6").addClass("ui-title").attr({tabindex:"0",role:"heading","aria-level":"1"})}else e==="content"&&(i&&c.addClass("ui-body-"+i),c.attr("role","main"))})})})(jQuery);
+(function(a){a.widget("mobile.collapsible",a.mobile.widget,{options:{expandCueText:" click to expand contents",collapseCueText:" click to collapse contents",collapsed:true,heading:"h1,h2,h3,h4,h5,h6,legend",theme:null,contentTheme:null,iconTheme:"d",initSelector:":jqmData(role='collapsible')"},_create:function(){var e=this.element,b=this.options,d=e.addClass("ui-collapsible"),f=e.children(b.heading).first(),c=d.wrapInner("<div class='ui-collapsible-content'></div>").find(".ui-collapsible-content"),
+h=e.closest(":jqmData(role='collapsible-set')").addClass("ui-collapsible-set");f.is("legend")&&(f=a("<div role='heading'>"+f.html()+"</div>").insertBefore(f),f.next().remove());if(h.length){if(!b.theme)b.theme=h.jqmData("theme");if(!b.contentTheme)b.contentTheme=h.jqmData("content-theme")}c.addClass(b.contentTheme?"ui-body-"+b.contentTheme:"");f.insertBefore(c).addClass("ui-collapsible-heading").append("<span class='ui-collapsible-heading-status'></span>").wrapInner("<a href='#' class='ui-collapsible-heading-toggle'></a>").find("a").first().buttonMarkup({shadow:false,
+corners:false,iconPos:"left",icon:"plus",theme:b.theme}).add(".ui-btn-inner").addClass("ui-corner-top ui-corner-bottom");d.bind("expand collapse",function(e){if(!e.isDefaultPrevented()){e.preventDefault();var i=a(this),e=e.type==="collapse",l=b.contentTheme;f.toggleClass("ui-collapsible-heading-collapsed",e).find(".ui-collapsible-heading-status").text(e?b.expandCueText:b.collapseCueText).end().find(".ui-icon").toggleClass("ui-icon-minus",!e).toggleClass("ui-icon-plus",e);i.toggleClass("ui-collapsible-collapsed",
+e);c.toggleClass("ui-collapsible-content-collapsed",e).attr("aria-hidden",e);if(l&&(!h.length||d.jqmData("collapsible-last")))f.find("a").first().add(f.find(".ui-btn-inner")).toggleClass("ui-corner-bottom",e),c.toggleClass("ui-corner-bottom",!e);c.trigger("updatelayout")}}).trigger(b.collapsed?"collapse":"expand");f.bind("click",function(a){var b=f.is(".ui-collapsible-heading-collapsed")?"expand":"collapse";d.trigger(b);a.preventDefault()})}});a(document).bind("pagecreate create",function(e){a(a.mobile.collapsible.prototype.options.initSelector,
+e.target).collapsible()})})(jQuery);
+(function(a){a.widget("mobile.collapsibleset",a.mobile.widget,{options:{initSelector:":jqmData(role='collapsible-set')"},_create:function(){var e=this.element.addClass("ui-collapsible-set"),b=this.options,d=e.children(":jqmData(role='collapsible')");if(!b.theme)b.theme=e.jqmData("theme");if(!b.contentTheme)b.contentTheme=e.jqmData("content-theme");e.jqmData("collapsiblebound")||(e.jqmData("collapsiblebound",true).bind("expand collapse",function(b){var c=b.type==="collapse",b=a(b.target).closest(".ui-collapsible"),
+d=b.data("collapsible");d.options.contentTheme&&b.jqmData("collapsible-last")&&(b.find(d.options.heading).first().find("a").first().add(".ui-btn-inner").toggleClass("ui-corner-bottom",c),b.find(".ui-collapsible-content").toggleClass("ui-corner-bottom",!c))}).bind("expand",function(b){a(b.target).closest(".ui-collapsible").siblings(".ui-collapsible").trigger("collapse")}),d.each(function(){a(this).find(a.mobile.collapsible.prototype.options.heading).find("a").first().add(".ui-btn-inner").removeClass("ui-corner-top ui-corner-bottom")}),
+d.first().find("a").first().addClass("ui-corner-top").find(".ui-btn-inner").addClass("ui-corner-top"),d.last().jqmData("collapsible-last",true).find("a").first().addClass("ui-corner-bottom").find(".ui-btn-inner").addClass("ui-corner-bottom"))}});a(document).bind("pagecreate create",function(e){a(a.mobile.collapsibleset.prototype.options.initSelector,e.target).collapsibleset()})})(jQuery);
+(function(a){a.fn.fieldcontain=function(){return this.addClass("ui-field-contain ui-body ui-br")};a(document).bind("pagecreate create",function(e){a(":jqmData(role='fieldcontain')",e.target).fieldcontain()})})(jQuery);
+(function(a){a.fn.grid=function(e){return this.each(function(){var b=a(this),d=a.extend({grid:null},e),f=b.children(),c={solo:1,a:2,b:3,c:4,d:5},d=d.grid;if(!d)if(f.length<=5)for(var h in c)c[h]===f.length&&(d=h);else d="a";c=c[d];b.addClass("ui-grid-"+d);f.filter(":nth-child("+c+"n+1)").addClass("ui-block-a");c>1&&f.filter(":nth-child("+c+"n+2)").addClass("ui-block-b");c>2&&f.filter(":nth-child(3n+3)").addClass("ui-block-c");c>3&&f.filter(":nth-child(4n+4)").addClass("ui-block-d");c>4&&f.filter(":nth-child(5n+5)").addClass("ui-block-e")})}})(jQuery);
+(function(a,e){a.widget("mobile.navbar",a.mobile.widget,{options:{iconpos:"top",grid:null,initSelector:":jqmData(role='navbar')"},_create:function(){var b=this.element,d=b.find("a"),f=d.filter(":jqmData(icon)").length?this.options.iconpos:e;b.addClass("ui-navbar").attr("role","navigation").find("ul").grid({grid:this.options.grid});f||b.addClass("ui-navbar-noicons");d.buttonMarkup({corners:false,shadow:false,iconpos:f});b.delegate("a","vclick",function(b){a(b.target).hasClass("ui-disabled")||(d.not(".ui-state-persist").removeClass(a.mobile.activeBtnClass),
+a(this).addClass(a.mobile.activeBtnClass))})}});a(document).bind("pagecreate create",function(b){a(a.mobile.navbar.prototype.options.initSelector,b.target).navbar()})})(jQuery);
+(function(a){var e={};a.widget("mobile.listview",a.mobile.widget,{options:{theme:null,countTheme:"c",headerTheme:"b",dividerTheme:"b",splitIcon:"arrow-r",splitTheme:"b",inset:false,initSelector:":jqmData(role='listview')"},_create:function(){var a=this;a.element.addClass(function(d,f){return f+" ui-listview "+(a.options.inset?" ui-listview-inset ui-corner-all ui-shadow ":"")});a.refresh(true)},_removeCorners:function(a,d){a=a.add(a.find(".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb"));d==="top"?a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl"):
+d==="bottom"?a.removeClass("ui-corner-bottom ui-corner-br ui-corner-bl"):a.removeClass("ui-corner-top ui-corner-tr ui-corner-tl ui-corner-bottom ui-corner-br ui-corner-bl")},_refreshCorners:function(a){var d,f;this.options.inset&&(d=this.element.children("li"),f=a?d.not(".ui-screen-hidden"):d.filter(":visible"),this._removeCorners(d),d=f.first().addClass("ui-corner-top"),d.add(d.find(".ui-btn-inner").not(".ui-li-link-alt span:first-child")).addClass("ui-corner-top").end().find(".ui-li-link-alt, .ui-li-link-alt span:first-child").addClass("ui-corner-tr").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-tl"),
+f=f.last().addClass("ui-corner-bottom"),f.add(f.find(".ui-btn-inner")).find(".ui-li-link-alt").addClass("ui-corner-br").end().find(".ui-li-thumb").not(".ui-li-icon").addClass("ui-corner-bl"));a||this.element.trigger("updatelayout")},_findFirstElementByTagName:function(a,d,f,c){var e={};for(e[f]=e[c]=true;a;){if(e[a.nodeName])return a;a=a[d]}return null},_getChildrenByTagName:function(b,d,f){var c=[],e={};e[d]=e[f]=true;for(b=b.firstChild;b;)e[b.nodeName]&&c.push(b),b=b.nextSibling;return a(c)},_addThumbClasses:function(b){var d,
+f,c=b.length;for(d=0;d<c;d++)f=a(this._findFirstElementByTagName(b[d].firstChild,"nextSibling","img","IMG")),f.length&&(f.addClass("ui-li-thumb"),a(this._findFirstElementByTagName(f[0].parentNode,"parentNode","li","LI")).addClass(f.is(".ui-li-icon")?"ui-li-has-icon":"ui-li-has-thumb"))},refresh:function(b){this.parentPage=this.element.closest(".ui-page");this._createSubPages();var d=this.options,f=this.element,c=f.jqmData("dividertheme")||d.dividerTheme,e=f.jqmData("splittheme"),g=f.jqmData("spliticon"),
+i=this._getChildrenByTagName(f[0],"li","LI"),l=a.support.cssPseudoElement||!a.nodeName(f[0],"ol")?0:1,k={},o,n,q,j,p;l&&f.find(".ui-li-dec").remove();if(!d.theme)d.theme=a.mobile.getInheritedTheme(this.element,"c");for(var m=0,A=i.length;m<A;m++){o=i.eq(m);n="ui-li";if(b||!o.hasClass("ui-li"))q=o.jqmData("theme")||d.theme,j=this._getChildrenByTagName(o[0],"a","A"),j.length?(p=o.jqmData("icon"),o.buttonMarkup({wrapperEls:"div",shadow:false,corners:false,iconpos:"right",icon:j.length>1||p===false?false:
+p||"arrow-r",theme:q}),p!=false&&j.length==1&&o.addClass("ui-li-has-arrow"),j.first().addClass("ui-link-inherit"),j.length>1&&(n+=" ui-li-has-alt",j=j.last(),p=e||j.jqmData("theme")||d.splitTheme,j.appendTo(o).attr("title",j.getEncodedText()).addClass("ui-li-link-alt").empty().buttonMarkup({shadow:false,corners:false,theme:q,icon:false,iconpos:false}).find(".ui-btn-inner").append(a(document.createElement("span")).buttonMarkup({shadow:true,corners:true,theme:p,iconpos:"notext",icon:g||j.jqmData("icon")||
+d.splitIcon})))):o.jqmData("role")==="list-divider"?(n+=" ui-li-divider ui-btn ui-bar-"+c,o.attr("role","heading"),l&&(l=1)):n+=" ui-li-static ui-body-"+q;l&&n.indexOf("ui-li-divider")<0&&(q=o.is(".ui-li-static:first")?o:o.find(".ui-link-inherit"),q.addClass("ui-li-jsnumbering").prepend("<span class='ui-li-dec'>"+l++ +". </span>"));k[n]||(k[n]=[]);k[n].push(o[0])}for(n in k)a(k[n]).addClass(n).children(".ui-btn-inner").addClass(n);f.find("h1, h2, h3, h4, h5, h6").addClass("ui-li-heading").end().find("p, dl").addClass("ui-li-desc").end().find(".ui-li-aside").each(function(){var b=
+a(this);b.prependTo(b.parent())}).end().find(".ui-li-count").each(function(){a(this).closest("li").addClass("ui-li-has-count")}).addClass("ui-btn-up-"+(f.jqmData("counttheme")||this.options.countTheme)+" ui-btn-corner-all");this._addThumbClasses(i);this._addThumbClasses(f.find(".ui-link-inherit"));this._refreshCorners(b)},_idStringEscape:function(a){return a.replace(/[^a-zA-Z0-9]/g,"-")},_createSubPages:function(){var b=this.element,d=b.closest(".ui-page"),f=d.jqmData("url"),c=f||d[0][a.expando],
+h=b.attr("id"),g=this.options,i="data-"+a.mobile.ns,l=this,k=d.find(":jqmData(role='footer')").jqmData("id"),o;typeof e[c]==="undefined"&&(e[c]=-1);h=h||++e[c];a(b.find("li>ul, li>ol").toArray().reverse()).each(function(c){var d=a(this),e=d.attr("id")||h+"-"+c,c=d.parent(),l=a(d.prevAll().toArray().reverse()),l=l.length?l:a("<span>"+a.trim(c.contents()[0].nodeValue)+"</span>"),m=l.first().getEncodedText(),e=(f||"")+"&"+a.mobile.subPageUrlKey+"="+e,A=d.jqmData("theme")||g.theme,z=d.jqmData("counttheme")||
+b.jqmData("counttheme")||g.countTheme;o=true;d.detach().wrap("<div "+i+"role='page' "+i+"url='"+e+"' "+i+"theme='"+A+"' "+i+"count-theme='"+z+"'><div "+i+"role='content'></div></div>").parent().before("<div "+i+"role='header' "+i+"theme='"+g.headerTheme+"'><div class='ui-title'>"+m+"</div></div>").after(k?a("<div "+i+"role='footer' "+i+"id='"+k+"'>"):"").parent().appendTo(a.mobile.pageContainer).page();d=c.find("a:first");d.length||(d=a("<a/>").html(l||m).prependTo(c.empty()));d.attr("href","#"+e)}).listview();
+o&&d.is(":jqmData(external-page='true')")&&d.data("page").options.domCache===false&&d.unbind("pagehide.remove").bind("pagehide.remove",function(b,c){var e=c.nextPage;c.nextPage&&(e=e.jqmData("url"),e.indexOf(f+"&"+a.mobile.subPageUrlKey)!==0&&(l.childPages().remove(),d.remove()))})},childPages:function(){var b=this.parentPage.jqmData("url");return a(":jqmData(url^='"+b+"&"+a.mobile.subPageUrlKey+"')")}});a(document).bind("pagecreate create",function(b){a(a.mobile.listview.prototype.options.initSelector,
+b.target).listview()})})(jQuery);
+(function(a){a.mobile.listview.prototype.options.filter=false;a.mobile.listview.prototype.options.filterPlaceholder="Filter items...";a.mobile.listview.prototype.options.filterTheme="c";a.mobile.listview.prototype.options.filterCallback=function(a,b){return a.toLowerCase().indexOf(b)===-1};a(document).delegate(":jqmData(role='listview')","listviewcreate",function(){var e=a(this),b=e.data("listview");if(b.options.filter){var d=a("<form>",{"class":"ui-listview-filter ui-bar-"+b.options.filterTheme,
+role:"search"});a("<input>",{placeholder:b.options.filterPlaceholder}).attr("data-"+a.mobile.ns+"type","search").jqmData("lastval","").bind("keyup change",function(){var d=a(this),c=this.value.toLowerCase(),h=null,h=d.jqmData("lastval")+"",g=false,i="";d.jqmData("lastval",c);h=c.length<h.length||c.indexOf(h)!==0?e.children():e.children(":not(.ui-screen-hidden)");if(c){for(var l=h.length-1;l>=0;l--)d=a(h[l]),i=d.jqmData("filtertext")||d.text(),d.is("li:jqmData(role=list-divider)")?(d.toggleClass("ui-filter-hidequeue",
+!g),g=false):b.options.filterCallback(i,c)?d.toggleClass("ui-filter-hidequeue",true):g=true;h.filter(":not(.ui-filter-hidequeue)").toggleClass("ui-screen-hidden",false);h.filter(".ui-filter-hidequeue").toggleClass("ui-screen-hidden",true).toggleClass("ui-filter-hidequeue",false)}else h.toggleClass("ui-screen-hidden",false);b._refreshCorners()}).appendTo(d).textinput();a(this).jqmData("inset")&&d.addClass("ui-listview-filter-inset");d.bind("submit",function(){return false}).insertBefore(e)}})})(jQuery);
+(function(a){a(document).bind("pagecreate create",function(e){a(":jqmData(role='nojs')",e.target).addClass("ui-nojs")})})(jQuery);
+(function(a,e){a.widget("mobile.checkboxradio",a.mobile.widget,{options:{theme:null,initSelector:"input[type='checkbox'],input[type='radio']"},_create:function(){var b=this,d=this.element,f=d.closest("form,fieldset,:jqmData(role='page')").find("label").filter("[for='"+d[0].id+"']"),c=d.attr("type"),h=c+"-on",g=c+"-off",i=d.parents(":jqmData(type='horizontal')").length?e:g;if(!(c!=="checkbox"&&c!=="radio")){a.extend(this,{label:f,inputtype:c,checkedClass:"ui-"+h+(i?"":" "+a.mobile.activeBtnClass),
+uncheckedClass:"ui-"+g,checkedicon:"ui-icon-"+h,uncheckedicon:"ui-icon-"+g});if(!this.options.theme)this.options.theme=this.element.jqmData("theme");f.buttonMarkup({theme:this.options.theme,icon:i,shadow:false});d.add(f).wrapAll("<div class='ui-"+c+"'></div>");f.bind({vmouseover:function(b){a(this).parent().is(".ui-disabled")&&b.stopPropagation()},vclick:function(a){if(d.is(":disabled"))a.preventDefault();else return b._cacheVals(),d.prop("checked",c==="radio"&&true||!d.prop("checked")),d.triggerHandler("click"),
+b._getInputSet().not(d).prop("checked",false),b._updateAll(),false}});d.bind({vmousedown:function(){b._cacheVals()},vclick:function(){var c=a(this);c.is(":checked")?(c.prop("checked",true),b._getInputSet().not(c).prop("checked",false)):c.prop("checked",false);b._updateAll()},focus:function(){f.addClass("ui-focus")},blur:function(){f.removeClass("ui-focus")}});this.refresh()}},_cacheVals:function(){this._getInputSet().each(function(){var b=a(this);b.jqmData("cacheVal",b.is(":checked"))})},_getInputSet:function(){return this.inputtype==
+"checkbox"?this.element:this.element.closest("form,fieldset,:jqmData(role='page')").find("input[name='"+this.element.attr("name")+"'][type='"+this.inputtype+"']")},_updateAll:function(){var b=this;this._getInputSet().each(function(){var d=a(this);(d.is(":checked")||b.inputtype==="checkbox")&&d.trigger("change")}).checkboxradio("refresh")},refresh:function(){var b=this.element,d=this.label,f=d.find(".ui-icon");a(b[0]).prop("checked")?(d.addClass(this.checkedClass).removeClass(this.uncheckedClass),
+f.addClass(this.checkedicon).removeClass(this.uncheckedicon)):(d.removeClass(this.checkedClass).addClass(this.uncheckedClass),f.removeClass(this.checkedicon).addClass(this.uncheckedicon));b.is(":disabled")?this.disable():this.enable()},disable:function(){this.element.prop("disabled",true).parent().addClass("ui-disabled")},enable:function(){this.element.prop("disabled",false).parent().removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(b){a.mobile.checkboxradio.prototype.enhanceWithin(b.target)})})(jQuery);
+(function(a,e){a.widget("mobile.button",a.mobile.widget,{options:{theme:null,icon:null,iconpos:null,inline:null,corners:true,shadow:true,iconshadow:true,initSelector:"button, [type='button'], [type='submit'], [type='reset'], [type='image']"},_create:function(){var b=this.element,d=this.options,f,c;b[0].tagName==="A"?b.hasClass("ui-btn")||b.buttonMarkup():(this.button=a("<div></div>").text(b.text()||b.val()).insertBefore(b).buttonMarkup({theme:d.theme,icon:d.icon,iconpos:d.iconpos,inline:d.inline,
+corners:d.corners,shadow:d.shadow,iconshadow:d.iconshadow}).append(b.addClass("ui-btn-hidden")),d=b.attr("type"),f=b.attr("name"),d!=="button"&&d!=="reset"&&f&&b.bind("vclick",function(){c===e&&(c=a("<input>",{type:"hidden",name:b.attr("name"),value:b.attr("value")}).insertBefore(b),a(document).one("submit",function(){c.remove();c=e}))}),this.refresh())},enable:function(){this.element.attr("disabled",false);this.button.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",
+false)},disable:function(){this.element.attr("disabled",true);this.button.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)},refresh:function(){var a=this.element;a.prop("disabled")?this.disable():this.enable();this.button.data("textWrapper").text(a.text()||a.val())}});a(document).bind("pagecreate create",function(b){a.mobile.button.prototype.enhanceWithin(b.target)})})(jQuery);
+(function(a,e){a.widget("mobile.slider",a.mobile.widget,{options:{theme:null,trackTheme:null,disabled:false,initSelector:"input[type='range'], :jqmData(type='range'), :jqmData(role='slider')"},_create:function(){var b=this,d=this.element,f=a.mobile.getInheritedTheme(d,"c"),c=this.options.theme||f,h=this.options.trackTheme||f,g=d[0].nodeName.toLowerCase(),f=g=="select"?"ui-slider-switch":"",i=d.attr("id"),l=i+"-label",i=a("[for='"+i+"']").attr("id",l),k=function(){return g=="input"?parseFloat(d.val()):
+d[0].selectedIndex},o=g=="input"?parseFloat(d.attr("min")):0,n=g=="input"?parseFloat(d.attr("max")):d.find("option").length-1,q=window.parseFloat(d.attr("step")||1),j=a("<div class='ui-slider "+f+" ui-btn-down-"+h+" ui-btn-corner-all' role='application'></div>"),p=a("<a href='#' class='ui-slider-handle'></a>").appendTo(j).buttonMarkup({corners:true,theme:c,shadow:true}).attr({role:"slider","aria-valuemin":o,"aria-valuemax":n,"aria-valuenow":k(),"aria-valuetext":k(),title:k(),"aria-labelledby":l});
+a.extend(this,{slider:j,handle:p,dragging:false,beforeStart:null,userModified:false,mouseMoved:false});g=="select"&&(j.wrapInner("<div class='ui-slider-inneroffset'></div>"),p.addClass("ui-slider-handle-snapping"),d.find("option"),d.find("option").each(function(b){var c=!b?"b":"a",d=!b?"right":"left",b=!b?" ui-btn-down-"+h:" "+a.mobile.activeBtnClass;a("<div class='ui-slider-labelbg ui-slider-labelbg-"+c+b+" ui-btn-corner-"+d+"'></div>").prependTo(j);a("<span class='ui-slider-label ui-slider-label-"+
+c+b+" ui-btn-corner-"+d+"' role='img'>"+a(this).getEncodedText()+"</span>").prependTo(p)}));i.addClass("ui-slider");d.addClass(g==="input"?"ui-slider-input":"ui-slider-switch").change(function(){b.mouseMoved||b.refresh(k(),true)}).keyup(function(){b.refresh(k(),true,true)}).blur(function(){b.refresh(k(),true)});a(document).bind("vmousemove",function(a){if(b.dragging)return b.mouseMoved=true,g==="select"&&p.removeClass("ui-slider-handle-snapping"),b.refresh(a),b.userModified=b.beforeStart!==d[0].selectedIndex,
+false});j.bind("vmousedown",function(a){b.dragging=true;b.userModified=false;b.mouseMoved=false;if(g==="select")b.beforeStart=d[0].selectedIndex;b.refresh(a);return false});j.add(document).bind("vmouseup",function(){if(b.dragging)return b.dragging=false,g==="select"&&(p.addClass("ui-slider-handle-snapping"),b.mouseMoved?b.userModified?b.refresh(b.beforeStart==0?1:0):b.refresh(b.beforeStart):b.refresh(b.beforeStart==0?1:0)),b.mouseMoved=false});j.insertAfter(d);this.handle.bind("vmousedown",function(){a(this).focus()}).bind("vclick",
+false);this.handle.bind("keydown",function(c){var d=k();if(!b.options.disabled){switch(c.keyCode){case a.mobile.keyCode.HOME:case a.mobile.keyCode.END:case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:if(c.preventDefault(),!b._keySliding)b._keySliding=true,a(this).addClass("ui-state-active")}switch(c.keyCode){case a.mobile.keyCode.HOME:b.refresh(o);break;case a.mobile.keyCode.END:b.refresh(n);
+break;case a.mobile.keyCode.PAGE_UP:case a.mobile.keyCode.UP:case a.mobile.keyCode.RIGHT:b.refresh(d+q);break;case a.mobile.keyCode.PAGE_DOWN:case a.mobile.keyCode.DOWN:case a.mobile.keyCode.LEFT:b.refresh(d-q)}}}).keyup(function(){if(b._keySliding)b._keySliding=false,a(this).removeClass("ui-state-active")});this.refresh(e,e,true)},refresh:function(a,d,f){(this.options.disabled||this.element.attr("disabled"))&&this.disable();var c=this.element,e=c[0].nodeName.toLowerCase(),g=e==="input"?parseFloat(c.attr("min")):
+0,i=e==="input"?parseFloat(c.attr("max")):c.find("option").length-1,l=e==="input"&&parseFloat(c.attr("step"))>0?parseFloat(c.attr("step")):1;if(typeof a==="object"){if(!this.dragging||a.pageX<this.slider.offset().left-8||a.pageX>this.slider.offset().left+this.slider.width()+8)return;a=Math.round((a.pageX-this.slider.offset().left)/this.slider.width()*100)}else a==null&&(a=e==="input"?parseFloat(c.val()||0):c[0].selectedIndex),a=(parseFloat(a)-g)/(i-g)*100;if(!isNaN(a)){a<0&&(a=0);a>100&&(a=100);var k=
+a/100*(i-g)+g,o=(k-g)%l;k-=o;Math.abs(o)*2>=l&&(k+=o>0?l:-l);k=parseFloat(k.toFixed(5));k<g&&(k=g);k>i&&(k=i);this.handle.css("left",a+"%");this.handle.attr({"aria-valuenow":e==="input"?k:c.find("option").eq(k).attr("value"),"aria-valuetext":e==="input"?k:c.find("option").eq(k).getEncodedText(),title:e==="input"?k:c.find("option").eq(k).getEncodedText()});e==="select"&&(k===0?this.slider.addClass("ui-slider-switch-a").removeClass("ui-slider-switch-b"):this.slider.addClass("ui-slider-switch-b").removeClass("ui-slider-switch-a"));
+if(!f)f=false,e==="input"?(f=c.val()!==k,c.val(k)):(f=c[0].selectedIndex!==k,c[0].selectedIndex=k),!d&&f&&c.trigger("change")}},enable:function(){this.element.attr("disabled",false);this.slider.removeClass("ui-disabled").attr("aria-disabled",false);return this._setOption("disabled",false)},disable:function(){this.element.attr("disabled",true);this.slider.addClass("ui-disabled").attr("aria-disabled",true);return this._setOption("disabled",true)}});a(document).bind("pagecreate create",function(b){a.mobile.slider.prototype.enhanceWithin(b.target)})})(jQuery);
+(function(a){a.widget("mobile.textinput",a.mobile.widget,{options:{theme:null,initSelector:"input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])"},_create:function(){var e=this.element,
+b=this.options.theme||a.mobile.getInheritedTheme(this.element,"c"),d=" ui-body-"+b,f,c;a("label[for='"+e.attr("id")+"']").addClass("ui-input-text");f=e.addClass("ui-input-text ui-body-"+b);typeof e[0].autocorrect!=="undefined"&&!a.support.touchOverflow&&(e[0].setAttribute("autocorrect","off"),e[0].setAttribute("autocomplete","off"));e.is("[type='search'],:jqmData(type='search')")?(f=e.wrap("<div class='ui-input-search ui-shadow-inset ui-btn-corner-all ui-btn-shadow ui-icon-searchfield"+d+"'></div>").parent(),
+c=a("<a href='#' class='ui-input-clear' title='clear text'>clear text</a>").tap(function(a){e.val("").focus();e.trigger("change");c.addClass("ui-input-clear-hidden");a.preventDefault()}).appendTo(f).buttonMarkup({icon:"delete",iconpos:"notext",corners:true,shadow:true}),b=function(){setTimeout(function(){c.toggleClass("ui-input-clear-hidden",!e.val())},0)},b(),e.bind("paste cut keyup focus change blur",b)):e.addClass("ui-corner-all ui-shadow-inset"+d);e.focus(function(){f.addClass("ui-focus")}).blur(function(){f.removeClass("ui-focus")});
+if(e.is("textarea")){var h=function(){var a=e[0].scrollHeight;e[0].clientHeight<a&&e.height(a+15)},g;e.keyup(function(){clearTimeout(g);g=setTimeout(h,100)});a(document).one("pagechange",h);a.trim(e.val())&&a(window).load(h)}},disable:function(){(this.element.attr("disabled",true).is("[type='search'],:jqmData(type='search')")?this.element.parent():this.element).addClass("ui-disabled")},enable:function(){(this.element.attr("disabled",false).is("[type='search'],:jqmData(type='search')")?this.element.parent():
+this.element).removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.textinput.prototype.enhanceWithin(e.target)})})(jQuery);
+(function(a){var e=function(b){var d=b.selectID,f=b.label,c=b.select.closest(".ui-page"),e=a("<div>",{"class":"ui-selectmenu-screen ui-screen-hidden"}).appendTo(c),g=b._selectOptions(),i=b.isMultiple=b.select[0].multiple,l=d+"-button",k=d+"-menu",o=a("<div data-"+a.mobile.ns+"role='dialog' data-"+a.mobile.ns+"theme='"+b.options.theme+"' data-"+a.mobile.ns+"overlay-theme='"+b.options.overlayTheme+"'><div data-"+a.mobile.ns+"role='header'><div class='ui-title'>"+f.getEncodedText()+"</div></div><div data-"+
+a.mobile.ns+"role='content'></div></div>").appendTo(a.mobile.pageContainer).page(),n=a("<div>",{"class":"ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-"+b.options.overlayTheme+" "+a.mobile.defaultDialogTransition}).insertAfter(e),q=a("<ul>",{"class":"ui-selectmenu-list",id:k,role:"listbox","aria-labelledby":l}).attr("data-"+a.mobile.ns+"theme",b.options.theme).appendTo(n),j=a("<div>",{"class":"ui-header ui-bar-"+b.options.theme}).prependTo(n),p=a("<h1>",{"class":"ui-title"}).appendTo(j),
+m=a("<a>",{text:b.options.closeText,href:"#","class":"ui-btn-left"}).attr("data-"+a.mobile.ns+"iconpos","notext").attr("data-"+a.mobile.ns+"icon","delete").appendTo(j).buttonMarkup(),A=o.find(".ui-content"),z=o.find(".ui-header a");a.extend(b,{select:b.select,selectID:d,buttonId:l,menuId:k,thisPage:c,menuPage:o,label:f,screen:e,selectOptions:g,isMultiple:i,theme:b.options.theme,listbox:n,list:q,header:j,headerTitle:p,headerClose:m,menuPageContent:A,menuPageClose:z,placeholder:"",build:function(){var b=
+this;b.refresh();b.select.attr("tabindex","-1").focus(function(){a(this).blur();b.button.focus()});b.button.bind("vclick keydown",function(c){if(c.type=="vclick"||c.keyCode&&(c.keyCode===a.mobile.keyCode.ENTER||c.keyCode===a.mobile.keyCode.SPACE))b.open(),c.preventDefault()});b.list.attr("role","listbox").delegate(".ui-li>a","focusin",function(){a(this).attr("tabindex","0")}).delegate(".ui-li>a","focusout",function(){a(this).attr("tabindex","-1")}).delegate("li:not(.ui-disabled, .ui-li-divider)",
+"click",function(c){var d=b.select[0].selectedIndex,f=b.list.find("li:not(.ui-li-divider)").index(this),e=b._selectOptions().eq(f)[0];e.selected=b.isMultiple?!e.selected:true;b.isMultiple&&a(this).find(".ui-icon").toggleClass("ui-icon-checkbox-on",e.selected).toggleClass("ui-icon-checkbox-off",!e.selected);(b.isMultiple||d!==f)&&b.select.trigger("change");b.isMultiple||b.close();c.preventDefault()}).keydown(function(b){var c=a(b.target),d=c.closest("li");switch(b.keyCode){case 38:return b=d.prev(),
+b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 40:return b=d.next(),b.length&&(c.blur().attr("tabindex","-1"),b.find("a").first().focus()),false;case 13:case 32:return c.trigger("click"),false}});b.menuPage.bind("pagehide",function(){b.list.appendTo(b.listbox);b._focusButton();a.mobile._bindPageRemove.call(b.thisPage)});b.screen.bind("vclick",function(){b.close()});b.headerClose.click(function(){if(b.menuType=="overlay")return b.close(),false});b.thisPage.addDependents(this.menuPage)},
+_isRebuildRequired:function(){var a=this.list.find("li");return this._selectOptions().text()!==a.text()},refresh:function(b){var c=this;this._selectOptions();this.selected();var d=this.selectedIndices();(b||this._isRebuildRequired())&&c._buildList();c.setButtonText();c.setButtonCount();c.list.find("li:not(.ui-li-divider)").removeClass(a.mobile.activeBtnClass).attr("aria-selected",false).each(function(b){a.inArray(b,d)>-1&&(b=a(this),b.attr("aria-selected",true),c.isMultiple?b.find(".ui-icon").removeClass("ui-icon-checkbox-off").addClass("ui-icon-checkbox-on"):
+b.addClass(a.mobile.activeBtnClass))})},close:function(){if(!this.options.disabled&&this.isOpen)this.menuType=="page"?window.history.back():(this.screen.addClass("ui-screen-hidden"),this.listbox.addClass("ui-selectmenu-hidden").removeAttr("style").removeClass("in"),this.list.appendTo(this.listbox),this._focusButton()),this.isOpen=false},open:function(){if(!this.options.disabled){var b=this,c=b.list.parent().outerHeight(),d=b.list.parent().outerWidth(),f=a(".ui-page-active"),e=a.support.touchOverflow&&
+a.mobile.touchOverflowEnabled,f=f.is(".ui-native-fixed")?f.find(".ui-content"):f,g=e?f.scrollTop():a(window).scrollTop(),h=b.button.offset().top,j=a(window).height(),e=a(window).width();b.button.addClass(a.mobile.activeBtnClass);setTimeout(function(){b.button.removeClass(a.mobile.activeBtnClass)},300);if(c>j-80||!a.support.scrollTop){b.thisPage.unbind("pagehide.remove");if(g==0&&h>j)b.thisPage.one("pagehide",function(){a(this).jqmData("lastScroll",h)});b.menuPage.one("pageshow",function(){a(window).one("silentscroll",
+function(){b.list.find(a.mobile.activeBtnClass).focus()});b.isOpen=true});b.menuType="page";b.menuPageContent.append(b.list);b.menuPage.find("div .ui-title").text(b.label.text());a.mobile.changePage(b.menuPage,{transition:a.mobile.defaultDialogTransition})}else{b.menuType="overlay";b.screen.height(a(document).height()).removeClass("ui-screen-hidden");var i=h-g,n=g+j-h,m=c/2,f=parseFloat(b.list.parent().css("max-width")),c=i>c/2&&n>c/2?h+b.button.outerHeight()/2-m:i>n?g+j-c-30:g+30;d<f?f=(e-d)/2:(f=
+b.button.offset().left+b.button.outerWidth()/2-d/2,f<30?f=30:f+d>e&&(f=e-d-30));b.listbox.append(b.list).removeClass("ui-selectmenu-hidden").css({top:c,left:f}).addClass("in");b.list.find(a.mobile.activeBtnClass).focus();b.isOpen=true}}},_buildList:function(){var b=this,c=this.options,d=this.placeholder,f=[],e=[],g=b.isMultiple?"checkbox-off":"false";b.list.empty().filter(".ui-listview").listview("destroy");b.select.find("option").each(function(h){var j=a(this),i=j.parent(),n=j.getEncodedText(),m=
+"<a href='#'>"+n+"</a>",k=[],l=[];i.is("optgroup")&&(i=i.attr("label"),a.inArray(i,f)===-1&&(e.push("<li data-"+a.mobile.ns+"role='list-divider'>"+i+"</li>"),f.push(i)));if(!this.getAttribute("value")||n.length==0||j.jqmData("placeholder"))c.hidePlaceholderMenuItems&&k.push("ui-selectmenu-placeholder"),d=b.placeholder=n;this.disabled&&(k.push("ui-disabled"),l.push("aria-disabled='true'"));e.push("<li data-"+a.mobile.ns+"option-index='"+h+"' data-"+a.mobile.ns+"icon='"+g+"' class='"+k.join(" ")+"' "+
+l.join(" ")+">"+m+"</li>")});b.list.html(e.join(" "));b.list.find("li").attr({role:"option",tabindex:"-1"}).first().attr("tabindex","0");this.isMultiple||this.headerClose.hide();!this.isMultiple&&!d.length?this.header.hide():this.headerTitle.text(this.placeholder);b.list.listview()},_button:function(){return a("<a>",{href:"#",role:"button",id:this.buttonId,"aria-haspopup":"true","aria-owns":this.menuId})}})};a(document).delegate("select","selectmenubeforecreate",function(){var b=a(this).data("selectmenu");
+b.options.nativeMenu||e(b)})})(jQuery);
+(function(a){a.widget("mobile.selectmenu",a.mobile.widget,{options:{theme:null,disabled:false,icon:"arrow-d",iconpos:"right",inline:null,corners:true,shadow:true,iconshadow:true,menuPageTheme:"b",overlayTheme:"a",hidePlaceholderMenuItems:true,closeText:"Close",nativeMenu:true,initSelector:"select:not(:jqmData(role='slider'))"},_button:function(){return a("<div/>")},_setDisabled:function(a){this.element.attr("disabled",a);this.button.attr("aria-disabled",a);return this._setOption("disabled",a)},_focusButton:function(){var a=
+this;setTimeout(function(){a.button.focus()},40)},_selectOptions:function(){return this.select.find("option")},_preExtension:function(){this.select=this.element.wrap("<div class='ui-select'>");this.selectID=this.select.attr("id");this.label=a("label[for='"+this.selectID+"']").addClass("ui-select");this.isMultiple=this.select[0].multiple;if(!this.options.theme)this.options.theme=a.mobile.getInheritedTheme(this.select,"c")},_create:function(){this._preExtension();this._trigger("beforeCreate");this.button=
+this._button();var e=this,b=this.options,d=this.button.text(a(this.select[0].options.item(this.select[0].selectedIndex==-1?0:this.select[0].selectedIndex)).text()).insertBefore(this.select).buttonMarkup({theme:b.theme,icon:b.icon,iconpos:b.iconpos,inline:b.inline,corners:b.corners,shadow:b.shadow,iconshadow:b.iconshadow});b.nativeMenu&&window.opera&&window.opera.version&&this.select.addClass("ui-select-nativeonly");if(this.isMultiple)this.buttonCount=a("<span>").addClass("ui-li-count ui-btn-up-c ui-btn-corner-all").hide().appendTo(d.addClass("ui-li-has-count"));
+(b.disabled||this.element.attr("disabled"))&&this.disable();this.select.change(function(){e.refresh()});this.build()},build:function(){var e=this;this.select.appendTo(e.button).bind("vmousedown",function(){e.button.addClass(a.mobile.activeBtnClass)}).bind("focus vmouseover",function(){e.button.trigger("vmouseover")}).bind("vmousemove",function(){e.button.removeClass(a.mobile.activeBtnClass)}).bind("change blur vmouseout",function(){e.button.trigger("vmouseout").removeClass(a.mobile.activeBtnClass)}).bind("change blur",
+function(){e.button.removeClass("ui-btn-down-"+e.options.theme)})},selected:function(){return this._selectOptions().filter(":selected")},selectedIndices:function(){var a=this;return this.selected().map(function(){return a._selectOptions().index(this)}).get()},setButtonText:function(){var e=this,b=this.selected();this.button.find(".ui-btn-text").text(function(){return!e.isMultiple?b.text():b.length?b.map(function(){return a(this).text()}).get().join(", "):e.placeholder})},setButtonCount:function(){var a=
+this.selected();this.isMultiple&&this.buttonCount[a.length>1?"show":"hide"]().text(a.length)},refresh:function(){this.setButtonText();this.setButtonCount()},open:a.noop,close:a.noop,disable:function(){this._setDisabled(true);this.button.addClass("ui-disabled")},enable:function(){this._setDisabled(false);this.button.removeClass("ui-disabled")}});a(document).bind("pagecreate create",function(e){a.mobile.selectmenu.prototype.enhanceWithin(e.target)})})(jQuery);
+(function(a,e){function b(a){for(var b;a;){if((b=typeof a.className==="string"&&a.className+" ")&&b.indexOf("ui-btn ")>-1&&b.indexOf("ui-disabled ")<0)break;a=a.parentNode}return a}a.fn.buttonMarkup=function(b){for(var b=b||{},c=0;c<this.length;c++){var h=this.eq(c),g=h[0],i=a.extend({},a.fn.buttonMarkup.defaults,{icon:b.icon!==e?b.icon:h.jqmData("icon"),iconpos:b.iconpos!==e?b.iconpos:h.jqmData("iconpos"),theme:b.theme!==e?b.theme:h.jqmData("theme"),inline:b.inline!==e?b.inline:h.jqmData("inline"),
+shadow:b.shadow!==e?b.shadow:h.jqmData("shadow"),corners:b.corners!==e?b.corners:h.jqmData("corners"),iconshadow:b.iconshadow!==e?b.iconshadow:h.jqmData("iconshadow")},b),l="ui-btn-inner",k,o,n=document.createElement(i.wrapperEls),q=document.createElement(i.wrapperEls),j=i.icon?document.createElement("span"):null;if(!(g.tagName==="INPUT"&&h.jqmData("role")==="button"))if(g.tagName==="BUTTON")a(g.parentNode).hasClass("ui-btn")||a(g).button();else{d&&d();if(!i.theme)i.theme=a.mobile.getInheritedTheme(h,
+"c");k="ui-btn ui-btn-up-"+i.theme;i.inline&&(k+=" ui-btn-inline");if(i.icon)i.icon="ui-icon-"+i.icon,i.iconpos=i.iconpos||"left",o="ui-icon "+i.icon,i.iconshadow&&(o+=" ui-icon-shadow");i.iconpos&&(k+=" ui-btn-icon-"+i.iconpos,i.iconpos=="notext"&&!h.attr("title")&&h.attr("title",h.getEncodedText()));i.corners&&(k+=" ui-btn-corner-all",l+=" ui-btn-corner-all");i.shadow&&(k+=" ui-shadow");g.setAttribute("data-"+a.mobile.ns+"theme",i.theme);h.addClass(k);n.className=l;q.className="ui-btn-text";n.appendChild(q);
+if(j)j.className=o,n.appendChild(j);for(;g.firstChild;)q.appendChild(g.firstChild);g.appendChild(n);a.data(g,"textWrapper",a(q))}}return this};a.fn.buttonMarkup.defaults={corners:true,shadow:true,iconshadow:true,inline:false,wrapperEls:"span"};var d=function(){a(document).bind({vmousedown:function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-up-"+c).addClass("ui-btn-down-"+c))},"vmousecancel vmouseup":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+
+a.mobile.ns+"theme"),d.removeClass("ui-btn-down-"+c).addClass("ui-btn-up-"+c))},"vmouseover focus":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-up-"+c).addClass("ui-btn-hover-"+c))},"vmouseout blur":function(d){var d=b(d.target),c;d&&(d=a(d),c=d.attr("data-"+a.mobile.ns+"theme"),d.removeClass("ui-btn-hover-"+c+" ui-btn-down-"+c).addClass("ui-btn-up-"+c))}});d=null};a(document).bind("pagecreate create",function(b){a(":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a",
+b.target).not(".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')").buttonMarkup()})})(jQuery);
+(function(a){a.fn.controlgroup=function(e){return this.each(function(){function b(a){a.removeClass("ui-btn-corner-all ui-shadow").eq(0).addClass(h[0]).end().last().addClass(h[1]).addClass("ui-controlgroup-last")}var d=a(this),f=a.extend({direction:d.jqmData("type")||"vertical",shadow:false,excludeInvisible:true},e),c=d.children("legend"),h=f.direction=="horizontal"?["ui-corner-left","ui-corner-right"]:["ui-corner-top","ui-corner-bottom"];d.find("input").first().attr("type");c.length&&(d.wrapInner("<div class='ui-controlgroup-controls'></div>"),
+a("<div role='heading' class='ui-controlgroup-label'>"+c.html()+"</div>").insertBefore(d.children(0)),c.remove());d.addClass("ui-corner-all ui-controlgroup ui-controlgroup-"+f.direction);b(d.find(".ui-btn"+(f.excludeInvisible?":visible":"")));b(d.find(".ui-btn-inner"));f.shadow&&d.addClass("ui-shadow")})};a(document).bind("pagecreate create",function(e){a(":jqmData(role='controlgroup')",e.target).controlgroup({excludeInvisible:false})})})(jQuery);
+(function(a){a(document).bind("pagecreate create",function(e){a(e.target).find("a").not(".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')").addClass("ui-link")})})(jQuery);
+(function(a,e){a.fn.fixHeaderFooter=function(){return!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled?this:this.each(function(){var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade");b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})};a.mobile.fixedToolbars=function(){function b(){!i&&g==="overlay"&&(h||a.mobile.fixedToolbars.hide(true),
+a.mobile.fixedToolbars.startShowTimer())}function d(a){var b=0,c,d;if(a){d=document.body;c=a.offsetParent;for(b=a.offsetTop;a&&a!=d;){b+=a.scrollTop||0;if(a==c)b+=c.offsetTop,c=a.offsetParent;a=a.parentNode}}return b}function f(b){var c=a(window).scrollTop(),e=d(b[0]),f=b.css("top")=="auto"?0:parseFloat(b.css("top")),g=window.innerHeight,h=b.outerHeight(),i=b.parents(".ui-page:not(.ui-page-fullscreen)").length;return b.is(".ui-header-fixed")?(f=c-e+f,f<e&&(f=0),b.css("top",i?f:c)):b.css("top",i?c+
+g-h-(e-f):c+g-h)}if(a.support.scrollTop&&(!a.support.touchOverflow||!a.mobile.touchOverflowEnabled)){var c,h,g="inline",i=false,l=null,k=false,o=true;a(function(){var c=a(document),d=a(window);c.bind("vmousedown",function(){o&&(l=g)}).bind("vclick",function(b){o&&!a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length&&!k&&(a.mobile.fixedToolbars.toggle(l),l=null)}).bind("silentscroll",b);(c.scrollTop()===0?d:c).bind("scrollstart",function(){k=true;l===
+null&&(l=g);var b=l=="overlay";if(i=b||!!h)a.mobile.fixedToolbars.clearShowTimer(),b&&a.mobile.fixedToolbars.hide(true)}).bind("scrollstop",function(b){a(b.target).closest("a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed").length||(k=false,i&&(a.mobile.fixedToolbars.startShowTimer(),i=false),l=null)});d.bind("resize updatelayout",b)});a(document).delegate(".ui-page","pagebeforeshow",function(b,d){var e=a(b.target).find(":jqmData(role='footer')"),g=e.data("id"),h=d.prevPage,
+h=h&&h.find(":jqmData(role='footer')"),h=h.length&&h.jqmData("id")===g;g&&h&&(c=e,f(c.removeClass("fade in out").appendTo(a.mobile.pageContainer)))}).delegate(".ui-page","pageshow",function(){var b=a(this);c&&c.length&&setTimeout(function(){f(c.appendTo(b).addClass("fade"));c=null},500);a.mobile.fixedToolbars.show(true,this)});a(document).delegate(".ui-collapsible-contain","collapse expand",b);return{show:function(b,c){a.mobile.fixedToolbars.clearShowTimer();g="overlay";return(c?a(c):a.mobile.activePage?
+a.mobile.activePage:a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var c=a(this),e=a(window).scrollTop(),g=d(c[0]),h=window.innerHeight,i=c.outerHeight(),e=c.is(".ui-header-fixed")&&e<=g+i||c.is(".ui-footer-fixed")&&g<=e+h;c.addClass("ui-fixed-overlay").removeClass("ui-fixed-inline");!e&&!b&&c.animationComplete(function(){c.removeClass("in")}).addClass("in");f(c)})},hide:function(b){g="inline";return(a.mobile.activePage?a.mobile.activePage:
+a(".ui-page-active")).children(".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last").each(function(){var c=a(this),d=c.css("top"),d=d=="auto"?0:parseFloat(d);c.addClass("ui-fixed-inline").removeClass("ui-fixed-overlay");if(d<0||c.is(".ui-header-fixed")&&d!==0)b?c.css("top",0):c.css("top")!=="auto"&&parseFloat(c.css("top"))!==0&&c.animationComplete(function(){c.removeClass("out reverse").css("top",0)}).addClass("out reverse")})},startShowTimer:function(){a.mobile.fixedToolbars.clearShowTimer();
+var b=[].slice.call(arguments);h=setTimeout(function(){h=e;a.mobile.fixedToolbars.show.apply(null,b)},100)},clearShowTimer:function(){h&&clearTimeout(h);h=e},toggle:function(b){b&&(g=b);return g==="overlay"?a.mobile.fixedToolbars.hide():a.mobile.fixedToolbars.show()},setTouchToggleEnabled:function(a){o=a}}}}();a(document).bind("pagecreate create",function(b){a(":jqmData(position='fixed')",b.target).length&&a(b.target).each(function(){if(!a.support.scrollTop||a.support.touchOverflow&&a.mobile.touchOverflowEnabled)return this;
+var b=a(this);b.jqmData("fullscreen")&&b.addClass("ui-page-fullscreen");b.find(".ui-header:jqmData(position='fixed')").addClass("ui-header-fixed ui-fixed-inline fade");b.find(".ui-footer:jqmData(position='fixed')").addClass("ui-footer-fixed ui-fixed-inline fade")})})})(jQuery);
+(function(a){a.mobile.touchOverflowEnabled=false;a.mobile.touchOverflowZoomEnabled=false;a(document).bind("pagecreate",function(e){a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&(e=a(e.target),e.is(":jqmData(role='page')")&&e.each(function(){var b=a(this),d=b.find(":jqmData(role='header'), :jqmData(role='footer')").filter(":jqmData(position='fixed')"),e=b.jqmData("fullscreen"),c=d.length?b.find(".ui-content"):b;b.addClass("ui-mobile-touch-overflow");c.bind("scrollstop",function(){c.scrollTop()>
+0&&window.scrollTo(0,a.mobile.defaultHomeScroll)});d.length&&(b.addClass("ui-native-fixed"),e&&(b.addClass("ui-native-fullscreen"),d.addClass("fade in"),a(document).bind("vclick",function(){d.removeClass("ui-native-bars-hidden").toggleClass("in out").animationComplete(function(){a(this).not(".in").addClass("ui-native-bars-hidden")})})))}))})})(jQuery);
+(function(a,e){function b(){var b=a("meta[name='viewport']");b.length?b.attr("content",b.attr("content")+", user-scalable=no"):a("head").prepend("<meta>",{name:"viewport",content:"user-scalable=no"})}var d=a("html");a("head");var f=a(e);a(e.document).trigger("mobileinit");if(a.mobile.gradeA()){if(a.mobile.ajaxBlacklist)a.mobile.ajaxEnabled=false;d.addClass("ui-mobile ui-mobile-rendering");var c=a("<div class='ui-loader ui-body-a ui-corner-all'><span class='ui-icon ui-icon-loading spin'></span><h1></h1></div>");
+a.extend(a.mobile,{showPageLoadingMsg:function(){if(a.mobile.loadingMessage){var b=a("."+a.mobile.activeBtnClass).first();c.find("h1").text(a.mobile.loadingMessage).end().appendTo(a.mobile.pageContainer).css({top:a.support.scrollTop&&f.scrollTop()+f.height()/2||b.length&&b.offset().top||100})}d.addClass("ui-loading")},hidePageLoadingMsg:function(){d.removeClass("ui-loading")},initializePage:function(){var b,c=a(":jqmData(role='page')");c.length||(b=a(":jqmData(role='dialog')"),b.length?(b.first().attr("data-"+
+a.mobile.ns+"role","page"),c=c.add(b.get().shift())):c=a("body").wrapInner("<div data-"+a.mobile.ns+"role='page'></div>").children(0));c.add(":jqmData(role='dialog')").each(function(){var b=a(this);b.jqmData("url")||b.attr("data-"+a.mobile.ns+"url",b.attr("id")||location.pathname+location.search)});a.mobile.firstPage=c.first();a.mobile.pageContainer=c.first().parent().addClass("ui-mobile-viewport");f.trigger("pagecontainercreate");a.mobile.showPageLoadingMsg();!a.mobile.hashListeningEnabled||!a.mobile.path.stripHash(location.hash)?
+a.mobile.changePage(a.mobile.firstPage,{transition:"none",reverse:true,changeHash:false,fromHashChange:true}):f.trigger("hashchange",[true])}});a.support.touchOverflow&&a.mobile.touchOverflowEnabled&&!a.mobile.touchOverflowZoomEnabled&&b();a.mobile._registerInternalEvents();a(function(){e.scrollTo(0,1);a.mobile.defaultHomeScroll=!a.support.scrollTop||a(e).scrollTop()===1?0:1;a.mobile.autoInitializePage&&a.mobile.initializePage();f.load(a.mobile.silentScroll)})}})(jQuery,this);
Index: tags/2.4.0RC3/themes/smartpocket/js/klass.min.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/klass.min.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/klass.min.js	(revision 14585)
@@ -0,0 +1,8 @@
+/**
+  * Klass.js - copyright @dedfat
+  * version 1.0
+  * https://github.com/ded/klass
+  * Follow our software http://twitter.com/dedfat :)
+  * MIT License
+  */
+!function(a,b){function j(a,b){function c(){}c[e]=this[e];var d=this,g=new c,h=f(a),j=h?a:this,k=h?{}:a,l=function(){this.initialize?this.initialize.apply(this,arguments):(b||h&&d.apply(this,arguments),j.apply(this,arguments))};l.methods=function(a){i(g,a,d),l[e]=g;return this},l.methods.call(l,k).prototype.constructor=l,l.extend=arguments.callee,l[e].implement=l.statics=function(a,b){a=typeof a=="string"?function(){var c={};c[a]=b;return c}():a,i(this,a,d);return this};return l}function i(a,b,d){for(var g in b)b.hasOwnProperty(g)&&(a[g]=f(b[g])&&f(d[e][g])&&c.test(b[g])?h(g,b[g],d):b[g])}function h(a,b,c){return function(){var d=this.supr;this.supr=c[e][a];var f=b.apply(this,arguments);this.supr=d;return f}}function g(a){return j.call(f(a)?a:d,a,1)}var c=/xyz/.test(function(){xyz})?/\bsupr\b/:/.*/,d=function(){},e="prototype",f=function(a){return typeof a===b};if(typeof module!="undefined"&&module.exports)module.exports=g;else{var k=a.klass;g.noConflict=function(){a.klass=k;return this},a.klass=g}}(this,"function")
Index: tags/2.4.0RC3/themes/smartpocket/js/smartpocket.js
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/js/smartpocket.js	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/js/smartpocket.js	(revision 14585)
@@ -0,0 +1,17 @@
+(function(window, $, PhotoSwipe){
+  $(document).ready(function(){
+    var options = {
+      jQueryMobile: true,
+      imageScaleMethod: "fitNoUpscale"
+    };
+    $(".thumbnails a").photoSwipe(options);
+    $(document).bind('orientationchange', set_thumbnails_width);
+    set_thumbnails_width();
+  });
+}(window, window.jQuery, window.Code.PhotoSwipe));
+
+function set_thumbnails_width() {
+  nb_thumbs = Math.max(3, Math.ceil($('.thumbnails').width() / 130));
+  width = Math.floor(1000000 / nb_thumbs) / 10000;
+  $('.thumbnails li').css('width', width+'%');
+}
Index: tags/2.4.0RC3/themes/smartpocket/photoswipe.css
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/photoswipe.css	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/photoswipe.css	(revision 14585)
@@ -0,0 +1,176 @@
+/*
+ * photoswipe.css
+ * Copyright (c) %%year%% by Code Computerlove (http://www.codecomputerlove.com)
+ * Licensed under the MIT license
+ *
+ * Default styles for PhotoSwipe
+ * Avoid any position or dimension based styles
+ * where possible, unless specified already here.
+ * The gallery automatically works out gallery item
+ * positions etc.
+ */
+
+ 
+body.ps-active, body.ps-building, div.ps-active, div.ps-building
+{
+	background: #000;
+	overflow: hidden;
+}
+body.ps-active *, div.ps-active *
+{ 
+	-webkit-tap-highlight-color:  rgba(255, 255, 255, 0); 
+	display: none;
+}
+body.ps-active *:focus, div.ps-active *:focus 
+{ 
+	outline: 0; 
+}
+
+
+/* Document overlay */
+div.ps-document-overlay 
+{
+	background: #000;
+}
+
+
+/* UILayer */
+div.ps-uilayer { 
+	
+	background: #000;
+	cursor: pointer;
+	
+}
+
+
+/* Zoom/pan/rotate layer */
+div.ps-zoom-pan-rotate{
+	background: #000;
+}
+div.ps-zoom-pan-rotate *  { display: block; }
+
+
+/* Carousel */
+div.ps-carousel-item-loading 
+{ 
+	background: url(images/loader.gif) no-repeat center center; 
+}
+
+div.ps-carousel-item-error 
+{ 
+	background: url(images/error.gif) no-repeat center center; 
+}
+
+
+/* Caption */
+div.ps-caption
+{ 
+	background: #000000;
+	background: -moz-linear-gradient(top, #303130 0%, #000101 100%);
+	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#303130), color-stop(100%,#000101));
+	border-bottom: 1px solid #42403f;
+	color: #ffffff;
+	font-size: 13px;
+	font-family: "Lucida Grande", Helvetica, Arial,Verdana, sans-serif;
+	text-align: center;
+}
+div.ps-caption *  { display: inline; }
+
+div.ps-caption-bottom
+{ 
+	border-top: 1px solid #42403f;
+	border-bottom: none;
+	min-height: 44px;
+}
+
+div.ps-caption-content
+{
+	padding: 13px;
+	display: block;
+}
+
+
+/* Toolbar */
+div.ps-toolbar
+{ 
+	background: #000000;
+	background: -moz-linear-gradient(top, #303130 0%, #000101 100%);
+	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#303130), color-stop(100%,#000101));
+	border-top: 1px solid #42403f;
+	color: #ffffff;
+	font-size: 13px;
+	font-family: "Lucida Grande", Helvetica, Arial,Verdana, sans-serif;
+	text-align: center;
+	height: 44px;
+	display: table;
+	table-layout: fixed;
+}
+div.ps-toolbar * { 
+	display: block;
+}
+
+div.ps-toolbar-top 
+{
+	border-bottom: 1px solid #42403f;
+	border-top: none;
+}
+
+div.ps-toolbar-close, div.ps-toolbar-previous, div.ps-toolbar-next, div.ps-toolbar-play
+{
+	cursor: pointer;
+	display: table-cell;
+}
+
+div.ps-toolbar div div.ps-toolbar-content
+{
+	width: 44px;
+	height: 44px;
+	margin: 0 auto 0;
+	background-image: url(images/icons.png);
+	background-repeat: no-repeat;
+}
+
+div.ps-toolbar-close div.ps-toolbar-content
+{
+	background-position: 0 0;
+}
+
+div.ps-toolbar-previous div.ps-toolbar-content
+{
+	background-position: -44px 0;
+}
+
+div.ps-toolbar-previous-disabled div.ps-toolbar-content
+{
+	background-position: -44px -44px;
+}
+
+div.ps-toolbar-next div.ps-toolbar-content
+{
+	background-position: -132px 0;
+}
+
+div.ps-toolbar-next-disabled div.ps-toolbar-content
+{
+	background-position: -132px -44px;
+}
+
+div.ps-toolbar-play div.ps-toolbar-content
+{
+	background-position: -88px 0;
+}
+
+/* Hi-res display */
+@media only screen and (-webkit-min-device-pixel-ratio: 1.5),
+       only screen and (min--moz-device-pixel-ratio: 1.5),
+       only screen and (min-resolution: 240dpi)
+{
+	div.ps-toolbar div div.ps-toolbar-content
+	{
+		-moz-background-size: 176px 88px;
+		-o-background-size: 176px 88px;
+		-webkit-background-size: 176px 88px;
+		background-size: 176px 88px;
+		background-image: url(images/icons@2x.png);
+	}
+}
Index: tags/2.4.0RC3/themes/smartpocket/template/footer.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/footer.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/footer.tpl	(revision 14585)
@@ -0,0 +1,24 @@
+{if !empty($navbar)}
+{include file='navigation_bar.tpl'|@get_extent:'navbar'}
+{else}
+<div class="pwg_footer ui-bar-a">
+  <h6>
+	{'Powered by'|@translate}	<a href="{$PHPWG_URL}" class="Piwigo">Piwigo</a>
+	{$VERSION}
+	{if isset($CONTACT_MAIL)}
+	- {'Contact'|@translate}
+	<a href="mailto:{$CONTACT_MAIL}?subject={'A comment on your site'|@translate|@escape:url}">{'Webmaster'|@translate}</a>
+	{/if}
+  <br>{'View in'|@translate} :
+    <b>{'Mobile'|@translate}</b> | <a href="{$TOGGLE_MOBILE_THEME_URL}">{'Desktop'|@translate}</a>
+  </h6>
+</div>
+{/if}
+{footer_script require='jquery'}
+document.cookie = 'screen_size='+jQuery(document).width()+'x'+jQuery(document).height()+';path={$COOKIE_PATH}';
+{/footer_script}
+{get_combined_scripts load='footer'}
+</div><!-- /page -->
+
+</body>
+</html>
Index: tags/2.4.0RC3/themes/smartpocket/template/header.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/header.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/header.tpl	(revision 14585)
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="{$lang_info.code}" dir="{$lang_info.direction}">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset={$CONTENT_ENCODING}">
+<meta name="generator" content="Piwigo (aka PWG), see piwigo.org">
+{if isset($meta_ref) } 
+{if isset($INFO_AUTHOR)}
+<meta name="author" content="{$INFO_AUTHOR|@strip_tags:false|@replace:'"':' '}">
+{/if}
+{if isset($related_tags)}
+<meta name="keywords" content="{foreach from=$related_tags item=tag name=tag_loop}{if !$smarty.foreach.tag_loop.first}, {/if}{$tag.name}{/foreach}">
+{/if}
+{if isset($COMMENT_IMG)}
+<meta name="description" content="{$COMMENT_IMG|@strip_tags:false|@replace:'"':' '}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{else}
+<meta name="description" content="{$PAGE_TITLE}{if isset($INFO_FILE)} - {$INFO_FILE}{/if}">
+{/if}
+{/if}
+<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
+<meta name="apple-mobile-web-app-capable" content="yes" />
+
+{if (isset($REVERSE) and $REVERSE and $PAGE_TITLE == l10n('Home'))}
+<title>{$GALLERY_TITLE} | {$PAGE_TITLE}</title>{else}
+<title>{$PAGE_TITLE} | {$GALLERY_TITLE}</title>{/if}
+<link rel="start" title="{'Home'|@translate}" href="{$U_HOME}" >
+
+{get_combined_css}
+{foreach from=$themes item=theme}
+{if $theme.load_css}
+{combine_css path="themes/`$theme.id`/theme.css" order=-10}
+{/if}
+{if !empty($theme.local_head)}{include file=$theme.local_head load_css=$theme.load_css}{/if}
+{/foreach}
+
+{if isset($U_CANONICAL)}<link rel="canonical" href="{$U_CANONICAL}">{/if}
+
+{if not empty($page_refresh)    }<meta http-equiv="refresh" content="{$page_refresh.TIME};url={$page_refresh.U_REFRESH}">{/if}
+
+{get_combined_scripts load='header'}
+
+{combine_script id='jquery' path='themes/smartpocket/js/jquery-1.6.4.min.js'}
+{combine_script id='config' path='themes/smartpocket/js/config.js' require='jquery'}
+{combine_script id='jquery.mobile' path='themes/smartpocket/js/jquery.mobile.min.js' require='jquery,config'}
+
+</head>
+
+<body>
+<div data-role="page" data-theme="a">
+
+<div data-role="header">
+  <div class="title">
+    <a href="{$U_HOME}" class="home_button" data-icon="home" data-iconpos="notext" data-role="button"></a>
+    {$GALLERY_TITLE}
+    <span class="menubar">{$MENUBAR}</span>
+  </div>
+</div>
+
Index: tags/2.4.0RC3/themes/smartpocket/template/identification.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/identification.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/identification.tpl	(revision 14585)
@@ -0,0 +1,41 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+<h3>{'Identification'|@translate}</h3>
+<form action="{$F_LOGIN_ACTION}" method="post" name="login_form" class="properties">
+
+  <div data-role="fieldcontain">
+  <label for="username">{'Username'|@translate}</label>
+  <input type="text" name="username" id="username">
+  </div>
+    
+
+  <div data-role="fieldcontain">
+  <label for="password">{'Password'|@translate}</label>
+  <input type="password" name="password" id="password" value="">
+  </div>
+
+  {if $authorize_remembering }
+  <div data-role="fieldcontain">
+  <label for="remember_me">{'Auto login'|@translate}</label>
+  <input type="checkbox" name="remember_me" id="remember_me" value="1">
+  </div>
+  {/if}
+
+  <div data-role="fieldcontain">
+    <input type="hidden" name="redirect" value="{$U_REDIRECT|@urlencode}">
+    <input type="submit" name="login" value="{'Submit'|@translate}">
+  </div>
+
+</form>
+
+	<div data-role="fieldcontain">
+{if isset($U_REGISTER)}
+		<a href="{$U_REGISTER}" data-role="button">{'Register'|@translate}</a>
+{/if}
+{*
+{if isset($U_LOST_PASSWORD)}
+		<a href="{$U_LOST_PASSWORD}" data-role="button">{'Forgot your password?'|@translate}</a>
+{/if}
+*}
+	</div>
+</div>
Index: tags/2.4.0RC3/themes/smartpocket/template/index.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/index.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/index.tpl	(revision 14585)
@@ -0,0 +1,5 @@
+<div data-role="content" data-theme="a">
+{if !empty($CATEGORIES)}{$CATEGORIES}{/if}
+{if !empty($THUMBNAILS)}{$THUMBNAILS}{/if}
+</div>
+
Index: tags/2.4.0RC3/themes/smartpocket/template/infos_errors.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/infos_errors.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/infos_errors.tpl	(revision 14585)
@@ -0,0 +1,23 @@
+{if isset($errors)}
+<div class="ui-bar ui-bar-e errors">
+  <h3>{'Error'|@translate}</h3>
+	<div><a href="#" data-role="button" data-icon="delete" data-iconpos="notext" class="close-button">Button</a></div>
+	<p>{'<br>'|@implode:$errors}</p>
+</div>
+{/if}
+
+{if not empty($infos)}
+<div class="ui-bar ui-bar-b infos">
+  <h3>{'Info'|@translate}</h3>
+	<div><a href="#" data-role="button" data-icon="delete" data-iconpos="notext" class="close-button">Button</a></div>
+	<p>{'<br>'|@implode:$infos}</p>
+</div>
+{/if}
+
+{footer_script}{literal}
+$(document).ready(function () {
+  $('.close-button').click(function() {
+    $(this).parents('.ui-bar').remove();
+  });
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/themes/smartpocket/template/mainpage_categories.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/mainpage_categories.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/mainpage_categories.tpl	(revision 14585)
@@ -0,0 +1,12 @@
+<ul data-role="listview" data-inset="true">
+{foreach from=$category_thumbnails item=cat}
+	<li>
+		<a href="{$cat.URL}">
+		<img src="{$pwg->derivative_url($thumbnail_derivative_params, $cat.representative.src_image)}">
+    <h3>{$cat.NAME}</h3>
+		<p class="Nb_images">{$cat.CAPTION_NB_IMAGES}</p>
+		</a>
+  </li>
+{/foreach}
+</ul>
+
Index: tags/2.4.0RC3/themes/smartpocket/template/menubar.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/menubar.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/menubar.tpl	(revision 14585)
@@ -0,0 +1,32 @@
+<select name="identification" id="identification" data-icon="grid" data-iconpos="notext" data-native-menu="false">
+
+  <option></option>
+  <optgroup label="{'Identification'|@translate}">
+
+	{if isset($U_REGISTER)}
+	<option value="{$U_REGISTER}">{'Register'|@translate}</option>
+	{/if}
+	{if isset($U_LOGIN)}
+	<option value="{$U_LOGIN}">{'Login'|@translate}</option>
+	{/if}
+	{if isset($U_LOGOUT)}
+	<option value="{$U_LOGOUT}">{'Logout'|@translate}</option>
+	{/if}
+	{if isset($U_PROFILE)}
+	<option value="{$U_PROFILE}">{'Customize'|@translate}</option>
+	{/if}
+	{if isset($U_ADMIN)}
+	<option value="{$U_ADMIN}">{'Administration'|@translate}</option>
+	{/if}
+
+  </optgroup>
+
+</select>
+
+{footer_script}{literal}
+$(document).ready(function() {
+  $('#identification').change(function() {
+    window.location = this.value;
+  });
+});
+{/literal}{/footer_script}
Index: tags/2.4.0RC3/themes/smartpocket/template/navigation_bar.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/navigation_bar.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/navigation_bar.tpl	(revision 14585)
@@ -0,0 +1,14 @@
+{capture}{$navbar.pages|@end}{/capture}
+<div class="ui-bar ui-bar-a" style="text-align:center;">
+<div data-role="controlgroup" data-type="horizontal">
+{strip}
+  {if isset($navbar.URL_PREV)}
+  <a href="{$navbar.URL_PREV}" rel="prev" data-role="button" data-icon="arrow-l" data-inline="true">{'Previous'|@translate}</a>
+  {/if}
+  <a href="#" data-role="button" data-inline="true">{$navbar.CURRENT_PAGE} / {$navbar.pages|@key}&nbsp;</a>
+  {if isset($navbar.URL_NEXT)}
+  <a href="{$navbar.URL_NEXT}" rel="next" data-role="button" data-icon="arrow-r" data-iconpos="right" data-inline="true">{'Next'|@translate}</a>
+  {/if}
+{/strip}
+</div>
+</div>
Index: tags/2.4.0RC3/themes/smartpocket/template/profile.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/profile.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/profile.tpl	(revision 14585)
@@ -0,0 +1,4 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+{$PROFILE_CONTENT}
+</div>
Index: tags/2.4.0RC3/themes/smartpocket/template/profile_content.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/profile_content.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/profile_content.tpl	(revision 14585)
@@ -0,0 +1,61 @@
+<form method="post" name="profile" action="{$F_ACTION}" id="profile" class="properties">
+
+  <div data-role="fieldcontain">
+  <label for="username">{'Username'|@translate}</label>
+  <input type="text" name="username" id="username" value="{$USERNAME}" disabled="disabled">
+  </div>
+
+  {if not $SPECIAL_USER} {* can modify password + email*}
+  <div data-role="fieldcontain">
+  <label for="mail_address">{'Email address'|@translate}</label>
+  <input type="text" name="mail_address" id="mail_address" value="{$EMAIL}">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="password">{'Password'|@translate}</label>
+  <input type="password" name="password" id="password" value="">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="use_new_pwd">{'New password'|@translate}</label>
+  <input type="password" name="use_new_pwd" id="use_new_pwd" value="">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="passwordConf">{'Confirm Password'|@translate}</label>
+  <input type="password" name="passwordConf" id="passwordConf" value="">
+  </div>
+  {/if}
+
+{if $ALLOW_USER_CUSTOMIZATION}
+  <div data-role="fieldcontain">
+  <label for="nb_image_page">{'Number of photos per page'|@translate}</label>
+  <input type="range" name="nb_image_page" id="nb_image_page" value="{$NB_IMAGE_PAGE}" min="1" max="100" />
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="language">{'Language'|@translate}</label>
+  {html_options name=language options=$language_options selected=$language_selection}
+  </div>
+{/if}
+
+
+  <div data-role="fieldcontain">
+    {if $ALLOW_USER_CUSTOMIZATION}
+    <input type="hidden" name="theme" value="{$template_selection}">
+    <input type="hidden" name="recent_period" value="{$RECENT_PERIOD}">
+    <input type="hidden" name="expand" value="{$EXPAND}">
+    <input type="hidden" name="show_nb_comments" value="{$NB_COMMENTS}">
+    <input type="hidden" name="show_nb_hits" value="{$NB_HITS}">
+    {/if}
+    <input type="hidden" name="redirect" value="{$REDIRECT}">
+    <input type="hidden" name="pwg_token" value="{$PWG_TOKEN}">
+    <input class="submit" type="submit" name="validate" value="{'Submit'|@translate}">
+    <input class="submit" type="reset" name="reset" value="{'Reset'|@translate}">
+    {if $ALLOW_USER_CUSTOMIZATION}
+    <input class="submit" type="submit" name="reset_to_default" value="{'Reset to default values'|@translate}">
+    {/if}
+  </div>
+
+</form>
+
Index: tags/2.4.0RC3/themes/smartpocket/template/register.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/register.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/register.tpl	(revision 14585)
@@ -0,0 +1,38 @@
+{include file='infos_errors.tpl'}
+<div data-role="content">
+<h3>{'Register'|@translate}</h3>
+<form method="post" action="{$F_ACTION}" class="properties" name="register_form">
+
+  <div data-role="fieldcontain">
+  <label for="username">* {'Username'|@translate}</label>
+  <input type="text" name="username" id="username" value="{$F_LOGIN}">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="password">* {'Password'|@translate}</label>
+  <input type="password" name="password" id="password">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="password_conf">* {'Confirm Password'|@translate}</label>
+  <input type="password" name="password_conf" id="password_conf">
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="mail_address">{if $obligatory_user_mail_address}* {/if}{'Email address'|@translate}</label>
+  <input type="text" name="mail_address" id="mail_address" value="{$F_EMAIL}" >
+  </div>
+
+  <div data-role="fieldcontain">
+  <label for="send_password_by_mail">{'Send my connection settings by email'|@translate}</label>
+  <input type="checkbox" name="send_password_by_mail" id="send_password_by_mail" value="1" checked="checked">
+  </div>
+
+  <div data-role="fieldcontain">
+		<input type="hidden" name="key" value="{$F_KEY}" >
+    <input class="submit" type="submit" name="submit" value="{'Register'|@translate}">
+    <input class="submit" type="reset" value="{'Reset'|@translate}">
+  </div>
+
+</form>
+</div>
Index: tags/2.4.0RC3/themes/smartpocket/template/thumbnails.tpl
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/template/thumbnails.tpl	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/template/thumbnails.tpl	(revision 14585)
@@ -0,0 +1,24 @@
+{if !empty($thumbnails)}
+{combine_script id='klass' path='themes/smartpocket/js/klass.min.js'}
+{combine_script id='photoswipe' path='themes/smartpocket/js/code.photoswipe.jquery.min.js' require='klass,jquery.mobile'}
+{combine_script id='smartpocket' path='themes/smartpocket/js/smartpocket.js' require='photoswipe'}
+{combine_script id='jquery.ajaxmanager' path='themes/default/js/plugins/jquery.ajaxmanager.js' load='footer'}
+{combine_script id='thumbnails.loader' path='themes/default/js/thumbnails.loader.js' require='jquery.ajaxmanager' load='footer'}
+
+<ul class="thumbnails">
+{foreach from=$thumbnails item=thumbnail}{strip}
+{assign var=derivative value=$pwg->derivative($thumbnail_derivative_params, $thumbnail.src_image)}
+{if isset($page_selection[$thumbnail.id])}
+  <li>
+    <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" rel="external">
+     <img {if !$derivative->is_cached()}data-{/if}src="{$derivative->get_url()}" alt="{$thumbnail.TN_ALT}">
+    </a>
+  </li>
+{else}
+  <li style="display:none;">
+    <a href="{$pwg->derivative_url($picture_derivative_params, $thumbnail.src_image)}" rel="external"></a>
+  </li>
+{/if}
+{/strip}{/foreach}
+</ul>
+{/if}
Index: tags/2.4.0RC3/themes/smartpocket/theme.css
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/theme.css	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/theme.css	(revision 14585)
@@ -0,0 +1,23 @@
+@import "jquery.mobile.css";
+@import "photoswipe.css";
+
+.title { margin: 10px; text-align: center; }
+.title .ui-btn { margin-top: -5px; }
+.menubar { float: right; }
+.home_button { float: left; }
+.pwg_footer h6 { margin: 8px; text-align:right;}
+
+.errors  h3, .infos  h3{ float:left; margin-top:8px; }
+.errors div, .infos div { float:right; margin-top:4px; }
+.errors p, .infos p { clear:both; font-size:85%; margin-bottom:8px; }
+
+.ui-icon-profil { background-image: url("images/profil.png"); background-color: transparent; }
+
+.ui-content { overflow: hidden; }
+.ui-field-contain, .ui-br { padding: 5px; border: 0 !important; }
+
+.thumbnails { list-style: none; padding: 0; margin: 0; }
+.thumbnails:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; }
+.thumbnails li { float: left;  }
+.thumbnails li a { display: block; margin: 5px; }
+.thumbnails li img { display: block; width: 100%; height: auto; }
Index: tags/2.4.0RC3/themes/smartpocket/themeconf.inc.php
===================================================================
--- tags/2.4.0RC3/themes/smartpocket/themeconf.inc.php	(revision 14585)
+++ tags/2.4.0RC3/themes/smartpocket/themeconf.inc.php	(revision 14585)
@@ -0,0 +1,50 @@
+<?php
+/*
+Theme Name: Smart Pocket
+Version: 2.4.0
+Description: Mobile theme.
+Theme URI: http://piwigo.org/ext/extension_view.php?eid=599
+Author: P@t
+Author URI: http://piwigo.org
+*/
+
+$themeconf = array(
+  'mobile' => true,
+);
+
+// Redirect if page is not compatible with mobile theme
+if (!in_array(script_basename(), array('index', 'register', 'profile', 'identification')))
+  redirect(duplicate_index_url());
+
+//Retrive all pictures on thumbnails page
+add_event_handler('loc_index_thumbnails_selection', 'sp_select_all_thumbnails');
+
+function sp_select_all_thumbnails($selection)
+{
+  global $page, $template;
+
+  $template->assign('page_selection', array_flip($selection));
+
+  return $page['items'];
+}
+
+// Get better derive parameters for screen size
+if (!empty($_COOKIE['screen_size']))
+{
+  $screen_size = explode('x', $_COOKIE['screen_size']);
+  $derivative_params = new ImageStdParams;
+  $derivative_params->load_from_db();
+  $type = IMG_LARGE;
+
+  foreach ($derivative_params->get_all_type_map() as $type => $map)
+  {
+    if (max($map->sizing->ideal_size) >= max($screen_size) and min($map->sizing->ideal_size) >= min($screen_size))
+      break;
+  }
+  pwg_set_session_var('sp_picture_deriv', $type);
+}
+
+$this->assign('picture_derivative_params', ImageStdParams::get_by_type(pwg_get_session_var('sp_picture_deriv', IMG_LARGE)));
+$this->assign('thumbnail_derivative_params', ImageStdParams::get_by_type(IMG_SQUARE));
+
+?>
Index: tags/2.4.0RC3/tools/albums.lang.php
===================================================================
--- tags/2.4.0RC3/tools/albums.lang.php	(revision 14585)
+++ tags/2.4.0RC3/tools/albums.lang.php	(revision 14585)
@@ -0,0 +1,89 @@
+<?php
+$lang['%d category including'] = '%d album including';
+$lang['%d categories including'] = '%d albums including';
+$lang['%d category moved'] = '%d album moved';
+$lang['%d categories moved'] = '%d albums moved';
+$lang['Apply to subcategories'] = 'Apply to sub-albums';
+$lang['Categories authorized thanks to group associations'] = 'Albums authorized thanks to group associations';
+$lang['Categories manual order was saved'] = 'Album manual order was saved';
+$lang['Category elements associated to the following categories: %s'] = 'Album elements associated to the following albums: %s';
+$lang['Link all category elements to a new category'] = 'Link all album photos to a new album';
+$lang['Link all category elements to some existing categories'] = 'Link all album photos to some existing albums';
+$lang['Linked categories'] = 'Linked albums';
+$lang['Manage permissions for a category'] = 'Edit album permissions';
+$lang['Move categories'] = 'Move albums';
+$lang['New parent category'] = 'New parent album';
+$lang['Only private categories are listed'] = 'Only private albums are listed';
+$lang['Other private categories'] = 'Other private albums';
+$lang['Parent category'] = 'Parent album';
+$lang['Permalink %s has been previously used by category %s. Delete from the permalink history first'] = 'Permalink %s has been previously used by album %s. Delete from the permalink history first';
+$lang['Permalink %s is already used by category %s'] = 'Permalink %s is already used by album %s';
+$lang['Representation of categories'] = 'Representation of albums';
+$lang['Select at least one category'] = 'Select at least one album';
+$lang['Storage category'] = 'Storage album';
+$lang['Virtual categories to move'] = 'Virtual albums to move';
+$lang['Virtual category name'] = 'Virtual album name';
+$lang['You cannot move a category in its own sub category'] = 'You cannot move an album in its own sub album';
+$lang['associate to category'] = 'Associate to album';
+$lang['Add a virtual category'] = 'Add a virtual album';
+$lang['Authorize users to add comments on selected categories'] = 'Authorize users to add comments on selected albums';
+$lang['The name of a category should not be empty'] = 'The name of an album must not be empty';
+$lang['Lock categories'] = 'Lock albums';
+$lang['Private category'] = 'Private';
+$lang['Public category'] = 'Public';
+$lang['Manage authorizations for selected categories'] = 'Manage authorizations for selected albums';
+$lang['Select uploadable categories'] = 'Select uploadable albums';
+$lang['Virtual category added'] = 'Virtual album added';
+$lang['Virtual category deleted'] = 'Virtual album deleted';
+$lang['delete category'] = 'delete album';
+$lang['dissociate from category'] = 'Dissociate from album';
+$lang['edit category permissions'] = 'edit album permissions';
+$lang['Category informations updated successfully.'] = 'Album updated successfully';
+$lang['jump to category'] = 'jump to album';
+$lang['manage category elements'] = 'manage album elements';
+$lang['manage sub-categories'] = 'manage sub-albums';
+$lang['Categories management'] = 'Album list management';
+$lang['Edit a category'] = 'Edit album';
+$lang['Update categories informations'] = 'Update albums informations';
+$lang['reduce to single existing categories'] = 'reduce to single existing albums';
+$lang['display maximum informations (added categories and elements, deleted categories and elements)'] = 'display maximum informations (added albums and photos, deleted albums and photos)';
+$lang['categories deleted in the database'] = 'albums deleted in the database';
+$lang['categories added in the database'] = 'albums added in the database';
+$lang['Files with same name in more than one physical category'] = 'Files with same name in more than one physical album';
+$lang['edit category informations'] = 'edit album';
+$lang['No element in this category'] = 'No photo in this album';
+$lang['Drop into category'] = 'Drop into album';
+$lang['existing category'] = 'existing album';
+$lang['create a new category'] = 'create a new album';
+$lang['Category name'] = 'Album name';
+$lang['Category "%s" has been added'] = 'Album "%s" has been added';
+$lang['Category "%s" now contains %d photos'] = 'Album "%s" now contains %d photos';
+$lang['Category \'%s\' has been added'] = 'Album "%s" has been added';
+$lang['Category \'%s\' now contains %d photos'] = 'Album "%s" now contains %d photos';
+$lang['Categories automatically sorted'] = 'Albums automatically sorted';
+$lang['%d category updated'] = '%d album updated';
+$lang['%d categories updated'] = '%d albums updated';
+$lang['Categories'] = 'Albums';
+$lang['Category'] = 'Album';
+$lang['The RSS notification feed provides notification on news from this website : new pictures, updated categories, new comments. Use a RSS feed reader.'] = 'The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.';
+$lang['Expand all categories'] = 'Expand all albums';
+$lang['shows images at the root of this category'] = 'display this album';
+$lang['in this category'] = 'in this album';
+$lang['in %d sub-category'] = 'in %d sub-album';
+$lang['in %d sub-categories'] = 'in %d sub-albums';
+$lang['display all elements in all sub-categories'] = 'display all photos in all sub-albums';
+$lang['Recent categories'] = 'Recent albums';
+$lang['display recently updated categories'] = 'display recently updated albums';
+$lang['Search in Categories'] = 'Search in albums';
+$lang['Search in subcategories'] = 'Search in sub-albums';
+$lang['set as category representative'] = 'set as album representative';
+$lang['Category: %s'] = 'Album: %s';
+$lang['Category results for'] = 'Album results for';
+$lang['All sub-categories of private categories become private'] = 'All sub-albums of private albums become private';
+$lang['sub-categories'] = 'sub-albums';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the category directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :';
+$lang['a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory \'thumbnail\' of the category directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :'] = 'a picture filetype requires a thumbnail. The thumbnail must be present in the sub-directory "thumbnail" of the album directory. The thumbnail filename must start with the configured thumbnail prefix and the extension must be among the following list :';
+$lang['Virtual category'] = 'Virtual album';
+$lang['[%s] Come to visit the category %s'] = '[%s] Visit album %s';
+$lang['Come to discover the category:'] = 'Discover album:';
+?>
Index: tags/2.4.0RC3/tools/config.inc.php
===================================================================
--- tags/2.4.0RC3/tools/config.inc.php	(revision 14585)
+++ tags/2.4.0RC3/tools/config.inc.php	(revision 14585)
@@ -0,0 +1,8 @@
+<?php
+// this file is provided as an example. It does not modify the configuration
+// as long as it remains in "tools" directory. Move it to "include"
+// directory if you want to modify default configuration.
+
+$conf['prefix_thumbnail'] = 'thumb_';
+$conf['show_gt'] = true;
+?>
Index: tags/2.4.0RC3/tools/convert_language_to_2.1.pl
===================================================================
--- tags/2.4.0RC3/tools/convert_language_to_2.1.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/convert_language_to_2.1.pl	(revision 14585)
@@ -0,0 +1,184 @@
+#!/usr/bin/perl
+
+# Here is the way I finally used this script:
+#
+# for language in ar_SA cz_CZ da_DK de_DE es_AR es_ES hr_HR hu_HU it_IT ja_JP nl_NL pl_PL pt_BR pt_PT ru_RU sr_RS vi_VN zh_CN
+# do
+#   export PWG_LANG=$language
+#   rm -rf language/$PWG_LANG
+#   cp -r ../branches/2.0/language/$PWG_LANG language/
+#   perl tools/convert_language_to_2.1.pl language/$PWG_LANG
+# done
+
+use strict;
+use warnings;
+
+my $language_dir = $ARGV[0];
+
+my @file_codes = qw/upgrade install admin common/;
+
+my %ignore_keys = (
+    'user_status_admin' => '',
+    'user_status_generic' => '',
+    'user_status_guest' => '',
+    'user_status_normal' => '',
+    'user_status_webmaster' => '',
+    'Level 0' => '',
+    'Level 1' => '',
+    'Level 2' => '',
+    'Level 4' => '',
+    'Level 8' => '',
+    'ACCESS_0' => '',
+    'ACCESS_1' => '',
+    'ACCESS_2' => '',
+    'ACCESS_3' => '',
+    'ACCESS_4' => '',
+    'ACCESS_5' => '',
+    'month' => '',
+    'day' => '',
+    'chronology_monthly_calendar' => '',
+    'chronology_monthly_list' => '',
+    'chronology_weekly_list' => '',
+);
+
+my %remove_keys = (
+    common => {
+        "You can\\'t upload pictures in this category" => '',
+        'display pictures added on' => '',
+        'Email address is missing' => '',
+        'Delete: %s' => '',
+        'All tags must match' => '',
+        'Validate: %s' => '',
+        'Upgrade from %s to %s' => '',
+    },
+    admin => {
+        'nbm_content_goto_2' => '',
+        'nbm_content_hello_2' => '',
+        'nbm_redirect_msg' => '',
+
+        'username' => '',
+        'No tag defined. Use Administration>Pictures>Tags' => '',
+        'Remote site url must start by http or https and must only contain characters among "/", "a-zA-Z0-9", "-" or "_"' => '',
+        'path' => '',
+        'Unable to retrieve server informations since allow_url_fopen is disabled.' => '',
+        'The following tag were deleted' => '',
+        'Remote site' => '',
+        'Piwigo home' => '',
+        'Move up' => '',
+        'Instructions' => '',
+        'Hits' => '',
+        'General' => '',
+        'Gallery description' => '',
+        'Extensions' => '',
+        'Demo' => '',
+        'Categories ascending alphanumerically ordered' => '',
+        'Categories descending alphanumerically ordered' => '',
+        'Categories sorted in ascending order ⇓' => '',
+        'Categories sorted in ascending order &dArr;' => '',
+        'Categories sorted in descending order ⇑' => '',
+        'Categories sorted in descending order &uArr;' => '',
+        'Bugs' => '',
+        'Automatic installation' => '',
+        'Upgrade from version %s to %s' => '',
+        'Upgrade from %s to %s' => '',
+        'Upload Form' => '',
+    },
+    upgrade => {
+        'Are you sure?' => '',
+        'In <i>%s</i>, before <b>?></b>, insert:' => '',
+    },
+    install => {
+        'Parameters are correct' => '',
+        'Installation finished' => '',
+        'The next step of the installation is now possible' => '',
+        'next step' => '',
+    }
+);
+
+my %to_copy = ();
+
+# load the replacements
+my %replace_by = ();
+foreach my $file_code (@file_codes) {
+    open(my $ifh_rep, '<language/templates/'.$file_code.'.lang.php');
+    while (<$ifh_rep>) {
+        if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
+            if ($1 ne $3 and length($1) > 0) {
+                $replace_by{$1} = $3;
+            }
+        }
+    }
+}
+# use Data::Dumper; print Dumper(\%replace_by); exit();
+
+my $append_to_common = '';
+
+foreach my $file_code (@file_codes) {
+    my $filename = $language_dir.'/'.$file_code.'.lang.php';
+    print $filename;
+    if (not -f $filename) {
+        print ' is missing', "\n";
+        next;
+    }
+    print ' is under process', "\n";
+
+    if ($file_code eq 'admin') {
+        %to_copy = (
+            'Are you sure?' => '',
+            'Email address is missing. Please specify an email address.' => '',
+            'delete this comment' => '',
+            'validate this comment' => '',
+        );
+    }
+    else {
+        %to_copy = ();
+    }
+
+    my $file_content = '';
+    my $copy_content = '';
+
+    open(my $ifh, '<'.$language_dir.'/'.$file_code.'.lang.php');
+    while (my $line = <$ifh>) {
+        if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
+            if (defined $remove_keys{$file_code}{$1}) {
+                next;
+            }
+            elsif (defined $ignore_keys{$1}) {
+                $file_content.= $line;
+            }
+            elsif (defined $to_copy{$1}) {
+                $append_to_common.= $line;
+            }
+            elsif (defined $replace_by{$1}) {
+                my $search = quotemeta($1);
+                my $replace = $replace_by{$1};
+
+                $line =~ s{$search}{$replace};
+
+                if (defined $to_copy{$replace}) {
+                    $append_to_common.= $line;
+                }
+                else {
+                    $file_content.= $line;
+                }
+            }
+            else {
+                $file_content.= $line;
+            }
+        }
+        elsif ($line =~ m/^?>/) {
+            if ('common' eq $file_code) {
+                $file_content.= $append_to_common;
+            }
+            $file_content.= $line;
+        }
+        else {
+            $file_content.= $line;
+        }
+    }
+    close($ifh);
+
+    open(my $ofh, '>'.$language_dir.'/'.$file_code.'.lang.php');
+    print {$ofh} $file_content;
+    close($ofh);
+}
Index: tags/2.4.0RC3/tools/convert_template_to_2.1.pl
===================================================================
--- tags/2.4.0RC3/tools/convert_template_to_2.1.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/convert_template_to_2.1.pl	(revision 14585)
@@ -0,0 +1,48 @@
+#!/usr/bin/perl
+
+# perl tools/convert_template_to_2.1.pl /path/to/tpl/files/directory
+
+use strict;
+use warnings;
+
+use File::Find;
+
+my $base_dir = $ARGV[0];
+
+# load the replacements
+my @file_codes = qw/upgrade install admin common/;
+my %replace_by = ();
+foreach my $file_code (@file_codes) {
+    open(my $ifh_rep, '<language/templates/'.$file_code.'.lang.php');
+    while (<$ifh_rep>) {
+        if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
+            if ($1 ne $3 and length($1) > 0) {
+                $replace_by{$1} = $3;
+            }
+        }
+    }
+}
+# use Data::Dumper; print Dumper(\%replace_by); exit();
+
+find(\&replace_keys, $base_dir);
+
+sub replace_keys {
+    if ($File::Find::name !~ m/tpl$/) {
+        return 0;
+    }
+
+    my $file_content = '';
+    open(my $fhi, '<', $File::Find::name);
+    while (<$fhi>) {
+        foreach my $from (keys %replace_by) {
+            my $to = $replace_by{$from};
+            s/{'$from'\|\@translate/{'$to'|\@translate/g;
+        }
+        $file_content.= $_;
+    }
+    close($fhi);
+
+    open(my $fho, '>', $File::Find::name);
+    print {$fho} $file_content;
+    close($fho);
+}
Index: tags/2.4.0RC3/tools/fill_history.pl
===================================================================
--- tags/2.4.0RC3/tools/fill_history.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/fill_history.pl	(revision 14585)
@@ -0,0 +1,336 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use Getopt::Long;
+use DBI;
+use File::Basename;
+use Time::Local;
+use List::Util qw/shuffle min/;
+
+my %opt;
+GetOptions(
+    \%opt,
+    qw/dbname=s dbuser=s dbpass=s prefix=s
+       total=i start_date=s end_date=s
+       help/
+   );
+
+if (defined($opt{help}))
+{
+  print <<FIN;
+
+Fill the user comments table of Piwigo.
+
+Usage: pwg_fill_comments.pl --dbname=<database_name>
+                            --dbuser=<username>
+                            --dbpass=<password>
+                            --tagfile=<tags filename>
+                            [--prefix=<tables prefix>]
+                            [--help]
+
+--dbname, --dbuser and --dbpass are connexion parameters.
+
+--tagfile
+
+--prefix : determines the prefix for your table names.
+
+--help : show this help
+
+FIN
+
+  exit(0);
+}
+
+my $usage = "\n\n".basename($0)." --help for help\n\n";
+
+foreach my $option (qw/dbname dbuser dbpass start_date end_date/) {
+  if (not exists $opt{$option}) {
+    die 'Error: '.$option.' is a mandatory option', $usage;
+  }
+}
+
+$opt{prefix} = 'piwigo_' if (not defined $opt{prefix});
+my $dbh = DBI->connect(
+    'DBI:mysql:'.$opt{dbname},
+    $opt{dbuser},
+    $opt{dbpass}
+);
+
+my $query;
+my $sth;
+
+
+# retrieve all available users
+$query = '
+SELECT id
+  FROM '.$opt{prefix}.'users
+';
+my @user_ids = keys %{ $dbh->selectall_hashref($query, 'id') };
+
+# set a list of IP addresses for each users
+my %user_IPs = ();
+foreach my $user_id (@user_ids) {
+    for (1 .. 1 + int rand 5) {
+        push(
+            @{ $user_IPs{$user_id} },
+            join(
+                '.',
+                map {1 + int rand 255} 1..4
+            )
+        );
+    }
+}
+
+# use Data::Dumper; print Dumper(\%user_IPs); exit();
+
+# start and end dates
+my ($year,$month,$day,$hour,$min,$sec)
+     = ($opt{start_date} =~ m/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
+my $start_unixtime = timelocal(0,0,0,$day,$month-1,$year);
+
+($year,$month,$day,$hour,$min,$sec)
+     = ($opt{end_date} =~ m/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/);
+my $end_unixtime = timelocal(0,0,0,$day,$month-1,$year);
+
+# "tags from image" and "images from tag"
+$query = '
+SELECT image_id, tag_id
+  FROM '.$opt{prefix}.'image_tag
+';
+my %image_tags = ();
+my %tag_images = ();
+my %related_tag_of = ();
+my @tags = ();
+$sth = $dbh->prepare($query);
+$sth->execute();
+while (my $row = $sth->fetchrow_hashref()) {
+    push(
+        @{$image_tags{$row->{image_id}}},
+        $row->{tag_id}
+    );
+
+    push(
+        @{$tag_images{$row->{tag_id}}},
+        $row->{image_id}
+    );
+
+    push (
+        @tags,
+        $row->{tag_id}
+    );
+}
+
+# foreach my $tag_id (keys %tag_images) {
+#     printf(
+#         "tag %5u: %5u images\n",
+#         $tag_id,
+#         scalar @{$tag_images{$tag_id}}
+#     );
+# }
+# exit();
+
+# use Data::Dumper; print Dumper(\%tag_images); exit();
+
+# categories from image_id
+$query = '
+SELECT image_id, category_id
+  FROM '.$opt{prefix}.'image_category
+';
+my %image_categories = ();
+my %category_images =();
+my %categories = ();
+$sth = $dbh->prepare($query);
+$sth->execute();
+while (my $row = $sth->fetchrow_hashref()) {
+    push(
+        @{$image_categories{$row->{image_id}}},
+        $row->{category_id}
+    );
+
+    push(
+        @{$category_images{$row->{category_id}}},
+        $row->{image_id}
+    );
+
+    $categories{ $row->{category_id} }++;
+}
+
+my @images = keys %image_categories;
+my @categories = keys %categories;
+
+# use Data::Dumper;
+# print Dumper(\%image_categories);
+
+my @sections = (
+    'categories',
+#     'tags',
+#     'search',
+#     'list',
+#     'favorites',
+#     'most_visited',
+#     'best_rated',
+#     'recent_pics',
+#     'recent_cats',
+);
+
+my @inserts = ();
+
+USER : foreach my $user_id (@user_ids) {
+    print 'user_id: ', $user_id, "\n";
+
+    my $current_unixtime = $start_unixtime;
+    my @IPs = @{ $user_IPs{$user_id} };
+
+    VISIT : foreach my $visit_num (1..100_000) {
+        print 'visit: ', $visit_num, "\n";
+        my @temp_inserts = ();
+        my $IP = (@IPs)[int rand @IPs];
+        my $current_page = 0;
+        my $visit_size = 10 + int rand 90;
+        $current_unixtime+= 86_400 + int rand(86_400 * 30);
+
+        my $section = $sections[int rand scalar @sections];
+        # print 'section: ', $section, "\n";
+
+        push(
+            @temp_inserts,
+            {
+                section => $section,
+            }
+        );
+
+        if ($section eq 'categories') {
+            CATEGORY : foreach my $category_id (
+                (shuffle @categories)[1..int rand scalar @categories]
+            ) {
+                # print 'category: ', $category_id, "\n";
+                push(
+                    @temp_inserts,
+                    {
+                        category_id => $category_id,
+                    }
+                );
+
+                my @images = @{$category_images{$category_id}};
+                IMAGE : foreach my $image_id (
+                    (shuffle @images)[1..min(10, scalar @images)]
+                ) {
+                    push(
+                        @temp_inserts,
+                        {
+                            category_id => $category_id,
+                            image_id => $image_id,
+                        }
+                    );
+                }
+            }
+        }
+
+        if ($section eq 'tags') {
+            # TODO
+        }
+
+        # transfert @temp_inserts to @inserts
+        print 'temp_insert size: ', scalar @temp_inserts, "\n";
+        foreach my $temp_insert (@temp_inserts) {
+            $current_unixtime+= 5 + int rand 25;
+            next VISIT if ++$current_page == $visit_size;
+            last VISIT if $current_unixtime >= $end_unixtime;
+
+            my $date = unixtime_to_mysqldate($current_unixtime);
+            my $time = unixtime_to_mysqltime($current_unixtime);
+
+            my ($year, $month, $day) = split '-', $date;
+            my ($hour) = split ':', $time;
+
+            $temp_insert->{date} = $date;
+            $temp_insert->{time} = $time;
+            $temp_insert->{year} = $year;
+            $temp_insert->{month} = $month;
+            $temp_insert->{day} = $day;
+            $temp_insert->{hour} = $hour;
+            $temp_insert->{IP} = $IP;
+            $temp_insert->{section} = $section;
+            $temp_insert->{user_id} = $user_id;
+
+            push(@inserts, $temp_insert);
+        }
+    }
+}
+
+@inserts = sort {
+    $a->{date} cmp $b->{date}
+    or $a->{time} cmp $b->{time}
+} @inserts;
+
+if (scalar @inserts) {
+    my @columns =
+        qw/
+              date time year month day hour
+              user_id IP
+              section category_id image_id
+          /;
+
+    my $question_marks_string = '(';
+    $question_marks_string.= join(
+        ',',
+        map {'?'} @columns
+    );
+    $question_marks_string.= ')';
+
+    my $query = '
+INSERT INTO '.$opt{prefix}.'history
+  ('.join(', ', @columns).')
+  VALUES
+';
+    $query.= join(
+        ',',
+        map {$question_marks_string} (1 .. scalar @inserts)
+    );
+    $query.= '
+';
+
+    # print $query, "\n";
+
+    my @values = ();
+
+    foreach my $insert (@inserts) {
+        push(
+            @values,
+            map {
+                $insert->{$_}
+            } @columns
+        );
+    }
+
+    $sth = $dbh->prepare($query);
+    $sth->execute(@values)
+        or die 'cannot execute insert query';
+}
+
+sub unixtime_to_mysqldate {
+    my ($unixtime) = @_;
+
+    ($sec,$min,$hour,$day,$month,$year) = localtime($unixtime);
+
+    return sprintf(
+        '%d-%02d-%02d',
+        $year+1900,
+        $month+1,
+        $day,
+    );
+}
+
+sub unixtime_to_mysqltime {
+    my ($unixtime) = @_;
+
+    ($sec,$min,$hour,$day,$month,$year) = localtime($unixtime);
+
+    return sprintf(
+        '%d:%d:%d',
+        $hour,
+        $min,
+        $sec
+    );
+}
Index: tags/2.4.0RC3/tools/index.php
===================================================================
--- tags/2.4.0RC3/tools/index.php	(revision 14585)
+++ tags/2.4.0RC3/tools/index.php	(revision 14585)
@@ -0,0 +1,30 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+// Recursive call
+$url = '../';
+header( 'Request-URI: '.$url );
+header( 'Content-Location: '.$url );
+header( 'Location: '.$url );
+exit();
+?>
Index: tags/2.4.0RC3/tools/key2value.php
===================================================================
--- tags/2.4.0RC3/tools/key2value.php	(revision 14585)
+++ tags/2.4.0RC3/tools/key2value.php	(revision 14585)
@@ -0,0 +1,126 @@
+#!/usr/bin/php -qn
+<?php
+if (isset($_SERVER['argc']) && $_SERVER['argc']<=1) 
+{
+  help();
+}
+
+$language = trim($_SERVER['argv'][1]);
+if (!is_dir("language/$language")) 
+{
+  help();
+}
+
+$Files = array('common', 'admin', 'install', 'upgrade');
+$exclude_keys = array('user_status_admin', 'user_status_generic', 
+		      'user_status_guest', 'user_status_normal',
+		      'user_status_webmaster', 'Level 0',
+		      'Level 1', 'Level 2', 'Level 4', 'Level 8',
+		      'chronology_monthly_calendar', 'chronology_monthly_list',
+		      'chronology_weekly_list');
+
+foreach ($Files as $file)
+{
+  $lang_file = sprintf('language/%s/%s.lang.php', $language, $file);
+  $en_file = sprintf('language/en_UK/%s.lang.php', $file);
+  include $lang_file;
+  $source_lang = $lang;
+  unset($lang);
+  include $en_file;
+
+  try 
+  {
+    $fh = fopen($lang_file, 'w+');
+
+    fwrite($fh, copyright());
+
+    if ($file == 'common')
+    {
+      foreach ($lang_info as $key => $value)
+      {
+	fwrite($fh, sprintf("\$lang_info['%s'] = \"%s\";\n", 
+			    $key, 
+			    $value
+			    )
+	       );		
+      }
+    }
+    fwrite($fh, "\n\n");
+
+    foreach ($lang as $key => $value) 
+    {
+      if (is_array($value))
+      {
+	foreach ($value as $k => $v)
+	{
+	fwrite($fh, sprintf("\$lang['%s'][%s] = \"%s\";\n", 
+			    str_replace("'", "\'", trim($key)),
+			    trim($k), 
+			    str_replace('"', '\"', trim($source_lang[$key][$k]))
+			    )
+	       );
+	}
+      }
+      elseif (in_array($key, $exclude_keys))
+      {
+	fwrite($fh, sprintf("\$lang['%s'] = \"%s\";\n", 
+			    str_replace("'", "\'", trim($key)), 
+			    str_replace('"', '\"', trim($source_lang[$key]))
+			    )
+	       );	
+      }
+      else 
+      {
+	fwrite($fh, sprintf("\$lang['%s'] = \"%s\";\n", 
+			    str_replace("'", "\'", trim($value)), 
+			    str_replace('"', '\"', trim($source_lang[$key]))
+			    )
+	       );
+      }
+    }
+    fwrite($fh, '?>');
+    fclose($fh);
+  } 
+  catch (Exception $e)
+  {
+    print $e->getMessage();
+  }
+}
+
+function help()
+{
+  echo "\n";
+  echo 'usage : ', basename($_SERVER['argv'][0]), " <LANGUAGE CODE>\n";
+  echo "\n";
+  exit(1);
+}
+
+function copyright()
+{
+  return 
+'<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+';
+}
+?>
Index: tags/2.4.0RC3/tools/language/translation_validated.inc.php
===================================================================
--- tags/2.4.0RC3/tools/language/translation_validated.inc.php	(revision 14585)
+++ tags/2.4.0RC3/tools/language/translation_validated.inc.php	(revision 14585)
@@ -0,0 +1,651 @@
+<?php
+$validated_keys = array(
+  'af_ZA' => array(
+	'IP: %s',
+	'IP',
+	'IPTC Metadata',
+	'Albums',
+	'Album',
+	'%d Kb',
+	'in %d sub-album',
+	'in %d sub-albums',
+	'Admin: %s',
+	'Album: %s',
+	'letters',
+	'EXIF Metadata',
+	),
+
+  'ar_SA' => array(
+	'IP: %s',
+	'IP',
+	'the wiki',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'bg_BG' => array(
+	'N/A',
+	'IP: %s',
+	),
+	
+  'cs_CZ' => array(
+	'Album',
+	'IP: %s',
+	'Album: %s',
+	'IP',
+	'EXIF Metadata',
+	'IPTC Metadata',
+	),
+	
+  'da_DK' => array(
+ 	'%d Kb',
+	'%d hit',
+	'%d hits',
+	'Connection settings',
+	'Login',
+	'Display',
+	'Filter',
+	'Links',
+	'N/A',
+	'Password',
+	'Quick connect',
+	'RSS feed',
+	'Reset',
+	'Tag',
+	'Tags',
+	'Webmaster',
+	'Administration',
+	'caddie',
+	'download',
+	'Logout',
+	'Powered by',
+	'Auto login',
+	'slideshow',
+	'SQL queries in',
+	'Thumbnails',
+	'Menu',
+	'IP: %s',
+	'Browser: %s',
+	'Email: %s',
+	'Admin: %s',
+	'Rank',
+	'cloud',
+	'Pause of slideshow',
+	'Database type',
+	'Installation',
+	'Webmaster login',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Webmaster password',
+	'%d tag',
+	'%d tags',
+	'Caddie',
+	'Database',
+	'Elements',
+	'Form',
+	'Gallery URL',
+	'Path',
+	'Permalink',
+	'Permalinks',
+	'Plugins',
+	'Position',
+	'Rating',
+	'Representant',
+	'Site manager',
+	'Status',
+	'Version',
+	'Main',
+	'File',
+	'High definition',
+	'email',
+	'Send',
+	'Remote',
+	'Piwigo administration',
+	'GD version',
+	'[Simulation]',
+	'Upload',
+	'user_status_admin',
+	'user_status_webmaster',
+	'IP',
+	'Element',
+	'Element type',
+	'Hoverbox display',
+	'Level 8',
+	'Plugins up to date',
+	'Support',
+	'Piwigo Administration',
+	'Piwigo version',
+	'Original templates',
+	'Downloads',
+	'Download',
+	'Hit',
+	'Resize',
+	'Miscellaneous',
+	'Virtual Links',
+	'SQL queries',
+	'Edit',
+	'%d rates',
+	'Rating score',
+	'Password Reset',
+	'Invalid key',
+	'EXIF Metadata',
+	'IPTC Metadata',
+	),	
+
+  'de_DE' => array(
+ 	'%d Kb',
+	'Filter',
+	'Links',
+	'Tag',
+	'Tags',
+	'Webmaster',
+	'Administration',
+	'Thumbnails',
+	'IP: %s',
+	'Browser: %s',
+	'Name',
+	'Permalink',
+	'Permalinks',
+	'Plugins',
+	'Position',
+	'Status',
+	'Version',
+	'High definition',
+	'Parameter',
+	'private',
+	'Thumbnail',
+	'Simulation',
+	'Upload',
+	'user_status_admin',
+	'user_status_webmaster',
+	'IP',
+	'Privacy level',
+	'Demo',
+	'Support',
+	'Bugs',
+	'Downloads',
+	'Installation',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Upgrade',
+	'Download,',
+	'Piwigo Uploader',
+	'[Simulation]',
+	'Album',
+	'Album: %s',
+	'Remote',
+	),
+
+  'el_GR' => array(
+	'%d Kb',
+	'Email: %s',
+	'IP: %s',
+	'Powered by',
+	),
+
+  'es_AR' => array(
+	'%d Kb',
+	'Webmaster',
+	'IP: %s',
+	'No',
+	),
+
+  'es_ES' => array(
+    'Tag',
+    'Tags',
+	'IP: %s',
+	'Email: %s',
+	'No',
+	'%d tag',
+	'%d tags',
+	'Plugins',
+	'is_high_disabled',
+	'nbm_content_goto_2',
+	'nbm_content_hello_2',
+	'site_local',
+	'update_simulation_title',
+	'IP',
+	'Level 8',
+	'DEMO',
+	'BUGS',
+	'step1_host_info',
+	'Albums',
+	'General',
+	'Local',
+	'Demo',
+	'Bugs',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Piwigo Uploader',
+	),
+	
+  'fr_FR' => array(
+    'Dimensions',
+    'Identification',
+    'Notification',
+    'Tag',
+    'Tags',
+    'admin',
+    'identification',
+    'redirect_msg',
+    'search_date_from',
+    'title_menu',
+    'IP: %s',
+    'Email: %s',
+    '%d element',
+    '%d elements',
+    '%d association',
+    '%d associations',
+    '%d tag',
+    '%d tags',
+    'Actions',
+    'Description',
+    'Informations',
+    'Maintenance',
+    'Options',
+    'Plugins',
+    'Position',
+    'Validation',
+    'Version',
+    'config',
+    'Date',
+    'instructions',
+    'is_high_disabled',
+    'nbm_content_goto_2',
+    'nbm_content_hello_2',
+    'nbm_item_notification',
+    'nbm_send_options',
+    'permissions',
+    'public',
+    'site_local',
+    'update_simulation_title',
+    'IP',
+    'image',
+    'section',
+    'tags',
+    'high',
+    'c13y_Correction',
+    'Level 1',
+    'Level 8',
+    'FORUM',
+    'EXTENSIONS',
+    'WIKI / DOC',
+    'Installation',
+    'step1_host_info',
+	'Administration',
+	'Redirection...',
+	'Menu',
+	'%d photo',
+	'%d photos',
+	'Configuration',
+	'Instructions',
+	'Permissions',
+	'Local',
+	'[Simulation]',
+	'Section',
+	'Correction',
+	'Support',
+	'Extensions',
+	'Documentation',
+	'Photos',
+	'photo',
+	'pixels',
+	'Piwigo Uploader',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'email',
+	'Albums',
+	'Album',
+	'Menu Management',
+	'Action',
+	'Simulation',
+    ),
+	
+  'he_IL' => array(
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'hr_HR' => array(
+	'%d Kb',
+	'Filter',
+	'Tag',
+	'Webmaster',
+	'IP: %s',
+	'%d tag',
+	'user_status_webmaster',
+	'IP',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'hu_HU' => array(
+	'Album',
+	'Album: %s',
+	),
+
+  'is_IS' => array(
+	'%d Kb',
+	'N/A',
+	'IP: %s',
+	'Admin: %s',
+	),
+	
+  'it_IT' => array(
+	'Album',
+    'Album: %s',
+    'Browser: %s',
+	'Database',
+	'Directory',
+	'Download',
+	'Downloads',
+	'email',
+	'Email',
+	'Email: %s',
+	'File',
+	'Home',
+	'high',
+	'Host',
+	'IP',
+	'IP: %s',
+	'Links',
+	'Logout',
+	'Menu',
+	'N/A',
+	'No',
+	'Password',
+	'Permalink',
+	'Permalinks',
+	'pixels',
+	'Piwigo Uploader',
+	'Plugin',
+	'Plugins',
+	'Tag',
+	'Tags',
+	'%d tag',
+	'%d tags',
+	'Tools',
+	'user_status_webmaster',
+	'Webmaster',
+	'in %d sub-album',
+	),
+	
+  'ja_JP' => array(
+ 	'About',
+	'Since',
+	'Powered by',
+ 	'IP: %s',
+	'IP',
+	'Sent by',
+	'%d Kb',
+	'',
+	),
+	
+  'lv_LV' => array(
+ 	'%d Kb',
+	'N/A',
+	'IP: %s',
+	'IP',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+
+  'nl_NL' => array(
+ 	'%d Kb',
+	'Filter',
+	'Help',
+	'Links',
+	'RSS feed',
+	'Reset',
+	'Tag',
+	'Tags',
+	'Week %d',
+	'download',
+	'Powered by',
+	'Auto login',
+	'Contact',
+	'SQL queries in',
+	'Menu',
+	'IP: %s',
+	'Browser: %s',
+	'Email: %s',
+	'Piwigo Help',
+	'%d tag',
+	'%d tags',
+	'Batch management',
+	'Database',
+	'Permalink',
+	'Permalinks',
+	'Plugins',
+	'Representant',
+	'Site manager',
+	'Status',
+	'email',
+	'Parameter',
+	'Parameters',
+	'Remote site',
+	'test',
+	'Remote',
+	'unit mode',
+	'Upload',
+	'IP',
+	'Level 8',
+	'Demo',
+	'Hits',
+	'Downloads',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Upgrade',
+	'SQL queries',
+ 	'letters',
+	'This author removed the comment with id %d',
+	'Database type',
+	'Sorry!',
+	'Hope to see you back soon.',
+	'Hit',
+	'pixels',
+	'Download',
+	'Piwigo Uploader',
+	'Download,',
+	'Compact',
+	'Updates',
+	'ERROR',
+	'Piwigo Update',
+	'Dump Database',
+	'Start Upload',
+	),
+	
+  'no_NO' => array(
+ 	'IP: %s',
+	'Browser: %s',
+	'Email: %s',
+	'Admin: %s',
+	'Pause of slideshow',
+	'Album',
+	'Filter',
+	'N/A',
+	'Webmaster',
+	'%d Kb',
+	'representative',
+	'slideshow',
+	'Album: %s',
+	'Album results for',
+	'%d tag',
+	'Database',
+	'Permalink',
+	'Representant',
+	'Representative',
+	'Status',
+	'Main',
+	'email',
+	'Parameter',
+	'Send',
+	'test',
+	'status',
+	'user_status_admin',
+	'user_status_webmaster',
+	'IP',
+	'Element',
+	'Tags',
+	'Element type',
+	'Database type',
+	'Host',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'pl_PL' => array(
+ 	'%d Kb',
+	'RSS feed',
+	'Webmaster',
+	'IP: %s',
+	'Tag',
+	'Powered by',
+	'Email: %s',
+	'Admin: %s',
+	'%d tag',
+	'Status',
+	'test',
+	'status',
+	'user_status_admin',
+	'user_status_webmaster',
+	'localhost, sql.multimania.com, toto.freesurf.fr',	
+	'IP',		
+	'Menu',			
+	'Album',
+	),
+
+  'pt_BR' => array(
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'pt_PT' => array(
+	'%d Kb',
+	'Links',
+	'Webmaster',
+	'Powered by',
+	'IP: %s',
+	'Email: %s',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Permalinks',
+	'Plugins',
+	'Local',
+	'user_status_webmaster',
+	'IP',
+	'Downloads',
+	'Download',
+	'Download,',
+	'EXIF Metadata',
+	'IPTC Metadata',
+	'Original',
+	'Zoom',
+	'',
+	),
+	
+  'ro_RO' => array(
+	'%d Kb',
+	'N/A',
+	'RSS feed',
+	'Webmaster',
+	'Calendar',
+	'Contact',
+	),
+
+  'ru_RU' => array(
+	'IP',
+	'IP: %s',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'',
+	),
+
+  'sl_SL' => array(
+	'%d Kb',
+	'Filter',
+	'N/A',
+	'caddie',
+	'IP: %s',
+	'show tag cloud',
+	'cloud',
+	),
+	
+  'sk_SK' => array(
+	'%d Kb',
+	'Album',
+	'Filter',
+	'Webmaster',
+	'IP: %s',
+	'Album: %s',
+	'test',
+	'user_status_webmaster',
+	'IP',
+	'EXIF Metadata',
+	'IPTC Metadata',
+	),
+	
+  'sr_RS' => array(
+ 	'%d Kb',
+	'Filter',
+	'Webmaster',
+	'IP: %s',
+	'user_status_admin',
+	'user_status_webmaster',
+	'IP',
+	'Element',
+	'Host',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'sv_SE' => array(
+ 	'%d association',
+	'Plugins',
+	'Position',
+	'Representant',
+	'Status',
+	'Version',
+	'High definition',
+	'test',
+	'status',
+	'Piwigo administration',
+	'GD version',
+	'user_status_webmaster',
+	'IP',
+	'Element',
+	'Piwigo Administration',
+	'Piwigo version',
+	'IP: %s',
+	'Admin: %s',
+	'Filter',
+	'Administration',
+	'%d Kb',
+	'Installation',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Album: %s',
+	'Album',
+	'Informations',
+	'EXIF Metadata',
+	'IPTC Metadata',
+	),
+	
+  'tr_TR' => array(
+ 	'%d hit',
+	'N/A',
+	'Webmaster',
+	'IP: %s',
+	'Host',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),
+	
+  'vi_VN' => array(
+	'%d Kb',
+	'Caddie',
+	'Form',
+	'Plugins',
+	'user_status_webmaster',
+	'Templates',
+	'pixels',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'Desktop',
+	),
+	
+  'zh_CN' => array(
+	'IP',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	'%d Kb',
+	),
+
+  'zh_TW' => array(
+	'IP',
+	'localhost, sql.multimania.com, toto.freesurf.fr',
+	),	
+  );
+?>
Index: tags/2.4.0RC3/tools/local-layout.css
===================================================================
--- tags/2.4.0RC3/tools/local-layout.css	(revision 14585)
+++ tags/2.4.0RC3/tools/local-layout.css	(revision 14585)
@@ -0,0 +1,10 @@
+/* Add background picture */
+BODY {
+  background-image:url(background.gif);
+  background-attachment:fixed;
+}
+
+UL.thumbnails SPAN.wrap2 {
+  height: 200px; /* max thumbnail height + 2px */
+}
+
Index: tags/2.4.0RC3/tools/metadata.php
===================================================================
--- tags/2.4.0RC3/tools/metadata.php	(revision 14585)
+++ tags/2.4.0RC3/tools/metadata.php	(revision 14585)
@@ -0,0 +1,97 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$filename = 'sample.jpg';
+echo 'Informations are read from '.$filename.'<br><br><br>';
+
+/**
+ * return a cleaned IPTC value
+ *
+ * @param string value
+ * @return string
+ */
+function clean_iptc_value($value)
+{
+  // strip leading zeros (weird Kodak Scanner software)
+  while ( isset($value[0]) and $value[0] == chr(0))
+  {
+    $value = substr($value, 1);
+  }
+  // remove binary nulls
+  $value = str_replace(chr(0x00), ' ', $value);
+
+  return $value;
+}
+
+$iptc_result = array();
+$imginfo = array();
+getimagesize($filename, $imginfo);
+if (isset($imginfo['APP13']))
+{
+  $iptc = iptcparse($imginfo['APP13']);
+  if (is_array($iptc))
+  {
+    foreach (array_keys($iptc) as $iptc_key)
+    {
+      if (isset($iptc[$iptc_key][0]))
+      {
+        if ($iptc_key == '2#025')
+        {
+          $value = implode(
+            ',',
+            array_map(
+              'clean_iptc_value',
+              $iptc[$iptc_key]
+              )
+            );
+        }
+        else
+        {
+          $value = clean_iptc_value($iptc[$iptc_key][0]);
+        }
+        
+        $iptc_result[$iptc_key] = $value;
+      }
+    }
+  }
+
+  echo 'IPTC Fields in '.$filename.'<br>';
+  $keys = array_keys($iptc_result);
+  sort($keys);
+  foreach ($keys as $key)
+  {
+    echo '<br>'.$key.' = '.$iptc_result[$key];
+  }
+}
+else
+{
+  echo 'no IPTC information';
+}
+
+echo '<br><br><br>';
+echo 'EXIF Fields in '.$filename.'<br>';
+$exif = read_exif_data($filename);
+echo '<pre>';
+print_r($exif);
+echo '</pre>';
+?>
Index: tags/2.4.0RC3/tools/missing_keys.pl
===================================================================
--- tags/2.4.0RC3/tools/missing_keys.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/missing_keys.pl	(revision 14585)
@@ -0,0 +1,193 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use File::Find;
+
+our %used_keys = ();
+our %registered_keys = ();
+
+my $piwigo_dir = $ARGV[0]; # '/home/pierrick/public_html/piwigo/dev/trunk';
+my $type = $ARGV[1];       # common, admin, install, upgrade
+
+find(\&used_keys, $piwigo_dir);
+load_registered_keys($type);
+
+# foreach my $key (sort keys %used_keys) {
+#     # print "{".$key."}", ' is used', "\n";
+
+#     if (not defined $registered_keys{$key}) {
+#         # print "{".$key."}", ' is missing', "\n";
+#         print '$lang[\''.$key.'\'] = \''.$key.'\';', "\n";
+#     }
+# }
+
+my %ignore_keys = (
+    '%d new photo' => 1,
+    '%d new photos' => 1,
+    '%d category updated' => 1,
+    '%d categories updated' => 1,
+    '%d new comment' => 1,
+    '%d new comments' => 1,
+    '%d comment to validate' => 1,
+    '%d comments to validate' => 1,
+    '%d new user' => 1,
+    '%d new users' => 1,
+    '%d waiting element' => 1,
+    '%d waiting elements' => 1,
+    'user_status_admin' => '',
+    'user_status_generic' => '',
+    'user_status_guest' => '',
+    'user_status_normal' => '',
+    'user_status_webmaster' => '',
+    'Level 0' => '',
+    'Level 1' => '',
+    'Level 2' => '',
+    'Level 4' => '',
+    'Level 8' => '',
+    'ACCESS_0' => '',
+    'ACCESS_1' => '',
+    'ACCESS_2' => '',
+    'ACCESS_3' => '',
+    'ACCESS_4' => '',
+    'ACCESS_5' => '',
+    'month' => '',
+    'day' => '',
+    'chronology_monthly_calendar' => '',
+    'chronology_monthly_list' => '',
+    'chronology_weekly_list' => '',
+    'public' => '',
+    'private' => '',
+    'none' => '',
+    'other' => '',
+    'high' => '',
+    'Waiting page: %s' => '',
+    'Admin: %s' => '',
+    'Manage this user comment: %s' => '',
+    'Main "guest" user does not exist' => '',
+    'Main "guest" user status is incorrect' => '',
+    'Main "webmaster" user does not exist' => '',
+    'Main "webmaster" user status is incorrect' => '',
+    'Default user does not exist' => '',
+    '(!) This comment requires validation' => '',
+);
+
+
+foreach my $key (sort keys %registered_keys) {
+    if (not defined $used_keys{$key} and not defined $ignore_keys{$key}) {
+        print "{".$key."}", ' is not used anywhere', "\n";
+    }
+}
+
+sub used_keys {
+    if ($File::Find::name !~ m/(tpl|php)$/) {
+        return 0;
+    }
+
+    if ($File::Find::name =~ m{/(plugins|language|_data)/}) {
+        return 0;
+    }
+
+    if ('upgrade' eq $type) {
+        if ($File::Find::name !~ m{upgrade\.(tpl|php)$}) {
+            # return 0;
+        }
+    }
+
+    if ('install' eq $type) {
+        if ($File::Find::name =~ m{upgrade\.(tpl|php)$}) {
+            return 0;
+        }
+        if ($File::Find::name !~ m{/install(\.tpl|\.php|/)}) {
+            return 0;
+        }
+    }
+
+    if ('admin' eq $type) {
+        if ($File::Find::name =~ m{upgrade\.(tpl|php)$}) {
+            return 0;
+        }
+        if ($File::Find::name =~ m{/install(\.tpl|\.php|/)}) {
+            return 0;
+        }
+
+        my $is_admin = 0;
+
+        if ($File::Find::name =~ m{themes/default/template/mail}) {
+            $is_admin = 1;
+        }
+        if ($File::Find::name =~ m{/admin/}) {
+            $is_admin = 1;
+        }
+        if ($File::Find::name =~ m{/admin\.php$}) {
+            $is_admin = 1;
+        }
+
+        if (not $is_admin) {
+            return 0;
+        }
+    }
+
+    if ('common' eq $type) {
+        if ($File::Find::name =~ m{upgrade\.(tpl|php)$}) {
+            return 0;
+        }
+        if ($File::Find::name =~ m{/install(\.tpl|\.php|/)}) {
+            return 0;
+        }
+        if ($File::Find::name =~ m{/admin(/|\.php)} or $File::Find::name =~ m{themes/default/template/mail}) {
+            return 0;
+        }
+    }
+
+    if (-f) {
+        my $big_string = '';
+        open(my $fhi, '<', $File::Find::name);
+        while (<$fhi>) {
+            chomp;
+            s{//.*$}{};
+            $big_string.= $_;
+        }
+        close($fhi);
+
+        while ($big_string =~ m/\{(['"])(.+?)\1\|\@translate/g) {
+            $used_keys{$2}++;
+        }
+
+        while ($big_string =~ m/l10n \s* \( \s* (['"]) (.+?) \1 \s* \)/xg) {
+            $used_keys{$2}++;
+        }
+
+        while ($big_string =~ m/l10n_args \s* \( \s* (['"]) (.+?) \1 \s* ,/xg) {
+            $used_keys{$2}++;
+        }
+
+        while ($big_string =~ m/l10n_dec \s* \( \s* (['"]) (.+?) \1 \s* ,\s* (['"]) (.+?) \3 \s* ,/xg) {
+            $used_keys{$2}++;
+            $used_keys{$4}++;
+        }
+    }
+}
+
+sub load_registered_keys {
+    my ($type) = @_;
+
+    my %files_for_type = (
+        common  => [qw/common/],
+        admin   => [qw/common admin/],
+        install => [qw/common admin install/],
+        upgrade => [qw/common admin install upgrade/],
+    );
+
+    foreach my $file_code (@{$files_for_type{$type}}) {
+        my $filepath = $piwigo_dir.'/language/en_UK/'.$file_code.'.lang.php';
+
+        open(my $fhi, '<', $filepath);
+        while (<$fhi>) {
+            if (m/\$lang\[ \s* (['"]) (.+?) \1 \s* \]/x) {
+                $registered_keys{$2}++;
+            }
+        }
+    }
+}
Index: tags/2.4.0RC3/tools/photos.lang.php
===================================================================
--- tags/2.4.0RC3/tools/photos.lang.php	(revision 14585)
+++ tags/2.4.0RC3/tools/photos.lang.php	(revision 14585)
@@ -0,0 +1,72 @@
+<?php
+// common
+$lang['%d new image'] = '%d new photo';
+$lang['%d new images'] = '%d new photos';
+$lang['add this image to your favorites'] = 'add this photo to your favorites';
+$lang['display best rated items'] = 'display best rated photos';
+$lang['display each day with pictures, month per month'] = 'display each day with photos, month per month';
+$lang['delete this image from your favorites'] = 'delete this photo from your favorites';
+$lang['display my favorites pictures'] = 'display your favorites photos';
+$lang['shows images at the root of this album'] = 'display this album';
+$lang['display most visited pictures'] = 'display most visited photos';
+$lang['Rate this picture'] = 'Rate this photo';
+$lang['Random pictures'] = 'Random photos';
+$lang['display a set of random pictures'] = 'display a set of random photos';
+$lang['Recent pictures'] = 'Recent photos';
+$lang['display most recent pictures'] = 'display most recent photos';
+$lang['display only recently posted images'] = 'display only recently posted photos';
+$lang['return to the display of all images'] = 'return to the display of all photos';
+$lang['%d image'] = '%d photo';
+$lang['%d images'] = '%d photos';
+$lang['%d image is also linked to current tags'] = '%d photo is also linked to current tags';
+$lang['%d images are also linked to current tags'] = '%d photos are also linked to current tags';
+$lang['See images linked to this tag only'] = 'display photos linked to this tag';
+$lang['images posted during the last %d days'] = 'photos posted during the last %d days';
+$lang['delete all images from your favorites'] = 'delete all photos from your favorites';
+$lang['Complete RSS feed (images, comments)'] = 'Complete RSS feed (photos, comments)';
+$lang['Image only RSS feed'] = 'Photos only RSS feed';
+$lang['The RSS notification feed provides notification on news from this website : new pictures, updated albums, new comments. Use a RSS feed reader.'] = 'The RSS notification feed provides notification on news from this website : new photos, updated albums, new comments. Use a RSS feed reader.';
+$lang['Maximum height of the pictures'] = 'Maximum photo height';
+$lang['Maximum width of the pictures'] = 'Maximum photo width';
+$lang['display all elements in all sub-albums'] = 'display all photos in all sub-albums';
+$lang['The number of images per row must be a not null scalar'] = 'The number of photos per row must be a not null scalar';
+$lang['Number of images per row'] = 'Number of photos per row';
+$lang['Elements posted within the last %d day.'] = 'Photos posted within the last %d day.';
+$lang['Elements posted within the last %d days.'] = 'Photos posted within the last %d days.';
+$lang['picture'] = 'photo';
+$lang['Click on the picture to see it in high definition'] = 'Click on the photo to see it in high definition';
+
+// admin
+$lang['Edit all picture informations'] = 'Edit photo information';
+$lang['Include display of recent pictures group by dates'] = 'Include display of recent photos grouped by dates';
+$lang['Link all album elements to a new album'] = 'Link all album photos to a new album';
+$lang['Link all album elements to some existing albums'] = 'Link all album photos to some existing albums';
+$lang['Manage image ranks'] = 'Manage photo ranks';
+$lang['New elements added'] = 'New photos added';
+$lang['New elements were added'] = 'New photos were added';
+$lang['No element in this album'] = 'No photo in this album';
+$lang['Select at least one picture'] = 'Select at least one photo';
+$lang['Update images informations'] = 'Update photos information';
+$lang['Use the default image sort order (defined in the configuration file)'] = 'Use the default photo sort order (defined in the configuration file)';
+$lang['add new elements to caddie'] = 'add new photos to caddie';
+$lang['display maximum informations (added albums and elements, deleted albums and elements)'] = 'display maximum informations (added albums and photos, deleted albums and photos)';
+$lang['elements added in the database'] = 'photos added in the database';
+$lang['elements deleted in the database'] = 'photos deleted from the database';
+$lang['elements per page'] = 'photos per page';
+$lang['elements updated in the database'] = 'photos updated in the database';
+$lang['even already synchronized elements'] = 'even already synchronized photos';
+$lang['first element added on %s'] = 'first photo added on %s';
+$lang['images candidates for metadata synchronization'] = 'photos candidates for metadata synchronization';
+$lang['jump to image'] = 'jump to photo';
+$lang['manage image ranks'] = 'manage photo ranks';
+
+
+$lang['manage album elements'] = 'manage album photos';
+$lang['synchronize files metadata with database elements informations'] = 'synchronize files metadata with database photos informations';
+$lang['elements informations synchronized with files metadata'] = 'photos informations synchronized with files metadata';
+$lang['number of miniaturized pictures'] = 'number of miniaturized photos';
+$lang['Picture informations updated'] = 'Photo informations updated';
+$lang['Picture unreachable or no support'] = 'Photo unreachable or no support';
+$lang['pictures without thumbnail (jpeg and png only)'] = 'photos without thumbnail (jpeg and png only)';
+$lang['Random picture'] = 'Random photo';
+?>
Index: tags/2.4.0RC3/tools/piwigo_remote.pl
===================================================================
--- tags/2.4.0RC3/tools/piwigo_remote.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/piwigo_remote.pl	(revision 14585)
@@ -0,0 +1,453 @@
+#!/usr/bin/perl
+
+####
+# Usage examples
+#
+# time perl piwigo_remote.pl \
+#   --action=pwg.images.add \
+#   --file=erwann_rocher-web.jpg \
+#   --thumb=erwann_rocher-thumb.jpg \
+#   --high=erwann_rocher-high.jpg \
+#   --original=erwann_rocher-high.jpg \
+#   --define categories=9 \
+#   --chunk_size=200_000
+
+use strict;
+use warnings;
+
+use JSON;
+use LWP::UserAgent;
+# LWP::Debug::level('+');
+use Getopt::Long;
+use Encode qw/is_utf8 decode/;
+use POSIX qw(ceil floor);
+
+my %opt = ();
+GetOptions(
+    \%opt,
+    qw/
+          action=s
+          file=s
+          thumbnail=s
+          high=s
+          original=s
+          categories=s
+          chunk_size=i
+          base_url=s
+          username=s
+          password=s
+          define=s%
+      /
+);
+
+our $ua = LWP::UserAgent->new;
+$ua->agent('Mozilla/piwigo_remote.pl 1.25');
+$ua->cookie_jar({});
+
+my %conf;
+$conf{response_format} = 'json';
+$conf{limit} = 10;
+
+my %conf_default = (
+    base_url => 'http://localhost/piwigo/2.0',
+    username => 'plg',
+    password => 'plg',
+    chunk_size => 500_000,
+);
+foreach my $conf_key (keys %conf_default) {
+    $conf{$conf_key} = defined $opt{$conf_key} ? $opt{$conf_key} : $conf_default{$conf_key}
+}
+
+$ua->default_headers->authorization_basic(
+    $conf{username},
+    $conf{password}
+);
+
+my $result = undef;
+my $query = undef;
+
+binmode STDOUT, ":encoding(utf-8)";
+
+# TODO : don't connect at each script call, use the session duration instead.
+my $form = {
+    method => 'pwg.session.login',
+    username => $conf{username},
+    password => $conf{password},
+};
+
+$result = $ua->post(
+    $conf{base_url}.'/ws.php?format=json',
+    $form
+);
+
+# print "\n", $ua->cookie_jar->as_string, "\n";
+
+if ($opt{action} eq 'pwg.images.add') {
+    use Digest::MD5::File qw/file_md5_hex/;
+
+    $form = {};
+    $form->{method} = $opt{action};
+
+    my $original_sum = file_md5_hex($opt{original});
+    $form->{original_sum} = $original_sum;
+
+    send_chunks(
+        filepath => $opt{file},
+        type => 'file',
+        original_sum => $original_sum,
+    );
+    $form->{file_sum} = file_md5_hex($opt{file});
+
+    send_chunks(
+        filepath => $opt{thumbnail},
+        type => 'thumb',
+        original_sum => $original_sum,
+    );
+    $form->{thumbnail_sum} = file_md5_hex($opt{thumbnail});
+
+    if (defined $opt{high}) {
+        send_chunks(
+            filepath => $opt{high},
+            type => 'high',
+            original_sum => $original_sum,
+        );
+        $form->{high_sum} = file_md5_hex($opt{high});
+    }
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    print "-" x 50, "\n";
+    printf("response code    : %u\n", $response->code);
+    printf("response message : %s\n", $response->message);
+    print "-" x 50, "\n";
+    print "\n";
+
+#     use Data::Dumper;
+#     print Dumper($response->content);
+#     print Dumper(from_json($response->content));
+
+    if ($response->is_success) {
+        print "upload successful\n";
+    }
+    else {
+        print Dumper($response);
+        warn 'A problem has occured during upload', "\n";
+        warn $response->decoded_content, "\n";
+        die $response->status_line;
+    }
+}
+
+if ($opt{action} eq 'pwg.images.addFile') {
+    use Digest::MD5::File qw/file_md5_hex/;
+
+    if (not defined $opt{define}{image_id}) {
+        die '--define image_id=1234 is missing';
+    }
+
+    # which file type are we going to add/update?
+    my $type = undef;
+
+    foreach my $test_type (qw/thumbnail file high/) {
+        if (defined $opt{$test_type}) {
+            $type = $test_type;
+            last;
+        }
+    }
+
+    if (not defined $type) {
+        die 'at least one of file/thumbnail/high parameters must be set';
+    }
+
+    my $type_code = typecode_from_typename($type);
+
+    send_chunks(
+        filepath => $opt{$type},
+        type => $type_code,
+        original_sum => file_md5_hex($opt{original}),
+    );
+
+    $form = {};
+    $form->{method} = $opt{action};
+    $form->{type}   = $type_code;
+    $form->{sum}    = file_md5_hex($opt{$type});
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    print "-" x 50, "\n";
+    printf("response code    : %u\n", $response->code);
+    printf("response message : %s\n", $response->message);
+    print "-" x 50, "\n";
+    print "\n";
+
+#     use Data::Dumper;
+#     print Dumper($response->content);
+#     print Dumper(from_json($response->content));
+
+    if ($response->is_success) {
+        print "upload successful\n";
+    }
+    else {
+        print Dumper($response);
+        warn 'A problem has occured during upload', "\n";
+        warn $response->decoded_content, "\n";
+        die $response->status_line;
+    }
+}
+
+if ($opt{action} eq 'pwg.tags.list') {
+    use Text::ASCIITable;
+
+    $query = pwg_ws_get_query(
+        method => 'pwg.tags.getList',
+        sort_by_counter => 'true',
+    );
+
+    $result = $ua->get($query);
+    my $tag_result = from_json($result->content);
+    my $t = Text::ASCIITable->new({ headingText => 'Tags' });
+    $t->setCols('id','counter','name');
+
+    my $tag_number = 1;
+    foreach my $tag_href (@{ $tag_result->{result}{tags} }) {
+        $t->addRow(
+            $tag_href->{id},
+            $tag_href->{counter},
+            $tag_href->{name}
+        );
+
+        last if $tag_number++ >= $conf{limit};
+    }
+    print $t;
+}
+
+if ($opt{action} eq 'pwg.tags.getAdminList') {
+    $query = pwg_ws_get_query(
+        method => 'pwg.tags.getAdminList'
+    );
+
+    $result = $ua->get($query);
+    print Dumper($result);
+    my $tags = from_json($result->content)->{result}{tags};
+
+    foreach my $tag (@{$tags}) {
+        # print join(',', keys %{$tag}), "\n"; exit();
+        printf(
+            '{%u} %s ',
+            $tag->{id},
+            $tag->{name}
+        );
+    }
+
+    print "\n";
+}
+
+if ($opt{action} eq 'pwg.categories.add') {
+    $form = {
+        method => 'pwg.categories.add',
+        name => $opt{define}{name},
+        parent => $opt{define}{parent},
+    };
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    use Data::Dumper;
+    print Dumper(from_json($response->content));
+}
+
+if ($opt{action} eq 'pwg.tags.add') {
+    $form = {
+        method => 'pwg.tags.add',
+        name => $opt{define}{name},
+    };
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    use Data::Dumper;
+    print Dumper(from_json($response->content));
+}
+
+if ($opt{action} eq 'pwg.images.exist') {
+    $form = {
+        method => $opt{action},
+    };
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    use Data::Dumper;
+    print Dumper(from_json($response->content)->{result});
+    # print Dumper($response);
+}
+
+if ($opt{action} eq 'pwg.images.checkFiles') {
+    use Digest::MD5::File qw/file_md5_hex/;
+
+    $form = {};
+    $form->{method} = $opt{action};
+
+    foreach my $type (qw/thumbnail file high/) {
+        if (defined $opt{$type}) {
+            $form->{$type.'_sum'} = file_md5_hex($opt{$type});
+        }
+    }
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    print "-" x 50, "\n";
+    printf("response code    : %u\n", $response->code);
+    printf("response message : %s\n", $response->message);
+    print "-" x 50, "\n";
+    print "\n";
+
+    use Data::Dumper;
+    print Dumper(from_json($response->content));
+}
+
+if ($opt{action} eq 'pwg.images.setInfo' or $opt{action} eq 'pwg.categories.setInfo') {
+    $form = {
+        method => $opt{action},
+    };
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    use Data::Dumper;
+    # print Dumper(from_json($response->content)->{result});
+    print Dumper($response);
+}
+
+if ($opt{action} eq 'pwg.categories.getList') {
+    $form = {
+        method => $opt{action},
+    };
+
+    foreach my $key (keys %{ $opt{define} }) {
+        $form->{$key} = $opt{define}{$key};
+    }
+
+    my $response = $ua->post(
+        $conf{base_url}.'/ws.php?format=json',
+        $form
+    );
+
+    use Data::Dumper;
+    print Dumper($response->content);
+    print Dumper(from_json($response->content)->{result});
+    print Dumper($response);
+}
+
+
+$query = pwg_ws_get_query(
+    method => 'pwg.session.logout'
+);
+$ua->get($query);
+
+sub pwg_ws_get_query {
+    my %params = @_;
+
+    my $query = $conf{base_url}.'/ws.php?format='.$conf{response_format};
+
+    foreach my $key (keys %params) {
+        $query .= '&'.$key.'='.$params{$key};
+    }
+
+    return $query;
+}
+
+sub send_chunks {
+    my %params = @_;
+
+    use MIME::Base64 qw(encode_base64);
+    use File::Slurp;
+
+    my $content = read_file($params{filepath});
+    my $content_length = length($content);
+    my $nb_chunks = ceil($content_length / $conf{chunk_size});
+
+    my $chunk_pos = 0;
+    my $chunk_id = 1;
+    while ($chunk_pos < $content_length) {
+        my $chunk = substr(
+            $content,
+            $chunk_pos,
+            $conf{chunk_size}
+        );
+        $chunk_pos += $conf{chunk_size};
+
+        my $response = $ua->post(
+            $conf{base_url}.'/ws.php?format=json',
+            {
+                method => 'pwg.images.addChunk',
+                data => encode_base64($chunk),
+                original_sum => $params{original_sum},
+                position => $chunk_id,
+                type => $params{type},
+            }
+        );
+
+        printf(
+            'chunk %05u of %05u for %s "%s"'."\n",
+            $chunk_id,
+            $nb_chunks,
+            $params{type},
+            $params{filepath}
+        );
+        if ($response->code != 200) {
+            printf("response code    : %u\n", $response->code);
+            printf("response message : %s\n", $response->message);
+        }
+
+        $chunk_id++;
+    }
+}
+
+sub typecode_from_typename {
+    my ($typename) = @_;
+
+    my $typecode = $typename;
+
+    if ('thumbnail' eq $typename) {
+        $typecode = 'thumb';
+    }
+
+    return $typecode;
+}
Index: tags/2.4.0RC3/tools/prototype.js
===================================================================
--- tags/2.4.0RC3/tools/prototype.js	(revision 14585)
+++ tags/2.4.0RC3/tools/prototype.js	(revision 14585)
@@ -0,0 +1,4221 @@
+/*  Prototype JavaScript framework, version 1.6.0.2
+ *  (c) 2005-2008 Sam Stephenson
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *  For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.6.0.2',
+
+  Browser: {
+    IE:     !!(window.attachEvent && !window.opera),
+    Opera:  !!window.opera,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
+  BrowserFeatures: {
+    XPath: !!document.evaluate,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div').__proto__ &&
+      document.createElement('div').__proto__ !==
+        document.createElement('form').__proto__
+  },
+
+  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
+  K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+  Prototype.BrowserFeatures.SpecificElementExtensions = false;
+
+
+/* Based on Alex Arnell's inheritance implementation. */
+var Class = {
+  create: function() {
+    var parent = null, properties = $A(arguments);
+    if (Object.isFunction(properties[0]))
+      parent = properties.shift();
+
+    function klass() {
+      this.initialize.apply(this, arguments);
+    }
+
+    Object.extend(klass, Class.Methods);
+    klass.superclass = parent;
+    klass.subclasses = [];
+
+    if (parent) {
+      var subclass = function() { };
+      subclass.prototype = parent.prototype;
+      klass.prototype = new subclass;
+      parent.subclasses.push(klass);
+    }
+
+    for (var i = 0; i < properties.length; i++)
+      klass.addMethods(properties[i]);
+
+    if (!klass.prototype.initialize)
+      klass.prototype.initialize = Prototype.emptyFunction;
+
+    klass.prototype.constructor = klass;
+
+    return klass;
+  }
+};
+
+Class.Methods = {
+  addMethods: function(source) {
+    var ancestor   = this.superclass && this.superclass.prototype;
+    var properties = Object.keys(source);
+
+    if (!Object.keys({ toString: true }).length)
+      properties.push("toString", "valueOf");
+
+    for (var i = 0, length = properties.length; i < length; i++) {
+      var property = properties[i], value = source[property];
+      if (ancestor && Object.isFunction(value) &&
+          value.argumentNames().first() == "$super") {
+        var method = value, value = Object.extend((function(m) {
+          return function() { return ancestor[m].apply(this, arguments) };
+        })(property).wrap(method), {
+          valueOf:  function() { return method },
+          toString: function() { return method.toString() }
+        });
+      }
+      this.prototype[property] = value;
+    }
+
+    return this;
+  }
+};
+
+var Abstract = { };
+
+Object.extend = function(destination, source) {
+  for (var property in source)
+    destination[property] = source[property];
+  return destination;
+};
+
+Object.extend(Object, {
+  inspect: function(object) {
+    try {
+      if (Object.isUndefined(object)) return 'undefined';
+      if (object === null) return 'null';
+      return object.inspect ? object.inspect() : String(object);
+    } catch (e) {
+      if (e instanceof RangeError) return '...';
+      throw e;
+    }
+  },
+
+  toJSON: function(object) {
+    var type = typeof object;
+    switch (type) {
+      case 'undefined':
+      case 'function':
+      case 'unknown': return;
+      case 'boolean': return object.toString();
+    }
+
+    if (object === null) return 'null';
+    if (object.toJSON) return object.toJSON();
+    if (Object.isElement(object)) return;
+
+    var results = [];
+    for (var property in object) {
+      var value = Object.toJSON(object[property]);
+      if (!Object.isUndefined(value))
+        results.push(property.toJSON() + ': ' + value);
+    }
+
+    return '{' + results.join(', ') + '}';
+  },
+
+  toQueryString: function(object) {
+    return $H(object).toQueryString();
+  },
+
+  toHTML: function(object) {
+    return object && object.toHTML ? object.toHTML() : String.interpret(object);
+  },
+
+  keys: function(object) {
+    var keys = [];
+    for (var property in object)
+      keys.push(property);
+    return keys;
+  },
+
+  values: function(object) {
+    var values = [];
+    for (var property in object)
+      values.push(object[property]);
+    return values;
+  },
+
+  clone: function(object) {
+    return Object.extend({ }, object);
+  },
+
+  isElement: function(object) {
+    return object && object.nodeType == 1;
+  },
+
+  isArray: function(object) {
+    return object != null && typeof object == "object" &&
+      'splice' in object && 'join' in object;
+  },
+
+  isHash: function(object) {
+    return object instanceof Hash;
+  },
+
+  isFunction: function(object) {
+    return typeof object == "function";
+  },
+
+  isString: function(object) {
+    return typeof object == "string";
+  },
+
+  isNumber: function(object) {
+    return typeof object == "number";
+  },
+
+  isUndefined: function(object) {
+    return typeof object == "undefined";
+  }
+});
+
+Object.extend(Function.prototype, {
+  argumentNames: function() {
+    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
+    return names.length == 1 && !names[0] ? [] : names;
+  },
+
+  bind: function() {
+    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function() {
+      return __method.apply(object, args.concat($A(arguments)));
+    }
+  },
+
+  bindAsEventListener: function() {
+    var __method = this, args = $A(arguments), object = args.shift();
+    return function(event) {
+      return __method.apply(object, [event || window.event].concat(args));
+    }
+  },
+
+  curry: function() {
+    if (!arguments.length) return this;
+    var __method = this, args = $A(arguments);
+    return function() {
+      return __method.apply(this, args.concat($A(arguments)));
+    }
+  },
+
+  delay: function() {
+    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+    return window.setTimeout(function() {
+      return __method.apply(__method, args);
+    }, timeout);
+  },
+
+  wrap: function(wrapper) {
+    var __method = this;
+    return function() {
+      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+    }
+  },
+
+  methodize: function() {
+    if (this._methodized) return this._methodized;
+    var __method = this;
+    return this._methodized = function() {
+      return __method.apply(null, [this].concat($A(arguments)));
+    };
+  }
+});
+
+Function.prototype.defer = Function.prototype.delay.curry(0.01);
+
+Date.prototype.toJSON = function() {
+  return '"' + this.getUTCFullYear() + '-' +
+    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+    this.getUTCDate().toPaddedString(2) + 'T' +
+    this.getUTCHours().toPaddedString(2) + ':' +
+    this.getUTCMinutes().toPaddedString(2) + ':' +
+    this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) { }
+    }
+
+    return returnValue;
+  }
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create({
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  execute: function() {
+    this.callback(this);
+  },
+
+  stop: function() {
+    if (!this.timer) return;
+    clearInterval(this.timer);
+    this.timer = null;
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try {
+        this.currentlyExecuting = true;
+        this.execute();
+      } finally {
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+});
+Object.extend(String, {
+  interpret: function(value) {
+    return value == null ? '' : String(value);
+  },
+  specialChar: {
+    '\b': '\\b',
+    '\t': '\\t',
+    '\n': '\\n',
+    '\f': '\\f',
+    '\r': '\\r',
+    '\\': '\\\\'
+  }
+});
+
+Object.extend(String.prototype, {
+  gsub: function(pattern, replacement) {
+    var result = '', source = this, match;
+    replacement = arguments.callee.prepareReplacement(replacement);
+
+    while (source.length > 0) {
+      if (match = source.match(pattern)) {
+        result += source.slice(0, match.index);
+        result += String.interpret(replacement(match));
+        source  = source.slice(match.index + match[0].length);
+      } else {
+        result += source, source = '';
+      }
+    }
+    return result;
+  },
+
+  sub: function(pattern, replacement, count) {
+    replacement = this.gsub.prepareReplacement(replacement);
+    count = Object.isUndefined(count) ? 1 : count;
+
+    return this.gsub(pattern, function(match) {
+      if (--count < 0) return match[0];
+      return replacement(match);
+    });
+  },
+
+  scan: function(pattern, iterator) {
+    this.gsub(pattern, iterator);
+    return String(this);
+  },
+
+  truncate: function(length, truncation) {
+    length = length || 30;
+    truncation = Object.isUndefined(truncation) ? '...' : truncation;
+    return this.length > length ?
+      this.slice(0, length - truncation.length) + truncation : String(this);
+  },
+
+  strip: function() {
+    return this.replace(/^\s+/, '').replace(/\s+$/, '');
+  },
+
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  stripScripts: function() {
+    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+  },
+
+  extractScripts: function() {
+    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+    return (this.match(matchAll) || []).map(function(scriptTag) {
+      return (scriptTag.match(matchOne) || ['', ''])[1];
+    });
+  },
+
+  evalScripts: function() {
+    return this.extractScripts().map(function(script) { return eval(script) });
+  },
+
+  escapeHTML: function() {
+    var self = arguments.callee;
+    self.text.data = this;
+    return self.div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = new Element('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0] ? (div.childNodes.length > 1 ?
+      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
+      div.childNodes[0].nodeValue) : '';
+  },
+
+  toQueryParams: function(separator) {
+    var match = this.strip().match(/([^?#]*)(#.*)?$/);
+    if (!match) return { };
+
+    return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+      if ((pair = pair.split('='))[0]) {
+        var key = decodeURIComponent(pair.shift());
+        var value = pair.length > 1 ? pair.join('=') : pair[0];
+        if (value != undefined) value = decodeURIComponent(value);
+
+        if (key in hash) {
+          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+          hash[key].push(value);
+        }
+        else hash[key] = value;
+      }
+      return hash;
+    });
+  },
+
+  toArray: function() {
+    return this.split('');
+  },
+
+  succ: function() {
+    return this.slice(0, this.length - 1) +
+      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+  },
+
+  times: function(count) {
+    return count < 1 ? '' : new Array(count + 1).join(this);
+  },
+
+  camelize: function() {
+    var parts = this.split('-'), len = parts.length;
+    if (len == 1) return parts[0];
+
+    var camelized = this.charAt(0) == '-'
+      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+      : parts[0];
+
+    for (var i = 1; i < len; i++)
+      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+    return camelized;
+  },
+
+  capitalize: function() {
+    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+  },
+
+  underscore: function() {
+    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+  },
+
+  dasherize: function() {
+    return this.gsub(/_/,'-');
+  },
+
+  inspect: function(useDoubleQuotes) {
+    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+      var character = String.specialChar[match[0]];
+      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+    });
+    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+  },
+
+  toJSON: function() {
+    return this.inspect(true);
+  },
+
+  unfilterJSON: function(filter) {
+    return this.sub(filter || Prototype.JSONFilter, '#{1}');
+  },
+
+  isJSON: function() {
+    var str = this;
+    if (str.blank()) return false;
+    str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+  },
+
+  evalJSON: function(sanitize) {
+    var json = this.unfilterJSON();
+    try {
+      if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+    } catch (e) { }
+    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+  },
+
+  include: function(pattern) {
+    return this.indexOf(pattern) > -1;
+  },
+
+  startsWith: function(pattern) {
+    return this.indexOf(pattern) === 0;
+  },
+
+  endsWith: function(pattern) {
+    var d = this.length - pattern.length;
+    return d >= 0 && this.lastIndexOf(pattern) === d;
+  },
+
+  empty: function() {
+    return this == '';
+  },
+
+  blank: function() {
+    return /^\s*$/.test(this);
+  },
+
+  interpolate: function(object, pattern) {
+    return new Template(this, pattern).evaluate(object);
+  }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+  escapeHTML: function() {
+    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
+  },
+  unescapeHTML: function() {
+    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');
+  }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+  if (Object.isFunction(replacement)) return replacement;
+  var template = new Template(replacement);
+  return function(match) { return template.evaluate(match) };
+};
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+Object.extend(String.prototype.escapeHTML, {
+  div:  document.createElement('div'),
+  text: document.createTextNode('')
+});
+
+with (String.prototype.escapeHTML) div.appendChild(text);
+
+var Template = Class.create({
+  initialize: function(template, pattern) {
+    this.template = template.toString();
+    this.pattern = pattern || Template.Pattern;
+  },
+
+  evaluate: function(object) {
+    if (Object.isFunction(object.toTemplateReplacements))
+      object = object.toTemplateReplacements();
+
+    return this.template.gsub(this.pattern, function(match) {
+      if (object == null) return '';
+
+      var before = match[1] || '';
+      if (before == '\\') return match[2];
+
+      var ctx = object, expr = match[3];
+      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+      match = pattern.exec(expr);
+      if (match == null) return before;
+
+      while (match != null) {
+        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+        ctx = ctx[comp];
+        if (null == ctx || '' == match[3]) break;
+        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+        match = pattern.exec(expr);
+      }
+
+      return before + String.interpret(ctx);
+    });
+  }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = {
+  each: function(iterator, context) {
+    var index = 0;
+    iterator = iterator.bind(context);
+    try {
+      this._each(function(value) {
+        iterator(value, index++);
+      });
+    } catch (e) {
+      if (e != $break) throw e;
+    }
+    return this;
+  },
+
+  eachSlice: function(number, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var index = -number, slices = [], array = this.toArray();
+    while ((index += number) < array.length)
+      slices.push(array.slice(index, index+number));
+    return slices.collect(iterator, context);
+  },
+
+  all: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var result = true;
+    this.each(function(value, index) {
+      result = result && !!iterator(value, index);
+      if (!result) throw $break;
+    });
+    return result;
+  },
+
+  any: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var result = false;
+    this.each(function(value, index) {
+      if (result = !!iterator(value, index))
+        throw $break;
+    });
+    return result;
+  },
+
+  collect: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator(value, index));
+    });
+    return results;
+  },
+
+  detect: function(iterator, context) {
+    iterator = iterator.bind(context);
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw $break;
+      }
+    });
+    return result;
+  },
+
+  findAll: function(iterator, context) {
+    iterator = iterator.bind(context);
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  grep: function(filter, iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var results = [];
+
+    if (Object.isString(filter))
+      filter = new RegExp(filter);
+
+    this.each(function(value, index) {
+      if (filter.match(value))
+        results.push(iterator(value, index));
+    });
+    return results;
+  },
+
+  include: function(object) {
+    if (Object.isFunction(this.indexOf))
+      if (this.indexOf(object) != -1) return true;
+
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw $break;
+      }
+    });
+    return found;
+  },
+
+  inGroupsOf: function(number, fillWith) {
+    fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+    return this.eachSlice(number, function(slice) {
+      while(slice.length < number) slice.push(fillWith);
+      return slice;
+    });
+  },
+
+  inject: function(memo, iterator, context) {
+    iterator = iterator.bind(context);
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.map(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+
+  max: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator(value, index);
+      if (result == null || value >= result)
+        result = value;
+    });
+    return result;
+  },
+
+  min: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var result;
+    this.each(function(value, index) {
+      value = iterator(value, index);
+      if (result == null || value < result)
+        result = value;
+    });
+    return result;
+  },
+
+  partition: function(iterator, context) {
+    iterator = iterator ? iterator.bind(context) : Prototype.K;
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      (iterator(value, index) ?
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+
+  reject: function(iterator, context) {
+    iterator = iterator.bind(context);
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+
+  sortBy: function(iterator, context) {
+    iterator = iterator.bind(context);
+    return this.map(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+
+  toArray: function() {
+    return this.map();
+  },
+
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (Object.isFunction(args.last()))
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      return iterator(collections.pluck(index));
+    });
+  },
+
+  size: function() {
+    return this.toArray().length;
+  },
+
+  inspect: function() {
+    return '#<Enumerable:' + this.toArray().inspect() + '>';
+  }
+};
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  filter:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray,
+  every:   Enumerable.all,
+  some:    Enumerable.any
+});
+function $A(iterable) {
+  if (!iterable) return [];
+  if (iterable.toArray) return iterable.toArray();
+  var length = iterable.length || 0, results = new Array(length);
+  while (length--) results[length] = iterable[length];
+  return results;
+}
+
+if (Prototype.Browser.WebKit) {
+  $A = function(iterable) {
+    if (!iterable) return [];
+    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
+        iterable.toArray) return iterable.toArray();
+    var length = iterable.length || 0, results = new Array(length);
+    while (length--) results[length] = iterable[length];
+    return results;
+  };
+}
+
+Array.from = $A;
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0, length = this.length; i < length; i++)
+      iterator(this[i]);
+  },
+
+  clear: function() {
+    this.length = 0;
+    return this;
+  },
+
+  first: function() {
+    return this[0];
+  },
+
+  last: function() {
+    return this[this.length - 1];
+  },
+
+  compact: function() {
+    return this.select(function(value) {
+      return value != null;
+    });
+  },
+
+  flatten: function() {
+    return this.inject([], function(array, value) {
+      return array.concat(Object.isArray(value) ?
+        value.flatten() : [value]);
+    });
+  },
+
+  without: function() {
+    var values = $A(arguments);
+    return this.select(function(value) {
+      return !values.include(value);
+    });
+  },
+
+  reverse: function(inline) {
+    return (inline !== false ? this : this.toArray())._reverse();
+  },
+
+  reduce: function() {
+    return this.length > 1 ? this : this[0];
+  },
+
+  uniq: function(sorted) {
+    return this.inject([], function(array, value, index) {
+      if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+        array.push(value);
+      return array;
+    });
+  },
+
+  intersect: function(array) {
+    return this.uniq().findAll(function(item) {
+      return array.detect(function(value) { return item === value });
+    });
+  },
+
+  clone: function() {
+    return [].concat(this);
+  },
+
+  size: function() {
+    return this.length;
+  },
+
+  inspect: function() {
+    return '[' + this.map(Object.inspect).join(', ') + ']';
+  },
+
+  toJSON: function() {
+    var results = [];
+    this.each(function(object) {
+      var value = Object.toJSON(object);
+      if (!Object.isUndefined(value)) results.push(value);
+    });
+    return '[' + results.join(', ') + ']';
+  }
+});
+
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+  Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+  i || (i = 0);
+  var length = this.length;
+  if (i < 0) i = length + i;
+  for (; i < length; i++)
+    if (this[i] === item) return i;
+  return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+  var n = this.slice(0, i).reverse().indexOf(item);
+  return (n < 0) ? n : i - n - 1;
+};
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string) {
+  if (!Object.isString(string)) return [];
+  string = string.strip();
+  return string ? string.split(/\s+/) : [];
+}
+
+if (Prototype.Browser.Opera){
+  Array.prototype.concat = function() {
+    var array = [];
+    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+    for (var i = 0, length = arguments.length; i < length; i++) {
+      if (Object.isArray(arguments[i])) {
+        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+          array.push(arguments[i][j]);
+      } else {
+        array.push(arguments[i]);
+      }
+    }
+    return array;
+  };
+}
+Object.extend(Number.prototype, {
+  toColorPart: function() {
+    return this.toPaddedString(2, 16);
+  },
+
+  succ: function() {
+    return this + 1;
+  },
+
+  times: function(iterator) {
+    $R(0, this, true).each(iterator);
+    return this;
+  },
+
+  toPaddedString: function(length, radix) {
+    var string = this.toString(radix || 10);
+    return '0'.times(length - string.length) + string;
+  },
+
+  toJSON: function() {
+    return isFinite(this) ? this.toString() : 'null';
+  }
+});
+
+$w('abs round ceil floor').each(function(method){
+  Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+  return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+
+  function toQueryPair(key, value) {
+    if (Object.isUndefined(value)) return key;
+    return key + '=' + encodeURIComponent(String.interpret(value));
+  }
+
+  return {
+    initialize: function(object) {
+      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+    },
+
+    _each: function(iterator) {
+      for (var key in this._object) {
+        var value = this._object[key], pair = [key, value];
+        pair.key = key;
+        pair.value = value;
+        iterator(pair);
+      }
+    },
+
+    set: function(key, value) {
+      return this._object[key] = value;
+    },
+
+    get: function(key) {
+      return this._object[key];
+    },
+
+    unset: function(key) {
+      var value = this._object[key];
+      delete this._object[key];
+      return value;
+    },
+
+    toObject: function() {
+      return Object.clone(this._object);
+    },
+
+    keys: function() {
+      return this.pluck('key');
+    },
+
+    values: function() {
+      return this.pluck('value');
+    },
+
+    index: function(value) {
+      var match = this.detect(function(pair) {
+        return pair.value === value;
+      });
+      return match && match.key;
+    },
+
+    merge: function(object) {
+      return this.clone().update(object);
+    },
+
+    update: function(object) {
+      return new Hash(object).inject(this, function(result, pair) {
+        result.set(pair.key, pair.value);
+        return result;
+      });
+    },
+
+    toQueryString: function() {
+      return this.map(function(pair) {
+        var key = encodeURIComponent(pair.key), values = pair.value;
+
+        if (values && typeof values == 'object') {
+          if (Object.isArray(values))
+            return values.map(toQueryPair.curry(key)).join('&');
+        }
+        return toQueryPair(key, values);
+      }).join('&');
+    },
+
+    inspect: function() {
+      return '#<Hash:{' + this.map(function(pair) {
+        return pair.map(Object.inspect).join(': ');
+      }).join(', ') + '}>';
+    },
+
+    toJSON: function() {
+      return Object.toJSON(this.toObject());
+    },
+
+    clone: function() {
+      return new Hash(this);
+    }
+  }
+})());
+
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
+  initialize: function(start, end, exclusive) {
+    this.start = start;
+    this.end = end;
+    this.exclusive = exclusive;
+  },
+
+  _each: function(iterator) {
+    var value = this.start;
+    while (this.include(value)) {
+      iterator(value);
+      value = value.succ();
+    }
+  },
+
+  include: function(value) {
+    if (value < this.start)
+      return false;
+    if (this.exclusive)
+      return value < this.end;
+    return value <= this.end;
+  }
+});
+
+var $R = function(start, end, exclusive) {
+  return new ObjectRange(start, end, exclusive);
+};
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new XMLHttpRequest()},
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+    ) || false;
+  },
+
+  activeRequestCount: 0
+};
+
+Ajax.Responders = {
+  responders: [],
+
+  _each: function(iterator) {
+    this.responders._each(iterator);
+  },
+
+  register: function(responder) {
+    if (!this.include(responder))
+      this.responders.push(responder);
+  },
+
+  unregister: function(responder) {
+    this.responders = this.responders.without(responder);
+  },
+
+  dispatch: function(callback, request, transport, json) {
+    this.each(function(responder) {
+      if (Object.isFunction(responder[callback])) {
+        try {
+          responder[callback].apply(responder, [request, transport, json]);
+        } catch (e) { }
+      }
+    });
+  }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+  onCreate:   function() { Ajax.activeRequestCount++ },
+  onComplete: function() { Ajax.activeRequestCount-- }
+});
+
+Ajax.Base = Class.create({
+  initialize: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      contentType:  'application/x-www-form-urlencoded',
+      encoding:     'UTF-8',
+      parameters:   '',
+      evalJSON:     true,
+      evalJS:       true
+    };
+    Object.extend(this.options, options || { });
+
+    this.options.method = this.options.method.toLowerCase();
+
+    if (Object.isString(this.options.parameters))
+      this.options.parameters = this.options.parameters.toQueryParams();
+    else if (Object.isHash(this.options.parameters))
+      this.options.parameters = this.options.parameters.toObject();
+  }
+});
+
+Ajax.Request = Class.create(Ajax.Base, {
+  _complete: false,
+
+  initialize: function($super, url, options) {
+    $super(options);
+    this.transport = Ajax.getTransport();
+    this.request(url);
+  },
+
+  request: function(url) {
+    this.url = url;
+    this.method = this.options.method;
+    var params = Object.clone(this.options.parameters);
+
+    if (!['get', 'post'].include(this.method)) {
+      // simulate other verbs over post
+      params['_method'] = this.method;
+      this.method = 'post';
+    }
+
+    this.parameters = params;
+
+    if (params = Object.toQueryString(params)) {
+      // when GET, append parameters to URL
+      if (this.method == 'get')
+        this.url += (this.url.include('?') ? '&' : '?') + params;
+      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+        params += '&_=';
+    }
+
+    try {
+      var response = new Ajax.Response(this);
+      if (this.options.onCreate) this.options.onCreate(response);
+      Ajax.Responders.dispatch('onCreate', this, response);
+
+      this.transport.open(this.method.toUpperCase(), this.url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+      this.transport.onreadystatechange = this.onStateChange.bind(this);
+      this.setRequestHeaders();
+
+      this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+      this.transport.send(this.body);
+
+      /* Force Firefox to handle ready state 4 for synchronous requests */
+      if (!this.options.asynchronous && this.transport.overrideMimeType)
+        this.onStateChange();
+
+    }
+    catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState > 1 && !((readyState == 4) && this._complete))
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  setRequestHeaders: function() {
+    var headers = {
+      'X-Requested-With': 'XMLHttpRequest',
+      'X-Prototype-Version': Prototype.Version,
+      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+    };
+
+    if (this.method == 'post') {
+      headers['Content-type'] = this.options.contentType +
+        (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+      /* Force "Connection: close" for older Mozilla browsers to work
+       * around a bug where XMLHttpRequest sends an incorrect
+       * Content-length header. See Mozilla Bugzilla #246651.
+       */
+      if (this.transport.overrideMimeType &&
+          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+            headers['Connection'] = 'close';
+    }
+
+    // user-defined headers
+    if (typeof this.options.requestHeaders == 'object') {
+      var extras = this.options.requestHeaders;
+
+      if (Object.isFunction(extras.push))
+        for (var i = 0, length = extras.length; i < length; i += 2)
+          headers[extras[i]] = extras[i+1];
+      else
+        $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+    }
+
+    for (var name in headers)
+      this.transport.setRequestHeader(name, headers[name]);
+  },
+
+  success: function() {
+    var status = this.getStatus();
+    return !status || (status >= 200 && status < 300);
+  },
+
+  getStatus: function() {
+    try {
+      return this.transport.status || 0;
+    } catch (e) { return 0 }
+  },
+
+  respondToReadyState: function(readyState) {
+    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+    if (state == 'Complete') {
+      try {
+        this._complete = true;
+        (this.options['on' + response.status]
+         || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+         || Prototype.emptyFunction)(response, response.headerJSON);
+      } catch (e) {
+        this.dispatchException(e);
+      }
+
+      var contentType = response.getHeader('Content-type');
+      if (this.options.evalJS == 'force'
+          || (this.options.evalJS && this.isSameOrigin() && contentType
+          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+        this.evalResponse();
+    }
+
+    try {
+      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+    } catch (e) {
+      this.dispatchException(e);
+    }
+
+    if (state == 'Complete') {
+      // avoid memory leak in MSIE: clean up
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+    }
+  },
+
+  isSameOrigin: function() {
+    var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+      protocol: location.protocol,
+      domain: document.domain,
+      port: location.port ? ':' + location.port : ''
+    }));
+  },
+
+  getHeader: function(name) {
+    try {
+      return this.transport.getResponseHeader(name) || null;
+    } catch (e) { return null }
+  },
+
+  evalResponse: function() {
+    try {
+      return eval((this.transport.responseText || '').unfilterJSON());
+    } catch (e) {
+      this.dispatchException(e);
+    }
+  },
+
+  dispatchException: function(exception) {
+    (this.options.onException || Prototype.emptyFunction)(this, exception);
+    Ajax.Responders.dispatch('onException', this, exception);
+  }
+});
+
+Ajax.Request.Events =
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+  initialize: function(request){
+    this.request = request;
+    var transport  = this.transport  = request.transport,
+        readyState = this.readyState = transport.readyState;
+
+    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+      this.status       = this.getStatus();
+      this.statusText   = this.getStatusText();
+      this.responseText = String.interpret(transport.responseText);
+      this.headerJSON   = this._getHeaderJSON();
+    }
+
+    if(readyState == 4) {
+      var xml = transport.responseXML;
+      this.responseXML  = Object.isUndefined(xml) ? null : xml;
+      this.responseJSON = this._getResponseJSON();
+    }
+  },
+
+  status:      0,
+  statusText: '',
+
+  getStatus: Ajax.Request.prototype.getStatus,
+
+  getStatusText: function() {
+    try {
+      return this.transport.statusText || '';
+    } catch (e) { return '' }
+  },
+
+  getHeader: Ajax.Request.prototype.getHeader,
+
+  getAllHeaders: function() {
+    try {
+      return this.getAllResponseHeaders();
+    } catch (e) { return null }
+  },
+
+  getResponseHeader: function(name) {
+    return this.transport.getResponseHeader(name);
+  },
+
+  getAllResponseHeaders: function() {
+    return this.transport.getAllResponseHeaders();
+  },
+
+  _getHeaderJSON: function() {
+    var json = this.getHeader('X-JSON');
+    if (!json) return null;
+    json = decodeURIComponent(escape(json));
+    try {
+      return json.evalJSON(this.request.options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  },
+
+  _getResponseJSON: function() {
+    var options = this.request.options;
+    if (!options.evalJSON || (options.evalJSON != 'force' &&
+      !(this.getHeader('Content-type') || '').include('application/json')) ||
+        this.responseText.blank())
+          return null;
+    try {
+      return this.responseText.evalJSON(options.sanitizeJSON ||
+        !this.request.isSameOrigin());
+    } catch (e) {
+      this.request.dispatchException(e);
+    }
+  }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+  initialize: function($super, container, url, options) {
+    this.container = {
+      success: (container.success || container),
+      failure: (container.failure || (container.success ? null : container))
+    };
+
+    options = Object.clone(options);
+    var onComplete = options.onComplete;
+    options.onComplete = (function(response, json) {
+      this.updateContent(response.responseText);
+      if (Object.isFunction(onComplete)) onComplete(response, json);
+    }).bind(this);
+
+    $super(url, options);
+  },
+
+  updateContent: function(responseText) {
+    var receiver = this.container[this.success() ? 'success' : 'failure'],
+        options = this.options;
+
+    if (!options.evalScripts) responseText = responseText.stripScripts();
+
+    if (receiver = $(receiver)) {
+      if (options.insertion) {
+        if (Object.isString(options.insertion)) {
+          var insertion = { }; insertion[options.insertion] = responseText;
+          receiver.insert(insertion);
+        }
+        else options.insertion(receiver, responseText);
+      }
+      else receiver.update(responseText);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+  initialize: function($super, container, url, options) {
+    $super(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.decay = (this.options.decay || 1);
+
+    this.updater = { };
+    this.container = container;
+    this.url = url;
+
+    this.start();
+  },
+
+  start: function() {
+    this.options.onComplete = this.updateComplete.bind(this);
+    this.onTimerEvent();
+  },
+
+  stop: function() {
+    this.updater.options.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(response) {
+    if (this.options.decay) {
+      this.decay = (response.responseText == this.lastText ?
+        this.decay * this.options.decay : 1);
+
+      this.lastText = response.responseText;
+    }
+    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+function $(element) {
+  if (arguments.length > 1) {
+    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+      elements.push($(arguments[i]));
+    return elements;
+  }
+  if (Object.isString(element))
+    element = document.getElementById(element);
+  return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+  document._getElementsByXPath = function(expression, parentElement) {
+    var results = [];
+    var query = document.evaluate(expression, $(parentElement) || document,
+      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+    for (var i = 0, length = query.snapshotLength; i < length; i++)
+      results.push(Element.extend(query.snapshotItem(i)));
+    return results;
+  };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+  // DOM level 2 ECMAScript Language Binding
+  Object.extend(Node, {
+    ELEMENT_NODE: 1,
+    ATTRIBUTE_NODE: 2,
+    TEXT_NODE: 3,
+    CDATA_SECTION_NODE: 4,
+    ENTITY_REFERENCE_NODE: 5,
+    ENTITY_NODE: 6,
+    PROCESSING_INSTRUCTION_NODE: 7,
+    COMMENT_NODE: 8,
+    DOCUMENT_NODE: 9,
+    DOCUMENT_TYPE_NODE: 10,
+    DOCUMENT_FRAGMENT_NODE: 11,
+    NOTATION_NODE: 12
+  });
+}
+
+(function() {
+  var element = this.Element;
+  this.Element = function(tagName, attributes) {
+    attributes = attributes || { };
+    tagName = tagName.toLowerCase();
+    var cache = Element.cache;
+    if (Prototype.Browser.IE && attributes.name) {
+      tagName = '<' + tagName + ' name="' + attributes.name + '">';
+      delete attributes.name;
+      return Element.writeAttribute(document.createElement(tagName), attributes);
+    }
+    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+  };
+  Object.extend(this.Element, element || { });
+}).call(window);
+
+Element.cache = { };
+
+Element.Methods = {
+  visible: function(element) {
+    return $(element).style.display != 'none';
+  },
+
+  toggle: function(element) {
+    element = $(element);
+    Element[Element.visible(element) ? 'hide' : 'show'](element);
+    return element;
+  },
+
+  hide: function(element) {
+    $(element).style.display = 'none';
+    return element;
+  },
+
+  show: function(element) {
+    $(element).style.display = '';
+    return element;
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+    return element;
+  },
+
+  update: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+    content = Object.toHTML(content);
+    element.innerHTML = content.stripScripts();
+    content.evalScripts.bind(content).defer();
+    return element;
+  },
+
+  replace: function(element, content) {
+    element = $(element);
+    if (content && content.toElement) content = content.toElement();
+    else if (!Object.isElement(content)) {
+      content = Object.toHTML(content);
+      var range = element.ownerDocument.createRange();
+      range.selectNode(element);
+      content.evalScripts.bind(content).defer();
+      content = range.createContextualFragment(content.stripScripts());
+    }
+    element.parentNode.replaceChild(content, element);
+    return element;
+  },
+
+  insert: function(element, insertions) {
+    element = $(element);
+
+    if (Object.isString(insertions) || Object.isNumber(insertions) ||
+        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+          insertions = {bottom:insertions};
+
+    var content, insert, tagName, childNodes;
+
+    for (var position in insertions) {
+      content  = insertions[position];
+      position = position.toLowerCase();
+      insert = Element._insertionTranslations[position];
+
+      if (content && content.toElement) content = content.toElement();
+      if (Object.isElement(content)) {
+        insert(element, content);
+        continue;
+      }
+
+      content = Object.toHTML(content);
+
+      tagName = ((position == 'before' || position == 'after')
+        ? element.parentNode : element).tagName.toUpperCase();
+
+      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+      if (position == 'top' || position == 'after') childNodes.reverse();
+      childNodes.each(insert.curry(element));
+
+      content.evalScripts.bind(content).defer();
+    }
+
+    return element;
+  },
+
+  wrap: function(element, wrapper, attributes) {
+    element = $(element);
+    if (Object.isElement(wrapper))
+      $(wrapper).writeAttribute(attributes || { });
+    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+    else wrapper = new Element('div', wrapper);
+    if (element.parentNode)
+      element.parentNode.replaceChild(wrapper, element);
+    wrapper.appendChild(element);
+    return wrapper;
+  },
+
+  inspect: function(element) {
+    element = $(element);
+    var result = '<' + element.tagName.toLowerCase();
+    $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+      var property = pair.first(), attribute = pair.last();
+      var value = (element[property] || '').toString();
+      if (value) result += ' ' + attribute + '=' + value.inspect(true);
+    });
+    return result + '>';
+  },
+
+  recursivelyCollect: function(element, property) {
+    element = $(element);
+    var elements = [];
+    while (element = element[property])
+      if (element.nodeType == 1)
+        elements.push(Element.extend(element));
+    return elements;
+  },
+
+  ancestors: function(element) {
+    return $(element).recursivelyCollect('parentNode');
+  },
+
+  descendants: function(element) {
+    return $(element).select("*");
+  },
+
+  firstDescendant: function(element) {
+    element = $(element).firstChild;
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    return $(element);
+  },
+
+  immediateDescendants: function(element) {
+    if (!(element = $(element).firstChild)) return [];
+    while (element && element.nodeType != 1) element = element.nextSibling;
+    if (element) return [element].concat($(element).nextSiblings());
+    return [];
+  },
+
+  previousSiblings: function(element) {
+    return $(element).recursivelyCollect('previousSibling');
+  },
+
+  nextSiblings: function(element) {
+    return $(element).recursivelyCollect('nextSibling');
+  },
+
+  siblings: function(element) {
+    element = $(element);
+    return element.previousSiblings().reverse().concat(element.nextSiblings());
+  },
+
+  match: function(element, selector) {
+    if (Object.isString(selector))
+      selector = new Selector(selector);
+    return selector.match($(element));
+  },
+
+  up: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(element.parentNode);
+    var ancestors = element.ancestors();
+    return Object.isNumber(expression) ? ancestors[expression] :
+      Selector.findElement(ancestors, expression, index);
+  },
+
+  down: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return element.firstDescendant();
+    return Object.isNumber(expression) ? element.descendants()[expression] :
+      element.select(expression)[index || 0];
+  },
+
+  previous: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+    var previousSiblings = element.previousSiblings();
+    return Object.isNumber(expression) ? previousSiblings[expression] :
+      Selector.findElement(previousSiblings, expression, index);
+  },
+
+  next: function(element, expression, index) {
+    element = $(element);
+    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+    var nextSiblings = element.nextSiblings();
+    return Object.isNumber(expression) ? nextSiblings[expression] :
+      Selector.findElement(nextSiblings, expression, index);
+  },
+
+  select: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element, args);
+  },
+
+  adjacent: function() {
+    var args = $A(arguments), element = $(args.shift());
+    return Selector.findChildElements(element.parentNode, args).without(element);
+  },
+
+  identify: function(element) {
+    element = $(element);
+    var id = element.readAttribute('id'), self = arguments.callee;
+    if (id) return id;
+    do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+    element.writeAttribute('id', id);
+    return id;
+  },
+
+  readAttribute: function(element, name) {
+    element = $(element);
+    if (Prototype.Browser.IE) {
+      var t = Element._attributeTranslations.read;
+      if (t.values[name]) return t.values[name](element, name);
+      if (t.names[name]) name = t.names[name];
+      if (name.include(':')) {
+        return (!element.attributes || !element.attributes[name]) ? null :
+         element.attributes[name].value;
+      }
+    }
+    return element.getAttribute(name);
+  },
+
+  writeAttribute: function(element, name, value) {
+    element = $(element);
+    var attributes = { }, t = Element._attributeTranslations.write;
+
+    if (typeof name == 'object') attributes = name;
+    else attributes[name] = Object.isUndefined(value) ? true : value;
+
+    for (var attr in attributes) {
+      name = t.names[attr] || attr;
+      value = attributes[attr];
+      if (t.values[attr]) name = t.values[attr](element, value);
+      if (value === false || value === null)
+        element.removeAttribute(name);
+      else if (value === true)
+        element.setAttribute(name, name);
+      else element.setAttribute(name, value);
+    }
+    return element;
+  },
+
+  getHeight: function(element) {
+    return $(element).getDimensions().height;
+  },
+
+  getWidth: function(element) {
+    return $(element).getDimensions().width;
+  },
+
+  classNames: function(element) {
+    return new Element.ClassNames(element);
+  },
+
+  hasClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    var elementClassName = element.className;
+    return (elementClassName.length > 0 && (elementClassName == className ||
+      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+  },
+
+  addClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    if (!element.hasClassName(className))
+      element.className += (element.className ? ' ' : '') + className;
+    return element;
+  },
+
+  removeClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    element.className = element.className.replace(
+      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+    return element;
+  },
+
+  toggleClassName: function(element, className) {
+    if (!(element = $(element))) return;
+    return element[element.hasClassName(className) ?
+      'removeClassName' : 'addClassName'](className);
+  },
+
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    element = $(element);
+    var node = element.firstChild;
+    while (node) {
+      var nextNode = node.nextSibling;
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+        element.removeChild(node);
+      node = nextNode;
+    }
+    return element;
+  },
+
+  empty: function(element) {
+    return $(element).innerHTML.blank();
+  },
+
+  descendantOf: function(element, ancestor) {
+    element = $(element), ancestor = $(ancestor);
+    var originalAncestor = ancestor;
+
+    if (element.compareDocumentPosition)
+      return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+    if (element.sourceIndex && !Prototype.Browser.Opera) {
+      var e = element.sourceIndex, a = ancestor.sourceIndex,
+       nextAncestor = ancestor.nextSibling;
+      if (!nextAncestor) {
+        do { ancestor = ancestor.parentNode; }
+        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
+      }
+      if (nextAncestor && nextAncestor.sourceIndex)
+       return (e > a && e < nextAncestor.sourceIndex);
+    }
+
+    while (element = element.parentNode)
+      if (element == originalAncestor) return true;
+    return false;
+  },
+
+  scrollTo: function(element) {
+    element = $(element);
+    var pos = element.cumulativeOffset();
+    window.scrollTo(pos[0], pos[1]);
+    return element;
+  },
+
+  getStyle: function(element, style) {
+    element = $(element);
+    style = style == 'float' ? 'cssFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value) {
+      var css = document.defaultView.getComputedStyle(element, null);
+      value = css ? css[style] : null;
+    }
+    if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+    return value == 'auto' ? null : value;
+  },
+
+  getOpacity: function(element) {
+    return $(element).getStyle('opacity');
+  },
+
+  setStyle: function(element, styles) {
+    element = $(element);
+    var elementStyle = element.style, match;
+    if (Object.isString(styles)) {
+      element.style.cssText += ';' + styles;
+      return styles.include('opacity') ?
+        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+    }
+    for (var property in styles)
+      if (property == 'opacity') element.setOpacity(styles[property]);
+      else
+        elementStyle[(property == 'float' || property == 'cssFloat') ?
+          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+            property] = styles[property];
+
+    return element;
+  },
+
+  setOpacity: function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+    return element;
+  },
+
+  getDimensions: function(element) {
+    element = $(element);
+    var display = $(element).getStyle('display');
+    if (display != 'none' && display != null) // Safari bug
+      return {width: element.offsetWidth, height: element.offsetHeight};
+
+    // All *Width and *Height properties give 0 on elements with display none,
+    // so enable the element temporarily
+    var els = element.style;
+    var originalVisibility = els.visibility;
+    var originalPosition = els.position;
+    var originalDisplay = els.display;
+    els.visibility = 'hidden';
+    els.position = 'absolute';
+    els.display = 'block';
+    var originalWidth = element.clientWidth;
+    var originalHeight = element.clientHeight;
+    els.display = originalDisplay;
+    els.position = originalPosition;
+    els.visibility = originalVisibility;
+    return {width: originalWidth, height: originalHeight};
+  },
+
+  makePositioned: function(element) {
+    element = $(element);
+    var pos = Element.getStyle(element, 'position');
+    if (pos == 'static' || !pos) {
+      element._madePositioned = true;
+      element.style.position = 'relative';
+      // Opera returns the offset relative to the positioning context, when an
+      // element is position relative but top and left have not been defined
+      if (window.opera) {
+        element.style.top = 0;
+        element.style.left = 0;
+      }
+    }
+    return element;
+  },
+
+  undoPositioned: function(element) {
+    element = $(element);
+    if (element._madePositioned) {
+      element._madePositioned = undefined;
+      element.style.position =
+        element.style.top =
+        element.style.left =
+        element.style.bottom =
+        element.style.right = '';
+    }
+    return element;
+  },
+
+  makeClipping: function(element) {
+    element = $(element);
+    if (element._overflow) return element;
+    element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+    if (element._overflow !== 'hidden')
+      element.style.overflow = 'hidden';
+    return element;
+  },
+
+  undoClipping: function(element) {
+    element = $(element);
+    if (!element._overflow) return element;
+    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+    element._overflow = null;
+    return element;
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  positionedOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+      if (element) {
+        if (element.tagName == 'BODY') break;
+        var p = Element.getStyle(element, 'position');
+        if (p !== 'static') break;
+      }
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  absolutize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'absolute') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    var offsets = element.positionedOffset();
+    var top     = offsets[1];
+    var left    = offsets[0];
+    var width   = element.clientWidth;
+    var height  = element.clientHeight;
+
+    element._originalLeft   = left - parseFloat(element.style.left  || 0);
+    element._originalTop    = top  - parseFloat(element.style.top || 0);
+    element._originalWidth  = element.style.width;
+    element._originalHeight = element.style.height;
+
+    element.style.position = 'absolute';
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.width  = width + 'px';
+    element.style.height = height + 'px';
+    return element;
+  },
+
+  relativize: function(element) {
+    element = $(element);
+    if (element.getStyle('position') == 'relative') return;
+    // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+    element.style.position = 'relative';
+    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);
+    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+    element.style.top    = top + 'px';
+    element.style.left   = left + 'px';
+    element.style.height = element._originalHeight;
+    element.style.width  = element._originalWidth;
+    return element;
+  },
+
+  cumulativeScrollOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0;
+      element = element.parentNode;
+    } while (element);
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  getOffsetParent: function(element) {
+    if (element.offsetParent) return $(element.offsetParent);
+    if (element == document.body) return $(element);
+
+    while ((element = element.parentNode) && element != document.body)
+      if (Element.getStyle(element, 'position') != 'static')
+        return $(element);
+
+    return $(document.body);
+  },
+
+  viewportOffset: function(forElement) {
+    var valueT = 0, valueL = 0;
+
+    var element = forElement;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+
+      // Safari fix
+      if (element.offsetParent == document.body &&
+        Element.getStyle(element, 'position') == 'absolute') break;
+
+    } while (element = element.offsetParent);
+
+    element = forElement;
+    do {
+      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
+        valueT -= element.scrollTop  || 0;
+        valueL -= element.scrollLeft || 0;
+      }
+    } while (element = element.parentNode);
+
+    return Element._returnOffset(valueL, valueT);
+  },
+
+  clonePosition: function(element, source) {
+    var options = Object.extend({
+      setLeft:    true,
+      setTop:     true,
+      setWidth:   true,
+      setHeight:  true,
+      offsetTop:  0,
+      offsetLeft: 0
+    }, arguments[2] || { });
+
+    // find page position of source
+    source = $(source);
+    var p = source.viewportOffset();
+
+    // find coordinate system to use
+    element = $(element);
+    var delta = [0, 0];
+    var parent = null;
+    // delta [0,0] will do fine with position: fixed elements,
+    // position:absolute needs offsetParent deltas
+    if (Element.getStyle(element, 'position') == 'absolute') {
+      parent = element.getOffsetParent();
+      delta = parent.viewportOffset();
+    }
+
+    // correct by body offsets (fixes Safari)
+    if (parent == document.body) {
+      delta[0] -= document.body.offsetLeft;
+      delta[1] -= document.body.offsetTop;
+    }
+
+    // set position
+    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';
+    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';
+    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';
+    if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+    return element;
+  }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+  getElementsBySelector: Element.Methods.select,
+  childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+  write: {
+    names: {
+      className: 'class',
+      htmlFor:   'for'
+    },
+    values: { }
+  }
+};
+
+if (Prototype.Browser.Opera) {
+  Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+    function(proceed, element, style) {
+      switch (style) {
+        case 'left': case 'top': case 'right': case 'bottom':
+          if (proceed(element, 'position') === 'static') return null;
+        case 'height': case 'width':
+          // returns '0px' for hidden elements; we want it to return null
+          if (!Element.visible(element)) return null;
+
+          // returns the border-box dimensions rather than the content-box
+          // dimensions, so we subtract padding and borders from the value
+          var dim = parseInt(proceed(element, style), 10);
+
+          if (dim !== element['offset' + style.capitalize()])
+            return dim + 'px';
+
+          var properties;
+          if (style === 'height') {
+            properties = ['border-top-width', 'padding-top',
+             'padding-bottom', 'border-bottom-width'];
+          }
+          else {
+            properties = ['border-left-width', 'padding-left',
+             'padding-right', 'border-right-width'];
+          }
+          return properties.inject(dim, function(memo, property) {
+            var val = proceed(element, property);
+            return val === null ? memo : memo - parseInt(val, 10);
+          }) + 'px';
+        default: return proceed(element, style);
+      }
+    }
+  );
+
+  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+    function(proceed, element, attribute) {
+      if (attribute === 'title') return element.title;
+      return proceed(element, attribute);
+    }
+  );
+}
+
+else if (Prototype.Browser.IE) {
+  // IE doesn't report offsets correctly for static elements, so we change them
+  // to "relative" to get the values, then change them back.
+  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
+    function(proceed, element) {
+      element = $(element);
+      var position = element.getStyle('position');
+      if (position !== 'static') return proceed(element);
+      element.setStyle({ position: 'relative' });
+      var value = proceed(element);
+      element.setStyle({ position: position });
+      return value;
+    }
+  );
+
+  $w('positionedOffset viewportOffset').each(function(method) {
+    Element.Methods[method] = Element.Methods[method].wrap(
+      function(proceed, element) {
+        element = $(element);
+        var position = element.getStyle('position');
+        if (position !== 'static') return proceed(element);
+        // Trigger hasLayout on the offset parent so that IE6 reports
+        // accurate offsetTop and offsetLeft values for position: fixed.
+        var offsetParent = element.getOffsetParent();
+        if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+          offsetParent.setStyle({ zoom: 1 });
+        element.setStyle({ position: 'relative' });
+        var value = proceed(element);
+        element.setStyle({ position: position });
+        return value;
+      }
+    );
+  });
+
+  Element.Methods.getStyle = function(element, style) {
+    element = $(element);
+    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+    var value = element.style[style];
+    if (!value && element.currentStyle) value = element.currentStyle[style];
+
+    if (style == 'opacity') {
+      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+        if (value[1]) return parseFloat(value[1]) / 100;
+      return 1.0;
+    }
+
+    if (value == 'auto') {
+      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+        return element['offset' + style.capitalize()] + 'px';
+      return null;
+    }
+    return value;
+  };
+
+  Element.Methods.setOpacity = function(element, value) {
+    function stripAlpha(filter){
+      return filter.replace(/alpha\([^\)]*\)/gi,'');
+    }
+    element = $(element);
+    var currentStyle = element.currentStyle;
+    if ((currentStyle && !currentStyle.hasLayout) ||
+      (!currentStyle && element.style.zoom == 'normal'))
+        element.style.zoom = 1;
+
+    var filter = element.getStyle('filter'), style = element.style;
+    if (value == 1 || value === '') {
+      (filter = stripAlpha(filter)) ?
+        style.filter = filter : style.removeAttribute('filter');
+      return element;
+    } else if (value < 0.00001) value = 0;
+    style.filter = stripAlpha(filter) +
+      'alpha(opacity=' + (value * 100) + ')';
+    return element;
+  };
+
+  Element._attributeTranslations = {
+    read: {
+      names: {
+        'class': 'className',
+        'for':   'htmlFor'
+      },
+      values: {
+        _getAttr: function(element, attribute) {
+          return element.getAttribute(attribute, 2);
+        },
+        _getAttrNode: function(element, attribute) {
+          var node = element.getAttributeNode(attribute);
+          return node ? node.value : "";
+        },
+        _getEv: function(element, attribute) {
+          attribute = element.getAttribute(attribute);
+          return attribute ? attribute.toString().slice(23, -2) : null;
+        },
+        _flag: function(element, attribute) {
+          return $(element).hasAttribute(attribute) ? attribute : null;
+        },
+        style: function(element) {
+          return element.style.cssText.toLowerCase();
+        },
+        title: function(element) {
+          return element.title;
+        }
+      }
+    }
+  };
+
+  Element._attributeTranslations.write = {
+    names: Object.extend({
+      cellpadding: 'cellPadding',
+      cellspacing: 'cellSpacing'
+    }, Element._attributeTranslations.read.names),
+    values: {
+      checked: function(element, value) {
+        element.checked = !!value;
+      },
+
+      style: function(element, value) {
+        element.style.cssText = value ? value : '';
+      }
+    }
+  };
+
+  Element._attributeTranslations.has = {};
+
+  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+      'encType maxLength readOnly longDesc').each(function(attr) {
+    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+    Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+  });
+
+  (function(v) {
+    Object.extend(v, {
+      href:        v._getAttr,
+      src:         v._getAttr,
+      type:        v._getAttr,
+      action:      v._getAttrNode,
+      disabled:    v._flag,
+      checked:     v._flag,
+      readonly:    v._flag,
+      multiple:    v._flag,
+      onload:      v._getEv,
+      onunload:    v._getEv,
+      onclick:     v._getEv,
+      ondblclick:  v._getEv,
+      onmousedown: v._getEv,
+      onmouseup:   v._getEv,
+      onmouseover: v._getEv,
+      onmousemove: v._getEv,
+      onmouseout:  v._getEv,
+      onfocus:     v._getEv,
+      onblur:      v._getEv,
+      onkeypress:  v._getEv,
+      onkeydown:   v._getEv,
+      onkeyup:     v._getEv,
+      onsubmit:    v._getEv,
+      onreset:     v._getEv,
+      onselect:    v._getEv,
+      onchange:    v._getEv
+    });
+  })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1) ? 0.999999 :
+      (value === '') ? '' : (value < 0.00001) ? 0 : value;
+    return element;
+  };
+}
+
+else if (Prototype.Browser.WebKit) {
+  Element.Methods.setOpacity = function(element, value) {
+    element = $(element);
+    element.style.opacity = (value == 1 || value === '') ? '' :
+      (value < 0.00001) ? 0 : value;
+
+    if (value == 1)
+      if(element.tagName == 'IMG' && element.width) {
+        element.width++; element.width--;
+      } else try {
+        var n = document.createTextNode(' ');
+        element.appendChild(n);
+        element.removeChild(n);
+      } catch (e) { }
+
+    return element;
+  };
+
+  // Safari returns margins on body which is incorrect if the child is absolutely
+  // positioned.  For performance reasons, redefine Element#cumulativeOffset for
+  // KHTML/WebKit only.
+  Element.Methods.cumulativeOffset = function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      if (element.offsetParent == document.body)
+        if (Element.getStyle(element, 'position') == 'absolute') break;
+
+      element = element.offsetParent;
+    } while (element);
+
+    return Element._returnOffset(valueL, valueT);
+  };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+  Element.Methods.update = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) return element.update().insert(content);
+
+    content = Object.toHTML(content);
+    var tagName = element.tagName.toUpperCase();
+
+    if (tagName in Element._insertionTranslations.tags) {
+      $A(element.childNodes).each(function(node) { element.removeChild(node) });
+      Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+        .each(function(node) { element.appendChild(node) });
+    }
+    else element.innerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+if ('outerHTML' in document.createElement('div')) {
+  Element.Methods.replace = function(element, content) {
+    element = $(element);
+
+    if (content && content.toElement) content = content.toElement();
+    if (Object.isElement(content)) {
+      element.parentNode.replaceChild(content, element);
+      return element;
+    }
+
+    content = Object.toHTML(content);
+    var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+    if (Element._insertionTranslations.tags[tagName]) {
+      var nextSibling = element.next();
+      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+      parent.removeChild(element);
+      if (nextSibling)
+        fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+      else
+        fragments.each(function(node) { parent.appendChild(node) });
+    }
+    else element.outerHTML = content.stripScripts();
+
+    content.evalScripts.bind(content).defer();
+    return element;
+  };
+}
+
+Element._returnOffset = function(l, t) {
+  var result = [l, t];
+  result.left = l;
+  result.top = t;
+  return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+  if (t) {
+    div.innerHTML = t[0] + html + t[1];
+    t[2].times(function() { div = div.firstChild });
+  } else div.innerHTML = html;
+  return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+  before: function(element, node) {
+    element.parentNode.insertBefore(node, element);
+  },
+  top: function(element, node) {
+    element.insertBefore(node, element.firstChild);
+  },
+  bottom: function(element, node) {
+    element.appendChild(node);
+  },
+  after: function(element, node) {
+    element.parentNode.insertBefore(node, element.nextSibling);
+  },
+  tags: {
+    TABLE:  ['<table>',                '</table>',                   1],
+    TBODY:  ['<table><tbody>',         '</tbody></table>',           2],
+    TR:     ['<table><tbody><tr>',     '</tr></tbody></table>',      3],
+    TD:     ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+    SELECT: ['<select>',               '</select>',                  1]
+  }
+};
+
+(function() {
+  Object.extend(this.tags, {
+    THEAD: this.tags.TBODY,
+    TFOOT: this.tags.TBODY,
+    TH:    this.tags.TD
+  });
+}).call(Element._insertionTranslations);
+
+Element.Methods.Simulated = {
+  hasAttribute: function(element, attribute) {
+    attribute = Element._attributeTranslations.has[attribute] || attribute;
+    var node = $(element).getAttributeNode(attribute);
+    return node && node.specified;
+  }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+    document.createElement('div').__proto__) {
+  window.HTMLElement = { };
+  window.HTMLElement.prototype = document.createElement('div').__proto__;
+  Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+  if (Prototype.BrowserFeatures.SpecificElementExtensions)
+    return Prototype.K;
+
+  var Methods = { }, ByTag = Element.Methods.ByTag;
+
+  var extend = Object.extend(function(element) {
+    if (!element || element._extendedByPrototype ||
+        element.nodeType != 1 || element == window) return element;
+
+    var methods = Object.clone(Methods),
+      tagName = element.tagName, property, value;
+
+    // extend methods for specific tags
+    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+    for (property in methods) {
+      value = methods[property];
+      if (Object.isFunction(value) && !(property in element))
+        element[property] = value.methodize();
+    }
+
+    element._extendedByPrototype = Prototype.emptyFunction;
+    return element;
+
+  }, {
+    refresh: function() {
+      // extend methods for all tags (Safari doesn't need this)
+      if (!Prototype.BrowserFeatures.ElementExtensions) {
+        Object.extend(Methods, Element.Methods);
+        Object.extend(Methods, Element.Methods.Simulated);
+      }
+    }
+  });
+
+  extend.refresh();
+  return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+  if (element.hasAttribute) return element.hasAttribute(attribute);
+  return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+  if (!methods) {
+    Object.extend(Form, Form.Methods);
+    Object.extend(Form.Element, Form.Element.Methods);
+    Object.extend(Element.Methods.ByTag, {
+      "FORM":     Object.clone(Form.Methods),
+      "INPUT":    Object.clone(Form.Element.Methods),
+      "SELECT":   Object.clone(Form.Element.Methods),
+      "TEXTAREA": Object.clone(Form.Element.Methods)
+    });
+  }
+
+  if (arguments.length == 2) {
+    var tagName = methods;
+    methods = arguments[1];
+  }
+
+  if (!tagName) Object.extend(Element.Methods, methods || { });
+  else {
+    if (Object.isArray(tagName)) tagName.each(extend);
+    else extend(tagName);
+  }
+
+  function extend(tagName) {
+    tagName = tagName.toUpperCase();
+    if (!Element.Methods.ByTag[tagName])
+      Element.Methods.ByTag[tagName] = { };
+    Object.extend(Element.Methods.ByTag[tagName], methods);
+  }
+
+  function copy(methods, destination, onlyIfAbsent) {
+    onlyIfAbsent = onlyIfAbsent || false;
+    for (var property in methods) {
+      var value = methods[property];
+      if (!Object.isFunction(value)) continue;
+      if (!onlyIfAbsent || !(property in destination))
+        destination[property] = value.methodize();
+    }
+  }
+
+  function findDOMClass(tagName) {
+    var klass;
+    var trans = {
+      "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+      "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+      "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+      "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+      "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+      "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+      "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+      "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+      "FrameSet", "IFRAME": "IFrame"
+    };
+    if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName + 'Element';
+    if (window[klass]) return window[klass];
+    klass = 'HTML' + tagName.capitalize() + 'Element';
+    if (window[klass]) return window[klass];
+
+    window[klass] = { };
+    window[klass].prototype = document.createElement(tagName).__proto__;
+    return window[klass];
+  }
+
+  if (F.ElementExtensions) {
+    copy(Element.Methods, HTMLElement.prototype);
+    copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+  }
+
+  if (F.SpecificElementExtensions) {
+    for (var tag in Element.Methods.ByTag) {
+      var klass = findDOMClass(tag);
+      if (Object.isUndefined(klass)) continue;
+      copy(T[tag], klass.prototype);
+    }
+  }
+
+  Object.extend(Element, Element.Methods);
+  delete Element.ByTag;
+
+  if (Element.extend.refresh) Element.extend.refresh();
+  Element.cache = { };
+};
+
+document.viewport = {
+  getDimensions: function() {
+    var dimensions = { };
+    var B = Prototype.Browser;
+    $w('width height').each(function(d) {
+      var D = d.capitalize();
+      dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
+        (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
+    });
+    return dimensions;
+  },
+
+  getWidth: function() {
+    return this.getDimensions().width;
+  },
+
+  getHeight: function() {
+    return this.getDimensions().height;
+  },
+
+  getScrollOffsets: function() {
+    return Element._returnOffset(
+      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+  }
+};
+/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license.  Please see http://www.yui-ext.com/ for more information. */
+
+var Selector = Class.create({
+  initialize: function(expression) {
+    this.expression = expression.strip();
+    this.compileMatcher();
+  },
+
+  shouldUseXPath: function() {
+    if (!Prototype.BrowserFeatures.XPath) return false;
+
+    var e = this.expression;
+
+    // Safari 3 chokes on :*-of-type and :empty
+    if (Prototype.Browser.WebKit &&
+     (e.include("-of-type") || e.include(":empty")))
+      return false;
+
+    // XPath can't do namespaced attributes, nor can it read
+    // the "checked" property from DOM nodes
+    if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
+      return false;
+
+    return true;
+  },
+
+  compileMatcher: function() {
+    if (this.shouldUseXPath())
+      return this.compileXPathMatcher();
+
+    var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+        c = Selector.criteria, le, p, m;
+
+    if (Selector._cache[e]) {
+      this.matcher = Selector._cache[e];
+      return;
+    }
+
+    this.matcher = ["this.matcher = function(root) {",
+                    "var r = root, h = Selector.handlers, c = false, n;"];
+
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+    	      new Template(c[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.matcher.push("return h.unique(n);\n}");
+    eval(this.matcher.join('\n'));
+    Selector._cache[this.expression] = this.matcher;
+  },
+
+  compileXPathMatcher: function() {
+    var e = this.expression, ps = Selector.patterns,
+        x = Selector.xpath, le, m;
+
+    if (Selector._cache[e]) {
+      this.xpath = Selector._cache[e]; return;
+    }
+
+    this.matcher = ['.//*'];
+    while (e && le != e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        if (m = e.match(ps[i])) {
+          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+            new Template(x[i]).evaluate(m));
+          e = e.replace(m[0], '');
+          break;
+        }
+      }
+    }
+
+    this.xpath = this.matcher.join('');
+    Selector._cache[this.expression] = this.xpath;
+  },
+
+  findElements: function(root) {
+    root = root || document;
+    if (this.xpath) return document._getElementsByXPath(this.xpath, root);
+    return this.matcher(root);
+  },
+
+  match: function(element) {
+    this.tokens = [];
+
+    var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+    var le, p, m;
+
+    while (e && le !== e && (/\S/).test(e)) {
+      le = e;
+      for (var i in ps) {
+        p = ps[i];
+        if (m = e.match(p)) {
+          // use the Selector.assertions methods unless the selector
+          // is too complex.
+          if (as[i]) {
+            this.tokens.push([i, Object.clone(m)]);
+            e = e.replace(m[0], '');
+          } else {
+            // reluctantly do a document-wide search
+            // and look for a match in the array
+            return this.findElements(document).include(element);
+          }
+        }
+      }
+    }
+
+    var match = true, name, matches;
+    for (var i = 0, token; token = this.tokens[i]; i++) {
+      name = token[0], matches = token[1];
+      if (!Selector.assertions[name](element, matches)) {
+        match = false; break;
+      }
+    }
+
+    return match;
+  },
+
+  toString: function() {
+    return this.expression;
+  },
+
+  inspect: function() {
+    return "#<Selector:" + this.expression.inspect() + ">";
+  }
+});
+
+Object.extend(Selector, {
+  _cache: { },
+
+  xpath: {
+    descendant:   "//*",
+    child:        "/*",
+    adjacent:     "/following-sibling::*[1]",
+    laterSibling: '/following-sibling::*',
+    tagName:      function(m) {
+      if (m[1] == '*') return '';
+      return "[local-name()='" + m[1].toLowerCase() +
+             "' or local-name()='" + m[1].toUpperCase() + "']";
+    },
+    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+    id:           "[@id='#{1}']",
+    attrPresence: function(m) {
+      m[1] = m[1].toLowerCase();
+      return new Template("[@#{1}]").evaluate(m);
+    },
+    attr: function(m) {
+      m[1] = m[1].toLowerCase();
+      m[3] = m[5] || m[6];
+      return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+    },
+    pseudo: function(m) {
+      var h = Selector.xpath.pseudos[m[1]];
+      if (!h) return '';
+      if (Object.isFunction(h)) return h(m);
+      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+    },
+    operators: {
+      '=':  "[@#{1}='#{3}']",
+      '!=': "[@#{1}!='#{3}']",
+      '^=': "[starts-with(@#{1}, '#{3}')]",
+      '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+      '*=': "[contains(@#{1}, '#{3}')]",
+      '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+      '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+    },
+    pseudos: {
+      'first-child': '[not(preceding-sibling::*)]',
+      'last-child':  '[not(following-sibling::*)]',
+      'only-child':  '[not(preceding-sibling::* or following-sibling::*)]',
+      'empty':       "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
+      'checked':     "[@checked]",
+      'disabled':    "[@disabled]",
+      'enabled':     "[not(@disabled)]",
+      'not': function(m) {
+        var e = m[6], p = Selector.patterns,
+            x = Selector.xpath, le, v;
+
+        var exclusion = [];
+        while (e && le != e && (/\S/).test(e)) {
+          le = e;
+          for (var i in p) {
+            if (m = e.match(p[i])) {
+              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+              exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+              e = e.replace(m[0], '');
+              break;
+            }
+          }
+        }
+        return "[not(" + exclusion.join(" and ") + ")]";
+      },
+      'nth-child':      function(m) {
+        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+      },
+      'nth-last-child': function(m) {
+        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+      },
+      'nth-of-type':    function(m) {
+        return Selector.xpath.pseudos.nth("position() ", m);
+      },
+      'nth-last-of-type': function(m) {
+        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+      },
+      'first-of-type':  function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+      },
+      'last-of-type':   function(m) {
+        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+      },
+      'only-of-type':   function(m) {
+        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+      },
+      nth: function(fragment, m) {
+        var mm, formula = m[6], predicate;
+        if (formula == 'even') formula = '2n+0';
+        if (formula == 'odd')  formula = '2n+1';
+        if (mm = formula.match(/^(\d+)$/)) // digit only
+          return '[' + fragment + "= " + mm[1] + ']';
+        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+          if (mm[1] == "-") mm[1] = -1;
+          var a = mm[1] ? Number(mm[1]) : 1;
+          var b = mm[2] ? Number(mm[2]) : 0;
+          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+          "((#{fragment} - #{b}) div #{a} >= 0)]";
+          return new Template(predicate).evaluate({
+            fragment: fragment, a: a, b: b });
+        }
+      }
+    }
+  },
+
+  criteria: {
+    tagName:      'n = h.tagName(n, r, "#{1}", c);      c = false;',
+    className:    'n = h.className(n, r, "#{1}", c);    c = false;',
+    id:           'n = h.id(n, r, "#{1}", c);           c = false;',
+    attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
+    attr: function(m) {
+      m[3] = (m[5] || m[6]);
+      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
+    },
+    pseudo: function(m) {
+      if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+    },
+    descendant:   'c = "descendant";',
+    child:        'c = "child";',
+    adjacent:     'c = "adjacent";',
+    laterSibling: 'c = "laterSibling";'
+  },
+
+  patterns: {
+    // combinators must be listed first
+    // (and descendant needs to be last combinator)
+    laterSibling: /^\s*~\s*/,
+    child:        /^\s*>\s*/,
+    adjacent:     /^\s*\+\s*/,
+    descendant:   /^\s/,
+
+    // selectors follow
+    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/,
+    id:           /^#([\w\-\*]+)(\b|$)/,
+    className:    /^\.([\w\-\*]+)(\b|$)/,
+    pseudo:
+/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
+    attrPresence: /^\[([\w]+)\]/,
+    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+  },
+
+  // for Selector.match and Element#match
+  assertions: {
+    tagName: function(element, matches) {
+      return matches[1].toUpperCase() == element.tagName.toUpperCase();
+    },
+
+    className: function(element, matches) {
+      return Element.hasClassName(element, matches[1]);
+    },
+
+    id: function(element, matches) {
+      return element.id === matches[1];
+    },
+
+    attrPresence: function(element, matches) {
+      return Element.hasAttribute(element, matches[1]);
+    },
+
+    attr: function(element, matches) {
+      var nodeValue = Element.readAttribute(element, matches[1]);
+      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
+    }
+  },
+
+  handlers: {
+    // UTILITY FUNCTIONS
+    // joins two collections
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        a.push(node);
+      return a;
+    },
+
+    // marks an array of nodes for counting
+    mark: function(nodes) {
+      var _true = Prototype.emptyFunction;
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = _true;
+      return nodes;
+    },
+
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node._countedByPrototype = undefined;
+      return nodes;
+    },
+
+    // mark each child node with its position (for nth calls)
+    // "ofType" flag indicates whether we're indexing for nth-of-type
+    // rather than nth-child
+    index: function(parentNode, reverse, ofType) {
+      parentNode._countedByPrototype = Prototype.emptyFunction;
+      if (reverse) {
+        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+          var node = nodes[i];
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+        }
+      } else {
+        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+      }
+    },
+
+    // filters out duplicates and extends all nodes
+    unique: function(nodes) {
+      if (nodes.length == 0) return nodes;
+      var results = [], n;
+      for (var i = 0, l = nodes.length; i < l; i++)
+        if (!(n = nodes[i])._countedByPrototype) {
+          n._countedByPrototype = Prototype.emptyFunction;
+          results.push(Element.extend(n));
+        }
+      return Selector.handlers.unmark(results);
+    },
+
+    // COMBINATOR FUNCTIONS
+    descendant: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, node.getElementsByTagName('*'));
+      return results;
+    },
+
+    child: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        for (var j = 0, child; child = node.childNodes[j]; j++)
+          if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+      }
+      return results;
+    },
+
+    adjacent: function(nodes) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        var next = this.nextElementSibling(node);
+        if (next) results.push(next);
+      }
+      return results;
+    },
+
+    laterSibling: function(nodes) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        h.concat(results, Element.nextSiblings(node));
+      return results;
+    },
+
+    nextElementSibling: function(node) {
+      while (node = node.nextSibling)
+	      if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    previousElementSibling: function(node) {
+      while (node = node.previousSibling)
+        if (node.nodeType == 1) return node;
+      return null;
+    },
+
+    // TOKEN FUNCTIONS
+    tagName: function(nodes, root, tagName, combinator) {
+      var uTagName = tagName.toUpperCase();
+      var results = [], h = Selector.handlers;
+      if (nodes) {
+        if (combinator) {
+          // fastlane for ordinary descendant combinators
+          if (combinator == "descendant") {
+            for (var i = 0, node; node = nodes[i]; i++)
+              h.concat(results, node.getElementsByTagName(tagName));
+            return results;
+          } else nodes = this[combinator](nodes);
+          if (tagName == "*") return nodes;
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.tagName.toUpperCase() === uTagName) results.push(node);
+        return results;
+      } else return root.getElementsByTagName(tagName);
+    },
+
+    id: function(nodes, root, id, combinator) {
+      var targetNode = $(id), h = Selector.handlers;
+      if (!targetNode) return [];
+      if (!nodes && root == document) return [targetNode];
+      if (nodes) {
+        if (combinator) {
+          if (combinator == 'child') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (targetNode.parentNode == node) return [targetNode];
+          } else if (combinator == 'descendant') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Element.descendantOf(targetNode, node)) return [targetNode];
+          } else if (combinator == 'adjacent') {
+            for (var i = 0, node; node = nodes[i]; i++)
+              if (Selector.handlers.previousElementSibling(targetNode) == node)
+                return [targetNode];
+          } else nodes = h[combinator](nodes);
+        }
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node == targetNode) return [targetNode];
+        return [];
+      }
+      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+    },
+
+    className: function(nodes, root, className, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      return Selector.handlers.byClassName(nodes, root, className);
+    },
+
+    byClassName: function(nodes, root, className) {
+      if (!nodes) nodes = Selector.handlers.descendant([root]);
+      var needle = ' ' + className + ' ';
+      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+        nodeClassName = node.className;
+        if (nodeClassName.length == 0) continue;
+        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+          results.push(node);
+      }
+      return results;
+    },
+
+    attrPresence: function(nodes, root, attr, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var results = [];
+      for (var i = 0, node; node = nodes[i]; i++)
+        if (Element.hasAttribute(node, attr)) results.push(node);
+      return results;
+    },
+
+    attr: function(nodes, root, attr, value, operator, combinator) {
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      var handler = Selector.operators[operator], results = [];
+      for (var i = 0, node; node = nodes[i]; i++) {
+        var nodeValue = Element.readAttribute(node, attr);
+        if (nodeValue === null) continue;
+        if (handler(nodeValue, value)) results.push(node);
+      }
+      return results;
+    },
+
+    pseudo: function(nodes, name, value, root, combinator) {
+      if (nodes && combinator) nodes = this[combinator](nodes);
+      if (!nodes) nodes = root.getElementsByTagName("*");
+      return Selector.pseudos[name](nodes, value, root);
+    }
+  },
+
+  pseudos: {
+    'first-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.previousElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'last-child': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        if (Selector.handlers.nextElementSibling(node)) continue;
+          results.push(node);
+      }
+      return results;
+    },
+    'only-child': function(nodes, value, root) {
+      var h = Selector.handlers;
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+          results.push(node);
+      return results;
+    },
+    'nth-child':        function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root);
+    },
+    'nth-last-child':   function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true);
+    },
+    'nth-of-type':      function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, false, true);
+    },
+    'nth-last-of-type': function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, formula, root, true, true);
+    },
+    'first-of-type':    function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, false, true);
+    },
+    'last-of-type':     function(nodes, formula, root) {
+      return Selector.pseudos.nth(nodes, "1", root, true, true);
+    },
+    'only-of-type':     function(nodes, formula, root) {
+      var p = Selector.pseudos;
+      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+    },
+
+    // handles the an+b logic
+    getIndices: function(a, b, total) {
+      if (a == 0) return b > 0 ? [b] : [];
+      return $R(1, total).inject([], function(memo, i) {
+        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+        return memo;
+      });
+    },
+
+    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+    nth: function(nodes, formula, root, reverse, ofType) {
+      if (nodes.length == 0) return [];
+      if (formula == 'even') formula = '2n+0';
+      if (formula == 'odd')  formula = '2n+1';
+      var h = Selector.handlers, results = [], indexed = [], m;
+      h.mark(nodes);
+      for (var i = 0, node; node = nodes[i]; i++) {
+        if (!node.parentNode._countedByPrototype) {
+          h.index(node.parentNode, reverse, ofType);
+          indexed.push(node.parentNode);
+        }
+      }
+      if (formula.match(/^\d+$/)) { // just a number
+        formula = Number(formula);
+        for (var i = 0, node; node = nodes[i]; i++)
+          if (node.nodeIndex == formula) results.push(node);
+      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+        if (m[1] == "-") m[1] = -1;
+        var a = m[1] ? Number(m[1]) : 1;
+        var b = m[2] ? Number(m[2]) : 0;
+        var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+          for (var j = 0; j < l; j++)
+            if (node.nodeIndex == indices[j]) results.push(node);
+        }
+      }
+      h.unmark(nodes);
+      h.unmark(indexed);
+      return results;
+    },
+
+    'empty': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++) {
+        // IE treats comments as element nodes
+        if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
+        results.push(node);
+      }
+      return results;
+    },
+
+    'not': function(nodes, selector, root) {
+      var h = Selector.handlers, selectorType, m;
+      var exclusions = new Selector(selector).findElements(root);
+      h.mark(exclusions);
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node._countedByPrototype) results.push(node);
+      h.unmark(exclusions);
+      return results;
+    },
+
+    'enabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (!node.disabled) results.push(node);
+      return results;
+    },
+
+    'disabled': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.disabled) results.push(node);
+      return results;
+    },
+
+    'checked': function(nodes, value, root) {
+      for (var i = 0, results = [], node; node = nodes[i]; i++)
+        if (node.checked) results.push(node);
+      return results;
+    }
+  },
+
+  operators: {
+    '=':  function(nv, v) { return nv == v; },
+    '!=': function(nv, v) { return nv != v; },
+    '^=': function(nv, v) { return nv.startsWith(v); },
+    '$=': function(nv, v) { return nv.endsWith(v); },
+    '*=': function(nv, v) { return nv.include(v); },
+    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+    '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
+  },
+
+  split: function(expression) {
+    var expressions = [];
+    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+      expressions.push(m[1].strip());
+    });
+    return expressions;
+  },
+
+  matchElements: function(elements, expression) {
+    var matches = $$(expression), h = Selector.handlers;
+    h.mark(matches);
+    for (var i = 0, results = [], element; element = elements[i]; i++)
+      if (element._countedByPrototype) results.push(element);
+    h.unmark(matches);
+    return results;
+  },
+
+  findElement: function(elements, expression, index) {
+    if (Object.isNumber(expression)) {
+      index = expression; expression = false;
+    }
+    return Selector.matchElements(elements, expression || '*')[index || 0];
+  },
+
+  findChildElements: function(element, expressions) {
+    expressions = Selector.split(expressions.join(','));
+    var results = [], h = Selector.handlers;
+    for (var i = 0, l = expressions.length, selector; i < l; i++) {
+      selector = new Selector(expressions[i].strip());
+      h.concat(results, selector.findElements(element));
+    }
+    return (l > 1) ? h.unique(results) : results;
+  }
+});
+
+if (Prototype.Browser.IE) {
+  Object.extend(Selector.handlers, {
+    // IE returns comment nodes on getElementsByTagName("*").
+    // Filter them out.
+    concat: function(a, b) {
+      for (var i = 0, node; node = b[i]; i++)
+        if (node.tagName !== "!") a.push(node);
+      return a;
+    },
+
+    // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
+    unmark: function(nodes) {
+      for (var i = 0, node; node = nodes[i]; i++)
+        node.removeAttribute('_countedByPrototype');
+      return nodes;
+    }
+  });
+}
+
+function $$() {
+  return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+  reset: function(form) {
+    $(form).reset();
+    return form;
+  },
+
+  serializeElements: function(elements, options) {
+    if (typeof options != 'object') options = { hash: !!options };
+    else if (Object.isUndefined(options.hash)) options.hash = true;
+    var key, value, submitted = false, submit = options.submit;
+
+    var data = elements.inject({ }, function(result, element) {
+      if (!element.disabled && element.name) {
+        key = element.name; value = $(element).getValue();
+        if (value != null && (element.type != 'submit' || (!submitted &&
+            submit !== false && (!submit || key == submit) && (submitted = true)))) {
+          if (key in result) {
+            // a key is already present; construct an array of values
+            if (!Object.isArray(result[key])) result[key] = [result[key]];
+            result[key].push(value);
+          }
+          else result[key] = value;
+        }
+      }
+      return result;
+    });
+
+    return options.hash ? data : Object.toQueryString(data);
+  }
+};
+
+Form.Methods = {
+  serialize: function(form, options) {
+    return Form.serializeElements(Form.getElements(form), options);
+  },
+
+  getElements: function(form) {
+    return $A($(form).getElementsByTagName('*')).inject([],
+      function(elements, child) {
+        if (Form.Element.Serializers[child.tagName.toLowerCase()])
+          elements.push(Element.extend(child));
+        return elements;
+      }
+    );
+  },
+
+  getInputs: function(form, typeName, name) {
+    form = $(form);
+    var inputs = form.getElementsByTagName('input');
+
+    if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) || (name && input.name != name))
+        continue;
+      matchingInputs.push(Element.extend(input));
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('disable');
+    return form;
+  },
+
+  enable: function(form) {
+    form = $(form);
+    Form.getElements(form).invoke('enable');
+    return form;
+  },
+
+  findFirstElement: function(form) {
+    var elements = $(form).getElements().findAll(function(element) {
+      return 'hidden' != element.type && !element.disabled;
+    });
+    var firstByIndex = elements.findAll(function(element) {
+      return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+    }).sortBy(function(element) { return element.tabIndex }).first();
+
+    return firstByIndex ? firstByIndex : elements.find(function(element) {
+      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+    });
+  },
+
+  focusFirstElement: function(form) {
+    form = $(form);
+    form.findFirstElement().activate();
+    return form;
+  },
+
+  request: function(form, options) {
+    form = $(form), options = Object.clone(options || { });
+
+    var params = options.parameters, action = form.readAttribute('action') || '';
+    if (action.blank()) action = window.location.href;
+    options.parameters = form.serialize(true);
+
+    if (params) {
+      if (Object.isString(params)) params = params.toQueryParams();
+      Object.extend(options.parameters, params);
+    }
+
+    if (form.hasAttribute('method') && !options.method)
+      options.method = form.method;
+
+    return new Ajax.Request(action, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+  focus: function(element) {
+    $(element).focus();
+    return element;
+  },
+
+  select: function(element) {
+    $(element).select();
+    return element;
+  }
+};
+
+Form.Element.Methods = {
+  serialize: function(element) {
+    element = $(element);
+    if (!element.disabled && element.name) {
+      var value = element.getValue();
+      if (value != undefined) {
+        var pair = { };
+        pair[element.name] = value;
+        return Object.toQueryString(pair);
+      }
+    }
+    return '';
+  },
+
+  getValue: function(element) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    return Form.Element.Serializers[method](element);
+  },
+
+  setValue: function(element, value) {
+    element = $(element);
+    var method = element.tagName.toLowerCase();
+    Form.Element.Serializers[method](element, value);
+    return element;
+  },
+
+  clear: function(element) {
+    $(element).value = '';
+    return element;
+  },
+
+  present: function(element) {
+    return $(element).value != '';
+  },
+
+  activate: function(element) {
+    element = $(element);
+    try {
+      element.focus();
+      if (element.select && (element.tagName.toLowerCase() != 'input' ||
+          !['button', 'reset', 'submit'].include(element.type)))
+        element.select();
+    } catch (e) { }
+    return element;
+  },
+
+  disable: function(element) {
+    element = $(element);
+    element.blur();
+    element.disabled = true;
+    return element;
+  },
+
+  enable: function(element) {
+    element = $(element);
+    element.disabled = false;
+    return element;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+  input: function(element, value) {
+    switch (element.type.toLowerCase()) {
+      case 'checkbox':
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element, value);
+      default:
+        return Form.Element.Serializers.textarea(element, value);
+    }
+  },
+
+  inputSelector: function(element, value) {
+    if (Object.isUndefined(value)) return element.checked ? element.value : null;
+    else element.checked = !!value;
+  },
+
+  textarea: function(element, value) {
+    if (Object.isUndefined(value)) return element.value;
+    else element.value = value;
+  },
+
+  select: function(element, index) {
+    if (Object.isUndefined(index))
+      return this[element.type == 'select-one' ?
+        'selectOne' : 'selectMany'](element);
+    else {
+      var opt, value, single = !Object.isArray(index);
+      for (var i = 0, length = element.length; i < length; i++) {
+        opt = element.options[i];
+        value = this.optionValue(opt);
+        if (single) {
+          if (value == index) {
+            opt.selected = true;
+            return;
+          }
+        }
+        else opt.selected = index.include(value);
+      }
+    }
+  },
+
+  selectOne: function(element) {
+    var index = element.selectedIndex;
+    return index >= 0 ? this.optionValue(element.options[index]) : null;
+  },
+
+  selectMany: function(element) {
+    var values, length = element.length;
+    if (!length) return null;
+
+    for (var i = 0, values = []; i < length; i++) {
+      var opt = element.options[i];
+      if (opt.selected) values.push(this.optionValue(opt));
+    }
+    return values;
+  },
+
+  optionValue: function(opt) {
+    // extend element because hasAttribute may not be native
+    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+  initialize: function($super, element, frequency, callback) {
+    $super(callback, frequency);
+    this.element   = $(element);
+    this.lastValue = this.getValue();
+  },
+
+  execute: function() {
+    var value = this.getValue();
+    if (Object.isString(this.lastValue) && Object.isString(value) ?
+        this.lastValue != value : String(this.lastValue) != String(value)) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+  initialize: function(element, callback) {
+    this.element  = $(element);
+    this.callback = callback;
+
+    this.lastValue = this.getValue();
+    if (this.element.tagName.toLowerCase() == 'form')
+      this.registerFormCallbacks();
+    else
+      this.registerCallback(this.element);
+  },
+
+  onElementEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  },
+
+  registerFormCallbacks: function() {
+    Form.getElements(this.element).each(this.registerCallback, this);
+  },
+
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':
+        case 'radio':
+          Event.observe(element, 'click', this.onElementEvent.bind(this));
+          break;
+        default:
+          Event.observe(element, 'change', this.onElementEvent.bind(this));
+          break;
+      }
+    }
+  }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+  KEY_BACKSPACE: 8,
+  KEY_TAB:       9,
+  KEY_RETURN:   13,
+  KEY_ESC:      27,
+  KEY_LEFT:     37,
+  KEY_UP:       38,
+  KEY_RIGHT:    39,
+  KEY_DOWN:     40,
+  KEY_DELETE:   46,
+  KEY_HOME:     36,
+  KEY_END:      35,
+  KEY_PAGEUP:   33,
+  KEY_PAGEDOWN: 34,
+  KEY_INSERT:   45,
+
+  cache: { },
+
+  relatedTarget: function(event) {
+    var element;
+    switch(event.type) {
+      case 'mouseover': element = event.fromElement; break;
+      case 'mouseout':  element = event.toElement;   break;
+      default: return null;
+    }
+    return Element.extend(element);
+  }
+});
+
+Event.Methods = (function() {
+  var isButton;
+
+  if (Prototype.Browser.IE) {
+    var buttonMap = { 0: 1, 1: 4, 2: 2 };
+    isButton = function(event, code) {
+      return event.button == buttonMap[code];
+    };
+
+  } else if (Prototype.Browser.WebKit) {
+    isButton = function(event, code) {
+      switch (code) {
+        case 0: return event.which == 1 && !event.metaKey;
+        case 1: return event.which == 1 && event.metaKey;
+        default: return false;
+      }
+    };
+
+  } else {
+    isButton = function(event, code) {
+      return event.which ? (event.which === code + 1) : (event.button === code);
+    };
+  }
+
+  return {
+    isLeftClick:   function(event) { return isButton(event, 0) },
+    isMiddleClick: function(event) { return isButton(event, 1) },
+    isRightClick:  function(event) { return isButton(event, 2) },
+
+    element: function(event) {
+      var node = Event.extend(event).target;
+      return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
+    },
+
+    findElement: function(event, expression) {
+      var element = Event.element(event);
+      if (!expression) return element;
+      var elements = [element].concat(element.ancestors());
+      return Selector.findElement(elements, expression, 0);
+    },
+
+    pointer: function(event) {
+      return {
+        x: event.pageX || (event.clientX +
+          (document.documentElement.scrollLeft || document.body.scrollLeft)),
+        y: event.pageY || (event.clientY +
+          (document.documentElement.scrollTop || document.body.scrollTop))
+      };
+    },
+
+    pointerX: function(event) { return Event.pointer(event).x },
+    pointerY: function(event) { return Event.pointer(event).y },
+
+    stop: function(event) {
+      Event.extend(event);
+      event.preventDefault();
+      event.stopPropagation();
+      event.stopped = true;
+    }
+  };
+})();
+
+Event.extend = (function() {
+  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+    m[name] = Event.Methods[name].methodize();
+    return m;
+  });
+
+  if (Prototype.Browser.IE) {
+    Object.extend(methods, {
+      stopPropagation: function() { this.cancelBubble = true },
+      preventDefault:  function() { this.returnValue = false },
+      inspect: function() { return "[object Event]" }
+    });
+
+    return function(event) {
+      if (!event) return false;
+      if (event._extendedByPrototype) return event;
+
+      event._extendedByPrototype = Prototype.emptyFunction;
+      var pointer = Event.pointer(event);
+      Object.extend(event, {
+        target: event.srcElement,
+        relatedTarget: Event.relatedTarget(event),
+        pageX:  pointer.x,
+        pageY:  pointer.y
+      });
+      return Object.extend(event, methods);
+    };
+
+  } else {
+    Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
+    Object.extend(Event.prototype, methods);
+    return Prototype.K;
+  }
+})();
+
+Object.extend(Event, (function() {
+  var cache = Event.cache;
+
+  function getEventID(element) {
+    if (element._prototypeEventID) return element._prototypeEventID[0];
+    arguments.callee.id = arguments.callee.id || 1;
+    return element._prototypeEventID = [++arguments.callee.id];
+  }
+
+  function getDOMEventName(eventName) {
+    if (eventName && eventName.include(':')) return "dataavailable";
+    return eventName;
+  }
+
+  function getCacheForID(id) {
+    return cache[id] = cache[id] || { };
+  }
+
+  function getWrappersForEventName(id, eventName) {
+    var c = getCacheForID(id);
+    return c[eventName] = c[eventName] || [];
+  }
+
+  function createWrapper(element, eventName, handler) {
+    var id = getEventID(element);
+    var c = getWrappersForEventName(id, eventName);
+    if (c.pluck("handler").include(handler)) return false;
+
+    var wrapper = function(event) {
+      if (!Event || !Event.extend ||
+        (event.eventName && event.eventName != eventName))
+          return false;
+
+      Event.extend(event);
+      handler.call(element, event);
+    };
+
+    wrapper.handler = handler;
+    c.push(wrapper);
+    return wrapper;
+  }
+
+  function findWrapper(id, eventName, handler) {
+    var c = getWrappersForEventName(id, eventName);
+    return c.find(function(wrapper) { return wrapper.handler == handler });
+  }
+
+  function destroyWrapper(id, eventName, handler) {
+    var c = getCacheForID(id);
+    if (!c[eventName]) return false;
+    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+  }
+
+  function destroyCache() {
+    for (var id in cache)
+      for (var eventName in cache[id])
+        cache[id][eventName] = null;
+  }
+
+  if (window.attachEvent) {
+    window.attachEvent("onunload", destroyCache);
+  }
+
+  return {
+    observe: function(element, eventName, handler) {
+      element = $(element);
+      var name = getDOMEventName(eventName);
+
+      var wrapper = createWrapper(element, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.addEventListener) {
+        element.addEventListener(name, wrapper, false);
+      } else {
+        element.attachEvent("on" + name, wrapper);
+      }
+
+      return element;
+    },
+
+    stopObserving: function(element, eventName, handler) {
+      element = $(element);
+      var id = getEventID(element), name = getDOMEventName(eventName);
+
+      if (!handler && eventName) {
+        getWrappersForEventName(id, eventName).each(function(wrapper) {
+          element.stopObserving(eventName, wrapper.handler);
+        });
+        return element;
+
+      } else if (!eventName) {
+        Object.keys(getCacheForID(id)).each(function(eventName) {
+          element.stopObserving(eventName);
+        });
+        return element;
+      }
+
+      var wrapper = findWrapper(id, eventName, handler);
+      if (!wrapper) return element;
+
+      if (element.removeEventListener) {
+        element.removeEventListener(name, wrapper, false);
+      } else {
+        element.detachEvent("on" + name, wrapper);
+      }
+
+      destroyWrapper(id, eventName, handler);
+
+      return element;
+    },
+
+    fire: function(element, eventName, memo) {
+      element = $(element);
+      if (element == document && document.createEvent && !element.dispatchEvent)
+        element = document.documentElement;
+
+      var event;
+      if (document.createEvent) {
+        event = document.createEvent("HTMLEvents");
+        event.initEvent("dataavailable", true, true);
+      } else {
+        event = document.createEventObject();
+        event.eventType = "ondataavailable";
+      }
+
+      event.eventName = eventName;
+      event.memo = memo || { };
+
+      if (document.createEvent) {
+        element.dispatchEvent(event);
+      } else {
+        element.fireEvent(event.eventType, event);
+      }
+
+      return Event.extend(event);
+    }
+  };
+})());
+
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+  fire:          Event.fire,
+  observe:       Event.observe,
+  stopObserving: Event.stopObserving
+});
+
+Object.extend(document, {
+  fire:          Element.Methods.fire.methodize(),
+  observe:       Element.Methods.observe.methodize(),
+  stopObserving: Element.Methods.stopObserving.methodize(),
+  loaded:        false
+});
+
+(function() {
+  /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+     Matthias Miller, Dean Edwards and John Resig. */
+
+  var timer;
+
+  function fireContentLoadedEvent() {
+    if (document.loaded) return;
+    if (timer) window.clearInterval(timer);
+    document.fire("dom:loaded");
+    document.loaded = true;
+  }
+
+  if (document.addEventListener) {
+    if (Prototype.Browser.WebKit) {
+      timer = window.setInterval(function() {
+        if (/loaded|complete/.test(document.readyState))
+          fireContentLoadedEvent();
+      }, 0);
+
+      Event.observe(window, "load", fireContentLoadedEvent);
+
+    } else {
+      document.addEventListener("DOMContentLoaded",
+        fireContentLoadedEvent, false);
+    }
+
+  } else {
+    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+    $("__onDOMContentLoaded").onreadystatechange = function() {
+      if (this.readyState == "complete") {
+        this.onreadystatechange = null;
+        fireContentLoadedEvent();
+      }
+    };
+  }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+  Before: function(element, content) {
+    return Element.insert(element, {before:content});
+  },
+
+  Top: function(element, content) {
+    return Element.insert(element, {top:content});
+  },
+
+  Bottom: function(element, content) {
+    return Element.insert(element, {bottom:content});
+  },
+
+  After: function(element, content) {
+    return Element.insert(element, {after:content});
+  }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
+var Position = {
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false,
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset
+                || document.documentElement.scrollLeft
+                || document.body.scrollLeft
+                || 0;
+    this.deltaY =  window.pageYOffset
+                || document.documentElement.scrollTop
+                || document.body.scrollTop
+                || 0;
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (y >= this.offset[1] &&
+            y <  this.offset[1] + element.offsetHeight &&
+            x >= this.offset[0] &&
+            x <  this.offset[0] + element.offsetWidth);
+  },
+
+  withinIncludingScrolloffsets: function(element, x, y) {
+    var offsetcache = Element.cumulativeScrollOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = Element.cumulativeOffset(element);
+
+    return (this.ycomp >= this.offset[1] &&
+            this.ycomp <  this.offset[1] + element.offsetHeight &&
+            this.xcomp >= this.offset[0] &&
+            this.xcomp <  this.offset[0] + element.offsetWidth);
+  },
+
+  // within must be called directly before
+  overlap: function(mode, element) {
+    if (!mode) return 0;
+    if (mode == 'vertical')
+      return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+        element.offsetHeight;
+    if (mode == 'horizontal')
+      return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+        element.offsetWidth;
+  },
+
+  // Deprecation layer -- use newer Element methods now (1.5.2).
+
+  cumulativeOffset: Element.Methods.cumulativeOffset,
+
+  positionedOffset: Element.Methods.positionedOffset,
+
+  absolutize: function(element) {
+    Position.prepare();
+    return Element.absolutize(element);
+  },
+
+  relativize: function(element) {
+    Position.prepare();
+    return Element.relativize(element);
+  },
+
+  realOffset: Element.Methods.cumulativeScrollOffset,
+
+  offsetParent: Element.Methods.getOffsetParent,
+
+  page: Element.Methods.viewportOffset,
+
+  clone: function(source, target, options) {
+    options = options || { };
+    return Element.clonePosition(target, source, options);
+  }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+  function iter(name) {
+    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+  }
+
+  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+  function(element, className) {
+    className = className.toString().strip();
+    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+    return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+  } : function(element, className) {
+    className = className.toString().strip();
+    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+    if (!classNames && !className) return elements;
+
+    var nodes = $(element).getElementsByTagName('*');
+    className = ' ' + className + ' ';
+
+    for (var i = 0, child, cn; child = nodes[i]; i++) {
+      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+          (classNames && classNames.all(function(name) {
+            return !name.toString().blank() && cn.include(' ' + name + ' ');
+          }))))
+        elements.push(Element.extend(child));
+    }
+    return elements;
+  };
+
+  return function(className, parentElement) {
+    return $(parentElement || document.body).getElementsByClassName(className);
+  };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+  initialize: function(element) {
+    this.element = $(element);
+  },
+
+  _each: function(iterator) {
+    this.element.className.split(/\s+/).select(function(name) {
+      return name.length > 0;
+    })._each(iterator);
+  },
+
+  set: function(className) {
+    this.element.className = className;
+  },
+
+  add: function(classNameToAdd) {
+    if (this.include(classNameToAdd)) return;
+    this.set($A(this).concat(classNameToAdd).join(' '));
+  },
+
+  remove: function(classNameToRemove) {
+    if (!this.include(classNameToRemove)) return;
+    this.set($A(this).without(classNameToRemove).join(' '));
+  },
+
+  toString: function() {
+    return $A(this).join(' ');
+  }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+Element.addMethods();
Index: tags/2.4.0RC3/tools/pwg_rel_create.sh
===================================================================
--- tags/2.4.0RC3/tools/pwg_rel_create.sh	(revision 14585)
+++ tags/2.4.0RC3/tools/pwg_rel_create.sh	(revision 14585)
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# +--------------------------------------------------------------------------+
+# |                            pwg_rel_create.sh                             |
+# +--------------------------------------------------------------------------+
+# | author        : Pierrick LE GALL <http://le-gall.net/pierrick>           |
+# | project       : Piwigo                                                   |
+# +--------------------------------------------------------------------------+
+
+if [ $# -lt 2 ]
+then
+  echo
+  echo 'usage : '$(basename $0)' <tag> <version number>'
+  echo
+  exit 1
+fi
+
+tag=$1
+version=$2
+
+name=piwigo-$version
+
+cd /tmp
+
+if [ -e $version ]
+then
+  rm -rf $version
+fi
+mkdir $version
+cd $version
+
+svn export http://piwigo.org/svn/tags/$tag piwigo
+
+
+mkdir piwigo/_data
+touch piwigo/_data/dummy.txt
+
+mkdir piwigo/upload
+
+zip -r $name-nochmod.zip piwigo
+
+chmod -R a+w piwigo/local
+chmod a+w piwigo/_data
+chmod a+w piwigo/upload
+
+zip -r $name.zip piwigo
+
+echo cd /tmp/$version
Index: tags/2.4.0RC3/tools/release_creation.readme
===================================================================
--- tags/2.4.0RC3/tools/release_creation.readme	(revision 14585)
+++ tags/2.4.0RC3/tools/release_creation.readme	(revision 14585)
@@ -0,0 +1,50 @@
+=====================================
+ Piwigo release creation guide
+=====================================
+
+Technical creation
+==================
+
+I take release 1.7.0 as an example. In URLs "plg" is my personnal Gna!
+username, so use yours.
+
+- tag creation tags/release-1_7_0 :
+
+$ svn copy \
+  -r 1999 \
+  -m "Create release 1.7.0 from branch 1.7 r1999" \
+  svn+ssh://plg@svn.gna.org/svn/phpwebgallery/branch/branch-1_7 \
+  svn+ssh://plg@svn.gna.org/svn/phpwebgallery/tags/release-1_7_0
+
+- checkout new Subversion release 1.7.0
+
+$ svn co svn+ssh://plg@svn.gna.org/svn/phpwebgallery/tags/release-1_7_0 1.7.0
+$ cd 1.7.0
+
+- in include/config_default.inc.php, change the following parameters:
+  - $conf['check_upgrade_feed'] = false;
+  - $conf['show_version'] = false;
+  - $conf['show_gt'] = false;
+  - $conf['die_on_sql_error'] = false;
+
+- in include/constants.php, change the PHPWG_VERSION to 1.7.0
+
+- commit your changes to tags/release-1_7_0, with the following comment:
+
+> New version 1.7.0 hard coded.
+> 
+> Stable release required modifications: don't show version and generation
+> time in footer, don't check the upgrade feed, don't die on sql errors.
+
+$ svn commit
+
+- create the release (pwg_rel_create.sh is in tools directory)
+
+$ mkdir /tmp/1.7.0
+$ cd /tmp/1.7.0
+$ pwg_rel_create.sh release-1_7_0 1.7.0
+$ md5sum p* > MD5SUMS
+
+- upload the release to Gna! download area
+
+$ scp -r /tmp/1.7.0 plg@download.gna.org:/upload/phpwebgallery/release/1.7/
Index: tags/2.4.0RC3/tools/replace.php
===================================================================
--- tags/2.4.0RC3/tools/replace.php	(revision 14585)
+++ tags/2.4.0RC3/tools/replace.php	(revision 14585)
@@ -0,0 +1,53 @@
+#!/usr/bin/php -qn
+<?php
+if (isset($_SERVER['argc']) && $_SERVER['argc']<=1) 
+{
+  echo "\n";
+  echo 'usage : ', basename($_SERVER['argv'][0]), " <filename>\n";
+  echo "\n";
+  exit(1);
+}
+
+$filename = trim($_SERVER['argv'][1]);
+$lines = file($filename);
+$content = file_get_contents($filename);
+
+$n = 0;
+$nbLines = count($lines);
+
+$pattern = "`(.*{')(.*)('\|@translate}.*)`Um";
+$replace = "'{\''.keyReplace('\\1').'\'|@translate}'";
+
+include "language/templates/common.lang.php";
+include "language/templates/admin.lang.php";
+include "language/templates/upgrade.lang.php";
+include "language/templates/install.lang.php";
+
+while ($n < $nbLines) {
+  preg_match_all($pattern, $lines[$n], $matches);
+  echo str_replace($matches[2], keyReplace($matches[2]), $lines[$n]);
+  $n++;
+}
+
+function keyReplace($key) {
+  global $lang;
+
+  if (is_array($key)) {
+    $translation = array();
+    foreach ($key as $i => $k) {
+      if (isset($lang[$k])) {
+	$translation = addslashes($lang[$k]);
+      } else {
+	$translation = "$k";
+      }      
+    }
+  } else {
+    if (isset($lang[$key])) {
+      $translation = addslashes($lang[$key]);
+    } else {
+      $translation = "$key";
+    }
+  }
+  return $translation;
+}
+?>
Index: tags/2.4.0RC3/tools/replace_language_keys.pl
===================================================================
--- tags/2.4.0RC3/tools/replace_language_keys.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/replace_language_keys.pl	(revision 14585)
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $replacement_file = $ARGV[0];
+my $language_dir = $ARGV[1];
+
+# load the replacements
+my %replace_by = ();
+open(my $ifh_rep, '<'.$replacement_file);
+while (<$ifh_rep>) {
+    if (m/^\$lang\['(.*)'\] \s* = \s* (['"])(.*)\2;/x) {
+        if ($1 ne $3 and length($1) > 0) {
+            $replace_by{$1} = $3;
+        }
+    }
+}
+# use Data::Dumper; print Dumper(\%replace_by); exit();
+
+my $append_to_common = '';
+
+foreach my $file_code (qw/upgrade install admin common plugin/) {
+    my $filename = $language_dir.'/'.$file_code.'.lang.php';
+    # print $filename;
+    if (not -f $filename) {
+        # print ' is missing', "\n";
+        next;
+    }
+    print $filename.' is under process', "\n";
+
+    my $file_content = '';
+
+    open(my $ifh, '<'.$filename);
+    while (my $line = <$ifh>) {
+        if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
+            if (defined $replace_by{$1}) {
+                my $search = quotemeta($1);
+                my $replace = $replace_by{$1};
+
+                $line =~ s{$search}{$replace};
+                $file_content.= $line;
+            }
+            else {
+                $file_content.= $line;
+            }
+        }
+        elsif ($line =~ m/^?>/) {
+            $file_content.= $line;
+        }
+        else {
+            $file_content.= $line;
+        }
+    }
+    close($ifh);
+
+    open(my $ofh, '>'.$filename);
+    print {$ofh} $file_content;
+    close($ofh);
+}
Index: tags/2.4.0RC3/tools/replace_language_values.pl
===================================================================
--- tags/2.4.0RC3/tools/replace_language_values.pl	(revision 14585)
+++ tags/2.4.0RC3/tools/replace_language_values.pl	(revision 14585)
@@ -0,0 +1,61 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $replacement_file = $ARGV[0];
+my $language_dir = $ARGV[1];
+
+# load the new values for given keys
+my %new_value_of = ();
+open(my $ifh_rep, '<'.$replacement_file);
+while (<$ifh_rep>) {
+    if (m/^\$lang\['(.*)'\] \s* = \s* (.*);/x) {
+        $new_value_of{$1} = $2;
+    }
+}
+# use Data::Dumper; print Dumper(\%new_value_of); exit();
+
+my %replacement_performed_for = ();
+
+foreach my $file_code (qw/upgrade install admin common plugin/) {
+    my $filename = $language_dir.'/'.$file_code.'.lang.php';
+    # print $filename;
+    if (not -f $filename) {
+        # print ' is missing', "\n";
+        next;
+    }
+    print $filename.' is under process', "\n";
+
+    my $file_content = '';
+
+    open(my $ifh, '<'.$filename);
+    while (my $line = <$ifh>) {
+        if ($line =~ m/^\$lang\['(.*)'\] \s* =/x) {
+            if (defined $new_value_of{$1}) {
+                $file_content.= '$lang[\''.$1.'\'] = '.$new_value_of{$1}.';'."\n";
+                $replacement_performed_for{$1}++;
+            }
+            else {
+                $file_content.= $line;
+            }
+        }
+        elsif ($line =~ m/^?>/) {
+            $file_content.= $line;
+        }
+        else {
+            $file_content.= $line;
+        }
+    }
+    close($ifh);
+
+    open(my $ofh, '>'.$filename);
+    print {$ofh} $file_content;
+    close($ofh);
+}
+
+foreach my $new_value (keys %new_value_of) {
+    if (not defined $replacement_performed_for{$new_value}) {
+        print 'no replacement performed on: ', $new_value, "\n";
+    }
+}
Index: tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.css
===================================================================
--- tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.css	(revision 14585)
+++ tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.css	(revision 14585)
@@ -0,0 +1,39 @@
+/* tables */
+table.tablesorter {
+	font-family:arial;
+	background-color: #CDCDCD;
+	margin:10px 0pt 15px;
+	font-size: 8pt;
+	width: 100%;
+	text-align: left;
+}
+table.tablesorter thead tr th, table.tablesorter tfoot tr th {
+	background-color: #e6EEEE;
+	border: 1px solid #FFF;
+	font-size: 8pt;
+	padding: 4px;
+}
+table.tablesorter thead tr .header {
+	background-image: url(bg.gif);
+	background-repeat: no-repeat;
+	background-position: center right;
+	cursor: pointer;
+}
+table.tablesorter tbody td {
+	color: #3D3D3D;
+	padding: 4px;
+	background-color: #FFF;
+	vertical-align: top;
+}
+table.tablesorter tbody tr.odd td {
+	background-color:#F0F0F6;
+}
+table.tablesorter thead tr .headerSortUp {
+	background-image: url(asc.gif);
+}
+table.tablesorter thead tr .headerSortDown {
+	background-image: url(desc.gif);
+}
+table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp {
+background-color: #8dbdd8;
+}
Index: tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.min.js
===================================================================
--- tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.min.js	(revision 14585)
+++ tags/2.4.0RC3/tools/tablesorter/jquery.tablesorter.min.js	(revision 14585)
@@ -0,0 +1,4 @@
+
+(function($){$.extend({tablesorter:new
+function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1
+var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery);
Index: tags/2.4.0RC3/tools/translation_analysis.php
===================================================================
--- tags/2.4.0RC3/tools/translation_analysis.php	(revision 14585)
+++ tags/2.4.0RC3/tools/translation_analysis.php	(revision 14585)
@@ -0,0 +1,169 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH', '../');
+include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
+include_once( PHPWG_ROOT_PATH.'tools/language/translation_validated.inc.php' );
+$languages = array_keys(get_languages());
+sort($languages);
+
+$page['ref_compare'] = 'en_UK';
+$page['ref_default_values'] = 'en_UK';
+
+if (!isset($_GET['lang']))
+{
+  echo '<a href="?lang=all">All languages</a><br><br>';
+  echo '<ul>';
+  foreach ($languages as $language)
+  {
+    if ($page['ref_compare'] == $language)
+    {
+      continue;
+    }
+    echo '<li><a href="?lang='.$language.'">'.$language.'</a></li>';
+  }
+  echo '</ul>';
+  exit();
+}
+else if (in_array($_GET['lang'], $languages))
+{
+  $languages = array($_GET['lang']);
+}
+
+$file_list = array('common', 'admin', 'install', 'upgrade');
+
+$metalang = array();
+
+// preload reference languages
+$metalang[ $page['ref_compare'] ] = load_metalang($page['ref_compare'], $file_list);
+$metalang[ $page['ref_default_values'] ] = load_metalang($page['ref_default_values'], $file_list);
+
+foreach ($languages as $language)
+{
+  if (in_array($language, array($page['ref_compare'], $page['ref_default_values'])))
+  {
+    continue;
+  }
+  echo '<h2>'.$language.'</h2>';
+  $metalang[$language] = load_metalang($language, $file_list);
+
+  foreach ($file_list as $file)
+  {
+    if (isset($metalang[ $language ][$file]))
+    {
+      $missing_keys = array_diff(
+        array_keys($metalang[ $page['ref_compare'] ][$file]),
+        array_keys($metalang[ $language ][$file])
+        );
+
+      $output_missing = '';
+      foreach ($missing_keys as $key)
+      {
+        $output_missing.= get_line_to_translate($file, $key);
+      }
+
+      // strings not "really" translated?
+      $output_duplicated = '';
+      $output_lost = '';
+      foreach (array_keys($metalang[$language][$file]) as $key)
+      {
+        $exceptions = array('Level 0');
+        if (in_array($key, $exceptions))
+        {
+          continue;
+        }
+
+        if (isset($validated_keys[$language]) and in_array($key, $validated_keys[$language]))
+        {
+          continue;
+        }
+        
+        $local_value = $metalang[$language][$file][$key];
+        if (!isset($metalang[ $page['ref_default_values'] ][$file][$key]))
+        {
+          $output_lost.= '#'.$key.'# does not exist in the reference language'."\n";
+        }
+        else
+        {
+          $ref_value = $metalang[ $page['ref_default_values'] ][$file][$key];
+          if ($local_value == $ref_value)
+          {
+            $output_duplicated.= get_line_to_translate($file, $key);
+          }
+        }
+      }
+
+      echo '<h3>'.$file.'.lang.php</h3>';
+      
+      if ('' != $output_missing or '' != $output_duplicated)
+      {
+        $output = '';
+        if ('' != $output_missing)
+        {
+          $output.= "// missing translations\n".$output_missing;
+        }
+        if ('' != $output_duplicated)
+        {
+          $output.= "\n// untranslated yet\n".$output_duplicated;
+        }
+        echo '<textarea style="width:100%;height:250px;">'.$output.'</textarea>';
+      }
+
+      if ('' != $output_lost)
+      {
+        echo '<pre>'.$output_lost.'</pre>';
+      }
+    }
+    else
+    {
+      echo '<h3>'.$file.'.lang.php is missing</h3>';
+    }
+  }
+}
+
+function load_metalang($language, $file_list)
+{
+  global $lang, $user;
+  
+  $metalang = array();
+  foreach ($file_list as $file)
+  {
+    $lang = array();
+    $user['language'] = $language;
+    if (load_language($file.'.lang', '', array('language'=>$language, 'no_fallback'=>true)))
+    {
+      $metalang[$file] = $lang;
+    }
+  }
+  return $metalang;
+}
+
+function get_line_to_translate($file, $key)
+{
+  global $metalang, $page;
+  
+  $print_key = str_replace("'", '\\\'', $key);
+  $print_value = str_replace("'", '\\\'', $metalang[ $page['ref_default_values'] ][$file][$key]);
+  return '$'."lang['".$print_key."'] = '".$print_value."';\n";
+}
+?>
Index: tags/2.4.0RC3/tools/triggers_list.php
===================================================================
--- tags/2.4.0RC3/tools/triggers_list.php	(revision 14585)
+++ tags/2.4.0RC3/tools/triggers_list.php	(revision 14585)
@@ -0,0 +1,756 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+$core = array(
+array(
+  'name' => 'allow_increment_element_hit_count',
+  'type' => 'trigger_event',
+  'vars' => array('bool' => 'content_not_set'),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'begin_delete_elements',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'ids'),
+  'files' => array('admin\include\functions.inc.php (delete_elements)'),
+),
+array(
+  'name' => 'blockmanager_apply',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'menublock'),
+  'files' => array('include\block.class.php (BlockManager::apply)'),
+  'infos' => 'use this trigger to modify existing menu blocks',
+),
+array(
+  'name' => 'blockmanager_prepare_display',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'this'),
+  'files' => array('include\block.class.php (BlockManager::prepare_display)'),
+),
+array(
+  'name' => 'blockmanager_register_blocks',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'menu'),
+  'files' => array('include\block.class.php (BlockManager::load_registered_blocks)'),
+  'infos' => 'use this trigger to add menu block',
+),
+array(
+  'name' => 'clean_iptc_value',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'value'),
+  'files' => array('include\functions_metadata.inc.php (clean_iptc_value)'),
+),
+array(
+  'name' => 'combined_css',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'href', 'int' => 'file_ver0', 'int' => 'file_ver1'),
+  'files' => array('include\template.class.php (Template::flush)'),
+),
+array(
+  'name' => 'combined_css_postfilter',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'css'),
+  'files' => array('include\template.class.php (Template::process_css)'),
+),
+array(
+  'name' => 'combined_script',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'ret', 'string' => 'script'),
+  'files' => array('include\template.class.php (Template::make_script_src)'),
+),
+array(
+  'name' => 'delete_categories',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'ids'),
+  'files' => array('admin\include\functions.inc.php (delete_categories)'),
+),
+array(
+  'name' => 'delete_elements',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'ids'),
+  'files' => array('admin\include\functions.inc.php (delete_elements)'),
+),
+array(
+  'name' => 'delete_user',
+  'type' => 'trigger_action',
+  'vars' => array('int' => 'user_id'),
+  'files' => array('admin\include\functions.inc.php (delete_user)'),
+),
+array(
+  'name' => 'element_set_global_action',
+  'type' => 'trigger_action',
+  'vars' => array('string' => 'action', 'array' => 'collection'),
+  'files' => array('admin\batch_manager_global.php'),
+),
+array(
+  'name' => 'format_exif_data',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'exif', 'string' => 'filename', 'array' => 'map'),
+  'files' => array('include\functions_metadata.inc.php (get_exif_data)'),
+),
+array(
+  'name' => 'functions_history_included',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\include\functions_history.inc.php'),
+),
+array(
+  'name' => 'functions_mail_included',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\functions_mail.inc.php'),
+),
+array(
+  'name' => 'get_admin_advanced_features_links',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'advanced_features'),
+  'files' => array('admin\maintenance.php'),
+),
+array(
+  'name' => 'get_admin_plugin_menu_links',
+  'type' => 'trigger_event',
+  'vars' => array('array' => ''),
+  'files' => array('admin.php'),
+  'infos' => 'use this trigger to add links into admin plugins menu',
+),
+array(
+  'name' => 'get_admins_site_links',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'plugin_links', 'int' => 'site_id', 'bool' => 'is_remote'),
+  'files' => array('admin\site_manager.php'),
+),
+array(
+  'name' => 'get_batch_manager_prefilters',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'prefilters'),
+  'files' => array('admin\batch_manager_global.php'),
+  'infos' => 'use this trigger to add prefilters into batch manager global',
+),
+array(
+  'name' => 'get_categories_menu_sql_where',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'where', 'bool' => 'user_expand', 'bool' => 'filter_enabled'),
+  'files' => array('include\functions_category.inc.php (get_categories_menu)'),
+),
+array(
+  'name' => 'get_category_preferred_image_orders',
+  'type' => 'trigger_event',
+  'vars' => array('array' => ''),
+  'files' => array('include\functions_category.inc.php (get_category_preferred_image_orders)'),
+),
+array(
+  'name' => 'get_download_url',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'url', 'array' => 'element_info'),
+  'files' => array('include\functions_picture.inc.php (get_download_url'),
+),
+array(
+  'name' => 'get_element_metadata_available',
+  'type' => 'trigger_event',
+  'vars' => array('bool' => '', 'string' => 'element_path'),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'get_element_url',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'url', 'array' => 'element_info'),
+  'files' => array('include\functions_picture.inc.php (get_element_url)'),
+),
+array(
+  'name' => 'get_high_location',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'location', 'array' => 'element_info'),
+  'files' => array('include\functions_picture.inc.php (get_high_location)'),
+),
+array(
+  'name' => 'get_high_url',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'url', 'array' => 'element_info'),
+  'files' => array('include\functions_picture.inc.php (get_high_url)'),
+),
+array(
+  'name' => 'get_history',
+  'type' => 'trigger_event',
+  'vars' => array('array' => '', 'array' => 'page_search', 'array' => 'types'),
+  'files' => array('admin\history.php'),
+),
+array(
+  'name' => 'get_image_location',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'path', 'array' => 'element_info'),
+  'files' => array('include\functions_picture.inc.php (get_image_location)'),
+),
+array(
+  'name' => 'get_popup_help_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'help_content', 'string' => 'page'),
+  'files' => array('admin\popuphelp.php', 'popuphelp.php'),
+),
+array(
+  'name' => 'get_pwg_themes',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'themes'),
+  'files' => array('include\functions.inc.php (get_pwg_themes)'),
+),
+array(
+  'name' => 'get_thumbnail_location',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'path', 'array' => 'element_info'),
+  'files' => array('include\functions.inc.php (get_thumbnail_location)'),
+),
+array(
+  'name' => 'get_thumbnail_title',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'title', 'array' => 'info'),
+  'files' => array('include\functions.inc.php (get_thumbnail_title)'),
+),
+array(
+  'name' => 'get_thumbnail_url',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'url', 'array' => 'element_info', 'string' => 'loc'),
+  'files' => array('include\functions.inc.php (get_thumbnail_url)'),
+),
+array(
+  'name' => 'init',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\common.inc.php'),
+  'infos' => 'this action is called just after the common initialization, $conf, $user and $page (partial) variables are availables',
+),
+array(
+  'name' => 'invalidate_user_cache',
+  'type' => 'trigger_action',
+  'vars' => array('bool' => 'full'),
+  'files' => array('admin\include\functions.inc.php (invalidate_user_cache)'),
+),
+array(
+  'name' => 'list_check_integrity',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'this'),
+  'files' => array('admin\include\check_integrity.class.php (check_integrity::check)'),
+),
+array(
+  'name' => 'load_image_library',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'this'),
+  'files' => array('admin\include\image.class.php (pwg_image::__construct)'),
+),
+array(
+  'name' => 'load_profile_in_template',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'userdata'),
+  'files' => array('profile.php (load_profile_in_template)'),
+),
+array(
+  'name' => 'loading_lang',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\common.inc.php', 'include\functions.inc.php (redirect_html)', 'include\functions_mail.inc.php (switch_lang_to)', 'nbm.php'),
+),
+array(
+  'name' => 'loc_after_page_header',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\page_header.php'),
+),
+array(
+  'name' => 'loc_begin_about',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('about.php'),
+),
+array(
+  'name' => 'loc_begin_admin',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin.php'),
+),
+array(
+  'name' => 'loc_begin_admin_page',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin.php'),
+),
+array(
+  'name' => 'loc_begin_cat_list',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\cat_list.php'),
+),
+array(
+  'name' => 'loc_begin_cat_modify',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\cat_modify.php'),
+),
+array(
+  'name' => 'loc_begin_element_set_global',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\batch_manager_global.php'),
+),
+array(
+  'name' => 'loc_begin_element_set_unit',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\batch_manager_unit.php'),
+),
+array(
+  'name' => 'loc_begin_index',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('index.php'),
+),
+array(
+  'name' => 'loc_begin_index_category_thumbnails',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'categories'),
+  'files' => array('include\category_cats.inc.php'),
+),
+array(
+  'name' => 'loc_begin_index_thumbnails',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'pictures'),
+  'files' => array('include\category_default.inc.php'),
+),
+array(
+  'name' => 'loc_begin_page_header',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\page_header.php'),
+),
+array(
+  'name' => 'loc_begin_page_tail',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\page_tail.php'),
+),
+array(
+  'name' => 'loc_begin_picture',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'loc_begin_profile',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('profile.php'),
+),
+array(
+  'name' => 'loc_end_admin',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin.php'),
+),
+array(
+  'name' => 'loc_end_cat_list',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\cat_list.php'),
+),
+array(
+  'name' => 'loc_end_cat_modify',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\cat_modify.php'),
+),
+array(
+  'name' => 'loc_end_element_set_global',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\batch_manager_global.php'),
+),
+array(
+  'name' => 'loc_end_element_set_unit',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\batch_manager_unit.php'),
+),
+array(
+  'name' => 'loc_end_index',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('index.php'),
+),
+array(
+  'name' => 'loc_end_index_category_thumbnails',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'tpl_thumbnails_var', 'array' => 'categories'),
+  'files' => array('include\category_cats.inc.php'),
+),
+array(
+  'name' => 'loc_end_index_thumbnails',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'tpl_thumbnails_var', 'array' => 'pictures'),
+  'files' => array('include\category_default.inc.php'),
+),
+array(
+  'name' => 'loc_end_page_header',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\page_header.php'),
+),
+array(
+  'name' => 'loc_end_page_tail',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\page_tail.php'),
+),
+array(
+  'name' => 'loc_end_picture',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'loc_end_profile',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('profile.php'),
+),
+array(
+  'name' => 'loc_end_section_init',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\section_init.inc.php'),
+  'infos' => 'this action is called after section initilization, $page variable is fully defined',
+),
+array(
+  'name' => 'loc_visible_user_list',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'visible_user_list'),
+  'files' => array('admin\user_list.php'),
+),
+array(
+  'name' => 'login_failure',
+  'type' => 'trigger_action',
+  'vars' => array('string' => 'username'),
+  'files' => array('include\functions_user.inc.php (try_log_user)'),
+),
+array(
+  'name' => 'login_success',
+  'type' => 'trigger_action',
+  'vars' => array('string' => 'username'),
+  'files' => array('include\functions_user.inc.php (auto_login, try_log_user)'),
+),
+array(
+  'name' => 'mail_group_assign_vars',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'assign_vars'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail_group)'),
+),
+array(
+  'name' => 'nbm_event_handler_added',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('admin\notification_by_mail.php'),
+),
+array(
+  'name' => 'nbm_render_global_customize_mail_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'customize_mail_content'),
+  'files' => array('admin\notification_by_mail.php (do_action_send_mail_notification)'),
+),
+array(
+  'name' => 'nbm_render_user_customize_mail_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'customize_mail_content', 'string' => 'nbm_user'),
+  'files' => array('admin\notification_by_mail.php (do_action_send_mail_notification)'),
+),
+array(
+  'name' => 'perform_batch_manager_prefilters',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'filter_sets', 'string' => 'session_prefilter'),
+  'files' => array('admin\batch_manager.php'),
+),
+array(
+  'name' => 'picture_pictures_data',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'picture'),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'plugins_loaded',
+  'type' => 'trigger_action',
+  'vars' => array(),
+  'files' => array('include\functions_plugins.inc.php (load_plugins)'),
+),
+array(
+  'name' => 'pwg_log_allowed',
+  'type' => 'trigger_event',
+  'vars' => array('bool' => 'do_log', 'int' => 'image_id', 'string' => 'image_type'),
+  'files' => array('include\functions.inc.php (pwg_log)'),
+),
+array(
+  'name' => 'register_user',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'user'),
+  'files' => array('include\functions_user.inc.php (register_user)'),
+),
+array(
+  'name' => 'register_user_check',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'errors', 'array' => 'user'),
+  'files' => array('include\functions_user.inc.php (register_user)'),
+),
+array(
+  'name' => 'render_category_description',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'category_description', 'string' => 'action'),
+  'files' => array('include\category_cats.inc.php', 'include\section_init.inc.php', 'include\ws_functions.inc.php (ws_categories_getList, ws_categories_getAdminList)'),
+),
+array(
+  'name' => 'render_category_literal_description',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'category_description'),
+  'files' => array('include\category_cats.inc.php'),
+),
+array(
+  'name' => 'render_category_name',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'category_name', 'string' => 'location'),
+  'files' => array('admin\cat_list.php', 'include\ws_functions.inc.php (ws_categories_getList, ws_categories_getAdminList, ws_categories_move)'),
+),
+array(
+  'name' => 'render_comment_author',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'comment_author'),
+  'files' => array('admin\comments.php', 'comments.php', 'include\picture_comment.inc.php'),
+),
+array(
+  'name' => 'render_comment_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'comment_content'),
+  'files' => array('admin\comments.php', 'comments.php', 'include\picture_comment.inc.php'),
+),
+array(
+  'name' => 'render_element_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'content', 'array' => 'current_picture'),
+  'files' => array('picture.php'),
+),
+array(
+  'name' => 'render_element_description',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'element_name'),
+  'files' => array('include\functions.inc.php (get_picture_title)', 'picture.php'),
+),
+array(
+  'name' => 'render_lost_password_mail_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'message'),
+  'files' => array('password.php (process_password_request)'),
+),
+array(
+  'name' => 'render_page_banner',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'gallery_title'),
+  'files' => array('include\page_header.php'),
+),
+array(
+  'name' => 'render_tag_name',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'tag_name'),
+  'files' => array('include\functions.php (get_taglist)', 'admin\tags.php', 'include\functions_tag.inc.php (get_available_tags, get_all_tags, get_common_tags)', 'index.php'),
+),
+array(
+  'name' => 'render_tag_url',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'tag_name'),
+  'files' => array('include\functions.php (tag_id_from_tag_name, create_tag)', 'admin\tags.php'),
+),
+array(
+  'name' => 'save_profile_from_post',
+  'type' => 'trigger_action',
+  'vars' => array('int' => 'user_id'),
+  'files' => array('profile.php (save_profile_from_post)'),
+),
+array(
+  'name' => 'send_mail',
+  'type' => 'trigger_event',
+  'vars' => array('bool' => 'result', 'string' => 'mail_to', 'string' => 'mail_subject', 'string' => 'mail_content', 'array' => 'mail_headers'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail)'),
+),
+array(
+  'name' => 'send_mail_content',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'content'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail)'),
+),
+array(
+  'name' => 'send_mail_headers',
+  'type' => 'trigger_event',
+  'vars' => array('array' => 'headers'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail)'),
+),
+array(
+  'name' => 'send_mail_subject',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'cvt_subject'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail)'),
+),
+array(
+  'name' => 'send_mail_to',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'to'),
+  'files' => array('include\functions_mail.inc.php (pwg_mail)'),
+),
+array(
+  'name' => 'sendResponse',
+  'type' => 'trigger_action',
+  'vars' => array('string' => 'encodedResponse'),
+  'files' => array('include\ws_core.inc.php (PwgServer::sendResponse)'),
+),
+array(
+  'name' => 'set_status_header',
+  'type' => 'trigger_action',
+  'vars' => array('int' => 'code', 'string' => 'text'),
+  'files' => array('include\functions_html.inc.php (set_status_header)'),
+),
+array(
+  'name' => 'trigger',
+  'type' => 'trigger_action',
+  'vars' => array('array' => ''),
+  'files' => array('include\functions_plugins.inc.php (trigger_event, trigger_action)'),
+),
+array(
+  'name' => 'user_comment_check',
+  'type' => 'trigger_event',
+  'vars' => array('string' => 'comment_action', 'array' => 'comm'),
+  'files' => array('include\functions_comment.inc.php (insert_user_comment, update_user_comment)'),
+  'infos' => 'use this trigger to add conditions on comment validation',
+),
+array(
+  'name' => 'user_comment_deletion',
+  'type' => 'trigger_action',
+  'vars' => array('mixed' => 'comment_id'),
+  'files' => array('include\functions_comment.inc.php (delete_user_comment)'),
+  'infos' => '$comment_id is and int or an array of int',
+),
+array(
+  'name' => 'user_comment_insertion',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'comm'),
+  'files' => array('include\picture_comment.inc.php'),
+),
+array(
+  'name' => 'user_comment_validation',
+  'type' => 'trigger_action',
+  'vars' => array('mixed' => 'comment_id'),
+  'files' => array('include\functions_comment.inc.php (validate_user_comment)'),
+  'infos' => '$comment_id is and int or an array of int',
+),
+array(
+  'name' => 'user_init',
+  'type' => 'trigger_action',
+  'vars' => array('array' => 'user'),
+  'files' => array('include\user.inc.php'),
+),
+array(
+  'name' => 'ws_add_methods',
+  'type' => 'trigger_action',
+  'vars' => array('object' => 'this'),
+  'files' => array('include\ws_core.inc.php (PwgServer::run)'),
+),
+array(
+  'name' => 'ws_invoke_allowed',
+  'type' => 'trigger_event',
+  'vars' => array('bool' => '', 'string' => 'methodName', 'array' => 'params'),
+  'files' => array('include\ws_core.inc.php (PwgServer::invoke)'),
+),
+);
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" dir="ltr">
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+  <title>Piwigo Core Triggers</title>
+  
+  <link type="text/css" rel="stylesheet" media="screen" href="tablesorter/jquery.tablesorter.css">
+  <script type="text/javascript" src="../themes/default/js/jquery.min.js"></script>
+  <script type="text/javascript" src="tablesorter/jquery.tablesorter.min.js"></script>
+
+  
+  <script type="text/javascript">
+  $(document).ready(function() { 
+        $('#triggers').tablesorter({
+          sortList: [[0,0]]
+        }); 
+  });  
+  </script>
+</head>
+
+<body style="font-family:arial;">
+<h2>Piwigo Core Triggers</h2>
+
+<a href="http://piwigo.org/doc/doku.php?id=dev:plugins">For more infos about triggers</a>
+
+<table id="triggers" class="tablesorter">
+<thead> 
+<tr>
+  <th>Name</th>
+  <th>Type</th>
+  <th>Vars</th>
+  <th>Usage in the core <span style="font-weight:normal !important;">file (<i>function</i>)</span></th>
+  <th>Commentary</th>
+</tr>
+</thead> 
+<tbody>
+
+<?php  
+  foreach ($core as $trigger)
+  {
+    echo '
+  <tr>
+    <td>'.$trigger['name'].'</td>
+    <td>'.$trigger['type'].'</td>
+    <td>';
+    $f=1;
+    foreach ($trigger['vars'] as $type => $name)
+    {
+      if (!$f) echo ', '; $f=0;
+      echo $type.' '.(!empty($name)?'<i>$'.$name.'</i>':'');
+    }
+    echo '
+    </td>
+    <td>';
+    $f=1;
+    foreach ($trigger['files'] as $file)
+    {
+      if (!$f) echo '<br>'; $f=0;
+      echo preg_replace('#\((.+)\)#', '(<i>$1</i>)', $file);
+    }
+    echo '
+    </td>
+    <td>'.@$trigger['infos'].'</td>
+  </tr>';
+  }
+?>
+
+</tbody>
+</table>
+
+</body>
+</html>
Index: tags/2.4.0RC3/tools/ws.htm
===================================================================
--- tags/2.4.0RC3/tools/ws.htm	(revision 14585)
+++ tags/2.4.0RC3/tools/ws.htm	(revision 14585)
@@ -0,0 +1,402 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title>PWG web service explorer</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<script type="text/javascript" src="prototype.js" ></script>
+
+<script type="text/javascript">
+
+function setVisibility(id, vis)
+{
+  $(id).style.visibility = vis;
+}
+
+function dumpError(err)
+{
+	var s= 'Error ';
+	if ('string' === typeof err )
+	 s += err;
+	else
+	{
+    s += err.name+'<br/>';
+	 s += err.message;
+	 if (err.stack!=null)
+	 {//mozilla only
+	 	s += '<br/><small><pre>'+ err.stack + '</pre></small>';
+	 }
+	}
+  $("error").update(s);
+}
+
+var gServiceUrl;
+var gCachedMethods;
+
+Ajax.Responders.register({
+
+onException: function(req, err) {
+	try {
+		document.pwgError = err;
+		dumpError(err);
+	}
+	catch (e)
+	{
+		alert (err);
+		alert (err.message);
+	}
+},
+
+onComplete: function(req, transport) {
+	if (!req.responseIsSuccess())
+	{
+		var s = 'Completion failure\n' + transport.status + ' ' + transport.statusText;
+		if (transport.status>=300)
+		{
+			s += '\n';
+			s += transport.responseText.substr(0,1000);
+		}
+		dumpError(s);
+	}
+ }
+}
+);
+
+
+function pwgGetJsonResult(transport)
+{
+  var resp;
+  try {
+		eval('resp = ' + transport.responseText);
+	}
+	catch (e)
+	{
+		var s = e.message;
+		s += '\n' + transport.responseText.substr(0,1000).escapeHTML();
+		throw new Error( s );
+	}
+  if (resp==null || resp.result==null || resp.stat==null || resp.stat!='ok')
+  {
+    var s = 'JSON evaluation error';
+    if (resp)
+    {
+			if (resp.stat!=null) s+= '\n'+resp.stat;
+      if (resp.message!=null) s+= '\n'+ resp.message;
+    }
+    throw new Error(s);
+  }
+  return resp.result;
+}
+
+function pwgChangeUrl()
+{
+  $("error").update("");
+  setVisibility("methodListWrapper", "hidden");
+  $("methodList").update("");
+  setVisibility("methodWrapper", "hidden");
+  setVisibility("methodDetailWrapper", "hidden");
+
+  gServiceUrl = $F('ws_url');
+  gCachedMethods = new Hash();
+
+  try {
+		var ajaxReq = new Ajax.Request(
+				gServiceUrl,
+				{method:'get', parameters:'format=json&method=reflection.getMethodList',
+				 onSuccess: function (r) { onSuccess_getMethodList(r); }
+				}
+			)
+  }catch (e)
+  {
+    dumpError(e);
+  }
+  return false;
+}
+
+function onSuccess_getMethodList(transport)
+{
+	var result = pwgGetJsonResult(transport);
+	var ml = '';
+	for (var i=0; i<result.methods.length; i++)
+	{
+		ml += '<li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">'+ result.methods[i]+'</a></li>';
+	}
+	$("methodList").update(ml);
+	setVisibility("methodListWrapper", "visible");
+}
+
+function pwgSelectMethod(methodName)
+{
+  $("error").update("");
+  $("methodName").update(methodName);
+  setVisibility("methodDetailWrapper", "hidden");
+  setVisibility("methodWrapper", "visible");
+
+  if ( gCachedMethods[methodName] )
+    fillNewMethod( gCachedMethods[methodName] );
+  else
+  {
+    try {
+  		var ajaxReq = new Ajax.Request(
+  				gServiceUrl,
+  				{method:'get', parameters:'format=json&method=reflection.getMethodDetails&methodName='+methodName,
+  				 onSuccess: function (r) { onSuccess_getMethodDetails(r); }
+  				}
+  			)
+    }catch (e)
+    {
+      dumpError( e );
+    }
+  }
+  return false;
+}
+
+function onSuccess_getMethodDetails(transport)
+{
+	var result = pwgGetJsonResult(transport);
+  fillNewMethod( gCachedMethods[result.name] = result );
+}
+
+function fillNewMethod(method)
+{
+	var methodParamsElt = $("methodParams");
+	while (methodParamsElt.tBodies[0].rows.length)
+		methodParamsElt.tBodies[0].deleteRow(methodParamsElt.tBodies[0].rows.length-1);
+
+	if (method.params && method.params.length>0)
+	{
+  		for (var i=0; i<method.params.length; i++)
+  		{
+  			var row = methodParamsElt.tBodies[0].insertRow(-1);
+  			var isOptional = method.params[i].optional;
+  			var acceptArray = method.params[i].acceptArray;
+  			var defaultValue = method.params[i].defaultValue == null ? '' : method.params[i].defaultValue;
+
+  			row.insertCell(0).innerHTML = method.params[i].name;
+  			row.insertCell(1).innerHTML = '<span title="parameter is '+(isOptional ? 'optional':'required') +'">'+(isOptional ? '?':'*')+'</span>'
+          + (method.params[i].acceptArray ? ' <span title="parameter can be an array; use | (pipe) character to split values">[ ]</span>':'');
+  			row.insertCell(2).innerHTML = '<input id="methodParameterSend_'+i+'" type="checkbox" '+(isOptional ? '':'checked="checked"')+'/>';
+  			row.insertCell(3).innerHTML = '<input id="methodParameterValue_'+i+'"" value="'+defaultValue+'" style="width:99%" onchange="$(\'methodParameterSend_'+i+'\').checked=true;"/>';
+  		}
+ 	}
+	$("methodDescription").update(method.description);
+	setVisibility("methodDetailWrapper", "visible");
+}
+
+function pwgInvokeMethod( newWindow )
+{
+	var methodName = $('methodName').innerHTML;
+	var method = gCachedMethods[methodName];
+
+  var reqUrl = gServiceUrl;
+  reqUrl += "?format="+$F('responseFormat');
+
+  if ($('requestFormat').value == 'get')
+  {
+    reqUrl += "&method="+methodName;
+    for ( var i=0; i<method.params.length; i++)
+    {
+      if (! $('methodParameterSend_'+i).checked)
+        continue;
+
+      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
+      {
+        $F('methodParameterValue_'+i).split('|').each(
+            function(v) {
+              reqUrl += '&'+method.params[i].name+'[]='+v;
+            }
+          );
+      }
+      else
+        reqUrl += '&'+method.params[i].name+'='+$F('methodParameterValue_'+i);
+    }
+    if ( !newWindow )
+      $("invokeFrame").src = reqUrl;
+    else
+      window.open(reqUrl);
+  }
+  else
+  {
+    var form = $("invokeForm");
+    form.action = reqUrl;
+    var t = '<input type="hidden" name="'+'method'+'" value="'+methodName+'"/>';
+    for ( var i=0; i<method.params.length; i++)
+    {
+      if (! $('methodParameterSend_'+i).checked)
+        continue;
+
+      if ( method.params[i].acceptArray &&  $F('methodParameterValue_'+i).split('|').length > 1 )
+      {
+        $F('methodParameterValue_'+i).split('|').each(
+            function(v) {
+              t += '<input type="hidden" name="'+method.params[i].name+'[]" value="'+v+'"/>';
+            }
+          );
+      }
+      else
+        t += '<input type="hidden" name="'+method.params[i].name+'" value="'+$F('methodParameterValue_'+i)+'"/>';
+    }
+    form.innerHTML = t;
+    form.target = newWindow ? "_blank" : "invokeFrame";
+    form.submit();
+  }
+  return false;
+}
+</script>
+
+
+<style>
+#methodListWrapper {
+  width: 13em;
+  float: left;
+  display: inline;
+  visibility: hidden;
+}
+
+#methodList {
+  padding-left: 10px;
+  margin-left: 15px;
+}
+
+#methodWrapper {
+  margin-left: 14em;
+  visibility: hidden;
+}
+
+#methodName {
+  margin-top: 0;
+  margin-bottom: 3px;
+}
+
+
+#error {
+  height: 90px;
+  overflow: scroll;
+  color: red;
+}
+
+#methodParams {
+  border-collapse: collapse;
+  font-size: small;
+}
+
+#methodParams input {
+  font-size: 90%;
+  border: 1px solid black;
+  text-indent: 2px;
+}
+
+
+a {
+  color: #02f;
+  background-color: white;
+  text-decoration: underline;
+}
+
+a:hover {
+  color: white;
+  background-color: #02f;
+  text-decoration: none;
+  cursor:pointer;
+}
+
+</style>
+
+</head>
+
+
+<body>
+
+<div>
+ <label>PWG Web service url
+  <input name="ws_url" id="ws_url" size="64"/>
+<script type="text/javascript">
+  var match = document.location.toString().match(/^(https?.*\/)tools\/ws\.html?$/);
+  if (match!=null) $('ws_url').value = match[1]+'ws.php';
+</script>
+ </label>
+ <a href="#" onclick="return pwgChangeUrl();">Go!</a>
+</div>
+
+<div id="error">
+</div>
+
+<div>
+
+<div id="methodListWrapper"><h2>Methods</h2>
+  <ul id="methodList">
+    <li><a href="#" onclick="return pwgSelectMethod(this.innerHTML)">getVersion</a></li>
+  </ul>
+</div>
+
+<div id="methodWrapper">
+  <h2 id="methodName"></h2>
+  <div id="methodDetailWrapper">
+
+    <table>
+    <tr style="vertical-align:top">
+
+    <td>
+      <div id="methodDescription"></div>
+      <table>
+        <tr>
+          <td>Request format:</td>
+          <td>
+            <select id="requestFormat">
+              <option value="get" selected="selected">GET</option>
+              <option value="post">POST</option>
+            </select>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Response format:</td>
+          <td>
+            <select id="responseFormat">
+              <option value="rest" selected="selected">REST (xml)</option>
+              <option value="json">JSON</option>
+              <option value="php">PHP serial</option>
+              <option value="xmlrpc">XML RPC</option>
+            </select>
+          </td>
+        </tr>
+      </table>
+      <p>
+        <a href="#" onclick="return pwgInvokeMethod(false)">Invoke</a>
+        <a href="#" onclick="return pwgInvokeMethod(true)">Invoke (new Window)</a>
+      </p>
+    </td>
+
+
+    <td>
+      <table id="methodParams"  border="1" cellspacing="0" cellpadding="2px">
+        <thead>
+          <tr>
+            <td style="width:150px">Parameter</td>
+            <td>Extra</td>
+            <td>Send</td>
+            <td style="width:160px">Value</td>
+          </tr>
+        </thead>
+        <tbody>
+        </tbody>
+      </table>
+    </td>
+
+    </tr>
+    </table>
+
+		<div style="display:none;">
+			<!-- hiddenForm for POST -->
+			<form method="post" action="" target="invokeFrame" id="invokeForm">
+				<input type="submit" value="submit"/>
+			</form>
+		</div>
+
+    <iframe width="100%" height="400px" id="invokeFrame" name="invokeFrame" style="clear:both"></iframe>
+  </div> <!-- methodDetailWrapper -->
+</div> <!-- methodWrapper -->
+
+</div>
+
+</body>
+</html>
Index: tags/2.4.0RC3/upgrade.php
===================================================================
--- tags/2.4.0RC3/upgrade.php	(revision 14585)
+++ tags/2.4.0RC3/upgrade.php	(revision 14585)
@@ -0,0 +1,442 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define('PHPWG_ROOT_PATH', './');
+
+// load config file
+include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
+
+$config_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR.'config/database.inc.php';
+$config_file_contents = @file_get_contents($config_file);
+if ($config_file_contents === false)
+{
+  die('Cannot load '.$config_file);
+}
+$php_end_tag = strrpos($config_file_contents, '?'.'>');
+if ($php_end_tag === false)
+{
+  die('Cannot find php end tag in '.$config_file);
+}
+
+include($config_file);
+
+// $conf is not used for users tables - define cannot be re-defined
+define('USERS_TABLE', $prefixeTable.'users');
+include_once(PHPWG_ROOT_PATH.'include/constants.php');
+define('PREFIX_TABLE', $prefixeTable);
+define('UPGRADES_PATH', PHPWG_ROOT_PATH.'install/db');
+
+include_once(PHPWG_ROOT_PATH.'include/functions.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+
+// +-----------------------------------------------------------------------+
+// |                              functions                                |
+// +-----------------------------------------------------------------------+
+
+/**
+ * list all tables in an array
+ *
+ * @return array
+ */
+function get_tables()
+{
+  $tables = array();
+
+  $query = '
+SHOW TABLES
+;';
+  $result = pwg_query($query);
+
+  while ($row = pwg_db_fetch_row($result))
+  {
+    if (preg_match('/^'.PREFIX_TABLE.'/', $row[0]))
+    {
+      array_push($tables, $row[0]);
+    }
+  }
+
+  return $tables;
+}
+
+/**
+ * list all columns of each given table
+ *
+ * @return array of array
+ */
+function get_columns_of($tables)
+{
+  $columns_of = array();
+
+  foreach ($tables as $table)
+  {
+    $query = '
+DESC '.$table.'
+;';
+    $result = pwg_query($query);
+
+    $columns_of[$table] = array();
+
+    while ($row = pwg_db_fetch_row($result))
+    {
+      array_push($columns_of[$table], $row[0]);
+    }
+  }
+
+  return $columns_of;
+}
+
+/**
+ */
+function print_time($message)
+{
+  global $last_time;
+
+  $new_time = get_moment();
+  echo '<pre>['.get_elapsed_time($last_time, $new_time).']';
+  echo ' '.$message;
+  echo '</pre>';
+  flush();
+  $last_time = $new_time;
+}
+
+// +-----------------------------------------------------------------------+
+// |                             playing zone                              |
+// +-----------------------------------------------------------------------+
+
+// echo implode('<br>', get_tables());
+// echo '<pre>'; print_r(get_columns_of(get_tables())); echo '</pre>';
+
+// foreach (get_available_upgrade_ids() as $upgrade_id)
+// {
+//   echo $upgrade_id, '<br>';
+// }
+
+// +-----------------------------------------------------------------------+
+// |                             language                                  |
+// +-----------------------------------------------------------------------+
+include(PHPWG_ROOT_PATH . 'admin/include/languages.class.php');
+$languages = new languages('utf-8');
+
+if (isset($_GET['language']))
+{
+  $language = strip_tags($_GET['language']);
+
+  if (!in_array($language, array_keys($languages->fs_languages)))
+  {
+    $language = PHPWG_DEFAULT_LANGUAGE;
+  }
+}
+else
+{
+  $language = 'en_UK';
+  // Try to get browser language
+  foreach ($languages->fs_languages as $language_code => $fs_language)
+  {
+    if (substr($language_code,0,2) == @substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2))
+    {
+      $language = $language_code;
+      break;
+    }
+  }
+}
+
+if ('fr_FR' == $language) {
+  define('PHPWG_DOMAIN', 'fr.piwigo.org');
+}
+else if ('it_IT' == $language) {
+  define('PHPWG_DOMAIN', 'it.piwigo.org');
+}
+else if ('de_DE' == $language) {
+  define('PHPWG_DOMAIN', 'de.piwigo.org');
+}
+else if ('es_ES' == $language) {
+  define('PHPWG_DOMAIN', 'es.piwigo.org');
+}
+else if ('pl_PL' == $language) {
+  define('PHPWG_DOMAIN', 'pl.piwigo.org');
+}
+else if ('zh_CN' == $language) {
+  define('PHPWG_DOMAIN', 'cn.piwigo.org');
+}
+else if ('hu_HU' == $language) {
+  define('PHPWG_DOMAIN', 'hu.piwigo.org');
+}
+else if ('ru_RU' == $language) {
+  define('PHPWG_DOMAIN', 'ru.piwigo.org');
+}
+else if ('nl_NL' == $language) {
+  define('PHPWG_DOMAIN', 'nl.piwigo.org');
+}
+else {
+  define('PHPWG_DOMAIN', 'piwigo.org');
+}
+define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
+
+load_language( 'common.lang', '', array('language'=>$language, 'target_charset'=>'utf-8', 'no_fallback' => true) );
+load_language( 'admin.lang', '', array('language'=>$language, 'target_charset'=>'utf-8', 'no_fallback' => true) );
+load_language( 'install.lang', '', array('language'=>$language, 'target_charset'=>'utf-8', 'no_fallback' => true) );
+load_language( 'upgrade.lang', '', array('language'=>$language, 'target_charset'=>'utf-8', 'no_fallback' => true) );
+
+// check php version
+if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
+{
+  include(PHPWG_ROOT_PATH.'install/php5_apache_configuration.php');
+}
+
+// +-----------------------------------------------------------------------+
+// |                          database connection                          |
+// +-----------------------------------------------------------------------+
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_upgrade.php');
+include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
+
+upgrade_db_connect();
+pwg_db_check_charset();
+
+list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
+define('CURRENT_DATE', $dbnow);
+
+// +-----------------------------------------------------------------------+
+// |                        template initialization                        |
+// +-----------------------------------------------------------------------+
+
+$template = new Template(PHPWG_ROOT_PATH.'admin/themes', 'clear');
+$template->set_filenames(array('upgrade'=>'upgrade.tpl'));
+$template->assign(array(
+  'RELEASE' => PHPWG_VERSION,
+  'L_UPGRADE_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
+  )
+);
+
+// +-----------------------------------------------------------------------+
+// |                            upgrade choice                             |
+// +-----------------------------------------------------------------------+
+
+$tables = get_tables();
+$columns_of = get_columns_of($tables);
+
+// find the current release
+if (!in_array('param', $columns_of[PREFIX_TABLE.'config']))
+{
+  // we're in branch 1.3, important upgrade, isn't it?
+  if (in_array(PREFIX_TABLE.'user_category', $tables))
+  {
+    $current_release = '1.3.1';
+  }
+  else
+  {
+    $current_release = '1.3.0';
+  }
+}
+else if (!in_array(PREFIX_TABLE.'user_cache', $tables))
+{
+  $current_release = '1.4.0';
+}
+else if (!in_array(PREFIX_TABLE.'tags', $tables))
+{
+  $current_release = '1.5.0';
+}
+else if ( !in_array(PREFIX_TABLE.'plugins', $tables) )
+{
+  if (!in_array('auto_login_key', $columns_of[PREFIX_TABLE.'user_infos']))
+  {
+    $current_release = '1.6.0';
+  }
+  else
+  {
+    $current_release = '1.6.2';
+  }
+}
+else if (!in_array('md5sum', $columns_of[PREFIX_TABLE.'images']))
+{
+  $current_release = '1.7.0';
+}
+else if (!in_array(PREFIX_TABLE.'themes', $tables))
+{
+  $current_release = '2.0.0';
+}
+else if (!in_array('added_by', $columns_of[PREFIX_TABLE.'images']))
+{
+  $current_release = '2.1.0';
+}
+else if (!in_array('rating_score', $columns_of[PREFIX_TABLE.'images']))
+{
+  $current_release = '2.2.0';
+}
+else
+{
+  die('No upgrade required, the database structure is up to date');
+}
+
+// +-----------------------------------------------------------------------+
+// |                            upgrade launch                             |
+// +-----------------------------------------------------------------------+
+$page['infos'] = array();
+$page['errors'] = array();
+$mysql_changes = array();
+
+check_upgrade_access_rights();
+
+if ((isset($_POST['submit']) or isset($_GET['now']))
+  and check_upgrade())
+{
+  $upgrade_file = PHPWG_ROOT_PATH.'install/upgrade_'.$current_release.'.php';
+  if (is_file($upgrade_file))
+  {
+    $page['upgrade_start'] = get_moment();
+    $conf['die_on_sql_error'] = false;
+    include($upgrade_file);
+    conf_update_param('piwigo_db_version', get_branch_from_version(PHPWG_VERSION));
+
+    // Something to add in database.inc.php?
+    if (!empty($mysql_changes))
+    {
+      $config_file_contents = 
+        substr($config_file_contents, 0, $php_end_tag) . "\r\n"
+        . implode("\r\n" , $mysql_changes) . "\r\n"
+        . substr($config_file_contents, $php_end_tag);
+
+      if (!@file_put_contents($config_file, $config_file_contents))
+      {
+        array_push(
+          $page['infos'],
+          sprintf(
+            l10n('In <i>%s</i>, before <b>?></b>, insert:'),
+            PWG_LOCAL_DIR.'config/database.inc.php'
+            )
+          .'<p><textarea rows="4" cols="40">'
+          .implode("\r\n" , $mysql_changes).'</textarea></p>'
+          );
+      }
+    }
+
+    // Plugins deactivation
+    if (in_array(PREFIX_TABLE.'plugins', $tables))
+    {
+      deactivate_non_standard_plugins();
+    }
+
+    deactivate_non_standard_themes();
+    deactivate_templates();
+
+    $page['upgrade_end'] = get_moment();
+
+    $template->assign(
+      'upgrade',
+      array(
+        'VERSION' => $current_release,
+        'TOTAL_TIME' => get_elapsed_time(
+          $page['upgrade_start'],
+          $page['upgrade_end']
+          ),
+        'SQL_TIME' => number_format(
+          $page['queries_time'],
+          3,
+          '.',
+          ' '
+          ).' s',
+        'NB_QUERIES' => $page['count_queries']
+        )
+      );
+
+    array_push($page['infos'],
+      l10n('Perform a maintenance check in [Administration>Tools>Maintenance] if you encounter any problem.')
+      );
+
+    // Save $page['infos'] in order to restore after maintenance actions
+    $page['infos_sav'] = $page['infos'];
+    $page['infos'] = array();
+
+    // c13y_upgrade plugin means "check integrity after upgrade", so it
+    // becomes useful just after an upgrade
+    $query = '
+REPLACE INTO '.PLUGINS_TABLE.'
+  (id, state)
+  VALUES (\'c13y_upgrade\', \'active\')
+;';
+    pwg_query($query);
+
+    // Delete cache data
+    invalidate_user_cache(true);
+    $template->delete_compiled_templates();
+
+    // Tables Maintenance
+    do_maintenance_all_tables();
+
+    // Restore $page['infos'] in order to hide informations messages from functions calles
+    // errors messages are not hide
+    $page['infos'] = $page['infos_sav'];
+
+  }
+}
+
+// +-----------------------------------------------------------------------+
+// |                          start template output                        |
+// +-----------------------------------------------------------------------+
+else
+{
+  if (!defined('PWG_CHARSET'))
+  {
+    define('PWG_CHARSET', 'utf-8');
+  }
+
+  include_once(PHPWG_ROOT_PATH.'admin/include/languages.class.php');
+  $languages = new languages();
+  
+  foreach ($languages->fs_languages as $language_code => $fs_language)
+  {
+    if ($language == $language_code)
+    {
+      $template->assign('language_selection', $language_code);
+    }
+    $languages_options[$language_code] = $fs_language['name'];
+  }
+  $template->assign('language_options', $languages_options);
+
+  $template->assign('introduction', array(
+    'CURRENT_RELEASE' => $current_release,
+    'F_ACTION' => 'upgrade.php?language=' . $language));
+
+  if (!check_upgrade())
+  {
+    $template->assign('login', true);
+  }
+}
+
+if (count($page['errors']) != 0)
+{
+  $template->assign('errors', $page['errors']);
+}
+
+if (count($page['infos']) != 0)
+{
+  $template->assign('infos', $page['infos']);
+}
+
+// +-----------------------------------------------------------------------+
+// |                          sending html code                            |
+// +-----------------------------------------------------------------------+
+
+$template->pparse('upgrade');
+?>
Index: tags/2.4.0RC3/upgrade_feed.php
===================================================================
--- tags/2.4.0RC3/upgrade_feed.php	(revision 14585)
+++ tags/2.4.0RC3/upgrade_feed.php	(revision 14585)
@@ -0,0 +1,116 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+//check php version
+if (version_compare(PHP_VERSION, '5', '<'))
+{
+  die('Piwigo requires PHP 5 or above.');
+}
+
+define('PHPWG_ROOT_PATH', './');
+
+include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
+@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
+defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
+
+include(PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php');
+include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$conf['dblayer'].'.inc.php');
+
+include_once(PHPWG_ROOT_PATH.'include/functions.inc.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
+include_once(PHPWG_ROOT_PATH.'admin/include/functions_upgrade.php');
+
+
+// +-----------------------------------------------------------------------+
+// | Check Access and exit when it is not ok                               |
+// +-----------------------------------------------------------------------+
+
+if (!$conf['check_upgrade_feed'])
+{
+  die("upgrade feed is not active");
+}
+
+prepare_conf_upgrade();
+
+define('PREFIX_TABLE', $prefixeTable);
+define('UPGRADES_PATH', PHPWG_ROOT_PATH.'install/db');
+
+// +-----------------------------------------------------------------------+
+// |                         Database connection                           |
+// +-----------------------------------------------------------------------+
+try
+{
+  $pwg_db_link = pwg_db_connect($conf['db_host'], $conf['db_user'],
+                                $conf['db_password'], $conf['db_base']);
+}
+catch (Exception $e)
+{
+  my_error(l10n($e->getMessage(), true)); 
+}
+
+pwg_db_check_charset();
+
+// +-----------------------------------------------------------------------+
+// |                              Upgrades                                 |
+// +-----------------------------------------------------------------------+
+
+// retrieve already applied upgrades
+$query = '
+SELECT id
+  FROM '.PREFIX_TABLE.'upgrade
+;';
+$applied = array_from_query($query, 'id');
+
+// retrieve existing upgrades
+$existing = get_available_upgrade_ids();
+
+// which upgrades need to be applied?
+$to_apply = array_diff($existing, $applied);
+
+echo '<pre>';
+echo count($to_apply).' upgrades to apply';
+
+foreach ($to_apply as $upgrade_id)
+{
+  unset($upgrade_description);
+
+  echo "\n\n";
+  echo '=== upgrade '.$upgrade_id."\n";
+
+  // include & execute upgrade script. Each upgrade script must contain
+  // $upgrade_description variable which describe briefly what the upgrade
+  // script does.
+  include(UPGRADES_PATH.'/'.$upgrade_id.'-database.php');
+
+  // notify upgrade
+  $query = '
+INSERT INTO '.PREFIX_TABLE.'upgrade
+  (id, applied, description)
+  VALUES
+  (\''.$upgrade_id.'\', NOW(), \''.$upgrade_description.'\')
+;';
+  pwg_query($query);
+}
+
+echo '</pre>';
+?>
Index: tags/2.4.0RC3/ws.php
===================================================================
--- tags/2.4.0RC3/ws.php	(revision 14585)
+++ tags/2.4.0RC3/ws.php	(revision 14585)
@@ -0,0 +1,558 @@
+<?php
+// +-----------------------------------------------------------------------+
+// | Piwigo - a PHP based photo gallery                                    |
+// +-----------------------------------------------------------------------+
+// | Copyright(C) 2008-2012 Piwigo Team                  http://piwigo.org |
+// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
+// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
+// +-----------------------------------------------------------------------+
+// | This program is free software; you can redistribute it and/or modify  |
+// | it under the terms of the GNU General Public License as published by  |
+// | the Free Software Foundation                                          |
+// |                                                                       |
+// | This program is distributed in the hope that it will be useful, but   |
+// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
+// | General Public License for more details.                              |
+// |                                                                       |
+// | You should have received a copy of the GNU General Public License     |
+// | along with this program; if not, write to the Free Software           |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
+// | USA.                                                                  |
+// +-----------------------------------------------------------------------+
+
+define ('PHPWG_ROOT_PATH', './');
+
+include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
+check_status(ACCESS_FREE);
+include_once(PHPWG_ROOT_PATH.'include/ws_core.inc.php');
+
+if ( !$conf['allow_web_services'] )
+{
+  page_forbidden('Web services are disabled');
+}
+
+/**
+ * event handler that registers standard methods with the web service
+ */
+function ws_addDefaultMethods( $arr )
+{
+  include_once(PHPWG_ROOT_PATH.'include/ws_functions.inc.php');
+  global $conf, $user;
+  $service = &$arr[0];
+  $service->addMethod('pwg.getVersion', 'ws_getVersion', null,
+      'retrieves the PWG version');
+	  
+  $service->addMethod('pwg.getInfos', 'ws_getInfos', null,
+      'retrieves general informations');
+
+  $service->addMethod('pwg.caddie.add', 'ws_caddie_add',
+      array(
+        'image_id'=> array( 'flags'=>WS_PARAM_FORCE_ARRAY ),
+      ),
+      'adds the elements to the caddie');
+
+  $service->addMethod('pwg.categories.getImages', 'ws_categories_getImages',
+      array(
+        'cat_id'=>array('default'=>0, 'flags'=>WS_PARAM_FORCE_ARRAY),
+        'recursive'=>array('default'=>false),
+        'per_page' => array('default'=>100, 'maxValue'=>$conf['ws_max_images_per_page']),
+        'page' => array('default'=>0),
+        'order' => array('default'=>null),
+        'f_min_rate' => array( 'default'=> null ),
+        'f_max_rate' => array( 'default'=> null ),
+        'f_min_hit' => array( 'default'=> null ),
+        'f_max_hit' => array( 'default'=> null ),
+        'f_min_date_available' => array( 'default'=> null ),
+        'f_max_date_available' => array( 'default'=> null ),
+        'f_min_date_created' => array( 'default'=> null ),
+        'f_max_date_created' => array( 'default'=> null ),
+        'f_min_ratio' => array( 'default'=> null ),
+        'f_max_ratio' => array( 'default'=> null ),
+        'f_max_level' => array( 'default'=> null ),
+      ),
+      'Returns elements for the corresponding categories.
+<br><b>cat_id</b> can be empty if <b>recursive</b> is true. Can be sent as an array.
+<br><b>order</b> comma separated fields for sorting (file,id, rating_score,...)'
+    );
+
+  $service->addMethod('pwg.categories.getList', 'ws_categories_getList',
+      array(
+        'cat_id' => array('default'=>0),
+        'recursive' => array('default'=>false),
+        'public' => array('default'=>false),
+        'tree_output' => array('default'=>false),
+        'fullname' => array('default'=>false),
+      ),
+      'retrieves a list of categories (tree_output option only compatible with json/php output format' );
+
+  $service->addMethod('pwg.getMissingDerivatives', 'ws_getMissingDerivatives',
+      array(
+        'types' => array( 'default'=>array(), 'flags'=>WS_PARAM_FORCE_ARRAY),
+        'ids' => array( 'default'=>array(), 'flags'=>WS_PARAM_FORCE_ARRAY),
+        'max_urls' => array( 'default' => 200 ),
+        'prev_page' => array( 'default'=> null),
+        'f_min_rate' => array( 'default'=> null ),
+        'f_max_rate' => array( 'default'=> null ),
+        'f_min_hit' => array( 'default'=> null ),
+        'f_max_hit' => array( 'default'=> null ),
+        'f_min_date_available' => array( 'default'=> null ),
+        'f_max_date_available' => array( 'default'=> null ),
+        'f_min_date_created' => array( 'default'=> null ),
+        'f_max_date_created' => array( 'default'=> null ),
+        'f_min_ratio' => array( 'default'=> null ),
+        'f_max_ratio' => array( 'default'=> null ),
+        'f_max_level' => array( 'default'=> null ),
+      ),
+      'retrieves a list of derivatives to build' );
+
+  $service->addMethod('pwg.images.addComment', 'ws_images_addComment',
+      array(
+        'image_id' => array(),
+        'author' => array( 'default' => is_a_guest()? 'guest':$user['username']),
+        'content' => array(),
+        'key' => array(),
+      ),
+      'add a comment to an image' );
+
+  $service->addMethod('pwg.images.getInfo', 'ws_images_getInfo',
+      array(
+        'image_id' => array(),
+        'comments_page' => array('default'=>0 ),
+        'comments_per_page' => array(
+              'default' => $conf['nb_comment_page'],
+              'maxValue' => 2*$conf['nb_comment_page'],
+            ),
+      ),
+      'retrieves information about the given photo' );
+
+  $service->addMethod('pwg.images.rate', 'ws_images_rate',
+      array(
+        'image_id' => array(),
+        'rate' =>     array(),
+      ),
+      'rate the image' );
+
+  $service->addMethod('pwg.images.search', 'ws_images_search',
+      array(
+        'query'=>array(),
+        'per_page' => array('default'=>100, 'maxValue'=>$conf['ws_max_images_per_page']),
+        'page' => array('default'=>0),
+        'order' => array('default'=>null),
+        'f_min_rate' => array( 'default'=> null ),
+        'f_max_rate' => array( 'default'=> null ),
+        'f_min_hit' => array( 'default'=> null ),
+        'f_max_hit' => array( 'default'=> null ),
+        'f_min_date_available' => array( 'default'=> null ),
+        'f_max_date_available' => array( 'default'=> null ),
+        'f_min_date_created' => array( 'default'=> null ),
+        'f_max_date_created' => array( 'default'=> null ),
+        'f_min_ratio' => array( 'default'=> null ),
+        'f_max_ratio' => array( 'default'=> null ),
+        'f_max_level' => array( 'default'=> null ),
+      ),
+      'Returns elements for the corresponding query search.'
+    );
+
+  $service->addMethod(
+    'pwg.images.setPrivacyLevel',
+    'ws_images_setPrivacyLevel',
+    array(
+      'image_id' => array('flags'=>WS_PARAM_FORCE_ARRAY),
+      'level' => array('maxValue'=>$conf['available_permission_levels']),
+      ),
+    'sets the privacy levels for the images (POST method only)'
+    );
+
+  $service->addMethod(
+    'pwg.images.setRank',
+    'ws_images_setRank',
+    array(
+      'image_id' => array(),
+      'category_id' => array(),
+      'rank' => array(),
+      ),
+    'sets the rank of a photo for a given album (POST method only, for admins)'
+    );
+
+
+  $service->addMethod('pwg.rates.delete', 'ws_rates_delete',
+    array(
+      'user_id' => array(),
+      'anonymous_id' => array( 'default'=>'' ),
+      ),
+    'deletes all rates for a user (POST method only, admins only)'
+    );
+    
+  $service->addMethod('pwg.session.getStatus', 'ws_session_getStatus', null, '' );
+  $service->addMethod('pwg.session.login', 'ws_session_login',
+    array('username', 'password'),
+    'POST method only' );
+  $service->addMethod('pwg.session.logout', 'ws_session_logout', null, '');
+
+  $service->addMethod('pwg.tags.getList', 'ws_tags_getList',
+    array('sort_by_counter' => array('default' =>false) ),
+    'retrieves a list of available tags');
+  $service->addMethod('pwg.tags.getImages', 'ws_tags_getImages',
+      array(
+        'tag_id'=>array('default'=>null, 'flags'=>WS_PARAM_FORCE_ARRAY ),
+        'tag_url_name'=>array('default'=>null, 'flags'=>WS_PARAM_FORCE_ARRAY ),
+        'tag_name'=>array('default'=>null, 'flags'=>WS_PARAM_FORCE_ARRAY ),
+        'tag_mode_and'=>array('default'=>false),
+        'per_page' => array('default'=>100, 'maxValue'=>$conf['ws_max_images_per_page']),
+        'page' => array('default'=>0),
+        'order' => array('default'=>null),
+        'f_min_rate' => array( 'default'=> null ),
+        'f_max_rate' => array( 'default'=> null ),
+        'f_min_hit' => array( 'default'=> null ),
+        'f_max_hit' => array( 'default'=> null ),
+        'f_min_date_available' => array( 'default'=> null ),
+        'f_max_date_available' => array( 'default'=> null ),
+        'f_min_date_created' => array( 'default'=> null ),
+        'f_max_date_created' => array( 'default'=> null ),
+        'f_min_ratio' => array( 'default'=> null ),
+        'f_max_ratio' => array( 'default'=> null ),
+        'f_max_level' => array( 'default'=> null ),
+      ),
+      'Returns elements for the corresponding tags. Note that tag_id, tag_url_name, tag_name an be arrays. Fill at least one of them. '
+    );
+
+  $service->addMethod(
+    'pwg.images.addChunk',
+    'ws_images_add_chunk',
+    array(
+      'data' => array(),
+      'original_sum' => array(),
+      'type' => array(),
+      'position' => array(),
+      ),
+    'POST method only. For admin only.'
+    );
+
+  $service->addMethod(
+    'pwg.images.addFile',
+    'ws_images_addFile',
+    array(
+      'image_id' => array(),
+      'type' => array(),
+      'sum' => array(),
+      ),
+    'Add or update a file for an existing photo. pwg.images.addChunk must have been called  before (maybe several times)'
+    );
+
+
+  $service->addMethod(
+    'pwg.images.add',
+    'ws_images_add',
+    array(
+      'file_sum' => array(),
+      'thumbnail_sum' => array('default' => null),
+      'high_sum' => array('default' => null),
+      'original_sum' => array(),
+      'original_filename' => array('default' => null),
+      'name' => array('default' => null),
+      'author' => array('default' => null),
+      'date_creation' => array('default' => null),
+      'comment' => array('default' => null),
+      'categories' => array('default' => null),
+      'tag_ids' => array('default' => null),
+      'level' => array(
+        'default' => 0,
+        'maxValue' => $conf['available_permission_levels']
+        ),
+      'check_uniqueness' => array('default' => true),
+      'image_id' => array('default' => null),
+      ),
+    'POST method only.
+<br><b>categories</b> is a string list "category_id[,rank];category_id[,rank]" The rank is optional and is equivalent to "auto" if not given.'
+    );
+
+  $service->addMethod(
+    'pwg.images.addSimple',
+    'ws_images_addSimple',
+    array(
+      'category' => array('default' => null),
+      'name' => array('default' => null),
+      'author' => array('default' => null),
+      'comment' => array('default' => null),
+      'level' => array(
+        'default' => 0,
+        'maxValue' => $conf['available_permission_levels']
+        ),
+      'tags' => array('default' => null),
+      'image_id' => array('default' => null),
+      ),
+    'POST method only.<br>Use the <b>image</b> field for uploading file.<br>Set the form encoding to "form-data"<br><b>category</b> is the numeric identifier of the destination category.<br>You can update an existing photo if you define an existing image_id.'
+    );
+
+  $service->addMethod(
+    'pwg.images.delete',
+    'ws_images_delete',
+    array(
+      'image_id'=>array('default'=>0),
+      'pwg_token' => array(),
+      ),
+    'Delete photos. You can give several image_ids, comma separated'
+    );
+
+  $service->addMethod(
+    'pwg.categories.getAdminList',
+    'ws_categories_getAdminList',
+    array(),
+    'administration method only'
+    );
+
+  $service->addMethod(
+    'pwg.categories.add',
+    'ws_categories_add',
+    array(
+      'name' => array(),
+      'parent' => array('default' => null),
+      ),
+    'administration method only'
+    );
+
+  $service->addMethod(
+    'pwg.categories.delete',
+    'ws_categories_delete',
+    array(
+      'category_id'=>array('default'=>0),
+      'pwg_token' => array(),
+      'photo_deletion_mode' => array('default' => 'delete_orphans'),
+      ),
+    'Delete categories. You can give several category_ids, comma separated.
+<br><b>photo_deletion_mode</b> can be "no_delete" (may create orphan photos), "delete_orphans" (default mode, only deletes photos linked to no other album) or "force_delete" (delete all photos, even those linked to other albums)'
+    );
+
+  $service->addMethod(
+    'pwg.categories.move',
+    'ws_categories_move',
+    array(
+      'category_id'=>array('default'=>0),
+      'parent'=>array('default'=>0),
+      'pwg_token' => array(),
+      ),
+    'Move categories. You can give several category_ids, comma separated. Set parent as 0 to move to gallery root. Only virtual categories can be moved.'
+    );
+
+  $service->addMethod(
+    'pwg.categories.setRepresentative',
+    'ws_categories_setRepresentative',
+    array(
+      'category_id'=>array('default'=>0),
+      'image_id'=>array('default'=>0),
+      ),
+    'Set the representative photo for an album. The photo doesn\'t have to belong to the album. POST method only. Administration method only.'
+    );
+
+  $service->addMethod(
+    'pwg.tags.getAdminList',
+    'ws_tags_getAdminList',
+    array(),
+    'administration method only'
+    );
+
+  $service->addMethod(
+    'pwg.tags.add',
+    'ws_tags_add',
+    array(
+      'name' => array(),
+      ),
+    'administration method only'
+    );
+
+  $service->addMethod(
+    'pwg.images.exist',
+    'ws_images_exist',
+    array(
+      'md5sum_list'=> array('default' => null),
+      'filename_list' => array('default' => null),
+      ),
+    'check existence of a photo list'
+    );
+
+  $service->addMethod(
+    'pwg.images.checkFiles',
+    'ws_images_checkFiles',
+    array(
+      'image_id' => array(),
+      'thumbnail_sum' => array('default' => null),
+      'file_sum' => array('default' => null),
+      'high_sum' => array('default' => null),
+      ),
+    'check if you have updated version of your files for a given photo, for each requested file type, the answer can be "missing", "equals" or "differs"'
+    );
+
+  $service->addMethod(
+    'pwg.images.checkUpload',
+    'ws_images_checkUpload',
+    null,
+    'check if Piwigo is ready for upload'
+    );
+
+  $service->addMethod(
+    'pwg.images.setInfo',
+    'ws_images_setInfo',
+    array(
+      'image_id' => array(),
+
+      'file' => array('default' => null),
+      'name' => array('default' => null),
+      'author' => array('default' => null),
+      'date_creation' => array('default' => null),
+      'comment' => array('default' => null),
+      'categories' => array('default' => null),
+      'tag_ids' => array('default' => null),
+      'level' => array(
+        'default' => null,
+        'maxValue' => $conf['available_permission_levels']
+        ),
+      'single_value_mode' => array('default' => 'fill_if_empty'),
+      'multiple_value_mode' => array('default' => 'append'),
+      ),
+    'POST method only. Admin only
+<br><b>categories</b> is a string list "category_id[,rank];category_id[,rank]" The rank is optional and is equivalent to "auto" if not given.
+<br><b>single_value_mode</b> can be "fill_if_empty" (only use the input value if the corresponding values is currently empty) or "replace" (overwrite any existing value) and applies to single values properties like name/author/date_creation/comment
+<br><b>multiple_value_mode</b> can be "append" (no change on existing values, add the new values) or "replace" and applies to multiple values properties like tag_ids/categories'
+    );
+
+  $service->addMethod(
+    'pwg.categories.setInfo',
+    'ws_categories_setInfo',
+    array(
+      'category_id' => array(),
+
+      'name' => array('default' => null),
+      'comment' => array('default' => null),
+      ),
+    'POST method only.'
+    );
+  
+  $service->addMethod(
+    'pwg.plugins.getList',
+    'ws_plugins_getList',
+    array(),
+    'get the list of plugin with id, name, version, state and description
+<br>administration status required'
+    );
+
+  $service->addMethod(
+    'pwg.plugins.performAction',
+    'ws_plugins_performAction',
+    array(
+      'action' => array(),
+      'plugin' => array(),
+      'pwg_token' => array(),
+      ),
+    'install/activate/deactivate/uninstall/delete a plugin
+<br>administration status required'
+    );
+
+  $service->addMethod(
+    'pwg.themes.performAction',
+    'ws_themes_performAction',
+    array(
+      'action' => array(),
+      'theme' => array(),
+      'pwg_token' => array(),
+      ),
+    'activate/deactivate/delete/set_default a theme<br>administration status required'
+    );
+
+  $service->addMethod(
+    'pwg.extensions.update',
+    'ws_extensions_update',
+    array(
+      'type' => array(),
+      'id' => array(),
+      'revision'=> array(),
+      'pwg_token' => array(),
+    ),
+    'Update an extension. Webmaster only.
+<br>Parameter type must be "plugins", "languages" or "themes".'
+  );
+
+  $service->addMethod(
+    'pwg.extensions.ignoreUpdate',
+    'ws_extensions_ignoreupdate',
+    array(
+      'type' => array('default'=>null),
+      'id' => array('default'=>null),
+      'reset' => array('default'=>null),
+      'pwg_token' => array(),
+    ),
+    'Ignore an extension if it need update.
+<br>Parameter type must be "plugins", "languages" or "themes".
+<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.'
+  );
+}
+
+add_event_handler('ws_add_methods', 'ws_addDefaultMethods');
+
+
+add_event_handler('ws_invoke_allowed', 'ws_isInvokeAllowed', EVENT_HANDLER_PRIORITY_NEUTRAL, 3);
+
+$requestFormat = 'rest';
+$responseFormat = null;
+
+if ( isset($_GET['format']) )
+{
+  $responseFormat = $_GET['format'];
+}
+
+if ( !isset($responseFormat) and isset($requestFormat) )
+{
+  $responseFormat = $requestFormat;
+}
+
+$service = new PwgServer();
+
+if (!is_null($requestFormat))
+{
+  $handler = null;
+  switch ($requestFormat)
+  {
+    case 'rest':
+      include_once(PHPWG_ROOT_PATH.'include/ws_protocols/rest_handler.php');
+      $handler = new PwgRestRequestHandler();
+      break;
+  }
+  $service->setHandler($requestFormat, $handler);
+}
+
+if (!is_null($responseFormat))
+{
+  $encoder = null;
+  switch ($responseFormat)
+  {
+    case 'rest':
+      include_once(PHPWG_ROOT_PATH.'include/ws_protocols/rest_encoder.php');
+      $encoder = new PwgRestEncoder();
+      break;
+    case 'php':
+      include_once(PHPWG_ROOT_PATH.'include/ws_protocols/php_encoder.php');
+      $encoder = new PwgSerialPhpEncoder();
+      break;
+    case 'json':
+      include_once(PHPWG_ROOT_PATH.'include/ws_protocols/json_encoder.php');
+      $encoder = new PwgJsonEncoder();
+      break;
+    case 'xmlrpc':
+      include_once(PHPWG_ROOT_PATH.'include/ws_protocols/xmlrpc_encoder.php');
+      $encoder = new PwgXmlRpcEncoder();
+      break;
+  }
+  $service->setEncoder($responseFormat, $encoder);
+}
+
+set_make_full_url();
+$service->run();
+
+?>
